@dxos/messaging 0.3.1-main.5e68e9d → 0.3.1-main.b9bb100
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/lib/browser/index.mjs +94 -114
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +92 -112
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/messenger.d.ts +4 -0
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +0 -3
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/messenger.ts +34 -1
- package/src/signal-manager/websocket-signal-manager.ts +7 -45
|
@@ -2,21 +2,19 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { Event,
|
|
5
|
+
import { Event, synchronized } from '@dxos/async';
|
|
6
6
|
import { Any } from '@dxos/codec-protobuf';
|
|
7
7
|
import { Context } from '@dxos/context';
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
9
|
import { PublicKey } from '@dxos/keys';
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
|
-
import {
|
|
11
|
+
import { trace } from '@dxos/protocols';
|
|
12
12
|
import { Runtime } from '@dxos/protocols/proto/dxos/config';
|
|
13
13
|
import { SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
14
14
|
|
|
15
15
|
import { SignalManager } from './signal-manager';
|
|
16
16
|
import { CommandTrace, SignalClient, SignalStatus } from '../signal-client';
|
|
17
17
|
|
|
18
|
-
const MAX_SERVER_FAILURES = 5;
|
|
19
|
-
const WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;
|
|
20
18
|
/**
|
|
21
19
|
* Manages connection to multiple Signal Servers over WebSocket
|
|
22
20
|
*/
|
|
@@ -26,7 +24,6 @@ export class WebsocketSignalManager implements SignalManager {
|
|
|
26
24
|
private _ctx!: Context;
|
|
27
25
|
private _opened = false;
|
|
28
26
|
|
|
29
|
-
readonly failureCount = new Map<string, number>();
|
|
30
27
|
readonly statusChanged = new Event<SignalStatus[]>();
|
|
31
28
|
readonly commandTrace = new Event<CommandTrace>();
|
|
32
29
|
readonly swarmEvent = new Event<{
|
|
@@ -56,7 +53,6 @@ export class WebsocketSignalManager implements SignalManager {
|
|
|
56
53
|
server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));
|
|
57
54
|
|
|
58
55
|
this._servers.set(host.server, server);
|
|
59
|
-
this.failureCount.set(host.server, 0);
|
|
60
56
|
server.commandTrace.on((trace) => this.commandTrace.emit(trace));
|
|
61
57
|
}
|
|
62
58
|
}
|
|
@@ -77,7 +73,6 @@ export class WebsocketSignalManager implements SignalManager {
|
|
|
77
73
|
log.trace('dxos.mesh.websocket-signal-manager.open', trace.end({ id: this._instanceId }));
|
|
78
74
|
}
|
|
79
75
|
|
|
80
|
-
@synchronized
|
|
81
76
|
async close() {
|
|
82
77
|
if (!this._opened) {
|
|
83
78
|
return;
|
|
@@ -89,18 +84,6 @@ export class WebsocketSignalManager implements SignalManager {
|
|
|
89
84
|
await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));
|
|
90
85
|
}
|
|
91
86
|
|
|
92
|
-
async restartServer(serverName: string) {
|
|
93
|
-
log('Restarting server', { serverName });
|
|
94
|
-
invariant(this._opened, 'server already closed');
|
|
95
|
-
|
|
96
|
-
const server = this._servers.get(serverName);
|
|
97
|
-
invariant(server, 'server not found');
|
|
98
|
-
|
|
99
|
-
await server.close();
|
|
100
|
-
await sleep(WSS_SIGNAL_SERVER_REBOOT_DELAY);
|
|
101
|
-
await server.open();
|
|
102
|
-
}
|
|
103
|
-
|
|
104
87
|
getStatus(): SignalStatus[] {
|
|
105
88
|
return Array.from(this._servers.values()).map((server) => server.getStatus());
|
|
106
89
|
}
|
|
@@ -129,33 +112,14 @@ export class WebsocketSignalManager implements SignalManager {
|
|
|
129
112
|
recipient: PublicKey;
|
|
130
113
|
payload: Any;
|
|
131
114
|
}): Promise<void> {
|
|
132
|
-
log(`Signal ${recipient
|
|
115
|
+
log(`Signal ${recipient}`);
|
|
133
116
|
invariant(this._opened, 'Closed');
|
|
134
117
|
|
|
135
|
-
void this._forEachServer(async (server
|
|
136
|
-
void server.sendMessage({ author, recipient, payload }).catch((err) =>
|
|
137
|
-
if (err instanceof RateLimitExceededError) {
|
|
138
|
-
log('WSS rate limit exceeded', { err });
|
|
139
|
-
} else {
|
|
140
|
-
log(`error sending to ${serverName}`, { err });
|
|
141
|
-
void this.checkServerFailure(serverName);
|
|
142
|
-
}
|
|
143
|
-
});
|
|
118
|
+
void this._forEachServer(async (server) => {
|
|
119
|
+
void server.sendMessage({ author, recipient, payload }).catch((err) => log(err));
|
|
144
120
|
});
|
|
145
121
|
}
|
|
146
122
|
|
|
147
|
-
@synchronized
|
|
148
|
-
async checkServerFailure(serverName: string) {
|
|
149
|
-
const failureCount = this.failureCount.get(serverName!) ?? 0;
|
|
150
|
-
if (failureCount > MAX_SERVER_FAILURES) {
|
|
151
|
-
log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`);
|
|
152
|
-
await this.restartServer(serverName!);
|
|
153
|
-
this.failureCount.set(serverName!, 0);
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
123
|
async subscribeMessages(peerId: PublicKey) {
|
|
160
124
|
log(`Subscribed for message stream peerId=${peerId}`);
|
|
161
125
|
invariant(this._opened, 'Closed');
|
|
@@ -176,9 +140,7 @@ export class WebsocketSignalManager implements SignalManager {
|
|
|
176
140
|
});
|
|
177
141
|
}
|
|
178
142
|
|
|
179
|
-
private async _forEachServer<ReturnType>(
|
|
180
|
-
|
|
181
|
-
): Promise<ReturnType[]> {
|
|
182
|
-
return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));
|
|
143
|
+
private async _forEachServer<ReturnType>(fn: (server: SignalClient) => Promise<ReturnType>): Promise<ReturnType[]> {
|
|
144
|
+
return Promise.all(Array.from(this._servers.values()).map(fn));
|
|
183
145
|
}
|
|
184
146
|
}
|