mirror of
https://github.com/codedread/bitjs
synced 2025-10-05 02:19:24 +02:00
Commonize on port-connected behavior for compressors and decompressors (part of the refactor for issue #44)
This commit is contained in:
parent
48766d0136
commit
e6d13d9404
7 changed files with 114 additions and 89 deletions
40
archive/common.js
Normal file
40
archive/common.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* common.js
|
||||
*
|
||||
* Provides common functionality for compressing and decompressing.
|
||||
*
|
||||
* Licensed under the MIT License
|
||||
*
|
||||
* Copyright(c) 2023 Google Inc.
|
||||
*/
|
||||
|
||||
// Requires the following JavaScript features: MessageChannel, MessagePort, and dynamic imports.
|
||||
|
||||
/**
|
||||
* Connects a host to a compress/decompress implementation via MessagePorts. The implementation must
|
||||
* have an exported connect() function that accepts a MessagePort. If the runtime support Workers
|
||||
* (e.g. web browsers, deno), imports the implementation inside a Web Worker. Otherwise, it
|
||||
* dynamically imports the implementation inside the current JS context (node, bun).
|
||||
* @param {string} implFilename The compressor/decompressor implementation filename relative to this
|
||||
* path (e.g. './unzip.js').
|
||||
* @returns {Promise<MessagePort>} The Promise resolves to the MessagePort connected to the
|
||||
* implementation that the host should use.
|
||||
*/
|
||||
export async function getConnectedPort(implFilename) {
|
||||
const messageChannel = new MessageChannel();
|
||||
const hostPort = messageChannel.port1;
|
||||
const implPort = messageChannel.port2;
|
||||
|
||||
if (typeof Worker === 'undefined') {
|
||||
const implModule = await import(`${implFilename}`);
|
||||
await implModule.connect(implPort);
|
||||
return hostPort;
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const workerScriptPath = new URL(`./webworker-wrapper.js`, import.meta.url).href;
|
||||
const worker = new Worker(workerScriptPath, { type: 'module' });
|
||||
worker.postMessage({ implSrc: implFilename }, [implPort]);
|
||||
resolve(hostPort);
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue