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.
@@ -0,0 +1,143 @@
1
+ import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
2
+ import { WebSocketPeerWithReconnection } from "../WebSocketPeerWithReconnection";
3
+ import { startSyncServer } from "./syncServer";
4
+ import { waitFor } from "./utils";
5
+
6
+ describe("WebSocketPeerWithReconnection", () => {
7
+ let server: any;
8
+ let syncServerUrl: string;
9
+
10
+ beforeEach(async () => {
11
+ const result = await startSyncServer();
12
+ server = result;
13
+ syncServerUrl = result.syncServer;
14
+ });
15
+
16
+ afterEach(() => {
17
+ server.close();
18
+ });
19
+
20
+ test("should connect successfully to sync server", async () => {
21
+ const addPeer = vi.fn();
22
+ const removePeer = vi.fn();
23
+
24
+ const peer = new WebSocketPeerWithReconnection({
25
+ peer: syncServerUrl,
26
+ reconnectionTimeout: 100,
27
+ addPeer,
28
+ removePeer,
29
+ });
30
+
31
+ peer.enable();
32
+
33
+ // Wait for connection to establish
34
+ await new Promise((resolve) => setTimeout(resolve, 100));
35
+
36
+ expect(addPeer).toHaveBeenCalledTimes(1);
37
+ expect(removePeer).not.toHaveBeenCalled();
38
+
39
+ peer.disable();
40
+ });
41
+
42
+ test("should attempt reconnection when server disconnects", async () => {
43
+ const addPeer = vi.fn();
44
+ const removePeer = vi.fn();
45
+
46
+ const peer = new WebSocketPeerWithReconnection({
47
+ peer: syncServerUrl,
48
+ reconnectionTimeout: 100,
49
+ addPeer,
50
+ removePeer,
51
+ });
52
+
53
+ peer.enable();
54
+
55
+ // Wait for initial connection
56
+ await new Promise((resolve) => setTimeout(resolve, 100));
57
+
58
+ addPeer.mockClear();
59
+
60
+ // Close server to simulate disconnect
61
+ server.close();
62
+
63
+ // Wait for disconnect to be detected
64
+ await new Promise((resolve) => setTimeout(resolve, 200));
65
+
66
+ expect(removePeer).toHaveBeenCalled();
67
+ expect(peer.reconnectionAttempts).toBeGreaterThan(0);
68
+
69
+ // Start server again
70
+ server = await startSyncServer(server.port);
71
+
72
+ // Wait for reconnection
73
+ await new Promise((resolve) => setTimeout(resolve, 300));
74
+
75
+ expect(addPeer).toHaveBeenCalled();
76
+
77
+ peer.disable();
78
+ });
79
+
80
+ test("should stop reconnection attempts when disabled", async () => {
81
+ const addPeer = vi.fn();
82
+ const removePeer = vi.fn();
83
+
84
+ const peer = new WebSocketPeerWithReconnection({
85
+ peer: syncServerUrl,
86
+ reconnectionTimeout: 100,
87
+ addPeer,
88
+ removePeer,
89
+ });
90
+
91
+ peer.enable();
92
+
93
+ // Wait for initial connection
94
+ await new Promise((resolve) => setTimeout(resolve, 100));
95
+
96
+ // Close server and disable peer
97
+ server.close();
98
+ peer.disable();
99
+
100
+ // Wait to ensure no reconnection attempts
101
+ await new Promise((resolve) => setTimeout(resolve, 300));
102
+
103
+ expect(addPeer).toHaveBeenCalledTimes(1);
104
+ expect(removePeer).toHaveBeenCalledTimes(1);
105
+ expect(peer.reconnectionAttempts).toBe(0);
106
+ });
107
+
108
+ test("should reset reconnection attempts when connection is successful", async () => {
109
+ const addPeer = vi.fn();
110
+ const removePeer = vi.fn();
111
+
112
+ const peer = new WebSocketPeerWithReconnection({
113
+ peer: syncServerUrl,
114
+ reconnectionTimeout: 10,
115
+ addPeer,
116
+ removePeer,
117
+ });
118
+
119
+ peer.enable();
120
+
121
+ // Wait for initial connection
122
+ await new Promise((resolve) => setTimeout(resolve, 100));
123
+
124
+ // Close server to trigger reconnection attempts
125
+ server.close();
126
+
127
+ // Wait for some reconnection attempts
128
+ await new Promise((resolve) => setTimeout(resolve, 300));
129
+
130
+ const previousAttempts = peer.reconnectionAttempts;
131
+ expect(previousAttempts).toBeGreaterThan(0);
132
+
133
+ // Start server again
134
+ server = await startSyncServer(server.port);
135
+
136
+ // Wait for successful reconnection
137
+ await new Promise((resolve) => setTimeout(resolve, 1000));
138
+
139
+ await waitFor(() => expect(peer.reconnectionAttempts).toBe(0));
140
+
141
+ peer.disable();
142
+ });
143
+ });
@@ -7,7 +7,7 @@ import {
7
7
  BUFFER_LIMIT_POLLING_INTERVAL,
8
8
  CreateWebSocketPeerOpts,
9
9
  createWebSocketPeer,
10
- } from "../index.js";
10
+ } from "../createWebSocketPeer.js";
11
11
  import { AnyWebSocket } from "../types.js";
12
12
 
13
13
  function setup(opts: Partial<CreateWebSocketPeerOpts> = {}) {
@@ -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
 
7
7
  describe("WebSocket Peer Integration", () => {
@@ -86,7 +86,6 @@ describe("WebSocket Peer Integration", () => {
86
86
 
87
87
  // Wait for sync
88
88
  await map.core.waitForSync();
89
- console.log("synced");
90
89
 
91
90
  // Verify data reached the server
92
91
  const serverNode = server.localNode;
@@ -1,7 +1,7 @@
1
1
  import { createServer } from "http";
2
2
  import { ControlledAgent, LocalNode, WasmCrypto } from "cojson";
3
3
  import { WebSocket, WebSocketServer } from "ws";
4
- import { createWebSocketPeer } from "../index";
4
+ import { createWebSocketPeer } from "../createWebSocketPeer";
5
5
 
6
6
  export const startSyncServer = async (port?: number) => {
7
7
  const crypto = await WasmCrypto.create();
@@ -0,0 +1,27 @@
1
+ export function waitFor(callback: () => boolean | void) {
2
+ return new Promise<void>((resolve, reject) => {
3
+ const checkPassed = () => {
4
+ try {
5
+ return { ok: callback(), error: null };
6
+ } catch (error) {
7
+ return { ok: false, error };
8
+ }
9
+ };
10
+
11
+ let retries = 0;
12
+
13
+ const interval = setInterval(() => {
14
+ const { ok, error } = checkPassed();
15
+
16
+ if (ok !== false) {
17
+ clearInterval(interval);
18
+ resolve();
19
+ }
20
+
21
+ if (++retries > 10) {
22
+ clearInterval(interval);
23
+ reject(error);
24
+ }
25
+ }, 100);
26
+ });
27
+ }