@automerge/automerge-repo-network-websocket 2.5.4 → 2.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketServerAdapter.d.ts","sourceRoot":"","sources":["../src/WebSocketServerAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAKpD,OAAO,EAEL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAEL,iBAAiB,EAElB,MAAM,eAAe,CAAA;AAOtB,qBAAa,sBAAuB,SAAQ,cAAc;;IAyBtD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,iBAAiB;IAzB3B,OAAO,EAAE;QAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAK;IAQ7C,OAAO;IAIP,SAAS;gBAYC,MAAM,EAAE,eAAe,EACvB,iBAAiB,SAAO;IAKlC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY;IAyCnD,UAAU;IAQV,IAAI,CAAC,OAAO,EAAE,iBAAiB;IAqB/B,cAAc,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS;CA2E3D"}
1
+ {"version":3,"file":"WebSocketServerAdapter.d.ts","sourceRoot":"","sources":["../src/WebSocketServerAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAKpD,OAAO,EAEL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAEL,iBAAiB,EAElB,MAAM,eAAe,CAAA;AAOtB,qBAAa,sBAAuB,SAAQ,cAAc;;IAyBtD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,iBAAiB;IAzB3B,OAAO,EAAE;QAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAK;IAQ7C,OAAO;IAIP,SAAS;gBAYC,MAAM,EAAE,eAAe,EACvB,iBAAiB,SAAO;IAKlC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY;IAyCnD,UAAU;IAQV,IAAI,CAAC,OAAO,EAAE,iBAAiB;IAqB/B,cAAc,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS;CA8E3D"}
@@ -138,6 +138,9 @@ export class WebSocketServerAdapter extends NetworkAdapter {
138
138
  }
139
139
  }
140
140
  else {
141
+ if (this.sockets[senderId] !== socket) {
142
+ return;
143
+ }
141
144
  this.emit("message", message);
142
145
  }
143
146
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automerge/automerge-repo-network-websocket",
3
- "version": "2.5.4",
3
+ "version": "2.5.6",
4
4
  "description": "isomorphic node/browser Websocket network adapter for Automerge Repo",
5
5
  "repository": "https://github.com/automerge/automerge-repo/tree/master/packages/automerge-repo-network-websocket",
6
6
  "author": "Peter van Hardenberg <pvh@pvh.ca>",
@@ -13,7 +13,7 @@
13
13
  "test": "vitest"
14
14
  },
15
15
  "dependencies": {
16
- "@automerge/automerge-repo": "2.5.4",
16
+ "@automerge/automerge-repo": "2.5.6",
17
17
  "cbor-x": "^1.3.0",
18
18
  "debug": "^4.3.4",
19
19
  "eventemitter3": "^5.0.1",
@@ -31,5 +31,5 @@
31
31
  "publishConfig": {
32
32
  "access": "public"
33
33
  },
34
- "gitHead": "70e3703e39f7151dbc446e865d9f9753f132ab3a"
34
+ "gitHead": "38d06b9d9ef0bbe1e0693d3b859015f38897f34b"
35
35
  }
@@ -175,6 +175,9 @@ export class WebSocketServerAdapter extends NetworkAdapter {
175
175
  })
176
176
  }
177
177
  } else {
178
+ if (this.sockets[senderId] !== socket) {
179
+ return
180
+ }
178
181
  this.emit("message", message)
179
182
  }
180
183
  }
@@ -454,6 +454,71 @@ describe("Websocket adapters", () => {
454
454
  })
455
455
  })
456
456
 
457
+ it("should ignore messages from a socket replaced by a same-peer-ID reconnect", async () => {
458
+ const { serverSocket, server, serverUrl } = await setupServer()
459
+ const serverAdapter = new WebSocketServerAdapter(serverSocket)
460
+ const serverSideSockets: WebSocket[] = []
461
+ serverSocket.on("connection", socket => {
462
+ serverSideSockets.push(socket)
463
+ })
464
+ serverAdapter.connect(serverPeerId, {
465
+ storageId: undefined,
466
+ isEphemeral: true,
467
+ })
468
+
469
+ const firstSocket = new WebSocket(serverUrl)
470
+ await once(firstSocket, "open")
471
+ firstSocket.send(
472
+ CBOR.encode({
473
+ type: "join",
474
+ senderId: browserPeerId,
475
+ supportedProtocolVersions: ["1"],
476
+ })
477
+ )
478
+ await messageOrTimeout(firstSocket)
479
+
480
+ const secondSocket = new WebSocket(serverUrl)
481
+ await once(secondSocket, "open")
482
+ secondSocket.send(
483
+ CBOR.encode({
484
+ type: "join",
485
+ senderId: browserPeerId,
486
+ supportedProtocolVersions: ["1"],
487
+ })
488
+ )
489
+ await messageOrTimeout(secondSocket)
490
+
491
+ let staleMessageReceived = false
492
+ serverAdapter.once("message", message => {
493
+ if (message.senderId === browserPeerId) {
494
+ staleMessageReceived = true
495
+ }
496
+ })
497
+
498
+ // Simulate a late message event from the old server-side socket. The
499
+ // client socket has already been closed by the reconnect handling, so
500
+ // using the captured server socket lets this test exercise the adapter's
501
+ // stale-socket guard directly.
502
+ serverSideSockets[0].emit(
503
+ "message",
504
+ CBOR.encode({
505
+ type: "sync",
506
+ senderId: browserPeerId,
507
+ targetId: serverPeerId,
508
+ documentId,
509
+ data: new Uint8Array([1]),
510
+ })
511
+ )
512
+
513
+ await pause(100)
514
+ firstSocket.close()
515
+ secondSocket.close()
516
+ serverSocket.close()
517
+ server.close()
518
+
519
+ assert.equal(staleMessageReceived, false)
520
+ })
521
+
457
522
  it("should disconnect existing peers on reconnect before announcing them", async () => {
458
523
  // This test exercises a sync loop which is exposed in the following
459
524
  // sequence of events: