diff --git a/README.md b/README.md
index 4f377c1..f6230ae 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
-ffprobe-wasm
-==========
+# ffprobe-wasm
Gather information from multimedia streams. Works on the browser and Node.js.
@@ -18,25 +17,30 @@ npm install ffprobe-wasm
Node.js
```ts
-import { FFprobeWorker } from 'ffprobe-wasm/node.mjs';
+import { FFprobeWorker } from "ffprobe-wasm";
const worker = new FFprobeWorker();
-const fileInfo = await worker.getFileInfo('file.mp4');
+const fileInfo = await worker.getFileInfo("file.mp4");
console.log(fileInfo);
```
Browser
```ts
-import { FFprobeWorker } from 'ffprobe-wasm/browser.mjs';
+import { FFprobeWorker } from "ffprobe-wasm";
const worker = new FFprobeWorker();
-// input is the reference to a element
-input.addEventListener('change', (event) => {
- const file = event.target.files[0]
+// input is the reference to an element
+input.addEventListener("change", (event) => {
+ const file = event.target.files[0];
const fileInfo = await worker.getFileInfo(file);
console.log(fileInfo);
});
```
+
+## Notes
+
+- In browser, `SharedArrayBuffer` is being used. To enable this in your server, read [Security requirements](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer#security_requirements).
+- In browser, everything is bundled in the `browser.mjs` script. When gzipped, this file is bigger than 1 MiB, so it's recommended to use `import()` to lazy load the asset. The good side of this is that you don't have to configure your bundler to include the worker or wasm files and you won't face [same-origin](https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker) issues with the worker.
diff --git a/build.sh b/build.sh
index 87bed86..71a481b 100755
--- a/build.sh
+++ b/build.sh
@@ -9,14 +9,17 @@ rm -rf ffprobe-wasm-app/dist
# Build wasm
cd ffprobe-wasm-app
-# sed -i -e 's/ffprobe-wasm\.js/ffprobe-wasm.mjs/g;s/-o dist\/ffprobe-wasm\.mjs \\/-o dist\/ffprobe-wasm.mjs -s EXPORT_NAME=ffprobe \\/' Makefile
docker-compose run ffprobe-wasm make
cd ..
cp -R ffprobe-wasm-app/dist dist
+node scripts/replace.js
cp src/*.d.* dist
# Build browser/node workers
npm run build
+# Remove unnecessary files
+rm dist/browser-vite.* dist/ffprobe-wasm.d.mts dist/ffprobe-wasm.mjs dist/worker-browser.*
+
# Copy files for npm publish
cp package.json LICENSE README.md dist
diff --git a/package-lock.json b/package-lock.json
index 3cf85f8..62bbd38 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16 +1,17 @@
{
"name": "ffprobe-wasm",
- "version": "0.1.0",
+ "version": "0.2.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "ffprobe-wasm",
- "version": "0.1.0",
+ "version": "0.2.0",
"license": "MIT",
"devDependencies": {
"@types/node": "^17.0.21",
- "typescript": "^4.5.5"
+ "typescript": "^4.5.5",
+ "vite": "^2.8.6"
}
},
"node_modules/@types/node": {
@@ -19,6 +20,500 @@
"integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==",
"dev": true
},
+ "node_modules/esbuild": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz",
+ "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "esbuild-android-64": "0.14.25",
+ "esbuild-android-arm64": "0.14.25",
+ "esbuild-darwin-64": "0.14.25",
+ "esbuild-darwin-arm64": "0.14.25",
+ "esbuild-freebsd-64": "0.14.25",
+ "esbuild-freebsd-arm64": "0.14.25",
+ "esbuild-linux-32": "0.14.25",
+ "esbuild-linux-64": "0.14.25",
+ "esbuild-linux-arm": "0.14.25",
+ "esbuild-linux-arm64": "0.14.25",
+ "esbuild-linux-mips64le": "0.14.25",
+ "esbuild-linux-ppc64le": "0.14.25",
+ "esbuild-linux-riscv64": "0.14.25",
+ "esbuild-linux-s390x": "0.14.25",
+ "esbuild-netbsd-64": "0.14.25",
+ "esbuild-openbsd-64": "0.14.25",
+ "esbuild-sunos-64": "0.14.25",
+ "esbuild-windows-32": "0.14.25",
+ "esbuild-windows-64": "0.14.25",
+ "esbuild-windows-arm64": "0.14.25"
+ }
+ },
+ "node_modules/esbuild-android-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz",
+ "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-android-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz",
+ "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz",
+ "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz",
+ "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz",
+ "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz",
+ "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-32": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz",
+ "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz",
+ "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz",
+ "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz",
+ "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-mips64le": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz",
+ "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-ppc64le": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz",
+ "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-riscv64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz",
+ "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-s390x": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz",
+ "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-netbsd-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz",
+ "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-openbsd-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz",
+ "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-sunos-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz",
+ "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-32": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz",
+ "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz",
+ "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz",
+ "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+ "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
+ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/postcss": {
+ "version": "8.4.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz",
+ "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==",
+ "dev": true,
+ "dependencies": {
+ "nanoid": "^3.3.1",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.70.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz",
+ "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/typescript": {
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
@@ -31,6 +526,43 @@
"engines": {
"node": ">=4.2.0"
}
+ },
+ "node_modules/vite": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz",
+ "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.14.14",
+ "postcss": "^8.4.6",
+ "resolve": "^1.22.0",
+ "rollup": "^2.59.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": ">=12.2.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "less": "*",
+ "sass": "*",
+ "stylus": "*"
+ },
+ "peerDependenciesMeta": {
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ }
+ }
}
},
"dependencies": {
@@ -40,11 +572,284 @@
"integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==",
"dev": true
},
+ "esbuild": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz",
+ "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==",
+ "dev": true,
+ "requires": {
+ "esbuild-android-64": "0.14.25",
+ "esbuild-android-arm64": "0.14.25",
+ "esbuild-darwin-64": "0.14.25",
+ "esbuild-darwin-arm64": "0.14.25",
+ "esbuild-freebsd-64": "0.14.25",
+ "esbuild-freebsd-arm64": "0.14.25",
+ "esbuild-linux-32": "0.14.25",
+ "esbuild-linux-64": "0.14.25",
+ "esbuild-linux-arm": "0.14.25",
+ "esbuild-linux-arm64": "0.14.25",
+ "esbuild-linux-mips64le": "0.14.25",
+ "esbuild-linux-ppc64le": "0.14.25",
+ "esbuild-linux-riscv64": "0.14.25",
+ "esbuild-linux-s390x": "0.14.25",
+ "esbuild-netbsd-64": "0.14.25",
+ "esbuild-openbsd-64": "0.14.25",
+ "esbuild-sunos-64": "0.14.25",
+ "esbuild-windows-32": "0.14.25",
+ "esbuild-windows-64": "0.14.25",
+ "esbuild-windows-arm64": "0.14.25"
+ }
+ },
+ "esbuild-android-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz",
+ "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-android-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz",
+ "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz",
+ "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz",
+ "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz",
+ "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz",
+ "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-32": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz",
+ "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz",
+ "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz",
+ "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz",
+ "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-mips64le": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz",
+ "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-ppc64le": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz",
+ "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-riscv64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz",
+ "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-s390x": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz",
+ "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-netbsd-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz",
+ "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-openbsd-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz",
+ "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-sunos-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz",
+ "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-32": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz",
+ "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz",
+ "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-arm64": {
+ "version": "0.14.25",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz",
+ "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==",
+ "dev": true,
+ "optional": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "is-core-module": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+ "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "nanoid": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
+ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.4.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz",
+ "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.1",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "rollup": {
+ "version": "2.70.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz",
+ "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
"typescript": {
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
"dev": true
+ },
+ "vite": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz",
+ "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.14.14",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.6",
+ "resolve": "^1.22.0",
+ "rollup": "^2.59.0"
+ }
}
}
}
diff --git a/package.json b/package.json
index 3668ec3..a8974ce 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ffprobe-wasm",
- "version": "0.1.0",
+ "version": "0.2.0",
"description": "ffprobe-like for browser and node, powered by WebAssembly",
"repository": {
"type": "git",
@@ -17,11 +17,22 @@
],
"author": "Tomás Fox ",
"license": "MIT",
+ "exports": {
+ "node": "./node.mjs",
+ "types": "./ffprobe-worker.d.ts",
+ "default": "./browser.mjs"
+ },
+ "main": "./node.mjs",
+ "types": "./ffprobe-worker.d.ts",
+ "browser": "./browser.mjs",
"scripts": {
- "build": "tsc"
+ "build": "npm run tsc && npm run vite",
+ "tsc": "tsc",
+ "vite": "vite build"
},
"devDependencies": {
"@types/node": "^17.0.21",
- "typescript": "^4.5.5"
+ "typescript": "^4.5.5",
+ "vite": "^2.8.6"
}
}
diff --git a/scripts/replace.js b/scripts/replace.js
new file mode 100644
index 0000000..b7aa25d
--- /dev/null
+++ b/scripts/replace.js
@@ -0,0 +1,27 @@
+const { readFile, writeFile } = require("fs/promises");
+const { dirname, resolve } = require("path");
+
+main();
+
+async function main() {
+ const root = dirname(__dirname);
+
+ const wasmJsPath = resolve(root, "dist/ffprobe-wasm.mjs");
+
+ let content = await readFile(wasmJsPath, { encoding: "utf8" });
+
+ content = `\
+import initWasmInstance from "./ffprobe-wasm.wasm";
+const initWasm = (info) =>
+ initWasmInstance(info).then((exports) => ({ instance: { exports } }));
+${content}`;
+
+ content = content.replace(`import.meta.url`, `''`);
+
+ content = content.replace(
+ `instantiateAsync().catch(readyPromiseReject)`,
+ `initWasm(info).then(receiveInstantiatedSource, readyPromiseReject)`
+ );
+
+ await writeFile(wasmJsPath, content, { encoding: "utf8" });
+}
diff --git a/src/browser.mts b/src/browser-vite.mts
similarity index 50%
rename from src/browser.mts
rename to src/browser-vite.mts
index 7e190c6..d462574 100644
--- a/src/browser.mts
+++ b/src/browser-vite.mts
@@ -1,34 +1,59 @@
-import type { Chapter, ChapterTag, FileInfo, Frame, FramesInfo, Stream } from "./ffprobe-wasm.mjs";
+import type {
+ Chapter,
+ ChapterTag,
+ FileInfo,
+ Frame,
+ FramesInfo,
+ Stream,
+} from "./ffprobe-wasm.mjs";
+import type { FFprobeWorker as AbstractFFprobeWorker } from "./ffprobe-worker.js";
+import BrowserWorker from "./worker-browser.mjs?worker&inline";
import type {
IncomingMessage,
IncomingData,
OutgoingMessage,
} from "./worker.mjs";
-export class FFprobeWorker {
+export class FFprobeWorker implements AbstractFFprobeWorker {
readonly #worker: Worker;
constructor() {
- this.#worker = new Worker("./worker-browser.mjs");
+ this.#worker = new BrowserWorker();
}
async getFileInfo(file: File): Promise {
- return this.#postMessage({ type: "getFileInfo", payload: [file.name, { files: [file] }] });
+ this.#validateFile(file);
+ return this.#postMessage({
+ type: "getFileInfo",
+ payload: [file.name, { files: [file] }],
+ });
}
async getFrames(file: File, offset: number): Promise {
- return this.#postMessage({ type: "getFrames", payload: [file.name, { files: [file] }, offset] });
+ this.#validateFile(file);
+ return this.#postMessage({
+ type: "getFrames",
+ payload: [file.name, { files: [file] }, offset],
+ });
}
terminate(): void {
this.#worker.terminate();
}
+ #validateFile(file: File | string): asserts file is File {
+ if (typeof file === "string") {
+ throw new Error(
+ "String only supported in Node.js, you must provide a File"
+ );
+ }
+ }
+
#postMessage(data: IncomingData): Promise {
const channel = new MessageChannel();
const message: IncomingMessage = {
...data,
- port: channel.port2
+ port: channel.port2,
};
this.#worker.postMessage(message, [channel.port2]);
@@ -41,7 +66,7 @@ export class FFprobeWorker {
} else {
reject(new Error(data.message));
}
- }
+ };
});
}
}
diff --git a/src/declarations/vite.d.ts b/src/declarations/vite.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/declarations/vite.d.ts
@@ -0,0 +1 @@
+///
diff --git a/src/ffprobe-wasm-shared.d.ts b/src/ffprobe-wasm-shared.d.ts
index 1248e19..12c8157 100644
--- a/src/ffprobe-wasm-shared.d.ts
+++ b/src/ffprobe-wasm-shared.d.ts
@@ -70,19 +70,22 @@ export interface AnalyzePathReturn {
}
export interface FileInfo {
- bit_rate: number
- chapters: Chapter[]
- duration: number
- flags: number
- name: string
- nb_chapters: number
- nb_streams: number
- streams: Stream[]
- url: string
+ bit_rate: number;
+ chapters: Chapter[];
+ /**
+ * Duration in microseconds
+ */
+ duration: number;
+ flags: number;
+ name: string;
+ nb_chapters: number;
+ nb_streams: number;
+ streams: Stream[];
+ url: string;
}
export interface Collection {
- count: { value: number }
+ count: { value: number };
ptr: number;
ptrType: any;
get(index: number): T;
@@ -90,56 +93,56 @@ export interface Collection {
}
export type Raw = {
- [K in keyof T]: T[K] extends Array ? Collection> : T[K]
-}
+ [K in keyof T]: T[K] extends Array ? Collection> : T[K];
+};
export interface Chapter {
- end: number
- id: number
- start: number
- tags: ChapterTag[]
+ end: number;
+ id: number;
+ start: number;
+ tags: ChapterTag[];
/**
* @example "1/1000"
*/
- time_base: string
+ time_base: string;
}
export interface ChapterTag {
- key: string
- value: string
+ key: string;
+ value: string;
}
export interface Stream {
- bit_rate: number
- channels: number
- codec_name: string
- codec_type: number
- duration: number
- format: string
- frame_size: number
- height: number
- id: number
- level: number
- profile: string
- sample_rate: number
- start_time: number
- width: number
+ bit_rate: number;
+ channels: number;
+ codec_name: string;
+ codec_type: number;
+ duration: number;
+ format: string;
+ frame_size: number;
+ height: number;
+ id: number;
+ level: number;
+ profile: string;
+ sample_rate: number;
+ start_time: number;
+ width: number;
}
export interface FramesInfo {
- avg_frame_rate: number
- duration: number
- frames: Frame[]
- gop_size: number
- nb_frames: number
- time_base: number
+ avg_frame_rate: number;
+ duration: number;
+ frames: Frame[];
+ gop_size: number;
+ nb_frames: number;
+ time_base: number;
}
export interface Frame {
- dts: number
- frame_number: number
- pict_type: number
- pkt_size: number
- pos: number
- pts: number
+ dts: number;
+ frame_number: number;
+ pict_type: number;
+ pkt_size: number;
+ pos: number;
+ pts: number;
}
diff --git a/src/ffprobe-worker.d.ts b/src/ffprobe-worker.d.ts
new file mode 100644
index 0000000..d6d1cb2
--- /dev/null
+++ b/src/ffprobe-worker.d.ts
@@ -0,0 +1,18 @@
+import type {
+ Chapter,
+ ChapterTag,
+ FileInfo,
+ Frame,
+ FramesInfo,
+ Stream,
+} from "./ffprobe-wasm-shared";
+
+export declare class FFprobeWorker {
+ getFileInfo(file: File | string): Promise;
+
+ getFrames(file: File | string, offset: number): Promise;
+
+ terminate(): void;
+}
+
+export { Chapter, ChapterTag, FileInfo, Frame, FramesInfo, Stream };
diff --git a/src/node.mts b/src/node.mts
index d70ae20..5fa6b9a 100644
--- a/src/node.mts
+++ b/src/node.mts
@@ -1,14 +1,22 @@
import { basename, dirname } from "path";
-import { fileURLToPath } from 'url';
+import { fileURLToPath } from "url";
import { MessageChannel, Worker } from "worker_threads";
-import type { Chapter, ChapterTag, FileInfo, Frame, FramesInfo, Stream } from "./ffprobe-wasm.mjs";
+import type {
+ Chapter,
+ ChapterTag,
+ FileInfo,
+ Frame,
+ FramesInfo,
+ Stream,
+} from "./ffprobe-wasm.js";
+import type { FFprobeWorker as AbstractFFprobeWorker } from "./ffprobe-worker.js";
import type {
IncomingMessage,
IncomingData,
OutgoingMessage,
} from "./worker.mjs";
-export class FFprobeWorker {
+export class FFprobeWorker implements AbstractFFprobeWorker {
readonly #worker: Worker;
constructor() {
@@ -17,22 +25,38 @@ export class FFprobeWorker {
}
async getFileInfo(filePath: string): Promise {
- return this.#postMessage({ type: "getFileInfo", payload: [basename(filePath), { root: dirname(filePath) }] });
+ this.#validateFile(filePath);
+ return this.#postMessage({
+ type: "getFileInfo",
+ payload: [basename(filePath), { root: dirname(filePath) }],
+ });
}
async getFrames(filePath: string, offset: number): Promise {
- return this.#postMessage({ type: "getFrames", payload: [basename(filePath), { root: dirname(filePath) }, offset] });
+ this.#validateFile(filePath);
+ return this.#postMessage({
+ type: "getFrames",
+ payload: [basename(filePath), { root: dirname(filePath) }, offset],
+ });
}
terminate(): void {
this.#worker.terminate();
}
+ #validateFile(filePath: string | File): asserts filePath is string {
+ if (typeof filePath === "object") {
+ throw new Error(
+ "File object only supported in Browser, you must provide a string (path)"
+ );
+ }
+ }
+
#postMessage(data: IncomingData): Promise {
const channel = new MessageChannel();
const message: IncomingMessage = {
...data,
- port: channel.port2
+ port: channel.port2,
};
this.#worker.postMessage(message, [channel.port2]);
diff --git a/src/worker-browser.mts b/src/worker-browser.mts
index b66f1a2..4951d84 100644
--- a/src/worker-browser.mts
+++ b/src/worker-browser.mts
@@ -1,11 +1,6 @@
import loadFFprobe from "./ffprobe-wasm.mjs";
import { createListener, IncomingMessage } from "./worker.mjs";
-const listener = createListener(
- loadFFprobe({
- locateFile: (path) => `${location.origin}/node_modules/ffprobe-wasm/${path}`
- }),
- "WORKERFS",
-);
+const listener = createListener(loadFFprobe(), "WORKERFS");
self.onmessage = (event: MessageEvent) => listener(event.data);
diff --git a/tsconfig.json b/tsconfig.json
index 7c370ec..da0328c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -11,7 +11,8 @@
"resolveJsonModule": true,
"isolatedModules": true,
"outDir": "./dist",
- "declaration": true
+ "declaration": true,
+ "sourceMap": true
},
"include": ["./src"]
}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..045abe6
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,31 @@
+import { resolve } from "path";
+import { defineConfig } from "vite";
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ build: {
+ outDir: resolve(__dirname, "dist"),
+ lib: {
+ entry: resolve(__dirname, "dist/browser-vite.mjs"),
+ formats: ["es"],
+ fileName: () => "browser.mjs",
+ },
+ emptyOutDir: false,
+ minify: false,
+ sourcemap: true,
+ },
+ worker: {
+ plugins: [
+ {
+ name: "append-source-url",
+ generateBundle(options, bundle) {
+ Object.entries(bundle).forEach(([file, output]) => {
+ if (output.type === "chunk") {
+ output.code += `\n//# sourceURL=${file}`;
+ }
+ });
+ },
+ },
+ ],
+ },
+});