@automerge/automerge-repo-network-websocket 1.1.0-alpha.1 → 1.1.0-alpha.2

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,5 +1,5 @@
1
1
  /// <reference types="ws" />
2
- import { NetworkAdapter, type PeerId, type StorageId } from "@automerge/automerge-repo";
2
+ import { NetworkAdapter, type PeerId, type PeerMetadata } from "@automerge/automerge-repo";
3
3
  import WebSocket from "isomorphic-ws";
4
4
  import { FromClientMessage } from "./messages.js";
5
5
  declare abstract class WebSocketNetworkAdapter extends NetworkAdapter {
@@ -11,14 +11,14 @@ export declare class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapt
11
11
  remotePeerId?: PeerId;
12
12
  url: string;
13
13
  constructor(url: string);
14
- connect(peerId: PeerId, storageId: StorageId | undefined, isEphemeral: boolean): void;
14
+ connect(peerId: PeerId, peerMetadata: PeerMetadata): void;
15
15
  onOpen: () => void;
16
16
  onClose: () => void;
17
17
  onMessage: (event: WebSocket.MessageEvent) => void;
18
18
  join(): void;
19
19
  disconnect(): void;
20
20
  send(message: FromClientMessage): void;
21
- announceConnection(peerId: PeerId, storageId: StorageId | undefined, isEphemeral: boolean): void;
21
+ announceConnection(peerId: PeerId, peerMetadata: PeerMetadata): void;
22
22
  receiveMessage(message: Uint8Array): void;
23
23
  }
24
24
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserWebSocketClientAdapter.d.ts","sourceRoot":"","sources":["../src/BrowserWebSocketClientAdapter.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,cAAc,EACd,KAAK,MAAM,EAEX,KAAK,SAAS,EACf,MAAM,2BAA2B,CAAA;AAClC,OAAO,SAAS,MAAM,eAAe,CAAA;AAIrC,OAAO,EACL,iBAAiB,EAIlB,MAAM,eAAe,CAAA;AAKtB,uBAAe,uBAAwB,SAAQ,cAAc;IAC3D,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAED,qBAAa,6BAA8B,SAAQ,uBAAuB;;IAGxE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;IACvC,YAAY,CAAC,EAAE,MAAM,CAAA;IAGrB,GAAG,EAAE,MAAM,CAAA;gBAEC,GAAG,EAAE,MAAM;IAKvB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,WAAW,EAAE,OAAO;IAwCtB,MAAM,aAKL;IAGD,OAAO,aAYN;IAED,SAAS,UAAW,sBAAsB,UAEzC;IAED,IAAI;IAWJ,UAAU;IAOV,IAAI,CAAC,OAAO,EAAE,iBAAiB;IAwB/B,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,WAAW,EAAE,OAAO;IAetB,cAAc,CAAC,OAAO,EAAE,UAAU;CA4BnC"}
1
+ {"version":3,"file":"BrowserWebSocketClientAdapter.d.ts","sourceRoot":"","sources":["../src/BrowserWebSocketClientAdapter.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,cAAc,EACd,KAAK,MAAM,EACX,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAA;AAClC,OAAO,SAAS,MAAM,eAAe,CAAA;AAIrC,OAAO,EACL,iBAAiB,EAIlB,MAAM,eAAe,CAAA;AAKtB,uBAAe,uBAAwB,SAAQ,cAAc;IAC3D,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAED,qBAAa,6BAA8B,SAAQ,uBAAuB;;IAGxE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;IACvC,YAAY,CAAC,EAAE,MAAM,CAAA;IAGrB,GAAG,EAAE,MAAM,CAAA;gBAEC,GAAG,EAAE,MAAM;IAKvB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAmClD,MAAM,aAKL;IAGD,OAAO,aAYN;IAED,SAAS,UAAW,sBAAsB,UAEzC;IAED,IAAI;IAWJ,UAAU;IAOV,IAAI,CAAC,OAAO,EAAE,iBAAiB;IAwB/B,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAc7D,cAAc,CAAC,OAAO,EAAE,UAAU;CA4BnC"}
@@ -17,7 +17,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
17
17
  super();
18
18
  this.url = url;
19
19
  }
20
- connect(peerId, storageId, isEphemeral) {
20
+ connect(peerId, peerMetadata) {
21
21
  // If we're reconnecting make sure we remove the old event listeners
22
22
  // before creating a new connection.
23
23
  if (this.socket) {
@@ -26,11 +26,10 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
26
26
  this.socket.removeEventListener("message", this.onMessage);
27
27
  }
28
28
  if (!this.timerId) {
29
- this.timerId = setInterval(() => this.connect(peerId, storageId, isEphemeral), 5000);
29
+ this.timerId = setInterval(() => this.connect(peerId, peerMetadata), 5000);
30
30
  }
31
31
  this.peerId = peerId;
32
- this.storageId = storageId;
33
- this.isEphemeral = isEphemeral;
32
+ this.peerMetadata = peerMetadata;
34
33
  this.socket = new WebSocket(this.url);
35
34
  this.socket.binaryType = "arraybuffer";
36
35
  this.socket.addEventListener("open", this.onOpen);
@@ -51,7 +50,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
51
50
  log(`@ ${this.url}: open`);
52
51
  clearInterval(this.timerId);
53
52
  this.timerId = undefined;
54
- this.send(joinMessage(this.peerId, this.storageId, this.isEphemeral));
53
+ this.send(joinMessage(this.peerId, this.peerMetadata));
55
54
  };
56
55
  // When a socket closes, or disconnects, remove it from the array.
57
56
  onClose = () => {
@@ -61,7 +60,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
61
60
  }
62
61
  if (!this.timerId) {
63
62
  if (this.peerId) {
64
- this.connect(this.peerId, this.storageId, this.isEphemeral);
63
+ this.connect(this.peerId, this.peerMetadata);
65
64
  }
66
65
  }
67
66
  };
@@ -73,7 +72,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
73
72
  throw new Error("WTF, get a socket");
74
73
  }
75
74
  if (this.socket.readyState === WebSocket.OPEN) {
76
- this.send(joinMessage(this.peerId, this.storageId, this.isEphemeral));
75
+ this.send(joinMessage(this.peerId, this.peerMetadata));
77
76
  }
78
77
  else {
79
78
  // The onOpen handler automatically sends a join message
@@ -101,7 +100,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
101
100
  const arrayBuf = encoded.buffer.slice(encoded.byteOffset, encoded.byteOffset + encoded.byteLength);
102
101
  this.socket?.send(arrayBuf);
103
102
  }
104
- announceConnection(peerId, storageId, isEphemeral) {
103
+ announceConnection(peerId, peerMetadata) {
105
104
  // return a peer object
106
105
  const myPeerId = this.peerId;
107
106
  if (!myPeerId) {
@@ -112,7 +111,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
112
111
  this.emit("ready", { network: this });
113
112
  }
114
113
  this.remotePeerId = peerId;
115
- this.emit("peer-candidate", { peerId, storageId, isEphemeral });
114
+ this.emit("peer-candidate", { peerId, peerMetadata });
116
115
  }
117
116
  receiveMessage(message) {
118
117
  const decoded = cbor.decode(new Uint8Array(message));
@@ -126,9 +125,9 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
126
125
  }
127
126
  switch (type) {
128
127
  case "peer": {
129
- const { storageId, isEphemeral } = decoded;
128
+ const { peerMetadata } = decoded;
130
129
  log(`peer: ${senderId}`);
131
- this.announceConnection(senderId, storageId, isEphemeral);
130
+ this.announceConnection(senderId, peerMetadata);
132
131
  break;
133
132
  }
134
133
  case "error":
@@ -139,12 +138,11 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
139
138
  }
140
139
  }
141
140
  }
142
- function joinMessage(senderId, storageId, isEphemeral) {
141
+ function joinMessage(senderId, peerMetadata) {
143
142
  return {
144
143
  type: "join",
145
144
  senderId,
146
- storageId,
147
- isEphemeral,
145
+ peerMetadata,
148
146
  supportedProtocolVersions: [ProtocolV1],
149
147
  };
150
148
  }
@@ -1,7 +1,7 @@
1
1
  /// <reference types="ws" />
2
2
  import WebSocket from "isomorphic-ws";
3
3
  import { type WebSocketServer } from "isomorphic-ws";
4
- import { NetworkAdapter, type PeerId, type StorageId } from "@automerge/automerge-repo";
4
+ import { NetworkAdapter, type PeerMetadata, type PeerId } from "@automerge/automerge-repo";
5
5
  import { FromServerMessage } from "./messages.js";
6
6
  export declare class NodeWSServerAdapter extends NetworkAdapter {
7
7
  server: WebSocketServer;
@@ -9,7 +9,7 @@ export declare class NodeWSServerAdapter extends NetworkAdapter {
9
9
  [peerId: PeerId]: WebSocket;
10
10
  };
11
11
  constructor(server: WebSocketServer);
12
- connect(peerId: PeerId, storageId: StorageId | undefined, isEphemeral: boolean): void;
12
+ connect(peerId: PeerId, peerMetadata: PeerMetadata): void;
13
13
  disconnect(): void;
14
14
  send(message: FromServerMessage): void;
15
15
  receiveMessage(message: Uint8Array, socket: WebSocket): void;
@@ -1 +1 @@
1
- {"version":3,"file":"NodeWSServerAdapter.d.ts","sourceRoot":"","sources":["../src/NodeWSServerAdapter.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAKpD,OAAO,EAEL,cAAc,EACd,KAAK,MAAM,EACX,KAAK,SAAS,EACf,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAqB,iBAAiB,EAAE,MAAM,eAAe,CAAA;AASpE,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,EAAE;QAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAK;gBAEjC,MAAM,EAAE,eAAe;IAKnC,OAAO,CACL,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,WAAW,EAAE,OAAO;IAuDtB,UAAU;IAIV,IAAI,CAAC,OAAO,EAAE,iBAAiB;IAyB/B,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS;CAwEtD"}
1
+ {"version":3,"file":"NodeWSServerAdapter.d.ts","sourceRoot":"","sources":["../src/NodeWSServerAdapter.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,2BAA2B,CAAA;AAClC,OAAO,EAAqB,iBAAiB,EAAE,MAAM,eAAe,CAAA;AASpE,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,EAAE;QAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAK;gBAEjC,MAAM,EAAE,eAAe;IAKnC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAqDlD,UAAU;IAIV,IAAI,CAAC,OAAO,EAAE,iBAAiB;IAyB/B,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS;CAsEtD"}
@@ -11,10 +11,9 @@ export class NodeWSServerAdapter extends NetworkAdapter {
11
11
  super();
12
12
  this.server = server;
13
13
  }
14
- connect(peerId, storageId, isEphemeral) {
14
+ connect(peerId, peerMetadata) {
15
15
  this.peerId = peerId;
16
- this.storageId = storageId;
17
- this.isEphemeral = isEphemeral;
16
+ this.peerMetadata = peerMetadata;
18
17
  this.server.on("close", function close() {
19
18
  clearInterval(interval);
20
19
  });
@@ -94,12 +93,11 @@ export class NodeWSServerAdapter extends NetworkAdapter {
94
93
  }
95
94
  this.emit("peer-disconnected", { peerId: senderId });
96
95
  }
97
- const { storageId, isEphemeral } = cbor;
96
+ const { peerMetadata } = cbor;
98
97
  // Let the rest of the system know that we have a new connection.
99
98
  this.emit("peer-candidate", {
100
99
  peerId: senderId,
101
- storageId,
102
- isEphemeral,
100
+ peerMetadata,
103
101
  });
104
102
  this.sockets[senderId] = socket;
105
103
  // In this client-server connection, there's only ever one peer: us!
@@ -119,8 +117,7 @@ export class NodeWSServerAdapter extends NetworkAdapter {
119
117
  this.send({
120
118
  type: "peer",
121
119
  senderId: this.peerId,
122
- storageId: this.storageId,
123
- isEphemeral: this.isEphemeral,
120
+ peerMetadata: this.peerMetadata,
124
121
  selectedProtocolVersion: ProtocolV1,
125
122
  targetId: senderId,
126
123
  });
@@ -1,4 +1,4 @@
1
- import type { Message, PeerId, StorageId } from "@automerge/automerge-repo";
1
+ import type { Message, PeerId, PeerMetadata } from "@automerge/automerge-repo";
2
2
  import type { ProtocolVersion } from "./protocolVersion.js";
3
3
  /** The sender is disconnecting */
4
4
  export type LeaveMessage = {
@@ -10,11 +10,8 @@ export type JoinMessage = {
10
10
  type: "join";
11
11
  /** The PeerID of the client */
12
12
  senderId: PeerId;
13
- /** Unique ID of the storage that the sender peer is using, is persistent across sessions */
14
- storageId?: StorageId;
15
- /** Indicates whether other peers should persist the sync state of the sender peer.
16
- * Sync state is only persisted for non-ephemeral peers */
17
- isEphemeral: boolean;
13
+ /** Metadata presented by the peer */
14
+ peerMetadata: PeerMetadata;
18
15
  /** The protocol version the client supports */
19
16
  supportedProtocolVersions: ProtocolVersion[];
20
17
  };
@@ -23,11 +20,8 @@ export type PeerMessage = {
23
20
  type: "peer";
24
21
  /** The PeerID of the server */
25
22
  senderId: PeerId;
26
- /** Unique ID of the storage that the sender peer is using, is persistent across sessions */
27
- storageId?: StorageId;
28
- /** Indicates whether other peers should persist the sync state of the sender peer.
29
- * Sync state is only persisted for non-ephemeral peers */
30
- isEphemeral: boolean;
23
+ /** Metadata presented by the peer */
24
+ peerMetadata: PeerMetadata;
31
25
  /** The protocol version the server selected for this connection */
32
26
  selectedProtocolVersion: ProtocolVersion;
33
27
  /** The PeerID of the client */
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,kCAAkC;AAClC,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAEhB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB;8DAC0D;IAC1D,WAAW,EAAE,OAAO,CAAA;IAEpB,+CAA+C;IAC/C,yBAAyB,EAAE,eAAe,EAAE,CAAA;CAC7C,CAAA;AAED,yFAAyF;AACzF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAEhB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB;8DAC0D;IAC1D,WAAW,EAAE,OAAO,CAAA;IAEpB,mEAAmE;IACnE,uBAAuB,EAAE,eAAe,CAAA;IACxC,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,gGAAgG;AAChG,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAKD,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAA;AAEpE,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAA"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,kCAAkC;AAClC,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAEhB,sCAAsC;IACtC,YAAY,EAAE,YAAY,CAAA;IAE1B,+CAA+C;IAC/C,yBAAyB,EAAE,eAAe,EAAE,CAAA;CAC7C,CAAA;AAED,yFAAyF;AACzF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAEhB,sCAAsC;IACtC,YAAY,EAAE,YAAY,CAAA;IAE1B,mEAAmE;IACnE,uBAAuB,EAAE,eAAe,CAAA;IACxC,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,gGAAgG;AAChG,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAKD,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAA;AAEpE,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automerge/automerge-repo-network-websocket",
3
- "version": "1.1.0-alpha.1",
3
+ "version": "1.1.0-alpha.2",
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": "^1.1.0-alpha.1",
16
+ "@automerge/automerge-repo": "^1.1.0-alpha.2",
17
17
  "cbor-x": "^1.3.0",
18
18
  "eventemitter3": "^5.0.1",
19
19
  "isomorphic-ws": "^5.0.0",
@@ -30,5 +30,5 @@
30
30
  "publishConfig": {
31
31
  "access": "public"
32
32
  },
33
- "gitHead": "11805d698f860bd6ffb3ca028d3b57e718690b5a"
33
+ "gitHead": "d73e71588c3835a172fdf4d19e56a1f946c041ed"
34
34
  }
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  NetworkAdapter,
3
3
  type PeerId,
4
+ type PeerMetadata,
4
5
  cbor,
5
- type StorageId,
6
6
  } from "@automerge/automerge-repo"
7
7
  import WebSocket from "isomorphic-ws"
8
8
 
@@ -36,11 +36,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
36
36
  this.url = url
37
37
  }
38
38
 
39
- connect(
40
- peerId: PeerId,
41
- storageId: StorageId | undefined,
42
- isEphemeral: boolean
43
- ) {
39
+ connect(peerId: PeerId, peerMetadata: PeerMetadata) {
44
40
  // If we're reconnecting make sure we remove the old event listeners
45
41
  // before creating a new connection.
46
42
  if (this.socket) {
@@ -50,15 +46,11 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
50
46
  }
51
47
 
52
48
  if (!this.timerId) {
53
- this.timerId = setInterval(
54
- () => this.connect(peerId, storageId, isEphemeral),
55
- 5000
56
- )
49
+ this.timerId = setInterval(() => this.connect(peerId, peerMetadata), 5000)
57
50
  }
58
51
 
59
52
  this.peerId = peerId
60
- this.storageId = storageId
61
- this.isEphemeral = isEphemeral
53
+ this.peerMetadata = peerMetadata
62
54
  this.socket = new WebSocket(this.url)
63
55
  this.socket.binaryType = "arraybuffer"
64
56
 
@@ -83,7 +75,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
83
75
  log(`@ ${this.url}: open`)
84
76
  clearInterval(this.timerId)
85
77
  this.timerId = undefined
86
- this.send(joinMessage(this.peerId!, this.storageId, this.isEphemeral))
78
+ this.send(joinMessage(this.peerId!, this.peerMetadata!))
87
79
  }
88
80
 
89
81
  // When a socket closes, or disconnects, remove it from the array.
@@ -96,7 +88,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
96
88
 
97
89
  if (!this.timerId) {
98
90
  if (this.peerId) {
99
- this.connect(this.peerId, this.storageId, this.isEphemeral)
91
+ this.connect(this.peerId, this.peerMetadata!)
100
92
  }
101
93
  }
102
94
  }
@@ -110,7 +102,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
110
102
  throw new Error("WTF, get a socket")
111
103
  }
112
104
  if (this.socket.readyState === WebSocket.OPEN) {
113
- this.send(joinMessage(this.peerId!, this.storageId, this.isEphemeral))
105
+ this.send(joinMessage(this.peerId!, this.peerMetadata!))
114
106
  } else {
115
107
  // The onOpen handler automatically sends a join message
116
108
  }
@@ -147,11 +139,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
147
139
  this.socket?.send(arrayBuf)
148
140
  }
149
141
 
150
- announceConnection(
151
- peerId: PeerId,
152
- storageId: StorageId | undefined,
153
- isEphemeral: boolean
154
- ) {
142
+ announceConnection(peerId: PeerId, peerMetadata: PeerMetadata) {
155
143
  // return a peer object
156
144
  const myPeerId = this.peerId
157
145
  if (!myPeerId) {
@@ -162,7 +150,7 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
162
150
  this.emit("ready", { network: this })
163
151
  }
164
152
  this.remotePeerId = peerId
165
- this.emit("peer-candidate", { peerId, storageId, isEphemeral })
153
+ this.emit("peer-candidate", { peerId, peerMetadata })
166
154
  }
167
155
 
168
156
  receiveMessage(message: Uint8Array) {
@@ -181,9 +169,9 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
181
169
 
182
170
  switch (type) {
183
171
  case "peer": {
184
- const { storageId, isEphemeral } = decoded
172
+ const { peerMetadata } = decoded
185
173
  log(`peer: ${senderId}`)
186
- this.announceConnection(senderId, storageId, isEphemeral)
174
+ this.announceConnection(senderId, peerMetadata)
187
175
  break
188
176
  }
189
177
  case "error":
@@ -197,14 +185,12 @@ export class BrowserWebSocketClientAdapter extends WebSocketNetworkAdapter {
197
185
 
198
186
  function joinMessage(
199
187
  senderId: PeerId,
200
- storageId: StorageId | undefined,
201
- isEphemeral: boolean
188
+ peerMetadata: PeerMetadata
202
189
  ): JoinMessage {
203
190
  return {
204
191
  type: "join",
205
192
  senderId,
206
- storageId,
207
- isEphemeral,
193
+ peerMetadata,
208
194
  supportedProtocolVersions: [ProtocolV1],
209
195
  }
210
196
  }
@@ -7,8 +7,8 @@ const log = debug("WebsocketServer")
7
7
  import {
8
8
  cbor as cborHelpers,
9
9
  NetworkAdapter,
10
+ type PeerMetadata,
10
11
  type PeerId,
11
- type StorageId,
12
12
  } from "@automerge/automerge-repo"
13
13
  import { FromClientMessage, FromServerMessage } from "./messages.js"
14
14
  import { ProtocolV1, ProtocolVersion } from "./protocolVersion.js"
@@ -28,14 +28,9 @@ export class NodeWSServerAdapter extends NetworkAdapter {
28
28
  this.server = server
29
29
  }
30
30
 
31
- connect(
32
- peerId: PeerId,
33
- storageId: StorageId | undefined,
34
- isEphemeral: boolean
35
- ) {
31
+ connect(peerId: PeerId, peerMetadata: PeerMetadata) {
36
32
  this.peerId = peerId
37
- this.storageId = storageId
38
- this.isEphemeral = isEphemeral
33
+ this.peerMetadata = peerMetadata
39
34
 
40
35
  this.server.on("close", function close() {
41
36
  clearInterval(interval)
@@ -140,12 +135,11 @@ export class NodeWSServerAdapter extends NetworkAdapter {
140
135
  this.emit("peer-disconnected", { peerId: senderId })
141
136
  }
142
137
 
143
- const { storageId, isEphemeral } = cbor
138
+ const { peerMetadata } = cbor
144
139
  // Let the rest of the system know that we have a new connection.
145
140
  this.emit("peer-candidate", {
146
141
  peerId: senderId,
147
- storageId,
148
- isEphemeral,
142
+ peerMetadata,
149
143
  })
150
144
  this.sockets[senderId] = socket
151
145
 
@@ -167,8 +161,7 @@ export class NodeWSServerAdapter extends NetworkAdapter {
167
161
  this.send({
168
162
  type: "peer",
169
163
  senderId: this.peerId!,
170
- storageId: this.storageId,
171
- isEphemeral: this.isEphemeral,
164
+ peerMetadata: this.peerMetadata!,
172
165
  selectedProtocolVersion: ProtocolV1,
173
166
  targetId: senderId,
174
167
  })
package/src/messages.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Message, PeerId, StorageId } from "@automerge/automerge-repo"
1
+ import type { Message, PeerId, PeerMetadata } from "@automerge/automerge-repo"
2
2
  import type { ProtocolVersion } from "./protocolVersion.js"
3
3
 
4
4
  /** The sender is disconnecting */
@@ -13,12 +13,8 @@ export type JoinMessage = {
13
13
  /** The PeerID of the client */
14
14
  senderId: PeerId
15
15
 
16
- /** Unique ID of the storage that the sender peer is using, is persistent across sessions */
17
- storageId?: StorageId
18
-
19
- /** Indicates whether other peers should persist the sync state of the sender peer.
20
- * Sync state is only persisted for non-ephemeral peers */
21
- isEphemeral: boolean
16
+ /** Metadata presented by the peer */
17
+ peerMetadata: PeerMetadata
22
18
 
23
19
  /** The protocol version the client supports */
24
20
  supportedProtocolVersions: ProtocolVersion[]
@@ -30,12 +26,8 @@ export type PeerMessage = {
30
26
  /** The PeerID of the server */
31
27
  senderId: PeerId
32
28
 
33
- /** Unique ID of the storage that the sender peer is using, is persistent across sessions */
34
- storageId?: StorageId
35
-
36
- /** Indicates whether other peers should persist the sync state of the sender peer.
37
- * Sync state is only persisted for non-ephemeral peers */
38
- isEphemeral: boolean
29
+ /** Metadata presented by the peer */
30
+ peerMetadata: PeerMetadata
39
31
 
40
32
  /** The protocol version the server selected for this connection */
41
33
  selectedProtocolVersion: ProtocolVersion
@@ -80,8 +80,7 @@ describe("Websocket adapters", () => {
80
80
  assert.deepEqual(message, {
81
81
  type: "join",
82
82
  senderId: "browser",
83
- storageId: undefined,
84
- isEphemeral: true,
83
+ peerMetadata: { storageId: undefined, isEphemeral: true },
85
84
  supportedProtocolVersions: ["1"],
86
85
  })
87
86
  })
@@ -185,8 +184,7 @@ describe("Websocket adapters", () => {
185
184
  assert.deepEqual(response, {
186
185
  type: "peer",
187
186
  senderId: "server",
188
- storageId: undefined,
189
- isEphemeral: true,
187
+ peerMetadata: { storageId: undefined, isEphemeral: true },
190
188
  targetId: "browser",
191
189
  selectedProtocolVersion: "1",
192
190
  })
@@ -214,8 +212,7 @@ describe("Websocket adapters", () => {
214
212
  assert.deepEqual(response, {
215
213
  type: "peer",
216
214
  senderId: "server",
217
- storageId: undefined,
218
- isEphemeral: true,
215
+ peerMetadata: { storageId: undefined, isEphemeral: true },
219
216
  targetId: "browser",
220
217
  selectedProtocolVersion: "1",
221
218
  })