mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-14 09:39:15 +00:00
Two workers & worker termination (#198)
* Refactoring codecs * Plugging in new processor * Fixing decorator * MozJPEG free issue * Better worker aborting, and terminate workers that aren't used for 10 seconds * Better comment * Ooops, half-typed comment * Uncommenting problematic line * Surma fixed it! * Abstracting WASM initialisation * Better comment * Don't need this. * Adding ticket * noInitalRun * Reverting MozJPEG issue demo * Making a const for worker timeout * Inline docs * Bail early rather than nesting * Addressing nits
This commit is contained in:
@@ -1,23 +1,18 @@
|
||||
import { canvasEncode, blobToArrayBuffer } from '../../lib/util';
|
||||
import EncodeWorker from './Encoder.worker';
|
||||
import optipng, { OptiPngModule } from '../../../codecs/optipng/optipng';
|
||||
import wasmUrl from '../../../codecs/optipng/optipng.wasm';
|
||||
import { EncodeOptions } from './encoder-meta';
|
||||
import { initWasmModule } from '../util';
|
||||
|
||||
export interface EncodeOptions {
|
||||
level: number;
|
||||
}
|
||||
export interface EncoderState { type: typeof type; options: EncodeOptions; }
|
||||
|
||||
export const type = 'png';
|
||||
export const label = 'OptiPNG';
|
||||
export const mimeType = 'image/png';
|
||||
export const extension = 'png';
|
||||
|
||||
export const defaultOptions: EncodeOptions = {
|
||||
level: 2,
|
||||
};
|
||||
|
||||
export async function encode(data: ImageData, opts: EncodeOptions): Promise<ArrayBuffer> {
|
||||
const pngBlob = await canvasEncode(data, mimeType);
|
||||
const pngBuffer = await blobToArrayBuffer(pngBlob);
|
||||
const encodeWorker = await new EncodeWorker();
|
||||
return encodeWorker.compress(pngBuffer, opts);
|
||||
let emscriptenModule: Promise<OptiPngModule>;
|
||||
|
||||
export async function compress(data: BufferSource, options: EncodeOptions): Promise<ArrayBuffer> {
|
||||
if (!emscriptenModule) emscriptenModule = initWasmModule(optipng, wasmUrl);
|
||||
|
||||
const module = await emscriptenModule;
|
||||
const resultView = module.compress(data, options);
|
||||
const result = new Uint8Array(resultView);
|
||||
module.free_result();
|
||||
|
||||
// wasm can’t run on SharedArrayBuffers, so we hard-cast to ArrayBuffer.
|
||||
return result.buffer as ArrayBuffer;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user