Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.

Commit da7bc55

Browse files
authored
fix: transfer unique set over message prort (#3421)
1 parent ba4992c commit da7bc55

File tree

7 files changed

+57
-6
lines changed

7 files changed

+57
-6
lines changed

.github/workflows/bundlesize.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
- name: Install dependencies
3434
run: npm install
3535
- name: Bundlesize ${{ matrix.project }}
36-
uses: ipfs/aegir/actions/bundle-size@v28.0.0
36+
uses: ipfs/aegir/actions/bundle-size@v29.0.0
3737
with:
3838
project: ${{ matrix.project }}
3939
github_token: ${{ secrets.GITHUB_TOKEN }}

packages/ipfs-message-port-client/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ values instead of copying.
102102

103103
> **Note:** Transferring data will empty it on the sender side which can lead to
104104
> errors if that data is used again later. To avoid these errors transfer option
105-
> was added so user can explicitily give up reference when it is safe to do so.
105+
> was added so user can explicitly give up reference when it is safe to do so.
106106
107107
```js
108108
/**
@@ -115,7 +115,7 @@ const example = async (data) => {
115115
}
116116
```
117117

118-
It is however recommended to prefer web native [Blob][] / [File][] intances as
118+
It is however recommended to prefer web native [Blob][] / [File][] instances as
119119
most web APIs provide them as option & can be send across without copying
120120
underlying memory.
121121

packages/ipfs-message-port-client/src/client/transport.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ module.exports = class MessageTransport {
178178
input: query.toJSON()
179179
},
180180
// @ts-ignore - TS seems to want second arg to postMessage to not be undefined
181-
query.transfer()
181+
[...new Set(query.transfer() || [])]
182182
)
183183
}
184184

packages/ipfs-message-port-protocol/src/core.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ const decodeCallback = ({ port }) => {
197197
* @returns {void}
198198
*/
199199
const callback = (args, transfer = []) => {
200-
port.postMessage(args, transfer)
200+
port.postMessage(args, [...new Set(transfer)])
201201
}
202202

203203
return callback

packages/ipfs-message-port-server/package.json

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
"devDependencies": {
5151
"@types/it-all": "^1.0.0",
5252
"aegir": "^28.2.0",
53+
"cids": "^1.0.0",
54+
"ipfs-utils": "^5.0.0",
5355
"rimraf": "^3.0.2",
5456
"typescript": "4.0.x"
5557
},

packages/ipfs-message-port-server/src/server.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,12 @@ exports.Server = class Server {
212212
if (!query.signal.aborted) {
213213
try {
214214
const value = await query.result
215+
const transfer = [...new Set(value.transfer || [])]
216+
delete value.transfer
217+
215218
port.postMessage(
216219
{ type: 'result', id, result: { ok: true, value } },
217-
value.transfer || []
220+
transfer
218221
)
219222
} catch (error) {
220223
port.postMessage({
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
'use strict'
2+
3+
/* eslint-env mocha */
4+
const { encodeCID } = require('ipfs-message-port-protocol/src/cid')
5+
const globalThis = require('ipfs-utils/src/globalthis')
6+
7+
const CID = require('cids')
8+
const { Server } = require('../src/server')
9+
const { IPFSService } = require('../src/index')
10+
11+
describe('Server', function () {
12+
this.timeout(10 * 1000)
13+
14+
it('should be able to transfer multiple of the same CID instances', () => {
15+
const cid = new CID('QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D')
16+
17+
return new Promise((resolve, reject) => {
18+
const channel = process.browser
19+
? new globalThis.MessageChannel()
20+
: new (require('worker_threads').MessageChannel)()
21+
22+
channel.port1.onmessageerror = reject
23+
channel.port1.onmessage = event => {
24+
const result = event.data.result
25+
result.ok ? resolve(result.value) : reject(new Error(result.error.message))
26+
}
27+
28+
const service = new IPFSService()
29+
const server = new Server(service)
30+
const transfer = []
31+
32+
server.run = a => a
33+
server.handleQuery(
34+
'',
35+
{
36+
result: {
37+
value: [encodeCID(cid, transfer), encodeCID(cid, transfer)],
38+
transfer: transfer
39+
},
40+
signal: { aborted: false }
41+
},
42+
channel.port2
43+
)
44+
})
45+
})
46+
})

0 commit comments

Comments
 (0)