cojson-transport-ws 0.7.22 → 0.7.26
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/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +15 -0
- package/dist/index.js +50 -42
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
- package/src/index.ts +64 -77
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> cojson-transport-ws@0.7.
|
|
2
|
+
> cojson-transport-ws@0.7.23 build /Users/anselm/jazz/jazz/packages/cojson-transport-ws
|
|
3
3
|
> npm run lint && rm -rf ./dist && tsc --sourceMap --outDir dist
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> cojson-transport-ws@0.7.
|
|
6
|
+
> cojson-transport-ws@0.7.23 lint
|
|
7
7
|
> eslint . --ext ts,tsx
|
|
8
8
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# cojson-transport-nodejs-ws
|
|
2
2
|
|
|
3
|
+
## 0.7.26
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Remove Effect from jazz/cojson internals
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- cojson@0.7.26
|
|
10
|
+
|
|
11
|
+
## 0.7.23
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies
|
|
16
|
+
- cojson@0.7.23
|
|
17
|
+
|
|
3
18
|
## 0.7.22
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1,46 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Stream, Queue, Effect, Console } from "effect";
|
|
1
|
+
import { cojsonInternals } from "cojson";
|
|
3
2
|
const g = globalThis;
|
|
4
|
-
export function createWebSocketPeer(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
message: `${event.code}: ${event.reason}`,
|
|
11
|
-
})), Stream.fromEffect);
|
|
12
|
-
const isSyncMessage = (msg) => {
|
|
13
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
-
if (msg?.type === "ping") {
|
|
15
|
-
const ping = msg;
|
|
16
|
-
g.jazzPings || (g.jazzPings = []);
|
|
17
|
-
g.jazzPings.push({
|
|
18
|
-
received: Date.now(),
|
|
19
|
-
sent: ping.time,
|
|
20
|
-
dc: ping.dc,
|
|
21
|
-
});
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
return true;
|
|
25
|
-
};
|
|
26
|
-
yield* Effect.forkDaemon(Effect.gen(function* () {
|
|
27
|
-
yield* once(ws, "open");
|
|
28
|
-
yield* Queue.take(outgoing).pipe(Effect.andThen((message) => ws.send(JSON.stringify(message))), Effect.forever);
|
|
29
|
-
}));
|
|
30
|
-
const messages = Stream.fromEventListener(ws_, "message").pipe(Stream.timeoutFail(() => new PingTimeoutError(), "10 seconds"), Stream.tapError((_e) => Console.warn("Ping timeout").pipe(Effect.andThen(Effect.try(() => ws.close())), Effect.catchAll((e) => Console.error("Error while trying to close ws on ping timeout", e)))), Stream.mergeLeft(closed), Stream.map((_) => JSON.parse(_.data)), Stream.filter(isSyncMessage), Stream.buffer({ capacity: "unbounded" }), Stream.onDone(() => Queue.shutdown(outgoing)));
|
|
31
|
-
return {
|
|
32
|
-
id: options.id,
|
|
33
|
-
incoming: messages,
|
|
34
|
-
outgoing,
|
|
35
|
-
role: options.role,
|
|
36
|
-
};
|
|
3
|
+
export function createWebSocketPeer({ id, websocket, role, }) {
|
|
4
|
+
const incoming = new cojsonInternals.Channel();
|
|
5
|
+
websocket.addEventListener("close", function handleClose() {
|
|
6
|
+
incoming
|
|
7
|
+
.push("Disconnected")
|
|
8
|
+
.catch((e) => console.error("Error while pushing disconnect msg", e));
|
|
37
9
|
});
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
10
|
+
let pingTimeout = null;
|
|
11
|
+
websocket.addEventListener("message", function handleIncomingMsg(event) {
|
|
12
|
+
const msg = JSON.parse(event.data);
|
|
13
|
+
pingTimeout && clearTimeout(pingTimeout);
|
|
14
|
+
if (msg?.type === "ping") {
|
|
15
|
+
const ping = msg;
|
|
16
|
+
g.jazzPings || (g.jazzPings = []);
|
|
17
|
+
g.jazzPings.push({
|
|
18
|
+
received: Date.now(),
|
|
19
|
+
sent: ping.time,
|
|
20
|
+
dc: ping.dc,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
incoming
|
|
25
|
+
.push(msg)
|
|
26
|
+
.catch((e) => console.error("Error while pushing incoming msg", e));
|
|
27
|
+
}
|
|
28
|
+
pingTimeout = setTimeout(() => {
|
|
29
|
+
incoming
|
|
30
|
+
.push("PingTimeout")
|
|
31
|
+
.catch((e) => console.error("Error while pushing ping timeout", e));
|
|
32
|
+
}, 10000);
|
|
33
|
+
});
|
|
34
|
+
const websocketOpen = new Promise((resolve) => {
|
|
35
|
+
websocket.addEventListener("open", resolve, { once: true });
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
id,
|
|
39
|
+
incoming,
|
|
40
|
+
outgoing: {
|
|
41
|
+
async push(msg) {
|
|
42
|
+
await websocketOpen;
|
|
43
|
+
websocket.send(JSON.stringify(msg));
|
|
44
|
+
},
|
|
45
|
+
close() {
|
|
46
|
+
if (websocket.readyState === 1) {
|
|
47
|
+
websocket.close();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
role,
|
|
43
52
|
};
|
|
44
|
-
|
|
45
|
-
});
|
|
53
|
+
}
|
|
46
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,eAAe,EAAE,MAAM,QAAQ,CAAC;AA2BjG,MAAM,CAAC,GAMH,UAAU,CAAC;AAEf,MAAM,UAAU,mBAAmB,CAAC,EAChC,EAAE,EACF,SAAS,EACT,IAAI,GAKP;IACG,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,EAEzC,CAAC;IAEJ,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,WAAW;QACpD,QAAQ;aACH,IAAI,CAAC,cAAc,CAAC;aACpB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC,CAAC,CACzD,CAAC;IACV,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,GAAyC,IAAI,CAAC;IAE7D,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,iBAAiB,CAAC,KAAK;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;QAC7C,WAAW,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,GAAG,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,GAAc,CAAC;YAC5B,CAAC,CAAC,SAAS,KAAX,CAAC,CAAC,SAAS,GAAK,EAAE,EAAC;YACnB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;gBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;aACd,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,QAAQ;iBACH,IAAI,CAAC,GAAG,CAAC;iBACT,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC,CACvD,CAAC;QACV,CAAC;QACD,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,QAAQ;iBACH,IAAI,CAAC,aAAa,CAAC;iBACnB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC,CACvD,CAAC;QACV,CAAC,EAAE,KAAM,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAChD,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,EAAE;QACF,QAAQ;QACR,QAAQ,EAAE;YACN,KAAK,CAAC,IAAI,CAAC,GAAG;gBACV,MAAM,aAAa,CAAC;gBACpB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,KAAK;gBACD,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;oBAC7B,SAAS,CAAC,KAAK,EAAE,CAAC;gBACtB,CAAC;YACL,CAAC;SACJ;QACD,IAAI;KACP,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cojson-transport-ws",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.26",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "src/index.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"effect": "^3.5.2",
|
|
10
9
|
"typescript": "^5.1.6",
|
|
11
|
-
"cojson": "0.7.
|
|
10
|
+
"cojson": "0.7.26"
|
|
12
11
|
},
|
|
13
12
|
"devDependencies": {
|
|
14
13
|
"@types/ws": "^8.5.5"
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { DisconnectedError, Peer, PingTimeoutError, SyncMessage } from "cojson";
|
|
2
|
-
import { Stream, Queue, Effect, Console } from "effect";
|
|
1
|
+
import { DisconnectedError, Peer, PingTimeoutError, SyncMessage, cojsonInternals } from "cojson";
|
|
3
2
|
|
|
4
3
|
interface WebsocketEvents {
|
|
5
4
|
close: { code: number; reason: string };
|
|
@@ -15,6 +14,7 @@ interface AnyWebSocket {
|
|
|
15
14
|
addEventListener<K extends keyof WebsocketEvents>(
|
|
16
15
|
type: K,
|
|
17
16
|
listener: (event: WebsocketEvents[K]) => void,
|
|
17
|
+
options?: { once: boolean },
|
|
18
18
|
): void;
|
|
19
19
|
removeEventListener<K extends keyof WebsocketEvents>(
|
|
20
20
|
type: K,
|
|
@@ -22,6 +22,7 @@ interface AnyWebSocket {
|
|
|
22
22
|
): void;
|
|
23
23
|
close(): void;
|
|
24
24
|
send(data: string): void;
|
|
25
|
+
readyState: number;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
const g: typeof globalThis & {
|
|
@@ -32,88 +33,74 @@ const g: typeof globalThis & {
|
|
|
32
33
|
}[];
|
|
33
34
|
} = globalThis;
|
|
34
35
|
|
|
35
|
-
export function createWebSocketPeer(
|
|
36
|
+
export function createWebSocketPeer({
|
|
37
|
+
id,
|
|
38
|
+
websocket,
|
|
39
|
+
role,
|
|
40
|
+
}: {
|
|
36
41
|
id: string;
|
|
37
42
|
websocket: AnyWebSocket;
|
|
38
43
|
role: Peer["role"];
|
|
39
|
-
}):
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
}): Peer {
|
|
45
|
+
const incoming = new cojsonInternals.Channel<
|
|
46
|
+
SyncMessage | DisconnectedError | PingTimeoutError
|
|
47
|
+
>();
|
|
43
48
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
(
|
|
49
|
-
new DisconnectedError({
|
|
50
|
-
message: `${event.code}: ${event.reason}`,
|
|
51
|
-
}),
|
|
52
|
-
),
|
|
53
|
-
Stream.fromEffect,
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const isSyncMessage = (msg: unknown): msg is SyncMessage => {
|
|
57
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
58
|
-
if ((msg as any)?.type === "ping") {
|
|
59
|
-
const ping = msg as PingMsg;
|
|
60
|
-
g.jazzPings ||= [];
|
|
61
|
-
g.jazzPings.push({
|
|
62
|
-
received: Date.now(),
|
|
63
|
-
sent: ping.time,
|
|
64
|
-
dc: ping.dc,
|
|
65
|
-
});
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
return true;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
yield* Effect.forkDaemon(Effect.gen(function* () {
|
|
72
|
-
yield* once(ws, "open");
|
|
73
|
-
yield* Queue.take(outgoing).pipe(
|
|
74
|
-
Effect.andThen((message) => ws.send(JSON.stringify(message))),
|
|
75
|
-
Effect.forever,
|
|
49
|
+
websocket.addEventListener("close", function handleClose() {
|
|
50
|
+
incoming
|
|
51
|
+
.push("Disconnected")
|
|
52
|
+
.catch((e) =>
|
|
53
|
+
console.error("Error while pushing disconnect msg", e),
|
|
76
54
|
);
|
|
77
|
-
|
|
55
|
+
});
|
|
78
56
|
|
|
79
|
-
|
|
80
|
-
const messages = Stream.fromEventListener<E>(ws_, "message").pipe(
|
|
81
|
-
Stream.timeoutFail(() => new PingTimeoutError(), "10 seconds"),
|
|
82
|
-
Stream.tapError((_e) =>
|
|
83
|
-
Console.warn("Ping timeout").pipe(
|
|
84
|
-
Effect.andThen(Effect.try(() => ws.close())),
|
|
85
|
-
Effect.catchAll((e) =>
|
|
86
|
-
Console.error(
|
|
87
|
-
"Error while trying to close ws on ping timeout",
|
|
88
|
-
e,
|
|
89
|
-
),
|
|
90
|
-
),
|
|
91
|
-
),
|
|
92
|
-
),
|
|
93
|
-
Stream.mergeLeft(closed),
|
|
94
|
-
Stream.map((_) => JSON.parse(_.data as string)),
|
|
95
|
-
Stream.filter(isSyncMessage),
|
|
96
|
-
Stream.buffer({ capacity: "unbounded" }),
|
|
97
|
-
Stream.onDone(() => Queue.shutdown(outgoing)),
|
|
98
|
-
);
|
|
57
|
+
let pingTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
99
58
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
59
|
+
websocket.addEventListener("message", function handleIncomingMsg(event) {
|
|
60
|
+
const msg = JSON.parse(event.data as string);
|
|
61
|
+
pingTimeout && clearTimeout(pingTimeout);
|
|
62
|
+
if (msg?.type === "ping") {
|
|
63
|
+
const ping = msg as PingMsg;
|
|
64
|
+
g.jazzPings ||= [];
|
|
65
|
+
g.jazzPings.push({
|
|
66
|
+
received: Date.now(),
|
|
67
|
+
sent: ping.time,
|
|
68
|
+
dc: ping.dc,
|
|
69
|
+
});
|
|
70
|
+
} else {
|
|
71
|
+
incoming
|
|
72
|
+
.push(msg)
|
|
73
|
+
.catch((e) =>
|
|
74
|
+
console.error("Error while pushing incoming msg", e),
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
pingTimeout = setTimeout(() => {
|
|
78
|
+
incoming
|
|
79
|
+
.push("PingTimeout")
|
|
80
|
+
.catch((e) =>
|
|
81
|
+
console.error("Error while pushing ping timeout", e),
|
|
82
|
+
);
|
|
83
|
+
}, 10_000);
|
|
106
84
|
});
|
|
107
|
-
}
|
|
108
85
|
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
event: Event,
|
|
112
|
-
) =>
|
|
113
|
-
Effect.async<WebsocketEvents[Event]>((register) => {
|
|
114
|
-
const cb = (msg: WebsocketEvents[Event]) => {
|
|
115
|
-
ws.removeEventListener(event, cb);
|
|
116
|
-
register(Effect.succeed(msg));
|
|
117
|
-
};
|
|
118
|
-
ws.addEventListener(event, cb);
|
|
86
|
+
const websocketOpen = new Promise<void>((resolve) => {
|
|
87
|
+
websocket.addEventListener("open", resolve, { once: true });
|
|
119
88
|
});
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
id,
|
|
92
|
+
incoming,
|
|
93
|
+
outgoing: {
|
|
94
|
+
async push(msg) {
|
|
95
|
+
await websocketOpen;
|
|
96
|
+
websocket.send(JSON.stringify(msg));
|
|
97
|
+
},
|
|
98
|
+
close() {
|
|
99
|
+
if (websocket.readyState === 1) {
|
|
100
|
+
websocket.close();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
role,
|
|
105
|
+
};
|
|
106
|
+
}
|