@dxos/messaging 0.1.56-main.f3d4052 → 0.1.56-next.71eb10c
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 +374 -120
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +376 -122
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +3 -0
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/messenger.test.ts +2 -3
- package/src/messenger.ts +1 -3
- package/src/signal-client/signal-client.ts +4 -5
- package/src/signal-client/signal-rpc-client.ts +1 -1
- package/src/signal-manager/memory-signal-manager.ts +53 -6
- package/src/signal-manager/websocket-signal-manager.ts +1 -2
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import invariant from 'tiny-invariant';
|
|
6
|
-
|
|
7
5
|
import { DeferredTask, Event, Trigger, asyncTimeout, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';
|
|
8
6
|
import { Any, Stream } from '@dxos/codec-protobuf';
|
|
9
7
|
import { Context, cancelWithContext } from '@dxos/context';
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
10
9
|
import { PublicKey } from '@dxos/keys';
|
|
11
10
|
import { log } from '@dxos/log';
|
|
12
11
|
import { trace } from '@dxos/protocols';
|
|
@@ -264,10 +263,10 @@ export class SignalClient implements SignalMethods {
|
|
|
264
263
|
|
|
265
264
|
// Create new context for each connection.
|
|
266
265
|
this._connectionCtx = this._ctx!.derive();
|
|
267
|
-
this._connectionCtx.onDispose(() => {
|
|
266
|
+
this._connectionCtx.onDispose(async () => {
|
|
268
267
|
log('connection context disposed');
|
|
269
|
-
Array.from(this._swarmStreams.values()).
|
|
270
|
-
Array.from(this._messageStreams.values()).
|
|
268
|
+
await Promise.all(Array.from(this._swarmStreams.values()).map((stream) => stream.close()));
|
|
269
|
+
await Promise.all(Array.from(this._messageStreams.values()).map((stream) => stream.close()));
|
|
271
270
|
this._swarmStreams.clear();
|
|
272
271
|
this._messageStreams.clear();
|
|
273
272
|
});
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import WebSocket from 'isomorphic-ws';
|
|
6
|
-
import invariant from 'tiny-invariant';
|
|
7
6
|
|
|
8
7
|
import { Trigger } from '@dxos/async';
|
|
9
8
|
import { Any, Stream } from '@dxos/codec-protobuf';
|
|
9
|
+
import { invariant } from '@dxos/invariant';
|
|
10
10
|
import { PublicKey } from '@dxos/keys';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
import { schema, trace } from '@dxos/protocols';
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
import { Event } from '@dxos/async';
|
|
5
|
+
import { Event, Trigger } from '@dxos/async';
|
|
8
6
|
import { Any } from '@dxos/codec-protobuf';
|
|
9
7
|
import { Context } from '@dxos/context';
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
10
9
|
import { PublicKey } from '@dxos/keys';
|
|
11
10
|
import { log } from '@dxos/log';
|
|
11
|
+
import { schema } from '@dxos/protocols';
|
|
12
12
|
import { SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
13
13
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
14
14
|
|
|
@@ -56,6 +56,9 @@ export class MemorySignalManager implements SignalManager {
|
|
|
56
56
|
|
|
57
57
|
private _ctx!: Context;
|
|
58
58
|
|
|
59
|
+
// TODO(dmaretskyi): Replace with callback.
|
|
60
|
+
private readonly _freezeTrigger = new Trigger().wake();
|
|
61
|
+
|
|
59
62
|
// prettier-ignore
|
|
60
63
|
constructor(
|
|
61
64
|
private readonly _context: MemorySignalManagerContext
|
|
@@ -154,16 +157,39 @@ export class MemorySignalManager implements SignalManager {
|
|
|
154
157
|
}
|
|
155
158
|
|
|
156
159
|
async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {
|
|
160
|
+
log('send message', { author, recipient, ...dec(payload) });
|
|
161
|
+
|
|
157
162
|
invariant(recipient);
|
|
158
163
|
invariant(!this._ctx.disposed, 'Closed');
|
|
159
|
-
|
|
164
|
+
|
|
165
|
+
await this._freezeTrigger.wait();
|
|
166
|
+
|
|
167
|
+
const remote = this._context.connections.get(recipient);
|
|
168
|
+
if (!remote) {
|
|
160
169
|
log.warn('recipient is not subscribed for messages', { author, recipient });
|
|
161
170
|
return;
|
|
162
171
|
}
|
|
163
172
|
|
|
164
|
-
if (
|
|
165
|
-
|
|
173
|
+
if (remote._ctx.disposed) {
|
|
174
|
+
log.warn('recipient is disposed', { author, recipient });
|
|
175
|
+
return;
|
|
166
176
|
}
|
|
177
|
+
|
|
178
|
+
remote._freezeTrigger
|
|
179
|
+
.wait()
|
|
180
|
+
.then(() => {
|
|
181
|
+
if (remote._ctx.disposed) {
|
|
182
|
+
log.warn('recipient is disposed', { author, recipient });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
log('receive message', { author, recipient, ...dec(payload) });
|
|
187
|
+
|
|
188
|
+
remote.onMessage.emit({ author, recipient, payload });
|
|
189
|
+
})
|
|
190
|
+
.catch((err) => {
|
|
191
|
+
log.error('error while waiting for freeze', { err });
|
|
192
|
+
});
|
|
167
193
|
}
|
|
168
194
|
|
|
169
195
|
async subscribeMessages(peerId: PublicKey) {
|
|
@@ -175,4 +201,25 @@ export class MemorySignalManager implements SignalManager {
|
|
|
175
201
|
log('unsubscribing', { peerId });
|
|
176
202
|
this._context.connections.delete(peerId);
|
|
177
203
|
}
|
|
204
|
+
|
|
205
|
+
freeze() {
|
|
206
|
+
this._freezeTrigger.reset();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
unfreeze() {
|
|
210
|
+
this._freezeTrigger.wake();
|
|
211
|
+
}
|
|
178
212
|
}
|
|
213
|
+
const dec = (payload: Any) => {
|
|
214
|
+
if (!payload.type_url.endsWith('ReliablePayload')) {
|
|
215
|
+
return {};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const relPayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload').decode(payload.value);
|
|
219
|
+
|
|
220
|
+
if (typeof relPayload?.payload?.data === 'object') {
|
|
221
|
+
return { payload: Object.keys(relPayload?.payload?.data)[0], sessionId: relPayload?.payload?.sessionId };
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return {};
|
|
225
|
+
};
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import invariant from 'tiny-invariant';
|
|
6
|
-
|
|
7
5
|
import { Event, synchronized } from '@dxos/async';
|
|
8
6
|
import { Any } from '@dxos/codec-protobuf';
|
|
9
7
|
import { Context } from '@dxos/context';
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
10
9
|
import { PublicKey } from '@dxos/keys';
|
|
11
10
|
import { log } from '@dxos/log';
|
|
12
11
|
import { trace } from '@dxos/protocols';
|