@osmo.inc/cli 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEPLOY.md +87 -0
- package/README.md +243 -0
- package/RELEASE.md +164 -0
- package/SETUP.md +60 -0
- package/THIRD_PARTY_NOTICES.md +18 -0
- package/bin/osmo.mjs +12 -0
- package/dist/osmo.js +7817 -0
- package/node_modules/@esbuild/darwin-arm64/README.md +3 -0
- package/node_modules/@esbuild/darwin-arm64/bin/esbuild +0 -0
- package/node_modules/@esbuild/darwin-arm64/package.json +20 -0
- package/node_modules/esbuild/LICENSE.md +21 -0
- package/node_modules/esbuild/README.md +3 -0
- package/node_modules/esbuild/bin/esbuild +223 -0
- package/node_modules/esbuild/install.js +289 -0
- package/node_modules/esbuild/lib/main.d.ts +716 -0
- package/node_modules/esbuild/lib/main.js +2532 -0
- package/node_modules/esbuild/package.json +49 -0
- package/node_modules/fflate/LICENSE +21 -0
- package/node_modules/fflate/esm/index.mjs +2710 -0
- package/node_modules/fflate/package.json +128 -0
- package/node_modules/typescript/LICENSE.txt +55 -0
- package/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
- package/node_modules/typescript/lib/lib.d.ts +22 -0
- package/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
- package/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
- package/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
- package/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
- package/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
- package/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
- package/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
- package/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
- package/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
- package/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
- package/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
- package/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
- package/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
- package/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
- package/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
- package/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
- package/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
- package/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
- package/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
- package/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
- package/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
- package/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
- package/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
- package/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
- package/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
- package/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
- package/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
- package/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
- package/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
- package/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
- package/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
- package/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
- package/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
- package/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
- package/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
- package/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
- package/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
- package/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
- package/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
- package/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
- package/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
- package/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
- package/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
- package/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
- package/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
- package/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
- package/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
- package/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
- package/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
- package/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
- package/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
- package/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
- package/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
- package/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
- package/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
- package/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
- package/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
- package/node_modules/typescript/lib/lib.es6.d.ts +23 -0
- package/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
- package/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
- package/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
- package/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
- package/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
- package/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
- package/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
- package/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
- package/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
- package/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
- package/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
- package/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
- package/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
- package/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
- package/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
- package/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
- package/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
- package/node_modules/typescript/lib/typescript.js +382 -0
- package/node_modules/typescript/package.json +57 -0
- package/package.json +54 -0
- package/release.json +136 -0
- package/runtime/apps/native/tools/compile.mjs +217 -0
- package/runtime/packages/scene/scripts/validate-strict.mjs +246 -0
- package/runtime/packages/scene/src/clip.d.mts +14 -0
- package/runtime/packages/scene/src/clip.mjs +15 -0
- package/runtime/packages/scene/src/color-value.d.mts +5 -0
- package/runtime/packages/scene/src/color-value.mjs +19 -0
- package/runtime/packages/scene/src/color.ts +1 -0
- package/runtime/packages/scene/src/effects.ts +213 -0
- package/runtime/packages/scene/src/elements.ts +491 -0
- package/runtime/packages/scene/src/evaluate.ts +919 -0
- package/runtime/packages/scene/src/index.ts +69 -0
- package/runtime/packages/scene/src/jsx-runtime.ts +73 -0
- package/runtime/packages/scene/src/knob-schema.ts +115 -0
- package/runtime/packages/scene/src/knobs.ts +118 -0
- package/runtime/packages/scene/src/mask.d.mts +6 -0
- package/runtime/packages/scene/src/mask.mjs +17 -0
- package/runtime/packages/scene/src/metadata.d.mts +23 -0
- package/runtime/packages/scene/src/metadata.mjs +44 -0
- package/runtime/packages/scene/src/motion-sampling.d.mts +2 -0
- package/runtime/packages/scene/src/motion-sampling.mjs +50 -0
- package/runtime/packages/scene/src/motion.ts +121 -0
- package/runtime/packages/scene/src/shader.ts +57 -0
- package/src/resource-examples/example-image/landscape.svg +7 -0
- package/src/resource-examples/example-image/resource.json +8 -0
- package/src/resource-examples/example-model/gem.glb +0 -0
- package/src/resource-examples/example-model/preview.svg +1 -0
- package/src/resource-examples/example-model/resource.json +7 -0
- package/src/resource-examples/example-scene/resource.json +1 -0
- package/src/resource-examples/example-scene/scene.tsx +8 -0
- package/src/resource-examples/example-shader/effect.wgsl +7 -0
- package/src/resource-examples/example-shader/preview.svg +1 -0
- package/src/resource-examples/example-shader/resource.json +27 -0
- package/src/resource-examples/example-shader/tint.wgsl +7 -0
- package/src/resource-examples/example-video/ambient.mp4 +0 -0
- package/src/resource-examples/example-video/resource.json +9 -0
- package/src/starter/scene.tsx +20 -0
- package/studio/index.html +2 -0
- package/studio/public/check-circle-filled.svg +3 -0
- package/studio/public/comment-cursor/active-outer.svg +3 -0
- package/studio/public/comment-cursor/default.svg +6 -0
- package/studio/public/osmo-studio-logo.svg +12 -0
- package/studio/public/pencil-simple.svg +5 -0
- package/studio/src/active-outer-TVYUEURE.svg +3 -0
- package/studio/src/app.css +4 -0
- package/studio/src/app.js +705 -0
- package/studio/src/default-6CTRH4V5.svg +6 -0
- package/studio/src/engine_bg.wasm +0 -0
- package/studio/src/inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 +0 -0
- package/studio/src/inter-cyrillic-wght-normal-JEOLYBOO.woff2 +0 -0
- package/studio/src/inter-greek-ext-wght-normal-EOVOK2B5.woff2 +0 -0
- package/studio/src/inter-greek-wght-normal-IRE366VL.woff2 +0 -0
- package/studio/src/inter-latin-ext-wght-normal-HA22NDSG.woff2 +0 -0
- package/studio/src/inter-latin-wght-normal-NRMW37G5.woff2 +0 -0
- package/studio/src/inter-vietnamese-wght-normal-CE5GGD3W.woff2 +0 -0
- package/studio/src/osmo-studio-logo-D5R2V77B.svg +12 -0
- package/third-party/cargo/adler2@2.0.1/Cargo.toml +91 -0
- package/third-party/cargo/adler2@2.0.1/LICENSE-0BSD +12 -0
- package/third-party/cargo/adler2@2.0.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/adler2@2.0.1/LICENSE-MIT +23 -0
- package/third-party/cargo/allocator-api2@0.2.21/Cargo.toml +48 -0
- package/third-party/cargo/allocator-api2@0.2.21/LICENSE-APACHE +176 -0
- package/third-party/cargo/allocator-api2@0.2.21/LICENSE-MIT +23 -0
- package/third-party/cargo/arrayref@0.3.9/Cargo.toml +23 -0
- package/third-party/cargo/arrayref@0.3.9/LICENSE +26 -0
- package/third-party/cargo/arrayvec@0.7.8/Cargo.toml +112 -0
- package/third-party/cargo/arrayvec@0.7.8/LICENSE-APACHE +201 -0
- package/third-party/cargo/arrayvec@0.7.8/LICENSE-MIT +25 -0
- package/third-party/cargo/ascii@1.1.0/Cargo.toml +41 -0
- package/third-party/cargo/ascii@1.1.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/ascii@1.1.0/LICENSE-MIT +22 -0
- package/third-party/cargo/ash@0.38.0+1.3.281/Cargo.toml +66 -0
- package/third-party/cargo/ash@0.38.0+1.3.281/LICENSE-APACHE +67 -0
- package/third-party/cargo/ash@0.38.0+1.3.281/LICENSE-MIT +25 -0
- package/third-party/cargo/autocfg@1.5.1/Cargo.toml +75 -0
- package/third-party/cargo/autocfg@1.5.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/autocfg@1.5.1/LICENSE-MIT +25 -0
- package/third-party/cargo/base64@0.13.1/Cargo.toml +53 -0
- package/third-party/cargo/base64@0.13.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/base64@0.13.1/LICENSE-MIT +21 -0
- package/third-party/cargo/base64@0.22.1/Cargo.toml +85 -0
- package/third-party/cargo/base64@0.22.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/base64@0.22.1/LICENSE-MIT +21 -0
- package/third-party/cargo/bit-set@0.10.0/Cargo.toml +108 -0
- package/third-party/cargo/bit-set@0.10.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/bit-set@0.10.0/LICENSE-MIT +25 -0
- package/third-party/cargo/bit-vec@0.9.1/Cargo.toml +94 -0
- package/third-party/cargo/bit-vec@0.9.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/bit-vec@0.9.1/LICENSE-MIT +25 -0
- package/third-party/cargo/bitflags@2.13.0/Cargo.toml +120 -0
- package/third-party/cargo/bitflags@2.13.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/bitflags@2.13.0/LICENSE-MIT +25 -0
- package/third-party/cargo/block2@0.6.2/Cargo.toml +115 -0
- package/third-party/cargo/block2@0.6.2/MIT-terms.txt +22 -0
- package/third-party/cargo/block2@0.6.2/madsmtm-objc2-b4167b582b2f-LICENSE.md +34 -0
- package/third-party/cargo/bumpalo@3.20.3/Cargo.toml +99 -0
- package/third-party/cargo/bumpalo@3.20.3/LICENSE-APACHE +201 -0
- package/third-party/cargo/bumpalo@3.20.3/LICENSE-MIT +25 -0
- package/third-party/cargo/bytemuck@1.25.1/Cargo.toml +153 -0
- package/third-party/cargo/bytemuck@1.25.1/LICENSE-APACHE +61 -0
- package/third-party/cargo/bytemuck@1.25.1/LICENSE-MIT +9 -0
- package/third-party/cargo/bytemuck@1.25.1/LICENSE-ZLIB +11 -0
- package/third-party/cargo/bytemuck_derive@1.11.0/Cargo.toml +60 -0
- package/third-party/cargo/bytemuck_derive@1.11.0/LICENSE-APACHE +61 -0
- package/third-party/cargo/bytemuck_derive@1.11.0/LICENSE-MIT +9 -0
- package/third-party/cargo/bytemuck_derive@1.11.0/LICENSE-ZLIB +11 -0
- package/third-party/cargo/byteorder-lite@0.1.0/Cargo.toml +57 -0
- package/third-party/cargo/byteorder-lite@0.1.0/LICENSE-MIT +21 -0
- package/third-party/cargo/byteorder-lite@0.1.0/UNLICENSE +24 -0
- package/third-party/cargo/byteorder@1.5.0/COPYING +3 -0
- package/third-party/cargo/byteorder@1.5.0/Cargo.toml +54 -0
- package/third-party/cargo/byteorder@1.5.0/LICENSE-MIT +21 -0
- package/third-party/cargo/byteorder@1.5.0/UNLICENSE +24 -0
- package/third-party/cargo/cfg-if@1.0.4/Cargo.toml +47 -0
- package/third-party/cargo/cfg-if@1.0.4/LICENSE-APACHE +201 -0
- package/third-party/cargo/cfg-if@1.0.4/LICENSE-MIT +25 -0
- package/third-party/cargo/cfg_aliases@0.2.1/Cargo.toml +43 -0
- package/third-party/cargo/cfg_aliases@0.2.1/LICENSE +9 -0
- package/third-party/cargo/chunked_transfer@1.5.0/Cargo.toml +27 -0
- package/third-party/cargo/chunked_transfer@1.5.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/chunked_transfer@1.5.0/LICENSE-MIT +22 -0
- package/third-party/cargo/codespan-reporting@0.13.1/Cargo.toml +115 -0
- package/third-party/cargo/codespan-reporting@0.13.1/LICENSE +201 -0
- package/third-party/cargo/color_quant@1.1.0/Cargo.toml +20 -0
- package/third-party/cargo/color_quant@1.1.0/LICENSE +21 -0
- package/third-party/cargo/console_error_panic_hook@0.1.7/Cargo.toml +27 -0
- package/third-party/cargo/console_error_panic_hook@0.1.7/LICENSE-APACHE +201 -0
- package/third-party/cargo/console_error_panic_hook@0.1.7/LICENSE-MIT +25 -0
- package/third-party/cargo/core_maths@0.1.1/Cargo.toml +37 -0
- package/third-party/cargo/core_maths@0.1.1/LICENSE +21 -0
- package/third-party/cargo/cosmic-text@0.19.0/Cargo.toml +214 -0
- package/third-party/cargo/cosmic-text@0.19.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/cosmic-text@0.19.0/LICENSE-MIT +21 -0
- package/third-party/cargo/crc32fast@1.5.0/Cargo.toml +68 -0
- package/third-party/cargo/crc32fast@1.5.0/LICENSE-APACHE +202 -0
- package/third-party/cargo/crc32fast@1.5.0/LICENSE-MIT +21 -0
- package/third-party/cargo/data-url@0.3.2/Cargo.toml +63 -0
- package/third-party/cargo/data-url@0.3.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/data-url@0.3.2/LICENSE-MIT +25 -0
- package/third-party/cargo/dispatch2@0.3.1/Cargo.toml +122 -0
- package/third-party/cargo/dispatch2@0.3.1/MIT-terms.txt +22 -0
- package/third-party/cargo/dispatch2@0.3.1/madsmtm-objc2-8852b424193c-LICENSE.md +34 -0
- package/third-party/cargo/dlib@0.5.3/Cargo.toml +43 -0
- package/third-party/cargo/dlib@0.5.3/LICENSE.txt +19 -0
- package/third-party/cargo/document-features@0.2.12/Cargo.toml +51 -0
- package/third-party/cargo/document-features@0.2.12/LICENSE-APACHE +73 -0
- package/third-party/cargo/document-features@0.2.12/LICENSE-MIT +19 -0
- package/third-party/cargo/equivalent@1.0.2/Cargo.toml +37 -0
- package/third-party/cargo/equivalent@1.0.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/equivalent@1.0.2/LICENSE-MIT +25 -0
- package/third-party/cargo/errno@0.3.14/Cargo.toml +67 -0
- package/third-party/cargo/errno@0.3.14/LICENSE-APACHE +201 -0
- package/third-party/cargo/errno@0.3.14/LICENSE-MIT +25 -0
- package/third-party/cargo/etagere@0.3.0/Cargo.toml +57 -0
- package/third-party/cargo/etagere@0.3.0/LICENSE-APACHE +13 -0
- package/third-party/cargo/etagere@0.3.0/LICENSE-MIT +20 -0
- package/third-party/cargo/euclid@0.22.14/COPYRIGHT +5 -0
- package/third-party/cargo/euclid@0.22.14/Cargo.toml +66 -0
- package/third-party/cargo/euclid@0.22.14/LICENSE-APACHE +201 -0
- package/third-party/cargo/euclid@0.22.14/LICENSE-MIT +25 -0
- package/third-party/cargo/fastrand@2.5.0/Cargo.toml +89 -0
- package/third-party/cargo/fastrand@2.5.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/fastrand@2.5.0/LICENSE-MIT +23 -0
- package/third-party/cargo/fdeflate@0.3.7/Cargo.toml +55 -0
- package/third-party/cargo/fdeflate@0.3.7/LICENSE-APACHE +177 -0
- package/third-party/cargo/fdeflate@0.3.7/LICENSE-MIT +25 -0
- package/third-party/cargo/flate2@1.1.9/Cargo.toml +274 -0
- package/third-party/cargo/flate2@1.1.9/LICENSE-APACHE +201 -0
- package/third-party/cargo/flate2@1.1.9/LICENSE-MIT +25 -0
- package/third-party/cargo/float-cmp@0.9.0/Cargo.toml +39 -0
- package/third-party/cargo/float-cmp@0.9.0/LICENSE +19 -0
- package/third-party/cargo/float_next_after@1.0.0/Cargo.toml +43 -0
- package/third-party/cargo/float_next_after@1.0.0/LICENSE +23 -0
- package/third-party/cargo/foldhash@0.2.0/Cargo.toml +80 -0
- package/third-party/cargo/foldhash@0.2.0/LICENSE +19 -0
- package/third-party/cargo/font-types@0.11.3/Cargo.toml +55 -0
- package/third-party/cargo/font-types@0.11.3/LICENSE-APACHE +67 -0
- package/third-party/cargo/font-types@0.11.3/LICENSE-MIT +25 -0
- package/third-party/cargo/fontdb@0.23.0/Cargo.toml +83 -0
- package/third-party/cargo/fontdb@0.23.0/LICENSE +21 -0
- package/third-party/cargo/futures-core@0.3.32/Cargo.toml +66 -0
- package/third-party/cargo/futures-core@0.3.32/LICENSE-APACHE +202 -0
- package/third-party/cargo/futures-core@0.3.32/LICENSE-MIT +26 -0
- package/third-party/cargo/futures-task@0.3.32/Cargo.toml +58 -0
- package/third-party/cargo/futures-task@0.3.32/LICENSE-APACHE +202 -0
- package/third-party/cargo/futures-task@0.3.32/LICENSE-MIT +26 -0
- package/third-party/cargo/futures-util@0.3.32/Cargo.toml +181 -0
- package/third-party/cargo/futures-util@0.3.32/LICENSE-APACHE +202 -0
- package/third-party/cargo/futures-util@0.3.32/LICENSE-MIT +26 -0
- package/third-party/cargo/getrandom@0.4.3/Cargo.toml +165 -0
- package/third-party/cargo/getrandom@0.4.3/LICENSE-APACHE +201 -0
- package/third-party/cargo/getrandom@0.4.3/LICENSE-MIT +26 -0
- package/third-party/cargo/gif@0.14.2/Cargo.toml +84 -0
- package/third-party/cargo/gif@0.14.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/gif@0.14.2/LICENSE-MIT +21 -0
- package/third-party/cargo/glam@0.33.2/Cargo.toml +354 -0
- package/third-party/cargo/glam@0.33.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/glam@0.33.2/LICENSE-MIT +23 -0
- package/third-party/cargo/glow@0.17.0/Cargo.toml +122 -0
- package/third-party/cargo/glow@0.17.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/glow@0.17.0/LICENSE-MIT +23 -0
- package/third-party/cargo/glow@0.17.0/LICENSE-ZLIB +15 -0
- package/third-party/cargo/gltf-derive@1.4.1/Cargo.toml +34 -0
- package/third-party/cargo/gltf-derive@1.4.1/LICENSE-APACHE +202 -0
- package/third-party/cargo/gltf-derive@1.4.1/LICENSE-MIT +26 -0
- package/third-party/cargo/gltf-json@1.4.1/Cargo.toml +50 -0
- package/third-party/cargo/gltf-json@1.4.1/LICENSE-APACHE +202 -0
- package/third-party/cargo/gltf-json@1.4.1/LICENSE-MIT +26 -0
- package/third-party/cargo/gltf@1.4.1/Cargo.toml +122 -0
- package/third-party/cargo/gltf@1.4.1/LICENSE-APACHE +202 -0
- package/third-party/cargo/gltf@1.4.1/LICENSE-MIT +26 -0
- package/third-party/cargo/glyphon@0.12.0/Cargo.toml +35 -0
- package/third-party/cargo/glyphon@0.12.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/glyphon@0.12.0/LICENSE-MIT +23 -0
- package/third-party/cargo/glyphon@0.12.0/LICENSE-ZLIB +15 -0
- package/third-party/cargo/gpu-allocator@0.28.0/Cargo.toml +180 -0
- package/third-party/cargo/gpu-allocator@0.28.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/gpu-allocator@0.28.0/LICENSE-MIT +7 -0
- package/third-party/cargo/grid@1.0.1/Cargo.toml +77 -0
- package/third-party/cargo/grid@1.0.1/LICENSE +21 -0
- package/third-party/cargo/half@2.7.1/Cargo.toml +137 -0
- package/third-party/cargo/half@2.7.1/LICENSE-APACHE +176 -0
- package/third-party/cargo/half@2.7.1/LICENSE-MIT +19 -0
- package/third-party/cargo/harfrust@0.5.2/Cargo.toml +115 -0
- package/third-party/cargo/harfrust@0.5.2/harfbuzz-harfrust-efdae3142ab7-LICENSE +22 -0
- package/third-party/cargo/hashbrown@0.16.1/Cargo.toml +180 -0
- package/third-party/cargo/hashbrown@0.16.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/hashbrown@0.16.1/LICENSE-MIT +25 -0
- package/third-party/cargo/hashbrown@0.17.1/Cargo.toml +201 -0
- package/third-party/cargo/hashbrown@0.17.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/hashbrown@0.17.1/LICENSE-MIT +25 -0
- package/third-party/cargo/httpdate@1.0.3/Cargo.toml +35 -0
- package/third-party/cargo/httpdate@1.0.3/LICENSE-APACHE +201 -0
- package/third-party/cargo/httpdate@1.0.3/LICENSE-MIT +19 -0
- package/third-party/cargo/image-webp@0.2.4/Cargo.toml +63 -0
- package/third-party/cargo/image-webp@0.2.4/LICENSE-APACHE +177 -0
- package/third-party/cargo/image-webp@0.2.4/LICENSE-MIT +25 -0
- package/third-party/cargo/image@0.25.10/Cargo.toml +248 -0
- package/third-party/cargo/image@0.25.10/LICENSE-APACHE +177 -0
- package/third-party/cargo/image@0.25.10/LICENSE-MIT +25 -0
- package/third-party/cargo/imagesize@0.14.0/Cargo.toml +104 -0
- package/third-party/cargo/imagesize@0.14.0/LICENSE +21 -0
- package/third-party/cargo/indexmap@2.14.0/Cargo.toml +167 -0
- package/third-party/cargo/indexmap@2.14.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/indexmap@2.14.0/LICENSE-MIT +25 -0
- package/third-party/cargo/inflections@1.1.1/Cargo.toml +21 -0
- package/third-party/cargo/inflections@1.1.1/LICENSE +20 -0
- package/third-party/cargo/itoa@1.0.18/Cargo.toml +66 -0
- package/third-party/cargo/itoa@1.0.18/LICENSE-APACHE +176 -0
- package/third-party/cargo/itoa@1.0.18/LICENSE-MIT +23 -0
- package/third-party/cargo/js-sys@0.3.103/Cargo.toml +98 -0
- package/third-party/cargo/js-sys@0.3.103/LICENSE-APACHE +201 -0
- package/third-party/cargo/js-sys@0.3.103/LICENSE-MIT +25 -0
- package/third-party/cargo/khronos-egl@6.0.0/Cargo.toml +82 -0
- package/third-party/cargo/khronos-egl@6.0.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/khronos-egl@6.0.0/LICENSE-MIT +23 -0
- package/third-party/cargo/kurbo@0.13.1/Cargo.toml +230 -0
- package/third-party/cargo/kurbo@0.13.1/LICENSE-APACHE +202 -0
- package/third-party/cargo/kurbo@0.13.1/LICENSE-MIT +25 -0
- package/third-party/cargo/lazy_static@1.5.0/Cargo.toml +46 -0
- package/third-party/cargo/lazy_static@1.5.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/lazy_static@1.5.0/LICENSE-MIT +25 -0
- package/third-party/cargo/libc@0.2.186/Cargo.toml +229 -0
- package/third-party/cargo/libc@0.2.186/LICENSE-APACHE +176 -0
- package/third-party/cargo/libc@0.2.186/LICENSE-MIT +25 -0
- package/third-party/cargo/libloading@0.8.9/Cargo.toml +90 -0
- package/third-party/cargo/libloading@0.8.9/LICENSE +12 -0
- package/third-party/cargo/libm@0.2.16/Cargo.toml +61 -0
- package/third-party/cargo/libm@0.2.16/LICENSE.txt +258 -0
- package/third-party/cargo/linebender_resource_handle@0.1.1/Cargo.toml +107 -0
- package/third-party/cargo/linebender_resource_handle@0.1.1/LICENSE-APACHE +176 -0
- package/third-party/cargo/linebender_resource_handle@0.1.1/LICENSE-MIT +19 -0
- package/third-party/cargo/litrs@1.0.0/Cargo.toml +63 -0
- package/third-party/cargo/litrs@1.0.0/LICENSE-APACHE +176 -0
- package/third-party/cargo/litrs@1.0.0/LICENSE-MIT +25 -0
- package/third-party/cargo/lock_api@0.4.14/Cargo.toml +68 -0
- package/third-party/cargo/lock_api@0.4.14/LICENSE-APACHE +201 -0
- package/third-party/cargo/lock_api@0.4.14/LICENSE-MIT +25 -0
- package/third-party/cargo/log@0.4.33/Cargo.toml +152 -0
- package/third-party/cargo/log@0.4.33/LICENSE-APACHE +201 -0
- package/third-party/cargo/log@0.4.33/LICENSE-MIT +25 -0
- package/third-party/cargo/lru@0.16.4/Cargo.toml +47 -0
- package/third-party/cargo/lru@0.16.4/LICENSE +21 -0
- package/third-party/cargo/lyon_geom@1.0.19/Cargo.toml +69 -0
- package/third-party/cargo/lyon_geom@1.0.19/nical-lyon-56219c95c658-LICENSE-APACHE +13 -0
- package/third-party/cargo/lyon_geom@1.0.19/nical-lyon-56219c95c658-LICENSE-MIT +20 -0
- package/third-party/cargo/lyon_path@1.0.19/Cargo.toml +58 -0
- package/third-party/cargo/lyon_path@1.0.19/nical-lyon-56219c95c658-LICENSE-APACHE +13 -0
- package/third-party/cargo/lyon_path@1.0.19/nical-lyon-56219c95c658-LICENSE-MIT +20 -0
- package/third-party/cargo/lyon_tessellation@1.0.20/Cargo.toml +71 -0
- package/third-party/cargo/lyon_tessellation@1.0.20/nical-lyon-7fa75ea8eea3-LICENSE-APACHE +13 -0
- package/third-party/cargo/lyon_tessellation@1.0.20/nical-lyon-7fa75ea8eea3-LICENSE-MIT +20 -0
- package/third-party/cargo/memchr@2.8.3/COPYING +3 -0
- package/third-party/cargo/memchr@2.8.3/Cargo.toml +89 -0
- package/third-party/cargo/memchr@2.8.3/LICENSE-MIT +21 -0
- package/third-party/cargo/memchr@2.8.3/UNLICENSE +24 -0
- package/third-party/cargo/memmap2@0.9.11/Cargo.toml +59 -0
- package/third-party/cargo/memmap2@0.9.11/LICENSE-APACHE +201 -0
- package/third-party/cargo/memmap2@0.9.11/LICENSE-MIT +26 -0
- package/third-party/cargo/miniz_oxide@0.8.9/Cargo.toml +91 -0
- package/third-party/cargo/miniz_oxide@0.8.9/LICENSE +25 -0
- package/third-party/cargo/miniz_oxide@0.8.9/LICENSE-APACHE.md +177 -0
- package/third-party/cargo/miniz_oxide@0.8.9/LICENSE-MIT.md +24 -0
- package/third-party/cargo/miniz_oxide@0.8.9/LICENSE-ZLIB.md +14 -0
- package/third-party/cargo/moxcms@0.8.1/Cargo.toml +113 -0
- package/third-party/cargo/moxcms@0.8.1/LICENSE-APACHE.md +201 -0
- package/third-party/cargo/moxcms@0.8.1/LICENSE.md +26 -0
- package/third-party/cargo/naga-types@30.0.0/Cargo.toml +94 -0
- package/third-party/cargo/naga-types@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/naga-types@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/naga@30.0.0/Cargo.toml +246 -0
- package/third-party/cargo/naga@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/naga@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/num-traits@0.2.19/Cargo.toml +54 -0
- package/third-party/cargo/num-traits@0.2.19/LICENSE-APACHE +201 -0
- package/third-party/cargo/num-traits@0.2.19/LICENSE-MIT +25 -0
- package/third-party/cargo/objc2-core-foundation@0.3.2/Cargo.toml +221 -0
- package/third-party/cargo/objc2-core-foundation@0.3.2/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2-core-foundation@0.3.2/madsmtm-objc2-7b1abfd750a2-LICENSE.md +34 -0
- package/third-party/cargo/objc2-core-graphics@0.3.2/Cargo.toml +331 -0
- package/third-party/cargo/objc2-core-graphics@0.3.2/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2-core-graphics@0.3.2/madsmtm-objc2-7b1abfd750a2-LICENSE.md +34 -0
- package/third-party/cargo/objc2-encode@4.1.0/Cargo.toml +81 -0
- package/third-party/cargo/objc2-encode@4.1.0/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2-encode@4.1.0/madsmtm-objc2-8d214f547736-LICENSE.md +34 -0
- package/third-party/cargo/objc2-foundation@0.3.2/Cargo.toml +529 -0
- package/third-party/cargo/objc2-foundation@0.3.2/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2-foundation@0.3.2/madsmtm-objc2-7b1abfd750a2-LICENSE.md +34 -0
- package/third-party/cargo/objc2-io-surface@0.3.2/Cargo.toml +139 -0
- package/third-party/cargo/objc2-io-surface@0.3.2/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2-io-surface@0.3.2/madsmtm-objc2-7b1abfd750a2-LICENSE.md +34 -0
- package/third-party/cargo/objc2-metal@0.3.2/Cargo.toml +601 -0
- package/third-party/cargo/objc2-metal@0.3.2/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2-metal@0.3.2/madsmtm-objc2-7b1abfd750a2-LICENSE.md +34 -0
- package/third-party/cargo/objc2-quartz-core@0.3.2/Cargo.toml +302 -0
- package/third-party/cargo/objc2-quartz-core@0.3.2/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2-quartz-core@0.3.2/madsmtm-objc2-7b1abfd750a2-LICENSE.md +34 -0
- package/third-party/cargo/objc2@0.6.4/Cargo.toml +232 -0
- package/third-party/cargo/objc2@0.6.4/MIT-terms.txt +22 -0
- package/third-party/cargo/objc2@0.6.4/madsmtm-objc2-8852b424193c-LICENSE.md +34 -0
- package/third-party/cargo/once_cell@1.21.4/Cargo.toml +119 -0
- package/third-party/cargo/once_cell@1.21.4/LICENSE-APACHE +201 -0
- package/third-party/cargo/once_cell@1.21.4/LICENSE-MIT +23 -0
- package/third-party/cargo/ordered-float@5.3.0/Cargo.toml +162 -0
- package/third-party/cargo/ordered-float@5.3.0/LICENSE-MIT +25 -0
- package/third-party/cargo/parking_lot@0.12.5/Cargo.toml +87 -0
- package/third-party/cargo/parking_lot@0.12.5/LICENSE-APACHE +201 -0
- package/third-party/cargo/parking_lot@0.12.5/LICENSE-MIT +25 -0
- package/third-party/cargo/parking_lot_core@0.9.12/Cargo.toml +72 -0
- package/third-party/cargo/parking_lot_core@0.9.12/LICENSE-APACHE +201 -0
- package/third-party/cargo/parking_lot_core@0.9.12/LICENSE-MIT +25 -0
- package/third-party/cargo/pico-args@0.5.0/Cargo.toml +32 -0
- package/third-party/cargo/pico-args@0.5.0/LICENSE +20 -0
- package/third-party/cargo/pin-project-lite@0.2.17/Cargo.toml +198 -0
- package/third-party/cargo/pin-project-lite@0.2.17/LICENSE-APACHE +177 -0
- package/third-party/cargo/pin-project-lite@0.2.17/LICENSE-MIT +23 -0
- package/third-party/cargo/pkg-config@0.3.33/Cargo.toml +43 -0
- package/third-party/cargo/pkg-config@0.3.33/LICENSE-APACHE +201 -0
- package/third-party/cargo/pkg-config@0.3.33/LICENSE-MIT +25 -0
- package/third-party/cargo/png@0.18.1/Cargo.toml +130 -0
- package/third-party/cargo/png@0.18.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/png@0.18.1/LICENSE-MIT +25 -0
- package/third-party/cargo/pollster@0.4.0/Cargo.toml +53 -0
- package/third-party/cargo/pollster@0.4.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/pollster@0.4.0/LICENSE-MIT +25 -0
- package/third-party/cargo/polycool@0.4.0/Cargo.toml +83 -0
- package/third-party/cargo/polycool@0.4.0/LICENSE-APACHE +202 -0
- package/third-party/cargo/polycool@0.4.0/LICENSE-MIT +25 -0
- package/third-party/cargo/pp-rs@0.2.1/Cargo.toml +23 -0
- package/third-party/cargo/pp-rs@0.2.1/LICENSE +29 -0
- package/third-party/cargo/presser@0.3.1/Cargo.toml +58 -0
- package/third-party/cargo/presser@0.3.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/presser@0.3.1/LICENSE-MIT +25 -0
- package/third-party/cargo/proc-macro2@1.0.106/Cargo.toml +105 -0
- package/third-party/cargo/proc-macro2@1.0.106/LICENSE-APACHE +176 -0
- package/third-party/cargo/proc-macro2@1.0.106/LICENSE-MIT +23 -0
- package/third-party/cargo/profiling@1.0.18/Cargo.toml +96 -0
- package/third-party/cargo/profiling@1.0.18/aclysma-profiling-8271551172eb-LICENSE-APACHE +201 -0
- package/third-party/cargo/profiling@1.0.18/aclysma-profiling-8271551172eb-LICENSE-MIT +21 -0
- package/third-party/cargo/pxfm@0.1.30/Cargo.toml +53 -0
- package/third-party/cargo/pxfm@0.1.30/LICENSE-APACHE.md +201 -0
- package/third-party/cargo/pxfm@0.1.30/LICENSE.md +26 -0
- package/third-party/cargo/quick-error@2.0.1/Cargo.toml +24 -0
- package/third-party/cargo/quick-error@2.0.1/LICENSE-APACHE +202 -0
- package/third-party/cargo/quick-error@2.0.1/LICENSE-MIT +19 -0
- package/third-party/cargo/quote@1.0.46/Cargo.toml +70 -0
- package/third-party/cargo/quote@1.0.46/LICENSE-APACHE +176 -0
- package/third-party/cargo/quote@1.0.46/LICENSE-MIT +23 -0
- package/third-party/cargo/rangemap@1.7.1/Cargo.toml +91 -0
- package/third-party/cargo/rangemap@1.7.1/LICENSE-APACHE +191 -0
- package/third-party/cargo/rangemap@1.7.1/LICENSE-MIT +7 -0
- package/third-party/cargo/raw-window-handle@0.6.2/Cargo.toml +56 -0
- package/third-party/cargo/raw-window-handle@0.6.2/LICENSE-APACHE.md +177 -0
- package/third-party/cargo/raw-window-handle@0.6.2/LICENSE-MIT.md +21 -0
- package/third-party/cargo/raw-window-handle@0.6.2/LICENSE-ZLIB.md +11 -0
- package/third-party/cargo/raw-window-metal@1.1.0/Cargo.toml +111 -0
- package/third-party/cargo/raw-window-metal@1.1.0/LICENSE-APACHE +202 -0
- package/third-party/cargo/raw-window-metal@1.1.0/LICENSE-MIT +17 -0
- package/third-party/cargo/read-fonts@0.37.0/Cargo.toml +95 -0
- package/third-party/cargo/read-fonts@0.37.0/LICENSE-APACHE +67 -0
- package/third-party/cargo/read-fonts@0.37.0/LICENSE-MIT +25 -0
- package/third-party/cargo/read-fonts@0.39.2/Cargo.toml +96 -0
- package/third-party/cargo/read-fonts@0.39.2/LICENSE-APACHE +67 -0
- package/third-party/cargo/read-fonts@0.39.2/LICENSE-MIT +25 -0
- package/third-party/cargo/renderdoc-sys@1.1.0/Cargo.toml +39 -0
- package/third-party/cargo/renderdoc-sys@1.1.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/renderdoc-sys@1.1.0/LICENSE-MIT +25 -0
- package/third-party/cargo/resvg@0.47.0/Cargo.toml +112 -0
- package/third-party/cargo/resvg@0.47.0/LICENSE-APACHE +176 -0
- package/third-party/cargo/resvg@0.47.0/LICENSE-MIT +25 -0
- package/third-party/cargo/rgb@0.8.53/Cargo.toml +110 -0
- package/third-party/cargo/rgb@0.8.53/LICENSE +21 -0
- package/third-party/cargo/roxmltree@0.21.1/Cargo.toml +75 -0
- package/third-party/cargo/roxmltree@0.21.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/roxmltree@0.21.1/LICENSE-MIT +21 -0
- package/third-party/cargo/rustc-hash@1.1.0/Cargo.toml +25 -0
- package/third-party/cargo/rustc-hash@1.1.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/rustc-hash@1.1.0/LICENSE-MIT +23 -0
- package/third-party/cargo/rustc-hash@2.1.3/Cargo.toml +50 -0
- package/third-party/cargo/rustc-hash@2.1.3/LICENSE-APACHE +176 -0
- package/third-party/cargo/rustc-hash@2.1.3/LICENSE-MIT +23 -0
- package/third-party/cargo/rustix@1.1.4/COPYRIGHT +29 -0
- package/third-party/cargo/rustix@1.1.4/Cargo.toml +292 -0
- package/third-party/cargo/rustix@1.1.4/LICENSE-APACHE +201 -0
- package/third-party/cargo/rustix@1.1.4/LICENSE-Apache-2.0_WITH_LLVM-exception +220 -0
- package/third-party/cargo/rustix@1.1.4/LICENSE-MIT +23 -0
- package/third-party/cargo/rustversion@1.0.23/Cargo.toml +69 -0
- package/third-party/cargo/rustversion@1.0.23/LICENSE-APACHE +176 -0
- package/third-party/cargo/rustversion@1.0.23/LICENSE-MIT +23 -0
- package/third-party/cargo/rustybuzz@0.20.1/Cargo.toml +110 -0
- package/third-party/cargo/rustybuzz@0.20.1/LICENSE +22 -0
- package/third-party/cargo/scopeguard@1.2.0/Cargo.toml +43 -0
- package/third-party/cargo/scopeguard@1.2.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/scopeguard@1.2.0/LICENSE-MIT +25 -0
- package/third-party/cargo/self_cell@1.2.2/Cargo.toml +33 -0
- package/third-party/cargo/self_cell@1.2.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/self_cell@1.2.2/LICENSE-GPLv2 +339 -0
- package/third-party/cargo/self_cell@1.3.0/Cargo.toml +33 -0
- package/third-party/cargo/self_cell@1.3.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/self_cell@1.3.0/LICENSE-GPLv2 +339 -0
- package/third-party/cargo/serde@1.0.228/Cargo.toml +84 -0
- package/third-party/cargo/serde@1.0.228/LICENSE-APACHE +176 -0
- package/third-party/cargo/serde@1.0.228/LICENSE-MIT +23 -0
- package/third-party/cargo/serde_core@1.0.228/Cargo.toml +87 -0
- package/third-party/cargo/serde_core@1.0.228/LICENSE-APACHE +176 -0
- package/third-party/cargo/serde_core@1.0.228/LICENSE-MIT +23 -0
- package/third-party/cargo/serde_derive@1.0.228/Cargo.toml +87 -0
- package/third-party/cargo/serde_derive@1.0.228/LICENSE-APACHE +176 -0
- package/third-party/cargo/serde_derive@1.0.228/LICENSE-MIT +23 -0
- package/third-party/cargo/serde_json@1.0.150/Cargo.toml +162 -0
- package/third-party/cargo/serde_json@1.0.150/LICENSE-APACHE +176 -0
- package/third-party/cargo/serde_json@1.0.150/LICENSE-MIT +23 -0
- package/third-party/cargo/simd-adler32@0.3.10/Cargo.toml +68 -0
- package/third-party/cargo/simd-adler32@0.3.10/LICENSE.md +21 -0
- package/third-party/cargo/simplecss@0.2.2/Cargo.toml +146 -0
- package/third-party/cargo/simplecss@0.2.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/simplecss@0.2.2/LICENSE-MIT +21 -0
- package/third-party/cargo/siphasher@1.0.3/COPYING +7 -0
- package/third-party/cargo/siphasher@1.0.3/Cargo.toml +64 -0
- package/third-party/cargo/skrifa@0.40.0/Cargo.toml +86 -0
- package/third-party/cargo/skrifa@0.40.0/LICENSE-APACHE +67 -0
- package/third-party/cargo/skrifa@0.40.0/LICENSE-MIT +25 -0
- package/third-party/cargo/skrifa@0.42.1/Cargo.toml +86 -0
- package/third-party/cargo/skrifa@0.42.1/LICENSE-APACHE +67 -0
- package/third-party/cargo/skrifa@0.42.1/LICENSE-MIT +25 -0
- package/third-party/cargo/slab@0.4.12/Cargo.toml +67 -0
- package/third-party/cargo/slab@0.4.12/LICENSE +25 -0
- package/third-party/cargo/slotmap@1.1.1/Cargo.toml +83 -0
- package/third-party/cargo/slotmap@1.1.1/LICENSE +19 -0
- package/third-party/cargo/smallvec@1.15.2/Cargo.toml +103 -0
- package/third-party/cargo/smallvec@1.15.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/smallvec@1.15.2/LICENSE-MIT +25 -0
- package/third-party/cargo/smol_str@0.3.6/Cargo.toml +155 -0
- package/third-party/cargo/smol_str@0.3.6/LICENSE-APACHE +201 -0
- package/third-party/cargo/smol_str@0.3.6/LICENSE-MIT +23 -0
- package/third-party/cargo/spirv@0.4.0+sdk-1.4.341.0/Cargo.toml +56 -0
- package/third-party/cargo/spirv@0.4.0+sdk-1.4.341.0/gfx-rs-rspirv-8afc3d0ac8e1-LICENSE +202 -0
- package/third-party/cargo/static_assertions@1.1.0/Cargo.toml +39 -0
- package/third-party/cargo/static_assertions@1.1.0/LICENSE-APACHE +202 -0
- package/third-party/cargo/static_assertions@1.1.0/LICENSE-MIT +21 -0
- package/third-party/cargo/strict-num@0.1.1/Cargo.toml +35 -0
- package/third-party/cargo/strict-num@0.1.1/LICENSE +19 -0
- package/third-party/cargo/svgtypes@0.16.1/Cargo.toml +57 -0
- package/third-party/cargo/svgtypes@0.16.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/svgtypes@0.16.1/LICENSE-MIT +20 -0
- package/third-party/cargo/swash@0.2.9/Cargo.toml +93 -0
- package/third-party/cargo/swash@0.2.9/LICENSE-APACHE +201 -0
- package/third-party/cargo/swash@0.2.9/LICENSE-MIT +25 -0
- package/third-party/cargo/syn@2.0.118/Cargo.toml +272 -0
- package/third-party/cargo/syn@2.0.118/LICENSE-APACHE +176 -0
- package/third-party/cargo/syn@2.0.118/LICENSE-MIT +23 -0
- package/third-party/cargo/sys-locale@0.3.2/Cargo.toml +73 -0
- package/third-party/cargo/sys-locale@0.3.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/sys-locale@0.3.2/LICENSE-MIT +21 -0
- package/third-party/cargo/taffy@0.12.1/Cargo.toml +171 -0
- package/third-party/cargo/taffy@0.12.1/DioxusLabs-taffy-1c9e37a0a1cf-LICENSE.md +25 -0
- package/third-party/cargo/tempfile@3.27.0/Cargo.toml +105 -0
- package/third-party/cargo/tempfile@3.27.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/tempfile@3.27.0/LICENSE-MIT +25 -0
- package/third-party/cargo/termcolor@1.4.1/COPYING +3 -0
- package/third-party/cargo/termcolor@1.4.1/Cargo.toml +40 -0
- package/third-party/cargo/termcolor@1.4.1/LICENSE-MIT +21 -0
- package/third-party/cargo/termcolor@1.4.1/UNLICENSE +24 -0
- package/third-party/cargo/thiserror-impl@2.0.18/Cargo.toml +52 -0
- package/third-party/cargo/thiserror-impl@2.0.18/LICENSE-APACHE +176 -0
- package/third-party/cargo/thiserror-impl@2.0.18/LICENSE-MIT +23 -0
- package/third-party/cargo/thiserror@2.0.18/Cargo.toml +119 -0
- package/third-party/cargo/thiserror@2.0.18/LICENSE-APACHE +176 -0
- package/third-party/cargo/thiserror@2.0.18/LICENSE-MIT +23 -0
- package/third-party/cargo/tiny-skia-path@0.12.0/Cargo.toml +58 -0
- package/third-party/cargo/tiny-skia-path@0.12.0/LICENSE +30 -0
- package/third-party/cargo/tiny-skia@0.12.0/Cargo.toml +116 -0
- package/third-party/cargo/tiny-skia@0.12.0/LICENSE +30 -0
- package/third-party/cargo/tiny_http@0.12.0/Cargo.toml +82 -0
- package/third-party/cargo/tiny_http@0.12.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/tiny_http@0.12.0/LICENSE-MIT +25 -0
- package/third-party/cargo/tinyvec@1.12.0/Cargo.toml +184 -0
- package/third-party/cargo/tinyvec@1.12.0/LICENSE-APACHE.md +202 -0
- package/third-party/cargo/tinyvec@1.12.0/LICENSE-MIT.md +5 -0
- package/third-party/cargo/tinyvec@1.12.0/LICENSE-ZLIB.md +11 -0
- package/third-party/cargo/tinyvec_macros@0.1.1/Cargo.toml +19 -0
- package/third-party/cargo/tinyvec_macros@0.1.1/LICENSE-APACHE.md +202 -0
- package/third-party/cargo/tinyvec_macros@0.1.1/LICENSE-MIT.md +21 -0
- package/third-party/cargo/tinyvec_macros@0.1.1/LICENSE-ZLIB.md +20 -0
- package/third-party/cargo/ttf-parser@0.25.1/Cargo.toml +101 -0
- package/third-party/cargo/ttf-parser@0.25.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/ttf-parser@0.25.1/LICENSE-MIT +20 -0
- package/third-party/cargo/unicode-bidi-mirroring@0.4.0/Cargo.toml +22 -0
- package/third-party/cargo/unicode-bidi-mirroring@0.4.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-bidi-mirroring@0.4.0/LICENSE-MIT +21 -0
- package/third-party/cargo/unicode-bidi@0.3.18/COPYRIGHT +8 -0
- package/third-party/cargo/unicode-bidi@0.3.18/Cargo.toml +90 -0
- package/third-party/cargo/unicode-bidi@0.3.18/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-bidi@0.3.18/LICENSE-MIT +25 -0
- package/third-party/cargo/unicode-ccc@0.4.0/Cargo.toml +22 -0
- package/third-party/cargo/unicode-ccc@0.4.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-ccc@0.4.0/LICENSE-MIT +21 -0
- package/third-party/cargo/unicode-ident@1.0.24/Cargo.toml +84 -0
- package/third-party/cargo/unicode-ident@1.0.24/LICENSE-APACHE +176 -0
- package/third-party/cargo/unicode-ident@1.0.24/LICENSE-MIT +23 -0
- package/third-party/cargo/unicode-ident@1.0.24/LICENSE-UNICODE +39 -0
- package/third-party/cargo/unicode-linebreak@0.1.5/Cargo.toml +32 -0
- package/third-party/cargo/unicode-linebreak@0.1.5/LICENSE +201 -0
- package/third-party/cargo/unicode-properties@0.1.4/COPYRIGHT +7 -0
- package/third-party/cargo/unicode-properties@0.1.4/Cargo.toml +65 -0
- package/third-party/cargo/unicode-properties@0.1.4/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-properties@0.1.4/LICENSE-MIT +25 -0
- package/third-party/cargo/unicode-script@0.5.8/Cargo.toml +63 -0
- package/third-party/cargo/unicode-script@0.5.8/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-script@0.5.8/LICENSE-MIT +27 -0
- package/third-party/cargo/unicode-segmentation@1.13.3/COPYRIGHT +7 -0
- package/third-party/cargo/unicode-segmentation@1.13.3/Cargo.toml +91 -0
- package/third-party/cargo/unicode-segmentation@1.13.3/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-segmentation@1.13.3/LICENSE-MIT +25 -0
- package/third-party/cargo/unicode-vo@0.1.0/Cargo.toml +22 -0
- package/third-party/cargo/unicode-vo@0.1.0/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-vo@0.1.0/LICENSE-MIT +21 -0
- package/third-party/cargo/unicode-width@0.2.2/COPYRIGHT +7 -0
- package/third-party/cargo/unicode-width@0.2.2/Cargo.toml +77 -0
- package/third-party/cargo/unicode-width@0.2.2/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-width@0.2.2/LICENSE-MIT +25 -0
- package/third-party/cargo/unicode-xid@0.2.6/COPYRIGHT +7 -0
- package/third-party/cargo/unicode-xid@0.2.6/Cargo.toml +65 -0
- package/third-party/cargo/unicode-xid@0.2.6/LICENSE-APACHE +201 -0
- package/third-party/cargo/unicode-xid@0.2.6/LICENSE-MIT +25 -0
- package/third-party/cargo/urlencoding@2.1.3/Cargo.toml +41 -0
- package/third-party/cargo/urlencoding@2.1.3/LICENSE +20 -0
- package/third-party/cargo/usvg@0.47.0/Cargo.toml +138 -0
- package/third-party/cargo/usvg@0.47.0/LICENSE-APACHE +176 -0
- package/third-party/cargo/usvg@0.47.0/LICENSE-MIT +25 -0
- package/third-party/cargo/version_check@0.9.5/Cargo.toml +38 -0
- package/third-party/cargo/version_check@0.9.5/LICENSE-APACHE +201 -0
- package/third-party/cargo/version_check@0.9.5/LICENSE-MIT +19 -0
- package/third-party/cargo/wasm-bindgen-futures@0.4.76/Cargo.toml +88 -0
- package/third-party/cargo/wasm-bindgen-futures@0.4.76/LICENSE-APACHE +201 -0
- package/third-party/cargo/wasm-bindgen-futures@0.4.76/LICENSE-MIT +25 -0
- package/third-party/cargo/wasm-bindgen-macro-support@0.2.126/Cargo.toml +83 -0
- package/third-party/cargo/wasm-bindgen-macro-support@0.2.126/LICENSE-APACHE +201 -0
- package/third-party/cargo/wasm-bindgen-macro-support@0.2.126/LICENSE-MIT +25 -0
- package/third-party/cargo/wasm-bindgen-macro@0.2.126/Cargo.toml +73 -0
- package/third-party/cargo/wasm-bindgen-macro@0.2.126/LICENSE-APACHE +201 -0
- package/third-party/cargo/wasm-bindgen-macro@0.2.126/LICENSE-MIT +25 -0
- package/third-party/cargo/wasm-bindgen-shared@0.2.126/Cargo.toml +66 -0
- package/third-party/cargo/wasm-bindgen-shared@0.2.126/LICENSE-APACHE +201 -0
- package/third-party/cargo/wasm-bindgen-shared@0.2.126/LICENSE-MIT +25 -0
- package/third-party/cargo/wasm-bindgen@0.2.126/Cargo.toml +122 -0
- package/third-party/cargo/wasm-bindgen@0.2.126/LICENSE-APACHE +201 -0
- package/third-party/cargo/wasm-bindgen@0.2.126/LICENSE-MIT +25 -0
- package/third-party/cargo/wayland-sys@0.31.11/Cargo.toml +81 -0
- package/third-party/cargo/wayland-sys@0.31.11/LICENSE.txt +19 -0
- package/third-party/cargo/web-sys@0.3.103/Cargo.toml +2823 -0
- package/third-party/cargo/web-sys@0.3.103/LICENSE-APACHE +201 -0
- package/third-party/cargo/web-sys@0.3.103/LICENSE-MIT +25 -0
- package/third-party/cargo/weezl@0.1.12/Cargo.toml +120 -0
- package/third-party/cargo/weezl@0.1.12/LICENSE-APACHE +201 -0
- package/third-party/cargo/weezl@0.1.12/LICENSE-MIT +22 -0
- package/third-party/cargo/wgpu-core-deps-apple@30.0.0/Cargo.toml +53 -0
- package/third-party/cargo/wgpu-core-deps-apple@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/wgpu-core-deps-apple@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/wgpu-core@30.0.0/Cargo.toml +237 -0
- package/third-party/cargo/wgpu-core@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/wgpu-core@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/wgpu-hal@30.0.0/Cargo.toml +541 -0
- package/third-party/cargo/wgpu-hal@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/wgpu-hal@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/wgpu-naga-bridge@30.0.0/Cargo.toml +46 -0
- package/third-party/cargo/wgpu-naga-bridge@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/wgpu-naga-bridge@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/wgpu-types@30.0.0/Cargo.toml +161 -0
- package/third-party/cargo/wgpu-types@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/wgpu-types@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/wgpu@30.0.0/Cargo.toml +278 -0
- package/third-party/cargo/wgpu@30.0.0/LICENSE.APACHE +176 -0
- package/third-party/cargo/wgpu@30.0.0/LICENSE.MIT +21 -0
- package/third-party/cargo/xmlwriter@0.1.0/Cargo.toml +23 -0
- package/third-party/cargo/xmlwriter@0.1.0/LICENSE +21 -0
- package/third-party/cargo/yazi@0.2.1/Cargo.toml +45 -0
- package/third-party/cargo/yazi@0.2.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/yazi@0.2.1/LICENSE-MIT +19 -0
- package/third-party/cargo/zeno@0.3.3/Cargo.toml +65 -0
- package/third-party/cargo/zeno@0.3.3/LICENSE-APACHE +201 -0
- package/third-party/cargo/zeno@0.3.3/LICENSE-MIT +25 -0
- package/third-party/cargo/zerocopy-derive@0.8.54/Cargo.toml +209 -0
- package/third-party/cargo/zerocopy-derive@0.8.54/LICENSE-APACHE +202 -0
- package/third-party/cargo/zerocopy-derive@0.8.54/LICENSE-BSD +24 -0
- package/third-party/cargo/zerocopy-derive@0.8.54/LICENSE-MIT +26 -0
- package/third-party/cargo/zerocopy@0.8.54/Cargo.toml +419 -0
- package/third-party/cargo/zerocopy@0.8.54/LICENSE-APACHE +202 -0
- package/third-party/cargo/zerocopy@0.8.54/LICENSE-BSD +24 -0
- package/third-party/cargo/zerocopy@0.8.54/LICENSE-MIT +26 -0
- package/third-party/cargo/zmij@1.0.23/Cargo.toml +90 -0
- package/third-party/cargo/zmij@1.0.23/LICENSE-MIT +23 -0
- package/third-party/cargo/zune-core@0.5.1/Cargo.toml +47 -0
- package/third-party/cargo/zune-core@0.5.1/LICENSE-APACHE +201 -0
- package/third-party/cargo/zune-core@0.5.1/LICENSE-MIT +21 -0
- package/third-party/cargo/zune-core@0.5.1/LICENSE-ZLIB +19 -0
- package/third-party/cargo/zune-jpeg@0.5.15/Cargo.toml +67 -0
- package/third-party/cargo/zune-jpeg@0.5.15/LICENSE-APACHE +201 -0
- package/third-party/cargo/zune-jpeg@0.5.15/LICENSE-MIT +21 -0
- package/third-party/cargo/zune-jpeg@0.5.15/LICENSE-ZLIB +19 -0
- package/third-party/inventory.json +3614 -0
- package/third-party/npm/@esbuild__darwin-arm64@0.27.4/esbuild-0.27.4-LICENSE.md +21 -0
- package/third-party/npm/@esbuild__darwin-arm64@0.27.4/go-LICENSE +27 -0
- package/third-party/npm/@esbuild__darwin-arm64@0.27.4/golang-x-sys-c0bba94af5f8-LICENSE +27 -0
- package/third-party/npm/@esbuild__darwin-arm64@0.27.4/package.json +20 -0
- package/third-party/npm/@floating-ui__core@1.7.5/LICENSE +20 -0
- package/third-party/npm/@floating-ui__core@1.7.5/package.json +63 -0
- package/third-party/npm/@floating-ui__dom@1.7.6/LICENSE +20 -0
- package/third-party/npm/@floating-ui__dom@1.7.6/package.json +71 -0
- package/third-party/npm/@floating-ui__react-dom@2.1.8/LICENSE +20 -0
- package/third-party/npm/@floating-ui__react-dom@2.1.8/package.json +76 -0
- package/third-party/npm/@floating-ui__utils@0.2.11/LICENSE +20 -0
- package/third-party/npm/@floating-ui__utils@0.2.11/package.json +70 -0
- package/third-party/npm/@radix-ui__primitive@1.1.7/LICENSE +21 -0
- package/third-party/npm/@radix-ui__primitive@1.1.7/package.json +79 -0
- package/third-party/npm/@radix-ui__react-arrow@1.1.15/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-arrow@1.1.15/package.json +68 -0
- package/third-party/npm/@radix-ui__react-collection@1.1.15/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-collection@1.1.15/package.json +71 -0
- package/third-party/npm/@radix-ui__react-compose-refs@1.1.5/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-compose-refs@1.1.5/package.json +60 -0
- package/third-party/npm/@radix-ui__react-context-menu@2.3.7/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-context-menu@2.3.7/package.json +73 -0
- package/third-party/npm/@radix-ui__react-context@1.2.2/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-context@1.2.2/package.json +60 -0
- package/third-party/npm/@radix-ui__react-direction@1.1.4/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-direction@1.1.4/package.json +60 -0
- package/third-party/npm/@radix-ui__react-dismissable-layer@1.1.19/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-dismissable-layer@1.1.19/package.json +74 -0
- package/third-party/npm/@radix-ui__react-focus-guards@1.1.6/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-focus-guards@1.1.6/package.json +60 -0
- package/third-party/npm/@radix-ui__react-focus-scope@1.1.16/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-focus-scope@1.1.16/package.json +71 -0
- package/third-party/npm/@radix-ui__react-id@1.1.4/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-id@1.1.4/package.json +63 -0
- package/third-party/npm/@radix-ui__react-menu@2.1.24/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-menu@2.1.24/package.json +86 -0
- package/third-party/npm/@radix-ui__react-popper@1.3.7/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-popper@1.3.7/package.json +78 -0
- package/third-party/npm/@radix-ui__react-portal@1.1.17/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-portal@1.1.17/package.json +69 -0
- package/third-party/npm/@radix-ui__react-presence@1.1.10/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-presence@1.1.10/package.json +68 -0
- package/third-party/npm/@radix-ui__react-primitive@2.1.10/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-primitive@2.1.10/package.json +68 -0
- package/third-party/npm/@radix-ui__react-roving-focus@1.1.19/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-roving-focus@1.1.19/package.json +78 -0
- package/third-party/npm/@radix-ui__react-slot@1.3.3/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-slot@1.3.3/package.json +63 -0
- package/third-party/npm/@radix-ui__react-use-callback-ref@1.1.4/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-use-callback-ref@1.1.4/package.json +60 -0
- package/third-party/npm/@radix-ui__react-use-controllable-state@1.2.6/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-use-controllable-state@1.2.6/package.json +65 -0
- package/third-party/npm/@radix-ui__react-use-effect-event@0.0.5/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-use-effect-event@0.0.5/package.json +65 -0
- package/third-party/npm/@radix-ui__react-use-is-hydrated@0.1.3/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-use-is-hydrated@0.1.3/package.json +61 -0
- package/third-party/npm/@radix-ui__react-use-layout-effect@1.1.4/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-use-layout-effect@1.1.4/package.json +60 -0
- package/third-party/npm/@radix-ui__react-use-size@1.1.4/LICENSE +21 -0
- package/third-party/npm/@radix-ui__react-use-size@1.1.4/package.json +63 -0
- package/third-party/npm/aria-hidden@1.2.6/LICENSE +21 -0
- package/third-party/npm/aria-hidden@1.2.6/package.json +71 -0
- package/third-party/npm/detect-node-es@1.1.0/LICENSE +21 -0
- package/third-party/npm/detect-node-es@1.1.0/package.json +29 -0
- package/third-party/npm/esbuild@0.27.4/LICENSE.md +21 -0
- package/third-party/npm/esbuild@0.27.4/package.json +49 -0
- package/third-party/npm/fflate@0.8.3/LICENSE +21 -0
- package/third-party/npm/fflate@0.8.3/package.json +128 -0
- package/third-party/npm/get-nonce@1.0.1/LICENSE +21 -0
- package/third-party/npm/get-nonce@1.0.1/package.json +68 -0
- package/third-party/npm/mediabunny@1.52.2/LICENSE +373 -0
- package/third-party/npm/mediabunny@1.52.2/package.json +136 -0
- package/third-party/npm/mediabunny@1.52.2/source/LICENSE +373 -0
- package/third-party/npm/mediabunny@1.52.2/source/package.json +136 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/adts/adts-demuxer.ts +400 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/adts/adts-muxer.ts +124 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/adts/adts-reader.ts +85 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/aes.ts +307 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/codec-data.ts +3178 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/codec.ts +1154 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/conversion.ts +2042 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/custom-coder.ts +212 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/decode.ts +263 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/demuxer.ts +43 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/encode.ts +1412 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/flac/flac-demuxer.ts +813 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/flac/flac-misc.ts +165 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/flac/flac-muxer.ts +350 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/hls/hls-demuxer.ts +995 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/hls/hls-misc.ts +81 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/hls/hls-muxer.ts +1529 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/hls/hls-segmented-input.ts +772 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/id3.ts +972 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/index.ts +319 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/input-format.ts +819 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/input-track.ts +1141 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/input.ts +571 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/isobmff/isobmff-boxes.ts +1911 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/isobmff/isobmff-demuxer.ts +3953 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/isobmff/isobmff-misc.ts +90 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/isobmff/isobmff-muxer.ts +1595 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/isobmff/isobmff-reader.ts +91 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/logging.ts +120 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/matroska/ebml.ts +770 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/matroska/matroska-demuxer.ts +2598 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/matroska/matroska-misc.ts +29 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/matroska/matroska-muxer.ts +1360 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/media-sink.ts +2589 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/media-source.ts +3041 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/metadata.ts +335 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/misc.ts +1336 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/mp3/mp3-demuxer.ts +469 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/mp3/mp3-muxer.ts +169 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/mp3/mp3-reader.ts +61 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/mp3/mp3-writer.ts +121 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/mpeg-ts/mpeg-ts-demuxer.ts +2519 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/mpeg-ts/mpeg-ts-misc.ts +32 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/mpeg-ts/mpeg-ts-muxer.ts +842 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/muxer.ts +80 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/node.ts +11 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/ogg/ogg-demuxer.ts +1087 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/ogg/ogg-misc.ts +116 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/ogg/ogg-muxer.ts +527 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/ogg/ogg-reader.ts +93 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/output-format.ts +1425 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/output.ts +940 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/packet.ts +287 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/pcm.ts +112 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/reader.ts +391 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/resample.ts +287 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/sample.ts +3231 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/segmented-input.ts +575 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/source.ts +2588 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/subtitles.ts +131 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/target.ts +871 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/tsconfig.json +16 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/wave/riff-writer.ts +36 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/wave/wave-demuxer.ts +583 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/wave/wave-muxer.ts +375 -0
- package/third-party/npm/mediabunny@1.52.2/source/src/writer.ts +128 -0
- package/third-party/npm/react-dom@19.3.0/LICENSE +21 -0
- package/third-party/npm/react-dom@19.3.0/package.json +117 -0
- package/third-party/npm/react-remove-scroll-bar@2.3.8/package.json +85 -0
- package/third-party/npm/react-remove-scroll-bar@2.3.8/react-remove-scroll-bar-LICENSE +21 -0
- package/third-party/npm/react-remove-scroll@2.7.2/LICENSE +21 -0
- package/third-party/npm/react-remove-scroll@2.7.2/package.json +98 -0
- package/third-party/npm/react-style-singleton@2.2.3/LICENSE +21 -0
- package/third-party/npm/react-style-singleton@2.2.3/package.json +90 -0
- package/third-party/npm/react@19.3.0/LICENSE +21 -0
- package/third-party/npm/react@19.3.0/package.json +51 -0
- package/third-party/npm/scheduler@0.28.0/LICENSE +21 -0
- package/third-party/npm/scheduler@0.28.0/package.json +27 -0
- package/third-party/npm/tslib@2.8.1/LICENSE.txt +12 -0
- package/third-party/npm/tslib@2.8.1/package.json +47 -0
- package/third-party/npm/typescript@5.9.3/LICENSE.txt +55 -0
- package/third-party/npm/typescript@5.9.3/ThirdPartyNoticeText.txt +193 -0
- package/third-party/npm/typescript@5.9.3/package.json +120 -0
- package/third-party/npm/use-callback-ref@1.3.3/LICENSE +21 -0
- package/third-party/npm/use-callback-ref@1.3.3/package.json +85 -0
- package/third-party/npm/use-sidecar@1.1.3/LICENSE +21 -0
- package/third-party/npm/use-sidecar@1.1.3/package.json +93 -0
- package/third-party/packages/render-engine/assets/OFL.txt +93 -0
- package/third-party/packages/studio/public/fonts/OFL.txt +93 -0
- package/third-party/packages/studio/vendor/osmo-icons/LICENSE +21 -0
- package/third-party/packages/studio/vendor/shadcn/LICENSE +21 -0
- package/third-party/repository-notices.md +41 -0
- package/third-party/rust-standard-library/COPYRIGHT-library.html +5556 -0
- package/third-party/rust-standard-library/licenses/Apache-2.0.txt +73 -0
- package/third-party/rust-standard-library/licenses/BSD-2-Clause.txt +9 -0
- package/third-party/rust-standard-library/licenses/CC-BY-SA-4.0.txt +427 -0
- package/third-party/rust-standard-library/licenses/GCC-exception-3.1.txt +30 -0
- package/third-party/rust-standard-library/licenses/GPL-2.0-only.txt +133 -0
- package/third-party/rust-standard-library/licenses/GPL-3.0-or-later.txt +202 -0
- package/third-party/rust-standard-library/licenses/ISC.txt +7 -0
- package/third-party/rust-standard-library/licenses/LLVM-exception.txt +15 -0
- package/third-party/rust-standard-library/licenses/MIT.txt +9 -0
- package/third-party/rust-standard-library/licenses/NCSA.txt +29 -0
- package/third-party/rust-standard-library/licenses/OFL-1.1.txt +43 -0
- package/third-party/rust-standard-library/licenses/Unicode-3.0.txt +39 -0
- package/third-party/rust-standard-library/version.txt +1 -0
- package/vendor/osmo-lite +0 -0
- package/vendor/osmo-scene-0.1.0.tgz +0 -0
- package/vendor/platform.json +1 -0
|
@@ -0,0 +1,1141 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2026-present, Vanilagy and contributors
|
|
3
|
+
*
|
|
4
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { AudioCodec, MediaCodec, VideoCodec } from './codec';
|
|
10
|
+
import { determineVideoPacketType } from './codec-data';
|
|
11
|
+
import { customAudioDecoders, customVideoDecoders } from './custom-coder';
|
|
12
|
+
import { Input } from './input';
|
|
13
|
+
import { Logging } from './logging';
|
|
14
|
+
import { EncodedPacketSink, PacketRetrievalOptions } from './media-sink';
|
|
15
|
+
import { assert, MaybePromise, Rational, Rotation, roundToDivisor, simplifyRational } from './misc';
|
|
16
|
+
import { TrackType } from './output';
|
|
17
|
+
import { EncodedPacket, PacketType } from './packet';
|
|
18
|
+
import { TrackDisposition } from './metadata';
|
|
19
|
+
import { DurationMetadataRequestOptions } from './demuxer';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Contains aggregate statistics about the encoded packets of a track.
|
|
23
|
+
* @group Input files & tracks
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export type PacketStats = {
|
|
27
|
+
/** The total number of packets. */
|
|
28
|
+
packetCount: number;
|
|
29
|
+
/** The average number of packets per second. For video tracks, this will equal the average frame rate (FPS). */
|
|
30
|
+
averagePacketRate: number;
|
|
31
|
+
/** The average number of bits per second. */
|
|
32
|
+
averageBitrate: number;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export interface InputTrackBacking {
|
|
36
|
+
getType(): TrackType;
|
|
37
|
+
getId(): number;
|
|
38
|
+
getNumber(): number;
|
|
39
|
+
|
|
40
|
+
getCodec(): MaybePromise<MediaCodec | null>;
|
|
41
|
+
getInternalCodecId(): MaybePromise<string | number | Uint8Array | null>;
|
|
42
|
+
getName(): MaybePromise<string | null>;
|
|
43
|
+
getLanguageCode(): MaybePromise<string>;
|
|
44
|
+
getTimeResolution(): MaybePromise<number>;
|
|
45
|
+
isRelativeToUnixEpoch(): MaybePromise<boolean>;
|
|
46
|
+
getUnixTimeForTimestamp(timestamp: number): MaybePromise<number | null>;
|
|
47
|
+
getDisposition(): MaybePromise<TrackDisposition>;
|
|
48
|
+
getPairingMask(): bigint;
|
|
49
|
+
getBitrate(): MaybePromise<number | null>;
|
|
50
|
+
getAverageBitrate(): MaybePromise<number | null>;
|
|
51
|
+
getDurationFromMetadata(options: DurationMetadataRequestOptions): Promise<number | null>;
|
|
52
|
+
getLiveRefreshInterval(): Promise<number | null>;
|
|
53
|
+
getHasOnlyKeyPackets?(): MaybePromise<boolean | null>;
|
|
54
|
+
getDecoderConfig(): Promise<VideoDecoderConfig | AudioDecoderConfig | null>;
|
|
55
|
+
getMetadataCodecParameterString?(): MaybePromise<string | null>;
|
|
56
|
+
|
|
57
|
+
getFirstPacket(options: PacketRetrievalOptions): Promise<EncodedPacket | null>;
|
|
58
|
+
getPacket(timestamp: number, options: PacketRetrievalOptions): Promise<EncodedPacket | null>;
|
|
59
|
+
getNextPacket(packet: EncodedPacket, options: PacketRetrievalOptions): Promise<EncodedPacket | null>;
|
|
60
|
+
getKeyPacket(timestamp: number, options: PacketRetrievalOptions): Promise<EncodedPacket | null>;
|
|
61
|
+
getNextKeyPacket(packet: EncodedPacket, options: PacketRetrievalOptions): Promise<EncodedPacket | null>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Represents a media track in an input file.
|
|
66
|
+
* @group Input files & tracks
|
|
67
|
+
* @public
|
|
68
|
+
*/
|
|
69
|
+
export abstract class InputTrack {
|
|
70
|
+
/** The input file this track belongs to. */
|
|
71
|
+
readonly input: Input;
|
|
72
|
+
/** @internal */
|
|
73
|
+
_backing: InputTrackBacking;
|
|
74
|
+
/** @internal */
|
|
75
|
+
constructor(input: Input, backing: InputTrackBacking) {
|
|
76
|
+
this.input = input;
|
|
77
|
+
this._backing = backing;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** The type of the track. */
|
|
81
|
+
abstract get type(): TrackType;
|
|
82
|
+
/** Returns the codec of the track's packets. */
|
|
83
|
+
abstract getCodec(): Promise<MediaCodec | null>;
|
|
84
|
+
/**
|
|
85
|
+
* The codec of the track's packets.
|
|
86
|
+
* @deprecated Use {@link InputTrack.getCodec} instead.
|
|
87
|
+
*/
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
89
|
+
abstract get codec(): MediaCodec | null;
|
|
90
|
+
/** Returns the full codec parameter string for this track. */
|
|
91
|
+
abstract getCodecParameterString(): Promise<string | null>;
|
|
92
|
+
/** Checks if this track's packets can be decoded by the browser. */
|
|
93
|
+
abstract canDecode(): Promise<boolean>;
|
|
94
|
+
/**
|
|
95
|
+
* For a given packet of this track, this method determines the actual type of this packet (key/delta) by looking
|
|
96
|
+
* into its bitstream. Returns null if the type couldn't be determined.
|
|
97
|
+
*/
|
|
98
|
+
abstract determinePacketType(packet: EncodedPacket): Promise<PacketType | null>;
|
|
99
|
+
/**
|
|
100
|
+
* Returns whether the track metadata says that this track only contains key packets. The actual packets may
|
|
101
|
+
* differ.
|
|
102
|
+
*/
|
|
103
|
+
abstract hasOnlyKeyPackets(): Promise<boolean>;
|
|
104
|
+
|
|
105
|
+
/** Returns true if and only if this track is a video track. */
|
|
106
|
+
isVideoTrack(): this is InputVideoTrack {
|
|
107
|
+
return this instanceof InputVideoTrack;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Returns true if and only if this track is an audio track. */
|
|
111
|
+
isAudioTrack(): this is InputAudioTrack {
|
|
112
|
+
return this instanceof InputAudioTrack;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The unique ID of this track in the input file. */
|
|
116
|
+
get id() {
|
|
117
|
+
return this._backing.getId();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The 1-based index of this track among all tracks of the same type in the input file. For example, the first
|
|
122
|
+
* video track has number 1, the second video track has number 2, and so on. The index refers to the order in
|
|
123
|
+
* which the tracks are returned by {@link Input.getTracks}.
|
|
124
|
+
*/
|
|
125
|
+
get number() {
|
|
126
|
+
return this._backing.getNumber();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Returns the identifier of the codec used internally by the container. It is not homogenized by Mediabunny
|
|
131
|
+
* and depends entirely on the container format.
|
|
132
|
+
*
|
|
133
|
+
* This method can be used to determine the codec of a track in case Mediabunny doesn't know that codec.
|
|
134
|
+
*
|
|
135
|
+
* - For ISOBMFF files, this resolves to the name of the Sample Description Box (e.g. `'avc1'`).
|
|
136
|
+
* - For Matroska files, this resolves to the value of the `CodecID` element.
|
|
137
|
+
* - For WAVE files, this resolves to the value of the format tag in the `'fmt '` chunk.
|
|
138
|
+
* - For ADTS files, this resolves to the `MPEG-4 Audio Object Type`.
|
|
139
|
+
* - For MPEG-TS files, this resolves to the `streamType` value from the Program Map Table.
|
|
140
|
+
* - In all other cases, this resolves to `null`.
|
|
141
|
+
*/
|
|
142
|
+
async getInternalCodecId() {
|
|
143
|
+
return this._backing.getInternalCodecId();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* See {@link InputTrack.getInternalCodecId}.
|
|
148
|
+
* @deprecated Use {@link InputTrack.getInternalCodecId} instead.
|
|
149
|
+
*/
|
|
150
|
+
get internalCodecId() {
|
|
151
|
+
return requireSync(this._backing.getInternalCodecId(), 'internalCodecId', 'getInternalCodecId');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Returns the ISO 639-2/T language code for this track. If the language is unknown, this resolves to `'und'`
|
|
156
|
+
* (undetermined).
|
|
157
|
+
*/
|
|
158
|
+
async getLanguageCode() {
|
|
159
|
+
return this._backing.getLanguageCode();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The ISO 639-2/T language code for this track. If the language is unknown, this field is `'und'` (undetermined).
|
|
164
|
+
* @deprecated Use {@link InputTrack.getLanguageCode} instead.
|
|
165
|
+
*/
|
|
166
|
+
get languageCode() {
|
|
167
|
+
return requireSync(this._backing.getLanguageCode(), 'languageCode', 'getLanguageCode');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Returns the user-defined name for this track. */
|
|
171
|
+
async getName() {
|
|
172
|
+
return this._backing.getName();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* A user-defined name for this track.
|
|
177
|
+
* @deprecated Use {@link InputTrack.getName} instead.
|
|
178
|
+
*/
|
|
179
|
+
get name() {
|
|
180
|
+
return requireSync(this._backing.getName(), 'name', 'getName');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Returns a positive number x such that all timestamps and durations of all packets of this track are
|
|
185
|
+
* integer multiples of 1/x.
|
|
186
|
+
*/
|
|
187
|
+
async getTimeResolution() {
|
|
188
|
+
return this._backing.getTimeResolution();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* A positive number x such that all timestamps and durations of all packets of this track are
|
|
193
|
+
* integer multiples of 1/x.
|
|
194
|
+
* @deprecated Use {@link InputTrack.getTimeResolution} instead.
|
|
195
|
+
*/
|
|
196
|
+
get timeResolution() {
|
|
197
|
+
return requireSync(this._backing.getTimeResolution(), 'timeResolution', 'getTimeResolution');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Returns whether the timestamps of this track are relative to the Unix epoch (January 1, 1970 00:00:00 UTC).
|
|
202
|
+
* When `true`, each timestamp maps to a definitive point in time.
|
|
203
|
+
*/
|
|
204
|
+
async isRelativeToUnixEpoch() {
|
|
205
|
+
return this._backing.isRelativeToUnixEpoch();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Returns the Unix time (in seconds since January 1, 1970 00:00:00 UTC) that the given track timestamp (in seconds)
|
|
210
|
+
* maps to, or `null` if there is no such mapping. This provides a piecewise-continuous mapping from this track's
|
|
211
|
+
* timestamp space into wall-clock time. Such mapping exists, for example, for HLS playlists with
|
|
212
|
+
* `#EXT-X-PROGRAM-DATE-TIME` tags present.
|
|
213
|
+
*
|
|
214
|
+
* This mapping can be available even when {@link InputTrack.isRelativeToUnixEpoch} is `false`, for example for HLS
|
|
215
|
+
* streams with program date time information but with {@link HlsInputFormatOptions.offsetTimestampsByDateTime}
|
|
216
|
+
* set to `false`.
|
|
217
|
+
*/
|
|
218
|
+
async getUnixTimeForTimestamp(timestamp: number): Promise<number | null> {
|
|
219
|
+
return this._backing.getUnixTimeForTimestamp(timestamp);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Whether the track's timestamps can be mapped to Unix wall clock time via
|
|
224
|
+
* {@link InputTrack.getUnixTimeForTimestamp}.
|
|
225
|
+
*/
|
|
226
|
+
async hasUnixTimeMapping(): Promise<boolean> {
|
|
227
|
+
return (await this._backing.getUnixTimeForTimestamp(await this.getFirstTimestamp())) !== null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** Returns the track's disposition, i.e. information about its intended usage. */
|
|
231
|
+
async getDisposition() {
|
|
232
|
+
return this._backing.getDisposition();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* The track's disposition, i.e. information about its intended usage.
|
|
237
|
+
* @deprecated Use {@link InputTrack.getDisposition} instead.
|
|
238
|
+
*/
|
|
239
|
+
get disposition() {
|
|
240
|
+
return requireSync(this._backing.getDisposition(), 'disposition', 'getDisposition');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Returns the peak bitrate of the track in bits per second, as specified in the track's metadata. This might not
|
|
245
|
+
* match the actual media data's bitrate.
|
|
246
|
+
*/
|
|
247
|
+
async getBitrate() {
|
|
248
|
+
return this._backing.getBitrate();
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Returns the average bitrate of the track in bits per second, as specified in the track's metadata. This might
|
|
253
|
+
* not match the actual media data's bitrate.
|
|
254
|
+
*/
|
|
255
|
+
async getAverageBitrate() {
|
|
256
|
+
return this._backing.getAverageBitrate();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value
|
|
261
|
+
* may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples
|
|
262
|
+
* with a negative timestamp should not be presented.
|
|
263
|
+
*/
|
|
264
|
+
async getFirstTimestamp() {
|
|
265
|
+
const firstPacket = await this._backing.getFirstPacket({ metadataOnly: true });
|
|
266
|
+
return firstPacket?.timestamp ?? 0;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Returns the end timestamp of the last packet of this track, in seconds.
|
|
271
|
+
*
|
|
272
|
+
* By default, when the underlying media is live, this method will only resolve once the live stream ends. If you
|
|
273
|
+
* want to query the current end timestamp of the stream, set {@link PacketRetrievalOptions.skipLiveWait} to `true`
|
|
274
|
+
* in the options.
|
|
275
|
+
*/
|
|
276
|
+
async computeDuration(options?: PacketRetrievalOptions) {
|
|
277
|
+
const lastPacket = await this._backing.getPacket(Infinity, { metadataOnly: true, ...options });
|
|
278
|
+
const result = (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);
|
|
279
|
+
|
|
280
|
+
return roundToDivisor(result, await this.getTimeResolution());
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Gets the duration (end timestamp) in seconds of this track from metadata stored in the file. This value may be
|
|
285
|
+
* approximate or diverge from the actual, precise duration returned by `.computeDuration()`, but compared to that
|
|
286
|
+
* method, this method is cheaper. When the duration cannot be determined from the file metadata, `null`
|
|
287
|
+
* is returned.
|
|
288
|
+
*
|
|
289
|
+
* By default, when the underlying media is live, this method will only resolve once the live stream
|
|
290
|
+
* ends. If you want to query the current duration of the media, set
|
|
291
|
+
* {@link DurationMetadataRequestOptions.skipLiveWait} to `true` in the options.
|
|
292
|
+
*/
|
|
293
|
+
async getDurationFromMetadata(options: DurationMetadataRequestOptions = {}) {
|
|
294
|
+
return this._backing.getDurationFromMetadata(options);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Computes aggregate packet statistics for this track, such as average packet rate or bitrate.
|
|
299
|
+
*
|
|
300
|
+
* @param targetPacketCount - This optional parameter sets a target for how many packets this method must have
|
|
301
|
+
* looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all
|
|
302
|
+
* packets. This is very useful for getting a great estimate of video frame rate without having to scan through the
|
|
303
|
+
* entire file.
|
|
304
|
+
*
|
|
305
|
+
* By default, when the underlying media is live and `targetPacketCount` is not set, this method will only resolve
|
|
306
|
+
* once the live stream ends. If you want to query the current packet statistics of the stream, set
|
|
307
|
+
* {@link PacketRetrievalOptions.skipLiveWait} to `true` in the options.
|
|
308
|
+
*/
|
|
309
|
+
async computePacketStats(targetPacketCount = Infinity, options?: PacketRetrievalOptions): Promise<PacketStats> {
|
|
310
|
+
const sink = new EncodedPacketSink(this);
|
|
311
|
+
|
|
312
|
+
let startTimestamp = Infinity;
|
|
313
|
+
let endTimestamp = -Infinity;
|
|
314
|
+
let packetCount = 0;
|
|
315
|
+
let totalPacketBytes = 0;
|
|
316
|
+
|
|
317
|
+
for await (const packet of sink.packets(undefined, undefined, { metadataOnly: true, ...options })) {
|
|
318
|
+
if (
|
|
319
|
+
packetCount >= targetPacketCount
|
|
320
|
+
// This additional condition is needed to produce correct results with out-of-presentation-order packets
|
|
321
|
+
&& packet.timestamp >= endTimestamp
|
|
322
|
+
) {
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
startTimestamp = Math.min(startTimestamp, packet.timestamp);
|
|
327
|
+
endTimestamp = Math.max(endTimestamp, packet.timestamp + packet.duration);
|
|
328
|
+
|
|
329
|
+
packetCount++;
|
|
330
|
+
totalPacketBytes += packet.byteLength;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
packetCount,
|
|
335
|
+
averagePacketRate: packetCount
|
|
336
|
+
? Number((packetCount / (endTimestamp - startTimestamp)).toPrecision(16))
|
|
337
|
+
: 0,
|
|
338
|
+
averageBitrate: packetCount
|
|
339
|
+
? Number((8 * totalPacketBytes / (endTimestamp - startTimestamp)).toPrecision(16))
|
|
340
|
+
: 0,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Whether or not this track is currently live, meaning the media's end is still unknown.
|
|
346
|
+
*
|
|
347
|
+
* The value returned by this method may change over time as the track stops being live. To keep track of the
|
|
348
|
+
* track's live status, poll this method at the track's refresh interval
|
|
349
|
+
* via {@link InputTrack.getLiveRefreshInterval}.
|
|
350
|
+
*/
|
|
351
|
+
async isLive() {
|
|
352
|
+
return (await this._backing.getLiveRefreshInterval()) !== null;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Returns the track's live refresh interval in seconds, or `null` if the track is not live. This interval describes
|
|
357
|
+
* the time it takes, on average, for new live media data to become available.
|
|
358
|
+
*/
|
|
359
|
+
async getLiveRefreshInterval() {
|
|
360
|
+
return this._backing.getLiveRefreshInterval();
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Returns `true` if this track can be paired with the given track. Two tracks being pairable means they can be
|
|
365
|
+
* presented (displayed) together.
|
|
366
|
+
*
|
|
367
|
+
* Returns `false` if `other` equals `this`.
|
|
368
|
+
*/
|
|
369
|
+
canBePairedWith(other: InputTrack) {
|
|
370
|
+
if (!(other instanceof InputTrack)) {
|
|
371
|
+
throw new TypeError('other must be an InputTrack.');
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (this.input !== other.input || this === other) {
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return (this._backing.getPairingMask() & other._backing.getPairingMask()) !== 0n;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Gets the list of other tracks that can be paired with this track. An optional query can be provided to narrow
|
|
383
|
+
* down the results.
|
|
384
|
+
*/
|
|
385
|
+
async getPairableTracks(query?: InputTrackQuery<InputTrack>) {
|
|
386
|
+
return this.input.getTracks(mergeInputTrackQueries({
|
|
387
|
+
filter: t => t.canBePairedWith(this),
|
|
388
|
+
}, query));
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Gets the list of other video tracks that can be paired with this track. An optional query can be provided to
|
|
393
|
+
* narrow down the results.
|
|
394
|
+
*/
|
|
395
|
+
async getPairableVideoTracks(query?: InputTrackQuery<InputVideoTrack>) {
|
|
396
|
+
return this.input.getVideoTracks(mergeInputTrackQueries({
|
|
397
|
+
filter: t => t.canBePairedWith(this),
|
|
398
|
+
}, query));
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Gets the list of other audio tracks that can be paired with this track. An optional query can be provided to
|
|
403
|
+
* narrow down the results.
|
|
404
|
+
*/
|
|
405
|
+
async getPairableAudioTracks(query?: InputTrackQuery<InputAudioTrack>) {
|
|
406
|
+
return this.input.getAudioTracks(mergeInputTrackQueries({
|
|
407
|
+
filter: t => t.canBePairedWith(this),
|
|
408
|
+
}, query));
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** Returns the primary track that can be paired with this track, optionally steered by the provided query. */
|
|
412
|
+
async getPrimaryPairableVideoTrack(query?: InputTrackQuery<InputVideoTrack>) {
|
|
413
|
+
return this.input.getPrimaryVideoTrack(mergeInputTrackQueries({
|
|
414
|
+
filter: t => t.canBePairedWith(this),
|
|
415
|
+
}, query));
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** Returns the primary track that can be paired with this track, optionally steered by the provided query. */
|
|
419
|
+
async getPrimaryPairableAudioTrack(query?: InputTrackQuery<InputAudioTrack>) {
|
|
420
|
+
return this.input.getPrimaryAudioTrack(mergeInputTrackQueries({
|
|
421
|
+
filter: t => t.canBePairedWith(this),
|
|
422
|
+
}, query));
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** Returns `true` if there is another track that can be paired with this track. */
|
|
426
|
+
async hasPairableTrack(predicate?: (track: InputTrack) => MaybePromise<boolean>): Promise<boolean> {
|
|
427
|
+
predicate &&= toValidatedPredicate(predicate);
|
|
428
|
+
|
|
429
|
+
const tracks = await this.input.getTracks();
|
|
430
|
+
for (const track of tracks) {
|
|
431
|
+
if (!this.canBePairedWith(track)) {
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
if (!predicate || await predicate(track)) {
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/** Returns `true` if there is a video track that can be paired with this track. */
|
|
443
|
+
hasPairableVideoTrack(predicate?: (track: InputVideoTrack) => MaybePromise<boolean>): Promise<boolean> {
|
|
444
|
+
predicate &&= toValidatedPredicate(predicate);
|
|
445
|
+
|
|
446
|
+
return this.hasPairableTrack(async x =>
|
|
447
|
+
x.isVideoTrack() && (!predicate || await predicate(x)),
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/** Returns `true` if there is an audio track that can be paired with this track. */
|
|
452
|
+
hasPairableAudioTrack(predicate?: (track: InputAudioTrack) => MaybePromise<boolean>): Promise<boolean> {
|
|
453
|
+
predicate &&= toValidatedPredicate(predicate);
|
|
454
|
+
|
|
455
|
+
return this.hasPairableTrack(async x =>
|
|
456
|
+
x.isAudioTrack() && (!predicate || await predicate(x)),
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
const requireSync = <T>(value: MaybePromise<T>, getterName: string, asyncName: string): T => {
|
|
462
|
+
if (value instanceof Promise) {
|
|
463
|
+
throw new Error(
|
|
464
|
+
`'${getterName}' is deprecated and not available synchronously for this track. Use the preferred`
|
|
465
|
+
+ ` '${asyncName}()' instead.`,
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
return value;
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
const toValidatedPredicate = <T extends InputTrack>(
|
|
472
|
+
predicate?: (track: T) => MaybePromise<boolean>,
|
|
473
|
+
) => {
|
|
474
|
+
if (predicate !== undefined && typeof predicate !== 'function') {
|
|
475
|
+
throw new TypeError('predicate, when provided, must be a function.');
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return predicate
|
|
479
|
+
? (track: T) => {
|
|
480
|
+
const handle = (result: boolean) => {
|
|
481
|
+
if (typeof result !== 'boolean') {
|
|
482
|
+
throw new TypeError('predicate must return or resolve to a boolean value.');
|
|
483
|
+
}
|
|
484
|
+
return result;
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
const result = predicate(track);
|
|
488
|
+
if (result instanceof Promise) {
|
|
489
|
+
return result.then(handle);
|
|
490
|
+
}
|
|
491
|
+
return handle(result);
|
|
492
|
+
}
|
|
493
|
+
: undefined;
|
|
494
|
+
};
|
|
495
|
+
|
|
496
|
+
export interface InputVideoTrackBacking extends InputTrackBacking {
|
|
497
|
+
getType(): 'video';
|
|
498
|
+
getCodec(): MaybePromise<VideoCodec | null>;
|
|
499
|
+
getCodedWidth(): MaybePromise<number>;
|
|
500
|
+
getCodedHeight(): MaybePromise<number>;
|
|
501
|
+
getSquarePixelWidth(): MaybePromise<number>;
|
|
502
|
+
getSquarePixelHeight(): MaybePromise<number>;
|
|
503
|
+
getMetadataDisplayWidth?(): MaybePromise<number | null>;
|
|
504
|
+
getMetadataDisplayHeight?(): MaybePromise<number | null>;
|
|
505
|
+
getRotation(): MaybePromise<Rotation>;
|
|
506
|
+
getColorSpace(): Promise<VideoColorSpaceInit>;
|
|
507
|
+
canBeTransparent(): Promise<boolean>;
|
|
508
|
+
getDecoderConfig(): Promise<VideoDecoderConfig | null>;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Represents a video track in an input file.
|
|
513
|
+
* @group Input files & tracks
|
|
514
|
+
* @public
|
|
515
|
+
*/
|
|
516
|
+
export class InputVideoTrack extends InputTrack {
|
|
517
|
+
/** @internal */
|
|
518
|
+
override _backing: InputVideoTrackBacking;
|
|
519
|
+
/** @internal */
|
|
520
|
+
_pixelAspectRatioCache: Rational | null = null;
|
|
521
|
+
|
|
522
|
+
/** @internal */
|
|
523
|
+
constructor(input: Input, backing: InputVideoTrackBacking) {
|
|
524
|
+
super(input, backing);
|
|
525
|
+
|
|
526
|
+
this._backing = backing;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
get type(): TrackType {
|
|
530
|
+
return 'video';
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/** The codec of the track's packets. */
|
|
534
|
+
async getCodec(): Promise<VideoCodec | null> {
|
|
535
|
+
return this._backing.getCodec();
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* The codec of the track's packets.
|
|
540
|
+
* @deprecated Use {@link InputVideoTrack.getCodec} instead.
|
|
541
|
+
*/
|
|
542
|
+
get codec(): VideoCodec | null {
|
|
543
|
+
return requireSync(this._backing.getCodec(), 'codec', 'getCodec');
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
async hasOnlyKeyPackets() {
|
|
547
|
+
return (await this._backing.getHasOnlyKeyPackets?.())
|
|
548
|
+
?? (await this._backing.getCodec() === 'prores'); // Only ProRes is fully intra-frame
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/** Returns the width in pixels of the track's coded samples, before any transformations or rotations. */
|
|
552
|
+
async getCodedWidth() {
|
|
553
|
+
return this._backing.getCodedWidth();
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* The width in pixels of the track's coded samples, before any transformations or rotations.
|
|
558
|
+
* @deprecated Use {@link InputVideoTrack.getCodedWidth} instead.
|
|
559
|
+
*/
|
|
560
|
+
get codedWidth() {
|
|
561
|
+
return requireSync(this._backing.getCodedWidth(), 'codedWidth', 'getCodedWidth');
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/** Returns the height in pixels of the track's coded samples, before any transformations or rotations. */
|
|
565
|
+
async getCodedHeight() {
|
|
566
|
+
return this._backing.getCodedHeight();
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* The height in pixels of the track's coded samples, before any transformations or rotations.
|
|
571
|
+
* @deprecated Use {@link InputVideoTrack.getCodedHeight} instead.
|
|
572
|
+
*/
|
|
573
|
+
get codedHeight() {
|
|
574
|
+
return requireSync(this._backing.getCodedHeight(), 'codedHeight', 'getCodedHeight');
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/** Returns the angle in degrees by which the track's frames should be rotated (clockwise). */
|
|
578
|
+
async getRotation() {
|
|
579
|
+
return this._backing.getRotation();
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* The angle in degrees by which the track's frames should be rotated (clockwise).
|
|
584
|
+
* @deprecated Use {@link InputVideoTrack.getRotation} instead.
|
|
585
|
+
*/
|
|
586
|
+
get rotation() {
|
|
587
|
+
return requireSync(this._backing.getRotation(), 'rotation', 'getRotation');
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Returns the width of the track's frames in square pixels, adjusted for pixel aspect ratio but before rotation.
|
|
592
|
+
*/
|
|
593
|
+
async getSquarePixelWidth() {
|
|
594
|
+
return this._backing.getSquarePixelWidth();
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* The width of the track's frames in square pixels, adjusted for pixel aspect ratio but before rotation.
|
|
599
|
+
* @deprecated Use {@link InputVideoTrack.getSquarePixelWidth} instead.
|
|
600
|
+
*/
|
|
601
|
+
get squarePixelWidth() {
|
|
602
|
+
return requireSync(this._backing.getSquarePixelWidth(), 'squarePixelWidth', 'getSquarePixelWidth');
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/**
|
|
606
|
+
* Returns the height of the track's frames in square pixels, adjusted for pixel aspect ratio but before rotation.
|
|
607
|
+
*/
|
|
608
|
+
async getSquarePixelHeight() {
|
|
609
|
+
return this._backing.getSquarePixelHeight();
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* The height of the track's frames in square pixels, adjusted for pixel aspect ratio but before rotation.
|
|
614
|
+
* @deprecated Use {@link InputVideoTrack.getSquarePixelHeight} instead.
|
|
615
|
+
*/
|
|
616
|
+
get squarePixelHeight() {
|
|
617
|
+
return requireSync(this._backing.getSquarePixelHeight(), 'squarePixelHeight', 'getSquarePixelHeight');
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* Returns the pixel aspect ratio of the track's frames as a rational number in its reduced form. Most videos use
|
|
622
|
+
* square pixels (1:1).
|
|
623
|
+
*/
|
|
624
|
+
async getPixelAspectRatio() {
|
|
625
|
+
// Potential minor async race condition here if called twice, but doesn't matter since the computation is
|
|
626
|
+
// so cheap
|
|
627
|
+
return this._pixelAspectRatioCache ??= simplifyRational({
|
|
628
|
+
num: (await this.getSquarePixelWidth()) * (await this.getCodedHeight()),
|
|
629
|
+
den: (await this.getSquarePixelHeight()) * (await this.getCodedWidth()),
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* The pixel aspect ratio of the track's frames, as a rational number in its reduced form. Most videos use
|
|
635
|
+
* square pixels (1:1).
|
|
636
|
+
* @deprecated Use {@link InputVideoTrack.getPixelAspectRatio} instead.
|
|
637
|
+
*/
|
|
638
|
+
get pixelAspectRatio() {
|
|
639
|
+
return this._pixelAspectRatioCache ??= simplifyRational({
|
|
640
|
+
num: requireSync(this._backing.getSquarePixelWidth(), 'pixelAspectRatio', 'getPixelAspectRatio')
|
|
641
|
+
* requireSync(this._backing.getCodedHeight(), 'pixelAspectRatio', 'getPixelAspectRatio'),
|
|
642
|
+
den: requireSync(this._backing.getSquarePixelHeight(), 'pixelAspectRatio', 'getPixelAspectRatio')
|
|
643
|
+
* requireSync(this._backing.getCodedWidth(), 'pixelAspectRatio', 'getPixelAspectRatio'),
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/** Returns the display width of the track's frames in pixels, after aspect ratio adjustment and rotation. */
|
|
648
|
+
async getDisplayWidth() {
|
|
649
|
+
const metadata = await this._backing.getMetadataDisplayWidth?.();
|
|
650
|
+
if (metadata != null) {
|
|
651
|
+
return metadata;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
const rotation = await this.getRotation();
|
|
655
|
+
return rotation % 180 === 0 ? this.getSquarePixelWidth() : this.getSquarePixelHeight();
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* The display width of the track's frames in pixels, after aspect ratio adjustment and rotation.
|
|
660
|
+
* @deprecated Use {@link InputVideoTrack.getDisplayWidth} instead.
|
|
661
|
+
*/
|
|
662
|
+
get displayWidth() {
|
|
663
|
+
const metadataRaw = this._backing.getMetadataDisplayWidth?.();
|
|
664
|
+
if (metadataRaw !== undefined) {
|
|
665
|
+
const metadata = requireSync(metadataRaw, 'displayWidth', 'getDisplayWidth');
|
|
666
|
+
if (metadata !== null) {
|
|
667
|
+
return metadata;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
const rotation = requireSync(this._backing.getRotation(), 'displayWidth', 'getDisplayWidth');
|
|
672
|
+
const value = rotation % 180 === 0
|
|
673
|
+
? this._backing.getSquarePixelWidth()
|
|
674
|
+
: this._backing.getSquarePixelHeight();
|
|
675
|
+
return requireSync(value, 'displayWidth', 'getDisplayWidth');
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/** Returns the display height of the track's frames in pixels, after aspect ratio adjustment and rotation. */
|
|
679
|
+
async getDisplayHeight() {
|
|
680
|
+
const metadata = await this._backing.getMetadataDisplayHeight?.();
|
|
681
|
+
if (metadata != null) {
|
|
682
|
+
return metadata;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
const rotation = await this.getRotation();
|
|
686
|
+
return rotation % 180 === 0 ? this.getSquarePixelHeight() : this.getSquarePixelWidth();
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* The display height of the track's frames in pixels, after aspect ratio adjustment and rotation.
|
|
691
|
+
* @deprecated Use {@link InputVideoTrack.getDisplayHeight} instead.
|
|
692
|
+
*/
|
|
693
|
+
get displayHeight() {
|
|
694
|
+
const metadataRaw = this._backing.getMetadataDisplayHeight?.();
|
|
695
|
+
if (metadataRaw !== undefined) {
|
|
696
|
+
const metadata = requireSync(metadataRaw, 'displayHeight', 'getDisplayHeight');
|
|
697
|
+
if (metadata !== null) {
|
|
698
|
+
return metadata;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
const rotation = requireSync(this._backing.getRotation(), 'displayHeight', 'getDisplayHeight');
|
|
703
|
+
const value = rotation % 180 === 0
|
|
704
|
+
? this._backing.getSquarePixelHeight()
|
|
705
|
+
: this._backing.getSquarePixelWidth();
|
|
706
|
+
return requireSync(value, 'displayHeight', 'getDisplayHeight');
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/** Returns the color space of the track's samples. */
|
|
710
|
+
async getColorSpace() {
|
|
711
|
+
return this._backing.getColorSpace();
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
/** If this method returns true, the track's samples use a high dynamic range (HDR). */
|
|
715
|
+
async hasHighDynamicRange() {
|
|
716
|
+
const colorSpace = await this._backing.getColorSpace();
|
|
717
|
+
|
|
718
|
+
return (colorSpace.primaries as string) === 'bt2020' || (colorSpace.primaries as string) === 'smpte432'
|
|
719
|
+
|| (colorSpace.transfer as string) === 'pq' || (colorSpace.transfer as string) === 'hlg'
|
|
720
|
+
|| (colorSpace.matrix as string) === 'bt2020-ncl';
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/** Checks if this track may contain transparent samples with alpha data. */
|
|
724
|
+
async canBeTransparent() {
|
|
725
|
+
return this._backing.canBeTransparent();
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/**
|
|
729
|
+
* Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#video-decoder-config) for decoding the
|
|
730
|
+
* track's packets using a [`VideoDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder). Returns
|
|
731
|
+
* null if the track's codec is unknown.
|
|
732
|
+
*/
|
|
733
|
+
async getDecoderConfig() {
|
|
734
|
+
return this._backing.getDecoderConfig();
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
async getCodecParameterString() {
|
|
738
|
+
const fromMetadata = await this._backing.getMetadataCodecParameterString?.();
|
|
739
|
+
if (fromMetadata != null) {
|
|
740
|
+
return fromMetadata;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const decoderConfig = await this._backing.getDecoderConfig();
|
|
744
|
+
return decoderConfig?.codec ?? null;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
async canDecode() {
|
|
748
|
+
try {
|
|
749
|
+
const decoderConfig = await this._backing.getDecoderConfig();
|
|
750
|
+
if (!decoderConfig) {
|
|
751
|
+
return false;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
const codec = await this._backing.getCodec();
|
|
755
|
+
assert(codec !== null);
|
|
756
|
+
|
|
757
|
+
if (customVideoDecoders.some(x => x.supports(codec, decoderConfig))) {
|
|
758
|
+
return true;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
if (typeof VideoDecoder === 'undefined') {
|
|
762
|
+
return false;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
const support = await VideoDecoder.isConfigSupported(decoderConfig);
|
|
766
|
+
return support.supported === true;
|
|
767
|
+
} catch (error) {
|
|
768
|
+
Logging._error('Error during decodability check:', error);
|
|
769
|
+
return false;
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
async determinePacketType(packet: EncodedPacket): Promise<PacketType | null> {
|
|
774
|
+
if (!(packet instanceof EncodedPacket)) {
|
|
775
|
+
throw new TypeError('packet must be an EncodedPacket.');
|
|
776
|
+
}
|
|
777
|
+
if (packet.isMetadataOnly) {
|
|
778
|
+
throw new TypeError('packet must not be metadata-only to determine its type.');
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
const codec = await this.getCodec();
|
|
782
|
+
if (codec === null) {
|
|
783
|
+
return null;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
const decoderConfig = await this.getDecoderConfig();
|
|
787
|
+
assert(decoderConfig);
|
|
788
|
+
|
|
789
|
+
return determineVideoPacketType(codec, decoderConfig, packet.data);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
export interface InputAudioTrackBacking extends InputTrackBacking {
|
|
794
|
+
getType(): 'audio';
|
|
795
|
+
getCodec(): MaybePromise<AudioCodec | null>;
|
|
796
|
+
getNumberOfChannels(): MaybePromise<number>;
|
|
797
|
+
getSampleRate(): MaybePromise<number>;
|
|
798
|
+
getDecoderConfig(): Promise<AudioDecoderConfig | null>;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
/**
|
|
802
|
+
* Represents an audio track in an input file.
|
|
803
|
+
* @group Input files & tracks
|
|
804
|
+
* @public
|
|
805
|
+
*/
|
|
806
|
+
export class InputAudioTrack extends InputTrack {
|
|
807
|
+
/** @internal */
|
|
808
|
+
override _backing: InputAudioTrackBacking;
|
|
809
|
+
|
|
810
|
+
/** @internal */
|
|
811
|
+
constructor(input: Input, backing: InputAudioTrackBacking) {
|
|
812
|
+
super(input, backing);
|
|
813
|
+
|
|
814
|
+
this._backing = backing;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
get type(): TrackType {
|
|
818
|
+
return 'audio';
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
/** The codec of the track's packets. */
|
|
822
|
+
async getCodec(): Promise<AudioCodec | null> {
|
|
823
|
+
return this._backing.getCodec();
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* The codec of the track's packets.
|
|
828
|
+
* @deprecated Use {@link InputAudioTrack.getCodec} instead.
|
|
829
|
+
*/
|
|
830
|
+
get codec(): AudioCodec | null {
|
|
831
|
+
return requireSync(this._backing.getCodec(), 'codec', 'getCodec');
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
async hasOnlyKeyPackets() {
|
|
835
|
+
return (await this._backing.getHasOnlyKeyPackets?.()) ?? true;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
/** Returns the number of audio channels in the track. */
|
|
839
|
+
async getNumberOfChannels() {
|
|
840
|
+
return this._backing.getNumberOfChannels();
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
/**
|
|
844
|
+
* The number of audio channels in the track.
|
|
845
|
+
* @deprecated Use {@link InputAudioTrack.getNumberOfChannels} instead.
|
|
846
|
+
*/
|
|
847
|
+
get numberOfChannels() {
|
|
848
|
+
return requireSync(this._backing.getNumberOfChannels(), 'numberOfChannels', 'getNumberOfChannels');
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/** Returns the track's audio sample rate in hertz. */
|
|
852
|
+
async getSampleRate() {
|
|
853
|
+
return this._backing.getSampleRate();
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* The track's audio sample rate in hertz.
|
|
858
|
+
* @deprecated Use {@link InputAudioTrack.getSampleRate} instead.
|
|
859
|
+
*/
|
|
860
|
+
get sampleRate() {
|
|
861
|
+
return requireSync(this._backing.getSampleRate(), 'sampleRate', 'getSampleRate');
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#audio-decoder-config) for decoding the
|
|
866
|
+
* track's packets using an [`AudioDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder). Returns
|
|
867
|
+
* null if the track's codec is unknown.
|
|
868
|
+
*/
|
|
869
|
+
async getDecoderConfig() {
|
|
870
|
+
return this._backing.getDecoderConfig();
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
async getCodecParameterString() {
|
|
874
|
+
const fromMetadata = await this._backing.getMetadataCodecParameterString?.();
|
|
875
|
+
if (fromMetadata != null) {
|
|
876
|
+
return fromMetadata;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
const decoderConfig = await this._backing.getDecoderConfig();
|
|
880
|
+
return decoderConfig?.codec ?? null;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
async canDecode() {
|
|
884
|
+
try {
|
|
885
|
+
const decoderConfig = await this._backing.getDecoderConfig();
|
|
886
|
+
if (!decoderConfig) {
|
|
887
|
+
return false;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
const codec = await this._backing.getCodec();
|
|
891
|
+
assert(codec !== null);
|
|
892
|
+
|
|
893
|
+
if (customAudioDecoders.some(x => x.supports(codec, decoderConfig))) {
|
|
894
|
+
return true;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
if (decoderConfig.codec.startsWith('pcm-')) {
|
|
898
|
+
return true; // Since we decode it ourselves
|
|
899
|
+
} else {
|
|
900
|
+
if (typeof AudioDecoder === 'undefined') {
|
|
901
|
+
return false;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
const support = await AudioDecoder.isConfigSupported(decoderConfig);
|
|
905
|
+
return support.supported === true;
|
|
906
|
+
}
|
|
907
|
+
} catch (error) {
|
|
908
|
+
Logging._error('Error during decodability check:', error);
|
|
909
|
+
return false;
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
async determinePacketType(packet: EncodedPacket): Promise<PacketType | null> {
|
|
914
|
+
if (!(packet instanceof EncodedPacket)) {
|
|
915
|
+
throw new TypeError('packet must be an EncodedPacket.');
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
if ((await this.getCodec()) === null) {
|
|
919
|
+
return null;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
return 'key'; // No audio codec with delta packets
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* Defines a query for input tracks. Can be used to query tracks tersely and expressively, which is especially useful
|
|
928
|
+
* for media inputs with many tracks, such as HLS manifests.
|
|
929
|
+
*
|
|
930
|
+
* @group Input files & tracks
|
|
931
|
+
* @public
|
|
932
|
+
*/
|
|
933
|
+
export type InputTrackQuery<T extends InputTrack> = {
|
|
934
|
+
/**
|
|
935
|
+
* A filter predicate function called for every track. Returning or resolving to `false` excludes the track from
|
|
936
|
+
* the result.
|
|
937
|
+
*/
|
|
938
|
+
filter?: (track: T) => MaybePromise<boolean>;
|
|
939
|
+
/**
|
|
940
|
+
* A function called for every track, used to define a track ordering. Tracks are ordered in ascending order using
|
|
941
|
+
* the value returned by this function. When the function returns an array of numbers `arr`, tracks will be sorted
|
|
942
|
+
* by `arr[0]` unless they have the same value, in which case they will be sorted by `arr[1]`, and so on. This
|
|
943
|
+
* allows you to construct a list of ordering criteria, sorted by importance.
|
|
944
|
+
*
|
|
945
|
+
* To help construct complex ordering criteria, the {@link asc}, {@link desc}, and {@link prefer} helper functions
|
|
946
|
+
* can be used.
|
|
947
|
+
*/
|
|
948
|
+
sortBy?: (track: T) => MaybePromise<number | number[]>;
|
|
949
|
+
};
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* Helper function for use in {@link InputTrackQuery.sortBy}, used to describe sorting tracks by a numeric property in
|
|
953
|
+
* ascending order. `null` and `undefined` are accepted too and are last in the order (sorted to the end).
|
|
954
|
+
*
|
|
955
|
+
* @group Input files & tracks
|
|
956
|
+
* @public
|
|
957
|
+
*/
|
|
958
|
+
export const asc = (value: number | null | undefined) => {
|
|
959
|
+
return value ?? Infinity; // nulls and undefined last
|
|
960
|
+
};
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* Helper function for use in {@link InputTrackQuery.sortBy}, used to describe sorting tracks by a numeric property in
|
|
964
|
+
* descending order. `null` and `undefined` are accepted too and are last in the order (sorted to the end).
|
|
965
|
+
*
|
|
966
|
+
* @group Input files & tracks
|
|
967
|
+
* @public
|
|
968
|
+
*/
|
|
969
|
+
export const desc = (value: number | null | undefined) => {
|
|
970
|
+
return -(value ?? -Infinity); // nulls and undefined last
|
|
971
|
+
};
|
|
972
|
+
|
|
973
|
+
/**
|
|
974
|
+
* Helper function for use in {@link InputTrackQuery.sortBy}, used to sort tracks by boolean properties. `true` is
|
|
975
|
+
* sorted to the start, `false` to the end. Useful for expressing soft preferences (e.g., "I'd prefer 1080p, but other
|
|
976
|
+
* resolutions are fine too") as opposed to {@link InputTrackQuery.filter} which expresses hard requirements for
|
|
977
|
+
* tracks.
|
|
978
|
+
*
|
|
979
|
+
* @group Input files & tracks
|
|
980
|
+
* @public
|
|
981
|
+
*/
|
|
982
|
+
export const prefer = (value: boolean) => {
|
|
983
|
+
return -value;
|
|
984
|
+
};
|
|
985
|
+
|
|
986
|
+
export const toValidatedInputTrackQuery = <T extends InputTrack>(
|
|
987
|
+
query: InputTrackQuery<T>,
|
|
988
|
+
): InputTrackQuery<T> => {
|
|
989
|
+
if (typeof query !== 'object' || !query) {
|
|
990
|
+
throw new TypeError('query must be an object.');
|
|
991
|
+
}
|
|
992
|
+
if (query.filter !== undefined && typeof query.filter !== 'function') {
|
|
993
|
+
throw new TypeError('query.filter, when provided, must be a function.');
|
|
994
|
+
}
|
|
995
|
+
if (query.sortBy !== undefined && typeof query.sortBy !== 'function') {
|
|
996
|
+
throw new TypeError('query.sortBy, when provided, must be a function.');
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
// Instead of validating the return types of the functions everywhere the query is used, simply return a new query
|
|
1000
|
+
// which wraps the old one while validating it.
|
|
1001
|
+
return {
|
|
1002
|
+
filter: query.filter
|
|
1003
|
+
? (track) => {
|
|
1004
|
+
const handle = (bool: boolean) => {
|
|
1005
|
+
if (typeof bool !== 'boolean') {
|
|
1006
|
+
throw new TypeError('query.filter must return or resolve to a boolean.');
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
return bool;
|
|
1010
|
+
};
|
|
1011
|
+
|
|
1012
|
+
const result = query.filter!(track);
|
|
1013
|
+
if (result instanceof Promise) {
|
|
1014
|
+
return result.then(handle);
|
|
1015
|
+
} else {
|
|
1016
|
+
return handle(result);
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
: undefined,
|
|
1020
|
+
sortBy: query.sortBy
|
|
1021
|
+
? (track) => {
|
|
1022
|
+
const handle = (value: number | number[]) => {
|
|
1023
|
+
if (
|
|
1024
|
+
typeof value !== 'number'
|
|
1025
|
+
&& (!Array.isArray(value) || !value.every(x => typeof x === 'number'))
|
|
1026
|
+
) {
|
|
1027
|
+
throw new TypeError(
|
|
1028
|
+
'query.sortBy must return or resolve to a number or an array of numbers.',
|
|
1029
|
+
);
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
return value;
|
|
1033
|
+
};
|
|
1034
|
+
|
|
1035
|
+
const result = query.sortBy!(track);
|
|
1036
|
+
if (result instanceof Promise) {
|
|
1037
|
+
return result.then(handle);
|
|
1038
|
+
} else {
|
|
1039
|
+
return handle(result);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
: undefined,
|
|
1043
|
+
};
|
|
1044
|
+
};
|
|
1045
|
+
|
|
1046
|
+
export const mergeInputTrackQueries = <T extends InputTrack>(
|
|
1047
|
+
queryA: InputTrackQuery<T> | undefined,
|
|
1048
|
+
queryB: InputTrackQuery<T> | undefined,
|
|
1049
|
+
): InputTrackQuery<T> => {
|
|
1050
|
+
return {
|
|
1051
|
+
filter: queryA?.filter || queryB?.filter
|
|
1052
|
+
? (track) => {
|
|
1053
|
+
const resultA = queryA?.filter?.(track) ?? true;
|
|
1054
|
+
const handleResultA = (resultA: boolean) => {
|
|
1055
|
+
if (resultA === false) {
|
|
1056
|
+
return false;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
return queryB?.filter?.(track) ?? true;
|
|
1060
|
+
};
|
|
1061
|
+
|
|
1062
|
+
if (resultA instanceof Promise) {
|
|
1063
|
+
return resultA.then(handleResultA);
|
|
1064
|
+
} else {
|
|
1065
|
+
return handleResultA(resultA);
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
: undefined,
|
|
1069
|
+
sortBy: queryA?.sortBy || queryB?.sortBy
|
|
1070
|
+
? (track) => {
|
|
1071
|
+
const resultA = queryA?.sortBy?.(track) ?? [];
|
|
1072
|
+
const resultB = queryB?.sortBy?.(track) ?? [];
|
|
1073
|
+
|
|
1074
|
+
type Result = Awaited<typeof resultA>;
|
|
1075
|
+
const join = (resultA: Result, resultB: Result) => {
|
|
1076
|
+
return [
|
|
1077
|
+
...(Array.isArray(resultA) ? resultA : [resultA]),
|
|
1078
|
+
...(Array.isArray(resultB) ? resultB : [resultB]),
|
|
1079
|
+
];
|
|
1080
|
+
};
|
|
1081
|
+
|
|
1082
|
+
if (resultA instanceof Promise || resultB instanceof Promise) {
|
|
1083
|
+
return Promise.all([resultA, resultB]).then(([resultA, resultB]) => {
|
|
1084
|
+
return join(resultA, resultB);
|
|
1085
|
+
});
|
|
1086
|
+
} else {
|
|
1087
|
+
return join(resultA, resultB);
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
: undefined,
|
|
1091
|
+
};
|
|
1092
|
+
};
|
|
1093
|
+
|
|
1094
|
+
export const queryInputTracks = async <T extends InputTrack>(
|
|
1095
|
+
tracks: T[],
|
|
1096
|
+
query?: InputTrackQuery<T>,
|
|
1097
|
+
): Promise<T[]> => {
|
|
1098
|
+
let matched = tracks;
|
|
1099
|
+
if (query?.filter) {
|
|
1100
|
+
const filterMatches = tracks.map(t => query.filter!(t));
|
|
1101
|
+
const hasAsyncFilter = filterMatches.some(x => x instanceof Promise);
|
|
1102
|
+
if (hasAsyncFilter) {
|
|
1103
|
+
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
1104
|
+
const resolvedFilterMatches = await Promise.all(filterMatches);
|
|
1105
|
+
matched = tracks.filter((_, i) => resolvedFilterMatches[i]);
|
|
1106
|
+
} else {
|
|
1107
|
+
matched = tracks.filter((_, i) => filterMatches[i] as boolean);
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
if (!query?.sortBy) {
|
|
1112
|
+
return matched;
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
const sortValues = matched.map(t => query.sortBy!(t));
|
|
1116
|
+
const hasAsyncSort = sortValues.some(x => x instanceof Promise);
|
|
1117
|
+
const resolvedSortValues = hasAsyncSort
|
|
1118
|
+
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
1119
|
+
? await Promise.all(sortValues)
|
|
1120
|
+
: sortValues as (number | number[])[];
|
|
1121
|
+
|
|
1122
|
+
return matched
|
|
1123
|
+
.map((track, i) => ({ track, sortValue: resolvedSortValues[i] }))
|
|
1124
|
+
.sort((a, b) => {
|
|
1125
|
+
const aValues = Array.isArray(a.sortValue) ? a.sortValue : [a.sortValue];
|
|
1126
|
+
const bValues = Array.isArray(b.sortValue) ? b.sortValue : [b.sortValue];
|
|
1127
|
+
const maxLength = Math.max(aValues.length, bValues.length);
|
|
1128
|
+
|
|
1129
|
+
for (let i = 0; i < maxLength; i++) {
|
|
1130
|
+
const aValue = aValues[i] ?? 0;
|
|
1131
|
+
const bValue = bValues[i] ?? 0;
|
|
1132
|
+
if (aValue === bValue) {
|
|
1133
|
+
continue;
|
|
1134
|
+
}
|
|
1135
|
+
return aValue - bValue;
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
return 0;
|
|
1139
|
+
})
|
|
1140
|
+
.map(x => x.track);
|
|
1141
|
+
};
|