@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.
- package/dist/BrowserWebSocketClientAdapter.d.ts +3 -3
- package/dist/BrowserWebSocketClientAdapter.d.ts.map +1 -1
- package/dist/BrowserWebSocketClientAdapter.js +12 -14
- package/dist/NodeWSServerAdapter.d.ts +2 -2
- package/dist/NodeWSServerAdapter.d.ts.map +1 -1
- package/dist/NodeWSServerAdapter.js +5 -8
- package/dist/messages.d.ts +5 -11
- package/dist/messages.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/BrowserWebSocketClientAdapter.ts +13 -27
- package/src/NodeWSServerAdapter.ts +6 -13
- package/src/messages.ts +5 -13
- package/test/Websocket.test.ts +3 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="ws" />
|
|
2
|
-
import { NetworkAdapter, type PeerId, type
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
29
|
+
this.timerId = setInterval(() => this.connect(peerId, peerMetadata), 5000);
|
|
30
30
|
}
|
|
31
31
|
this.peerId = peerId;
|
|
32
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
|
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 {
|
|
128
|
+
const { peerMetadata } = decoded;
|
|
130
129
|
log(`peer: ${senderId}`);
|
|
131
|
-
this.announceConnection(senderId,
|
|
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,
|
|
141
|
+
function joinMessage(senderId, peerMetadata) {
|
|
143
142
|
return {
|
|
144
143
|
type: "join",
|
|
145
144
|
senderId,
|
|
146
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
14
|
+
connect(peerId, peerMetadata) {
|
|
15
15
|
this.peerId = peerId;
|
|
16
|
-
this.
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
123
|
-
isEphemeral: this.isEphemeral,
|
|
120
|
+
peerMetadata: this.peerMetadata,
|
|
124
121
|
selectedProtocolVersion: ProtocolV1,
|
|
125
122
|
targetId: senderId,
|
|
126
123
|
});
|
package/dist/messages.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Message, PeerId,
|
|
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
|
-
/**
|
|
14
|
-
|
|
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
|
-
/**
|
|
27
|
-
|
|
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 */
|
package/dist/messages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,
|
|
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.
|
|
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.
|
|
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": "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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 {
|
|
172
|
+
const { peerMetadata } = decoded
|
|
185
173
|
log(`peer: ${senderId}`)
|
|
186
|
-
this.announceConnection(senderId,
|
|
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
|
-
|
|
201
|
-
isEphemeral: boolean
|
|
188
|
+
peerMetadata: PeerMetadata
|
|
202
189
|
): JoinMessage {
|
|
203
190
|
return {
|
|
204
191
|
type: "join",
|
|
205
192
|
senderId,
|
|
206
|
-
|
|
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.
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
/**
|
|
17
|
-
|
|
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
|
-
/**
|
|
34
|
-
|
|
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
|
package/test/Websocket.test.ts
CHANGED
|
@@ -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
|
})
|