diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml new file mode 100644 index 0000000..3d8e035 --- /dev/null +++ b/.github/workflows/gh-pages.yaml @@ -0,0 +1,48 @@ +name: Deploy to GitHub Pages + +on: + # Trigger the workflow every time you push to the `main` branch + # Using a different branch name? Replace `main` with your branch’s name + push: + branches: [ feat/draft-14 ] + # Allows you to run this workflow manually from the Actions tab on GitHub. + workflow_dispatch: + +# Allow this job to clone the repo and create a page deployment +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout your repository using git + uses: actions/checkout@v5 + - name: Build lib + working-directory: lib + run: | + npm ci + npm run build + - name: Install, build, and upload your site + uses: withastro/action@v5 + with: + path: . # The root location of your Astro project inside the repository. (optional) + node-version: 22 # The specific version of Node that should be used to build your site. Defaults to 22. (optional) + package-manager: npm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) + build-cmd: npm run build # The command to run to build your site. Runs the package build script/task by default. (optional) + env: + PUBLIC_RELAY_HOST: 'https://interop-relay.cloudflare.mediaoverquic.com' + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + publish_dir: web/dist \ No newline at end of file diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 0000000..27f99b2 --- /dev/null +++ b/demo/README.md @@ -0,0 +1,218 @@ +# MoQT Demo Site + +A clean, minimal demo site showcasing the MoQT (Media over QUIC Transport) protocol for ultra-low latency video streaming. + +## Overview + +This demo consists of two main pages: +- **Publisher (`index.html`)**: Start broadcasting and generate player links +- **Player (`player.html`)**: View live streams with ultra-low latency + +## Quick Start + +### Local Development + +1. **Setup and serve the demo**: + ```bash + # From the root moq-demo-site directory + npm run setup # Copy MoQ library files to demo/lib/ + npm run dev # Start local server with required headers + ``` + +2. **Open the publisher**: + - Navigate to http://localhost:8080/ + - Click "Start Publishing" to begin broadcasting + - Copy the generated player link to share with viewers + +**Note**: We use a custom Node.js server that includes the required WebTransport headers (`Cross-Origin-Opener-Policy`, `Cross-Origin-Embedder-Policy`, etc.) that simple static servers don't support. + +## Configuration + +### Environment Switching + +The demo can switch between localhost (development) and Cloudflare (production) configurations: + +**Edit `config.js`**: +```javascript +// Change this to switch environments +const USE_CLOUDFLARE = false; // Set to true for production +``` + +**Localhost Configuration** (Development): +- Relay: `https://localhost:4443` +- Requires fingerprint verification +- Used during local development + +**Cloudflare Configuration** (Production): +- Relay: `https://relay.cloudflare.mediaoverquic.com` +- Uses trusted certificates (no fingerprint needed) +- Used for production deployment + +## Deployment to Cloudflare Pages + +### 1. Prepare for Deployment + +1. **Switch to production configuration**: + ```javascript + // In config.js + const USE_CLOUDFLARE = true; + ``` + +2. **Create `_headers` file** in the demo directory: + ``` + /* + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Resource-Policy: cross-origin + ``` + +### 2. Deploy to Cloudflare Pages + +#### Option A: Git Integration +1. Push your code to a Git repository +2. Connect the repository to Cloudflare Pages +3. Set build output directory to `demo` +4. Deploy + +#### Option B: Direct Upload +1. Zip the `demo` directory contents +2. Upload directly to Cloudflare Pages +3. Deploy + +### 3. Required Headers + +The following headers are **essential** for WebTransport to work: + +``` +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +Cross-Origin-Resource-Policy: cross-origin +``` + +**Create `_headers` file**: +```bash +cd demo +cat > _headers << 'EOF' +/* + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Resource-Policy: cross-origin +EOF +``` + +## File Structure + +``` +demo/ +├── index.html # Publisher page (main landing) +├── player.html # Player page for viewers +├── style.css # Minimal, clean styling +├── config.js # Environment configuration +├── _headers # Cloudflare Pages headers (for deployment) +└── README.md # This file +``` + +## Browser Compatibility + +**Supported Browsers**: +- Chrome 97+ (required for WebTransport) +- Edge 97+ +- Other Chromium-based browsers + +**Requirements**: +- WebTransport support (Chrome/Edge 97+) +- WebRTC support +- Modern JavaScript (ES6+) +- Static file server (no build process needed) + +## Features + +### Publisher Page +- ✅ One-click publishing with `` web component +- ✅ Auto-generated unique namespace for each session +- ✅ Shareable player links with copy functionality +- ✅ Real-time connection status +- ✅ Environment configuration display + +### Player Page +- ✅ Clean video player interface with `` component +- ✅ Automatic connection to streams via URL parameters +- ✅ Fullscreen support +- ✅ Share functionality (native share API + clipboard fallback) +- ✅ Connection status and basic latency estimation +- ✅ Error handling and reconnection + +## Troubleshooting + +### Stream Not Loading +- Verify the publisher is still active and broadcasting +- Check browser compatibility (Chrome/Edge 97+) +- Ensure proper headers are configured (for Cloudflare Pages) +- Try refreshing or reconnecting + +### High Latency +- MoQT is optimized for ultra-low latency streaming +- Actual latency depends on geographic distance to edge servers +- Network conditions can affect performance + +### Development Issues +- Make sure the local server is running (`npm run dev`) +- Check browser console for WebTransport errors +- Verify the MoQ library files are loading from `lib/` directory +- Ensure all required headers are present (our server includes them automatically) +- If using Python server (`npm run serve:python`), note that required headers are missing + +### Deployment Issues +- Verify `_headers` file is in the correct location +- Check Cloudflare Pages build logs +- Ensure `USE_CLOUDFLARE = true` in config.js +- Verify the MoQ library path is correct + +## Development Workflow + +1. **Start Local Development**: + ```bash + # From the root moq-demo-site directory + npm run setup # Copy MoQ library files (one-time setup) + npm run dev # Start local server with headers + ``` + +2. **Test Locally**: + - Publisher: http://localhost:8080/ + - Player: Use generated links + +3. **Prepare for Production**: + - Run `npm run deploy:prepare` to switch to Cloudflare config + - Ensure `_headers` file is present + - Test configuration + +4. **Deploy**: + - Upload `demo/` folder contents to Cloudflare Pages + - The MoQ library files are copied locally and included + - Run `npm run deploy:restore` to switch back to dev config + +## Future Enhancements + +### Planned Features +- **Latency Measurement**: Real-time glass-to-glass latency tracking +- **Geographic Demo**: Show user location relative to edge servers +- **Quality Metrics**: Connection quality and performance indicators +- **Multiple Streams**: Support for multiple concurrent streams +- **Recording**: Stream recording and playback capabilities + +### Design Evolution +- Enhanced styling inspired by realtime.cloudflare.com +- Sophisticated color schemes and animations +- Advanced micro-interactions +- Professional grid layouts + +## Contributing + +1. Follow the existing code style and structure +2. Test thoroughly in both localhost and Cloudflare configurations +3. Update documentation for any new features +4. Ensure cross-browser compatibility + +## License + +This demo is part of the MoQT protocol demonstration project. Please refer to the main project license for usage terms. \ No newline at end of file diff --git a/demo/_headers b/demo/_headers new file mode 100644 index 0000000..2526263 --- /dev/null +++ b/demo/_headers @@ -0,0 +1,31 @@ +# Cloudflare Pages Headers Configuration +# Required headers for WebTransport and MoQT protocol support + +/* + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Embedder-Policy: require-corp + Cross-Origin-Resource-Policy: cross-origin + X-Content-Type-Options: nosniff + X-Frame-Options: DENY + X-XSS-Protection: 1; mode=block + Referrer-Policy: strict-origin-when-cross-origin + +# Allow same-origin resources +/*.js + Cross-Origin-Resource-Policy: same-origin + +/*.css + Cross-Origin-Resource-Policy: same-origin + +# Additional CORS headers for API requests +/api/* + Access-Control-Allow-Origin: * + Access-Control-Allow-Methods: GET, POST, OPTIONS + Access-Control-Allow-Headers: Content-Type, Authorization + +# Cache control for static assets +/*.js + Cache-Control: public, max-age=31536000, immutable + +/*.css + Cache-Control: public, max-age=31536000, immutable diff --git a/demo/config.js b/demo/config.js new file mode 100644 index 0000000..1877b31 --- /dev/null +++ b/demo/config.js @@ -0,0 +1,45 @@ +// MoQT Demo Site Configuration +// Manages relay settings for development and production environments + +// Development configuration (localhost) +const LOCALHOST_CONFIG = { + relay: "https://localhost:4443", + fingerprint: "https://localhost:4443/fingerprint", + environment: "development" +}; + +// Production configuration (Cloudflare) +const CLOUDFLARE_CONFIG = { + relay: "https://interop-relay.cloudflare.mediaoverquic.com", + fingerprint: null, // No fingerprint needed for trusted certificate + environment: "production" +}; + +// Current active configuration +// Toggle this to switch between environments +const USE_CLOUDFLARE = true; + +// Export the active configuration +const CONFIG = USE_CLOUDFLARE ? CLOUDFLARE_CONFIG : LOCALHOST_CONFIG; + +// Helper functions +const getRelayUrl = () => CONFIG.relay; +const getFingerprintUrl = () => CONFIG.fingerprint; +const getEnvironment = () => CONFIG.environment; +const isLocalhost = () => CONFIG.environment === "development"; +const isProduction = () => CONFIG.environment === "production"; + +// Export configuration and helpers +window.MoQConfig = { + CONFIG, + LOCALHOST_CONFIG, + CLOUDFLARE_CONFIG, + getRelayUrl, + getFingerprintUrl, + getEnvironment, + isLocalhost, + isProduction +}; + +// Log current configuration +console.log(`MoQT Demo initialized with ${CONFIG.environment} configuration:`, CONFIG); diff --git a/demo/debug.html b/demo/debug.html new file mode 100644 index 0000000..0ebb665 --- /dev/null +++ b/demo/debug.html @@ -0,0 +1,210 @@ + + + + + + MoQT Debug Page + + + +

MoQT Deployment Debug

+ +
+

Environment Info

+
+
+ +
+

Script Loading Tests

+
+
+ +
+

Custom Elements Test

+
+
+ +
+

WebTransport Support

+
+
+ +
+

Console Logs

+

+	
+ + + + + + + diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..f707373 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,115 @@ + + + + + + MoQT Demo - Publisher + + + +
+
+

MoQT Video Streaming Demo

+

Media over QUIC Transport - Ultra-low latency streaming

+
+ +
+
+

MoQT Publisher

+

+ The publisher component below handles everything automatically. Use its built-in controls to + start streaming and copy the generated player links to share with viewers. +

+ +
+ +
+
+ +
+

How it works

+
    +
  • 🚀 Ultra-low latency: Optimized for real-time streaming performance
  • +
  • + 🌐 Global edge network: Powered by Cloudflare's worldwide infrastructure +
  • +
  • 📱 Cross-platform: Works on any modern browser with WebRTC support
  • +
  • 🔒 Secure: End-to-end encrypted transport over QUIC
  • +
+
+ +
+
+ Configuration +
+

+ Environment: + +

+

+ Relay: + +

+

+ Status: + Component will handle publishing +

+
+
+
+
+ + +
+ + + + + + + + + + + diff --git a/demo/lib/moq-player.iife.js b/demo/lib/moq-player.iife.js new file mode 100644 index 0000000..ddc7b15 --- /dev/null +++ b/demo/lib/moq-player.iife.js @@ -0,0 +1,2 @@ +var MoqPlayer=function(t){"use strict";function e(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}function r(...t){console.log("itzmanish:",...t)}async function s(t){return new Promise(e=>setTimeout(e,t))}function n(t){const e=(new TextDecoder).decode(t),i=JSON.parse(e);if(i.commonTrackFields.namespace=i.commonTrackFields.namespace?.split("/").filter(Boolean),!function(t){return!!c(t,"packaging")&&(!!c(t,"namespace")&&(!!Array.isArray(t.tracks)&&t.tracks.every(t=>a(t))))}(i))throw new Error("invalid catalog");for(const t of i.tracks)t.altGroup??=i.commonTrackFields.altGroup,t.namespace??=i.commonTrackFields.namespace,t.packaging??=i.commonTrackFields.packaging,t.renderGroup??=i.commonTrackFields.renderGroup;return i}function a(t){return"string"==typeof t.name}function o(t){return!!a(t)&&("number"==typeof(e=t.selectionParams).width&&"number"==typeof e.height);var e}function h(t){return!!a(t)&&("string"==typeof(e=t.selectionParams).channelConfig&&"number"==typeof e.samplerate);var e}function c(t,e){let i;if("packaging"===e)i=function(t){return"cmaf"===t||"loc"===t};else{if("namespace"!==e)throw new Error(`Invalid field: ${e}`);i=function(t){return Array.isArray(t)&&t.every(t=>"string"==typeof t)}}if(void 0!==t.commonTrackFields[e]&&!i(t.commonTrackFields[e]))return!1;for(const r of t.tracks)if(void 0!==r[e]&&!i(r[e]))return!1;return!0}function u(t,e){var i=[],r=t.toString();return r=r.replace(/(['"])__worker_loader_strict__(['"])/g,"$1use strict$2"),i.push("("+r+")()"),i}function l(t,e){var i;return async function(e,r){return i=i||function(t){var e=u(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),await e.audioWorklet.addModule(i,r)}}var d="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function p(){return d}function f(t,e){if(p())throw new Error("rollup-plugin-web-worker-loader does not support Audio Worklet in Node.JS");return l(t)}var m=f(function(){!function(){var t;!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(t||(t={}));class e{state;channels;capacity;constructor(t){this.state=new Int32Array(t.state),this.channels=[];for(const e of t.channels)this.channels.push(new Float32Array(e));this.capacity=t.capacity}write(e){const i=Atomics.load(this.state,t.READ_POS),r=Atomics.load(this.state,t.WRITE_POS),s=r;let n=r+e.numberOfFrames;if(n>i+this.capacity&&(n=i+this.capacity,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;tr&&(n=r,n<=s))return 0;const a=s%this.capacity,o=n%this.capacity;for(let t=0;t{console.error("Audio worklet error:",t)},e.connect(this.volumeNode),this.volumeNode.connect(this.context.destination),e.port.postMessage({config:t}),e}on(t){}setVolume(t){this.volumeNode.gain.setTargetAtTime(t,this.context.currentTime,.01)}getVolume(){return this.volumeNode.gain.value}}var y=null;try{var _="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");y=_.Worker}catch(t){}function b(t,e){var i;return function(e){return i=i||function(t){var e=u(t),i=new Blob(e,{type:"application/javascript"});return URL.createObjectURL(i)}(t),new Worker(i,e)}}function w(t,e){return p()?function(t){var e=u(t).join("\n");return function(t){return new y(e,Object.assign({},t,{eval:!0}))}}(t):b(t)}var v,x=w(function(){!function(){class t{audio;video;constructor(){this.audio=new e,this.video=new e}}class e{#t;frames;#e;constructor(){this.frames=new ReadableStream({pull:this.#i.bind(this),cancel:this.#r.bind(this)}),this.#e=new TransformStream({},{highWaterMark:100})}get segments(){return this.#e.writable}async#i(t){for(;;){const e=this.#e.readable.getReader();let i;if(this.#t){const t=this.#t.frames.getReader();i=await Promise.race([t.read(),e.read()]),t.releaseLock()}else i=await e.read();e.releaseLock();const{value:s,done:n}=i;if(n)this.#t=void 0;else{if(!r(s))return void t.enqueue(s);if(this.#t){if(s.sequencee+this.capacity&&(n=e+this.capacity,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;ei&&(n=i,n<=r))return 0;const a=r%this.capacity,o=n%this.capacity;for(let e=0;e=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var u={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:[{type:"mdat",name:"MediaDataBox"},{type:"idat",name:"ItemDataBox"},{type:"free",name:"FreeSpaceBox"},{type:"skip",name:"FreeSpaceBox"},{type:"meco",name:"AdditionalMetadataContainerBox"},{type:"strk",name:"SubTrackBox"}],FULL_BOXES:[{type:"hmhd",name:"HintMediaHeaderBox"},{type:"nmhd",name:"NullMediaHeaderBox"},{type:"iods",name:"ObjectDescriptorBox"},{type:"xml ",name:"XMLBox"},{type:"bxml",name:"BinaryXMLBox"},{type:"ipro",name:"ItemProtectionBox"},{type:"mere",name:"MetaboxRelationBox"}],CONTAINER_BOXES:[[{type:"moov",name:"CompressedMovieBox"},["trak","pssh"]],[{type:"trak",name:"TrackBox"}],[{type:"edts",name:"EditBox"}],[{type:"mdia",name:"MediaBox"}],[{type:"minf",name:"MediaInformationBox"}],[{type:"dinf",name:"DataInformationBox"}],[{type:"stbl",name:"SampleTableBox"},["sgpd","sbgp"]],[{type:"mvex",name:"MovieExtendsBox"},["trex"]],[{type:"moof",name:"CompressedMovieFragmentBox"},["traf"]],[{type:"traf",name:"TrackFragmentBox"},["trun","sgpd","sbgp"]],[{type:"vttc",name:"VTTCueBox"}],[{type:"tref",name:"TrackReferenceBox"}],[{type:"iref",name:"ItemReferenceBox"}],[{type:"mfra",name:"MovieFragmentRandomAccessBox"},["tfra"]],[{type:"meco",name:"AdditionalMetadataContainerBox"}],[{type:"hnti",name:"trackhintinformation"}],[{type:"hinf",name:"hintstatisticsbox"}],[{type:"strk",name:"SubTrackBox"}],[{type:"strd",name:"SubTrackDefinitionBox"}],[{type:"sinf",name:"ProtectionSchemeInfoBox"}],[{type:"rinf",name:"RestrictedSchemeInfoBox"}],[{type:"schi",name:"SchemeInformationBox"}],[{type:"trgr",name:"TrackGroupBox"}],[{type:"udta",name:"UserDataBox"},["kind"]],[{type:"iprp",name:"ItemPropertiesBox"},["ipma"]],[{type:"ipco",name:"ItemPropertyContainerBox"}],[{type:"grpl",name:"GroupsListBox"}],[{type:"j2kH",name:"J2KHeaderInfoBox"}],[{type:"etyp",name:"ExtendedTypeBox"},["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){u.FullBox.prototype=new u.Box,u.ContainerBox.prototype=new u.Box,u.SampleEntry.prototype=new u.Box,u.TrackGroupTypeBox.prototype=new u.FullBox,u.BASIC_BOXES.forEach(function(t){u.createBoxCtor(t.type,t.name)}),u.FULL_BOXES.forEach(function(t){u.createFullBoxCtor(t.type,t.name)}),u.CONTAINER_BOXES.forEach(function(t){u.createContainerBoxCtor(t[0].type,t[0].name,null,t[1])})},Box:function(t,e,i,r){this.type=t,this.box_name=i,this.size=e,this.uuid=r},FullBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.flags=0,this.version=0},ContainerBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.boxes=[]},SampleEntry:function(t,e,i,r){u.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){u.FullBox.call(this,t,e)},createBoxCtor:function(t,e,i){u.boxCodes.push(t),u[t+"Box"]=function(i){u.Box.call(this,t,i,e)},u[t+"Box"].prototype=new u.Box,i&&(u[t+"Box"].prototype.parse=i)},createFullBoxCtor:function(t,e,i){u[t+"Box"]=function(i){u.FullBox.call(this,t,i,e)},u[t+"Box"].prototype=new u.FullBox,u[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),i&&i.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;i",e+=""+r.length+"",e+="",e+=r.nalu.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),e+=""}return e+""}function d(t,e){this.x=t,this.y=e}function p(t,e){this.bad_pixel_row=t,this.bad_pixel_column=e}u.initialize(),u.TKHD_FLAG_ENABLED=1,u.TKHD_FLAG_IN_MOVIE=2,u.TKHD_FLAG_IN_PREVIEW=4,u.TFHD_FLAG_BASE_DATA_OFFSET=1,u.TFHD_FLAG_SAMPLE_DESC=2,u.TFHD_FLAG_SAMPLE_DUR=8,u.TFHD_FLAG_SAMPLE_SIZE=16,u.TFHD_FLAG_SAMPLE_FLAGS=32,u.TFHD_FLAG_DUR_EMPTY=65536,u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF=131072,u.TRUN_FLAGS_DATA_OFFSET=1,u.TRUN_FLAGS_FIRST_FLAG=4,u.TRUN_FLAGS_DURATION=256,u.TRUN_FLAGS_SIZE=512,u.TRUN_FLAGS_FLAGS=1024,u.TRUN_FLAGS_CTS_OFFSET=2048,u.Box.prototype.add=function(t){return this.addBox(new u[t+"Box"])},u.Box.prototype.addBox=function(t){return this.boxes.push(t),this[t.type+"s"]?this[t.type+"s"].push(t):this[t.type]=t,t},u.Box.prototype.set=function(t,e){return this[t]=e,this},u.Box.prototype.addEntry=function(t,e){var i=e||"entries";return this[i]||(this[i]=[]),this[i].push(t),this},t.BoxParser=u,u.parseUUID=function(t){return u.parseHex16(t)},u.parseHex16=function(t){for(var e="",i=0;i<16;i++){var r=t.readUint8().toString(16);e+=1===r.length?"0"+r:r}return e},u.parseOneBox=function(t,e,i){var r,n,a,o=t.getPosition(),h=0;if(t.getEndPosition()-o<8)return s.debug("BoxParser","Not enough data in stream to parse the type and size of the box"),{code:u.ERR_NOT_ENOUGH_DATA};if(i&&i<8)return s.debug("BoxParser","Not enough bytes left in the parent box to parse a new box"),{code:u.ERR_NOT_ENOUGH_DATA};var c=t.readUint32(),l=t.readString(4),d=l;if(s.debug("BoxParser","Found box of type '"+l+"' and size "+c+" at position "+o),h=8,"uuid"==l){if(t.getEndPosition()-t.getPosition()<16||i-h<16)return t.seek(o),s.debug("BoxParser","Not enough bytes left in the parent box to parse a UUID box"),{code:u.ERR_NOT_ENOUGH_DATA};h+=16,d=a=u.parseUUID(t)}if(1==c){if(t.getEndPosition()-t.getPosition()<8||i&&i-h<8)return t.seek(o),s.warn("BoxParser",'Not enough data in stream to parse the extended size of the "'+l+'" box'),{code:u.ERR_NOT_ENOUGH_DATA};c=t.readUint64(),h+=8}else if(0===c)if(i)c=i;else if("mdat"!==l)return s.error("BoxParser","Unlimited box size not supported for type: '"+l+"'"),r=new u.Box(l,c),{code:u.OK,box:r,size:r.size};return 0!==c&&ci?(s.error("BoxParser","Box of type '"+l+"' has a size "+c+" greater than its container size "+i),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+l+"' box"),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):e?{code:u.OK,type:l,size:c,hdr_size:h,start:o}:(u[l+"Box"]?r=new u[l+"Box"](c):"uuid"!==l?(s.warn("BoxParser","Unknown box type: '"+l+"'"),(r=new u.Box(l,c)).has_unparsed_data=!0):u.UUIDBoxes[a]?r=new u.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new u.Box(l,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===u.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+d+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+d+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+d+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:u.OK,box:r,size:r.size})},u.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},u.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},u.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},u.SAMPLE_ENTRY_TYPE_VISUAL="Visual",u.SAMPLE_ENTRY_TYPE_AUDIO="Audio",u.SAMPLE_ENTRY_TYPE_HINT="Hint",u.SAMPLE_ENTRY_TYPE_METADATA="Metadata",u.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",u.SAMPLE_ENTRY_TYPE_SYSTEM="System",u.SAMPLE_ENTRY_TYPE_TEXT="Text",u.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},u.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},u.SampleEntry.prototype.parseFooter=function(t){u.ContainerBox.prototype.parse.call(this,t)},u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_HINT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)}),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)}),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT,"enct"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA,"encm"),u.createBoxCtor("a1lx","AV1LayeredImageIndexingProperty",function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()}),u.createBoxCtor("a1op","OperatingPointSelectorProperty",function(t){this.op_index=t.readUint8()}),u.createFullBoxCtor("auxC","AuxiliaryTypeProperty",function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)}),u.createBoxCtor("av1C","AV1CodecConfigurationBox",function(t){var e=t.readUint8();if(1&~(e>>7))s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")}),u.createBoxCtor("avcC","AVCConfigurationBox",function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],this.SPS.toString=function(){return l(this)},e=0;e0&&(this.ext=t.readUint8Array(i))}),u.createBoxCtor("btrt","BitRateBox",function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()}),u.createFullBoxCtor("ccst","CodingConstraintsBox",function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()}),u.createBoxCtor("cdef","ComponentDefinitionBox",function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}}),u.createFullBoxCtor("co64","ChunkLargeOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))}),u.createFullBoxCtor("cprt","CopyrightBox",function(t){this.parseLanguage(t),this.notice=t.readCString()}),u.createFullBoxCtor("cslg","CompositionToDecodeBox",function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())}),u.createFullBoxCtor("ctts","CompositionOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7}),u.createBoxCtor("dec3","EC3SpecificBox",function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}}),u.createFullBoxCtor("dfLa","FLACSpecificBox",function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"}),u.createBoxCtor("dimm","hintimmediateBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dmax","hintlongestpacket",function(t){this.time=t.readUint32()}),u.createBoxCtor("dmed","hintmediaBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dOps","OpusSpecificBox",function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++}),u.createFullBoxCtor("hdlr","HandlerBox",function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))}),u.createBoxCtor("hvcC","HEVCConfigurationBox",function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
completenessnalu_typenalu_data
"+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
"};var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e}),u.createFullBoxCtor("infe","ItemInfoEntry",function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))}),u.createFullBoxCtor("ipma","ItemPropertyAssociationBox",function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}}),u.createFullBoxCtor("iref","ItemReferenceBox",function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}}),u.createBoxCtor("lhvC","LHEVCConfigurationBox",function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+"
completenessnalu_typenalu_data
"+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
"};var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()}),u.createBoxCtor("npck","hintPacketsSent",function(t){this.packetssent=t.readUint32()}),u.createBoxCtor("nump","hintPacketsSent",function(t){this.packetssent=t.readUint64()}),u.createFullBoxCtor("padb","PaddingBitsBox",function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))}),u.createFullBoxCtor("clef","TrackCleanApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("enof","TrackEncodedPixelsDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("prof","TrackProductionApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createContainerBoxCtor("tapt","TrackApertureModeDimensionsBox",null,["clef","prof","enof"]),u.createBoxCtor("rtp ","rtpmoviehintinformation",function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)}),u.createFullBoxCtor("saio","SampleAuxiliaryInformationOffsetsBox",function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e}),u.createSampleGroupCtor("rash",function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=u.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))}),u.createSampleGroupCtor("stsa",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("sync",function(t){var e=t.readUint8();this.NAL_unit_type=63&e}),u.createSampleGroupCtor("tele",function(t){var e=t.readUint8();this.level_independently_decodable=e>>7}),u.createSampleGroupCtor("tsas",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("tscl",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("vipr",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createFullBoxCtor("sbgp","SampleToGroupBox",function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e}),u.createFullBoxCtor("senc","SampleEncryptionBox"),u.createFullBoxCtor("sgpd","SampleGroupDescriptionBox",function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}}),u.SingleItemTypeReferenceBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.SingleItemTypeReferenceBox.prototype=new u.Box,u.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=u.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))}),u.createFullBoxCtor("tfdt","TrackFragmentBaseMediaDecodeTimeBox",function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()}),u.createFullBoxCtor("tfhd","TrackFragmentHeaderBox",function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0}),u.createFullBoxCtor("tfra","TrackFragmentRandomAccessBox",function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()}),u.createBoxCtor("tmax","hintmaxrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("tmin","hintminrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("totl","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpay","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpyl","hintBytesSent",function(t){this.bytessent=t.readUint64()}),u.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},u.createTrackGroupCtor("msrc"),u.TrackReferenceTypeBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.TrackReferenceTypeBox.prototype=new u.Box,u.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},u.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&u.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}}),u.createFullBoxCtor("url ","DataEntryUrlBox",function(t){1!==this.flags&&(this.location=t.readCString())}),u.createFullBoxCtor("urn ","DataEntryUrnBox",function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())}),u.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66","LiveServerManifestBox",!0,!1,function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}),u.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3","PiffProtectionSystemSpecificHeaderBox",!0,!1,function(t){this.system_id=u.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))}),u.createUUIDBox("a2394f525a9b4f14a2446c427c648df4","PiffSampleEncryptionBox",!0,!1),u.createUUIDBox("8974dbce7be74c5184f97148f9882554","PiffTrackEncryptionBox",!0,!1,function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=u.parseHex16(t)}),u.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f","TfrfBox",!0,!1,function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))}),u.createBoxCtor("vttC","WebVTTConfigurationBox",function(t){this.text=t.readString(this.size-this.hdr_size)}),u.createFullBoxCtor("vvcC","VvcConfigurationBox",function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=u.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+u.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},u.vvc1SampleEntry.prototype.getCodec=u.vvi1SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},u.mp4aSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+u.decimalToHex(e)+(i?"."+i:"")}return t},u.stxtSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},u.vp08SampleEntry.prototype.getCodec=u.vp09SampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},u.av01SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},u.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},u.FullBox.prototype.writeHeader=function(t){this.size+=4,u.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},u.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},u.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},u.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},u.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},u.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},u.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&u.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&u.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&u.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&u.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof u.Box||e[i]instanceof u.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||u.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},u.boxEqual=function(t,e){if(!u.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},y.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},y.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},y.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=u.parseOneBox(this.stream,!1)).code===u.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},y.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},y.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},y.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},y.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},y.prototype.getBoxes=function(t,e){var i=[];return y._sweep.call(this,t,i,e),i},y._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;y._sweep.call(this.boxes[r],t,e,i)}},y.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},y.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},y.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},y.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},y.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var d=new u.avcCBox;d.parse(new n(e.avcDecoderConfigRecord)),a.addBox(d)}else if(e.hevcDecoderConfigRecord){var p=new u.hvcCBox;p.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(p)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach(function(t){a.addBox(t)}),s.add("dinf").add("dref").addEntry((new u["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},u.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},y.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},y.prototype.createSingleSampleMoof=function(t){var e;e=t.is_sync?1<<25:65536;var i=new u.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",u.TRUN_FLAGS_DATA_OFFSET|u.TRUN_FLAGS_DURATION|u.TRUN_FLAGS_SIZE|u.TRUN_FLAGS_FLAGS|u.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},y.prototype.lastMoofIndex=0,y.prototype.samplesDataSize=0,y.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},y.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},y.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},y.prototype.buildSampleLists=function(){var t,e;for(t=0;tb&&(w++,b<0&&(b=0),b+=n.sample_counts[w]),e>0?(t.samples[e-1].duration=n.sample_deltas[w],t.samples_duration+=t.samples[e-1].duration,T.dts=t.samples[e-1].dts+t.samples[e-1].duration):T.dts=0,a?(e>=v&&(x++,v<0&&(v=0),v+=a.sample_counts[x]),T.cts=t.samples[e].dts+a.sample_offsets[x]):T.cts=T.dts,o?(e==o.sample_numbers[U]-1?(T.is_sync=!0,U++):(T.is_sync=!1,T.degradation_priority=0),c&&c.entries[S].sample_delta+E==e+1&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta,S++)):T.is_sync=!0,y.process_sdtp(t.mdia.minf.stbl.sdtp,T,T.number),T.degradation_priority=d?d.priority[e]:0,c&&c.entries[S].sample_delta+E==e&&(T.subsamples=c.entries[S].subsamples,E+=c.entries[S].sample_delta),(u.length>0||l.length>0)&&y.setSampleGroupProperties(t,T,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},y.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,l,d,p,f,m;if(void 0!==this.moov)for(;this.lastMoofIndex0&&y.initSampleGroups(d,l,l.sbgps,d.mdia.minf.stbl.sgpds,l.sgpds),e=0;e0?f.dts=d.samples[d.samples.length-2].dts+d.samples[d.samples.length-2].duration:(l.tfdt?f.dts=l.tfdt.baseMediaDecodeTime:f.dts=0,d.first_traf_merged=!0),f.cts=f.dts,g.flags&u.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+g.sample_composition_time_offset[i]),m=a,g.flags&u.TRUN_FLAGS_FLAGS?m=g.sample_flags[i]:0===i&&g.flags&u.TRUN_FLAGS_FIRST_FLAG&&(m=g.first_sample_flags),f.is_sync=!(m>>16&1),f.is_leading=m>>26&3,f.depends_on=m>>24&3,f.is_depended_on=m>>22&3,f.has_redundancy=m>>20&3,f.degradation_priority=65535&m;var _,b=!!(l.tfhd.flags&u.TFHD_FLAG_BASE_DATA_OFFSET),w=!!(l.tfhd.flags&u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),v=!!(g.flags&u.TRUN_FLAGS_DATA_OFFSET);_=b?l.tfhd.base_data_offset:w||0===e?c.start:o,f.offset=0===e&&0===i?v?_+g.data_offset:_:o,o=f.offset+f.size,(l.sbgps.length>0||l.sgpds.length>0||d.mdia.minf.stbl.sbgps.length>0||d.mdia.minf.stbl.sgpds.length>0)&&y.setSampleGroupProperties(d,f,f.number_in_traf,l.sample_groups_info)}}if(l.subs){d.has_fragment_subsamples=!0;var x=l.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},y.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},y.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},y.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},y.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding,i.item_uri_type=a.iinf.item_infos[t].item_uri_type;if(a.grpl)for(t=0;t0&&d.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},y.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},u.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},u.FullBox.prototype.printHeader=function(t){this.size+=4,u.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},u.Box.prototype.print=function(t){this.printHeader(t)},u.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},u.tkhdBox.prototype.print=function(t){u.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var _=function(t,e){var i=void 0===t||t,r=new y(e);return r.discardMdatData=!i,r};t.createFile=_}(o)),o);class c{info;#s=h.createFile();#n=0;#a=[];constructor(t){this.#s.onError=t=>{console.error("MP4 error",t)},this.#s.onReady=t=>{this.info=t;for(const e of t.tracks)this.#s.setExtractionOptions(e.id,e,{nbSamples:1})},this.#s.onSamples=(t,e,i)=>{for(const t of i)this.#a.push({track:e,sample:t})},this.#s.start();const e=new Uint8Array(t).buffer;if(e.fileStart=this.#n,this.#s.appendBuffer(e),this.#n+=e.byteLength,this.#s.flush(),!this.info)throw new Error("could not parse MP4 info")}decode(t){const e=new Uint8Array(t).buffer;e.fileStart=this.#n,this.#s.appendBuffer(e),this.#s.flush(),this.#n+=e.byteLength;const i=[...this.#a];return this.#a.length=0,i}}function u(t){return void 0!==t.video}h.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=11,0!==this.ChannelMappingFamily&&(this.size+=2+this.ChannelMapping.length),this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),0!==this.ChannelMappingFamily){if(!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box with channel mapping");t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};let l=class{#o;#h;#c;#u;constructor(t,e){this.#h=e,this.#o=new n(t.ring),this.#u=new TransformStream({start:this.#l.bind(this),transform:this.#d.bind(this)}),this.#p().catch(console.error)}#l(t){this.#c=new AudioDecoder({output:e=>{t.enqueue(e)},error:console.warn})}#d(t){if("configured"!==this.#c.state){const e=t.track;if(!function(t){return void 0!==t.audio}(e))throw new Error("expected audio track");this.#c.configure({codec:e.codec,sampleRate:e.audio.sample_rate,numberOfChannels:e.audio.channel_count})}const e=new EncodedAudioChunk({type:t.sample.is_sync?"key":"delta",timestamp:t.sample.dts/t.track.timescale,duration:t.sample.duration,data:t.sample.data});this.#c.decode(e)}async#p(){const t=this.#h.frames.pipeThrough(this.#u).getReader();for(;;){const{value:e,done:i}=await t.read();if(i)break;const r=this.#o.write(e);r{console.error(t)}),this.#y=!0}play(){this.#_=!1}async#p(){const t=this.#h.frames.pipeThrough(this.#m).getReader();for(;;){const{value:e,done:i}=await t.read();if(!this.#_){if(i)break;self.requestAnimationFrame(()=>{this.#f.width=e.displayWidth,this.#f.height=e.displayHeight;const t=this.#f.getContext("2d");if(!t)throw new Error("failed to get canvas context");t.drawImage(e,0,0,e.displayWidth,e.displayHeight),e.close()})}}}#l(t){this.#c=new VideoDecoder({output:e=>{t.enqueue(e)},error:console.error})}#d(t){if("closed"===this.#c.state||this.#_)return void console.warn("Decoder is closed or paused. Skipping frame.");const{sample:e,track:i}=t;if(this.#g&&"configured"==this.#c.state&&u(i)&&(this.#g.codec!==i.codec||this.#g.codedWidth!==i.video.width||this.#g.codedHeight!==i.video.height)&&(this.#c.reset(),this.#g=void 0),"configured"!==this.#c.state){const r=e.description,s=r.avcC??r.hvcC??r.vpcC??r.av1C;if(!s)throw new Error(`unsupported codec: ${i.codec}`);const n=new h.DataStream(void 0,0,h.DataStream.BIG_ENDIAN);s.write(n);const a=new Uint8Array(n.buffer,8);if(!u(i))throw new Error("expected video track");this.#g={codec:i.codec,codedHeight:i.video.height,codedWidth:i.video.width,description:a};try{this.#c.configure(this.#g),console.log(`[VideoWorker] Decoder configured successfully. New state: ${this.#c.state}`)}catch(t){return void console.error("[VideoWorker] FAILED to configure decoder:",t)}t.sample.is_sync?this.#y=!1:this.#y=!0}if("configured"==this.#c.state){if(this.#y&&!t.sample.is_sync)return console.warn("Skipping non-keyframe until a keyframe is found."),void(this.#b||(self.postMessage("waitingforkeyframe"),this.#b=!0));t.sample.is_sync&&(this.#y=!1,this.#b=!1);const e=new EncodedVideoChunk({type:t.sample.is_sync?"key":"delta",data:t.sample.data,timestamp:t.sample.dts/t.track.timescale});console.log(`[VideoWorker] Decoding chunk, type: ${e.type}, size: ${e.byteLength}`);try{this.#c.decode(e)}catch(t){console.error("[VideoWorker] FAILED to decode chunk:",t)}}}}class p{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}const f=Math.pow(2,6)-1,m=Math.pow(2,14)-1,g=Math.pow(2,30)-1,y=Number.MAX_SAFE_INTEGER,_=2n**62n-1n;class b{buffer;offset=0;view;constructor(t){this.buffer=t,this.view=new DataView(t.buffer,t.byteOffset,t.length)}get length(){return this.buffer.length}get remaining(){return this.length-this.offset}get Uint8Array(){return this.buffer.slice(0,this.offset)}get firstByteValue(){return this.buffer[this.offset]}getRemainingBuffer(){return this.buffer.subarray(this.offset)}getU8(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset);return this.offset+=1,t}getU16(){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,t}getU32(){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,t}getU64(){if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,t}getVarInt(){if(this.remaining<1)throw new Error("not enough bytes");const t=this.view.getUint8(this.offset),e=(192&t)>>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class v{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#w(t)}get byteLength(){return this.buffer.byteLength}async#v(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#w(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#w(1),this.#x(1)[0]}async getU16(){await this.#w(2);const t=this.#x(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>y)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#w(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#x(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#w(2);const t=this.#x(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#w(4);const t=this.#x(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#w(8);const t=this.#x(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0||await this.#v())}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}var x,U,S,E,T,B,A,I,k,z,P,C;!function(t){t.serialize=function(t){const e=new w(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=U.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s{try{F.on(t)}catch(t){const e=function(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}(t);console.warn("worker error:",e)}})}()});!function(t){t[t.READ_POS=0]="READ_POS",t[t.WRITE_POS=1]="WRITE_POS",t[t.LENGTH=2]="LENGTH"}(v||(v={}));class U{state;channels;capacity;constructor(t,e){this.state=new SharedArrayBuffer(v.LENGTH*Int32Array.BYTES_PER_ELEMENT),this.channels=[];for(let i=0;i>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const e="number"==typeof t?BigInt(t):t;if(e<0)throw new Error("underflow, value is negative: "+t);let i,r;if(e>s|BigInt(r)));for(let t=i-2;t>=0;t--)this.putU8(Number(e>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class P{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#L(t)}get byteLength(){return this.buffer.byteLength}async#F(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#L(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#L(1),this.#N(1)[0]}async getU16(){await this.#L(2);const t=this.#N(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>A)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#L(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#N(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#L(2);const t=this.#N(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#L(4);const t=this.#N(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#L(8);const t=this.#N(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0)&&!await this.#F()}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}class C{writer;writableStream;buffer;constructor(t){this.writer=t.getWriter(),this.writableStream=t,this.buffer=new z(new Uint8Array)}async write(t){return this.writer.write(t)}async close(){return this.writer.releaseLock(),this.writableStream.close()}async flush(){await this.write(this.buffer.Uint8Array),this.clear()}clear(){this.buffer=new z(new Uint8Array)}putU8(t){this.buffer.putU8(t)}putU16(t){this.buffer.putU16(t)}putVarInt(t){this.buffer.putVarInt(t)}putUtf8String(t){this.buffer.putUtf8String(t)}release(){return this.writer.releaseLock(),[this.buffer.Uint8Array,this.writableStream]}}class L{readStreamBuffer;writeStreamBuffer;constructor(t,e){this.readStreamBuffer=new P(t),this.writeStreamBuffer=new C(e)}waitForBytes(t){return this.readStreamBuffer.waitForBytes(t)}get byteLength(){return this.readStreamBuffer.byteLength}async read(t){return this.readStreamBuffer.read(t)}async getU8(){return this.readStreamBuffer.getU8()}async getU16(){return this.readStreamBuffer.getU16()}async getNumberVarInt(){return this.readStreamBuffer.getNumberVarInt()}async getVarInt(){return this.readStreamBuffer.getVarInt()}async getUtf8String(){return this.readStreamBuffer.getUtf8String()}async getVarBytes(){return this.readStreamBuffer.getVarBytes()}async done(){return this.readStreamBuffer.done()}putU16(t){this.writeStreamBuffer.putU16(t)}putVarInt(t){this.writeStreamBuffer.putVarInt(t)}putUtf8String(t){this.writeStreamBuffer.putUtf8String(t)}putU8(t){this.writeStreamBuffer.putU8(t)}async write(t){return this.writeStreamBuffer.write(t)}async close(){this.readStreamBuffer.close(),this.writeStreamBuffer.close()}async flush(){return this.writeStreamBuffer.flush()}clear(){this.writeStreamBuffer.clear()}release(){throw new Error("use release all instead of release")}releaseAll(){const[t,e]=this.readStreamBuffer.release(),[i,r]=this.writeStreamBuffer.release();return[t,i,e,r]}}var F,N,D,R,M,V,O,G,H,j,Y,q,$,W,K,X,Z,Q,J,tt,et,it,rt,st,nt,at,ot,ht,ct,ut,lt,dt,pt,ft,mt,gt,yt,_t,bt,wt,vt,xt,Ut,St;!function(t){t.serialize=function(t){const e=new z(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=N.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s0&&(o=R.deserialize(t)),{id:e,subscription_id:i,start_location:r,end_group:s,subscriber_priority:n,forward:a,params:o}}}(Y||(Y={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.SubscribeNamespace);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putBytes(F.serialize(t.namespace)),i.putBytes(R.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=F.deserialize(t);let r;return t.remaining>0&&(r=R.deserialize(t)),{id:e,namespace:i,params:r}}}(q||(q={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.SubscribeNamespaceOk);const i=new z(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}($||($={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.SubscribeNamespaceError);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(W||(W={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.Unsubscribe);const i=new z(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(K||(K={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.Publish);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.track_alias),i.putBytes(F.serialize(t.namespace)),i.putUtf8String(t.name),i.putU8(t.content_exists),i.putBytes(V.serialize(t.group_order)),t.largest_location&&i.putBytes(D.serialize(t.largest_location)),i.putU8(t.forward),i.putBytes(M.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),track_alias:t.getVarInt(),namespace:F.deserialize(t),name:t.getUtf8String(),content_exists:t.getU8(),group_order:V.deserialize(t),largest_location:D.deserialize(t),forward:t.getU8(),params:M.deserialize(t)}}}(X||(X={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.PublishOk);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.forward),i.putU8(t.subscriber_priority),i.putBytes(V.serialize(t.group_order)),i.putBytes(O.serialize(t.filter_type)),t.start_location&&i.putBytes(D.serialize(t.start_location)),t.end_group&&i.putVarInt(t.end_group),i.putBytes(M.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=t.getU8(),s=V.deserialize(t),n=O.deserialize(t);let a,o,h;return n!=O.AbsoluteStart&&n!=O.AbsoluteRange||(a=D.deserialize(t)),n==O.AbsoluteRange&&(o=t.getVarInt()),t.remaining>0&&(h=M.deserialize(t)),{id:e,forward:i,subscriber_priority:r,group_order:s,filter_type:n,start_location:a,end_group:o,params:h}}}(Z||(Z={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.PublishError);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(Q||(Q={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.PublishDone);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putVarInt(t.stream_count),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),stream_count:t.getVarInt(),reason:t.getUtf8String()}}}(J||(J={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.PublishNamespace);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putBytes(F.serialize(t.namespace)),i.putBytes(M.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),namespace:F.deserialize(t),params:M.deserialize(t)}}}(tt||(tt={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.PublishNamespaceOk);const i=new z(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(et||(et={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.PublishNamespaceError);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(it||(it={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.PublishNamespaceDone);const i=new z(new Uint8Array);return i.putBytes(F.serialize(t.namespace)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:F.deserialize(t)}}}(rt||(rt={})),function(t){t[t.Standalone=1]="Standalone",t[t.Relative=2]="Relative",t[t.Absolute=3]="Absolute"}(st||(st={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(e){const i=e.getVarInt();switch(i){case 1n:return t.Standalone;case 2n:return t.Relative;case 3n:return t.Absolute;default:throw new Error(`Invalid FetchType value: ${i}`)}}}(st||(st={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.Fetch);const i=new z(new Uint8Array);return i.putBytes(F.serialize(t.namespace)),i.putUtf8String(t.name),i.putBytes(D.serialize(t.start_location)),i.putBytes(D.serialize(t.end_location)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:F.deserialize(t),name:t.getUtf8String(),start_location:D.deserialize(t),end_location:D.deserialize(t)}}}(nt||(nt={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.Fetch);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.start),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),start:t.getVarInt()}}}(at||(at={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.Fetch);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.subscriber_priority),i.putBytes(V.serialize(t.group_order)),i.putBytes(st.serialize(t.fetch_type)),t.standalone&&i.putBytes(nt.serialize(t.standalone)),t.joining&&i.putBytes(at.serialize(t.joining)),i.putBytes(M.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=V.deserialize(t),s=st.deserialize(t);let n,a,o;return s==st.Standalone?n=nt.deserialize(t):s!=st.Relative&&s!=st.Absolute||(a=at.deserialize(t)),t.remaining>0&&(o=M.deserialize(t)),{id:e,subscriber_priority:i,group_order:r,fetch_type:s,standalone:n,joining:a,params:o}}}(ot||(ot={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.FetchOk);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putBytes(V.serialize(t.group_order)),i.putU8(t.end_of_track),i.putBytes(D.serialize(t.end_location)),i.putBytes(M.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=V.deserialize(t),r=t.getU8(),s=D.deserialize(t);let n;return t.remaining>0&&(n=M.deserialize(t)),{id:e,group_order:i,end_of_track:r,end_location:s,params:n}}}(ht||(ht={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.FetchError);const i=new z(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(ct||(ct={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.FetchCancel);const i=new z(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(ut||(ut={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.GoAway);const i=new z(new Uint8Array);return i.putUtf8String(t.session_uri),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getUtf8String();if(e.length>8192)throw new Error("session_uri too long");return{session_uri:e}}}(lt||(lt={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);e.putVarInt(gt.ClientSetup);const i=new z(new Uint8Array);return i.putVarInt(t.versions.length),t.versions.forEach(t=>{i.putVarInt(t)}),i.putBytes(M.serialize(t.params)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),console.log("client setup: payload len:",i.length,"msg len:",e.length),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=[];for(let r=0;r{t=()=>e()}),i=this.#M.then(()=>t);return this.#M=e,i}nextRequestId(t=2n){const e=this.#D;if(void 0!==this.#R&&e>=this.#R)throw new Error(`TOO_MANY_REQUESTS: Request ID ${e} >= remote max ${this.#R}`);return this.#D+=t,e}setRemoteMaxRequestId(t){if(void 0!==this.#R&&t<=this.#R)throw new Error(`PROTOCOL_VIOLATION: MAX_REQUEST_ID must only increase (received ${t}, current ${this.#R})`);this.#R=t}}class Tt{r;constructor(t){this.r=t}async messageType(){return await this.r.getNumberVarInt()}async message(){const t=await this.messageType(),e=await this.r.getU16();e>this.r.byteLength&&(console.error(`message: ${gt.toString(t)} length mismatch: advertised ${e} > ${this.r.byteLength} received`),await this.r.waitForBytes(e));const i=await this.r.read(e),r=new k(i);let s;switch(t){case gt.RequestsBlocked:s={type:t,message:yt.deserialize(r)};break;case gt.GoAway:s={type:t,message:lt.deserialize(r)};break;case gt.Subscribe:s={type:t,message:G.deserialize(r)};break;case gt.SubscribeOk:s={type:t,message:H.deserialize(r)};break;case gt.SubscribeError:s={type:t,message:j.deserialize(r)};break;case gt.Unsubscribe:s={type:t,message:K.deserialize(r)};break;case gt.SubscribeUpdate:s={type:t,message:Y.deserialize(r)};break;case gt.Publish:s={type:t,message:X.deserialize(r)};break;case gt.PublishDone:s={type:t,message:J.deserialize(r)};break;case gt.PublishOk:s={type:t,message:Z.deserialize(r)};break;case gt.PublishError:s={type:t,message:Q.deserialize(r)};break;case gt.PublishNamespace:s={type:t,message:tt.deserialize(r)};break;case gt.PublishNamespaceOk:s={type:t,message:et.deserialize(r)};break;case gt.PublishNamespaceDone:s={type:t,message:rt.deserialize(r)};break;case gt.PublishNamespaceError:s={type:t,message:it.deserialize(r)};break;case gt.Fetch:s={type:t,message:ot.deserialize(r)};break;case gt.FetchCancel:s={type:t,message:ut.deserialize(r)};break;case gt.FetchOk:s={type:t,message:ht.deserialize(r)};break;case gt.FetchError:s={type:t,message:ct.deserialize(r)};break;case gt.SubscribeNamespace:s={type:t,message:q.deserialize(r)};break;case gt.SubscribeNamespaceOk:s={type:t,message:$.deserialize(r)};break;case gt.SubscribeNamespaceError:s={type:t,message:W.deserialize(r)};break;case gt.MaxRequestId:s={type:t,message:ft.deserialize(r)};break;default:throw new Error(`unknown message kind: ${t}`)}return s}}class Bt{w;constructor(t){this.w=t}message(t){const{message:e}=t;switch(t.type){case gt.Subscribe:return G.serialize(e);case gt.SubscribeOk:return H.serialize(e);case gt.SubscribeError:return j.serialize(e);case gt.SubscribeUpdate:return Y.serialize(e);case gt.SubscribeNamespace:return q.serialize(e);case gt.SubscribeNamespaceOk:return $.serialize(e);case gt.SubscribeNamespaceError:return W.serialize(e);case gt.Unsubscribe:return K.serialize(e);case gt.Publish:return X.serialize(e);case gt.PublishDone:return J.serialize(e);case gt.PublishOk:return Z.serialize(e);case gt.PublishError:return Q.serialize(e);case gt.PublishNamespace:return tt.serialize(e);case gt.PublishNamespaceOk:return et.serialize(e);case gt.PublishNamespaceError:return it.serialize(e);case gt.PublishNamespaceDone:return rt.serialize(e);case gt.Fetch:return ot.serialize(e);case gt.FetchCancel:return ut.serialize(e);case gt.FetchOk:return ht.serialize(e);case gt.FetchError:return ct.serialize(e);case gt.MaxRequestId:return ft.serialize(e);case gt.GoAway:return lt.serialize(e);case gt.RequestsBlocked:return yt.serialize(e);default:throw new Error("unknown message kind in encoder")}}async send(t){await this.w.write(t)}}!function(t){t.serialize=function(t){const e=new z(new Uint8Array);return e.putBytes(wt.serialize(t.type)),e.putVarInt(t.track_alias),e.putVarInt(t.group_id),wt.hasExplicitSubgroupId(t.type)&&void 0!==t.subgroup_id&&e.putVarInt(t.subgroup_id),e.putU8(t.publisher_priority),e.Uint8Array}}(_t||(_t={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);return e.putVarInt(t.object_id),t.extension_headers&&e.putBytes(R.serialize(t.extension_headers)),e.putVarInt(t.object_payload?.length??0),t.object_payload?e.putBytes(t.object_payload):e.putVarInt(t.status),e.Uint8Array}}(bt||(bt={})),function(t){t[t.Type0x10=16]="Type0x10",t[t.Type0x11=17]="Type0x11",t[t.Type0x12=18]="Type0x12",t[t.Type0x13=19]="Type0x13",t[t.Type0x14=20]="Type0x14",t[t.Type0x15=21]="Type0x15",t[t.Type0x18=24]="Type0x18",t[t.Type0x19=25]="Type0x19",t[t.Type0x1A=26]="Type0x1A",t[t.Type0x1B=27]="Type0x1B",t[t.Type0x1C=28]="Type0x1C",t[t.Type0x1D=29]="Type0x1D"}(wt||(wt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x10:case t.Type0x11:case t.Type0x12:case t.Type0x13:case t.Type0x14:case t.Type0x15:case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return i;default:throw new Error(`invalid subgroup type: ${i}`)}}function i(e){switch(e){case t.Type0x14:case t.Type0x15:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}function r(t){return i(t)}function s(e){switch(e){case t.Type0x10:case t.Type0x11:case t.Type0x18:case t.Type0x19:return!0;default:return!1}}t.serialize=function(t){const e=new z(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isSubgroupIdPresent=i,t.hasExplicitSubgroupId=r,t.isSubgroupIdZero=s,t.isSubgroupFirstObjectId=function(t){return!(r(t)||s(t))},t.isExtensionPresent=function(e){switch(e){case t.Type0x11:case t.Type0x13:case t.Type0x15:case t.Type0x19:case t.Type0x1B:case t.Type0x1D:return!0;default:return!1}},t.contains_end_of_group=function(e){switch(e){case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}}(wt||(wt={}));class At{header;stream;constructor(t,e){this.header=t,this.stream=e}async write(t){return this.stream.write(bt.serialize(t))}async close(){return this.stream.close()}}class It{header;stream;constructor(t,e){this.header=t,this.stream=e}async read(){if(await this.stream.done())return;const t=await this.stream.getNumberVarInt();let e;wt.isExtensionPresent(this.header.type)&&(e=await R.deserialize_with_reader(this.stream)),console.log("subgroup header",t,e,this.stream);let i,r,s=await this.stream.getNumberVarInt();return console.log("subgroup read",t,s),0==s?r=xt.try_from(await this.stream.getNumberVarInt()):i=await this.stream.read(s),console.log("read success??",t,r,e,i),{object_id:t,status:r,extension_headers:e,object_payload:i}}async close(){await this.stream.close()}}!function(t){t.Datagram="Datagram",t.Subgroup="Subgroup"}(vt||(vt={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.OBJECT_NULL=1]="OBJECT_NULL",t[t.GROUP_END=3]="GROUP_END",t[t.TRACK_END=4]="TRACK_END"}(xt||(xt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case 0:return t.NORMAL;case 1:return t.OBJECT_NULL;case 3:return t.GROUP_END;case 4:return t.TRACK_END;default:throw new Error(`invalid object status: ${i}`)}}t.serialize=function(t){const e=new z(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e}(xt||(xt={})),function(t){t[t.Type0x0=0]="Type0x0",t[t.Type0x1=1]="Type0x1",t[t.Type0x2=2]="Type0x2",t[t.Type0x3=3]="Type0x3",t[t.Type0x4=4]="Type0x4",t[t.Type0x5=5]="Type0x5",t[t.Type0x6=6]="Type0x6",t[t.Type0x7=7]="Type0x7",t[t.Type0x20=32]="Type0x20",t[t.Type0x21=33]="Type0x21"}(Ut||(Ut={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x0:case t.Type0x1:case t.Type0x2:case t.Type0x3:case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:case t.Type0x20:case t.Type0x21:return i;default:throw new Error(`invalid object datagram type: ${i}`)}}t.serialize=function(t){const e=new z(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isEndOfGroup=function(e){switch(e){case t.Type0x2:case t.Type0x3:case t.Type0x6:case t.Type0x7:return!0;default:return!1}},t.hasExtensions=function(e){switch(e){case t.Type0x1:case t.Type0x3:case t.Type0x5:case t.Type0x7:case t.Type0x21:return!0;default:return!1}},t.hasObjectId=function(e){switch(e){case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:return!1;default:return!0}},t.hasStatus=function(e){switch(e){case t.Type0x20:case t.Type0x21:return!0;default:return!1}}}(Ut||(Ut={})),function(t){t.serialize=function(t){const e=new z(new Uint8Array);return e.putBytes(Ut.serialize(t.type)),e.putVarInt(t.group_id),t.object_id&&e.putVarInt(t.object_id),t.object_payload?(e.putVarInt(t.object_payload.byteLength),e.putBytes(t.object_payload)):(e.putVarInt(0),e.putVarInt(t.status)),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=t.getVarInt(),r=t.getNumberVarInt();let s;Ut.hasObjectId(e)&&(s=t.getNumberVarInt());const n=t.getU8();let a,o,h;if(Ut.hasExtensions(e)){const e=t.getNumberVarInt(),i=t.getBytes(e);a=R.deserialize_with_size(new k(i),e)}return Ut.hasStatus(e)?o=xt.try_from(t.getNumberVarInt()):h=t.getBytes(t.remaining),{group_id:r,object_id:s,object_payload:h,status:o,type:e,track_alias:i,publisher_priority:n,extension_headers:a}}}(St||(St={}));class kt{quic;constructor(t){this.quic=t}async send(t){if(t.type in Ut){const t=this.quic.datagrams.writable,e=new C(t);return new zt(e)}{const e=await this.quic.createUnidirectionalStream(),i=new C(e),r=t;return await i.write(_t.serialize(r)),new At(r,i)}}async recv(){console.log("Objects.recv waiting for streams");const t=this.quic.incomingUnidirectionalStreams.getReader();console.log("Objects.recv got streams",t);const{value:e,done:i}=await t.read();if(console.log("Objects.recv got value, done",e,i),t.releaseLock(),i)return;const r=new P(e),s=await r.getNumberVarInt();try{const t=wt.try_from(s);console.log("Objects.recv got type",t);const e=await r.getVarInt(),i=await r.getNumberVarInt();let n;n=wt.hasExplicitSubgroupId(t)?await r.getNumberVarInt():wt.isSubgroupIdZero(t)?0:void 0;const a={type:t,track_alias:e,group_id:i,subgroup_id:n,publisher_priority:await r.getU8()};return console.log("Objects.recv got subgroup header",a),new It(a,r)}catch(t){throw console.log("transport/objects.ts: unknown stream type: ",s),new Error(`unknown stream type: ${s}`)}}}class zt{stream;header={track_alias:0n};constructor(t){this.stream=t}async write(t){return this.stream.write(St.serialize(t))}async close(){return this.stream.close()}}class Pt{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}class Ct{#O;#G=new Pt;constructor(t){this.#G=new Pt,this.#O=[t,this.#G.promise]}value(){return this.#O}update(t){if(!this.#G.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#O[0]));const e=new Pt;this.#O=[t,e.promise],this.#G.resolve(this.#O),this.#G=e}close(){this.#O[1]=void 0,this.#G.resolve(this.#O)}}class Lt{#H;#j=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#H=new TransformStream({},void 0,e)}async push(t){const e=this.#H.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#H.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#j||(await this.#H.writable.abort(t),this.#j=!0)}async close(){this.#j||(await this.#H.writable.close(),this.#j=!0)}closed(){return this.#j}}class Ft{#Y;#q="none";#$;#W=new Map;#K=new Map;#X=new Map;#Z=new Lt(Number.MAX_SAFE_INTEGER);#Q=0n;constructor(t,e){this.#Y=t,this.#$=e}async close(){return this.#Z.close()}get activeSubscribersCount(){return this.#X.size}get migrationState(){return this.#q}set migrationState(t){this.#q=t}async startMigration(){this.migrationState="in_progress"}async migrationDone(t,e){this.migrationState="done",this.#Y=t,this.#$=e}async publish_namespace(t){if("none"!==this.migrationState)throw new Error("migration in progress or going away");if(this.#W.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new Nt(this.#Y,t);this.#W.set(t.join("/"),e);const i=this.#Y.nextRequestId();return this.#K.set(i,t.join("/")),await this.#Y.send({type:gt.PublishNamespace,message:{id:i,namespace:t}}),e}async subscribed(){return await this.#Z.next()}async recv(t){const{type:e,message:i}=t;switch(e){case gt.Subscribe:await this.recvSubscribe(i);break;case gt.Unsubscribe:this.recvUnsubscribe(i);break;case gt.PublishNamespaceOk:this.recvPublishNamespaceOk(i);break;case gt.PublishNamespaceError:this.recvPublishNamespaceError(i);break;default:throw new Error("unknown control message")}}recvPublishNamespaceOk(t){const e=this.#K.get(t.id);if(!e)throw new Error(`publish namespace OK for unknown announce: ${t.id}`);const i=this.#W.get(e);if(!i)throw new Error(`no active published namespace: ${e}`);i.onOk(),console.log("published namespace:",e)}recvPublishNamespaceError(t){const e=this.#K.get(t.id);if(!e)throw new Error(`publish namespace error for unknown announce: ${t.id}`);const i=this.#W.get(e);i?i.onError(t.code,t.reason):console.warn(`publish namespace error for unknown announce: ${e}`)}async recvSubscribe(t){if("none"!==this.migrationState)throw new Error("migration in progress or going away");try{if(this.#X.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=this.#Q++,i=new Dt(this.#Y,this.#$,t,e);this.#X.set(t.id,i),await this.#Z.push(i)}catch(e){throw await this.#Y.send({type:gt.SubscribeError,message:{id:t.id,code:0n,reason:e.message}}),e}}recvUnsubscribe(t){const e=this.#X.get(t.id);if(!e)throw new Error(`unsubscribe for unknown subscribe: ${t.id}`);e.close(),this.#X.delete(t.id)}}class Nt{#Y;namespace;#J=new Ct("init");constructor(t,e){this.#Y=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#J.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#J.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#J.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#J.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`PUBLISH_NAMESPACE_ERROR (${t})`+e?`: ${e}`:"");this.#J.update(i)}}class Dt{#Y;#$;#tt;#et;#it;groupOrder;namespace;track;#J="init";constructor(t,e,i,r){this.#Y=t,this.#$=e,this.#tt=i.id,this.#et=r,this.namespace=i.namespace,this.track=i.name,this.#it=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#J)return this.#J="ack",console.log("got subscribe req:",this.#tt,"track:",this.#et,"sending subscribe ok"),this.#Y.send({type:gt.SubscribeOk,message:{id:this.#tt,expires:0n,group_order:this.groupOrder,track_alias:this.#et,content_exists:0,params:new Map}})}async close(t=0n,e=""){if("closed"===this.#J)return;const i="ack"===this.#J;return this.#J="closed",i?this.#Y.send({type:gt.PublishDone,message:{id:this.#tt,code:t,reason:e,stream_count:0n}}):this.#Y.send({type:gt.SubscribeError,message:{id:this.#tt,code:t,reason:e}})}async serve(t){if("closed"===this.#J)throw new Error("subscribe closed");return this.#$.send({type:Ut.Type0x0,track_alias:this.#et,group_id:0,object_id:0,publisher_priority:t?.priority??127})}async subgroup(t){if("closed"===this.#J)throw new Error("subscribe closed");return this.#$.send({type:wt.Type0x10,track_alias:this.#et,group_id:t.group,subgroup_id:t.subgroup,publisher_priority:t.priority??127})}}class Rt{#Y;#q="none";#$;#W=new Map;#rt=new Ct([]);#X=new Map;#st=new Map;#nt=new Map;#at=new Map;constructor(t,e){this.#Y=t,this.#$=e}publishedNamespaces(){return this.#rt}get activeSubscribersCount(){return this.#X.size}get migrationState(){return this.#q}set migrationState(t){this.#q=t}async startMigration(){this.migrationState="in_progress";for(const[t,e]of this.#st)await this.unsubscribe(t,!0)}async migrationDone(t,e){this.migrationState="done",this.#Y=t,this.#$=e}async recv(t){const{type:e,message:i}=t;switch(e){case gt.PublishNamespace:await this.recvPublishNamespace(i);break;case gt.PublishNamespaceDone:this.recvPublishNamespaceDone(i);break;case gt.SubscribeOk:this.recvSubscribeOk(i);break;case gt.SubscribeError:await this.recvSubscribeError(i);break;case gt.PublishDone:await this.recvPublishDone(i);break;default:throw new Error("unknown control message")}}async recvPublishNamespace(t){if(this.#W.has(t.namespace.join("/")))throw new Error(`duplicate publish namespace for namespace: ${t.namespace.join("/")}`);await this.#Y.send({type:gt.PublishNamespaceOk,message:{id:t.id}});const e=new Mt(this.#Y,t.namespace,t.id);this.#W.set(t.namespace.join("/"),e),this.#rt.update(t=>[...t,e])}recvPublishNamespaceDone(t){throw new Error("TODO PublishNamespaceDone")}async subscribe_namespace(t){if("in_progress"===this.migrationState||"going_away"===this.migrationState)throw new Error("migration in progress or going away");const e=this.#Y.nextRequestId(),i={type:gt.SubscribeNamespace,message:{id:e,namespace:t}};await this.#Y.send(i)}async subscribe(t,e){if("in_progress"===this.migrationState||"going_away"===this.migrationState)throw new Error("migration in progress or going away");const i=this.#Y.nextRequestId(),s=new Vt(this.#Y,i,t,e);this.#X.set(i,s),this.#st.set(e,i);const n={type:gt.Subscribe,message:{id:i,namespace:t,name:e,subscriber_priority:127,group_order:V.Publisher,filter_type:O.NextGroupStart,forward:1,params:new Map}};return await this.#Y.send(n),r("subscribe sent",n),s}async unsubscribe(t,e=!1){const i=this.#st.get(t);if(void 0!==i)try{const e=this.#X.get(i);if(e){await e.close()&&this.#X.delete(i)}this.#st.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}else console.warn(`Exception track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#X.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);this.#nt.set(t.track_alias,t.id);const i=this.#at.get(t.track_alias);i&&(this.#at.delete(t.track_alias),i(t.id)),console.log("subscribe ok",t),e.onOk(t.track_alias)}async recvSubscribeError(t){const e=this.#X.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);this.#X.delete(t.id),this.#st.delete(e.track),await e.onError(t.code,t.reason)}async recvPublishDone(t){const e=this.#X.get(t.id);if(!e)throw new Error(`publish done for unknown id: ${t.id}`);this.#X.delete(t.id),this.#st.delete(e.track),await e.onDone(t.code,t.stream_count,t.reason)}async recvObject(t){console.log("got object on recvObject",t);const e=t.header.track_alias,i=this.#nt.get(e);console.log("got subscriptionId",i);const r=async e=>{const i=this.#X.get(e);if(!i)throw new Error(`data for unknown subscription: ${e}`);return console.log("doing subscribe on data",t),i.onData(t)};if(void 0===i)return console.warn(`Exception track alias ${e} not found in aliasToSubscriptionMap.`),void this.#at.set(e,r);await r(i)}}class Mt{#Y;#tt;namespace;#J="init";constructor(t,e,i){this.#Y=t,this.namespace=e,this.#tt=i}async ok(){if("init"===this.#J)return this.#J="ack",this.#Y.send({type:gt.PublishNamespaceOk,message:{id:this.#tt}})}async close(t=0n,e=""){if("closed"!==this.#J)return this.#J="closed",this.#Y.send({type:gt.PublishNamespaceError,message:{id:this.#tt,code:t,reason:e}})}}class Vt{#Y;#tt;#et;#j=!1;namespace;track;#ot=new Lt;constructor(t,e,i,r){this.#Y=t,this.#tt=e,this.namespace=i,this.track=r}get trackAlias(){return this.#et}async close(t=0n,e=""){return!!this.#j||(this.#j=!0,void 0===this.#et||(await this.#Y.send({type:gt.Unsubscribe,message:{id:this.#tt}}),!1))}onOk(t){console.log("setting track alias",t),this.#et=t}async onDone(t,e,i){console.warn("subscriber done, ID:",this.#tt,"code",t,"streamCount",e,i)}async onError(t,e){if(0n==t)return await this.#ot.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#ot.abort(i)}async onData(t){console.log("subscribe send onData",t),this.#ot.closed()||await this.#ot.push(t)}async data(){return await this.#ot.next()}}class Ot{#q="none";#ht;#ct;#$;#ut;#lt;#dt;constructor(t,e,i){this.#ht=t,this.#ct=e,this.#$=i,this.#ut=new Ft(this.#ct,this.#$),this.#lt=new Rt(this.#ct,this.#$),this.#dt=this.#pt()}onMigration=async()=>{throw new Error("not implemented")};get migrationState(){return this.#q}close(t=0,e=""){this.#ht.close({closeCode:t,reason:e})}async#pt(){await Promise.all([this.#ft(),this.#mt()])}async closePublisher(t=!0){for(t&&await this.#ct.send({type:gt.GoAway,message:{session_uri:""}}),this.#q="going_away",this.#lt.migrationState="going_away",this.#ut.migrationState="going_away";this.#ut.activeSubscribersCount>0;)await s(100);return console.log("no more active publisher",this.#ut),this.#ut.close()}publish_namespace(t){return this.#ut.publish_namespace(t)}publishedNamespaces(){return this.#lt.publishedNamespaces()}subscribe(t,e){return this.#lt.subscribe(t,e)}unsubscribe(t){return this.#lt.unsubscribe(t)}subscribed(){return this.#ut.subscribed()}async#ft(){try{for(console.log("starting control loop");;){const t=await this.#ct.recv();console.log("control loop got msg",t),await this.#gt(t)}}catch(t){if("close()"===t.message)return void console.warn("closing the connection: ",t);throw console.error("Error in control stream:",t),t}}async#mt(){try{for(console.log("starting object loop");;){const t=await this.#$.recv();if(console.log("object loop got obj",t),!t)break;await this.#lt.recvObject(t)}}catch(t){if("close()"===t.message)return void console.warn("closing the connection: ",t);throw console.error("Error in object stream:",t),t}}async#gt(t){var e;t.type===gt.GoAway?this.#yt(t.message):t.type===gt.MaxRequestId?await this.#_t(t.message):(e=t.type)==gt.SubscribeOk||e==gt.SubscribeError||e==gt.PublishDone||e==gt.Publish||e==gt.PublishNamespace||e==gt.PublishNamespaceDone?await this.#lt.recv(t):await this.#ut.recv(t)}async#_t(t){this.#ct.setRemoteMaxRequestId(t.id)}async#yt(t){if(console.log("preparing for migration, got go_away message:",t),"in_progress"===this.#q)throw new Error("go away received twice");for(this.#q="in_progress",await this.#lt.startMigration(),await this.#ut.startMigration();this.#lt.activeSubscribersCount>0;)await s(100);console.log("active subscribers count",this.#ut.activeSubscribersCount,this.#lt.activeSubscribersCount),this.#q="done",this.onMigration(t.session_uri),console.log("should close the quic session now ")}async migrateSession(t,e,i){this.#ht=t,this.#ct=e,this.#$=i,await this.#ut.migrationDone(e,i),await this.#lt.migrationDone(e,i),this.#dt=this.#pt()}async closed(){try{return await this.#dt,new Error("closed")}catch(t){return e(t)}}}class Gt{#bt;config;constructor(t){this.config=t,this.#bt=this.#wt(t.fingerprint).catch(t=>{console.warn("failed to fetch fingerprint: ",t)})}async createQuic(t){const e={},i=await this.#bt;i&&(e.serverCertificateHashes=[i]);const r=t??this.config.url,s=new WebTransport(r,e);return await s.ready,s}async prepareConnection(t){const e=await t.createBidirectionalStream({sendOrder:Number.MAX_SAFE_INTEGER}),i=new L(e.readable,e.writable),r={versions:[mt.DRAFT_14],params:new Map},s=dt.serialize(r);await i.write(s);const n=await this.readServerSetup(i);if(n.version!=mt.DRAFT_14)throw new Error(`unsupported server version: ${n.version}`);return{control:new Et(i),objects:new kt(t)}}async migrateSession(t){const e=await this.createQuic(t),{control:i,objects:r}=await this.prepareConnection(e);return{quic:e,control:i,objects:r}}async connect(t){const e=await this.createQuic(t),{control:i,objects:r}=await this.prepareConnection(e);return new Ot(e,i,r)}async#wt(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t[t.name,t])),this.#Et=i,this.#Tt=e.tracks.find(t=>h(t))?.name??"",this.#Bt=e.tracks.find(t=>o(t))?.name??"",this.#At=!1,this.#It=!1,this.#vt=new S({canvas:r,catalog:e},this),super.dispatchEvent(new CustomEvent("catalogupdated",{detail:e})),super.dispatchEvent(new CustomEvent("loadedmetadata",{detail:e}));const s=new Promise((t,e)=>{this.#zt=t,this.#Pt=e});this.#dt=new Promise((t,e)=>{s.catch(t=>{this.#zt(),e(t)})}),this.#pt().catch(t=>{console.error("Error in #run():",t),super.dispatchEvent(new CustomEvent("error",{detail:t})),this.#Pt(t)})}static async create(t,i){const s=new Gt({url:t.url,fingerprint:t.fingerprint}),a=await s.connect(),o=await async function(t,i){const s=await t.subscribe(i,".catalog");try{r("catalog subscribe",s);const t=await s.data();if(!t)throw new Error("no catalog data");console.log("catalog segment",t);const e=await t.read();if(!e)throw new Error("no catalog chunk");if(console.log("catalog chunk",e),await t.close(),await s.close(),e.object_payload instanceof Uint8Array)return n(e.object_payload);throw new Error("invalid catalog chunk")}catch(t){console.error("Catalog fetch error: ",t);const i=e(t);throw await s.close(1n,i.message),i}}(a,[t.namespace]);console.log("catalog",o);const h=t.canvas.transferControlToOffscreen(),c=new Ht(a,o,i,h);return a.onMigration=async t=>{console.log("dispatching reconnect event"),c.dispatchEvent(new CustomEvent("reconnect",{detail:{uri:t}}))},c}async#pt(){const t=new Set,e=new Array;this.#Ut.tracks.forEach(i=>{if(i.name===this.#Bt||i.name===this.#Tt){if(!i.namespace)throw new Error("track has no namespace");i.initTrack&&t.add([i.namespace.join("/"),i.initTrack]),e.push(i)}}),console.log("inits",t),console.log("tracks",e),await Promise.all(Array.from(t).map(t=>this.#Lt(...t))),e.forEach(t=>{this.#Ft(t)}),this.#Nt()}async#Lt(t,e){console.log("running #runInit",t,e);const i=await this.#xt.subscribe([t],e);try{console.log("waiting for init data");const t=await Promise.race([i.data(),this.#dt]);if(!t)throw new Error("no init data");console.log("got init data");const r=await t.read();if(!r)throw new Error("no init chunk");if(!(r.object_payload instanceof Uint8Array))throw new Error("invalid init chunk");this.#vt.init({data:r.object_payload,name:e})}finally{await i.close()}}async#Dt(t){if(!t.namespace)throw new Error("track has no namespace");if(this.#It)return;const e=o(t)?"video":h(t)?"audio":"unknown";if("audio"==e&&this.#At)return;"audio"==e&&(this.#Tt=t.name),"video"==e&&(this.#Bt=t.name);let i=!1;const r=await this.#xt.subscribe(t.namespace,t.name);try{for(console.log("starting segment data loop");;){console.log("waiting for segment data",this.#dt);const s=await Promise.race([r.data(),this.#dt]);if(!s)continue;if(!(s instanceof It))throw new Error(`expected group reader for segment: ${t.name}`);if("unknown"==e)throw new Error(`unknown track kind: ${t.name}`);if(!t.initTrack)throw new Error(`no init track for segment: ${t.name}`);i||"video"!=e||(super.dispatchEvent(new Event("loadeddata")),i=!0);const[n,a]=s.stream.release();this.#vt.segment({init:t.initTrack,kind:e,header:s.header,buffer:n,stream:a})}}catch(e){e instanceof Error&&e.message.includes("cancelled")?console.log("Cancelled subscription to track: ",t.name):(console.error("Error in #runTrack:",e),super.dispatchEvent(new CustomEvent("error",{detail:e})))}finally{await r.close()}}#Ft(t){if(this.#Ct.has(t.name))return void console.warn(`Already exist a runTrack task for the track: ${t.name}`);const e=(async()=>this.#Dt(t))();this.#Ct.set(t.name,e),e.catch(e=>{console.error(`Error to subscribe to track ${t.name}`,e),super.dispatchEvent(new CustomEvent("error",{detail:e}))}).finally(()=>{this.#Ct.delete(t.name)})}#Nt(){setInterval(()=>{this.dispatchEvent(new Event("timeupdate"))},1e3)}getCatalog(){return this.#Ut}getCurrentTrack(){return this.#Et>=0&&this.#Ett.name)}getAudioTracks(){return this.#Ut.tracks.filter(h).map(t=>t.name)}getCurrentTime(){return(Date.now()-this.#kt)/1e3}isPaused(){return this.#It}get muted(){return this.#At}get videoTrackName(){return this.#Bt}async switchTrack(t){const e=this.getCurrentTrack();this.#It?this.#Bt=t:(e?(console.log(`Unsubscribing from track: ${e.name} and Subscribing to track: ${t}`),await this.unsubscribeFromTrack(e.name)):console.log(`Subscribing to track: ${t}`),this.#Et=this.#Ut.tracks.findIndex(e=>e.name===t),this.subscribeFromTrackName(t))}async mute(t){this.#At=t,t?(console.log("Unsubscribing from audio track: ",this.#Tt),await this.unsubscribeFromTrack(this.#Tt),await this.#vt.mute()):(console.log("Subscribing to audio track: ",this.#Tt),this.subscribeFromTrackName(this.#Tt),await this.#vt.unmute()),super.dispatchEvent(new CustomEvent("volumechange",{detail:{muted:t}}))}async unsubscribeFromTrack(t){console.log(`Unsubscribing from track: ${t}`),super.dispatchEvent(new CustomEvent("unsubscribestared",{detail:{track:t}})),await this.#xt.unsubscribe(t);const e=this.#Ct.get(t);e&&await e,super.dispatchEvent(new CustomEvent("unsubscribedone",{detail:{track:t}}))}subscribeFromTrackName(t){console.log(`Subscribing to track: ${t}`);const e=this.#St.get(t);e?(super.dispatchEvent(new CustomEvent("subscribestared",{detail:{track:t}})),this.#Ft(e),super.dispatchEvent(new CustomEvent("subscribedone",{detail:{track:t}}))):console.warn(`Track ${t} not in #tracksByName`)}#Rt(t){t.timeline}async close(t){t?this.#Pt(t):this.#zt(),this.#xt&&("cancelled"===t?.message?this.#xt.close(4,"going away"):this.#xt.close()),this.#vt&&await this.#vt.close()}async closed(){try{await this.#dt}catch(t){return console.error("Error in Player.closed():",t),e(t)}}async togglePlayPause(){this.#It?await this.play():await this.pause()}async play(){this.#It&&(this.#It=!1,this.subscribeFromTrackName(this.#Bt),this.#At||(this.subscribeFromTrackName(this.#Tt),await this.#vt.unmute()),this.#vt.play(),super.dispatchEvent(new CustomEvent("play",{detail:{track:this.#Bt}})))}async pause(){if(!this.#It){this.#It=!0;const t=this.#vt.mute(),e=this.unsubscribeFromTrack(this.#Tt),i=this.unsubscribeFromTrack(this.#Bt);super.dispatchEvent(new CustomEvent("pause",{detail:{track:this.#Bt}})),console.log("dispatchEvent pause"),this.#vt.pause(),await Promise.all([t,e,i])}}async setVolume(t){this.#vt.setVolume(t),0!=t||this.#At?t>0&&this.#At&&await this.mute(!1):await this.mute(!0)}getVolume(){return this.#vt?this.#vt.getVolume():0}}const jt='\n\t\t\t\t\t\n\t\t\t\t',Yt='\n\t\t\t\t\t\n\t\t\t\t',qt='\n\n\t\n\n',$t=window.documentPictureInPicture?`\n\t\t\n\t`:"";class Wt extends HTMLElement{shadow;playPauseEventHandler;onMouseEnterHandler;onMouseLeaveHandler;toggleMuteEventHandler;setVolume;toggleShowTrackEventHandler;toggleFullscreenEventHandler;togglePictureInPictureEventHandler;#Mt;#Vt;#Ot;#Gt;#Ht;#jt;#Yt;#qt;#$t;#Wt;#Kt;player=null;previousVolume=1;get src(){return this.getAttribute("src")}set src(t){this.setAttribute("src",`${t}`)}get controls(){return this.getAttribute("controls")}set controls(t){this.setAttribute("controls",`${t}`)}get muted(){return!!this.player&&this.player.muted}set muted(t){t?(this.mute().catch(t=>{console.error("Error muting:",t)}),this.dispatchEvent(new Event("volumechange"))):(this.unmute().catch(t=>{console.error("Error unmuting:",t)}),this.dispatchEvent(new Event("volumechange")))}get fullscreen(){return document.fullscreenElement===this.#Mt}set fullscreen(t){t?this.requestFullscreen().catch(t=>{console.error("Error entering fullscreen:",t)}):this.exitFullscreen().catch(t=>{console.error("Error exiting fullscreen:",t)})}get pictureInPictureActive(){return void 0!==this.#Kt}get trackNum(){return this.getAttribute("trackNum")}set trackNum(t){this.setAttribute("trackNum",`${t}`)}get selectedTrack(){return this.player?this.player.videoTrackName:""}error=null;constructor(){super(),this.shadow=this.attachShadow({mode:"open"}),this.playPauseEventHandler=()=>{this.togglePlayPause().catch(t=>{console.error("Error toggling play/pause:",t)})},this.toggleMuteEventHandler=()=>{this.toggleMute().catch(t=>{console.error("Error toggling mute:",t)})},this.togglePictureInPictureEventHandler=()=>{this.togglePictureInPicture().catch(t=>{console.error("Error toggling picture-in-picture: ",t)})},this.setVolume=t=>{this.handleVolumeChange(t).catch(t=>{console.error("Error setting volume: ",t)})},this.onMouseEnterHandler=this.toggleShowControls.bind(this,!0),this.onMouseLeaveHandler=this.toggleShowControls.bind(this,!1),this.toggleShowTrackEventHandler=this.toggleShowTracks.bind(this),this.toggleFullscreenEventHandler=this.toggleFullscreen.bind(this),this.onFullscreenChange=this.onFullscreenChange.bind(this)}connectedCallback(){this.load()}disconnectedCallback(){this.destroy().catch(t=>{console.error("Error while destroying:",t)})}setPlayer(t){this.player=t,this.player.addEventListener("play",()=>this.dispatchEvent(new Event("play"))),this.player.addEventListener("pause",()=>this.dispatchEvent(new Event("pause"))),this.player.addEventListener("loadeddata",()=>this.dispatchEvent(new Event("loadeddata"))),this.player.addEventListener("volumechange",()=>this.dispatchEvent(new Event("volumechange"))),this.player.addEventListener("timeupdate",()=>{const t=new CustomEvent("timeupdate",{detail:{currentTime:this.player?.getCurrentTime()}});this.dispatchEvent(t)}),this.player.addEventListener("error",t=>this.dispatchEvent(new CustomEvent("error",{detail:t}))),!this.player.isPaused()&&this.#Ot&&(this.#Ot.innerHTML=Yt,this.#Ot.ariaLabel="Pause",!this.muted&&this.#Ht&&(this.#Ht.ariaLabel="Mute",this.#Ht.innerText="🔊"))}async load(t=!1){if(await this.destroy(t).catch(t=>{console.error("Error while destroying:",t)}),console.log("creating player:",this.src),this.shadow.innerHTML='\n\t\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t',this.#Mt=this.shadow.querySelector("#base"),this.#Vt=this.shadow.querySelector("canvas#canvas"),!this.src)return void this.fail(new Error("No 'src' attribute provided for "));const e=new URL(this.src),i=new URLSearchParams(e.search),r=i.get("namespace")||this.getAttribute("namespace"),s=i.get("fingerprint")||this.getAttribute("fingerprint");if(null===r)return void this.fail(new Error("No 'namespace' attribute provided for "));const n=i.get("trackNum")||this.trackNum,a=this.auxParseInt(n,0);try{const t=await Ht.create({url:e.origin,fingerprint:s??void 0,canvas:this.#Vt,namespace:r},a);t.addEventListener("reconnect",t=>{console.log("[VideoMoq] Reconnect event received:",t.detail,this.src),t.detail?.uri&&""!==t.detail.uri&&(this.src=`${t.detail.uri}?namespace=${r}`),this.load(!0)}),this.setPlayer(t)}catch(t){this.fail(t)}if(null!==this.controls){const t=document.createElement("div");t.innerHTML=`\n\t\t\t
\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t
\n\t\t\n\t\t\n\t
\n\n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
\n\t\t\t\t\t${$t}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
`,this.#Mt.appendChild(t.children[0]),this.#Gt=this.shadow.querySelector("#controls"),this.#Ot=this.shadow.querySelector("#play"),this.#Ht=this.shadow.querySelector("#volume"),this.#jt=this.shadow.querySelector("#volume-range"),this.#Yt=this.shadow.querySelector("#track"),this.#qt=this.shadow.querySelector("ul#tracklist"),this.#$t=this.shadow.querySelector("#fullscreen"),this.#Wt=this.shadow.querySelector("#picture-in-picture"),this.#Vt.addEventListener("click",this.playPauseEventHandler),this.#Ot.addEventListener("click",this.playPauseEventHandler),this.#Ht.addEventListener("click",this.toggleMuteEventHandler),this.#jt?.addEventListener("input",this.setVolume),this.#Mt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Mt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Vt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Vt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Gt.addEventListener("mouseenter",this.onMouseEnterHandler),this.#Gt.addEventListener("mouseleave",this.onMouseLeaveHandler),this.#Yt.addEventListener("click",this.toggleShowTrackEventHandler),this.#$t.addEventListener("click",this.toggleFullscreenEventHandler),this.#Wt.addEventListener("click",this.togglePictureInPictureEventHandler),document.addEventListener("keydown",t=>{"f"===t.key&&this.toggleFullscreenEventHandler(t)}),document.addEventListener("fullscreenchange",()=>this.onFullscreenChange())}const o=this.parseDimension(this.getAttribute("width"),-1),h=this.parseDimension(this.getAttribute("height"),-1);-1!=o&&(this.#Mt.style.width=o.toString()+"px"),-1!=h&&(this.#Mt.style.height=h.toString()+"px");const c=this.getAttribute("aspectRatio");null!==c&&(this.#Mt.style.aspectRatio=c.toString())}async destroy(t=!1){this.#Vt?.removeEventListener("click",this.playPauseEventHandler),this.#Ot?.removeEventListener("click",this.playPauseEventHandler),this.#Ht?.removeEventListener("click",this.toggleMuteEventHandler),this.#jt?.removeEventListener("input",this.setVolume),this.#Vt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Vt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Gt?.removeEventListener("mouseenter",this.onMouseEnterHandler),this.#Gt?.removeEventListener("mouseleave",this.onMouseLeaveHandler),this.#Yt?.removeEventListener("click",this.toggleShowTrackEventHandler),this.#$t?.removeEventListener("click",this.toggleFullscreenEventHandler),this.#Wt?.removeEventListener("click",this.togglePictureInPictureEventHandler),document.removeEventListener("keydown",this.toggleFullscreenEventHandler),document.removeEventListener("fullscreenchange",()=>this.onFullscreenChange()),console.log("destroying player"),this.player?(t?this.player.close(new Error("cancelled")):await this.player.close(),this.player=null):console.log("player is null")}toggleShowControls(t){this.#Gt&&(t?(this.#Gt.classList.add("opacity-100"),this.#Gt.classList.remove("opacity-0")):(this.#Gt.classList.add("opacity-0"),this.#Gt.classList.remove("opacity-100")))}async togglePlayPause(){if(this.#Ot){this.#Ot.disabled=!0;try{if(!this.player)return;this.player.isPaused()?await this.play():await this.pause()}catch(t){console.error("Error toggling play/pause:",t)}finally{this.#Ot&&(this.#Ot.disabled=!1)}}}play(){return this.player?this.player.play().then(()=>{this.#Ot&&(this.#Ot.innerHTML=Yt,this.#Ot.ariaLabel="Pause")}):Promise.resolve()}pause(){return this.player?this.player.pause().then(()=>{this.#Ot&&(this.#Ot.innerHTML=jt,this.#Ot.ariaLabel="Play")}):Promise.resolve()}get paused(){return!!this.player&&this.player.isPaused()}async toggleMute(){if(this.#Ht){this.#Ht.disabled=!0;try{this.muted?await this.unmute():await this.mute()}catch(t){console.error("Error toggling mute:",t)}finally{this.#Ht&&(this.#Ht.disabled=!1)}}}unmute(){return this.player?this.player.mute(!1).then(()=>{this.#Ht&&(this.#Ht.ariaLabel="Mute",this.#Ht.innerText="🔊",this.#jt.value=this.previousVolume.toString())}):Promise.resolve()}mute(){return this.player?this.player.mute(!0).then(()=>{this.#Ht&&(this.#Ht.ariaLabel="Unmute",this.#Ht.innerText="🔇",this.previousVolume=parseFloat(this.#jt.value),this.#jt.value="0")}):Promise.resolve()}handleVolumeChange=async t=>{const e=parseFloat(t.currentTarget.value);0===e?await this.mute():await this.unmute(),this.#jt.value=e.toString(),await(this.player?.setVolume(e))};toggleFullscreen(){this.fullscreen=!document.fullscreenElement}async requestFullscreen(){try{this.#Mt&&await this.#Mt.requestFullscreen()}catch(t){console.error("Error entering fullscreen:",t)}}async exitFullscreen(){try{await document.exitFullscreen()}catch(t){console.error("Error exiting fullscreen:",t)}}onFullscreenChange(){const t=null!==document.fullscreenElement;this.#$t&&(t?(this.#$t.innerHTML="⇲",this.#$t.ariaLabel="Exit full screen"):(this.#$t.innerHTML="⛶",this.#$t.ariaLabel="Full screen"))}async enterPictureInPicture(){if(!this.#Wt)return;if(!this.#Vt)return void console.warn("Canvas element not found.");if(!this.#Mt)return void console.warn("Base element not found.");if(this.#Kt=window.documentPictureInPicture&&await window.documentPictureInPicture.requestWindow({width:320,height:180}),!this.#Kt)return void console.warn("Picture-in-Picture window not found.");this.#Kt.document.body.append(this.#Vt),this.#Vt.style.width="100%",this.#Vt.style.height="100%",this.#Wt.innerHTML='\n\n\t\n\n',this.#Mt.classList.add("pip-mode");const t=document.createElement("div");t.id="pip-text",t.textContent="Picture-in-Picture Mode",t.style.color="white",t.style.textAlign="center",t.style.marginTop="10px",this.#Mt.appendChild(t),this.#Vt.addEventListener("click",this.playPauseEventHandler),this.#Kt?.addEventListener("pagehide",()=>this.exitPictureInPicture())}exitPictureInPicture(){if(this.#Wt)if(this.#Vt&&this.#Mt){this.#Mt.append(this.#Vt),this.#Wt.innerHTML=qt,this.#Mt.classList.remove("pip-mode");const t=this.#Mt.querySelector("#pip-text");t&&t.remove(),this.#Vt.removeEventListener("click",this.playPauseEventHandler),this.#Kt?.removeEventListener("pagehide",()=>this.exitPictureInPicture()),this.#Kt?.close(),this.#Kt=void 0}else console.warn("Failed to restore video element! Check DOM structure.")}async togglePictureInPicture(){if("documentPictureInPicture"in window)try{this.pictureInPictureActive?this.exitPictureInPicture():await this.enterPictureInPicture()}catch(t){console.error("Error toggling Picture-in-Picture:",t)}else console.warn("DocumentPictureInPicture API is not supported.")}#Xt=!1;toggleShowTracks(){if(this.#qt)if(this.#Xt=!this.#Xt,this.#Xt)if(this.player){const t=this.player.getVideoTracks();this.#qt.innerHTML=t.map(t=>`
  • \n\t\t\t\t ${t}\n\t\t\t\t
  • `).join(""),this.#qt.querySelectorAll("li").forEach(t=>{t.addEventListener("click",()=>{this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})}),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||this.switchTrack(t.dataset.name||null).catch(t=>{console.error("Error switching track:",t)})})})}else this.#qt.innerHTML='
  • No options available
  • ';else this.#qt.innerHTML=""}async switchTrack(t){null!==t?await(this.player?.switchTrack(t)):this.error=new Error("Could not recognize selected track name")}parseDimension(t,e){if(!t)return e;const i=parseInt(t,10);return isNaN(i)||i<=0?(console.warn(`Invalid value "${t}" for dimension, using default: ${e}px`),e):i}fail(t){console.error("Moq Player failed, please reload",t),this.error=t||new Error("Unknown error");const e=this.shadow.querySelector("#error");e&&(e.innerHTML=`\n\t\t\t\t
    \n\t\t\t\t\t${this.error.name}: ${this.error.message}\n\t\t\t\t
    `)}auxParseInt(t,e){if(null==t)return e;const i=parseInt(t);return isNaN(i)?e:i}get duration(){return this.player?this.player.getCurrentTime():0}get currentTime(){return this.player?this.player.getCurrentTime():0}set currentTime(t){t>6;if(0===e)return this.offset+=1,BigInt(63&t);if(1===e){if(this.remaining<2)throw new Error("not enough bytes");const t=this.view.getUint16(this.offset);return this.offset+=2,BigInt(16383&t)}if(2===e){if(this.remaining<4)throw new Error("not enough bytes");const t=this.view.getUint32(this.offset);return this.offset+=4,BigInt(1073741823&t)}{if(this.remaining<8)throw new Error("not enough bytes");const t=this.view.getBigUint64(this.offset);return this.offset+=8,0x3fffffffffffffffn&t}}getNumberVarInt(){const t=this.getVarInt();if(t>Number.MAX_SAFE_INTEGER)throw new Error("varint too large");return Number(t)}getBytes(t){if(this.remaining>1,r|=r>>2,r|=r>>4,r|=r>>8,1+(r|=r>>16)));var r;i.set(this.buffer.subarray(0,this.offset)),this.buffer=i,this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength)}putU8(t){this.enoughSpaceAvailable(1),this.view.setUint8(this.offset,t),this.offset+=1}putU16(t){this.enoughSpaceAvailable(2),this.view.setUint16(this.offset,t),this.offset+=2}putU32(t){this.enoughSpaceAvailable(4),this.view.setUint32(this.offset,t),this.offset+=4}putU64(t){this.enoughSpaceAvailable(8),this.view.setBigUint64(this.offset,t),this.offset+=8}putVarInt(t){const i="number"==typeof t?BigInt(t):t;if(i<0)throw new Error("underflow, value is negative: "+t);let n,o;if(i>h|BigInt(o)));for(let t=n-2;t>=0;t--)this.putU8(Number(i>>BigInt(8*t)&0xffn))}putBytes(t){this.enoughSpaceAvailable(t.length),this.buffer.set(t,this.offset),this.offset+=t.length}putUtf8String(t){const e=(new TextEncoder).encode(t);this.putLengthPrefixedByteArray(e.length,e)}putLengthPrefixedByteArray(t,e){this.putVarInt(t),this.putBytes(e)}}class c{buffer;reader;readableStream;constructor(t,e){this.buffer=e??new Uint8Array,this.reader=t.getReader(),this.readableStream=t}waitForBytes(t){return this.buffer.byteLength>=t?Promise.resolve():this.#t(t)}get byteLength(){return this.buffer.byteLength}async#e(){const t=await this.reader.read();if(t.done)return!1;const e=new Uint8Array(t.value);if(0==this.buffer.byteLength)this.buffer=e;else{const t=new Uint8Array(this.buffer.byteLength+e.byteLength);t.set(this.buffer),t.set(e,this.buffer.byteLength),this.buffer=t}return!0}async#t(t){for(;this.buffer.byteLengtht)throw new Error(`string length ${e} exceeds max length ${t}`);const i=await this.read(e);return(new TextDecoder).decode(i)}async getU8(){return await this.#t(1),this.#i(1)[0]}async getU16(){await this.#t(2);const t=this.#i(2);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt16(0)}async getNumberVarInt(){const t=await this.getVarInt();if(t>n)throw new Error("value larger than 53-bits; use v62 instead");return Number(t)}async getVarInt(){await this.#t(1);const t=(192&this.buffer[0])>>6;if(0==t){const t=this.#i(1)[0];return 0x3fn&BigInt(t)}if(1==t){await this.#t(2);const t=this.#i(2),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffn&BigInt(e.getInt16(0))}if(2==t){await this.#t(4);const t=this.#i(4),e=new DataView(t.buffer,t.byteOffset,t.byteLength);return 0x3fffffffn&BigInt(e.getUint32(0))}if(3==t){await this.#t(8);const t=this.#i(8);return 0x3fffffffffffffffn&new DataView(t.buffer,t.byteOffset,t.byteLength).getBigUint64(0)}throw new Error("impossible")}async getVarBytes(){const t=await this.getNumberVarInt();return this.read(t)}async done(){return!(this.buffer.byteLength>0)&&!await this.#e()}async close(){this.reader.releaseLock(),await this.readableStream.cancel()}release(){return this.reader.releaseLock(),[this.buffer,this.readableStream]}}class u{writer;writableStream;buffer;constructor(t){this.writer=t.getWriter(),this.writableStream=t,this.buffer=new h(new Uint8Array)}async write(t){return this.writer.write(t)}async close(){return this.writer.releaseLock(),this.writableStream.close()}async flush(){await this.write(this.buffer.Uint8Array),this.clear()}clear(){this.buffer=new h(new Uint8Array)}putU8(t){this.buffer.putU8(t)}putU16(t){this.buffer.putU16(t)}putVarInt(t){this.buffer.putVarInt(t)}putUtf8String(t){this.buffer.putUtf8String(t)}release(){return this.writer.releaseLock(),[this.buffer.Uint8Array,this.writableStream]}}class l{readStreamBuffer;writeStreamBuffer;constructor(t,e){this.readStreamBuffer=new c(t),this.writeStreamBuffer=new u(e)}waitForBytes(t){return this.readStreamBuffer.waitForBytes(t)}get byteLength(){return this.readStreamBuffer.byteLength}async read(t){return this.readStreamBuffer.read(t)}async getU8(){return this.readStreamBuffer.getU8()}async getU16(){return this.readStreamBuffer.getU16()}async getNumberVarInt(){return this.readStreamBuffer.getNumberVarInt()}async getVarInt(){return this.readStreamBuffer.getVarInt()}async getUtf8String(){return this.readStreamBuffer.getUtf8String()}async getVarBytes(){return this.readStreamBuffer.getVarBytes()}async done(){return this.readStreamBuffer.done()}putU16(t){this.writeStreamBuffer.putU16(t)}putVarInt(t){this.writeStreamBuffer.putVarInt(t)}putUtf8String(t){this.writeStreamBuffer.putUtf8String(t)}putU8(t){this.writeStreamBuffer.putU8(t)}async write(t){return this.writeStreamBuffer.write(t)}async close(){this.readStreamBuffer.close(),this.writeStreamBuffer.close()}async flush(){return this.writeStreamBuffer.flush()}clear(){this.writeStreamBuffer.clear()}release(){throw new Error("use release all instead of release")}releaseAll(){const[t,e]=this.readStreamBuffer.release(),[i,r]=this.writeStreamBuffer.release();return[t,i,e,r]}}var d,p,f,m,_,g,y,b,w,S,U,x,v,E,B,A,T,I,z,k,C,P,L,F,D,N,R,M,O,V,G,H,Y,j,q,$,K;function W(...t){console.log("itzmanish:",...t)}async function X(t){return new Promise(e=>setTimeout(e,t))}!function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t.length),t.forEach(t=>{const i=p.serialize(t);e.putBytes(i)}),e.Uint8Array},t.deserialize=function(t){const e=[],i=t.getVarInt();for(let r=0;r{i.putVarInt(r),e(r)?i.putVarInt(t):i.putBytes(t)}),i.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt();return i(t,e)},t.deserialize_with_size=i,t.deserialize_with_reader=async function(t){const i=await t.getNumberVarInt(),r=new Map;for(let s=0;s0&&(o=m.deserialize(t)),{id:e,subscription_id:i,start_location:r,end_group:s,subscriber_priority:n,forward:a,params:o}}}(U||(U={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.SubscribeNamespace);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putBytes(d.serialize(t.namespace)),i.putBytes(m.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=d.deserialize(t);let r;return t.remaining>0&&(r=m.deserialize(t)),{id:e,namespace:i,params:r}}}(x||(x={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.SubscribeNamespaceOk);const i=new h(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(v||(v={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.SubscribeNamespaceError);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(E||(E={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.Unsubscribe);const i=new h(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(B||(B={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.Publish);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.track_alias),i.putBytes(d.serialize(t.namespace)),i.putUtf8String(t.name),i.putU8(t.content_exists),i.putBytes(g.serialize(t.group_order)),t.largest_location&&i.putBytes(f.serialize(t.largest_location)),i.putU8(t.forward),i.putBytes(_.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),track_alias:t.getVarInt(),namespace:d.deserialize(t),name:t.getUtf8String(),content_exists:t.getU8(),group_order:g.deserialize(t),largest_location:f.deserialize(t),forward:t.getU8(),params:_.deserialize(t)}}}(A||(A={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.PublishOk);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.forward),i.putU8(t.subscriber_priority),i.putBytes(g.serialize(t.group_order)),i.putBytes(y.serialize(t.filter_type)),t.start_location&&i.putBytes(f.serialize(t.start_location)),t.end_group&&i.putVarInt(t.end_group),i.putBytes(_.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=t.getU8(),s=g.deserialize(t),n=y.deserialize(t);let a,o,h;return n!=y.AbsoluteStart&&n!=y.AbsoluteRange||(a=f.deserialize(t)),n==y.AbsoluteRange&&(o=t.getVarInt()),t.remaining>0&&(h=_.deserialize(t)),{id:e,forward:i,subscriber_priority:r,group_order:s,filter_type:n,start_location:a,end_group:o,params:h}}}(T||(T={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.PublishError);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(I||(I={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.PublishDone);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putVarInt(t.stream_count),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),stream_count:t.getVarInt(),reason:t.getUtf8String()}}}(z||(z={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.PublishNamespace);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putBytes(d.serialize(t.namespace)),i.putBytes(_.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),namespace:d.deserialize(t),params:_.deserialize(t)}}}(k||(k={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.PublishNamespaceOk);const i=new h(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(C||(C={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.PublishNamespaceError);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(P||(P={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.PublishNamespaceDone);const i=new h(new Uint8Array);return i.putBytes(d.serialize(t.namespace)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:d.deserialize(t)}}}(L||(L={})),function(t){t[t.Standalone=1]="Standalone",t[t.Relative=2]="Relative",t[t.Absolute=3]="Absolute"}(F||(F={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(e){const i=e.getVarInt();switch(i){case 1n:return t.Standalone;case 2n:return t.Relative;case 3n:return t.Absolute;default:throw new Error(`Invalid FetchType value: ${i}`)}}}(F||(F={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.Fetch);const i=new h(new Uint8Array);return i.putBytes(d.serialize(t.namespace)),i.putUtf8String(t.name),i.putBytes(f.serialize(t.start_location)),i.putBytes(f.serialize(t.end_location)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{namespace:d.deserialize(t),name:t.getUtf8String(),start_location:f.deserialize(t),end_location:f.deserialize(t)}}}(D||(D={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.Fetch);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.start),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),start:t.getVarInt()}}}(N||(N={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.Fetch);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putU8(t.subscriber_priority),i.putBytes(g.serialize(t.group_order)),i.putBytes(F.serialize(t.fetch_type)),t.standalone&&i.putBytes(D.serialize(t.standalone)),t.joining&&i.putBytes(N.serialize(t.joining)),i.putBytes(_.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=t.getU8(),r=g.deserialize(t),s=F.deserialize(t);let n,a,o;return s==F.Standalone?n=D.deserialize(t):s!=F.Relative&&s!=F.Absolute||(a=N.deserialize(t)),t.remaining>0&&(o=_.deserialize(t)),{id:e,subscriber_priority:i,group_order:r,fetch_type:s,standalone:n,joining:a,params:o}}}(R||(R={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.FetchOk);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putBytes(g.serialize(t.group_order)),i.putU8(t.end_of_track),i.putBytes(f.serialize(t.end_location)),i.putBytes(_.serialize(t.params??new Map)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getVarInt(),i=g.deserialize(t),r=t.getU8(),s=f.deserialize(t);let n;return t.remaining>0&&(n=_.deserialize(t)),{id:e,group_order:i,end_of_track:r,end_location:s,params:n}}}(M||(M={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.FetchError);const i=new h(new Uint8Array);return i.putVarInt(t.id),i.putVarInt(t.code),i.putUtf8String(t.reason),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt(),code:t.getVarInt(),reason:t.getUtf8String()}}}(O||(O={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.FetchCancel);const i=new h(new Uint8Array);return i.putVarInt(t.id),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){return{id:t.getVarInt()}}}(V||(V={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.GoAway);const i=new h(new Uint8Array);return i.putUtf8String(t.session_uri),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),e.Uint8Array},t.deserialize=function(t){const e=t.getUtf8String();if(e.length>8192)throw new Error("session_uri too long");return{session_uri:e}}}(G||(G={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);e.putVarInt($.ClientSetup);const i=new h(new Uint8Array);return i.putVarInt(t.versions.length),t.versions.forEach(t=>{i.putVarInt(t)}),i.putBytes(_.serialize(t.params)),e.putU16(i.byteLength),e.putBytes(i.Uint8Array),console.log("client setup: payload len:",i.length,"msg len:",e.length),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=[];for(let r=0;r{t=()=>e()}),i=this.#n.then(()=>t);return this.#n=e,i}nextRequestId(t=2n){const e=this.#r;if(void 0!==this.#s&&e>=this.#s)throw new Error(`TOO_MANY_REQUESTS: Request ID ${e} >= remote max ${this.#s}`);return this.#r+=t,e}setRemoteMaxRequestId(t){if(void 0!==this.#s&&t<=this.#s)throw new Error(`PROTOCOL_VIOLATION: MAX_REQUEST_ID must only increase (received ${t}, current ${this.#s})`);this.#s=t}}class Z{r;constructor(t){this.r=t}async messageType(){return await this.r.getNumberVarInt()}async message(){const t=await this.messageType(),e=await this.r.getU16();e>this.r.byteLength&&(console.error(`message: ${$.toString(t)} length mismatch: advertised ${e} > ${this.r.byteLength} received`),await this.r.waitForBytes(e));const i=await this.r.read(e),r=new o(i);let s;switch(t){case $.RequestsBlocked:s={type:t,message:K.deserialize(r)};break;case $.GoAway:s={type:t,message:G.deserialize(r)};break;case $.Subscribe:s={type:t,message:b.deserialize(r)};break;case $.SubscribeOk:s={type:t,message:w.deserialize(r)};break;case $.SubscribeError:s={type:t,message:S.deserialize(r)};break;case $.Unsubscribe:s={type:t,message:B.deserialize(r)};break;case $.SubscribeUpdate:s={type:t,message:U.deserialize(r)};break;case $.Publish:s={type:t,message:A.deserialize(r)};break;case $.PublishDone:s={type:t,message:z.deserialize(r)};break;case $.PublishOk:s={type:t,message:T.deserialize(r)};break;case $.PublishError:s={type:t,message:I.deserialize(r)};break;case $.PublishNamespace:s={type:t,message:k.deserialize(r)};break;case $.PublishNamespaceOk:s={type:t,message:C.deserialize(r)};break;case $.PublishNamespaceDone:s={type:t,message:L.deserialize(r)};break;case $.PublishNamespaceError:s={type:t,message:P.deserialize(r)};break;case $.Fetch:s={type:t,message:R.deserialize(r)};break;case $.FetchCancel:s={type:t,message:V.deserialize(r)};break;case $.FetchOk:s={type:t,message:M.deserialize(r)};break;case $.FetchError:s={type:t,message:O.deserialize(r)};break;case $.SubscribeNamespace:s={type:t,message:x.deserialize(r)};break;case $.SubscribeNamespaceOk:s={type:t,message:v.deserialize(r)};break;case $.SubscribeNamespaceError:s={type:t,message:E.deserialize(r)};break;case $.MaxRequestId:s={type:t,message:j.deserialize(r)};break;default:throw new Error(`unknown message kind: ${t}`)}return s}}let J=class{w;constructor(t){this.w=t}message(t){const{message:e}=t;switch(t.type){case $.Subscribe:return b.serialize(e);case $.SubscribeOk:return w.serialize(e);case $.SubscribeError:return S.serialize(e);case $.SubscribeUpdate:return U.serialize(e);case $.SubscribeNamespace:return x.serialize(e);case $.SubscribeNamespaceOk:return v.serialize(e);case $.SubscribeNamespaceError:return E.serialize(e);case $.Unsubscribe:return B.serialize(e);case $.Publish:return A.serialize(e);case $.PublishDone:return z.serialize(e);case $.PublishOk:return T.serialize(e);case $.PublishError:return I.serialize(e);case $.PublishNamespace:return k.serialize(e);case $.PublishNamespaceOk:return C.serialize(e);case $.PublishNamespaceError:return P.serialize(e);case $.PublishNamespaceDone:return L.serialize(e);case $.Fetch:return R.serialize(e);case $.FetchCancel:return V.serialize(e);case $.FetchOk:return M.serialize(e);case $.FetchError:return O.serialize(e);case $.MaxRequestId:return j.serialize(e);case $.GoAway:return G.serialize(e);case $.RequestsBlocked:return K.serialize(e);default:throw new Error("unknown message kind in encoder")}}async send(t){await this.w.write(t)}};var tt,et,it,rt,st,nt,at;!function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putBytes(it.serialize(t.type)),e.putVarInt(t.track_alias),e.putVarInt(t.group_id),it.hasExplicitSubgroupId(t.type)&&void 0!==t.subgroup_id&&e.putVarInt(t.subgroup_id),e.putU8(t.publisher_priority),e.Uint8Array}}(tt||(tt={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t.object_id),t.extension_headers&&e.putBytes(m.serialize(t.extension_headers)),e.putVarInt(t.object_payload?.length??0),t.object_payload?e.putBytes(t.object_payload):e.putVarInt(t.status),e.Uint8Array}}(et||(et={})),function(t){t[t.Type0x10=16]="Type0x10",t[t.Type0x11=17]="Type0x11",t[t.Type0x12=18]="Type0x12",t[t.Type0x13=19]="Type0x13",t[t.Type0x14=20]="Type0x14",t[t.Type0x15=21]="Type0x15",t[t.Type0x18=24]="Type0x18",t[t.Type0x19=25]="Type0x19",t[t.Type0x1A=26]="Type0x1A",t[t.Type0x1B=27]="Type0x1B",t[t.Type0x1C=28]="Type0x1C",t[t.Type0x1D=29]="Type0x1D"}(it||(it={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x10:case t.Type0x11:case t.Type0x12:case t.Type0x13:case t.Type0x14:case t.Type0x15:case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return i;default:throw new Error(`invalid subgroup type: ${i}`)}}function i(e){switch(e){case t.Type0x14:case t.Type0x15:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}function r(t){return i(t)}function s(e){switch(e){case t.Type0x10:case t.Type0x11:case t.Type0x18:case t.Type0x19:return!0;default:return!1}}t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isSubgroupIdPresent=i,t.hasExplicitSubgroupId=r,t.isSubgroupIdZero=s,t.isSubgroupFirstObjectId=function(t){return!(r(t)||s(t))},t.isExtensionPresent=function(e){switch(e){case t.Type0x11:case t.Type0x13:case t.Type0x15:case t.Type0x19:case t.Type0x1B:case t.Type0x1D:return!0;default:return!1}},t.contains_end_of_group=function(e){switch(e){case t.Type0x18:case t.Type0x19:case t.Type0x1A:case t.Type0x1B:case t.Type0x1C:case t.Type0x1D:return!0;default:return!1}}}(it||(it={}));class ot{header;stream;constructor(t,e){this.header=t,this.stream=e}async write(t){return this.stream.write(et.serialize(t))}async close(){return this.stream.close()}}class ht{header;stream;constructor(t,e){this.header=t,this.stream=e}async read(){if(await this.stream.done())return;const t=await this.stream.getNumberVarInt();let e;it.isExtensionPresent(this.header.type)&&(e=await m.deserialize_with_reader(this.stream)),console.log("subgroup header",t,e,this.stream);let i,r,s=await this.stream.getNumberVarInt();return console.log("subgroup read",t,s),0==s?r=st.try_from(await this.stream.getNumberVarInt()):i=await this.stream.read(s),console.log("read success??",t,r,e,i),{object_id:t,status:r,extension_headers:e,object_payload:i}}async close(){await this.stream.close()}}!function(t){t.Datagram="Datagram",t.Subgroup="Subgroup"}(rt||(rt={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.OBJECT_NULL=1]="OBJECT_NULL",t[t.GROUP_END=3]="GROUP_END",t[t.TRACK_END=4]="TRACK_END"}(st||(st={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case 0:return t.NORMAL;case 1:return t.OBJECT_NULL;case 3:return t.GROUP_END;case 4:return t.TRACK_END;default:throw new Error(`invalid object status: ${i}`)}}t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e}(st||(st={})),function(t){t[t.Type0x0=0]="Type0x0",t[t.Type0x1=1]="Type0x1",t[t.Type0x2=2]="Type0x2",t[t.Type0x3=3]="Type0x3",t[t.Type0x4=4]="Type0x4",t[t.Type0x5=5]="Type0x5",t[t.Type0x6=6]="Type0x6",t[t.Type0x7=7]="Type0x7",t[t.Type0x20=32]="Type0x20",t[t.Type0x21=33]="Type0x21"}(nt||(nt={})),function(t){function e(e){const i="bigint"==typeof e?Number(e):e;switch(i){case t.Type0x0:case t.Type0x1:case t.Type0x2:case t.Type0x3:case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:case t.Type0x20:case t.Type0x21:return i;default:throw new Error(`invalid object datagram type: ${i}`)}}t.serialize=function(t){const e=new h(new Uint8Array);return e.putVarInt(t),e.Uint8Array},t.deserialize=function(t){return e(t.getNumberVarInt())},t.try_from=e,t.isEndOfGroup=function(e){switch(e){case t.Type0x2:case t.Type0x3:case t.Type0x6:case t.Type0x7:return!0;default:return!1}},t.hasExtensions=function(e){switch(e){case t.Type0x1:case t.Type0x3:case t.Type0x5:case t.Type0x7:case t.Type0x21:return!0;default:return!1}},t.hasObjectId=function(e){switch(e){case t.Type0x4:case t.Type0x5:case t.Type0x6:case t.Type0x7:return!1;default:return!0}},t.hasStatus=function(e){switch(e){case t.Type0x20:case t.Type0x21:return!0;default:return!1}}}(nt||(nt={})),function(t){t.serialize=function(t){const e=new h(new Uint8Array);return e.putBytes(nt.serialize(t.type)),e.putVarInt(t.group_id),t.object_id&&e.putVarInt(t.object_id),t.object_payload?(e.putVarInt(t.object_payload.byteLength),e.putBytes(t.object_payload)):(e.putVarInt(0),e.putVarInt(t.status)),e.Uint8Array},t.deserialize=function(t){const e=t.getNumberVarInt(),i=t.getVarInt(),r=t.getNumberVarInt();let s;nt.hasObjectId(e)&&(s=t.getNumberVarInt());const n=t.getU8();let a,h,c;if(nt.hasExtensions(e)){const e=t.getNumberVarInt(),i=t.getBytes(e);a=m.deserialize_with_size(new o(i),e)}return nt.hasStatus(e)?h=st.try_from(t.getNumberVarInt()):c=t.getBytes(t.remaining),{group_id:r,object_id:s,object_payload:c,status:h,type:e,track_alias:i,publisher_priority:n,extension_headers:a}}}(at||(at={}));class ct{quic;constructor(t){this.quic=t}async send(t){if(t.type in nt){const t=this.quic.datagrams.writable,e=new u(t);return new ut(e)}{const e=await this.quic.createUnidirectionalStream(),i=new u(e),r=t;return await i.write(tt.serialize(r)),new ot(r,i)}}async recv(){console.log("Objects.recv waiting for streams");const t=this.quic.incomingUnidirectionalStreams.getReader();console.log("Objects.recv got streams",t);const{value:e,done:i}=await t.read();if(console.log("Objects.recv got value, done",e,i),t.releaseLock(),i)return;const r=new c(e),s=await r.getNumberVarInt();try{const t=it.try_from(s);console.log("Objects.recv got type",t);const e=await r.getVarInt(),i=await r.getNumberVarInt();let n;n=it.hasExplicitSubgroupId(t)?await r.getNumberVarInt():it.isSubgroupIdZero(t)?0:void 0;const a={type:t,track_alias:e,group_id:i,subgroup_id:n,publisher_priority:await r.getU8()};return console.log("Objects.recv got subgroup header",a),new ht(a,r)}catch(t){throw console.log("transport/objects.ts: unknown stream type: ",s),new Error(`unknown stream type: ${s}`)}}}class ut{stream;header={track_alias:0n};constructor(t){this.stream=t}async write(t){return this.stream.write(at.serialize(t))}async close(){return this.stream.close()}}function lt(t){return t instanceof Error?t:"string"==typeof t?new Error(t):new Error(String(t))}class dt{promise;resolve;reject;pending=!0;constructor(){this.promise=new Promise((t,e)=>{this.resolve=e=>{this.pending=!1,t(e)},this.reject=t=>{this.pending=!1,e(t)}})}}class pt{#o;#h=new dt;constructor(t){this.#h=new dt,this.#o=[t,this.#h.promise]}value(){return this.#o}update(t){if(!this.#h.pending)throw new Error("already closed");t instanceof Function&&(t=t(this.#o[0]));const e=new dt;this.#o=[t,e.promise],this.#h.resolve(this.#o),this.#h=e}close(){this.#o[1]=void 0,this.#h.resolve(this.#o)}}class ft{#h=new dt;async wait(){return this.#h.promise}wake(){if(!this.#h.pending)throw new Error("closed");this.#h.resolve(),this.#h=new dt}close(){this.#h.resolve()}}class mt{#c;#u=!1;constructor(t=1){const e=new CountQueuingStrategy({highWaterMark:t});this.#c=new TransformStream({},void 0,e)}async push(t){const e=this.#c.writable.getWriter();await e.write(t),e.releaseLock()}async next(){const t=this.#c.readable.getReader(),{value:e,done:i}=await t.read();if(t.releaseLock(),!i)return e}async abort(t){this.#u||(await this.#c.writable.abort(t),this.#u=!0)}async close(){this.#u||(await this.#c.writable.close(),this.#u=!0)}closed(){return this.#u}}class _t{#l;#d="none";#p;#f=new Map;#m=new Map;#_=new Map;#g=new mt(Number.MAX_SAFE_INTEGER);#y=0n;constructor(t,e){this.#l=t,this.#p=e}async close(){return this.#g.close()}get activeSubscribersCount(){return this.#_.size}get migrationState(){return this.#d}set migrationState(t){this.#d=t}async startMigration(){this.migrationState="in_progress"}async migrationDone(t,e){this.migrationState="done",this.#l=t,this.#p=e}async publish_namespace(t){if("none"!==this.migrationState)throw new Error("migration in progress or going away");if(this.#f.has(t.join("/")))throw new Error(`already announced: ${t.join("/")}`);const e=new gt(this.#l,t);this.#f.set(t.join("/"),e);const i=this.#l.nextRequestId();return this.#m.set(i,t.join("/")),await this.#l.send({type:$.PublishNamespace,message:{id:i,namespace:t}}),e}async subscribed(){return await this.#g.next()}async recv(t){const{type:e,message:i}=t;switch(e){case $.Subscribe:await this.recvSubscribe(i);break;case $.Unsubscribe:this.recvUnsubscribe(i);break;case $.PublishNamespaceOk:this.recvPublishNamespaceOk(i);break;case $.PublishNamespaceError:this.recvPublishNamespaceError(i);break;default:throw new Error("unknown control message")}}recvPublishNamespaceOk(t){const e=this.#m.get(t.id);if(!e)throw new Error(`publish namespace OK for unknown announce: ${t.id}`);const i=this.#f.get(e);if(!i)throw new Error(`no active published namespace: ${e}`);i.onOk(),console.log("published namespace:",e)}recvPublishNamespaceError(t){const e=this.#m.get(t.id);if(!e)throw new Error(`publish namespace error for unknown announce: ${t.id}`);const i=this.#f.get(e);i?i.onError(t.code,t.reason):console.warn(`publish namespace error for unknown announce: ${e}`)}async recvSubscribe(t){if("none"!==this.migrationState)throw new Error("migration in progress or going away");try{if(this.#_.has(t.id))throw new Error(`duplicate subscribe for id: ${t.id}`);const e=this.#y++,i=new yt(this.#l,this.#p,t,e);this.#_.set(t.id,i),await this.#g.push(i)}catch(e){throw await this.#l.send({type:$.SubscribeError,message:{id:t.id,code:0n,reason:e.message}}),e}}recvUnsubscribe(t){const e=this.#_.get(t.id);if(!e)throw new Error(`unsubscribe for unknown subscribe: ${t.id}`);e.close(),this.#_.delete(t.id)}}class gt{#l;namespace;#b=new pt("init");constructor(t,e){this.#l=t,this.namespace=e}async ok(){for(;;){const[t,e]=this.#b.value();if("ack"===t)return;if(t instanceof Error)throw t;if(!e)throw new Error("closed");await e}}async active(){for(;;){const[t,e]=this.#b.value();if(t instanceof Error)throw t;if(!e)return;await e}}async close(){}closed(){const[t,e]=this.#b.value();return t instanceof Error||null==e}onOk(){this.closed()||this.#b.update("ack")}onError(t,e){if(this.closed())return;const i=new Error(`PUBLISH_NAMESPACE_ERROR (${t})`+e?`: ${e}`:"");this.#b.update(i)}}class yt{#l;#p;#w;#S;#U;groupOrder;namespace;track;#b="init";constructor(t,e,i,r){this.#l=t,this.#p=e,this.#w=i.id,this.#S=r,this.namespace=i.namespace,this.track=i.name,this.#U=i.subscriber_priority,this.groupOrder=i.group_order}async ack(){if("init"===this.#b)return this.#b="ack",console.log("got subscribe req:",this.#w,"track:",this.#S,"sending subscribe ok"),this.#l.send({type:$.SubscribeOk,message:{id:this.#w,expires:0n,group_order:this.groupOrder,track_alias:this.#S,content_exists:0,params:new Map}})}async close(t=0n,e=""){if("closed"===this.#b)return;const i="ack"===this.#b;return this.#b="closed",i?this.#l.send({type:$.PublishDone,message:{id:this.#w,code:t,reason:e,stream_count:0n}}):this.#l.send({type:$.SubscribeError,message:{id:this.#w,code:t,reason:e}})}async serve(t){if("closed"===this.#b)throw new Error("subscribe closed");return this.#p.send({type:nt.Type0x0,track_alias:this.#S,group_id:0,object_id:0,publisher_priority:t?.priority??127})}async subgroup(t){if("closed"===this.#b)throw new Error("subscribe closed");return this.#p.send({type:it.Type0x10,track_alias:this.#S,group_id:t.group,subgroup_id:t.subgroup,publisher_priority:t.priority??127})}}class bt{#l;#d="none";#p;#f=new Map;#x=new pt([]);#_=new Map;#v=new Map;#E=new Map;#B=new Map;constructor(t,e){this.#l=t,this.#p=e}publishedNamespaces(){return this.#x}get activeSubscribersCount(){return this.#_.size}get migrationState(){return this.#d}set migrationState(t){this.#d=t}async startMigration(){this.migrationState="in_progress";for(const[t,e]of this.#v)await this.unsubscribe(t,!0)}async migrationDone(t,e){this.migrationState="done",this.#l=t,this.#p=e}async recv(t){const{type:e,message:i}=t;switch(e){case $.PublishNamespace:await this.recvPublishNamespace(i);break;case $.PublishNamespaceDone:this.recvPublishNamespaceDone(i);break;case $.SubscribeOk:this.recvSubscribeOk(i);break;case $.SubscribeError:await this.recvSubscribeError(i);break;case $.PublishDone:await this.recvPublishDone(i);break;default:throw new Error("unknown control message")}}async recvPublishNamespace(t){if(this.#f.has(t.namespace.join("/")))throw new Error(`duplicate publish namespace for namespace: ${t.namespace.join("/")}`);await this.#l.send({type:$.PublishNamespaceOk,message:{id:t.id}});const e=new wt(this.#l,t.namespace,t.id);this.#f.set(t.namespace.join("/"),e),this.#x.update(t=>[...t,e])}recvPublishNamespaceDone(t){throw new Error("TODO PublishNamespaceDone")}async subscribe_namespace(t){if("in_progress"===this.migrationState||"going_away"===this.migrationState)throw new Error("migration in progress or going away");const e=this.#l.nextRequestId(),i={type:$.SubscribeNamespace,message:{id:e,namespace:t}};await this.#l.send(i)}async subscribe(t,e){if("in_progress"===this.migrationState||"going_away"===this.migrationState)throw new Error("migration in progress or going away");const i=this.#l.nextRequestId(),r=new St(this.#l,i,t,e);this.#_.set(i,r),this.#v.set(e,i);const s={type:$.Subscribe,message:{id:i,namespace:t,name:e,subscriber_priority:127,group_order:g.Publisher,filter_type:y.NextGroupStart,forward:1,params:new Map}};return await this.#l.send(s),W("subscribe sent",s),r}async unsubscribe(t,e=!1){const i=this.#v.get(t);if(void 0!==i)try{const e=this.#_.get(i);if(e){await e.close()&&this.#_.delete(i)}this.#v.delete(t)}catch(e){console.error(`Failed to unsubscribe from track ${t}:`,e)}else console.warn(`Exception track ${t} not found in trackToIDMap.`)}recvSubscribeOk(t){const e=this.#_.get(t.id);if(!e)throw new Error(`subscribe ok for unknown id: ${t.id}`);this.#E.set(t.track_alias,t.id);const i=this.#B.get(t.track_alias);i&&(this.#B.delete(t.track_alias),i(t.id)),console.log("subscribe ok",t),e.onOk(t.track_alias)}async recvSubscribeError(t){const e=this.#_.get(t.id);if(!e)throw new Error(`subscribe error for unknown id: ${t.id}`);this.#_.delete(t.id),this.#v.delete(e.track),await e.onError(t.code,t.reason)}async recvPublishDone(t){const e=this.#_.get(t.id);if(!e)throw new Error(`publish done for unknown id: ${t.id}`);this.#_.delete(t.id),this.#v.delete(e.track),await e.onDone(t.code,t.stream_count,t.reason)}async recvObject(t){console.log("got object on recvObject",t);const e=t.header.track_alias,i=this.#E.get(e);console.log("got subscriptionId",i);const r=async e=>{const i=this.#_.get(e);if(!i)throw new Error(`data for unknown subscription: ${e}`);return console.log("doing subscribe on data",t),i.onData(t)};if(void 0===i)return console.warn(`Exception track alias ${e} not found in aliasToSubscriptionMap.`),void this.#B.set(e,r);await r(i)}}class wt{#l;#w;namespace;#b="init";constructor(t,e,i){this.#l=t,this.namespace=e,this.#w=i}async ok(){if("init"===this.#b)return this.#b="ack",this.#l.send({type:$.PublishNamespaceOk,message:{id:this.#w}})}async close(t=0n,e=""){if("closed"!==this.#b)return this.#b="closed",this.#l.send({type:$.PublishNamespaceError,message:{id:this.#w,code:t,reason:e}})}}class St{#l;#w;#S;#u=!1;namespace;track;#A=new mt;constructor(t,e,i,r){this.#l=t,this.#w=e,this.namespace=i,this.track=r}get trackAlias(){return this.#S}async close(t=0n,e=""){return!!this.#u||(this.#u=!0,void 0===this.#S||(await this.#l.send({type:$.Unsubscribe,message:{id:this.#w}}),!1))}onOk(t){console.log("setting track alias",t),this.#S=t}async onDone(t,e,i){console.warn("subscriber done, ID:",this.#w,"code",t,"streamCount",e,i)}async onError(t,e){if(0n==t)return await this.#A.close();""!==e&&(e=`: ${e}`);const i=new Error(`SUBSCRIBE_ERROR (${t})${e}`);return await this.#A.abort(i)}async onData(t){console.log("subscribe send onData",t),this.#A.closed()||await this.#A.push(t)}async data(){return await this.#A.next()}}class Ut{#d="none";#T;#I;#p;#z;#k;#C;constructor(t,e,i){this.#T=t,this.#I=e,this.#p=i,this.#z=new _t(this.#I,this.#p),this.#k=new bt(this.#I,this.#p),this.#C=this.#P()}onMigration=async()=>{throw new Error("not implemented")};get migrationState(){return this.#d}close(t=0,e=""){this.#T.close({closeCode:t,reason:e})}async#P(){await Promise.all([this.#L(),this.#F()])}async closePublisher(t=!0){for(t&&await this.#I.send({type:$.GoAway,message:{session_uri:""}}),this.#d="going_away",this.#k.migrationState="going_away",this.#z.migrationState="going_away";this.#z.activeSubscribersCount>0;)await X(100);return console.log("no more active publisher",this.#z),this.#z.close()}publish_namespace(t){return this.#z.publish_namespace(t)}publishedNamespaces(){return this.#k.publishedNamespaces()}subscribe(t,e){return this.#k.subscribe(t,e)}unsubscribe(t){return this.#k.unsubscribe(t)}subscribed(){return this.#z.subscribed()}async#L(){try{for(console.log("starting control loop");;){const t=await this.#I.recv();console.log("control loop got msg",t),await this.#D(t)}}catch(t){if("close()"===t.message)return void console.warn("closing the connection: ",t);throw console.error("Error in control stream:",t),t}}async#F(){try{for(console.log("starting object loop");;){const t=await this.#p.recv();if(console.log("object loop got obj",t),!t)break;await this.#k.recvObject(t)}}catch(t){if("close()"===t.message)return void console.warn("closing the connection: ",t);throw console.error("Error in object stream:",t),t}}async#D(t){var e;t.type===$.GoAway?this.#N(t.message):t.type===$.MaxRequestId?await this.#R(t.message):(e=t.type)==$.SubscribeOk||e==$.SubscribeError||e==$.PublishDone||e==$.Publish||e==$.PublishNamespace||e==$.PublishNamespaceDone?await this.#k.recv(t):await this.#z.recv(t)}async#R(t){this.#I.setRemoteMaxRequestId(t.id)}async#N(t){if(console.log("preparing for migration, got go_away message:",t),"in_progress"===this.#d)throw new Error("go away received twice");for(this.#d="in_progress",await this.#k.startMigration(),await this.#z.startMigration();this.#k.activeSubscribersCount>0;)await X(100);console.log("active subscribers count",this.#z.activeSubscribersCount,this.#k.activeSubscribersCount),this.#d="done",this.onMigration(t.session_uri),console.log("should close the quic session now ")}async migrateSession(t,e,i){this.#T=t,this.#I=e,this.#p=i,await this.#z.migrationDone(e,i),await this.#k.migrationDone(e,i),this.#C=this.#P()}async closed(){try{return await this.#C,new Error("closed")}catch(t){return lt(t)}}}class xt{#M;config;constructor(t){this.config=t,this.#M=this.#O(t.fingerprint).catch(t=>{console.warn("failed to fetch fingerprint: ",t)})}async createQuic(t){const e={},i=await this.#M;i&&(e.serverCertificateHashes=[i]);const r=t??this.config.url,s=new WebTransport(r,e);return await s.ready,s}async prepareConnection(t){const e=await t.createBidirectionalStream({sendOrder:Number.MAX_SAFE_INTEGER}),i=new l(e.readable,e.writable),r={versions:[q.DRAFT_14],params:new Map},s=H.serialize(r);await i.write(s);const n=await this.readServerSetup(i);if(n.version!=q.DRAFT_14)throw new Error(`unsupported server version: ${n.version}`);return{control:new Q(i),objects:new ct(t)}}async migrateSession(t){const e=await this.createQuic(t),{control:i,objects:r}=await this.prepareConnection(e);return{quic:e,control:i,objects:r}}async connect(t){const e=await this.createQuic(t),{control:i,objects:r}=await this.prepareConnection(e);return new Ut(e,i,r)}async#O(t){if(!t)return;const e=await fetch(t),i=await e.text(),r=new Uint8Array(i.length/2);for(let t=0;t{this.timestamp=Math.max(t.timestamp+t.duration),e.enqueue(t.data)}},void 0,e);this.input=i.writable,this.#V=i.readable}chunks(){const[t,e]=this.#V.tee();return this.#V=e,t}}var Et,Bt={};var At=(Et||(Et=1,function(t){var e,r,s=(e=new Date,r=4,{setLogLevel:function(t){r=t==this.debug?1:t==this.info?2:t==this.warn?3:(this.error,4)},debug:function(t,i){void 0===console.debug&&(console.debug=console.log),1>=r&&console.debug("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},log:function(t,e){this.debug(t.msg)},info:function(t,i){2>=r&&console.info("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},warn:function(t,i){3>=r&&console.warn("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)},error:function(t,i){4>=r&&console.error("["+s.getDurationString(new Date-e,1e3)+"]","["+t+"]",i)}});s.getDurationString=function(t,e){var i;function r(t,e){for(var i=(""+t).split(".");i[0].length0){for(var i="",r=0;r0&&(i+=","),i+="["+s.getDurationString(t.start(r))+","+s.getDurationString(t.end(r))+"]";return i}return"(empty)"},t.Log=s;var n=function(t){if(!(t instanceof ArrayBuffer))throw"Needs an array buffer";this.buffer=t,this.dataview=new DataView(t),this.position=0};n.prototype.getPosition=function(){return this.position},n.prototype.getEndPosition=function(){return this.buffer.byteLength},n.prototype.getLength=function(){return this.buffer.byteLength},n.prototype.seek=function(t){var e=Math.max(0,Math.min(this.buffer.byteLength,t));return this.position=isNaN(e)||!isFinite(e)?0:e,!0},n.prototype.isEos=function(){return this.getPosition()>=this.getEndPosition()},n.prototype.readAnyInt=function(t,e){var i=0;if(this.position+t<=this.buffer.byteLength){switch(t){case 1:i=e?this.dataview.getInt8(this.position):this.dataview.getUint8(this.position);break;case 2:i=e?this.dataview.getInt16(this.position):this.dataview.getUint16(this.position);break;case 3:if(e)throw"No method for reading signed 24 bits values";i=this.dataview.getUint8(this.position)<<16,i|=this.dataview.getUint8(this.position+1)<<8,i|=this.dataview.getUint8(this.position+2);break;case 4:i=e?this.dataview.getInt32(this.position):this.dataview.getUint32(this.position);break;case 8:if(e)throw"No method for reading signed 64 bits values";i=this.dataview.getUint32(this.position)<<32,i|=this.dataview.getUint32(this.position+4);break;default:throw"readInt method not implemented for size: "+t}return this.position+=t,i}throw"Not enough bytes in buffer"},n.prototype.readUint8=function(){return this.readAnyInt(1,!1)},n.prototype.readUint16=function(){return this.readAnyInt(2,!1)},n.prototype.readUint24=function(){return this.readAnyInt(3,!1)},n.prototype.readUint32=function(){return this.readAnyInt(4,!1)},n.prototype.readUint64=function(){return this.readAnyInt(8,!1)},n.prototype.readString=function(t){if(this.position+t<=this.buffer.byteLength){for(var e="",i=0;ithis._byteLength&&(this._byteLength=e);else{for(i<1&&(i=1);e>i;)i*=2;var r=new ArrayBuffer(i),s=new Uint8Array(this._buffer);new Uint8Array(r,0,s.length).set(s),this.buffer=r,this._byteLength=e}}},a.prototype._trimAlloc=function(){if(this._byteLength!=this._buffer.byteLength){var t=new ArrayBuffer(this._byteLength),e=new Uint8Array(t),i=new Uint8Array(this._buffer,0,e.length);e.set(i),this.buffer=t}},a.BIG_ENDIAN=!1,a.LITTLE_ENDIAN=!0,a.prototype._byteLength=0,Object.defineProperty(a.prototype,"byteLength",{get:function(){return this._byteLength-this._byteOffset}}),Object.defineProperty(a.prototype,"buffer",{get:function(){return this._trimAlloc(),this._buffer},set:function(t){this._buffer=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"byteOffset",{get:function(){return this._byteOffset},set:function(t){this._byteOffset=t,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._buffer.byteLength}}),Object.defineProperty(a.prototype,"dataView",{get:function(){return this._dataView},set:function(t){this._byteOffset=t.byteOffset,this._buffer=t.buffer,this._dataView=new DataView(this._buffer,this._byteOffset),this._byteLength=this._byteOffset+t.byteLength}}),a.prototype.seek=function(t){var e=Math.max(0,Math.min(this.byteLength,t));this.position=isNaN(e)||!isFinite(e)?0:e},a.prototype.isEof=function(){return this.position>=this._byteLength},a.prototype.mapUint8Array=function(t){this._realloc(1*t);var e=new Uint8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.readInt32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Int32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Int16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Int8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readUint32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Uint32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint16Array=function(t,e){t=null==t?this.byteLength-this.position/2:t;var i=new Uint16Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readUint8Array=function(t){t=null==t?this.byteLength-this.position:t;var e=new Uint8Array(t);return a.memcpy(e.buffer,0,this.buffer,this.byteOffset+this.position,t*e.BYTES_PER_ELEMENT),this.position+=e.byteLength,e},a.prototype.readFloat64Array=function(t,e){t=null==t?this.byteLength-this.position/8:t;var i=new Float64Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readFloat32Array=function(t,e){t=null==t?this.byteLength-this.position/4:t;var i=new Float32Array(t);return a.memcpy(i.buffer,0,this.buffer,this.byteOffset+this.position,t*i.BYTES_PER_ELEMENT),a.arrayToNative(i,null==e?this.endianness:e),this.position+=i.byteLength,i},a.prototype.readInt32=function(t){var e=this._dataView.getInt32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readInt16=function(t){var e=this._dataView.getInt16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readInt8=function(){var t=this._dataView.getInt8(this.position);return this.position+=1,t},a.prototype.readUint32=function(t){var e=this._dataView.getUint32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readUint16=function(t){var e=this._dataView.getUint16(this.position,null==t?this.endianness:t);return this.position+=2,e},a.prototype.readUint8=function(){var t=this._dataView.getUint8(this.position);return this.position+=1,t},a.prototype.readFloat32=function(t){var e=this._dataView.getFloat32(this.position,null==t?this.endianness:t);return this.position+=4,e},a.prototype.readFloat64=function(t){var e=this._dataView.getFloat64(this.position,null==t?this.endianness:t);return this.position+=8,e},a.endianness=new Int8Array(new Int16Array([1]).buffer)[0]>0,a.memcpy=function(t,e,i,r,s){var n=new Uint8Array(t,e,s),a=new Uint8Array(i,r,s);n.set(a)},a.arrayToNative=function(t,e){return e==this.endianness?t:this.flipArrayEndianness(t)},a.nativeToEndian=function(t,e){return this.endianness==e?t:this.flipArrayEndianness(t)},a.flipArrayEndianness=function(t){for(var e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),i=0;is;r--,s++){var n=e[s];e[s]=e[r],e[r]=n}return t},a.prototype.failurePosition=0,String.fromCharCodeUint8=function(t){for(var e=[],i=0;i>16),this.writeUint8((65280&t)>>8),this.writeUint8(255&t)},a.prototype.adjustUint32=function(t,e){var i=this.position;this.seek(t),this.writeUint32(e),this.seek(i)},a.prototype.mapInt32Array=function(t,e){this._realloc(4*t);var i=new Int32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapInt16Array=function(t,e){this._realloc(2*t);var i=new Int16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapInt8Array=function(t){this._realloc(1*t);var e=new Int8Array(this._buffer,this.byteOffset+this.position,t);return this.position+=1*t,e},a.prototype.mapUint32Array=function(t,e){this._realloc(4*t);var i=new Uint32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i},a.prototype.mapUint16Array=function(t,e){this._realloc(2*t);var i=new Uint16Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=2*t,i},a.prototype.mapFloat64Array=function(t,e){this._realloc(8*t);var i=new Float64Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=8*t,i},a.prototype.mapFloat32Array=function(t,e){this._realloc(4*t);var i=new Float32Array(this._buffer,this.byteOffset+this.position,t);return a.arrayToNative(i,null==e?this.endianness:e),this.position+=4*t,i};var h=function(t){this.buffers=[],this.bufferIndex=-1,t&&(this.insertBuffer(t),this.bufferIndex=0)};(h.prototype=new a(new ArrayBuffer,0,a.BIG_ENDIAN)).initialized=function(){var t;return this.bufferIndex>-1||(this.buffers.length>0?0===(t=this.buffers[0]).fileStart?(this.buffer=t,this.bufferIndex=0,s.debug("MultiBufferStream","Stream ready for parsing"),!0):(s.warn("MultiBufferStream","The first buffer should have a fileStart of 0"),this.logBufferLevel(),!1):(s.warn("MultiBufferStream","No buffer to start parsing from"),this.logBufferLevel(),!1))},ArrayBuffer.concat=function(t,e){s.debug("ArrayBuffer","Trying to create a new buffer of size: "+(t.byteLength+e.byteLength));var i=new Uint8Array(t.byteLength+e.byteLength);return i.set(new Uint8Array(t),0),i.set(new Uint8Array(e),t.byteLength),i.buffer},h.prototype.reduceBuffer=function(t,e,i){var r;return(r=new Uint8Array(i)).set(new Uint8Array(t,e,i)),r.buffer.fileStart=t.fileStart+e,r.buffer.usedBytes=0,r.buffer},h.prototype.insertBuffer=function(t){for(var e=!0,i=0;ir.byteLength){this.buffers.splice(i,1),i--;continue}s.warn("MultiBufferStream","Buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+") already appended, ignoring")}else t.fileStart+t.byteLength<=r.fileStart||(t=this.reduceBuffer(t,0,r.fileStart-t.fileStart)),s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.splice(i,0,t),0===i&&(this.buffer=t);e=!1;break}if(t.fileStart0)){e=!1;break}t=this.reduceBuffer(t,n,a)}}e&&(s.debug("MultiBufferStream","Appending new buffer (fileStart: "+t.fileStart+" - Length: "+t.byteLength+")"),this.buffers.push(t),0===i&&(this.buffer=t))},h.prototype.logBufferLevel=function(t){var e,i,r,n,a,o=[],h="";for(r=0,n=0,e=0;e0&&(h+=a.end-1+"]");var c=t?s.info:s.debug;0===this.buffers.length?c("MultiBufferStream","No more buffer in memory"):c("MultiBufferStream",this.buffers.length+" stored buffer(s) ("+r+"/"+n+" bytes), continuous ranges: "+h)},h.prototype.cleanBuffers=function(){var t,e;for(t=0;t"+this.buffer.byteLength+")"),!0}return!1}return!1},h.prototype.findPosition=function(t,e,i){var r,n=null,a=-1;for(r=!0===t?0:this.bufferIndex;r=e?(s.debug("MultiBufferStream","Found position in existing buffer #"+a),a):-1},h.prototype.findEndContiguousBuf=function(t){var e,i,r,s=void 0!==t?t:this.bufferIndex;if(i=this.buffers[s],this.buffers.length>s+1)for(e=s+1;e>3;return 31===r&&i.data.length>=2&&(r=32+((7&i.data[0])<<3)+((224&i.data[1])>>5)),r}return null},i.DecoderConfigDescriptor=function(t){i.Descriptor.call(this,4,t)},i.DecoderConfigDescriptor.prototype=new i.Descriptor,i.DecoderConfigDescriptor.prototype.parse=function(t){this.oti=t.readUint8(),this.streamType=t.readUint8(),this.upStream=!!(this.streamType>>1&1),this.streamType=this.streamType>>>2,this.bufferSize=t.readUint24(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32(),this.size-=13,this.parseRemainingDescriptors(t)},i.DecoderSpecificInfo=function(t){i.Descriptor.call(this,5,t)},i.DecoderSpecificInfo.prototype=new i.Descriptor,i.SLConfigDescriptor=function(t){i.Descriptor.call(this,6,t)},i.SLConfigDescriptor.prototype=new i.Descriptor,this};t.MPEG4DescriptorParser=c;var u={ERR_INVALID_DATA:-1,ERR_NOT_ENOUGH_DATA:0,OK:1,BASIC_BOXES:[{type:"mdat",name:"MediaDataBox"},{type:"idat",name:"ItemDataBox"},{type:"free",name:"FreeSpaceBox"},{type:"skip",name:"FreeSpaceBox"},{type:"meco",name:"AdditionalMetadataContainerBox"},{type:"strk",name:"SubTrackBox"}],FULL_BOXES:[{type:"hmhd",name:"HintMediaHeaderBox"},{type:"nmhd",name:"NullMediaHeaderBox"},{type:"iods",name:"ObjectDescriptorBox"},{type:"xml ",name:"XMLBox"},{type:"bxml",name:"BinaryXMLBox"},{type:"ipro",name:"ItemProtectionBox"},{type:"mere",name:"MetaboxRelationBox"}],CONTAINER_BOXES:[[{type:"moov",name:"CompressedMovieBox"},["trak","pssh"]],[{type:"trak",name:"TrackBox"}],[{type:"edts",name:"EditBox"}],[{type:"mdia",name:"MediaBox"}],[{type:"minf",name:"MediaInformationBox"}],[{type:"dinf",name:"DataInformationBox"}],[{type:"stbl",name:"SampleTableBox"},["sgpd","sbgp"]],[{type:"mvex",name:"MovieExtendsBox"},["trex"]],[{type:"moof",name:"CompressedMovieFragmentBox"},["traf"]],[{type:"traf",name:"TrackFragmentBox"},["trun","sgpd","sbgp"]],[{type:"vttc",name:"VTTCueBox"}],[{type:"tref",name:"TrackReferenceBox"}],[{type:"iref",name:"ItemReferenceBox"}],[{type:"mfra",name:"MovieFragmentRandomAccessBox"},["tfra"]],[{type:"meco",name:"AdditionalMetadataContainerBox"}],[{type:"hnti",name:"trackhintinformation"}],[{type:"hinf",name:"hintstatisticsbox"}],[{type:"strk",name:"SubTrackBox"}],[{type:"strd",name:"SubTrackDefinitionBox"}],[{type:"sinf",name:"ProtectionSchemeInfoBox"}],[{type:"rinf",name:"RestrictedSchemeInfoBox"}],[{type:"schi",name:"SchemeInformationBox"}],[{type:"trgr",name:"TrackGroupBox"}],[{type:"udta",name:"UserDataBox"},["kind"]],[{type:"iprp",name:"ItemPropertiesBox"},["ipma"]],[{type:"ipco",name:"ItemPropertyContainerBox"}],[{type:"grpl",name:"GroupsListBox"}],[{type:"j2kH",name:"J2KHeaderInfoBox"}],[{type:"etyp",name:"ExtendedTypeBox"},["tyco"]]],boxCodes:[],fullBoxCodes:[],containerBoxCodes:[],sampleEntryCodes:{},sampleGroupEntryCodes:[],trackGroupTypes:[],UUIDBoxes:{},UUIDs:[],initialize:function(){u.FullBox.prototype=new u.Box,u.ContainerBox.prototype=new u.Box,u.SampleEntry.prototype=new u.Box,u.TrackGroupTypeBox.prototype=new u.FullBox,u.BASIC_BOXES.forEach(function(t){u.createBoxCtor(t.type,t.name)}),u.FULL_BOXES.forEach(function(t){u.createFullBoxCtor(t.type,t.name)}),u.CONTAINER_BOXES.forEach(function(t){u.createContainerBoxCtor(t[0].type,t[0].name,null,t[1])})},Box:function(t,e,i,r){this.type=t,this.box_name=i,this.size=e,this.uuid=r},FullBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.flags=0,this.version=0},ContainerBox:function(t,e,i,r){u.Box.call(this,t,e,i,r),this.boxes=[]},SampleEntry:function(t,e,i,r){u.ContainerBox.call(this,t,e),this.hdr_size=i,this.start=r},SampleGroupEntry:function(t){this.grouping_type=t},TrackGroupTypeBox:function(t,e){u.FullBox.call(this,t,e)},createBoxCtor:function(t,e,i){u.boxCodes.push(t),u[t+"Box"]=function(i){u.Box.call(this,t,i,e)},u[t+"Box"].prototype=new u.Box,i&&(u[t+"Box"].prototype.parse=i)},createFullBoxCtor:function(t,e,i){u[t+"Box"]=function(i){u.FullBox.call(this,t,i,e)},u[t+"Box"].prototype=new u.FullBox,u[t+"Box"].prototype.parse=function(t){this.parseFullHeader(t),i&&i.call(this,t)}},addSubBoxArrays:function(t){if(t){this.subBoxNames=t;for(var e=t.length,i=0;i",e+=""+r.length+"",e+="",e+=r.nalu.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),e+=""}return e+=""}function d(t,e){this.x=t,this.y=e}function p(t,e){this.bad_pixel_row=t,this.bad_pixel_column=e}u.initialize(),u.TKHD_FLAG_ENABLED=1,u.TKHD_FLAG_IN_MOVIE=2,u.TKHD_FLAG_IN_PREVIEW=4,u.TFHD_FLAG_BASE_DATA_OFFSET=1,u.TFHD_FLAG_SAMPLE_DESC=2,u.TFHD_FLAG_SAMPLE_DUR=8,u.TFHD_FLAG_SAMPLE_SIZE=16,u.TFHD_FLAG_SAMPLE_FLAGS=32,u.TFHD_FLAG_DUR_EMPTY=65536,u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF=131072,u.TRUN_FLAGS_DATA_OFFSET=1,u.TRUN_FLAGS_FIRST_FLAG=4,u.TRUN_FLAGS_DURATION=256,u.TRUN_FLAGS_SIZE=512,u.TRUN_FLAGS_FLAGS=1024,u.TRUN_FLAGS_CTS_OFFSET=2048,u.Box.prototype.add=function(t){return this.addBox(new u[t+"Box"])},u.Box.prototype.addBox=function(t){return this.boxes.push(t),this[t.type+"s"]?this[t.type+"s"].push(t):this[t.type]=t,t},u.Box.prototype.set=function(t,e){return this[t]=e,this},u.Box.prototype.addEntry=function(t,e){var i=e||"entries";return this[i]||(this[i]=[]),this[i].push(t),this},t.BoxParser=u,u.parseUUID=function(t){return u.parseHex16(t)},u.parseHex16=function(t){for(var e="",i=0;i<16;i++){var r=t.readUint8().toString(16);e+=1===r.length?"0"+r:r}return e},u.parseOneBox=function(t,e,i){var r,n,a,o=t.getPosition(),h=0;if(t.getEndPosition()-o<8)return s.debug("BoxParser","Not enough data in stream to parse the type and size of the box"),{code:u.ERR_NOT_ENOUGH_DATA};if(i&&i<8)return s.debug("BoxParser","Not enough bytes left in the parent box to parse a new box"),{code:u.ERR_NOT_ENOUGH_DATA};var c=t.readUint32(),l=t.readString(4),d=l;if(s.debug("BoxParser","Found box of type '"+l+"' and size "+c+" at position "+o),h=8,"uuid"==l){if(t.getEndPosition()-t.getPosition()<16||i-h<16)return t.seek(o),s.debug("BoxParser","Not enough bytes left in the parent box to parse a UUID box"),{code:u.ERR_NOT_ENOUGH_DATA};h+=16,d=a=u.parseUUID(t)}if(1==c){if(t.getEndPosition()-t.getPosition()<8||i&&i-h<8)return t.seek(o),s.warn("BoxParser",'Not enough data in stream to parse the extended size of the "'+l+'" box'),{code:u.ERR_NOT_ENOUGH_DATA};c=t.readUint64(),h+=8}else if(0===c)if(i)c=i;else if("mdat"!==l)return s.error("BoxParser","Unlimited box size not supported for type: '"+l+"'"),r=new u.Box(l,c),{code:u.OK,box:r,size:r.size};return 0!==c&&ci?(s.error("BoxParser","Box of type '"+l+"' has a size "+c+" greater than its container size "+i),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):0!==c&&o+c>t.getEndPosition()?(t.seek(o),s.info("BoxParser","Not enough data in stream to parse the entire '"+l+"' box"),{code:u.ERR_NOT_ENOUGH_DATA,type:l,size:c,hdr_size:h,start:o}):e?{code:u.OK,type:l,size:c,hdr_size:h,start:o}:(u[l+"Box"]?r=new u[l+"Box"](c):"uuid"!==l?(s.warn("BoxParser","Unknown box type: '"+l+"'"),(r=new u.Box(l,c)).has_unparsed_data=!0):u.UUIDBoxes[a]?r=new u.UUIDBoxes[a](c):(s.warn("BoxParser","Unknown uuid type: '"+a+"'"),(r=new u.Box(l,c)).uuid=a,r.has_unparsed_data=!0),r.hdr_size=h,r.start=o,r.write===u.Box.prototype.write&&"mdat"!==r.type&&(s.info("BoxParser","'"+d+"' box writing not yet implemented, keeping unparsed data in memory for later write"),r.parseDataAndRewind(t)),r.parse(t),(n=t.getPosition()-(r.start+r.size))<0?(s.warn("BoxParser","Parsing of box '"+d+"' did not read the entire indicated box data size (missing "+-n+" bytes), seeking forward"),t.seek(r.start+r.size)):n>0&&(s.error("BoxParser","Parsing of box '"+d+"' read "+n+" more bytes than the indicated box data size, seeking backwards"),0!==r.size&&t.seek(r.start+r.size)),{code:u.OK,box:r,size:r.size})},u.Box.prototype.parse=function(t){"mdat"!=this.type?this.data=t.readUint8Array(this.size-this.hdr_size):0===this.size?t.seek(t.getEndPosition()):t.seek(this.start+this.size)},u.Box.prototype.parseDataAndRewind=function(t){this.data=t.readUint8Array(this.size-this.hdr_size),t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseDataAndRewind=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=4,t.position-=this.size-this.hdr_size},u.FullBox.prototype.parseFullHeader=function(t){this.version=t.readUint8(),this.flags=t.readUint24(),this.hdr_size+=4},u.FullBox.prototype.parse=function(t){this.parseFullHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.ContainerBox.prototype.parse=function(t){for(var e,i;t.getPosition()>10&31,e[1]=this.language>>5&31,e[2]=31&this.language,this.languageString=String.fromCharCode(e[0]+96,e[1]+96,e[2]+96)},u.SAMPLE_ENTRY_TYPE_VISUAL="Visual",u.SAMPLE_ENTRY_TYPE_AUDIO="Audio",u.SAMPLE_ENTRY_TYPE_HINT="Hint",u.SAMPLE_ENTRY_TYPE_METADATA="Metadata",u.SAMPLE_ENTRY_TYPE_SUBTITLE="Subtitle",u.SAMPLE_ENTRY_TYPE_SYSTEM="System",u.SAMPLE_ENTRY_TYPE_TEXT="Text",u.SampleEntry.prototype.parseHeader=function(t){t.readUint8Array(6),this.data_reference_index=t.readUint16(),this.hdr_size+=8},u.SampleEntry.prototype.parse=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size)},u.SampleEntry.prototype.parseDataAndRewind=function(t){this.parseHeader(t),this.data=t.readUint8Array(this.size-this.hdr_size),this.hdr_size-=8,t.position-=this.size-this.hdr_size},u.SampleEntry.prototype.parseFooter=function(t){u.ContainerBox.prototype.parse.call(this,t)},u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_HINT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,function(t){var e;this.parseHeader(t),t.readUint16(),t.readUint16(),t.readUint32Array(3),this.width=t.readUint16(),this.height=t.readUint16(),this.horizresolution=t.readUint32(),this.vertresolution=t.readUint32(),t.readUint32(),this.frame_count=t.readUint16(),e=Math.min(31,t.readUint8()),this.compressorname=t.readString(e),e<31&&t.readString(31-e),this.depth=t.readUint16(),t.readUint16(),this.parseFooter(t)}),u.createMediaSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,function(t){this.parseHeader(t),t.readUint32Array(2),this.channel_count=t.readUint16(),this.samplesize=t.readUint16(),t.readUint16(),t.readUint16(),this.samplerate=t.readUint32()/65536,this.parseFooter(t)}),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avc4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"av01"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dav1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hev1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"hvt1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"lhe1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvh1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"dvhe"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvc1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvi1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvs1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vvcN"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp08"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"vp09"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"avs3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"j2ki"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjp2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"mjpg"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"uncv"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mp4a"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ac-4"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"ec-3"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"Opus"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mha2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm1"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"mhm2"),u.createSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"fLaC"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_VISUAL,"encv"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_AUDIO,"enca"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SUBTITLE,"encu"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_SYSTEM,"encs"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_TEXT,"enct"),u.createEncryptedSampleEntryCtor(u.SAMPLE_ENTRY_TYPE_METADATA,"encm"),u.createBoxCtor("a1lx","AV1LayeredImageIndexingProperty",function(t){var e=16*(1+(1&t.readUint8()));this.layer_size=[];for(var i=0;i<3;i++)this.layer_size[i]=16==e?t.readUint16():t.readUint32()}),u.createBoxCtor("a1op","OperatingPointSelectorProperty",function(t){this.op_index=t.readUint8()}),u.createFullBoxCtor("auxC","AuxiliaryTypeProperty",function(t){this.aux_type=t.readCString();var e=this.size-this.hdr_size-(this.aux_type.length+1);this.aux_subtype=t.readUint8Array(e)}),u.createBoxCtor("av1C","AV1CodecConfigurationBox",function(t){var e=t.readUint8();if(1&~(e>>7))s.error("av1C marker problem");else if(this.version=127&e,1===this.version)if(e=t.readUint8(),this.seq_profile=e>>5&7,this.seq_level_idx_0=31&e,e=t.readUint8(),this.seq_tier_0=e>>7&1,this.high_bitdepth=e>>6&1,this.twelve_bit=e>>5&1,this.monochrome=e>>4&1,this.chroma_subsampling_x=e>>3&1,this.chroma_subsampling_y=e>>2&1,this.chroma_sample_position=3&e,e=t.readUint8(),this.reserved_1=e>>5&7,0===this.reserved_1){if(this.initial_presentation_delay_present=e>>4&1,1===this.initial_presentation_delay_present)this.initial_presentation_delay_minus_one=15&e;else if(this.reserved_2=15&e,0!==this.reserved_2)return void s.error("av1C reserved_2 parsing problem");var i=this.size-this.hdr_size-4;this.configOBUs=t.readUint8Array(i)}else s.error("av1C reserved_1 parsing problem");else s.error("av1C version "+this.version+" not supported")}),u.createBoxCtor("avcC","AVCConfigurationBox",function(t){var e,i;for(this.configurationVersion=t.readUint8(),this.AVCProfileIndication=t.readUint8(),this.profile_compatibility=t.readUint8(),this.AVCLevelIndication=t.readUint8(),this.lengthSizeMinusOne=3&t.readUint8(),this.nb_SPS_nalus=31&t.readUint8(),i=this.size-this.hdr_size-6,this.SPS=[],this.SPS.toString=function(){return l(this)},e=0;e0&&(this.ext=t.readUint8Array(i))}),u.createBoxCtor("btrt","BitRateBox",function(t){this.bufferSizeDB=t.readUint32(),this.maxBitrate=t.readUint32(),this.avgBitrate=t.readUint32()}),u.createFullBoxCtor("ccst","CodingConstraintsBox",function(t){var e=t.readUint8();this.all_ref_pics_intra=!(128&~e),this.intra_pred_used=!(64&~e),this.max_ref_per_pic=(63&e)>>2,t.readUint24()}),u.createBoxCtor("cdef","ComponentDefinitionBox",function(t){var e;for(this.channel_count=t.readUint16(),this.channel_indexes=[],this.channel_types=[],this.channel_associations=[],e=0;e=32768&&this.component_type_urls.push(t.readCString())}}),u.createFullBoxCtor("co64","ChunkLargeOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.chunk_offsets=[],0===this.version)for(i=0;i>7}else("rICC"===this.colour_type||"prof"===this.colour_type)&&(this.ICC_profile=t.readUint8Array(this.size-4))}),u.createFullBoxCtor("cprt","CopyrightBox",function(t){this.parseLanguage(t),this.notice=t.readCString()}),u.createFullBoxCtor("cslg","CompositionToDecodeBox",function(t){0===this.version&&(this.compositionToDTSShift=t.readInt32(),this.leastDecodeToDisplayDelta=t.readInt32(),this.greatestDecodeToDisplayDelta=t.readInt32(),this.compositionStartTime=t.readInt32(),this.compositionEndTime=t.readInt32())}),u.createFullBoxCtor("ctts","CompositionOffsetBox",function(t){var e,i;if(e=t.readUint32(),this.sample_counts=[],this.sample_offsets=[],0===this.version)for(i=0;i>6,this.bsid=e>>1&31,this.bsmod=(1&e)<<2|i>>6&3,this.acmod=i>>3&7,this.lfeon=i>>2&1,this.bit_rate_code=3&i|r>>5&7}),u.createBoxCtor("dec3","EC3SpecificBox",function(t){var e=t.readUint16();this.data_rate=e>>3,this.num_ind_sub=7&e,this.ind_subs=[];for(var i=0;i>6,r.bsid=s>>1&31,r.bsmod=(1&s)<<4|n>>4&15,r.acmod=n>>1&7,r.lfeon=1&n,r.num_dep_sub=a>>1&15,r.num_dep_sub>0&&(r.chan_loc=(1&a)<<8|t.readUint8())}}),u.createFullBoxCtor("dfLa","FLACSpecificBox",function(t){for(var e=[],i=["STREAMINFO","PADDING","APPLICATION","SEEKTABLE","VORBIS_COMMENT","CUESHEET","PICTURE","RESERVED"];;){var r=t.readUint8(),s=Math.min(127&r,i.length-1);if(s?t.readUint8Array(t.readUint24()):(t.readUint8Array(13),this.samplerate=t.readUint32()>>12,t.readUint8Array(20)),e.push(i[s]),128&r)break}this.numMetadataBlocks=e.length+" ("+e.join(", ")+")"}),u.createBoxCtor("dimm","hintimmediateBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dmax","hintlongestpacket",function(t){this.time=t.readUint32()}),u.createBoxCtor("dmed","hintmediaBytesSent",function(t){this.bytessent=t.readUint64()}),u.createBoxCtor("dOps","OpusSpecificBox",function(t){if(this.Version=t.readUint8(),this.OutputChannelCount=t.readUint8(),this.PreSkip=t.readUint16(),this.InputSampleRate=t.readUint32(),this.OutputGain=t.readInt16(),this.ChannelMappingFamily=t.readUint8(),0!==this.ChannelMappingFamily){this.StreamCount=t.readUint8(),this.CoupledCount=t.readUint8(),this.ChannelMapping=[];for(var e=0;e=4;)this.compatible_brands[i]=t.readString(4),e-=4,i++}),u.createFullBoxCtor("hdlr","HandlerBox",function(t){0===this.version&&(t.readUint32(),this.handler=t.readString(4),t.readUint32Array(3),this.name=t.readString(this.size-this.hdr_size-20),"\0"===this.name[this.name.length-1]&&(this.name=this.name.slice(0,-1)))}),u.createBoxCtor("hvcC","HEVCConfigurationBox",function(t){var e,i,r,s;this.configurationVersion=t.readUint8(),s=t.readUint8(),this.general_profile_space=s>>6,this.general_tier_flag=(32&s)>>5,this.general_profile_idc=31&s,this.general_profile_compatibility=t.readUint32(),this.general_constraint_indicator=t.readUint8Array(6),this.general_level_idc=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),this.chroma_format_idc=3&t.readUint8(),this.bit_depth_luma_minus8=7&t.readUint8(),this.bit_depth_chroma_minus8=7&t.readUint8(),this.avgFrameRate=t.readUint16(),s=t.readUint8(),this.constantFrameRate=s>>6,this.numTemporalLayers=(13&s)>>3,this.temporalIdNested=(4&s)>>2,this.lengthSizeMinusOne=3&s,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+="
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var n=t.readUint8();for(e=0;e>7,a.nalu_type=63&s;var o=t.readUint16();for(i=0;i>4&15,this.length_size=15&e,e=t.readUint8(),this.base_offset_size=e>>4&15,1===this.version||2===this.version?this.index_size=15&e:this.index_size=0,this.items=[];var i=0;if(this.version<2)i=t.readUint16();else{if(2!==this.version)throw"version of iloc box not supported";i=t.readUint32()}for(var r=0;r>7,this.axis=1&e}),u.createFullBoxCtor("infe","ItemInfoEntry",function(t){if(0!==this.version&&1!==this.version||(this.item_ID=t.readUint16(),this.item_protection_index=t.readUint16(),this.item_name=t.readCString(),this.content_type=t.readCString(),this.content_encoding=t.readCString()),1===this.version)return this.extension_type=t.readString(4),s.warn("BoxParser","Cannot parse extension type"),void t.seek(this.start+this.size);this.version>=2&&(2===this.version?this.item_ID=t.readUint16():3===this.version&&(this.item_ID=t.readUint32()),this.item_protection_index=t.readUint16(),this.item_type=t.readString(4),this.item_name=t.readCString(),"mime"===this.item_type?(this.content_type=t.readCString(),this.content_encoding=t.readCString()):"uri "===this.item_type&&(this.item_uri_type=t.readCString()))}),u.createFullBoxCtor("ipma","ItemPropertyAssociationBox",function(t){var e,i;for(entry_count=t.readUint32(),this.associations=[],e=0;e>7==1,1&this.flags?a.property_index=(127&n)<<8|t.readUint8():a.property_index=127&n}}}),u.createFullBoxCtor("iref","ItemReferenceBox",function(t){var e,i;for(this.references=[];t.getPosition()>7,r.assignment_type=127&n,r.assignment_type){case 0:r.grouping_type=t.readString(4);break;case 1:r.grouping_type=t.readString(4),r.grouping_type_parameter=t.readUint32();break;case 2:case 3:break;case 4:r.sub_track_id=t.readUint32();break;default:s.warn("BoxParser","Unknown leva assignement type")}}}),u.createBoxCtor("lhvC","LHEVCConfigurationBox",function(t){var e,i,r;this.configurationVersion=t.readUint8(),this.min_spatial_segmentation_idc=4095&t.readUint16(),this.parallelismType=3&t.readUint8(),r=t.readUint8(),this.numTemporalLayers=(13&r)>>3,this.temporalIdNested=(4&r)>>2,this.lengthSizeMinusOne=3&r,this.nalu_arrays=[],this.nalu_arrays.toString=function(){var t="";t+="",t+="";for(var e=0;e",t+="",t+="";for(var r=0;r"),t+=""}return t+="
    completenessnalu_typenalu_data
    "+i.completeness+""+i.nalu_type+"",t+=i[r].data.reduce(function(t,e){return t+e.toString(16).padStart(2,"0")},"0x"),t+="
    "};var s=t.readUint8();for(e=0;e>7,n.nalu_type=63&r;var a=t.readUint16();for(i=0;i>8,t.readUint16(),t.readUint32Array(2),this.matrix=t.readUint32Array(9),t.readUint32Array(6),this.next_track_id=t.readUint32()}),u.createBoxCtor("npck","hintPacketsSent",function(t){this.packetssent=t.readUint32()}),u.createBoxCtor("nump","hintPacketsSent",function(t){this.packetssent=t.readUint64()}),u.createFullBoxCtor("padb","PaddingBitsBox",function(t){var e=t.readUint32();this.padbits=[];for(var i=0;i0){var e=t.readUint32();this.kid=[];for(var i=0;i0&&(this.data=t.readUint8Array(r))}),u.createFullBoxCtor("clef","TrackCleanApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("enof","TrackEncodedPixelsDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createFullBoxCtor("prof","TrackProductionApertureDimensionsBox",function(t){this.width=t.readUint32(),this.height=t.readUint32()}),u.createContainerBoxCtor("tapt","TrackApertureModeDimensionsBox",null,["clef","prof","enof"]),u.createBoxCtor("rtp ","rtpmoviehintinformation",function(t){this.descriptionformat=t.readString(4),this.sdptext=t.readString(this.size-this.hdr_size-4)}),u.createFullBoxCtor("saio","SampleAuxiliaryInformationOffsetsBox",function(t){1&this.flags&&(this.aux_info_type=t.readString(4),this.aux_info_type_parameter=t.readUint32());var e=t.readUint32();this.offset=[];for(var i=0;i>7,this.avgRateFlag=e>>6&1,this.durationFlag&&(this.duration=t.readUint32()),this.avgRateFlag&&(this.accurateStatisticsFlag=t.readUint8(),this.avgBitRate=t.readUint16(),this.avgFrameRate=t.readUint16()),this.dependency=[];for(var i=t.readUint8(),r=0;r>7,this.num_leading_samples=127&e}),u.createSampleGroupCtor("rash",function(t){if(this.operation_point_count=t.readUint16(),this.description_length!==2+(1===this.operation_point_count?2:6*this.operation_point_count)+9)s.warn("BoxParser","Mismatch in "+this.grouping_type+" sample group length"),this.data=t.readUint8Array(this.description_length-2);else{if(1===this.operation_point_count)this.target_rate_share=t.readUint16();else{this.target_rate_share=[],this.available_bitrate=[];for(var e=0;e>4,this.skip_byte_block=15&e,this.isProtected=t.readUint8(),this.Per_Sample_IV_Size=t.readUint8(),this.KID=u.parseHex16(t),this.constant_IV_size=0,this.constant_IV=0,1===this.isProtected&&0===this.Per_Sample_IV_Size&&(this.constant_IV_size=t.readUint8(),this.constant_IV=t.readUint8Array(this.constant_IV_size))}),u.createSampleGroupCtor("stsa",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("sync",function(t){var e=t.readUint8();this.NAL_unit_type=63&e}),u.createSampleGroupCtor("tele",function(t){var e=t.readUint8();this.level_independently_decodable=e>>7}),u.createSampleGroupCtor("tsas",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("tscl",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createSampleGroupCtor("vipr",function(t){s.warn("BoxParser","Sample Group type: "+this.grouping_type+" not fully parsed")}),u.createFullBoxCtor("sbgp","SampleToGroupBox",function(t){this.grouping_type=t.readString(4),1===this.version?this.grouping_type_parameter=t.readUint32():this.grouping_type_parameter=0,this.entries=[];for(var e=t.readUint32(),i=0;i>6,this.sample_depends_on[r]=e>>4&3,this.sample_is_depended_on[r]=e>>2&3,this.sample_has_redundancy[r]=3&e}),u.createFullBoxCtor("senc","SampleEncryptionBox"),u.createFullBoxCtor("sgpd","SampleGroupDescriptionBox",function(t){this.grouping_type=t.readString(4),s.debug("BoxParser","Found Sample Groups of type "+this.grouping_type),1===this.version?this.default_length=t.readUint32():this.default_length=0,this.version>=2&&(this.default_group_description_index=t.readUint32()),this.entries=[];for(var e=t.readUint32(),i=0;i>31&1,r.referenced_size=2147483647&s,r.subsegment_duration=t.readUint32(),s=t.readUint32(),r.starts_with_SAP=s>>31&1,r.SAP_type=s>>28&7,r.SAP_delta_time=268435455&s}}),u.SingleItemTypeReferenceBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.SingleItemTypeReferenceBox.prototype=new u.Box,u.SingleItemTypeReferenceBox.prototype.parse=function(t){this.from_item_ID=t.readUint16();var e=t.readUint16();this.references=[];for(var i=0;i>4&15,this.sample_sizes[e+1]=15&r}else if(8===this.field_size)for(e=0;e0)for(i=0;i>4&15,this.default_skip_byte_block=15&e}this.default_isProtected=t.readUint8(),this.default_Per_Sample_IV_Size=t.readUint8(),this.default_KID=u.parseHex16(t),1===this.default_isProtected&&0===this.default_Per_Sample_IV_Size&&(this.default_constant_IV_size=t.readUint8(),this.default_constant_IV=t.readUint8Array(this.default_constant_IV_size))}),u.createFullBoxCtor("tfdt","TrackFragmentBaseMediaDecodeTimeBox",function(t){1==this.version?this.baseMediaDecodeTime=t.readUint64():this.baseMediaDecodeTime=t.readUint32()}),u.createFullBoxCtor("tfhd","TrackFragmentHeaderBox",function(t){var e=0;this.track_id=t.readUint32(),this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET?(this.base_data_offset=t.readUint64(),e+=8):this.base_data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DESC?(this.default_sample_description_index=t.readUint32(),e+=4):this.default_sample_description_index=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_DUR?(this.default_sample_duration=t.readUint32(),e+=4):this.default_sample_duration=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_SIZE?(this.default_sample_size=t.readUint32(),e+=4):this.default_sample_size=0,this.size-this.hdr_size>e&&this.flags&u.TFHD_FLAG_SAMPLE_FLAGS?(this.default_sample_flags=t.readUint32(),e+=4):this.default_sample_flags=0}),u.createFullBoxCtor("tfra","TrackFragmentRandomAccessBox",function(t){this.track_ID=t.readUint32(),t.readUint24();var e=t.readUint8();this.length_size_of_traf_num=e>>4&3,this.length_size_of_trun_num=e>>2&3,this.length_size_of_sample_num=3&e,this.entries=[];for(var i=t.readUint32(),r=0;r>8,t.readUint16(),this.matrix=t.readInt32Array(9),this.width=t.readUint32(),this.height=t.readUint32()}),u.createBoxCtor("tmax","hintmaxrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("tmin","hintminrelativetime",function(t){this.time=t.readUint32()}),u.createBoxCtor("totl","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpay","hintBytesSent",function(t){this.bytessent=t.readUint32()}),u.createBoxCtor("tpyl","hintBytesSent",function(t){this.bytessent=t.readUint64()}),u.TrackGroupTypeBox.prototype.parse=function(t){this.parseFullHeader(t),this.track_group_id=t.readUint32()},u.createTrackGroupCtor("msrc"),u.TrackReferenceTypeBox=function(t,e,i,r){u.Box.call(this,t,e),this.hdr_size=i,this.start=r},u.TrackReferenceTypeBox.prototype=new u.Box,u.TrackReferenceTypeBox.prototype.parse=function(t){this.track_ids=t.readUint32Array((this.size-this.hdr_size)/4)},u.trefBox.prototype.parse=function(t){for(var e,i;t.getPosition()e&&this.flags&u.TRUN_FLAGS_DATA_OFFSET?(this.data_offset=t.readInt32(),e+=4):this.data_offset=0,this.size-this.hdr_size>e&&this.flags&u.TRUN_FLAGS_FIRST_FLAG?(this.first_sample_flags=t.readUint32(),e+=4):this.first_sample_flags=0,this.sample_duration=[],this.sample_size=[],this.sample_flags=[],this.sample_composition_time_offset=[],this.size-this.hdr_size>e)for(var i=0;i>7&1,this.block_pad_lsb=i>>6&1,this.block_little_endian=i>>5&1,this.block_reversed=i>>4&1,this.pad_unknown=i>>3&1,this.pixel_size=t.readUint32(),this.row_align_size=t.readUint32(),this.tile_align_size=t.readUint32(),this.num_tile_cols_minus_one=t.readUint32(),this.num_tile_rows_minus_one=t.readUint32()}}),u.createFullBoxCtor("url ","DataEntryUrlBox",function(t){1!==this.flags&&(this.location=t.readCString())}),u.createFullBoxCtor("urn ","DataEntryUrnBox",function(t){this.name=t.readCString(),this.size-this.hdr_size-this.name.length-1>0&&(this.location=t.readCString())}),u.createUUIDBox("a5d40b30e81411ddba2f0800200c9a66","LiveServerManifestBox",!0,!1,function(t){this.LiveServerManifest=t.readString(this.size-this.hdr_size).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}),u.createUUIDBox("d08a4f1810f34a82b6c832d8aba183d3","PiffProtectionSystemSpecificHeaderBox",!0,!1,function(t){this.system_id=u.parseHex16(t);var e=t.readUint32();e>0&&(this.data=t.readUint8Array(e))}),u.createUUIDBox("a2394f525a9b4f14a2446c427c648df4","PiffSampleEncryptionBox",!0,!1),u.createUUIDBox("8974dbce7be74c5184f97148f9882554","PiffTrackEncryptionBox",!0,!1,function(t){this.default_AlgorithmID=t.readUint24(),this.default_IV_size=t.readUint8(),this.default_KID=u.parseHex16(t)}),u.createUUIDBox("d4807ef2ca3946958e5426cb9e46a79f","TfrfBox",!0,!1,function(t){this.fragment_count=t.readUint8(),this.entries=[];for(var e=0;e>4,this.chromaSubsampling=e>>1&7,this.videoFullRangeFlag=1&e,this.colourPrimaries=t.readUint8(),this.transferCharacteristics=t.readUint8(),this.matrixCoefficients=t.readUint8(),this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize)):(this.profile=t.readUint8(),this.level=t.readUint8(),e=t.readUint8(),this.bitDepth=e>>4&15,this.colorSpace=15&e,e=t.readUint8(),this.chromaSubsampling=e>>4&15,this.transferFunction=e>>1&7,this.videoFullRangeFlag=1&e,this.codecIntializationDataSize=t.readUint16(),this.codecIntializationData=t.readUint8Array(this.codecIntializationDataSize))}),u.createBoxCtor("vttC","WebVTTConfigurationBox",function(t){this.text=t.readString(this.size-this.hdr_size)}),u.createFullBoxCtor("vvcC","VvcConfigurationBox",function(t){var e,i,r={held_bits:void 0,num_held_bits:0,stream_read_1_bytes:function(t){this.held_bits=t.readUint8(),this.num_held_bits=8},stream_read_2_bytes:function(t){this.held_bits=t.readUint16(),this.num_held_bits=16},extract_bits:function(t){var e=this.held_bits>>this.num_held_bits-t&(1<1){for(r.stream_read_1_bytes(t),this.ptl_sublayer_present_mask=0,i=this.num_sublayers-2;i>=0;--i){var a=r.extract_bits(1);this.ptl_sublayer_present_mask|=a<1;++i)r.extract_bits(1);for(this.sublayer_level_idc=[],i=this.num_sublayers-2;i>=0;--i)this.ptl_sublayer_present_mask&1<>=1;e+=u.decimalToHex(r,0),e+=".",0===this.hvcC.general_tier_flag?e+="L":e+="H",e+=this.hvcC.general_level_idc;var s=!1,n="";for(t=5;t>=0;t--)(this.hvcC.general_constraint_indicator[t]||s)&&(n="."+u.decimalToHex(this.hvcC.general_constraint_indicator[t],0)+n,s=!0);e+=n}return e},u.vvc1SampleEntry.prototype.getCodec=u.vvi1SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this);if(this.vvcC){e+="."+this.vvcC.general_profile_idc,this.vvcC.general_tier_flag?e+=".H":e+=".L",e+=this.vvcC.general_level_idc;var i="";if(this.vvcC.general_constraint_info){var r,s=[],n=0;for(n|=this.vvcC.ptl_frame_only_constraint<<7,n|=this.vvcC.ptl_multilayer_enabled<<6,t=0;t>2&63,s.push(n),n&&(r=t),n=this.vvcC.general_constraint_info[t]>>2&3;if(void 0===r)i=".CA";else{i=".C";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",o=0,h=0;for(t=0;t<=r;++t)for(o=o<<8|s[t],h+=8;h>=5;)i+=a[o>>h-5&31],o&=(1<<(h-=5))-1;h&&(i+=a[31&(o<<=5-h)])}}e+=i}return e},u.mp4aSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);if(this.esds&&this.esds.esd){var e=this.esds.esd.getOTI(),i=this.esds.esd.getAudioConfig();return t+"."+u.decimalToHex(e)+(i?"."+i:"")}return t},u.stxtSampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this);return this.mime_format?t+"."+this.mime_format:t},u.vp08SampleEntry.prototype.getCodec=u.vp09SampleEntry.prototype.getCodec=function(){var t=u.SampleEntry.prototype.getCodec.call(this),e=this.vpcC.level;0==e&&(e="00");var i=this.vpcC.bitDepth;return 8==i&&(i="08"),t+".0"+this.vpcC.profile+"."+e+"."+i},u.av01SampleEntry.prototype.getCodec=function(){var t,e=u.SampleEntry.prototype.getCodec.call(this),i=this.av1C.seq_level_idx_0;return i<10&&(i="0"+i),2===this.av1C.seq_profile&&1===this.av1C.high_bitdepth?t=1===this.av1C.twelve_bit?"12":"10":this.av1C.seq_profile<=2&&(t=1===this.av1C.high_bitdepth?"10":"08"),e+"."+this.av1C.seq_profile+"."+i+(this.av1C.seq_tier_0?"H":"M")+"."+t},u.Box.prototype.writeHeader=function(t,e){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),s.debug("BoxWriter","Writing box "+this.type+" of size: "+this.size+" at position "+t.getPosition()+(e||"")),this.size>o?t.writeUint32(1):(this.sizePosition=t.getPosition(),t.writeUint32(this.size)),t.writeString(this.type,null,4),"uuid"===this.type&&t.writeUint8Array(this.uuid),this.size>o&&t.writeUint64(this.size)},u.FullBox.prototype.writeHeader=function(t){this.size+=4,u.Box.prototype.writeHeader.call(this,t," v="+this.version+" f="+this.flags),t.writeUint8(this.version),t.writeUint24(this.flags)},u.Box.prototype.write=function(t){"mdat"===this.type?this.data&&(this.size=this.data.length,this.writeHeader(t),t.writeUint8Array(this.data)):(this.size=this.data?this.data.length:0,this.writeHeader(t),this.data&&t.writeUint8Array(this.data))},u.ContainerBox.prototype.write=function(t){this.size=0,this.writeHeader(t);for(var e=0;e=2&&t.writeUint32(this.default_sample_description_index),t.writeUint32(this.entries.length),e=0;e0)for(e=0;e+1e?1:0,this.flags=0,this.size=4,1===this.version&&(this.size+=4),this.writeHeader(t),1===this.version?t.writeUint64(this.baseMediaDecodeTime):t.writeUint32(this.baseMediaDecodeTime)},u.tfhdBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&(this.size+=8),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&(this.size+=4),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&(this.size+=4),this.writeHeader(t),t.writeUint32(this.track_id),this.flags&u.TFHD_FLAG_BASE_DATA_OFFSET&&t.writeUint64(this.base_data_offset),this.flags&u.TFHD_FLAG_SAMPLE_DESC&&t.writeUint32(this.default_sample_description_index),this.flags&u.TFHD_FLAG_SAMPLE_DUR&&t.writeUint32(this.default_sample_duration),this.flags&u.TFHD_FLAG_SAMPLE_SIZE&&t.writeUint32(this.default_sample_size),this.flags&u.TFHD_FLAG_SAMPLE_FLAGS&&t.writeUint32(this.default_sample_flags)},u.tkhdBox.prototype.write=function(t){this.version=0,this.size=80,this.writeHeader(t),t.writeUint32(this.creation_time),t.writeUint32(this.modification_time),t.writeUint32(this.track_id),t.writeUint32(0),t.writeUint32(this.duration),t.writeUint32(0),t.writeUint32(0),t.writeInt16(this.layer),t.writeInt16(this.alternate_group),t.writeInt16(this.volume<<8),t.writeUint16(0),t.writeInt32Array(this.matrix),t.writeUint32(this.width),t.writeUint32(this.height)},u.trexBox.prototype.write=function(t){this.version=0,this.flags=0,this.size=20,this.writeHeader(t),t.writeUint32(this.track_id),t.writeUint32(this.default_sample_description_index),t.writeUint32(this.default_sample_duration),t.writeUint32(this.default_sample_size),t.writeUint32(this.default_sample_flags)},u.trunBox.prototype.write=function(t){this.version=0,this.size=4,this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.size+=4),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&(this.size+=4),this.flags&u.TRUN_FLAGS_DURATION&&(this.size+=4*this.sample_duration.length),this.flags&u.TRUN_FLAGS_SIZE&&(this.size+=4*this.sample_size.length),this.flags&u.TRUN_FLAGS_FLAGS&&(this.size+=4*this.sample_flags.length),this.flags&u.TRUN_FLAGS_CTS_OFFSET&&(this.size+=4*this.sample_composition_time_offset.length),this.writeHeader(t),t.writeUint32(this.sample_count),this.flags&u.TRUN_FLAGS_DATA_OFFSET&&(this.data_offset_position=t.getPosition(),t.writeInt32(this.data_offset)),this.flags&u.TRUN_FLAGS_FIRST_FLAG&&t.writeUint32(this.first_sample_flags);for(var e=0;e-1||t[i]instanceof u.Box||e[i]instanceof u.Box||void 0===t[i]||void 0===e[i]||"function"==typeof t[i]||"function"==typeof e[i]||t.subBoxNames&&t.subBoxNames.indexOf(i.slice(0,4))>-1||e.subBoxNames&&e.subBoxNames.indexOf(i.slice(0,4))>-1||"data"===i||"start"===i||"size"===i||"creation_time"===i||"modification_time"===i||u.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(i)>-1||t[i]===e[i]))return!1;return!0},u.boxEqual=function(t,e){if(!u.boxEqualFields(t,e))return!1;for(var i=0;i=e?t:new Array(e-t.length+1).join(i)+t}function s(t){var e=Math.floor(t/3600),i=Math.floor((t-3600*e)/60),s=Math.floor(t-3600*e-60*i),n=Math.floor(1e3*(t-3600*e-60*i-s));return r(e,2)+":"+r(i,2)+":"+r(s,2)+"."+r(n,3)}for(var n=this.parseSample(i),a="",o=0;o1)for(e=1;e-1&&this.fragmentedTracks.splice(e,1)},g.prototype.setExtractionOptions=function(t,e,i){var r=this.getTrackById(t);if(r){var s={};this.extractedTracks.push(s),s.id=t,s.user=e,s.trak=r,r.nextSample=0,s.nb_samples=1e3,s.samples=[],i&&i.nbSamples&&(s.nb_samples=i.nbSamples)}},g.prototype.unsetExtractionOptions=function(t){for(var e=-1,i=0;i-1&&this.extractedTracks.splice(e,1)},g.prototype.parse=function(){var t,e;if(!this.restoreParsePosition||this.restoreParsePosition())for(;;){if(this.hasIncompleteMdat&&this.hasIncompleteMdat()){if(this.processIncompleteMdat())continue;return}if(this.saveParsePosition&&this.saveParsePosition(),(t=u.parseOneBox(this.stream,!1)).code===u.ERR_NOT_ENOUGH_DATA){if(this.processIncompleteBox){if(this.processIncompleteBox(t))continue;return}return}var i;switch(i="uuid"!==(e=t.box).type?e.type:e.uuid,this.boxes.push(e),i){case"mdat":this.mdats.push(e);break;case"moof":this.moofs.push(e);break;case"moov":this.moovStartFound=!0,0===this.mdats.length&&(this.isProgressive=!0);default:void 0!==this[i]&&s.warn("ISOFile","Duplicate Box of type: "+i+", overriding previous occurrence"),this[i]=e}this.updateUsedBytes&&this.updateUsedBytes(e,t)}},g.prototype.checkBuffer=function(t){if(null==t)throw"Buffer must be defined and non empty";if(void 0===t.fileStart)throw"Buffer must have a fileStart property";return 0===t.byteLength?(s.warn("ISOFile","Ignoring empty buffer (fileStart: "+t.fileStart+")"),this.stream.logBufferLevel(),!1):(s.info("ISOFile","Processing buffer (fileStart: "+t.fileStart+")"),t.usedBytes=0,this.stream.insertBuffer(t),this.stream.logBufferLevel(),!!this.stream.initialized()||(s.warn("ISOFile","Not ready to start parsing"),!1))},g.prototype.appendBuffer=function(t,e){var i;if(this.checkBuffer(t))return this.parse(),this.moovStartFound&&!this.moovStartSent&&(this.moovStartSent=!0,this.onMoovStart&&this.onMoovStart()),this.moov?(this.sampleListBuilt||(this.buildSampleLists(),this.sampleListBuilt=!0),this.updateSampleLists(),this.onReady&&!this.readySent&&(this.readySent=!0,this.onReady(this.getInfo())),this.processSamples(e),this.nextSeekPosition?(i=this.nextSeekPosition,this.nextSeekPosition=void 0):i=this.nextParsePosition,this.stream.getEndFilePositionAfter&&(i=this.stream.getEndFilePositionAfter(i))):i=this.nextParsePosition?this.nextParsePosition:0,this.sidx&&this.onSidx&&!this.sidxSent&&(this.onSidx(this.sidx),this.sidxSent=!0),this.meta&&(this.flattenItemInfo&&!this.itemListBuilt&&(this.flattenItemInfo(),this.itemListBuilt=!0),this.processItems&&this.processItems(this.onItem)),this.stream.cleanBuffers&&(s.info("ISOFile","Done processing buffer (fileStart: "+t.fileStart+") - next buffer to fetch should have a fileStart position of "+i),this.stream.logBufferLevel(),this.stream.cleanBuffers(),this.stream.logBufferLevel(!0),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize())),i},g.prototype.getInfo=function(){var t,e,i,r,s,n,a={},o=new Date("1904-01-01T00:00:00Z").getTime();if(this.moov)for(a.hasMoov=!0,a.duration=this.moov.mvhd.duration,a.timescale=this.moov.mvhd.timescale,a.isFragmented=null!=this.moov.mvex,a.isFragmented&&this.moov.mvex.mehd&&(a.fragment_duration=this.moov.mvex.mehd.fragment_duration),a.isProgressive=this.isProgressive,a.hasIOD=null!=this.moov.iods,a.brands=[],a.brands.push(this.ftyp.major_brand),a.brands=a.brands.concat(this.ftyp.compatible_brands),a.created=new Date(o+1e3*this.moov.mvhd.creation_time),a.modified=new Date(o+1e3*this.moov.mvhd.modification_time),a.tracks=[],a.audioTracks=[],a.videoTracks=[],a.subtitleTracks=[],a.metadataTracks=[],a.hintTracks=[],a.otherTracks=[],t=0;t0?a.mime+='video/mp4; codecs="':a.audioTracks&&a.audioTracks.length>0?a.mime+='audio/mp4; codecs="':a.mime+='application/mp4; codecs="',t=0;t=i.samples.length)&&(s.info("ISOFile","Sending fragmented data on track #"+r.id+" for samples ["+Math.max(0,i.nextSample-r.nb_samples)+","+(i.nextSample-1)+"]"),s.info("ISOFile","Sample data size in memory: "+this.getAllocatedSampleDataSize()),this.onSegment&&this.onSegment(r.id,r.user,r.segmentStream.buffer,i.nextSample,t||i.nextSample>=i.samples.length),r.segmentStream=null,r!==this.fragmentedTracks[e]))break}}if(null!==this.onSamples)for(e=0;e=i.samples.length)&&(s.debug("ISOFile","Sending samples on track #"+a.id+" for sample "+i.nextSample),this.onSamples&&this.onSamples(a.id,a.user,a.samples),a.samples=[],a!==this.extractedTracks[e]))break}}}},g.prototype.getBox=function(t){var e=this.getBoxes(t,!0);return e.length?e[0]:null},g.prototype.getBoxes=function(t,e){var i=[];return g._sweep.call(this,t,i,e),i},g._sweep=function(t,e,i){for(var r in this.type&&this.type==t&&e.push(this),this.boxes){if(e.length&&i)return;g._sweep.call(this.boxes[r],t,e,i)}},g.prototype.getTrackSamplesInfo=function(t){var e=this.getTrackById(t);return e?e.samples:void 0},g.prototype.getTrackSample=function(t,e){var i=this.getTrackById(t);return this.getSample(i,e)},g.prototype.releaseUsedSamples=function(t,e){var i=0,r=this.getTrackById(t);r.lastValidSample||(r.lastValidSample=0);for(var n=r.lastValidSample;nt*n.timescale){c=r-1;break}e&&n.is_sync&&(h=r)}for(e&&(c=h),t=i.samples[c].cts,i.nextSample=c;i.samples[c].alreadyRead===i.samples[c].size&&i.samples[c+1];)c++;return a=i.samples[c].offset+i.samples[c].alreadyRead,s.info("ISOFile","Seeking to "+(e?"RAP":"")+" sample #"+i.nextSample+" on track "+i.tkhd.track_id+", time "+s.getDurationString(t,o)+" and offset: "+a),{offset:a,time:t/o}},g.prototype.getTrackDuration=function(t){var e;return t.samples?((e=t.samples[t.samples.length-1]).cts+e.duration)/e.timescale:1/0},g.prototype.seek=function(t,e){var i,r,n,a=this.moov,o={offset:1/0,time:1/0};if(this.moov){for(n=0;nthis.getTrackDuration(i)||((r=this.seekTrack(t,e,i)).offset-1){o=h;break}switch(o){case"Visual":if(s.add("vmhd").set("graphicsmode",0).set("opcolor",[0,0,0]),a.set("width",e.width).set("height",e.height).set("horizresolution",72<<16).set("vertresolution",72<<16).set("frame_count",1).set("compressorname",e.type+" Compressor").set("depth",24),e.avcDecoderConfigRecord){var d=new u.avcCBox;d.parse(new n(e.avcDecoderConfigRecord)),a.addBox(d)}else if(e.hevcDecoderConfigRecord){var p=new u.hvcCBox;p.parse(new n(e.hevcDecoderConfigRecord)),a.addBox(p)}break;case"Audio":s.add("smhd").set("balance",e.balance||0),a.set("channel_count",e.channel_count||2).set("samplesize",e.samplesize||16).set("samplerate",e.samplerate||65536);break;case"Hint":s.add("hmhd");break;case"Subtitle":s.add("sthd"),"stpp"===e.type&&a.set("namespace",e.namespace||"nonamespace").set("schema_location",e.schema_location||"").set("auxiliary_mime_types",e.auxiliary_mime_types||"");break;default:s.add("nmhd")}e.description&&a.addBox(e.description),e.description_boxes&&e.description_boxes.forEach(function(t){a.addBox(t)}),s.add("dinf").add("dref").addEntry((new u["url Box"]).set("flags",1));var f=s.add("stbl");return f.add("stsd").addEntry(a),f.add("stts").set("sample_counts",[]).set("sample_deltas",[]),f.add("stsc").set("first_chunk",[]).set("samples_per_chunk",[]).set("sample_description_index",[]),f.add("stco").set("chunk_offsets",[]),f.add("stsz").set("sample_sizes",[]),this.moov.mvex.add("trex").set("track_id",e.id).set("default_sample_description_index",e.default_sample_description_index||1).set("default_sample_duration",e.default_sample_duration||0).set("default_sample_size",e.default_sample_size||0).set("default_sample_flags",e.default_sample_flags||0),this.buildTrakSampleLists(i),e.id}},u.Box.prototype.computeSize=function(t){var e=t||new a;e.endianness=a.BIG_ENDIAN,this.write(e)},g.prototype.addSample=function(t,e,i){var r=i||{},s={},n=this.getTrackById(t);if(null!==n){s.number=n.samples.length,s.track_id=n.tkhd.track_id,s.timescale=n.mdia.mdhd.timescale,s.description_index=r.sample_description_index?r.sample_description_index-1:0,s.description=n.mdia.minf.stbl.stsd.entries[s.description_index],s.data=e,s.size=e.byteLength,s.alreadyRead=s.size,s.duration=r.duration||1,s.cts=r.cts||0,s.dts=r.dts||0,s.is_sync=r.is_sync||!1,s.is_leading=r.is_leading||0,s.depends_on=r.depends_on||0,s.is_depended_on=r.is_depended_on||0,s.has_redundancy=r.has_redundancy||0,s.degradation_priority=r.degradation_priority||0,s.offset=0,s.subsamples=r.subsamples,n.samples.push(s),n.samples_size+=s.size,n.samples_duration+=s.duration,void 0===n.first_dts&&(n.first_dts=r.dts),this.processSamples();var a=this.createSingleSampleMoof(s);return this.addBox(a),a.computeSize(),a.trafs[0].truns[0].data_offset=a.size+8,this.add("mdat").data=new Uint8Array(e),s}},g.prototype.createSingleSampleMoof=function(t){var e=0;e=t.is_sync?1<<25:65536;var i=new u.moofBox;i.add("mfhd").set("sequence_number",this.nextMoofNumber),this.nextMoofNumber++;var r=i.add("traf"),s=this.getTrackById(t.track_id);return r.add("tfhd").set("track_id",t.track_id).set("flags",u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),r.add("tfdt").set("baseMediaDecodeTime",t.dts-(s.first_dts||0)),r.add("trun").set("flags",u.TRUN_FLAGS_DATA_OFFSET|u.TRUN_FLAGS_DURATION|u.TRUN_FLAGS_SIZE|u.TRUN_FLAGS_FLAGS|u.TRUN_FLAGS_CTS_OFFSET).set("data_offset",0).set("first_sample_flags",0).set("sample_count",1).set("sample_duration",[t.duration]).set("sample_size",[t.size]).set("sample_flags",[e]).set("sample_composition_time_offset",[t.cts-t.dts]),i},g.prototype.lastMoofIndex=0,g.prototype.samplesDataSize=0,g.prototype.resetTables=function(){var t,e,i,r,s,n;for(this.initial_duration=this.moov.mvhd.duration,this.moov.mvhd.duration=0,t=0;t=2&&(h=s[a].grouping_type+"/0",(o=new c(s[a].grouping_type,0)).is_fragment=!0,e.sample_groups_info[h]||(e.sample_groups_info[h]=o))}else for(a=0;a=2&&(h=r[a].grouping_type+"/0",o=new c(r[a].grouping_type,0),t.sample_groups_info[h]||(t.sample_groups_info[h]=o))},g.setSampleGroupProperties=function(t,e,i,r){var s,n;for(s in e.sample_groups=[],r){var a;e.sample_groups[s]={},e.sample_groups[s].grouping_type=r[s].grouping_type,e.sample_groups[s].grouping_type_parameter=r[s].grouping_type_parameter,i>=r[s].last_sample_in_run&&(r[s].last_sample_in_run<0&&(r[s].last_sample_in_run=0),r[s].entry_index++,r[s].entry_index<=r[s].sbgp.entries.length-1&&(r[s].last_sample_in_run+=r[s].sbgp.entries[r[s].entry_index].sample_count)),r[s].entry_index<=r[s].sbgp.entries.length-1?e.sample_groups[s].group_description_index=r[s].sbgp.entries[r[s].entry_index].group_description_index:e.sample_groups[s].group_description_index=-1,0!==e.sample_groups[s].group_description_index&&(a=r[s].fragment_description?r[s].fragment_description:r[s].description,e.sample_groups[s].group_description_index>0?(n=e.sample_groups[s].group_description_index>65535?(e.sample_groups[s].group_description_index>>16)-1:e.sample_groups[s].group_description_index-1,a&&n>=0&&(e.sample_groups[s].description=a.entries[n])):a&&a.version>=2&&a.default_group_description_index>0&&(e.sample_groups[s].description=a.entries[a.default_group_description_index-1]))}},g.process_sdtp=function(t,e,i){e&&(t?(e.is_leading=t.is_leading[i],e.depends_on=t.sample_depends_on[i],e.is_depended_on=t.sample_is_depended_on[i],e.has_redundancy=t.sample_has_redundancy[i]):(e.is_leading=0,e.depends_on=0,e.is_depended_on=0,e.has_redundancy=0))},g.prototype.buildSampleLists=function(){var t,e;for(t=0;tb&&(w++,b<0&&(b=0),b+=n.sample_counts[w]),e>0?(t.samples[e-1].duration=n.sample_deltas[w],t.samples_duration+=t.samples[e-1].duration,B.dts=t.samples[e-1].dts+t.samples[e-1].duration):B.dts=0,a?(e>=S&&(U++,S<0&&(S=0),S+=a.sample_counts[U]),B.cts=t.samples[e].dts+a.sample_offsets[U]):B.cts=B.dts,o?(e==o.sample_numbers[x]-1?(B.is_sync=!0,x++):(B.is_sync=!1,B.degradation_priority=0),c&&c.entries[v].sample_delta+E==e+1&&(B.subsamples=c.entries[v].subsamples,E+=c.entries[v].sample_delta,v++)):B.is_sync=!0,g.process_sdtp(t.mdia.minf.stbl.sdtp,B,B.number),B.degradation_priority=d?d.priority[e]:0,c&&c.entries[v].sample_delta+E==e&&(B.subsamples=c.entries[v].subsamples,E+=c.entries[v].sample_delta),(u.length>0||l.length>0)&&g.setSampleGroupProperties(t,B,e,t.sample_groups_info)}e>0&&(t.samples[e-1].duration=Math.max(t.mdia.mdhd.duration-t.samples[e-1].dts,0),t.samples_duration+=t.samples[e-1].duration)}},g.prototype.updateSampleLists=function(){var t,e,i,r,s,n,a,o,h,c,l,d,p,f,m;if(void 0!==this.moov)for(;this.lastMoofIndex0&&g.initSampleGroups(d,l,l.sbgps,d.mdia.minf.stbl.sgpds,l.sgpds),e=0;e0?f.dts=d.samples[d.samples.length-2].dts+d.samples[d.samples.length-2].duration:(l.tfdt?f.dts=l.tfdt.baseMediaDecodeTime:f.dts=0,d.first_traf_merged=!0),f.cts=f.dts,_.flags&u.TRUN_FLAGS_CTS_OFFSET&&(f.cts=f.dts+_.sample_composition_time_offset[i]),m=a,_.flags&u.TRUN_FLAGS_FLAGS?m=_.sample_flags[i]:0===i&&_.flags&u.TRUN_FLAGS_FIRST_FLAG&&(m=_.first_sample_flags),f.is_sync=!(m>>16&1),f.is_leading=m>>26&3,f.depends_on=m>>24&3,f.is_depended_on=m>>22&3,f.has_redundancy=m>>20&3,f.degradation_priority=65535&m;var y=!!(l.tfhd.flags&u.TFHD_FLAG_BASE_DATA_OFFSET),b=!!(l.tfhd.flags&u.TFHD_FLAG_DEFAULT_BASE_IS_MOOF),w=!!(_.flags&u.TRUN_FLAGS_DATA_OFFSET),S=0;S=y?l.tfhd.base_data_offset:b||0===e?c.start:o,f.offset=0===e&&0===i?w?S+_.data_offset:S:o,o=f.offset+f.size,(l.sbgps.length>0||l.sgpds.length>0||d.mdia.minf.stbl.sbgps.length>0||d.mdia.minf.stbl.sgpds.length>0)&&g.setSampleGroupProperties(d,f,f.number_in_traf,l.sample_groups_info)}}if(l.subs){d.has_fragment_subsamples=!0;var U=l.first_sample_index;for(e=0;e-1))return null;var o=(i=this.stream.buffers[n]).byteLength-(r.offset+r.alreadyRead-i.fileStart);if(r.size-r.alreadyRead<=o)return s.debug("ISOFile","Getting sample #"+e+" data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+(r.size-r.alreadyRead)+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,r.size-r.alreadyRead),i.usedBytes+=r.size-r.alreadyRead,this.stream.logBufferLevel(),r.alreadyRead=r.size,r;if(0===o)return null;s.debug("ISOFile","Getting sample #"+e+" partial data (alreadyRead: "+r.alreadyRead+" offset: "+(r.offset+r.alreadyRead-i.fileStart)+" read size: "+o+" full size: "+r.size+")"),a.memcpy(r.data.buffer,r.alreadyRead,i,r.offset+r.alreadyRead-i.fileStart,o),r.alreadyRead+=o,i.usedBytes+=o,this.stream.logBufferLevel()}},g.prototype.releaseSample=function(t,e){var i=t.samples[e];return i.data?(this.samplesDataSize-=i.size,i.data=null,i.alreadyRead=0,i.size):0},g.prototype.getAllocatedSampleDataSize=function(){return this.samplesDataSize},g.prototype.getCodecs=function(){var t,e="";for(t=0;t0&&(e+=","),e+=this.moov.traks[t].mdia.minf.stbl.stsd.entries[0].getCodec();return e},g.prototype.getTrexById=function(t){var e;if(!this.moov||!this.moov.mvex)return null;for(e=0;e0&&(i.protection=a.ipro.protections[a.iinf.item_infos[t].protection_index-1]),a.iinf.item_infos[t].item_type?i.type=a.iinf.item_infos[t].item_type:i.type="mime",i.content_type=a.iinf.item_infos[t].content_type,i.content_encoding=a.iinf.item_infos[t].content_encoding,i.item_uri_type=a.iinf.item_infos[t].item_uri_type;if(a.grpl)for(t=0;t0&&d.property_index-1-1))return null;var h=(e=this.stream.buffers[o]).byteLength-(n.offset+n.alreadyRead-e.fileStart);if(!(n.length-n.alreadyRead<=h))return s.debug("ISOFile","Getting item #"+t+" extent #"+r+" partial data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+h+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,h),n.alreadyRead+=h,i.alreadyRead+=h,e.usedBytes+=h,this.stream.logBufferLevel(),null;s.debug("ISOFile","Getting item #"+t+" extent #"+r+" data (alreadyRead: "+n.alreadyRead+" offset: "+(n.offset+n.alreadyRead-e.fileStart)+" read size: "+(n.length-n.alreadyRead)+" full extent size: "+n.length+" full item size: "+i.size+")"),a.memcpy(i.data.buffer,i.alreadyRead,e,n.offset+n.alreadyRead-e.fileStart,n.length-n.alreadyRead),e.usedBytes+=n.length-n.alreadyRead,this.stream.logBufferLevel(),i.alreadyRead+=n.length-n.alreadyRead,n.alreadyRead=n.length}}return i.alreadyRead===i.size?i:null},g.prototype.releaseItem=function(t){var e=this.items[t];if(e.data){this.itemsDataSize-=e.size,e.data=null,e.alreadyRead=0;for(var i=0;i0?this.moov.traks[t].samples[0].duration:0),e.push(r)}return e},u.Box.prototype.printHeader=function(t){this.size+=8,this.size>o&&(this.size+=8),"uuid"===this.type&&(this.size+=16),t.log(t.indent+"size:"+this.size),t.log(t.indent+"type:"+this.type)},u.FullBox.prototype.printHeader=function(t){this.size+=4,u.Box.prototype.printHeader.call(this,t),t.log(t.indent+"version:"+this.version),t.log(t.indent+"flags:"+this.flags)},u.Box.prototype.print=function(t){this.printHeader(t)},u.ContainerBox.prototype.print=function(t){this.printHeader(t);for(var e=0;e>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"next_track_id: "+this.next_track_id)},u.tkhdBox.prototype.print=function(t){u.FullBox.prototype.printHeader.call(this,t),t.log(t.indent+"creation_time: "+this.creation_time),t.log(t.indent+"modification_time: "+this.modification_time),t.log(t.indent+"track_id: "+this.track_id),t.log(t.indent+"duration: "+this.duration),t.log(t.indent+"volume: "+(this.volume>>8)),t.log(t.indent+"matrix: "+this.matrix.join(", ")),t.log(t.indent+"layer: "+this.layer),t.log(t.indent+"alternate_group: "+this.alternate_group),t.log(t.indent+"width: "+this.width),t.log(t.indent+"height: "+this.height)};var y={createFile:function(t,e){var i=void 0===t||t,r=new g(e);return r.discardMdatData=!i,r}};t.createFile=y.createFile}(Bt)),Bt);At.BoxParser.dOpsBox.prototype.write=function(t){if(this.size=11,0!==this.ChannelMappingFamily&&(this.size+=2+this.ChannelMapping.length),this.writeHeader(t),t.writeUint8(this.Version),t.writeUint8(this.OutputChannelCount),t.writeUint16(this.PreSkip),t.writeUint32(this.InputSampleRate),t.writeInt16(this.OutputGain),t.writeUint8(this.ChannelMappingFamily),0!==this.ChannelMappingFamily){if(!this.StreamCount||!this.CoupledCount)throw new Error("failed to write dOps box with channel mapping");t.writeUint8(this.StreamCount),t.writeUint8(this.CoupledCount);for(const e of this.ChannelMapping)t.writeUint8(e)}};class Tt{#G;#H;#Y;#j=0;encode;constructor(){this.#G=new At.ISOFile,this.#G.init(),this.encode=new TransformStream({transform:(t,e)=>{try{return function(t){return void 0!==t.codec}(t)?(console.log("Container received decoder config:",t),this.#q(t,e)):this.#$(t,e)}catch(t){throw console.error("Container failed to process frame:",t),t}}})}#q(t,e){if(this.#Y)throw new Error("duplicate decoder config");let i=t.codec.substring(0,4);"opus"==i&&(i="Opus");const r={type:i,timescale:1e6};if(!function(t){return void 0!==t.codedWidth}(t)?(r.channel_count=t.numberOfChannels,r.samplerate=t.sampleRate):(r.width=t.codedWidth,r.height=t.codedHeight),!t.description)throw new Error("missing frame description");const s=t.description;if("avc1"===i)r.avcDecoderConfigRecord=s;else if("hev1"===i)r.hevcDecoderConfigRecord=s;else{if("Opus"!==i)throw new Error(`unsupported codec: ${i}`);{const t=new At.BoxParser.dOpsBox(void 0),e=new At.DataStream(s,8,At.DataStream.LITTLE_ENDIAN);t.parse(e),r.description=t,r.hdlr="soun"}}if(this.#Y=this.#G.addTrack(r),!this.#Y||!this.#G.ftyp||!this.#G.moov)throw new Error("failed to initialize MP4 track");const n=At.ISOFile.writeInitializationSegment(this.#G.ftyp,this.#G.moov,0,0),a=new Uint8Array(n);e.enqueue({type:"init",timestamp:0,duration:0,data:a})}#$(t,e){if("key"==t.type)this.#j+=1;else if(0==this.#j)throw new Error("must start with keyframe");if(!this.#H)return void(this.#H=t);const i=t.timestamp-this.#H.timestamp,r=new Uint8Array(this.#H.byteLength);if(this.#H.copyTo(r),!this.#Y)throw new Error("missing decoder config");this.#G.addSample(this.#Y,r,{duration:i,dts:this.#H.timestamp,cts:this.#H.timestamp,is_sync:"key"==this.#H.type});const s=new At.DataStream(void 0,0,At.DataStream.BIG_ENDIAN);for(;;){const t=this.#G.moofs.shift(),e=this.#G.mdats.shift();if(!t&&!e)break;if(!t)throw new Error("moof missing");if(!e)throw new Error("mdat missing");t.write(s),e.write(s)}const n=new Uint8Array(s.buffer);e.enqueue({type:this.#H.type,timestamp:this.#H.timestamp,duration:this.#H.duration??0,data:n}),this.#H=t}}const It=["Opus"];let zt=class{#K;#W;#X;frames;constructor(t){this.#W=t,this.frames=new TransformStream({start:this.#Q.bind(this),transform:this.#Z.bind(this),flush:this.#J.bind(this)})}#Q(t){try{this.#K=new AudioEncoder({output:(e,i)=>{this.#$(t,e,i)},error:t=>{throw t}}),this.#K.configure(this.#W)}catch(t){throw console.error("Failed to configure AudioEncoder:",t),t}}#Z(t){try{this.#K.encode(t)}catch(t){throw console.error("Failed to encode audio frame:",t),t}t.close()}#$(t,e,i){const r=i?.decoderConfig;if(r&&!this.#X){const e=i.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#X=e}t.enqueue(e)}#J(){this.#K.close()}static async isSupported(t){const e=t.codec.substring(0,4);if(!It.includes(e))return!1;return!!(await AudioEncoder.isConfigSupported(t)).supported}get config(){return this.#W}};const kt=["avc1","hev1"];class Ct{#K;#W;#X;#tt=!0;#et=0;frames;constructor(t){t.bitrateMode??="constant",t.latencyMode??="realtime",this.#W=t,this.frames=new TransformStream({start:this.#Q.bind(this),transform:this.#Z.bind(this),flush:this.#J.bind(this)})}static async isSupported(t){const e=t.codec.substring(0,4);if(!kt.includes(e))return!1;t.hardwareAcceleration??="prefer-hardware",t.bitrateMode??="constant",t.latencyMode??="realtime";return!!(await VideoEncoder.isConfigSupported(t)).supported}#Q(t){this.#K=new VideoEncoder({output:(e,i)=>{this.#$(t,e,i)},error:t=>{throw t}}),console.log("Encoder configured",this.#W),this.#K.configure(this.#W)}#Z(t){this.#K.encode(t,{keyFrame:this.#tt}),this.#tt=void 0,t.close()}#$(t,e,i){if(!this.#X){const e=i?.decoderConfig;if(!e)throw new Error("missing decoder config");t.enqueue(e),this.#X=e}"key"===e.type?this.#et=0:(this.#et+=1,this.#et+this.#K.encodeQueueSize>=2*this.#W.framerate&&(this.#tt=!0)),t.enqueue(e)}#J(){this.#K.close()}get config(){return this.#W}}class Pt{name;#q;#it=[];#rt=0;#u=!1;#st;#nt=new ft;constructor(t,e){if(this.name=t.kind,"audio"===t.kind){if(!e.audio)throw new Error("no audio config");this.#at(t,e.audio).catch(t=>this.#ot(t))}else{if(!function(t){return"video"===t.kind}(t))throw new Error(`unknown track type: ${t.kind}`);if(!e.video)throw new Error("no video config");this.#ht(t,e.video).catch(t=>this.#ot(t))}}async#at(t,e){const i=new MediaStreamTrackProcessor({track:t}),r=new zt(e),s=new Tt,n=new WritableStream({write:t=>this.#ct(t),close:()=>this.#ot(),abort:t=>this.#ot(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n).catch(t=>{throw console.error("Audio pipeline error:",t),t})}async#ht(t,e){const i=new MediaStreamTrackProcessor({track:t}),r=new Ct(e),s=new Tt,n=new WritableStream({write:t=>this.#ct(t),close:()=>this.#ot(),abort:t=>this.#ot(t)});return i.readable.pipeThrough(r.frames).pipeThrough(s.encode).pipeTo(n)}async#ct(t){if("init"===t.type)return this.#q=t.data,void this.#nt.wake();let e=this.#it.at(-1);if(!e||"key"===t.type){e&&await e.input.close();const i=new vt(this.#rt+this.#it.length);for(this.#it.push(i),this.#nt.wake(),e=i;this.#it.length>1;){const e=this.#it[0];if(t.timestamp-e.timestamp<1e7)break;this.#it.shift(),this.#rt+=1,await e.input.abort("expired")}}const i=e.input.getWriter();(i.desiredSize||0)>0?await i.write(t):console.warn("dropping chunk",i.desiredSize),i.releaseLock()}async close(t){return this.#ot(t)}async#ot(t){this.#st=t;const e=this.#it.at(-1);e&&await e.input.close(),this.#u=!0,this.#nt.wake()}async init(){for(;!this.#q;){if(this.#u)throw new Error("track closed");await this.#nt.wait()}return this.#q}segments(){let t=this.#rt;return new ReadableStream({pull:async e=>{for(;;){let i=t-this.#rt;if(i<0&&(i=0),i{const e=lt(t);console.warn("failed to serve subscribe",e)})}}async#lt(t){try{const[e,i]=function(t){const e=t.lastIndexOf(".");if(e<0)throw new Error("no extension found");return[t.substring(0,e),t.substring(e+1)]}(t.track);if(console.log("serving subscribe",t.track,t.namespace,e,i),"catalog"===i)await this.#dt(t,e);else if("mp4"===i)await this.#pt(t,e);else{if("m4s"!==i)throw new Error(`unknown subscription: ${t.track}`);await this.#ft(t,e)}}catch(e){console.error("failed to serve subscribe",e);const i=lt(e);await t.close(0n,`failed to process subscribe: ${i.message}`)}}async#dt(t,e){if(""!==e)throw new Error(`unknown catalog: ${e}`);const i=function(t){const e=new TextEncoder,i=JSON.stringify(t);return e.encode(i)}(this.catalog);await t.ack(),await X(500);const r=await t.subgroup({group:0,subgroup:0});await r.write({object_id:0,object_payload:i}),await r.close()}async#pt(t,e){const i=this.#ut.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack(),await X(500);const r=await i.init(),s=await t.subgroup({group:0,subgroup:0});await s.write({object_id:0,object_payload:r}),await s.close()}async#ft(t,e){const i=this.#ut.get(e);if(!i)throw new Error(`no track with name ${t.track}`);await t.ack(),await X(500);const r=i.segments().getReader();for(;;){const{value:e,done:i}=await r.read();if(i)break;this.#mt(t,e).catch(t=>{const e=lt(t);console.warn("failed to serve segment",e)})}}async#mt(t,e){const i=await t.subgroup({group:e.id,subgroup:0,priority:127});let r=0;const s=e.chunks().getReader();for(;;){const{value:t,done:e}=await s.read();if(e)break;await i.write({object_id:r,object_payload:t}),r+=1}await i.close()}attach(t){t.srcObject=this.config.media}async close(t=!1){const e=!t;for(const t of this.#ut.values())await t.close();await this.connection.closePublisher(e)}async closed(){try{return await this.#C,new Error("closed")}catch(t){return lt(t)}}}class Nt extends EventTarget{client;connection;broadcast;opts;constructor(t){super(),this.opts=t,this.client=new xt({url:t.url,fingerprint:t.fingerprintUrl})}async publish(){this.connection||(this.connection=await this.client.connect(),this.connection.onMigration=async t=>{console.log("dispatching reconnect event from publisher"),this.dispatchEvent(new CustomEvent("reconnect",{detail:{uri:t}}))});const t={connection:this.connection,namespace:this.opts.namespace,media:this.opts.media,video:this.opts.video,audio:this.opts.audio};this.broadcast=new Dt(t)}async stop(t=!1){if(this.broadcast){this.broadcast.close(t);const e=await this.broadcast.closed();e&&console.error("Error in broadcast closed:",e)}this.connection&&(t?this.connection.close(4,"going away"):this.connection.close(),await this.connection.closed())}}class Rt extends HTMLElement{shadow;cameraSelect;microphoneSelect;previewVideo;connectButton;playbackUrlTextarea;mediaStream=null;publisher;isPublishing=!1;namespace="";constructor(){super(),this.shadow=this.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent=".publisher-container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 0.5rem;\n}\n\n#cameraSelect,\n#microphoneSelect,\n#connect {\n\tfont-size: 1rem;\n\tpadding: 0.5rem;\n}\n\n#preview {\n\tbackground: black;\n\tobject-fit: cover;\n}\n",this.shadow.appendChild(t);const e=document.createElement("div");e.classList.add("publisher-container"),this.cameraSelect=document.createElement("select"),this.microphoneSelect=document.createElement("select"),this.previewVideo=document.createElement("video"),this.connectButton=document.createElement("button"),this.playbackUrlTextarea=document.createElement("textarea"),this.previewVideo.autoplay=!0,this.previewVideo.playsInline=!0,this.previewVideo.muted=!0,this.connectButton.textContent="Connect",this.playbackUrlTextarea.readOnly=!0,this.playbackUrlTextarea.rows=3,this.playbackUrlTextarea.style.display="none",this.playbackUrlTextarea.style.width="100%",this.playbackUrlTextarea.style.marginTop="1rem",e.append(this.cameraSelect,this.microphoneSelect,this.previewVideo,this.connectButton,this.playbackUrlTextarea),this.shadow.appendChild(e),this.handleDeviceChange=this.handleDeviceChange.bind(this),this.handleClick=this.handleClick.bind(this),navigator.mediaDevices.addEventListener("devicechange",this.handleDeviceChange),this.cameraSelect.addEventListener("change",()=>this.startPreview()),this.microphoneSelect.addEventListener("change",()=>this.startPreview()),this.connectButton.addEventListener("click",this.handleClick)}connectedCallback(){this.populateDeviceLists()}disconnectedCallback(){navigator.mediaDevices.removeEventListener("devicechange",this.handleDeviceChange)}async handleDeviceChange(){await this.populateDeviceLists()}async populateDeviceLists(){const t=await navigator.mediaDevices.enumerateDevices(),e=t.filter(t=>"videoinput"===t.kind),i=t.filter(t=>"audioinput"===t.kind);this.cameraSelect.innerHTML="",this.microphoneSelect.innerHTML="",e.forEach(t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Camera ${this.cameraSelect.length+1}`,this.cameraSelect.append(e)}),i.forEach(t=>{const e=document.createElement("option");e.value=t.deviceId,e.textContent=t.label||`Mic ${this.microphoneSelect.length+1}`,this.microphoneSelect.append(e)}),await this.startPreview()}async startPreview(){const t=this.cameraSelect.value,e=this.microphoneSelect.value;this.mediaStream&&this.mediaStream.getTracks().forEach(t=>t.stop());const i=t?{deviceId:{exact:t},height:{ideal:480},frameRate:{ideal:30}}:{height:{ideal:480},frameRate:{ideal:30}},r=!e||{deviceId:{exact:e}};this.mediaStream=await navigator.mediaDevices.getUserMedia({video:i,audio:r}),this.previewVideo.srcObject=this.mediaStream}async handleClick(){return this.isPublishing?this.stopPublishing():this.startPublishing()}async startPublishing(t){if(!this.mediaStream)return void console.warn("No media stream available");this.namespace=this.getAttribute("namespace")??crypto.randomUUID();const e=this.mediaStream.getAudioTracks()[0].getSettings(),i=e.sampleRate??(await new AudioContext).sampleRate,r=e.channelCount??2,s=t=>2*Math.floor(t/2),n={codec:"avc1.42E01E",width:s(this.previewVideo.videoWidth),height:s(this.previewVideo.videoHeight),bitrate:1e6,framerate:30},a={codec:"opus",sampleRate:i,numberOfChannels:r,bitrate:64e3},o={url:t??this.getAttribute("src"),fingerprintUrl:this.getAttribute("fingerprint")??void 0,namespace:[this.namespace],media:this.mediaStream,video:n,audio:a};console.log("Publisher Options",o),this.publisher=new Nt(o),this.publisher.addEventListener("reconnect",t=>{console.log("[PublisherApi] Reconnect event received:",t.detail),this.handleReconnect(t.detail?.uri)}),Object.assign(window,{publisher:this.publisher});try{await this.publisher.publish(),this.isPublishing=!0,this.connectButton.textContent="Stop",this.cameraSelect.disabled=!0,this.microphoneSelect.disabled=!0;const t=this.getAttribute("playbackbaseurl");this.playbackUrlTextarea.value=t?`${t}${this.namespace}`:this.namespace,this.playbackUrlTextarea.style.display="block"}catch(t){console.error("Publish failed:",t),this.mediaStream.getTracks().forEach(t=>t.stop())}}async stopPublishing(t=!1){try{await this.publisher.stop(t)}catch(t){console.error("Stop failed:",t)}finally{this.isPublishing=!1,this.connectButton.textContent="Connect",this.cameraSelect.disabled=!1,this.microphoneSelect.disabled=!1,this.playbackUrlTextarea.style.display="none"}}async handleReconnect(t){await this.stopPublishing(!0),await this.startPublishing(t)}}return customElements.define("publisher-moq",Rt),t.PublisherMoq=Rt,t.default=Rt,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); +//# sourceMappingURL=moq-publisher.iife.js.map diff --git a/demo/lib/moq-publisher.iife.js.map b/demo/lib/moq-publisher.iife.js.map new file mode 100644 index 0000000..3535c79 --- /dev/null +++ b/demo/lib/moq-publisher.iife.js.map @@ -0,0 +1 @@ +{"version":3,"file":"moq-publisher.iife.js","sources":["../../transport/buffer.ts","../../transport/base_data.ts","../../transport/control/subscribe.ts","../../transport/control/subscribe_ok.ts","../../transport/control/subscribe_error.ts","../../transport/control/subscribe_update.ts","../../transport/control/subscribe_namespace.ts","../../transport/control/subscribe_namespace_ok.ts","../../transport/control/subscribe_namespace_error.ts","../../transport/control/unsubscribe.ts","../../transport/control/publish.ts","../../transport/control/publish_ok.ts","../../transport/control/publish_error.ts","../../transport/control/publish_done.ts","../../transport/control/publish_namespace.ts","../../transport/control/publish_namespace_ok.ts","../../transport/control/publish_namespace_error.ts","../../transport/control/publish_namespace_done.ts","../../transport/control/fetch.ts","../../transport/control/fetch_ok.ts","../../transport/control/fetch_error.ts","../../transport/control/fetch_cancel.ts","../../transport/control/go_away.ts","../../transport/control/client_setup.ts","../../transport/control/server_setup.ts","../../transport/control/max_request_id.ts","../../transport/control/index.ts","../../transport/control/requests_block.ts","../../transport/utils.ts","../../transport/stream.ts","../../transport/subgroup.ts","../../transport/objects.ts","../../common/error.ts","../../common/async.ts","../../transport/publisher.ts","../../transport/subscriber.ts","../../transport/connection.ts","../../transport/client.ts","../../contribute/segment.ts","../../node_modules/mp4box/dist/mp4box.all.js","../../media/mp4/index.ts","../../contribute/container.ts","../../contribute/audio.ts","../../contribute/video.ts","../../contribute/track.ts","../../common/settings.ts","../../contribute/broadcast.ts","../../media/catalog/index.ts","../../publish/index.ts","../../moq-publisher/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"// file:src/log.js\n/* \n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar Log = (function (){\n\t\tvar start = new Date();\n\t\tvar LOG_LEVEL_ERROR \t= 4;\n\t\tvar LOG_LEVEL_WARNING \t= 3;\n\t\tvar LOG_LEVEL_INFO \t\t= 2;\n\t\tvar LOG_LEVEL_DEBUG\t\t= 1;\n\t\tvar log_level = LOG_LEVEL_ERROR;\n\t\tvar logObject = {\n\t\t\tsetLogLevel : function(level) {\n\t\t\t\tif (level == this.debug) log_level = LOG_LEVEL_DEBUG;\n\t\t\t\telse if (level == this.info) log_level = LOG_LEVEL_INFO;\n\t\t\t\telse if (level == this.warn) log_level = LOG_LEVEL_WARNING;\n\t\t\t\telse if (level == this.error) log_level = LOG_LEVEL_ERROR;\n\t\t\t\telse log_level = LOG_LEVEL_ERROR;\n\t\t\t},\n\t\t\tdebug : function(module, msg) {\n\t\t\t\tif (console.debug === undefined) {\n\t\t\t\t\tconsole.debug = console.log;\n\t\t\t\t}\n\t\t\t\tif (LOG_LEVEL_DEBUG >= log_level) {\n\t\t\t\t\tconsole.debug(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t},\n\t\t\tlog : function(module, msg) {\n\t\t\t\tthis.debug(module.msg)\n\t\t\t},\n\t\t\tinfo : function(module, msg) {\n\t\t\t\tif (LOG_LEVEL_INFO >= log_level) {\n\t\t\t\t\tconsole.info(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t},\n\t\t\twarn : function(module, msg) {\n\t\t\t\tif (LOG_LEVEL_WARNING >= log_level) {\n\t\t\t\t\tconsole.warn(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t},\n\t\t\terror : function(module, msg) {\n\t\t\t\tif (LOG_LEVEL_ERROR >= log_level) {\n\t\t\t\t\tconsole.error(\"[\"+Log.getDurationString(new Date()-start,1000)+\"]\",\"[\"+module+\"]\",msg);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn logObject;\n\t})();\n\t\n/* Helper function to print a duration value in the form H:MM:SS.MS */\nLog.getDurationString = function(duration, _timescale) {\n\tvar neg;\n\t/* Helper function to print a number on a fixed number of digits */\n\tfunction pad(number, length) {\n\t\tvar str = '' + number;\n\t\tvar a = str.split('.');\t\t\n\t\twhile (a[0].length < length) {\n\t\t\ta[0] = '0' + a[0];\n\t\t}\n\t\treturn a.join('.');\n\t}\n\tif (duration < 0) {\n\t\tneg = true;\n\t\tduration = -duration;\n\t} else {\n\t\tneg = false;\t\n\t}\n\tvar timescale = _timescale || 1;\n\tvar duration_sec = duration/timescale;\n\tvar hours = Math.floor(duration_sec/3600);\n\tduration_sec -= hours * 3600;\n\tvar minutes = Math.floor(duration_sec/60);\n\tduration_sec -= minutes * 60;\t\t\n\tvar msec = duration_sec*1000;\n\tduration_sec = Math.floor(duration_sec);\n\tmsec -= duration_sec*1000;\n\tmsec = Math.floor(msec);\n\treturn (neg ? \"-\": \"\")+hours+\":\"+pad(minutes,2)+\":\"+pad(duration_sec,2)+\".\"+pad(msec,3);\n}\n\t\n/* Helper function to stringify HTML5 TimeRanges objects */\t\nLog.printRanges = function(ranges) {\n\tvar length = ranges.length;\n\tif (length > 0) {\n\t\tvar str = \"\";\n\t\tfor (var i = 0; i < length; i++) {\n\t\t if (i > 0) str += \",\";\n\t\t str += \"[\"+Log.getDurationString(ranges.start(i))+ \",\"+Log.getDurationString(ranges.end(i))+\"]\";\n\t\t}\n\t\treturn str;\n\t} else {\n\t\treturn \"(empty)\";\n\t}\n}\n\nif (typeof exports !== 'undefined') {\n\texports.Log = Log;\n}\n// file:src/stream.js\nvar MP4BoxStream = function(arrayBuffer) {\n if (arrayBuffer instanceof ArrayBuffer) {\n this.buffer = arrayBuffer;\n this.dataview = new DataView(arrayBuffer);\n } else {\n throw (\"Needs an array buffer\");\n }\n this.position = 0;\n};\n\n/*************************************************************************\n Common API between MultiBufferStream and SimpleStream\n *************************************************************************/\nMP4BoxStream.prototype.getPosition = function() {\n return this.position;\n}\n\nMP4BoxStream.prototype.getEndPosition = function() {\n return this.buffer.byteLength;\n}\n\nMP4BoxStream.prototype.getLength = function() {\n return this.buffer.byteLength;\n}\n\nMP4BoxStream.prototype.seek = function (pos) {\n var npos = Math.max(0, Math.min(this.buffer.byteLength, pos));\n this.position = (isNaN(npos) || !isFinite(npos)) ? 0 : npos;\n return true;\n}\n\nMP4BoxStream.prototype.isEos = function () {\n return this.getPosition() >= this.getEndPosition();\n}\n\n/*************************************************************************\n Read methods, simimar to DataStream but simpler\n *************************************************************************/\nMP4BoxStream.prototype.readAnyInt = function(size, signed) {\n var res = 0;\n if (this.position + size <= this.buffer.byteLength) {\n switch (size) {\n case 1:\n if (signed) {\n res = this.dataview.getInt8(this.position);\n } else {\n res = this.dataview.getUint8(this.position);\n }\n break;\n case 2:\n if (signed) {\n res = this.dataview.getInt16(this.position);\n } else {\n res = this.dataview.getUint16(this.position);\n }\n break;\n case 3:\n if (signed) {\n throw (\"No method for reading signed 24 bits values\");\n } else {\n res = this.dataview.getUint8(this.position) << 16;\n res |= this.dataview.getUint8(this.position+1) << 8;\n res |= this.dataview.getUint8(this.position+2);\n }\n break;\n case 4:\n if (signed) {\n res = this.dataview.getInt32(this.position);\n } else {\n res = this.dataview.getUint32(this.position);\n }\n break;\n case 8:\n if (signed) {\n throw (\"No method for reading signed 64 bits values\");\n } else {\n res = this.dataview.getUint32(this.position) << 32;\n res |= this.dataview.getUint32(this.position+4);\n }\n break;\n default:\n throw (\"readInt method not implemented for size: \"+size);\n }\n this.position+= size;\n return res;\n } else {\n throw (\"Not enough bytes in buffer\");\n }\n}\n\nMP4BoxStream.prototype.readUint8 = function() {\n return this.readAnyInt(1, false);\n}\n\nMP4BoxStream.prototype.readUint16 = function() {\n return this.readAnyInt(2, false);\n}\n\nMP4BoxStream.prototype.readUint24 = function() {\n return this.readAnyInt(3, false);\n}\n\nMP4BoxStream.prototype.readUint32 = function() {\n return this.readAnyInt(4, false);\n}\n\nMP4BoxStream.prototype.readUint64 = function() {\n return this.readAnyInt(8, false);\n}\n\nMP4BoxStream.prototype.readString = function(length) {\n if (this.position + length <= this.buffer.byteLength) {\n var s = \"\";\n for (var i = 0; i < length; i++) {\n s += String.fromCharCode(this.readUint8());\n }\n return s;\n } else {\n throw (\"Not enough bytes in buffer\");\n }\n}\n\nMP4BoxStream.prototype.readCString = function() {\n var arr = [];\n while(true) {\n var b = this.readUint8();\n if (b !== 0) {\n arr.push(b);\n } else {\n break;\n }\n }\n return String.fromCharCode.apply(null, arr); \n}\n\nMP4BoxStream.prototype.readInt8 = function() {\n return this.readAnyInt(1, true);\n}\n\nMP4BoxStream.prototype.readInt16 = function() {\n return this.readAnyInt(2, true);\n}\n\nMP4BoxStream.prototype.readInt32 = function() {\n return this.readAnyInt(4, true);\n}\n\nMP4BoxStream.prototype.readInt64 = function() {\n return this.readAnyInt(8, false);\n}\n\nMP4BoxStream.prototype.readUint8Array = function(length) {\n var arr = new Uint8Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readUint8();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readInt16Array = function(length) {\n var arr = new Int16Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readInt16();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readUint16Array = function(length) {\n var arr = new Int16Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readUint16();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readUint32Array = function(length) {\n var arr = new Uint32Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readUint32();\n }\n return arr;\n}\n\nMP4BoxStream.prototype.readInt32Array = function(length) {\n var arr = new Int32Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = this.readInt32();\n }\n return arr;\n}\n\nif (typeof exports !== 'undefined') {\n exports.MP4BoxStream = MP4BoxStream;\n}// file:src/DataStream.js\n/**\n DataStream reads scalars, arrays and structs of data from an ArrayBuffer.\n It's like a file-like DataView on steroids.\n\n @param {ArrayBuffer} arrayBuffer ArrayBuffer to read from.\n @param {?Number} byteOffset Offset from arrayBuffer beginning for the DataStream.\n @param {?Boolean} endianness DataStream.BIG_ENDIAN or DataStream.LITTLE_ENDIAN (the default).\n */\nvar DataStream = function(arrayBuffer, byteOffset, endianness) {\n this._byteOffset = byteOffset || 0;\n if (arrayBuffer instanceof ArrayBuffer) {\n this.buffer = arrayBuffer;\n } else if (typeof arrayBuffer == \"object\") {\n this.dataView = arrayBuffer;\n if (byteOffset) {\n this._byteOffset += byteOffset;\n }\n } else {\n this.buffer = new ArrayBuffer(arrayBuffer || 0);\n }\n this.position = 0;\n this.endianness = endianness == null ? DataStream.LITTLE_ENDIAN : endianness;\n};\nDataStream.prototype = {};\n\nDataStream.prototype.getPosition = function() {\n return this.position;\n}\n\n/**\n Internal function to resize the DataStream buffer when required.\n @param {number} extra Number of bytes to add to the buffer allocation.\n @return {null}\n */\nDataStream.prototype._realloc = function(extra) {\n if (!this._dynamicSize) {\n return;\n }\n var req = this._byteOffset + this.position + extra;\n var blen = this._buffer.byteLength;\n if (req <= blen) {\n if (req > this._byteLength) {\n this._byteLength = req;\n }\n return;\n }\n if (blen < 1) {\n blen = 1;\n }\n while (req > blen) {\n blen *= 2;\n }\n var buf = new ArrayBuffer(blen);\n var src = new Uint8Array(this._buffer);\n var dst = new Uint8Array(buf, 0, src.length);\n dst.set(src);\n this.buffer = buf;\n this._byteLength = req;\n};\n\n/**\n Internal function to trim the DataStream buffer when required.\n Used for stripping out the extra bytes from the backing buffer when\n the virtual byteLength is smaller than the buffer byteLength (happens after\n growing the buffer with writes and not filling the extra space completely).\n\n @return {null}\n */\nDataStream.prototype._trimAlloc = function() {\n if (this._byteLength == this._buffer.byteLength) {\n return;\n }\n var buf = new ArrayBuffer(this._byteLength);\n var dst = new Uint8Array(buf);\n var src = new Uint8Array(this._buffer, 0, dst.length);\n dst.set(src);\n this.buffer = buf;\n};\n\n\n/**\n Big-endian const to use as default endianness.\n @type {boolean}\n */\nDataStream.BIG_ENDIAN = false;\n\n/**\n Little-endian const to use as default endianness.\n @type {boolean}\n */\nDataStream.LITTLE_ENDIAN = true;\n\n/**\n Virtual byte length of the DataStream backing buffer.\n Updated to be max of original buffer size and last written size.\n If dynamicSize is false is set to buffer size.\n @type {number}\n */\nDataStream.prototype._byteLength = 0;\n\n/**\n Returns the byte length of the DataStream object.\n @type {number}\n */\nObject.defineProperty(DataStream.prototype, 'byteLength',\n { get: function() {\n return this._byteLength - this._byteOffset;\n }});\n\n/**\n Set/get the backing ArrayBuffer of the DataStream object.\n The setter updates the DataView to point to the new buffer.\n @type {Object}\n */\nObject.defineProperty(DataStream.prototype, 'buffer',\n { get: function() {\n this._trimAlloc();\n return this._buffer;\n },\n set: function(v) {\n this._buffer = v;\n this._dataView = new DataView(this._buffer, this._byteOffset);\n this._byteLength = this._buffer.byteLength;\n } });\n\n/**\n Set/get the byteOffset of the DataStream object.\n The setter updates the DataView to point to the new byteOffset.\n @type {number}\n */\nObject.defineProperty(DataStream.prototype, 'byteOffset',\n { get: function() {\n return this._byteOffset;\n },\n set: function(v) {\n this._byteOffset = v;\n this._dataView = new DataView(this._buffer, this._byteOffset);\n this._byteLength = this._buffer.byteLength;\n } });\n\n/**\n Set/get the backing DataView of the DataStream object.\n The setter updates the buffer and byteOffset to point to the DataView values.\n @type {Object}\n */\nObject.defineProperty(DataStream.prototype, 'dataView',\n { get: function() {\n return this._dataView;\n },\n set: function(v) {\n this._byteOffset = v.byteOffset;\n this._buffer = v.buffer;\n this._dataView = new DataView(this._buffer, this._byteOffset);\n this._byteLength = this._byteOffset + v.byteLength;\n } });\n\n/**\n Sets the DataStream read/write position to given position.\n Clamps between 0 and DataStream length.\n\n @param {number} pos Position to seek to.\n @return {null}\n */\nDataStream.prototype.seek = function(pos) {\n var npos = Math.max(0, Math.min(this.byteLength, pos));\n this.position = (isNaN(npos) || !isFinite(npos)) ? 0 : npos;\n};\n\n/**\n Returns true if the DataStream seek pointer is at the end of buffer and\n there's no more data to read.\n\n @return {boolean} True if the seek pointer is at the end of the buffer.\n */\nDataStream.prototype.isEof = function() {\n return (this.position >= this._byteLength);\n};\n\n\n/**\n Maps a Uint8Array into the DataStream buffer.\n\n Nice for quickly reading in data.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Uint8Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapUint8Array = function(length) {\n this._realloc(length * 1);\n var arr = new Uint8Array(this._buffer, this.byteOffset+this.position, length);\n this.position += length * 1;\n return arr;\n};\n\n\n/**\n Reads an Int32Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Int32Array.\n */\nDataStream.prototype.readInt32Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 4) : length;\n var arr = new Int32Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads an Int16Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Int16Array.\n */\nDataStream.prototype.readInt16Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 2) : length;\n var arr = new Int16Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads an Int8Array of desired length from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Int8Array.\n */\nDataStream.prototype.readInt8Array = function(length) {\n length = length == null ? (this.byteLength-this.position) : length;\n var arr = new Int8Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Uint32Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Uint32Array.\n */\nDataStream.prototype.readUint32Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 4) : length;\n var arr = new Uint32Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Uint16Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Uint16Array.\n */\nDataStream.prototype.readUint16Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 2) : length;\n var arr = new Uint16Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Uint8Array of desired length from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Uint8Array.\n */\nDataStream.prototype.readUint8Array = function(length) {\n length = length == null ? (this.byteLength-this.position) : length;\n var arr = new Uint8Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Float64Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Float64Array.\n */\nDataStream.prototype.readFloat64Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 8) : length;\n var arr = new Float64Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n/**\n Reads a Float32Array of desired length and endianness from the DataStream.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} The read Float32Array.\n */\nDataStream.prototype.readFloat32Array = function(length, e) {\n length = length == null ? (this.byteLength-this.position / 4) : length;\n var arr = new Float32Array(length);\n DataStream.memcpy(arr.buffer, 0,\n this.buffer, this.byteOffset+this.position,\n length*arr.BYTES_PER_ELEMENT);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += arr.byteLength;\n return arr;\n};\n\n\n/**\n Reads a 32-bit int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readInt32 = function(e) {\n var v = this._dataView.getInt32(this.position, e == null ? this.endianness : e);\n this.position += 4;\n return v;\n};\n\n/**\n Reads a 16-bit int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readInt16 = function(e) {\n var v = this._dataView.getInt16(this.position, e == null ? this.endianness : e);\n this.position += 2;\n return v;\n};\n\n/**\n Reads an 8-bit int from the DataStream.\n\n @return {number} The read number.\n */\nDataStream.prototype.readInt8 = function() {\n var v = this._dataView.getInt8(this.position);\n this.position += 1;\n return v;\n};\n\n/**\n Reads a 32-bit unsigned int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readUint32 = function(e) {\n var v = this._dataView.getUint32(this.position, e == null ? this.endianness : e);\n this.position += 4;\n return v;\n};\n\n/**\n Reads a 16-bit unsigned int from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readUint16 = function(e) {\n var v = this._dataView.getUint16(this.position, e == null ? this.endianness : e);\n this.position += 2;\n return v;\n};\n\n/**\n Reads an 8-bit unsigned int from the DataStream.\n\n @return {number} The read number.\n */\nDataStream.prototype.readUint8 = function() {\n var v = this._dataView.getUint8(this.position);\n this.position += 1;\n return v;\n};\n\n/**\n Reads a 32-bit float from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readFloat32 = function(e) {\n var v = this._dataView.getFloat32(this.position, e == null ? this.endianness : e);\n this.position += 4;\n return v;\n};\n\n/**\n Reads a 64-bit float from the DataStream with the desired endianness.\n\n @param {?boolean} e Endianness of the number.\n @return {number} The read number.\n */\nDataStream.prototype.readFloat64 = function(e) {\n var v = this._dataView.getFloat64(this.position, e == null ? this.endianness : e);\n this.position += 8;\n return v;\n};\n\n/**\n Native endianness. Either DataStream.BIG_ENDIAN or DataStream.LITTLE_ENDIAN\n depending on the platform endianness.\n\n @type {boolean}\n */\nDataStream.endianness = new Int8Array(new Int16Array([1]).buffer)[0] > 0;\n\n/**\n Copies byteLength bytes from the src buffer at srcOffset to the\n dst buffer at dstOffset.\n\n @param {Object} dst Destination ArrayBuffer to write to.\n @param {number} dstOffset Offset to the destination ArrayBuffer.\n @param {Object} src Source ArrayBuffer to read from.\n @param {number} srcOffset Offset to the source ArrayBuffer.\n @param {number} byteLength Number of bytes to copy.\n */\nDataStream.memcpy = function(dst, dstOffset, src, srcOffset, byteLength) {\n var dstU8 = new Uint8Array(dst, dstOffset, byteLength);\n var srcU8 = new Uint8Array(src, srcOffset, byteLength);\n dstU8.set(srcU8);\n};\n\n/**\n Converts array to native endianness in-place.\n\n @param {Object} array Typed array to convert.\n @param {boolean} arrayIsLittleEndian True if the data in the array is\n little-endian. Set false for big-endian.\n @return {Object} The converted typed array.\n */\nDataStream.arrayToNative = function(array, arrayIsLittleEndian) {\n if (arrayIsLittleEndian == this.endianness) {\n return array;\n } else {\n return this.flipArrayEndianness(array);\n }\n};\n\n/**\n Converts native endianness array to desired endianness in-place.\n\n @param {Object} array Typed array to convert.\n @param {boolean} littleEndian True if the converted array should be\n little-endian. Set false for big-endian.\n @return {Object} The converted typed array.\n */\nDataStream.nativeToEndian = function(array, littleEndian) {\n if (this.endianness == littleEndian) {\n return array;\n } else {\n return this.flipArrayEndianness(array);\n }\n};\n\n/**\n Flips typed array endianness in-place.\n\n @param {Object} array Typed array to flip.\n @return {Object} The converted typed array.\n */\nDataStream.flipArrayEndianness = function(array) {\n var u8 = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (var i=0; ik; j--, k++) {\n var tmp = u8[k];\n u8[k] = u8[j];\n u8[j] = tmp;\n }\n }\n return array;\n};\n\n/**\n Seek position where DataStream#readStruct ran into a problem.\n Useful for debugging struct parsing.\n\n @type {number}\n */\nDataStream.prototype.failurePosition = 0;\n\nString.fromCharCodeUint8 = function(uint8arr) {\n var arr = [];\n for (var i = 0; i < uint8arr.length; i++) {\n arr[i] = uint8arr[i];\n }\n return String.fromCharCode.apply(null, arr);\n}\n/**\n Read a string of desired length and encoding from the DataStream.\n\n @param {number} length The length of the string to read in bytes.\n @param {?string} encoding The encoding of the string data in the DataStream.\n Defaults to ASCII.\n @return {string} The read string.\n */\nDataStream.prototype.readString = function(length, encoding) {\n if (encoding == null || encoding == \"ASCII\") {\n return String.fromCharCodeUint8.apply(null, [this.mapUint8Array(length == null ? this.byteLength-this.position : length)]);\n } else {\n return (new TextDecoder(encoding)).decode(this.mapUint8Array(length));\n }\n};\n\n/**\n Read null-terminated string of desired length from the DataStream. Truncates\n the returned string so that the null byte is not a part of it.\n\n @param {?number} length The length of the string to read.\n @return {string} The read string.\n */\nDataStream.prototype.readCString = function(length) {\n var blen = this.byteLength-this.position;\n var u8 = new Uint8Array(this._buffer, this._byteOffset + this.position);\n var len = blen;\n if (length != null) {\n len = Math.min(length, blen);\n }\n for (var i = 0; i < len && u8[i] !== 0; i++); // find first zero byte\n var s = String.fromCharCodeUint8.apply(null, [this.mapUint8Array(i)]);\n if (length != null) {\n this.position += len-i;\n } else if (i != blen) {\n this.position += 1; // trailing zero if not at end of buffer\n }\n return s;\n};\n\n/* \n TODO: fix endianness for 24/64-bit fields\n TODO: check range/support for 64-bits numbers in JavaScript\n*/\nvar MAX_SIZE = Math.pow(2, 32);\n\nDataStream.prototype.readInt64 = function () {\n return (this.readInt32()*MAX_SIZE)+this.readUint32();\n}\nDataStream.prototype.readUint64 = function () {\n\treturn (this.readUint32()*MAX_SIZE)+this.readUint32();\n}\n\nDataStream.prototype.readInt64 = function () {\n return (this.readUint32()*MAX_SIZE)+this.readUint32();\n}\n\nDataStream.prototype.readUint24 = function () {\n\treturn (this.readUint8()<<16)+(this.readUint8()<<8)+this.readUint8();\n}\n\nif (typeof exports !== 'undefined') {\n exports.DataStream = DataStream; \n}\n// file:src/DataStream-write.js\n/**\n Saves the DataStream contents to the given filename.\n Uses Chrome's anchor download property to initiate download.\n \n @param {string} filename Filename to save as.\n @return {null}\n */\nDataStream.prototype.save = function(filename) {\n var blob = new Blob([this.buffer]);\n if (window.URL && URL.createObjectURL) {\n var url = window.URL.createObjectURL(blob);\n var a = document.createElement('a');\n // Required in Firefox:\n document.body.appendChild(a);\n a.setAttribute('href', url);\n a.setAttribute('download', filename);\n // Required in Firefox:\n a.setAttribute('target', '_self');\n a.click();\n window.URL.revokeObjectURL(url);\n } else {\n throw(\"DataStream.save: Can't create object URL.\");\n }\n};\n\n/**\n Whether to extend DataStream buffer when trying to write beyond its size.\n If set, the buffer is reallocated to twice its current size until the\n requested write fits the buffer.\n @type {boolean}\n */\nDataStream.prototype._dynamicSize = true;\nObject.defineProperty(DataStream.prototype, 'dynamicSize',\n { get: function() {\n return this._dynamicSize;\n },\n set: function(v) {\n if (!v) {\n this._trimAlloc();\n }\n this._dynamicSize = v;\n } });\n\n/**\n Internal function to trim the DataStream buffer when required.\n Used for stripping out the first bytes when not needed anymore.\n\n @return {null}\n */\nDataStream.prototype.shift = function(offset) {\n var buf = new ArrayBuffer(this._byteLength-offset);\n var dst = new Uint8Array(buf);\n var src = new Uint8Array(this._buffer, offset, dst.length);\n dst.set(src);\n this.buffer = buf;\n this.position -= offset;\n};\n\n/**\n Writes an Int32Array of specified endianness to the DataStream.\n\n @param {Object} arr The array to write.\n @param {?boolean} e Endianness of the data to write.\n */\nDataStream.prototype.writeInt32Array = function(arr, e) {\n this._realloc(arr.length * 4);\n if (arr instanceof Int32Array &&\n this.byteOffset+this.position % arr.BYTES_PER_ELEMENT === 0) {\n DataStream.memcpy(this._buffer, this.byteOffset+this.position,\n arr.buffer, 0,\n arr.byteLength);\n this.mapInt32Array(arr.length, e);\n } else {\n for (var i=0; i>16);\n\tthis.writeUint8((v & 0x0000FF00)>>8);\n\tthis.writeUint8((v & 0x000000FF));\n}\n\nDataStream.prototype.adjustUint32 = function(position, value) {\n\tvar pos = this.position;\n\tthis.seek(position);\n\tthis.writeUint32(value);\n\tthis.seek(pos);\n}\n// file:src/DataStream-map.js\n/**\n Maps an Int32Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Int32Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapInt32Array = function(length, e) {\n this._realloc(length * 4);\n var arr = new Int32Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 4;\n return arr;\n};\n\n/**\n Maps an Int16Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Int16Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapInt16Array = function(length, e) {\n this._realloc(length * 2);\n var arr = new Int16Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 2;\n return arr;\n};\n\n/**\n Maps an Int8Array into the DataStream buffer.\n\n Nice for quickly reading in data.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Int8Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapInt8Array = function(length) {\n this._realloc(length * 1);\n var arr = new Int8Array(this._buffer, this.byteOffset+this.position, length);\n this.position += length * 1;\n return arr;\n};\n\n/**\n Maps a Uint32Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Uint32Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapUint32Array = function(length, e) {\n this._realloc(length * 4);\n var arr = new Uint32Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 4;\n return arr;\n};\n\n/**\n Maps a Uint16Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Uint16Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapUint16Array = function(length, e) {\n this._realloc(length * 2);\n var arr = new Uint16Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 2;\n return arr;\n};\n\n/**\n Maps a Float64Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Float64Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapFloat64Array = function(length, e) {\n this._realloc(length * 8);\n var arr = new Float64Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 8;\n return arr;\n};\n\n/**\n Maps a Float32Array into the DataStream buffer, swizzling it to native\n endianness in-place. The current offset from the start of the buffer needs to\n be a multiple of element size, just like with typed array views.\n\n Nice for quickly reading in data. Warning: potentially modifies the buffer\n contents.\n\n @param {number} length Number of elements to map.\n @param {?boolean} e Endianness of the data to read.\n @return {Object} Float32Array to the DataStream backing buffer.\n */\nDataStream.prototype.mapFloat32Array = function(length, e) {\n this._realloc(length * 4);\n var arr = new Float32Array(this._buffer, this.byteOffset+this.position, length);\n DataStream.arrayToNative(arr, e == null ? this.endianness : e);\n this.position += length * 4;\n return arr;\n};\n// file:src/buffer.js\n/**\n * MultiBufferStream is a class that acts as a SimpleStream for parsing \n * It holds several, possibly non-contiguous ArrayBuffer objects, each with a fileStart property \n * containing the offset for the buffer data in an original/virtual file \n *\n * It inherits also from DataStream for all read/write/alloc operations\n */\n\n/**\n * Constructor\n */\nvar MultiBufferStream = function(buffer) {\n\t/* List of ArrayBuffers, with a fileStart property, sorted in fileStart order and non overlapping */\n\tthis.buffers = [];\t\n\tthis.bufferIndex = -1;\n\tif (buffer) {\n\t\tthis.insertBuffer(buffer);\n\t\tthis.bufferIndex = 0;\n\t}\n}\nMultiBufferStream.prototype = new DataStream(new ArrayBuffer(), 0, DataStream.BIG_ENDIAN);\n\n/************************************************************************************\n Methods for the managnement of the buffers (insertion, removal, concatenation, ...)\n ***********************************************************************************/\n\nMultiBufferStream.prototype.initialized = function() {\n\tvar firstBuffer;\n\tif (this.bufferIndex > -1) {\n\t\treturn true;\n\t} else if (this.buffers.length > 0) {\n\t\tfirstBuffer = this.buffers[0];\n\t\tif (firstBuffer.fileStart === 0) {\n\t\t\tthis.buffer = firstBuffer;\n\t\t\tthis.bufferIndex = 0;\n\t\t\tLog.debug(\"MultiBufferStream\", \"Stream ready for parsing\");\n\t\t\treturn true;\n\t\t} else {\n\t\t\tLog.warn(\"MultiBufferStream\", \"The first buffer should have a fileStart of 0\");\n\t\t\tthis.logBufferLevel();\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tLog.warn(\"MultiBufferStream\", \"No buffer to start parsing from\");\n\t\tthis.logBufferLevel();\n\t\treturn false;\n\t}\t\t\t\n}\n\n/**\n * helper functions to concatenate two ArrayBuffer objects\n * @param {ArrayBuffer} buffer1 \n * @param {ArrayBuffer} buffer2 \n * @return {ArrayBuffer} the concatenation of buffer1 and buffer2 in that order\n */\nArrayBuffer.concat = function(buffer1, buffer2) {\n Log.debug(\"ArrayBuffer\", \"Trying to create a new buffer of size: \"+(buffer1.byteLength + buffer2.byteLength));\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp.buffer;\n};\n\n/**\n * Reduces the size of a given buffer, but taking the part between offset and offset+newlength\n * @param {ArrayBuffer} buffer \n * @param {Number} offset the start of new buffer\n * @param {Number} newLength the length of the new buffer\n * @return {ArrayBuffer} the new buffer\n */\nMultiBufferStream.prototype.reduceBuffer = function(buffer, offset, newLength) {\n\tvar smallB;\n\tsmallB = new Uint8Array(newLength);\n\tsmallB.set(new Uint8Array(buffer, offset, newLength));\n\tsmallB.buffer.fileStart = buffer.fileStart+offset;\n\tsmallB.buffer.usedBytes = 0;\n\treturn smallB.buffer;\t\n}\n\n/**\n * Inserts the new buffer in the sorted list of buffers,\n * making sure, it is not overlapping with existing ones (possibly reducing its size).\n * if the new buffer overrides/replaces the 0-th buffer (for instance because it is bigger), \n * updates the DataStream buffer for parsing \n*/\nMultiBufferStream.prototype.insertBuffer = function(ab) {\t\n\tvar to_add = true;\n\t/* TODO: improve insertion if many buffers */\n\tfor (var i = 0; i < this.buffers.length; i++) {\n\t\tvar b = this.buffers[i];\n\t\tif (ab.fileStart <= b.fileStart) {\n\t\t\t/* the insertion position is found */\n\t\t\tif (ab.fileStart === b.fileStart) {\n\t\t\t\t/* The new buffer overlaps with an existing buffer */\n\t\t\t\tif (ab.byteLength > b.byteLength) {\n\t\t\t\t\t/* the new buffer is bigger than the existing one\n\t\t\t\t\t remove the existing buffer and try again to insert \n\t\t\t\t\t the new buffer to check overlap with the next ones */\n\t\t\t\t\tthis.buffers.splice(i, 1);\n\t\t\t\t\ti--; \n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\t/* the new buffer is smaller than the existing one, just drop it */\n\t\t\t\t\tLog.warn(\"MultiBufferStream\", \"Buffer (fileStart: \"+ab.fileStart+\" - Length: \"+ab.byteLength+\") already appended, ignoring\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* The beginning of the new buffer is not overlapping with an existing buffer\n\t\t\t\t let's check the end of it */\n\t\t\t\tif (ab.fileStart + ab.byteLength <= b.fileStart) {\n\t\t\t\t\t/* no overlap, we can add it as is */\n\t\t\t\t} else {\n\t\t\t\t\t/* There is some overlap, cut the new buffer short, and add it*/\n\t\t\t\t\tab = this.reduceBuffer(ab, 0, b.fileStart - ab.fileStart);\n\t\t\t\t}\n\t\t\t\tLog.debug(\"MultiBufferStream\", \"Appending new buffer (fileStart: \"+ab.fileStart+\" - Length: \"+ab.byteLength+\")\");\n\t\t\t\tthis.buffers.splice(i, 0, ab);\n\t\t\t\t/* if this new buffer is inserted in the first place in the list of the buffer, \n\t\t\t\t and the DataStream is initialized, make it the buffer used for parsing */\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tthis.buffer = ab;\n\t\t\t\t}\n\t\t\t}\n\t\t\tto_add = false;\n\t\t\tbreak;\n\t\t} else if (ab.fileStart < b.fileStart + b.byteLength) {\n\t\t\t/* the new buffer overlaps its beginning with the end of the current buffer */\n\t\t\tvar offset = b.fileStart + b.byteLength - ab.fileStart;\n\t\t\tvar newLength = ab.byteLength - offset;\n\t\t\tif (newLength > 0) {\n\t\t\t\t/* the new buffer is bigger than the current overlap, drop the overlapping part and try again inserting the remaining buffer */\n\t\t\t\tab = this.reduceBuffer(ab, offset, newLength);\n\t\t\t} else {\n\t\t\t\t/* the content of the new buffer is entirely contained in the existing buffer, drop it entirely */\n\t\t\t\tto_add = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t/* if the buffer has not been added, we can add it at the end */\n\tif (to_add) {\n\t\tLog.debug(\"MultiBufferStream\", \"Appending new buffer (fileStart: \"+ab.fileStart+\" - Length: \"+ab.byteLength+\")\");\n\t\tthis.buffers.push(ab);\n\t\t/* if this new buffer is inserted in the first place in the list of the buffer, \n\t\t and the DataStream is initialized, make it the buffer used for parsing */\n\t\tif (i === 0) {\n\t\t\tthis.buffer = ab;\n\t\t}\n\t}\n}\n\n/**\n * Displays the status of the buffers (number and used bytes)\n * @param {Object} info callback method for display\n */\nMultiBufferStream.prototype.logBufferLevel = function(info) {\n\tvar i;\n\tvar buffer;\n\tvar used, total;\n\tvar ranges = [];\n\tvar range;\n\tvar bufferedString = \"\";\n\tused = 0;\n\ttotal = 0;\n\tfor (i = 0; i < this.buffers.length; i++) {\n\t\tbuffer = this.buffers[i];\n\t\tif (i === 0) {\n\t\t\trange = {};\n\t\t\tranges.push(range);\n\t\t\trange.start = buffer.fileStart;\n\t\t\trange.end = buffer.fileStart+buffer.byteLength;\n\t\t\tbufferedString += \"[\"+range.start+\"-\";\n\t\t} else if (range.end === buffer.fileStart) {\n\t\t\trange.end = buffer.fileStart+buffer.byteLength;\n\t\t} else {\n\t\t\trange = {};\n\t\t\trange.start = buffer.fileStart;\n\t\t\tbufferedString += (ranges[ranges.length-1].end-1)+\"], [\"+range.start+\"-\";\n\t\t\trange.end = buffer.fileStart+buffer.byteLength;\n\t\t\tranges.push(range);\n\t\t}\n\t\tused += buffer.usedBytes;\n\t\ttotal += buffer.byteLength;\n\t}\n\tif (ranges.length > 0) {\n\t\tbufferedString += (range.end-1)+\"]\";\n\t}\n\tvar log = (info ? Log.info : Log.debug)\n\tif (this.buffers.length === 0) {\n\t\tlog(\"MultiBufferStream\", \"No more buffer in memory\");\n\t} else {\n\t\tlog(\"MultiBufferStream\", \"\"+this.buffers.length+\" stored buffer(s) (\"+used+\"/\"+total+\" bytes), continuous ranges: \"+bufferedString);\n\t}\n}\n\nMultiBufferStream.prototype.cleanBuffers = function () {\n\tvar i;\n\tvar buffer;\n\tfor (i = 0; i < this.buffers.length; i++) {\n\t\tbuffer = this.buffers[i];\n\t\tif (buffer.usedBytes === buffer.byteLength) {\n\t\t\tLog.debug(\"MultiBufferStream\", \"Removing buffer #\"+i);\n\t\t\tthis.buffers.splice(i, 1);\n\t\t\ti--;\n\t\t}\n\t}\n}\n\nMultiBufferStream.prototype.mergeNextBuffer = function() {\n\tvar next_buffer;\n\tif (this.bufferIndex+1 < this.buffers.length) {\n\t\tnext_buffer = this.buffers[this.bufferIndex+1];\n\t\tif (next_buffer.fileStart === this.buffer.fileStart + this.buffer.byteLength) {\n\t\t\tvar oldLength = this.buffer.byteLength;\n\t\t\tvar oldUsedBytes = this.buffer.usedBytes;\n\t\t\tvar oldFileStart = this.buffer.fileStart;\n\t\t\tthis.buffers[this.bufferIndex] = ArrayBuffer.concat(this.buffer, next_buffer);\n\t\t\tthis.buffer = this.buffers[this.bufferIndex];\n\t\t\tthis.buffers.splice(this.bufferIndex+1, 1);\n\t\t\tthis.buffer.usedBytes = oldUsedBytes; /* TODO: should it be += ? */\n\t\t\tthis.buffer.fileStart = oldFileStart;\n\t\t\tLog.debug(\"ISOFile\", \"Concatenating buffer for box parsing (length: \"+oldLength+\"->\"+this.buffer.byteLength+\")\");\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n}\n\n\n/*************************************************************************\n Seek-related functions\n *************************************************************************/\n\n/**\n * Finds the buffer that holds the given file position\n * @param {Boolean} fromStart indicates if the search should start from the current buffer (false) \n * or from the first buffer (true)\n * @param {Number} filePosition position in the file to seek to\n * @param {Boolean} markAsUsed indicates if the bytes in between the current position and the seek position \n * should be marked as used for garbage collection\n * @return {Number} the index of the buffer holding the seeked file position, -1 if not found.\n */\nMultiBufferStream.prototype.findPosition = function(fromStart, filePosition, markAsUsed) {\n\tvar i;\n\tvar abuffer = null;\n\tvar index = -1;\n\n\t/* find the buffer with the largest position smaller than the given position */\n\tif (fromStart === true) {\n\t /* the reposition can be in the past, we need to check from the beginning of the list of buffers */\n\t\ti = 0;\n\t} else {\n\t\ti = this.bufferIndex;\n\t}\n\n\twhile (i < this.buffers.length) {\n\t\tabuffer = this.buffers[i];\n\t\tif (abuffer.fileStart <= filePosition) {\n\t\t\tindex = i;\n\t\t\tif (markAsUsed) {\n\t\t\t\tif (abuffer.fileStart + abuffer.byteLength <= filePosition) {\n\t\t\t\t\tabuffer.usedBytes = abuffer.byteLength;\t\n\t\t\t\t} else {\n\t\t\t\t\tabuffer.usedBytes = filePosition - abuffer.fileStart;\n\t\t\t\t}\t\t\n\t\t\t\tthis.logBufferLevel();\t\n\t\t\t}\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t\ti++;\n\t}\n\n\tif (index !== -1) {\n\t\tabuffer = this.buffers[index];\n\t\tif (abuffer.fileStart + abuffer.byteLength >= filePosition) {\t\t\t\n\t\t\tLog.debug(\"MultiBufferStream\", \"Found position in existing buffer #\"+index);\n\t\t\treturn index;\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t} else {\n\t\treturn -1;\n\t}\n}\n\n/**\n * Finds the largest file position contained in a buffer or in the next buffers if they are contiguous (no gap)\n * starting from the given buffer index or from the current buffer if the index is not given\n *\n * @param {Number} inputindex Index of the buffer to start from\n * @return {Number} The largest file position found in the buffers\n */\nMultiBufferStream.prototype.findEndContiguousBuf = function(inputindex) {\n\tvar i;\n\tvar currentBuf;\n\tvar nextBuf;\n\tvar index = (inputindex !== undefined ? inputindex : this.bufferIndex);\n\tcurrentBuf = this.buffers[index];\n\t/* find the end of the contiguous range of data */\n\tif (this.buffers.length > index+1) {\n\t\tfor (i = index+1; i < this.buffers.length; i++) {\n\t\t\tnextBuf = this.buffers[i];\n\t\t\tif (nextBuf.fileStart === currentBuf.fileStart + currentBuf.byteLength) {\n\t\t\t\tcurrentBuf = nextBuf;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t/* return the position of last byte in the file that we have */\n\treturn currentBuf.fileStart + currentBuf.byteLength;\n}\n\n/**\n * Returns the largest file position contained in the buffers, larger than the given position\n * @param {Number} pos the file position to start from\n * @return {Number} the largest position in the current buffer or in the buffer and the next contiguous \n * buffer that holds the given position\n */\nMultiBufferStream.prototype.getEndFilePositionAfter = function(pos) {\n\tvar index = this.findPosition(true, pos, false);\n\tif (index !== -1) {\n\t\treturn this.findEndContiguousBuf(index);\n\t} else {\n\t\treturn pos;\n\t}\n}\n\n/*************************************************************************\n Garbage collection related functions\n *************************************************************************/\n\n/**\n * Marks a given number of bytes as used in the current buffer for garbage collection\n * @param {Number} nbBytes \n */\nMultiBufferStream.prototype.addUsedBytes = function(nbBytes) {\n\tthis.buffer.usedBytes += nbBytes;\n\tthis.logBufferLevel();\n}\n\n/**\n * Marks the entire current buffer as used, ready for garbage collection\n */\nMultiBufferStream.prototype.setAllUsedBytes = function() {\n\tthis.buffer.usedBytes = this.buffer.byteLength;\n\tthis.logBufferLevel();\n}\n\n/*************************************************************************\n Common API between MultiBufferStream and SimpleStream\n *************************************************************************/\n\n/**\n * Tries to seek to a given file position\n * if possible, repositions the parsing from there and returns true \n * if not possible, does not change anything and returns false \n * @param {Number} filePosition position in the file to seek to\n * @param {Boolean} fromStart indicates if the search should start from the current buffer (false) \n * or from the first buffer (true)\n * @param {Boolean} markAsUsed indicates if the bytes in between the current position and the seek position \n * should be marked as used for garbage collection\n * @return {Boolean} true if the seek succeeded, false otherwise\n */\nMultiBufferStream.prototype.seek = function(filePosition, fromStart, markAsUsed) {\n\tvar index;\n\tindex = this.findPosition(fromStart, filePosition, markAsUsed);\n\tif (index !== -1) {\n\t\tthis.buffer = this.buffers[index];\n\t\tthis.bufferIndex = index;\n\t\tthis.position = filePosition - this.buffer.fileStart;\n\t\tLog.debug(\"MultiBufferStream\", \"Repositioning parser at buffer position: \"+this.position);\n\t\treturn true;\n\t} else {\n\t\tLog.debug(\"MultiBufferStream\", \"Position \"+filePosition+\" not found in buffered data\");\n\t\treturn false;\n\t}\n}\n\n/**\n * Returns the current position in the file\n * @return {Number} the position in the file\n */\nMultiBufferStream.prototype.getPosition = function() {\n\tif (this.bufferIndex === -1 || this.buffers[this.bufferIndex] === null) {\n\t\tthrow \"Error accessing position in the MultiBufferStream\";\n\t}\n\treturn this.buffers[this.bufferIndex].fileStart+this.position;\n}\n\n/**\n * Returns the length of the current buffer\n * @return {Number} the length of the current buffer\n */\nMultiBufferStream.prototype.getLength = function() {\n\treturn this.byteLength;\n}\n\nMultiBufferStream.prototype.getEndPosition = function() {\n\tif (this.bufferIndex === -1 || this.buffers[this.bufferIndex] === null) {\n\t\tthrow \"Error accessing position in the MultiBufferStream\";\n\t}\n\treturn this.buffers[this.bufferIndex].fileStart+this.byteLength;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.MultiBufferStream = MultiBufferStream;\n}// file:src/descriptor.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar MPEG4DescriptorParser = function () {\n\tvar ES_DescrTag \t\t\t= 0x03;\n\tvar DecoderConfigDescrTag \t= 0x04;\n\tvar DecSpecificInfoTag \t\t= 0x05;\n\tvar SLConfigDescrTag \t\t= 0x06;\n\n\tvar descTagToName = [];\n\tdescTagToName[ES_DescrTag] \t\t\t\t= \"ES_Descriptor\";\n\tdescTagToName[DecoderConfigDescrTag] \t= \"DecoderConfigDescriptor\";\n\tdescTagToName[DecSpecificInfoTag] \t\t= \"DecoderSpecificInfo\";\n\tdescTagToName[SLConfigDescrTag] \t\t= \"SLConfigDescriptor\";\n\n\tthis.getDescriptorName = function(tag) {\n\t\treturn descTagToName[tag];\n\t}\n\n\tvar that = this;\n\tvar classes = {};\n\n\tthis.parseOneDescriptor = function (stream) {\n\t\tvar hdrSize = 0;\n\t\tvar size = 0;\n\t\tvar tag;\n\t\tvar desc;\n\t\tvar byteRead;\n\t\ttag = stream.readUint8();\n\t\thdrSize++;\n\t\tbyteRead = stream.readUint8();\n\t\thdrSize++;\n\t\twhile (byteRead & 0x80) {\n\t\t\tsize = (size << 7) + (byteRead & 0x7F);\n\t\t\tbyteRead = stream.readUint8();\n\t\t\thdrSize++;\n\t\t}\n\t\tsize = (size << 7) + (byteRead & 0x7F);\n\t\tLog.debug(\"MPEG4DescriptorParser\", \"Found \"+(descTagToName[tag] || \"Descriptor \"+tag)+\", size \"+size+\" at position \"+stream.getPosition());\n\t\tif (descTagToName[tag]) {\n\t\t\tdesc = new classes[descTagToName[tag]](size);\n\t\t} else {\n\t\t\tdesc = new classes.Descriptor(size);\n\t\t}\n\t\tdesc.parse(stream);\n\t\treturn desc;\n\t}\n\n\tclasses.Descriptor = function(_tag, _size) {\n\t\tthis.tag = _tag;\n\t\tthis.size = _size;\n\t\tthis.descs = [];\n\t}\n\n\tclasses.Descriptor.prototype.parse = function (stream) {\n\t\tthis.data = stream.readUint8Array(this.size);\n\t}\n\n\tclasses.Descriptor.prototype.findDescriptor = function (tag) {\n\t\tfor (var i = 0; i < this.descs.length; i++) {\n\t\t\tif (this.descs[i].tag == tag) {\n\t\t\t\treturn this.descs[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tclasses.Descriptor.prototype.parseRemainingDescriptors = function (stream) {\n\t\tvar start = stream.position;\n\t\twhile (stream.position < start+this.size) {\n\t\t\tvar desc = that.parseOneDescriptor(stream);\n\t\t\tthis.descs.push(desc);\n\t\t}\n\t}\n\n\tclasses.ES_Descriptor = function (size) {\n\t\tclasses.Descriptor.call(this, ES_DescrTag, size);\n\t}\n\n\tclasses.ES_Descriptor.prototype = new classes.Descriptor();\n\n\tclasses.ES_Descriptor.prototype.parse = function(stream) {\n\t\tthis.ES_ID = stream.readUint16();\n\t\tthis.flags = stream.readUint8();\n\t\tthis.size -= 3;\n\t\tif (this.flags & 0x80) {\n\t\t\tthis.dependsOn_ES_ID = stream.readUint16();\n\t\t\tthis.size -= 2;\n\t\t} else {\n\t\t\tthis.dependsOn_ES_ID = 0;\n\t\t}\n\t\tif (this.flags & 0x40) {\n\t\t\tvar l = stream.readUint8();\n\t\t\tthis.URL = stream.readString(l);\n\t\t\tthis.size -= l+1;\n\t\t} else {\n\t\t\tthis.URL = \"\";\n\t\t}\n\t\tif (this.flags & 0x20) {\n\t\t\tthis.OCR_ES_ID = stream.readUint16();\n\t\t\tthis.size -= 2;\n\t\t} else {\n\t\t\tthis.OCR_ES_ID = 0;\n\t\t}\n\t\tthis.parseRemainingDescriptors(stream);\n\t}\n\n\tclasses.ES_Descriptor.prototype.getOTI = function(stream) {\n\t\tvar dcd = this.findDescriptor(DecoderConfigDescrTag);\n\t\tif (dcd) {\n\t\t\treturn dcd.oti;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tclasses.ES_Descriptor.prototype.getAudioConfig = function(stream) {\n\t\tvar dcd = this.findDescriptor(DecoderConfigDescrTag);\n\t\tif (!dcd) return null;\n\t\tvar dsi = dcd.findDescriptor(DecSpecificInfoTag);\n\t\tif (dsi && dsi.data) {\n\t\t\tvar audioObjectType = (dsi.data[0]& 0xF8) >> 3;\n\t\t\tif (audioObjectType === 31 && dsi.data.length >= 2) {\n\t\t\t\taudioObjectType = 32 + ((dsi.data[0] & 0x7) << 3) + ((dsi.data[1] & 0xE0) >> 5);\n\t\t\t}\n\t\t\treturn audioObjectType;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tclasses.DecoderConfigDescriptor = function (size) {\n\t\tclasses.Descriptor.call(this, DecoderConfigDescrTag, size);\n\t}\n\tclasses.DecoderConfigDescriptor.prototype = new classes.Descriptor();\n\n\tclasses.DecoderConfigDescriptor.prototype.parse = function(stream) {\n\t\tthis.oti = stream.readUint8();\n\t\tthis.streamType = stream.readUint8();\n\t\tthis.upStream = ((this.streamType >> 1) & 1) !== 0;\n\t\tthis.streamType = this.streamType >>> 2;\n\t\tthis.bufferSize = stream.readUint24();\n\t\tthis.maxBitrate = stream.readUint32();\n\t\tthis.avgBitrate = stream.readUint32();\n\t\tthis.size -= 13;\n\t\tthis.parseRemainingDescriptors(stream);\n\t}\n\n\tclasses.DecoderSpecificInfo = function (size) {\n\t\tclasses.Descriptor.call(this, DecSpecificInfoTag, size);\n\t}\n\tclasses.DecoderSpecificInfo.prototype = new classes.Descriptor();\n\n\tclasses.SLConfigDescriptor = function (size) {\n\t\tclasses.Descriptor.call(this, SLConfigDescrTag, size);\n\t}\n\tclasses.SLConfigDescriptor.prototype = new classes.Descriptor();\n\n\treturn this;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.MPEG4DescriptorParser = MPEG4DescriptorParser;\n}\n// file:src/box.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar BoxParser = {\n\tERR_INVALID_DATA : -1,\n\tERR_NOT_ENOUGH_DATA : 0,\n\tOK : 1,\n\n\t// Boxes to be created with default parsing\n\tBASIC_BOXES: [\n\t\t{type: \"mdat\", name: \"MediaDataBox\"},\n\t\t{type: \"idat\", name: \"ItemDataBox\"},\n\t\t{type: \"free\", name: \"FreeSpaceBox\"},\n\t\t{type: \"skip\", name: \"FreeSpaceBox\"},\n\t\t{type: \"meco\", name: \"AdditionalMetadataContainerBox\"},\n\t\t{type: \"strk\", name: \"SubTrackBox\"}\n\t],\n\tFULL_BOXES: [\n\t\t{type: \"hmhd\", name: \"HintMediaHeaderBox\"},\n\t\t{type: \"nmhd\", name: \"NullMediaHeaderBox\"},\n\t\t{type: \"iods\", name: \"ObjectDescriptorBox\"},\n\t\t{type: \"xml \", name: \"XMLBox\"},\n\t\t{type: \"bxml\", name: \"BinaryXMLBox\"},\n\t\t{type: \"ipro\", name: \"ItemProtectionBox\"},\n\t\t{type: \"mere\", name: \"MetaboxRelationBox\"}\n\t],\n\tCONTAINER_BOXES: [\n\t\t[{type: \"moov\", name: \"CompressedMovieBox\"}, [\"trak\", \"pssh\"]],\n\t\t[{type: \"trak\", name: \"TrackBox\"}],\n\t\t[{type: \"edts\", name: \"EditBox\"}],\n\t\t[{type: \"mdia\", name: \"MediaBox\"}],\n\t\t[{type: \"minf\", name: \"MediaInformationBox\"}],\n\t\t[{type: \"dinf\", name: \"DataInformationBox\"}],\n\t\t[{type: \"stbl\", name: \"SampleTableBox\"}, [\"sgpd\", \"sbgp\"]],\n\t\t[{type: \"mvex\", name: \"MovieExtendsBox\"}, [\"trex\"]],\n\t\t[{type: \"moof\", name: \"CompressedMovieFragmentBox\"}, [\"traf\"]],\n\t\t[{type: \"traf\", name: \"TrackFragmentBox\"}, [\"trun\", \"sgpd\", \"sbgp\"]],\n\t\t[{type: \"vttc\", name: \"VTTCueBox\"}],\n\t\t[{type: \"tref\", name: \"TrackReferenceBox\"}],\n\t\t[{type: \"iref\", name: \"ItemReferenceBox\"}],\n\t\t[{type: \"mfra\", name: \"MovieFragmentRandomAccessBox\"}, [\"tfra\"]],\n\t\t[{type: \"meco\", name: \"AdditionalMetadataContainerBox\"}],\n\t\t[{type: \"hnti\", name: \"trackhintinformation\"}],\n\t\t[{type: \"hinf\", name: \"hintstatisticsbox\"}],\n\t\t[{type: \"strk\", name: \"SubTrackBox\"}],\n\t\t[{type: \"strd\", name: \"SubTrackDefinitionBox\"}],\n\t\t[{type: \"sinf\", name: \"ProtectionSchemeInfoBox\"}],\n\t\t[{type: \"rinf\", name: \"RestrictedSchemeInfoBox\"}],\n\t\t[{type: \"schi\", name: \"SchemeInformationBox\"}],\n\t\t[{type: \"trgr\", name: \"TrackGroupBox\"}],\n\t\t[{type: \"udta\", name: \"UserDataBox\"}, [\"kind\"]],\n\t\t[{type: \"iprp\", name: \"ItemPropertiesBox\"}, [\"ipma\"]],\n\t\t[{type: \"ipco\", name: \"ItemPropertyContainerBox\"}],\n\t\t[{type: \"grpl\", name: \"GroupsListBox\"}],\n\t\t[{type: \"j2kH\", name: \"J2KHeaderInfoBox\"}],\n\t\t[{type: \"etyp\", name: \"ExtendedTypeBox\"}, [\"tyco\"]]\n\t],\n\t// Boxes effectively created\n\tboxCodes : [],\n\tfullBoxCodes : [],\n\tcontainerBoxCodes : [],\n\tsampleEntryCodes : {},\n\tsampleGroupEntryCodes: [],\n\ttrackGroupTypes: [],\n\tUUIDBoxes: {},\n\tUUIDs: [],\n\tinitialize: function() {\n\t\tBoxParser.FullBox.prototype = new BoxParser.Box();\n\t\tBoxParser.ContainerBox.prototype = new BoxParser.Box();\n\t\tBoxParser.SampleEntry.prototype = new BoxParser.Box();\n\t\tBoxParser.TrackGroupTypeBox.prototype = new BoxParser.FullBox();\n\n\t\t/* creating constructors for simple boxes */\n\t\tBoxParser.BASIC_BOXES.forEach(function(box) {\n\t\t\tBoxParser.createBoxCtor(box.type, box.name)\n\t\t});\n\t\tBoxParser.FULL_BOXES.forEach(function(box) {\n\t\t\tBoxParser.createFullBoxCtor(box.type, box.name);\n\t\t});\n\t\tBoxParser.CONTAINER_BOXES.forEach(function(boxes) {\n\t\t\tBoxParser.createContainerBoxCtor(boxes[0].type, boxes[0].name, null, boxes[1]);\n\t\t});\n\t},\n\tBox: function(_type, _size, _name, _uuid) {\n\t\tthis.type = _type;\n\t\tthis.box_name = _name;\n\t\tthis.size = _size;\n\t\tthis.uuid = _uuid;\n\t},\n\tFullBox: function(type, size, name, uuid) {\n\t\tBoxParser.Box.call(this, type, size, name, uuid);\n\t\tthis.flags = 0;\n\t\tthis.version = 0;\n\t},\n\tContainerBox: function(type, size, name, uuid) {\n\t\tBoxParser.Box.call(this, type, size, name, uuid);\n\t\tthis.boxes = [];\n\t},\n\tSampleEntry: function(type, size, hdr_size, start) {\n\t\tBoxParser.ContainerBox.call(this, type, size);\n\t\tthis.hdr_size = hdr_size;\n\t\tthis.start = start;\n\t},\n\tSampleGroupEntry: function(type) {\n\t\tthis.grouping_type = type;\n\t},\n\tTrackGroupTypeBox: function(type, size) {\n\t\tBoxParser.FullBox.call(this, type, size);\n\t},\n\tcreateBoxCtor: function(type, name, parseMethod){\n\t\tBoxParser.boxCodes.push(type);\n\t\tBoxParser[type+\"Box\"] = function(size) {\n\t\t\tBoxParser.Box.call(this, type, size, name);\n\t\t}\n\t\tBoxParser[type+\"Box\"].prototype = new BoxParser.Box();\n\t\tif (parseMethod) BoxParser[type+\"Box\"].prototype.parse = parseMethod;\n\t},\n\tcreateFullBoxCtor: function(type, name, parseMethod) {\n\t\t//BoxParser.fullBoxCodes.push(type);\n\t\tBoxParser[type+\"Box\"] = function(size) {\n\t\t\tBoxParser.FullBox.call(this, type, size, name);\n\t\t}\n\t\tBoxParser[type+\"Box\"].prototype = new BoxParser.FullBox();\n\t\tBoxParser[type+\"Box\"].prototype.parse = function(stream) {\n\t\t\tthis.parseFullHeader(stream);\n\t\t\tif (parseMethod) {\n\t\t\t\tparseMethod.call(this, stream);\n\t\t\t}\n\t\t};\n\t},\n\taddSubBoxArrays: function(subBoxNames) {\n\t\tif (subBoxNames) {\n\t\t\tthis.subBoxNames = subBoxNames;\n\t\t\tvar nbSubBoxes = subBoxNames.length;\n\t\t\tfor (var k = 0; k parentSize) {\n\t\tLog.error(\"BoxParser\", \"Box of type '\"+type+\"' has a size \"+size+\" greater than its container size \"+parentSize);\n\t\treturn { code: BoxParser.ERR_NOT_ENOUGH_DATA, type: type, size: size, hdr_size: hdr_size, start: start };\n\t}\n\tif (size !== 0 && start + size > stream.getEndPosition()) {\n\t\tstream.seek(start);\n\t\tLog.info(\"BoxParser\", \"Not enough data in stream to parse the entire '\"+type+\"' box\");\n\t\treturn { code: BoxParser.ERR_NOT_ENOUGH_DATA, type: type, size: size, hdr_size: hdr_size, start: start };\n\t}\n\tif (headerOnly) {\n\t\treturn { code: BoxParser.OK, type: type, size: size, hdr_size: hdr_size, start: start };\n\t} else {\n\t\tif (BoxParser[type+\"Box\"]) {\n\t\t\tbox = new BoxParser[type+\"Box\"](size);\n\t\t} else {\n\t\t\tif (type !== \"uuid\") {\n\t\t\t\tLog.warn(\"BoxParser\", \"Unknown box type: '\"+type+\"'\");\n\t\t\t\tbox = new BoxParser.Box(type, size);\n\t\t\t\tbox.has_unparsed_data = true;\n\t\t\t} else {\n\t\t\t\tif (BoxParser.UUIDBoxes[uuid]) {\n\t\t\t\t\tbox = new BoxParser.UUIDBoxes[uuid](size);\n\t\t\t\t} else {\n\t\t\t\t\tLog.warn(\"BoxParser\", \"Unknown uuid type: '\"+uuid+\"'\");\n\t\t\t\t\tbox = new BoxParser.Box(type, size);\n\t\t\t\t\tbox.uuid = uuid;\n\t\t\t\t\tbox.has_unparsed_data = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tbox.hdr_size = hdr_size;\n\t/* recording the position of the box in the input stream */\n\tbox.start = start;\n\tif (box.write === BoxParser.Box.prototype.write && box.type !== \"mdat\") {\n\t\tLog.info(\"BoxParser\", \"'\"+box_type+\"' box writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\tbox.parseDataAndRewind(stream);\n\t}\n\tbox.parse(stream);\n\tdiff = stream.getPosition() - (box.start+box.size);\n\tif (diff < 0) {\n\t\tLog.warn(\"BoxParser\", \"Parsing of box '\"+box_type+\"' did not read the entire indicated box data size (missing \"+(-diff)+\" bytes), seeking forward\");\n\t\tstream.seek(box.start+box.size);\n\t} else if (diff > 0) {\n\t\tLog.error(\"BoxParser\", \"Parsing of box '\"+box_type+\"' read \"+diff+\" more bytes than the indicated box data size, seeking backwards\");\n\t\tif (box.size !== 0) stream.seek(box.start+box.size);\n\t}\n\treturn { code: BoxParser.OK, box: box, size: box.size };\n}\n\nBoxParser.Box.prototype.parse = function(stream) {\n\tif (this.type != \"mdat\") {\n\t\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n\t} else {\n\t\tif (this.size === 0) {\n\t\t\tstream.seek(stream.getEndPosition());\n\t\t} else {\n\t\t\tstream.seek(this.start+this.size);\n\t\t}\n\t}\n}\n\n/* Used to parse a box without consuming its data, to allow detailled parsing\n Useful for boxes for which a write method is not yet implemented */\nBoxParser.Box.prototype.parseDataAndRewind = function(stream) {\n\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n\t// rewinding\n\tstream.position -= this.size-this.hdr_size;\n}\n\nBoxParser.FullBox.prototype.parseDataAndRewind = function(stream) {\n\tthis.parseFullHeader(stream);\n\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n\t// restore the header size as if the full header had not been parsed\n\tthis.hdr_size -= 4;\n\t// rewinding\n\tstream.position -= this.size-this.hdr_size;\n}\n\nBoxParser.FullBox.prototype.parseFullHeader = function (stream) {\n\tthis.version = stream.readUint8();\n\tthis.flags = stream.readUint24();\n\tthis.hdr_size += 4;\n}\n\nBoxParser.FullBox.prototype.parse = function (stream) {\n\tthis.parseFullHeader(stream);\n\tthis.data = stream.readUint8Array(this.size-this.hdr_size);\n}\n\nBoxParser.ContainerBox.prototype.parse = function(stream) {\n\tvar ret;\n\tvar box;\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = ret.box;\n\t\t\t/* store the box in the 'boxes' array to preserve box order (for offset) but also store box in a property for more direct access */\n\t\t\tthis.boxes.push(box);\n\t\t\tif (this.subBoxNames && this.subBoxNames.indexOf(box.type) != -1) {\n\t\t\t\tthis[this.subBoxNames[this.subBoxNames.indexOf(box.type)]+\"s\"].push(box);\n\t\t\t} else {\n\t\t\t\tvar box_type = box.type !== \"uuid\" ? box.type : box.uuid;\n\t\t\t\tif (this[box_type]) {\n\t\t\t\t\tLog.warn(\"Box of type \"+box_type+\" already stored in field of this type\");\n\t\t\t\t} else {\n\t\t\t\t\tthis[box_type] = box;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nBoxParser.Box.prototype.parseLanguage = function(stream) {\n\tthis.language = stream.readUint16();\n\tvar chars = [];\n\tchars[0] = (this.language>>10)&0x1F;\n\tchars[1] = (this.language>>5)&0x1F;\n\tchars[2] = (this.language)&0x1F;\n\tthis.languageString = String.fromCharCode(chars[0]+0x60, chars[1]+0x60, chars[2]+0x60);\n}\n\n// file:src/parsing/sampleentries/sampleentry.js\nBoxParser.SAMPLE_ENTRY_TYPE_VISUAL \t\t= \"Visual\";\nBoxParser.SAMPLE_ENTRY_TYPE_AUDIO \t\t= \"Audio\";\nBoxParser.SAMPLE_ENTRY_TYPE_HINT \t\t= \"Hint\";\nBoxParser.SAMPLE_ENTRY_TYPE_METADATA \t= \"Metadata\";\nBoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE \t= \"Subtitle\";\nBoxParser.SAMPLE_ENTRY_TYPE_SYSTEM \t\t= \"System\";\nBoxParser.SAMPLE_ENTRY_TYPE_TEXT \t\t= \"Text\";\n\nBoxParser.SampleEntry.prototype.parseHeader = function(stream) {\n\tstream.readUint8Array(6);\n\tthis.data_reference_index = stream.readUint16();\n\tthis.hdr_size += 8;\n}\n\nBoxParser.SampleEntry.prototype.parse = function(stream) {\n\tthis.parseHeader(stream);\n\tthis.data = stream.readUint8Array(this.size - this.hdr_size);\n}\n\nBoxParser.SampleEntry.prototype.parseDataAndRewind = function(stream) {\n\tthis.parseHeader(stream);\n\tthis.data = stream.readUint8Array(this.size - this.hdr_size);\n\t// restore the header size as if the sample entry header had not been parsed\n\tthis.hdr_size -= 8;\n\t// rewinding\n\tstream.position -= this.size-this.hdr_size;\n}\n\nBoxParser.SampleEntry.prototype.parseFooter = function(stream) {\n\tBoxParser.ContainerBox.prototype.parse.call(this, stream);\n}\n\n// Base SampleEntry types with default parsing\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_HINT);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SYSTEM);\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_TEXT);\n\n//Base SampleEntry types for Audio and Video with specific parsing\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, function(stream) {\n\tvar compressorname_length;\n\tthis.parseHeader(stream);\n\tstream.readUint16();\n\tstream.readUint16();\n\tstream.readUint32Array(3);\n\tthis.width = stream.readUint16();\n\tthis.height = stream.readUint16();\n\tthis.horizresolution = stream.readUint32();\n\tthis.vertresolution = stream.readUint32();\n\tstream.readUint32();\n\tthis.frame_count = stream.readUint16();\n\tcompressorname_length = Math.min(31, stream.readUint8());\n\tthis.compressorname = stream.readString(compressorname_length);\n\tif (compressorname_length < 31) {\n\t\tstream.readString(31 - compressorname_length);\n\t}\n\tthis.depth = stream.readUint16();\n\tstream.readUint16();\n\tthis.parseFooter(stream);\n});\n\nBoxParser.createMediaSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, function(stream) {\n\tthis.parseHeader(stream);\n\tstream.readUint32Array(2);\n\tthis.channel_count = stream.readUint16();\n\tthis.samplesize = stream.readUint16();\n\tstream.readUint16();\n\tstream.readUint16();\n\tthis.samplerate = (stream.readUint32()/(1<<16));\n\tthis.parseFooter(stream);\n});\n\n// Sample entries inheriting from Audio and Video\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avc4\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"av01\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dav1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hvc1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hev1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"hvt1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"lhe1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dvh1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"dvhe\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvc1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvi1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvs1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vvcN\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vp08\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"vp09\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"avs3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"j2ki\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"mjp2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \"mjpg\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL,\t\"uncv\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mp4a\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"ac-3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"ac-4\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"ec-3\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"Opus\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mha1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mha2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mhm1\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"mhm2\");\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"fLaC\");\n\n// Encrypted sample entries\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_VISUAL, \t\"encv\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_AUDIO, \t\"enca\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \t\"encu\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SYSTEM, \t\"encs\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_TEXT, \t\t\"enct\");\nBoxParser.createEncryptedSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \t\"encm\");\n// file:src/parsing/a1lx.js\nBoxParser.createBoxCtor(\"a1lx\", \"AV1LayeredImageIndexingProperty\", function(stream) {\n\tvar large_size = stream.readUint8() & 1;\n\tvar FieldLength = ((large_size & 1) + 1) * 16;\n\tthis.layer_size = [];\n\tfor (var i = 0; i < 3; i++) {\n\t\tif (FieldLength == 16) {\n\t\t\tthis.layer_size[i] = stream.readUint16();\n\t\t} else {\n\t\t\tthis.layer_size[i] = stream.readUint32();\n\t\t}\n\t}\n});// file:src/parsing/a1op.js\nBoxParser.createBoxCtor(\"a1op\", \"OperatingPointSelectorProperty\", function(stream) {\n\tthis.op_index = stream.readUint8();\n});// file:src/parsing/auxC.js\nBoxParser.createFullBoxCtor(\"auxC\", \"AuxiliaryTypeProperty\", function(stream) {\n\tthis.aux_type = stream.readCString();\n\tvar aux_subtype_length = this.size - this.hdr_size - (this.aux_type.length + 1);\n\tthis.aux_subtype = stream.readUint8Array(aux_subtype_length);\n});// file:src/parsing/av1C.js\nBoxParser.createBoxCtor(\"av1C\", \"AV1CodecConfigurationBox\", function(stream) {\n\tvar i;\n\tvar toparse;\n\tvar tmp = stream.readUint8();\n\tif ((tmp >> 7 & 0x1) !== 1) {\n\t\tLog.error(\"av1C marker problem\");\n\t\treturn;\n\t}\n\tthis.version = tmp & 0x7F;\n\tif (this.version !== 1) {\n\t\tLog.error(\"av1C version \"+this.version+\" not supported\");\n\t\treturn;\n\t}\n\ttmp = stream.readUint8();\n\tthis.seq_profile = (tmp >> 5) & 0x7;\n\tthis.seq_level_idx_0 = tmp & 0x1F;\n\ttmp = stream.readUint8();\n\tthis.seq_tier_0 = (tmp >> 7) & 0x1;\n\tthis.high_bitdepth = (tmp >> 6) & 0x1;\n\tthis.twelve_bit = (tmp >> 5) & 0x1;\n\tthis.monochrome = (tmp >> 4) & 0x1;\n\tthis.chroma_subsampling_x = (tmp >> 3) & 0x1;\n\tthis.chroma_subsampling_y = (tmp >> 2) & 0x1;\n\tthis.chroma_sample_position = (tmp & 0x3);\n\ttmp = stream.readUint8();\n\tthis.reserved_1 = (tmp >> 5) & 0x7;\n\tif (this.reserved_1 !== 0) {\n\t\tLog.error(\"av1C reserved_1 parsing problem\");\n\t\treturn;\n\t}\n\tthis.initial_presentation_delay_present = (tmp >> 4) & 0x1;\n\tif (this.initial_presentation_delay_present === 1) {\n\t\tthis.initial_presentation_delay_minus_one = (tmp & 0xF);\n\t} else {\n\t\tthis.reserved_2 = (tmp & 0xF);\n\t\tif (this.reserved_2 !== 0) {\n\t\t\tLog.error(\"av1C reserved_2 parsing problem\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar configOBUs_length = this.size - this.hdr_size - 4;\n\tthis.configOBUs = stream.readUint8Array(configOBUs_length);\n});\n\n// file:src/parsing/avcC.js\nfunction printPS(ps) {\n\tvar str = \"\";\n\tstr += \"\";\n\tstr += \"\";\n\n\tfor (var i=0; i < ps.length; i++) {\n\t\tvar nalu = ps[i];\n\t\tstr += \"\";\n\t\tstr += \"\";\n\t\tstr += \"\";\n\t}\n\tstr += \"
    lengthnalu_data
    \"+nalu.length+\"\";\n\t\tstr += nalu.nalu.reduce(function(str, byte) {\n\t\t\treturn str + byte.toString(16).padStart(2, \"0\");\n\t\t}, \"0x\");\n\t\tstr += \"
    \";\n\treturn str;\n}\n\nBoxParser.createBoxCtor(\"avcC\", \"AVCConfigurationBox\", function(stream) {\n\tvar i;\n\tvar toparse;\n\tthis.configurationVersion = stream.readUint8();\n\tthis.AVCProfileIndication = stream.readUint8();\n\tthis.profile_compatibility = stream.readUint8();\n\tthis.AVCLevelIndication = stream.readUint8();\n\tthis.lengthSizeMinusOne = (stream.readUint8() & 0x3);\n\tthis.nb_SPS_nalus = (stream.readUint8() & 0x1F);\n\ttoparse = this.size - this.hdr_size - 6;\n\tthis.SPS = [];\n\tthis.SPS.toString = function () {\n\t\treturn printPS(this);\n\t}\n\tfor (i = 0; i < this.nb_SPS_nalus; i++) {\n\t\tthis.SPS[i] = {};\n\t\tthis.SPS[i].length = stream.readUint16();\n\t\tthis.SPS[i].nalu = stream.readUint8Array(this.SPS[i].length);\n\t\ttoparse -= 2+this.SPS[i].length;\n\t}\n\tthis.nb_PPS_nalus = stream.readUint8();\n\ttoparse--;\n\tthis.PPS = [];\n\tthis.PPS.toString = function () {\n\t\treturn printPS(this);\n\t}\n\tfor (i = 0; i < this.nb_PPS_nalus; i++) {\n\t\tthis.PPS[i] = {};\n\t\tthis.PPS[i].length = stream.readUint16();\n\t\tthis.PPS[i].nalu = stream.readUint8Array(this.PPS[i].length);\n\t\ttoparse -= 2+this.PPS[i].length;\n\t}\n\tif (toparse>0) {\n\t\tthis.ext = stream.readUint8Array(toparse);\n\t}\n});\n\n// file:src/parsing/btrt.js\nBoxParser.createBoxCtor(\"btrt\", \"BitRateBox\", function(stream) {\n\tthis.bufferSizeDB = stream.readUint32();\n\tthis.maxBitrate = stream.readUint32();\n\tthis.avgBitrate = stream.readUint32();\n});\n\n// file:src/parsing/ccst.js\nBoxParser.createFullBoxCtor(\"ccst\", \"CodingConstraintsBox\", function(stream) {\n\tvar flags = stream.readUint8();\n\tthis.all_ref_pics_intra = ((flags & 0x80) == 0x80);\n\tthis.intra_pred_used = ((flags & 0x40) == 0x40);\n\tthis.max_ref_per_pic = ((flags & 0x3f) >> 2);\n\tstream.readUint24();\n});\n\n// file:src/parsing/cdef.js\nBoxParser.createBoxCtor(\"cdef\", \"ComponentDefinitionBox\", function(stream) {\n var i;\n this.channel_count = stream.readUint16();\n this.channel_indexes = [];\n this.channel_types = [];\n this.channel_associations = [];\n for (i = 0; i < this.channel_count; i++) {\n this.channel_indexes.push(stream.readUint16());\n this.channel_types.push(stream.readUint16());\n this.channel_associations.push(stream.readUint16());\n }\n});\n\n// file:src/parsing/clap.js\nBoxParser.createBoxCtor(\"clap\", \"CleanApertureBox\", function(stream) {\n\tthis.cleanApertureWidthN = stream.readUint32();\n\tthis.cleanApertureWidthD = stream.readUint32();\n\tthis.cleanApertureHeightN = stream.readUint32();\n\tthis.cleanApertureHeightD = stream.readUint32();\n\tthis.horizOffN = stream.readUint32();\n\tthis.horizOffD = stream.readUint32();\n\tthis.vertOffN = stream.readUint32();\n\tthis.vertOffD = stream.readUint32();\n});// file:src/parsing/clli.js\nBoxParser.createBoxCtor(\"clli\", \"ContentLightLevelBox\", function(stream) {\n\tthis.max_content_light_level = stream.readUint16();\n this.max_pic_average_light_level = stream.readUint16();\n});\n\n// file:src/parsing/cmex.js\nBoxParser.createFullBoxCtor(\"cmex\", \"CameraExtrinsicMatrixProperty\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.pos_x = stream.readInt32();\n\t}\n\tif (this.flags & 0x2) {\n\t\tthis.pos_y = stream.readInt32();\n\t}\n\tif (this.flags & 0x4) {\n\t\tthis.pos_z = stream.readInt32();\n\t}\n\tif (this.flags & 0x8) {\n\t\tif (this.version == 0) {\n\t\t\tif (this.flags & 0x10) {\n\t\t\t\tthis.quat_x = stream.readInt32();\n\t\t\t\tthis.quat_y = stream.readInt32();\n\t\t\t\tthis.quat_z = stream.readInt32();\n\t\t\t} else {\n\t\t\t\tthis.quat_x = stream.readInt16();\n\t\t\t\tthis.quat_y = stream.readInt16();\n\t\t\t\tthis.quat_z = stream.readInt16();\n\t\t\t}\n\t\t} else if (this.version == 1) {\n\t\t\t//ViewpointGlobalCoordinateSysRotationStruct rot;\n\t\t}\n\t}\n\tif (this.flags & 0x20) {\n\t\tthis.id = stream.readUint32();\n\t}\n});\n// file:src/parsing/cmin.js\nBoxParser.createFullBoxCtor(\"cmin\", \"CameraIntrinsicMatrixProperty\", function(stream) {\n\tthis.focal_length_x = stream.readInt32();\n\tthis.principal_point_x = stream.readInt32();\n\tthis.principal_point_y = stream.readInt32();\n\tif (this.flags & 0x1) {\n\t\tthis.focal_length_y = stream.readInt32();\n\t\tthis.skew_factor = stream.readInt32();\n\t}\n});// file:src/parsing/cmpd.js\nBoxParser.createBoxCtor(\"cmpd\", \"ComponentDefinitionBox\", function(stream) {\n\tthis.component_count = stream.readUint32();\n\tthis.component_types = [];\n\tthis.component_type_urls = [];\n\tfor (i = 0; i < this.component_count; i++) {\n\t\tvar component_type = stream.readUint16();\n\t\tthis.component_types.push(component_type);\n\t\tif (component_type >= 0x8000) {\n\t\t\tthis.component_type_urls.push(stream.readCString());\n\t\t}\n\t}\n});// file:src/parsing/co64.js\nBoxParser.createFullBoxCtor(\"co64\", \"ChunkLargeOffsetBox\", function(stream) {\n\tvar entry_count;\n\tvar i;\n\tentry_count = stream.readUint32();\n\tthis.chunk_offsets = [];\n\tif (this.version === 0) {\n\t\tfor(i=0; i> 7;\n\t} else if (this.colour_type === 'rICC') {\n\t\tthis.ICC_profile = stream.readUint8Array(this.size - 4);\n\t} else if (this.colour_type === 'prof') {\n\t\tthis.ICC_profile = stream.readUint8Array(this.size - 4);\n\t}\n});// file:src/parsing/cprt.js\nBoxParser.createFullBoxCtor(\"cprt\", \"CopyrightBox\", function (stream) {\n\tthis.parseLanguage(stream);\n\tthis.notice = stream.readCString();\n});\n\n// file:src/parsing/cslg.js\nBoxParser.createFullBoxCtor(\"cslg\", \"CompositionToDecodeBox\", function(stream) {\n\tvar entry_count;\n\tif (this.version === 0) {\n\t\tthis.compositionToDTSShift = stream.readInt32(); /* signed */\n\t\tthis.leastDecodeToDisplayDelta = stream.readInt32(); /* signed */\n\t\tthis.greatestDecodeToDisplayDelta = stream.readInt32(); /* signed */\n\t\tthis.compositionStartTime = stream.readInt32(); /* signed */\n\t\tthis.compositionEndTime = stream.readInt32(); /* signed */\n\t}\n});\n\n// file:src/parsing/ctts.js\nBoxParser.createFullBoxCtor(\"ctts\", \"CompositionOffsetBox\", function(stream) {\n\tvar entry_count;\n\tvar i;\n\tentry_count = stream.readUint32();\n\tthis.sample_counts = [];\n\tthis.sample_offsets = [];\n\tif (this.version === 0) {\n\t\tfor(i=0; i> 6;\n\tthis.bsid = ((tmp_byte1 >> 1) & 0x1F);\n\tthis.bsmod = ((tmp_byte1 & 0x1) << 2) | ((tmp_byte2 >> 6) & 0x3);\n\tthis.acmod = ((tmp_byte2 >> 3) & 0x7);\n\tthis.lfeon = ((tmp_byte2 >> 2) & 0x1);\n\tthis.bit_rate_code = (tmp_byte2 & 0x3) | ((tmp_byte3 >> 5) & 0x7);\n});\n\n// file:src/parsing/dec3.js\nBoxParser.createBoxCtor(\"dec3\", \"EC3SpecificBox\", function(stream) {\n\tvar tmp_16 = stream.readUint16();\n\tthis.data_rate = tmp_16 >> 3;\n\tthis.num_ind_sub = tmp_16 & 0x7;\n\tthis.ind_subs = [];\n\tfor (var i = 0; i < this.num_ind_sub+1; i++) {\n\t\tvar ind_sub = {};\n\t\tthis.ind_subs.push(ind_sub);\n\t\tvar tmp_byte1 = stream.readUint8();\n\t\tvar tmp_byte2 = stream.readUint8();\n\t\tvar tmp_byte3 = stream.readUint8();\n\t\tind_sub.fscod = tmp_byte1 >> 6;\n\t\tind_sub.bsid = ((tmp_byte1 >> 1) & 0x1F);\n\t\tind_sub.bsmod = ((tmp_byte1 & 0x1) << 4) | ((tmp_byte2 >> 4) & 0xF);\n\t\tind_sub.acmod = ((tmp_byte2 >> 1) & 0x7);\n\t\tind_sub.lfeon = (tmp_byte2 & 0x1);\n\t\tind_sub.num_dep_sub = ((tmp_byte3 >> 1) & 0xF);\n\t\tif (ind_sub.num_dep_sub > 0) {\n\t\t\tind_sub.chan_loc = ((tmp_byte3 & 0x1) << 8) | stream.readUint8();\n\t\t}\n\t}\n});\n\n// file:src/parsing/dfLa.js\nBoxParser.createFullBoxCtor(\"dfLa\", \"FLACSpecificBox\", function(stream) {\n var BLOCKTYPE_MASK = 0x7F;\n var LASTMETADATABLOCKFLAG_MASK = 0x80;\n\n var boxesFound = [];\n var knownBlockTypes = [\n \"STREAMINFO\",\n \"PADDING\",\n \"APPLICATION\",\n \"SEEKTABLE\",\n \"VORBIS_COMMENT\",\n \"CUESHEET\",\n \"PICTURE\",\n \"RESERVED\"\n ];\n\n // for (i=0; ; i++) { // to end of box\n do {\n var flagAndType = stream.readUint8();\n\n var type = Math.min(\n (flagAndType & BLOCKTYPE_MASK),\n (knownBlockTypes.length - 1)\n );\n\n // if this is a STREAMINFO block, read the true samplerate since this\n // can be different to the AudioSampleEntry samplerate.\n if (!(type)) {\n // read past all the other stuff\n stream.readUint8Array(13);\n\n // extract samplerate\n this.samplerate = (stream.readUint32() >> 12);\n\n // read to end of STREAMINFO\n stream.readUint8Array(20);\n } else {\n // not interested in other block types so just discard length bytes\n stream.readUint8Array(stream.readUint24());\n }\n\n boxesFound.push(knownBlockTypes[type]);\n\n if (!!(flagAndType & LASTMETADATABLOCKFLAG_MASK)) {\n break;\n }\n } while (true);\n\n this.numMetadataBlocks =\n boxesFound.length + \" (\" + boxesFound.join(\", \") + \")\";\n});\n// file:src/parsing/dimm.js\nBoxParser.createBoxCtor(\"dimm\", \"hintimmediateBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/dmax.js\nBoxParser.createBoxCtor(\"dmax\", \"hintlongestpacket\", function(stream) {\n\tthis.time = stream.readUint32();\n});\n\n// file:src/parsing/dmed.js\nBoxParser.createBoxCtor(\"dmed\", \"hintmediaBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/dOps.js\nBoxParser.createBoxCtor(\"dOps\", \"OpusSpecificBox\", function(stream) {\n\tthis.Version = stream.readUint8();\n\tthis.OutputChannelCount = stream.readUint8();\n\tthis.PreSkip = stream.readUint16();\n\tthis.InputSampleRate = stream.readUint32();\n\tthis.OutputGain = stream.readInt16();\n\tthis.ChannelMappingFamily = stream.readUint8();\n\tif (this.ChannelMappingFamily !== 0) {\n\t\tthis.StreamCount = stream.readUint8();\n\t\tthis.CoupledCount = stream.readUint8();\n\t\tthis.ChannelMapping = [];\n\t\tfor (var i = 0; i < this.OutputChannelCount; i++) {\n\t\t\tthis.ChannelMapping[i] = stream.readUint8();\n\t\t}\n\t}\n});\n\n// file:src/parsing/dref.js\nBoxParser.createFullBoxCtor(\"dref\", \"DataReferenceBox\", function(stream) {\n\tvar ret;\n\tvar box;\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = ret.box;\n\t\t\tthis.entries.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n\n// file:src/parsing/drep.js\nBoxParser.createBoxCtor(\"drep\", \"hintrepeatedBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/elng.js\nBoxParser.createFullBoxCtor(\"elng\", \"ExtendedLanguageBox\", function(stream) {\n\tthis.extended_language = stream.readString(this.size-this.hdr_size);\n});\n\n// file:src/parsing/elst.js\nBoxParser.createFullBoxCtor(\"elst\", \"EditListBox\", function(stream) {\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tvar entry = {};\n\t\tthis.entries.push(entry);\n\t\tif (this.version === 1) {\n\t\t\tentry.segment_duration = stream.readUint64();\n\t\t\tentry.media_time = stream.readInt64();\n\t\t} else {\n\t\t\tentry.segment_duration = stream.readUint32();\n\t\t\tentry.media_time = stream.readInt32();\n\t\t}\n\t\tentry.media_rate_integer = stream.readInt16();\n\t\tentry.media_rate_fraction = stream.readInt16();\n\t}\n});\n\n// file:src/parsing/emsg.js\nBoxParser.createFullBoxCtor(\"emsg\", \"EventMessageBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.timescale \t\t\t\t\t= stream.readUint32();\n\t\tthis.presentation_time \t\t\t= stream.readUint64();\n\t\tthis.event_duration\t\t\t \t= stream.readUint32();\n\t\tthis.id \t\t\t\t\t\t= stream.readUint32();\n\t\tthis.scheme_id_uri \t\t\t\t= stream.readCString();\n\t\tthis.value \t\t\t\t\t\t= stream.readCString();\n\t} else {\n\t\tthis.scheme_id_uri \t\t\t\t= stream.readCString();\n\t\tthis.value \t\t\t\t\t\t= stream.readCString();\n\t\tthis.timescale \t\t\t\t\t= stream.readUint32();\n\t\tthis.presentation_time_delta \t= stream.readUint32();\n\t\tthis.event_duration\t\t\t \t= stream.readUint32();\n\t\tthis.id \t\t\t\t\t\t= stream.readUint32();\n\t}\n\tvar message_size = this.size - this.hdr_size - (4*4 + (this.scheme_id_uri.length+1) + (this.value.length+1));\n\tif (this.version == 1) {\n\t\tmessage_size -= 4;\n\t}\n\tthis.message_data = stream.readUint8Array(message_size);\n});\n\n// file:src/parsing/EntityToGroup.js\n// ISO/IEC 14496-12:2022 Section 8.18.3 Entity to group box\nBoxParser.createEntityToGroupCtor = function(type, parseMethod) {\n BoxParser[type+\"Box\"] = function(size) {\n BoxParser.FullBox.call(this, type, size);\n }\n BoxParser[type+\"Box\"].prototype = new BoxParser.FullBox();\n BoxParser[type+\"Box\"].prototype.parse = function(stream) {\n this.parseFullHeader(stream);\n if (parseMethod) {\n parseMethod.call(this, stream);\n } else {\n this.group_id = stream.readUint32();\n this.num_entities_in_group = stream.readUint32();\n this.entity_ids = [];\n for (i = 0; i < this.num_entities_in_group; i++) {\n var entity_id = stream.readUint32();\n this.entity_ids.push(entity_id);\n }\n }\n };\n};\n\n// Auto exposure bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.2.1)\nBoxParser.createEntityToGroupCtor(\"aebr\");\n\n// Flash exposure bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.5.1)\nBoxParser.createEntityToGroupCtor(\"afbr\");\n\n// Album collection (ISO/IEC 23008-12:2022 Section 6.8.7.1)\nBoxParser.createEntityToGroupCtor(\"albc\");\n\n// Alternative entity (ISO/IEC 14496-12:2022 Section 8.18.3.1)\nBoxParser.createEntityToGroupCtor(\"altr\");\n\n// Burst image entity group (ISO/IEC 23008-12:2022 Section 6.8.2.2)\nBoxParser.createEntityToGroupCtor(\"brst\");\n\n// Depth of field bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.6.1)\nBoxParser.createEntityToGroupCtor(\"dobr\");\n\n// Equivalent entity (ISO/IEC 23008-12:2022 Section 6.8.1.1)\nBoxParser.createEntityToGroupCtor(\"eqiv\");\n\n// Favourites collection (ISO/IEC 23008-12:2022 Section 6.8.7.2)\nBoxParser.createEntityToGroupCtor(\"favc\");\n\n// Focus bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.4.1)\nBoxParser.createEntityToGroupCtor(\"fobr\");\n\n// Audio to image entity group (ISO/IEC 23008-12:2022 Section 6.8.4)\nBoxParser.createEntityToGroupCtor(\"iaug\");\n\n// Panorama (ISO/IEC 23008-12:2022 Section 6.8.8.1)\nBoxParser.createEntityToGroupCtor(\"pano\");\n\n// Slideshow (ISO/IEC 23008-12:2022 Section 6.8.9.1)\nBoxParser.createEntityToGroupCtor(\"slid\");\n\n// Stereo pair (ISO/IEC 23008-12:2022 Section 6.8.5)\nBoxParser.createEntityToGroupCtor(\"ster\");\n\n// Time-synchronised capture entity group (ISO/IEC 23008-12:2022 Section 6.8.3)\nBoxParser.createEntityToGroupCtor(\"tsyn\");\n\n// White balance bracketing (ISO/IEC 23008-12:2022 Section 6.8.6.3.1)\nBoxParser.createEntityToGroupCtor(\"wbbr\");\n\n// Alternative entity (ISO/IEC 23008-12:2022 AMD1 Section 6.8.10)\nBoxParser.createEntityToGroupCtor(\"prgr\");\n\n// Image Pyramid entity group (ISO/IEC 23008-12:20xx Section 6.8.11)\nBoxParser.createEntityToGroupCtor(\"pymd\", function(stream) {\n this.group_id = stream.readUint32();\n this.num_entities_in_group = stream.readUint32();\n this.entity_ids = [];\n for (var i = 0; i < this.num_entities_in_group; i++) {\n var entity_id = stream.readUint32();\n this.entity_ids.push(entity_id);\n }\n \n this.tile_size_x = stream.readUint16();\n this.tile_size_y = stream.readUint16();\n this.layer_binning = [];\n this.tiles_in_layer_column_minus1 = [];\n this.tiles_in_layer_row_minus1 = [];\n for (i = 0; i < this.num_entities_in_group; i++) {\n this.layer_binning[i] = stream.readUint16();\n this.tiles_in_layer_row_minus1[i] = stream.readUint16();\n this.tiles_in_layer_column_minus1[i] = stream.readUint16();\n }\n});\n\n// file:src/parsing/esds.js\nBoxParser.createFullBoxCtor(\"esds\", \"ElementaryStreamDescriptorBox\", function(stream) {\n\tvar esd_data = stream.readUint8Array(this.size-this.hdr_size);\n\tif (typeof MPEG4DescriptorParser !== \"undefined\") {\n\t\tvar esd_parser = new MPEG4DescriptorParser();\n\t\tthis.esd = esd_parser.parseOneDescriptor(new DataStream(esd_data.buffer, 0, DataStream.BIG_ENDIAN));\n\t}\n});\n\n// file:src/parsing/fiel.js\nBoxParser.createBoxCtor(\"fiel\", \"FieldHandlingBox\", function(stream) {\n\tthis.fieldCount = stream.readUint8();\n\tthis.fieldOrdering = stream.readUint8();\n});\n\n// file:src/parsing/frma.js\nBoxParser.createBoxCtor(\"frma\", \"OriginalFormatBox\", function(stream) {\n\tthis.data_format = stream.readString(4);\n});\n\n// file:src/parsing/ftyp.js\nBoxParser.createBoxCtor(\"ftyp\", \"FileTypeBox\", function(stream) {\n\tvar toparse = this.size - this.hdr_size;\n\tthis.major_brand = stream.readString(4);\n\tthis.minor_version = stream.readUint32();\n\ttoparse -= 8;\n\tthis.compatible_brands = [];\n\tvar i = 0;\n\twhile (toparse>=4) {\n\t\tthis.compatible_brands[i] = stream.readString(4);\n\t\ttoparse -= 4;\n\t\ti++;\n\t}\n});\n\n// file:src/parsing/hdlr.js\nBoxParser.createFullBoxCtor(\"hdlr\", \"HandlerBox\", function(stream) {\n\tif (this.version === 0) {\n\t\tstream.readUint32();\n\t\tthis.handler = stream.readString(4);\n\t\tstream.readUint32Array(3);\n\t\tthis.name = stream.readString(this.size-this.hdr_size-20);\n\t\tif (this.name[this.name.length-1]==='\\0') {\n\t\t\tthis.name = this.name.slice(0,-1);\n\t\t}\n\t}\n});\n\n// file:src/parsing/hvcC.js\nBoxParser.createBoxCtor(\"hvcC\", \"HEVCConfigurationBox\", function(stream) {\n\tvar i, j;\n\tvar nb_nalus;\n\tvar length;\n\tvar tmp_byte;\n\tthis.configurationVersion = stream.readUint8();\n\ttmp_byte = stream.readUint8();\n\tthis.general_profile_space = tmp_byte >> 6;\n\tthis.general_tier_flag = (tmp_byte & 0x20) >> 5;\n\tthis.general_profile_idc = (tmp_byte & 0x1F);\n\tthis.general_profile_compatibility = stream.readUint32();\n\tthis.general_constraint_indicator = stream.readUint8Array(6);\n\tthis.general_level_idc = stream.readUint8();\n\tthis.min_spatial_segmentation_idc = stream.readUint16() & 0xFFF;\n\tthis.parallelismType = (stream.readUint8() & 0x3);\n\tthis.chroma_format_idc = (stream.readUint8() & 0x3);\n\tthis.bit_depth_luma_minus8 = (stream.readUint8() & 0x7);\n\tthis.bit_depth_chroma_minus8 = (stream.readUint8() & 0x7);\n\tthis.avgFrameRate = stream.readUint16();\n\ttmp_byte = stream.readUint8();\n\tthis.constantFrameRate = (tmp_byte >> 6);\n\tthis.numTemporalLayers = (tmp_byte & 0XD) >> 3;\n\tthis.temporalIdNested = (tmp_byte & 0X4) >> 2;\n\tthis.lengthSizeMinusOne = (tmp_byte & 0X3);\n\n\tthis.nalu_arrays = [];\n\tthis.nalu_arrays.toString = function () {\n\t\tvar str = \"\";\n\t\tstr += \"\";\n\t\tstr += \"\";\n\n\t\tfor (var i=0; i\";\n\t\t\tstr += \"\";\n\t\t\tstr += \"\";\n\t\t\tfor (var j=0; j\";\n\t\t\t\tstr += \"\";\n\t\t\t}\n\t\t}\n\t\tstr += \"
    completenessnalu_typenalu_data
    \"+nalu_array.completeness+\"\"+nalu_array.nalu_type+\"\";\n\t\t\t\tstr += nalu.data.reduce(function(str, byte) {\n\t\t\t\t\treturn str + byte.toString(16).padStart(2, \"0\");\n\t\t\t\t}, \"0x\");\n\t\t\t\tstr += \"
    \";\n\t\treturn str;\n\t}\n\tvar numOfArrays = stream.readUint8();\n\tfor (i = 0; i < numOfArrays; i++) {\n\t\tvar nalu_array = [];\n\t\tthis.nalu_arrays.push(nalu_array);\n\t\ttmp_byte = stream.readUint8()\n\t\tnalu_array.completeness = (tmp_byte & 0x80) >> 7;\n\t\tnalu_array.nalu_type = tmp_byte & 0x3F;\n\t\tvar numNalus = stream.readUint16();\n\t\tfor (j = 0; j < numNalus; j++) {\n\t\t\tvar nalu = {}\n\t\t\tnalu_array.push(nalu);\n\t\t\tlength = stream.readUint16();\n\t\t\tnalu.data = stream.readUint8Array(length);\n\t\t}\n\t}\n});\n\n// file:src/parsing/iinf.js\nBoxParser.createFullBoxCtor(\"iinf\", \"ItemInfoBox\", function(stream) {\n\tvar ret;\n\tif (this.version === 0) {\n\t\tthis.entry_count = stream.readUint16();\n\t} else {\n\t\tthis.entry_count = stream.readUint32();\n\t}\n\tthis.item_infos = [];\n\tfor (var i = 0; i < this.entry_count; i++) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tif (ret.box.type !== \"infe\") {\n\t\t\t\tLog.error(\"BoxParser\", \"Expected 'infe' box, got \"+ret.box.type);\n\t\t\t}\n\t\t\tthis.item_infos[i] = ret.box;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n\n// file:src/parsing/iloc.js\nBoxParser.createFullBoxCtor(\"iloc\", \"ItemLocationBox\", function(stream) {\n\tvar byte;\n\tbyte = stream.readUint8();\n\tthis.offset_size = (byte >> 4) & 0xF;\n\tthis.length_size = byte & 0xF;\n\tbyte = stream.readUint8();\n\tthis.base_offset_size = (byte >> 4) & 0xF;\n\tif (this.version === 1 || this.version === 2) {\n\t\tthis.index_size = byte & 0xF;\n\t} else {\n\t\tthis.index_size = 0;\n\t\t// reserved = byte & 0xF;\n\t}\n\tthis.items = [];\n\tvar item_count = 0;\n\tif (this.version < 2) {\n\t\titem_count = stream.readUint16();\n\t} else if (this.version === 2) {\n\t\titem_count = stream.readUint32();\n\t} else {\n\t\tthrow \"version of iloc box not supported\";\n\t}\n\tfor (var i = 0; i < item_count; i++) {\n\t\tvar item = {};\n\t\tthis.items.push(item);\n\t\tif (this.version < 2) {\n\t\t\titem.item_ID = stream.readUint16();\n\t\t} else if (this.version === 2) {\n\t\t\titem.item_ID = stream.readUint32();\n\t\t} else {\n\t\t\tthrow \"version of iloc box not supported\";\n\t\t}\n\t\tif (this.version === 1 || this.version === 2) {\n\t\t\titem.construction_method = (stream.readUint16() & 0xF);\n\t\t} else {\n\t\t\titem.construction_method = 0;\n\t\t}\n\t\titem.data_reference_index = stream.readUint16();\n\t\tswitch(this.base_offset_size) {\n\t\t\tcase 0:\n\t\t\t\titem.base_offset = 0;\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\titem.base_offset = stream.readUint32();\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\titem.base_offset = stream.readUint64();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Error reading base offset size\";\n\t\t}\n\t\tvar extent_count = stream.readUint16();\n\t\titem.extents = [];\n\t\tfor (var j=0; j < extent_count; j++) {\n\t\t\tvar extent = {};\n\t\t\titem.extents.push(extent);\n\t\t\tif (this.version === 1 || this.version === 2) {\n\t\t\t\tswitch(this.index_size) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\textent.extent_index = 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\textent.extent_index = stream.readUint32();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\textent.extent_index = stream.readUint64();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow \"Error reading extent index\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch(this.offset_size) {\n\t\t\t\tcase 0:\n\t\t\t\t\textent.extent_offset = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\textent.extent_offset = stream.readUint32();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t\textent.extent_offset = stream.readUint64();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Error reading extent index\";\n\t\t\t}\n\t\t\tswitch(this.length_size) {\n\t\t\t\tcase 0:\n\t\t\t\t\textent.extent_length = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\textent.extent_length = stream.readUint32();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t\textent.extent_length = stream.readUint64();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Error reading extent index\";\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/imir.js\nBoxParser.createBoxCtor(\"imir\", \"ImageMirror\", function(stream) {\n\tvar tmp = stream.readUint8();\n\tthis.reserved = tmp >> 7;\n\tthis.axis = tmp & 1;\n});// file:src/parsing/infe.js\nBoxParser.createFullBoxCtor(\"infe\", \"ItemInfoEntry\", function(stream) {\n\tif (this.version === 0 || this.version === 1) {\n\t\tthis.item_ID = stream.readUint16();\n\t\tthis.item_protection_index = stream.readUint16();\n\t\tthis.item_name = stream.readCString();\n\t\tthis.content_type = stream.readCString();\n\t\tthis.content_encoding = stream.readCString();\n\t}\n\tif (this.version === 1) {\n\t\tthis.extension_type = stream.readString(4);\n\t\tLog.warn(\"BoxParser\", \"Cannot parse extension type\");\n\t\tstream.seek(this.start+this.size);\n\t\treturn;\n\t}\n\tif (this.version >= 2) {\n\t\tif (this.version === 2) {\n\t\t\tthis.item_ID = stream.readUint16();\n\t\t} else if (this.version === 3) {\n\t\t\tthis.item_ID = stream.readUint32();\n\t\t}\n\t\tthis.item_protection_index = stream.readUint16();\n\t\tthis.item_type = stream.readString(4);\n\t\tthis.item_name = stream.readCString();\n\t\tif (this.item_type === \"mime\") {\n\t\t\tthis.content_type = stream.readCString();\n\t\t\tthis.content_encoding = stream.readCString();\n\t\t} else if (this.item_type === \"uri \") {\n\t\t\tthis.item_uri_type = stream.readCString();\n\t\t}\n\t}\n});\n// file:src/parsing/ipma.js\nBoxParser.createFullBoxCtor(\"ipma\", \"ItemPropertyAssociationBox\", function(stream) {\n\tvar i, j;\n\tentry_count = stream.readUint32();\n\tthis.associations = [];\n\tfor(i=0; i> 7) === 1;\n\t\t\tif (this.flags & 0x1) {\n\t\t\t\tp.property_index = (tmp & 0x7F) << 8 | stream.readUint8();\n\t\t\t} else {\n\t\t\t\tp.property_index = (tmp & 0x7F);\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/iref.js\nBoxParser.createFullBoxCtor(\"iref\", \"ItemReferenceBox\", function(stream) {\n\tvar ret;\n\tvar entryCount;\n\tvar box;\n\tthis.references = [];\n\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, true, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tif (this.version === 0) {\n\t\t\t\tbox = new BoxParser.SingleItemTypeReferenceBox(ret.type, ret.size, ret.hdr_size, ret.start);\n\t\t\t} else {\n\t\t\t\tbox = new BoxParser.SingleItemTypeReferenceBoxLarge(ret.type, ret.size, ret.hdr_size, ret.start);\n\t\t\t}\n\t\t\tif (box.write === BoxParser.Box.prototype.write && box.type !== \"mdat\") {\n\t\t\t\tLog.warn(\"BoxParser\", box.type+\" box writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\t\t\tbox.parseDataAndRewind(stream);\n\t\t\t}\n\t\t\tbox.parse(stream);\n\t\t\tthis.references.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n// file:src/parsing/irot.js\nBoxParser.createBoxCtor(\"irot\", \"ImageRotation\", function(stream) {\n\tthis.angle = stream.readUint8() & 0x3;\n});\n\n// file:src/parsing/ispe.js\nBoxParser.createFullBoxCtor(\"ispe\", \"ImageSpatialExtentsProperty\", function(stream) {\n\tthis.image_width = stream.readUint32();\n\tthis.image_height = stream.readUint32();\n});// file:src/parsing/kind.js\nBoxParser.createFullBoxCtor(\"kind\", \"KindBox\", function(stream) {\n\tthis.schemeURI = stream.readCString();\n\tthis.value = stream.readCString();\n});\n// file:src/parsing/leva.js\nBoxParser.createFullBoxCtor(\"leva\", \"LevelAssignmentBox\", function(stream) {\n\tvar count = stream.readUint8();\n\tthis.levels = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tvar level = {};\n\t\tthis.levels[i] = level;\n\t\tlevel.track_ID = stream.readUint32();\n\t\tvar tmp_byte = stream.readUint8();\n\t\tlevel.padding_flag = tmp_byte >> 7;\n\t\tlevel.assignment_type = tmp_byte & 0x7F;\n\t\tswitch (level.assignment_type) {\n\t\t\tcase 0:\n\t\t\t\tlevel.grouping_type = stream.readString(4);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tlevel.grouping_type = stream.readString(4);\n\t\t\t\tlevel.grouping_type_parameter = stream.readUint32();\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tlevel.sub_track_id = stream.readUint32();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tLog.warn(\"BoxParser\", \"Unknown leva assignement type\");\n\t\t}\n\t}\n});\n\n// file:src/parsing/lhvC.js\nBoxParser.createBoxCtor(\"lhvC\", \"LHEVCConfigurationBox\", function(stream) {\n\tvar i, j;\n\tvar tmp_byte;\n\tthis.configurationVersion = stream.readUint8();\n\tthis.min_spatial_segmentation_idc = stream.readUint16() & 0xFFF;\n\tthis.parallelismType = (stream.readUint8() & 0x3);\n\ttmp_byte = stream.readUint8();\n\tthis.numTemporalLayers = (tmp_byte & 0XD) >> 3;\n\tthis.temporalIdNested = (tmp_byte & 0X4) >> 2;\n\tthis.lengthSizeMinusOne = (tmp_byte & 0X3);\n\n\tthis.nalu_arrays = [];\n\tthis.nalu_arrays.toString = function () {\n\t\tvar str = \"\";\n\t\tstr += \"\";\n\t\tstr += \"\";\n\n\t\tfor (var i=0; i\";\n\t\t\tstr += \"\";\n\t\t\tstr += \"\";\n\t\t\tfor (var j=0; j\";\n\t\t\t\tstr += \"\";\n\t\t\t}\n\t\t}\n\t\tstr += \"
    completenessnalu_typenalu_data
    \"+nalu_array.completeness+\"\"+nalu_array.nalu_type+\"\";\n\t\t\t\tstr += nalu.data.reduce(function(str, byte) {\n\t\t\t\t\treturn str + byte.toString(16).padStart(2, \"0\");\n\t\t\t\t}, \"0x\");\n\t\t\t\tstr += \"
    \";\n\t\treturn str;\n\t}\n\tvar numOfArrays = stream.readUint8();\n\tfor (i = 0; i < numOfArrays; i++) {\n\t\tvar nalu_array = [];\n\t\tthis.nalu_arrays.push(nalu_array);\n\t\ttmp_byte = stream.readUint8()\n\t\tnalu_array.completeness = (tmp_byte & 0x80) >> 7;\n\t\tnalu_array.nalu_type = tmp_byte & 0x3F;\n\t\tvar numNalus = stream.readUint16();\n\t\tfor (j = 0; j < numNalus; j++) {\n\t\t\tvar nalu = {}\n\t\t\tnalu_array.push(nalu);\n\t\t\tvar length = stream.readUint16();\n\t\t\tnalu.data = stream.readUint8Array(length);\n\t\t}\n\t}\n});\n\n// file:src/parsing/lsel.js\nBoxParser.createBoxCtor(\"lsel\", \"LayerSelectorProperty\", function(stream) {\n\tthis.layer_id = stream.readUint16();\n});// file:src/parsing/maxr.js\nBoxParser.createBoxCtor(\"maxr\", \"hintmaxrate\", function(stream) {\n\tthis.period = stream.readUint32();\n\tthis.bytes = stream.readUint32();\n});\n\n// file:src/parsing/mdcv.js\nfunction ColorPoint(x, y) {\n this.x = x;\n this.y = y;\n}\n\nColorPoint.prototype.toString = function() {\n return \"(\"+this.x+\",\"+this.y+\")\";\n}\n\nBoxParser.createBoxCtor(\"mdcv\", \"MasteringDisplayColourVolumeBox\", function(stream) {\n this.display_primaries = [];\n this.display_primaries[0] = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.display_primaries[1] = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.display_primaries[2] = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.white_point = new ColorPoint(stream.readUint16(),stream.readUint16());\n this.max_display_mastering_luminance = stream.readUint32();\n this.min_display_mastering_luminance = stream.readUint32();\n});\n\n// file:src/parsing/mdhd.js\nBoxParser.createFullBoxCtor(\"mdhd\", \"MediaHeaderBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.creation_time = stream.readUint64();\n\t\tthis.modification_time = stream.readUint64();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint64();\n\t} else {\n\t\tthis.creation_time = stream.readUint32();\n\t\tthis.modification_time = stream.readUint32();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint32();\n\t}\n\tthis.parseLanguage(stream);\n\tstream.readUint16();\n});\n\n// file:src/parsing/mehd.js\nBoxParser.createFullBoxCtor(\"mehd\", \"MovieExtendsHeaderBox\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tLog.warn(\"BoxParser\", \"mehd box incorrectly uses flags set to 1, converting version to 1\");\n\t\tthis.version = 1;\n\t}\n\tif (this.version == 1) {\n\t\tthis.fragment_duration = stream.readUint64();\n\t} else {\n\t\tthis.fragment_duration = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/meta.js\nBoxParser.createFullBoxCtor(\"meta\", \"MetaBox\", function(stream) {\n\tthis.boxes = [];\n\tBoxParser.ContainerBox.prototype.parse.call(this, stream);\n});\n// file:src/parsing/mfhd.js\nBoxParser.createFullBoxCtor(\"mfhd\", \"MovieFragmentHeaderBox\", function(stream) {\n\tthis.sequence_number = stream.readUint32();\n});\n\n// file:src/parsing/mfro.js\nBoxParser.createFullBoxCtor(\"mfro\", \"MovieFragmentRandomAccessOffsetBox\", function(stream) {\n\tthis._size = stream.readUint32();\n});\n\n// file:src/parsing/mskC.js\nBoxParser.createFullBoxCtor(\"mskC\", \"MaskConfigurationProperty\", function(stream) {\n this.bits_per_pixel = stream.readUint8();\n});\n\n// file:src/parsing/mvhd.js\nBoxParser.createFullBoxCtor(\"mvhd\", \"MovieHeaderBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.creation_time = stream.readUint64();\n\t\tthis.modification_time = stream.readUint64();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint64();\n\t} else {\n\t\tthis.creation_time = stream.readUint32();\n\t\tthis.modification_time = stream.readUint32();\n\t\tthis.timescale = stream.readUint32();\n\t\tthis.duration = stream.readUint32();\n\t}\n\tthis.rate = stream.readUint32();\n\tthis.volume = stream.readUint16()>>8;\n\tstream.readUint16();\n\tstream.readUint32Array(2);\n\tthis.matrix = stream.readUint32Array(9);\n\tstream.readUint32Array(6);\n\tthis.next_track_id = stream.readUint32();\n});\n// file:src/parsing/npck.js\nBoxParser.createBoxCtor(\"npck\", \"hintPacketsSent\", function(stream) {\n\tthis.packetssent = stream.readUint32();\n});\n\n// file:src/parsing/nump.js\nBoxParser.createBoxCtor(\"nump\", \"hintPacketsSent\", function(stream) {\n\tthis.packetssent = stream.readUint64();\n});\n\n// file:src/parsing/padb.js\nBoxParser.createFullBoxCtor(\"padb\", \"PaddingBitsBox\", function(stream) {\n\tvar sample_count = stream.readUint32();\n\tthis.padbits = [];\n\tfor (var i = 0; i < Math.floor((sample_count+1)/2); i++) {\n\t\tthis.padbits = stream.readUint8();\n\t}\n});\n\n// file:src/parsing/pasp.js\nBoxParser.createBoxCtor(\"pasp\", \"PixelAspectRatioBox\", function(stream) {\n\tthis.hSpacing = stream.readUint32();\n\tthis.vSpacing = stream.readUint32();\n});// file:src/parsing/payl.js\nBoxParser.createBoxCtor(\"payl\", \"CuePayloadBox\", function(stream) {\n\tthis.text = stream.readString(this.size - this.hdr_size);\n});\n\n// file:src/parsing/payt.js\nBoxParser.createBoxCtor(\"payt\", \"hintpayloadID\", function(stream) {\n\tthis.payloadID = stream.readUint32();\n\tvar count = stream.readUint8();\n\tthis.rtpmap_string = stream.readString(count);\n});\n\n// file:src/parsing/pdin.js\nBoxParser.createFullBoxCtor(\"pdin\", \"ProgressiveDownloadInfoBox\", function(stream) {\n\tvar count = (this.size - this.hdr_size)/8;\n\tthis.rate = [];\n\tthis.initial_delay = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.rate[i] = stream.readUint32();\n\t\tthis.initial_delay[i] = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/pitm.js\nBoxParser.createFullBoxCtor(\"pitm\", \"PrimaryItemBox\", function(stream) {\n\tif (this.version === 0) {\n\t\tthis.item_id = stream.readUint16();\n\t} else {\n\t\tthis.item_id = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/pixi.js\nBoxParser.createFullBoxCtor(\"pixi\", \"PixelInformationProperty\", function(stream) {\n\tvar i;\n\tthis.num_channels = stream.readUint8();\n\tthis.bits_per_channels = [];\n\tfor (i = 0; i < this.num_channels; i++) {\n\t\tthis.bits_per_channels[i] = stream.readUint8();\n\t}\n});\n\n// file:src/parsing/pmax.js\nBoxParser.createBoxCtor(\"pmax\", \"hintlargestpacket\", function(stream) {\n\tthis.bytes = stream.readUint32();\n});\n\n// file:src/parsing/prdi.js\nBoxParser.createFullBoxCtor(\"prdi\", \"ProgressiveDerivedImageItemInformationProperty\", function(stream) {\n\tthis.step_count = stream.readUint16();\n\tthis.item_count = [];\n\tif (this.flags & 0x2) {\n\t\tfor (var i = 0; i < this.step_count; i++) {\n\t\t\tthis.item_count[i] = stream.readUint16();\n\t\t}\n\t}\n});// file:src/parsing/prft.js\nBoxParser.createFullBoxCtor(\"prft\", \"ProducerReferenceTimeBox\", function(stream) {\n\tthis.ref_track_id = stream.readUint32();\n\tthis.ntp_timestamp = stream.readUint64();\n\tif (this.version === 0) {\n\t\tthis.media_time = stream.readUint32();\n\t} else {\n\t\tthis.media_time = stream.readUint64();\n\t}\n});\n\n// file:src/parsing/pssh.js\nBoxParser.createFullBoxCtor(\"pssh\", \"ProtectionSystemSpecificHeaderBox\", function(stream) {\n\tthis.system_id = BoxParser.parseHex16(stream);\n\tif (this.version > 0) {\n\t\tvar count = stream.readUint32();\n\t\tthis.kid = [];\n\t\tfor (var i = 0; i < count; i++) {\n\t\t\tthis.kid[i] = BoxParser.parseHex16(stream);\n\t\t}\n\t}\n\tvar datasize = stream.readUint32();\n\tif (datasize > 0) {\n\t\tthis.data = stream.readUint8Array(datasize);\n\t}\n});\n\n// file:src/parsing/qt/clef.js\nBoxParser.createFullBoxCtor(\"clef\", \"TrackCleanApertureDimensionsBox\", function(stream) {\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});// file:src/parsing/qt/enof.js\nBoxParser.createFullBoxCtor(\"enof\", \"TrackEncodedPixelsDimensionsBox\", function(stream) {\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});// file:src/parsing/qt/prof.js\nBoxParser.createFullBoxCtor(\"prof\", \"TrackProductionApertureDimensionsBox\", function(stream) {\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});// file:src/parsing/qt/tapt.js\nBoxParser.createContainerBoxCtor(\"tapt\", \"TrackApertureModeDimensionsBox\", null, [ \"clef\", \"prof\", \"enof\"]);// file:src/parsing/rtp.js\nBoxParser.createBoxCtor(\"rtp \", \"rtpmoviehintinformation\", function(stream) {\n\tthis.descriptionformat = stream.readString(4);\n\tthis.sdptext = stream.readString(this.size - this.hdr_size - 4);\n});\n\n// file:src/parsing/saio.js\nBoxParser.createFullBoxCtor(\"saio\", \"SampleAuxiliaryInformationOffsetsBox\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.aux_info_type = stream.readString(4);\n\t\tthis.aux_info_type_parameter = stream.readUint32();\n\t}\n\tvar count = stream.readUint32();\n\tthis.offset = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tif (this.version === 0) {\n\t\t\tthis.offset[i] = stream.readUint32();\n\t\t} else {\n\t\t\tthis.offset[i] = stream.readUint64();\n\t\t}\n\t}\n});\n// file:src/parsing/saiz.js\nBoxParser.createFullBoxCtor(\"saiz\", \"SampleAuxiliaryInformationSizesBox\", function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.aux_info_type = stream.readString(4);\n\t\tthis.aux_info_type_parameter = stream.readUint32();\n\t}\n\tthis.default_sample_info_size = stream.readUint8();\n\tthis.sample_count = stream.readUint32();\n\tthis.sample_info_size = [];\n\tif (this.default_sample_info_size === 0) {\n\t\tfor (var i = 0; i < this.sample_count; i++) {\n\t\t\tthis.sample_info_size[i] = stream.readUint8();\n\t\t}\n\t}\n});\n\n// file:src/parsing/sampleentries/mett.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"mett\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.mime_format = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/metx.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"metx\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.namespace = stream.readCString();\n\tthis.schema_location = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/sbtt.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"sbtt\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.mime_format = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/stpp.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"stpp\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.namespace = stream.readCString();\n\tthis.schema_location = stream.readCString();\n\tthis.auxiliary_mime_types = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/stxt.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"stxt\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.content_encoding = stream.readCString();\n\tthis.mime_format = stream.readCString();\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/sampleentries/tx3g.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_SUBTITLE, \"tx3g\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.displayFlags = stream.readUint32();\n\tthis.horizontal_justification = stream.readInt8();\n\tthis.vertical_justification = stream.readInt8();\n\tthis.bg_color_rgba = stream.readUint8Array(4);\n\tthis.box_record = stream.readInt16Array(4);\n\tthis.style_record = stream.readUint8Array(12);\n\tthis.parseFooter(stream);\n});\n// file:src/parsing/sampleentries/wvtt.js\nBoxParser.createSampleEntryCtor(BoxParser.SAMPLE_ENTRY_TYPE_METADATA, \"wvtt\", function(stream) {\n\tthis.parseHeader(stream);\n\tthis.parseFooter(stream);\n});\n\n// file:src/parsing/samplegroups/alst.js\nBoxParser.createSampleGroupCtor(\"alst\", function(stream) {\n\tvar i;\n\tvar roll_count = stream.readUint16();\n\tthis.first_output_sample = stream.readUint16();\n\tthis.sample_offset = [];\n\tfor (i = 0; i < roll_count; i++) {\n\t\tthis.sample_offset[i] = stream.readUint32();\n\t}\n\tvar remaining = this.description_length - 4 - 4*roll_count;\n\tthis.num_output_samples = [];\n\tthis.num_total_samples = [];\n\tfor (i = 0; i < remaining/4; i++) {\n\t\tthis.num_output_samples[i] = stream.readUint16();\n\t\tthis.num_total_samples[i] = stream.readUint16();\n\t}\n});\n\n// file:src/parsing/samplegroups/avll.js\nBoxParser.createSampleGroupCtor(\"avll\", function(stream) {\n\tthis.layerNumber = stream.readUint8();\n\tthis.accurateStatisticsFlag = stream.readUint8();\n\tthis.avgBitRate = stream.readUint16();\n\tthis.avgFrameRate = stream.readUint16();\n});\n\n// file:src/parsing/samplegroups/avss.js\nBoxParser.createSampleGroupCtor(\"avss\", function(stream) {\n\tthis.subSequenceIdentifier = stream.readUint16();\n\tthis.layerNumber = stream.readUint8();\n\tvar tmp_byte = stream.readUint8();\n\tthis.durationFlag = tmp_byte >> 7;\n\tthis.avgRateFlag = (tmp_byte >> 6) & 0x1;\n\tif (this.durationFlag) {\n\t\tthis.duration = stream.readUint32();\n\t}\n\tif (this.avgRateFlag) {\n\t\tthis.accurateStatisticsFlag = stream.readUint8();\n\t\tthis.avgBitRate = stream.readUint16();\n\t\tthis.avgFrameRate = stream.readUint16();\n\t}\n\tthis.dependency = [];\n\tvar numReferences = stream.readUint8();\n\tfor (var i = 0; i < numReferences; i++) {\n\t\tvar dependencyInfo = {};\n\t\tthis.dependency.push(dependencyInfo);\n\t\tdependencyInfo.subSeqDirectionFlag = stream.readUint8();\n\t\tdependencyInfo.layerNumber = stream.readUint8();\n\t\tdependencyInfo.subSequenceIdentifier = stream.readUint16();\n\t}\n});\n\n// file:src/parsing/samplegroups/dtrt.js\nBoxParser.createSampleGroupCtor(\"dtrt\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/mvif.js\nBoxParser.createSampleGroupCtor(\"mvif\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/prol.js\nBoxParser.createSampleGroupCtor(\"prol\", function(stream) {\n\tthis.roll_distance = stream.readInt16();\n});\n\n// file:src/parsing/samplegroups/rap.js\nBoxParser.createSampleGroupCtor(\"rap \", function(stream) {\n\tvar tmp_byte = stream.readUint8();\n\tthis.num_leading_samples_known = tmp_byte >> 7;\n\tthis.num_leading_samples = tmp_byte & 0x7F;\n});\n\n// file:src/parsing/samplegroups/rash.js\nBoxParser.createSampleGroupCtor(\"rash\", function(stream) {\n\tthis.operation_point_count = stream.readUint16();\n\tif (this.description_length !== 2+(this.operation_point_count === 1?2:this.operation_point_count*6)+9) {\n\t\tLog.warn(\"BoxParser\", \"Mismatch in \"+this.grouping_type+\" sample group length\");\n\t\tthis.data = stream.readUint8Array(this.description_length-2);\n\t} else {\n\t\tif (this.operation_point_count === 1) {\n\t\t\tthis.target_rate_share = stream.readUint16();\n\t\t} else {\n\t\t\tthis.target_rate_share = [];\n\t\t\tthis.available_bitrate = [];\n\t\t\tfor (var i = 0; i < this.operation_point_count; i++) {\n\t\t\t\tthis.available_bitrate[i] = stream.readUint32();\n\t\t\t\tthis.target_rate_share[i] = stream.readUint16();\n\t\t\t}\n\t\t}\n\t\tthis.maximum_bitrate = stream.readUint32();\n\t\tthis.minimum_bitrate = stream.readUint32();\n\t\tthis.discard_priority = stream.readUint8();\n\t}\n});\n\n// file:src/parsing/samplegroups/roll.js\nBoxParser.createSampleGroupCtor(\"roll\", function(stream) {\n\tthis.roll_distance = stream.readInt16();\n});\n\n// file:src/parsing/samplegroups/samplegroup.js\nBoxParser.SampleGroupEntry.prototype.parse = function(stream) {\n\tLog.warn(\"BoxParser\", \"Unknown Sample Group type: \"+this.grouping_type);\n\tthis.data = stream.readUint8Array(this.description_length);\n}\n\n// file:src/parsing/samplegroups/scif.js\nBoxParser.createSampleGroupCtor(\"scif\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/scnm.js\nBoxParser.createSampleGroupCtor(\"scnm\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/seig.js\nBoxParser.createSampleGroupCtor(\"seig\", function(stream) {\n\tthis.reserved = stream.readUint8();\n\tvar tmp = stream.readUint8();\n\tthis.crypt_byte_block = tmp >> 4;\n\tthis.skip_byte_block = tmp & 0xF;\n\tthis.isProtected = stream.readUint8();\n\tthis.Per_Sample_IV_Size = stream.readUint8();\n\tthis.KID = BoxParser.parseHex16(stream);\n\tthis.constant_IV_size = 0;\n\tthis.constant_IV = 0;\n\tif (this.isProtected === 1 && this.Per_Sample_IV_Size === 0) {\n\t\tthis.constant_IV_size = stream.readUint8();\n\t\tthis.constant_IV = stream.readUint8Array(this.constant_IV_size);\n\t}\n});\n\n// file:src/parsing/samplegroups/stsa.js\nBoxParser.createSampleGroupCtor(\"stsa\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/sync.js\nBoxParser.createSampleGroupCtor(\"sync\", function(stream) {\n\tvar tmp_byte = stream.readUint8();\n\tthis.NAL_unit_type = tmp_byte & 0x3F;\n});\n\n// file:src/parsing/samplegroups/tele.js\nBoxParser.createSampleGroupCtor(\"tele\", function(stream) {\n\tvar tmp_byte = stream.readUint8();\n\tthis.level_independently_decodable = tmp_byte >> 7;\n});\n\n// file:src/parsing/samplegroups/tsas.js\nBoxParser.createSampleGroupCtor(\"tsas\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/tscl.js\nBoxParser.createSampleGroupCtor(\"tscl\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/samplegroups/vipr.js\nBoxParser.createSampleGroupCtor(\"vipr\", function(stream) {\n\tLog.warn(\"BoxParser\", \"Sample Group type: \"+this.grouping_type+\" not fully parsed\");\n});\n\n// file:src/parsing/sbgp.js\nBoxParser.createFullBoxCtor(\"sbgp\", \"SampleToGroupBox\", function(stream) {\n\tthis.grouping_type = stream.readString(4);\n\tif (this.version === 1) {\n\t\tthis.grouping_type_parameter = stream.readUint32();\n\t} else {\n\t\tthis.grouping_type_parameter = 0;\n\t}\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tvar entry = {};\n\t\tthis.entries.push(entry);\n\t\tentry.sample_count = stream.readInt32();\n\t\tentry.group_description_index = stream.readInt32();\n\t}\n});\n\n// file:src/parsing/sbpm.js\nfunction Pixel(row, col) {\n\tthis.bad_pixel_row = row;\n\tthis.bad_pixel_column = col;\n}\n\nPixel.prototype.toString = function pixelToString() {\n\treturn \"[row: \" + this.bad_pixel_row + \", column: \" + this.bad_pixel_column + \"]\";\n}\n\nBoxParser.createFullBoxCtor(\"sbpm\", \"SensorBadPixelsMapBox\", function(stream) {\n\tvar i;\n\tthis.component_count = stream.readUint16();\n this.component_index = [];\n for (i = 0; i < this.component_count; i++) {\n this.component_index.push(stream.readUint16());\n }\n\tvar flags = stream.readUint8();\n\tthis.correction_applied = (0x80 == (flags & 0x80));\n\tthis.num_bad_rows = stream.readUint32();\n\tthis.num_bad_cols = stream.readUint32();\n\tthis.num_bad_pixels = stream.readUint32();\n\tthis.bad_rows = [];\n\tthis.bad_columns = [];\n\tthis.bad_pixels = [];\n\tfor (i = 0; i < this.num_bad_rows; i++) {\n\t\tthis.bad_rows.push(stream.readUint32());\n\t}\n\tfor (i = 0; i < this.num_bad_cols; i++) {\n\t\tthis.bad_columns.push(stream.readUint32());\n\t}\n\tfor (i = 0; i < this.num_bad_pixels; i++) {\n\t\tvar row = stream.readUint32();\n\t\tvar col = stream.readUint32();\n\t\tthis.bad_pixels.push(new Pixel(row, col));\n\t}\n});\n\n// file:src/parsing/schm.js\nBoxParser.createFullBoxCtor(\"schm\", \"SchemeTypeBox\", function(stream) {\n\tthis.scheme_type = stream.readString(4);\n\tthis.scheme_version = stream.readUint32();\n\tif (this.flags & 0x000001) {\n\t\tthis.scheme_uri = stream.readString(this.size - this.hdr_size - 8);\n\t}\n});\n\n// file:src/parsing/sdp.js\nBoxParser.createBoxCtor(\"sdp \", \"rtptracksdphintinformation\", function(stream) {\n\tthis.sdptext = stream.readString(this.size - this.hdr_size);\n});\n\n// file:src/parsing/sdtp.js\nBoxParser.createFullBoxCtor(\"sdtp\", \"SampleDependencyTypeBox\", function(stream) {\n\tvar tmp_byte;\n\tvar count = (this.size - this.hdr_size);\n\tthis.is_leading = [];\n\tthis.sample_depends_on = [];\n\tthis.sample_is_depended_on = [];\n\tthis.sample_has_redundancy = [];\n\tfor (var i = 0; i < count; i++) {\n\t\ttmp_byte = stream.readUint8();\n\t\tthis.is_leading[i] = tmp_byte >> 6;\n\t\tthis.sample_depends_on[i] = (tmp_byte >> 4) & 0x3;\n\t\tthis.sample_is_depended_on[i] = (tmp_byte >> 2) & 0x3;\n\t\tthis.sample_has_redundancy[i] = tmp_byte & 0x3;\n\t}\n});\n\n// file:src/parsing/senc.js\n// Cannot be fully parsed because Per_Sample_IV_Size needs to be known\r\nBoxParser.createFullBoxCtor(\"senc\", \"SampleEncryptionBox\" /*, function(stream) {\r\n\tthis.parseFullHeader(stream);\r\n\tvar sample_count = stream.readUint32();\r\n\tthis.samples = [];\r\n\tfor (var i = 0; i < sample_count; i++) {\r\n\t\tvar sample = {};\r\n\t\t// tenc.default_Per_Sample_IV_Size or seig.Per_Sample_IV_Size\r\n\t\tsample.InitializationVector = this.readUint8Array(Per_Sample_IV_Size*8);\r\n\t\tif (this.flags & 0x2) {\r\n\t\t\tsample.subsamples = [];\r\n\t\t\tsubsample_count = stream.readUint16();\r\n\t\t\tfor (var j = 0; j < subsample_count; j++) {\r\n\t\t\t\tvar subsample = {};\r\n\t\t\t\tsubsample.BytesOfClearData = stream.readUint16();\r\n\t\t\t\tsubsample.BytesOfProtectedData = stream.readUint32();\r\n\t\t\t\tsample.subsamples.push(subsample);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// TODO\r\n\t\tthis.samples.push(sample);\r\n\t}\r\n}*/);\r\n// file:src/parsing/sgpd.js\nBoxParser.createFullBoxCtor(\"sgpd\", \"SampleGroupDescriptionBox\", function(stream) {\n\tthis.grouping_type = stream.readString(4);\n\tLog.debug(\"BoxParser\", \"Found Sample Groups of type \"+this.grouping_type);\n\tif (this.version === 1) {\n\t\tthis.default_length = stream.readUint32();\n\t} else {\n\t\tthis.default_length = 0;\n\t}\n\tif (this.version >= 2) {\n\t\tthis.default_group_description_index = stream.readUint32();\n\t}\n\tthis.entries = [];\n\tvar entry_count = stream.readUint32();\n\tfor (var i = 0; i < entry_count; i++) {\n\t\tvar entry;\n\t\tif (BoxParser[this.grouping_type+\"SampleGroupEntry\"]) {\n\t\t\tentry = new BoxParser[this.grouping_type+\"SampleGroupEntry\"](this.grouping_type);\n\t\t} else {\n\t\t\tentry = new BoxParser.SampleGroupEntry(this.grouping_type);\n\t\t}\n\t\tthis.entries.push(entry);\n\t\tif (this.version === 1) {\n\t\t\tif (this.default_length === 0) {\n\t\t\t\tentry.description_length = stream.readUint32();\n\t\t\t} else {\n\t\t\t\tentry.description_length = this.default_length;\n\t\t\t}\n\t\t} else {\n\t\t\tentry.description_length = this.default_length;\n\t\t}\n\t\tif (entry.write === BoxParser.SampleGroupEntry.prototype.write) {\n\t\t\tLog.info(\"BoxParser\", \"SampleGroup for type \"+this.grouping_type+\" writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\t\t// storing data\n\t\t\tentry.data = stream.readUint8Array(entry.description_length);\n\t\t\t// rewinding\n\t\t\tstream.position -= entry.description_length;\n\t\t}\n\t\tentry.parse(stream);\n\t}\n});\n\n// file:src/parsing/sidx.js\nBoxParser.createFullBoxCtor(\"sidx\", \"CompressedSegmentIndexBox\", function(stream) {\n\tthis.reference_ID = stream.readUint32();\n\tthis.timescale = stream.readUint32();\n\tif (this.version === 0) {\n\t\tthis.earliest_presentation_time = stream.readUint32();\n\t\tthis.first_offset = stream.readUint32();\n\t} else {\n\t\tthis.earliest_presentation_time = stream.readUint64();\n\t\tthis.first_offset = stream.readUint64();\n\t}\n\tstream.readUint16();\n\tthis.references = [];\n\tvar count = stream.readUint16();\n\tfor (var i = 0; i < count; i++) {\n\t\tvar ref = {};\n\t\tthis.references.push(ref);\n\t\tvar tmp_32 = stream.readUint32();\n\t\tref.reference_type = (tmp_32 >> 31) & 0x1;\n\t\tref.referenced_size = tmp_32 & 0x7FFFFFFF;\n\t\tref.subsegment_duration = stream.readUint32();\n\t\ttmp_32 = stream.readUint32();\n\t\tref.starts_with_SAP = (tmp_32 >> 31) & 0x1;\n\t\tref.SAP_type = (tmp_32 >> 28) & 0x7;\n\t\tref.SAP_delta_time = tmp_32 & 0xFFFFFFF;\n\t}\n});\n\n// file:src/parsing/singleitemtypereference.js\nBoxParser.SingleItemTypeReferenceBox = function(type, size, hdr_size, start) {\n\tBoxParser.Box.call(this, type, size);\n\tthis.hdr_size = hdr_size;\n\tthis.start = start;\n}\nBoxParser.SingleItemTypeReferenceBox.prototype = new BoxParser.Box();\nBoxParser.SingleItemTypeReferenceBox.prototype.parse = function(stream) {\n\tthis.from_item_ID = stream.readUint16();\n\tvar count = stream.readUint16();\n\tthis.references = [];\n\tfor(var i = 0; i < count; i++) {\n\t\tthis.references[i] = {};\n\t\tthis.references[i].to_item_ID = stream.readUint16();\n\t}\n}\n\n// file:src/parsing/singleitemtypereferencelarge.js\nBoxParser.SingleItemTypeReferenceBoxLarge = function(type, size, hdr_size, start) {\n\tBoxParser.Box.call(this, type, size);\n\tthis.hdr_size = hdr_size;\n\tthis.start = start;\n}\nBoxParser.SingleItemTypeReferenceBoxLarge.prototype = new BoxParser.Box();\nBoxParser.SingleItemTypeReferenceBoxLarge.prototype.parse = function(stream) {\n\tthis.from_item_ID = stream.readUint32();\n\tvar count = stream.readUint16();\n\tthis.references = [];\n\tfor(var i = 0; i < count; i++) {\n\t\tthis.references[i] = {};\n\t\tthis.references[i].to_item_ID = stream.readUint32();\n\t}\n}\n\n// file:src/parsing/SmDm.js\nBoxParser.createFullBoxCtor(\"SmDm\", \"SMPTE2086MasteringDisplayMetadataBox\", function(stream) {\n\tthis.primaryRChromaticity_x = stream.readUint16();\n this.primaryRChromaticity_y = stream.readUint16();\n this.primaryGChromaticity_x = stream.readUint16();\n this.primaryGChromaticity_y = stream.readUint16();\n this.primaryBChromaticity_x = stream.readUint16();\n this.primaryBChromaticity_y = stream.readUint16();\n this.whitePointChromaticity_x = stream.readUint16();\n this.whitePointChromaticity_y = stream.readUint16();\n this.luminanceMax = stream.readUint32();\n this.luminanceMin = stream.readUint32();\n});\n\n// file:src/parsing/smhd.js\nBoxParser.createFullBoxCtor(\"smhd\", \"SoundMediaHeaderBox\", function(stream) {\n\tthis.balance = stream.readUint16();\n\tstream.readUint16();\n});\n\n// file:src/parsing/ssix.js\nBoxParser.createFullBoxCtor(\"ssix\", \"CompressedSubsegmentIndexBox\", function(stream) {\n\tthis.subsegments = [];\n\tvar subsegment_count = stream.readUint32();\n\tfor (var i = 0; i < subsegment_count; i++) {\n\t\tvar subsegment = {};\n\t\tthis.subsegments.push(subsegment);\n\t\tsubsegment.ranges = [];\n\t\tvar range_count = stream.readUint32();\n\t\tfor (var j = 0; j < range_count; j++) {\n\t\t\tvar range = {};\n\t\t\tsubsegment.ranges.push(range);\n\t\t\trange.level = stream.readUint8();\n\t\t\trange.range_size = stream.readUint24();\n\t\t}\n\t}\n});\n\n// file:src/parsing/stco.js\nBoxParser.createFullBoxCtor(\"stco\", \"ChunkOffsetBox\", function(stream) {\n\tvar entry_count;\n\tentry_count = stream.readUint32();\n\tthis.chunk_offsets = [];\n\tif (this.version === 0) {\n\t\tfor (var i = 0; i < entry_count; i++) {\n\t\t\tthis.chunk_offsets.push(stream.readUint32());\n\t\t}\n\t}\n});\n\n// file:src/parsing/stdp.js\nBoxParser.createFullBoxCtor(\"stdp\", \"DegradationPriorityBox\", function(stream) {\n\tvar count = (this.size - this.hdr_size)/2;\n\tthis.priority = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.priority[i] = stream.readUint16();\n\t}\n});\n\n// file:src/parsing/sthd.js\nBoxParser.createFullBoxCtor(\"sthd\", \"SubtitleMediaHeaderBox\");\n\n// file:src/parsing/stri.js\nBoxParser.createFullBoxCtor(\"stri\", \"SubTrackInformationBox\", function(stream) {\n\tthis.switch_group = stream.readUint16();\n\tthis.alternate_group = stream.readUint16();\n\tthis.sub_track_id = stream.readUint32();\n\tvar count = (this.size - this.hdr_size - 8)/4;\n\tthis.attribute_list = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.attribute_list[i] = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/stsc.js\nBoxParser.createFullBoxCtor(\"stsc\", \"SampleToChunkBox\", function(stream) {\n\tvar entry_count;\n\tvar i;\n\tentry_count = stream.readUint32();\n\tthis.first_chunk = [];\n\tthis.samples_per_chunk = [];\n\tthis.sample_description_index = [];\n\tif (this.version === 0) {\n\t\tfor(i=0; i> 4) & 0xF;\n\t\t\t\tthis.sample_sizes[i+1] = tmp & 0xF;\n\t\t\t}\n\t\t} else if (this.field_size === 8) {\n\t\t\tfor (i = 0; i < sample_count; i++) {\n\t\t\t\tthis.sample_sizes[i] = stream.readUint8();\n\t\t\t}\n\t\t} else if (this.field_size === 16) {\n\t\t\tfor (i = 0; i < sample_count; i++) {\n\t\t\t\tthis.sample_sizes[i] = stream.readUint16();\n\t\t\t}\n\t\t} else {\n\t\t\tLog.error(\"BoxParser\", \"Error in length field in stz2 box\");\n\t\t}\n\t}\n});\n\n// file:src/parsing/subs.js\nBoxParser.createFullBoxCtor(\"subs\", \"SubSampleInformationBox\", function(stream) {\n\tvar i,j;\n\tvar entry_count;\n\tvar subsample_count;\n\tentry_count = stream.readUint32();\n\tthis.entries = [];\n\tfor (i = 0; i < entry_count; i++) {\n\t\tvar sampleInfo = {};\n\t\tthis.entries[i] = sampleInfo;\n\t\tsampleInfo.sample_delta = stream.readUint32();\n\t\tsampleInfo.subsamples = [];\n\t\tsubsample_count = stream.readUint16();\n\t\tif (subsample_count>0) {\n\t\t\tfor (j = 0; j < subsample_count; j++) {\n\t\t\t\tvar subsample = {};\n\t\t\t\tsampleInfo.subsamples.push(subsample);\n\t\t\t\tif (this.version == 1) {\n\t\t\t\t\tsubsample.size = stream.readUint32();\n\t\t\t\t} else {\n\t\t\t\t\tsubsample.size = stream.readUint16();\n\t\t\t\t}\n\t\t\t\tsubsample.priority = stream.readUint8();\n\t\t\t\tsubsample.discardable = stream.readUint8();\n\t\t\t\tsubsample.codec_specific_parameters = stream.readUint32();\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/tenc.js\nBoxParser.createFullBoxCtor(\"tenc\", \"TrackEncryptionBox\", function(stream) {\n\tstream.readUint8(); // reserved\n\tif (this.version === 0) {\n\t\tstream.readUint8();\n\t} else {\n\t\tvar tmp = stream.readUint8();\n\t\tthis.default_crypt_byte_block = (tmp >> 4) & 0xF;\n\t\tthis.default_skip_byte_block = tmp & 0xF;\n\t}\n\tthis.default_isProtected = stream.readUint8();\n\tthis.default_Per_Sample_IV_Size = stream.readUint8();\n\tthis.default_KID = BoxParser.parseHex16(stream);\n\tif (this.default_isProtected === 1 && this.default_Per_Sample_IV_Size === 0) {\n\t\tthis.default_constant_IV_size = stream.readUint8();\n\t\tthis.default_constant_IV = stream.readUint8Array(this.default_constant_IV_size);\n\t}\n});// file:src/parsing/tfdt.js\nBoxParser.createFullBoxCtor(\"tfdt\", \"TrackFragmentBaseMediaDecodeTimeBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.baseMediaDecodeTime = stream.readUint64();\n\t} else {\n\t\tthis.baseMediaDecodeTime = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/tfhd.js\nBoxParser.createFullBoxCtor(\"tfhd\", \"TrackFragmentHeaderBox\", function(stream) {\n\tvar readBytes = 0;\n\tthis.track_id = stream.readUint32();\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET)) {\n\t\tthis.base_data_offset = stream.readUint64();\n\t\treadBytes += 8;\n\t} else {\n\t\tthis.base_data_offset = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC)) {\n\t\tthis.default_sample_description_index = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_description_index = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR)) {\n\t\tthis.default_sample_duration = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_duration = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE)) {\n\t\tthis.default_sample_size = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_size = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS)) {\n\t\tthis.default_sample_flags = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.default_sample_flags = 0;\n\t}\n});\n\n// file:src/parsing/tfra.js\nBoxParser.createFullBoxCtor(\"tfra\", \"TrackFragmentRandomAccessBox\", function(stream) {\n\tthis.track_ID = stream.readUint32();\n\tstream.readUint24();\n\tvar tmp_byte = stream.readUint8();\n\tthis.length_size_of_traf_num = (tmp_byte >> 4) & 0x3;\n\tthis.length_size_of_trun_num = (tmp_byte >> 2) & 0x3;\n\tthis.length_size_of_sample_num = (tmp_byte) & 0x3;\n\tthis.entries = [];\n\tvar number_of_entries = stream.readUint32();\n\tfor (var i = 0; i < number_of_entries; i++) {\n\t\tif (this.version === 1) {\n\t\t\tthis.time = stream.readUint64();\n\t\t\tthis.moof_offset = stream.readUint64();\n\t\t} else {\n\t\t\tthis.time = stream.readUint32();\n\t\t\tthis.moof_offset = stream.readUint32();\n\t\t}\n\t\tthis.traf_number = stream[\"readUint\"+(8*(this.length_size_of_traf_num+1))]();\n\t\tthis.trun_number = stream[\"readUint\"+(8*(this.length_size_of_trun_num+1))]();\n\t\tthis.sample_number = stream[\"readUint\"+(8*(this.length_size_of_sample_num+1))]();\n\t}\n});\n\n// file:src/parsing/tkhd.js\nBoxParser.createFullBoxCtor(\"tkhd\", \"TrackHeaderBox\", function(stream) {\n\tif (this.version == 1) {\n\t\tthis.creation_time = stream.readUint64();\n\t\tthis.modification_time = stream.readUint64();\n\t\tthis.track_id = stream.readUint32();\n\t\tstream.readUint32();\n\t\tthis.duration = stream.readUint64();\n\t} else {\n\t\tthis.creation_time = stream.readUint32();\n\t\tthis.modification_time = stream.readUint32();\n\t\tthis.track_id = stream.readUint32();\n\t\tstream.readUint32();\n\t\tthis.duration = stream.readUint32();\n\t}\n\tstream.readUint32Array(2);\n\tthis.layer = stream.readInt16();\n\tthis.alternate_group = stream.readInt16();\n\tthis.volume = stream.readInt16()>>8;\n\tstream.readUint16();\n\tthis.matrix = stream.readInt32Array(9);\n\tthis.width = stream.readUint32();\n\tthis.height = stream.readUint32();\n});\n\n// file:src/parsing/tmax.js\nBoxParser.createBoxCtor(\"tmax\", \"hintmaxrelativetime\", function(stream) {\n\tthis.time = stream.readUint32();\n});\n\n// file:src/parsing/tmin.js\nBoxParser.createBoxCtor(\"tmin\", \"hintminrelativetime\", function(stream) {\n\tthis.time = stream.readUint32();\n});\n\n// file:src/parsing/totl.js\nBoxParser.createBoxCtor(\"totl\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint32();\n});\n\n// file:src/parsing/tpay.js\nBoxParser.createBoxCtor(\"tpay\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint32();\n});\n\n// file:src/parsing/tpyl.js\nBoxParser.createBoxCtor(\"tpyl\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/TrackGroup.js\nBoxParser.TrackGroupTypeBox.prototype.parse = function(stream) {\n\tthis.parseFullHeader(stream);\n\tthis.track_group_id = stream.readUint32();\n}\n\n// file:src/parsing/trackgroups/msrc.js\nBoxParser.createTrackGroupCtor(\"msrc\");// file:src/parsing/TrakReference.js\nBoxParser.TrackReferenceTypeBox = function(type, size, hdr_size, start) {\n\tBoxParser.Box.call(this, type, size);\n\tthis.hdr_size = hdr_size;\n\tthis.start = start;\n}\nBoxParser.TrackReferenceTypeBox.prototype = new BoxParser.Box();\nBoxParser.TrackReferenceTypeBox.prototype.parse = function(stream) {\n\tthis.track_ids = stream.readUint32Array((this.size-this.hdr_size)/4);\n}\n\n// file:src/parsing/tref.js\nBoxParser.trefBox.prototype.parse = function(stream) {\n\tvar ret;\n\tvar box;\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, true, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = new BoxParser.TrackReferenceTypeBox(ret.type, ret.size, ret.hdr_size, ret.start);\n\t\t\tif (box.write === BoxParser.Box.prototype.write && box.type !== \"mdat\") {\n\t\t\t\tLog.info(\"BoxParser\", \"TrackReference \"+box.type+\" box writing not yet implemented, keeping unparsed data in memory for later write\");\n\t\t\t\tbox.parseDataAndRewind(stream);\n\t\t\t}\n\t\t\tbox.parse(stream);\n\t\t\tthis.boxes.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n// file:src/parsing/trep.js\nBoxParser.createFullBoxCtor(\"trep\", \"TrackExtensionPropertiesBox\", function(stream) {\n\tthis.track_ID = stream.readUint32();\n\tthis.boxes = [];\n\twhile (stream.getPosition() < this.start+this.size) {\n\t\tret = BoxParser.parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n\t\tif (ret.code === BoxParser.OK) {\n\t\t\tbox = ret.box;\n\t\t\tthis.boxes.push(box);\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n});\n\n// file:src/parsing/trex.js\nBoxParser.createFullBoxCtor(\"trex\", \"TrackExtendsBox\", function(stream) {\n\tthis.track_id = stream.readUint32();\n\tthis.default_sample_description_index = stream.readUint32();\n\tthis.default_sample_duration = stream.readUint32();\n\tthis.default_sample_size = stream.readUint32();\n\tthis.default_sample_flags = stream.readUint32();\n});\n\n// file:src/parsing/trpy.js\nBoxParser.createBoxCtor(\"trpy\", \"hintBytesSent\", function(stream) {\n\tthis.bytessent = stream.readUint64();\n});\n\n// file:src/parsing/trun.js\nBoxParser.createFullBoxCtor(\"trun\", \"TrackRunBox\", function(stream) {\n\tvar readBytes = 0;\n\tthis.sample_count = stream.readUint32();\n\treadBytes+= 4;\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) ) {\n\t\tthis.data_offset = stream.readInt32(); //signed\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.data_offset = 0;\n\t}\n\tif (this.size - this.hdr_size > readBytes && (this.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG) ) {\n\t\tthis.first_sample_flags = stream.readUint32();\n\t\treadBytes += 4;\n\t} else {\n\t\tthis.first_sample_flags = 0;\n\t}\n\tthis.sample_duration = [];\n\tthis.sample_size = [];\n\tthis.sample_flags = [];\n\tthis.sample_composition_time_offset = [];\n\tif (this.size - this.hdr_size > readBytes) {\n\t\tfor (var i = 0; i < this.sample_count; i++) {\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\t\t\tthis.sample_duration[i] = stream.readUint32();\n\t\t\t}\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\t\t\tthis.sample_size[i] = stream.readUint32();\n\t\t\t}\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\t\t\tthis.sample_flags[i] = stream.readUint32();\n\t\t\t}\n\t\t\tif (this.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\t\t\tif (this.version === 0) {\n\t\t\t\t\tthis.sample_composition_time_offset[i] = stream.readUint32();\n\t\t\t\t} else {\n\t\t\t\t\tthis.sample_composition_time_offset[i] = stream.readInt32(); //signed\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// file:src/parsing/tsel.js\nBoxParser.createFullBoxCtor(\"tsel\", \"TrackSelectionBox\", function(stream) {\n\tthis.switch_group = stream.readUint32();\n\tvar count = (this.size - this.hdr_size - 4)/4;\n\tthis.attribute_list = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.attribute_list[i] = stream.readUint32();\n\t}\n});\n\n// file:src/parsing/txtC.js\nBoxParser.createFullBoxCtor(\"txtC\", \"TextConfigBox\", function(stream) {\n\tthis.config = stream.readCString();\n});\n\n// file:src/parsing/tyco.js\nBoxParser.createBoxCtor(\"tyco\", \"TypeCombinationBox\", function(stream) {\n\tvar count = (this.size - this.hdr_size) / 4;\n\tthis.compatible_brands = [];\n\tfor (var i = 0; i < count; i++) {\n\t\tthis.compatible_brands[i] = stream.readString(4);\n\t}\n});\n\n// file:src/parsing/udes.js\nBoxParser.createFullBoxCtor(\"udes\", \"UserDescriptionProperty\", function(stream) {\n\tthis.lang = stream.readCString();\n\tthis.name = stream.readCString();\n\tthis.description = stream.readCString();\n\tthis.tags = stream.readCString();\n});\n\n// file:src/parsing/uncC.js\nBoxParser.createFullBoxCtor(\"uncC\", \"UncompressedFrameConfigBox\", function(stream) {\n var i;\n this.profile = stream.readString(4);\n if (this.version == 1) {\n // Nothing - just the profile\n } else if (this.version == 0) {\n this.component_count = stream.readUint32();\n this.component_index = [];\n this.component_bit_depth_minus_one = [];\n this.component_format = [];\n this.component_align_size = [];\n for (i = 0; i < this.component_count; i++) {\n this.component_index.push(stream.readUint16());\n this.component_bit_depth_minus_one.push(stream.readUint8());\n this.component_format.push(stream.readUint8());\n this.component_align_size.push(stream.readUint8());\n }\n this.sampling_type = stream.readUint8();\n this.interleave_type = stream.readUint8();\n this.block_size = stream.readUint8();\n var flags = stream.readUint8();\n this.component_little_endian = (flags >> 7) & 0x1;\n this.block_pad_lsb = (flags >> 6) & 0x1;\n this.block_little_endian = (flags >> 5) & 0x1;\n this.block_reversed = (flags >> 4) & 0x1;\n this.pad_unknown = (flags >> 3) & 0x1;\n this.pixel_size = stream.readUint32();\n this.row_align_size = stream.readUint32();\n this.tile_align_size = stream.readUint32();\n this.num_tile_cols_minus_one = stream.readUint32();\n this.num_tile_rows_minus_one = stream.readUint32();\n }\n});\n\n// file:src/parsing/url.js\nBoxParser.createFullBoxCtor(\"url \", \"DataEntryUrlBox\", function(stream) {\n\tif (this.flags !== 0x000001) {\n\t\tthis.location = stream.readCString();\n\t}\n});\n\n// file:src/parsing/urn.js\nBoxParser.createFullBoxCtor(\"urn \", \"DataEntryUrnBox\", function(stream) {\n\tthis.name = stream.readCString();\n\tif (this.size - this.hdr_size - this.name.length - 1 > 0) {\n\t\tthis.location = stream.readCString();\n\t}\n});\n\n// file:src/parsing/uuid/piff/piffLsm.js\nBoxParser.createUUIDBox(\"a5d40b30e81411ddba2f0800200c9a66\", \"LiveServerManifestBox\", true, false, function(stream) {\n this.LiveServerManifest = stream.readString(this.size - this.hdr_size)\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n});// file:src/parsing/uuid/piff/piffPssh.js\nBoxParser.createUUIDBox(\"d08a4f1810f34a82b6c832d8aba183d3\", \"PiffProtectionSystemSpecificHeaderBox\", true, false, function(stream) {\n\tthis.system_id = BoxParser.parseHex16(stream);\n\tvar datasize = stream.readUint32();\n\tif (datasize > 0) {\n\t\tthis.data = stream.readUint8Array(datasize);\n\t}\n});\n\n// file:src/parsing/uuid/piff/piffSenc.js\nBoxParser.createUUIDBox(\"a2394f525a9b4f14a2446c427c648df4\", \"PiffSampleEncryptionBox\", true, false /*, function(stream) {\n\tif (this.flags & 0x1) {\n\t\tthis.AlgorithmID = stream.readUint24();\n\t\tthis.IV_size = stream.readUint8();\n\t\tthis.KID = BoxParser.parseHex16(stream);\n\t}\n\tvar sample_count = stream.readUint32();\n\tthis.samples = [];\n\tfor (var i = 0; i < sample_count; i++) {\n\t\tvar sample = {};\n\t\tsample.InitializationVector = this.readUint8Array(this.IV_size*8);\n\t\tif (this.flags & 0x2) {\n\t\t\tsample.subsamples = [];\n\t\t\tsample.NumberOfEntries = stream.readUint16();\n\t\t\tfor (var j = 0; j < sample.NumberOfEntries; j++) {\n\t\t\t\tvar subsample = {};\n\t\t\t\tsubsample.BytesOfClearData = stream.readUint16();\n\t\t\t\tsubsample.BytesOfProtectedData = stream.readUint32();\n\t\t\t\tsample.subsamples.push(subsample);\n\t\t\t}\n\t\t}\n\t\tthis.samples.push(sample);\n\t}\n}*/);\n// file:src/parsing/uuid/piff/piffTenc.js\nBoxParser.createUUIDBox(\"8974dbce7be74c5184f97148f9882554\", \"PiffTrackEncryptionBox\", true, false, function(stream) {\n\tthis.default_AlgorithmID = stream.readUint24();\n\tthis.default_IV_size = stream.readUint8();\n\tthis.default_KID = BoxParser.parseHex16(stream);\n});// file:src/parsing/uuid/piff/piffTfrf.js\nBoxParser.createUUIDBox(\"d4807ef2ca3946958e5426cb9e46a79f\", \"TfrfBox\", true, false, function(stream) {\n this.fragment_count = stream.readUint8();\n this.entries = [];\n\n for (var i = 0; i < this.fragment_count; i++) {\n var entry = {};\n var absolute_time = 0;\n var absolute_duration = 0;\n\n if (this.version === 1) {\n absolute_time = stream.readUint64();\n absolute_duration = stream.readUint64();\n } else {\n absolute_time = stream.readUint32();\n absolute_duration = stream.readUint32();\n }\n\n entry.absolute_time = absolute_time;\n entry.absolute_duration = absolute_duration;\n\n this.entries.push(entry);\n }\n});// file:src/parsing/uuid/piff/piffTfxd.js\nBoxParser.createUUIDBox(\"6d1d9b0542d544e680e2141daff757b2\", \"TfxdBox\", true, false, function(stream) {\n if (this.version === 1) {\n this.absolute_time = stream.readUint64();\n this.duration = stream.readUint64();\n } else {\n this.absolute_time = stream.readUint32();\n this.duration = stream.readUint32();\n }\n});// file:src/parsing/vmhd.js\nBoxParser.createFullBoxCtor(\"vmhd\", \"VideoMediaHeaderBox\", function(stream) {\n\tthis.graphicsmode = stream.readUint16();\n\tthis.opcolor = stream.readUint16Array(3);\n});\n\n// file:src/parsing/vpcC.js\nBoxParser.createFullBoxCtor(\"vpcC\", \"VPCodecConfigurationRecord\", function (stream) {\n\tvar tmp;\n\tif (this.version === 1) {\n\t\tthis.profile = stream.readUint8();\n\t\tthis.level = stream.readUint8();\n\t\ttmp = stream.readUint8();\n\t\tthis.bitDepth = tmp >> 4;\n\t\tthis.chromaSubsampling = (tmp >> 1) & 0x7;\n\t\tthis.videoFullRangeFlag = tmp & 0x1;\n\t\tthis.colourPrimaries = stream.readUint8();\n\t\tthis.transferCharacteristics = stream.readUint8();\n\t\tthis.matrixCoefficients = stream.readUint8();\n\t\tthis.codecIntializationDataSize = stream.readUint16();\n\t\tthis.codecIntializationData = stream.readUint8Array(this.codecIntializationDataSize);\n\t} else {\n\t\tthis.profile = stream.readUint8();\n\t\tthis.level = stream.readUint8();\n\t\ttmp = stream.readUint8();\n\t\tthis.bitDepth = (tmp >> 4) & 0xF;\n\t\tthis.colorSpace = tmp & 0xF;\n\t\ttmp = stream.readUint8();\n\t\tthis.chromaSubsampling = (tmp >> 4) & 0xF;\n\t\tthis.transferFunction = (tmp >> 1) & 0x7;\n\t\tthis.videoFullRangeFlag = tmp & 0x1;\n\t\tthis.codecIntializationDataSize = stream.readUint16();\n\t\tthis.codecIntializationData = stream.readUint8Array(this.codecIntializationDataSize);\n\t}\n});// file:src/parsing/vttC.js\nBoxParser.createBoxCtor(\"vttC\", \"WebVTTConfigurationBox\", function(stream) {\n\tthis.text = stream.readString(this.size - this.hdr_size);\n});\n\n// file:src/parsing/vvcC.js\nBoxParser.createFullBoxCtor(\"vvcC\", \"VvcConfigurationBox\", function (stream) {\n var i, j;\n\n // helper object to simplify extracting individual bits\n var bitReader = {\n held_bits: undefined,\n num_held_bits: 0,\n\n stream_read_1_bytes: function (strm) {\n this.held_bits = strm.readUint8();\n this.num_held_bits = 1 * 8;\n },\n stream_read_2_bytes: function (strm) {\n this.held_bits = strm.readUint16();\n this.num_held_bits = 2 * 8;\n },\n\n extract_bits: function (num_bits) {\n var ret = (this.held_bits >> (this.num_held_bits - num_bits)) & ((1 << num_bits) - 1);\n this.num_held_bits -= num_bits;\n return ret;\n }\n };\n\n // VvcDecoderConfigurationRecord\n bitReader.stream_read_1_bytes(stream);\n bitReader.extract_bits(5); // reserved\n this.lengthSizeMinusOne = bitReader.extract_bits(2);\n this.ptl_present_flag = bitReader.extract_bits(1);\n\n if (this.ptl_present_flag) {\n bitReader.stream_read_2_bytes(stream);\n this.ols_idx = bitReader.extract_bits(9);\n this.num_sublayers = bitReader.extract_bits(3);\n this.constant_frame_rate = bitReader.extract_bits(2);\n this.chroma_format_idc = bitReader.extract_bits(2);\n\n bitReader.stream_read_1_bytes(stream);\n this.bit_depth_minus8 = bitReader.extract_bits(3);\n bitReader.extract_bits(5); // reserved\n\n // VvcPTLRecord\n {\n bitReader.stream_read_2_bytes(stream);\n bitReader.extract_bits(2); // reserved\n this.num_bytes_constraint_info = bitReader.extract_bits(6);\n this.general_profile_idc = bitReader.extract_bits(7);\n this.general_tier_flag = bitReader.extract_bits(1);\n\n this.general_level_idc = stream.readUint8();\n\n bitReader.stream_read_1_bytes(stream);\n this.ptl_frame_only_constraint_flag = bitReader.extract_bits(1);\n this.ptl_multilayer_enabled_flag = bitReader.extract_bits(1);\n\n this.general_constraint_info = new Uint8Array(this.num_bytes_constraint_info);\n if (this.num_bytes_constraint_info) {\n for (i = 0; i < this.num_bytes_constraint_info - 1; i++) {\n var cnstr1 = bitReader.extract_bits(6);\n bitReader.stream_read_1_bytes(stream);\n var cnstr2 = bitReader.extract_bits(2);\n\n this.general_constraint_info[i] = ((cnstr1 << 2) | cnstr2);\n }\n this.general_constraint_info[this.num_bytes_constraint_info - 1] = bitReader.extract_bits(6);\n } else {\n //forbidden in spec!\n bitReader.extract_bits(6);\n }\n\n if (this.num_sublayers > 1) {\n bitReader.stream_read_1_bytes(stream);\n this.ptl_sublayer_present_mask = 0;\n for (j = this.num_sublayers - 2; j >= 0; --j) {\n var val = bitReader.extract_bits(1);\n this.ptl_sublayer_present_mask |= val << j;\n }\n for (j = this.num_sublayers; j <= 8 && this.num_sublayers > 1; ++j) {\n bitReader.extract_bits(1); // ptl_reserved_zero_bit\n }\n\n this.sublayer_level_idc = [];\n for (j = this.num_sublayers - 2; j >= 0; --j) {\n if (this.ptl_sublayer_present_mask & (1 << j)) {\n this.sublayer_level_idc[j] = stream.readUint8();\n }\n }\n }\n\n this.ptl_num_sub_profiles = stream.readUint8();\n this.general_sub_profile_idc = [];\n if (this.ptl_num_sub_profiles) {\n for (i = 0; i < this.ptl_num_sub_profiles; i++) {\n this.general_sub_profile_idc.push(stream.readUint32());\n }\n }\n } // end VvcPTLRecord\n\n this.max_picture_width = stream.readUint16();\n this.max_picture_height = stream.readUint16();\n this.avg_frame_rate = stream.readUint16();\n }\n\n var VVC_NALU_OPI = 12;\n var VVC_NALU_DEC_PARAM = 13;\n\n this.nalu_arrays = [];\n var num_of_arrays = stream.readUint8();\n for (i = 0; i < num_of_arrays; i++) {\n var nalu_array = [];\n this.nalu_arrays.push(nalu_array);\n\n bitReader.stream_read_1_bytes(stream);\n nalu_array.completeness = bitReader.extract_bits(1);\n bitReader.extract_bits(2); // reserved\n nalu_array.nalu_type = bitReader.extract_bits(5);\n\n var numNalus = 1;\n if (nalu_array.nalu_type != VVC_NALU_DEC_PARAM && nalu_array.nalu_type != VVC_NALU_OPI) {\n numNalus = stream.readUint16();\n }\n\n for (j = 0; j < numNalus; j++) {\n var len = stream.readUint16();\n nalu_array.push({\n data: stream.readUint8Array(len),\n length: len\n });\n }\n }\n});\n// file:src/parsing/vvnC.js\nBoxParser.createFullBoxCtor(\"vvnC\", \"VvcNALUConfigBox\", function (stream) {\n // VvcNALUConfigBox\n var tmp = strm.readUint8();\n this.lengthSizeMinusOne = (tmp & 0x3);\n});\n// file:src/box-codecs.js\nBoxParser.SampleEntry.prototype.isVideo = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isAudio = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isSubtitle = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isMetadata = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.isHint = function() {\n\treturn false;\n}\n\nBoxParser.SampleEntry.prototype.getCodec = function() {\n\treturn this.type.replace('.','');\n}\n\nBoxParser.SampleEntry.prototype.getWidth = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getHeight = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getChannelCount = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getSampleRate = function() {\n\treturn \"\";\n}\n\nBoxParser.SampleEntry.prototype.getSampleSize = function() {\n\treturn \"\";\n}\n\nBoxParser.VisualSampleEntry.prototype.isVideo = function() {\n\treturn true;\n}\n\nBoxParser.VisualSampleEntry.prototype.getWidth = function() {\n\treturn this.width;\n}\n\nBoxParser.VisualSampleEntry.prototype.getHeight = function() {\n\treturn this.height;\n}\n\nBoxParser.AudioSampleEntry.prototype.isAudio = function() {\n\treturn true;\n}\n\nBoxParser.AudioSampleEntry.prototype.getChannelCount = function() {\n\treturn this.channel_count;\n}\n\nBoxParser.AudioSampleEntry.prototype.getSampleRate = function() {\n\treturn this.samplerate;\n}\n\nBoxParser.AudioSampleEntry.prototype.getSampleSize = function() {\n\treturn this.samplesize;\n}\n\nBoxParser.SubtitleSampleEntry.prototype.isSubtitle = function() {\n\treturn true;\n}\n\nBoxParser.MetadataSampleEntry.prototype.isMetadata = function() {\n\treturn true;\n}\n\n\nBoxParser.decimalToHex = function(d, padding) {\n\tvar hex = Number(d).toString(16);\n\tpadding = typeof (padding) === \"undefined\" || padding === null ? padding = 2 : padding;\n\twhile (hex.length < padding) {\n\t\thex = \"0\" + hex;\n\t}\n\treturn hex;\n}\n\nBoxParser.avc1SampleEntry.prototype.getCodec =\nBoxParser.avc2SampleEntry.prototype.getCodec =\nBoxParser.avc3SampleEntry.prototype.getCodec =\nBoxParser.avc4SampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.avcC) {\n\t\treturn baseCodec+\".\"+BoxParser.decimalToHex(this.avcC.AVCProfileIndication)+\n\t\t\t\t\t\t \"\"+BoxParser.decimalToHex(this.avcC.profile_compatibility)+\n\t\t\t\t\t\t \"\"+BoxParser.decimalToHex(this.avcC.AVCLevelIndication);\n\t} else {\n\t\treturn baseCodec;\n\t}\n}\n\nBoxParser.hev1SampleEntry.prototype.getCodec =\nBoxParser.hvc1SampleEntry.prototype.getCodec = function() {\n\tvar i;\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.hvcC) {\n\t\tbaseCodec += '.';\n\t\tswitch (this.hvcC.general_profile_space) {\n\t\t\tcase 0:\n\t\t\t\tbaseCodec += '';\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tbaseCodec += 'A';\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tbaseCodec += 'B';\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tbaseCodec += 'C';\n\t\t\t\tbreak;\n\t\t}\n\t\tbaseCodec += this.hvcC.general_profile_idc;\n\t\tbaseCodec += '.';\n\t\tvar val = this.hvcC.general_profile_compatibility;\n\t\tvar reversed = 0;\n\t\tfor (i=0; i<32; i++) {\n\t\t\treversed |= val & 1;\n\t\t\tif (i==31) break;\n\t\t\treversed <<= 1;\n\t\t\tval >>=1;\n\t\t}\n\t\tbaseCodec += BoxParser.decimalToHex(reversed, 0);\n\t\tbaseCodec += '.';\n\t\tif (this.hvcC.general_tier_flag === 0) {\n\t\t\tbaseCodec += 'L';\n\t\t} else {\n\t\t\tbaseCodec += 'H';\n\t\t}\n\t\tbaseCodec += this.hvcC.general_level_idc;\n\t\tvar hasByte = false;\n\t\tvar constraint_string = \"\";\n\t\tfor (i = 5; i >= 0; i--) {\n\t\t\tif (this.hvcC.general_constraint_indicator[i] || hasByte) {\n\t\t\t\tconstraint_string = \".\"+BoxParser.decimalToHex(this.hvcC.general_constraint_indicator[i], 0)+constraint_string;\n\t\t\t\thasByte = true;\n\t\t\t}\n\t\t}\n\t\tbaseCodec += constraint_string;\n\t}\n\treturn baseCodec;\n}\n\nBoxParser.vvc1SampleEntry.prototype.getCodec =\nBoxParser.vvi1SampleEntry.prototype.getCodec = function () {\n\tvar i;\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.vvcC) {\n\t\tbaseCodec += '.' + this.vvcC.general_profile_idc;\n\t\tif (this.vvcC.general_tier_flag) {\n\t\t\tbaseCodec += '.H';\n\t\t} else {\n\t\t\tbaseCodec += '.L';\n\t\t}\n\t\tbaseCodec += this.vvcC.general_level_idc;\n\n\t\tvar constraint_string = \"\";\n\t\tif (this.vvcC.general_constraint_info) {\n\t\t\tvar bytes = [];\n\t\t\tvar byte = 0;\n\t\t\tbyte |= this.vvcC.ptl_frame_only_constraint << 7;\n\t\t\tbyte |= this.vvcC.ptl_multilayer_enabled << 6;\n\t\t\tvar last_nonzero;\n\t\t\tfor (i = 0; i < this.vvcC.general_constraint_info.length; ++i) {\n\t\t\t\tbyte |= (this.vvcC.general_constraint_info[i] >> 2) & 0x3f;\n\t\t\t\tbytes.push(byte);\n\t\t\t\tif (byte) {\n\t\t\t\t\tlast_nonzero = i;\n\t\t\t\t}\n\n\t\t\t\tbyte = (this.vvcC.general_constraint_info[i] >> 2) & 0x03;\n\t\t\t}\n\n\t\t\tif (last_nonzero === undefined) {\n\t\t\t\tconstraint_string = \".CA\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconstraint_string = \".C\"\n\t\t\t\tvar base32_chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\";\n\t\t\t\tvar held_bits = 0;\n\t\t\t\tvar num_held_bits = 0;\n\t\t\t\tfor (i = 0; i <= last_nonzero; ++i) {\n\t\t\t\t\theld_bits = (held_bits << 8) | bytes[i];\n\t\t\t\t\tnum_held_bits += 8;\n\n\t\t\t\t\twhile (num_held_bits >= 5) {\n\t\t\t\t\t\tvar val = (held_bits >> (num_held_bits - 5)) & 0x1f;\n\t\t\t\t\t\tconstraint_string += base32_chars[val];\n\n\t\t\t\t\t\tnum_held_bits -= 5;\n\t\t\t\t\t\theld_bits &= (1 << num_held_bits) - 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (num_held_bits) {\n\t\t\t\t\theld_bits <<= (5 - num_held_bits); // right-pad with zeros to 5 bits (is this correct?)\n\t\t\t\t\tconstraint_string += base32_chars[held_bits & 0x1f];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbaseCodec += constraint_string;\n\t}\n\treturn baseCodec;\n}\n\nBoxParser.mp4aSampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif (this.esds && this.esds.esd) {\n\t\tvar oti = this.esds.esd.getOTI();\n\t\tvar dsi = this.esds.esd.getAudioConfig();\n\t\treturn baseCodec+\".\"+BoxParser.decimalToHex(oti)+(dsi ? \".\"+dsi: \"\");\n\t} else {\n\t\treturn baseCodec;\n\t}\n}\n\nBoxParser.stxtSampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tif(this.mime_format) {\n\t\treturn baseCodec + \".\" + this.mime_format;\n\t} else {\n\t\treturn baseCodec\n\t}\n}\n\nBoxParser.vp08SampleEntry.prototype.getCodec =\nBoxParser.vp09SampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tvar level = this.vpcC.level;\n\tif (level == 0) {\n\t\tlevel = \"00\";\n\t}\n\tvar bitDepth = this.vpcC.bitDepth;\n\tif (bitDepth == 8) {\n\t\tbitDepth = \"08\";\n\t}\n\treturn baseCodec + \".0\" + this.vpcC.profile + \".\" + level + \".\" + bitDepth;\n}\n\nBoxParser.av01SampleEntry.prototype.getCodec = function() {\n\tvar baseCodec = BoxParser.SampleEntry.prototype.getCodec.call(this);\n\tvar level = this.av1C.seq_level_idx_0;\n\tif (level < 10) {\n\t\tlevel = \"0\" + level;\n\t}\n\tvar bitdepth;\n\tif (this.av1C.seq_profile === 2 && this.av1C.high_bitdepth === 1) {\n\t\tbitdepth = (this.av1C.twelve_bit === 1) ? \"12\" : \"10\";\n\t} else if ( this.av1C.seq_profile <= 2 ) {\n\t\tbitdepth = (this.av1C.high_bitdepth === 1) ? \"10\" : \"08\";\n\t}\n\t// TODO need to parse the SH to find color config\n\treturn baseCodec+\".\"+this.av1C.seq_profile+\".\"+level+(this.av1C.seq_tier_0?\"H\":\"M\")+\".\"+bitdepth;//+\".\"+this.av1C.monochrome+\".\"+this.av1C.chroma_subsampling_x+\"\"+this.av1C.chroma_subsampling_y+\"\"+this.av1C.chroma_sample_position;\n}\n// file:src/box-write.js\n/* \n * Copyright (c) Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nBoxParser.Box.prototype.writeHeader = function(stream, msg) {\n\tthis.size += 8;\n\tif (this.size > MAX_SIZE) {\n\t\tthis.size += 8;\n\t}\n\tif (this.type === \"uuid\") {\n\t\tthis.size += 16;\n\t}\n\tLog.debug(\"BoxWriter\", \"Writing box \"+this.type+\" of size: \"+this.size+\" at position \"+stream.getPosition()+(msg || \"\"));\n\tif (this.size > MAX_SIZE) {\n\t\tstream.writeUint32(1);\n\t} else {\n\t\tthis.sizePosition = stream.getPosition();\n\t\tstream.writeUint32(this.size);\n\t}\n\tstream.writeString(this.type, null, 4);\n\tif (this.type === \"uuid\") {\n\t\tstream.writeUint8Array(this.uuid);\n\t}\n\tif (this.size > MAX_SIZE) {\n\t\tstream.writeUint64(this.size);\n\t} \n}\n\nBoxParser.FullBox.prototype.writeHeader = function(stream) {\n\tthis.size += 4;\n\tBoxParser.Box.prototype.writeHeader.call(this, stream, \" v=\"+this.version+\" f=\"+this.flags);\n\tstream.writeUint8(this.version);\n\tstream.writeUint24(this.flags);\n}\n\nBoxParser.Box.prototype.write = function(stream) {\n\tif (this.type === \"mdat\") {\n\t\t/* TODO: fix this */\n\t\tif (this.data) {\n\t\t\tthis.size = this.data.length;\n\t\t\tthis.writeHeader(stream);\n\t\t\tstream.writeUint8Array(this.data);\n\t\t}\n\t} else {\n\t\tthis.size = (this.data ? this.data.length : 0);\n\t\tthis.writeHeader(stream);\n\t\tif (this.data) {\n\t\t\tstream.writeUint8Array(this.data);\n\t\t}\n\t}\n}\n\nBoxParser.ContainerBox.prototype.write = function(stream) {\n\tthis.size = 0;\n\tthis.writeHeader(stream);\n\tfor (var i=0; i= 2) {\n\t\tstream.writeUint32(this.default_sample_description_index);\n\t}\n\tstream.writeUint32(this.entries.length);\n\tfor (i = 0; i < this.entries.length; i++) {\n\t\tentry = this.entries[i];\n\t\tif (this.version === 1) {\n\t\t\tif (this.default_length === 0) {\n\t\t\t\tstream.writeUint32(entry.description_length);\n\t\t\t}\n\t\t}\n\t\tentry.write(stream);\n\t}\n}\n\n\n// file:src/writing/sidx.js\nBoxParser.sidxBox.prototype.write = function(stream) {\n\tthis.version = 0;\t\n\tthis.flags = 0;\n\tthis.size = 4*4+2+2+12*this.references.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.reference_ID);\n\tstream.writeUint32(this.timescale);\n\tstream.writeUint32(this.earliest_presentation_time);\n\tstream.writeUint32(this.first_offset);\n\tstream.writeUint16(0);\n\tstream.writeUint16(this.references.length);\n\tfor (var i = 0; i < this.references.length; i++) {\n\t\tvar ref = this.references[i];\n\t\tstream.writeUint32(ref.reference_type << 31 | ref.referenced_size);\n\t\tstream.writeUint32(ref.subsegment_duration);\n\t\tstream.writeUint32(ref.starts_with_SAP << 31 | ref.SAP_type << 28 | ref.SAP_delta_time);\n\t}\n}\n\n// file:src/writing/smhd.js\nBoxParser.smhdBox.prototype.write = function(stream) {\n var i;\n this.version = 0;\n this.flags = 1;\n this.size = 4;\n this.writeHeader(stream);\n stream.writeUint16(this.balance);\n stream.writeUint16(0);\n}\n// file:src/writing/stco.js\nBoxParser.stcoBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4+4*this.chunk_offsets.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.chunk_offsets.length);\n\tstream.writeUint32Array(this.chunk_offsets);\n}\n\n// file:src/writing/stsc.js\nBoxParser.stscBox.prototype.write = function(stream) {\n\tvar i;\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4+12*this.first_chunk.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.first_chunk.length);\n\tfor(i=0; i 0) {\n\t\ti = 0;\n\t\twhile (i+1 < this.sample_sizes.length) {\n\t\t\tif (this.sample_sizes[i+1] !== this.sample_sizes[0]) {\n\t\t\t\tconstant = false;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconstant = false;\n\t}\n\tthis.size = 8;\n\tif (!constant) {\n\t\tthis.size += 4*this.sample_sizes.length;\n\t}\n\tthis.writeHeader(stream);\n\tif (!constant) {\n\t\tstream.writeUint32(0);\n\t} else {\n\t\tstream.writeUint32(this.sample_sizes[0]);\n\t}\n\tstream.writeUint32(this.sample_sizes.length);\n\tif (!constant) {\n\t\tstream.writeUint32Array(this.sample_sizes);\n\t}\t\n}\n\n// file:src/writing/stts.js\nBoxParser.sttsBox.prototype.write = function(stream) {\n\tvar i;\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4+8*this.sample_counts.length;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.sample_counts.length);\n\tfor(i=0; i UINT32_MAX ? 1 : 0;\n\tthis.flags = 0;\n\tthis.size = 4;\n\tif (this.version === 1) {\n\t\tthis.size += 4;\n\t}\n\tthis.writeHeader(stream);\n\tif (this.version === 1) {\n\t\tstream.writeUint64(this.baseMediaDecodeTime);\n\t} else {\n\t\tstream.writeUint32(this.baseMediaDecodeTime);\n\t}\n}\n\n// file:src/writing/tfhd.js\nBoxParser.tfhdBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.size = 4;\n\tif (this.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET) {\n\t\tthis.size += 8;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS) {\n\t\tthis.size += 4;\n\t}\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.track_id);\n\tif (this.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET) {\n\t\tstream.writeUint64(this.base_data_offset);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC) {\n\t\tstream.writeUint32(this.default_sample_description_index);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR) {\n\t\tstream.writeUint32(this.default_sample_duration);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE) {\n\t\tstream.writeUint32(this.default_sample_size);\n\t}\n\tif (this.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS) {\n\t\tstream.writeUint32(this.default_sample_flags);\n\t}\n}\n\n// file:src/writing/tkhd.js\nBoxParser.tkhdBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\t//this.flags = 0;\n\tthis.size = 4*18+2*4;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.creation_time);\n\tstream.writeUint32(this.modification_time);\n\tstream.writeUint32(this.track_id);\n\tstream.writeUint32(0);\n\tstream.writeUint32(this.duration);\n\tstream.writeUint32(0);\n\tstream.writeUint32(0);\n\tstream.writeInt16(this.layer);\n\tstream.writeInt16(this.alternate_group);\n\tstream.writeInt16(this.volume<<8);\n\tstream.writeUint16(0);\n\tstream.writeInt32Array(this.matrix);\n\tstream.writeUint32(this.width);\n\tstream.writeUint32(this.height);\n}\n\n// file:src/writing/trex.js\nBoxParser.trexBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.flags = 0;\n\tthis.size = 4*5;\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.track_id);\n\tstream.writeUint32(this.default_sample_description_index);\n\tstream.writeUint32(this.default_sample_duration);\n\tstream.writeUint32(this.default_sample_size);\n\tstream.writeUint32(this.default_sample_flags);\n}\n\n// file:src/writing/trun.js\nBoxParser.trunBox.prototype.write = function(stream) {\n\tthis.version = 0;\n\tthis.size = 4;\n\tif (this.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG) {\n\t\tthis.size += 4;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\tthis.size += 4*this.sample_duration.length;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\tthis.size += 4*this.sample_size.length;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\tthis.size += 4*this.sample_flags.length;\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\tthis.size += 4*this.sample_composition_time_offset.length;\n\t}\n\tthis.writeHeader(stream);\n\tstream.writeUint32(this.sample_count);\n\tif (this.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) {\n\t\tthis.data_offset_position = stream.getPosition();\n\t\tstream.writeInt32(this.data_offset); //signed\n\t}\n\tif (this.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG) {\n\t\tstream.writeUint32(this.first_sample_flags);\n\t}\n\tfor (var i = 0; i < this.sample_count; i++) {\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\t\tstream.writeUint32(this.sample_duration[i]);\n\t\t}\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\t\tstream.writeUint32(this.sample_size[i]);\n\t\t}\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\t\tstream.writeUint32(this.sample_flags[i]);\n\t\t}\n\t\tif (this.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\t\tif (this.version === 0) {\n\t\t\t\tstream.writeUint32(this.sample_composition_time_offset[i]);\n\t\t\t} else {\n\t\t\t\tstream.writeInt32(this.sample_composition_time_offset[i]); //signed\n\t\t\t}\n\t\t}\n\t}\t\t\n}\n\n// file:src/writing/url.js\nBoxParser[\"url Box\"].prototype.write = function(stream) {\n\tthis.version = 0;\t\n\tif (this.location) {\n\t\tthis.flags = 0;\n\t\tthis.size = this.location.length+1;\n\t} else {\n\t\tthis.flags = 0x000001;\n\t\tthis.size = 0;\n\t}\n\tthis.writeHeader(stream);\n\tif (this.location) {\n\t\tstream.writeCString(this.location);\n\t}\n}\n\n// file:src/writing/urn.js\nBoxParser[\"urn Box\"].prototype.write = function(stream) {\n\tthis.version = 0;\t\n\tthis.flags = 0;\n\tthis.size = this.name.length+1+(this.location ? this.location.length+1 : 0);\n\tthis.writeHeader(stream);\n\tstream.writeCString(this.name);\n\tif (this.location) {\n\t\tstream.writeCString(this.location);\n\t}\n}\n\n// file:src/writing/vmhd.js\nBoxParser.vmhdBox.prototype.write = function(stream) {\n\tvar i;\n\tthis.version = 0;\n\tthis.flags = 1;\n\tthis.size = 8;\n\tthis.writeHeader(stream);\n\tstream.writeUint16(this.graphicsmode);\n\tstream.writeUint16Array(this.opcolor);\n}\n\n// file:src/box-unpack.js\n/* \n * Copyright (c) Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nBoxParser.cttsBox.prototype.unpack = function(samples) {\n\tvar i, j, k;\n\tk = 0;\n\tfor (i = 0; i < this.sample_counts.length; i++) {\n\t\tfor (j = 0; j < this.sample_counts[i]; j++) {\n\t\t\tsamples[k].pts = samples[k].dts + this.sample_offsets[i];\n\t\t\tk++;\n\t\t}\n\t}\n}\n\nBoxParser.sttsBox.prototype.unpack = function(samples) {\n\tvar i, j, k;\n\tk = 0;\n\tfor (i = 0; i < this.sample_counts.length; i++) {\n\t\tfor (j = 0; j < this.sample_counts[i]; j++) {\n\t\t\tif (k === 0) {\n\t\t\t\tsamples[k].dts = 0;\n\t\t\t} else {\n\t\t\t\tsamples[k].dts = samples[k-1].dts + this.sample_deltas[i];\n\t\t\t}\n\t\t\tk++;\n\t\t}\n\t}\n}\n\nBoxParser.stcoBox.prototype.unpack = function(samples) {\n\tvar i;\n\tfor (i = 0; i < this.chunk_offsets.length; i++) {\n\t\tsamples[i].offset = this.chunk_offsets[i];\n\t}\n}\n\nBoxParser.stscBox.prototype.unpack = function(samples) {\n\tvar i, j, k, l, m;\n\tl = 0;\n\tm = 0;\n\tfor (i = 0; i < this.first_chunk.length; i++) {\n\t\tfor (j = 0; j < (i+1 < this.first_chunk.length ? this.first_chunk[i+1] : Infinity); j++) {\n\t\t\tm++;\n\t\t\tfor (k = 0; k < this.samples_per_chunk[i]; k++) {\n\t\t\t\tif (samples[l]) {\n\t\t\t\t\tsamples[l].description_index = this.sample_description_index[i];\n\t\t\t\t\tsamples[l].chunk_index = m;\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tl++;\n\t\t\t}\t\t\t\n\t\t}\n\t}\n}\n\nBoxParser.stszBox.prototype.unpack = function(samples) {\n\tvar i;\n\tfor (i = 0; i < this.sample_sizes.length; i++) {\n\t\tsamples[i].size = this.sample_sizes[i];\n\t}\n}\n// file:src/box-diff.js\n\nBoxParser.DIFF_BOXES_PROP_NAMES = [ \"boxes\", \"entries\", \"references\", \"subsamples\",\n\t\t\t\t\t \t \"items\", \"item_infos\", \"extents\", \"associations\",\n\t\t\t\t\t \t \"subsegments\", \"ranges\", \"seekLists\", \"seekPoints\",\n\t\t\t\t\t \t \"esd\", \"levels\"];\n\nBoxParser.DIFF_PRIMITIVE_ARRAY_PROP_NAMES = [ \"compatible_brands\", \"matrix\", \"opcolor\", \"sample_counts\", \"sample_deltas\",\n\"first_chunk\", \"samples_per_chunk\", \"sample_sizes\", \"chunk_offsets\", \"sample_offsets\", \"sample_description_index\", \"sample_duration\" ];\n\nBoxParser.boxEqualFields = function(box_a, box_b) {\n\tif (box_a && !box_b) return false;\n\tvar prop;\n\tfor (prop in box_a) {\n\t\tif (BoxParser.DIFF_BOXES_PROP_NAMES.indexOf(prop) > -1) {\n\t\t\tcontinue;\n\t\t// } else if (excluded_fields && excluded_fields.indexOf(prop) > -1) {\n\t\t// \tcontinue;\n\t\t} else if (box_a[prop] instanceof BoxParser.Box || box_b[prop] instanceof BoxParser.Box) {\n\t\t\tcontinue;\n\t\t} else if (typeof box_a[prop] === \"undefined\" || typeof box_b[prop] === \"undefined\") {\n\t\t\tcontinue;\n\t\t} else if (typeof box_a[prop] === \"function\" || typeof box_b[prop] === \"function\") {\n\t\t\tcontinue;\n\t\t} else if (\n\t\t\t(box_a.subBoxNames && box_a.subBoxNames.indexOf(prop.slice(0,4)) > -1) ||\n\t\t\t(box_b.subBoxNames && box_b.subBoxNames.indexOf(prop.slice(0,4)) > -1)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tif (prop === \"data\" || prop === \"start\" || prop === \"size\" || prop === \"creation_time\" || prop === \"modification_time\") {\n\t\t\t\tcontinue;\n\t\t\t} else if (BoxParser.DIFF_PRIMITIVE_ARRAY_PROP_NAMES.indexOf(prop) > -1) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tif (box_a[prop] !== box_b[prop]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nBoxParser.boxEqual = function(box_a, box_b) {\n\tif (!BoxParser.boxEqualFields(box_a, box_b)) {\n\t\treturn false;\n\t}\n\tfor (var j = 0; j < BoxParser.DIFF_BOXES_PROP_NAMES.length; j++) {\n\t\tvar name = BoxParser.DIFF_BOXES_PROP_NAMES[j];\n\t\tif (box_a[name] && box_b[name]) {\n\t\t\tif (!BoxParser.boxEqual(box_a[name], box_b[name])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n// file:src/text-mp4.js\n/* \n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar VTTin4Parser = function() {\t\n}\n\nVTTin4Parser.prototype.parseSample = function(data) {\n\tvar cues, cue;\n\tvar stream = new MP4BoxStream(data.buffer);\n\tcues = [];\n\twhile (!stream.isEos()) {\n\t\tcue = BoxParser.parseOneBox(stream, false);\n\t\tif (cue.code === BoxParser.OK && cue.box.type === \"vttc\") {\n\t\t\tcues.push(cue.box);\n\t\t}\t\t\n\t}\n\treturn cues;\n}\n\nVTTin4Parser.prototype.getText = function (startTime, endTime, data) {\n\tfunction pad(n, width, z) {\n\t z = z || '0';\n\t n = n + '';\n\t return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;\n\t}\n\tfunction secToTimestamp(insec) {\n\t\tvar h = Math.floor(insec/3600);\n\t\tvar m = Math.floor((insec - h*3600)/60);\n\t\tvar s = Math.floor(insec - h*3600 - m*60);\n\t\tvar ms = Math.floor((insec - h*3600 - m*60 - s)*1000);\n\t\treturn \"\"+pad(h, 2)+\":\"+pad(m,2)+\":\"+pad(s, 2)+\".\"+pad(ms, 3);\n\t}\n\tvar cues = this.parseSample(data);\n\tvar string = \"\";\n\tfor (var i = 0; i < cues.length; i++) {\n\t\tvar cueIn4 = cues[i];\n\t\tstring += secToTimestamp(startTime)+\" --> \"+secToTimestamp(endTime)+\"\\r\\n\";\n\t\tstring += cueIn4.payl.text;\n\t}\n\treturn string;\n}\n\nvar XMLSubtitlein4Parser = function() {\t\n}\n\nXMLSubtitlein4Parser.prototype.parseSample = function(sample) {\n\tvar res = {};\t\n\tvar i;\n\tres.resources = [];\n\tvar stream = new MP4BoxStream(sample.data.buffer);\n\tif (!sample.subsamples || sample.subsamples.length === 0) {\n\t\tres.documentString = stream.readString(sample.data.length);\n\t} else {\n\t\tres.documentString = stream.readString(sample.subsamples[0].size);\n\t\tif (sample.subsamples.length > 1) {\n\t\t\tfor (i = 1; i < sample.subsamples.length; i++) {\n\t\t\t\tres.resources[i] = stream.readUint8Array(sample.subsamples[i].size);\n\t\t\t}\n\t\t}\n\t}\n\tif (typeof (DOMParser) !== \"undefined\") {\n\t\tres.document = (new DOMParser()).parseFromString(res.documentString, \"application/xml\");\n\t}\n\treturn res;\n}\n\nvar Textin4Parser = function() {\t\n}\n\nTextin4Parser.prototype.parseSample = function(sample) {\n\tvar textString;\n\tvar stream = new MP4BoxStream(sample.data.buffer);\n\ttextString = stream.readString(sample.data.length);\n\treturn textString;\n}\n\nTextin4Parser.prototype.parseConfig = function(data) {\n\tvar textString;\n\tvar stream = new MP4BoxStream(data.buffer);\n\tstream.readUint32(); // version & flags\n\ttextString = stream.readCString();\n\treturn textString;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.VTTin4Parser = VTTin4Parser;\n\texports.XMLSubtitlein4Parser = XMLSubtitlein4Parser;\n\texports.Textin4Parser = Textin4Parser;\n}\n// file:src/isofile.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar ISOFile = function (stream) {\n\t/* MutiBufferStream object used to parse boxes */\n\tthis.stream = stream || new MultiBufferStream();\n\t/* Array of all boxes (in order) found in the file */\n\tthis.boxes = [];\n\t/* Array of all mdats */\n\tthis.mdats = [];\n\t/* Array of all moofs */\n\tthis.moofs = [];\n\t/* Boolean indicating if the file is compatible with progressive parsing (moov first) */\n\tthis.isProgressive = false;\n\t/* Boolean used to fire moov start event only once */\n\tthis.moovStartFound = false;\n\t/* Callback called when the moov parsing starts */\n\tthis.onMoovStart = null;\n\t/* Boolean keeping track of the call to onMoovStart, to avoid double calls */\n\tthis.moovStartSent = false;\n\t/* Callback called when the moov is entirely parsed */\n\tthis.onReady = null;\n\t/* Boolean keeping track of the call to onReady, to avoid double calls */\n\tthis.readySent = false;\n\t/* Callback to call when segments are ready */\n\tthis.onSegment = null;\n\t/* Callback to call when samples are ready */\n\tthis.onSamples = null;\n\t/* Callback to call when there is an error in the parsing or processing of samples */\n\tthis.onError = null;\n\t/* Boolean indicating if the moov box run-length encoded tables of sample information have been processed */\n\tthis.sampleListBuilt = false;\n\t/* Array of Track objects for which fragmentation of samples is requested */\n\tthis.fragmentedTracks = [];\n\t/* Array of Track objects for which extraction of samples is requested */\n\tthis.extractedTracks = [];\n\t/* Boolean indicating that fragmention is ready */\n\tthis.isFragmentationInitialized = false;\n\t/* Boolean indicating that fragmented has started */\n\tthis.sampleProcessingStarted = false;\n\t/* Number of the next 'moof' to generate when fragmenting */\n\tthis.nextMoofNumber = 0;\n\t/* Boolean indicating if the initial list of items has been produced */\n\tthis.itemListBuilt = false;\n\t/* Array of items */\n\tthis.items = [];\n\t/* Array of entity groups */\n\tthis.entity_groups = [];\n\t/* Callback called when the sidx box is entirely parsed */\n\tthis.onSidx = null;\n\t/* Boolean keeping track of the call to onSidx, to avoid double calls */\n\tthis.sidxSent = false;\n}\n\nISOFile.prototype.setSegmentOptions = function(id, user, options) {\n\tvar trak = this.getTrackById(id);\n\tif (trak) {\n\t\tvar fragTrack = {};\n\t\tthis.fragmentedTracks.push(fragTrack);\n\t\tfragTrack.id = id;\n\t\tfragTrack.user = user;\n\t\tfragTrack.trak = trak;\n\t\ttrak.nextSample = 0;\n\t\tfragTrack.segmentStream = null;\n\t\tfragTrack.nb_samples = 1000;\n\t\tfragTrack.rapAlignement = true;\n\t\tif (options) {\n\t\t\tif (options.nbSamples) fragTrack.nb_samples = options.nbSamples;\n\t\t\tif (options.rapAlignement) fragTrack.rapAlignement = options.rapAlignement;\n\t\t}\n\t}\n}\n\nISOFile.prototype.unsetSegmentOptions = function(id) {\n\tvar index = -1;\n\tfor (var i = 0; i < this.fragmentedTracks.length; i++) {\n\t\tvar fragTrack = this.fragmentedTracks[i];\n\t\tif (fragTrack.id == id) {\n\t\t\tindex = i;\n\t\t}\n\t}\n\tif (index > -1) {\n\t\tthis.fragmentedTracks.splice(index, 1);\n\t}\n}\n\nISOFile.prototype.setExtractionOptions = function(id, user, options) {\n\tvar trak = this.getTrackById(id);\n\tif (trak) {\n\t\tvar extractTrack = {};\n\t\tthis.extractedTracks.push(extractTrack);\n\t\textractTrack.id = id;\n\t\textractTrack.user = user;\n\t\textractTrack.trak = trak;\n\t\ttrak.nextSample = 0;\n\t\textractTrack.nb_samples = 1000;\n\t\textractTrack.samples = [];\n\t\tif (options) {\n\t\t\tif (options.nbSamples) extractTrack.nb_samples = options.nbSamples;\n\t\t}\n\t}\n}\n\nISOFile.prototype.unsetExtractionOptions = function(id) {\n\tvar index = -1;\n\tfor (var i = 0; i < this.extractedTracks.length; i++) {\n\t\tvar extractTrack = this.extractedTracks[i];\n\t\tif (extractTrack.id == id) {\n\t\t\tindex = i;\n\t\t}\n\t}\n\tif (index > -1) {\n\t\tthis.extractedTracks.splice(index, 1);\n\t}\n}\n\nISOFile.prototype.parse = function() {\n\tvar found;\n\tvar ret;\n\tvar box;\n\tvar parseBoxHeadersOnly = false;\n\n\tif (this.restoreParsePosition)\t{\n\t\tif (!this.restoreParsePosition()) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\twhile (true) {\n\n\t\tif (this.hasIncompleteMdat && this.hasIncompleteMdat()) {\n\t\t\tif (this.processIncompleteMdat()) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.saveParsePosition)\t{\n\t\t\t\tthis.saveParsePosition();\n\t\t\t}\n\t\t\tret = BoxParser.parseOneBox(this.stream, parseBoxHeadersOnly);\n\t\t\tif (ret.code === BoxParser.ERR_NOT_ENOUGH_DATA) {\n\t\t\t\tif (this.processIncompleteBox) {\n\t\t\t\t\tif (this.processIncompleteBox(ret)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar box_type;\n\t\t\t\t/* the box is entirely parsed */\n\t\t\t\tbox = ret.box;\n\t\t\t\tbox_type = (box.type !== \"uuid\" ? box.type : box.uuid);\n\t\t\t\t/* store the box in the 'boxes' array to preserve box order (for file rewrite if needed) */\n\t\t\t\tthis.boxes.push(box);\n\t\t\t\t/* but also store box in a property for more direct access */\n\t\t\t\tswitch (box_type) {\n\t\t\t\t\tcase \"mdat\":\n\t\t\t\t\t\tthis.mdats.push(box);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"moof\":\n\t\t\t\t\t\tthis.moofs.push(box);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"moov\":\n\t\t\t\t\t\tthis.moovStartFound = true;\n\t\t\t\t\t\tif (this.mdats.length === 0) {\n\t\t\t\t\t\t\tthis.isProgressive = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/* no break */\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (this[box_type] !== undefined) {\n\t\t\t\t\t\t\tLog.warn(\"ISOFile\", \"Duplicate Box of type: \"+box_type+\", overriding previous occurrence\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis[box_type] = box;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (this.updateUsedBytes) {\n\t\t\t\t\tthis.updateUsedBytes(box, ret);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.prototype.checkBuffer = function (ab) {\n\tif (ab === null || ab === undefined) {\n\t\tthrow(\"Buffer must be defined and non empty\");\n\t}\n\tif (ab.fileStart === undefined) {\n\t\tthrow(\"Buffer must have a fileStart property\");\n\t}\n\tif (ab.byteLength === 0) {\n\t\tLog.warn(\"ISOFile\", \"Ignoring empty buffer (fileStart: \"+ab.fileStart+\")\");\n\t\tthis.stream.logBufferLevel();\n\t\treturn false;\n\t}\n\tLog.info(\"ISOFile\", \"Processing buffer (fileStart: \"+ab.fileStart+\")\");\n\n\t/* mark the bytes in the buffer as not being used yet */\n\tab.usedBytes = 0;\n\tthis.stream.insertBuffer(ab);\n\tthis.stream.logBufferLevel();\n\n\tif (!this.stream.initialized()) {\n\t\tLog.warn(\"ISOFile\", \"Not ready to start parsing\");\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/* Processes a new ArrayBuffer (with a fileStart property)\n Returns the next expected file position, or undefined if not ready to parse */\nISOFile.prototype.appendBuffer = function(ab, last) {\n\tvar nextFileStart;\n\tif (!this.checkBuffer(ab)) {\n\t\treturn;\n\t}\n\n\t/* Parse whatever is in the existing buffers */\n\tthis.parse();\n\n\t/* Check if the moovStart callback needs to be called */\n\tif (this.moovStartFound && !this.moovStartSent) {\n\t\tthis.moovStartSent = true;\n\t\tif (this.onMoovStart) this.onMoovStart();\n\t}\n\n\tif (this.moov) {\n\t\t/* A moov box has been entirely parsed */\n\n\t\t/* if this is the first call after the moov is found we initialize the list of samples (may be empty in fragmented files) */\n\t\tif (!this.sampleListBuilt) {\n\t\t\tthis.buildSampleLists();\n\t\t\tthis.sampleListBuilt = true;\n\t\t}\n\n\t\t/* We update the sample information if there are any new moof boxes */\n\t\tthis.updateSampleLists();\n\n\t\t/* If the application needs to be informed that the 'moov' has been found,\n\t\t we create the information object and callback the application */\n\t\tif (this.onReady && !this.readySent) {\n\t\t\tthis.readySent = true;\n\t\t\tthis.onReady(this.getInfo());\n\t\t}\n\n\t\t/* See if any sample extraction or segment creation needs to be done with the available samples */\n\t\tthis.processSamples(last);\n\n\t\t/* Inform about the best range to fetch next */\n\t\tif (this.nextSeekPosition) {\n\t\t\tnextFileStart = this.nextSeekPosition;\n\t\t\tthis.nextSeekPosition = undefined;\n\t\t} else {\n\t\t\tnextFileStart = this.nextParsePosition;\n\t\t}\n\t\tif (this.stream.getEndFilePositionAfter) {\n\t\t\tnextFileStart = this.stream.getEndFilePositionAfter(nextFileStart);\n\t\t}\n\t} else {\n\t\tif (this.nextParsePosition) {\n\t\t\t/* moov has not been parsed but the first buffer was received,\n\t\t\t the next fetch should probably be the next box start */\n\t\t\tnextFileStart = this.nextParsePosition;\n\t\t} else {\n\t\t\t/* No valid buffer has been parsed yet, we cannot know what to parse next */\n\t\t\tnextFileStart = 0;\n\t\t}\n\t}\n\tif (this.sidx) {\n\t\tif (this.onSidx && !this.sidxSent) {\n\t\t\tthis.onSidx(this.sidx);\n\t\t\tthis.sidxSent = true;\n\t\t}\n\t}\n\tif (this.meta) {\n\t\tif (this.flattenItemInfo && !this.itemListBuilt) {\n\t\t\tthis.flattenItemInfo();\n\t\t\tthis.itemListBuilt = true;\n\t\t}\n\t\tif (this.processItems) {\n\t\t\tthis.processItems(this.onItem);\n\t\t}\n\t}\n\n\tif (this.stream.cleanBuffers) {\n\t\tLog.info(\"ISOFile\", \"Done processing buffer (fileStart: \"+ab.fileStart+\") - next buffer to fetch should have a fileStart position of \"+nextFileStart);\n\t\tthis.stream.logBufferLevel();\n\t\tthis.stream.cleanBuffers();\n\t\tthis.stream.logBufferLevel(true);\n\t\tLog.info(\"ISOFile\", \"Sample data size in memory: \"+this.getAllocatedSampleDataSize());\n\t}\n\treturn nextFileStart;\n}\n\nISOFile.prototype.getInfo = function() {\n\tvar i, j;\n\tvar movie = {};\n\tvar trak;\n\tvar track;\n\tvar ref;\n\tvar sample_desc;\n\tvar _1904 = (new Date('1904-01-01T00:00:00Z').getTime());\n\n\tif (this.moov) {\n\t\tmovie.hasMoov = true;\n\t\tmovie.duration = this.moov.mvhd.duration;\n\t\tmovie.timescale = this.moov.mvhd.timescale;\n\t\tmovie.isFragmented = (this.moov.mvex != null);\n\t\tif (movie.isFragmented && this.moov.mvex.mehd) {\n\t\t\tmovie.fragment_duration = this.moov.mvex.mehd.fragment_duration;\n\t\t}\n\t\tmovie.isProgressive = this.isProgressive;\n\t\tmovie.hasIOD = (this.moov.iods != null);\n\t\tmovie.brands = [];\n\t\tmovie.brands.push(this.ftyp.major_brand);\n\t\tmovie.brands = movie.brands.concat(this.ftyp.compatible_brands);\n\t\tmovie.created = new Date(_1904+this.moov.mvhd.creation_time*1000);\n\t\tmovie.modified = new Date(_1904+this.moov.mvhd.modification_time*1000);\n\t\tmovie.tracks = [];\n\t\tmovie.audioTracks = [];\n\t\tmovie.videoTracks = [];\n\t\tmovie.subtitleTracks = [];\n\t\tmovie.metadataTracks = [];\n\t\tmovie.hintTracks = [];\n\t\tmovie.otherTracks = [];\n\t\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\t\ttrak = this.moov.traks[i];\n\t\t\tsample_desc = trak.mdia.minf.stbl.stsd.entries[0];\n\t\t\ttrack = {};\n\t\t\tmovie.tracks.push(track);\n\t\t\ttrack.id = trak.tkhd.track_id;\n\t\t\ttrack.name = trak.mdia.hdlr.name;\n\t\t\ttrack.references = [];\n\t\t\tif (trak.tref) {\n\t\t\t\tfor (j = 0; j < trak.tref.boxes.length; j++) {\n\t\t\t\t\tref = {};\n\t\t\t\t\ttrack.references.push(ref);\n\t\t\t\t\tref.type = trak.tref.boxes[j].type;\n\t\t\t\t\tref.track_ids = trak.tref.boxes[j].track_ids;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (trak.edts) {\n\t\t\t\ttrack.edits = trak.edts.elst.entries;\n\t\t\t}\n\t\t\ttrack.created = new Date(_1904+trak.tkhd.creation_time*1000);\n\t\t\ttrack.modified = new Date(_1904+trak.tkhd.modification_time*1000);\n\t\t\ttrack.movie_duration = trak.tkhd.duration;\n\t\t\ttrack.movie_timescale = movie.timescale;\n\t\t\ttrack.layer = trak.tkhd.layer;\n\t\t\ttrack.alternate_group = trak.tkhd.alternate_group;\n\t\t\ttrack.volume = trak.tkhd.volume;\n\t\t\ttrack.matrix = trak.tkhd.matrix;\n\t\t\ttrack.track_width = trak.tkhd.width/(1<<16);\n\t\t\ttrack.track_height = trak.tkhd.height/(1<<16);\n\t\t\ttrack.timescale = trak.mdia.mdhd.timescale;\n\t\t\ttrack.cts_shift = trak.mdia.minf.stbl.cslg;\n\t\t\ttrack.duration = trak.mdia.mdhd.duration;\n\t\t\ttrack.samples_duration = trak.samples_duration;\n\t\t\ttrack.codec = sample_desc.getCodec();\n\t\t\ttrack.kind = (trak.udta && trak.udta.kinds.length ? trak.udta.kinds[0] : { schemeURI: \"\", value: \"\"});\n\t\t\ttrack.language = (trak.mdia.elng ? trak.mdia.elng.extended_language : trak.mdia.mdhd.languageString);\n\t\t\ttrack.nb_samples = trak.samples.length;\n\t\t\ttrack.size = trak.samples_size;\n\t\t\ttrack.bitrate = (track.size*8*track.timescale)/track.samples_duration;\n\t\t\tif (sample_desc.isAudio()) {\n\t\t\t\ttrack.type = \"audio\";\n\t\t\t\tmovie.audioTracks.push(track);\n\t\t\t\ttrack.audio = {};\n\t\t\t\ttrack.audio.sample_rate = sample_desc.getSampleRate();\n\t\t\t\ttrack.audio.channel_count = sample_desc.getChannelCount();\n\t\t\t\ttrack.audio.sample_size = sample_desc.getSampleSize();\n\t\t\t} else if (sample_desc.isVideo()) {\n\t\t\t\ttrack.type = \"video\";\n\t\t\t\tmovie.videoTracks.push(track);\n\t\t\t\ttrack.video = {};\n\t\t\t\ttrack.video.width = sample_desc.getWidth();\n\t\t\t\ttrack.video.height = sample_desc.getHeight();\n\t\t\t} else if (sample_desc.isSubtitle()) {\n\t\t\t\ttrack.type = \"subtitles\";\n\t\t\t\tmovie.subtitleTracks.push(track);\n\t\t\t} else if (sample_desc.isHint()) {\n\t\t\t\ttrack.type = \"metadata\";\n\t\t\t\tmovie.hintTracks.push(track);\n\t\t\t} else if (sample_desc.isMetadata()) {\n\t\t\t\ttrack.type = \"metadata\";\n\t\t\t\tmovie.metadataTracks.push(track);\n\t\t\t} else {\n\t\t\t\ttrack.type = \"metadata\";\n\t\t\t\tmovie.otherTracks.push(track);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tmovie.hasMoov = false;\n\t}\n\tmovie.mime = \"\";\n\tif (movie.hasMoov && movie.tracks) {\n\t\tif (movie.videoTracks && movie.videoTracks.length > 0) {\n\t\t\tmovie.mime += 'video/mp4; codecs=\\\"';\n\t\t} else if (movie.audioTracks && movie.audioTracks.length > 0) {\n\t\t\tmovie.mime += 'audio/mp4; codecs=\\\"';\n\t\t} else {\n\t\t\tmovie.mime += 'application/mp4; codecs=\\\"';\n\t\t}\n\t\tfor (i = 0; i < movie.tracks.length; i++) {\n\t\t\tif (i !== 0) movie.mime += ',';\n\t\t\tmovie.mime+= movie.tracks[i].codec;\n\t\t}\n\t\tmovie.mime += '\\\"; profiles=\\\"';\n\t\tmovie.mime += this.ftyp.compatible_brands.join();\n\t\tmovie.mime += '\\\"';\n\t}\n\treturn movie;\n}\n\nISOFile.prototype.setNextSeekPositionFromSample = function (sample) {\n\tif (!sample) {\n\t\treturn;\n\t}\n\tif (this.nextSeekPosition) {\n\t\tthis.nextSeekPosition = Math.min(sample.offset+sample.alreadyRead,this.nextSeekPosition);\n\t} else {\n\t\tthis.nextSeekPosition = sample.offset+sample.alreadyRead;\n\t}\n}\n\nISOFile.prototype.processSamples = function(last) {\n\tvar i;\n\tvar trak;\n\tif (!this.sampleProcessingStarted) return;\n\n\t/* For each track marked for fragmentation,\n\t check if the next sample is there (i.e. if the sample information is known (i.e. moof has arrived) and if it has been downloaded)\n\t and create a fragment with it */\n\tif (this.isFragmentationInitialized && this.onSegment !== null) {\n\t\tfor (i = 0; i < this.fragmentedTracks.length; i++) {\n\t\t\tvar fragTrak = this.fragmentedTracks[i];\n\t\t\ttrak = fragTrak.trak;\n\t\t\twhile (trak.nextSample < trak.samples.length && this.sampleProcessingStarted) {\n\t\t\t\t/* The sample information is there (either because the file is not fragmented and this is not the last sample,\n\t\t\t\tor because the file is fragmented and the moof for that sample has been received */\n\t\t\t\tLog.debug(\"ISOFile\", \"Creating media fragment on track #\"+fragTrak.id +\" for sample \"+trak.nextSample);\n\t\t\t\tvar result = this.createFragment(fragTrak.id, trak.nextSample, fragTrak.segmentStream);\n\t\t\t\tif (result) {\n\t\t\t\t\tfragTrak.segmentStream = result;\n\t\t\t\t\ttrak.nextSample++;\n\t\t\t\t} else {\n\t\t\t\t\t/* The fragment could not be created because the media data is not there (not downloaded), wait for it */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t/* A fragment is created by sample, but the segment is the accumulation in the buffer of these fragments.\n\t\t\t\t It is flushed only as requested by the application (nb_samples) to avoid too many callbacks */\n\t\t\t\tif (trak.nextSample % fragTrak.nb_samples === 0 || (last || trak.nextSample >= trak.samples.length)) {\n\t\t\t\t\tLog.info(\"ISOFile\", \"Sending fragmented data on track #\"+fragTrak.id+\" for samples [\"+Math.max(0,trak.nextSample-fragTrak.nb_samples)+\",\"+(trak.nextSample-1)+\"]\");\n\t\t\t\t\tLog.info(\"ISOFile\", \"Sample data size in memory: \"+this.getAllocatedSampleDataSize());\n\t\t\t\t\tif (this.onSegment) {\n\t\t\t\t\t\tthis.onSegment(fragTrak.id, fragTrak.user, fragTrak.segmentStream.buffer, trak.nextSample, (last || trak.nextSample >= trak.samples.length));\n\t\t\t\t\t}\n\t\t\t\t\t/* force the creation of a new buffer */\n\t\t\t\t\tfragTrak.segmentStream = null;\n\t\t\t\t\tif (fragTrak !== this.fragmentedTracks[i]) {\n\t\t\t\t\t\t/* make sure we can stop fragmentation if needed */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (this.onSamples !== null) {\n\t\t/* For each track marked for data export,\n\t\t check if the next sample is there (i.e. has been downloaded) and send it */\n\t\tfor (i = 0; i < this.extractedTracks.length; i++) {\n\t\t\tvar extractTrak = this.extractedTracks[i];\n\t\t\ttrak = extractTrak.trak;\n\t\t\twhile (trak.nextSample < trak.samples.length && this.sampleProcessingStarted) {\n\t\t\t\tLog.debug(\"ISOFile\", \"Exporting on track #\"+extractTrak.id +\" sample #\"+trak.nextSample);\n\t\t\t\tvar sample = this.getSample(trak, trak.nextSample);\n\t\t\t\tif (sample) {\n\t\t\t\t\ttrak.nextSample++;\n\t\t\t\t\textractTrak.samples.push(sample);\n\t\t\t\t} else {\n\t\t\t\t\tthis.setNextSeekPositionFromSample(trak.samples[trak.nextSample]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (trak.nextSample % extractTrak.nb_samples === 0 || trak.nextSample >= trak.samples.length) {\n\t\t\t\t\tLog.debug(\"ISOFile\", \"Sending samples on track #\"+extractTrak.id+\" for sample \"+trak.nextSample);\n\t\t\t\t\tif (this.onSamples) {\n\t\t\t\t\t\tthis.onSamples(extractTrak.id, extractTrak.user, extractTrak.samples);\n\t\t\t\t\t}\n\t\t\t\t\textractTrak.samples = [];\n\t\t\t\t\tif (extractTrak !== this.extractedTracks[i]) {\n\t\t\t\t\t\t/* check if the extraction needs to be stopped */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Find and return specific boxes using recursion and early return */\nISOFile.prototype.getBox = function(type) {\n var result = this.getBoxes(type, true);\n return (result.length ? result[0] : null);\n}\n\nISOFile.prototype.getBoxes = function(type, returnEarly) {\n var result = [];\n ISOFile._sweep.call(this, type, result, returnEarly);\n return result;\n}\n\nISOFile._sweep = function(type, result, returnEarly) {\n if (this.type && this.type == type) result.push(this);\n for (var box in this.boxes) {\n if (result.length && returnEarly) return;\n ISOFile._sweep.call(this.boxes[box], type, result, returnEarly);\n }\n}\n\nISOFile.prototype.getTrackSamplesInfo = function(track_id) {\n\tvar track = this.getTrackById(track_id);\n\tif (track) {\n\t\treturn track.samples;\n\t} else {\n\t\treturn;\n\t}\n}\n\nISOFile.prototype.getTrackSample = function(track_id, number) {\n\tvar track = this.getTrackById(track_id);\n\tvar sample = this.getSample(track, number);\n\treturn sample;\n}\n\n/* Called by the application to release the resources associated to samples already forwarded to the application */\nISOFile.prototype.releaseUsedSamples = function (id, sampleNum) {\n\tvar size = 0;\n\tvar trak = this.getTrackById(id);\n\tif (!trak.lastValidSample) trak.lastValidSample = 0;\n\tfor (var i = trak.lastValidSample; i < sampleNum; i++) {\n\t\tsize+=this.releaseSample(trak, i);\n\t}\n\tLog.info(\"ISOFile\", \"Track #\"+id+\" released samples up to \"+sampleNum+\" (released size: \"+size+\", remaining: \"+this.samplesDataSize+\")\");\n\ttrak.lastValidSample = sampleNum;\n}\n\nISOFile.prototype.start = function() {\n\tthis.sampleProcessingStarted = true;\n\tthis.processSamples(false);\n}\n\nISOFile.prototype.stop = function() {\n\tthis.sampleProcessingStarted = false;\n}\n\n/* Called by the application to flush the remaining samples (e.g. once the download is finished or when no more samples will be added) */\nISOFile.prototype.flush = function() {\n\tLog.info(\"ISOFile\", \"Flushing remaining samples\");\n\tthis.updateSampleLists();\n\tthis.processSamples(true);\n\tthis.stream.cleanBuffers();\n\tthis.stream.logBufferLevel(true);\n}\n\n/* Finds the byte offset for a given time on a given track\n also returns the time of the previous rap */\nISOFile.prototype.seekTrack = function(time, useRap, trak) {\n\tvar j;\n\tvar sample;\n\tvar seek_offset = Infinity;\n\tvar rap_seek_sample_num = 0;\n\tvar seek_sample_num = 0;\n\tvar timescale;\n\n\tif (trak.samples.length === 0) {\n\t\tLog.info(\"ISOFile\", \"No sample in track, cannot seek! Using time \"+Log.getDurationString(0, 1) +\" and offset: \"+0);\n\t\treturn { offset: 0, time: 0 };\n\t}\n\n\tfor (j = 0; j < trak.samples.length; j++) {\n\t\tsample = trak.samples[j];\n\t\tif (j === 0) {\n\t\t\tseek_sample_num = 0;\n\t\t\ttimescale = sample.timescale;\n\t\t} else if (sample.cts > time * sample.timescale) {\n\t\t\tseek_sample_num = j-1;\n\t\t\tbreak;\n\t\t}\n\t\tif (useRap && sample.is_sync) {\n\t\t\trap_seek_sample_num = j;\n\t\t}\n\t}\n\tif (useRap) {\n\t\tseek_sample_num = rap_seek_sample_num;\n\t}\n\ttime = trak.samples[seek_sample_num].cts;\n\ttrak.nextSample = seek_sample_num;\n\twhile (trak.samples[seek_sample_num].alreadyRead === trak.samples[seek_sample_num].size) {\n\t\t// No remaining samples to look for, all are downloaded.\n\t\tif (!trak.samples[seek_sample_num + 1]) {\n\t\t\tbreak;\n\t\t}\n\t\tseek_sample_num++;\n\t}\n\tseek_offset = trak.samples[seek_sample_num].offset+trak.samples[seek_sample_num].alreadyRead;\n\tLog.info(\"ISOFile\", \"Seeking to \"+(useRap ? \"RAP\": \"\")+\" sample #\"+trak.nextSample+\" on track \"+trak.tkhd.track_id+\", time \"+Log.getDurationString(time, timescale) +\" and offset: \"+seek_offset);\n\treturn { offset: seek_offset, time: time/timescale };\n}\n\nISOFile.prototype.getTrackDuration = function (trak) {\n\tvar sample;\n\n\tif (!trak.samples) {\n\t\treturn Infinity;\n\t}\n\tsample = trak.samples[trak.samples.length - 1];\n\treturn (sample.cts + sample.duration) / sample.timescale;\n}\n\n/* Finds the byte offset in the file corresponding to the given time or to the time of the previous RAP */\nISOFile.prototype.seek = function(time, useRap) {\n\tvar moov = this.moov;\n\tvar trak;\n\tvar trak_seek_info;\n\tvar i;\n\tvar seek_info = { offset: Infinity, time: Infinity };\n\tif (!this.moov) {\n\t\tthrow \"Cannot seek: moov not received!\";\n\t} else {\n\t\tfor (i = 0; i this.getTrackDuration(trak)) { // skip tracks that already ended\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttrak_seek_info = this.seekTrack(time, useRap, trak);\n\t\t\tif (trak_seek_info.offset < seek_info.offset) {\n\t\t\t\tseek_info.offset = trak_seek_info.offset;\n\t\t\t}\n\t\t\tif (trak_seek_info.time < seek_info.time) {\n\t\t\t\tseek_info.time = trak_seek_info.time;\n\t\t\t}\n\t\t}\n\t\tLog.info(\"ISOFile\", \"Seeking at time \"+Log.getDurationString(seek_info.time, 1)+\" needs a buffer with a fileStart position of \"+seek_info.offset);\n\t\tif (seek_info.offset === Infinity) {\n\t\t\t/* No sample info, in all tracks, cannot seek */\n\t\t\tseek_info = { offset: this.nextParsePosition, time: 0 };\n\t\t} else {\n\t\t\t/* check if the seek position is already in some buffer and\n\t\t\t in that case return the end of that buffer (or of the last contiguous buffer) */\n\t\t\t/* TODO: Should wait until append operations are done */\n\t\t\tseek_info.offset = this.stream.getEndFilePositionAfter(seek_info.offset);\n\t\t}\n\t\tLog.info(\"ISOFile\", \"Adjusted seek position (after checking data already in buffer): \"+seek_info.offset);\n\t\treturn seek_info;\n\t}\n}\n\nISOFile.prototype.equal = function(b) {\n\tvar box_index = 0;\n\twhile (box_index < this.boxes.length && box_index < b.boxes.length) {\n\t\tvar a_box = this.boxes[box_index];\n\t\tvar b_box = b.boxes[box_index];\n\t\tif (!BoxParser.boxEqual(a_box, b_box)) {\n\t\t\treturn false;\n\t\t}\n\t\tbox_index++;\n\t}\n\treturn true;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.ISOFile = ISOFile;\n}\n// file:src/isofile-advanced-parsing.js\n/* position in the current buffer of the beginning of the last box parsed */\nISOFile.prototype.lastBoxStartPosition = 0;\n/* indicator if the parsing is stuck in the middle of an mdat box */\nISOFile.prototype.parsingMdat = null;\n/* next file position that the parser needs:\n - 0 until the first buffer (i.e. fileStart ===0) has been received \n - otherwise, the next box start until the moov box has been parsed\n - otherwise, the position of the next sample to fetch\n */\nISOFile.prototype.nextParsePosition = 0;\n/* keep mdat data */\nISOFile.prototype.discardMdatData = false;\n\nISOFile.prototype.processIncompleteBox = function(ret) {\n\tvar box;\n\tvar merged;\n\tvar found;\n\t\n\t/* we did not have enough bytes in the current buffer to parse the entire box */\n\tif (ret.type === \"mdat\") { \n\t\t/* we had enough bytes to get its type and size and it's an 'mdat' */\n\t\t\n\t\t/* special handling for mdat boxes, since we don't actually need to parse it linearly \n\t\t we create the box */\n\t\tbox = new BoxParser[ret.type+\"Box\"](ret.size);\t\n\t\tthis.parsingMdat = box;\n\t\tthis.boxes.push(box);\n\t\tthis.mdats.push(box);\t\t\t\n\t\tbox.start = ret.start;\n\t\tbox.hdr_size = ret.hdr_size;\n\t\tthis.stream.addUsedBytes(box.hdr_size);\n\n\t\t/* indicate that the parsing should start from the end of the box */\n\t\tthis.lastBoxStartPosition = box.start + box.size;\n \t\t/* let's see if we have the end of the box in the other buffers */\n\t\tfound = this.stream.seek(box.start + box.size, false, this.discardMdatData);\n\t\tif (found) {\n\t\t\t/* found the end of the box */\n\t\t\tthis.parsingMdat = null;\n\t\t\t/* let's see if we can parse more in this buffer */\n\t\t\treturn true;\n\t\t} else {\n\t\t\t/* 'mdat' end not found in the existing buffers */\n\t\t\t/* determine the next position in the file to start parsing from */\n\t\t\tif (!this.moovStartFound) {\n\t\t\t\t/* moov not find yet, \n\t\t\t\t the file probably has 'mdat' at the beginning, and 'moov' at the end, \n\t\t\t\t indicate that the downloader should not try to download those bytes now */\n\t\t\t\tthis.nextParsePosition = box.start + box.size;\n\t\t\t} else {\n\t\t\t\t/* we have the start of the moov box, \n\t\t\t\t the next bytes should try to complete the current 'mdat' */\n\t\t\t\tthis.nextParsePosition = this.stream.findEndContiguousBuf();\n\t\t\t}\n\t\t\t/* not much we can do, wait for more buffers to arrive */\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\t/* box is incomplete, we may not even know its type */\n\t\tif (ret.type === \"moov\") { \n\t\t\t/* the incomplete box is a 'moov' box */\n\t\t\tthis.moovStartFound = true;\n\t\t\tif (this.mdats.length === 0) {\n\t\t\t\tthis.isProgressive = true;\n\t\t\t}\n\t\t}\n\t\t/* either it's not an mdat box (and we need to parse it, we cannot skip it)\n\t\t (TODO: we could skip 'free' boxes ...)\n\t\t\t or we did not have enough data to parse the type and size of the box, \n\t\t we try to concatenate the current buffer with the next buffer to restart parsing */\n\t\tmerged = (this.stream.mergeNextBuffer ? this.stream.mergeNextBuffer() : false);\n\t\tif (merged) {\n\t\t\t/* The next buffer was contiguous, the merging succeeded,\n\t\t\t we can now continue parsing, \n\t\t\t the next best position to parse is at the end of this new buffer */\n\t\t\tthis.nextParsePosition = this.stream.getEndPosition();\n\t\t\treturn true;\n\t\t} else {\n\t\t\t/* we cannot concatenate existing buffers because they are not contiguous or because there is no additional buffer */\n\t\t\t/* The next best position to parse is still at the end of this old buffer */\n\t\t\tif (!ret.type) {\n\t\t\t\t/* There were not enough bytes in the buffer to parse the box type and length,\n\t\t\t\t the next fetch should retrieve those missing bytes, i.e. the next bytes after this buffer */\n\t\t\t\tthis.nextParsePosition = this.stream.getEndPosition();\n\t\t\t} else {\n\t\t\t\t/* we had enough bytes to parse size and type of the incomplete box\n\t\t\t\t if we haven't found yet the moov box, skip this one and try the next one \n\t\t\t\t if we have found the moov box, let's continue linear parsing */\n\t\t\t\tif (this.moovStartFound) {\n\t\t\t\t\tthis.nextParsePosition = this.stream.getEndPosition();\n\t\t\t\t} else {\n\t\t\t\t\tthis.nextParsePosition = this.stream.getPosition() + ret.size;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nISOFile.prototype.hasIncompleteMdat = function () {\n\treturn (this.parsingMdat !== null);\n}\n\nISOFile.prototype.processIncompleteMdat = function () {\n\tvar box;\n\tvar found;\n\t\n\t/* we are in the parsing of an incomplete mdat box */\n\tbox = this.parsingMdat;\n\n\tfound = this.stream.seek(box.start + box.size, false, this.discardMdatData);\n\tif (found) {\n\t\tLog.debug(\"ISOFile\", \"Found 'mdat' end in buffered data\");\n\t\t/* the end of the mdat has been found */ \n\t\tthis.parsingMdat = null;\n\t\t/* we can parse more in this buffer */\n\t\treturn true;\n\t} else {\n\t\t/* we don't have the end of this mdat yet, \n\t\t indicate that the next byte to fetch is the end of the buffers we have so far, \n\t\t return and wait for more buffer to come */\n\t\tthis.nextParsePosition = this.stream.findEndContiguousBuf();\n\t\treturn false;\n\t}\n}\n\nISOFile.prototype.restoreParsePosition = function() {\n\t/* Reposition at the start position of the previous box not entirely parsed */\n\treturn this.stream.seek(this.lastBoxStartPosition, true, this.discardMdatData);\n}\n\nISOFile.prototype.saveParsePosition = function() {\n\t/* remember the position of the box start in case we need to roll back (if the box is incomplete) */\n\tthis.lastBoxStartPosition = this.stream.getPosition();\t\n}\n\nISOFile.prototype.updateUsedBytes = function(box, ret) {\n\tif (this.stream.addUsedBytes) {\n\t\tif (box.type === \"mdat\") {\n\t\t\t/* for an mdat box, only its header is considered used, other bytes will be used when sample data is requested */\n\t\t\tthis.stream.addUsedBytes(box.hdr_size);\n\t\t\tif (this.discardMdatData) {\n\t\t\t\tthis.stream.addUsedBytes(box.size-box.hdr_size);\n\t\t\t}\n\t\t} else {\n\t\t\t/* for all other boxes, the entire box data is considered used */\n\t\t\tthis.stream.addUsedBytes(box.size);\n\t\t}\t\n\t}\n}\n// file:src/isofile-advanced-creation.js\nISOFile.prototype.add = BoxParser.Box.prototype.add;\nISOFile.prototype.addBox = BoxParser.Box.prototype.addBox;\n\nISOFile.prototype.init = function (_options) {\n\tvar options = _options || {}; \n\tvar ftyp = this.add(\"ftyp\").set(\"major_brand\", (options.brands && options.brands[0]) || \"iso4\")\n\t\t\t\t\t\t\t .set(\"minor_version\", 0)\n\t\t\t\t\t\t\t .set(\"compatible_brands\", options.brands || [\"iso4\"]);\n\tvar moov = this.add(\"moov\");\n\tmoov.add(\"mvhd\").set(\"timescale\", options.timescale || 600)\n\t\t\t\t\t.set(\"rate\", options.rate || 1<<16)\n\t\t\t\t\t.set(\"creation_time\", 0)\n\t\t\t\t\t.set(\"modification_time\", 0)\n\t\t\t\t\t.set(\"duration\", options.duration || 0)\n\t\t\t\t\t.set(\"volume\", (options.width) ? 0 : 0x0100)\n\t\t\t\t\t.set(\"matrix\", [ 1<<16, 0, 0, 0, 1<<16, 0, 0, 0, 0x40000000])\n\t\t\t\t\t.set(\"next_track_id\", 1);\n\tmoov.add(\"mvex\");\n\treturn this;\n}\n\nISOFile.prototype.addTrack = function (_options) {\n\tif (!this.moov) {\n\t\tthis.init(_options);\n\t}\n\n\tvar options = _options || {}; \n\toptions.width = options.width || 320;\n\toptions.height = options.height || 320;\n\toptions.id = options.id || this.moov.mvhd.next_track_id;\n\toptions.type = options.type || \"avc1\";\n\n\tvar trak = this.moov.add(\"trak\");\n\tthis.moov.mvhd.next_track_id = options.id+1;\n\ttrak.add(\"tkhd\").set(\"flags\",BoxParser.TKHD_FLAG_ENABLED | \n\t\t\t\t\t\t\t\t BoxParser.TKHD_FLAG_IN_MOVIE | \n\t\t\t\t\t\t\t\t BoxParser.TKHD_FLAG_IN_PREVIEW)\n\t\t\t\t\t.set(\"creation_time\",0)\n\t\t\t\t\t.set(\"modification_time\", 0)\n\t\t\t\t\t.set(\"track_id\", options.id)\n\t\t\t\t\t.set(\"duration\", options.duration || 0)\n\t\t\t\t\t.set(\"layer\", options.layer || 0)\n\t\t\t\t\t.set(\"alternate_group\", 0)\n\t\t\t\t\t.set(\"volume\", 1)\n\t\t\t\t\t.set(\"matrix\", [ 1<<16, 0, 0, 0, 1<<16, 0, 0, 0, 0x40000000 ])\n\t\t\t\t\t.set(\"width\", options.width << 16)\n\t\t\t\t\t.set(\"height\", options.height << 16);\n\n\tvar mdia = trak.add(\"mdia\");\n\tmdia.add(\"mdhd\").set(\"creation_time\", 0)\n\t\t\t\t\t.set(\"modification_time\", 0)\n\t\t\t\t\t.set(\"timescale\", options.timescale || 1)\n\t\t\t\t\t.set(\"duration\", options.media_duration || 0)\n\t\t\t\t\t.set(\"language\", options.language || \"und\");\n\n\tmdia.add(\"hdlr\").set(\"handler\", options.hdlr || \"vide\")\n\t\t\t\t\t.set(\"name\", options.name || \"Track created with MP4Box.js\");\n\n\tmdia.add(\"elng\").set(\"extended_language\", options.language || \"fr-FR\");\n\n\tvar minf = mdia.add(\"minf\");\n\tif (BoxParser[options.type+\"SampleEntry\"] === undefined) return;\n\tvar sample_description_entry = new BoxParser[options.type+\"SampleEntry\"]();\n\tsample_description_entry.data_reference_index = 1;\n\tvar media_type = \"\";\n\tfor (var mediaType in BoxParser.sampleEntryCodes) {\n\t\tvar codes = BoxParser.sampleEntryCodes[mediaType];\n\t\tfor (var i = 0; i < codes.length; i++) {\n\t\t\tif (codes.indexOf(options.type) > -1) {\n\t\t\t\tmedia_type = mediaType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tswitch(media_type) {\n\t\tcase \"Visual\":\n\t\t\tminf.add(\"vmhd\").set(\"graphicsmode\",0).set(\"opcolor\", [ 0, 0, 0 ]);\n\t\t\tsample_description_entry.set(\"width\", options.width)\n\t\t\t\t\t\t.set(\"height\", options.height)\n\t\t\t\t\t\t.set(\"horizresolution\", 0x48<<16)\n\t\t\t\t\t\t.set(\"vertresolution\", 0x48<<16)\n\t\t\t\t\t\t.set(\"frame_count\", 1)\n\t\t\t\t\t\t.set(\"compressorname\", options.type+\" Compressor\")\n\t\t\t\t\t\t.set(\"depth\", 0x18);\n\t\t\tif (options.avcDecoderConfigRecord) {\n\t\t\t\tvar avcC = new BoxParser.avcCBox();\n\t\t\t\tavcC.parse(new MP4BoxStream(options.avcDecoderConfigRecord));\n\t\t\t\tsample_description_entry.addBox(avcC);\n\t\t\t} else if (options.hevcDecoderConfigRecord) {\n\t\t\t\tvar hvcC = new BoxParser.hvcCBox();\n\t\t\t\thvcC.parse(new MP4BoxStream(options.hevcDecoderConfigRecord));\n\t\t\t\tsample_description_entry.addBox(hvcC);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"Audio\":\n\t\t\tminf.add(\"smhd\").set(\"balance\", options.balance || 0);\n\t\t\tsample_description_entry.set(\"channel_count\", options.channel_count || 2)\n\t\t\t\t\t\t.set(\"samplesize\", options.samplesize || 16)\n\t\t\t\t\t\t.set(\"samplerate\", options.samplerate || 1<<16);\n\t\t\tbreak;\n\t\tcase \"Hint\":\n\t\t\tminf.add(\"hmhd\"); // TODO: add properties\n\t\t\tbreak;\n\t\tcase \"Subtitle\":\n\t\t\tminf.add(\"sthd\");\n\t\t\tswitch (options.type) {\n\t\t\t\tcase \"stpp\":\n\t\t\t\t\tsample_description_entry.set(\"namespace\", options.namespace || \"nonamespace\")\n\t\t\t\t\t\t\t\t.set(\"schema_location\", options.schema_location || \"\")\n\t\t\t\t\t\t\t\t.set(\"auxiliary_mime_types\", options.auxiliary_mime_types || \"\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"Metadata\":\n\t\t\tminf.add(\"nmhd\");\n\t\t\tbreak;\n\t\tcase \"System\":\n\t\t\tminf.add(\"nmhd\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tminf.add(\"nmhd\");\n\t\t\tbreak;\n\t}\n\tif (options.description) {\n\t\tsample_description_entry.addBox(options.description);\n\t}\n\tif (options.description_boxes) {\n\t\toptions.description_boxes.forEach(function (b) {\n\t\t\tsample_description_entry.addBox(b);\n\t\t});\n\t}\n\tminf.add(\"dinf\").add(\"dref\").addEntry((new BoxParser[\"url Box\"]()).set(\"flags\", 0x1));\n\tvar stbl = minf.add(\"stbl\");\n\tstbl.add(\"stsd\").addEntry(sample_description_entry);\n\tstbl.add(\"stts\").set(\"sample_counts\", [])\n\t\t\t\t\t.set(\"sample_deltas\", []);\n\tstbl.add(\"stsc\").set(\"first_chunk\", [])\n\t\t\t\t\t.set(\"samples_per_chunk\", [])\n\t\t\t\t\t.set(\"sample_description_index\", []);\n\tstbl.add(\"stco\").set(\"chunk_offsets\", []);\n\tstbl.add(\"stsz\").set(\"sample_sizes\", []);\n\n\tthis.moov.mvex.add(\"trex\").set(\"track_id\", options.id)\n\t\t\t\t\t\t\t .set(\"default_sample_description_index\", options.default_sample_description_index || 1)\n\t\t\t\t\t\t\t .set(\"default_sample_duration\", options.default_sample_duration || 0)\n\t\t\t\t\t\t\t .set(\"default_sample_size\", options.default_sample_size || 0)\n\t\t\t\t\t\t\t .set(\"default_sample_flags\", options.default_sample_flags || 0);\n\tthis.buildTrakSampleLists(trak);\n\treturn options.id;\n}\n\nBoxParser.Box.prototype.computeSize = function(stream_) {\n\tvar stream = stream_ || new DataStream();\n\tstream.endianness = DataStream.BIG_ENDIAN;\n\tthis.write(stream);\n}\n\nISOFile.prototype.addSample = function (track_id, data, _options) {\n\tvar options = _options || {};\n\tvar sample = {};\n\tvar trak = this.getTrackById(track_id);\n\tif (trak === null) return;\n sample.number = trak.samples.length;\n\tsample.track_id = trak.tkhd.track_id;\n\tsample.timescale = trak.mdia.mdhd.timescale;\n\tsample.description_index = (options.sample_description_index ? options.sample_description_index - 1: 0);\n\tsample.description = trak.mdia.minf.stbl.stsd.entries[sample.description_index];\n\tsample.data = data;\n\tsample.size = data.byteLength;\n\tsample.alreadyRead = sample.size;\n\tsample.duration = options.duration || 1;\n\tsample.cts = options.cts || 0;\n\tsample.dts = options.dts || 0;\n\tsample.is_sync = options.is_sync || false;\n\tsample.is_leading = options.is_leading || 0;\n\tsample.depends_on = options.depends_on || 0;\n\tsample.is_depended_on = options.is_depended_on || 0;\n\tsample.has_redundancy = options.has_redundancy || 0;\n\tsample.degradation_priority = options.degradation_priority || 0;\n\tsample.offset = 0;\n\tsample.subsamples = options.subsamples;\n\ttrak.samples.push(sample);\n\ttrak.samples_size += sample.size;\n\ttrak.samples_duration += sample.duration;\n\tif (trak.first_dts === undefined) {\n\t\ttrak.first_dts = options.dts;\n\t}\n\n\tthis.processSamples();\n\t\n\tvar moof = this.createSingleSampleMoof(sample);\n\tthis.addBox(moof);\n\tmoof.computeSize();\n\t/* adjusting the data_offset now that the moof size is known*/\n\tmoof.trafs[0].truns[0].data_offset = moof.size+8; //8 is mdat header\n\tthis.add(\"mdat\").data = new Uint8Array(data);\n\treturn sample;\n}\n\nISOFile.prototype.createSingleSampleMoof = function(sample) {\n\tvar sample_flags = 0;\n\tif (sample.is_sync)\n\t\tsample_flags = (1 << 25); // sample_depends_on_none (I picture)\n\telse\n\t\tsample_flags = (1 << 16); // non-sync\n\n\tvar moof = new BoxParser.moofBox();\n\tmoof.add(\"mfhd\").set(\"sequence_number\", this.nextMoofNumber);\n\tthis.nextMoofNumber++;\n\tvar traf = moof.add(\"traf\");\n\tvar trak = this.getTrackById(sample.track_id);\n\ttraf.add(\"tfhd\").set(\"track_id\", sample.track_id)\n\t\t\t\t\t.set(\"flags\", BoxParser.TFHD_FLAG_DEFAULT_BASE_IS_MOOF);\n\ttraf.add(\"tfdt\").set(\"baseMediaDecodeTime\", (sample.dts - (trak.first_dts || 0)));\n\ttraf.add(\"trun\").set(\"flags\", BoxParser.TRUN_FLAGS_DATA_OFFSET | BoxParser.TRUN_FLAGS_DURATION | \n\t\t\t\t \t\t\t\t BoxParser.TRUN_FLAGS_SIZE | BoxParser.TRUN_FLAGS_FLAGS | \n\t\t\t\t \t\t\t\t BoxParser.TRUN_FLAGS_CTS_OFFSET)\n\t\t\t\t\t.set(\"data_offset\",0)\n\t\t\t\t\t.set(\"first_sample_flags\",0)\n\t\t\t\t\t.set(\"sample_count\",1)\n\t\t\t\t\t.set(\"sample_duration\",[sample.duration])\n\t\t\t\t\t.set(\"sample_size\",[sample.size])\n\t\t\t\t\t.set(\"sample_flags\",[sample_flags])\n\t\t\t\t\t.set(\"sample_composition_time_offset\", [sample.cts - sample.dts]);\n\treturn moof;\n}\n\n// file:src/isofile-sample-processing.js\n/* Index of the last moof box received */\nISOFile.prototype.lastMoofIndex = 0;\n\n/* size of the buffers allocated for samples */\nISOFile.prototype.samplesDataSize = 0;\n\n/* Resets all sample tables */\nISOFile.prototype.resetTables = function () {\n\tvar i;\n\tvar trak, stco, stsc, stsz, stts, ctts, stss;\n\tthis.initial_duration = this.moov.mvhd.duration;\n\tthis.moov.mvhd.duration = 0;\n\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\ttrak = this.moov.traks[i];\n\t\ttrak.tkhd.duration = 0;\n\t\ttrak.mdia.mdhd.duration = 0;\n\t\tstco = trak.mdia.minf.stbl.stco || trak.mdia.minf.stbl.co64;\n\t\tstco.chunk_offsets = [];\n\t\tstsc = trak.mdia.minf.stbl.stsc;\n\t\tstsc.first_chunk = [];\n\t\tstsc.samples_per_chunk = [];\n\t\tstsc.sample_description_index = [];\n\t\tstsz = trak.mdia.minf.stbl.stsz || trak.mdia.minf.stbl.stz2;\n\t\tstsz.sample_sizes = [];\n\t\tstts = trak.mdia.minf.stbl.stts;\n\t\tstts.sample_counts = [];\n\t\tstts.sample_deltas = [];\n\t\tctts = trak.mdia.minf.stbl.ctts;\n\t\tif (ctts) {\n\t\t\tctts.sample_counts = [];\n\t\t\tctts.sample_offsets = [];\n\t\t}\n\t\tstss = trak.mdia.minf.stbl.stss;\n\t\tvar k = trak.mdia.minf.stbl.boxes.indexOf(stss);\n\t\tif (k != -1) trak.mdia.minf.stbl.boxes[k] = null;\n\t}\n}\n\nISOFile.initSampleGroups = function(trak, traf, sbgps, trak_sgpds, traf_sgpds) {\n\tvar l;\n\tvar k;\n\tvar sample_groups_info;\n\tvar sample_group_info;\n\tvar sample_group_key;\n\tfunction SampleGroupInfo(_type, _parameter, _sbgp) {\n\t\tthis.grouping_type = _type;\n\t\tthis.grouping_type_parameter = _parameter;\n\t\tthis.sbgp = _sbgp;\n\t\tthis.last_sample_in_run = -1;\n\t\tthis.entry_index = -1;\t\t\n\t}\n\tif (traf) {\n\t\ttraf.sample_groups_info = [];\n\t} \n\tif (!trak.sample_groups_info) {\n\t\ttrak.sample_groups_info = [];\n\t}\n\tfor (k = 0; k < sbgps.length; k++) {\n\t\tsample_group_key = sbgps[k].grouping_type +\"/\"+ sbgps[k].grouping_type_parameter;\n\t\tsample_group_info = new SampleGroupInfo(sbgps[k].grouping_type, sbgps[k].grouping_type_parameter, sbgps[k]);\n\t\tif (traf) {\n\t\t\ttraf.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t}\n\t\tif (!trak.sample_groups_info[sample_group_key]) {\n\t\t\ttrak.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t}\n\t\tfor (l=0; l = 2) {\n\t\t\t\tsample_group_key = trak_sgpds[k].grouping_type +\"/0\";\n\t\t\t\tsample_group_info = new SampleGroupInfo(trak_sgpds[k].grouping_type, 0);\n\t\t\t\tif (!trak.sample_groups_info[sample_group_key]) {\n\t\t\t\t\ttrak.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (traf_sgpds) {\n\t\t\tfor (k = 0; k < traf_sgpds.length; k++) {\n\t\t\t\tif (!traf_sgpds[k].used && traf_sgpds[k].version >= 2) {\n\t\t\t\t\tsample_group_key = traf_sgpds[k].grouping_type +\"/0\";\n\t\t\t\t\tsample_group_info = new SampleGroupInfo(traf_sgpds[k].grouping_type, 0);\n\t\t\t\t\tsample_group_info.is_fragment = true;\n\t\t\t\t\tif (!traf.sample_groups_info[sample_group_key]) {\n\t\t\t\t\t\ttraf.sample_groups_info[sample_group_key] = sample_group_info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.setSampleGroupProperties = function(trak, sample, sample_number, sample_groups_info) {\n\tvar k;\n\tvar index;\n\tsample.sample_groups = [];\n\tfor (k in sample_groups_info) {\n\t\tsample.sample_groups[k] = {};\n\t\tsample.sample_groups[k].grouping_type = sample_groups_info[k].grouping_type;\n\t\tsample.sample_groups[k].grouping_type_parameter = sample_groups_info[k].grouping_type_parameter;\n\t\tif (sample_number >= sample_groups_info[k].last_sample_in_run) {\n\t\t\tif (sample_groups_info[k].last_sample_in_run < 0) {\n\t\t\t\tsample_groups_info[k].last_sample_in_run = 0;\n\t\t\t}\n\t\t\tsample_groups_info[k].entry_index++;\t\n\t\t\tif (sample_groups_info[k].entry_index <= sample_groups_info[k].sbgp.entries.length - 1) {\n\t\t\t\tsample_groups_info[k].last_sample_in_run += sample_groups_info[k].sbgp.entries[sample_groups_info[k].entry_index].sample_count;\n\t\t\t}\n\t\t}\n\t\tif (sample_groups_info[k].entry_index <= sample_groups_info[k].sbgp.entries.length - 1) {\n\t\t\tsample.sample_groups[k].group_description_index = sample_groups_info[k].sbgp.entries[sample_groups_info[k].entry_index].group_description_index;\n\t\t} else {\n\t\t\tsample.sample_groups[k].group_description_index = -1; // special value for not defined\n\t\t}\n\t\tif (sample.sample_groups[k].group_description_index !== 0) {\n\t\t\tvar description;\n\t\t\tif (sample_groups_info[k].fragment_description) {\n\t\t\t\tdescription = sample_groups_info[k].fragment_description;\n\t\t\t} else {\n\t\t\t\tdescription = sample_groups_info[k].description;\n\t\t\t}\n\t\t\tif (sample.sample_groups[k].group_description_index > 0) {\n\t\t\t\tif (sample.sample_groups[k].group_description_index > 65535) {\n\t\t\t\t\tindex = (sample.sample_groups[k].group_description_index >> 16)-1;\n\t\t\t\t} else {\n\t\t\t\t\tindex = sample.sample_groups[k].group_description_index-1;\n\t\t\t\t}\n\t\t\t\tif (description && index >= 0) {\n\t\t\t\t\tsample.sample_groups[k].description = description.entries[index];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (description && description.version >= 2) {\n\t\t\t\t\tif (description.default_group_description_index > 0) {\t\t\t\t\t\t\t\t\n\t\t\t\t\t\tsample.sample_groups[k].description = description.entries[description.default_group_description_index-1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.process_sdtp = function (sdtp, sample, number) {\n\tif (!sample) {\n\t\treturn;\n\t}\n\tif (sdtp) {\n\t\tsample.is_leading = sdtp.is_leading[number];\n\t\tsample.depends_on = sdtp.sample_depends_on[number];\n\t\tsample.is_depended_on = sdtp.sample_is_depended_on[number];\n\t\tsample.has_redundancy = sdtp.sample_has_redundancy[number];\n\t} else {\n\t\tsample.is_leading = 0;\n\t\tsample.depends_on = 0;\n\t\tsample.is_depended_on = 0\n\t\tsample.has_redundancy = 0;\n\t}\t\n}\n\n/* Build initial sample list from sample tables */\nISOFile.prototype.buildSampleLists = function() {\t\n\tvar i;\n\tvar trak;\n\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\ttrak = this.moov.traks[i];\n\t\tthis.buildTrakSampleLists(trak);\n\t}\n}\n\nISOFile.prototype.buildTrakSampleLists = function(trak) {\t\n\tvar j, k;\n\tvar stco, stsc, stsz, stts, ctts, stss, stsd, subs, sbgps, sgpds, stdp;\n\tvar chunk_run_index, chunk_index, last_chunk_in_run, offset_in_chunk, last_sample_in_chunk;\n\tvar last_sample_in_stts_run, stts_run_index, last_sample_in_ctts_run, ctts_run_index, last_stss_index, last_subs_index, subs_entry_index, last_subs_sample_index;\n\n\ttrak.samples = [];\n\ttrak.samples_duration = 0;\n\ttrak.samples_size = 0;\n\tstco = trak.mdia.minf.stbl.stco || trak.mdia.minf.stbl.co64;\n\tstsc = trak.mdia.minf.stbl.stsc;\n\tstsz = trak.mdia.minf.stbl.stsz || trak.mdia.minf.stbl.stz2;\n\tstts = trak.mdia.minf.stbl.stts;\n\tctts = trak.mdia.minf.stbl.ctts;\n\tstss = trak.mdia.minf.stbl.stss;\n\tstsd = trak.mdia.minf.stbl.stsd;\n\tsubs = trak.mdia.minf.stbl.subs;\n\tstdp = trak.mdia.minf.stbl.stdp;\n\tsbgps = trak.mdia.minf.stbl.sbgps;\n\tsgpds = trak.mdia.minf.stbl.sgpds;\n\t\n\tlast_sample_in_stts_run = -1;\n\tstts_run_index = -1;\n\tlast_sample_in_ctts_run = -1;\n\tctts_run_index = -1;\n\tlast_stss_index = 0;\n\tsubs_entry_index = 0;\n\tlast_subs_sample_index = 0;\t\t\n\n\tISOFile.initSampleGroups(trak, null, sbgps, sgpds);\n\n\tif (typeof stsz === \"undefined\") {\n\t\treturn;\n\t}\n\n\t/* we build the samples one by one and compute their properties */\n\tfor (j = 0; j < stsz.sample_sizes.length; j++) {\n\t\tvar sample = {};\n\t\tsample.number = j;\n\t\tsample.track_id = trak.tkhd.track_id;\n\t\tsample.timescale = trak.mdia.mdhd.timescale;\n\t\tsample.alreadyRead = 0;\n\t\ttrak.samples[j] = sample;\n\t\t/* size can be known directly */\n\t\tsample.size = stsz.sample_sizes[j];\n\t\ttrak.samples_size += sample.size;\n\t\t/* computing chunk-based properties (offset, sample description index)*/\n\t\tif (j === 0) {\t\t\t\t\n\t\t\tchunk_index = 1; /* the first sample is in the first chunk (chunk indexes are 1-based) */\n\t\t\tchunk_run_index = 0; /* the first chunk is the first entry in the first_chunk table */\n\t\t\tsample.chunk_index = chunk_index;\n\t\t\tsample.chunk_run_index = chunk_run_index;\n\t\t\tlast_sample_in_chunk = stsc.samples_per_chunk[chunk_run_index];\n\t\t\toffset_in_chunk = 0;\n\n\t\t\t/* Is there another entry in the first_chunk table ? */\n\t\t\tif (chunk_run_index + 1 < stsc.first_chunk.length) {\n\t\t\t\t/* The last chunk in the run is the chunk before the next first chunk */\n\t\t\t\tlast_chunk_in_run = stsc.first_chunk[chunk_run_index+1]-1; \t\n\t\t\t} else {\n\t\t\t\t/* There is only one entry in the table, it is valid for all future chunks*/\n\t\t\t\tlast_chunk_in_run = Infinity;\n\t\t\t}\n\t\t} else {\n\t\t\tif (j < last_sample_in_chunk) {\n\t\t\t\t/* the sample is still in the current chunk */\n\t\t\t\tsample.chunk_index = chunk_index;\n\t\t\t\tsample.chunk_run_index = chunk_run_index;\n\t\t\t} else {\n\t\t\t\t/* the sample is in the next chunk */\n\t\t\t\tchunk_index++;\n\t\t\t\tsample.chunk_index = chunk_index;\n\t\t\t\t/* reset the accumulated offset in the chunk */\n\t\t\t\toffset_in_chunk = 0;\n\t\t\t\tif (chunk_index <= last_chunk_in_run) {\n\t\t\t\t\t/* stay in the same entry of the first_chunk table */\n\t\t\t\t\t/* chunk_run_index unmodified */\n\t\t\t\t} else {\n\t\t\t\t\tchunk_run_index++;\n\t\t\t\t\t/* Is there another entry in the first_chunk table ? */\n\t\t\t\t\tif (chunk_run_index + 1 < stsc.first_chunk.length) {\n\t\t\t\t\t\t/* The last chunk in the run is the chunk before the next first chunk */\n\t\t\t\t\t\tlast_chunk_in_run = stsc.first_chunk[chunk_run_index+1]-1; \t\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/* There is only one entry in the table, it is valid for all future chunks*/\n\t\t\t\t\t\tlast_chunk_in_run = Infinity;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tsample.chunk_run_index = chunk_run_index;\n\t\t\t\tlast_sample_in_chunk += stsc.samples_per_chunk[chunk_run_index];\n\t\t\t}\n\t\t}\n\n\t\tsample.description_index = stsc.sample_description_index[sample.chunk_run_index]-1;\n\t\tsample.description = stsd.entries[sample.description_index];\n\t\tsample.offset = stco.chunk_offsets[sample.chunk_index-1] + offset_in_chunk; /* chunk indexes are 1-based */\n\t\toffset_in_chunk += sample.size;\n\n\t\t/* setting dts, cts, duration and rap flags */\n\t\tif (j > last_sample_in_stts_run) {\n\t\t\tstts_run_index++;\n\t\t\tif (last_sample_in_stts_run < 0) {\n\t\t\t\tlast_sample_in_stts_run = 0;\n\t\t\t}\n\t\t\tlast_sample_in_stts_run += stts.sample_counts[stts_run_index];\t\t\t\t\n\t\t}\n\t\tif (j > 0) {\n\t\t\ttrak.samples[j-1].duration = stts.sample_deltas[stts_run_index];\n\t\t\ttrak.samples_duration += trak.samples[j-1].duration;\n\t\t\tsample.dts = trak.samples[j-1].dts + trak.samples[j-1].duration;\n\t\t} else {\n\t\t\tsample.dts = 0;\n\t\t}\n\t\tif (ctts) {\n\t\t\tif (j >= last_sample_in_ctts_run) {\n\t\t\t\tctts_run_index++;\n\t\t\t\tif (last_sample_in_ctts_run < 0) {\n\t\t\t\t\tlast_sample_in_ctts_run = 0;\n\t\t\t\t}\n\t\t\t\tlast_sample_in_ctts_run += ctts.sample_counts[ctts_run_index];\t\t\t\t\n\t\t\t}\n\t\t\tsample.cts = trak.samples[j].dts + ctts.sample_offsets[ctts_run_index];\n\t\t} else {\n\t\t\tsample.cts = sample.dts;\n\t\t}\n\t\tif (stss) {\n\t\t\tif (j == stss.sample_numbers[last_stss_index] - 1) { // sample numbers are 1-based\n\t\t\t\tsample.is_sync = true;\n\t\t\t\tlast_stss_index++;\n\t\t\t} else {\n\t\t\t\tsample.is_sync = false;\t\t\t\t\n\t\t\t\tsample.degradation_priority = 0;\n\t\t\t}\n\t\t\tif (subs) {\n\t\t\t\tif (subs.entries[subs_entry_index].sample_delta + last_subs_sample_index == j+1) {\n\t\t\t\t\tsample.subsamples = subs.entries[subs_entry_index].subsamples;\n\t\t\t\t\tlast_subs_sample_index += subs.entries[subs_entry_index].sample_delta;\n\t\t\t\t\tsubs_entry_index++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tsample.is_sync = true;\n\t\t}\n\t\tISOFile.process_sdtp(trak.mdia.minf.stbl.sdtp, sample, sample.number);\n\t\tif (stdp) {\n\t\t\tsample.degradation_priority = stdp.priority[j];\n\t\t} else {\n\t\t\tsample.degradation_priority = 0;\n\t\t}\n\t\tif (subs) {\n\t\t\tif (subs.entries[subs_entry_index].sample_delta + last_subs_sample_index == j) {\n\t\t\t\tsample.subsamples = subs.entries[subs_entry_index].subsamples;\n\t\t\t\tlast_subs_sample_index += subs.entries[subs_entry_index].sample_delta;\n\t\t\t}\n\t\t}\n\t\tif (sbgps.length > 0 || sgpds.length > 0) {\n\t\t\tISOFile.setSampleGroupProperties(trak, sample, j, trak.sample_groups_info);\n\t\t}\n\t}\n\tif (j>0) {\n\t\ttrak.samples[j-1].duration = Math.max(trak.mdia.mdhd.duration - trak.samples[j-1].dts, 0);\n\t\ttrak.samples_duration += trak.samples[j-1].duration;\n\t}\n}\n\n/* Update sample list when new 'moof' boxes are received */\nISOFile.prototype.updateSampleLists = function() {\t\n\tvar i, j, k;\n\tvar default_sample_description_index, default_sample_duration, default_sample_size, default_sample_flags;\n\tvar last_run_position;\n\tvar box, moof, traf, trak, trex;\n\tvar sample;\n\tvar sample_flags;\n\t\n\tif (this.moov === undefined) {\n\t\treturn;\n\t}\n\t/* if the input file is fragmented and fetched in multiple downloads, we need to update the list of samples */\n\twhile (this.lastMoofIndex < this.moofs.length) {\n\t\tbox = this.moofs[this.lastMoofIndex];\n\t\tthis.lastMoofIndex++;\n\t\tif (box.type == \"moof\") {\n\t\t\tmoof = box;\n\t\t\tfor (i = 0; i < moof.trafs.length; i++) {\n\t\t\t\ttraf = moof.trafs[i];\n\t\t\t\ttrak = this.getTrackById(traf.tfhd.track_id);\n\t\t\t\ttrex = this.getTrexById(traf.tfhd.track_id);\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_DESC) {\n\t\t\t\t\tdefault_sample_description_index = traf.tfhd.default_sample_description_index;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_description_index = (trex ? trex.default_sample_description_index: 1);\n\t\t\t\t}\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_DUR) {\n\t\t\t\t\tdefault_sample_duration = traf.tfhd.default_sample_duration;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_duration = (trex ? trex.default_sample_duration : 0);\n\t\t\t\t}\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_SIZE) {\n\t\t\t\t\tdefault_sample_size = traf.tfhd.default_sample_size;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_size = (trex ? trex.default_sample_size : 0);\n\t\t\t\t}\n\t\t\t\tif (traf.tfhd.flags & BoxParser.TFHD_FLAG_SAMPLE_FLAGS) {\n\t\t\t\t\tdefault_sample_flags = traf.tfhd.default_sample_flags;\n\t\t\t\t} else {\n\t\t\t\t\tdefault_sample_flags = (trex ? trex.default_sample_flags : 0);\n\t\t\t\t}\n\t\t\t\ttraf.sample_number = 0;\n\t\t\t\t/* process sample groups */\n\t\t\t\tif (traf.sbgps.length > 0) {\n\t\t\t\t\tISOFile.initSampleGroups(trak, traf, traf.sbgps, trak.mdia.minf.stbl.sgpds, traf.sgpds);\n\t\t\t\t}\n\t\t\t\tfor (j = 0; j < traf.truns.length; j++) {\n\t\t\t\t\tvar trun = traf.truns[j];\n\t\t\t\t\tfor (k = 0; k < trun.sample_count; k++) {\n\t\t\t\t\t\tsample = {};\n\t\t\t\t\t\tsample.moof_number = this.lastMoofIndex;\n\t\t\t\t\t\tsample.number_in_traf = traf.sample_number;\n\t\t\t\t\t\ttraf.sample_number++;\n\t\t\t sample.number = trak.samples.length;\n\t\t\t\t\t\ttraf.first_sample_index = trak.samples.length;\n\t\t\t\t\t\ttrak.samples.push(sample);\n\t\t\t\t\t\tsample.track_id = trak.tkhd.track_id;\n\t\t\t\t\t\tsample.timescale = trak.mdia.mdhd.timescale;\n\t\t\t\t\t\tsample.description_index = default_sample_description_index-1;\n\t\t\t\t\t\tsample.description = trak.mdia.minf.stbl.stsd.entries[sample.description_index];\n\t\t\t\t\t\tsample.size = default_sample_size;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_SIZE) {\n\t\t\t\t\t\t\tsample.size = trun.sample_size[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrak.samples_size += sample.size;\n\t\t\t\t\t\tsample.duration = default_sample_duration;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_DURATION) {\n\t\t\t\t\t\t\tsample.duration = trun.sample_duration[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttrak.samples_duration += sample.duration;\n\t\t\t\t\t\tif (trak.first_traf_merged || k > 0) {\n\t\t\t\t\t\t\tsample.dts = trak.samples[trak.samples.length-2].dts+trak.samples[trak.samples.length-2].duration;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (traf.tfdt) {\n\t\t\t\t\t\t\t\tsample.dts = traf.tfdt.baseMediaDecodeTime;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsample.dts = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttrak.first_traf_merged = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsample.cts = sample.dts;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_CTS_OFFSET) {\n\t\t\t\t\t\t\tsample.cts = sample.dts + trun.sample_composition_time_offset[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsample_flags = default_sample_flags;\n\t\t\t\t\t\tif (trun.flags & BoxParser.TRUN_FLAGS_FLAGS) {\n\t\t\t\t\t\t\tsample_flags = trun.sample_flags[k];\n\t\t\t\t\t\t} else if (k === 0 && (trun.flags & BoxParser.TRUN_FLAGS_FIRST_FLAG)) {\n\t\t\t\t\t\t\tsample_flags = trun.first_sample_flags;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsample.is_sync = ((sample_flags >> 16 & 0x1) ? false : true);\n\t\t\t\t\t\tsample.is_leading = (sample_flags >> 26 & 0x3);\n\t\t\t\t\t\tsample.depends_on = (sample_flags >> 24 & 0x3);\n\t\t\t\t\t\tsample.is_depended_on = (sample_flags >> 22 & 0x3);\n\t\t\t\t\t\tsample.has_redundancy = (sample_flags >> 20 & 0x3);\n\t\t\t\t\t\tsample.degradation_priority = (sample_flags & 0xFFFF);\n\t\t\t\t\t\t//ISOFile.process_sdtp(traf.sdtp, sample, sample.number_in_traf);\n\t\t\t\t\t\tvar bdop = (traf.tfhd.flags & BoxParser.TFHD_FLAG_BASE_DATA_OFFSET) ? true : false;\n\t\t\t\t\t\tvar dbim = (traf.tfhd.flags & BoxParser.TFHD_FLAG_DEFAULT_BASE_IS_MOOF) ? true : false;\n\t\t\t\t\t\tvar dop = (trun.flags & BoxParser.TRUN_FLAGS_DATA_OFFSET) ? true : false;\n\t\t\t\t\t\tvar bdo = 0;\n\t\t\t\t\t\tif (!bdop) {\n\t\t\t\t\t\t\tif (!dbim) {\n\t\t\t\t\t\t\t\tif (j === 0) { // the first track in the movie fragment\n\t\t\t\t\t\t\t\t\tbdo = moof.start; // the position of the first byte of the enclosing Movie Fragment Box\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbdo = last_run_position; // end of the data defined by the preceding *track* (irrespective of the track id) fragment in the moof\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbdo = moof.start;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbdo = traf.tfhd.base_data_offset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j === 0 && k === 0) {\n\t\t\t\t\t\t\tif (dop) {\n\t\t\t\t\t\t\t\tsample.offset = bdo + trun.data_offset; // If the data-offset is present, it is relative to the base-data-offset established in the track fragment header\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsample.offset = bdo; // the data for this run starts the base-data-offset defined by the track fragment header\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsample.offset = last_run_position; // this run starts immediately after the data of the previous run\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlast_run_position = sample.offset + sample.size;\n\t\t\t\t\t\tif (traf.sbgps.length > 0 || traf.sgpds.length > 0 ||\n\t\t\t\t\t\t\ttrak.mdia.minf.stbl.sbgps.length > 0 || trak.mdia.minf.stbl.sgpds.length > 0) {\n\t\t\t\t\t\t\tISOFile.setSampleGroupProperties(trak, sample, sample.number_in_traf, traf.sample_groups_info);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (traf.subs) {\n\t\t\t\t\ttrak.has_fragment_subsamples = true;\n\t\t\t\t\tvar sample_index = traf.first_sample_index;\n\t\t\t\t\tfor (j = 0; j < traf.subs.entries.length; j++) {\n\t\t\t\t\t\tsample_index += traf.subs.entries[j].sample_delta;\n\t\t\t\t\t\tsample = trak.samples[sample_index-1];\n\t\t\t\t\t\tsample.subsamples = traf.subs.entries[j].subsamples;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\t\n}\n\n/* Try to get sample data for a given sample:\n returns null if not found\n returns the same sample if already requested\n */\nISOFile.prototype.getSample = function(trak, sampleNum) {\t\n\tvar buffer;\n\tvar sample = trak.samples[sampleNum];\n\t\n\tif (!this.moov) {\n\t\treturn null;\n\t}\n\n\tif (!sample.data) {\n\t\t/* Not yet fetched */\n\t\tsample.data = new Uint8Array(sample.size);\n\t\tsample.alreadyRead = 0;\n\t\tthis.samplesDataSize += sample.size;\n\t\tLog.debug(\"ISOFile\", \"Allocating sample #\"+sampleNum+\" on track #\"+trak.tkhd.track_id+\" of size \"+sample.size+\" (total: \"+this.samplesDataSize+\")\");\n\t} else if (sample.alreadyRead == sample.size) {\n\t\t/* Already fetched entirely */\n\t\treturn sample;\n\t}\n\n\t/* The sample has only been partially fetched, we need to check in all buffers */\n\twhile(true) {\n\t\tvar index =\tthis.stream.findPosition(true, sample.offset + sample.alreadyRead, false);\n\t\tif (index > -1) {\n\t\t\tbuffer = this.stream.buffers[index];\n\t\t\tvar lengthAfterStart = buffer.byteLength - (sample.offset + sample.alreadyRead - buffer.fileStart);\n\t\t\tif (sample.size - sample.alreadyRead <= lengthAfterStart) {\n\t\t\t\t/* the (rest of the) sample is entirely contained in this buffer */\n\n\t\t\t\tLog.debug(\"ISOFile\",\"Getting sample #\"+sampleNum+\" data (alreadyRead: \"+sample.alreadyRead+\" offset: \"+\n\t\t\t\t\t(sample.offset+sample.alreadyRead - buffer.fileStart)+\" read size: \"+(sample.size - sample.alreadyRead)+\" full size: \"+sample.size+\")\");\n\n\t\t\t\tDataStream.memcpy(sample.data.buffer, sample.alreadyRead,\n\t\t\t\t buffer, sample.offset+sample.alreadyRead - buffer.fileStart, sample.size - sample.alreadyRead);\n\n\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\tbuffer.usedBytes += sample.size - sample.alreadyRead;\n\t\t\t\tthis.stream.logBufferLevel();\n\n\t\t\t\tsample.alreadyRead = sample.size;\n\n\t\t\t\treturn sample;\n\t\t\t} else {\n\t\t\t\t/* the sample does not end in this buffer */\n\n\t\t\t\tif (lengthAfterStart === 0) return null;\n\n\t\t\t\tLog.debug(\"ISOFile\",\"Getting sample #\"+sampleNum+\" partial data (alreadyRead: \"+sample.alreadyRead+\" offset: \"+\n\t\t\t\t\t(sample.offset+sample.alreadyRead - buffer.fileStart)+\" read size: \"+lengthAfterStart+\" full size: \"+sample.size+\")\");\n\n\t\t\t\tDataStream.memcpy(sample.data.buffer, sample.alreadyRead,\n\t\t\t\t buffer, sample.offset+sample.alreadyRead - buffer.fileStart, lengthAfterStart);\n\t\t\t\tsample.alreadyRead += lengthAfterStart;\n\n\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\tbuffer.usedBytes += lengthAfterStart;\n\t\t\t\tthis.stream.logBufferLevel();\n\n\t\t\t\t/* keep looking in the next buffer */\n\t\t\t}\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/* Release the memory used to store the data of the sample */\nISOFile.prototype.releaseSample = function(trak, sampleNum) {\t\n\tvar sample = trak.samples[sampleNum];\n\tif (sample.data) {\n\t\tthis.samplesDataSize -= sample.size;\n\t\tsample.data = null;\n\t\tsample.alreadyRead = 0;\n\t\treturn sample.size;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\nISOFile.prototype.getAllocatedSampleDataSize = function() {\n\treturn this.samplesDataSize;\n}\n\n/* Builds the MIME Type 'codecs' sub-parameters for the whole file */\nISOFile.prototype.getCodecs = function() {\t\n\tvar i;\n\tvar codecs = \"\";\n\tfor (i = 0; i < this.moov.traks.length; i++) {\n\t\tvar trak = this.moov.traks[i];\n\t\tif (i>0) {\n\t\t\tcodecs+=\",\"; \n\t\t}\n\t\tcodecs += trak.mdia.minf.stbl.stsd.entries[0].getCodec();\t\t\n\t}\n\treturn codecs;\n}\n\n/* Helper function */\nISOFile.prototype.getTrexById = function(id) {\t\n\tvar i;\n\tif (!this.moov || !this.moov.mvex) return null;\n\tfor (i = 0; i < this.moov.mvex.trexs.length; i++) {\n\t\tvar trex = this.moov.mvex.trexs[i];\n\t\tif (trex.track_id == id) return trex;\n\t}\n\treturn null;\n}\n\n/* Helper function */\nISOFile.prototype.getTrackById = function(id) {\n\tif (this.moov === undefined) {\n\t\treturn null;\n\t}\n\tfor (var j = 0; j < this.moov.traks.length; j++) {\n\t\tvar trak = this.moov.traks[j];\n\t\tif (trak.tkhd.track_id == id) return trak;\n\t}\n\treturn null;\n}\n// file:src/isofile-item-processing.js\n/* size of the buffers allocated for samples */\nISOFile.prototype.itemsDataSize = 0;\n\nISOFile.prototype.flattenItemInfo = function() {\t\n\tvar items = this.items;\n\tvar entity_groups = this.entity_groups;\n\tvar i, j;\n\tvar item;\n\tvar meta = this.meta;\n\tif (meta === null || meta === undefined) return;\n\tif (meta.hdlr === undefined) return;\n\tif (meta.iinf === undefined) return;\n\tfor (i = 0; i < meta.iinf.item_infos.length; i++) {\n\t\titem = {};\n\t\titem.id = meta.iinf.item_infos[i].item_ID;\n\t\titems[item.id] = item;\n\t\titem.ref_to = [];\n\t\titem.name = meta.iinf.item_infos[i].item_name;\n\t\tif (meta.iinf.item_infos[i].protection_index > 0) {\n\t\t\titem.protection = meta.ipro.protections[meta.iinf.item_infos[i].protection_index-1];\n\t\t}\n\t\tif (meta.iinf.item_infos[i].item_type) {\n\t\t\titem.type = meta.iinf.item_infos[i].item_type;\n\t\t} else {\n\t\t\titem.type = \"mime\";\n\t\t}\n\t\titem.content_type = meta.iinf.item_infos[i].content_type;\n\t\titem.content_encoding = meta.iinf.item_infos[i].content_encoding;\n\t\titem.item_uri_type = meta.iinf.item_infos[i].item_uri_type;\n\t}\n\tif (meta.grpl) {\n\t\tfor (i = 0; i < meta.grpl.boxes.length; i++) {\n\t\t\tentity_group = {};\n\t\t\tentity_group.id = meta.grpl.boxes[i].group_id;\n\t\t\tentity_group.entity_ids = meta.grpl.boxes[i].entity_ids;\n\t\t\tentity_group.type = meta.grpl.boxes[i].type;\n\t\t\tentity_groups[entity_group.id] = entity_group;\n\t\t}\n\t}\n\tif (meta.iloc) {\n\t\tfor(i = 0; i < meta.iloc.items.length; i++) {\n\t\t\tvar offset;\n\t\t\tvar itemloc = meta.iloc.items[i];\n\t\t\titem = items[itemloc.item_ID];\n\t\t\tif (itemloc.data_reference_index !== 0) {\n\t\t\t\tLog.warn(\"Item storage with reference to other files: not supported\");\n\t\t\t\titem.source = meta.dinf.boxes[itemloc.data_reference_index-1];\n\t\t\t}\n\t\t\tswitch(itemloc.construction_method) {\n\t\t\t\tcase 0: // offset into the file referenced by the data reference index\n\t\t\t\tbreak;\n\t\t\t\tcase 1: // offset into the idat box of this meta box\n\t\t\t\tbreak;\n\t\t\t\tcase 2: // offset into another item\n\t\t\t\tLog.warn(\"Item storage with construction_method : not supported\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\titem.extents = [];\n\t\t\titem.size = 0;\n\t\t\tfor (j = 0; j < itemloc.extents.length; j++) {\n\t\t\t\titem.extents[j] = {};\n\t\t\t\titem.extents[j].offset = itemloc.extents[j].extent_offset + itemloc.base_offset;\n\t\t\t\tif (itemloc.construction_method == 1) {\n\t\t\t\t\titem.extents[j].offset += meta.idat.start + meta.idat.hdr_size;\n\t\t\t\t}\n\t\t\t\titem.extents[j].length = itemloc.extents[j].extent_length;\n\t\t\t\titem.extents[j].alreadyRead = 0;\n\t\t\t\titem.size += item.extents[j].length;\n\t\t\t}\n\t\t}\n\t}\n\tif (meta.pitm) {\n\t\titems[meta.pitm.item_id].primary = true;\n\t}\n\tif (meta.iref) {\n\t\tfor (i=0; i 0 && propEntry.property_index-1 < meta.iprp.ipco.boxes.length) {\n\t\t\t\t\t\t\tvar propbox = meta.iprp.ipco.boxes[propEntry.property_index-1];\n\t\t\t\t\t\t\titem.properties[propbox.type] = propbox;\n\t\t\t\t\t\t\titem.properties.boxes.push(propbox);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nISOFile.prototype.getItem = function(item_id) {\t\n\tvar buffer;\n\tvar item;\n\t\n\tif (!this.meta) {\n\t\treturn null;\n\t}\n\n \titem = this.items[item_id];\n\tif (!item.data && item.size) {\n\t\t/* Not yet fetched */\n\t\titem.data = new Uint8Array(item.size);\n\t\titem.alreadyRead = 0;\n\t\tthis.itemsDataSize += item.size;\n\t\tLog.debug(\"ISOFile\", \"Allocating item #\"+item_id+\" of size \"+item.size+\" (total: \"+this.itemsDataSize+\")\");\n\t} else if (item.alreadyRead === item.size) {\n\t\t/* Already fetched entirely */\n\t\treturn item;\n\t}\n\n\t/* The item has only been partially fetched, we need to check in all buffers to find the remaining extents*/\n\n\tfor (var i = 0; i < item.extents.length; i++) {\n\t\tvar extent = item.extents[i];\n\t\tif (extent.alreadyRead === extent.length) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tvar index =\tthis.stream.findPosition(true, extent.offset + extent.alreadyRead, false);\n\t\t\tif (index > -1) {\n\t\t\t\tbuffer = this.stream.buffers[index];\n\t\t\t\tvar lengthAfterStart = buffer.byteLength - (extent.offset + extent.alreadyRead - buffer.fileStart);\n\t\t\t\tif (extent.length - extent.alreadyRead <= lengthAfterStart) {\n\t\t\t\t\t/* the (rest of the) extent is entirely contained in this buffer */\n\n\t\t\t\t\tLog.debug(\"ISOFile\",\"Getting item #\"+item_id+\" extent #\"+i+\" data (alreadyRead: \"+extent.alreadyRead+\n\t\t\t\t\t\t\" offset: \"+(extent.offset+extent.alreadyRead - buffer.fileStart)+\" read size: \"+(extent.length - extent.alreadyRead)+\n\t\t\t\t\t\t\" full extent size: \"+extent.length+\" full item size: \"+item.size+\")\");\n\n\t\t\t\t\tDataStream.memcpy(item.data.buffer, item.alreadyRead, \n\t\t\t\t\t buffer, extent.offset+extent.alreadyRead - buffer.fileStart, extent.length - extent.alreadyRead);\n\n\t\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\t\tbuffer.usedBytes += extent.length - extent.alreadyRead;\n\t\t\t\t\tthis.stream.logBufferLevel();\n\n\t\t\t\t\titem.alreadyRead += (extent.length - extent.alreadyRead);\n\t\t\t\t\textent.alreadyRead = extent.length;\n\t\t\t\t} else {\n\t\t\t\t\t/* the sample does not end in this buffer */\n\n\t\t\t\t\tLog.debug(\"ISOFile\",\"Getting item #\"+item_id+\" extent #\"+i+\" partial data (alreadyRead: \"+extent.alreadyRead+\" offset: \"+\n\t\t\t\t\t\t(extent.offset+extent.alreadyRead - buffer.fileStart)+\" read size: \"+lengthAfterStart+\n\t\t\t\t\t\t\" full extent size: \"+extent.length+\" full item size: \"+item.size+\")\");\n\n\t\t\t\t\tDataStream.memcpy(item.data.buffer, item.alreadyRead, \n\t\t\t\t\t buffer, extent.offset+extent.alreadyRead - buffer.fileStart, lengthAfterStart);\n\t\t\t\t\textent.alreadyRead += lengthAfterStart;\n\t\t\t\t\titem.alreadyRead += lengthAfterStart;\n\n\t\t\t\t\t/* update the number of bytes used in this buffer and check if it needs to be removed */\n\t\t\t\t\tbuffer.usedBytes += lengthAfterStart;\n\t\t\t\t\tthis.stream.logBufferLevel();\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\tif (item.alreadyRead === item.size) {\n\t\t/* fetched entirely */\n\t\treturn item;\n\t} else {\n\t\treturn null;\n\t}\n}\n\n/* Release the memory used to store the data of the item */\nISOFile.prototype.releaseItem = function(item_id) {\t\n\tvar item = this.items[item_id];\n\tif (item.data) {\n\t\tthis.itemsDataSize -= item.size;\n\t\titem.data = null;\n\t\titem.alreadyRead = 0;\n\t\tfor (var i = 0; i < item.extents.length; i++) {\n\t\t\tvar extent = item.extents[i];\n\t\t\textent.alreadyRead = 0;\n\t\t}\n\t\treturn item.size;\n\t} else {\n\t\treturn 0;\n\t}\n}\n\n\nISOFile.prototype.processItems = function(callback) {\n\tfor(var i in this.items) {\n\t\tvar item = this.items[i];\n\t\tthis.getItem(item.id);\n\t\tif (callback && !item.sent) {\n\t\t\tcallback(item);\n\t\t\titem.sent = true;\n\t\t\titem.data = null;\n\t\t}\n\t}\n}\n\nISOFile.prototype.hasItem = function(name) {\n\tfor(var i in this.items) {\n\t\tvar item = this.items[i];\n\t\tif (item.name === name) {\n\t\t\treturn item.id;\n\t\t}\n\t}\n\treturn -1;\n}\n\nISOFile.prototype.getMetaHandler = function() {\n\tif (!this.meta) {\n\t\treturn null;\n\t} else {\n\t\treturn this.meta.hdlr.handler;\t\t\n\t}\n}\n\nISOFile.prototype.getPrimaryItem = function() {\n\tif (!this.meta || !this.meta.pitm) {\n\t\treturn null;\n\t} else {\n\t\treturn this.getItem(this.meta.pitm.item_id);\n\t}\n}\n\nISOFile.prototype.itemToFragmentedTrackFile = function(_options) {\n\tvar options = _options || {};\n\tvar item = null;\n\tif (options.itemId) {\n\t\titem = this.getItem(options.itemId);\n\t} else {\n\t\titem = this.getPrimaryItem();\n\t}\n\tif (item == null) return null;\n\n\tvar file = new ISOFile();\n\tfile.discardMdatData = false;\n\t// assuming the track type is the same as the item type\n\tvar trackOptions = { type: item.type, description_boxes: item.properties.boxes};\n\tif (item.properties.ispe) {\n\t\ttrackOptions.width = item.properties.ispe.image_width;\n\t\ttrackOptions.height = item.properties.ispe.image_height;\n\t}\n\tvar trackId = file.addTrack(trackOptions);\n\tif (trackId) {\n\t\tfile.addSample(trackId, item.data);\n\t\treturn file;\n\t} else {\n\t\treturn null;\n\t}\n}\n\n// file:src/isofile-write.js\n/* Rewrite the entire file */\nISOFile.prototype.write = function(outstream) {\n\tfor (var i=0; i0 ? this.moov.traks[i].samples[0].duration: 0));\n\t\tinitSegs.push(seg);\n\t}\n\treturn initSegs;\n}\n\n// file:src/box-print.js\n/* \n * Copyright (c) Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nBoxParser.Box.prototype.printHeader = function(output) {\n\tthis.size += 8;\n\tif (this.size > MAX_SIZE) {\n\t\tthis.size += 8;\n\t}\n\tif (this.type === \"uuid\") {\n\t\tthis.size += 16;\n\t}\n\toutput.log(output.indent+\"size:\"+this.size);\n\toutput.log(output.indent+\"type:\"+this.type);\n}\n\nBoxParser.FullBox.prototype.printHeader = function(output) {\n\tthis.size += 4;\n\tBoxParser.Box.prototype.printHeader.call(this, output);\n\toutput.log(output.indent+\"version:\"+this.version);\n\toutput.log(output.indent+\"flags:\"+this.flags);\n}\n\nBoxParser.Box.prototype.print = function(output) {\n\tthis.printHeader(output);\n}\n\nBoxParser.ContainerBox.prototype.print = function(output) {\n\tthis.printHeader(output);\n\tfor (var i=0; i>8));\n\toutput.log(output.indent+\"matrix: \"+this.matrix.join(\", \"));\n\toutput.log(output.indent+\"next_track_id: \"+this.next_track_id);\n}\n\nBoxParser.tkhdBox.prototype.print = function(output) {\n\tBoxParser.FullBox.prototype.printHeader.call(this, output);\n\toutput.log(output.indent+\"creation_time: \"+this.creation_time);\n\toutput.log(output.indent+\"modification_time: \"+this.modification_time);\n\toutput.log(output.indent+\"track_id: \"+this.track_id);\n\toutput.log(output.indent+\"duration: \"+this.duration);\n\toutput.log(output.indent+\"volume: \"+(this.volume>>8));\n\toutput.log(output.indent+\"matrix: \"+this.matrix.join(\", \"));\n\toutput.log(output.indent+\"layer: \"+this.layer);\n\toutput.log(output.indent+\"alternate_group: \"+this.alternate_group);\n\toutput.log(output.indent+\"width: \"+this.width);\n\toutput.log(output.indent+\"height: \"+this.height);\n}// file:src/mp4box.js\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nvar MP4Box = {};\n\nMP4Box.createFile = function (_keepMdatData, _stream) {\n\t/* Boolean indicating if bytes containing media data should be kept in memory */\n\tvar keepMdatData = (_keepMdatData !== undefined ? _keepMdatData : true);\n\tvar file = new ISOFile(_stream);\n\tfile.discardMdatData = (keepMdatData ? false : true);\n\treturn file;\n}\n\nif (typeof exports !== 'undefined') {\n\texports.createFile = MP4Box.createFile;\n}\n",null,null,null,null,null,null,null,null,null,null],"names":["MAX_U6","Math","pow","MAX_U14","MAX_U30","MAX_U53","Number","MAX_SAFE_INTEGER","MAX_U62","ImmutableBytesBuffer","buffer","offset","view","constructor","this","DataView","byteOffset","length","remaining","Uint8Array","slice","firstByteValue","getRemainingBuffer","subarray","getU8","Error","val","getUint8","getU16","getUint16","getU32","getUint32","getU64","getBigUint64","getVarInt","first","prefix","BigInt","getNumberVarInt","getBytes","len","getVarBytes","getUtf8String","TextDecoder","decode","MutableBytesBuffer","byteLength","enoughSpaceAvailable","required","newBuffer","x","set","putU8","v","setUint8","putU16","setUint16","putU32","setUint32","putU64","setBigUint64","putVarInt","value","shift","i","putBytes","putUtf8String","bytes","TextEncoder","encode","putLengthPrefixedByteArray","ReadableStreamBuffer","reader","readableStream","getReader","waitForBytes","Promise","resolve","fillTo","fill","result","read","done","temp","size","readAll","maxLength","undefined","getInt16","close","releaseLock","cancel","release","WritableStreamBuffer","writer","writableStream","getWriter","write","data","flush","clear","ReadableWritableStreamBuffer","readStreamBuffer","writeStreamBuffer","releaseAll","readBuffer","readStream","writeBuffer","writeStream","Tuple","TupleField","Location","KeyValuePairs","Parameters","GroupOrder","FilterType","Subscribe","SubscribeOk","SubscribeError","SubscribeUpdate","SubscribeNamespace","SubscribeNamespaceOk","SubscribeNamespaceError","Unsubscribe","Publish","PublishOk","PublishError","PublishDone","PublishNamespace","PublishNamespaceOk","PublishNamespaceError","PublishNamespaceDone","FetchType","StandaloneFetch","JoiningFetch","Fetch","FetchOk","FetchError","FetchCancel","GoAway","ClientSetup","ServerSetup","MaxRequestId","Version","ControlMessageType","RequestsBlocked","debug","msg","console","log","async","sleep","ms","setTimeout","serialize","tuple","buf","forEach","field","serialized","deserialize","push","encoded","location","group","object","valueIsVarInt","key","deserialize_with_size","pairs","Map","deserialize_with_reader","order","Publisher","Ascending","Descending","NextGroupStart","LargestObject","AbsoluteStart","AbsoluteRange","mainBuf","payloadBuf","id","namespace","name","subscriber_priority","group_order","forward","filter_type","start_location","end_group","params","track_alias","expires","content_exists","largest_location","code","reason","subscription_id","stream_count","Standalone","Relative","Absolute","end_location","r","start","fetch_type","standalone","joining","end_of_track","session_uri","versions","version","supportedVersionLen","toString","t","ReservedSetupV00","ControlStream","decoder","encoder","nextRequestId","remoteMaxRequestId","mutex","c","Decoder","Encoder","recv","message","send","unlock","lock","payload","p","then","incr","setRemoteMaxRequestId","messageType","advertisedLength","error","rawPayload","res","type","w","m","SubgroupHeader","SubgroupObject","SubgroupType","ObjectForwardingPreference","Status","ObjectDatagramType","ObjectDatagram","header","group_id","hasExplicitSubgroupId","subgroup_id","publisher_priority","obj","object_id","extension_headers","object_payload","status","try_from","Type0x10","Type0x11","Type0x12","Type0x13","Type0x14","Type0x15","Type0x18","Type0x19","Type0x1A","Type0x1B","Type0x1C","Type0x1D","isSubgroupIdPresent","isSubgroupIdZero","isSubgroupFirstObjectId","isExtensionPresent","contains_end_of_group","SubgroupWriter","stream","SubgroupReader","extHeaders","obj_payload_len","NORMAL","OBJECT_NULL","GROUP_END","TRACK_END","Type0x0","Type0x1","Type0x2","Type0x3","Type0x4","Type0x5","Type0x6","Type0x7","Type0x20","Type0x21","isEndOfGroup","hasExtensions","hasObjectId","hasStatus","alias","extHeadersLength","extHeadersData","Objects","quic","h","datagrams","writable","TrackWriter","createUnidirectionalStream","subgroupHeader","streams","incomingUnidirectionalStreams","subgroupType","e","asError","String","Deferred","promise","reject","pending","Watch","current","next","init","update","Function","Notify","wait","wake","Queue","closed","capacity","queue","CountQueuingStrategy","highWaterMark","TransformStream","readable","abort","err","control","migrationState","objects","publishedNamespaces","waitingPublishNamespaceRequests","subscribe","subscribeQueue","nextTrackAlias","activeSubscribersCount","state","startMigration","migrationDone","publish_namespace","has","join","publishNamespaceSend","PublishNamespaceSend","Control.ControlMessageType","subscribed","recvSubscribe","recvUnsubscribe","recvPublishNamespaceOk","recvPublishNamespaceError","get","onOk","onError","warn","trackAlias","SubscribeRecv","delete","ok","active","subscriberPriority","groupOrder","track","ack","acked","serve","props","priority","subgroup","Subscriber","publishedNamespacesQueue","trackToIDMap","aliasToSubscriptionMap","pendingTrack","unsubscribe","recvPublishNamespace","recvPublishNamespaceDone","recvSubscribeOk","recvSubscribeError","recvPublishDone","publishNamespace","PublishNamespaceRecv","_msg","subscribe_namespace","SubscribeSend","subscription_req","Control.GroupOrder","Control.FilterType","isMigrating","trackID","subscription","callback","onDone","recvObject","subscriptionId","onData","_code","_reason","streamCount","Connection","controlStream","publisher","subscriber","running","run","onMigration","closeCode","all","runControl","runObjects","closePublisher","sendGoAway","handleGoAway","handleMaxRequestId","migrateSession","Client","fingerprint","config","fetchFingerprint","catch","createQuic","sessionUri","options","serverCertificateHashes","uri","url","WebTransport","ready","prepareConnection","createBidirectionalStream","sendOrder","Control.Version","DRAFT_14","Control.ClientSetup","server","readServerSetup","Stream.ControlStream","connect","response","fetch","hexString","text","hexBytes","parseInt","algorithm","bufferLen","bufReader","readClientSetup","Segment","input","cache","timestamp","backpressure","ByteLengthQueuingStrategy","transport","transform","chunk","controller","max","duration","enqueue","chunks","tee","log_level","Log","Date","setLogLevel","level","info","module","getDurationString","_timescale","neg","pad","number","a","split","duration_sec","hours","floor","minutes","msec","printRanges","ranges","str","end","exports","MP4BoxStream","arrayBuffer","ArrayBuffer","dataview","position","prototype","getPosition","getEndPosition","getLength","seek","pos","npos","min","isNaN","isFinite","isEos","readAnyInt","signed","getInt8","getInt32","readUint8","readUint16","readUint24","readUint32","readUint64","readString","s","fromCharCode","readCString","arr","b","apply","readInt8","readInt16","readInt32","readInt64","readUint8Array","readInt16Array","Int16Array","readUint16Array","readUint32Array","Uint32Array","readInt32Array","Int32Array","DataStream","endianness","_byteOffset","dataView","LITTLE_ENDIAN","_realloc","extra","_dynamicSize","req","blen","_buffer","_byteLength","src","_trimAlloc","dst","BIG_ENDIAN","Object","defineProperty","_dataView","isEof","mapUint8Array","memcpy","BYTES_PER_ELEMENT","arrayToNative","readInt8Array","Int8Array","Uint16Array","readFloat64Array","Float64Array","readFloat32Array","Float32Array","readFloat32","getFloat32","readFloat64","getFloat64","dstOffset","srcOffset","dstU8","srcU8","array","arrayIsLittleEndian","flipArrayEndianness","nativeToEndian","littleEndian","u8","j","k","tmp","failurePosition","fromCharCodeUint8","uint8arr","encoding","MAX_SIZE","save","filename","blob","Blob","window","URL","createObjectURL","document","createElement","body","appendChild","setAttribute","click","revokeObjectURL","writeInt32Array","mapInt32Array","writeInt32","writeInt16Array","mapInt16Array","writeInt16","writeInt8Array","mapInt8Array","writeInt8","writeUint32Array","mapUint32Array","writeUint32","writeUint16Array","mapUint16Array","writeUint16","writeUint8Array","writeUint8","writeFloat64Array","mapFloat64Array","writeFloat64","writeFloat32Array","mapFloat32Array","writeFloat32","setInt32","setInt16","setInt8","setFloat32","setFloat64","writeUCS2String","lengthOverride","charCodeAt","writeString","substring","writeCString","writeStruct","structDefinition","struct","writeType","tp","Array","charset","test","ta","writeUint64","writeUint24","adjustUint32","MultiBufferStream","buffers","bufferIndex","insertBuffer","initialized","firstBuffer","fileStart","logBufferLevel","concat","buffer1","buffer2","reduceBuffer","newLength","smallB","usedBytes","ab","to_add","splice","used","total","range","bufferedString","cleanBuffers","mergeNextBuffer","next_buffer","oldLength","oldUsedBytes","oldFileStart","findPosition","fromStart","filePosition","markAsUsed","abuffer","index","findEndContiguousBuf","inputindex","currentBuf","nextBuf","getEndFilePositionAfter","addUsedBytes","nbBytes","setAllUsedBytes","MPEG4DescriptorParser","descTagToName","getDescriptorName","tag","that","classes","parseOneDescriptor","desc","byteRead","Descriptor","parse","_tag","_size","descs","findDescriptor","parseRemainingDescriptors","ES_Descriptor","call","ES_ID","flags","dependsOn_ES_ID","l","OCR_ES_ID","getOTI","dcd","oti","getAudioConfig","dsi","audioObjectType","DecoderConfigDescriptor","streamType","upStream","bufferSize","maxBitrate","avgBitrate","DecoderSpecificInfo","SLConfigDescriptor","BoxParser","ERR_INVALID_DATA","ERR_NOT_ENOUGH_DATA","OK","BASIC_BOXES","FULL_BOXES","CONTAINER_BOXES","boxCodes","fullBoxCodes","containerBoxCodes","sampleEntryCodes","sampleGroupEntryCodes","trackGroupTypes","UUIDBoxes","UUIDs","initialize","FullBox","Box","ContainerBox","SampleEntry","TrackGroupTypeBox","box","createBoxCtor","createFullBoxCtor","boxes","createContainerBoxCtor","_type","_name","_uuid","box_name","uuid","hdr_size","SampleGroupEntry","grouping_type","parseMethod","parseFullHeader","addSubBoxArrays","subBoxNames","nbSubBoxes","createMediaSampleEntryCtor","mediaType","createSampleEntryCtor","createEncryptedSampleEntryCtor","createSampleGroupCtor","createTrackGroupCtor","createUUIDBox","isFullBox","isContainerBox","printPS","ps","nalu","reduce","byte","padStart","ColorPoint","y","Pixel","row","col","bad_pixel_row","bad_pixel_column","TKHD_FLAG_ENABLED","TKHD_FLAG_IN_MOVIE","TKHD_FLAG_IN_PREVIEW","TFHD_FLAG_BASE_DATA_OFFSET","TFHD_FLAG_SAMPLE_DESC","TFHD_FLAG_SAMPLE_DUR","TFHD_FLAG_SAMPLE_SIZE","TFHD_FLAG_SAMPLE_FLAGS","TFHD_FLAG_DUR_EMPTY","TFHD_FLAG_DEFAULT_BASE_IS_MOOF","TRUN_FLAGS_DATA_OFFSET","TRUN_FLAGS_FIRST_FLAG","TRUN_FLAGS_DURATION","TRUN_FLAGS_SIZE","TRUN_FLAGS_FLAGS","TRUN_FLAGS_CTS_OFFSET","add","addBox","prop","addEntry","_prop","parseUUID","parseHex16","hex16","hex","parseOneBox","headerOnly","parentSize","diff","box_type","has_unparsed_data","parseDataAndRewind","ret","indexOf","parseLanguage","language","chars","languageString","SAMPLE_ENTRY_TYPE_VISUAL","SAMPLE_ENTRY_TYPE_AUDIO","SAMPLE_ENTRY_TYPE_HINT","SAMPLE_ENTRY_TYPE_METADATA","SAMPLE_ENTRY_TYPE_SUBTITLE","SAMPLE_ENTRY_TYPE_SYSTEM","SAMPLE_ENTRY_TYPE_TEXT","parseHeader","data_reference_index","parseFooter","compressorname_length","width","height","horizresolution","vertresolution","frame_count","compressorname","depth","channel_count","samplesize","samplerate","FieldLength","layer_size","op_index","aux_type","aux_subtype_length","aux_subtype","seq_profile","seq_level_idx_0","seq_tier_0","high_bitdepth","twelve_bit","monochrome","chroma_subsampling_x","chroma_subsampling_y","chroma_sample_position","reserved_1","initial_presentation_delay_present","initial_presentation_delay_minus_one","reserved_2","configOBUs_length","configOBUs","toparse","configurationVersion","AVCProfileIndication","profile_compatibility","AVCLevelIndication","lengthSizeMinusOne","nb_SPS_nalus","SPS","nb_PPS_nalus","PPS","ext","bufferSizeDB","all_ref_pics_intra","intra_pred_used","max_ref_per_pic","channel_indexes","channel_types","channel_associations","cleanApertureWidthN","cleanApertureWidthD","cleanApertureHeightN","cleanApertureHeightD","horizOffN","horizOffD","vertOffN","vertOffD","max_content_light_level","max_pic_average_light_level","pos_x","pos_y","pos_z","quat_x","quat_y","quat_z","focal_length_x","principal_point_x","principal_point_y","focal_length_y","skew_factor","component_count","component_types","component_type_urls","component_type","entry_count","chunk_offsets","maxCLL","maxFALL","colour_type","colour_primaries","transfer_characteristics","matrix_coefficients","full_range_flag","ICC_profile","notice","compositionToDTSShift","leastDecodeToDisplayDelta","greatestDecodeToDisplayDelta","compositionStartTime","compositionEndTime","sample_counts","sample_offsets","tmp_byte1","tmp_byte2","tmp_byte3","fscod","bsid","bsmod","acmod","lfeon","bit_rate_code","tmp_16","data_rate","num_ind_sub","ind_subs","ind_sub","num_dep_sub","chan_loc","boxesFound","knownBlockTypes","flagAndType","numMetadataBlocks","bytessent","time","OutputChannelCount","PreSkip","InputSampleRate","OutputGain","ChannelMappingFamily","StreamCount","CoupledCount","ChannelMapping","entries","extended_language","entry","segment_duration","media_time","media_rate_integer","media_rate_fraction","timescale","presentation_time","event_duration","scheme_id_uri","presentation_time_delta","message_size","message_data","createEntityToGroupCtor","num_entities_in_group","entity_ids","entity_id","tile_size_x","tile_size_y","layer_binning","tiles_in_layer_column_minus1","tiles_in_layer_row_minus1","esd_data","esd_parser","esd","fieldCount","fieldOrdering","data_format","major_brand","minor_version","compatible_brands","handler","tmp_byte","general_profile_space","general_tier_flag","general_profile_idc","general_profile_compatibility","general_constraint_indicator","general_level_idc","min_spatial_segmentation_idc","parallelismType","chroma_format_idc","bit_depth_luma_minus8","bit_depth_chroma_minus8","avgFrameRate","constantFrameRate","numTemporalLayers","temporalIdNested","nalu_arrays","nalu_array","completeness","nalu_type","numOfArrays","numNalus","item_infos","offset_size","length_size","base_offset_size","index_size","items","item_count","item","item_ID","construction_method","base_offset","extent_count","extents","extent","extent_index","extent_offset","extent_length","reserved","axis","item_protection_index","item_name","content_type","content_encoding","extension_type","item_type","item_uri_type","associations","item_assoc","association_count","essential","property_index","references","SingleItemTypeReferenceBox","SingleItemTypeReferenceBoxLarge","angle","image_width","image_height","schemeURI","count","levels","track_ID","padding_flag","assignment_type","grouping_type_parameter","sub_track_id","layer_id","period","display_primaries","white_point","max_display_mastering_luminance","min_display_mastering_luminance","creation_time","modification_time","fragment_duration","sequence_number","bits_per_pixel","rate","volume","matrix","next_track_id","packetssent","sample_count","padbits","hSpacing","vSpacing","payloadID","rtpmap_string","initial_delay","item_id","num_channels","bits_per_channels","step_count","ref_track_id","ntp_timestamp","system_id","kid","datasize","descriptionformat","sdptext","aux_info_type","aux_info_type_parameter","default_sample_info_size","sample_info_size","mime_format","schema_location","auxiliary_mime_types","displayFlags","horizontal_justification","vertical_justification","bg_color_rgba","box_record","style_record","roll_count","first_output_sample","sample_offset","description_length","num_output_samples","num_total_samples","layerNumber","accurateStatisticsFlag","avgBitRate","subSequenceIdentifier","durationFlag","avgRateFlag","dependency","numReferences","dependencyInfo","subSeqDirectionFlag","roll_distance","num_leading_samples_known","num_leading_samples","operation_point_count","target_rate_share","available_bitrate","maximum_bitrate","minimum_bitrate","discard_priority","crypt_byte_block","skip_byte_block","isProtected","Per_Sample_IV_Size","KID","constant_IV_size","constant_IV","NAL_unit_type","level_independently_decodable","group_description_index","component_index","correction_applied","num_bad_rows","num_bad_cols","num_bad_pixels","bad_rows","bad_columns","bad_pixels","scheme_type","scheme_version","scheme_uri","is_leading","sample_depends_on","sample_is_depended_on","sample_has_redundancy","default_length","default_group_description_index","reference_ID","earliest_presentation_time","first_offset","ref","tmp_32","reference_type","referenced_size","subsegment_duration","starts_with_SAP","SAP_type","SAP_delta_time","from_item_ID","to_item_ID","primaryRChromaticity_x","primaryRChromaticity_y","primaryGChromaticity_x","primaryGChromaticity_y","primaryBChromaticity_x","primaryBChromaticity_y","whitePointChromaticity_x","whitePointChromaticity_y","luminanceMax","luminanceMin","balance","subsegments","subsegment_count","subsegment","range_count","range_size","switch_group","alternate_group","attribute_list","first_chunk","samples_per_chunk","sample_description_index","entryCount","shadowed_sample_numbers","sync_sample_numbers","sample_numbers","sample_sizes","sample_size","delta","sample_deltas","tmp32","single_view_allowed","stereo_scheme","stereo_indication_type","ftypBox","field_size","subsample_count","sampleInfo","sample_delta","subsamples","subsample","discardable","codec_specific_parameters","default_crypt_byte_block","default_skip_byte_block","default_isProtected","default_Per_Sample_IV_Size","default_KID","default_constant_IV_size","default_constant_IV","baseMediaDecodeTime","readBytes","track_id","base_data_offset","default_sample_description_index","default_sample_duration","default_sample_size","default_sample_flags","length_size_of_traf_num","length_size_of_trun_num","length_size_of_sample_num","number_of_entries","moof_offset","traf_number","trun_number","sample_number","layer","track_group_id","TrackReferenceTypeBox","track_ids","trefBox","data_offset","first_sample_flags","sample_duration","sample_flags","sample_composition_time_offset","lang","description","tags","profile","component_bit_depth_minus_one","component_format","component_align_size","sampling_type","interleave_type","block_size","component_little_endian","block_pad_lsb","block_little_endian","block_reversed","pad_unknown","pixel_size","row_align_size","tile_align_size","num_tile_cols_minus_one","num_tile_rows_minus_one","LiveServerManifest","replace","default_AlgorithmID","default_IV_size","fragment_count","absolute_time","absolute_duration","graphicsmode","opcolor","bitDepth","chromaSubsampling","videoFullRangeFlag","colourPrimaries","transferCharacteristics","matrixCoefficients","codecIntializationDataSize","codecIntializationData","colorSpace","transferFunction","bitReader","held_bits","num_held_bits","stream_read_1_bytes","strm","stream_read_2_bytes","extract_bits","num_bits","ptl_present_flag","ols_idx","num_sublayers","constant_frame_rate","bit_depth_minus8","num_bytes_constraint_info","ptl_frame_only_constraint_flag","ptl_multilayer_enabled_flag","general_constraint_info","cnstr1","cnstr2","ptl_sublayer_present_mask","sublayer_level_idc","ptl_num_sub_profiles","general_sub_profile_idc","max_picture_width","max_picture_height","avg_frame_rate","num_of_arrays","isVideo","isAudio","isSubtitle","isMetadata","isHint","getCodec","getWidth","getHeight","getChannelCount","getSampleRate","getSampleSize","VisualSampleEntry","AudioSampleEntry","SubtitleSampleEntry","MetadataSampleEntry","decimalToHex","d","padding","avc1SampleEntry","avc2SampleEntry","avc3SampleEntry","avc4SampleEntry","baseCodec","avcC","hev1SampleEntry","hvc1SampleEntry","hvcC","reversed","hasByte","constraint_string","vvc1SampleEntry","vvi1SampleEntry","vvcC","last_nonzero","ptl_frame_only_constraint","ptl_multilayer_enabled","base32_chars","mp4aSampleEntry","esds","stxtSampleEntry","vp08SampleEntry","vp09SampleEntry","vpcC","av01SampleEntry","bitdepth","av1C","writeHeader","sizePosition","avcCBox","co64Box","cslgBox","cttsBox","drefBox","elngBox","elstBox","emsgBox","hdlrBox","hvcCBox","kindBox","mdhdBox","mehdBox","mfhdBox","mvhdBox","writeFooter","stppSampleEntry","sbgpBox","sgpdBox","sidxBox","smhdBox","stcoBox","stscBox","stsdBox","stshBox","stssBox","stszBox","constant","sttsBox","tfdtBox","UINT32_MAX","tfhdBox","tkhdBox","trexBox","trunBox","data_offset_position","vmhdBox","unpack","samples","pts","dts","Infinity","description_index","chunk_index","DIFF_BOXES_PROP_NAMES","DIFF_PRIMITIVE_ARRAY_PROP_NAMES","boxEqualFields","box_a","box_b","boxEqual","VTTin4Parser","parseSample","cues","cue","getText","startTime","endTime","n","z","secToTimestamp","insec","string","cueIn4","payl","XMLSubtitlein4Parser","sample","documentString","resources","DOMParser","parseFromString","Textin4Parser","parseConfig","ISOFile","mdats","moofs","isProgressive","moovStartFound","onMoovStart","moovStartSent","onReady","readySent","onSegment","onSamples","sampleListBuilt","fragmentedTracks","extractedTracks","isFragmentationInitialized","sampleProcessingStarted","nextMoofNumber","itemListBuilt","entity_groups","onSidx","sidxSent","setSegmentOptions","user","trak","getTrackById","fragTrack","nextSample","segmentStream","nb_samples","rapAlignement","nbSamples","unsetSegmentOptions","setExtractionOptions","extractTrack","unsetExtractionOptions","restoreParsePosition","hasIncompleteMdat","processIncompleteMdat","saveParsePosition","processIncompleteBox","updateUsedBytes","checkBuffer","appendBuffer","last","nextFileStart","moov","buildSampleLists","updateSampleLists","getInfo","processSamples","nextSeekPosition","nextParsePosition","sidx","meta","flattenItemInfo","processItems","onItem","getAllocatedSampleDataSize","sample_desc","movie","_1904","getTime","hasMoov","mvhd","isFragmented","mvex","mehd","hasIOD","iods","brands","ftyp","created","modified","tracks","audioTracks","videoTracks","subtitleTracks","metadataTracks","hintTracks","otherTracks","traks","mdia","minf","stbl","stsd","tkhd","hdlr","tref","edts","edits","elst","movie_duration","movie_timescale","track_width","track_height","mdhd","cts_shift","cslg","samples_duration","codec","kind","udta","kinds","elng","samples_size","bitrate","audio","sample_rate","video","mime","setNextSeekPositionFromSample","alreadyRead","fragTrak","createFragment","extractTrak","getSample","getBox","getBoxes","returnEarly","_sweep","getTrackSamplesInfo","getTrackSample","releaseUsedSamples","sampleNum","lastValidSample","releaseSample","samplesDataSize","stop","seekTrack","useRap","seek_offset","rap_seek_sample_num","seek_sample_num","cts","is_sync","getTrackDuration","trak_seek_info","seek_info","equal","box_index","a_box","b_box","lastBoxStartPosition","parsingMdat","discardMdatData","_options","addTrack","media_duration","sample_description_entry","media_type","codes","avcDecoderConfigRecord","hevcDecoderConfigRecord","description_boxes","buildTrakSampleLists","computeSize","stream_","addSample","depends_on","is_depended_on","has_redundancy","degradation_priority","first_dts","moof","createSingleSampleMoof","trafs","truns","moofBox","traf","lastMoofIndex","resetTables","stsc","stts","ctts","stss","initial_duration","stco","co64","stsz","stz2","initSampleGroups","sbgps","trak_sgpds","traf_sgpds","sample_group_info","sample_group_key","SampleGroupInfo","_parameter","_sbgp","sbgp","last_sample_in_run","entry_index","sample_groups_info","fragment_description","is_fragment","setSampleGroupProperties","sample_groups","process_sdtp","sdtp","subs","sgpds","stdp","chunk_run_index","last_chunk_in_run","offset_in_chunk","last_sample_in_chunk","last_sample_in_stts_run","stts_run_index","last_sample_in_ctts_run","ctts_run_index","last_stss_index","subs_entry_index","last_subs_sample_index","last_run_position","trex","tfhd","getTrexById","trun","moof_number","number_in_traf","first_sample_index","first_traf_merged","tfdt","bdop","dbim","dop","bdo","has_fragment_subsamples","sample_index","lengthAfterStart","getCodecs","codecs","trexs","itemsDataSize","iinf","ref_to","protection_index","protection","ipro","protections","grpl","entity_group","iloc","itemloc","source","dinf","idat","pitm","primary","iref","iprp","ipmas","ipma","association","properties","propEntry","ipco","propbox","getItem","releaseItem","sent","hasItem","getMetaHandler","getPrimaryItem","itemToFragmentedTrackFile","itemId","file","trackOptions","ispe","trackId","outstream","sampleNumber","mdat","mdatBox","writeInitializationSegment","total_duration","getBuffer","initializeSegmentation","initSegs","seg","moovBox","printHeader","output","indent","print","prev_indent","MP4Box","_keepMdatData","_stream","keepMdatData","createFile","MP4.BoxParser","dOpsBox","mapping","Container","mp4","frame","segment","MP4.ISOFile","isDecoderConfig","codedWidth","isVideoConfig","numberOfChannels","sampleRate","codedHeight","dops","MP4.Stream","copyTo","SUPPORTED","encoderConfig","decoderConfig","frames","bind","AudioEncoder","metadata","configure","isSupported","short","includes","isConfigSupported","supported","keyframeNext","keyframeCounter","bitrateMode","latencyMode","hardwareAcceleration","VideoEncoder","keyFrame","encodeQueueSize","framerate","Track","segments","notify","media","runAudio","isVideoTrack","runVideo","MediaStreamTrackProcessor","Audio.Encoder","container","WritableStream","pipeThrough","pipeTo","Video.Encoder","at","desiredSize","ReadableStream","pull","isAudioTrackSettings","settings","isVideoTrackSettings","Broadcast","catalog","connection","mediaTracks","getTracks","getSettings","audioContext","AudioContext","createMediaStreamSource","MediaStream","assign","initTrack","selectionParams","mimeType","frameRate","channelConfig","channelCount","streamingFormat","streamingFormatVersion","supportsDeltaUpdates","commonTrackFields","packaging","renderGroup","serveSubscribe","base","lastIndexOf","splitExt","serveCatalog","serveInit","serveTrack","JSON","stringify","Catalog.encode","serveSegment","attach","srcObject","isGoingAway","notGoingAway","values","PublisherApi","EventTarget","client","broadcast","opts","super","fingerprintUrl","publish","dispatchEvent","CustomEvent","detail","bcConfig","goingaway","PublisherMoq","HTMLElement","shadow","cameraSelect","microphoneSelect","previewVideo","connectButton","playbackUrlTextarea","mediaStream","isPublishing","attachShadow","mode","style","textContent","classList","autoplay","playsInline","muted","readOnly","rows","display","marginTop","append","handleDeviceChange","handleClick","navigator","mediaDevices","addEventListener","startPreview","connectedCallback","populateDeviceLists","disconnectedCallback","removeEventListener","devices","enumerateDevices","vids","filter","mics","innerHTML","o","deviceId","label","vidId","micId","videoConstraints","exact","ideal","audioConstraints","getUserMedia","stopPublishing","startPublishing","getAttribute","crypto","randomUUID","getAudioTracks","makeEven","videoConfig","videoWidth","videoHeight","audioConfig","event","handleReconnect","disabled","playbackBaseUrl","graceful","customElements","define"],"mappings":"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","x_google_ignoreList":[39]} \ No newline at end of file diff --git a/demo/player.html b/demo/player.html new file mode 100644 index 0000000..685e2ba --- /dev/null +++ b/demo/player.html @@ -0,0 +1,444 @@ + + + + + + MoQT Demo - Player + + + +
    +
    +

    MoQT Video Player

    +

    Ultra-low latency streaming viewer

    +
    + +
    +
    + + +
    +
    + +
    + +
    + + Connecting... +
    + +
    + + +
    +
    +
    + +
    +

    Stream Information

    +
    +
    + + - +
    +
    + + - +
    +
    + + Initializing +
    +
    +
    + +
    +

    Actions

    +
    + + Start Your Own Stream +
    +
    + +
    +
    + Troubleshooting +
    +

    Stream not loading?

    +
      +
    • Check that the stream is still active on the publisher side
    • +
    • Ensure your browser supports WebTransport (Chrome 97+, Edge 97+)
    • +
    • Try refreshing the page or reconnecting
    • +
    • Check your network connection
    • +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + + diff --git a/demo/server.cjs b/demo/server.cjs new file mode 100644 index 0000000..cefdc57 --- /dev/null +++ b/demo/server.cjs @@ -0,0 +1,121 @@ +#!/usr/bin/env node + +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const url = require('url'); + +const PORT = process.env.PORT || 8080; + +// MIME types for common files +const mimeTypes = { + '.html': 'text/html', + '.js': 'text/javascript', + '.css': 'text/css', + '.json': 'application/json', + '.png': 'image/png', + '.jpg': 'image/jpg', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.wav': 'audio/wav', + '.mp4': 'video/mp4', + '.woff': 'application/font-woff', + '.ttf': 'application/font-ttf', + '.eot': 'application/vnd.ms-fontobject', + '.otf': 'application/font-otf', + '.wasm': 'application/wasm' +}; + +function getContentType(filePath) { + const ext = path.extname(filePath).toLowerCase(); + return mimeTypes[ext] || 'application/octet-stream'; +} + +const server = http.createServer((req, res) => { + const parsedUrl = url.parse(req.url); + let pathname = `.${parsedUrl.pathname}`; + + // Default to index.html for root path + if (pathname === './') { + pathname = './index.html'; + } + + // Set required headers for WebTransport and MoQT (enables SharedArrayBuffer) + res.setHeader('Cross-Origin-Opener-Policy', 'same-origin'); + res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp'); + res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin'); + + // Additional security headers + res.setHeader('X-Content-Type-Options', 'nosniff'); + res.setHeader('X-Frame-Options', 'DENY'); + res.setHeader('X-XSS-Protection', '1; mode=block'); + res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin'); + + // Handle CORS for development + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + // Handle OPTIONS requests + if (req.method === 'OPTIONS') { + res.writeHead(200); + res.end(); + return; + } + + fs.stat(pathname, (err, stats) => { + if (err) { + // File not found + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('404 - File Not Found'); + return; + } + + if (stats.isFile()) { + // Serve the file + const contentType = getContentType(pathname); + res.setHeader('Content-Type', contentType); + + // Cache control for static assets + if (pathname.endsWith('.js') || pathname.endsWith('.css')) { + res.setHeader('Cache-Control', 'public, max-age=31536000, immutable'); + } + + const fileStream = fs.createReadStream(pathname); + fileStream.pipe(res); + + fileStream.on('error', (error) => { + res.writeHead(500, { 'Content-Type': 'text/plain' }); + res.end('500 - Internal Server Error'); + }); + } else { + // Directory - try to serve index.html + const indexPath = path.join(pathname, 'index.html'); + fs.stat(indexPath, (indexErr, indexStats) => { + if (!indexErr && indexStats.isFile()) { + res.setHeader('Content-Type', 'text/html'); + const fileStream = fs.createReadStream(indexPath); + fileStream.pipe(res); + } else { + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('404 - File Not Found'); + } + }); + } + }); +}); + +server.listen(PORT, () => { + console.log(`🚀 MoQT Demo Server running at http://localhost:${PORT}/`); + console.log(`📋 Required headers enabled for WebTransport support`); + console.log(`🛑 Press Ctrl+C to stop the server`); +}); + +// Handle graceful shutdown +process.on('SIGINT', () => { + console.log('\n👋 Shutting down server...'); + server.close(() => { + console.log('✅ Server stopped'); + process.exit(0); + }); +}); diff --git a/demo/style.css b/demo/style.css new file mode 100644 index 0000000..112fe55 --- /dev/null +++ b/demo/style.css @@ -0,0 +1,469 @@ +/* MoQT Demo Site Styles */ +/* Clean, minimal design with orange accent colors */ + +:root { + --primary-color: #ff6b35; + --primary-dark: #e55a2b; + --secondary-color: #f4f4f4; + --text-color: #333; + --text-light: #666; + --border-color: #ddd; + --success-color: #28a745; + --error-color: #dc3545; + --warning-color: #ffc107; + --background-color: #ffffff; + --card-background: #fafafa; + --shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + --radius: 8px; + --spacing: 1rem; + --spacing-lg: 2rem; + --font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, + Cantarell, sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font-family); + line-height: 1.6; + color: var(--text-color); + background-color: var(--background-color); +} + +/* Layout */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 var(--spacing); +} + +/* Header */ +.header { + text-align: center; + padding: var(--spacing-lg) 0; + border-bottom: 1px solid var(--border-color); + margin-bottom: var(--spacing-lg); +} + +.header h1 { + font-size: 2.5rem; + font-weight: 700; + color: var(--text-color); + margin-bottom: 0.5rem; +} + +.subtitle { + font-size: 1.1rem; + color: var(--text-light); + font-weight: 400; +} + +/* Main Content */ +.main-content { + display: grid; + gap: var(--spacing-lg); + margin-bottom: var(--spacing-lg); +} + +/* Publisher Section */ +.publisher-section, +.player-section { + background: var(--card-background); + padding: var(--spacing-lg); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.publisher-section h2, +.player-section h2 { + margin-bottom: var(--spacing); + color: var(--text-color); +} + +.publisher-container, +.player-container { + margin: var(--spacing) 0; +} + +/* Video Player Styling */ +.video-wrapper { + position: relative; + width: 100%; + max-width: 800px; + margin: 0 auto; + background: #000; + border-radius: var(--radius); + overflow: hidden; +} + +video-moq { + width: 100%; + height: auto; + min-height: 400px; + display: block; +} + +/* Ensure dynamically created video elements display properly */ +#videoWrapper { + width: 100%; + min-height: 400px; + display: flex; + align-items: center; + justify-content: center; + background: #000; +} + +#videoWrapper video-moq { + width: 100%; + height: auto; + min-height: 400px; +} + +/* Controls */ +.controls, +.player-controls { + display: flex; + gap: var(--spacing); + margin: var(--spacing) 0; + flex-wrap: wrap; +} + +/* Buttons */ +.btn { + padding: 0.75rem 1.5rem; + border: none; + border-radius: var(--radius); + font-size: 1rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + text-decoration: none; + display: inline-block; + text-align: center; +} + +.btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.btn-primary { + background: var(--primary-color); + color: white; +} + +.btn-primary:hover:not(:disabled) { + background: var(--primary-dark); + transform: translateY(-1px); +} + +.btn-secondary { + background: var(--secondary-color); + color: var(--text-color); + border: 1px solid var(--border-color); +} + +.btn-secondary:hover:not(:disabled) { + background: #e8e8e8; + border-color: #ccc; +} + +.btn-copy { + background: #007bff; + color: white; +} + +.btn-copy:hover:not(:disabled) { + background: #0056b3; +} + +.btn-copy.copied { + background: var(--success-color); +} + +/* Status Indicator */ +.status-indicator { + display: flex; + align-items: center; + gap: 0.5rem; + margin: var(--spacing) 0; + padding: 0.5rem; + background: white; + border-radius: var(--radius); + border: 1px solid var(--border-color); +} + +.status-dot { + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--text-light); + transition: background-color 0.3s ease; +} + +.status-dot.connected { + background: var(--success-color); + box-shadow: 0 0 8px rgba(40, 167, 69, 0.4); +} + +.status-dot.disconnected { + background: var(--error-color); +} + +.status-text { + font-weight: 500; + color: var(--text-color); +} + +/* Player Link Section */ +.player-link-section { + background: white; + padding: var(--spacing-lg); + border-radius: var(--radius); + border: 2px dashed var(--primary-color); + margin: var(--spacing) 0; +} + +.link-container { + display: flex; + gap: 0.5rem; + margin: var(--spacing) 0; +} + +.link-input { + flex: 1; + padding: 0.75rem; + border: 1px solid var(--border-color); + border-radius: var(--radius); + font-family: monospace; + font-size: 0.9rem; + background: var(--secondary-color); +} + +/* Info Sections */ +.info-section, +.stream-info, +.actions-section, +.help-section, +.config-section { + background: white; + padding: var(--spacing-lg); + border-radius: var(--radius); + border: 1px solid var(--border-color); +} + +.info-section h3, +.stream-info h3, +.actions-section h3 { + margin-bottom: var(--spacing); + color: var(--text-color); +} + +.info-section ul { + list-style: none; + padding: 0; +} + +.info-section li { + padding: 0.5rem 0; + border-bottom: 1px solid var(--border-color); +} + +.info-section li:last-child { + border-bottom: none; +} + +/* Info Grid */ +.info-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: var(--spacing); +} + +.info-item { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.info-item label { + font-weight: 600; + color: var(--text-light); + font-size: 0.9rem; +} + +.info-item span { + font-family: monospace; + background: var(--secondary-color); + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.9rem; +} + +/* Action Buttons */ +.action-buttons { + display: flex; + gap: var(--spacing); + flex-wrap: wrap; +} + +/* Error Message */ +.error-message { + background: #fff5f5; + border: 2px solid var(--error-color); + border-radius: var(--radius); + padding: var(--spacing-lg); + text-align: center; + color: var(--error-color); +} + +.error-message h3 { + margin-bottom: var(--spacing); +} + +/* Help Section */ +.help-section details { + cursor: pointer; +} + +.help-section summary { + font-weight: 600; + padding: var(--spacing); + background: var(--secondary-color); + border-radius: var(--radius); + margin-bottom: var(--spacing); +} + +.help-content h4 { + margin: var(--spacing) 0 0.5rem 0; + color: var(--text-color); +} + +.help-content ul { + margin-bottom: var(--spacing); + padding-left: 1.5rem; +} + +.help-content li { + margin-bottom: 0.5rem; +} + +/* Config Section */ +.config-info { + margin-top: var(--spacing); +} + +.config-info p { + margin-bottom: 0.5rem; + font-family: monospace; + font-size: 0.9rem; +} + +.config-info strong { + color: var(--text-color); +} + +/* Footer */ +.footer { + text-align: center; + padding: var(--spacing-lg) 0; + border-top: 1px solid var(--border-color); + color: var(--text-light); +} + +.footer a { + color: var(--primary-color); + text-decoration: none; +} + +.footer a:hover { + text-decoration: underline; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .container { + padding: 0 1rem; + } + + .header h1 { + font-size: 2rem; + } + + .controls, + .player-controls, + .action-buttons { + flex-direction: column; + } + + .link-container { + flex-direction: column; + } + + .info-grid { + grid-template-columns: 1fr; + } + + .btn { + width: 100%; + } +} + +@media (max-width: 480px) { + .header { + padding: var(--spacing) 0; + } + + .header h1 { + font-size: 1.5rem; + } + + .publisher-section, + .player-section, + .info-section, + .stream-info, + .actions-section, + .help-section { + padding: var(--spacing); + } +} + +/* Animation for smooth transitions */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.player-link-section, +.error-message { + animation: fadeIn 0.3s ease; +} + +/* Focus styles for accessibility */ +.btn:focus, +.link-input:focus, +details summary:focus { + outline: 2px solid var(--primary-color); + outline-offset: 2px; +} + +/* Print styles */ +@media print { + .controls, + .player-controls, + .action-buttons, + .btn { + display: none; + } +} diff --git a/lib/common/tsconfig.json b/lib/common/tsconfig.json index 784e219..47e2883 100644 --- a/lib/common/tsconfig.json +++ b/lib/common/tsconfig.json @@ -1,4 +1,9 @@ { "extends": "../tsconfig.json", - "include": ["."] -} + "compilerOptions": { + "composite": true + }, + "include": [ + "." + ] +} \ No newline at end of file diff --git a/lib/contribute/audio.ts b/lib/contribute/audio.ts index d42fe28..11bfe43 100644 --- a/lib/contribute/audio.ts +++ b/lib/contribute/audio.ts @@ -22,20 +22,30 @@ export class Encoder { } #start(controller: TransformStreamDefaultController) { - this.#encoder = new AudioEncoder({ - output: (frame, metadata) => { - this.#enqueue(controller, frame, metadata) - }, - error: (err) => { - throw err - }, - }) + try { + this.#encoder = new AudioEncoder({ + output: (frame, metadata) => { + this.#enqueue(controller, frame, metadata) + }, + error: (err) => { + throw err + }, + }) - this.#encoder.configure(this.#encoderConfig) + this.#encoder.configure(this.#encoderConfig) + } catch (e) { + console.error("Failed to configure AudioEncoder:", e) + throw e + } } #transform(frame: AudioData) { - this.#encoder.encode(frame) + try { + this.#encoder.encode(frame) + } catch (e) { + console.error("Failed to encode audio frame:", e) + throw e + } frame.close() } diff --git a/lib/contribute/broadcast.ts b/lib/contribute/broadcast.ts index b60a1c2..5936634 100644 --- a/lib/contribute/broadcast.ts +++ b/lib/contribute/broadcast.ts @@ -5,6 +5,7 @@ import { Track } from "./track" import * as Catalog from "../media/catalog" import { isAudioTrackSettings, isVideoTrackSettings } from "../common/settings" +import { sleep } from "../transport/utils" export interface BroadcastConfig { namespace: string[] @@ -37,12 +38,25 @@ export class Broadcast { const tracks: Catalog.Track[] = [] - for (const media of this.config.media.getTracks()) { + const mediaTracks = this.config.media.getTracks() + for (const media of mediaTracks) { const track = new Track(media, config) this.#tracks.set(track.name, track) const settings = media.getSettings() + if (media.kind === "audio") { + const audioContext = new AudioContext(); + audioContext.createMediaStreamSource(new MediaStream([media])) + const sampleRate = audioContext.sampleRate + Object.assign(settings, { + sampleRate, + }) + audioContext.close() + } + + console.log("track settings", settings, media, mediaTracks) + if (isVideoTrackSettings(settings)) { if (!config.video) { throw new Error("no video configuration provided") @@ -73,7 +87,7 @@ export class Broadcast { name: `${track.name}.m4s`, initTrack: `${track.name}.mp4`, selectionParams: { - mimeType: "audio/ogg", + mimeType: "audio/mp4", codec: config.audio.codec, samplerate: settings.sampleRate, //sampleSize: settings.sampleSize, @@ -104,9 +118,10 @@ export class Broadcast { } async #run() { - await this.connection.announce(this.namespace) + console.log("[Broadcast] #run loop started") + await this.connection.publish_namespace(this.namespace) - for (;;) { + for (; ;) { const subscriber = await this.connection.subscribed() if (!subscriber) break @@ -121,6 +136,7 @@ export class Broadcast { async #serveSubscribe(subscriber: SubscribeRecv) { try { const [base, ext] = splitExt(subscriber.track) + console.log("serving subscribe", subscriber.track, subscriber.namespace, base, ext) if (ext === "catalog") { await this.#serveCatalog(subscriber, base) } else if (ext === "mp4") { @@ -131,8 +147,10 @@ export class Broadcast { throw new Error(`unknown subscription: ${subscriber.track}`) } } catch (e) { + console.error("failed to serve subscribe", e) const err = asError(e) - await subscriber.close(1n, `failed to process subscribe: ${err.message}`) + // TODO(itzmanish): should check if the error is not found and send appropriate error code + await subscriber.close(0n, `failed to process subscribe: ${err.message}`) } finally { // TODO we can't close subscribers because there's no support for clean termination // await subscriber.close() @@ -145,11 +163,11 @@ export class Broadcast { const bytes = Catalog.encode(this.catalog) - // Send a SUBSCRIBE_OK await subscriber.ack() + await sleep(500); const stream = await subscriber.subgroup({ group: 0, subgroup: 0 }) - await stream.write({ object: 0, payload: bytes }) + await stream.write({ object_id: 0, object_payload: bytes }) await stream.close() } @@ -157,13 +175,13 @@ export class Broadcast { const track = this.#tracks.get(name) if (!track) throw new Error(`no track with name ${subscriber.track}`) - // Send a SUBSCRIBE_OK await subscriber.ack() + await sleep(500); const init = await track.init() const stream = await subscriber.subgroup({ group: 0, subgroup: 0 }) - await stream.write({ object: 0, payload: init }) + await stream.write({ object_id: 0, object_payload: init }) await stream.close() } @@ -174,9 +192,12 @@ export class Broadcast { // Send a SUBSCRIBE_OK await subscriber.ack() + // NOTE(itzmanish): hack to make sure subscribe ok reaches before the segement object + await sleep(500); + const segments = track.segments().getReader() - for (;;) { + for (; ;) { const { value: segment, done } = await segments.read() if (done) break @@ -200,13 +221,13 @@ export class Broadcast { // Pipe the segment to the stream. const chunks = segment.chunks().getReader() - for (;;) { + for (; ;) { const { value, done } = await chunks.read() if (done) break await stream.write({ - object, - payload: value, + object_id: object, + object_payload: value, }) object += 1 @@ -220,8 +241,12 @@ export class Broadcast { video.srcObject = this.config.media } - close() { - // TODO implement publish close + async close(isGoingAway: boolean = false) { + const notGoingAway = !isGoingAway + for (const track of this.#tracks.values()) { + await track.close() + } + await this.connection.closePublisher(notGoingAway) } // Returns the error message when the connection is closed diff --git a/lib/contribute/container.ts b/lib/contribute/container.ts index eac8683..b82d4aa 100644 --- a/lib/contribute/container.ts +++ b/lib/contribute/container.ts @@ -18,10 +18,16 @@ export class Container { this.encode = new TransformStream({ transform: (frame, controller) => { - if (isDecoderConfig(frame)) { - return this.#init(frame, controller) - } else { - return this.#enqueue(frame, controller) + try { + if (isDecoderConfig(frame)) { + console.log("Container received decoder config:", frame) + return this.#init(frame, controller) + } else { + return this.#enqueue(frame, controller) + } + } catch (e) { + console.error("Container failed to process frame:", e) + throw e } }, }) @@ -64,7 +70,6 @@ export class Container { const data = new MP4.Stream(desc, 8, MP4.Stream.LITTLE_ENDIAN) dops.parse(data) - dops.Version = 0 options.description = dops options.hdlr = "soun" } else { @@ -120,7 +125,7 @@ export class Container { // Moof and mdat atoms are written in pairs. // TODO remove the moof/mdat from the Box to reclaim memory once everything works - for (;;) { + for (; ;) { const moof = this.#mp4.moofs.shift() const mdat = this.#mp4.mdats.shift() diff --git a/lib/contribute/track.ts b/lib/contribute/track.ts index cec70d8..736dcf0 100644 --- a/lib/contribute/track.ts +++ b/lib/contribute/track.ts @@ -45,7 +45,14 @@ export class Track { abort: (e) => this.#close(e), }) - return source.readable.pipeThrough(encoder.frames).pipeThrough(container.encode).pipeTo(segments) + return source.readable + .pipeThrough(encoder.frames) + .pipeThrough(container.encode) + .pipeTo(segments) + .catch((err) => { + console.error("Audio pipeline error:", err) + throw err + }) } async #runVideo(track: MediaStreamVideoTrack, config: VideoEncoderConfig) { @@ -107,6 +114,10 @@ export class Track { writer.releaseLock() } + async close(e?: Error) { + return this.#close(e) + } + async #close(e?: Error) { this.#error = e @@ -134,7 +145,7 @@ export class Track { return new ReadableStream({ pull: async (controller) => { - for (;;) { + for (; ;) { let index = pos - this.#offset if (index < 0) index = 0 diff --git a/lib/contribute/tsconfig.json b/lib/contribute/tsconfig.json index 70899a7..e198b77 100644 --- a/lib/contribute/tsconfig.json +++ b/lib/contribute/tsconfig.json @@ -1,8 +1,13 @@ { "extends": "../tsconfig.json", - "include": ["."], + "include": [ + "." + ], "compilerOptions": { - "types": ["dom-mediacapture-transform", "dom-webcodecs"] + "types": [ + "dom-mediacapture-transform", + "dom-webcodecs" + ] }, "references": [ { @@ -15,4 +20,4 @@ "path": "../media" } ] -} +} \ No newline at end of file diff --git a/lib/contribute/video.ts b/lib/contribute/video.ts index 747c765..3e49fab 100644 --- a/lib/contribute/video.ts +++ b/lib/contribute/video.ts @@ -63,6 +63,8 @@ export class Encoder { }, }) + console.log("Encoder configured", this.#encoderConfig) + this.#encoder.configure(this.#encoderConfig) } diff --git a/lib/media/catalog/index.ts b/lib/media/catalog/index.ts index e9fc3d3..9c419c6 100644 --- a/lib/media/catalog/index.ts +++ b/lib/media/catalog/index.ts @@ -1,5 +1,6 @@ import { Connection } from "../../transport" import { asError } from "../../common/error" +import { debug } from "../../transport/utils" export interface CommonTrackFields { namespace?: string[] @@ -46,20 +47,23 @@ export function decode(raw: Uint8Array): Root { return catalog } -export async function fetch(connection: Connection, namespace: string[]): Promise { +export async function fetch(connection: Connection, namespace: string[]) { const subscribe = await connection.subscribe(namespace, ".catalog") try { + debug("catalog subscribe", subscribe) const segment = await subscribe.data() if (!segment) throw new Error("no catalog data") + console.log("catalog segment", segment) const chunk = await segment.read() if (!chunk) throw new Error("no catalog chunk") + console.log("catalog chunk", chunk) await segment.close() await subscribe.close() // we done - if (chunk.payload instanceof Uint8Array) { - return decode(chunk.payload) + if (chunk.object_payload instanceof Uint8Array) { + return decode(chunk.object_payload) } else { throw new Error("invalid catalog chunk") } diff --git a/lib/media/mp4/index.ts b/lib/media/mp4/index.ts index 0625198..1258663 100644 --- a/lib/media/mp4/index.ts +++ b/lib/media/mp4/index.ts @@ -17,7 +17,11 @@ export function isVideoTrack(track: MP4.Track): track is MP4.VideoTrack { // TODO contribute to mp4box MP4.BoxParser.dOpsBox.prototype.write = function (stream: MP4.Stream) { - this.size = this.ChannelMappingFamily === 0 ? 11 : 13 + this.ChannelMapping!.length + this.size = 11 // Base size for dOps box + if (this.ChannelMappingFamily !== 0) { + this.size += 2 + this.ChannelMapping!.length + } + this.writeHeader(stream) stream.writeUint8(this.Version) @@ -27,9 +31,8 @@ MP4.BoxParser.dOpsBox.prototype.write = function (stream: MP4.Stream) { stream.writeInt16(this.OutputGain) stream.writeUint8(this.ChannelMappingFamily) - if (!this.StreamCount || !this.CoupledCount) throw new Error("failed to write dOps box") - if (this.ChannelMappingFamily !== 0) { + if (!this.StreamCount || !this.CoupledCount) throw new Error("failed to write dOps box with channel mapping") stream.writeUint8(this.StreamCount) stream.writeUint8(this.CoupledCount) for (const mapping of this.ChannelMapping!) { diff --git a/lib/media/tsconfig.json b/lib/media/tsconfig.json index 2e4ee28..1e2adde 100644 --- a/lib/media/tsconfig.json +++ b/lib/media/tsconfig.json @@ -1,8 +1,12 @@ { "extends": "../tsconfig.json", - "include": ["."], + "include": [ + "." + ], "compilerOptions": { - "types": ["mp4box"] + "types": [ + "mp4box" + ] }, "references": [ { @@ -12,4 +16,4 @@ "path": "../common" } ] -} +} \ No newline at end of file diff --git a/lib/moq-publisher/index.ts b/lib/moq-publisher/index.ts new file mode 100644 index 0000000..5292bbb --- /dev/null +++ b/lib/moq-publisher/index.ts @@ -0,0 +1,217 @@ +import STYLE_SHEET from "./publisher-moq.css" +import { PublisherApi, PublisherOptions } from "../publish" + +export class PublisherMoq extends HTMLElement { + private shadow: ShadowRoot + private cameraSelect!: HTMLSelectElement + private microphoneSelect!: HTMLSelectElement + private previewVideo!: HTMLVideoElement + private connectButton!: HTMLButtonElement + private playbackUrlTextarea!: HTMLTextAreaElement + private mediaStream: MediaStream | null = null + + private publisher?: PublisherApi + private isPublishing = false + private namespace = "" + + constructor() { + super() + this.shadow = this.attachShadow({ mode: "open" }) + + // CSS + const style = document.createElement("style") + style.textContent = STYLE_SHEET + this.shadow.appendChild(style) + + const container = document.createElement("div") + container.classList.add("publisher-container") + + this.cameraSelect = document.createElement("select") + this.microphoneSelect = document.createElement("select") + this.previewVideo = document.createElement("video") + this.connectButton = document.createElement("button") + this.playbackUrlTextarea = document.createElement("textarea") + + this.previewVideo.autoplay = true + this.previewVideo.playsInline = true + this.previewVideo.muted = true + this.connectButton.textContent = "Connect" + + this.playbackUrlTextarea.readOnly = true + this.playbackUrlTextarea.rows = 3 + this.playbackUrlTextarea.style.display = "none" + this.playbackUrlTextarea.style.width = "100%" + this.playbackUrlTextarea.style.marginTop = "1rem" + + container.append( + this.cameraSelect, + this.microphoneSelect, + this.previewVideo, + this.connectButton, + this.playbackUrlTextarea, + ) + this.shadow.appendChild(container) + + // Bindings + this.handleDeviceChange = this.handleDeviceChange.bind(this) + this.handleClick = this.handleClick.bind(this) + + // Listeners + navigator.mediaDevices.addEventListener("devicechange", this.handleDeviceChange) + this.cameraSelect.addEventListener("change", () => this.startPreview()) + this.microphoneSelect.addEventListener("change", () => this.startPreview()) + this.connectButton.addEventListener("click", this.handleClick) + } + + connectedCallback() { + this.populateDeviceLists() + } + + disconnectedCallback() { + navigator.mediaDevices.removeEventListener("devicechange", this.handleDeviceChange) + } + + private async handleDeviceChange() { + await this.populateDeviceLists() + } + + private async populateDeviceLists() { + const devices = await navigator.mediaDevices.enumerateDevices() + const vids = devices.filter((d) => d.kind === "videoinput") + const mics = devices.filter((d) => d.kind === "audioinput") + + this.cameraSelect.innerHTML = "" + this.microphoneSelect.innerHTML = "" + + vids.forEach((d) => { + const o = document.createElement("option") + o.value = d.deviceId + o.textContent = d.label || `Camera ${this.cameraSelect.length + 1}` + this.cameraSelect.append(o) + }) + mics.forEach((d) => { + const o = document.createElement("option") + o.value = d.deviceId + o.textContent = d.label || `Mic ${this.microphoneSelect.length + 1}` + this.microphoneSelect.append(o) + }) + + await this.startPreview() + } + + private async startPreview() { + const vidId = this.cameraSelect.value + const micId = this.microphoneSelect.value + if (this.mediaStream) { + this.mediaStream.getTracks().forEach((t) => t.stop()) + } + // Request even dimensions for H.264 compatibility (480p = 854x480) + const videoConstraints = vidId + ? { deviceId: { exact: vidId }, height: { ideal: 480 }, frameRate: { ideal: 30 } } + : { height: { ideal: 480 }, frameRate: { ideal: 30 } } + const audioConstraints = micId ? { deviceId: { exact: micId } } : true + this.mediaStream = await navigator.mediaDevices.getUserMedia({ + video: videoConstraints, + audio: audioConstraints, + }) + + this.previewVideo.srcObject = this.mediaStream + } + + private async handleClick() { + if (!this.isPublishing) { + return this.startPublishing() + } else { + return this.stopPublishing() + } + } + + private async startPublishing(uri?: string) { + if (!this.mediaStream) { + console.warn("No media stream available") + return + } + + this.namespace = this.getAttribute("namespace") ?? crypto.randomUUID() + + const audioTrack = this.mediaStream.getAudioTracks()[0] + const settings = audioTrack.getSettings() + + const sampleRate = settings.sampleRate ?? (await new AudioContext()).sampleRate + const numberOfChannels = settings.channelCount ?? 2 + + // H.264 requires even dimensions - round down to nearest even number + const makeEven = (n: number) => Math.floor(n / 2) * 2 + const width = makeEven(this.previewVideo.videoWidth) + const height = makeEven(this.previewVideo.videoHeight) + + const videoConfig: VideoEncoderConfig = { + codec: "avc1.42E01E", + width, + height, + bitrate: 1000000, + framerate: 30, + } + const audioConfig: AudioEncoderConfig = { codec: "opus", sampleRate, numberOfChannels, bitrate: 64000 } + + const opts: PublisherOptions = { + url: uri ?? this.getAttribute("src")!, + fingerprintUrl: this.getAttribute("fingerprint") ?? undefined, + namespace: [this.namespace], + media: this.mediaStream, + video: videoConfig, + audio: audioConfig, + } + + console.log("Publisher Options", opts) + + this.publisher = new PublisherApi(opts) + + this.publisher.addEventListener("reconnect", ((event: CustomEvent) => { + console.log("[PublisherApi] Reconnect event received:", event.detail) + this.handleReconnect(event.detail?.uri) + }) as EventListener) + + Object.assign(window, { publisher: this.publisher }) + + try { + await this.publisher.publish() + this.isPublishing = true + this.connectButton.textContent = "Stop" + this.cameraSelect.disabled = true + this.microphoneSelect.disabled = true + + const playbackBaseUrl = this.getAttribute("playbackbaseurl") + if (playbackBaseUrl) { + this.playbackUrlTextarea.value = `${playbackBaseUrl}${this.namespace}` + } else { + this.playbackUrlTextarea.value = this.namespace + } + this.playbackUrlTextarea.style.display = "block" + } catch (err) { + console.error("Publish failed:", err) + this.mediaStream.getTracks().forEach((t) => t.stop()) + } + } + + private async stopPublishing(graceful: boolean = false) { + try { + await this.publisher!.stop(graceful) + } catch (err) { + console.error("Stop failed:", err) + } finally { + this.isPublishing = false + this.connectButton.textContent = "Connect" + this.cameraSelect.disabled = false + this.microphoneSelect.disabled = false + this.playbackUrlTextarea.style.display = "none" + } + } + + private async handleReconnect(uri: string) { + await this.stopPublishing(true) + await this.startPublishing(uri) + } +} +customElements.define("publisher-moq", PublisherMoq) +export default PublisherMoq \ No newline at end of file diff --git a/lib/moq-publisher/publisher-moq.css b/lib/moq-publisher/publisher-moq.css new file mode 100644 index 0000000..35f812f --- /dev/null +++ b/lib/moq-publisher/publisher-moq.css @@ -0,0 +1,17 @@ +.publisher-container { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +#cameraSelect, +#microphoneSelect, +#connect { + font-size: 1rem; + padding: 0.5rem; +} + +#preview { + background: black; + object-fit: cover; +} diff --git a/lib/package.json b/lib/package.json index 7c653f1..4a5f81d 100644 --- a/lib/package.json +++ b/lib/package.json @@ -4,8 +4,11 @@ "description": "Media over QUIC library", "license": "(MIT OR Apache-2.0)", "wc-player": "video-moq/index.ts", + "wc-publisher": "moq-publisher/index.ts", "simple-player": "playback/index.ts", - "files": ["dist"], + "files": [ + "dist" + ], "exports": { ".": { "import": "./dist/moq-player.esm.js", @@ -14,10 +17,15 @@ "./simple-player": { "import": "./dist/moq-simple-player.esm.js", "require": "./dist/moq-simple-player.cjs.js" + }, + "./moq-publisher": { + "import": "./dist/moq-publisher.esm.js", + "require": "./dist/moq-publisher.cjs.js" } }, "iife": "dist/moq-player.iife.js", "iife-simple": "dist/moq-simple-player.iife.js", + "iife-publisher": "dist/moq-publisher.iife.js", "types": "dist/types/moq-player.d.ts", "scripts": { "build": "rollup -c", @@ -58,11 +66,21 @@ "mp4box": "^0.5.2" }, "browserslist": { - "production": ["chrome >= 97", "edge >= 98", "firefox >= 130", "opera >= 83", "safari >= 18"], - "development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"] + "production": [ + "chrome >= 97", + "edge >= 98", + "firefox >= 130", + "opera >= 83", + "safari >= 18" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] }, "repository": { "type": "git", "url": "https://github.com/englishm/moq-js" } -} +} \ No newline at end of file diff --git a/lib/playback/backend.ts b/lib/playback/backend.ts index f0ad3cb..148ee8b 100644 --- a/lib/playback/backend.ts +++ b/lib/playback/backend.ts @@ -6,7 +6,7 @@ import MediaWorker from "web-worker:./worker/index.ts" import { RingShared } from "../common/ring" import { Root, isAudioTrack } from "../media/catalog" -import { SubgroupHeader } from "../transport/objects" +import { SubgroupHeader } from "../transport/subgroup" export interface PlayerConfig { canvas: OffscreenCanvas diff --git a/lib/playback/index.ts b/lib/playback/index.ts index 497e7d0..3e6b09e 100644 --- a/lib/playback/index.ts +++ b/lib/playback/index.ts @@ -7,7 +7,7 @@ import { asError } from "../common/error" import Backend from "./backend" import { Client } from "../transport/client" -import { SubgroupReader } from "../transport/objects" +import { SubgroupReader } from "../transport/subgroup" export type Range = Message.Range export type Timeline = Message.Timeline @@ -49,8 +49,8 @@ export default class Player extends EventTarget { this.#catalog = catalog this.#tracksByName = new Map(catalog.tracks.map((track) => [track.name, track])) this.#tracknum = tracknum - this.#audioTrackName = "" - this.#videoTrackName = "" + this.#audioTrackName = catalog.tracks.find((track) => Catalog.isAudioTrack(track))?.name ?? "" + this.#videoTrackName = catalog.tracks.find((track) => Catalog.isVideoTrack(track))?.name ?? "" this.#muted = false this.#paused = false this.#backend = new Backend({ canvas, catalog }, this) @@ -63,7 +63,12 @@ export default class Player extends EventTarget { }) // Async work - this.#running = abort.catch(this.#close) + this.#running = new Promise((_, rej) => { + abort.catch((e) => { + this.#close() + rej(e) + }) + }) this.#run().catch((err) => { console.error("Error in #run():", err) @@ -73,7 +78,7 @@ export default class Player extends EventTarget { } static async create(config: PlayerConfig, tracknum: number): Promise { - const client = new Client({ url: config.url, fingerprint: config.fingerprint, role: "subscriber" }) + const client = new Client({ url: config.url, fingerprint: config.fingerprint }) const connection = await client.connect() const catalog = await Catalog.fetch(connection, [config.namespace]) @@ -81,7 +86,12 @@ export default class Player extends EventTarget { const canvas = config.canvas.transferControlToOffscreen() - return new Player(connection, catalog, tracknum, canvas) + const player = new Player(connection, catalog as any, tracknum, canvas) + connection.onMigration = async (sessionUri) => { + console.log("dispatching reconnect event") + player.dispatchEvent(new CustomEvent("reconnect", { detail: { uri: sessionUri } })) + } + return player } async #run() { @@ -90,14 +100,17 @@ export default class Player extends EventTarget { const inits = new Set<[string, string]>() const tracks = new Array() - this.#catalog.tracks.forEach((track, index) => { - if (index == this.#tracknum || Catalog.isAudioTrack(track)) { + this.#catalog.tracks.forEach((track) => { + if (track.name === this.#videoTrackName || track.name === this.#audioTrackName) { if (!track.namespace) throw new Error("track has no namespace") if (track.initTrack) inits.add([track.namespace.join("/"), track.initTrack]) tracks.push(track) } }) + console.log("inits", inits) + console.log("tracks", tracks) + // Call #runInit on each unique init track // TODO do this in parallel with #runTrack to remove a round trip await Promise.all(Array.from(inits).map((init) => this.#runInit(...init))) @@ -110,17 +123,20 @@ export default class Player extends EventTarget { } async #runInit(namespace: string, name: string) { + console.log("running #runInit", namespace, name) const sub = await this.#connection.subscribe([namespace], name) try { + console.log("waiting for init data") const init = await Promise.race([sub.data(), this.#running]) if (!init) throw new Error("no init data") + console.log("got init data") // We don't care what type of reader we get, we just want the payload. const chunk = await init.read() if (!chunk) throw new Error("no init chunk") - if (!(chunk.payload instanceof Uint8Array)) throw new Error("invalid init chunk") + if (!(chunk.object_payload instanceof Uint8Array)) throw new Error("invalid init chunk") - this.#backend.init({ data: chunk.payload, name }) + this.#backend.init({ data: chunk.object_payload, name }) } finally { await sub.close() } @@ -147,8 +163,11 @@ export default class Player extends EventTarget { const sub = await this.#connection.subscribe(track.namespace, track.name) try { - for (;;) { + console.log("starting segment data loop") + for (; ;) { + console.log("waiting for segment data", this.#running) const segment = await Promise.race([sub.data(), this.#running]) + if (!segment) continue if (!(segment instanceof SubgroupReader)) { @@ -168,7 +187,7 @@ export default class Player extends EventTarget { eventOfFirstSegmentSent = true } - const [buffer, stream] = segment.stream.release() + const [buffer, stream] = segment.stream.release() as [Uint8Array, ReadableStream] this.#backend.segment({ init: track.initTrack, @@ -315,7 +334,13 @@ export default class Player extends EventTarget { if (err) this.#abort(err) else this.#close() - if (this.#connection) this.#connection.close() + if (this.#connection) { + if (err?.message === "cancelled") { + this.#connection.close(0x4, "going away") + } else { + this.#connection.close() + } + } if (this.#backend) await this.#backend.close() } diff --git a/lib/playback/worker/index.ts b/lib/playback/worker/index.ts index 487365e..4a9d556 100644 --- a/lib/playback/worker/index.ts +++ b/lib/playback/worker/index.ts @@ -7,7 +7,8 @@ import * as MP4 from "../../media/mp4" import * as Message from "./message" import { asError } from "../../common/error" import { Deferred } from "../../common/async" -import { SubgroupReader, Reader } from "../../transport/objects" +import { SubgroupReader } from "../../transport/subgroup" +import { ReadableStreamBuffer } from "../../transport/buffer" class Worker { // Timeline receives samples, buffering them and choosing the timestamp to render. @@ -71,7 +72,7 @@ class Worker { const container = new MP4.Parser(await init.promise) const timeline = msg.kind === "audio" ? this.#timeline.audio : this.#timeline.video - const reader = new SubgroupReader(msg.header, new Reader(msg.buffer, msg.stream)) + const reader = new SubgroupReader(msg.header, new ReadableStreamBuffer(msg.stream, msg.buffer)) // Create a queue that will contain each MP4 frame. const queue = new TransformStream({}) @@ -80,23 +81,23 @@ class Worker { // Add the segment to the timeline const segments = timeline.segments.getWriter() await segments.write({ - sequence: msg.header.group, + sequence: msg.header.group_id, frames: queue.readable, }) segments.releaseLock() // Read each chunk, decoding the MP4 frames and adding them to the queue. - for (;;) { + for (; ;) { const chunk = await reader.read() if (!chunk) { break } - if (!(chunk.payload instanceof Uint8Array)) { - throw new Error(`invalid payload: ${chunk.payload}`) + if (!(chunk.object_payload instanceof Uint8Array)) { + throw new Error(`invalid payload: ${chunk.object_payload}`) } - const frames = container.decode(chunk.payload) + const frames = container.decode(chunk.object_payload) for (const frame of frames) { await segment.write(frame) } diff --git a/lib/playback/worker/message.ts b/lib/playback/worker/message.ts index 8b0e118..c0c1868 100644 --- a/lib/playback/worker/message.ts +++ b/lib/playback/worker/message.ts @@ -1,4 +1,4 @@ -import { SubgroupHeader } from "../../transport/objects" +import { SubgroupHeader } from "../../transport/subgroup" import { RingShared } from "../../common/ring" export interface Config { diff --git a/lib/playback/worker/video.ts b/lib/playback/worker/video.ts index f433a57..a8691d6 100644 --- a/lib/playback/worker/video.ts +++ b/lib/playback/worker/video.ts @@ -57,7 +57,7 @@ export class Renderer { async #run() { const reader = this.#timeline.frames.pipeThrough(this.#queue).getReader() - for (;;) { + for (; ;) { const { value: frame, done } = await reader.read() if (this.#paused) continue if (done) break @@ -127,7 +127,13 @@ export class Renderer { // optimizeForLatency: true } - this.#decoder.configure(this.#decoderConfig) + try { + this.#decoder.configure(this.#decoderConfig) + console.log(`[VideoWorker] Decoder configured successfully. New state: ${this.#decoder.state}`) + } catch (e) { + console.error("[VideoWorker] FAILED to configure decoder:", e) + return // Stop processing if configure fails + } if (!frame.sample.is_sync) { this.#waitingForKeyframe = true } else { @@ -158,7 +164,12 @@ export class Renderer { timestamp: frame.sample.dts / frame.track.timescale, }) - this.#decoder.decode(chunk) + console.log(`[VideoWorker] Decoding chunk, type: ${chunk.type}, size: ${chunk.byteLength}`) + try { + this.#decoder.decode(chunk) + } catch (e) { + console.error("[VideoWorker] FAILED to decode chunk:", e) + } } } } diff --git a/lib/publish/index.ts b/lib/publish/index.ts new file mode 100644 index 0000000..aeaec2e --- /dev/null +++ b/lib/publish/index.ts @@ -0,0 +1,66 @@ +import { Client } from "../transport/client" +import { Broadcast, BroadcastConfig } from "../contribute" +import { Connection } from "../transport/connection" + +export interface PublisherOptions { + url: string + namespace: string[] + media: MediaStream + video?: VideoEncoderConfig + audio?: AudioEncoderConfig + fingerprintUrl?: string +} + +export class PublisherApi extends EventTarget { + private client: Client + private connection?: Connection + private broadcast?: Broadcast + private opts: PublisherOptions + + constructor(opts: PublisherOptions) { + super() + this.opts = opts + this.client = new Client({ + url: opts.url, + fingerprint: opts.fingerprintUrl, + }) + } + + async publish(): Promise { + if (!this.connection) { + this.connection = await this.client.connect() + this.connection.onMigration = async (sessionUri) => { + console.log("dispatching reconnect event from publisher") + this.dispatchEvent(new CustomEvent("reconnect", { detail: { uri: sessionUri } })) + } + } + + const bcConfig: BroadcastConfig = { + connection: this.connection, + namespace: this.opts.namespace, + media: this.opts.media, + video: this.opts.video, + audio: this.opts.audio, + } + + this.broadcast = new Broadcast(bcConfig) + } + + async stop(goingaway: boolean = false): Promise { + if (this.broadcast) { + this.broadcast.close(goingaway) + const err = await this.broadcast.closed() + if (err) { + console.error("Error in broadcast closed:", err) + } + } + if (this.connection) { + if (goingaway) { + this.connection.close(0x4, "going away") + } else { + this.connection.close() + } + await this.connection.closed() + } + } +} \ No newline at end of file diff --git a/lib/rollup.config.js b/lib/rollup.config.js index 22f5292..fdee046 100644 --- a/lib/rollup.config.js +++ b/lib/rollup.config.js @@ -31,6 +31,23 @@ const basePlugins = [ ] module.exports = [ + { + input: pkg["wc-publisher"], + output: [ + { + file: pkg["iife-publisher"], + format: "iife", + name: "MoqPublisher", + sourcemap: true, + }, + { + file: pkg.exports["./moq-publisher"].import, + format: "esm", + sourcemap: true, + }, + ], + plugins: [...basePlugins, css()], + }, { input: pkg["wc-player"], output: [ diff --git a/lib/transport/base_data.ts b/lib/transport/base_data.ts new file mode 100644 index 0000000..dc90d56 --- /dev/null +++ b/lib/transport/base_data.ts @@ -0,0 +1,143 @@ +import { ImmutableBytesBuffer, MutableBytesBuffer, Reader } from "./buffer" + +export type Tuple = TupleField[] +export type TupleField = T // can be any type + +export namespace Tuple { + // Serialize implementation - only works for types where TupleField.serialize is implemented + export function serialize(tuple: Tuple): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(tuple.length) + tuple.forEach(field => { + const serialized = TupleField.serialize(field) + buf.putBytes(serialized) + }) + return buf.Uint8Array + } + + // Deserialize implementation - only works for types where TupleField.deserialize is implemented + export function deserialize(buffer: ImmutableBytesBuffer): Tuple { + const tuple: T[] = [] + const len = buffer.getVarInt() + for (let i = 0; i < len; i++) { + const field = TupleField.deserialize(buffer) + tuple.push(field) + } + return tuple + } +} + +export namespace TupleField { + // Serialize implementation for string fields only + export function serialize(field: T): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + const encoded = new TextEncoder().encode(field) + buf.putVarInt(encoded.length) + buf.putBytes(encoded) + return buf.Uint8Array + } + + // Deserialize implementation for string fields only + export function deserialize(buffer: ImmutableBytesBuffer): T { + const field = buffer.getVarBytes() + return new TextDecoder().decode(field) as T + } +} + +export type Location = { + group: bigint + object: bigint +} + +export namespace Location { + export function serialize(location: Location): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(location.group) + buf.putVarInt(location.object) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): Location { + const group = buffer.getVarInt() + const object = buffer.getVarInt() + return { group, object } + } +} + + +// TODO(itzmanish): have checks for key type for even or odd +export type KeyValuePairs = Map +export type Parameters = KeyValuePairs + + +export namespace KeyValuePairs { + export function valueIsVarInt(key: bigint): boolean { + return (key & 1n) === 0n + } + + export function serialize(pairs: Parameters): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(pairs.size) + pairs.forEach((value, key) => { + buf.putVarInt(key) + if (valueIsVarInt(key)) { + buf.putVarInt(value as bigint) + } else { + buf.putBytes(value as Uint8Array) + } + }) + + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): KeyValuePairs { + const size = buffer.getNumberVarInt() + return deserialize_with_size(buffer, size) + } + + export function deserialize_with_size(buffer: ImmutableBytesBuffer, size: number): KeyValuePairs { + const pairs = new Map() + for (let i = 0; i < size; i++) { + const key = buffer.getVarInt() + const value = valueIsVarInt(key) ? buffer.getVarInt() : buffer.getVarBytes() + pairs.set(key, value) + } + + return pairs + } + + export async function deserialize_with_reader(reader: Reader): Promise { + const size = await reader.getNumberVarInt() + const pairs = new Map() + for (let i = 0; i < size; i++) { + const key = await reader.getVarInt() + const value = valueIsVarInt(key) ? await reader.getVarInt() : await reader.getVarBytes() + pairs.set(key, value) + } + + return pairs + } +} + + +export namespace Parameters { + export function valueIsVarInt(key: bigint): boolean { + return KeyValuePairs.valueIsVarInt(key) + } + + export function serialize(pairs: Parameters): Uint8Array { + return KeyValuePairs.serialize(pairs) + } + + export function deserialize(buffer: ImmutableBytesBuffer): Parameters { + return KeyValuePairs.deserialize(buffer) + } + + export function deserialize_with_size(buffer: ImmutableBytesBuffer, size: number): Parameters { + return KeyValuePairs.deserialize_with_size(buffer, size) + } + + export async function deserialize_with_reader(reader: Reader): Promise { + return KeyValuePairs.deserialize_with_reader(reader) + } +} \ No newline at end of file diff --git a/lib/transport/buffer.ts b/lib/transport/buffer.ts new file mode 100644 index 0000000..a72bbab --- /dev/null +++ b/lib/transport/buffer.ts @@ -0,0 +1,582 @@ +const MAX_U6 = Math.pow(2, 6) - 1 // 0-63 (6 bits) +const MAX_U14 = Math.pow(2, 14) - 1 // 0-16383 (14 bits) +const MAX_U30 = Math.pow(2, 30) - 1 // 0-1073741823 (30 bits) +const MAX_U53 = Number.MAX_SAFE_INTEGER +const MAX_U62: bigint = 2n ** 62n - 1n // 0-4611686018427387903 (62 bits) + +export interface Reader { + byteLength: number + waitForBytes(len: number): Promise + read(len: number): Promise + done(): Promise + close(): Promise + release(): [Uint8Array, ReadableStream] | [Uint8Array, WritableStream] + + getU8(): Promise + getU16(): Promise + getNumberVarInt(): Promise + getVarInt(): Promise + getVarBytes(): Promise + getUtf8String(): Promise +} + +export interface Writer { + write(data: Uint8Array): Promise + flush(): Promise + clear(): void + close(): Promise + release(): [Uint8Array, WritableStream] | [Uint8Array, ReadableStream] + + putU8(v: number): void + putU16(v: number): void + putVarInt(v: number | bigint): void + putUtf8String(v: string): void +} + +export class ImmutableBytesBuffer { + protected buffer: Uint8Array + protected offset = 0 + view: DataView + + constructor(buffer: Uint8Array) { + this.buffer = buffer + this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.length) + } + + get length(): number { + return this.buffer.length + } + + get remaining(): number { + return this.length - this.offset + } + + get Uint8Array(): Uint8Array { + return this.buffer.slice(0, this.offset) + } + + get firstByteValue(): number { + return this.buffer[this.offset] + } + + getRemainingBuffer(): Uint8Array { + return this.buffer.subarray(this.offset) + } + + getU8(): number { + if (this.remaining < 1) throw new Error("not enough bytes") + const val = this.view.getUint8(this.offset) + this.offset += 1 + return val + } + + getU16(): number { + if (this.remaining < 2) throw new Error("not enough bytes") + const val = this.view.getUint16(this.offset) + this.offset += 2 + return val + } + + getU32(): number { + if (this.remaining < 4) throw new Error("not enough bytes") + const val = this.view.getUint32(this.offset) + this.offset += 4 + return val + } + + getU64(): bigint { + if (this.remaining < 8) throw new Error("not enough bytes") + const val = this.view.getBigUint64(this.offset) + this.offset += 8 + return val + } + + getVarInt(): bigint { + if (this.remaining < 1) throw new Error("not enough bytes") + + // Read first byte to determine length + const first = this.view.getUint8(this.offset) + const prefix = (first & 0b11000000) >> 6 // Top 2 bits indicate length + + if (prefix === 0) { + // 1 byte: 00xxxxxx + this.offset += 1 + return BigInt(first & 0x3f) + } else if (prefix === 1) { + // 2 bytes: 01xxxxxx xxxxxxxx + if (this.remaining < 2) throw new Error("not enough bytes") + const val = this.view.getUint16(this.offset) + this.offset += 2 + return BigInt(val & 0x3fff) + } else if (prefix === 2) { + // 4 bytes: 10xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + if (this.remaining < 4) throw new Error("not enough bytes") + const val = this.view.getUint32(this.offset) + this.offset += 4 + return BigInt(val & 0x3fffffff) + } else { + // 8 bytes: 11xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + if (this.remaining < 8) throw new Error("not enough bytes") + const val = this.view.getBigUint64(this.offset) + this.offset += 8 + return val & 0x3fffffffffffffffn + } + } + + getNumberVarInt(): number { + const val = this.getVarInt() + if (val > Number.MAX_SAFE_INTEGER) throw new Error("varint too large") + return Number(val) + } + + getBytes(len: number): Uint8Array { + if (this.remaining < len) throw new Error("not enough bytes") + const val = this.buffer.slice(this.offset, this.offset + len) + this.offset += len + return val + } + + getVarBytes(): Uint8Array { + const len = this.getNumberVarInt() + return this.getBytes(len) + } + + getUtf8String(): string { + const len = this.getNumberVarInt() + if (len === 0) return "" + const val = this.getBytes(len) + return new TextDecoder().decode(val) + } +} + +export class MutableBytesBuffer { + offset = 0 + buffer: Uint8Array + view: DataView + constructor(buffer: Uint8Array) { + this.buffer = buffer + this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength) + } + + get length(): number { + return this.offset + } + + get byteLength(): number { + // NOTE(itzmanish): since we are working with u8 buffer, byteLength is same as length + return this.length + } + + get Uint8Array(): Uint8Array { + return this.buffer.subarray(0, this.offset) + } + + enoughSpaceAvailable(len: number): void { + const required = this.offset + len + if (required < this.buffer.length) { + return + } + + const newBuffer = new Uint8Array(nextPow2(required)) + newBuffer.set(this.buffer.subarray(0, this.offset)) + this.buffer = newBuffer + this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength) + } + + putU8(v: number) { + this.enoughSpaceAvailable(1) + this.view.setUint8(this.offset, v) + this.offset += 1 + } + + putU16(v: number) { + this.enoughSpaceAvailable(2) + this.view.setUint16(this.offset, v) + this.offset += 2 + } + + putU32(v: number) { + this.enoughSpaceAvailable(4) + this.view.setUint32(this.offset, v) + this.offset += 4 + } + + putU64(v: bigint) { + this.enoughSpaceAvailable(8) + this.view.setBigUint64(this.offset, v) + this.offset += 8 + } + + putVarInt(v: number | bigint) { + const value = typeof v === "number" ? BigInt(v) : v + if (value < 0) throw new Error("underflow, value is negative: " + v) + + let length: number + let prefix: number + + if (value < MAX_U6) { + // 1 byte: 00xxxxxx + length = 1 + prefix = 0x00 + } else if (value < MAX_U14) { + // 2 bytes: 01xxxxxx xxxxxxxx + length = 2 + prefix = 0x40 + } else if (value < MAX_U30) { + // 4 bytes: 10xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + length = 4 + prefix = 0x80 + } else if (value <= MAX_U62) { + // 8 bytes: 11xxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx + length = 8 + prefix = 0xc0 + } else { + throw new Error("overflow, value larger than 62-bits: " + v) + } + + this.enoughSpaceAvailable(length) + + // Write first byte with prefix + const shift = BigInt((length - 1) * 8) + this.putU8(Number((value >> shift) | BigInt(prefix))) + + // Write remaining bytes + for (let i = length - 2; i >= 0; i--) { + this.putU8(Number((value >> BigInt(i * 8)) & 0xffn)) + } + } + + putBytes(v: Uint8Array) { + this.enoughSpaceAvailable(v.length) + this.buffer.set(v, this.offset) + this.offset += v.length + } + + putUtf8String(v: string) { + const bytes = new TextEncoder().encode(v) + this.putLengthPrefixedByteArray(bytes.length, bytes) + } + + putLengthPrefixedByteArray(len: number, v: Uint8Array) { + this.putVarInt(len) + this.putBytes(v) + } + +} + +export class ReadableStreamBuffer implements Reader { + protected buffer: Uint8Array + protected reader: ReadableStreamDefaultReader + protected readableStream: ReadableStream + + constructor(reader: ReadableStream, buffer?: Uint8Array) { + this.buffer = buffer ?? new Uint8Array() + this.reader = reader.getReader() + this.readableStream = reader + } + + waitForBytes(len: number): Promise { + if (this.buffer.byteLength >= len) { + return Promise.resolve() + } + return this.#fillTo(len) + } + + get byteLength(): number { + return this.buffer.byteLength + } + + // Adds more data to the buffer, returning true if more data was added. + async #fill(): Promise { + const result = await this.reader.read() + if (result.done) { + return false + } + const buffer = new Uint8Array(result.value) + + if (this.buffer.byteLength == 0) { + this.buffer = buffer + } else { + const temp = new Uint8Array(this.buffer.byteLength + buffer.byteLength) + temp.set(this.buffer) + temp.set(buffer, this.buffer.byteLength) + this.buffer = temp + } + + return true + } + + // Add more data to the buffer until it's at least size bytes. + async #fillTo(size: number) { + while (this.buffer.byteLength < size) { + if (!(await this.#fill())) { + throw new Error("unexpected end of stream") + } + } + } + + // Consumes the first size bytes of the buffer. + #slice(size: number): Uint8Array { + const result = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset, size) + this.buffer = new Uint8Array(this.buffer.buffer, this.buffer.byteOffset + size) + + return result + } + + async read(size: number): Promise { + if (size == 0) return new Uint8Array() + + await this.#fillTo(size) + return this.#slice(size) + } + + async readAll(): Promise { + // eslint-disable-next-line no-empty + while (await this.#fill()) { } + return this.#slice(this.buffer.byteLength) + } + + async getUtf8String(maxLength?: number): Promise { + const length = await this.getNumberVarInt() + if (maxLength !== undefined && length > maxLength) { + throw new Error(`string length ${length} exceeds max length ${maxLength}`) + } + + const buffer = await this.read(length) + return new TextDecoder().decode(buffer) + } + + async getU8(): Promise { + await this.#fillTo(1) + return this.#slice(1)[0] + } + + async getU16(): Promise { + await this.#fillTo(2) + const slice = this.#slice(2) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return view.getInt16(0) + } + + // Returns a Number using 53-bits, the max Javascript can use for integer math + async getNumberVarInt(): Promise { + const v = await this.getVarInt() + if (v > MAX_U53) { + throw new Error("value larger than 53-bits; use v62 instead") + } + + return Number(v) + } + + async getVarInt(): Promise { + await this.#fillTo(1) + const size = (this.buffer[0] & 0xc0) >> 6 + + if (size == 0) { + const first = this.#slice(1)[0] + return BigInt(first) & 0x3fn + } else if (size == 1) { + await this.#fillTo(2) + const slice = this.#slice(2) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return BigInt(view.getInt16(0)) & 0x3fffn + } else if (size == 2) { + await this.#fillTo(4) + const slice = this.#slice(4) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return BigInt(view.getUint32(0)) & 0x3fffffffn + } else if (size == 3) { + await this.#fillTo(8) + const slice = this.#slice(8) + const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) + + return view.getBigUint64(0) & 0x3fffffffffffffffn + } else { + throw new Error("impossible") + } + } + + async getVarBytes(): Promise { + const length = await this.getNumberVarInt() + return this.read(length) + } + + + async done(): Promise { + if (this.buffer.byteLength > 0) return false + return !(await this.#fill()) + } + + async close() { + this.reader.releaseLock() + await this.readableStream.cancel() + } + + release(): [Uint8Array, ReadableStream] { + this.reader.releaseLock() + return [this.buffer, this.readableStream] + } + +} + +export class WritableStreamBuffer implements Writer { + protected writer: WritableStreamDefaultWriter + protected writableStream: WritableStream + protected buffer: MutableBytesBuffer + constructor(writer: WritableStream) { + this.writer = writer.getWriter() + this.writableStream = writer + this.buffer = new MutableBytesBuffer(new Uint8Array()) + } + + async write(data: Uint8Array) { + return this.writer.write(data) + } + + async close() { + this.writer.releaseLock() + return this.writableStream.close() + } + + async flush() { + await this.write(this.buffer.Uint8Array) + this.clear() + } + + clear() { + this.buffer = new MutableBytesBuffer(new Uint8Array()) + } + + putU8(v: number) { + this.buffer.putU8(v) + } + + putU16(v: number) { + this.buffer.putU16(v) + } + + putVarInt(v: number | bigint) { + this.buffer.putVarInt(v) + } + + putUtf8String(v: string) { + this.buffer.putUtf8String(v) + } + + release(): [Uint8Array, WritableStream] { + this.writer.releaseLock() + return [this.buffer.Uint8Array, this.writableStream] + } +} + +export class ReadableWritableStreamBuffer implements Reader, Writer { + private readStreamBuffer: ReadableStreamBuffer + private writeStreamBuffer: WritableStreamBuffer + + constructor(reader: ReadableStream, writer: WritableStream) { + this.readStreamBuffer = new ReadableStreamBuffer(reader) + this.writeStreamBuffer = new WritableStreamBuffer(writer) + } + + waitForBytes(len: number): Promise { + return this.readStreamBuffer.waitForBytes(len) + } + + get byteLength(): number { + return this.readStreamBuffer.byteLength + } + + async read(len: number): Promise { + return this.readStreamBuffer.read(len) + } + + + async getU8(): Promise { + return this.readStreamBuffer.getU8() + } + + async getU16(): Promise { + return this.readStreamBuffer.getU16() + } + + async getNumberVarInt(): Promise { + return this.readStreamBuffer.getNumberVarInt() + } + + async getVarInt(): Promise { + return this.readStreamBuffer.getVarInt() + } + + async getUtf8String(): Promise { + return this.readStreamBuffer.getUtf8String() + } + + async getVarBytes(): Promise { + return this.readStreamBuffer.getVarBytes() + } + + async done(): Promise { + return this.readStreamBuffer.done() + } + + putU16(v: number): void { + this.writeStreamBuffer.putU16(v) + } + putVarInt(v: number | bigint): void { + this.writeStreamBuffer.putVarInt(v) + } + putUtf8String(v: string): void { + this.writeStreamBuffer.putUtf8String(v) + } + putU8(v: number) { + this.writeStreamBuffer.putU8(v) + } + + async write(data: Uint8Array) { + return this.writeStreamBuffer.write(data) + } + + async close() { + this.readStreamBuffer.close() + this.writeStreamBuffer.close() + } + async flush(): Promise { + return this.writeStreamBuffer.flush() + } + + clear(): void { + this.writeStreamBuffer.clear() + } + + + release(): [Uint8Array, ReadableStream] | [Uint8Array, WritableStream] { + throw new Error("use release all instead of release") + } + + releaseAll(): [Uint8Array, Uint8Array, ReadableStream, WritableStream] { + const [readBuffer, readStream] = this.readStreamBuffer.release() + const [writeBuffer, writeStream] = this.writeStreamBuffer.release() + return [readBuffer, writeBuffer, readStream, writeStream] + } +} + +function nextPow2(x: number): number { + // Handle edge cases + if (x <= 1) return 1; + + // Decrement to handle exact powers of 2 + x--; + + // Fill all bits below the highest set bit + x = x | (x >> 1); + x = x | (x >> 2); + x = x | (x >> 4); + x = x | (x >> 8); + x = x | (x >> 16); + + // Increment to get next power of 2 + return x + 1; +} \ No newline at end of file diff --git a/lib/transport/client.ts b/lib/transport/client.ts index eb36222..826bb29 100644 --- a/lib/transport/client.ts +++ b/lib/transport/client.ts @@ -1,15 +1,12 @@ -import * as Stream from "./stream" -import * as Setup from "./setup" import * as Control from "./control" +import * as Stream from './stream' import { Objects } from "./objects" import { Connection } from "./connection" +import { ClientSetup, ControlMessageType, ServerSetup } from "./control" +import { ImmutableBytesBuffer, ReadableWritableStreamBuffer } from "./buffer" export interface ClientConfig { url: string - - // Parameters used to create the MoQ session - role: Setup.Role - // If set, the server fingerprint will be fetched from this URL. // This is required to use self-signed certificates with Chrome (May 2023) fingerprint?: string @@ -29,41 +26,54 @@ export class Client { }) } - async connect(): Promise { - // Helper function to make creating a promise easier + async createQuic(sessionUri?: string): Promise { const options: WebTransportOptions = {} const fingerprint = await this.#fingerprint if (fingerprint) options.serverCertificateHashes = [fingerprint] - const quic = new WebTransport(this.config.url, options) + const uri = sessionUri ?? this.config.url + const quic = new WebTransport(uri, options) await quic.ready + return quic + } - const stream = await quic.createBidirectionalStream() - - const writer = new Stream.Writer(stream.writable) - const reader = new Stream.Reader(new Uint8Array(), stream.readable) - - const setup = new Setup.Stream(reader, writer) + async prepareConnection(quic: WebTransport): Promise<{ control: Stream.ControlStream, objects: Objects }> { + const stream = await quic.createBidirectionalStream({ sendOrder: Number.MAX_SAFE_INTEGER }) + const buffer = new ReadableWritableStreamBuffer(stream.readable, stream.writable) - // Send the setup message. - await setup.send.client({ - versions: [Setup.Version.DRAFT_07], - role: this.config.role, - }) + const msg: Control.ClientSetup = { + versions: [Control.Version.DRAFT_14], + params: new Map(), + } + const serialized = Control.ClientSetup.serialize(msg) + await buffer.write(serialized) // Receive the setup message. // TODO verify the SETUP response. - const server = await setup.recv.server() + const server = await this.readServerSetup(buffer) - if (server.version != Setup.Version.DRAFT_07) { + if (server.version != Control.Version.DRAFT_14) { throw new Error(`unsupported server version: ${server.version}`) } - const control = new Control.Stream(reader, writer) + const control = new Stream.ControlStream(buffer) const objects = new Objects(quic) - return new Connection(quic, control, objects) + return { control, objects } + } + + async migrateSession(sessionUri?: string): Promise<{ quic: WebTransport, control: Stream.ControlStream, objects: Objects }> { + const quic = await this.createQuic(sessionUri) + const { control, objects } = await this.prepareConnection(quic) + return { quic, control, objects } + } + + async connect(sessionUri?: string): Promise { + const quic = await this.createQuic(sessionUri) + const { control, objects } = await this.prepareConnection(quic) + const conn = new Connection(quic, control, objects) + return conn } async #fetchFingerprint(url?: string): Promise { @@ -83,4 +93,36 @@ export class Client { value: hexBytes, } } + + async readServerSetup(buffer: ReadableWritableStreamBuffer): Promise { + const type: ControlMessageType = await buffer.getNumberVarInt() + if (type !== ControlMessageType.ServerSetup) throw new Error(`server SETUP type must be ${ControlMessageType.ServerSetup}, got ${type}`) + + const advertisedLength = await buffer.getU16() + const bufferLen = buffer.byteLength + if (advertisedLength !== bufferLen) { + throw new Error(`server SETUP message length mismatch: ${advertisedLength} != ${bufferLen}`) + } + + const payload = await buffer.read(advertisedLength) + const bufReader = new ImmutableBytesBuffer(payload) + const msg = ServerSetup.deserialize(bufReader) + + return msg + } + + async readClientSetup(buffer: ReadableWritableStreamBuffer): Promise { + const type: ControlMessageType = await buffer.getNumberVarInt() + if (type !== ControlMessageType.ClientSetup) throw new Error(`client SETUP type must be ${ControlMessageType.ClientSetup}, got ${type}`) + + const advertisedLength = await buffer.getU16() + const bufferLen = buffer.byteLength + if (advertisedLength !== bufferLen) { + throw new Error(`client SETUP message length mismatch: ${advertisedLength} != ${bufferLen}`) + } + + const payload = await buffer.read(advertisedLength) + const bufReader = new ImmutableBytesBuffer(payload) + return ClientSetup.deserialize(bufReader) + } } diff --git a/lib/transport/connection.ts b/lib/transport/connection.ts index 84cd430..f346d9b 100644 --- a/lib/transport/connection.ts +++ b/lib/transport/connection.ts @@ -1,16 +1,21 @@ import * as Control from "./control" import { Objects } from "./objects" import { asError } from "../common/error" +import { ControlStream } from "./stream" import { Publisher } from "./publisher" import { Subscriber } from "./subscriber" +import { sleep } from "./utils" + +export type MigrationState = "none" | "going_away" | "in_progress" | "done" export class Connection { + #migrationState: MigrationState = "none" // The established WebTransport session. #quic: WebTransport // Use to receive/send control messages. - #control: Control.Stream + #controlStream: ControlStream // Use to receive/send objects. #objects: Objects @@ -24,17 +29,26 @@ export class Connection { // Async work running in the background #running: Promise - constructor(quic: WebTransport, control: Control.Stream, objects: Objects) { + constructor(quic: WebTransport, stream: ControlStream, objects: Objects) { this.#quic = quic - this.#control = control + this.#controlStream = stream this.#objects = objects - this.#publisher = new Publisher(this.#control, this.#objects) - this.#subscriber = new Subscriber(this.#control, this.#objects) + this.#publisher = new Publisher(this.#controlStream, this.#objects) + this.#subscriber = new Subscriber(this.#controlStream, this.#objects) this.#running = this.#run() } + // Callback, should be set when creating connection in the client + onMigration: (sessionUri?: string) => Promise = async () => { + throw new Error("not implemented") + } + + get migrationState() { + return this.#migrationState + } + close(code = 0, reason = "") { this.#quic.close({ closeCode: code, reason }) } @@ -43,12 +57,32 @@ export class Connection { await Promise.all([this.#runControl(), this.#runObjects()]) } - announce(namespace: string[]) { - return this.#publisher.announce(namespace) + async closePublisher(sendGoAway: boolean = true) { + if (sendGoAway) { + await this.#controlStream.send({ + type: Control.ControlMessageType.GoAway, + message: { + session_uri: "", + }, + }) + } + this.#migrationState = "going_away" + this.#subscriber.migrationState = "going_away" + this.#publisher.migrationState = "going_away" + while (this.#publisher.activeSubscribersCount > 0) { + // Wait for all subscribers to close + await sleep(100) + } + console.log("no more active publisher", this.#publisher); + return this.#publisher.close() + } + + publish_namespace(namespace: string[]) { + return this.#publisher.publish_namespace(namespace) } - announced() { - return this.#subscriber.announced() + publishedNamespaces() { + return this.#subscriber.publishedNamespaces() } subscribe(namespace: string[], track: string) { @@ -65,29 +99,89 @@ export class Connection { async #runControl() { // Receive messages until the connection is closed. - for (;;) { - const msg = await this.#control.recv() - await this.#recv(msg) + try { + console.log("starting control loop") + for (; ;) { + const msg = await this.#controlStream.recv() + console.log("control loop got msg", msg) + await this.#recv(msg) + } + } catch (e: any) { + if (e.message === "close()") { + console.warn("closing the connection: ", e) + return + } + console.error("Error in control stream:", e) + throw e } } async #runObjects() { - for (;;) { - const obj = await this.#objects.recv() - if (!obj) break - - await this.#subscriber.recvObject(obj) + try { + console.log("starting object loop") + for (; ;) { + const obj = await this.#objects.recv() + console.log("object loop got obj", obj) + if (!obj) break + + await this.#subscriber.recvObject(obj) + } + } catch (e: any) { + if (e.message === "close()") { + console.warn("closing the connection: ", e) + return + } + console.error("Error in object stream:", e) + throw e } } - async #recv(msg: Control.Message) { - if (Control.isPublisher(msg)) { + async #recv(msg: Control.MessageWithType) { + if (msg.type === Control.ControlMessageType.GoAway) { + this.#handleGoAway(msg.message) + } else if (msg.type === Control.ControlMessageType.MaxRequestId) { + await this.#handleMaxRequestId(msg.message) + } else if (Control.isPublisher(msg.type)) { await this.#subscriber.recv(msg) } else { await this.#publisher.recv(msg) } } + async #handleMaxRequestId(msg: Control.MaxRequestId) { + this.#controlStream.setRemoteMaxRequestId(msg.id) + } + + async #handleGoAway(msg: Control.GoAway) { + console.log("preparing for migration, got go_away message:", msg) + if (this.#migrationState === "in_progress") { + throw new Error("go away received twice") + } + this.#migrationState = "in_progress" + await this.#subscriber.startMigration() + await this.#publisher.startMigration() + + while (this.#subscriber.activeSubscribersCount > 0) { + await sleep(100) + } + console.log("active subscribers count", this.#publisher.activeSubscribersCount, this.#subscriber.activeSubscribersCount) + + this.#migrationState = "done" + this.onMigration(msg.session_uri) + console.log("should close the quic session now ") + } + + async migrateSession(quic: WebTransport, control: ControlStream, objects: Objects) { + this.#quic = quic + this.#controlStream = control + this.#objects = objects + + await this.#publisher.migrationDone(control, objects) + await this.#subscriber.migrationDone(control, objects) + + this.#running = this.#run() + } + async closed(): Promise { try { await this.#running diff --git a/lib/transport/control.ts b/lib/transport/control.ts deleted file mode 100644 index ae5dd2c..0000000 --- a/lib/transport/control.ts +++ /dev/null @@ -1,856 +0,0 @@ -import { Reader, Writer } from "./stream" - -export type Message = Subscriber | Publisher - -// Sent by subscriber -export type Subscriber = Subscribe | Unsubscribe | AnnounceOk | AnnounceError | Fetch | FetchCancel - -export function isSubscriber(m: Message): m is Subscriber { - return ( - m.kind == Msg.Subscribe || m.kind == Msg.Unsubscribe || m.kind == Msg.AnnounceOk || m.kind == Msg.AnnounceError - ) -} - -// Sent by publisher -export type Publisher = SubscribeOk | SubscribeError | SubscribeDone | Announce | Unannounce | FetchOk | FetchError - -export function isPublisher(m: Message): m is Publisher { - return ( - m.kind == Msg.SubscribeOk || - m.kind == Msg.SubscribeError || - m.kind == Msg.SubscribeDone || - m.kind == Msg.Announce || - m.kind == Msg.Unannounce - ) -} - -// I wish we didn't have to split Msg and Id into separate enums. -// However using the string in the message makes it easier to debug. -// We'll take the tiny performance hit until I'm better at Typescript. -export enum Msg { - // NOTE: object and setup are in other modules - Subscribe = "subscribe", - SubscribeOk = "subscribe_ok", - SubscribeError = "subscribe_error", - SubscribeDone = "subscribe_done", - Unsubscribe = "unsubscribe", - Announce = "announce", - AnnounceOk = "announce_ok", - AnnounceError = "announce_error", - Unannounce = "unannounce", - GoAway = "go_away", - Fetch = "fetch", - FetchCancel = "fetch_cancel", - FetchOk = "fetch_ok", - FetchError = "fetch_error", -} - -enum Id { - // NOTE: object and setup are in other modules - // Object = 0, - // Setup = 1, - - Subscribe = 0x3, - SubscribeOk = 0x4, - SubscribeError = 0x5, - SubscribeDone = 0xb, - Unsubscribe = 0xa, - Announce = 0x6, - AnnounceOk = 0x7, - AnnounceError = 0x8, - Unannounce = 0x9, - GoAway = 0x10, - Fetch = 0x16, - FetchCancel = 0x17, - FetchOk = 0x18, - FetchError = 0x19, -} - -export interface Subscribe { - kind: Msg.Subscribe - - id: bigint - trackId: bigint - namespace: string[] - name: string - subscriber_priority: number - group_order: GroupOrder - - location: Location - - params?: Parameters -} - -export enum GroupOrder { - Publisher = 0x0, - Ascending = 0x1, - Descending = 0x2, -} - -export type Location = LatestGroup | LatestObject | AbsoluteStart | AbsoluteRange - -export interface LatestGroup { - mode: "latest_group" -} - -export interface LatestObject { - mode: "latest_object" -} - -export interface AbsoluteStart { - mode: "absolute_start" - start_group: number - start_object: number -} - -export interface AbsoluteRange { - mode: "absolute_range" - start_group: number - start_object: number - end_group: number - end_object: number -} - -export type Parameters = Map - -export interface SubscribeOk { - kind: Msg.SubscribeOk - id: bigint - expires: bigint - group_order: GroupOrder - latest?: [number, number] - params?: Parameters -} - -export interface SubscribeDone { - kind: Msg.SubscribeDone - id: bigint - code: bigint - reason: string - final?: [number, number] -} - -export interface SubscribeError { - kind: Msg.SubscribeError - id: bigint - code: bigint - reason: string - //trackAlias?: bigint -} - -export interface Unsubscribe { - kind: Msg.Unsubscribe - id: bigint -} - -export interface Announce { - kind: Msg.Announce - namespace: string[] - params?: Parameters -} - -export interface AnnounceOk { - kind: Msg.AnnounceOk - namespace: string[] -} - -export interface AnnounceError { - kind: Msg.AnnounceError - namespace: string[] - code: bigint - reason: string -} - -export interface Unannounce { - kind: Msg.Unannounce - namespace: string[] -} - -export interface Fetch { - kind: Msg.Fetch - id: bigint - namespace: string[] - name: string - subscriber_priority: number - group_order: GroupOrder - start_group: number - start_object: number - end_group: number - end_object: number - params?: Parameters -} - -export interface FetchOk { - kind: Msg.FetchOk - id: bigint - group_order: number - end_of_track: number - largest_group_id: bigint - largest_object_id: bigint - params?: Parameters -} - -export interface FetchError { - kind: Msg.FetchError - id: bigint - code: bigint - reason: string -} - -export interface FetchCancel { - kind: Msg.FetchCancel - id: bigint -} - -export class Stream { - private decoder: Decoder - private encoder: Encoder - - #mutex = Promise.resolve() - - constructor(r: Reader, w: Writer) { - this.decoder = new Decoder(r) - this.encoder = new Encoder(w) - } - - // Will error if two messages are read at once. - async recv(): Promise { - const msg = await this.decoder.message() - console.log("received message", msg) - return msg - } - - async send(msg: Message) { - const unlock = await this.#lock() - try { - console.log("sending message", msg) - await this.encoder.message(msg) - } finally { - unlock() - } - } - - async #lock() { - // Make a new promise that we can resolve later. - let done: () => void - const p = new Promise((resolve) => { - done = () => resolve() - }) - - // Wait until the previous lock is done, then resolve our our lock. - const lock = this.#mutex.then(() => done) - - // Save our lock as the next lock. - this.#mutex = p - - // Return the lock. - return lock - } -} - -export class Decoder { - r: Reader - - constructor(r: Reader) { - this.r = r - } - - private async msg(): Promise { - const t = await this.r.u53() - - const advertisedLength = await this.r.u53() - if (advertisedLength !== this.r.getByteLength()) { - // @todo: throw this error and close the session - // "If the length does not match the length of the message content, the receiver MUST close the session." - console.error( - `message length mismatch: advertised ${advertisedLength} != ${this.r.getByteLength()} received`, - ) - } - - switch (t as Id) { - case Id.Subscribe: - return Msg.Subscribe - case Id.SubscribeOk: - return Msg.SubscribeOk - case Id.SubscribeDone: - return Msg.SubscribeDone - case Id.SubscribeError: - return Msg.SubscribeError - case Id.Unsubscribe: - return Msg.Unsubscribe - case Id.Announce: - return Msg.Announce - case Id.AnnounceOk: - return Msg.AnnounceOk - case Id.AnnounceError: - return Msg.AnnounceError - case Id.Unannounce: - return Msg.Unannounce - case Id.GoAway: - return Msg.GoAway - case Id.Fetch: - return Msg.Fetch - case Id.FetchCancel: - return Msg.FetchCancel - case Id.FetchOk: - return Msg.FetchOk - case Id.FetchError: - return Msg.FetchError - } - } - - async message(): Promise { - const t = await this.msg() - switch (t) { - case Msg.Subscribe: - return this.subscribe() - case Msg.SubscribeOk: - return this.subscribe_ok() - case Msg.SubscribeError: - return this.subscribe_error() - case Msg.SubscribeDone: - return this.subscribe_done() - case Msg.Unsubscribe: - return this.unsubscribe() - case Msg.Announce: - return this.announce() - case Msg.AnnounceOk: - return this.announce_ok() - case Msg.Unannounce: - return this.unannounce() - case Msg.AnnounceError: - return this.announce_error() - case Msg.GoAway: - throw new Error("TODO: implement go away") - case Msg.Fetch: - return this.fetch() - case Msg.FetchCancel: - return this.fetchCancel() - case Msg.FetchOk: - return this.fetchOk() - case Msg.FetchError: - return this.fetchError() - } - } - - private async subscribe(): Promise { - return { - kind: Msg.Subscribe, - id: await this.r.u62(), - trackId: await this.r.u62(), - namespace: await this.r.tuple(), - name: await this.r.string(), - subscriber_priority: await this.r.u8(), - group_order: await this.decodeGroupOrder(), - location: await this.location(), - params: await this.parameters(), - } - } - - private async decodeGroupOrder(): Promise { - const orderCode = await this.r.u8() - switch (orderCode) { - case 0: - return GroupOrder.Publisher - case 1: - return GroupOrder.Ascending - case 2: - return GroupOrder.Descending - default: - throw new Error(`Invalid GroupOrder value: ${orderCode}`) - } - } - - private async location(): Promise { - const mode = await this.r.u62() - if (mode == 1n) { - return { - mode: "latest_group", - } - } else if (mode == 2n) { - return { - mode: "latest_object", - } - } else if (mode == 3n) { - return { - mode: "absolute_start", - start_group: await this.r.u53(), - start_object: await this.r.u53(), - } - } else if (mode == 4n) { - return { - mode: "absolute_range", - start_group: await this.r.u53(), - start_object: await this.r.u53(), - end_group: await this.r.u53(), - end_object: await this.r.u53(), - } - } else { - throw new Error(`invalid filter type: ${mode}`) - } - } - - private async parameters(): Promise { - const count = await this.r.u53() - if (count == 0) return undefined - - const params = new Map() - - for (let i = 0; i < count; i++) { - const id = await this.r.u62() - const size = await this.r.u53() - const value = await this.r.read(size) - - if (params.has(id)) { - throw new Error(`duplicate parameter id: ${id}`) - } - - params.set(id, value) - } - - return params - } - - private async subscribe_ok(): Promise { - const id = await this.r.u62() - const expires = await this.r.u62() - - const group_order = await this.decodeGroupOrder() - let latest: [number, number] | undefined - - const flag = await this.r.u8() - if (flag === 1) { - // [largest group id, largest object id] - latest = [await this.r.u53(), await this.r.u53()] - } else if (flag !== 0) { - throw new Error(`invalid final flag: ${flag}`) - } - // @todo: actually consume params once we implement them in moq-rs - const params = await this.parameters() - return { - kind: Msg.SubscribeOk, - id, - expires, - group_order, - latest, - params, - } - } - - private async subscribe_done(): Promise { - const id = await this.r.u62() - const code = await this.r.u62() - const reason = await this.r.string() - - let final: [number, number] | undefined - - const flag = await this.r.u8() - if (flag === 1) { - final = [await this.r.u53(), await this.r.u53()] - } else if (flag !== 0) { - throw new Error(`invalid final flag: ${flag}`) - } - - return { - kind: Msg.SubscribeDone, - id, - code, - reason, - final, - } - } - - private async subscribe_error(): Promise { - return { - kind: Msg.SubscribeError, - id: await this.r.u62(), - code: await this.r.u62(), - reason: await this.r.string(), - } - } - - private async unsubscribe(): Promise { - return { - kind: Msg.Unsubscribe, - id: await this.r.u62(), - } - } - - private async announce(): Promise { - const namespace = await this.r.tuple() - - return { - kind: Msg.Announce, - namespace, - params: await this.parameters(), - } - } - - private async announce_ok(): Promise { - return { - kind: Msg.AnnounceOk, - namespace: await this.r.tuple(), - } - } - - private async announce_error(): Promise { - return { - kind: Msg.AnnounceError, - namespace: await this.r.tuple(), - code: await this.r.u62(), - reason: await this.r.string(), - } - } - - private async unannounce(): Promise { - return { - kind: Msg.Unannounce, - namespace: await this.r.tuple(), - } - } - - private async fetch(): Promise { - return { - kind: Msg.Fetch, - id: await this.r.u62(), - namespace: await this.r.tuple(), - name: await this.r.string(), - subscriber_priority: await this.r.u8(), - group_order: await this.decodeGroupOrder(), - start_group: await this.r.u53(), - start_object: await this.r.u53(), - end_group: await this.r.u53(), - end_object: await this.r.u53(), - params: await this.parameters(), - } - } - - private async fetchCancel(): Promise { - return { - kind: Msg.FetchCancel, - id: await this.r.u62(), - } - } - - private async fetchOk(): Promise { - return { - kind: Msg.FetchOk, - id: await this.r.u62(), - group_order: await this.r.u8(), - end_of_track: await this.r.u8(), - largest_group_id: await this.r.u62(), - largest_object_id: await this.r.u62(), - params: await this.parameters(), - } - } - - private async fetchError(): Promise { - return { - kind: Msg.FetchError, - id: await this.r.u62(), - code: await this.r.u62(), - reason: await this.r.string(), - } - } -} - -export class Encoder { - w: Writer - - constructor(w: Writer) { - this.w = w - } - - async message(m: Message) { - switch (m.kind) { - case Msg.Subscribe: - return this.subscribe(m) - case Msg.SubscribeOk: - return this.subscribe_ok(m) - case Msg.SubscribeError: - return this.subscribe_error(m) - case Msg.SubscribeDone: - return this.subscribe_done(m) - case Msg.Unsubscribe: - return this.unsubscribe(m) - case Msg.Announce: - return this.announce(m) - case Msg.AnnounceOk: - return this.announce_ok(m) - case Msg.AnnounceError: - return this.announce_error(m) - case Msg.Unannounce: - return this.unannounce(m) - case Msg.Fetch: - return this.fetch(m) - case Msg.FetchCancel: - return this.fetchCancel(m) - case Msg.FetchOk: - return this.fetchOk(m) - case Msg.FetchError: - return this.fetchError(m) - } - } - - async subscribe(s: Subscribe) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.trackId), - this.w.encodeTuple(buffer, s.namespace), - this.w.encodeString(buffer, s.name), - this.w.setUint8(buffer, s.subscriber_priority ?? 127), - this.w.setUint8(buffer, s.group_order ?? GroupOrder.Publisher), - this.encodeLocation(buffer, s.location), - this.encodeParameters(buffer, s.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.Subscribe) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async subscribe_ok(s: SubscribeOk) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.expires), - this.w.setUint8(buffer, s.group_order), - this.w.setUint8(buffer, s.latest !== undefined ? 1 : 0), - s.latest && this.w.setVint53(buffer, s.latest[0]), - s.latest && this.w.setVint53(buffer, s.latest[1]), - this.encodeParameters(buffer, s.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.SubscribeOk) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async subscribe_done(s: SubscribeDone) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.code), - this.w.encodeString(buffer, s.reason), - this.w.setUint8(buffer, s.final !== undefined ? 1 : 0), - s.final && this.w.setVint53(buffer, s.final[0]), - s.final && this.w.setVint53(buffer, s.final[1]), - ]) - - const messageType = this.w.setVint53(buffer, Id.SubscribeDone) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async subscribe_error(s: SubscribeError) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, s.id), - this.w.setVint62(buffer, s.code), - this.w.encodeString(buffer, s.reason), - //@todo: add trackAlias if error code is 'Retry Track Alias' - ]) - - const messageType = this.w.setVint53(buffer, Id.SubscribeError) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async unsubscribe(s: Unsubscribe) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.setVint62(buffer, s.id)]) - - const messageType = this.w.setVint53(buffer, Id.Unsubscribe) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async announce(a: Announce) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.encodeTuple(buffer, a.namespace), - this.encodeParameters(buffer, a.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.Announce) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async announce_ok(a: AnnounceOk) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.encodeTuple(buffer, a.namespace)]) - - const messageType = this.w.setVint53(buffer, Id.AnnounceOk) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async announce_error(a: AnnounceError) { - const buffer = new Uint8Array(8) - const msgData = this.w.concatBuffer([ - this.w.encodeTuple(buffer, a.namespace), - this.w.setVint62(buffer, a.code), - this.w.encodeString(buffer, a.reason), - ]) - - const messageType = this.w.setVint53(buffer, Id.AnnounceError) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async unannounce(a: Unannounce) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.encodeTuple(buffer, a.namespace)]) - - const messageType = this.w.setVint53(buffer, Id.Unannounce) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - private encodeLocation(buffer: Uint8Array, l: Location): Uint8Array { - switch (l.mode) { - case "latest_group": - return this.w.setVint62(buffer, 1n) - case "latest_object": - return this.w.setVint62(buffer, 2n) - case "absolute_start": - return this.w.concatBuffer([ - this.w.setVint62(buffer, 3n), - this.w.setVint53(buffer, l.start_group), - this.w.setVint53(buffer, l.start_object), - ]) - case "absolute_range": - return this.w.concatBuffer([ - this.w.setVint62(buffer, 3n), - this.w.setVint53(buffer, l.start_group), - this.w.setVint53(buffer, l.start_object), - this.w.setVint53(buffer, l.end_group), - this.w.setVint53(buffer, l.end_object), - ]) - } - } - - private encodeParameters(buffer: Uint8Array, p: Parameters | undefined): Uint8Array { - if (!p) return this.w.setUint8(buffer, 0) - - const paramFields = [this.w.setVint53(buffer, p.size)] - for (const [id, value] of p) { - const idBytes = this.w.setVint62(buffer, id) - const sizeBytes = this.w.setVint53(buffer, value.length) - paramFields.push(idBytes, sizeBytes, value) - } - - return this.w.concatBuffer(paramFields) - } - - async fetch(f: Fetch) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, f.id), - this.w.encodeTuple(buffer, f.namespace), - this.w.encodeString(buffer, f.name), - this.w.setUint8(buffer, f.subscriber_priority), - this.w.setUint8(buffer, f.group_order), - this.w.setVint53(buffer, f.start_group), - this.w.setVint53(buffer, f.start_object), - this.w.setVint53(buffer, f.end_group), - this.w.setVint53(buffer, f.end_object), - this.encodeParameters(buffer, f.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.Fetch) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async fetchCancel(fc: FetchCancel) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([this.w.setVint62(buffer, fc.id)]) - - const messageType = this.w.setVint53(buffer, Id.FetchCancel) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async fetchOk(fo: FetchOk) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, fo.id), - this.w.setUint8(buffer, fo.group_order), - this.w.setUint8(buffer, fo.end_of_track), - this.w.setVint62(buffer, fo.largest_group_id), - this.w.setVint62(buffer, fo.largest_object_id), - this.encodeParameters(buffer, fo.params), - ]) - - const messageType = this.w.setVint53(buffer, Id.FetchOk) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } - - async fetchError(fe: FetchError) { - const buffer = new Uint8Array(8) - - const msgData = this.w.concatBuffer([ - this.w.setVint62(buffer, fe.id), - this.w.setVint62(buffer, fe.code), - this.w.encodeString(buffer, fe.reason), - ]) - - const messageType = this.w.setVint53(buffer, Id.FetchError) - const messageLength = this.w.setVint53(buffer, msgData.length) - - for (const elem of [messageType, messageLength, msgData]) { - await this.w.write(elem) - } - } -} diff --git a/lib/transport/control/client_setup.ts b/lib/transport/control/client_setup.ts new file mode 100644 index 0000000..24c190c --- /dev/null +++ b/lib/transport/control/client_setup.ts @@ -0,0 +1,38 @@ +import { ControlMessageType, Version } from "." +import { KeyValuePairs, Parameters } from "../base_data" +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + +export interface ClientSetup { + versions: Version[] + params: Parameters +} + +export namespace ClientSetup { + export function serialize(v: ClientSetup): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.ClientSetup) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.versions.length) + v.versions.forEach((version) => { + payloadBuf.putVarInt(version) + }) + payloadBuf.putBytes(Parameters.serialize(v.params)) + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + console.log("client setup: payload len:", payloadBuf.length, "msg len:", mainBuf.length) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): ClientSetup { + const supportedVersionLen = reader.getNumberVarInt() + const versions: Version[] = [] + for (let i = 0; i < supportedVersionLen; i++) { + versions.push(reader.getNumberVarInt() as Version) + } + const params = Parameters.deserialize(reader) + return { + versions, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/fetch.ts b/lib/transport/control/fetch.ts new file mode 100644 index 0000000..2d0e466 --- /dev/null +++ b/lib/transport/control/fetch.ts @@ -0,0 +1,158 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Location, Tuple, Parameters } from "../base_data" + +export enum FetchType { + Standalone = 0x1, + Relative = 0x2, + Absolute = 0x3, +} + +export namespace FetchType { + export function serialize(v: FetchType): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(v) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): FetchType { + const order = buffer.getVarInt() + switch (order) { + case 1n: + return FetchType.Standalone + case 2n: + return FetchType.Relative + case 3n: + return FetchType.Absolute + default: + throw new Error(`Invalid FetchType value: ${order}`) + } + } +} + +export interface StandaloneFetch { + namespace: Tuple + name: string + start_location: Location + end_location: Location +} + + +export namespace StandaloneFetch { + export function serialize(v: StandaloneFetch): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Fetch) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putUtf8String(v.name) + payloadBuf.putBytes(Location.serialize(v.start_location)) + payloadBuf.putBytes(Location.serialize(v.end_location)) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(r: ImmutableBytesBuffer): StandaloneFetch { + const namespace = Tuple.deserialize(r) + const name = r.getUtf8String() + const start_location = Location.deserialize(r) + const end_location = Location.deserialize(r) + return { + namespace, + name, + start_location, + end_location + } + } +} + + +export interface JoiningFetch { + id: bigint + start: bigint +} + +export namespace JoiningFetch { + export function serialize(v: JoiningFetch): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Fetch) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.start) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(r: ImmutableBytesBuffer): JoiningFetch { + const id = r.getVarInt() + const start = r.getVarInt() + return { + id, + start + } + } +} + + +export interface Fetch { + id: bigint + subscriber_priority: number + group_order: GroupOrder + fetch_type: FetchType + standalone?: StandaloneFetch + joining?: JoiningFetch + params?: Parameters +} + +export namespace Fetch { + export function serialize(v: Fetch): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Fetch) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putU8(v.subscriber_priority) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putBytes(FetchType.serialize(v.fetch_type)) + if (v.standalone) { + payloadBuf.putBytes(StandaloneFetch.serialize(v.standalone)) + } + if (v.joining) { + payloadBuf.putBytes(JoiningFetch.serialize(v.joining)) + } + payloadBuf.putBytes(Parameters.serialize(v.params ?? new Map())) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Fetch { + const id = reader.getVarInt() + const subscriber_priority = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const fetch_type = FetchType.deserialize(reader) + let standalone: StandaloneFetch | undefined + let joining: JoiningFetch | undefined + let params: Parameters | undefined + if (fetch_type == FetchType.Standalone) { + standalone = StandaloneFetch.deserialize(reader) + } else if (fetch_type == FetchType.Relative || fetch_type == FetchType.Absolute) { + joining = JoiningFetch.deserialize(reader) + } + if (reader.remaining > 0) { + params = Parameters.deserialize(reader) + } + return { + id, + subscriber_priority, + group_order, + fetch_type, + standalone, + joining, + params + } + } +} diff --git a/lib/transport/control/fetch_cancel.ts b/lib/transport/control/fetch_cancel.ts new file mode 100644 index 0000000..a6f4073 --- /dev/null +++ b/lib/transport/control/fetch_cancel.ts @@ -0,0 +1,29 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface FetchCancel { + id: bigint +} + + +export namespace FetchCancel { + export function serialize(v: FetchCancel): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.FetchCancel) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): FetchCancel { + const id = reader.getVarInt() + return { + id + } + } +} \ No newline at end of file diff --git a/lib/transport/control/fetch_error.ts b/lib/transport/control/fetch_error.ts new file mode 100644 index 0000000..c061514 --- /dev/null +++ b/lib/transport/control/fetch_error.ts @@ -0,0 +1,36 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface FetchError { + id: bigint + code: bigint + reason: string +} + + +export namespace FetchError { + export function serialize(v: FetchError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.FetchError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): FetchError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/fetch_ok.ts b/lib/transport/control/fetch_ok.ts new file mode 100644 index 0000000..be2fa31 --- /dev/null +++ b/lib/transport/control/fetch_ok.ts @@ -0,0 +1,47 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Location } from "../base_data" + +export interface FetchOk { + id: bigint + group_order: GroupOrder + end_of_track: number // u8 + end_location: Location + params?: Parameters +} + + +export namespace FetchOk { + export function serialize(v: FetchOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.FetchOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putU8(v.end_of_track) + payloadBuf.putBytes(Location.serialize(v.end_location)) + payloadBuf.putBytes(Parameters.serialize(v.params ?? new Map())) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): FetchOk { + const id = reader.getVarInt() + const group_order = GroupOrder.deserialize(reader) + const end_of_track = reader.getU8() + const end_location = Location.deserialize(reader) + let params: Parameters | undefined + if (reader.remaining > 0) { + params = Parameters.deserialize(reader) + } + return { + id, + group_order, + end_of_track, + end_location, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/go_away.ts b/lib/transport/control/go_away.ts new file mode 100644 index 0000000..25b3a85 --- /dev/null +++ b/lib/transport/control/go_away.ts @@ -0,0 +1,32 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface GoAway { + session_uri: string +} + + +export namespace GoAway { + export function serialize(v: GoAway): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.GoAway) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putUtf8String(v.session_uri) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): GoAway { + const session_uri = reader.getUtf8String() + if (session_uri.length > 8192) { + // TODO(itzmanish): should be PROTOCOL_ERROR + throw new Error("session_uri too long") + } + return { + session_uri + } + } +} \ No newline at end of file diff --git a/lib/transport/control/index.ts b/lib/transport/control/index.ts new file mode 100644 index 0000000..42200d6 --- /dev/null +++ b/lib/transport/control/index.ts @@ -0,0 +1,203 @@ +import { Subscribe, GroupOrder, FilterType } from "./subscribe" +import { SubscribeOk } from "./subscribe_ok" +import { SubscribeError } from "./subscribe_error" +import { SubscribeUpdate } from "./subscribe_update" +import { SubscribeNamespace } from "./subscribe_namespace" +import { SubscribeNamespaceOk } from "./subscribe_namespace_ok" +import { SubscribeNamespaceError } from "./subscribe_namespace_error" +import { Unsubscribe } from "./unsubscribe" +import { Publish } from "./publish" +import { PublishOk } from "./publish_ok" +import { PublishError } from "./publish_error" +import { PublishDone } from "./publish_done" +import { PublishNamespace } from "./publish_namespace" +import { PublishNamespaceOk } from "./publish_namespace_ok" +import { PublishNamespaceError } from "./publish_namespace_error" +import { PublishNamespaceDone } from "./publish_namespace_done" +import { Fetch } from "./fetch" +import { FetchOk } from "./fetch_ok" +import { FetchError } from "./fetch_error" +import { FetchCancel } from "./fetch_cancel" +import { GoAway } from "./go_away" +import { ClientSetup } from "./client_setup" +import { ServerSetup } from "./server_setup" +import { MaxRequestId } from "./max_request_id" +import { RequestsBlocked } from "./requests_block" + + +enum Version { + DRAFT_00 = 0xff000000, + DRAFT_01 = 0xff000001, + DRAFT_02 = 0xff000002, + DRAFT_03 = 0xff000003, + DRAFT_04 = 0xff000004, + DRAFT_05 = 0xff000005, + DRAFT_06 = 0xff000006, + DRAFT_07 = 0xff000007, + DRAFT_14 = 0xff00000e, + KIXEL_00 = 0xbad00, + KIXEL_01 = 0xbad01, +} + +// Discriminated union where data type matches the control message type +type MessageWithType = + | { type: ControlMessageType.Publish; message: Publish } + | { type: ControlMessageType.PublishOk; message: PublishOk } + | { type: ControlMessageType.PublishError; message: PublishError } + | { type: ControlMessageType.PublishDone; message: PublishDone } + | { type: ControlMessageType.PublishNamespace; message: PublishNamespace } + | { type: ControlMessageType.PublishNamespaceOk; message: PublishNamespaceOk } + | { type: ControlMessageType.PublishNamespaceError; message: PublishNamespaceError } + | { type: ControlMessageType.PublishNamespaceDone; message: PublishNamespaceDone } + | { type: ControlMessageType.Fetch; message: Fetch } + | { type: ControlMessageType.FetchOk; message: FetchOk } + | { type: ControlMessageType.FetchError; message: FetchError } + | { type: ControlMessageType.FetchCancel; message: FetchCancel } + | { type: ControlMessageType.Subscribe; message: Subscribe } + | { type: ControlMessageType.SubscribeOk; message: SubscribeOk } + | { type: ControlMessageType.SubscribeError; message: SubscribeError } + | { type: ControlMessageType.SubscribeUpdate; message: SubscribeUpdate } + | { type: ControlMessageType.SubscribeNamespace; message: SubscribeNamespace } + | { type: ControlMessageType.SubscribeNamespaceOk; message: SubscribeNamespaceOk } + | { type: ControlMessageType.SubscribeNamespaceError; message: SubscribeNamespaceError } + | { type: ControlMessageType.Unsubscribe; message: Unsubscribe } + | { type: ControlMessageType.GoAway; message: GoAway } + | { type: ControlMessageType.MaxRequestId; message: MaxRequestId } + | { type: ControlMessageType.RequestsBlocked; message: RequestsBlocked } + +type Message = Subscriber | Publisher + +// Sent by subscriber +type Subscriber = Subscribe | SubscribeUpdate | SubscribeNamespace | + Unsubscribe | PublishOk | PublishError | + PublishNamespaceOk | PublishNamespaceError | Fetch | FetchCancel + +// Sent by publisher +type Publisher = SubscribeOk | SubscribeError + | SubscribeNamespaceOk | SubscribeNamespaceError | + PublishDone | Publish | PublishNamespace | PublishNamespaceDone + | FetchOk | FetchError + +function isSubscriber(m: ControlMessageType): boolean { + return ( + m == ControlMessageType.Subscribe || + m == ControlMessageType.SubscribeUpdate || + m == ControlMessageType.Unsubscribe || + m == ControlMessageType.PublishOk || + m == ControlMessageType.PublishError || + m == ControlMessageType.PublishNamespaceOk || + m == ControlMessageType.PublishNamespaceError + ) +} + +function isPublisher(m: ControlMessageType): boolean { + return ( + m == ControlMessageType.SubscribeOk || + m == ControlMessageType.SubscribeError || + m == ControlMessageType.PublishDone || + m == ControlMessageType.Publish || + m == ControlMessageType.PublishNamespace || + m == ControlMessageType.PublishNamespaceDone + ) +} + +export enum ControlMessageType { + ReservedSetupV00 = 0x1, + GoAway = 0x10, + MaxRequestId = 0x15, + RequestsBlocked = 0x1a, + + SubscribeUpdate = 0x2, + Subscribe = 0x3, + SubscribeOk = 0x4, + SubscribeError = 0x5, + Unsubscribe = 0xa, + PublishDone = 0xb, + + Publish = 0x1d, + PublishOk = 0x1e, + PublishError = 0x1f, + PublishNamespace = 0x6, + PublishNamespaceOk = 0x7, + PublishNamespaceError = 0x8, + PublishNamespaceDone = 0x9, + SubscribeNamespace = 0x11, + SubscribeNamespaceOk = 0x12, + SubscribeNamespaceError = 0x13, + Fetch = 0x16, + FetchCancel = 0x17, + FetchOk = 0x18, + FetchError = 0x19, + + ClientSetup = 0x20, + ServerSetup = 0x21, +} + +export namespace ControlMessageType { + export function toString(t: ControlMessageType): string { + switch (t) { + case ControlMessageType.ReservedSetupV00: return "ReservedSetupV00" + case ControlMessageType.GoAway: return "GoAway" + case ControlMessageType.MaxRequestId: return "MaxRequestId" + case ControlMessageType.RequestsBlocked: return "RequestsBlocked" + case ControlMessageType.SubscribeUpdate: return "SubscribeUpdate" + case ControlMessageType.Subscribe: return "Subscribe" + case ControlMessageType.SubscribeOk: return "SubscribeOk" + case ControlMessageType.SubscribeError: return "SubscribeError" + case ControlMessageType.Unsubscribe: return "Unsubscribe" + case ControlMessageType.PublishDone: return "PublishDone" + case ControlMessageType.Publish: return "Publish" + case ControlMessageType.PublishOk: return "PublishOk" + case ControlMessageType.PublishError: return "PublishError" + case ControlMessageType.PublishNamespace: return "PublishNamespace" + case ControlMessageType.PublishNamespaceOk: return "PublishNamespaceOk" + case ControlMessageType.PublishNamespaceError: return "PublishNamespaceError" + case ControlMessageType.PublishNamespaceDone: return "PublishNamespaceDone" + case ControlMessageType.SubscribeNamespace: return "SubscribeNamespace" + case ControlMessageType.SubscribeNamespaceOk: return "SubscribeNamespaceOk" + case ControlMessageType.SubscribeNamespaceError: return "SubscribeNamespaceError" + case ControlMessageType.Fetch: return "Fetch" + case ControlMessageType.FetchCancel: return "FetchCancel" + case ControlMessageType.FetchOk: return "FetchOk" + case ControlMessageType.FetchError: return "FetchError" + case ControlMessageType.ClientSetup: return "ClientSetup" + case ControlMessageType.ServerSetup: return "ServerSetup" + } + } +} + + +export { + Subscribe, + SubscribeOk, + SubscribeError, + SubscribeUpdate, + SubscribeNamespace, + SubscribeNamespaceOk, + SubscribeNamespaceError, + Unsubscribe, + Publish, + PublishOk, + PublishError, + PublishDone, + PublishNamespace, + PublishNamespaceOk, + PublishNamespaceError, + PublishNamespaceDone, + Fetch, + FetchOk, + FetchError, + FetchCancel, + GoAway, + MaxRequestId, + ClientSetup, + ServerSetup, + + Version, + isSubscriber, + isPublisher, + MessageWithType, + Message, + GroupOrder, + FilterType, +} \ No newline at end of file diff --git a/lib/transport/control/max_request_id.ts b/lib/transport/control/max_request_id.ts new file mode 100644 index 0000000..5311b75 --- /dev/null +++ b/lib/transport/control/max_request_id.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface MaxRequestId { + id: bigint +} + +export namespace MaxRequestId { + export function serialize(v: MaxRequestId): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.MaxRequestId) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): MaxRequestId { + const id = reader.getVarInt() + return { + id, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish.ts b/lib/transport/control/publish.ts new file mode 100644 index 0000000..5acd9d0 --- /dev/null +++ b/lib/transport/control/publish.ts @@ -0,0 +1,61 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Location, Tuple } from "../base_data" + +export interface Publish { + id: bigint + track_alias: bigint // Publisher-specified + namespace: Tuple + name: string + content_exists: number // 0 or 1 + group_order: GroupOrder + largest_location?: Location // largest location of group or object if content_exists == 1 + forward: number // 0 or 1 + params?: Parameters +} + + +export namespace Publish { + export function serialize(v: Publish): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Publish) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.track_alias) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putUtf8String(v.name) + payloadBuf.putU8(v.content_exists) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + if (v.largest_location) { + payloadBuf.putBytes(Location.serialize(v.largest_location)) + } + payloadBuf.putU8(v.forward) + payloadBuf.putBytes(Parameters.serialize(v.params ?? new Map())) + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Publish { + const id = reader.getVarInt() + const track_alias = reader.getVarInt() + const namespace = Tuple.deserialize(reader) + const name = reader.getUtf8String() + const content_exists = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const largest_location = Location.deserialize(reader) + const forward = reader.getU8() + const params = Parameters.deserialize(reader) + return { + id, + track_alias, + namespace, + name, + content_exists, + group_order, + largest_location, + forward, + params + } + } +} diff --git a/lib/transport/control/publish_done.ts b/lib/transport/control/publish_done.ts new file mode 100644 index 0000000..f2927fa --- /dev/null +++ b/lib/transport/control/publish_done.ts @@ -0,0 +1,39 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface PublishDone { + id: bigint + code: bigint + stream_count: bigint + reason: string +} + +export namespace PublishDone { + export function serialize(v: PublishDone): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishDone) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putVarInt(v.stream_count) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishDone { + const id = reader.getVarInt() + const code = reader.getVarInt() + const stream_count = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + stream_count, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_error.ts b/lib/transport/control/publish_error.ts new file mode 100644 index 0000000..ba25253 --- /dev/null +++ b/lib/transport/control/publish_error.ts @@ -0,0 +1,35 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface PublishError { + id: bigint + code: bigint + reason: string +} + +export namespace PublishError { + export function serialize(v: PublishError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace.ts b/lib/transport/control/publish_namespace.ts new file mode 100644 index 0000000..a610322 --- /dev/null +++ b/lib/transport/control/publish_namespace.ts @@ -0,0 +1,37 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Tuple } from "../base_data" + + +export interface PublishNamespace { + id: bigint + namespace: Tuple + params?: Parameters +} + +export namespace PublishNamespace { + export function serialize(v: PublishNamespace): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespace) + + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putBytes(Parameters.serialize(v.params ?? new Map())) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespace { + const id = reader.getVarInt() + const namespace = Tuple.deserialize(reader) + const params = Parameters.deserialize(reader) + return { + id, + namespace, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace_done.ts b/lib/transport/control/publish_namespace_done.ts new file mode 100644 index 0000000..9c5b737 --- /dev/null +++ b/lib/transport/control/publish_namespace_done.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple } from "../base_data" + +export interface PublishNamespaceDone { + namespace: Tuple +} + +export namespace PublishNamespaceDone { + export function serialize(v: PublishNamespaceDone): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespaceDone) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespaceDone { + const namespace = Tuple.deserialize(reader) + return { + namespace, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace_error.ts b/lib/transport/control/publish_namespace_error.ts new file mode 100644 index 0000000..8c388e4 --- /dev/null +++ b/lib/transport/control/publish_namespace_error.ts @@ -0,0 +1,36 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + + +export interface PublishNamespaceError { + id: bigint + code: bigint + reason: string +} + +export namespace PublishNamespaceError { + export function serialize(v: PublishNamespaceError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespaceError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespaceError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_namespace_ok.ts b/lib/transport/control/publish_namespace_ok.ts new file mode 100644 index 0000000..ce831a4 --- /dev/null +++ b/lib/transport/control/publish_namespace_ok.ts @@ -0,0 +1,26 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + +export interface PublishNamespaceOk { + id: bigint +} + +export namespace PublishNamespaceOk { + export function serialize(v: PublishNamespaceOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishNamespaceOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishNamespaceOk { + const id = reader.getVarInt() + return { + id + } + } +} \ No newline at end of file diff --git a/lib/transport/control/publish_ok.ts b/lib/transport/control/publish_ok.ts new file mode 100644 index 0000000..c233c19 --- /dev/null +++ b/lib/transport/control/publish_ok.ts @@ -0,0 +1,70 @@ +import { ControlMessageType, FilterType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Location, Parameters } from "../base_data" + + + +export interface PublishOk { + id: bigint // Request ID + forward: number // 0 or 1 u8 + subscriber_priority: number // u8 + group_order: GroupOrder + filter_type: FilterType + start_location?: Location + end_group?: bigint + params?: Parameters +} + +export namespace PublishOk { + export function serialize(v: PublishOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.PublishOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putU8(v.forward) + payloadBuf.putU8(v.subscriber_priority) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putBytes(FilterType.serialize(v.filter_type)) + if (v.start_location) { + payloadBuf.putBytes(Location.serialize(v.start_location)) + } + if (v.end_group) { + payloadBuf.putVarInt(v.end_group) + } + payloadBuf.putBytes(Parameters.serialize(v.params ?? new Map())) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): PublishOk { + const id = reader.getVarInt() + const forward = reader.getU8() + const subscriber_priority = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const filter_type = FilterType.deserialize(reader) + let start_location: Location | undefined = undefined + if (filter_type == FilterType.AbsoluteStart || filter_type == FilterType.AbsoluteRange) { + start_location = Location.deserialize(reader) + } + let end_group: bigint | undefined = undefined + if (filter_type == FilterType.AbsoluteRange) { + end_group = reader.getVarInt() + } + let params: Parameters | undefined = undefined + if (reader.remaining > 0) { + params = Parameters.deserialize(reader) + } + return { + id, + forward, + subscriber_priority, + group_order, + filter_type, + start_location, + end_group, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/requests_block.ts b/lib/transport/control/requests_block.ts new file mode 100644 index 0000000..9d9beb7 --- /dev/null +++ b/lib/transport/control/requests_block.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface RequestsBlocked { + id: bigint +} + +export namespace RequestsBlocked { + export function serialize(v: RequestsBlocked): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.RequestsBlocked) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): RequestsBlocked { + const id = reader.getVarInt() + return { + id, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/server_setup.ts b/lib/transport/control/server_setup.ts new file mode 100644 index 0000000..2f531a3 --- /dev/null +++ b/lib/transport/control/server_setup.ts @@ -0,0 +1,29 @@ +import { ControlMessageType, Version } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters } from "../base_data" + +export interface ServerSetup { + version: Version + params: Parameters +} + +export namespace ServerSetup { + export function serialize(v: ServerSetup): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.ServerSetup) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.version) + payloadBuf.putBytes(Parameters.serialize(v.params)) + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): ServerSetup { + const version = reader.getNumberVarInt() as Version + return { + version, + params: Parameters.deserialize(reader) + } + } +} \ No newline at end of file diff --git a/lib/transport/control/setup_parameters.ts b/lib/transport/control/setup_parameters.ts new file mode 100644 index 0000000..4bd8178 --- /dev/null +++ b/lib/transport/control/setup_parameters.ts @@ -0,0 +1,8 @@ +export enum SetupParameters { + Authority = 0x05, + Path = 0x01, + MaxRequestId = 0x02, + MaxAuthTokenCacheSize = 0x04, + // TODO(itzmanish): implement more params from the draft +} + diff --git a/lib/transport/control/subscribe.ts b/lib/transport/control/subscribe.ts new file mode 100644 index 0000000..9ea3314 --- /dev/null +++ b/lib/transport/control/subscribe.ts @@ -0,0 +1,143 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple, Parameters, Location, KeyValuePairs } from "../base_data" +import { debug } from "../utils" + +export enum GroupOrder { + Publisher = 0x0, + Ascending = 0x1, + Descending = 0x2, +} + +export namespace GroupOrder { + export function serialize(v: GroupOrder): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putU8(v) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): GroupOrder { + const order = buffer.getU8() + switch (order) { + case 0: + return GroupOrder.Publisher + case 1: + return GroupOrder.Ascending + case 2: + return GroupOrder.Descending + default: + throw new Error(`Invalid GroupOrder value: ${order}`) + } + } +} + +export enum FilterType { + NextGroupStart = 0x1, + LargestObject = 0x2, + AbsoluteStart = 0x3, + AbsoluteRange = 0x4, +} + +export namespace FilterType { + export function serialize(v: FilterType): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(v) + return buf.Uint8Array + } + + export function deserialize(buffer: ImmutableBytesBuffer): FilterType { + const order = buffer.getVarInt() + switch (order) { + case 1n: + return FilterType.NextGroupStart + case 2n: + return FilterType.LargestObject + case 3n: + return FilterType.AbsoluteStart + case 4n: + return FilterType.AbsoluteRange + default: + throw new Error(`Invalid FilterType value: ${order}`) + } + } +} + + +export interface Subscribe { + id: bigint // Request ID in draft-14 + namespace: Tuple, + name: string + subscriber_priority: number // u8 + group_order: GroupOrder + forward: number // u8 -> 0/1 + filter_type: FilterType + start_location?: Location + end_group?: bigint + params: Parameters +} + + +export namespace Subscribe { + export function serialize(v: Subscribe): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Subscribe) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putUtf8String(v.name) + payloadBuf.putU8(v.subscriber_priority) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putU8(v.forward) + payloadBuf.putBytes(FilterType.serialize(v.filter_type)) + + if (v.filter_type === FilterType.AbsoluteStart || v.filter_type === FilterType.AbsoluteRange) { + if (!v.start_location) { + throw new Error('start location required for absolute start or absolute range') + } + payloadBuf.putBytes(Location.serialize(v.start_location)) + } + + if (v.filter_type === FilterType.AbsoluteRange) { + if (v.end_group == null) { + throw new Error('end group required for absolute range') + } + payloadBuf.putVarInt(v.end_group) + } + payloadBuf.putBytes(Parameters.serialize(v.params)) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Subscribe { + const id = reader.getVarInt() + const namespace = Tuple.deserialize(reader) + const name = reader.getUtf8String() + const subscriber_priority = reader.getU8() + const group_order = GroupOrder.deserialize(reader) + const forward = reader.getU8() + const filter_type = FilterType.deserialize(reader) + let start_location: Location | undefined + if (filter_type == FilterType.AbsoluteRange || filter_type == FilterType.AbsoluteStart) { + start_location = Location.deserialize(reader) + } + let end_group: bigint | undefined + if (filter_type == FilterType.AbsoluteRange) { + end_group = reader.getVarInt() + } + const params = Parameters.deserialize(reader) + return { + id, + namespace, + name, + subscriber_priority, + group_order, + forward, + filter_type, + start_location, + end_group, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_error.ts b/lib/transport/control/subscribe_error.ts new file mode 100644 index 0000000..c2121a3 --- /dev/null +++ b/lib/transport/control/subscribe_error.ts @@ -0,0 +1,35 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + +export interface SubscribeError { + id: bigint // Request ID in draft-14 + code: bigint + reason: string +} + + +export namespace SubscribeError { + export function serialize(v: SubscribeError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_namespace.ts b/lib/transport/control/subscribe_namespace.ts new file mode 100644 index 0000000..605e716 --- /dev/null +++ b/lib/transport/control/subscribe_namespace.ts @@ -0,0 +1,39 @@ +import { ControlMessageType, FilterType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Tuple, Parameters, Location, KeyValuePairs } from "../base_data" + + +export interface SubscribeNamespace { + id: bigint, + namespace: string[] + params?: Parameters +} + + +export namespace SubscribeNamespace { + export function serialize(v: SubscribeNamespace): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeNamespace) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putBytes(Tuple.serialize(v.namespace)) + payloadBuf.putBytes(KeyValuePairs.serialize(v.params ?? new Map())) + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeNamespace { + const id = reader.getVarInt() + const namespace = Tuple.deserialize(reader) + let params: Parameters | undefined + if (reader.remaining > 0) { + params = KeyValuePairs.deserialize(reader) + } + return { + id, + namespace, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_namespace_error.ts b/lib/transport/control/subscribe_namespace_error.ts new file mode 100644 index 0000000..f1d24f6 --- /dev/null +++ b/lib/transport/control/subscribe_namespace_error.ts @@ -0,0 +1,36 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface SubscribeNamespaceError { + id: bigint, + code: bigint, + reason: string +} + + +export namespace SubscribeNamespaceError { + export function serialize(v: SubscribeNamespaceError): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeNamespaceError) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.code) + payloadBuf.putUtf8String(v.reason) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeNamespaceError { + const id = reader.getVarInt() + const code = reader.getVarInt() + const reason = reader.getUtf8String() + return { + id, + code, + reason + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_namespace_ok.ts b/lib/transport/control/subscribe_namespace_ok.ts new file mode 100644 index 0000000..3da6031 --- /dev/null +++ b/lib/transport/control/subscribe_namespace_ok.ts @@ -0,0 +1,28 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + + +export interface SubscribeNamespaceOk { + id: bigint, +} + + +export namespace SubscribeNamespaceOk { + export function serialize(v: SubscribeNamespaceOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeNamespaceOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeNamespaceOk { + const id = reader.getVarInt() + return { + id, + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_ok.ts b/lib/transport/control/subscribe_ok.ts new file mode 100644 index 0000000..91b6c98 --- /dev/null +++ b/lib/transport/control/subscribe_ok.ts @@ -0,0 +1,64 @@ +import { ControlMessageType } from "." +import { GroupOrder } from "./subscribe" +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, Location } from "../base_data" + + +export interface SubscribeOk { + id: bigint // Request ID + track_alias: bigint // Publisher-specified in draft-14 + expires: bigint + group_order: GroupOrder + content_exists: number // 0 or 1 + largest_location?: Location + params: Parameters +} +export namespace SubscribeOk { + export function serialize(v: SubscribeOk): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeOk) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.track_alias) + payloadBuf.putVarInt(v.expires) + payloadBuf.putBytes(GroupOrder.serialize(v.group_order)) + payloadBuf.putU8(v.content_exists) + if (v.content_exists) { + if (!v.largest_location) { + throw new Error('largest_location required for content_exists') + } + payloadBuf.putBytes(Location.serialize(v.largest_location)) + } + + payloadBuf.putBytes(Parameters.serialize(v.params)) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeOk { + const id = reader.getVarInt() + const track_alias = reader.getVarInt() + const expires = reader.getVarInt() + const group_order = GroupOrder.deserialize(reader) + const content_exists = reader.getNumberVarInt() + if (content_exists != 0 && content_exists != 1) { + throw new Error("Invalid content_exists value") + } + let largest_location: Location | undefined + if (content_exists) { + largest_location = Location.deserialize(reader) + } + const params = Parameters.deserialize(reader) + return { + id, + track_alias, + expires, + group_order, + content_exists, + largest_location, + params + } + } +} \ No newline at end of file diff --git a/lib/transport/control/subscribe_update.ts b/lib/transport/control/subscribe_update.ts new file mode 100644 index 0000000..19f9405 --- /dev/null +++ b/lib/transport/control/subscribe_update.ts @@ -0,0 +1,56 @@ +import { ControlMessageType, GroupOrder } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" +import { Parameters, KeyValuePairs, Location } from "../base_data" + +export interface SubscribeUpdate { + id: bigint + subscription_id: bigint + start_location: Location + end_group: bigint + subscriber_priority: number + forward: number + params?: Parameters +} + + +export namespace SubscribeUpdate { + export function serialize(v: SubscribeUpdate): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.SubscribeUpdate) + + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + payloadBuf.putVarInt(v.subscription_id) + payloadBuf.putBytes(Location.serialize(v.start_location)) + payloadBuf.putVarInt(v.end_group) + payloadBuf.putVarInt(v.subscriber_priority) + payloadBuf.putVarInt(v.forward) + payloadBuf.putBytes(KeyValuePairs.serialize(v.params ?? new Map())) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): SubscribeUpdate { + const id = reader.getVarInt() + const subscription_id = reader.getVarInt() + const start_location = Location.deserialize(reader) + const end_group = reader.getVarInt() + const subscriber_priority = reader.getNumberVarInt() + const forward = reader.getNumberVarInt() + let params: Parameters | undefined + if (reader.remaining > 0) { + params = KeyValuePairs.deserialize(reader) + } + return { + id, + subscription_id, + start_location, + end_group, + subscriber_priority, + forward, + params + } + } +} diff --git a/lib/transport/control/unsubscribe.ts b/lib/transport/control/unsubscribe.ts new file mode 100644 index 0000000..a092f82 --- /dev/null +++ b/lib/transport/control/unsubscribe.ts @@ -0,0 +1,27 @@ +import { ControlMessageType } from "." +import { ImmutableBytesBuffer, MutableBytesBuffer } from "../buffer" + + +export interface Unsubscribe { + id: bigint +} + +export namespace Unsubscribe { + export function serialize(v: Unsubscribe): Uint8Array { + const mainBuf = new MutableBytesBuffer(new Uint8Array()) + mainBuf.putVarInt(ControlMessageType.Unsubscribe) + const payloadBuf = new MutableBytesBuffer(new Uint8Array()) + payloadBuf.putVarInt(v.id) + + mainBuf.putU16(payloadBuf.byteLength) + mainBuf.putBytes(payloadBuf.Uint8Array) + return mainBuf.Uint8Array + } + + export function deserialize(reader: ImmutableBytesBuffer): Unsubscribe { + const id = reader.getVarInt() + return { + id + } + } +} \ No newline at end of file diff --git a/lib/transport/fetch.ts b/lib/transport/fetch.ts new file mode 100644 index 0000000..ca9b492 --- /dev/null +++ b/lib/transport/fetch.ts @@ -0,0 +1,25 @@ + +export interface FetchHeader { + type: FetchType + id: bigint +} + + +export enum FetchType { + Type0x5 = 0x5, +} + +export namespace FetchType { + export function try_from(value: number | bigint): FetchType { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case FetchType.Type0x5: + return v as FetchType + default: + throw new Error(`invalid fetch type: ${v}`) + } + } +} + + diff --git a/lib/transport/index.ts b/lib/transport/index.ts index ca86a6c..7004969 100644 --- a/lib/transport/index.ts +++ b/lib/transport/index.ts @@ -3,5 +3,5 @@ export type { ClientConfig } from "./client" export { Connection } from "./connection" -export { SubscribeRecv, AnnounceSend } from "./publisher" -export { AnnounceRecv, SubscribeSend } from "./subscriber" +export { SubscribeRecv, PublishNamespaceSend } from "./publisher" +export { PublishNamespaceRecv, SubscribeSend } from "./subscriber" diff --git a/lib/transport/objects.ts b/lib/transport/objects.ts index d217bdf..e93846a 100644 --- a/lib/transport/objects.ts +++ b/lib/transport/objects.ts @@ -1,236 +1,370 @@ -import { Reader, Writer } from "./stream" -export { Reader, Writer } - -// Each stream type is prefixed with the given VarInt type. -// https://www.ietf.org/archive/id/draft-ietf-moq-transport-06.html#section-7 -export enum StreamType { - // Datagram = 0x1, // No datagram support - Track = 0x2, // Deprecated in DRAFT_07 - Subgroup = 0x4, - // Fetch = 0x5, // Added in DRAFT_07 +import { SubgroupHeader, SubgroupObject, SubgroupReader, SubgroupType, SubgroupWriter } from "./subgroup" +import { KeyValuePairs } from "./base_data" +import { debug } from "./utils" +import { ImmutableBytesBuffer, MutableBytesBuffer, ReadableStreamBuffer, Reader, WritableStreamBuffer, Writer } from "./buffer" + +export enum ObjectForwardingPreference { + Datagram = "Datagram", + Subgroup = "Subgroup", } export enum Status { + NORMAL = 0, OBJECT_NULL = 1, - GROUP_NULL = 2, GROUP_END = 3, TRACK_END = 4, } -export interface TrackHeader { - type: StreamType.Track - sub: bigint - track: bigint - publisher_priority: number // VarInt with a u32 maximum value +export namespace Status { + export function serialize(status: Status): Uint8Array { + const w = new MutableBytesBuffer(new Uint8Array()) + w.putVarInt(status) + return w.Uint8Array + } + export function deserialize(reader: ImmutableBytesBuffer): Status { + return try_from(reader.getNumberVarInt()) + } + export function try_from(value: number | bigint) { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case 0: + return Status.NORMAL + case 1: + return Status.OBJECT_NULL + case 3: + return Status.GROUP_END + case 4: + return Status.TRACK_END + default: + throw new Error(`invalid object status: ${v}`) + } + } } -export interface TrackChunk { - group: number // The group sequence, as a number because 2^53 is enough. - object: number - status?: Status // Only sent if Object Payload Length is zero - payload: Uint8Array | Status +export interface Object { + track_namespace: string + track_name: string + group_id: number + object_id: number + publisher_priority: number + object_forwarding_preference: ObjectForwardingPreference + subgroup_id: number + status: Status + extension_headers: KeyValuePairs + object_payload?: Uint8Array } -export interface SubgroupHeader { - type: StreamType.Subgroup - sub: bigint - track: bigint - group: number // The group sequence, as a number because 2^53 is enough. - subgroup: number // The subgroup sequence, as a number because 2^53 is enough. - publisher_priority: number // VarInt with a u32 maximum value +export function isDatagram(obj: ObjectDatagram | SubgroupHeader): boolean { + return obj.type in ObjectDatagramType } -export interface SubgroupChunk { - object: number - status?: Status // Only sent if Object Payload Length is zero - payload: Uint8Array | Status + +export enum ObjectDatagramType { + Type0x0 = 0x0, + Type0x1 = 0x1, + Type0x2 = 0x2, + Type0x3 = 0x3, + Type0x4 = 0x4, + Type0x5 = 0x5, + Type0x6 = 0x6, + Type0x7 = 0x7, + Type0x20 = 0x20, + Type0x21 = 0x21, } -type WriterType = T extends TrackHeader ? TrackWriter : T extends SubgroupHeader ? SubgroupWriter : never +export namespace ObjectDatagramType { + export function serialize(type: ObjectDatagramType): Uint8Array { + const w = new MutableBytesBuffer(new Uint8Array()) + w.putVarInt(type) + return w.Uint8Array + } + export function deserialize(reader: ImmutableBytesBuffer): ObjectDatagramType { + return try_from(reader.getNumberVarInt()) + } + export function try_from(value: number | bigint): ObjectDatagramType { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case ObjectDatagramType.Type0x0: + case ObjectDatagramType.Type0x1: + case ObjectDatagramType.Type0x2: + case ObjectDatagramType.Type0x3: + case ObjectDatagramType.Type0x4: + case ObjectDatagramType.Type0x5: + case ObjectDatagramType.Type0x6: + case ObjectDatagramType.Type0x7: + case ObjectDatagramType.Type0x20: + case ObjectDatagramType.Type0x21: + return v as ObjectDatagramType + default: + throw new Error(`invalid object datagram type: ${v}`) + } + } -export class Objects { - private quic: WebTransport + export function isEndOfGroup(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x2: + case ObjectDatagramType.Type0x3: + case ObjectDatagramType.Type0x6: + case ObjectDatagramType.Type0x7: + return true + default: + return false + } + } - constructor(quic: WebTransport) { - this.quic = quic + export function hasExtensions(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x1: + case ObjectDatagramType.Type0x3: + case ObjectDatagramType.Type0x5: + case ObjectDatagramType.Type0x7: + case ObjectDatagramType.Type0x21: + return true + default: + return false + } } - async send(h: T): Promise> { - const stream = await this.quic.createUnidirectionalStream() - const w = new Writer(stream) + export function hasObjectId(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x4: + case ObjectDatagramType.Type0x5: + case ObjectDatagramType.Type0x6: + case ObjectDatagramType.Type0x7: + return false + default: + return true + } + } + + export function hasStatus(type: ObjectDatagramType) { + switch (type) { + case ObjectDatagramType.Type0x20: + case ObjectDatagramType.Type0x21: + return true + default: + return false + } + } +} - await w.u53(h.type) - await w.u62(h.sub) - await w.u62(h.track) +export interface ObjectDatagram { + type: ObjectDatagramType + track_alias: bigint + group_id: number + object_id?: number + publisher_priority: number + extension_headers?: KeyValuePairs + status?: Status + object_payload?: Uint8Array +} - let res: WriterType +export namespace ObjectDatagram { + export function serialize(obj: ObjectDatagram): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putBytes(ObjectDatagramType.serialize(obj.type)) + buf.putVarInt(obj.group_id) + if (obj.object_id) { + buf.putVarInt(obj.object_id) + } + if (obj.object_payload) { + buf.putVarInt(obj.object_payload.byteLength) + buf.putBytes(obj.object_payload) + } else { + buf.putVarInt(0) + buf.putVarInt(obj.status as number) + } + return buf.Uint8Array + } - if (h.type === StreamType.Subgroup) { - await w.u53(h.group) - await w.u53(h.subgroup) - await w.u8(h.publisher_priority) + export function deserialize(reader: ImmutableBytesBuffer): ObjectDatagram { - res = new SubgroupWriter(h, w) as WriterType - } else if (h.type === StreamType.Track) { - await w.u8(h.publisher_priority) + const type = reader.getNumberVarInt() + const alias = reader.getVarInt() + const group = reader.getNumberVarInt() + let object_id: number | undefined + if (ObjectDatagramType.hasObjectId(type)) { + object_id = reader.getNumberVarInt() + } + const publisher_priority = reader.getU8() + let extHeaders: KeyValuePairs | undefined + if (ObjectDatagramType.hasExtensions(type)) { + const extHeadersLength = reader.getNumberVarInt() + const extHeadersData = reader.getBytes(extHeadersLength) - res = new TrackWriter(h, w) as WriterType + extHeaders = KeyValuePairs.deserialize_with_size(new ImmutableBytesBuffer(extHeadersData), extHeadersLength) + } + let status: Status | undefined + let payload: Uint8Array | undefined + if (ObjectDatagramType.hasStatus(type)) { + status = Status.try_from(reader.getNumberVarInt()) } else { - throw new Error("unknown header type") + payload = reader.getBytes(reader.remaining) } - // console.trace("send object", res.header) + return { + group_id: group, + object_id, + object_payload: payload, + status, + type, + track_alias: alias, + publisher_priority, + extension_headers: extHeaders, + } + } +} + +export class Objects { + private quic: WebTransport + + constructor(quic: WebTransport) { + this.quic = quic + } + + async send(h: ObjectDatagram | SubgroupHeader): Promise { + const is_datagram = isDatagram(h); + + if (is_datagram) { + // Datagram mode + const stream = this.quic.datagrams.writable + const w = new WritableStreamBuffer(stream) + return new TrackWriter(w) + } else { + // Subgroup stream mode + const stream = await this.quic.createUnidirectionalStream() + const w = new WritableStreamBuffer(stream) + + // Write subgroup header + const subgroupHeader = h as SubgroupHeader + await w.write(SubgroupHeader.serialize(subgroupHeader)) - return res + return new SubgroupWriter(subgroupHeader, w) + } } async recv(): Promise { + console.log("Objects.recv waiting for streams") const streams = this.quic.incomingUnidirectionalStreams.getReader() + console.log("Objects.recv got streams", streams) const { value, done } = await streams.read() + console.log("Objects.recv got value, done", value, done) streams.releaseLock() if (done) return - const r = new Reader(new Uint8Array(), value) - const type = (await r.u53()) as StreamType - let res: TrackReader | SubgroupReader - - if (type == StreamType.Track) { - const h: TrackHeader = { - type, - sub: await r.u62(), - track: await r.u62(), - publisher_priority: await r.u8(), + const r = new ReadableStreamBuffer(value) + const type = await r.getNumberVarInt() + + // Try to parse as SubgroupType + try { + const subgroupType = SubgroupType.try_from(type) + console.log("Objects.recv got type", subgroupType) + + const track_alias = await r.getVarInt() + const group_id = await r.getNumberVarInt() + + let subgroup_id: number | undefined + if (SubgroupType.hasExplicitSubgroupId(subgroupType)) { + subgroup_id = await r.getNumberVarInt() + } else if (SubgroupType.isSubgroupIdZero(subgroupType)) { + subgroup_id = 0 + } else { + // Subgroup ID is first object ID - will be set when reading first object + subgroup_id = undefined } - res = new TrackReader(h, r) - } else if (type == StreamType.Subgroup) { - const h = { - type, - sub: await r.u62(), - track: await r.u62(), - group: await r.u53(), - subgroup: await r.u53(), - publisher_priority: await r.u8(), + const publisher_priority = await r.getU8() + + const h: SubgroupHeader = { + type: subgroupType, + track_alias, + group_id, + subgroup_id, + publisher_priority, } - res = new SubgroupReader(h, r) - } else { - console.log("transport/objects.ts: unknown stream type: ", type) - throw new Error("unknown stream type") - } - // console.trace("receive object", res.header) + console.log("Objects.recv got subgroup header", h) - return res + return new SubgroupReader(h, r) + } catch (e) { + // Not a subgroup type, might be datagram or other type + console.log("transport/objects.ts: unknown stream type: ", type) + throw new Error(`unknown stream type: ${type}`) + } } } +// TrackWriter is object sender over datagram export class TrackWriter { + // For compatibility with reader interface + public header = { track_alias: 0n } + constructor( - public header: TrackHeader, public stream: Writer, - ) {} + ) { } - async write(c: TrackChunk) { - await this.stream.u53(c.group) - await this.stream.u53(c.object) - - if (c.payload instanceof Uint8Array) { - await this.stream.u53(c.payload.byteLength) - await this.stream.write(c.payload) - } else { - // empty payload with status - await this.stream.u53(0) - await this.stream.u53(c.payload as number) - } + async write(c: ObjectDatagram) { + return this.stream.write(ObjectDatagram.serialize(c)) } async close() { - await this.stream.close() + return this.stream.close() } } -export class SubgroupWriter { - constructor( - public header: SubgroupHeader, - public stream: Writer, - ) {} - async write(c: SubgroupChunk) { - await this.stream.u53(c.object) - if (c.payload instanceof Uint8Array) { - await this.stream.u53(c.payload.byteLength) - await this.stream.write(c.payload) - } else { - await this.stream.u53(0) - await this.stream.u53(c.payload as number) - } - } +export class TrackReader { + // Header with track_alias for routing + public header: { track_alias: bigint } - async close() { - await this.stream.close() + constructor( + stream: Reader, + track_alias: bigint = 0n, + ) { + this.stream = stream + this.header = { track_alias } } -} -export class TrackReader { - constructor( - public header: TrackHeader, - public stream: Reader, - ) {} + public stream: Reader - async read(): Promise { + async read(): Promise { if (await this.stream.done()) { return } - const group = await this.stream.u53() - const object = await this.stream.u53() - const size = await this.stream.u53() - - let payload - if (size == 0) { - payload = (await this.stream.u53()) as Status - } else { - payload = await this.stream.read(size) + const type = await this.stream.getNumberVarInt() + const alias = await this.stream.getVarInt() + const group = await this.stream.getNumberVarInt() + let object_id: number | undefined + if (ObjectDatagramType.hasObjectId(type)) { + object_id = await this.stream.getNumberVarInt() } - - return { - group, - object, - payload, - } - } - - async close() { - await this.stream.close() - } -} - -export class SubgroupReader { - constructor( - public header: SubgroupHeader, - public stream: Reader, - ) {} - - async read(): Promise { - if (await this.stream.done()) { - return + const publisher_priority = await this.stream.getU8() + let extHeaders: KeyValuePairs | undefined + if (ObjectDatagramType.hasExtensions(type)) { + extHeaders = await KeyValuePairs.deserialize_with_reader(this.stream) } - - const object = await this.stream.u53() - const size = await this.stream.u53() - - let payload - if (size == 0) { - payload = (await this.stream.u53()) as Status + let status: Status | undefined + let payload: Uint8Array | undefined + if (ObjectDatagramType.hasStatus(type)) { + status = Status.try_from(await this.stream.getNumberVarInt()) } else { - payload = await this.stream.read(size) + payload = await this.stream.read(this.stream.byteLength) } return { - object, - payload, + group_id: group, + object_id, + object_payload: payload, + status, + type, + track_alias: alias, + publisher_priority, + extension_headers: extHeaders, } } @@ -238,3 +372,4 @@ export class SubgroupReader { await this.stream.close() } } + diff --git a/lib/transport/publisher.ts b/lib/transport/publisher.ts index 1f328c4..e7466e7 100644 --- a/lib/transport/publisher.ts +++ b/lib/transport/publisher.ts @@ -1,41 +1,84 @@ import * as Control from "./control" +import { ControlStream } from "./stream" import { Queue, Watch } from "../common/async" -import { Objects, SubgroupWriter, StreamType, TrackWriter } from "./objects" +import { Objects, TrackWriter, ObjectDatagramType } from "./objects" +import { SubgroupType, SubgroupWriter } from "./subgroup" +import { MigrationState } from "./connection" export class Publisher { // Used to send control messages - #control: Control.Stream + #control: ControlStream + + #migrationState: MigrationState = "none" // Use to send objects. #objects: Objects // Our announced tracks. - #announce = new Map() + #publishedNamespaces = new Map() + #waitingPublishNamespaceRequests = new Map() // Their subscribed tracks. #subscribe = new Map() #subscribeQueue = new Queue(Number.MAX_SAFE_INTEGER) // Unbounded queue in case there's no receiver - constructor(control: Control.Stream, objects: Objects) { + // Track alias counter (publisher assigns these in draft-14) + #nextTrackAlias = 0n + + constructor(control: ControlStream, objects: Objects) { + this.#control = control + this.#objects = objects + } + + async close() { + return this.#subscribeQueue.close() + } + + get activeSubscribersCount() { + return this.#subscribe.size + } + + get migrationState() { + return this.#migrationState + } + + set migrationState(state: MigrationState) { + this.#migrationState = state + } + + async startMigration() { + this.migrationState = "in_progress" + } + + async migrationDone(control: ControlStream, objects: Objects) { + this.migrationState = "done" this.#control = control this.#objects = objects + // NOTE(itzmanish): should we republish all the tracks? } - // Announce a track namespace. - async announce(namespace: string[]): Promise { - if (this.#announce.has(namespace.join("/"))) { + async publish_namespace(namespace: string[]): Promise { + if (this.migrationState !== "none") { + throw new Error(`migration in progress or going away`) + } + if (this.#publishedNamespaces.has(namespace.join("/"))) { throw new Error(`already announced: ${namespace.join("/")}`) } - const announce = new AnnounceSend(this.#control, namespace) - this.#announce.set(namespace.join("/"), announce) + const publishNamespaceSend = new PublishNamespaceSend(this.#control, namespace) + this.#publishedNamespaces.set(namespace.join("/"), publishNamespaceSend) + const id = this.#control.nextRequestId() + this.#waitingPublishNamespaceRequests.set(id, namespace.join("/")) await this.#control.send({ - kind: Control.Msg.Announce, - namespace, + type: Control.ControlMessageType.PublishNamespace, + message: { + id, + namespace, + }, }) - return announce + return publishNamespaceSend } // Receive the next new subscription @@ -43,77 +86,106 @@ export class Publisher { return await this.#subscribeQueue.next() } - async recv(msg: Control.Subscriber) { - if (msg.kind == Control.Msg.Subscribe) { - await this.recvSubscribe(msg) - } else if (msg.kind == Control.Msg.Unsubscribe) { - this.recvUnsubscribe(msg) - } else if (msg.kind == Control.Msg.AnnounceOk) { - this.recvAnnounceOk(msg) - } else if (msg.kind == Control.Msg.AnnounceError) { - this.recvAnnounceError(msg) - } else { - throw new Error(`unknown control message`) // impossible + async recv(msg: Control.MessageWithType) { + const { type, message } = msg; + switch (type) { + case Control.ControlMessageType.Subscribe: + await this.recvSubscribe(message) + break; + case Control.ControlMessageType.Unsubscribe: + this.recvUnsubscribe(message) + break; + case Control.ControlMessageType.PublishNamespaceOk: + this.recvPublishNamespaceOk(message) + break; + case Control.ControlMessageType.PublishNamespaceError: + this.recvPublishNamespaceError(message) + break; + default: + throw new Error(`unknown control message`) // impossible } } - recvAnnounceOk(msg: Control.AnnounceOk) { - const announce = this.#announce.get(msg.namespace.join("/")) - if (!announce) { - throw new Error(`announce OK for unknown announce: ${msg.namespace.join("/")}`) + recvPublishNamespaceOk(msg: Control.PublishNamespaceOk) { + const namespace = this.#waitingPublishNamespaceRequests.get(msg.id) + if (!namespace) { + throw new Error(`publish namespace OK for unknown announce: ${msg.id}`) + } + const publishNamespaceSend = this.#publishedNamespaces.get(namespace) + if (!publishNamespaceSend) { + throw new Error(`no active published namespace: ${namespace}`) } - announce.onOk() + publishNamespaceSend.onOk() + console.log("published namespace:", namespace) } - recvAnnounceError(msg: Control.AnnounceError) { - const announce = this.#announce.get(msg.namespace.join("/")) - if (!announce) { + recvPublishNamespaceError(msg: Control.PublishNamespaceError) { + const namespace = this.#waitingPublishNamespaceRequests.get(msg.id) + if (!namespace) { + throw new Error(`publish namespace error for unknown announce: ${msg.id}`) + } + const publishNamespaceSend = this.#publishedNamespaces.get(namespace) + if (!publishNamespaceSend) { // TODO debug this - console.warn(`announce error for unknown announce: ${msg.namespace.join("/")}`) + console.warn(`publish namespace error for unknown announce: ${namespace}`) return } - announce.onError(msg.code, msg.reason) + publishNamespaceSend.onError(msg.code, msg.reason) } async recvSubscribe(msg: Control.Subscribe) { - if (this.#subscribe.has(msg.id)) { - throw new Error(`duplicate subscribe for id: ${msg.id}`) + if (this.migrationState !== "none") { + throw new Error(`migration in progress or going away`) + } + try { + if (this.#subscribe.has(msg.id)) { + throw new Error(`duplicate subscribe for id: ${msg.id}`) + } + + const trackAlias = this.#nextTrackAlias++ + const subscribe = new SubscribeRecv(this.#control, this.#objects, msg, trackAlias) + this.#subscribe.set(msg.id, subscribe) + await this.#subscribeQueue.push(subscribe) + } catch (e: any) { + await this.#control.send({ + type: Control.ControlMessageType.SubscribeError, + message: { + id: msg.id, + code: 0n, + reason: e.message, + } + }) + throw e } - - const subscribe = new SubscribeRecv(this.#control, this.#objects, msg) - this.#subscribe.set(msg.id, subscribe) - await this.#subscribeQueue.push(subscribe) - - await this.#control.send({ - kind: Control.Msg.SubscribeOk, - id: msg.id, - expires: 0n, - group_order: msg.group_order, - }) } - recvUnsubscribe(_msg: Control.Unsubscribe) { - throw new Error("TODO unsubscribe") + recvUnsubscribe(msg: Control.Unsubscribe) { + const subscribe = this.#subscribe.get(msg.id) + if (!subscribe) { + throw new Error(`unsubscribe for unknown subscribe: ${msg.id}`) + } + subscribe.close() + this.#subscribe.delete(msg.id) } } -export class AnnounceSend { - #control: Control.Stream +export class PublishNamespaceSend { + #control: ControlStream readonly namespace: string[] // The current state, updated by control messages. #state = new Watch<"init" | "ack" | Error>("init") - constructor(control: Control.Stream, namespace: string[]) { + constructor(control: ControlStream, namespace: string[]) { this.#control = control this.namespace = namespace } async ok() { - for (;;) { + for (; ;) { const [state, next] = this.#state.value() if (state === "ack") return if (state instanceof Error) throw state @@ -124,7 +196,7 @@ export class AnnounceSend { } async active() { - for (;;) { + for (; ;) { const [state, next] = this.#state.value() if (state instanceof Error) throw state if (!next) return @@ -151,16 +223,16 @@ export class AnnounceSend { onError(code: bigint, reason: string) { if (this.closed()) return - const err = new Error(`ANNOUNCE_ERROR (${code})` + reason ? `: ${reason}` : "") + const err = new Error(`PUBLISH_NAMESPACE_ERROR (${code})` + reason ? `: ${reason}` : "") this.#state.update(err) } } export class SubscribeRecv { - #control: Control.Stream + #control: ControlStream #objects: Objects #id: bigint - #trackId: bigint + #trackAlias: bigint // Publisher-specified in draft-14 #subscriberPriority: number groupOrder: Control.GroupOrder @@ -170,11 +242,11 @@ export class SubscribeRecv { // The current state of the subscription. #state: "init" | "ack" | "closed" = "init" - constructor(control: Control.Stream, objects: Objects, msg: Control.Subscribe) { + constructor(control: ControlStream, objects: Objects, msg: Control.Subscribe, trackAlias: bigint) { this.#control = control // so we can send messages this.#objects = objects // so we can send objects this.#id = msg.id - this.#trackId = msg.trackId + this.#trackAlias = trackAlias this.namespace = msg.namespace this.track = msg.name this.#subscriberPriority = msg.subscriber_priority @@ -186,47 +258,71 @@ export class SubscribeRecv { if (this.#state !== "init") return this.#state = "ack" + console.log("got subscribe req:", this.#id, "track:", this.#trackAlias, "sending subscribe ok") + + // NOTE(itzmanish): revisit this // Send the control message. return this.#control.send({ - kind: Control.Msg.SubscribeOk, - id: this.#id, - expires: 0n, - group_order: this.groupOrder, + type: Control.ControlMessageType.SubscribeOk, + message: { + id: this.#id, + expires: 0n, + group_order: this.groupOrder, + track_alias: this.#trackAlias, + content_exists: 0, + params: new Map(), + } }) } // Close the subscription with an error. async close(code = 0n, reason = "") { if (this.#state === "closed") return + const acked = this.#state === "ack" this.#state = "closed" + if (!acked) { + return this.#control.send({ + type: Control.ControlMessageType.SubscribeError, + message: { id: this.#id, code, reason } + }) + } return this.#control.send({ - kind: Control.Msg.SubscribeDone, - id: this.#id, - code, - reason, + type: Control.ControlMessageType.PublishDone, + message: { + id: this.#id, + code, + reason, + stream_count: 0n, // FIXME(itzmanish): correctly reflect active stream count + } }) } - // Create a writable data stream for the entire track + // Create a writable data stream for the entire track (using datagrams) async serve(props?: { priority: number }): Promise { + if (this.#state === "closed") { + throw new Error("subscribe closed") + } return this.#objects.send({ - type: StreamType.Track, - sub: this.#id, - track: this.#trackId, + type: ObjectDatagramType.Type0x0, // Basic datagram without extensions + track_alias: this.#trackAlias, + group_id: 0, // Will be set per write + object_id: 0, // Will be set per write publisher_priority: props?.priority ?? 127, - }) + }) as Promise } // Create a writable data stream for a subgroup within the track async subgroup(props: { group: number; subgroup: number; priority?: number }): Promise { + if (this.#state === "closed") { + throw new Error("subscribe closed") + } return this.#objects.send({ - type: StreamType.Subgroup, - sub: this.#id, - track: this.#trackId, - group: props.group, - subgroup: props.subgroup, + type: SubgroupType.Type0x10, // Basic subgroup without extensions + track_alias: this.#trackAlias, + group_id: props.group, + subgroup_id: props.subgroup, publisher_priority: props.priority ?? 127, - }) + }) as Promise } } diff --git a/lib/transport/setup.ts b/lib/transport/setup.ts deleted file mode 100644 index a3f2500..0000000 --- a/lib/transport/setup.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { Reader, Writer } from "./stream" - -export type Message = Client | Server -export type Role = "publisher" | "subscriber" | "both" - -export enum Version { - DRAFT_00 = 0xff000000, - DRAFT_01 = 0xff000001, - DRAFT_02 = 0xff000002, - DRAFT_03 = 0xff000003, - DRAFT_04 = 0xff000004, - DRAFT_05 = 0xff000005, - DRAFT_06 = 0xff000006, - DRAFT_07 = 0xff000007, - KIXEL_00 = 0xbad00, - KIXEL_01 = 0xbad01, -} - -enum SetupType { - Client = 0x40, - Server = 0x41, -} - -// NOTE: These are forked from moq-transport-00. -// 1. messages lack a sized length -// 2. parameters are not optional and written in order (role + path) -// 3. role indicates local support only, not remote support - -export interface Client { - versions: Version[] - role: Role - params?: Parameters -} - -export interface Server { - version: Version - params?: Parameters -} - -export class Stream { - recv: Decoder - send: Encoder - - constructor(r: Reader, w: Writer) { - this.recv = new Decoder(r) - this.send = new Encoder(w) - } -} - -export type Parameters = Map - -export class Decoder { - r: Reader - - constructor(r: Reader) { - this.r = r - } - - async client(): Promise { - const type: SetupType = await this.r.u53() - if (type !== SetupType.Client) throw new Error(`client SETUP type must be ${SetupType.Client}, got ${type}`) - - const count = await this.r.u53() - - const versions = [] - for (let i = 0; i < count; i++) { - const version = await this.r.u53() - versions.push(version) - } - - const params = await this.parameters() - const role = this.role(params?.get(0n)) - - return { - versions, - role, - params, - } - } - - async server(): Promise { - const type: SetupType = await this.r.u53() - if (type !== SetupType.Server) throw new Error(`server SETUP type must be ${SetupType.Server}, got ${type}`) - - const advertisedLength = await this.r.u53() - if (advertisedLength !== this.r.getByteLength()) { - throw new Error(`server SETUP message length mismatch: ${advertisedLength} != ${this.r.getByteLength()}`) - } - - const version = await this.r.u53() - const params = await this.parameters() - - return { - version, - params, - } - } - - private async parameters(): Promise { - const count = await this.r.u53() - if (count == 0) return undefined - - const params = new Map() - - for (let i = 0; i < count; i++) { - const id = await this.r.u62() - const size = await this.r.u53() - const value = await this.r.read(size) - - if (params.has(id)) { - throw new Error(`duplicate parameter id: ${id}`) - } - - params.set(id, value) - } - - return params - } - - role(raw: Uint8Array | undefined): Role { - if (!raw) throw new Error("missing role parameter") - if (raw.length != 1) throw new Error("multi-byte varint not supported") - - switch (raw[0]) { - case 1: - return "publisher" - case 2: - return "subscriber" - case 3: - return "both" - default: - throw new Error(`invalid role: ${raw[0]}`) - } - } -} - -export class Encoder { - w: Writer - - constructor(w: Writer) { - this.w = w - } - - async client(c: Client) { - let len = 0 - const msg: Uint8Array[] = [] - - const { versionBytes, versionPayload } = this.buildVersions(c.versions) - len += versionBytes - msg.push(...versionPayload) - - // I hate it - const params = c.params ?? new Map() - params.set(0n, new Uint8Array([c.role == "publisher" ? 1 : c.role == "subscriber" ? 2 : 3])) - const { paramData, totalBytes } = this.buildParameters(params) - len += totalBytes - msg.push(...paramData) - - const messageType = this.w.setVint53(new Uint8Array(8), SetupType.Client) - const messageLength = this.w.setVint53(new Uint8Array(8), len) - - for (const elem of [messageType, messageLength, ...msg]) { - await this.w.write(elem) - } - } - - private buildVersions(versions: Version[]) { - let versionBytes = 0 - const versionPayload = [] - - const versionLength = this.w.setVint53(new Uint8Array(8), versions.length) - versionPayload.push(versionLength) - versionBytes += versionLength.length - - for (const v of versions) { - const version = this.w.setVint53(new Uint8Array(8), v) - versionPayload.push(version) - versionBytes += version.length - } - return { versionBytes, versionPayload } - } - - private buildParameters(p: Parameters | undefined): { paramData: Uint8Array[]; totalBytes: number } { - if (!p) return { paramData: [this.w.setUint8(new Uint8Array(8), 0)], totalBytes: 0 } - const paramBytes = [this.w.setVint53(new Uint8Array(8), p.size)] - for (const [id, value] of p) { - const idBytes = this.w.setVint62(new Uint8Array(8), id) - const sizeBytes = this.w.setVint53(new Uint8Array(8), value.length) - paramBytes.push(idBytes, sizeBytes, value) - } - return { paramData: paramBytes, totalBytes: paramBytes.reduce((acc, curr) => acc + curr.length, 0) } - } -} diff --git a/lib/transport/stream.ts b/lib/transport/stream.ts index 5e76550..e47cb39 100644 --- a/lib/transport/stream.ts +++ b/lib/transport/stream.ts @@ -1,320 +1,344 @@ -const MAX_U6 = Math.pow(2, 6) - 1 -const MAX_U14 = Math.pow(2, 14) - 1 -const MAX_U30 = Math.pow(2, 30) - 1 -const MAX_U31 = Math.pow(2, 31) - 1 -const MAX_U53 = Number.MAX_SAFE_INTEGER -const MAX_U62: bigint = 2n ** 62n - 1n -// Reader wraps a stream and provides convience methods for reading pieces from a stream -// Unfortunately we can't use a BYOB reader because it's not supported with WebTransport+WebWorkers yet. -export class Reader { - #buffer: Uint8Array - #stream: ReadableStream - #reader: ReadableStreamDefaultReader - - constructor(buffer: Uint8Array, stream: ReadableStream) { - this.#buffer = buffer - this.#stream = stream - this.#reader = this.#stream.getReader() - } - - getByteLength(): number { - return this.#buffer.byteLength - } - - // Adds more data to the buffer, returning true if more data was added. - async #fill(): Promise { - const result = await this.#reader.read() - if (result.done) { - return false - } - - const buffer = new Uint8Array(result.value) - - if (this.#buffer.byteLength == 0) { - this.#buffer = buffer - } else { - const temp = new Uint8Array(this.#buffer.byteLength + buffer.byteLength) - temp.set(this.#buffer) - temp.set(buffer, this.#buffer.byteLength) - this.#buffer = temp - } - - return true - } - - // Add more data to the buffer until it's at least size bytes. - async #fillTo(size: number) { - while (this.#buffer.byteLength < size) { - if (!(await this.#fill())) { - throw new Error("unexpected end of stream") - } +import { + ControlMessageType, FetchError, + MessageWithType, Publish, + PublishDone, PublishError, PublishNamespace, + PublishNamespaceDone, PublishNamespaceError, + PublishNamespaceOk, PublishOk, Unsubscribe, + Fetch, FetchOk, FetchCancel, + Subscribe, SubscribeOk, SubscribeError, + SubscribeUpdate, SubscribeNamespace, + SubscribeNamespaceOk, SubscribeNamespaceError, + GoAway, MaxRequestId, +} from "./control" +import { debug } from "./utils" +import { ImmutableBytesBuffer, ReadableWritableStreamBuffer, Reader, Writer } from "./buffer" +import { RequestsBlocked } from "./control/requests_block" + +export class ControlStream { + private decoder: Decoder + private encoder: Encoder + // Our next request ID to use when sending requests + #nextRequestId = 0n + // Remote's maximum request ID (first invalid ID). Requests we send must be < this value. + #remoteMaxRequestId?: bigint + + #mutex = Promise.resolve() + + constructor(c: ReadableWritableStreamBuffer) { + this.decoder = new Decoder(c) + this.encoder = new Encoder(c) + } + + // Will error if two messages are read at once. + async recv(): Promise { + const msg = await this.decoder.message() + return msg + } + + async send(msg: MessageWithType) { + const unlock = await this.#lock() + try { + debug("sending message", msg) + const payload = this.encoder.message(msg) + debug("sending payload", payload) + await this.encoder.send(payload) + } finally { + unlock() } } - // Consumes the first size bytes of the buffer. - #slice(size: number): Uint8Array { - const result = new Uint8Array(this.#buffer.buffer, this.#buffer.byteOffset, size) - this.#buffer = new Uint8Array(this.#buffer.buffer, this.#buffer.byteOffset + size) - - return result - } - - async read(size: number): Promise { - if (size == 0) return new Uint8Array() - - await this.#fillTo(size) - return this.#slice(size) - } - - async readAll(): Promise { - // eslint-disable-next-line no-empty - while (await this.#fill()) {} - return this.#slice(this.#buffer.byteLength) - } - - async tuple(): Promise { - const length = await this.u53() - const tuple = (await this.string()).split("/").filter(Boolean) // remove empty strings + async #lock() { + // Make a new promise that we can resolve later. + let done: () => void + const p = new Promise((resolve) => { + done = () => resolve() + }) - if (length !== tuple.length) { - throw new Error(`expected tuple length ${length}, got ${tuple.length}`) - } + // Wait until the previous lock is done, then resolve our lock. + const lock = this.#mutex.then(() => done) - return tuple - } - - async string(maxLength?: number): Promise { - const length = await this.u53() - if (maxLength !== undefined && length > maxLength) { - throw new Error(`string length ${length} exceeds max length ${maxLength}`) - } + // Save our lock as the next lock. + this.#mutex = p - const buffer = await this.read(length) - return new TextDecoder().decode(buffer) + // Return the lock. + return lock } - async u8(): Promise { - await this.#fillTo(1) - return this.#slice(1)[0] - } + /** + * Returns the next request ID or throws if max request ID is reached. + * Per spec: "If a Request ID equal to or larger than this [MAX_REQUEST_ID] is received + * by the endpoint that sent the MAX_REQUEST_ID in any request message, the endpoint + * MUST close the session with an error of TOO_MANY_REQUESTS." + * @param incr number at which the next request ID should be incremented (default 2 for client) + * @returns next request ID + */ + nextRequestId(incr: bigint = 2n): bigint { + const id = this.#nextRequestId - // Returns a Number using 53-bits, the max Javascript can use for integer math - async u53(): Promise { - const v = await this.u62() - if (v > MAX_U53) { - throw new Error("value larger than 53-bits; use v62 instead") + // Check if we're about to exceed the remote's max request ID + if (this.#remoteMaxRequestId !== undefined && id >= this.#remoteMaxRequestId) { + throw new Error(`TOO_MANY_REQUESTS: Request ID ${id} >= remote max ${this.#remoteMaxRequestId}`) } - return Number(v) - } - - // NOTE: Returns a bigint instead of a number since it may be larger than 53-bits - async u62(): Promise { - await this.#fillTo(1) - const size = (this.#buffer[0] & 0xc0) >> 6 - - if (size == 0) { - const first = this.#slice(1)[0] - return BigInt(first) & 0x3fn - } else if (size == 1) { - await this.#fillTo(2) - const slice = this.#slice(2) - const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) - - return BigInt(view.getInt16(0)) & 0x3fffn - } else if (size == 2) { - await this.#fillTo(4) - const slice = this.#slice(4) - const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) - - return BigInt(view.getUint32(0)) & 0x3fffffffn - } else if (size == 3) { - await this.#fillTo(8) - const slice = this.#slice(8) - const view = new DataView(slice.buffer, slice.byteOffset, slice.byteLength) - - return view.getBigUint64(0) & 0x3fffffffffffffffn - } else { - throw new Error("impossible") + this.#nextRequestId += incr + return id + } + + /** + * Sets the remote's maximum request ID. Per spec: + * "The Maximum Request ID MUST only increase within a session, and receipt of a + * MAX_REQUEST_ID message with an equal or smaller Request ID value is a PROTOCOL_VIOLATION." + * + * Note: The id parameter is the "Maximum Request ID + 1" (first invalid ID). + * @param id The new maximum request ID for the session plus 1 + */ + setRemoteMaxRequestId(id: bigint) { + // Validate that MAX_REQUEST_ID only increases + if (this.#remoteMaxRequestId !== undefined && id <= this.#remoteMaxRequestId) { + throw new Error(`PROTOCOL_VIOLATION: MAX_REQUEST_ID must only increase (received ${id}, current ${this.#remoteMaxRequestId})`) } - } - - async done(): Promise { - if (this.#buffer.byteLength > 0) return false - return !(await this.#fill()) - } - - async close() { - this.#reader.releaseLock() - await this.#stream.cancel() - } - - release(): [Uint8Array, ReadableStream] { - this.#reader.releaseLock() - return [this.#buffer, this.#stream] + this.#remoteMaxRequestId = id } } -// Writer wraps a stream and writes chunks of data -export class Writer { - #scratch: Uint8Array - #writer: WritableStreamDefaultWriter - #stream: WritableStream +export class Decoder { + r: Reader - constructor(stream: WritableStream) { - this.#stream = stream - this.#scratch = new Uint8Array(8) - this.#writer = this.#stream.getWriter() + constructor(r: Reader) { + this.r = r } - async u8(v: number) { - await this.write(this.setUint8(this.#scratch, v)) + private async messageType(): Promise { + const t = await this.r.getNumberVarInt() + return t as ControlMessageType } - async i32(v: number) { - if (Math.abs(v) > MAX_U31) { - throw new Error(`overflow, value larger than 32-bits: ${v}`) + async message(): Promise { + const t = await this.messageType() + const advertisedLength = await this.r.getU16() + if (advertisedLength > this.r.byteLength) { + console.error( + `message: ${ControlMessageType.toString(t)} length mismatch: advertised ${advertisedLength} > ${this.r.byteLength} received`, + ) + // NOTE(itzmanish): should we have a timeout and retry few times even if timeout is reached? + await this.r.waitForBytes(advertisedLength) } - - // We don't use a VarInt, so it always takes 4 bytes. - // This could be improved but nothing is standardized yet. - await this.write(this.setInt32(this.#scratch, v)) - } - - async u53(v: number) { - if (v < 0) { - throw new Error(`underflow, value is negative: ${v}`) - } else if (v > MAX_U53) { - throw new Error(`overflow, value larger than 53-bits: ${v}`) - } - - await this.write(this.setVint53(this.#scratch, v)) - } - - async u62(v: bigint) { - if (v < 0) { - throw new Error(`underflow, value is negative: ${v}`) - } else if (v >= MAX_U62) { - throw new Error(`overflow, value larger than 62-bits: ${v}`) + const rawPayload = await this.r.read(advertisedLength) + const payload = new ImmutableBytesBuffer(rawPayload) + + let res: MessageWithType + switch (t) { + case ControlMessageType.RequestsBlocked: + res = { + type: t, + message: RequestsBlocked.deserialize(payload), + } + break + case ControlMessageType.GoAway: + res = { + type: t, + message: GoAway.deserialize(payload), + } + break + case ControlMessageType.Subscribe: + res = { + type: t, + message: Subscribe.deserialize(payload), + } + break + case ControlMessageType.SubscribeOk: + res = { + type: t, + message: SubscribeOk.deserialize(payload), + } + break + case ControlMessageType.SubscribeError: + res = { + type: t, + message: SubscribeError.deserialize(payload), + } + break + case ControlMessageType.Unsubscribe: + res = { + type: t, + message: Unsubscribe.deserialize(payload), + } + break + case ControlMessageType.SubscribeUpdate: + res = { + type: t, + message: SubscribeUpdate.deserialize(payload), + } + break + case ControlMessageType.Publish: + res = { + type: t, + message: Publish.deserialize(payload), + } + break + case ControlMessageType.PublishDone: + res = { + type: t, + message: PublishDone.deserialize(payload), + } + break + case ControlMessageType.PublishOk: + res = { + type: t, + message: PublishOk.deserialize(payload), + } + break + case ControlMessageType.PublishError: + res = { + type: t, + message: PublishError.deserialize(payload), + } + break + case ControlMessageType.PublishNamespace: + res = { + type: t, + message: PublishNamespace.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceOk: + res = { + type: t, + message: PublishNamespaceOk.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceDone: + res = { + type: t, + message: PublishNamespaceDone.deserialize(payload), + } + break + case ControlMessageType.PublishNamespaceError: + res = { + type: t, + message: PublishNamespaceError.deserialize(payload), + } + break + case ControlMessageType.Fetch: + res = { + type: t, + message: Fetch.deserialize(payload), + } + break + case ControlMessageType.FetchCancel: + res = { + type: t, + message: FetchCancel.deserialize(payload), + } + break + case ControlMessageType.FetchOk: + res = { + type: t, + message: FetchOk.deserialize(payload), + } + break + case ControlMessageType.FetchError: + res = { + type: t, + message: FetchError.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespace: + res = { + type: t, + message: SubscribeNamespace.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespaceOk: + res = { + type: t, + message: SubscribeNamespaceOk.deserialize(payload), + } + break + case ControlMessageType.SubscribeNamespaceError: + res = { + type: t, + message: SubscribeNamespaceError.deserialize(payload), + } + break + case ControlMessageType.MaxRequestId: + res = { + type: t, + message: MaxRequestId.deserialize(payload), + } + break + default: + throw new Error(`unknown message kind: ${t}`) } - await this.write(this.setVint62(this.#scratch, v)) - } - - setUint8(dst: Uint8Array, v: number): Uint8Array { - dst[0] = v - return dst.slice(0, 1) - } - - setUint16(dst: Uint8Array, v: number): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 2) - view.setUint16(0, v) - - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) - } - - setInt32(dst: Uint8Array, v: number): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 4) - view.setInt32(0, v) - - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) - } - - setUint32(dst: Uint8Array, v: number): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 4) - view.setUint32(0, v) + return res - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) - } - - setVint53(dst: Uint8Array, v: number): Uint8Array { - if (v <= MAX_U6) { - return this.setUint8(dst, v) - } else if (v <= MAX_U14) { - return this.setUint16(dst, v | 0x4000) - } else if (v <= MAX_U30) { - return this.setUint32(dst, v | 0x80000000) - } else if (v <= MAX_U53) { - return this.setUint64(dst, BigInt(v) | 0xc000000000000000n) - } else { - throw new Error(`overflow, value larger than 53-bits: ${v}`) - } } +} - setVint62(dst: Uint8Array, v: bigint): Uint8Array { - if (v < MAX_U6) { - return this.setUint8(dst, Number(v)) - } else if (v < MAX_U14) { - return this.setUint16(dst, Number(v) | 0x4000) - } else if (v <= MAX_U30) { - return this.setUint32(dst, Number(v) | 0x80000000) - } else if (v <= MAX_U62) { - return this.setUint64(dst, BigInt(v) | 0xc000000000000000n) - } else { - throw new Error(`overflow, value larger than 62-bits: ${v}`) +export class Encoder { + w: Writer + + constructor(w: Writer) { + this.w = w + } + + message(m: MessageWithType): Uint8Array { + const { message } = m + switch (m.type) { + case ControlMessageType.Subscribe: + return Subscribe.serialize(message as Subscribe) + case ControlMessageType.SubscribeOk: + return SubscribeOk.serialize(message as SubscribeOk) + case ControlMessageType.SubscribeError: + return SubscribeError.serialize(message as SubscribeError) + case ControlMessageType.SubscribeUpdate: + return SubscribeUpdate.serialize(message as SubscribeUpdate) + case ControlMessageType.SubscribeNamespace: + return SubscribeNamespace.serialize(message as SubscribeNamespace) + case ControlMessageType.SubscribeNamespaceOk: + return SubscribeNamespaceOk.serialize(message as SubscribeNamespaceOk) + case ControlMessageType.SubscribeNamespaceError: + return SubscribeNamespaceError.serialize(message as SubscribeNamespaceError) + case ControlMessageType.Unsubscribe: + return Unsubscribe.serialize(message as Unsubscribe) + case ControlMessageType.Publish: + return Publish.serialize(message as Publish) + case ControlMessageType.PublishDone: + return PublishDone.serialize(message as PublishDone) + case ControlMessageType.PublishOk: + return PublishOk.serialize(message as PublishOk) + case ControlMessageType.PublishError: + return PublishError.serialize(message as PublishError) + case ControlMessageType.PublishNamespace: + return PublishNamespace.serialize(message as PublishNamespace) + case ControlMessageType.PublishNamespaceOk: + return PublishNamespaceOk.serialize(message as PublishNamespaceOk) + case ControlMessageType.PublishNamespaceError: + return PublishNamespaceError.serialize(message as PublishNamespaceError) + case ControlMessageType.PublishNamespaceDone: + return PublishNamespaceDone.serialize(message as PublishNamespaceDone) + case ControlMessageType.Fetch: + return Fetch.serialize(message as Fetch) + case ControlMessageType.FetchCancel: + return FetchCancel.serialize(message as FetchCancel) + case ControlMessageType.FetchOk: + return FetchOk.serialize(message as FetchOk) + case ControlMessageType.FetchError: + return FetchError.serialize(message as FetchError) + case ControlMessageType.MaxRequestId: + return MaxRequestId.serialize(message as MaxRequestId) + case ControlMessageType.GoAway: + return GoAway.serialize(message as GoAway) + case ControlMessageType.RequestsBlocked: + return RequestsBlocked.serialize(message as RequestsBlocked) + default: + throw new Error(`unknown message kind in encoder`) } } - setUint64(dst: Uint8Array, v: bigint): Uint8Array { - const view = new DataView(dst.buffer, dst.byteOffset, 8) - view.setBigUint64(0, v) - - return new Uint8Array(view.buffer, view.byteOffset, view.byteLength) - } - - concatBuffer(bufferArray: (Uint8Array | undefined)[]) { - let length = 0 - bufferArray.forEach((buffer) => { - if (buffer === undefined) return - length += buffer.length - }) - let offset = 0 - const result = new Uint8Array(length) - bufferArray.forEach((buffer) => { - if (buffer === undefined) return - result.set(buffer, offset) - offset += buffer.length - }) - return result - } - - encodeTuple(buffer: Uint8Array, tuple: string[]) { - const tupleBytes = new TextEncoder().encode(tuple.join("/")) - - return this.concatBuffer([ - this.setVint53(buffer, tuple.length), - this.setVint53(buffer, tupleBytes.length), - tupleBytes, - ]) - } - - encodeString(buffer: Uint8Array, str: string): Uint8Array { - const strBytes = new TextEncoder().encode(str) - - return this.concatBuffer([this.setVint53(buffer, strBytes.length), strBytes]) - } - - async write(v: Uint8Array) { - await this.#writer.write(v) - } - async tuple(arr: string[]) { - await this.u53(arr.length) - await this.string(arr.join("/")) - } - async string(str: string) { - const data = new TextEncoder().encode(str) - await this.u53(data.byteLength) - await this.write(data) - } - - async close() { - this.#writer.releaseLock() - await this.#stream.close() - } - - release(): WritableStream { - this.#writer.releaseLock() - return this.#stream + async send(payload: Uint8Array) { + await this.w.write(payload) } } + diff --git a/lib/transport/subgroup.ts b/lib/transport/subgroup.ts new file mode 100644 index 0000000..4c34026 --- /dev/null +++ b/lib/transport/subgroup.ts @@ -0,0 +1,221 @@ +import { ImmutableBytesBuffer, MutableBytesBuffer, Reader, Writer } from "./buffer" +import { KeyValuePairs } from "./base_data" +import { Status } from "./objects" + +export interface SubgroupHeader { + type: SubgroupType + track_alias: bigint + group_id: number + subgroup_id?: number + publisher_priority: number +} + +export namespace SubgroupHeader { + export function serialize(header: SubgroupHeader): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putBytes(SubgroupType.serialize(header.type)) + buf.putVarInt(header.track_alias) + buf.putVarInt(header.group_id) + if (SubgroupType.hasExplicitSubgroupId(header.type) && header.subgroup_id !== undefined) { + buf.putVarInt(header.subgroup_id) + } + buf.putU8(header.publisher_priority) + return buf.Uint8Array + } +} + +export interface SubgroupObject { + object_id: number + extension_headers?: KeyValuePairs + status?: Status // only if payload is null + object_payload?: Uint8Array +} + +export namespace SubgroupObject { + export function serialize(obj: SubgroupObject): Uint8Array { + const buf = new MutableBytesBuffer(new Uint8Array()) + buf.putVarInt(obj.object_id) + + if (obj.extension_headers) { + buf.putBytes(KeyValuePairs.serialize(obj.extension_headers)) + } + buf.putVarInt(obj.object_payload?.length ?? 0) + if (!obj.object_payload) { + buf.putVarInt(obj.status!) + } else { + buf.putBytes(obj.object_payload) + } + return buf.Uint8Array + } +} + +export enum SubgroupType { + Type0x10 = 0x10, + Type0x11 = 0x11, + Type0x12 = 0x12, + Type0x13 = 0x13, + Type0x14 = 0x14, + Type0x15 = 0x15, + Type0x18 = 0x18, + Type0x19 = 0x19, + Type0x1A = 0x1A, + Type0x1B = 0x1B, + Type0x1C = 0x1C, + Type0x1D = 0x1D, +} + +export namespace SubgroupType { + export function serialize(type: SubgroupType): Uint8Array { + const w = new MutableBytesBuffer(new Uint8Array()) + w.putVarInt(type) + return w.Uint8Array + } + export function deserialize(reader: ImmutableBytesBuffer): SubgroupType { + return try_from(reader.getNumberVarInt()) + } + + // may throw if invalid value if provided + export function try_from(value: number | bigint): SubgroupType { + const v = typeof value === "bigint" ? Number(value) : value + + switch (v) { + case SubgroupType.Type0x10: + case SubgroupType.Type0x11: + case SubgroupType.Type0x12: + case SubgroupType.Type0x13: + case SubgroupType.Type0x14: + case SubgroupType.Type0x15: + case SubgroupType.Type0x18: + case SubgroupType.Type0x19: + case SubgroupType.Type0x1A: + case SubgroupType.Type0x1B: + case SubgroupType.Type0x1C: + case SubgroupType.Type0x1D: + return v as SubgroupType + default: + throw new Error(`invalid subgroup type: ${v}`) + } + } + + export function isSubgroupIdPresent(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x14: + case SubgroupType.Type0x15: + case SubgroupType.Type0x1C: + case SubgroupType.Type0x1D: + return true + default: + return false + } + } + + export function hasExplicitSubgroupId(type: SubgroupType) { + return isSubgroupIdPresent(type) + } + + export function isSubgroupIdZero(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x10: + case SubgroupType.Type0x11: + case SubgroupType.Type0x18: + case SubgroupType.Type0x19: + return true + default: + return false + } + } + + export function isSubgroupFirstObjectId(type: SubgroupType) { + return !(hasExplicitSubgroupId(type) || isSubgroupIdZero(type)) + } + + export function isExtensionPresent(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x11: + case SubgroupType.Type0x13: + case SubgroupType.Type0x15: + case SubgroupType.Type0x19: + case SubgroupType.Type0x1B: + case SubgroupType.Type0x1D: + return true + default: + return false + } + } + + export function contains_end_of_group(type: SubgroupType) { + switch (type) { + case SubgroupType.Type0x18: + case SubgroupType.Type0x19: + case SubgroupType.Type0x1A: + case SubgroupType.Type0x1B: + case SubgroupType.Type0x1C: + case SubgroupType.Type0x1D: + return true + default: + return false + } + } +} + + +export class SubgroupWriter { + constructor( + public header: SubgroupHeader, + public stream: Writer, + ) { } + + async write(c: SubgroupObject) { + return this.stream.write(SubgroupObject.serialize(c)) + } + + async close() { + return this.stream.close() + } +} +export class SubgroupReader { + constructor( + public header: SubgroupHeader, + public stream: Reader, + ) { } + + async read(): Promise { + if (await this.stream.done()) { + return + } + + const object_id = await this.stream.getNumberVarInt() + + let extHeaders: KeyValuePairs | undefined + if (SubgroupType.isExtensionPresent(this.header.type)) { + extHeaders = await KeyValuePairs.deserialize_with_reader(this.stream) + } + + console.log("subgroup header", object_id, extHeaders, this.stream) + + let obj_payload_len = await this.stream.getNumberVarInt() + + let object_payload: Uint8Array | undefined + let status: Status | undefined + + console.log("subgroup read", object_id, obj_payload_len) + + if (obj_payload_len == 0) { + status = Status.try_from(await this.stream.getNumberVarInt()) + } else { + object_payload = await this.stream.read(obj_payload_len) + } + + console.log("read success??", object_id, status, extHeaders, object_payload) + return { + object_id, + status, + extension_headers: extHeaders, + object_payload, + } + } + + async close() { + await this.stream.close() + } +} diff --git a/lib/transport/subscriber.ts b/lib/transport/subscriber.ts index 3e5170a..c257066 100644 --- a/lib/transport/subscriber.ts +++ b/lib/transport/subscriber.ts @@ -1,107 +1,181 @@ import * as Control from "./control" import { Queue, Watch } from "../common/async" import { Objects } from "./objects" -import type { TrackReader, SubgroupReader } from "./objects" +import type { TrackReader } from "./objects" +import { debug } from "./utils" +import { ControlStream } from "./stream" +import { SubgroupReader } from "./subgroup" +import { MigrationState } from "./connection" + +export interface TrackInfo { + track_alias: bigint + track: TrackReader | SubgroupReader +} export class Subscriber { // Use to send control messages. - #control: Control.Stream + #control: ControlStream + + #migrationState: MigrationState = "none" // Use to send objects. #objects: Objects // Announced broadcasts. - #announce = new Map() - #announceQueue = new Watch([]) + #publishedNamespaces = new Map() + #publishedNamespacesQueue = new Watch([]) // Our subscribed tracks. #subscribe = new Map() - #subscribeNext = 0n - #trackToIDMap = new Map() + #aliasToSubscriptionMap = new Map() // Maps track alias to subscription ID + #pendingTrack = new Map Promise>() - constructor(control: Control.Stream, objects: Objects) { + constructor(control: ControlStream, objects: Objects) { this.#control = control this.#objects = objects } - announced(): Watch { - return this.#announceQueue + publishedNamespaces(): Watch { + return this.#publishedNamespacesQueue + } + + get activeSubscribersCount() { + return this.#subscribe.size + } + + get migrationState() { + return this.#migrationState + } + + set migrationState(state: MigrationState) { + this.#migrationState = state + } + + async startMigration() { + this.migrationState = "in_progress" + for (const [track, id] of this.#trackToIDMap) { + await this.unsubscribe(track, true); + } + } + + async migrationDone(control: ControlStream, objects: Objects) { + this.migrationState = "done" + this.#control = control + this.#objects = objects } - async recv(msg: Control.Publisher) { - if (msg.kind == Control.Msg.Announce) { - await this.recvAnnounce(msg) - } else if (msg.kind == Control.Msg.Unannounce) { - this.recvUnannounce(msg) - } else if (msg.kind == Control.Msg.SubscribeOk) { - this.recvSubscribeOk(msg) - } else if (msg.kind == Control.Msg.SubscribeError) { - await this.recvSubscribeError(msg) - } else if (msg.kind == Control.Msg.SubscribeDone) { - await this.recvSubscribeDone(msg) - } else { - throw new Error(`unknown control message`) // impossible + async recv(msg: Control.MessageWithType) { + const { type, message } = msg; + switch (type) { + case Control.ControlMessageType.PublishNamespace: + await this.recvPublishNamespace(message) + break + case Control.ControlMessageType.PublishNamespaceDone: + this.recvPublishNamespaceDone(message) + break + case Control.ControlMessageType.SubscribeOk: + this.recvSubscribeOk(message) + break + case Control.ControlMessageType.SubscribeError: + await this.recvSubscribeError(message) + break + case Control.ControlMessageType.PublishDone: + await this.recvPublishDone(message) + break + default: + throw new Error(`unknown control message`) // impossible } } - async recvAnnounce(msg: Control.Announce) { - if (this.#announce.has(msg.namespace.join("/"))) { - throw new Error(`duplicate announce for namespace: ${msg.namespace.join("/")}`) + async recvPublishNamespace(msg: Control.PublishNamespace) { + if (this.#publishedNamespaces.has(msg.namespace.join("/"))) { + throw new Error(`duplicate publish namespace for namespace: ${msg.namespace.join("/")}`) } - await this.#control.send({ kind: Control.Msg.AnnounceOk, namespace: msg.namespace }) + await this.#control.send({ + type: Control.ControlMessageType.PublishNamespaceOk, + message: { id: msg.id } + }) - const announce = new AnnounceRecv(this.#control, msg.namespace) - this.#announce.set(msg.namespace.join("/"), announce) + const publishNamespace = new PublishNamespaceRecv(this.#control, msg.namespace, msg.id) + this.#publishedNamespaces.set(msg.namespace.join("/"), publishNamespace) - this.#announceQueue.update((queue) => [...queue, announce]) + this.#publishedNamespacesQueue.update((queue) => [...queue, publishNamespace]) } - recvUnannounce(_msg: Control.Unannounce) { - throw new Error(`TODO Unannounce`) + recvPublishNamespaceDone(_msg: Control.PublishNamespaceDone) { + throw new Error(`TODO PublishNamespaceDone`) + } + + async subscribe_namespace(namespace: string[]) { + if (this.migrationState === "in_progress" || this.migrationState === "going_away") { + throw new Error(`migration in progress or going away`) + } + const id = this.#control.nextRequestId() + const msg: Control.MessageWithType = { + type: Control.ControlMessageType.SubscribeNamespace, + message: { + id, + namespace, + } + } + await this.#control.send(msg) } async subscribe(namespace: string[], track: string) { - const id = this.#subscribeNext++ + if (this.migrationState === "in_progress" || this.migrationState === "going_away") { + throw new Error(`migration in progress or going away`) + } + const id = this.#control.nextRequestId() const subscribe = new SubscribeSend(this.#control, id, namespace, track) this.#subscribe.set(id, subscribe) this.#trackToIDMap.set(track, id) - await this.#control.send({ - kind: Control.Msg.Subscribe, - id, - trackId: id, - namespace, - name: track, - subscriber_priority: 127, // default to mid value, see: https://github.com/moq-wg/moq-transport/issues/504 - group_order: Control.GroupOrder.Publisher, - location: { - mode: "latest_group", - }, - }) + const subscription_req: Control.MessageWithType = { + type: Control.ControlMessageType.Subscribe, + message: { + id, + namespace, + name: track, + subscriber_priority: 127, // default to mid value, see: https://github.com/moq-wg/moq-transport/issues/504 + group_order: Control.GroupOrder.Publisher, + filter_type: Control.FilterType.NextGroupStart, + forward: 1, // always forward + params: new Map(), + } + } + + await this.#control.send(subscription_req) + debug("subscribe sent", subscription_req) return subscribe } - async unsubscribe(track: string) { - if (this.#trackToIDMap.has(track)) { - const trackID = this.#trackToIDMap.get(track) - if (trackID === undefined) { - console.warn(`Exception track ${track} not found in trackToIDMap.`) - return - } - try { - await this.#control.send({ kind: Control.Msg.Unsubscribe, id: trackID }) - this.#trackToIDMap.delete(track) - } catch (error) { - console.error(`Failed to unsubscribe from track ${track}:`, error) + async unsubscribe(track: string, isMigrating = false) { + const trackID = this.#trackToIDMap.get(track) + + if (trackID === undefined) { + console.warn(`Exception track ${track} not found in trackToIDMap.`) + return + } + + try { + const subscription = this.#subscribe.get(trackID) + if (subscription) { + const canBeDeleted = await subscription.close() + if (canBeDeleted) { + this.#subscribe.delete(trackID) + } } - } else { - console.warn(`During unsubscribe request initiation attempt track ${track} not found in trackToIDMap.`) + this.#trackToIDMap.delete(track) + + } catch (error) { + console.error(`Failed to unsubscribe from track ${track}:`, error) } + } recvSubscribeOk(msg: Control.SubscribeOk) { @@ -110,7 +184,16 @@ export class Subscriber { throw new Error(`subscribe ok for unknown id: ${msg.id}`) } - subscribe.onOk() + // Also create reverse mapping for receiving objects + this.#aliasToSubscriptionMap.set(msg.track_alias, msg.id) + const callback = this.#pendingTrack.get(msg.track_alias) + if (callback) { + this.#pendingTrack.delete(msg.track_alias) + callback(msg.id) + } + + console.log("subscribe ok", msg) + subscribe.onOk(msg.track_alias) } async recvSubscribeError(msg: Control.SubscribeError) { @@ -119,61 +202,94 @@ export class Subscriber { throw new Error(`subscribe error for unknown id: ${msg.id}`) } + this.#subscribe.delete(msg.id) + this.#trackToIDMap.delete(subscribe.track) + await subscribe.onError(msg.code, msg.reason) } - async recvSubscribeDone(msg: Control.SubscribeDone) { + async recvPublishDone(msg: Control.PublishDone) { const subscribe = this.#subscribe.get(msg.id) if (!subscribe) { - throw new Error(`subscribe error for unknown id: ${msg.id}`) + throw new Error(`publish done for unknown id: ${msg.id}`) } - await subscribe.onError(msg.code, msg.reason) + this.#subscribe.delete(msg.id) + this.#trackToIDMap.delete(subscribe.track) + + await subscribe.onDone(msg.code, msg.stream_count, msg.reason) } async recvObject(reader: TrackReader | SubgroupReader) { - const subscribe = this.#subscribe.get(reader.header.track) - if (!subscribe) { - throw new Error(`data for for unknown track: ${reader.header.track}`) + console.log("got object on recvObject", reader) + // Get track alias from reader header + const track_alias = reader.header.track_alias + + // Map track alias back to subscription ID + const subscriptionId = this.#aliasToSubscriptionMap.get(track_alias) + console.log("got subscriptionId", subscriptionId) + const callback = async (id: bigint) => { + const subscribe = this.#subscribe.get(id) + if (!subscribe) { + throw new Error(`data for unknown subscription: ${id}`) + } + console.log("doing subscribe on data", reader) + return subscribe.onData(reader) + } + if (subscriptionId === undefined) { + console.warn(`Exception track alias ${track_alias} not found in aliasToSubscriptionMap.`) + this.#pendingTrack.set(track_alias, callback) + return } - await subscribe.onData(reader) + await callback(subscriptionId) } } -export class AnnounceRecv { - #control: Control.Stream +export class PublishNamespaceRecv { + #control: ControlStream + #id: bigint readonly namespace: string[] - // The current state of the announce + // The current state of the publish namespace #state: "init" | "ack" | "closed" = "init" - constructor(control: Control.Stream, namespace: string[]) { + constructor(control: ControlStream, namespace: string[], id: bigint) { this.#control = control // so we can send messages this.namespace = namespace + this.#id = id } - // Acknowledge the subscription as valid. + // Acknowledge the publish namespace as valid. async ok() { if (this.#state !== "init") return this.#state = "ack" // Send the control message. - return this.#control.send({ kind: Control.Msg.AnnounceOk, namespace: this.namespace }) + return this.#control.send({ + type: Control.ControlMessageType.PublishNamespaceOk, + message: { id: this.#id } + }) } async close(code = 0n, reason = "") { if (this.#state === "closed") return this.#state = "closed" - return this.#control.send({ kind: Control.Msg.AnnounceError, namespace: this.namespace, code, reason }) + return this.#control.send({ + type: Control.ControlMessageType.PublishNamespaceError, + message: { id: this.#id, code, reason } + }) } } export class SubscribeSend { - #control: Control.Stream + #control: ControlStream #id: bigint + #trackAlias?: bigint // Set when SUBSCRIBE_OK is received + #closed: boolean = false + readonly namespace: string[] readonly track: string @@ -181,20 +297,39 @@ export class SubscribeSend { // A queue of received streams for this subscription. #data = new Queue() - constructor(control: Control.Stream, id: bigint, namespace: string[], track: string) { + constructor(control: ControlStream, id: bigint, namespace: string[], track: string) { this.#control = control // so we can send messages this.#id = id this.namespace = namespace this.track = track } - async close(_code = 0n, _reason = "") { - // TODO implement unsubscribe - // await this.#inner.sendReset(code, reason) + get trackAlias(): bigint | undefined { + return this.#trackAlias + } + + // sends unsubscribe message if the track alias is set + // and returns false otherwise true, which means subscription can be + // deleted + async close(_code = 0n, _reason = ""): Promise { + if (this.#closed) return true + this.#closed = true + if (this.#trackAlias === undefined) return true + await this.#control.send({ + type: Control.ControlMessageType.Unsubscribe, + message: { id: this.#id } + }) + return false + } + + onOk(trackAlias: bigint) { + console.log("setting track alias", trackAlias) + this.#trackAlias = trackAlias } - onOk() { - // noop + // FIXME(itzmanish): implement correctly + async onDone(code: bigint, streamCount: bigint, reason: string) { + console.warn("subscriber done, ID:", this.#id, "code", code, "streamCount", streamCount, reason) } async onError(code: bigint, reason: string) { @@ -211,6 +346,7 @@ export class SubscribeSend { } async onData(reader: TrackReader | SubgroupReader) { + console.log("subscribe send onData", reader) if (!this.#data.closed()) await this.#data.push(reader) } diff --git a/lib/transport/tsconfig.json b/lib/transport/tsconfig.json index 88da906..38c67ea 100644 --- a/lib/transport/tsconfig.json +++ b/lib/transport/tsconfig.json @@ -1,9 +1,11 @@ { "extends": "../tsconfig.json", - "include": ["."], + "include": [ + "." + ], "references": [ { "path": "../common" } ] -} +} \ No newline at end of file diff --git a/lib/transport/utils.ts b/lib/transport/utils.ts new file mode 100644 index 0000000..f658e06 --- /dev/null +++ b/lib/transport/utils.ts @@ -0,0 +1,7 @@ +export function debug(...msg: any[]) { + console.log("itzmanish:", ...msg) +} + +export async function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} \ No newline at end of file diff --git a/lib/tsconfig.json b/lib/tsconfig.json index 08dc503..5299650 100644 --- a/lib/tsconfig.json +++ b/lib/tsconfig.json @@ -4,7 +4,11 @@ "moduleResolution": "node", "module": "es2022", "target": "es2022", - "lib": ["es2022", "dom", "dom.iterable"], + "lib": [ + "es2022", + "dom", + "dom.iterable" + ], "outDir": "./dist", "strict": true, "allowJs": false, @@ -14,5 +18,7 @@ "isolatedModules": false, "noEmit": false }, - "exclude": ["node_modules"] -} + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/lib/video-moq/index.ts b/lib/video-moq/index.ts index 9287cee..967ffcb 100644 --- a/lib/video-moq/index.ts +++ b/lib/video-moq/index.ts @@ -209,11 +209,13 @@ export class VideoMoq extends HTMLElement { } } - private load() { - this.destroy().catch((error) => { + private async load(reload: boolean = false) { + await this.destroy(reload).catch((error) => { console.error("Error while destroying:", error) }) + console.log("creating player:", this.src) + this.shadow.innerHTML = /*html*/ `
    @@ -238,13 +240,31 @@ export class VideoMoq extends HTMLElement { const fingerprint = urlParams.get("fingerprint") || this.getAttribute("fingerprint") // TODO: Unsure if fingerprint should be optional - if (namespace === null || fingerprint === null) return + if (namespace === null) { + this.fail(new Error("No 'namespace' attribute provided for ")) + return + } const trackNumStr = urlParams.get("trackNum") || this.trackNum const trackNum: number = this.auxParseInt(trackNumStr, 0) - Player.create({ url: url.origin, fingerprint, canvas: this.#canvas, namespace }, trackNum) - .then((player) => this.setPlayer(player)) - .catch((e) => this.fail(e)) + try { + const player = await Player.create( + { url: url.origin, fingerprint: fingerprint ?? undefined, canvas: this.#canvas, namespace }, + trackNum, + ) + player.addEventListener("reconnect", ((event: CustomEvent) => { + console.log("[VideoMoq] Reconnect event received:", event.detail, this.src) + if (event.detail?.uri && event.detail.uri !== "") { + this.src = `${event.detail.uri}?namespace=${namespace}` + } + this.load(true) + }) as EventListener) + + this.setPlayer(player) + } catch (error) { + this.fail(error as Error) + } + if (this.controls !== null) { const controlsElement = document.createElement("div") @@ -316,7 +336,7 @@ export class VideoMoq extends HTMLElement { } } - private async destroy() { + private async destroy(reload: boolean = false) { this.#canvas?.removeEventListener("click", this.playPauseEventHandler) this.#playButton?.removeEventListener("click", this.playPauseEventHandler) @@ -335,8 +355,16 @@ export class VideoMoq extends HTMLElement { document.removeEventListener("keydown", this.toggleFullscreenEventHandler) document.removeEventListener("fullscreenchange", () => this.onFullscreenChange()) - if (!this.player) return - await this.player.close() + console.log("destroying player") + if (!this.player) { + console.log("player is null") + return + } + if (reload) { + this.player.close(new Error("cancelled")) + } else { + await this.player.close() + } this.player = null } @@ -377,20 +405,20 @@ export class VideoMoq extends HTMLElement { public play(): Promise { return this.player ? this.player.play().then(() => { - if (!this.#playButton) return - this.#playButton.innerHTML = PAUSE_SVG - this.#playButton.ariaLabel = "Pause" - }) + if (!this.#playButton) return + this.#playButton.innerHTML = PAUSE_SVG + this.#playButton.ariaLabel = "Pause" + }) : Promise.resolve() } public pause(): Promise { return this.player ? this.player.pause().then(() => { - if (!this.#playButton) return - this.#playButton.innerHTML = PLAY_SVG - this.#playButton.ariaLabel = "Play" - }) + if (!this.#playButton) return + this.#playButton.innerHTML = PLAY_SVG + this.#playButton.ariaLabel = "Play" + }) : Promise.resolve() } @@ -419,23 +447,23 @@ export class VideoMoq extends HTMLElement { public unmute(): Promise { return this.player ? this.player.mute(false).then(() => { - if (!this.#volumeButton) return - this.#volumeButton.ariaLabel = "Mute" - this.#volumeButton.innerText = "🔊" - this.#volumeRange!.value = this.previousVolume.toString() - }) + if (!this.#volumeButton) return + this.#volumeButton.ariaLabel = "Mute" + this.#volumeButton.innerText = "🔊" + this.#volumeRange!.value = this.previousVolume.toString() + }) : Promise.resolve() } public mute(): Promise { return this.player ? this.player.mute(true).then(() => { - if (!this.#volumeButton) return - this.#volumeButton.ariaLabel = "Unmute" - this.#volumeButton.innerText = "🔇" - this.previousVolume = parseFloat(this.#volumeRange!.value) - this.#volumeRange!.value = "0" - }) + if (!this.#volumeButton) return + this.#volumeButton.ariaLabel = "Unmute" + this.#volumeButton.innerText = "🔇" + this.previousVolume = parseFloat(this.#volumeRange!.value) + this.#volumeRange!.value = "0" + }) : Promise.resolve() } @@ -693,7 +721,6 @@ export class VideoMoq extends HTMLElement { } } } - // Register the custom element customElements.define("video-moq", VideoMoq) export default VideoMoq diff --git a/package-lock.json b/package-lock.json index 11b4ae8..9752194 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,5 @@ { "name": "moq-js", - "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { @@ -17,7 +16,7 @@ }, "lib": { "name": "@moq-js/player", - "version": "0.2.0", + "version": "0.4.3", "license": "(MIT OR Apache-2.0)", "dependencies": { "mp4box": "^0.5.2" @@ -64,23 +63,84 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", + "node_modules/@astrojs/cloudflare": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-8.1.0.tgz", + "integrity": "sha512-RSkthOcw1/ZAA9PhSX9LEWRvbyLJ/vTJCv8nJ4LxBqMlR5j7Lt6LnQP0hI/LAlDHgnG1Hc4Hd7tB2SF85OivJw==", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@astrojs/underscore-redirects": "^0.3.3", + "@cloudflare/workers-types": "^4.20231025.0", + "@iarna/toml": "^2.2.5", + "dotenv": "^16.3.1", + "esbuild": "^0.19.5", + "find-up": "^6.3.0", + "miniflare": "3.20231030.2", + "tiny-glob": "^0.2.9" + }, + "peerDependencies": { + "astro": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/@astrojs/cloudflare/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@astrojs/cloudflare/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@astrojs/cloudflare/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@astrojs/cloudflare/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/@astrojs/compiler": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.3.tgz", - "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", "license": "MIT" }, "node_modules/@astrojs/internal-helpers": { @@ -157,15 +217,15 @@ } }, "node_modules/@astrojs/prism": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.2.0.tgz", - "integrity": "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", "license": "MIT", "dependencies": { - "prismjs": "^1.29.0" + "prismjs": "^1.30.0" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=22.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, "node_modules/@astrojs/solid-js": { @@ -184,13 +244,13 @@ } }, "node_modules/@astrojs/tailwind": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.3.tgz", - "integrity": "sha512-XF7WhXRhqEHGvADqc0kDtF7Yv/g4wAWTaj91jBBTBaYnc4+MQLH94duFfFa4NlTkRG40VQd012eF3MhO3Kk+bg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.5.tgz", + "integrity": "sha512-1diguZEau7FZ9vIjzE4BwavGdhD3+JkdS8zmibl1ene+EHgIU5hI0NMgRYG3yea+Niaf7cyMwjeWeLvzq/maxg==", "license": "MIT", "dependencies": { "autoprefixer": "^10.4.20", - "postcss": "^8.4.49", + "postcss": "^8.5.1", "postcss-load-config": "^4.0.2" }, "peerDependencies": { @@ -216,45 +276,51 @@ "node": ">=18.14.1" } }, + "node_modules/@astrojs/underscore-redirects": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@astrojs/underscore-redirects/-/underscore-redirects-0.3.4.tgz", + "integrity": "sha512-vYuYtIrTwxFlDRIhuekscorsHdLL8Hr3mgOczfM1tRWVPn54dDNcKG0DmfL4DlC5YJRoqVaVdUs508Hw643NTw==", + "license": "MIT" + }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -279,15 +345,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -295,25 +361,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -332,18 +398,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -364,14 +430,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -392,58 +458,67 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -453,37 +528,37 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -493,15 +568,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -511,81 +586,81 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -595,14 +670,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -612,13 +687,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -628,13 +703,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -644,15 +719,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -662,14 +737,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -692,13 +767,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -708,13 +783,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -724,12 +799,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -739,13 +814,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -772,13 +847,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -788,15 +863,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -806,15 +881,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -824,13 +899,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -840,13 +915,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -856,14 +931,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -873,14 +948,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -890,18 +965,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -911,14 +986,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -928,13 +1003,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -944,14 +1020,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -961,13 +1037,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -977,14 +1053,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -994,13 +1070,30 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1010,13 +1103,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1026,13 +1119,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1042,14 +1135,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1059,15 +1152,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1077,13 +1170,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1093,13 +1186,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1109,13 +1202,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1125,13 +1218,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1141,14 +1234,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1158,14 +1251,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1175,16 +1268,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1194,14 +1287,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1211,14 +1304,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1228,13 +1321,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1244,13 +1337,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1260,13 +1353,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1276,15 +1369,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1294,14 +1389,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1311,13 +1406,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1327,14 +1422,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1344,13 +1439,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1360,14 +1455,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1377,15 +1472,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1395,13 +1490,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1411,16 +1506,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1430,14 +1525,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1447,14 +1541,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1464,13 +1558,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1480,13 +1574,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1496,14 +1590,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1513,13 +1607,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1529,13 +1623,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1545,13 +1639,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1561,17 +1655,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1581,13 +1675,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1597,14 +1691,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1614,14 +1708,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1631,14 +1725,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1648,80 +1742,81 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1757,17 +1852,17 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1776,64 +1871,137 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20231030.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20231030.0.tgz", + "integrity": "sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20231030.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20231030.0.tgz", + "integrity": "sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20231030.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20231030.0.tgz", + "integrity": "sha512-2HUeRTvoCC17fxE0qdBeR7J9dO8j4A8ZbdcvY8pZxdk+zERU6+N03RTbk/dQMU488PwiDvcC3zZqS4gwLfVT8g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20231030.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20231030.0.tgz", + "integrity": "sha512-4/GK5zHh+9JbUI6Z5xTCM0ZmpKKHk7vu9thmHjUxtz+o8Ne9DoD7DlDvXQWgMF6XGaTubDWyp3ttn+Qv8jDFuQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20231030.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20231030.0.tgz", + "integrity": "sha512-fb/Jgj8Yqy3PO1jLhk7mTrHMkR8jklpbQFud6rL/aMAn5d6MQbaSrYOCjzkKGp0Zng8D2LIzSl+Fc0C9Sggxjg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workers-types": { + "version": "4.20251111.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251111.0.tgz", + "integrity": "sha512-C8BgQRJlnxcUGycNr8pSKs7WBDQwc43p3pnuGv+Lc0KR2y6raR/9Rs7/lPqQ086ECYSiNqU6IPcbeszKbg4LXA==", + "license": "MIT OR Apache-2.0" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", @@ -2203,9 +2371,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -2222,9 +2390,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -2255,35 +2423,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", @@ -2294,6 +2433,15 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -2332,6 +2480,12 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "license": "ISC" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2367,17 +2521,23 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -2389,19 +2549,10 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2410,15 +2561,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2493,161 +2644,6 @@ "node": ">= 8" } }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^8.3.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", - "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.5.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", - "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.5.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5" - } - }, - "node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", - "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "11.3.1", - "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "13.2.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.2.tgz", - "integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^22.2.0" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2659,9 +2655,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", "dev": true, "license": "MIT", "engines": { @@ -2672,9 +2668,9 @@ } }, "node_modules/@rollup/plugin-babel": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", - "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz", + "integrity": "sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==", "dev": true, "license": "MIT", "dependencies": { @@ -2699,9 +2695,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", - "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", + "version": "28.0.9", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.9.tgz", + "integrity": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==", "dev": true, "license": "MIT", "dependencies": { @@ -2781,9 +2777,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", - "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz", + "integrity": "sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==", "dev": true, "license": "MIT", "dependencies": { @@ -2808,9 +2804,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2838,9 +2834,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", "cpu": [ "arm" ], @@ -2852,9 +2848,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", "cpu": [ "arm64" ], @@ -2866,9 +2862,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", "cpu": [ "arm64" ], @@ -2880,9 +2876,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", "cpu": [ "x64" ], @@ -2894,9 +2890,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", "cpu": [ "arm64" ], @@ -2908,9 +2904,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", "cpu": [ "x64" ], @@ -2922,9 +2918,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", "cpu": [ "arm" ], @@ -2936,9 +2932,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", "cpu": [ "arm" ], @@ -2950,9 +2946,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", "cpu": [ "arm64" ], @@ -2964,9 +2960,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", "cpu": [ "arm64" ], @@ -2977,10 +2973,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", "cpu": [ "loong64" ], @@ -2991,10 +2987,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", "cpu": [ "ppc64" ], @@ -3006,9 +3002,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", "cpu": [ "riscv64" ], @@ -3020,9 +3030,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", "cpu": [ "s390x" ], @@ -3034,9 +3044,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", "cpu": [ "x64" ], @@ -3048,9 +3058,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", "cpu": [ "x64" ], @@ -3061,10 +3071,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", "cpu": [ "arm64" ], @@ -3076,9 +3100,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", "cpu": [ "ia32" ], @@ -3089,10 +3113,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", "cpu": [ "x64" ], @@ -3104,30 +3142,27 @@ ] }, "node_modules/@tailwindcss/forms": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.9.tgz", - "integrity": "sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", + "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", "license": "MIT", "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "node_modules/@tailwindcss/typography": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", - "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", "license": "MIT", "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "node_modules/@types/acorn": { @@ -3160,9 +3195,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -3179,12 +3214,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/debug": { @@ -3197,9 +3232,9 @@ } }, "node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.10.tgz", - "integrity": "sha512-zUxMN2iShu7p3Fz5sqfvLp93qW/3sLs+RwXWWOkMb969hsuoVqUUokqrENjXqTMNmEEcVXKoHuMMbIGcWyrVVA==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.11.tgz", + "integrity": "sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3207,15 +3242,15 @@ } }, "node_modules/@types/dom-webcodecs": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.13.tgz", - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==", + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.16.tgz", + "integrity": "sha512-gRNWaC3YW5EzhPRjVYy7BnxCbtLGqsgu+uTkmV/IxOF1bllFD+FAJ1KBdsDFsuJB+F+CE+nWmMlWt8vaZ3yYXA==", "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -3259,9 +3294,9 @@ "license": "MIT" }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, "node_modules/@types/nlcst": { @@ -3287,9 +3322,9 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, @@ -3336,9 +3371,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3467,9 +3502,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3493,9 +3528,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3532,9 +3567,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3571,9 +3606,9 @@ "license": "Apache-2.0" }, "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, "node_modules/accepts": { @@ -3590,9 +3625,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3610,6 +3645,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3678,9 +3725,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -3756,14 +3803,14 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -3779,18 +3826,20 @@ "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3879,6 +3928,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "license": "MIT", + "dependencies": { + "printable-characters": "^1.0.42" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -4046,9 +4104,9 @@ } }, "node_modules/astro-eslint-parser/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -4059,9 +4117,9 @@ } }, "node_modules/astro/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4089,6 +4147,16 @@ "@astrojs/compiler": ">=0.27.0" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4109,9 +4177,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "funding": [ { "type": "opencollective", @@ -4128,11 +4196,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -4162,9 +4230,9 @@ } }, "node_modules/axe-core": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", - "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", "dev": true, "license": "MPL-2.0", "engines": { @@ -4172,13 +4240,13 @@ } }, "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", + "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -4193,24 +4261,31 @@ } }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "license": "Apache-2.0", - "optional": true + "optional": true, + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/babel-plugin-jsx-dom-expressions": { - "version": "0.39.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.39.3.tgz", - "integrity": "sha512-6RzmSu21zYPlV2gNwzjGG9FgODtt9hIWnx7L//OIioIEuRcnpDZoY8Tr+I81Cy1SrH4qoDyKpwHHo6uAMAeyPA==", + "version": "0.40.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.3.tgz", + "integrity": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", - "parse5": "^7.1.2", - "validate-html-nesting": "^1.2.1" + "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" @@ -4228,27 +4303,39 @@ "node": ">=6.9.0" } }, + "node_modules/babel-plugin-jsx-dom-expressions/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/babel-plugin-jsx-dom-expressions/node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", - "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -4266,42 +4353,48 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", - "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-preset-solid": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.3.tgz", - "integrity": "sha512-jvlx5wDp8s+bEF9sGFw/84SInXOA51ttkUEroQziKMbxplXThVKt83qB6bDTa1HuLNatdU9FHpFOiQWs1tLQIg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz", + "integrity": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==", "license": "MIT", "dependencies": { - "babel-plugin-jsx-dom-expressions": "^0.39.3" + "babel-plugin-jsx-dom-expressions": "^0.40.3" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0", + "solid-js": "^1.9.10" + }, + "peerDependenciesMeta": { + "solid-js": { + "optional": true + } } }, "node_modules/bail": { @@ -4321,49 +4414,95 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.1.tgz", + "integrity": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==", "license": "Apache-2.0", - "optional": true + "optional": true, + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.0.tgz", + "integrity": "sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ==", "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } } }, "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", "license": "Apache-2.0", - "optional": true + "optional": true, + "engines": { + "bare": ">=1.14.0" + } }, "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-os": "^2.1.0" + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, - "node_modules/bare-stream": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz", - "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==", + "node_modules/bare-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", "license": "Apache-2.0", "optional": true, "dependencies": { - "streamx": "^2.21.0" + "bare-path": "^3.0.0" } }, "node_modules/base64-js": { @@ -4386,11 +4525,14 @@ ], "license": "MIT" }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0" + "node_modules/baseline-browser-mapping": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", + "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } }, "node_modules/binary-extensions": { "version": "2.3.0", @@ -4477,9 +4619,9 @@ } }, "node_modules/boxen/node_modules/chalk": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz", - "integrity": "sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -4506,9 +4648,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -4529,9 +4671,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "funding": [ { "type": "opencollective", @@ -4548,10 +4690,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -4588,7 +4731,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "devOptional": true, "license": "MIT" }, "node_modules/bytes": { @@ -4620,9 +4762,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4633,13 +4775,13 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -4680,9 +4822,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001753", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", + "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", "funding": [ { "type": "opencollective", @@ -4699,6 +4841,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/capnp-ts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", + "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1", + "tslib": "^2.2.0" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -5014,13 +5166,13 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -5165,16 +5317,22 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "license": "MIT" + }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5184,21 +5342,21 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { @@ -5220,9 +5378,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5237,9 +5395,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -5356,12 +5514,6 @@ "node": ">= 0.8" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC" - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -5382,9 +5534,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, "engines": { @@ -5473,6 +5625,18 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dset": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", @@ -5509,9 +5673,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.74", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", - "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", + "version": "1.5.244", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", + "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -5530,9 +5694,9 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "optional": true, "dependencies": { @@ -5543,6 +5707,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -5552,9 +5717,9 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5562,28 +5727,29 @@ } }, "node_modules/es-abstract": { - "version": "1.23.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.6.tgz", - "integrity": "sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", + "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.7", - "get-intrinsic": "^1.2.6", - "get-symbol-description": "^1.0.2", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", @@ -5591,31 +5757,36 @@ "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.4", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.3", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.0.0", - "object-inspect": "^1.13.3", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.3", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.16" + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -5643,15 +5814,15 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -5661,28 +5832,31 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -5824,9 +5998,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, "license": "MIT", "bin": { @@ -5905,14 +6079,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5923,7 +6097,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -5935,6 +6109,35 @@ } } }, + "node_modules/eslint-plugin-prettier/node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/eslint-plugin-prettier/node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/eslint-plugin-solid": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/eslint-plugin-solid/-/eslint-plugin-solid-0.13.2.tgz", @@ -6090,22 +6293,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6175,19 +6362,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6372,6 +6546,16 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -6454,6 +6638,18 @@ "node": ">= 8" } }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -6625,16 +6821,16 @@ "optional": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -6655,20 +6851,23 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -6778,16 +6977,16 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -6805,22 +7004,28 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -6890,13 +7095,15 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -6972,13 +7179,14 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.7.tgz", - "integrity": "sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", @@ -7001,6 +7209,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7011,21 +7229,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "math-intrinsics": "^1.0.0" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7034,6 +7252,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "license": "Unlicense", + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/get-source/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -7111,13 +7361,39 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -7137,6 +7413,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "license": "MIT" + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -7158,6 +7440,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -7288,7 +7576,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -7514,9 +7801,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-errors": { @@ -7594,9 +7881,9 @@ "license": "ISC" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7735,13 +8022,17 @@ "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7779,13 +8070,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -7832,9 +8123,9 @@ } }, "node_modules/is-core-module": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", - "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -7950,13 +8241,17 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8258,13 +8553,13 @@ } }, "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -8611,12 +8906,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "license": "MIT" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -8624,12 +8913,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -8653,9 +8936,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz", - "integrity": "sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -8684,12 +8967,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/markdown-extensions": { @@ -8742,9 +9025,9 @@ "license": "MIT" }, "node_modules/mdast-util-definitions/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -8770,9 +9053,9 @@ } }, "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -10084,7 +10367,33 @@ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "license": "MIT", "bin": { - "mini-svg-data-uri": "cli.js" + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/miniflare": { + "version": "3.20231030.2", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20231030.2.tgz", + "integrity": "sha512-+DYdMqWlUaY4wBylIjewNu8OVsPFquYjQkxoSb2jGIMBmlKaef65Hn2Bu8sub5tQzQ8tLO0FRklmD2Upx0HCCQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "source-map-support": "0.5.21", + "stoppable": "^1.1.0", + "undici": "^5.22.1", + "workerd": "1.20231030.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" } }, "node_modules/minimatch": { @@ -10126,14 +10435,10 @@ "license": "MIT", "optional": true }, - "node_modules/moq-player": { - "resolved": "lib", - "link": true - }, "node_modules/mp4box": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mp4box/-/mp4box-0.5.3.tgz", - "integrity": "sha512-RIvyFZdPDIg3+mL6vUdPBSyQRrEfKO3ryAeJ4xJJV7HBHQUH3KfLlZRzfSpBHCd/HqR63HfbrWQI/CwXDvYENQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mp4box/-/mp4box-0.5.4.tgz", + "integrity": "sha512-GcCH0fySxBurJtvr0dfhz0IxHZjc1RP+F+I8xw+LIwkU1a+7HJx8NCDiww1I5u4Hz6g4eR1JlGADEGJ9r4lSfA==", "license": "BSD-3-Clause" }, "node_modules/mri": { @@ -10151,6 +10456,15 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -10163,9 +10477,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -10181,9 +10495,9 @@ } }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT", "optional": true }, @@ -10250,9 +10564,9 @@ } }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.80.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.80.0.tgz", + "integrity": "sha512-LyPuZJcI9HVwzXK1GPxWNzrr+vr8Hp/3UqlmWxxh8p54U1ZbclOqbSog9lWHaCX+dBaiGi6n/hIX+mKu74GmPA==", "license": "MIT", "optional": true, "dependencies": { @@ -10263,9 +10577,9 @@ } }, "node_modules/node-abi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "optional": true, "bin": { @@ -10283,15 +10597,15 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/nodemon": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", - "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "dev": true, "license": "MIT", "dependencies": { @@ -10318,9 +10632,9 @@ } }, "node_modules/nodemon/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -10433,9 +10747,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -10529,6 +10843,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -10591,9 +10906,9 @@ } }, "node_modules/ora/node_modules/chalk": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz", - "integrity": "sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -10602,6 +10917,24 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", @@ -10891,9 +11224,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -10927,9 +11260,9 @@ } }, "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "license": "MIT", "engines": { "node": ">= 6" @@ -11000,9 +11333,9 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -11010,9 +11343,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -11029,7 +11362,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -11055,9 +11388,19 @@ } }, "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" @@ -11065,10 +11408,6 @@ "engines": { "node": "^12 || ^14 || >= 16" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.4.21" } @@ -11166,9 +11505,9 @@ "license": "MIT" }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "license": "MIT", "optional": true, "dependencies": { @@ -11177,7 +11516,7 @@ "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -11230,9 +11569,9 @@ } }, "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", "optional": true, "dependencies": { @@ -11285,9 +11624,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { @@ -11420,10 +11759,16 @@ } } }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "license": "Unlicense" + }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { "node": ">=6" @@ -11508,9 +11853,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", "optional": true, "dependencies": { @@ -11563,13 +11908,6 @@ ], "license": "MIT" }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "license": "MIT", - "optional": true - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11702,19 +12040,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", - "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" }, "engines": { @@ -11732,9 +12070,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -11744,33 +12082,18 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -11781,18 +12104,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -11806,31 +12129,18 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/rehype": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", @@ -12002,9 +12312,9 @@ "license": "MIT" }, "node_modules/remark-smartypants/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -12030,9 +12340,9 @@ } }, "node_modules/remark-smartypants/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -12044,12 +12354,12 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12183,9 +12493,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -12210,13 +12520,13 @@ } }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -12226,36 +12536,39 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-dts": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz", - "integrity": "sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.2.3.tgz", + "integrity": "sha512-UgnEsfciXSPpASuOelix7m4DrmyQgiaWBnvI0TM4GxuDh5FkqW8E5hu57bCxXB90VvR1WNfLV80yEDN18UogSA==", "dev": true, "license": "LGPL-3.0-only", "dependencies": { - "magic-string": "^0.30.10" + "magic-string": "^0.30.17" }, "engines": { "node": ">=16" @@ -12264,7 +12577,7 @@ "url": "https://github.com/sponsors/Swatinem" }, "optionalDependencies": { - "@babel/code-frame": "^7.24.2" + "@babel/code-frame": "^7.27.1" }, "peerDependencies": { "rollup": "^3.29.4 || ^4", @@ -12446,6 +12759,23 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -12580,18 +12910,18 @@ } }, "node_modules/seroval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", - "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", + "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.1.1.tgz", - "integrity": "sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.3.tgz", + "integrity": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==", "license": "MIT", "engines": { "node": ">=10" @@ -12715,6 +13045,21 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12746,9 +13091,9 @@ } }, "node_modules/sharp/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "optional": true, "bin": { @@ -12782,9 +13127,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -12798,7 +13143,7 @@ "version": "0.6.13", "resolved": "https://registry.npmjs.org/shikiji/-/shikiji-0.6.13.tgz", "integrity": "sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==", - "deprecated": "Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates", + "deprecated": "Deprecated, use shiki instead", "license": "MIT", "dependencies": { "hast-util-to-html": "^9.0.0" @@ -12820,9 +13165,9 @@ "license": "MIT" }, "node_modules/shikiji/node_modules/hast-util-to-html": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", - "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -12832,7 +13177,7 @@ "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -12960,9 +13305,9 @@ "license": "MIT" }, "node_modules/shikiji/node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -12975,10 +13320,20 @@ ], "license": "MIT" }, + "node_modules/shikiji/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/shikiji/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -13030,9 +13385,9 @@ } }, "node_modules/shikiji/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -13058,9 +13413,9 @@ } }, "node_modules/shikiji/node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -13207,9 +13562,9 @@ "link": true }, "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "license": "MIT", "optional": true, "dependencies": { @@ -13217,9 +13572,9 @@ } }, "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", "license": "MIT", "optional": true }, @@ -13237,9 +13592,9 @@ } }, "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -13273,14 +13628,14 @@ "license": "MIT" }, "node_modules/solid-js": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.3.tgz", - "integrity": "sha512-5ba3taPoZGt9GY3YlsCB24kCg0Lv/rie/HTD4kG6h4daZZz7+yK02xn8Vx8dLYBc9i6Ps5JwAbEiqjmKaLB3Ag==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", + "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", "license": "MIT", "dependencies": { "csstype": "^3.1.0", - "seroval": "^1.1.0", - "seroval-plugins": "^1.1.0" + "seroval": "~1.3.0", + "seroval-plugins": "~1.3.0" } }, "node_modules/solid-refresh": { @@ -13298,12 +13653,12 @@ } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -13331,7 +13686,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "devOptional": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -13342,7 +13696,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -13388,9 +13741,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "dev": true, "license": "CC0-1.0" }, @@ -13400,6 +13753,16 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "license": "Unlicense", + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -13424,6 +13787,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, "node_modules/stream-parser": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", @@ -13449,18 +13836,15 @@ "license": "MIT" }, "node_modules/streamx": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", - "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", "optional": true, "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -13532,9 +13916,9 @@ } }, "node_modules/string-width/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, "node_modules/string.prototype.includes": { @@ -13645,9 +14029,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -13757,9 +14141,9 @@ } }, "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -13836,9 +14220,9 @@ } }, "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", + "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", "dev": true, "license": "MIT", "dependencies": { @@ -13853,9 +14237,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -13866,7 +14250,7 @@ "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.6", + "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", @@ -13875,7 +14259,7 @@ "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", @@ -13915,9 +14299,9 @@ } }, "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "license": "MIT", "optional": true, "dependencies": { @@ -13925,8 +14309,8 @@ "tar-stream": "^3.1.5" }, "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { @@ -13942,14 +14326,14 @@ } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -14005,6 +14389,16 @@ "node": ">=0.8" } }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "license": "MIT", + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14076,9 +14470,9 @@ "license": "Apache-2.0" }, "node_modules/tsconfck": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.4.tgz", - "integrity": "sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "license": "MIT", "bin": { "tsconfck": "bin/tsconfck.js" @@ -14099,7 +14493,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, "license": "0BSD" }, "node_modules/tunnel-agent": { @@ -14232,9 +14625,9 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -14271,6 +14664,18 @@ "dev": true, "license": "MIT" }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/unherit": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", @@ -14306,9 +14711,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", "engines": { @@ -14316,9 +14721,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", "engines": { @@ -14476,12 +14881,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "license": "ISC" - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14492,9 +14891,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "funding": [ { "type": "opencollective", @@ -14512,7 +14911,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -14579,12 +14978,6 @@ "node": ">=8" } }, - "node_modules/validate-html-nesting": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/validate-html-nesting/-/validate-html-nesting-1.2.2.tgz", - "integrity": "sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==", - "license": "ISC" - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -14650,9 +15043,9 @@ } }, "node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "license": "MIT", "dependencies": { "esbuild": "^0.18.10", @@ -14711,15 +15104,14 @@ "license": "MIT" }, "node_modules/vite-plugin-mkcert": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.6.tgz", - "integrity": "sha512-4JR1RN0HEg/w17eRQJ/Ve2pSa6KCVQcQO6yKtIaKQCFDyd63zGfXHWpygBkvvRSpqa0GcqNKf0fjUJ0HiJQXVQ==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.9.tgz", + "integrity": "sha512-SwI7yqp2Cq4r2XItarnHRCj2uzHPqevbxFNMLpyN+LDXd5w1vmZeM4l5X/wCZoP4mjPQYN+9+4kmE6e3nPO5fg==", "license": "MIT", "dependencies": { - "@octokit/rest": "^20.1.1", - "axios": "^1.7.4", - "debug": "^4.3.6", - "picocolors": "^1.0.1" + "axios": "^1.12.2", + "debug": "^4.4.3", + "picocolors": "^1.1.1" }, "engines": { "node": ">=v16.7.0" @@ -14729,9 +15121,9 @@ } }, "node_modules/vite-plugin-solid": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.0.tgz", - "integrity": "sha512-G+NiwDj4EAeUE0wt3Ur9f+Lt9oMUuLd0FIxYuqwJSqRacKQRteCwUFzNy8zMEt88xWokngQhiFjfJMhjc1fDXw==", + "version": "2.11.10", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.10.tgz", + "integrity": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==", "license": "MIT", "dependencies": { "@babel/core": "^7.23.3", @@ -14744,7 +15136,7 @@ "peerDependencies": { "@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*", "solid-js": "^1.7.2", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "peerDependenciesMeta": { "@testing-library/jest-dom": { @@ -14753,16 +15145,17 @@ } }, "node_modules/vite-plugin-solid/node_modules/vitefu": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.4.tgz", - "integrity": "sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", "license": "MIT", "workspaces": [ "tests/deps/*", - "tests/projects/*" + "tests/projects/*", + "tests/projects/workspace/packages/*" ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "peerDependenciesMeta": { "vite": { @@ -15306,16 +15699,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -15368,6 +15762,26 @@ "node": ">=0.10.0" } }, + "node_modules/workerd": { + "version": "1.20231030.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20231030.0.tgz", + "integrity": "sha512-+FSW+d31f8RrjHanFf/R9A+Z0csf3OtsvzdPmAKuwuZm/5HrBv83cvG9fFeTxl7/nI6irUUXIRF9xcj/NomQzQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20231030.0", + "@cloudflare/workerd-darwin-arm64": "1.20231030.0", + "@cloudflare/workerd-linux-64": "1.20231030.0", + "@cloudflare/workerd-linux-arm64": "1.20231030.0", + "@cloudflare/workerd-windows-64": "1.20231030.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -15478,9 +15892,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -15510,8 +15924,30 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true, "license": "ISC" }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -15519,15 +15955,15 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs-parser": { @@ -15540,9 +15976,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -15551,10 +15987,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/youch": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", + "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", + "license": "MIT", + "dependencies": { + "cookie": "^0.7.1", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/youch/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/zod": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -15583,32 +16039,19 @@ "nodemon": "^3.0.1" } }, - "simple-web": { - "name": "simple-moq-web", - "version": "1.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "cors": "^2.8.5", - "express": "^4.21.1", - "path": "^0.12.7" - }, - "devDependencies": { - "nodemon": "^3.0.1" - } - }, "web": { "version": "0.0.1", "dependencies": { + "@astrojs/cloudflare": "^8.1.0", "@astrojs/mdx": "^1.1.0", "@astrojs/node": "^6.0.1", "@astrojs/solid-js": "^3.0.1", "@astrojs/tailwind": "^5.0.0", + "@moq-js/player": "*", "@tailwindcss/forms": "^0.5.6", "@tailwindcss/typography": "^0.5.10", "@types/dom-webcodecs": "^0.1.8", "astro": "^3.2.0", - "moq-player": "*", "solid-js": "^1.4.3", "tailwindcss": "^3.0.24", "vite-plugin-cross-origin-isolation": "^0.1.6", diff --git a/package.json b/package.json index 88878a4..e6c444b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "scripts": { "dev:moq-player": "npm run dev --workspace=@moq-js/player", "dev:simple-moq-web": "npm run dev --workspace=simple-moq-web", - "dev": "npm-run-all --parallel dev:moq-player dev:simple-moq-web", + "start:demo": "node demo/server.cjs", + "dev": "npm-run-all --parallel dev:moq-player dev:simple-moq-web start:demo", "build": "npm run build --workspaces", "build-web": "npm run build --workspace=web", "dev-web": "npm run dev --workspace=web", @@ -19,4 +20,4 @@ "devDependencies": { "npm-run-all": "^4.1.5" } -} +} \ No newline at end of file diff --git a/samples/simple-player/simple-player.html b/samples/simple-player/simple-player.html index d1eaad0..ac4c78e 100644 --- a/samples/simple-player/simple-player.html +++ b/samples/simple-player/simple-player.html @@ -6,8 +6,9 @@