@squoosh-kit/core 0.0.1
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/README.md +38 -0
- package/dist/features/resize/bridge.d.ts +10 -0
- package/dist/features/resize/index.d.ts +23 -0
- package/dist/features/resize/index.js +5 -0
- package/dist/features/resize/index.js.map +12 -0
- package/dist/features/resize/resize.worker.d.ts +6 -0
- package/dist/features/resize/resize.worker.js +6 -0
- package/dist/features/resize/resize.worker.js.map +10 -0
- package/dist/features/resize/types.d.ts +9 -0
- package/dist/features/resize/wasm/squoosh_resize.d.ts +34 -0
- package/dist/features/resize/wasm/squoosh_resize.js +120 -0
- package/dist/features/resize/wasm/squoosh_resize_bg.wasm +0 -0
- package/dist/features/resize/wasm/squoosh_resize_bg.wasm.d.ts +7 -0
- package/dist/features/webp/bridge.d.ts +10 -0
- package/dist/features/webp/index.d.ts +25 -0
- package/dist/features/webp/index.js +5 -0
- package/dist/features/webp/index.js.map +12 -0
- package/dist/features/webp/types.d.ts +8 -0
- package/dist/features/webp/wasm/webp/webp_enc.d.ts +42 -0
- package/dist/features/webp/wasm/webp/webp_enc.js +16 -0
- package/dist/features/webp/wasm/webp/webp_enc.wasm +0 -0
- package/dist/features/webp/wasm/webp-dec/webp_dec.d.ts +7 -0
- package/dist/features/webp/wasm/webp-dec/webp_dec.js +16 -0
- package/dist/features/webp/wasm/webp-dec/webp_dec.wasm +0 -0
- package/dist/features/webp/webp.worker.d.ts +9 -0
- package/dist/features/webp/webp.worker.js +6 -0
- package/dist/features/webp/webp.worker.js.map +10 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +16 -0
- package/package.json +76 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# @squoosh-kit/core
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/js/%40squoosh-kit%2Fcore)
|
|
4
|
+
|
|
5
|
+
`@squoosh-kit/core` is a meta-package that conveniently bundles all functionality from the Squoosh Kit monorepo.
|
|
6
|
+
|
|
7
|
+
For smaller production bundles, you may prefer to install only the specific packages you need:
|
|
8
|
+
|
|
9
|
+
- [`@squoosh-kit/webp`](https://www.npmjs.com/package/@squoosh-kit/webp) - WebP encoding.
|
|
10
|
+
- [`@squoosh-kit/resize`](https://www.npmjs.com/package/@squoosh-kit/resize) - High-quality image resizing.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bun add @squoosh-kit/core
|
|
16
|
+
# or
|
|
17
|
+
npm install @squoosh-kit/core
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
This package re-exports all functionality from the individual packages.
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { webpEncode, resize } from '@squoosh-kit/core';
|
|
26
|
+
|
|
27
|
+
// WebP Encoding
|
|
28
|
+
const webpData = await webpEncode(/* ... */);
|
|
29
|
+
|
|
30
|
+
// Image Resizing
|
|
31
|
+
const resizedImage = await resize(/* ... */);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Please refer to the documentation of the individual packages for detailed API information.
|
|
35
|
+
|
|
36
|
+
## License
|
|
37
|
+
|
|
38
|
+
MIT
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge implementation for the Resize package, handling worker and client modes.
|
|
3
|
+
*/
|
|
4
|
+
import { type ImageInput } from '@squoosh-kit/runtime';
|
|
5
|
+
import type { ResizeOptions } from './types.ts';
|
|
6
|
+
interface ResizeBridge {
|
|
7
|
+
resize(signal: AbortSignal, image: ImageInput, options: ResizeOptions): Promise<ImageInput>;
|
|
8
|
+
}
|
|
9
|
+
export declare function createBridge(mode: 'worker' | 'client'): ResizeBridge;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @squoosh-kit/resize public API
|
|
3
|
+
*/
|
|
4
|
+
import type { ImageInput } from '@squoosh-kit/runtime';
|
|
5
|
+
import type { ResizeOptions } from './types.ts';
|
|
6
|
+
export type { ImageInput, ResizeOptions };
|
|
7
|
+
/**
|
|
8
|
+
* Resizes an image. Defaults to 'worker' mode.
|
|
9
|
+
*
|
|
10
|
+
* @param signal - An AbortSignal to cancel the resizing operation.
|
|
11
|
+
* @param imageData - The image data to resize.
|
|
12
|
+
* @param options - Resize options.
|
|
13
|
+
* @returns A Promise resolving to the resized image data.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resize(signal: AbortSignal, imageData: ImageInput, options: ResizeOptions): Promise<ImageInput>;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a reusable resizer function for a specific execution mode.
|
|
18
|
+
*
|
|
19
|
+
* @param mode - The execution mode, either 'worker' or 'client'.
|
|
20
|
+
* @returns A function that resizes an image.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createResizer(mode?: 'worker' | 'client'): (signal: AbortSignal, image: ImageInput, options: ResizeOptions) => Promise<ImageInput>;
|
|
23
|
+
export { resizeClient } from './resize.worker.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{a as o}from"./resize.worker.js";var G=0;async function U(i,m,z,u,g){return new Promise((R,W)=>{let P=++G;if(u?.aborted){W(new DOMException("Aborted","AbortError"));return}let c=(t)=>{let I=t.data;if(I.id!==P)return;if(console.log("\uD83D\uDD27 Worker call: Response received",I),B(),I.ok&&I.data!==void 0)console.log("\uD83D\uDD27 Worker call: Response data",I.data),R(I.data);else console.log("\uD83D\uDD27 Worker call: Response error",I.error),W(Error(I.error||"Unknown worker error"))},f=(t)=>{B(),W(Error(`Worker error: ${t.message}`))},x=()=>{B(),W(new DOMException("Aborted","AbortError"))},B=()=>{i.removeEventListener("message",c),i.removeEventListener("error",f),u?.removeEventListener("abort",x)};i.addEventListener("message",c),i.addEventListener("error",f),u?.addEventListener("abort",x);let A={type:m,id:P,payload:z};if(g&&g.length>0)i.postMessage(A,g);else i.postMessage(A)})}class k{async resize(i,m,z){return o(i,m,z)}}class F{worker=null;async getWorker(){if(!this.worker){let i=await import.meta.resolve("@squoosh-kit/resize/resize.worker.js");this.worker=new Worker(i,{type:"module"})}return this.worker}async resize(i,m,z){let u=await this.getWorker();console.log("worker",u);let g=m.data.buffer;console.log("buffer",g);try{let R=await U(u,"resize:run",{image:m,options:z},i,[g]);return console.log("result",R),R}catch(R){throw console.error("error",R),R}}}function O(i){return i==="client"?new k:new F}async function Q(i,m,z){return O("worker").resize(i,m,z)}function S(i="worker"){let m=O(i);return m.resize.bind(m)}export{o as resizeClient,Q as resize,S as createResizer};
|
|
3
|
+
|
|
4
|
+
//# debugId=F4303F2F711C28F164756E2164756E21
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../runtime/src/worker-call.ts", "../src/bridge.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Generic worker communication helper with support for transferables and AbortSignal\n */\n\nexport interface WorkerRequest<T = unknown> {\n type: string;\n id: number;\n payload: T;\n}\n\nexport interface WorkerResponse<T = unknown> {\n id: number;\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nlet requestId = 0;\n\n/**\n * Call a worker with a typed request and wait for response\n *\n * @param worker - The worker instance to call\n * @param type - The message type\n * @param payload - The payload to send\n * @param signal - Optional AbortSignal to cancel the operation\n * @param transfer - Optional list of Transferable objects to transfer\n * @returns Promise that resolves with the worker's response data\n */\nexport async function callWorker<TPayload, TResponse>(\n worker: Worker,\n type: string,\n payload: TPayload,\n signal?: AbortSignal,\n transfer?: Transferable[]\n): Promise<TResponse> {\n return new Promise<TResponse>((resolve, reject) => {\n const id = ++requestId;\n\n // Check if already aborted\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n const handleMessage = (event: MessageEvent) => {\n const response = event.data as WorkerResponse<TResponse>;\n if (response.id !== id) return;\n\n console.log('🔧 Worker call: Response received', response);\n cleanup();\n\n if (response.ok && response.data !== undefined) {\n console.log('🔧 Worker call: Response data', response.data);\n resolve(response.data);\n } else {\n console.log('🔧 Worker call: Response error', response.error);\n reject(new Error(response.error || 'Unknown worker error'));\n }\n };\n\n const handleError = (error: ErrorEvent) => {\n cleanup();\n reject(new Error(`Worker error: ${error.message}`));\n };\n\n const handleAbort = () => {\n cleanup();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n\n const cleanup = () => {\n worker.removeEventListener('message', handleMessage);\n worker.removeEventListener('error', handleError);\n signal?.removeEventListener('abort', handleAbort);\n };\n\n // Set up listeners\n worker.addEventListener('message', handleMessage);\n worker.addEventListener('error', handleError);\n signal?.addEventListener('abort', handleAbort);\n\n // Send the request\n const request: WorkerRequest<TPayload> = { type, id, payload };\n\n if (transfer && transfer.length > 0) {\n worker.postMessage(request, transfer);\n } else {\n worker.postMessage(request);\n }\n });\n}\n",
|
|
6
|
+
"/**\n * Bridge implementation for the Resize package, handling worker and client modes.\n */\n\nimport { callWorker, type ImageInput } from '@squoosh-kit/runtime';\nimport { resizeClient } from './resize.worker.ts';\nimport type { ResizeOptions } from './types.ts';\n\ninterface ResizeBridge {\n resize(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions\n ): Promise<ImageInput>;\n}\n\nclass ResizeClientBridge implements ResizeBridge {\n async resize(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions\n ): Promise<ImageInput> {\n return resizeClient(signal, image, options);\n }\n}\n\nclass ResizeWorkerBridge implements ResizeBridge {\n private worker: Worker | null = null;\n private async getWorker(): Promise<Worker> {\n if (!this.worker) {\n const workerUrl = await import.meta.resolve(\n '@squoosh-kit/resize/resize.worker.js'\n );\n this.worker = new Worker(workerUrl, { type: 'module' });\n }\n return this.worker;\n }\n async resize(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions\n ): Promise<ImageInput> {\n const worker = await this.getWorker();\n console.log('worker', worker);\n const buffer = image.data.buffer;\n console.log('buffer', buffer);\n\n try {\n const result = await callWorker<{ image: ImageInput; options: ResizeOptions }, ImageInput>(worker, 'resize:run', { image, options }, signal, [\n buffer as ArrayBuffer,\n ]);\n \n console.log('result', result);\n\n return result;\n } catch (error) {\n console.error('error', error);\n throw error;\n }\n }\n}\n\nexport function createBridge(mode: 'worker' | 'client'): ResizeBridge {\n return mode === 'client'\n ? new ResizeClientBridge()\n : new ResizeWorkerBridge();\n}\n",
|
|
7
|
+
"/**\n * @squoosh-kit/resize public API\n */\n\nimport type { ImageInput } from '@squoosh-kit/runtime';\nimport { createBridge } from './bridge.ts';\nimport type { ResizeOptions } from './types.ts';\n\nexport type { ImageInput, ResizeOptions };\n\n/**\n * Resizes an image. Defaults to 'worker' mode.\n *\n * @param signal - An AbortSignal to cancel the resizing operation.\n * @param imageData - The image data to resize.\n * @param options - Resize options.\n * @returns A Promise resolving to the resized image data.\n */\nexport async function resize(\n signal: AbortSignal,\n imageData: ImageInput,\n options: ResizeOptions\n): Promise<ImageInput> {\n // Always use a worker for a single, one-off call for best performance.\n const bridge = createBridge('worker');\n return bridge.resize(signal, imageData, options);\n}\n\n/**\n * Creates a reusable resizer function for a specific execution mode.\n *\n * @param mode - The execution mode, either 'worker' or 'client'.\n * @returns A function that resizes an image.\n */\nexport function createResizer(mode: 'worker' | 'client' = 'worker') {\n const bridge = createBridge(mode);\n return bridge.resize.bind(bridge);\n}\n\n// Export the client-side implementation for direct use by the bridge.\n// This is not intended for public consumption.\nexport { resizeClient } from './resize.worker.js';\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": ";uCAiBA,IAAI,EAAY,EAYhB,eAAsB,CAA+B,CACnD,EACA,EACA,EACA,EACA,EACoB,CACpB,OAAO,IAAI,QAAmB,CAAC,EAAS,IAAW,CACjD,IAAM,EAAK,EAAE,EAGb,GAAI,GAAQ,QAAS,CACnB,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,EAChD,OAGF,IAAM,EAAgB,CAAC,IAAwB,CAC7C,IAAM,EAAW,EAAM,KACvB,GAAI,EAAS,KAAO,EAAI,OAKxB,GAHA,QAAQ,IAAI,8CAAoC,CAAQ,EACxD,EAAQ,EAEJ,EAAS,IAAM,EAAS,OAAS,OACnC,QAAQ,IAAI,0CAAgC,EAAS,IAAI,EACzD,EAAQ,EAAS,IAAI,EAErB,aAAQ,IAAI,2CAAiC,EAAS,KAAK,EAC3D,EAAW,MAAM,EAAS,OAAS,sBAAsB,CAAC,GAIxD,EAAc,CAAC,IAAsB,CACzC,EAAQ,EACR,EAAW,MAAM,iBAAiB,EAAM,SAAS,CAAC,GAG9C,EAAc,IAAM,CACxB,EAAQ,EACR,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,GAG5C,EAAU,IAAM,CACpB,EAAO,oBAAoB,UAAW,CAAa,EACnD,EAAO,oBAAoB,QAAS,CAAW,EAC/C,GAAQ,oBAAoB,QAAS,CAAW,GAIlD,EAAO,iBAAiB,UAAW,CAAa,EAChD,EAAO,iBAAiB,QAAS,CAAW,EAC5C,GAAQ,iBAAiB,QAAS,CAAW,EAG7C,IAAM,EAAmC,CAAE,OAAM,KAAI,SAAQ,EAE7D,GAAI,GAAY,EAAS,OAAS,EAChC,EAAO,YAAY,EAAS,CAAQ,EAEpC,OAAO,YAAY,CAAO,EAE7B,EC1EH,MAAM,CAA2C,MACzC,OAAM,CACV,EACA,EACA,EACqB,CACrB,OAAO,EAAa,EAAQ,EAAO,CAAO,EAE9C,CAEA,MAAM,CAA2C,CACvC,OAAwB,UAClB,UAAS,EAAoB,CACzC,GAAI,CAAC,KAAK,OAAQ,CAChB,IAAM,EAAY,MAAM,YAAY,QAClC,sCACF,EACA,KAAK,OAAS,IAAI,OAAO,EAAW,CAAE,KAAM,QAAS,CAAC,EAExD,OAAO,KAAK,YAER,OAAM,CACV,EACA,EACA,EACqB,CACrB,IAAM,EAAS,MAAM,KAAK,UAAU,EACpC,QAAQ,IAAI,SAAU,CAAM,EAC5B,IAAM,EAAS,EAAM,KAAK,OAC1B,QAAQ,IAAI,SAAU,CAAM,EAE5B,GAAI,CACF,IAAM,EAAS,MAAM,EAAsE,EAAQ,aAAc,CAAE,QAAO,SAAQ,EAAG,EAAQ,CAC3I,CACF,CAAC,EAID,OAFA,QAAQ,IAAI,SAAU,CAAM,EAErB,EACP,MAAO,EAAO,CAEd,MADA,QAAQ,MAAM,QAAS,CAAK,EACtB,GAGZ,CAEO,SAAS,CAAY,CAAC,EAAyC,CACpE,OAAO,IAAS,SACZ,IAAI,EACJ,IAAI,EC/CV,eAAsB,CAAM,CAC1B,EACA,EACA,EACqB,CAGrB,OADe,EAAa,QAAQ,EACtB,OAAO,EAAQ,EAAW,CAAO,EAS1C,SAAS,CAAa,CAAC,EAA4B,SAAU,CAClE,IAAM,EAAS,EAAa,CAAI,EAChC,OAAO,EAAO,OAAO,KAAK,CAAM",
|
|
10
|
+
"debugId": "F4303F2F711C28F164756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resize processor - single-source worker/client implementation
|
|
3
|
+
*/
|
|
4
|
+
import { type ImageInput } from '@squoosh-kit/runtime';
|
|
5
|
+
import type { ResizeOptions } from './types.ts';
|
|
6
|
+
export declare function resizeClient(signal: AbortSignal, image: ImageInput, options: ResizeOptions): Promise<ImageInput>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var K=null;async function O(){if(K)return;let j=import.meta.url.endsWith(".ts")?"../dist/wasm/resize":"./wasm/resize",x=await import.meta.resolve(`${j}/squoosh_resize.js`),F=await import(x);await F.default(fetch(new URL(`${j}/squoosh_resize_bg.wasm`,x))),K=F.resize}async function L(J,j){if(await O(),!K)throw Error("Resize module not initialized");let{data:x,width:F,height:B}=J,E=j.width??F,G=j.height??B;if(j.width&&!j.height)G=Math.round(B*j.width/F);else if(j.height&&!j.width)E=Math.round(F*j.height/B);if(E<=0||G<=0)throw Error("Invalid output dimensions");let N=x instanceof Uint8ClampedArray?new Uint8Array(x):x;return{data:K(N,F,B,E,G,Q(),j.premultiply?1:0,j.linearRGB?1:0),width:E,height:G}}async function T(J,j,x){if(J.aborted)throw new DOMException("Aborted","AbortError");return L(j,x)}function Q(){return 3}if(typeof self<"u")self.onmessage=async(J)=>{let{id:j,type:x,payload:F}=J.data,B={id:j,ok:!1};try{if(x!=="resize:run")throw Error(`Unknown message type: ${x}`);let E=await L(F.image,F.options);B.ok=!0,B.data=E;let G=E.data.buffer;if(G)self.postMessage(B,[G]);else self.postMessage(B)}catch(E){B.error=E instanceof Error?E.message:String(E),self.postMessage(B)}};export{T as resizeClient};
|
|
3
|
+
export{T as a};
|
|
4
|
+
|
|
5
|
+
//# debugId=A8894B48289E7C6764756E2164756E21
|
|
6
|
+
//# sourceMappingURL=resize.worker.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/resize.worker.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Resize processor - single-source worker/client implementation\n */\n\nimport {\n hasImageData,\n type WorkerRequest,\n type WorkerResponse,\n type ImageInput,\n} from '@squoosh-kit/runtime';\nimport type { ResizeOptions } from './types.ts';\n\n// Define the type locally to avoid module resolution issues with the linter\ntype SquooshWasmResize = (\n data: Uint8Array,\n input_width: number,\n input_height: number,\n output_width: number,\n output_height: number,\n typ_idx: number,\n premultiply: number,\n color_space_conversion: number,\n) => Uint8Array;\n\nlet wasmResize: SquooshWasmResize | null = null;\n\nasync function init(): Promise<void> {\n if (wasmResize) {\n return;\n }\n\n const isTest = import.meta.url.endsWith('.ts');\n const wasmDirectory = isTest ? '../dist/wasm/resize' : './wasm/resize';\n const modulePath = await import.meta.resolve(\n `${wasmDirectory}/squoosh_resize.js`,\n );\n const module = await import(modulePath);\n\n // Squoosh's WASM modules expect to be initialized with promises\n await module.default(\n fetch(new URL(`${wasmDirectory}/squoosh_resize_bg.wasm`, modulePath)),\n );\n wasmResize = module.resize;\n}\n\nasync function _resizeCore(\n image: ImageInput,\n options: ResizeOptions,\n): Promise<ImageInput> {\n await init();\n if (!wasmResize) {\n throw new Error('Resize module not initialized');\n }\n\n const { data, width: inputWidth, height: inputHeight } = image;\n\n let outputWidth = options.width ?? inputWidth;\n let outputHeight = options.height ?? inputHeight;\n\n if (options.width && !options.height) {\n outputHeight = Math.round((inputHeight * options.width) / inputWidth);\n } else if (options.height && !options.width) {\n outputWidth = Math.round((inputWidth * options.height) / inputHeight);\n }\n\n if (outputWidth <= 0 || outputHeight <= 0) {\n throw new Error('Invalid output dimensions');\n }\n\n const dataArray =\n data instanceof Uint8ClampedArray ? new Uint8Array(data) : data;\n\n const result = wasmResize(\n dataArray,\n inputWidth,\n inputHeight,\n outputWidth,\n outputHeight,\n getResizeMethod(),\n options.premultiply ? 1 : 0,\n options.linearRGB ? 1 : 0,\n );\n\n return {\n data: result,\n width: outputWidth,\n height: outputHeight,\n };\n}\n\nexport async function resizeClient(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions,\n): Promise<ImageInput> {\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n return _resizeCore(image, options);\n}\n\n/**\n * Map ResizeOptions to the typ_idx parameter for the resize function\n * 0: Triangular, 1: Catrom, 2: Mitchell, 3: Lanczos3\n */\nfunction getResizeMethod(): number {\n // Default to Lanczos3 (highest quality)\n return 3;\n}\n\n/**\n * Worker message handler\n */\nif (typeof self !== 'undefined') {\n self.onmessage = async (\n event: MessageEvent<\n WorkerRequest<{ image: ImageInput; options: ResizeOptions }>\n >,\n ) => {\n const { id, type, payload } = event.data;\n\n const response: WorkerResponse<ImageInput> = { id, ok: false };\n\n try {\n if (type !== 'resize:run') {\n throw new Error(`Unknown message type: ${type}`);\n }\n\n const resultImage = await _resizeCore(payload.image, payload.options);\n\n response.ok = true;\n response.data = resultImage;\n\n const transferable = resultImage.data.buffer;\n if (transferable) {\n self.postMessage(response, [transferable as ArrayBuffer]);\n } else {\n self.postMessage(response);\n }\n } catch (error) {\n response.error = error instanceof Error ? error.message : String(error);\n self.postMessage(response);\n }\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAwBA,IAAI,EAAuC,KAE3C,eAAe,CAAI,EAAkB,CACnC,GAAI,EACF,OAIF,IAAM,EADS,YAAY,IAAI,SAAS,KAAK,EACd,sBAAwB,gBACjD,EAAa,MAAM,YAAY,QACnC,GAAG,qBACL,EACM,EAAS,MAAa,UAG5B,MAAM,EAAO,QACX,MAAM,IAAI,IAAI,GAAG,2BAAwC,CAAU,CAAC,CACtE,EACA,EAAa,EAAO,OAGtB,eAAe,CAAW,CACxB,EACA,EACqB,CAErB,GADA,MAAM,EAAK,EACP,CAAC,EACH,MAAU,MAAM,+BAA+B,EAGjD,IAAQ,OAAM,MAAO,EAAY,OAAQ,GAAgB,EAErD,EAAc,EAAQ,OAAS,EAC/B,EAAe,EAAQ,QAAU,EAErC,GAAI,EAAQ,OAAS,CAAC,EAAQ,OAC5B,EAAe,KAAK,MAAO,EAAc,EAAQ,MAAS,CAAU,EAC/D,QAAI,EAAQ,QAAU,CAAC,EAAQ,MACpC,EAAc,KAAK,MAAO,EAAa,EAAQ,OAAU,CAAW,EAGtE,GAAI,GAAe,GAAK,GAAgB,EACtC,MAAU,MAAM,2BAA2B,EAG7C,IAAM,EACJ,aAAgB,kBAAoB,IAAI,WAAW,CAAI,EAAI,EAa7D,MAAO,CACL,KAZa,EACb,EACA,EACA,EACA,EACA,EACA,EAAgB,EAChB,EAAQ,YAAc,EAAI,EAC1B,EAAQ,UAAY,EAAI,CAC1B,EAIE,MAAO,EACP,OAAQ,CACV,EAGF,eAAsB,CAAY,CAChC,EACA,EACA,EACqB,CACrB,GAAI,EAAO,QACT,MAAM,IAAI,aAAa,UAAW,YAAY,EAEhD,OAAO,EAAY,EAAO,CAAO,EAOnC,SAAS,CAAe,EAAW,CAEjC,MAAO,GAMT,GAAI,OAAO,KAAS,IAClB,KAAK,UAAY,MACf,IAGG,CACH,IAAQ,KAAI,OAAM,WAAY,EAAM,KAE9B,EAAuC,CAAE,KAAI,GAAI,EAAM,EAE7D,GAAI,CACF,GAAI,IAAS,aACX,MAAU,MAAM,yBAAyB,GAAM,EAGjD,IAAM,EAAc,MAAM,EAAY,EAAQ,MAAO,EAAQ,OAAO,EAEpE,EAAS,GAAK,GACd,EAAS,KAAO,EAEhB,IAAM,EAAe,EAAY,KAAK,OACtC,GAAI,EACF,KAAK,YAAY,EAAU,CAAC,CAA2B,CAAC,EAExD,UAAK,YAAY,CAAQ,EAE3B,MAAO,EAAO,CACd,EAAS,MAAQ,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EACtE,KAAK,YAAY,CAAQ",
|
|
8
|
+
"debugId": "A8894B48289E7C6764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* @param {Uint8Array} input_image
|
|
5
|
+
* @param {number} input_width
|
|
6
|
+
* @param {number} input_height
|
|
7
|
+
* @param {number} output_width
|
|
8
|
+
* @param {number} output_height
|
|
9
|
+
* @param {number} typ_idx
|
|
10
|
+
* @param {boolean} premultiply
|
|
11
|
+
* @param {boolean} color_space_conversion
|
|
12
|
+
* @returns {Uint8ClampedArray}
|
|
13
|
+
*/
|
|
14
|
+
export function resize(input_image: Uint8Array, input_width: number, input_height: number, output_width: number, output_height: number, typ_idx: number, premultiply: boolean, color_space_conversion: boolean): Uint8ClampedArray;
|
|
15
|
+
|
|
16
|
+
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
|
|
17
|
+
|
|
18
|
+
export interface InitOutput {
|
|
19
|
+
readonly memory: WebAssembly.Memory;
|
|
20
|
+
readonly resize: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => void;
|
|
21
|
+
readonly __wbindgen_add_to_stack_pointer: (a: number) => number;
|
|
22
|
+
readonly __wbindgen_malloc: (a: number) => number;
|
|
23
|
+
readonly __wbindgen_free: (a: number, b: number) => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* If `module_or_path` is {RequestInfo} or {URL}, makes a request and
|
|
28
|
+
* for everything else, calls `WebAssembly.instantiate` directly.
|
|
29
|
+
*
|
|
30
|
+
* @param {InitInput | Promise<InitInput>} module_or_path
|
|
31
|
+
*
|
|
32
|
+
* @returns {Promise<InitOutput>}
|
|
33
|
+
*/
|
|
34
|
+
export default function init (module_or_path?: InitInput | Promise<InitInput>): Promise<InitOutput>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
|
|
2
|
+
let wasm;
|
|
3
|
+
|
|
4
|
+
let cachegetUint8Memory0 = null;
|
|
5
|
+
function getUint8Memory0() {
|
|
6
|
+
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {
|
|
7
|
+
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);
|
|
8
|
+
}
|
|
9
|
+
return cachegetUint8Memory0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let WASM_VECTOR_LEN = 0;
|
|
13
|
+
|
|
14
|
+
function passArray8ToWasm0(arg, malloc) {
|
|
15
|
+
const ptr = malloc(arg.length * 1);
|
|
16
|
+
getUint8Memory0().set(arg, ptr / 1);
|
|
17
|
+
WASM_VECTOR_LEN = arg.length;
|
|
18
|
+
return ptr;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let cachegetInt32Memory0 = null;
|
|
22
|
+
function getInt32Memory0() {
|
|
23
|
+
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
|
|
24
|
+
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
|
|
25
|
+
}
|
|
26
|
+
return cachegetInt32Memory0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let cachegetUint8ClampedMemory0 = null;
|
|
30
|
+
function getUint8ClampedMemory0() {
|
|
31
|
+
if (cachegetUint8ClampedMemory0 === null || cachegetUint8ClampedMemory0.buffer !== wasm.memory.buffer) {
|
|
32
|
+
cachegetUint8ClampedMemory0 = new Uint8ClampedArray(wasm.memory.buffer);
|
|
33
|
+
}
|
|
34
|
+
return cachegetUint8ClampedMemory0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function getClampedArrayU8FromWasm0(ptr, len) {
|
|
38
|
+
return getUint8ClampedMemory0().subarray(ptr / 1, ptr / 1 + len);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @param {Uint8Array} input_image
|
|
42
|
+
* @param {number} input_width
|
|
43
|
+
* @param {number} input_height
|
|
44
|
+
* @param {number} output_width
|
|
45
|
+
* @param {number} output_height
|
|
46
|
+
* @param {number} typ_idx
|
|
47
|
+
* @param {boolean} premultiply
|
|
48
|
+
* @param {boolean} color_space_conversion
|
|
49
|
+
* @returns {Uint8ClampedArray}
|
|
50
|
+
*/
|
|
51
|
+
export function resize(input_image, input_width, input_height, output_width, output_height, typ_idx, premultiply, color_space_conversion) {
|
|
52
|
+
try {
|
|
53
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
54
|
+
var ptr0 = passArray8ToWasm0(input_image, wasm.__wbindgen_malloc);
|
|
55
|
+
var len0 = WASM_VECTOR_LEN;
|
|
56
|
+
wasm.resize(retptr, ptr0, len0, input_width, input_height, output_width, output_height, typ_idx, premultiply, color_space_conversion);
|
|
57
|
+
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
58
|
+
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
59
|
+
var v1 = getClampedArrayU8FromWasm0(r0, r1).slice();
|
|
60
|
+
wasm.__wbindgen_free(r0, r1 * 1);
|
|
61
|
+
return v1;
|
|
62
|
+
} finally {
|
|
63
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function load(module, imports) {
|
|
68
|
+
if (typeof Response === 'function' && module instanceof Response) {
|
|
69
|
+
if (typeof WebAssembly.instantiateStreaming === 'function') {
|
|
70
|
+
try {
|
|
71
|
+
return await WebAssembly.instantiateStreaming(module, imports);
|
|
72
|
+
|
|
73
|
+
} catch (e) {
|
|
74
|
+
if (module.headers.get('Content-Type') != 'application/wasm') {
|
|
75
|
+
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
|
|
76
|
+
|
|
77
|
+
} else {
|
|
78
|
+
throw e;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const bytes = await module.arrayBuffer();
|
|
84
|
+
return await WebAssembly.instantiate(bytes, imports);
|
|
85
|
+
|
|
86
|
+
} else {
|
|
87
|
+
const instance = await WebAssembly.instantiate(module, imports);
|
|
88
|
+
|
|
89
|
+
if (instance instanceof WebAssembly.Instance) {
|
|
90
|
+
return { instance, module };
|
|
91
|
+
|
|
92
|
+
} else {
|
|
93
|
+
return instance;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function init(input) {
|
|
99
|
+
if (typeof input === 'undefined') {
|
|
100
|
+
input = new URL('squoosh_resize_bg.wasm', import.meta.url);
|
|
101
|
+
}
|
|
102
|
+
const imports = {};
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
|
|
106
|
+
input = fetch(input);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
const { instance, module } = await load(await input, imports);
|
|
112
|
+
|
|
113
|
+
wasm = instance.exports;
|
|
114
|
+
init.__wbindgen_wasm_module = module;
|
|
115
|
+
|
|
116
|
+
return wasm;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export default init;
|
|
120
|
+
|
|
Binary file
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
export const memory: WebAssembly.Memory;
|
|
4
|
+
export function resize(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number): void;
|
|
5
|
+
export function __wbindgen_add_to_stack_pointer(a: number): number;
|
|
6
|
+
export function __wbindgen_malloc(a: number): number;
|
|
7
|
+
export function __wbindgen_free(a: number, b: number): void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge implementation for the WebP package, handling worker and client modes.
|
|
3
|
+
*/
|
|
4
|
+
import { type ImageInput } from '@squoosh-kit/runtime';
|
|
5
|
+
import type { WebpOptions } from './types.js';
|
|
6
|
+
interface WebPBridge {
|
|
7
|
+
encode(signal: AbortSignal, image: ImageInput, options?: WebpOptions): Promise<Uint8Array>;
|
|
8
|
+
}
|
|
9
|
+
export declare function createBridge(mode: 'worker' | 'client'): WebPBridge;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @squoosh-kit/webp public API
|
|
3
|
+
*/
|
|
4
|
+
import type { ImageInput } from '@squoosh-kit/runtime';
|
|
5
|
+
import type { WebpOptions } from './types.js';
|
|
6
|
+
export type { ImageInput, WebpOptions };
|
|
7
|
+
/**
|
|
8
|
+
* Encodes an image to WebP format. Defaults to 'worker' mode.
|
|
9
|
+
*
|
|
10
|
+
* @param signal - An AbortSignal to cancel the encoding operation.
|
|
11
|
+
* @param imageData - The image data to encode.
|
|
12
|
+
* @param options - WebP encoding options.
|
|
13
|
+
* @returns A Promise resolving to the encoded WebP data as a Uint8Array.
|
|
14
|
+
*/
|
|
15
|
+
export declare function encode(signal: AbortSignal, imageData: ImageInput, options?: WebpOptions): Promise<Uint8Array>;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a reusable WebP encoder function for a specific execution mode.
|
|
18
|
+
* This is useful for processing multiple images without the overhead of
|
|
19
|
+
* creating a new worker or client instance each time.
|
|
20
|
+
*
|
|
21
|
+
* @param mode - The execution mode, either 'worker' or 'client'.
|
|
22
|
+
* @returns A function that encodes an image to WebP format.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createWebpEncoder(mode?: 'worker' | 'client'): (signal: AbortSignal, image: ImageInput, options?: WebpOptions) => Promise<Uint8Array>;
|
|
25
|
+
export { webpEncodeClient } from './webp.worker.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{a as U}from"./webp.worker.js";var K=0;async function F(W,m,P,b,I){return new Promise((J,B)=>{let x=++K;if(b?.aborted){B(new DOMException("Aborted","AbortError"));return}let y=(A)=>{let i=A.data;if(i.id!==x)return;if(console.log("\uD83D\uDD27 Worker call: Response received",i),u(),i.ok&&i.data!==void 0)console.log("\uD83D\uDD27 Worker call: Response data",i.data),J(i.data);else console.log("\uD83D\uDD27 Worker call: Response error",i.error),B(Error(i.error||"Unknown worker error"))},c=(A)=>{u(),B(Error(`Worker error: ${A.message}`))},f=()=>{u(),B(new DOMException("Aborted","AbortError"))},u=()=>{W.removeEventListener("message",y),W.removeEventListener("error",c),b?.removeEventListener("abort",f)};W.addEventListener("message",y),W.addEventListener("error",c),b?.addEventListener("abort",f);let z={type:m,id:x,payload:P};if(I&&I.length>0)W.postMessage(z,I);else W.postMessage(z)})}class G{async encode(W,m,P){return U(W,m,P)}}class H{worker=null;async getWorker(){if(!this.worker){let W=await import.meta.resolve("@squoosh-kit/webp/webp.worker.js");this.worker=new Worker(W,{type:"module"})}return this.worker}async encode(W,m,P){let b=await this.getWorker(),I=m.data.buffer;return F(b,"webp:encode",{image:m,options:P},W,[I])}}function O(W){return W==="client"?new G:new H}async function V(W,m,P){return O("worker").encode(W,m,P)}function X(W="worker"){let m=O(W);return m.encode.bind(m)}export{U as webpEncodeClient,V as encode,X as createWebpEncoder};
|
|
3
|
+
|
|
4
|
+
//# debugId=BED8FE1C0F8F587E64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../runtime/src/worker-call.ts", "../src/bridge.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Generic worker communication helper with support for transferables and AbortSignal\n */\n\nexport interface WorkerRequest<T = unknown> {\n type: string;\n id: number;\n payload: T;\n}\n\nexport interface WorkerResponse<T = unknown> {\n id: number;\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nlet requestId = 0;\n\n/**\n * Call a worker with a typed request and wait for response\n *\n * @param worker - The worker instance to call\n * @param type - The message type\n * @param payload - The payload to send\n * @param signal - Optional AbortSignal to cancel the operation\n * @param transfer - Optional list of Transferable objects to transfer\n * @returns Promise that resolves with the worker's response data\n */\nexport async function callWorker<TPayload, TResponse>(\n worker: Worker,\n type: string,\n payload: TPayload,\n signal?: AbortSignal,\n transfer?: Transferable[]\n): Promise<TResponse> {\n return new Promise<TResponse>((resolve, reject) => {\n const id = ++requestId;\n\n // Check if already aborted\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n const handleMessage = (event: MessageEvent) => {\n const response = event.data as WorkerResponse<TResponse>;\n if (response.id !== id) return;\n\n console.log('🔧 Worker call: Response received', response);\n cleanup();\n\n if (response.ok && response.data !== undefined) {\n console.log('🔧 Worker call: Response data', response.data);\n resolve(response.data);\n } else {\n console.log('🔧 Worker call: Response error', response.error);\n reject(new Error(response.error || 'Unknown worker error'));\n }\n };\n\n const handleError = (error: ErrorEvent) => {\n cleanup();\n reject(new Error(`Worker error: ${error.message}`));\n };\n\n const handleAbort = () => {\n cleanup();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n\n const cleanup = () => {\n worker.removeEventListener('message', handleMessage);\n worker.removeEventListener('error', handleError);\n signal?.removeEventListener('abort', handleAbort);\n };\n\n // Set up listeners\n worker.addEventListener('message', handleMessage);\n worker.addEventListener('error', handleError);\n signal?.addEventListener('abort', handleAbort);\n\n // Send the request\n const request: WorkerRequest<TPayload> = { type, id, payload };\n\n if (transfer && transfer.length > 0) {\n worker.postMessage(request, transfer);\n } else {\n worker.postMessage(request);\n }\n });\n}\n",
|
|
6
|
+
"/**\n * Bridge implementation for the WebP package, handling worker and client modes.\n */\n\nimport { callWorker, type ImageInput } from '@squoosh-kit/runtime';\nimport { webpEncodeClient } from './webp.worker.js';\nimport type { WebpOptions } from './types.js';\n\ninterface WebPBridge {\n encode(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n ): Promise<Uint8Array>;\n}\n\nclass WebpClientBridge implements WebPBridge {\n async encode(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n ): Promise<Uint8Array> {\n return webpEncodeClient(signal, image, options);\n }\n}\n\nclass WebpWorkerBridge implements WebPBridge {\n private worker: Worker | null = null;\n private async getWorker(): Promise<Worker> {\n if (!this.worker) {\n const workerUrl = await import.meta.resolve(\n '@squoosh-kit/webp/webp.worker.js'\n );\n this.worker = new Worker(workerUrl, { type: 'module' });\n }\n return this.worker;\n }\n async encode(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n ): Promise<Uint8Array> {\n const worker = await this.getWorker();\n const buffer = image.data.buffer;\n return callWorker(worker, 'webp:encode', { image, options }, signal, [\n buffer as ArrayBuffer,\n ]);\n }\n}\n\nexport function createBridge(mode: 'worker' | 'client'): WebPBridge {\n return mode === 'client' ? new WebpClientBridge() : new WebpWorkerBridge();\n}\n",
|
|
7
|
+
"/**\n * @squoosh-kit/webp public API\n */\n\nimport type { ImageInput } from '@squoosh-kit/runtime';\nimport { createBridge } from './bridge.js';\nimport type { WebpOptions } from './types.js';\n\nexport type { ImageInput, WebpOptions };\n\n/**\n * Encodes an image to WebP format. Defaults to 'worker' mode.\n *\n * @param signal - An AbortSignal to cancel the encoding operation.\n * @param imageData - The image data to encode.\n * @param options - WebP encoding options.\n * @returns A Promise resolving to the encoded WebP data as a Uint8Array.\n */\nexport async function encode(\n signal: AbortSignal,\n imageData: ImageInput,\n options?: WebpOptions\n): Promise<Uint8Array> {\n // Always use a worker for a single, one-off call for best performance.\n const bridge = createBridge('worker');\n return bridge.encode(signal, imageData, options);\n}\n\n/**\n * Creates a reusable WebP encoder function for a specific execution mode.\n * This is useful for processing multiple images without the overhead of\n * creating a new worker or client instance each time.\n *\n * @param mode - The execution mode, either 'worker' or 'client'.\n * @returns A function that encodes an image to WebP format.\n */\nexport function createWebpEncoder(mode: 'worker' | 'client' = 'worker') {\n const bridge = createBridge(mode);\n return bridge.encode.bind(bridge);\n}\n\n// Export the client-side implementation for direct use by the bridge.\n// This is not intended for public consumption.\nexport { webpEncodeClient } from './webp.worker.js';\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": ";qCAiBA,IAAI,EAAY,EAYhB,eAAsB,CAA+B,CACnD,EACA,EACA,EACA,EACA,EACoB,CACpB,OAAO,IAAI,QAAmB,CAAC,EAAS,IAAW,CACjD,IAAM,EAAK,EAAE,EAGb,GAAI,GAAQ,QAAS,CACnB,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,EAChD,OAGF,IAAM,EAAgB,CAAC,IAAwB,CAC7C,IAAM,EAAW,EAAM,KACvB,GAAI,EAAS,KAAO,EAAI,OAKxB,GAHA,QAAQ,IAAI,8CAAoC,CAAQ,EACxD,EAAQ,EAEJ,EAAS,IAAM,EAAS,OAAS,OACnC,QAAQ,IAAI,0CAAgC,EAAS,IAAI,EACzD,EAAQ,EAAS,IAAI,EAErB,aAAQ,IAAI,2CAAiC,EAAS,KAAK,EAC3D,EAAW,MAAM,EAAS,OAAS,sBAAsB,CAAC,GAIxD,EAAc,CAAC,IAAsB,CACzC,EAAQ,EACR,EAAW,MAAM,iBAAiB,EAAM,SAAS,CAAC,GAG9C,EAAc,IAAM,CACxB,EAAQ,EACR,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,GAG5C,EAAU,IAAM,CACpB,EAAO,oBAAoB,UAAW,CAAa,EACnD,EAAO,oBAAoB,QAAS,CAAW,EAC/C,GAAQ,oBAAoB,QAAS,CAAW,GAIlD,EAAO,iBAAiB,UAAW,CAAa,EAChD,EAAO,iBAAiB,QAAS,CAAW,EAC5C,GAAQ,iBAAiB,QAAS,CAAW,EAG7C,IAAM,EAAmC,CAAE,OAAM,KAAI,SAAQ,EAE7D,GAAI,GAAY,EAAS,OAAS,EAChC,EAAO,YAAY,EAAS,CAAQ,EAEpC,OAAO,YAAY,CAAO,EAE7B,EC1EH,MAAM,CAAuC,MACrC,OAAM,CACV,EACA,EACA,EACqB,CACrB,OAAO,EAAiB,EAAQ,EAAO,CAAO,EAElD,CAEA,MAAM,CAAuC,CACnC,OAAwB,UAClB,UAAS,EAAoB,CACzC,GAAI,CAAC,KAAK,OAAQ,CAChB,IAAM,EAAY,MAAM,YAAY,QAClC,kCACF,EACA,KAAK,OAAS,IAAI,OAAO,EAAW,CAAE,KAAM,QAAS,CAAC,EAExD,OAAO,KAAK,YAER,OAAM,CACV,EACA,EACA,EACqB,CACrB,IAAM,EAAS,MAAM,KAAK,UAAU,EAC9B,EAAS,EAAM,KAAK,OAC1B,OAAO,EAAW,EAAQ,cAAe,CAAE,QAAO,SAAQ,EAAG,EAAQ,CACnE,CACF,CAAC,EAEL,CAEO,SAAS,CAAY,CAAC,EAAuC,CAClE,OAAO,IAAS,SAAW,IAAI,EAAqB,IAAI,ECjC1D,eAAsB,CAAM,CAC1B,EACA,EACA,EACqB,CAGrB,OADe,EAAa,QAAQ,EACtB,OAAO,EAAQ,EAAW,CAAO,EAW1C,SAAS,CAAiB,CAAC,EAA4B,SAAU,CACtE,IAAM,EAAS,EAAa,CAAI,EAChC,OAAO,EAAO,OAAO,KAAK,CAAM",
|
|
10
|
+
"debugId": "BED8FE1C0F8F587E64756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface EncodeOptions {
|
|
2
|
+
quality: number;
|
|
3
|
+
target_size: number;
|
|
4
|
+
target_PSNR: number;
|
|
5
|
+
method: number;
|
|
6
|
+
sns_strength: number;
|
|
7
|
+
filter_strength: number;
|
|
8
|
+
filter_sharpness: number;
|
|
9
|
+
filter_type: number;
|
|
10
|
+
partitions: number;
|
|
11
|
+
segments: number;
|
|
12
|
+
pass: number;
|
|
13
|
+
show_compressed: number;
|
|
14
|
+
preprocessing: number;
|
|
15
|
+
autofilter: number;
|
|
16
|
+
partition_limit: number;
|
|
17
|
+
alpha_compression: number;
|
|
18
|
+
alpha_filtering: number;
|
|
19
|
+
alpha_quality: number;
|
|
20
|
+
lossless: number;
|
|
21
|
+
exact: number;
|
|
22
|
+
image_hint: number;
|
|
23
|
+
emulate_jpeg_size: number;
|
|
24
|
+
thread_level: number;
|
|
25
|
+
low_memory: number;
|
|
26
|
+
near_lossless: number;
|
|
27
|
+
use_delta_palette: number;
|
|
28
|
+
use_sharp_yuv: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface WebPModule extends EmscriptenWasm.Module {
|
|
32
|
+
encode(
|
|
33
|
+
data: BufferSource,
|
|
34
|
+
width: number,
|
|
35
|
+
height: number,
|
|
36
|
+
options: EncodeOptions,
|
|
37
|
+
): Uint8Array | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
declare var moduleFactory: EmscriptenWasm.ModuleFactory<WebPModule>;
|
|
41
|
+
|
|
42
|
+
export default moduleFactory;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
var Module = (function() {
|
|
3
|
+
var _scriptDir = import.meta.url;
|
|
4
|
+
|
|
5
|
+
return (
|
|
6
|
+
function(Module) {
|
|
7
|
+
Module = Module || {};
|
|
8
|
+
|
|
9
|
+
var Module=typeof Module!=="undefined"?Module:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;var UTF8Decoder=new TextDecoder("utf8");function UTF8ToString(ptr,maxBytesToRead){if(!ptr)return"";var maxPtr=ptr+maxBytesToRead;for(var end=ptr;!(end>=maxPtr)&&HEAPU8[end];)++end;return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=new TextDecoder("utf-16le");function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}if(Module["locateFile"]){var wasmBinaryFile="webp_enc.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}}else{var wasmBinaryFile=new URL("webp_enc.wasm",import.meta.url).toString()}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["x"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["D"];addOnInit(Module["asm"]["y"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function _atexit(func,arg){}function ___cxa_thread_atexit(a0,a1){return _atexit(a0,a1)}var structRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach(function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function __embind_finalize_value_object(structType){var reg=structRegistrations[structType];delete structRegistrations[structType];var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var fieldRecords=reg.fields;var fieldTypes=fieldRecords.map(function(field){return field.getterReturnType}).concat(fieldRecords.map(function(field){return field.setterArgumentType}));whenDependentTypesAreResolved([structType],fieldTypes,function(fieldTypes){var fields={};fieldRecords.forEach(function(field,i){var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:function(ptr){return getterReturnType["fromWireType"](getter(getterContext,ptr))},write:function(ptr,o){var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,"fromWireType":function(ptr){var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},"toWireType":function(destructors,o){for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError('Missing field: "'+fieldName+'"')}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:rawDestructor}]})}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(function(cb){cb()})}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1}case null:{return 2}case true:{return 3}case false:{return 4}default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function enumReadValueFromPointer(name,shift,signed){switch(shift){case 0:return function(pointer){var heap=signed?HEAP8:HEAPU8;return this["fromWireType"](heap[pointer])};case 1:return function(pointer){var heap=signed?HEAP16:HEAPU16;return this["fromWireType"](heap[pointer>>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i<arguments.length;i++){argCache[i]=arguments[i]}return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return wasmTable.get(rawFunction)}var fp=makeDynCaller();if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<<bitshift>>>bitshift}}var isUnsignedType=name.includes("unsigned");registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}str=a.join("")}_free(value);return str},"toWireType":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var getLength;var valueIsOfTypeString=typeof value==="string";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError("Cannot pass non-string to std::string")}if(stdStringIsUTF8&&valueIsOfTypeString){getLength=function(){return lengthBytesUTF8(value)}}else{getLength=function(){return value.length}}var length=getLength();var ptr=_malloc(4+length+1);HEAPU32[ptr>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+4+i]=value[i]}}}if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=function(){return HEAPU16};shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=function(){return HEAPU32};shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}function emval_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i<argCount;++i){argsList+=(i!==0?", ":"")+"arg"+i}var functionBody="return function emval_allocator_"+argCount+"(constructor, argTypes, args) {\n";for(var i=0;i<argCount;++i){functionBody+="var argType"+i+" = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");var asmLibraryArg={"w":___cxa_thread_atexit,"l":__embind_finalize_value_object,"p":__embind_register_bigint,"s":__embind_register_bool,"r":__embind_register_emval,"n":__embind_register_enum,"d":__embind_register_enum_value,"j":__embind_register_float,"h":__embind_register_function,"c":__embind_register_integer,"b":__embind_register_memory_view,"k":__embind_register_std_string,"g":__embind_register_std_wstring,"m":__embind_register_value_object,"a":__embind_register_value_object_field,"t":__embind_register_void,"f":__emval_decref,"v":__emval_get_global,"u":__emval_incref,"o":__emval_new,"i":_abort,"q":_emscripten_memcpy_big,"e":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["y"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["z"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["A"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["B"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["C"]).apply(null,arguments)};var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
return Module.ready
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
})();
|
|
16
|
+
export default Module;
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
var Module = (function() {
|
|
3
|
+
var _scriptDir = import.meta.url;
|
|
4
|
+
|
|
5
|
+
return (
|
|
6
|
+
function(Module) {
|
|
7
|
+
Module = Module || {};
|
|
8
|
+
|
|
9
|
+
var Module=typeof Module!=="undefined"?Module:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;var UTF8Decoder=new TextDecoder("utf8");function UTF8ToString(ptr,maxBytesToRead){if(!ptr)return"";var maxPtr=ptr+maxBytesToRead;for(var end=ptr;!(end>=maxPtr)&&HEAPU8[end];)++end;return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=new TextDecoder("utf-16le");function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}if(Module["locateFile"]){var wasmBinaryFile="webp_dec.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}}else{var wasmBinaryFile=new URL("webp_dec.wasm",import.meta.url).toString()}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["s"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["y"];addOnInit(Module["asm"]["t"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function _atexit(func,arg){}function ___cxa_thread_atexit(a0,a1){return _atexit(a0,a1)}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach(function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(function(cb){cb()})}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1}case null:{return 2}case true:{return 3}case false:{return 4}default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i<arguments.length;i++){argCache[i]=arguments[i]}return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return wasmTable.get(rawFunction)}var fp=makeDynCaller();if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<<bitshift>>>bitshift}}var isUnsignedType=name.includes("unsigned");registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}str=a.join("")}_free(value);return str},"toWireType":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var getLength;var valueIsOfTypeString=typeof value==="string";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError("Cannot pass non-string to std::string")}if(stdStringIsUTF8&&valueIsOfTypeString){getLength=function(){return lengthBytesUTF8(value)}}else{getLength=function(){return value.length}}var length=getLength();var ptr=_malloc(4+length+1);HEAPU32[ptr>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+4+i]=value[i]}}}if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=function(){return HEAPU16};shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=function(){return HEAPU32};shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}function emval_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i<argCount;++i){argsList+=(i!==0?", ":"")+"arg"+i}var functionBody="return function emval_allocator_"+argCount+"(constructor, argTypes, args) {\n";for(var i=0;i<argCount;++i){functionBody+="var argType"+i+" = requireRegisteredType(Module['HEAP32'][(argTypes >>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");var asmLibraryArg={"e":___cxa_thread_atexit,"p":__embind_register_bigint,"n":__embind_register_bool,"r":__embind_register_emval,"m":__embind_register_float,"i":__embind_register_function,"b":__embind_register_integer,"a":__embind_register_memory_view,"h":__embind_register_std_string,"f":__embind_register_std_wstring,"o":__embind_register_void,"c":__emval_decref,"d":__emval_get_global,"j":__emval_incref,"k":__emval_new,"l":_abort,"q":_emscripten_memcpy_big,"g":_emscripten_resize_heap};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["t"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["u"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["v"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["w"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["x"]).apply(null,arguments)};var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
return Module.ready
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
})();
|
|
16
|
+
export default Module;
|
|
Binary file
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebP encoder - single-source worker/client implementation
|
|
3
|
+
*/
|
|
4
|
+
import { type ImageInput } from '@squoosh-kit/runtime';
|
|
5
|
+
import type { WebpOptions } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Client-mode WebP encoder (exported for direct use)
|
|
8
|
+
*/
|
|
9
|
+
export declare function webpEncodeClient(signal: AbortSignal, image: ImageInput, options?: WebpOptions): Promise<Uint8Array>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var N=null;async function U(){if(N)return N;try{if(typeof self>"u")global.self=global;if(typeof self<"u"&&!self.location)self.location={href:import.meta.url};let x=import.meta.url.endsWith(".ts")?"../dist/wasm/webp":"./wasm/webp",G=await import(new URL(`${x}/webp_enc.js`,import.meta.url).href),J=new URL(`${x}/`,import.meta.url).href,H=await G.default({locateFile:(I)=>{if(I.endsWith(".wasm"))return new URL(I,J).href;return I}});return N=H,H}catch(j){throw Error(`Failed to load WebP module: ${j instanceof Error?j.message:String(j)}`)}}function V(j){let x=Math.max(0,Math.min(100,j?.quality??82)),z=j?.lossless??!1,G=j?.nearLossless??!1;return{quality:x,target_size:0,target_PSNR:0,method:4,sns_strength:50,filter_strength:60,filter_sharpness:0,filter_type:1,partitions:0,segments:4,pass:1,show_compressed:0,preprocessing:0,autofilter:0,partition_limit:0,alpha_compression:1,alpha_filtering:1,alpha_quality:100,lossless:z?1:0,exact:0,image_hint:0,emulate_jpeg_size:0,thread_level:0,low_memory:0,near_lossless:G?x:100,use_delta_palette:0,use_sharp_yuv:0}}async function X(j,x,z){if(j.aborted)throw new DOMException("Aborted","AbortError");let{width:G,height:J,data:H}=x;if(!(H instanceof Uint8Array)&&!(H instanceof Uint8ClampedArray))throw Error("Image data must be Uint8Array or Uint8ClampedArray");let I=await U();if(j.aborted)throw new DOMException("Aborted","AbortError");let K=V(z),R=H instanceof Uint8ClampedArray?new Uint8Array(H):H,S=new Uint8Array(R),Q=I.encode(S,G,J,K);if(j.aborted)throw new DOMException("Aborted","AbortError");if(!Q)throw Error("WebP encoding failed");return Q}console.log("\uD83D\uDD27 WebP worker: Message handler registered");if(typeof self<"u")self.onmessage=async(j)=>{console.log("\uD83D\uDD27 WebP worker: Received message",j.data);let x=j.data,z={id:x.id,ok:!1};try{if(x.type==="webp:encode"){let{image:G,options:J}=x.payload,H=new AbortController,I=await X(H.signal,G,J);z.ok=!0,z.data=I;let K=z.data.buffer;self.postMessage(z,[K])}else z.error=`Unknown message type: ${x.type}`,self.postMessage(z)}catch(G){z.error=G instanceof Error?G.message:String(G),self.postMessage(z)}};export{X as webpEncodeClient};
|
|
3
|
+
export{X as a};
|
|
4
|
+
|
|
5
|
+
//# debugId=12CA6CEA9252561D64756E2164756E21
|
|
6
|
+
//# sourceMappingURL=webp.worker.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/webp.worker.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * WebP encoder - single-source worker/client implementation\n */\n\nimport {\n isWorker,\n type WorkerRequest,\n type WorkerResponse,\n type ImageInput,\n} from '@squoosh-kit/runtime';\nimport type { WebpOptions } from './types.js';\n\n// Types from webp_enc.d.ts\ninterface EncodeOptions {\n quality: number;\n target_size: number;\n target_PSNR: number;\n method: number;\n sns_strength: number;\n filter_strength: number;\n filter_sharpness: number;\n filter_type: number;\n partitions: number;\n segments: number;\n pass: number;\n show_compressed: number;\n preprocessing: number;\n autofilter: number;\n partition_limit: number;\n alpha_compression: number;\n alpha_filtering: number;\n alpha_quality: number;\n lossless: number;\n exact: number;\n image_hint: number;\n emulate_jpeg_size: number;\n thread_level: number;\n low_memory: number;\n near_lossless: number;\n use_delta_palette: number;\n use_sharp_yuv: number;\n}\n\ninterface WebPModule {\n encode(\n data: BufferSource,\n width: number,\n height: number,\n options: EncodeOptions\n ): Uint8Array | null;\n}\n\nlet cachedModule: WebPModule | null = null;\n\nasync function loadWebPModule(): Promise<WebPModule> {\n if (cachedModule) {\n return cachedModule;\n }\n\n try {\n // Environment polyfills for Emscripten-generated code\n // The WebP encoder WASM module expects browser-like globals (self, location)\n // These polyfills ensure compatibility when running in Bun/Node.js environments\n if (typeof self === 'undefined') {\n // Polyfill 'self' global for Emscripten compatibility\n (global as { self?: typeof globalThis }).self = global;\n }\n if (typeof self !== 'undefined' && !self.location) {\n // Polyfill 'location' object for Emscripten module initialization\n (self as { location?: { href: string } }).location = {\n href: import.meta.url,\n };\n }\n\n // When running tests, Bun executes the .ts file directly from `src`.\n // In production, the compiled .js file is run from `dist`.\n // We need to adjust the asset path accordingly.\n const isTest = import.meta.url.endsWith('.ts');\n const wasmDirectory = isTest ? '../dist/wasm/webp' : './wasm/webp';\n\n // Dynamically import the WebP encoder module\n const modulePath = new URL(`${wasmDirectory}/webp_enc.js`, import.meta.url)\n .href;\n const moduleFactory = await import(modulePath);\n\n // Initialize the WebP module with locateFile to properly resolve the WASM\n const wasmPath = new URL(`${wasmDirectory}/`, import.meta.url).href;\n const module = await moduleFactory.default({\n locateFile: (path: string) => {\n // Return the full URL to the WASM file\n if (path.endsWith('.wasm')) {\n return new URL(path, wasmPath).href;\n }\n return path;\n },\n });\n\n cachedModule = module;\n return module;\n } catch (error) {\n throw new Error(\n `Failed to load WebP module: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Convert our simplified options to full EncodeOptions\n */\nfunction createEncodeOptions(options?: WebpOptions): EncodeOptions {\n const quality = Math.max(0, Math.min(100, options?.quality ?? 82));\n const lossless = options?.lossless ?? false;\n const nearLossless = options?.nearLossless ?? false;\n\n // Default encode options from Squoosh\n return {\n quality,\n target_size: 0,\n target_PSNR: 0,\n method: 4,\n sns_strength: 50,\n filter_strength: 60,\n filter_sharpness: 0,\n filter_type: 1,\n partitions: 0,\n segments: 4,\n pass: 1,\n show_compressed: 0,\n preprocessing: 0,\n autofilter: 0,\n partition_limit: 0,\n alpha_compression: 1,\n alpha_filtering: 1,\n alpha_quality: 100,\n lossless: lossless ? 1 : 0,\n exact: 0,\n image_hint: 0,\n emulate_jpeg_size: 0,\n thread_level: 0,\n low_memory: 0,\n near_lossless: nearLossless ? quality : 100,\n use_delta_palette: 0,\n use_sharp_yuv: 0,\n };\n}\n\n/**\n * Client-mode WebP encoder (exported for direct use)\n */\nexport async function webpEncodeClient(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n): Promise<Uint8Array> {\n // Check abort before starting\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n // Normalize image input\n const width = image.width;\n const height = image.height;\n const data = image.data;\n\n if (!(data instanceof Uint8Array) && !(data instanceof Uint8ClampedArray)) {\n throw new Error('Image data must be Uint8Array or Uint8ClampedArray');\n }\n\n const module = await loadWebPModule();\n\n // Check abort after async operation\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const encodeOptions = createEncodeOptions(options);\n\n // Call the encode function\n // Convert Uint8ClampedArray to Uint8Array if needed for BufferSource compatibility\n const dataArray =\n data instanceof Uint8ClampedArray ? new Uint8Array(data) : data;\n // Create a new Uint8Array with a proper ArrayBuffer to satisfy BufferSource\n const buffer = new Uint8Array(dataArray);\n const result = module.encode(buffer, width, height, encodeOptions);\n\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n if (!result) {\n throw new Error('WebP encoding failed');\n }\n\n return result;\n}\n\n/**\n * Worker message handler\n * Register the handler regardless of environment (for both worker context and tests)\n */\nconsole.log('🔧 WebP worker: Message handler registered');\nif (typeof self !== 'undefined') {\n self.onmessage = async (event: MessageEvent) => {\n console.log('🔧 WebP worker: Received message', event.data);\n const request = event.data as WorkerRequest<{\n image: ImageInput;\n options?: WebpOptions;\n }>;\n\n const response: WorkerResponse<Uint8Array> = {\n id: request.id,\n ok: false,\n };\n\n try {\n if (request.type === 'webp:encode') {\n const { image, options } = request.payload;\n\n // Create an AbortController for this request\n const controller = new AbortController();\n\n const result = await webpEncodeClient(\n controller.signal,\n image,\n options\n );\n\n response.ok = true;\n response.data = result;\n\n // Transfer the result buffer back directly from the response data\n const resultBuffer: ArrayBuffer = response.data.buffer as ArrayBuffer;\n self.postMessage(response, [resultBuffer]);\n } else {\n response.error = `Unknown message type: ${request.type}`;\n self.postMessage(response);\n }\n } catch (error) {\n response.error = error instanceof Error ? error.message : String(error);\n self.postMessage(response);\n }\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "12CA6CEA9252561D64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @squoosh-kit/core - Per-feature adapters around Squoosh codecs
|
|
3
|
+
*
|
|
4
|
+
* Main entry point that re-exports all functionality from the individual
|
|
5
|
+
* feature packages. For smaller bundle sizes, import directly from the
|
|
6
|
+
* feature package (e.g., `@squoosh-kit/webp`).
|
|
7
|
+
*/
|
|
8
|
+
export * from '@squoosh-kit/webp';
|
|
9
|
+
export * from '@squoosh-kit/resize';
|
|
10
|
+
export type { ImageInput } from '@squoosh-kit/runtime';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var F=0;async function b(W,I,k,B,P){return new Promise((z,A)=>{let O=++F;if(B?.aborted){A(new DOMException("Aborted","AbortError"));return}let R=(G)=>{let U=G.data;if(U.id!==O)return;if(console.log("\uD83D\uDD27 Worker call: Response received",U),c(),U.ok&&U.data!==void 0)console.log("\uD83D\uDD27 Worker call: Response data",U.data),z(U.data);else console.log("\uD83D\uDD27 Worker call: Response error",U.error),A(Error(U.error||"Unknown worker error"))},S=(G)=>{c(),A(Error(`Worker error: ${G.message}`))},f=()=>{c(),A(new DOMException("Aborted","AbortError"))},c=()=>{W.removeEventListener("message",R),W.removeEventListener("error",S),B?.removeEventListener("abort",f)};W.addEventListener("message",R),W.addEventListener("error",S),B?.addEventListener("abort",f);let V={type:I,id:O,payload:k};if(P&&P.length>0)W.postMessage(V,P);else W.postMessage(V)})}var J=null;async function L(){if(J)return J;try{if(typeof self>"u")global.self=global;if(typeof self<"u"&&!self.location)self.location={href:import.meta.url};let I=import.meta.url.endsWith(".ts")?"../dist/wasm/webp":"./wasm/webp",B=await import(new URL(`${I}/webp_enc.js`,import.meta.url).href),P=new URL(`${I}/`,import.meta.url).href,z=await B.default({locateFile:(A)=>{if(A.endsWith(".wasm"))return new URL(A,P).href;return A}});return J=z,z}catch(W){throw Error(`Failed to load WebP module: ${W instanceof Error?W.message:String(W)}`)}}function _(W){let I=Math.max(0,Math.min(100,W?.quality??82)),k=W?.lossless??!1,B=W?.nearLossless??!1;return{quality:I,target_size:0,target_PSNR:0,method:4,sns_strength:50,filter_strength:60,filter_sharpness:0,filter_type:1,partitions:0,segments:4,pass:1,show_compressed:0,preprocessing:0,autofilter:0,partition_limit:0,alpha_compression:1,alpha_filtering:1,alpha_quality:100,lossless:k?1:0,exact:0,image_hint:0,emulate_jpeg_size:0,thread_level:0,low_memory:0,near_lossless:B?I:100,use_delta_palette:0,use_sharp_yuv:0}}async function w(W,I,k){if(W.aborted)throw new DOMException("Aborted","AbortError");let{width:B,height:P,data:z}=I;if(!(z instanceof Uint8Array)&&!(z instanceof Uint8ClampedArray))throw Error("Image data must be Uint8Array or Uint8ClampedArray");let A=await L();if(W.aborted)throw new DOMException("Aborted","AbortError");let O=_(k),R=z instanceof Uint8ClampedArray?new Uint8Array(z):z,S=new Uint8Array(R),f=A.encode(S,B,P,O);if(W.aborted)throw new DOMException("Aborted","AbortError");if(!f)throw Error("WebP encoding failed");return f}console.log("\uD83D\uDD27 WebP worker: Message handler registered");if(typeof self<"u")self.onmessage=async(W)=>{console.log("\uD83D\uDD27 WebP worker: Received message",W.data);let I=W.data,k={id:I.id,ok:!1};try{if(I.type==="webp:encode"){let{image:B,options:P}=I.payload,z=new AbortController,A=await w(z.signal,B,P);k.ok=!0,k.data=A;let O=k.data.buffer;self.postMessage(k,[O])}else k.error=`Unknown message type: ${I.type}`,self.postMessage(k)}catch(B){k.error=B instanceof Error?B.message:String(B),self.postMessage(k)}};class X{async encode(W,I,k){return w(W,I,k)}}class Y{worker=null;async getWorker(){if(!this.worker){let W=await import.meta.resolve("@squoosh-kit/webp/webp.worker.js");this.worker=new Worker(W,{type:"module"})}return this.worker}async encode(W,I,k){let B=await this.getWorker(),P=I.data.buffer;return b(B,"webp:encode",{image:I,options:k},W,[P])}}function K(W){return W==="client"?new X:new Y}async function j(W,I,k){return K("worker").encode(W,I,k)}function q(W="worker"){let I=K(W);return I.encode.bind(I)}var x=null;async function C(){if(x)return;let I=import.meta.url.endsWith(".ts")?"../dist/wasm/resize":"./wasm/resize",k=await import.meta.resolve(`${I}/squoosh_resize.js`),B=await import(k);await B.default(fetch(new URL(`${I}/squoosh_resize_bg.wasm`,k))),x=B.resize}async function Z(W,I){if(await C(),!x)throw Error("Resize module not initialized");let{data:k,width:B,height:P}=W,z=I.width??B,A=I.height??P;if(I.width&&!I.height)A=Math.round(P*I.width/B);else if(I.height&&!I.width)z=Math.round(B*I.height/P);if(z<=0||A<=0)throw Error("Invalid output dimensions");let O=k instanceof Uint8ClampedArray?new Uint8Array(k):k;return{data:x(O,B,P,z,A,E(),I.premultiply?1:0,I.linearRGB?1:0),width:z,height:A}}async function N(W,I,k){if(W.aborted)throw new DOMException("Aborted","AbortError");return Z(I,k)}function E(){return 3}if(typeof self<"u")self.onmessage=async(W)=>{let{id:I,type:k,payload:B}=W.data,P={id:I,ok:!1};try{if(k!=="resize:run")throw Error(`Unknown message type: ${k}`);let z=await Z(B.image,B.options);P.ok=!0,P.data=z;let A=z.data.buffer;if(A)self.postMessage(P,[A]);else self.postMessage(P)}catch(z){P.error=z instanceof Error?z.message:String(z),self.postMessage(P)}};class ${async resize(W,I,k){return N(W,I,k)}}class m{worker=null;async getWorker(){if(!this.worker){let W=await import.meta.resolve("@squoosh-kit/resize/resize.worker.js");this.worker=new Worker(W,{type:"module"})}return this.worker}async resize(W,I,k){let B=await this.getWorker();console.log("worker",B);let P=I.data.buffer;console.log("buffer",P);try{let z=await b(B,"resize:run",{image:I,options:k},W,[P]);return console.log("result",z),z}catch(z){throw console.error("error",z),z}}}function Q(W){return W==="client"?new $:new m}async function p(W,I,k){return Q("worker").resize(W,I,k)}function d(W="worker"){let I=Q(W);return I.resize.bind(I)}export{w as webpEncodeClient,N as resizeClient,p as resize,j as encode,q as createWebpEncoder,d as createResizer};
|
|
3
|
+
|
|
4
|
+
//# debugId=68885C1C82623E5A64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../runtime/src/worker-call.ts", "../../webp/src/webp.worker.ts", "../../webp/src/bridge.ts", "../../webp/src/index.ts", "../../resize/src/resize.worker.ts", "../../resize/src/bridge.ts", "../../resize/src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Generic worker communication helper with support for transferables and AbortSignal\n */\n\nexport interface WorkerRequest<T = unknown> {\n type: string;\n id: number;\n payload: T;\n}\n\nexport interface WorkerResponse<T = unknown> {\n id: number;\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nlet requestId = 0;\n\n/**\n * Call a worker with a typed request and wait for response\n *\n * @param worker - The worker instance to call\n * @param type - The message type\n * @param payload - The payload to send\n * @param signal - Optional AbortSignal to cancel the operation\n * @param transfer - Optional list of Transferable objects to transfer\n * @returns Promise that resolves with the worker's response data\n */\nexport async function callWorker<TPayload, TResponse>(\n worker: Worker,\n type: string,\n payload: TPayload,\n signal?: AbortSignal,\n transfer?: Transferable[]\n): Promise<TResponse> {\n return new Promise<TResponse>((resolve, reject) => {\n const id = ++requestId;\n\n // Check if already aborted\n if (signal?.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n const handleMessage = (event: MessageEvent) => {\n const response = event.data as WorkerResponse<TResponse>;\n if (response.id !== id) return;\n\n console.log('🔧 Worker call: Response received', response);\n cleanup();\n\n if (response.ok && response.data !== undefined) {\n console.log('🔧 Worker call: Response data', response.data);\n resolve(response.data);\n } else {\n console.log('🔧 Worker call: Response error', response.error);\n reject(new Error(response.error || 'Unknown worker error'));\n }\n };\n\n const handleError = (error: ErrorEvent) => {\n cleanup();\n reject(new Error(`Worker error: ${error.message}`));\n };\n\n const handleAbort = () => {\n cleanup();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n\n const cleanup = () => {\n worker.removeEventListener('message', handleMessage);\n worker.removeEventListener('error', handleError);\n signal?.removeEventListener('abort', handleAbort);\n };\n\n // Set up listeners\n worker.addEventListener('message', handleMessage);\n worker.addEventListener('error', handleError);\n signal?.addEventListener('abort', handleAbort);\n\n // Send the request\n const request: WorkerRequest<TPayload> = { type, id, payload };\n\n if (transfer && transfer.length > 0) {\n worker.postMessage(request, transfer);\n } else {\n worker.postMessage(request);\n }\n });\n}\n",
|
|
6
|
+
"/**\n * WebP encoder - single-source worker/client implementation\n */\n\nimport {\n isWorker,\n type WorkerRequest,\n type WorkerResponse,\n type ImageInput,\n} from '@squoosh-kit/runtime';\nimport type { WebpOptions } from './types.js';\n\n// Types from webp_enc.d.ts\ninterface EncodeOptions {\n quality: number;\n target_size: number;\n target_PSNR: number;\n method: number;\n sns_strength: number;\n filter_strength: number;\n filter_sharpness: number;\n filter_type: number;\n partitions: number;\n segments: number;\n pass: number;\n show_compressed: number;\n preprocessing: number;\n autofilter: number;\n partition_limit: number;\n alpha_compression: number;\n alpha_filtering: number;\n alpha_quality: number;\n lossless: number;\n exact: number;\n image_hint: number;\n emulate_jpeg_size: number;\n thread_level: number;\n low_memory: number;\n near_lossless: number;\n use_delta_palette: number;\n use_sharp_yuv: number;\n}\n\ninterface WebPModule {\n encode(\n data: BufferSource,\n width: number,\n height: number,\n options: EncodeOptions\n ): Uint8Array | null;\n}\n\nlet cachedModule: WebPModule | null = null;\n\nasync function loadWebPModule(): Promise<WebPModule> {\n if (cachedModule) {\n return cachedModule;\n }\n\n try {\n // Environment polyfills for Emscripten-generated code\n // The WebP encoder WASM module expects browser-like globals (self, location)\n // These polyfills ensure compatibility when running in Bun/Node.js environments\n if (typeof self === 'undefined') {\n // Polyfill 'self' global for Emscripten compatibility\n (global as { self?: typeof globalThis }).self = global;\n }\n if (typeof self !== 'undefined' && !self.location) {\n // Polyfill 'location' object for Emscripten module initialization\n (self as { location?: { href: string } }).location = {\n href: import.meta.url,\n };\n }\n\n // When running tests, Bun executes the .ts file directly from `src`.\n // In production, the compiled .js file is run from `dist`.\n // We need to adjust the asset path accordingly.\n const isTest = import.meta.url.endsWith('.ts');\n const wasmDirectory = isTest ? '../dist/wasm/webp' : './wasm/webp';\n\n // Dynamically import the WebP encoder module\n const modulePath = new URL(`${wasmDirectory}/webp_enc.js`, import.meta.url)\n .href;\n const moduleFactory = await import(modulePath);\n\n // Initialize the WebP module with locateFile to properly resolve the WASM\n const wasmPath = new URL(`${wasmDirectory}/`, import.meta.url).href;\n const module = await moduleFactory.default({\n locateFile: (path: string) => {\n // Return the full URL to the WASM file\n if (path.endsWith('.wasm')) {\n return new URL(path, wasmPath).href;\n }\n return path;\n },\n });\n\n cachedModule = module;\n return module;\n } catch (error) {\n throw new Error(\n `Failed to load WebP module: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Convert our simplified options to full EncodeOptions\n */\nfunction createEncodeOptions(options?: WebpOptions): EncodeOptions {\n const quality = Math.max(0, Math.min(100, options?.quality ?? 82));\n const lossless = options?.lossless ?? false;\n const nearLossless = options?.nearLossless ?? false;\n\n // Default encode options from Squoosh\n return {\n quality,\n target_size: 0,\n target_PSNR: 0,\n method: 4,\n sns_strength: 50,\n filter_strength: 60,\n filter_sharpness: 0,\n filter_type: 1,\n partitions: 0,\n segments: 4,\n pass: 1,\n show_compressed: 0,\n preprocessing: 0,\n autofilter: 0,\n partition_limit: 0,\n alpha_compression: 1,\n alpha_filtering: 1,\n alpha_quality: 100,\n lossless: lossless ? 1 : 0,\n exact: 0,\n image_hint: 0,\n emulate_jpeg_size: 0,\n thread_level: 0,\n low_memory: 0,\n near_lossless: nearLossless ? quality : 100,\n use_delta_palette: 0,\n use_sharp_yuv: 0,\n };\n}\n\n/**\n * Client-mode WebP encoder (exported for direct use)\n */\nexport async function webpEncodeClient(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n): Promise<Uint8Array> {\n // Check abort before starting\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n // Normalize image input\n const width = image.width;\n const height = image.height;\n const data = image.data;\n\n if (!(data instanceof Uint8Array) && !(data instanceof Uint8ClampedArray)) {\n throw new Error('Image data must be Uint8Array or Uint8ClampedArray');\n }\n\n const module = await loadWebPModule();\n\n // Check abort after async operation\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const encodeOptions = createEncodeOptions(options);\n\n // Call the encode function\n // Convert Uint8ClampedArray to Uint8Array if needed for BufferSource compatibility\n const dataArray =\n data instanceof Uint8ClampedArray ? new Uint8Array(data) : data;\n // Create a new Uint8Array with a proper ArrayBuffer to satisfy BufferSource\n const buffer = new Uint8Array(dataArray);\n const result = module.encode(buffer, width, height, encodeOptions);\n\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n if (!result) {\n throw new Error('WebP encoding failed');\n }\n\n return result;\n}\n\n/**\n * Worker message handler\n * Register the handler regardless of environment (for both worker context and tests)\n */\nconsole.log('🔧 WebP worker: Message handler registered');\nif (typeof self !== 'undefined') {\n self.onmessage = async (event: MessageEvent) => {\n console.log('🔧 WebP worker: Received message', event.data);\n const request = event.data as WorkerRequest<{\n image: ImageInput;\n options?: WebpOptions;\n }>;\n\n const response: WorkerResponse<Uint8Array> = {\n id: request.id,\n ok: false,\n };\n\n try {\n if (request.type === 'webp:encode') {\n const { image, options } = request.payload;\n\n // Create an AbortController for this request\n const controller = new AbortController();\n\n const result = await webpEncodeClient(\n controller.signal,\n image,\n options\n );\n\n response.ok = true;\n response.data = result;\n\n // Transfer the result buffer back directly from the response data\n const resultBuffer: ArrayBuffer = response.data.buffer as ArrayBuffer;\n self.postMessage(response, [resultBuffer]);\n } else {\n response.error = `Unknown message type: ${request.type}`;\n self.postMessage(response);\n }\n } catch (error) {\n response.error = error instanceof Error ? error.message : String(error);\n self.postMessage(response);\n }\n };\n}\n",
|
|
7
|
+
"/**\n * Bridge implementation for the WebP package, handling worker and client modes.\n */\n\nimport { callWorker, type ImageInput } from '@squoosh-kit/runtime';\nimport { webpEncodeClient } from './webp.worker.js';\nimport type { WebpOptions } from './types.js';\n\ninterface WebPBridge {\n encode(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n ): Promise<Uint8Array>;\n}\n\nclass WebpClientBridge implements WebPBridge {\n async encode(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n ): Promise<Uint8Array> {\n return webpEncodeClient(signal, image, options);\n }\n}\n\nclass WebpWorkerBridge implements WebPBridge {\n private worker: Worker | null = null;\n private async getWorker(): Promise<Worker> {\n if (!this.worker) {\n const workerUrl = await import.meta.resolve(\n '@squoosh-kit/webp/webp.worker.js'\n );\n this.worker = new Worker(workerUrl, { type: 'module' });\n }\n return this.worker;\n }\n async encode(\n signal: AbortSignal,\n image: ImageInput,\n options?: WebpOptions\n ): Promise<Uint8Array> {\n const worker = await this.getWorker();\n const buffer = image.data.buffer;\n return callWorker(worker, 'webp:encode', { image, options }, signal, [\n buffer as ArrayBuffer,\n ]);\n }\n}\n\nexport function createBridge(mode: 'worker' | 'client'): WebPBridge {\n return mode === 'client' ? new WebpClientBridge() : new WebpWorkerBridge();\n}\n",
|
|
8
|
+
"/**\n * @squoosh-kit/webp public API\n */\n\nimport type { ImageInput } from '@squoosh-kit/runtime';\nimport { createBridge } from './bridge.js';\nimport type { WebpOptions } from './types.js';\n\nexport type { ImageInput, WebpOptions };\n\n/**\n * Encodes an image to WebP format. Defaults to 'worker' mode.\n *\n * @param signal - An AbortSignal to cancel the encoding operation.\n * @param imageData - The image data to encode.\n * @param options - WebP encoding options.\n * @returns A Promise resolving to the encoded WebP data as a Uint8Array.\n */\nexport async function encode(\n signal: AbortSignal,\n imageData: ImageInput,\n options?: WebpOptions\n): Promise<Uint8Array> {\n // Always use a worker for a single, one-off call for best performance.\n const bridge = createBridge('worker');\n return bridge.encode(signal, imageData, options);\n}\n\n/**\n * Creates a reusable WebP encoder function for a specific execution mode.\n * This is useful for processing multiple images without the overhead of\n * creating a new worker or client instance each time.\n *\n * @param mode - The execution mode, either 'worker' or 'client'.\n * @returns A function that encodes an image to WebP format.\n */\nexport function createWebpEncoder(mode: 'worker' | 'client' = 'worker') {\n const bridge = createBridge(mode);\n return bridge.encode.bind(bridge);\n}\n\n// Export the client-side implementation for direct use by the bridge.\n// This is not intended for public consumption.\nexport { webpEncodeClient } from './webp.worker.js';\n",
|
|
9
|
+
"/**\n * Resize processor - single-source worker/client implementation\n */\n\nimport {\n hasImageData,\n type WorkerRequest,\n type WorkerResponse,\n type ImageInput,\n} from '@squoosh-kit/runtime';\nimport type { ResizeOptions } from './types.ts';\n\n// Define the type locally to avoid module resolution issues with the linter\ntype SquooshWasmResize = (\n data: Uint8Array,\n input_width: number,\n input_height: number,\n output_width: number,\n output_height: number,\n typ_idx: number,\n premultiply: number,\n color_space_conversion: number,\n) => Uint8Array;\n\nlet wasmResize: SquooshWasmResize | null = null;\n\nasync function init(): Promise<void> {\n if (wasmResize) {\n return;\n }\n\n const isTest = import.meta.url.endsWith('.ts');\n const wasmDirectory = isTest ? '../dist/wasm/resize' : './wasm/resize';\n const modulePath = await import.meta.resolve(\n `${wasmDirectory}/squoosh_resize.js`,\n );\n const module = await import(modulePath);\n\n // Squoosh's WASM modules expect to be initialized with promises\n await module.default(\n fetch(new URL(`${wasmDirectory}/squoosh_resize_bg.wasm`, modulePath)),\n );\n wasmResize = module.resize;\n}\n\nasync function _resizeCore(\n image: ImageInput,\n options: ResizeOptions,\n): Promise<ImageInput> {\n await init();\n if (!wasmResize) {\n throw new Error('Resize module not initialized');\n }\n\n const { data, width: inputWidth, height: inputHeight } = image;\n\n let outputWidth = options.width ?? inputWidth;\n let outputHeight = options.height ?? inputHeight;\n\n if (options.width && !options.height) {\n outputHeight = Math.round((inputHeight * options.width) / inputWidth);\n } else if (options.height && !options.width) {\n outputWidth = Math.round((inputWidth * options.height) / inputHeight);\n }\n\n if (outputWidth <= 0 || outputHeight <= 0) {\n throw new Error('Invalid output dimensions');\n }\n\n const dataArray =\n data instanceof Uint8ClampedArray ? new Uint8Array(data) : data;\n\n const result = wasmResize(\n dataArray,\n inputWidth,\n inputHeight,\n outputWidth,\n outputHeight,\n getResizeMethod(),\n options.premultiply ? 1 : 0,\n options.linearRGB ? 1 : 0,\n );\n\n return {\n data: result,\n width: outputWidth,\n height: outputHeight,\n };\n}\n\nexport async function resizeClient(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions,\n): Promise<ImageInput> {\n if (signal.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n return _resizeCore(image, options);\n}\n\n/**\n * Map ResizeOptions to the typ_idx parameter for the resize function\n * 0: Triangular, 1: Catrom, 2: Mitchell, 3: Lanczos3\n */\nfunction getResizeMethod(): number {\n // Default to Lanczos3 (highest quality)\n return 3;\n}\n\n/**\n * Worker message handler\n */\nif (typeof self !== 'undefined') {\n self.onmessage = async (\n event: MessageEvent<\n WorkerRequest<{ image: ImageInput; options: ResizeOptions }>\n >,\n ) => {\n const { id, type, payload } = event.data;\n\n const response: WorkerResponse<ImageInput> = { id, ok: false };\n\n try {\n if (type !== 'resize:run') {\n throw new Error(`Unknown message type: ${type}`);\n }\n\n const resultImage = await _resizeCore(payload.image, payload.options);\n\n response.ok = true;\n response.data = resultImage;\n\n const transferable = resultImage.data.buffer;\n if (transferable) {\n self.postMessage(response, [transferable as ArrayBuffer]);\n } else {\n self.postMessage(response);\n }\n } catch (error) {\n response.error = error instanceof Error ? error.message : String(error);\n self.postMessage(response);\n }\n };\n}\n",
|
|
10
|
+
"/**\n * Bridge implementation for the Resize package, handling worker and client modes.\n */\n\nimport { callWorker, type ImageInput } from '@squoosh-kit/runtime';\nimport { resizeClient } from './resize.worker.ts';\nimport type { ResizeOptions } from './types.ts';\n\ninterface ResizeBridge {\n resize(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions\n ): Promise<ImageInput>;\n}\n\nclass ResizeClientBridge implements ResizeBridge {\n async resize(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions\n ): Promise<ImageInput> {\n return resizeClient(signal, image, options);\n }\n}\n\nclass ResizeWorkerBridge implements ResizeBridge {\n private worker: Worker | null = null;\n private async getWorker(): Promise<Worker> {\n if (!this.worker) {\n const workerUrl = await import.meta.resolve(\n '@squoosh-kit/resize/resize.worker.js'\n );\n this.worker = new Worker(workerUrl, { type: 'module' });\n }\n return this.worker;\n }\n async resize(\n signal: AbortSignal,\n image: ImageInput,\n options: ResizeOptions\n ): Promise<ImageInput> {\n const worker = await this.getWorker();\n console.log('worker', worker);\n const buffer = image.data.buffer;\n console.log('buffer', buffer);\n\n try {\n const result = await callWorker<{ image: ImageInput; options: ResizeOptions }, ImageInput>(worker, 'resize:run', { image, options }, signal, [\n buffer as ArrayBuffer,\n ]);\n \n console.log('result', result);\n\n return result;\n } catch (error) {\n console.error('error', error);\n throw error;\n }\n }\n}\n\nexport function createBridge(mode: 'worker' | 'client'): ResizeBridge {\n return mode === 'client'\n ? new ResizeClientBridge()\n : new ResizeWorkerBridge();\n}\n",
|
|
11
|
+
"/**\n * @squoosh-kit/resize public API\n */\n\nimport type { ImageInput } from '@squoosh-kit/runtime';\nimport { createBridge } from './bridge.ts';\nimport type { ResizeOptions } from './types.ts';\n\nexport type { ImageInput, ResizeOptions };\n\n/**\n * Resizes an image. Defaults to 'worker' mode.\n *\n * @param signal - An AbortSignal to cancel the resizing operation.\n * @param imageData - The image data to resize.\n * @param options - Resize options.\n * @returns A Promise resolving to the resized image data.\n */\nexport async function resize(\n signal: AbortSignal,\n imageData: ImageInput,\n options: ResizeOptions\n): Promise<ImageInput> {\n // Always use a worker for a single, one-off call for best performance.\n const bridge = createBridge('worker');\n return bridge.resize(signal, imageData, options);\n}\n\n/**\n * Creates a reusable resizer function for a specific execution mode.\n *\n * @param mode - The execution mode, either 'worker' or 'client'.\n * @returns A function that resizes an image.\n */\nexport function createResizer(mode: 'worker' | 'client' = 'worker') {\n const bridge = createBridge(mode);\n return bridge.resize.bind(bridge);\n}\n\n// Export the client-side implementation for direct use by the bridge.\n// This is not intended for public consumption.\nexport { resizeClient } from './resize.worker.js';\n"
|
|
12
|
+
],
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "68885C1C82623E5A64756E2164756E21",
|
|
15
|
+
"names": []
|
|
16
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@squoosh-kit/core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"entry": "src/index.ts",
|
|
6
|
+
"description": "Per-feature adapters around Squoosh codecs (Bun-first), worker/client runtimes.",
|
|
7
|
+
"author": "Bartosz Nowak <bnowak008@gmail.com>",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/bnowak008/squoosh-kit.git"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/bnowak008/squoosh-kit#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/bnowak008/squoosh-kit/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"squoosh",
|
|
19
|
+
"webp",
|
|
20
|
+
"image",
|
|
21
|
+
"resize",
|
|
22
|
+
"wasm",
|
|
23
|
+
"bun",
|
|
24
|
+
"typescript",
|
|
25
|
+
"worker",
|
|
26
|
+
"codec",
|
|
27
|
+
"compression",
|
|
28
|
+
"image-processing",
|
|
29
|
+
"web-assembly",
|
|
30
|
+
"modern",
|
|
31
|
+
"lightweight"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"bun": ">=1.0.0",
|
|
35
|
+
"node": ">=18.0.0"
|
|
36
|
+
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public",
|
|
39
|
+
"registry": "https://registry.npmjs.org/"
|
|
40
|
+
},
|
|
41
|
+
"exports": {
|
|
42
|
+
".": {
|
|
43
|
+
"types": "./dist/index.d.ts",
|
|
44
|
+
"import": "./dist/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./webp": {
|
|
47
|
+
"types": "./dist/features/webp/index.d.ts",
|
|
48
|
+
"import": "./dist/features/webp/index.js"
|
|
49
|
+
},
|
|
50
|
+
"./resize": {
|
|
51
|
+
"types": "./dist/features/resize/index.d.ts",
|
|
52
|
+
"import": "./dist/features/resize/index.js"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist/**",
|
|
57
|
+
"README.md",
|
|
58
|
+
"LICENSE"
|
|
59
|
+
],
|
|
60
|
+
"sideEffects": false,
|
|
61
|
+
"scripts": {
|
|
62
|
+
"copy:assets": "bun run scripts/copy-assets.ts",
|
|
63
|
+
"build:declarations": "tsc",
|
|
64
|
+
"build:code": "bun build --sourcemap --minify --format=esm --splitting --target=bun --outdir=dist src/index.ts",
|
|
65
|
+
"build": "bun run copy:assets && bun run build:declarations && bun run build:code",
|
|
66
|
+
"build:production": "bun run build",
|
|
67
|
+
"prepublishOnly": "bun run build && bun test",
|
|
68
|
+
"test": "bun test",
|
|
69
|
+
"clean:local": "rm -rf dist *.tsbuildinfo",
|
|
70
|
+
"prepack": "bun run build"
|
|
71
|
+
},
|
|
72
|
+
"dependencies": {
|
|
73
|
+
"@squoosh-kit/webp": "0.1.0",
|
|
74
|
+
"@squoosh-kit/resize": "0.1.0"
|
|
75
|
+
}
|
|
76
|
+
}
|