diff --git a/packages/ipfs-message-port-client/src/client/query.js b/packages/ipfs-message-port-client/src/client/query.js index 749683f6ed..8f4369bb74 100644 --- a/packages/ipfs-message-port-client/src/client/query.js +++ b/packages/ipfs-message-port-client/src/client/query.js @@ -2,7 +2,7 @@ * @typedef {Object} QueryOptions * @property {AbortSignal} [signal] * @property {number} [timeout] - * @property {Transferable[]} [transfer] + * @property {Set} [transfer] */ /** @@ -49,7 +49,7 @@ export class Query { /** * Data that will be transferred over message channel. * - * @returns {Transferable[]|void} + * @returns {Set|void} */ transfer () { return this.input.transfer diff --git a/packages/ipfs-message-port-client/src/client/transport.js b/packages/ipfs-message-port-client/src/client/transport.js index d9605e1691..b717cd6f9d 100644 --- a/packages/ipfs-message-port-client/src/client/transport.js +++ b/packages/ipfs-message-port-client/src/client/transport.js @@ -180,8 +180,8 @@ export class MessageTransport { id, input: query.toJSON() }, - // @ts-ignore - TS seems to want second arg to postMessage to not be undefined - [...new Set(query.transfer() || [])] + // @ts-expect-error - Type signature does not expect 2nd undefined arg + query.transfer() ) } diff --git a/packages/ipfs-message-port-client/src/core.js b/packages/ipfs-message-port-client/src/core.js index 9e0ea86e1b..d49ae0e3c7 100644 --- a/packages/ipfs-message-port-client/src/core.js +++ b/packages/ipfs-message-port-client/src/core.js @@ -71,7 +71,7 @@ export class CoreClient extends Client { */ CoreClient.prototype.addAll = async function * addAll (input, options = {}) { const { timeout, signal } = options - const transfer = [...(options.transfer || [])] + const transfer = options.transfer || new Set() const progressCallback = options.progress ? encodeCallback(options.progress, transfer) : undefined @@ -99,7 +99,7 @@ CoreClient.prototype.addAll = async function * addAll (input, options = {}) { */ CoreClient.prototype.add = async function add (input, options = {}) { const { timeout, signal } = options - const transfer = [...(options.transfer || [])] + const transfer = options.transfer || new Set() const progressCallback = options.progress ? encodeCallback(options.progress, transfer) : undefined @@ -184,7 +184,7 @@ const identity = (v) => v * given input. * * @param {ImportCandidate} input - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {Promise} */ const encodeAddInput = async (input, transfer) => { @@ -242,7 +242,7 @@ const encodeAddInput = async (input, transfer) => { * given input. * * @param {ImportCandidateStream} input - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {EncodedAddAllInput} */ const encodeAddAllInput = (input, transfer) => { @@ -279,7 +279,7 @@ const encodeAddAllInput = (input, transfer) => { * effective strategy. * * @param {ImportCandidate} content - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {EncodedAddInput} */ const encodeAsyncIterableContent = (content, transfer) => { @@ -303,7 +303,7 @@ const encodeAsyncIterableContent = (content, transfer) => { /** * @param {ImportCandidate} content - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {EncodedAddInput} */ const encodeIterableContent = (content, transfer) => { @@ -329,7 +329,7 @@ const encodeIterableContent = (content, transfer) => { /** * @param {ToFile | ToDirectory} file - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {EncodedFileInput | EncodedDirectoryInput} */ const encodeFileObject = ({ path, mode, mtime, content }, transfer) => { @@ -349,7 +349,7 @@ const encodeFileObject = ({ path, mode, mtime, content }, transfer) => { /** * @param {ToContent|undefined} content - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {EncodedFileContent} */ const encodeFileContent = (content, transfer) => { diff --git a/packages/ipfs-message-port-client/src/dag.js b/packages/ipfs-message-port-client/src/dag.js index 6875f9e9ce..8dcf8e0b8d 100644 --- a/packages/ipfs-message-port-client/src/dag.js +++ b/packages/ipfs-message-port-client/src/dag.js @@ -62,7 +62,7 @@ DAGClient.prototype.resolve = async function resolve (cid, options = {}) { /** * @param {string|CID} input - * @param {Transferable[]} [transfer] + * @param {Set} [transfer] * @returns {string|EncodedCID} */ const encodeCIDOrPath = (input, transfer) => { diff --git a/packages/ipfs-message-port-client/src/interface.ts b/packages/ipfs-message-port-client/src/interface.ts index 693f9172e6..8f5ed7639b 100644 --- a/packages/ipfs-message-port-client/src/interface.ts +++ b/packages/ipfs-message-port-client/src/interface.ts @@ -2,5 +2,5 @@ // JSDoc syntax or that result in a different behaviour when typed in JSDoc. export interface MessagePortClientOptions { - transfer?: Transferable[] + transfer?: Set } diff --git a/packages/ipfs-message-port-protocol/README.md b/packages/ipfs-message-port-protocol/README.md index 04a8eede33..da4a458c58 100644 --- a/packages/ipfs-message-port-protocol/README.md +++ b/packages/ipfs-message-port-protocol/README.md @@ -146,7 +146,7 @@ port2.onmessage = async ({data}) => { ### Callback -Primitive callbacks that take single parameter supported by [structured cloning algorithm][] like progress callback used across IPFS APIs can be encoded / decoded. Unilke most encoders `transfer` argument is required (because value is encoded to a [MessagePort][] that can only be transferred) +Primitive callbacks that take single parameter supported by [structured cloning algorithm][] like progress callback used across IPFS APIs can be encoded / decoded. Unlike most encoders `transfer` argument is required (because value is encoded to a [MessagePort][] that can only be transferred) ```js import { encodeCallback, decodeCallback } from 'ipfs-message-port-protocol/core' @@ -186,4 +186,3 @@ Check out our [contributing document](https://github.com/ipfs/community/blob/mas ## License [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fipfs%2Fjs-ipfs.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fipfs%2Fjs-ipfs?ref=badge_large) - diff --git a/packages/ipfs-message-port-protocol/src/block.js b/packages/ipfs-message-port-protocol/src/block.js index 18cc0c5a86..f4ee247cb4 100644 --- a/packages/ipfs-message-port-protocol/src/block.js +++ b/packages/ipfs-message-port-protocol/src/block.js @@ -15,11 +15,11 @@ * copy. * * @param {Uint8Array} data - * @param {Transferable[]} [transfer] + * @param {Set} [transfer] */ export const encodeBlock = (data, transfer) => { if (transfer) { - transfer.push(data.buffer) + transfer.add(data.buffer) } return data } diff --git a/packages/ipfs-message-port-protocol/src/cid.js b/packages/ipfs-message-port-protocol/src/cid.js index 2934bf2c2b..a13cc23329 100644 --- a/packages/ipfs-message-port-protocol/src/cid.js +++ b/packages/ipfs-message-port-protocol/src/cid.js @@ -14,12 +14,12 @@ import { CID } from 'multiformats/cid' * will be added for the transfer list. * * @param {CID} cid - * @param {Transferable[]} [transfer] + * @param {Set} [transfer] * @returns {EncodedCID} */ export const encodeCID = (cid, transfer) => { if (transfer) { - transfer.push(cid.multihash.bytes.buffer) + transfer.add(cid.multihash.bytes.buffer) } return cid } diff --git a/packages/ipfs-message-port-protocol/src/core.js b/packages/ipfs-message-port-protocol/src/core.js index 6dfd0bad1a..6d536b7b5e 100644 --- a/packages/ipfs-message-port-protocol/src/core.js +++ b/packages/ipfs-message-port-protocol/src/core.js @@ -92,16 +92,19 @@ export const decodeIterable = async function * ({ port }, decode) { /** * @template I,O * @param {AsyncIterable|Iterable} iterable - * @param {function(I, Transferable[]):O} encode - * @param {Transferable[]} transfer + * @param {function(I, Set):O} encode + * @param {Set} transfer * @returns {RemoteIterable} */ export const encodeIterable = (iterable, encode, transfer) => { const { port1: port, port2: remote } = new MessageChannel() - /** @type {Transferable[]} */ - const itemTransfer = [] /** @type {Iterator|AsyncIterator} */ const iterator = toIterator(iterable) + // Note that port.onmessage will receive multiple 'next' method messages. + // Instead of allocating set every time we allocate one here and recycle + // it on each 'next' message. + /** @type {Set} */ + const itemTransfer = new Set() port.onmessage = async ({ data: { method } }) => { switch (method) { @@ -112,12 +115,15 @@ export const encodeIterable = (iterable, encode, transfer) => { port.postMessage({ type: 'next', done: true }) port.close() } else { - itemTransfer.length = 0 - port.postMessage( + itemTransfer.clear() + const encodedValue = encode(value, itemTransfer) + + postMessage( + port, { type: 'next', done: false, - value: encode(value, itemTransfer) + value: encodedValue }, itemTransfer ) @@ -144,7 +150,7 @@ export const encodeIterable = (iterable, encode, transfer) => { } } port.start() - transfer.push(remote) + transfer.add(remote) return { type: 'RemoteIterable', port: remote } } @@ -170,31 +176,41 @@ const toIterator = iterable => { /** * @param {Function} callback - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {RemoteCallback} */ export const encodeCallback = (callback, transfer) => { // eslint-disable-next-line no-undef const { port1: port, port2: remote } = new MessageChannel() port.onmessage = ({ data }) => callback.apply(null, data) - transfer.push(remote) + transfer.add(remote) return { type: 'RemoteCallback', port: remote } } /** * @template T * @param {RemoteCallback} remote - * @returns {function(T[]):void | function(T[], Transferable[]):void} + * @returns {function(T[]):void | function(T[], Set):void} */ export const decodeCallback = ({ port }) => { /** * @param {T[]} args - * @param {Transferable[]} [transfer] + * @param {Set} [transfer] * @returns {void} */ - const callback = (args, transfer = []) => { - port.postMessage(args, [...new Set(transfer)]) + const callback = (args, transfer) => { + postMessage(port, args, transfer) } return callback } + +/** + * @param {MessagePort} port + * @param {any} message + * @param {Iterable} [transfer] + */ +const postMessage = (port, message, transfer) => + // @ts-expect-error - Built in types expect Transferable[] but it really + // should be Iterable + port.postMessage(message, transfer) diff --git a/packages/ipfs-message-port-protocol/src/dag.js b/packages/ipfs-message-port-protocol/src/dag.js index 540a3f326d..c375796edc 100644 --- a/packages/ipfs-message-port-protocol/src/dag.js +++ b/packages/ipfs-message-port-protocol/src/dag.js @@ -41,7 +41,7 @@ export const decodeNode = ({ dagNode, cids }) => { * this node will be added to transfer so they are moved across without copy. * * @param {DAGNode} dagNode - * @param {Transferable[]} [transfer] + * @param {Set} [transfer] * @returns {EncodedDAGNode} */ export const encodeNode = (dagNode, transfer) => { @@ -58,7 +58,7 @@ export const encodeNode = (dagNode, transfer) => { * * @param {DAGNode} value * @param {CID[]} cids - * @param {Transferable[]} [transfer] + * @param {Set} [transfer] * @returns {void} */ const collectNode = (value, cids, transfer) => { @@ -70,11 +70,11 @@ const collectNode = (value, cids, transfer) => { encodeCID(cid, transfer) } else if (value instanceof ArrayBuffer) { if (transfer) { - transfer.push(value) + transfer.add(value) } } else if (ArrayBuffer.isView(value)) { if (transfer) { - transfer.push(value.buffer) + transfer.add(value.buffer) } } else if (Array.isArray(value)) { for (const member of value) { diff --git a/packages/ipfs-message-port-protocol/src/rpc.ts b/packages/ipfs-message-port-protocol/src/rpc.ts index 0e2393da78..e340097e99 100644 --- a/packages/ipfs-message-port-protocol/src/rpc.ts +++ b/packages/ipfs-message-port-protocol/src/rpc.ts @@ -6,18 +6,18 @@ export type Remote> = { [K in keyof T]: Procedure } -type Return = T extends Promise +export type Return = T extends Promise ? Promise : Promise export interface QueryOptions { signal?: AbortSignal timeout?: number - transfer?: Transferable[] + transfer?: Set } export interface TransferOptions { - transfer?: Transferable[] + transfer?: Set } export type NonUndefined = A extends undefined ? never : A diff --git a/packages/ipfs-message-port-protocol/test/block.browser.js b/packages/ipfs-message-port-protocol/test/block.browser.js index 51e7144734..b7477d40bf 100644 --- a/packages/ipfs-message-port-protocol/test/block.browser.js +++ b/packages/ipfs-message-port-protocol/test/block.browser.js @@ -22,7 +22,7 @@ describe('block (browser)', function () { it('should decode Block over message channel & transfer bytes', async () => { const blockIn = uint8ArrayFromString('hello') - const transfer = [] + const transfer = new Set() const blockOut = await move(encodeBlock(blockIn, transfer), transfer) diff --git a/packages/ipfs-message-port-protocol/test/cid.browser.js b/packages/ipfs-message-port-protocol/test/cid.browser.js index ce0f4e460c..95e69b096a 100644 --- a/packages/ipfs-message-port-protocol/test/cid.browser.js +++ b/packages/ipfs-message-port-protocol/test/cid.browser.js @@ -26,7 +26,7 @@ describe('cid (browser)', function () { it('should decode CID and transfer bytes', async () => { const cidIn = CID.parse('Qmd7xRhW5f29QuBFtqu3oSD27iVy35NRB91XFjmKFhtgMr') - const transfer = [] + const transfer = new Set() const cidDataIn = encodeCID(cidIn, transfer) const cidDataOut = await move(cidDataIn, transfer) const cidOut = decodeCID(cidDataOut) diff --git a/packages/ipfs-message-port-protocol/test/core.browser.js b/packages/ipfs-message-port-protocol/test/core.browser.js index 3315af463c..8eba3c61c1 100644 --- a/packages/ipfs-message-port-protocol/test/core.browser.js +++ b/packages/ipfs-message-port-protocol/test/core.browser.js @@ -26,7 +26,7 @@ describe('core', function () { deliver = resolve }) - const transfer = [] + const transfer = new Set() const remote = decodeCallback( await move(encodeCallback(callback, transfer), transfer) ) @@ -49,7 +49,7 @@ describe('core', function () { deliver = resolve }) - const transfer = [] + const transfer = new Set() const remote = decodeCallback( await move(encodeCallback(callback, transfer), transfer) ) @@ -74,7 +74,7 @@ describe('core', function () { yield { items: [uint8ArrayFromString('bla'), uint8ArrayFromString('bla')] } } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -118,7 +118,7 @@ describe('core', function () { } } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -159,7 +159,7 @@ describe('core', function () { throw Error('Producer Boom!') } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -200,7 +200,7 @@ describe('core', function () { } } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -245,14 +245,14 @@ describe('core', function () { yield * outgoing } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( encodeIterable( iterate(), (data, transfer) => { - transfer.push(data.buffer) + transfer.add(data.buffer) return data }, transfer @@ -287,7 +287,7 @@ describe('core', function () { yield { items: [uint8ArrayFromString('bla'), uint8ArrayFromString('bla')] } } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -331,7 +331,7 @@ describe('core', function () { } } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -371,7 +371,7 @@ describe('core', function () { throw Error('Producer Boom!') } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -411,7 +411,7 @@ describe('core', function () { } } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( @@ -455,14 +455,14 @@ describe('core', function () { yield * outgoing } - const transfer = [] + const transfer = new Set() const remote = decodeIterable( await move( encodeIterable( iterate(), (data, transfer) => { - transfer.push(data.buffer) + transfer.add(data.buffer) return data }, transfer diff --git a/packages/ipfs-message-port-protocol/test/dag.browser.js b/packages/ipfs-message-port-protocol/test/dag.browser.js index 8a392a2b5c..1b78c3d92c 100644 --- a/packages/ipfs-message-port-protocol/test/dag.browser.js +++ b/packages/ipfs-message-port-protocol/test/dag.browser.js @@ -58,7 +58,7 @@ describe('dag (browser)', function () { link: CID.parse(cid2) } } - const transfer = [] + const transfer = new Set() const nodeOut = decodeNode( await move(encodeNode(nodeIn, transfer), transfer) @@ -80,7 +80,7 @@ describe('dag (browser)', function () { } }) - expect(transfer).to.containSubset( + expect([...transfer]).to.containSubset( [{ byteLength: 0 }, { byteLength: 0 }, { byteLength: 0 }], 'transferred buffers were cleared' ) diff --git a/packages/ipfs-message-port-protocol/test/dag.spec.js b/packages/ipfs-message-port-protocol/test/dag.spec.js index 8e80819438..110a6e841e 100644 --- a/packages/ipfs-message-port-protocol/test/dag.spec.js +++ b/packages/ipfs-message-port-protocol/test/dag.spec.js @@ -10,7 +10,7 @@ describe('dag', function () { this.timeout(10 * 1000) describe('encodeNode / decodeNode', () => { - it('shoud encode node', () => { + it('should encode node', () => { const cid1 = CID.parse( 'bafyreic6f672hnponukaacmk2mmt7vs324zkagvu4hcww6yba6kby25zce' ) @@ -34,7 +34,7 @@ describe('dag', function () { expect(data.cids).to.include(cid2) }) - it('shoud encode and add buffers to transfer list', () => { + it('should encode and add buffers to transfer list', () => { const cid1 = CID.parse( 'bafyreic6f672hnponukaacmk2mmt7vs324zkagvu4hcww6yba6kby25zce' ) @@ -55,7 +55,7 @@ describe('dag', function () { } } - const transfer = [] + const transfer = new Set() const data = encodeNode(dagNode, transfer) expect(data.dagNode).to.be.equal(dagNode) @@ -64,14 +64,14 @@ describe('dag', function () { expect(data.cids).to.include(cid1) expect(data.cids).to.include(cid2) - expect(transfer).to.be.an.instanceOf(Array) - expect(transfer).to.have.property('length', 3) + expect(transfer).to.be.an.instanceOf(Set) + expect(transfer).to.have.property('size', 3) expect(transfer).to.include(cid1.multihash.bytes.buffer) expect(transfer).to.include(cid2.multihash.bytes.buffer) expect(transfer).to.include(hi.buffer) }) - it('shoud decode node', () => { + it('should decode node', () => { const cid1 = CID.parse( 'bafyreic6f672hnponukaacmk2mmt7vs324zkagvu4hcww6yba6kby25zce' ) @@ -92,7 +92,7 @@ describe('dag', function () { } } - const transfer = [] + const transfer = new Set() const data = encodeNode(dagNode, transfer) expect(data.dagNode).to.be.equal(dagNode) @@ -101,8 +101,8 @@ describe('dag', function () { expect(data.cids).to.include(cid1) expect(data.cids).to.include(cid2) - expect(transfer).to.be.an.instanceOf(Array) - expect(transfer).to.have.property('length', 3) + expect(transfer).to.be.an.instanceOf(Set) + expect(transfer).to.have.property('size', 3) expect(transfer).to.include(cid1.multihash.bytes.buffer) expect(transfer).to.include(cid2.multihash.bytes.buffer) expect(transfer).to.include(hi.buffer) diff --git a/packages/ipfs-message-port-protocol/test/util.js b/packages/ipfs-message-port-protocol/test/util.js index bc32d6653c..a1a93670c0 100644 --- a/packages/ipfs-message-port-protocol/test/util.js +++ b/packages/ipfs-message-port-protocol/test/util.js @@ -15,7 +15,7 @@ export const ipc = () => { /** * @template T * @param {T} data - * @param {Transferable[]} [transfer] + * @param {Iterable} [transfer] * @returns {Promise} */ const ipcMove = async (data, transfer = []) => { diff --git a/packages/ipfs-message-port-server/src/block.js b/packages/ipfs-message-port-server/src/block.js index 94e57aa903..6f6115090d 100644 --- a/packages/ipfs-message-port-server/src/block.js +++ b/packages/ipfs-message-port-server/src/block.js @@ -23,7 +23,7 @@ export class BlockService { /** * @typedef {Object} GetResult * @property {Uint8Array} block - * @property {Transferable[]} transfer + * @property {Set} transfer * * @typedef {Object} GetQuery * @property {EncodedCID} cid @@ -36,15 +36,15 @@ export class BlockService { async get (query) { const cid = decodeCID(query.cid) const block = await this.ipfs.block.get(cid, query) - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { transfer, block: encodeBlock(block, transfer) } } /** * @typedef {Object} PutResult * @property {EncodedCID} cid - * @property {Transferable[]} transfer + * @property {Set} transfer * * @typedef {Object} PutQuery * @property {Uint8Array} block @@ -58,9 +58,8 @@ export class BlockService { async put (query) { const input = query.block const result = await this.ipfs.block.put(input, query) - - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { transfer, cid: encodeCID(result, transfer) } } @@ -78,8 +77,8 @@ export class BlockService { * @returns {Promise} */ async rm (query) { - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() const result = await all( this.ipfs.block.rm(query.cids.map(decodeCID), query) ) @@ -113,7 +112,7 @@ export class BlockService { * @param {Object} entry * @param {CID} entry.cid * @param {Error|void} [entry.error] - * @param {Transferable[]} transfer + * @param {Set} transfer */ const encodeRmEntry = (entry, transfer) => { const cid = encodeCID(entry.cid, transfer) diff --git a/packages/ipfs-message-port-server/src/core.js b/packages/ipfs-message-port-server/src/core.js index 8a147e7910..65f27ef387 100644 --- a/packages/ipfs-message-port-server/src/core.js +++ b/packages/ipfs-message-port-server/src/core.js @@ -247,8 +247,8 @@ const matchInput = (input, decode) => { * @param {AsyncIterable} out */ const encodeAddAllResult = out => { - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { data: encodeIterable(out, encodeFileOutput, transfer), transfer @@ -259,8 +259,8 @@ const encodeAddAllResult = out => { * @param {AddResult} out */ const encodeAddResult = out => { - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { data: encodeFileOutput(out, transfer), transfer @@ -271,8 +271,8 @@ const encodeAddResult = out => { * @param {AsyncIterable} content */ const encodeCatResult = content => { - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { data: encodeIterable(content, moveBuffer, transfer), transfer } } @@ -280,8 +280,8 @@ const encodeCatResult = content => { * @param {AsyncIterable} entries */ const encodeLsResult = entries => { - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { data: encodeIterable(entries, encodeLsEntry, transfer), transfer } } @@ -302,17 +302,17 @@ const encodeLsEntry = ({ name, path, size, cid, type, mode, mtime }) => ({ * Adds underlying `ArrayBuffer` to the transfer list. * * @param {Uint8Array} buffer - * @param {Transferable[]} transfer + * @param {Set} transfer * @returns {Uint8Array} */ const moveBuffer = (buffer, transfer) => { - transfer.push(buffer.buffer) + transfer.add(buffer.buffer) return buffer } /** * @param {AddResult} file - * @param {Transferable[]} _transfer + * @param {Set} _transfer */ const encodeFileOutput = (file, _transfer) => ({ ...file, diff --git a/packages/ipfs-message-port-server/src/dag.js b/packages/ipfs-message-port-server/src/dag.js index 852f414f15..6ddc340c26 100644 --- a/packages/ipfs-message-port-server/src/dag.js +++ b/packages/ipfs-message-port-server/src/dag.js @@ -34,7 +34,7 @@ export class DAGService { /** * @typedef {Object} EncodedGetResult - * @property {Transferable[]} transfer + * @property {Set} transfer * @property {string} [remainderPath] * @property {EncodedDAGNode} value * @@ -60,8 +60,8 @@ export class DAGService { } ) - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { remainderPath, value: encodeNode(value, transfer), transfer } } diff --git a/packages/ipfs-message-port-server/src/files.js b/packages/ipfs-message-port-server/src/files.js index 3e0a7c51f4..77dbb1510b 100644 --- a/packages/ipfs-message-port-server/src/files.js +++ b/packages/ipfs-message-port-server/src/files.js @@ -26,8 +26,8 @@ export class FilesService { */ async stat (input) { const stat = await this.ipfs.files.stat(input.path, input) - /** @type {Transferable[]} */ - const transfer = [] + /** @type {Set} */ + const transfer = new Set() return { stat: { ...stat, cid: encodeCID(stat.cid, transfer) }, transfer } } } diff --git a/packages/ipfs-message-port-server/src/server.js b/packages/ipfs-message-port-server/src/server.js index 77ee644c10..785568c047 100644 --- a/packages/ipfs-message-port-server/src/server.js +++ b/packages/ipfs-message-port-server/src/server.js @@ -32,6 +32,11 @@ import { encodeError } from 'ipfs-message-port-protocol/error' * @typedef {import('ipfs-message-port-protocol/src/rpc').ServiceQuery} ServiceQuery */ +/** + * @template T + * @typedef {import('ipfs-message-port-protocol/src/rpc').Return} Return + */ + /** * @template T * @typedef {import('ipfs-message-port-protocol/src/rpc').RPCQuery} RPCQuery @@ -65,7 +70,7 @@ import { encodeError } from 'ipfs-message-port-protocol/error' /** * @typedef {Object} TransferOptions - * @property {Transferable[]} [transfer] + * @property {Set} [transfer] */ /** @@ -97,6 +102,7 @@ export class Query { * @param {Inn} input */ constructor (namespace, method, input) { + /** @type {Return} */ this.result = new Promise((resolve, reject) => { this.succeed = resolve this.fail = reject @@ -210,7 +216,9 @@ export class Server { if (!query.signal.aborted) { try { const value = await query.result - const transfer = [...new Set(value.transfer || [])] + const transfer = value.transfer + + // Don't need the transfer value in the result delete value.transfer port.postMessage( diff --git a/packages/ipfs-message-port-server/test/transfer.spec.js b/packages/ipfs-message-port-server/test/transfer.spec.js index fcbef72e95..e60ae4caf9 100644 --- a/packages/ipfs-message-port-server/test/transfer.spec.js +++ b/packages/ipfs-message-port-server/test/transfer.spec.js @@ -14,7 +14,7 @@ describe('Server', function () { const cid = CID.parse('QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D') return new Promise((resolve, reject) => { - const channel = process.browser + const channel = globalThis.MessageChannel ? new globalThis.MessageChannel() : new MessageChannel() @@ -29,7 +29,7 @@ describe('Server', function () { const service = new IPFSService() const server = new Server(service) - const transfer = [] + const transfer = new Set() server.run = a => a server.handleQuery(