diff --git a/common/changes/c2pa/duggaraju-worker_module_2024-03-15-19-00.json b/common/changes/c2pa/duggaraju-worker_module_2024-03-15-19-00.json new file mode 100644 index 00000000..6ba65af2 --- /dev/null +++ b/common/changes/c2pa/duggaraju-worker_module_2024-03-15-19-00.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "c2pa", + "comment": "Add support for worker thread to use modules", + "type": "patch" + } + ], + "packageName": "c2pa" +} \ No newline at end of file diff --git a/packages/c2pa/src/c2pa.ts b/packages/c2pa/src/c2pa.ts index 9b705345..41b91f66 100644 --- a/packages/c2pa/src/c2pa.ts +++ b/packages/c2pa/src/c2pa.ts @@ -200,7 +200,9 @@ export async function createC2pa(config: C2paConfig): Promise { const pool = await createPoolWrapper({ scriptSrc: config.workerSrc, - maxWorkers: navigator.hardwareConcurrency || 4, + maxWorkers: + config.poolOptions?.maxWorkers || navigator.hardwareConcurrency || 4, + type: config.poolOptions?.type, }); const downloader = new Downloader(pool, config.downloaderOptions); diff --git a/packages/c2pa/src/lib/pool/workerManager.ts b/packages/c2pa/src/lib/pool/workerManager.ts index 7fbc8420..cc274134 100644 --- a/packages/c2pa/src/lib/pool/workerManager.ts +++ b/packages/c2pa/src/lib/pool/workerManager.ts @@ -22,8 +22,11 @@ export interface WorkerManager { * @param scriptUrl URL to worker script * @returns {WorkerManager} */ -export function createWorkerManager(scriptUrl: string): WorkerManager { - const worker = new Worker(scriptUrl); +export function createWorkerManager( + scriptUrl: string, + options?: WorkerOptions, +): WorkerManager { + const worker = new Worker(scriptUrl, options); let working = false; const execute: WorkerManager['execute'] = async (request) => { diff --git a/packages/c2pa/src/lib/pool/workerPool.ts b/packages/c2pa/src/lib/pool/workerPool.ts index 9b4fefaa..4792213f 100644 --- a/packages/c2pa/src/lib/pool/workerPool.ts +++ b/packages/c2pa/src/lib/pool/workerPool.ts @@ -13,6 +13,7 @@ import { createWorkerManager, WorkerManager } from './workerManager'; export interface WorkerPoolConfig { scriptSrc: string; maxWorkers: number; + type?: WorkerType; } interface WorkerPool { @@ -40,7 +41,10 @@ export function createWorkerPool(config: WorkerPoolConfig): WorkerPool { if (!worker.isWorking()) return worker; } if (workers.length < config.maxWorkers) { - const newWorker = createWorkerManager(config.scriptSrc); + const options: WorkerOptions = { + type: config.type, + }; + const newWorker = createWorkerManager(config.scriptSrc, options); workers.push(newWorker); return newWorker; } diff --git a/packages/c2pa/src/lib/poolWrapper.ts b/packages/c2pa/src/lib/poolWrapper.ts index b88708b4..ce267add 100644 --- a/packages/c2pa/src/lib/poolWrapper.ts +++ b/packages/c2pa/src/lib/poolWrapper.ts @@ -21,21 +21,20 @@ export interface SdkWorkerPool extends Worker { export async function createPoolWrapper( config: WorkerPoolConfig, ): Promise { - const res = await fetch(config.scriptSrc); + const res = await fetch(config.scriptSrc, { + method: 'HEAD', + }); if (!res.ok) throw new InvalidWorkerSourceError(config.scriptSrc, res); - const src = await res.text(); // @TODO: check subresource integrity - dbg('Fetched worker from %s (%d bytes)', config.scriptSrc, src.length); - - const workerBlob = new Blob([src], { type: 'application/javascript' }); - const workerUrl = URL.createObjectURL(workerBlob); + dbg( + 'Fetched worker from %s (%d bytes)', + config.scriptSrc, + res.headers.get('Content-Length'), + ); - const workerPool = createWorkerPool({ - ...config, - scriptSrc: workerUrl, - }); + const workerPool = createWorkerPool(config); const pool: Worker = { compileWasm: async (...args) => workerPool.execute('compileWasm', args), @@ -48,7 +47,6 @@ export async function createPoolWrapper( return { ...pool, dispose: () => { - URL.revokeObjectURL(workerUrl); return workerPool.terminate(); }, };