cojson-transport-ws 0.9.23 → 0.10.0

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,7 +1,7 @@
1
1
  import { ControlledAgent, LocalNode, WasmCrypto } from "cojson";
2
2
  import { afterEach, beforeEach, describe, expect, test } from "vitest";
3
3
  import { WebSocket } from "ws";
4
- import { createWebSocketPeer } from "../index";
4
+ import { createWebSocketPeer } from "../createWebSocketPeer";
5
5
  import { startSyncServer } from "./syncServer";
6
6
  describe("WebSocket Peer Integration", () => {
7
7
  let server;
@@ -62,7 +62,6 @@ describe("WebSocket Peer Integration", () => {
62
62
  map.set("testKey", "testValue", "trusting");
63
63
  // Wait for sync
64
64
  await map.core.waitForSync();
65
- console.log("synced");
66
65
  // Verify data reached the server
67
66
  const serverNode = server.localNode;
68
67
  const serverMap = await serverNode.load(map.id);
@@ -1 +1 @@
1
- {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/tests/integration.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/tests/integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { createServer } from "http";
2
2
  import { ControlledAgent, LocalNode, WasmCrypto } from "cojson";
3
3
  import { WebSocketServer } from "ws";
4
- import { createWebSocketPeer } from "../index";
4
+ import { createWebSocketPeer } from "../createWebSocketPeer";
5
5
  export const startSyncServer = async (port) => {
6
6
  const crypto = await WasmCrypto.create();
7
7
  const server = createServer((req, res) => {
@@ -1 +1 @@
1
- {"version":3,"file":"syncServer.js","sourceRoot":"","sources":["../../src/tests/syncServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAa,eAAe,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAa,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,SAAS,CAC7B,IAAI,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,EACxC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAClC,MAAM,CACP,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAa,CAAC;IAEzC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,UAAU,CAAC,EAAE,EAAE,GAAG;QAC9C,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEpB,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;gBAChB,EAAE,EAAE,SAAS;aACd,CAAC,CACH,CAAC;QACJ,CAAC,CAAC;QAEF,wCAAwC;QACxC,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAE3C,QAAQ,EAAE,CAAC,CAAC,qFAAqF;QAEjG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE1C,SAAS,CAAC,WAAW,CAAC,OAAO,CAC3B,mBAAmB,CAAC;YAClB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,KAAK;YAClB,iBAAiB,EAAE,KAAK;YACxB,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CACH,CAAC;QAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI;QACrD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,IAAI,CAAC,EAAE;gBACnD,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAEzB,IAAI,GAAI,MAAM,CAAC,OAAO,EAAuB,CAAC,IAAI,CAAC;IACnD,MAAM,UAAU,GAAG,kBAAkB,IAAI,EAAE,CAAC;IAE5C,OAAO;QACL,KAAK,EAAE,GAAG,EAAE;YACV,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,UAAU;QACV,IAAI;QACJ,SAAS;KACV,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"syncServer.js","sourceRoot":"","sources":["../../src/tests/syncServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export function waitFor(callback) {
2
+ return new Promise((resolve, reject) => {
3
+ const checkPassed = () => {
4
+ try {
5
+ return { ok: callback(), error: null };
6
+ }
7
+ catch (error) {
8
+ return { ok: false, error };
9
+ }
10
+ };
11
+ let retries = 0;
12
+ const interval = setInterval(() => {
13
+ const { ok, error } = checkPassed();
14
+ if (ok !== false) {
15
+ clearInterval(interval);
16
+ resolve();
17
+ }
18
+ if (++retries > 10) {
19
+ clearInterval(interval);
20
+ reject(error);
21
+ }
22
+ }, 100);
23
+ });
24
+ }
25
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tests/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,QAA8B;IACpD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;YAEpC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC;gBACnB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "cojson-transport-ws",
3
3
  "type": "module",
4
- "version": "0.9.23",
4
+ "version": "0.10.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "src/index.ts",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
9
  "typescript": "~5.6.2",
10
- "cojson": "0.9.23"
10
+ "cojson": "0.10.0"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/ws": "8.5.10",
@@ -0,0 +1,108 @@
1
+ import { Peer, logger } from "cojson";
2
+ import { createWebSocketPeer } from "./createWebSocketPeer.js";
3
+
4
+ export class WebSocketPeerWithReconnection {
5
+ private peer: string;
6
+ private reconnectionTimeout: number;
7
+ private addPeer: (peer: Peer) => void;
8
+ private removePeer: (peer: Peer) => void;
9
+
10
+ constructor(opts: {
11
+ peer: string;
12
+ reconnectionTimeout: number | undefined;
13
+ addPeer: (peer: Peer) => void;
14
+ removePeer: (peer: Peer) => void;
15
+ }) {
16
+ this.peer = opts.peer;
17
+ this.reconnectionTimeout = opts.reconnectionTimeout || 500;
18
+ this.addPeer = opts.addPeer;
19
+ this.removePeer = opts.removePeer;
20
+ }
21
+
22
+ state: "disabled" | "enabled" = "disabled";
23
+ currentPeer: Peer | undefined = undefined;
24
+ unsubscribeNetworkChange: (() => void) | undefined = undefined;
25
+
26
+ // Basic implementation for environments that don't support network change events (e.g. Node.js)
27
+ // Needs to be extended to handle platform specific APIs
28
+ onNetworkChange(callback: (connected: boolean) => void): () => void {
29
+ callback;
30
+ return () => {};
31
+ }
32
+
33
+ waitForOnline(timeout: number) {
34
+ return new Promise<void>((resolve) => {
35
+ const unsubscribeNetworkChange = this.onNetworkChange((connected) => {
36
+ if (connected) {
37
+ handleTimeoutOrOnline();
38
+ }
39
+ });
40
+
41
+ function handleTimeoutOrOnline() {
42
+ clearTimeout(timer);
43
+ unsubscribeNetworkChange();
44
+ resolve();
45
+ }
46
+
47
+ const timer = setTimeout(handleTimeoutOrOnline, timeout);
48
+ });
49
+ }
50
+
51
+ reconnectionAttempts = 0;
52
+
53
+ startConnection = async () => {
54
+ if (this.state !== "enabled") return;
55
+
56
+ if (this.currentPeer) {
57
+ this.removePeer(this.currentPeer);
58
+
59
+ this.reconnectionAttempts++;
60
+
61
+ const timeout = this.reconnectionTimeout * this.reconnectionAttempts;
62
+
63
+ logger.debug(
64
+ "Websocket disconnected, trying to reconnect in " + timeout + "ms",
65
+ );
66
+
67
+ await this.waitForOnline(timeout);
68
+ }
69
+
70
+ if (this.state !== "enabled") return;
71
+
72
+ this.currentPeer = createWebSocketPeer({
73
+ websocket: new WebSocket(this.peer),
74
+ id: this.peer,
75
+ role: "server",
76
+ onClose: this.startConnection,
77
+ onSuccess: () => {
78
+ logger.debug("Websocket connection successful");
79
+
80
+ this.reconnectionAttempts = 0;
81
+ },
82
+ });
83
+
84
+ this.addPeer(this.currentPeer);
85
+ };
86
+
87
+ enable = () => {
88
+ if (this.state === "enabled") return;
89
+
90
+ this.state = "enabled";
91
+ this.startConnection();
92
+ };
93
+
94
+ disable = () => {
95
+ if (this.state === "disabled") return;
96
+
97
+ this.state = "disabled";
98
+
99
+ this.reconnectionAttempts = 0;
100
+ this.unsubscribeNetworkChange?.();
101
+ this.unsubscribeNetworkChange = undefined;
102
+
103
+ if (this.currentPeer) {
104
+ this.removePeer(this.currentPeer);
105
+ this.currentPeer = undefined;
106
+ }
107
+ };
108
+ }
@@ -0,0 +1,239 @@
1
+ import {
2
+ DisconnectedError,
3
+ Peer,
4
+ PingTimeoutError,
5
+ SyncMessage,
6
+ cojsonInternals,
7
+ logger,
8
+ } from "cojson";
9
+ import { BatchedOutgoingMessages } from "./BatchedOutgoingMessages.js";
10
+ import { deserializeMessages, getErrorMessage } from "./serialization.js";
11
+ import { AnyWebSocket } from "./types.js";
12
+
13
+ export const BUFFER_LIMIT = 100_000;
14
+ export const BUFFER_LIMIT_POLLING_INTERVAL = 10;
15
+
16
+ export type CreateWebSocketPeerOpts = {
17
+ id: string;
18
+ websocket: AnyWebSocket;
19
+ role: Peer["role"];
20
+ expectPings?: boolean;
21
+ batchingByDefault?: boolean;
22
+ deletePeerStateOnClose?: boolean;
23
+ onClose?: () => void;
24
+ onSuccess?: () => void;
25
+ };
26
+
27
+ function createPingTimeoutListener(enabled: boolean, callback: () => void) {
28
+ if (!enabled) {
29
+ return {
30
+ reset() {},
31
+ clear() {},
32
+ };
33
+ }
34
+
35
+ let pingTimeout: ReturnType<typeof setTimeout> | null = null;
36
+
37
+ return {
38
+ reset() {
39
+ pingTimeout && clearTimeout(pingTimeout);
40
+ pingTimeout = setTimeout(() => {
41
+ callback();
42
+ }, 10_000);
43
+ },
44
+ clear() {
45
+ pingTimeout && clearTimeout(pingTimeout);
46
+ },
47
+ };
48
+ }
49
+
50
+ function waitForWebSocketOpen(websocket: AnyWebSocket) {
51
+ return new Promise<void>((resolve) => {
52
+ if (websocket.readyState === 1) {
53
+ resolve();
54
+ } else {
55
+ websocket.addEventListener("open", resolve, { once: true });
56
+ }
57
+ });
58
+ }
59
+
60
+ function createOutgoingMessagesManager(
61
+ websocket: AnyWebSocket,
62
+ batchingByDefault: boolean,
63
+ ) {
64
+ let closed = false;
65
+ const outgoingMessages = new BatchedOutgoingMessages((messages) => {
66
+ if (websocket.readyState === 1) {
67
+ websocket.send(messages);
68
+ }
69
+ });
70
+
71
+ let batchingEnabled = batchingByDefault;
72
+
73
+ async function sendMessage(msg: SyncMessage) {
74
+ if (closed) {
75
+ return Promise.reject(new Error("WebSocket closed"));
76
+ }
77
+
78
+ if (websocket.readyState !== 1) {
79
+ await waitForWebSocketOpen(websocket);
80
+ }
81
+
82
+ while (
83
+ websocket.bufferedAmount > BUFFER_LIMIT &&
84
+ websocket.readyState === 1
85
+ ) {
86
+ await new Promise<void>((resolve) =>
87
+ setTimeout(resolve, BUFFER_LIMIT_POLLING_INTERVAL),
88
+ );
89
+ }
90
+
91
+ if (websocket.readyState !== 1) {
92
+ return;
93
+ }
94
+
95
+ if (!batchingEnabled) {
96
+ websocket.send(JSON.stringify(msg));
97
+ } else {
98
+ outgoingMessages.push(msg);
99
+ }
100
+ }
101
+
102
+ return {
103
+ sendMessage,
104
+ setBatchingEnabled(enabled: boolean) {
105
+ batchingEnabled = enabled;
106
+ },
107
+ close() {
108
+ closed = true;
109
+ outgoingMessages.close();
110
+ },
111
+ };
112
+ }
113
+
114
+ function createClosedEventEmitter(callback = () => {}) {
115
+ let disconnected = false;
116
+
117
+ return () => {
118
+ if (disconnected) return;
119
+ disconnected = true;
120
+ callback();
121
+ };
122
+ }
123
+
124
+ export function createWebSocketPeer({
125
+ id,
126
+ websocket,
127
+ role,
128
+ expectPings = true,
129
+ batchingByDefault = true,
130
+ deletePeerStateOnClose = false,
131
+ onSuccess,
132
+ onClose,
133
+ }: CreateWebSocketPeerOpts): Peer {
134
+ const incoming = new cojsonInternals.Channel<
135
+ SyncMessage | DisconnectedError | PingTimeoutError
136
+ >();
137
+ const emitClosedEvent = createClosedEventEmitter(onClose);
138
+
139
+ function handleClose() {
140
+ incoming
141
+ .push("Disconnected")
142
+ .catch((e) => logger.error("Error while pushing disconnect msg", e));
143
+ emitClosedEvent();
144
+ }
145
+
146
+ websocket.addEventListener("close", handleClose);
147
+ websocket.addEventListener("error" as any, (err) => {
148
+ if (err.message) {
149
+ logger.warn(err.message);
150
+ }
151
+
152
+ handleClose();
153
+ });
154
+
155
+ const pingTimeout = createPingTimeoutListener(expectPings, () => {
156
+ incoming
157
+ .push("PingTimeout")
158
+ .catch((e) => logger.error("Error while pushing ping timeout", e));
159
+ emitClosedEvent();
160
+ });
161
+
162
+ const outgoingMessages = createOutgoingMessagesManager(
163
+ websocket,
164
+ batchingByDefault,
165
+ );
166
+ let isFirstMessage = true;
167
+
168
+ function handleIncomingMsg(event: { data: unknown }) {
169
+ if (event.data === "") {
170
+ return;
171
+ }
172
+
173
+ const result = deserializeMessages(event.data);
174
+
175
+ if (!result.ok) {
176
+ logger.warn(
177
+ "Error while deserializing messages: " + getErrorMessage(result.error),
178
+ );
179
+ return;
180
+ }
181
+
182
+ if (isFirstMessage) {
183
+ // The only way to know that the connection has been correctly established with our sync server
184
+ // is to track that we got a message from the server.
185
+ onSuccess?.();
186
+ isFirstMessage = false;
187
+ }
188
+
189
+ const { messages } = result;
190
+
191
+ if (messages.length > 1) {
192
+ // If more than one message is received, the other peer supports batching
193
+ outgoingMessages.setBatchingEnabled(true);
194
+ }
195
+
196
+ pingTimeout.reset();
197
+
198
+ for (const msg of messages) {
199
+ if (msg && "action" in msg) {
200
+ incoming
201
+ .push(msg)
202
+ .catch((e) => logger.error("Error while pushing incoming msg", e));
203
+ }
204
+ }
205
+ }
206
+
207
+ websocket.addEventListener("message", handleIncomingMsg);
208
+
209
+ return {
210
+ id,
211
+ incoming,
212
+ outgoing: {
213
+ push: outgoingMessages.sendMessage,
214
+ close() {
215
+ outgoingMessages.close();
216
+
217
+ websocket.removeEventListener("message", handleIncomingMsg);
218
+ websocket.removeEventListener("close", handleClose);
219
+ pingTimeout.clear();
220
+ emitClosedEvent();
221
+
222
+ if (websocket.readyState === 0) {
223
+ websocket.addEventListener(
224
+ "open",
225
+ function handleClose() {
226
+ websocket.close();
227
+ },
228
+ { once: true },
229
+ );
230
+ } else if (websocket.readyState == 1) {
231
+ websocket.close();
232
+ }
233
+ },
234
+ },
235
+ role,
236
+ crashOnClose: false,
237
+ deletePeerStateOnClose,
238
+ };
239
+ }
package/src/index.ts CHANGED
@@ -1,239 +1,2 @@
1
- import {
2
- DisconnectedError,
3
- Peer,
4
- PingTimeoutError,
5
- SyncMessage,
6
- cojsonInternals,
7
- logger,
8
- } from "cojson";
9
- import { BatchedOutgoingMessages } from "./BatchedOutgoingMessages.js";
10
- import { deserializeMessages, getErrorMessage } from "./serialization.js";
11
- import { AnyWebSocket } from "./types.js";
12
-
13
- export const BUFFER_LIMIT = 100_000;
14
- export const BUFFER_LIMIT_POLLING_INTERVAL = 10;
15
-
16
- export type CreateWebSocketPeerOpts = {
17
- id: string;
18
- websocket: AnyWebSocket;
19
- role: Peer["role"];
20
- expectPings?: boolean;
21
- batchingByDefault?: boolean;
22
- deletePeerStateOnClose?: boolean;
23
- onClose?: () => void;
24
- onSuccess?: () => void;
25
- };
26
-
27
- function createPingTimeoutListener(enabled: boolean, callback: () => void) {
28
- if (!enabled) {
29
- return {
30
- reset() {},
31
- clear() {},
32
- };
33
- }
34
-
35
- let pingTimeout: ReturnType<typeof setTimeout> | null = null;
36
-
37
- return {
38
- reset() {
39
- pingTimeout && clearTimeout(pingTimeout);
40
- pingTimeout = setTimeout(() => {
41
- callback();
42
- }, 10_000);
43
- },
44
- clear() {
45
- pingTimeout && clearTimeout(pingTimeout);
46
- },
47
- };
48
- }
49
-
50
- function waitForWebSocketOpen(websocket: AnyWebSocket) {
51
- return new Promise<void>((resolve) => {
52
- if (websocket.readyState === 1) {
53
- resolve();
54
- } else {
55
- websocket.addEventListener("open", resolve, { once: true });
56
- }
57
- });
58
- }
59
-
60
- function createOutgoingMessagesManager(
61
- websocket: AnyWebSocket,
62
- batchingByDefault: boolean,
63
- ) {
64
- let closed = false;
65
- const outgoingMessages = new BatchedOutgoingMessages((messages) => {
66
- if (websocket.readyState === 1) {
67
- websocket.send(messages);
68
- }
69
- });
70
-
71
- let batchingEnabled = batchingByDefault;
72
-
73
- async function sendMessage(msg: SyncMessage) {
74
- if (closed) {
75
- return Promise.reject(new Error("WebSocket closed"));
76
- }
77
-
78
- if (websocket.readyState !== 1) {
79
- await waitForWebSocketOpen(websocket);
80
- }
81
-
82
- while (
83
- websocket.bufferedAmount > BUFFER_LIMIT &&
84
- websocket.readyState === 1
85
- ) {
86
- await new Promise<void>((resolve) =>
87
- setTimeout(resolve, BUFFER_LIMIT_POLLING_INTERVAL),
88
- );
89
- }
90
-
91
- if (websocket.readyState !== 1) {
92
- return;
93
- }
94
-
95
- if (!batchingEnabled) {
96
- websocket.send(JSON.stringify(msg));
97
- } else {
98
- outgoingMessages.push(msg);
99
- }
100
- }
101
-
102
- return {
103
- sendMessage,
104
- setBatchingEnabled(enabled: boolean) {
105
- batchingEnabled = enabled;
106
- },
107
- close() {
108
- closed = true;
109
- outgoingMessages.close();
110
- },
111
- };
112
- }
113
-
114
- function createClosedEventEmitter(callback = () => {}) {
115
- let disconnected = false;
116
-
117
- return () => {
118
- if (disconnected) return;
119
- disconnected = true;
120
- callback();
121
- };
122
- }
123
-
124
- export function createWebSocketPeer({
125
- id,
126
- websocket,
127
- role,
128
- expectPings = true,
129
- batchingByDefault = true,
130
- deletePeerStateOnClose = false,
131
- onSuccess,
132
- onClose,
133
- }: CreateWebSocketPeerOpts): Peer {
134
- const incoming = new cojsonInternals.Channel<
135
- SyncMessage | DisconnectedError | PingTimeoutError
136
- >();
137
- const emitClosedEvent = createClosedEventEmitter(onClose);
138
-
139
- function handleClose() {
140
- incoming
141
- .push("Disconnected")
142
- .catch((e) => logger.error("Error while pushing disconnect msg", e));
143
- emitClosedEvent();
144
- }
145
-
146
- websocket.addEventListener("close", handleClose);
147
- websocket.addEventListener("error" as any, (err) => {
148
- logger.warn(err.message);
149
-
150
- if (err.message.includes("ECONNREFUSED")) {
151
- websocket.close();
152
- }
153
- });
154
-
155
- const pingTimeout = createPingTimeoutListener(expectPings, () => {
156
- incoming
157
- .push("PingTimeout")
158
- .catch((e) => logger.error("Error while pushing ping timeout", e));
159
- emitClosedEvent();
160
- });
161
-
162
- const outgoingMessages = createOutgoingMessagesManager(
163
- websocket,
164
- batchingByDefault,
165
- );
166
- let isFirstMessage = true;
167
-
168
- function handleIncomingMsg(event: { data: unknown }) {
169
- if (event.data === "") {
170
- return;
171
- }
172
-
173
- const result = deserializeMessages(event.data);
174
-
175
- if (!result.ok) {
176
- logger.warn(
177
- "Error while deserializing messages: " + getErrorMessage(result.error),
178
- );
179
- return;
180
- }
181
-
182
- if (isFirstMessage) {
183
- // The only way to know that the connection has been correctly established with our sync server
184
- // is to track that we got a message from the server.
185
- onSuccess?.();
186
- isFirstMessage = false;
187
- }
188
-
189
- const { messages } = result;
190
-
191
- if (messages.length > 1) {
192
- // If more than one message is received, the other peer supports batching
193
- outgoingMessages.setBatchingEnabled(true);
194
- }
195
-
196
- pingTimeout.reset();
197
-
198
- for (const msg of messages) {
199
- if (msg && "action" in msg) {
200
- incoming
201
- .push(msg)
202
- .catch((e) => logger.error("Error while pushing incoming msg", e));
203
- }
204
- }
205
- }
206
-
207
- websocket.addEventListener("message", handleIncomingMsg);
208
-
209
- return {
210
- id,
211
- incoming,
212
- outgoing: {
213
- push: outgoingMessages.sendMessage,
214
- close() {
215
- outgoingMessages.close();
216
-
217
- websocket.removeEventListener("message", handleIncomingMsg);
218
- websocket.removeEventListener("close", handleClose);
219
- pingTimeout.clear();
220
- emitClosedEvent();
221
-
222
- if (websocket.readyState === 0) {
223
- websocket.addEventListener(
224
- "open",
225
- function handleClose() {
226
- websocket.close();
227
- },
228
- { once: true },
229
- );
230
- } else if (websocket.readyState == 1) {
231
- websocket.close();
232
- }
233
- },
234
- },
235
- role,
236
- crashOnClose: false,
237
- deletePeerStateOnClose,
238
- };
239
- }
1
+ export * from "./createWebSocketPeer.js";
2
+ export * from "./WebSocketPeerWithReconnection.js";