@dxos/rpc 0.4.7-main.33db07e → 0.4.7-main.340e96b
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 +37 -37
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +37 -37
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/rpc.d.ts +3 -0
- package/dist/types/src/rpc.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/rpc.ts +4 -0
|
@@ -95,7 +95,7 @@ var RpcPeer = class {
|
|
|
95
95
|
} catch (err) {
|
|
96
96
|
log.catch(err, void 0, {
|
|
97
97
|
F: __dxlog_file,
|
|
98
|
-
L:
|
|
98
|
+
L: 146,
|
|
99
99
|
S: this,
|
|
100
100
|
C: (f, a) => f(...a)
|
|
101
101
|
});
|
|
@@ -109,7 +109,7 @@ var RpcPeer = class {
|
|
|
109
109
|
}
|
|
110
110
|
log("sending open message", void 0, {
|
|
111
111
|
F: __dxlog_file,
|
|
112
|
-
L:
|
|
112
|
+
L: 158,
|
|
113
113
|
S: this,
|
|
114
114
|
C: (f, a) => f(...a)
|
|
115
115
|
});
|
|
@@ -124,7 +124,7 @@ var RpcPeer = class {
|
|
|
124
124
|
open: true
|
|
125
125
|
}).catch((err) => log.warn(err, void 0, {
|
|
126
126
|
F: __dxlog_file,
|
|
127
|
-
L:
|
|
127
|
+
L: 167,
|
|
128
128
|
S: this,
|
|
129
129
|
C: (f, a) => f(...a)
|
|
130
130
|
}));
|
|
@@ -140,7 +140,7 @@ var RpcPeer = class {
|
|
|
140
140
|
}
|
|
141
141
|
log("sending second open message", void 0, {
|
|
142
142
|
F: __dxlog_file,
|
|
143
|
-
L:
|
|
143
|
+
L: 182,
|
|
144
144
|
S: this,
|
|
145
145
|
C: (f, a) => f(...a)
|
|
146
146
|
});
|
|
@@ -170,7 +170,7 @@ var RpcPeer = class {
|
|
|
170
170
|
err
|
|
171
171
|
}, {
|
|
172
172
|
F: __dxlog_file,
|
|
173
|
-
L:
|
|
173
|
+
L: 204,
|
|
174
174
|
S: this,
|
|
175
175
|
C: (f, a) => f(...a)
|
|
176
176
|
});
|
|
@@ -178,7 +178,7 @@ var RpcPeer = class {
|
|
|
178
178
|
try {
|
|
179
179
|
log("closing waiting on bye", void 0, {
|
|
180
180
|
F: __dxlog_file,
|
|
181
|
-
L:
|
|
181
|
+
L: 207,
|
|
182
182
|
S: this,
|
|
183
183
|
C: (f, a) => f(...a)
|
|
184
184
|
});
|
|
@@ -190,7 +190,7 @@ var RpcPeer = class {
|
|
|
190
190
|
err
|
|
191
191
|
}, {
|
|
192
192
|
F: __dxlog_file,
|
|
193
|
-
L:
|
|
193
|
+
L: 210,
|
|
194
194
|
S: this,
|
|
195
195
|
C: (f, a) => f(...a)
|
|
196
196
|
});
|
|
@@ -234,7 +234,7 @@ var RpcPeer = class {
|
|
|
234
234
|
type: Object.keys(decoded)[0]
|
|
235
235
|
}, {
|
|
236
236
|
F: __dxlog_file,
|
|
237
|
-
L:
|
|
237
|
+
L: 254,
|
|
238
238
|
S: this,
|
|
239
239
|
C: (f, a) => f(...a)
|
|
240
240
|
});
|
|
@@ -242,7 +242,7 @@ var RpcPeer = class {
|
|
|
242
242
|
if (this._state !== "OPENED" && this._state !== "OPENING") {
|
|
243
243
|
log("received request while closed", void 0, {
|
|
244
244
|
F: __dxlog_file,
|
|
245
|
-
L:
|
|
245
|
+
L: 258,
|
|
246
246
|
S: this,
|
|
247
247
|
C: (f, a) => f(...a)
|
|
248
248
|
});
|
|
@@ -260,7 +260,7 @@ var RpcPeer = class {
|
|
|
260
260
|
method: req.method
|
|
261
261
|
}, {
|
|
262
262
|
F: __dxlog_file,
|
|
263
|
-
L:
|
|
263
|
+
L: 270,
|
|
264
264
|
S: this,
|
|
265
265
|
C: (f, a) => f(...a)
|
|
266
266
|
});
|
|
@@ -272,7 +272,7 @@ var RpcPeer = class {
|
|
|
272
272
|
close: response.close
|
|
273
273
|
}, {
|
|
274
274
|
F: __dxlog_file,
|
|
275
|
-
L:
|
|
275
|
+
L: 272,
|
|
276
276
|
S: this,
|
|
277
277
|
C: (f, a) => f(...a)
|
|
278
278
|
});
|
|
@@ -281,7 +281,7 @@ var RpcPeer = class {
|
|
|
281
281
|
}).catch((err) => {
|
|
282
282
|
log.warn("failed during close", err, {
|
|
283
283
|
F: __dxlog_file,
|
|
284
|
-
L:
|
|
284
|
+
L: 280,
|
|
285
285
|
S: this,
|
|
286
286
|
C: (f, a) => f(...a)
|
|
287
287
|
});
|
|
@@ -292,7 +292,7 @@ var RpcPeer = class {
|
|
|
292
292
|
method: req.method
|
|
293
293
|
}, {
|
|
294
294
|
F: __dxlog_file,
|
|
295
|
-
L:
|
|
295
|
+
L: 284,
|
|
296
296
|
S: this,
|
|
297
297
|
C: (f, a) => f(...a)
|
|
298
298
|
});
|
|
@@ -303,7 +303,7 @@ var RpcPeer = class {
|
|
|
303
303
|
error: response.error
|
|
304
304
|
}, {
|
|
305
305
|
F: __dxlog_file,
|
|
306
|
-
L:
|
|
306
|
+
L: 287,
|
|
307
307
|
S: this,
|
|
308
308
|
C: (f, a) => f(...a)
|
|
309
309
|
});
|
|
@@ -315,7 +315,7 @@ var RpcPeer = class {
|
|
|
315
315
|
if (this._state !== "OPENED") {
|
|
316
316
|
log("received response while closed", void 0, {
|
|
317
317
|
F: __dxlog_file,
|
|
318
|
-
L:
|
|
318
|
+
L: 296,
|
|
319
319
|
S: this,
|
|
320
320
|
C: (f, a) => f(...a)
|
|
321
321
|
});
|
|
@@ -324,7 +324,7 @@ var RpcPeer = class {
|
|
|
324
324
|
const responseId = decoded.response.id;
|
|
325
325
|
invariant(typeof responseId === "number", void 0, {
|
|
326
326
|
F: __dxlog_file,
|
|
327
|
-
L:
|
|
327
|
+
L: 301,
|
|
328
328
|
S: this,
|
|
329
329
|
A: [
|
|
330
330
|
"typeof responseId === 'number'",
|
|
@@ -336,7 +336,7 @@ var RpcPeer = class {
|
|
|
336
336
|
responseId
|
|
337
337
|
}, {
|
|
338
338
|
F: __dxlog_file,
|
|
339
|
-
L:
|
|
339
|
+
L: 303,
|
|
340
340
|
S: this,
|
|
341
341
|
C: (f, a) => f(...a)
|
|
342
342
|
});
|
|
@@ -350,7 +350,7 @@ var RpcPeer = class {
|
|
|
350
350
|
type_url: decoded.response.payload?.type_url
|
|
351
351
|
}, {
|
|
352
352
|
F: __dxlog_file,
|
|
353
|
-
L:
|
|
353
|
+
L: 313,
|
|
354
354
|
S: this,
|
|
355
355
|
C: (f, a) => f(...a)
|
|
356
356
|
});
|
|
@@ -358,7 +358,7 @@ var RpcPeer = class {
|
|
|
358
358
|
} else if (decoded.open) {
|
|
359
359
|
log("received open message", void 0, {
|
|
360
360
|
F: __dxlog_file,
|
|
361
|
-
L:
|
|
361
|
+
L: 316,
|
|
362
362
|
S: this,
|
|
363
363
|
C: (f, a) => f(...a)
|
|
364
364
|
});
|
|
@@ -371,7 +371,7 @@ var RpcPeer = class {
|
|
|
371
371
|
} else if (decoded.openAck) {
|
|
372
372
|
log("received openAck message", void 0, {
|
|
373
373
|
F: __dxlog_file,
|
|
374
|
-
L:
|
|
374
|
+
L: 323,
|
|
375
375
|
S: this,
|
|
376
376
|
C: (f, a) => f(...a)
|
|
377
377
|
});
|
|
@@ -383,7 +383,7 @@ var RpcPeer = class {
|
|
|
383
383
|
if (this._state !== "OPENED") {
|
|
384
384
|
log("received stream close while closed", void 0, {
|
|
385
385
|
F: __dxlog_file,
|
|
386
|
-
L:
|
|
386
|
+
L: 331,
|
|
387
387
|
S: this,
|
|
388
388
|
C: (f, a) => f(...a)
|
|
389
389
|
});
|
|
@@ -393,13 +393,13 @@ var RpcPeer = class {
|
|
|
393
393
|
id: decoded.streamClose.id
|
|
394
394
|
}, {
|
|
395
395
|
F: __dxlog_file,
|
|
396
|
-
L:
|
|
396
|
+
L: 335,
|
|
397
397
|
S: this,
|
|
398
398
|
C: (f, a) => f(...a)
|
|
399
399
|
});
|
|
400
400
|
invariant(typeof decoded.streamClose.id === "number", void 0, {
|
|
401
401
|
F: __dxlog_file,
|
|
402
|
-
L:
|
|
402
|
+
L: 336,
|
|
403
403
|
S: this,
|
|
404
404
|
A: [
|
|
405
405
|
"typeof decoded.streamClose.id === 'number'",
|
|
@@ -412,7 +412,7 @@ var RpcPeer = class {
|
|
|
412
412
|
id: decoded.streamClose.id
|
|
413
413
|
}, {
|
|
414
414
|
F: __dxlog_file,
|
|
415
|
-
L:
|
|
415
|
+
L: 339,
|
|
416
416
|
S: this,
|
|
417
417
|
C: (f, a) => f(...a)
|
|
418
418
|
});
|
|
@@ -425,7 +425,7 @@ var RpcPeer = class {
|
|
|
425
425
|
if (this._state !== "CLOSING" && this._state !== "CLOSED") {
|
|
426
426
|
log("replying to bye", void 0, {
|
|
427
427
|
F: __dxlog_file,
|
|
428
|
-
L:
|
|
428
|
+
L: 349,
|
|
429
429
|
S: this,
|
|
430
430
|
C: (f, a) => f(...a)
|
|
431
431
|
});
|
|
@@ -441,7 +441,7 @@ var RpcPeer = class {
|
|
|
441
441
|
msg
|
|
442
442
|
}, {
|
|
443
443
|
F: __dxlog_file,
|
|
444
|
-
L:
|
|
444
|
+
L: 357,
|
|
445
445
|
S: this,
|
|
446
446
|
C: (f, a) => f(...a)
|
|
447
447
|
});
|
|
@@ -457,7 +457,7 @@ var RpcPeer = class {
|
|
|
457
457
|
method
|
|
458
458
|
}, {
|
|
459
459
|
F: __dxlog_file,
|
|
460
|
-
L:
|
|
460
|
+
L: 367,
|
|
461
461
|
S: this,
|
|
462
462
|
C: (f, a) => f(...a)
|
|
463
463
|
});
|
|
@@ -484,7 +484,7 @@ var RpcPeer = class {
|
|
|
484
484
|
response = await waiting;
|
|
485
485
|
invariant(response.id === id, void 0, {
|
|
486
486
|
F: __dxlog_file,
|
|
487
|
-
L:
|
|
487
|
+
L: 392,
|
|
488
488
|
S: this,
|
|
489
489
|
A: [
|
|
490
490
|
"response.id === id",
|
|
@@ -563,7 +563,7 @@ ${stack.getStack()}`;
|
|
|
563
563
|
}).catch((err) => {
|
|
564
564
|
log.catch(err, void 0, {
|
|
565
565
|
F: __dxlog_file,
|
|
566
|
-
L:
|
|
566
|
+
L: 465,
|
|
567
567
|
S: this,
|
|
568
568
|
C: (f, a) => f(...a)
|
|
569
569
|
});
|
|
@@ -576,7 +576,7 @@ ${stack.getStack()}`;
|
|
|
576
576
|
type: Object.keys(message)[0]
|
|
577
577
|
}, {
|
|
578
578
|
F: __dxlog_file,
|
|
579
|
-
L:
|
|
579
|
+
L: 472,
|
|
580
580
|
S: this,
|
|
581
581
|
C: (f, a) => f(...a)
|
|
582
582
|
});
|
|
@@ -588,7 +588,7 @@ ${stack.getStack()}`;
|
|
|
588
588
|
try {
|
|
589
589
|
invariant(typeof req.id === "number", void 0, {
|
|
590
590
|
F: __dxlog_file,
|
|
591
|
-
L:
|
|
591
|
+
L: 478,
|
|
592
592
|
S: this,
|
|
593
593
|
A: [
|
|
594
594
|
"typeof req.id === 'number'",
|
|
@@ -597,7 +597,7 @@ ${stack.getStack()}`;
|
|
|
597
597
|
});
|
|
598
598
|
invariant(req.payload, void 0, {
|
|
599
599
|
F: __dxlog_file,
|
|
600
|
-
L:
|
|
600
|
+
L: 479,
|
|
601
601
|
S: this,
|
|
602
602
|
A: [
|
|
603
603
|
"req.payload",
|
|
@@ -606,7 +606,7 @@ ${stack.getStack()}`;
|
|
|
606
606
|
});
|
|
607
607
|
invariant(req.method, void 0, {
|
|
608
608
|
F: __dxlog_file,
|
|
609
|
-
L:
|
|
609
|
+
L: 480,
|
|
610
610
|
S: this,
|
|
611
611
|
A: [
|
|
612
612
|
"req.method",
|
|
@@ -629,7 +629,7 @@ ${stack.getStack()}`;
|
|
|
629
629
|
try {
|
|
630
630
|
invariant(this._params.streamHandler, "Requests with streaming responses are not supported.", {
|
|
631
631
|
F: __dxlog_file,
|
|
632
|
-
L:
|
|
632
|
+
L: 497,
|
|
633
633
|
S: this,
|
|
634
634
|
A: [
|
|
635
635
|
"this._params.streamHandler",
|
|
@@ -638,7 +638,7 @@ ${stack.getStack()}`;
|
|
|
638
638
|
});
|
|
639
639
|
invariant(typeof req.id === "number", void 0, {
|
|
640
640
|
F: __dxlog_file,
|
|
641
|
-
L:
|
|
641
|
+
L: 498,
|
|
642
642
|
S: this,
|
|
643
643
|
A: [
|
|
644
644
|
"typeof req.id === 'number'",
|
|
@@ -647,7 +647,7 @@ ${stack.getStack()}`;
|
|
|
647
647
|
});
|
|
648
648
|
invariant(req.payload, void 0, {
|
|
649
649
|
F: __dxlog_file,
|
|
650
|
-
L:
|
|
650
|
+
L: 499,
|
|
651
651
|
S: this,
|
|
652
652
|
A: [
|
|
653
653
|
"req.payload",
|
|
@@ -656,7 +656,7 @@ ${stack.getStack()}`;
|
|
|
656
656
|
});
|
|
657
657
|
invariant(req.method, void 0, {
|
|
658
658
|
F: __dxlog_file,
|
|
659
|
-
L:
|
|
659
|
+
L: 500,
|
|
660
660
|
S: this,
|
|
661
661
|
A: [
|
|
662
662
|
"req.method",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rpc.ts", "../../../src/errors.ts", "../../../src/service.ts", "../../../src/testing.ts", "../../../src/trace.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport { asyncTimeout, synchronized, Trigger } from '@dxos/async';\nimport { type Any, Stream, type RequestOptions } from '@dxos/codec-protobuf';\nimport { StackTrace } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { encodeError, RpcClosedError, RpcNotOpenError, schema } from '@dxos/protocols';\nimport { type Request, type Response, RpcMessage } from '@dxos/protocols/proto/dxos/rpc';\nimport { exponentialBackoffInterval } from '@dxos/util';\n\nimport { decodeRpcError } from './errors';\n\nconst DEFAULT_TIMEOUT = 3_000;\nconst BYE_SEND_TIMEOUT = 2_000;\n\ntype MaybePromise<T> = Promise<T> | T;\n\nexport interface RpcPeerOptions {\n port: RpcPort;\n timeout?: number;\n\n callHandler: (method: string, request: Any) => MaybePromise<Any>;\n streamHandler?: (method: string, request: Any) => Stream<Any>;\n\n /**\n * Do not require or send handshake messages.\n */\n noHandshake?: boolean;\n}\n\n/**\n * Interface for a transport-agnostic port to send/receive binary messages.\n */\nexport interface RpcPort {\n send: (msg: Uint8Array, timeout?: number) => MaybePromise<void>;\n subscribe: (cb: (msg: Uint8Array) => void) => (() => void) | void;\n}\n\nconst CLOSE_TIMEOUT = 3_000;\n\nexport type CloseOptions = {\n /**\n * Time to wait for the other side to confirm close.\n */\n timeout?: number;\n};\n\nclass PendingRpcRequest {\n constructor(\n public readonly resolve: (response: Response) => void,\n public readonly reject: (error?: Error) => void,\n public readonly stream: boolean,\n ) {}\n}\n\nconst RpcMessage = schema.getCodecForType('dxos.rpc.RpcMessage');\n\nenum RpcState {\n INITIAL = 'INITIAL',\n\n OPENING = 'OPENING',\n\n OPENED = 'OPENED',\n\n /**\n * Bye message sent, waiting for the other side to close.\n * Not possible to send requests.\n * All pending requests will be rejected.\n */\n CLOSING = 'CLOSING',\n\n /**\n * Connection fully closed.\n * The underlying transport can be disposed.\n */\n CLOSED = 'CLOSED',\n}\n\n/**\n * A remote procedure call peer.\n *\n * Provides a away to make RPC calls and get a response back as a promise.\n * Does not handle encoding/decoding and only works with byte buffers.\n * For type safe approach see `createRpcClient` and `createRpcServer`.\n *\n * Must be connected with another instance on the other side via `send`/`receive` methods.\n * Both sides must be opened before making any RPC calls.\n *\n * Errors inside the handler get serialized and sent to the other side.\n *\n * Inspired by JSON-RPC 2.0 https://www.jsonrpc.org/specification.\n */\nexport class RpcPeer {\n private readonly _params: RpcPeerOptions;\n\n private readonly _outgoingRequests = new Map<number, PendingRpcRequest>();\n private readonly _localStreams = new Map<number, Stream<any>>();\n private readonly _remoteOpenTrigger = new Trigger();\n\n /**\n * Triggered when the peer starts closing.\n */\n private readonly _closingTrigger = new Trigger();\n\n /**\n * Triggered when peer receives a bye message.\n */\n private readonly _byeTrigger = new Trigger();\n\n private _nextId = 0;\n private _state = RpcState.INITIAL;\n private _unsubscribeFromPort: (() => void) | undefined = undefined;\n private _clearOpenInterval: (() => void) | undefined = undefined;\n\n constructor(params: RpcPeerOptions) {\n this._params = {\n timeout: undefined,\n streamHandler: undefined,\n noHandshake: false,\n ...params,\n };\n }\n\n /**\n * Open the peer. Required before making any calls.\n *\n * Will block before the other peer calls `open`.\n */\n @synchronized\n async open() {\n if (this._state !== RpcState.INITIAL) {\n return;\n }\n\n this._unsubscribeFromPort = this._params.port.subscribe(async (msg) => {\n try {\n await this._receive(msg);\n } catch (err: any) {\n log.catch(err);\n }\n }) as any;\n\n this._state = RpcState.OPENING;\n\n if (this._params.noHandshake) {\n this._state = RpcState.OPENED;\n this._remoteOpenTrigger.wake();\n return;\n }\n\n log('sending open message');\n await this._sendMessage({ open: true });\n\n if (this._state !== RpcState.OPENING) {\n return;\n }\n\n // Retry sending.\n this._clearOpenInterval = exponentialBackoffInterval(() => {\n void this._sendMessage({ open: true }).catch((err) => log.warn(err));\n }, 50);\n\n await Promise.race([this._remoteOpenTrigger.wait(), this._closingTrigger.wait()]);\n\n this._clearOpenInterval?.();\n this._state = RpcState.OPENED;\n\n if (this._state !== RpcState.OPENED) {\n // Closed while opening.\n return; // TODO(dmaretskyi): Throw error?\n }\n\n // TODO(burdon): This seems error prone.\n // Send an \"open\" message in case the other peer has missed our first \"open\" message and is still waiting.\n log('sending second open message');\n await this._sendMessage({ openAck: true });\n }\n\n /**\n * Close the peer.\n * Stop taking or making requests.\n * Will wait for confirmation from the other side.\n * Any responses for RPC calls made before close will be delivered.\n */\n async close({ timeout = CLOSE_TIMEOUT }: CloseOptions = {}) {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n\n if (this._state === RpcState.OPENED && !this._params.noHandshake) {\n try {\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} }, BYE_SEND_TIMEOUT);\n } catch (err: any) {\n log('error closing peer, sending bye', { err });\n }\n try {\n log('closing waiting on bye');\n await this._byeTrigger.wait({ timeout });\n } catch (err: any) {\n log('error closing peer', { err });\n return;\n }\n }\n\n this._disposeAndClose();\n }\n\n /**\n * Dispose the connection without waiting for the other side.\n */\n async abort() {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n this._disposeAndClose();\n }\n\n private _abortRequests() {\n // Abort open\n this._clearOpenInterval?.();\n this._closingTrigger.wake();\n\n // Abort pending requests\n for (const req of this._outgoingRequests.values()) {\n req.reject(new RpcClosedError());\n }\n this._outgoingRequests.clear();\n }\n\n private _disposeAndClose() {\n this._unsubscribeFromPort?.();\n this._unsubscribeFromPort = undefined;\n this._clearOpenInterval?.();\n this._state = RpcState.CLOSED;\n }\n\n /**\n * Handle incoming message. Should be called as the result of other peer's `send` callback.\n */\n private async _receive(msg: Uint8Array): Promise<void> {\n const decoded = RpcMessage.decode(msg, { preserveAny: true });\n log('received message', { type: Object.keys(decoded)[0] });\n\n if (decoded.request) {\n if (this._state !== RpcState.OPENED && this._state !== RpcState.OPENING) {\n log('received request while closed');\n await this._sendMessage({\n response: {\n id: decoded.request.id,\n error: encodeError(new RpcClosedError()),\n },\n });\n return;\n }\n\n const req = decoded.request;\n if (req.stream) {\n log('stream request', { method: req.method });\n this._callStreamHandler(req, (response) => {\n log('sending stream response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n close: response.close,\n });\n\n void this._sendMessage({ response }).catch((err) => {\n log.warn('failed during close', err);\n });\n });\n } else {\n log('request', { method: req.method });\n const response = await this._callHandler(req);\n\n log('sending response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n });\n await this._sendMessage({ response });\n }\n } else if (decoded.response) {\n if (this._state !== RpcState.OPENED) {\n log('received response while closed');\n return; // Ignore when not open.\n }\n\n const responseId = decoded.response.id;\n invariant(typeof responseId === 'number');\n if (!this._outgoingRequests.has(responseId)) {\n log('received response with invalid id', { responseId });\n return; // Ignore requests with incorrect id.\n }\n\n const item = this._outgoingRequests.get(responseId)!;\n // Delete the request record if no more responses are expected.\n if (!item.stream) {\n this._outgoingRequests.delete(responseId);\n }\n\n log('response', { type_url: decoded.response.payload?.type_url });\n item.resolve(decoded.response);\n } else if (decoded.open) {\n log('received open message');\n if (this._params.noHandshake) {\n return;\n }\n\n await this._sendMessage({ openAck: true });\n } else if (decoded.openAck) {\n log('received openAck message');\n if (this._params.noHandshake) {\n return;\n }\n\n this._remoteOpenTrigger.wake();\n } else if (decoded.streamClose) {\n if (this._state !== RpcState.OPENED) {\n log('received stream close while closed');\n return; // Ignore when not open.\n }\n\n log('received stream close', { id: decoded.streamClose.id });\n invariant(typeof decoded.streamClose.id === 'number');\n const stream = this._localStreams.get(decoded.streamClose.id);\n if (!stream) {\n log('no local stream', { id: decoded.streamClose.id });\n return; // Ignore requests with incorrect id.\n }\n\n this._localStreams.delete(decoded.streamClose.id);\n await stream.close();\n } else if (decoded.bye) {\n this._byeTrigger.wake();\n // If we haven't already started closing, close now.\n if (this._state !== RpcState.CLOSING && this._state !== RpcState.CLOSED) {\n log('replying to bye');\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} });\n\n this._abortRequests();\n this._disposeAndClose();\n }\n } else {\n log.error('received malformed message', { msg });\n throw new Error('Malformed message.');\n }\n }\n\n /**\n * Make RPC call. Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n async call(method: string, request: Any, options?: RequestOptions): Promise<Any> {\n log('calling', { method });\n throwIfNotOpen(this._state);\n\n let response: Response;\n try {\n // Set-up response listener.\n const id = this._nextId++;\n const responseReceived = new Promise<Response>((resolve, reject) => {\n this._outgoingRequests.set(id, new PendingRpcRequest(resolve, reject, false));\n });\n\n // Send request call.\n const sending = this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: false,\n },\n });\n\n // Wait until send completes or throws an error (or response throws a timeout), the resume waiting.\n const waiting = asyncTimeout<any>(responseReceived, options?.timeout ?? this._params.timeout ?? DEFAULT_TIMEOUT);\n await Promise.race([sending, waiting]);\n response = await waiting;\n invariant(response.id === id);\n } catch (err) {\n if (err instanceof RpcClosedError) {\n // Rethrow the error here to have the correct stack-trace.\n const error = new RpcClosedError();\n error.stack += `\\n\\n info: RPC client was closed at:\\n${err.stack?.split('\\n').slice(1).join('\\n')}`;\n throw error;\n }\n\n throw err;\n }\n\n if (response.payload) {\n return response.payload;\n } else if (response.error) {\n throw decodeRpcError(response.error, method);\n } else {\n throw new Error('Malformed response.');\n }\n }\n\n /**\n * Make RPC call with a streaming response.\n * Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n callStream(method: string, request: Any, options?: RequestOptions): Stream<Any> {\n throwIfNotOpen(this._state);\n const id = this._nextId++;\n\n return new Stream(({ ready, next, close }) => {\n const onResponse = (response: Response) => {\n if (response.streamReady) {\n ready();\n } else if (response.close) {\n close();\n } else if (response.error) {\n // TODO(dmaretskyi): Stack trace might be lost because the stream producer function is called asynchronously.\n close(decodeRpcError(response.error, method));\n } else if (response.payload) {\n next(response.payload);\n } else {\n throw new Error('Malformed response.');\n }\n };\n\n const stack = new StackTrace();\n const closeStream = (err?: Error) => {\n if (!err) {\n close();\n } else {\n err.stack += `\\n\\nError happened in the stream at:\\n${stack.getStack()}`;\n close(err);\n }\n };\n\n this._outgoingRequests.set(id, new PendingRpcRequest(onResponse, closeStream, true));\n\n this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: true,\n },\n }).catch((err) => {\n close(err);\n });\n\n return () => {\n this._sendMessage({\n streamClose: { id },\n }).catch((err) => {\n log.catch(err);\n });\n };\n });\n }\n\n private async _sendMessage(message: RpcMessage, timeout?: number) {\n log('sending message', { type: Object.keys(message)[0] });\n await this._params.port.send(RpcMessage.encode(message, { preserveAny: true }), timeout);\n }\n\n private async _callHandler(req: Request): Promise<Response> {\n try {\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const response = await this._params.callHandler(req.method, req.payload);\n return {\n id: req.id,\n payload: response,\n };\n } catch (err) {\n return {\n id: req.id,\n error: encodeError(err),\n };\n }\n }\n\n private _callStreamHandler(req: Request, callback: (response: Response) => void) {\n try {\n invariant(this._params.streamHandler, 'Requests with streaming responses are not supported.');\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const responseStream = this._params.streamHandler(req.method, req.payload);\n responseStream.onReady(() => {\n callback({\n id: req.id,\n streamReady: true,\n });\n });\n\n responseStream.subscribe(\n (msg) => {\n callback({\n id: req.id,\n payload: msg,\n });\n },\n (error) => {\n if (error) {\n callback({\n id: req.id,\n error: encodeError(error),\n });\n } else {\n callback({\n id: req.id,\n close: true,\n });\n }\n },\n );\n\n this._localStreams.set(req.id, responseStream);\n } catch (err: any) {\n callback({\n id: req.id,\n error: encodeError(err),\n });\n }\n }\n}\n\nconst throwIfNotOpen = (state: RpcState) => {\n switch (state) {\n case RpcState.OPENED: {\n return;\n }\n case RpcState.INITIAL: {\n throw new RpcNotOpenError();\n }\n case RpcState.CLOSED: {\n throw new RpcClosedError();\n }\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { StackTrace } from '@dxos/debug';\nimport { decodeError } from '@dxos/protocols';\nimport { type Error as ErrorResponse } from '@dxos/protocols/proto/dxos/error';\n\nexport const decodeRpcError = (err: ErrorResponse, rpcMethod: string): Error =>\n decodeError(err, {\n appendStack: `\\n at RPC ${rpcMethod} \\n` + new StackTrace().getStack(1),\n });\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport {\n type EncodingOptions,\n type ServiceDescriptor,\n type ServiceHandler,\n type ServiceProvider,\n} from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\n\nimport { RpcPeer, type RpcPeerOptions } from './rpc';\n\n/**\n * Map of service definitions.\n */\n// TODO(burdon): Rename ServiceMap.\nexport type ServiceBundle<Services> = { [Key in keyof Services]: ServiceDescriptor<Services[Key]> };\n\nexport type ServiceHandlers<Services> = { [ServiceName in keyof Services]: ServiceProvider<Services[ServiceName]> };\n\nexport type ServiceTypesOf<Bundle extends ServiceBundle<any>> =\n Bundle extends ServiceBundle<infer Services> ? Services : never;\n\n/**\n * Groups multiple services together to be served by a single RPC peer.\n */\nexport const createServiceBundle = <Service>(services: ServiceBundle<Service>): ServiceBundle<Service> => services;\n\n/**\n * Type-safe RPC peer.\n */\nexport class ProtoRpcPeer<Service> {\n constructor(\n public readonly rpc: Service,\n private readonly _peer: RpcPeer,\n ) {}\n\n async open() {\n await this._peer.open();\n }\n\n async close() {\n await this._peer.close();\n }\n\n async abort() {\n await this._peer.abort();\n }\n}\n\nexport interface ProtoRpcPeerOptions<Client, Server> extends Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'> {\n /**\n * Services that are expected to be implemented by the counter-space.\n */\n // TODO(burdon): Rename proxy.\n requested?: ServiceBundle<Client>;\n\n /**\n * Services exposed to the counter-space.\n */\n // TODO(burdon): Rename service.\n exposed?: ServiceBundle<Server>;\n\n /**\n * Handlers for the exposed services\n */\n handlers?: ServiceHandlers<Server>;\n\n /**\n * Encoding options passed to the underlying proto codec.\n */\n encodingOptions?: EncodingOptions;\n}\n\n/**\n * Create type-safe RPC peer from a service bundle.\n * Can both handle and issue requests.\n */\n// TODO(burdon): Currently assumes that the proto service name is unique.\n// Support multiple instances services definitions (e.g., halo/space invitations).\nexport const createProtoRpcPeer = <Client = {}, Server = {}>({\n requested,\n exposed,\n handlers,\n encodingOptions,\n ...rest\n}: ProtoRpcPeerOptions<Client, Server>): ProtoRpcPeer<Client> => {\n // Create map of RPCs.\n const exposedRpcs: Record<string, ServiceHandler<any>> = {};\n if (exposed) {\n invariant(handlers);\n for (const serviceName of Object.keys(exposed) as (keyof Server)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = exposed[serviceName].serviceProto.fullName.slice(1);\n const serviceProvider = handlers[serviceName];\n exposedRpcs[serviceFqn] = exposed[serviceName].createServer(serviceProvider, encodingOptions);\n }\n }\n\n // Create peer.\n const peer = new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].callStream(methodName, request);\n },\n });\n\n const requestedRpcs: Client = {} as Client;\n if (requested) {\n for (const serviceName of Object.keys(requested) as (keyof Client)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = requested[serviceName].serviceProto.fullName.slice(1);\n\n requestedRpcs[serviceName] = requested[serviceName].createClient(\n {\n call: (method, req, options) => peer.call(`${serviceFqn}.${method}`, req, options),\n callStream: (method, req, options) => peer.callStream(`${serviceFqn}.${method}`, req, options),\n },\n encodingOptions,\n );\n }\n }\n\n return new ProtoRpcPeer(requestedRpcs, peer);\n};\n\nexport const parseMethodName = (method: string): [serviceName: string, methodName: string] => {\n const separator = method.lastIndexOf('.');\n const serviceName = method.slice(0, separator);\n const methodName = method.slice(separator + 1);\n if (serviceName.length === 0 || methodName.length === 0) {\n throw new Error(`Invalid method: ${method}`);\n }\n\n return [serviceName, methodName];\n};\n\n//\n// TODO(burdon): Remove deprecated (only bot factory).\n//\n\n/**\n * Create a type-safe RPC client.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcClient = <S>(\n serviceDef: ServiceDescriptor<S>,\n options: Omit<RpcPeerOptions, 'callHandler'>,\n): ProtoRpcPeer<S> => {\n const peer = new RpcPeer({\n ...options,\n callHandler: () => {\n throw new Error('Requests to client are not supported.');\n },\n });\n\n const client = serviceDef.createClient({\n call: peer.call.bind(peer),\n callStream: peer.callStream.bind(peer),\n });\n\n return new ProtoRpcPeer(client, peer);\n};\n\n/**\n * @deprecated\n */\nexport interface RpcServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n service: ServiceDescriptor<S>;\n handlers: S;\n}\n\n/**\n * Create a type-safe RPC server.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcServer = <S>({ service, handlers, ...rest }: RpcServerOptions<S>): RpcPeer => {\n const server = service.createServer(handlers);\n return new RpcPeer({\n ...rest,\n callHandler: server.call.bind(server),\n streamHandler: server.callStream.bind(server),\n });\n};\n\n/**\n * Create type-safe RPC client from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createBundledRpcClient = <S>(\n descriptors: ServiceBundle<S>,\n options: Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>,\n): ProtoRpcPeer<S> => {\n return createProtoRpcPeer({\n requested: descriptors,\n ...options,\n });\n};\n\n/**\n * @deprecated\n */\nexport interface RpcBundledServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n services: ServiceBundle<S>;\n handlers: S;\n}\n\n/**\n * Create type-safe RPC server from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\n// TODO(burdon): Support late-binding via providers.\nexport const createBundledRpcServer = <S>({ services, handlers, ...rest }: RpcBundledServerOptions<S>): RpcPeer => {\n const rpc: Record<string, ServiceHandler<any>> = {};\n for (const serviceName of Object.keys(services) as (keyof S)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = services[serviceName].serviceProto.fullName.slice(1);\n rpc[serviceFqn] = services[serviceName].createServer(handlers[serviceName] as any);\n }\n\n return new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].callStream(methodName, request);\n },\n });\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type RpcPort } from './rpc';\n\nexport type CreateLinkedPortsOptions = {\n delay?: number;\n};\n\n/**\n * Create bi-directionally linked ports.\n */\nexport const createLinkedPorts = ({ delay }: CreateLinkedPortsOptions = {}): [RpcPort, RpcPort] => {\n let port1Received: RpcPort['send'] | undefined;\n let port2Received: RpcPort['send'] | undefined;\n\n const send = (handler: RpcPort['send'] | undefined, msg: Uint8Array) => {\n if (delay) {\n setTimeout(() => handler?.(msg), delay);\n } else {\n void handler?.(msg);\n }\n };\n\n const port1: RpcPort = {\n send: (msg) => send(port2Received, msg),\n subscribe: (cb) => {\n port1Received = cb;\n },\n };\n\n const port2: RpcPort = {\n send: (msg) => send(port1Received, msg),\n subscribe: (cb) => {\n port2Received = cb;\n },\n };\n\n return [port1, port2];\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { MessageTrace } from '@dxos/protocols/proto/dxos/rpc';\n\nimport { type RpcPort } from './rpc';\n\nexport class PortTracer {\n readonly message = new Event<MessageTrace>();\n\n private readonly _port: RpcPort;\n\n constructor(private readonly _wrappedPort: RpcPort) {\n this._port = {\n send: (msg: Uint8Array) => {\n this.message.emit({\n direction: MessageTrace.Direction.OUTGOING,\n data: msg,\n });\n\n return this._wrappedPort.send(msg);\n },\n subscribe: (cb: (msg: Uint8Array) => void) => {\n return this._wrappedPort.subscribe((msg) => {\n this.message.emit({\n direction: MessageTrace.Direction.INCOMING,\n data: msg,\n });\n cb(msg);\n });\n },\n };\n }\n\n public get port() {\n return this._port;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport { asyncTimeout, synchronized, Trigger } from '@dxos/async';\nimport { type Any, Stream, type RequestOptions } from '@dxos/codec-protobuf';\nimport { StackTrace } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { encodeError, RpcClosedError, RpcNotOpenError, schema } from '@dxos/protocols';\nimport { type Request, type Response, RpcMessage } from '@dxos/protocols/proto/dxos/rpc';\nimport { exponentialBackoffInterval } from '@dxos/util';\n\nimport { decodeRpcError } from './errors';\n\nconst DEFAULT_TIMEOUT = 3_000;\nconst BYE_SEND_TIMEOUT = 2_000;\n\ntype MaybePromise<T> = Promise<T> | T;\n\nexport interface RpcPeerOptions {\n port: RpcPort;\n\n /**\n * Time to wait for a response to an RPC call.\n */\n timeout?: number;\n\n callHandler: (method: string, request: Any) => MaybePromise<Any>;\n streamHandler?: (method: string, request: Any) => Stream<Any>;\n\n /**\n * Do not require or send handshake messages.\n */\n noHandshake?: boolean;\n}\n\n/**\n * Interface for a transport-agnostic port to send/receive binary messages.\n */\nexport interface RpcPort {\n send: (msg: Uint8Array, timeout?: number) => MaybePromise<void>;\n subscribe: (cb: (msg: Uint8Array) => void) => (() => void) | void;\n}\n\nconst CLOSE_TIMEOUT = 3_000;\n\nexport type CloseOptions = {\n /**\n * Time to wait for the other side to confirm close.\n */\n timeout?: number;\n};\n\nclass PendingRpcRequest {\n constructor(\n public readonly resolve: (response: Response) => void,\n public readonly reject: (error?: Error) => void,\n public readonly stream: boolean,\n ) {}\n}\n\nconst RpcMessage = schema.getCodecForType('dxos.rpc.RpcMessage');\n\nenum RpcState {\n INITIAL = 'INITIAL',\n\n OPENING = 'OPENING',\n\n OPENED = 'OPENED',\n\n /**\n * Bye message sent, waiting for the other side to close.\n * Not possible to send requests.\n * All pending requests will be rejected.\n */\n CLOSING = 'CLOSING',\n\n /**\n * Connection fully closed.\n * The underlying transport can be disposed.\n */\n CLOSED = 'CLOSED',\n}\n\n/**\n * A remote procedure call peer.\n *\n * Provides a away to make RPC calls and get a response back as a promise.\n * Does not handle encoding/decoding and only works with byte buffers.\n * For type safe approach see `createRpcClient` and `createRpcServer`.\n *\n * Must be connected with another instance on the other side via `send`/`receive` methods.\n * Both sides must be opened before making any RPC calls.\n *\n * Errors inside the handler get serialized and sent to the other side.\n *\n * Inspired by JSON-RPC 2.0 https://www.jsonrpc.org/specification.\n */\nexport class RpcPeer {\n private readonly _params: RpcPeerOptions;\n\n private readonly _outgoingRequests = new Map<number, PendingRpcRequest>();\n private readonly _localStreams = new Map<number, Stream<any>>();\n private readonly _remoteOpenTrigger = new Trigger();\n\n /**\n * Triggered when the peer starts closing.\n */\n private readonly _closingTrigger = new Trigger();\n\n /**\n * Triggered when peer receives a bye message.\n */\n private readonly _byeTrigger = new Trigger();\n\n private _nextId = 0;\n private _state = RpcState.INITIAL;\n private _unsubscribeFromPort: (() => void) | undefined = undefined;\n private _clearOpenInterval: (() => void) | undefined = undefined;\n\n constructor(params: RpcPeerOptions) {\n this._params = {\n timeout: undefined,\n streamHandler: undefined,\n noHandshake: false,\n ...params,\n };\n }\n\n /**\n * Open the peer. Required before making any calls.\n *\n * Will block before the other peer calls `open`.\n */\n @synchronized\n async open() {\n if (this._state !== RpcState.INITIAL) {\n return;\n }\n\n this._unsubscribeFromPort = this._params.port.subscribe(async (msg) => {\n try {\n await this._receive(msg);\n } catch (err: any) {\n log.catch(err);\n }\n }) as any;\n\n this._state = RpcState.OPENING;\n\n if (this._params.noHandshake) {\n this._state = RpcState.OPENED;\n this._remoteOpenTrigger.wake();\n return;\n }\n\n log('sending open message');\n await this._sendMessage({ open: true });\n\n if (this._state !== RpcState.OPENING) {\n return;\n }\n\n // Retry sending.\n this._clearOpenInterval = exponentialBackoffInterval(() => {\n void this._sendMessage({ open: true }).catch((err) => log.warn(err));\n }, 50);\n\n await Promise.race([this._remoteOpenTrigger.wait(), this._closingTrigger.wait()]);\n\n this._clearOpenInterval?.();\n this._state = RpcState.OPENED;\n\n if (this._state !== RpcState.OPENED) {\n // Closed while opening.\n return; // TODO(dmaretskyi): Throw error?\n }\n\n // TODO(burdon): This seems error prone.\n // Send an \"open\" message in case the other peer has missed our first \"open\" message and is still waiting.\n log('sending second open message');\n await this._sendMessage({ openAck: true });\n }\n\n /**\n * Close the peer.\n * Stop taking or making requests.\n * Will wait for confirmation from the other side.\n * Any responses for RPC calls made before close will be delivered.\n */\n async close({ timeout = CLOSE_TIMEOUT }: CloseOptions = {}) {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n\n if (this._state === RpcState.OPENED && !this._params.noHandshake) {\n try {\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} }, BYE_SEND_TIMEOUT);\n } catch (err: any) {\n log('error closing peer, sending bye', { err });\n }\n try {\n log('closing waiting on bye');\n await this._byeTrigger.wait({ timeout });\n } catch (err: any) {\n log('error closing peer', { err });\n return;\n }\n }\n\n this._disposeAndClose();\n }\n\n /**\n * Dispose the connection without waiting for the other side.\n */\n async abort() {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n this._disposeAndClose();\n }\n\n private _abortRequests() {\n // Abort open\n this._clearOpenInterval?.();\n this._closingTrigger.wake();\n\n // Abort pending requests\n for (const req of this._outgoingRequests.values()) {\n req.reject(new RpcClosedError());\n }\n this._outgoingRequests.clear();\n }\n\n private _disposeAndClose() {\n this._unsubscribeFromPort?.();\n this._unsubscribeFromPort = undefined;\n this._clearOpenInterval?.();\n this._state = RpcState.CLOSED;\n }\n\n /**\n * Handle incoming message. Should be called as the result of other peer's `send` callback.\n */\n private async _receive(msg: Uint8Array): Promise<void> {\n const decoded = RpcMessage.decode(msg, { preserveAny: true });\n log('received message', { type: Object.keys(decoded)[0] });\n\n if (decoded.request) {\n if (this._state !== RpcState.OPENED && this._state !== RpcState.OPENING) {\n log('received request while closed');\n await this._sendMessage({\n response: {\n id: decoded.request.id,\n error: encodeError(new RpcClosedError()),\n },\n });\n return;\n }\n\n const req = decoded.request;\n if (req.stream) {\n log('stream request', { method: req.method });\n this._callStreamHandler(req, (response) => {\n log('sending stream response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n close: response.close,\n });\n\n void this._sendMessage({ response }).catch((err) => {\n log.warn('failed during close', err);\n });\n });\n } else {\n log('request', { method: req.method });\n const response = await this._callHandler(req);\n\n log('sending response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n });\n await this._sendMessage({ response });\n }\n } else if (decoded.response) {\n if (this._state !== RpcState.OPENED) {\n log('received response while closed');\n return; // Ignore when not open.\n }\n\n const responseId = decoded.response.id;\n invariant(typeof responseId === 'number');\n if (!this._outgoingRequests.has(responseId)) {\n log('received response with invalid id', { responseId });\n return; // Ignore requests with incorrect id.\n }\n\n const item = this._outgoingRequests.get(responseId)!;\n // Delete the request record if no more responses are expected.\n if (!item.stream) {\n this._outgoingRequests.delete(responseId);\n }\n\n log('response', { type_url: decoded.response.payload?.type_url });\n item.resolve(decoded.response);\n } else if (decoded.open) {\n log('received open message');\n if (this._params.noHandshake) {\n return;\n }\n\n await this._sendMessage({ openAck: true });\n } else if (decoded.openAck) {\n log('received openAck message');\n if (this._params.noHandshake) {\n return;\n }\n\n this._remoteOpenTrigger.wake();\n } else if (decoded.streamClose) {\n if (this._state !== RpcState.OPENED) {\n log('received stream close while closed');\n return; // Ignore when not open.\n }\n\n log('received stream close', { id: decoded.streamClose.id });\n invariant(typeof decoded.streamClose.id === 'number');\n const stream = this._localStreams.get(decoded.streamClose.id);\n if (!stream) {\n log('no local stream', { id: decoded.streamClose.id });\n return; // Ignore requests with incorrect id.\n }\n\n this._localStreams.delete(decoded.streamClose.id);\n await stream.close();\n } else if (decoded.bye) {\n this._byeTrigger.wake();\n // If we haven't already started closing, close now.\n if (this._state !== RpcState.CLOSING && this._state !== RpcState.CLOSED) {\n log('replying to bye');\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} });\n\n this._abortRequests();\n this._disposeAndClose();\n }\n } else {\n log.error('received malformed message', { msg });\n throw new Error('Malformed message.');\n }\n }\n\n /**\n * Make RPC call. Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n async call(method: string, request: Any, options?: RequestOptions): Promise<Any> {\n log('calling', { method });\n throwIfNotOpen(this._state);\n\n let response: Response;\n try {\n // Set-up response listener.\n const id = this._nextId++;\n const responseReceived = new Promise<Response>((resolve, reject) => {\n this._outgoingRequests.set(id, new PendingRpcRequest(resolve, reject, false));\n });\n\n // Send request call.\n const sending = this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: false,\n },\n });\n\n // Wait until send completes or throws an error (or response throws a timeout), the resume waiting.\n const waiting = asyncTimeout<any>(responseReceived, options?.timeout ?? this._params.timeout ?? DEFAULT_TIMEOUT);\n await Promise.race([sending, waiting]);\n response = await waiting;\n invariant(response.id === id);\n } catch (err) {\n if (err instanceof RpcClosedError) {\n // Rethrow the error here to have the correct stack-trace.\n const error = new RpcClosedError();\n error.stack += `\\n\\n info: RPC client was closed at:\\n${err.stack?.split('\\n').slice(1).join('\\n')}`;\n throw error;\n }\n\n throw err;\n }\n\n if (response.payload) {\n return response.payload;\n } else if (response.error) {\n throw decodeRpcError(response.error, method);\n } else {\n throw new Error('Malformed response.');\n }\n }\n\n /**\n * Make RPC call with a streaming response.\n * Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n callStream(method: string, request: Any, options?: RequestOptions): Stream<Any> {\n throwIfNotOpen(this._state);\n const id = this._nextId++;\n\n return new Stream(({ ready, next, close }) => {\n const onResponse = (response: Response) => {\n if (response.streamReady) {\n ready();\n } else if (response.close) {\n close();\n } else if (response.error) {\n // TODO(dmaretskyi): Stack trace might be lost because the stream producer function is called asynchronously.\n close(decodeRpcError(response.error, method));\n } else if (response.payload) {\n next(response.payload);\n } else {\n throw new Error('Malformed response.');\n }\n };\n\n const stack = new StackTrace();\n const closeStream = (err?: Error) => {\n if (!err) {\n close();\n } else {\n err.stack += `\\n\\nError happened in the stream at:\\n${stack.getStack()}`;\n close(err);\n }\n };\n\n this._outgoingRequests.set(id, new PendingRpcRequest(onResponse, closeStream, true));\n\n this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: true,\n },\n }).catch((err) => {\n close(err);\n });\n\n return () => {\n this._sendMessage({\n streamClose: { id },\n }).catch((err) => {\n log.catch(err);\n });\n };\n });\n }\n\n private async _sendMessage(message: RpcMessage, timeout?: number) {\n log('sending message', { type: Object.keys(message)[0] });\n await this._params.port.send(RpcMessage.encode(message, { preserveAny: true }), timeout);\n }\n\n private async _callHandler(req: Request): Promise<Response> {\n try {\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const response = await this._params.callHandler(req.method, req.payload);\n return {\n id: req.id,\n payload: response,\n };\n } catch (err) {\n return {\n id: req.id,\n error: encodeError(err),\n };\n }\n }\n\n private _callStreamHandler(req: Request, callback: (response: Response) => void) {\n try {\n invariant(this._params.streamHandler, 'Requests with streaming responses are not supported.');\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const responseStream = this._params.streamHandler(req.method, req.payload);\n responseStream.onReady(() => {\n callback({\n id: req.id,\n streamReady: true,\n });\n });\n\n responseStream.subscribe(\n (msg) => {\n callback({\n id: req.id,\n payload: msg,\n });\n },\n (error) => {\n if (error) {\n callback({\n id: req.id,\n error: encodeError(error),\n });\n } else {\n callback({\n id: req.id,\n close: true,\n });\n }\n },\n );\n\n this._localStreams.set(req.id, responseStream);\n } catch (err: any) {\n callback({\n id: req.id,\n error: encodeError(err),\n });\n }\n }\n}\n\nconst throwIfNotOpen = (state: RpcState) => {\n switch (state) {\n case RpcState.OPENED: {\n return;\n }\n case RpcState.INITIAL: {\n throw new RpcNotOpenError();\n }\n case RpcState.CLOSED: {\n throw new RpcClosedError();\n }\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { StackTrace } from '@dxos/debug';\nimport { decodeError } from '@dxos/protocols';\nimport { type Error as ErrorResponse } from '@dxos/protocols/proto/dxos/error';\n\nexport const decodeRpcError = (err: ErrorResponse, rpcMethod: string): Error =>\n decodeError(err, {\n appendStack: `\\n at RPC ${rpcMethod} \\n` + new StackTrace().getStack(1),\n });\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport {\n type EncodingOptions,\n type ServiceDescriptor,\n type ServiceHandler,\n type ServiceProvider,\n} from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\n\nimport { RpcPeer, type RpcPeerOptions } from './rpc';\n\n/**\n * Map of service definitions.\n */\n// TODO(burdon): Rename ServiceMap.\nexport type ServiceBundle<Services> = { [Key in keyof Services]: ServiceDescriptor<Services[Key]> };\n\nexport type ServiceHandlers<Services> = { [ServiceName in keyof Services]: ServiceProvider<Services[ServiceName]> };\n\nexport type ServiceTypesOf<Bundle extends ServiceBundle<any>> =\n Bundle extends ServiceBundle<infer Services> ? Services : never;\n\n/**\n * Groups multiple services together to be served by a single RPC peer.\n */\nexport const createServiceBundle = <Service>(services: ServiceBundle<Service>): ServiceBundle<Service> => services;\n\n/**\n * Type-safe RPC peer.\n */\nexport class ProtoRpcPeer<Service> {\n constructor(\n public readonly rpc: Service,\n private readonly _peer: RpcPeer,\n ) {}\n\n async open() {\n await this._peer.open();\n }\n\n async close() {\n await this._peer.close();\n }\n\n async abort() {\n await this._peer.abort();\n }\n}\n\nexport interface ProtoRpcPeerOptions<Client, Server> extends Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'> {\n /**\n * Services that are expected to be implemented by the counter-space.\n */\n // TODO(burdon): Rename proxy.\n requested?: ServiceBundle<Client>;\n\n /**\n * Services exposed to the counter-space.\n */\n // TODO(burdon): Rename service.\n exposed?: ServiceBundle<Server>;\n\n /**\n * Handlers for the exposed services\n */\n handlers?: ServiceHandlers<Server>;\n\n /**\n * Encoding options passed to the underlying proto codec.\n */\n encodingOptions?: EncodingOptions;\n}\n\n/**\n * Create type-safe RPC peer from a service bundle.\n * Can both handle and issue requests.\n */\n// TODO(burdon): Currently assumes that the proto service name is unique.\n// Support multiple instances services definitions (e.g., halo/space invitations).\nexport const createProtoRpcPeer = <Client = {}, Server = {}>({\n requested,\n exposed,\n handlers,\n encodingOptions,\n ...rest\n}: ProtoRpcPeerOptions<Client, Server>): ProtoRpcPeer<Client> => {\n // Create map of RPCs.\n const exposedRpcs: Record<string, ServiceHandler<any>> = {};\n if (exposed) {\n invariant(handlers);\n for (const serviceName of Object.keys(exposed) as (keyof Server)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = exposed[serviceName].serviceProto.fullName.slice(1);\n const serviceProvider = handlers[serviceName];\n exposedRpcs[serviceFqn] = exposed[serviceName].createServer(serviceProvider, encodingOptions);\n }\n }\n\n // Create peer.\n const peer = new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].callStream(methodName, request);\n },\n });\n\n const requestedRpcs: Client = {} as Client;\n if (requested) {\n for (const serviceName of Object.keys(requested) as (keyof Client)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = requested[serviceName].serviceProto.fullName.slice(1);\n\n requestedRpcs[serviceName] = requested[serviceName].createClient(\n {\n call: (method, req, options) => peer.call(`${serviceFqn}.${method}`, req, options),\n callStream: (method, req, options) => peer.callStream(`${serviceFqn}.${method}`, req, options),\n },\n encodingOptions,\n );\n }\n }\n\n return new ProtoRpcPeer(requestedRpcs, peer);\n};\n\nexport const parseMethodName = (method: string): [serviceName: string, methodName: string] => {\n const separator = method.lastIndexOf('.');\n const serviceName = method.slice(0, separator);\n const methodName = method.slice(separator + 1);\n if (serviceName.length === 0 || methodName.length === 0) {\n throw new Error(`Invalid method: ${method}`);\n }\n\n return [serviceName, methodName];\n};\n\n//\n// TODO(burdon): Remove deprecated (only bot factory).\n//\n\n/**\n * Create a type-safe RPC client.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcClient = <S>(\n serviceDef: ServiceDescriptor<S>,\n options: Omit<RpcPeerOptions, 'callHandler'>,\n): ProtoRpcPeer<S> => {\n const peer = new RpcPeer({\n ...options,\n callHandler: () => {\n throw new Error('Requests to client are not supported.');\n },\n });\n\n const client = serviceDef.createClient({\n call: peer.call.bind(peer),\n callStream: peer.callStream.bind(peer),\n });\n\n return new ProtoRpcPeer(client, peer);\n};\n\n/**\n * @deprecated\n */\nexport interface RpcServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n service: ServiceDescriptor<S>;\n handlers: S;\n}\n\n/**\n * Create a type-safe RPC server.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcServer = <S>({ service, handlers, ...rest }: RpcServerOptions<S>): RpcPeer => {\n const server = service.createServer(handlers);\n return new RpcPeer({\n ...rest,\n callHandler: server.call.bind(server),\n streamHandler: server.callStream.bind(server),\n });\n};\n\n/**\n * Create type-safe RPC client from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createBundledRpcClient = <S>(\n descriptors: ServiceBundle<S>,\n options: Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>,\n): ProtoRpcPeer<S> => {\n return createProtoRpcPeer({\n requested: descriptors,\n ...options,\n });\n};\n\n/**\n * @deprecated\n */\nexport interface RpcBundledServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n services: ServiceBundle<S>;\n handlers: S;\n}\n\n/**\n * Create type-safe RPC server from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\n// TODO(burdon): Support late-binding via providers.\nexport const createBundledRpcServer = <S>({ services, handlers, ...rest }: RpcBundledServerOptions<S>): RpcPeer => {\n const rpc: Record<string, ServiceHandler<any>> = {};\n for (const serviceName of Object.keys(services) as (keyof S)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = services[serviceName].serviceProto.fullName.slice(1);\n rpc[serviceFqn] = services[serviceName].createServer(handlers[serviceName] as any);\n }\n\n return new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].callStream(methodName, request);\n },\n });\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type RpcPort } from './rpc';\n\nexport type CreateLinkedPortsOptions = {\n delay?: number;\n};\n\n/**\n * Create bi-directionally linked ports.\n */\nexport const createLinkedPorts = ({ delay }: CreateLinkedPortsOptions = {}): [RpcPort, RpcPort] => {\n let port1Received: RpcPort['send'] | undefined;\n let port2Received: RpcPort['send'] | undefined;\n\n const send = (handler: RpcPort['send'] | undefined, msg: Uint8Array) => {\n if (delay) {\n setTimeout(() => handler?.(msg), delay);\n } else {\n void handler?.(msg);\n }\n };\n\n const port1: RpcPort = {\n send: (msg) => send(port2Received, msg),\n subscribe: (cb) => {\n port1Received = cb;\n },\n };\n\n const port2: RpcPort = {\n send: (msg) => send(port1Received, msg),\n subscribe: (cb) => {\n port2Received = cb;\n },\n };\n\n return [port1, port2];\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { MessageTrace } from '@dxos/protocols/proto/dxos/rpc';\n\nimport { type RpcPort } from './rpc';\n\nexport class PortTracer {\n readonly message = new Event<MessageTrace>();\n\n private readonly _port: RpcPort;\n\n constructor(private readonly _wrappedPort: RpcPort) {\n this._port = {\n send: (msg: Uint8Array) => {\n this.message.emit({\n direction: MessageTrace.Direction.OUTGOING,\n data: msg,\n });\n\n return this._wrappedPort.send(msg);\n },\n subscribe: (cb: (msg: Uint8Array) => void) => {\n return this._wrappedPort.subscribe((msg) => {\n this.message.emit({\n direction: MessageTrace.Direction.INCOMING,\n data: msg,\n });\n cb(msg);\n });\n },\n };\n }\n\n public get port() {\n return this._port;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["asyncTimeout", "synchronized", "Trigger", "Stream", "StackTrace", "invariant", "log", "encodeError", "RpcClosedError", "RpcNotOpenError", "schema", "exponentialBackoffInterval", "StackTrace", "decodeError", "decodeRpcError", "err", "rpcMethod", "decodeError", "appendStack", "StackTrace", "getStack", "DEFAULT_TIMEOUT", "BYE_SEND_TIMEOUT", "CLOSE_TIMEOUT", "PendingRpcRequest", "constructor", "resolve", "reject", "stream", "RpcMessage", "schema", "getCodecForType", "RpcState", "RpcPeer", "params", "_outgoingRequests", "Map", "_localStreams", "_remoteOpenTrigger", "Trigger", "_closingTrigger", "_byeTrigger", "_nextId", "_state", "_unsubscribeFromPort", "undefined", "_clearOpenInterval", "_params", "timeout", "streamHandler", "noHandshake", "open", "port", "subscribe", "msg", "_receive", "err", "log", "catch", "wake", "_sendMessage", "exponentialBackoffInterval", "warn", "Promise", "race", "wait", "openAck", "close", "_abortRequests", "bye", "_disposeAndClose", "abort", "req", "values", "RpcClosedError", "clear", "decoded", "decode", "preserveAny", "type", "Object", "keys", "request", "response", "id", "error", "encodeError", "method", "_callStreamHandler", "payload", "type_url", "_callHandler", "responseId", "invariant", "has", "item", "get", "delete", "streamClose", "Error", "call", "options", "throwIfNotOpen", "responseReceived", "set", "sending", "waiting", "asyncTimeout", "stack", "split", "slice", "join", "decodeRpcError", "callStream", "Stream", "ready", "next", "onResponse", "streamReady", "StackTrace", "closeStream", "getStack", "message", "send", "encode", "callHandler", "callback", "responseStream", "onReady", "synchronized", "state", "RpcNotOpenError", "invariant", "createServiceBundle", "services", "ProtoRpcPeer", "constructor", "rpc", "_peer", "open", "close", "abort", "createProtoRpcPeer", "requested", "exposed", "handlers", "encodingOptions", "rest", "exposedRpcs", "invariant", "serviceName", "Object", "keys", "serviceFqn", "serviceProto", "fullName", "slice", "serviceProvider", "createServer", "peer", "RpcPeer", "callHandler", "method", "request", "methodName", "parseMethodName", "Error", "call", "streamHandler", "callStream", "requestedRpcs", "createClient", "req", "options", "separator", "lastIndexOf", "length", "createRpcClient", "serviceDef", "client", "bind", "createRpcServer", "service", "server", "createBundledRpcClient", "descriptors", "createBundledRpcServer", "createLinkedPorts", "delay", "port1Received", "port2Received", "send", "handler", "msg", "setTimeout", "port1", "subscribe", "cb", "port2", "Event", "MessageTrace", "PortTracer", "constructor", "_wrappedPort", "message", "Event", "_port", "send", "msg", "emit", "direction", "MessageTrace", "Direction", "OUTGOING", "data", "subscribe", "cb", "INCOMING", "port"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"inject-globals:@inject-globals":{"bytes":384,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/errors.ts":{"bytes":1482,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/rpc.ts":{"bytes":
|
|
1
|
+
{"inputs":{"inject-globals:@inject-globals":{"bytes":384,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/errors.ts":{"bytes":1482,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/rpc.ts":{"bytes":59849,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/rpc/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/service.ts":{"bytes":22257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/core/mesh/rpc/src/rpc.ts","kind":"import-statement","original":"./rpc"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/testing.ts":{"bytes":2972,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/trace.ts":{"bytes":3543,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/rpc","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/index.ts":{"bytes":786,"imports":[{"path":"packages/core/mesh/rpc/src/rpc.ts","kind":"import-statement","original":"./rpc"},{"path":"packages/core/mesh/rpc/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/rpc/src/service.ts","kind":"import-statement","original":"./service"},{"path":"packages/core/mesh/rpc/src/testing.ts","kind":"import-statement","original":"./testing"},{"path":"packages/core/mesh/rpc/src/trace.ts","kind":"import-statement","original":"./trace"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"packages/core/mesh/rpc/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":41822},"packages/core/mesh/rpc/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/rpc","kind":"import-statement","external":true}],"exports":["PortTracer","ProtoRpcPeer","RpcPeer","createBundledRpcClient","createBundledRpcServer","createLinkedPorts","createProtoRpcPeer","createRpcClient","createRpcServer","createServiceBundle","decodeRpcError","parseMethodName"],"entryPoint":"packages/core/mesh/rpc/src/index.ts","inputs":{"inject-globals:@inject-globals":{"bytesInOutput":79},"packages/core/mesh/rpc/src/rpc.ts":{"bytesInOutput":17637},"packages/core/mesh/rpc/src/errors.ts":{"bytesInOutput":228},"packages/core/mesh/rpc/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/rpc/src/service.ts":{"bytesInOutput":4206},"packages/core/mesh/rpc/src/testing.ts":{"bytesInOutput":528},"packages/core/mesh/rpc/src/trace.ts":{"bytesInOutput":732}},"bytes":23999}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -112,7 +112,7 @@ var RpcPeer = class {
|
|
|
112
112
|
} catch (err) {
|
|
113
113
|
import_log.log.catch(err, void 0, {
|
|
114
114
|
F: __dxlog_file,
|
|
115
|
-
L:
|
|
115
|
+
L: 146,
|
|
116
116
|
S: this,
|
|
117
117
|
C: (f, a) => f(...a)
|
|
118
118
|
});
|
|
@@ -126,7 +126,7 @@ var RpcPeer = class {
|
|
|
126
126
|
}
|
|
127
127
|
(0, import_log.log)("sending open message", void 0, {
|
|
128
128
|
F: __dxlog_file,
|
|
129
|
-
L:
|
|
129
|
+
L: 158,
|
|
130
130
|
S: this,
|
|
131
131
|
C: (f, a) => f(...a)
|
|
132
132
|
});
|
|
@@ -141,7 +141,7 @@ var RpcPeer = class {
|
|
|
141
141
|
open: true
|
|
142
142
|
}).catch((err) => import_log.log.warn(err, void 0, {
|
|
143
143
|
F: __dxlog_file,
|
|
144
|
-
L:
|
|
144
|
+
L: 167,
|
|
145
145
|
S: this,
|
|
146
146
|
C: (f, a) => f(...a)
|
|
147
147
|
}));
|
|
@@ -157,7 +157,7 @@ var RpcPeer = class {
|
|
|
157
157
|
}
|
|
158
158
|
(0, import_log.log)("sending second open message", void 0, {
|
|
159
159
|
F: __dxlog_file,
|
|
160
|
-
L:
|
|
160
|
+
L: 182,
|
|
161
161
|
S: this,
|
|
162
162
|
C: (f, a) => f(...a)
|
|
163
163
|
});
|
|
@@ -187,7 +187,7 @@ var RpcPeer = class {
|
|
|
187
187
|
err
|
|
188
188
|
}, {
|
|
189
189
|
F: __dxlog_file,
|
|
190
|
-
L:
|
|
190
|
+
L: 204,
|
|
191
191
|
S: this,
|
|
192
192
|
C: (f, a) => f(...a)
|
|
193
193
|
});
|
|
@@ -195,7 +195,7 @@ var RpcPeer = class {
|
|
|
195
195
|
try {
|
|
196
196
|
(0, import_log.log)("closing waiting on bye", void 0, {
|
|
197
197
|
F: __dxlog_file,
|
|
198
|
-
L:
|
|
198
|
+
L: 207,
|
|
199
199
|
S: this,
|
|
200
200
|
C: (f, a) => f(...a)
|
|
201
201
|
});
|
|
@@ -207,7 +207,7 @@ var RpcPeer = class {
|
|
|
207
207
|
err
|
|
208
208
|
}, {
|
|
209
209
|
F: __dxlog_file,
|
|
210
|
-
L:
|
|
210
|
+
L: 210,
|
|
211
211
|
S: this,
|
|
212
212
|
C: (f, a) => f(...a)
|
|
213
213
|
});
|
|
@@ -251,7 +251,7 @@ var RpcPeer = class {
|
|
|
251
251
|
type: Object.keys(decoded)[0]
|
|
252
252
|
}, {
|
|
253
253
|
F: __dxlog_file,
|
|
254
|
-
L:
|
|
254
|
+
L: 254,
|
|
255
255
|
S: this,
|
|
256
256
|
C: (f, a) => f(...a)
|
|
257
257
|
});
|
|
@@ -259,7 +259,7 @@ var RpcPeer = class {
|
|
|
259
259
|
if (this._state !== "OPENED" && this._state !== "OPENING") {
|
|
260
260
|
(0, import_log.log)("received request while closed", void 0, {
|
|
261
261
|
F: __dxlog_file,
|
|
262
|
-
L:
|
|
262
|
+
L: 258,
|
|
263
263
|
S: this,
|
|
264
264
|
C: (f, a) => f(...a)
|
|
265
265
|
});
|
|
@@ -277,7 +277,7 @@ var RpcPeer = class {
|
|
|
277
277
|
method: req.method
|
|
278
278
|
}, {
|
|
279
279
|
F: __dxlog_file,
|
|
280
|
-
L:
|
|
280
|
+
L: 270,
|
|
281
281
|
S: this,
|
|
282
282
|
C: (f, a) => f(...a)
|
|
283
283
|
});
|
|
@@ -289,7 +289,7 @@ var RpcPeer = class {
|
|
|
289
289
|
close: response.close
|
|
290
290
|
}, {
|
|
291
291
|
F: __dxlog_file,
|
|
292
|
-
L:
|
|
292
|
+
L: 272,
|
|
293
293
|
S: this,
|
|
294
294
|
C: (f, a) => f(...a)
|
|
295
295
|
});
|
|
@@ -298,7 +298,7 @@ var RpcPeer = class {
|
|
|
298
298
|
}).catch((err) => {
|
|
299
299
|
import_log.log.warn("failed during close", err, {
|
|
300
300
|
F: __dxlog_file,
|
|
301
|
-
L:
|
|
301
|
+
L: 280,
|
|
302
302
|
S: this,
|
|
303
303
|
C: (f, a) => f(...a)
|
|
304
304
|
});
|
|
@@ -309,7 +309,7 @@ var RpcPeer = class {
|
|
|
309
309
|
method: req.method
|
|
310
310
|
}, {
|
|
311
311
|
F: __dxlog_file,
|
|
312
|
-
L:
|
|
312
|
+
L: 284,
|
|
313
313
|
S: this,
|
|
314
314
|
C: (f, a) => f(...a)
|
|
315
315
|
});
|
|
@@ -320,7 +320,7 @@ var RpcPeer = class {
|
|
|
320
320
|
error: response.error
|
|
321
321
|
}, {
|
|
322
322
|
F: __dxlog_file,
|
|
323
|
-
L:
|
|
323
|
+
L: 287,
|
|
324
324
|
S: this,
|
|
325
325
|
C: (f, a) => f(...a)
|
|
326
326
|
});
|
|
@@ -332,7 +332,7 @@ var RpcPeer = class {
|
|
|
332
332
|
if (this._state !== "OPENED") {
|
|
333
333
|
(0, import_log.log)("received response while closed", void 0, {
|
|
334
334
|
F: __dxlog_file,
|
|
335
|
-
L:
|
|
335
|
+
L: 296,
|
|
336
336
|
S: this,
|
|
337
337
|
C: (f, a) => f(...a)
|
|
338
338
|
});
|
|
@@ -341,7 +341,7 @@ var RpcPeer = class {
|
|
|
341
341
|
const responseId = decoded.response.id;
|
|
342
342
|
(0, import_invariant.invariant)(typeof responseId === "number", void 0, {
|
|
343
343
|
F: __dxlog_file,
|
|
344
|
-
L:
|
|
344
|
+
L: 301,
|
|
345
345
|
S: this,
|
|
346
346
|
A: [
|
|
347
347
|
"typeof responseId === 'number'",
|
|
@@ -353,7 +353,7 @@ var RpcPeer = class {
|
|
|
353
353
|
responseId
|
|
354
354
|
}, {
|
|
355
355
|
F: __dxlog_file,
|
|
356
|
-
L:
|
|
356
|
+
L: 303,
|
|
357
357
|
S: this,
|
|
358
358
|
C: (f, a) => f(...a)
|
|
359
359
|
});
|
|
@@ -367,7 +367,7 @@ var RpcPeer = class {
|
|
|
367
367
|
type_url: decoded.response.payload?.type_url
|
|
368
368
|
}, {
|
|
369
369
|
F: __dxlog_file,
|
|
370
|
-
L:
|
|
370
|
+
L: 313,
|
|
371
371
|
S: this,
|
|
372
372
|
C: (f, a) => f(...a)
|
|
373
373
|
});
|
|
@@ -375,7 +375,7 @@ var RpcPeer = class {
|
|
|
375
375
|
} else if (decoded.open) {
|
|
376
376
|
(0, import_log.log)("received open message", void 0, {
|
|
377
377
|
F: __dxlog_file,
|
|
378
|
-
L:
|
|
378
|
+
L: 316,
|
|
379
379
|
S: this,
|
|
380
380
|
C: (f, a) => f(...a)
|
|
381
381
|
});
|
|
@@ -388,7 +388,7 @@ var RpcPeer = class {
|
|
|
388
388
|
} else if (decoded.openAck) {
|
|
389
389
|
(0, import_log.log)("received openAck message", void 0, {
|
|
390
390
|
F: __dxlog_file,
|
|
391
|
-
L:
|
|
391
|
+
L: 323,
|
|
392
392
|
S: this,
|
|
393
393
|
C: (f, a) => f(...a)
|
|
394
394
|
});
|
|
@@ -400,7 +400,7 @@ var RpcPeer = class {
|
|
|
400
400
|
if (this._state !== "OPENED") {
|
|
401
401
|
(0, import_log.log)("received stream close while closed", void 0, {
|
|
402
402
|
F: __dxlog_file,
|
|
403
|
-
L:
|
|
403
|
+
L: 331,
|
|
404
404
|
S: this,
|
|
405
405
|
C: (f, a) => f(...a)
|
|
406
406
|
});
|
|
@@ -410,13 +410,13 @@ var RpcPeer = class {
|
|
|
410
410
|
id: decoded.streamClose.id
|
|
411
411
|
}, {
|
|
412
412
|
F: __dxlog_file,
|
|
413
|
-
L:
|
|
413
|
+
L: 335,
|
|
414
414
|
S: this,
|
|
415
415
|
C: (f, a) => f(...a)
|
|
416
416
|
});
|
|
417
417
|
(0, import_invariant.invariant)(typeof decoded.streamClose.id === "number", void 0, {
|
|
418
418
|
F: __dxlog_file,
|
|
419
|
-
L:
|
|
419
|
+
L: 336,
|
|
420
420
|
S: this,
|
|
421
421
|
A: [
|
|
422
422
|
"typeof decoded.streamClose.id === 'number'",
|
|
@@ -429,7 +429,7 @@ var RpcPeer = class {
|
|
|
429
429
|
id: decoded.streamClose.id
|
|
430
430
|
}, {
|
|
431
431
|
F: __dxlog_file,
|
|
432
|
-
L:
|
|
432
|
+
L: 339,
|
|
433
433
|
S: this,
|
|
434
434
|
C: (f, a) => f(...a)
|
|
435
435
|
});
|
|
@@ -442,7 +442,7 @@ var RpcPeer = class {
|
|
|
442
442
|
if (this._state !== "CLOSING" && this._state !== "CLOSED") {
|
|
443
443
|
(0, import_log.log)("replying to bye", void 0, {
|
|
444
444
|
F: __dxlog_file,
|
|
445
|
-
L:
|
|
445
|
+
L: 349,
|
|
446
446
|
S: this,
|
|
447
447
|
C: (f, a) => f(...a)
|
|
448
448
|
});
|
|
@@ -458,7 +458,7 @@ var RpcPeer = class {
|
|
|
458
458
|
msg
|
|
459
459
|
}, {
|
|
460
460
|
F: __dxlog_file,
|
|
461
|
-
L:
|
|
461
|
+
L: 357,
|
|
462
462
|
S: this,
|
|
463
463
|
C: (f, a) => f(...a)
|
|
464
464
|
});
|
|
@@ -474,7 +474,7 @@ var RpcPeer = class {
|
|
|
474
474
|
method
|
|
475
475
|
}, {
|
|
476
476
|
F: __dxlog_file,
|
|
477
|
-
L:
|
|
477
|
+
L: 367,
|
|
478
478
|
S: this,
|
|
479
479
|
C: (f, a) => f(...a)
|
|
480
480
|
});
|
|
@@ -501,7 +501,7 @@ var RpcPeer = class {
|
|
|
501
501
|
response = await waiting;
|
|
502
502
|
(0, import_invariant.invariant)(response.id === id, void 0, {
|
|
503
503
|
F: __dxlog_file,
|
|
504
|
-
L:
|
|
504
|
+
L: 392,
|
|
505
505
|
S: this,
|
|
506
506
|
A: [
|
|
507
507
|
"response.id === id",
|
|
@@ -580,7 +580,7 @@ ${stack.getStack()}`;
|
|
|
580
580
|
}).catch((err) => {
|
|
581
581
|
import_log.log.catch(err, void 0, {
|
|
582
582
|
F: __dxlog_file,
|
|
583
|
-
L:
|
|
583
|
+
L: 465,
|
|
584
584
|
S: this,
|
|
585
585
|
C: (f, a) => f(...a)
|
|
586
586
|
});
|
|
@@ -593,7 +593,7 @@ ${stack.getStack()}`;
|
|
|
593
593
|
type: Object.keys(message)[0]
|
|
594
594
|
}, {
|
|
595
595
|
F: __dxlog_file,
|
|
596
|
-
L:
|
|
596
|
+
L: 472,
|
|
597
597
|
S: this,
|
|
598
598
|
C: (f, a) => f(...a)
|
|
599
599
|
});
|
|
@@ -605,7 +605,7 @@ ${stack.getStack()}`;
|
|
|
605
605
|
try {
|
|
606
606
|
(0, import_invariant.invariant)(typeof req.id === "number", void 0, {
|
|
607
607
|
F: __dxlog_file,
|
|
608
|
-
L:
|
|
608
|
+
L: 478,
|
|
609
609
|
S: this,
|
|
610
610
|
A: [
|
|
611
611
|
"typeof req.id === 'number'",
|
|
@@ -614,7 +614,7 @@ ${stack.getStack()}`;
|
|
|
614
614
|
});
|
|
615
615
|
(0, import_invariant.invariant)(req.payload, void 0, {
|
|
616
616
|
F: __dxlog_file,
|
|
617
|
-
L:
|
|
617
|
+
L: 479,
|
|
618
618
|
S: this,
|
|
619
619
|
A: [
|
|
620
620
|
"req.payload",
|
|
@@ -623,7 +623,7 @@ ${stack.getStack()}`;
|
|
|
623
623
|
});
|
|
624
624
|
(0, import_invariant.invariant)(req.method, void 0, {
|
|
625
625
|
F: __dxlog_file,
|
|
626
|
-
L:
|
|
626
|
+
L: 480,
|
|
627
627
|
S: this,
|
|
628
628
|
A: [
|
|
629
629
|
"req.method",
|
|
@@ -646,7 +646,7 @@ ${stack.getStack()}`;
|
|
|
646
646
|
try {
|
|
647
647
|
(0, import_invariant.invariant)(this._params.streamHandler, "Requests with streaming responses are not supported.", {
|
|
648
648
|
F: __dxlog_file,
|
|
649
|
-
L:
|
|
649
|
+
L: 497,
|
|
650
650
|
S: this,
|
|
651
651
|
A: [
|
|
652
652
|
"this._params.streamHandler",
|
|
@@ -655,7 +655,7 @@ ${stack.getStack()}`;
|
|
|
655
655
|
});
|
|
656
656
|
(0, import_invariant.invariant)(typeof req.id === "number", void 0, {
|
|
657
657
|
F: __dxlog_file,
|
|
658
|
-
L:
|
|
658
|
+
L: 498,
|
|
659
659
|
S: this,
|
|
660
660
|
A: [
|
|
661
661
|
"typeof req.id === 'number'",
|
|
@@ -664,7 +664,7 @@ ${stack.getStack()}`;
|
|
|
664
664
|
});
|
|
665
665
|
(0, import_invariant.invariant)(req.payload, void 0, {
|
|
666
666
|
F: __dxlog_file,
|
|
667
|
-
L:
|
|
667
|
+
L: 499,
|
|
668
668
|
S: this,
|
|
669
669
|
A: [
|
|
670
670
|
"req.payload",
|
|
@@ -673,7 +673,7 @@ ${stack.getStack()}`;
|
|
|
673
673
|
});
|
|
674
674
|
(0, import_invariant.invariant)(req.method, void 0, {
|
|
675
675
|
F: __dxlog_file,
|
|
676
|
-
L:
|
|
676
|
+
L: 500,
|
|
677
677
|
S: this,
|
|
678
678
|
A: [
|
|
679
679
|
"req.method",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/rpc.ts", "../../../src/errors.ts", "../../../src/service.ts", "../../../src/testing.ts", "../../../src/trace.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport { asyncTimeout, synchronized, Trigger } from '@dxos/async';\nimport { type Any, Stream, type RequestOptions } from '@dxos/codec-protobuf';\nimport { StackTrace } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { encodeError, RpcClosedError, RpcNotOpenError, schema } from '@dxos/protocols';\nimport { type Request, type Response, RpcMessage } from '@dxos/protocols/proto/dxos/rpc';\nimport { exponentialBackoffInterval } from '@dxos/util';\n\nimport { decodeRpcError } from './errors';\n\nconst DEFAULT_TIMEOUT = 3_000;\nconst BYE_SEND_TIMEOUT = 2_000;\n\ntype MaybePromise<T> = Promise<T> | T;\n\nexport interface RpcPeerOptions {\n port: RpcPort;\n timeout?: number;\n\n callHandler: (method: string, request: Any) => MaybePromise<Any>;\n streamHandler?: (method: string, request: Any) => Stream<Any>;\n\n /**\n * Do not require or send handshake messages.\n */\n noHandshake?: boolean;\n}\n\n/**\n * Interface for a transport-agnostic port to send/receive binary messages.\n */\nexport interface RpcPort {\n send: (msg: Uint8Array, timeout?: number) => MaybePromise<void>;\n subscribe: (cb: (msg: Uint8Array) => void) => (() => void) | void;\n}\n\nconst CLOSE_TIMEOUT = 3_000;\n\nexport type CloseOptions = {\n /**\n * Time to wait for the other side to confirm close.\n */\n timeout?: number;\n};\n\nclass PendingRpcRequest {\n constructor(\n public readonly resolve: (response: Response) => void,\n public readonly reject: (error?: Error) => void,\n public readonly stream: boolean,\n ) {}\n}\n\nconst RpcMessage = schema.getCodecForType('dxos.rpc.RpcMessage');\n\nenum RpcState {\n INITIAL = 'INITIAL',\n\n OPENING = 'OPENING',\n\n OPENED = 'OPENED',\n\n /**\n * Bye message sent, waiting for the other side to close.\n * Not possible to send requests.\n * All pending requests will be rejected.\n */\n CLOSING = 'CLOSING',\n\n /**\n * Connection fully closed.\n * The underlying transport can be disposed.\n */\n CLOSED = 'CLOSED',\n}\n\n/**\n * A remote procedure call peer.\n *\n * Provides a away to make RPC calls and get a response back as a promise.\n * Does not handle encoding/decoding and only works with byte buffers.\n * For type safe approach see `createRpcClient` and `createRpcServer`.\n *\n * Must be connected with another instance on the other side via `send`/`receive` methods.\n * Both sides must be opened before making any RPC calls.\n *\n * Errors inside the handler get serialized and sent to the other side.\n *\n * Inspired by JSON-RPC 2.0 https://www.jsonrpc.org/specification.\n */\nexport class RpcPeer {\n private readonly _params: RpcPeerOptions;\n\n private readonly _outgoingRequests = new Map<number, PendingRpcRequest>();\n private readonly _localStreams = new Map<number, Stream<any>>();\n private readonly _remoteOpenTrigger = new Trigger();\n\n /**\n * Triggered when the peer starts closing.\n */\n private readonly _closingTrigger = new Trigger();\n\n /**\n * Triggered when peer receives a bye message.\n */\n private readonly _byeTrigger = new Trigger();\n\n private _nextId = 0;\n private _state = RpcState.INITIAL;\n private _unsubscribeFromPort: (() => void) | undefined = undefined;\n private _clearOpenInterval: (() => void) | undefined = undefined;\n\n constructor(params: RpcPeerOptions) {\n this._params = {\n timeout: undefined,\n streamHandler: undefined,\n noHandshake: false,\n ...params,\n };\n }\n\n /**\n * Open the peer. Required before making any calls.\n *\n * Will block before the other peer calls `open`.\n */\n @synchronized\n async open() {\n if (this._state !== RpcState.INITIAL) {\n return;\n }\n\n this._unsubscribeFromPort = this._params.port.subscribe(async (msg) => {\n try {\n await this._receive(msg);\n } catch (err: any) {\n log.catch(err);\n }\n }) as any;\n\n this._state = RpcState.OPENING;\n\n if (this._params.noHandshake) {\n this._state = RpcState.OPENED;\n this._remoteOpenTrigger.wake();\n return;\n }\n\n log('sending open message');\n await this._sendMessage({ open: true });\n\n if (this._state !== RpcState.OPENING) {\n return;\n }\n\n // Retry sending.\n this._clearOpenInterval = exponentialBackoffInterval(() => {\n void this._sendMessage({ open: true }).catch((err) => log.warn(err));\n }, 50);\n\n await Promise.race([this._remoteOpenTrigger.wait(), this._closingTrigger.wait()]);\n\n this._clearOpenInterval?.();\n this._state = RpcState.OPENED;\n\n if (this._state !== RpcState.OPENED) {\n // Closed while opening.\n return; // TODO(dmaretskyi): Throw error?\n }\n\n // TODO(burdon): This seems error prone.\n // Send an \"open\" message in case the other peer has missed our first \"open\" message and is still waiting.\n log('sending second open message');\n await this._sendMessage({ openAck: true });\n }\n\n /**\n * Close the peer.\n * Stop taking or making requests.\n * Will wait for confirmation from the other side.\n * Any responses for RPC calls made before close will be delivered.\n */\n async close({ timeout = CLOSE_TIMEOUT }: CloseOptions = {}) {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n\n if (this._state === RpcState.OPENED && !this._params.noHandshake) {\n try {\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} }, BYE_SEND_TIMEOUT);\n } catch (err: any) {\n log('error closing peer, sending bye', { err });\n }\n try {\n log('closing waiting on bye');\n await this._byeTrigger.wait({ timeout });\n } catch (err: any) {\n log('error closing peer', { err });\n return;\n }\n }\n\n this._disposeAndClose();\n }\n\n /**\n * Dispose the connection without waiting for the other side.\n */\n async abort() {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n this._disposeAndClose();\n }\n\n private _abortRequests() {\n // Abort open\n this._clearOpenInterval?.();\n this._closingTrigger.wake();\n\n // Abort pending requests\n for (const req of this._outgoingRequests.values()) {\n req.reject(new RpcClosedError());\n }\n this._outgoingRequests.clear();\n }\n\n private _disposeAndClose() {\n this._unsubscribeFromPort?.();\n this._unsubscribeFromPort = undefined;\n this._clearOpenInterval?.();\n this._state = RpcState.CLOSED;\n }\n\n /**\n * Handle incoming message. Should be called as the result of other peer's `send` callback.\n */\n private async _receive(msg: Uint8Array): Promise<void> {\n const decoded = RpcMessage.decode(msg, { preserveAny: true });\n log('received message', { type: Object.keys(decoded)[0] });\n\n if (decoded.request) {\n if (this._state !== RpcState.OPENED && this._state !== RpcState.OPENING) {\n log('received request while closed');\n await this._sendMessage({\n response: {\n id: decoded.request.id,\n error: encodeError(new RpcClosedError()),\n },\n });\n return;\n }\n\n const req = decoded.request;\n if (req.stream) {\n log('stream request', { method: req.method });\n this._callStreamHandler(req, (response) => {\n log('sending stream response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n close: response.close,\n });\n\n void this._sendMessage({ response }).catch((err) => {\n log.warn('failed during close', err);\n });\n });\n } else {\n log('request', { method: req.method });\n const response = await this._callHandler(req);\n\n log('sending response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n });\n await this._sendMessage({ response });\n }\n } else if (decoded.response) {\n if (this._state !== RpcState.OPENED) {\n log('received response while closed');\n return; // Ignore when not open.\n }\n\n const responseId = decoded.response.id;\n invariant(typeof responseId === 'number');\n if (!this._outgoingRequests.has(responseId)) {\n log('received response with invalid id', { responseId });\n return; // Ignore requests with incorrect id.\n }\n\n const item = this._outgoingRequests.get(responseId)!;\n // Delete the request record if no more responses are expected.\n if (!item.stream) {\n this._outgoingRequests.delete(responseId);\n }\n\n log('response', { type_url: decoded.response.payload?.type_url });\n item.resolve(decoded.response);\n } else if (decoded.open) {\n log('received open message');\n if (this._params.noHandshake) {\n return;\n }\n\n await this._sendMessage({ openAck: true });\n } else if (decoded.openAck) {\n log('received openAck message');\n if (this._params.noHandshake) {\n return;\n }\n\n this._remoteOpenTrigger.wake();\n } else if (decoded.streamClose) {\n if (this._state !== RpcState.OPENED) {\n log('received stream close while closed');\n return; // Ignore when not open.\n }\n\n log('received stream close', { id: decoded.streamClose.id });\n invariant(typeof decoded.streamClose.id === 'number');\n const stream = this._localStreams.get(decoded.streamClose.id);\n if (!stream) {\n log('no local stream', { id: decoded.streamClose.id });\n return; // Ignore requests with incorrect id.\n }\n\n this._localStreams.delete(decoded.streamClose.id);\n await stream.close();\n } else if (decoded.bye) {\n this._byeTrigger.wake();\n // If we haven't already started closing, close now.\n if (this._state !== RpcState.CLOSING && this._state !== RpcState.CLOSED) {\n log('replying to bye');\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} });\n\n this._abortRequests();\n this._disposeAndClose();\n }\n } else {\n log.error('received malformed message', { msg });\n throw new Error('Malformed message.');\n }\n }\n\n /**\n * Make RPC call. Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n async call(method: string, request: Any, options?: RequestOptions): Promise<Any> {\n log('calling', { method });\n throwIfNotOpen(this._state);\n\n let response: Response;\n try {\n // Set-up response listener.\n const id = this._nextId++;\n const responseReceived = new Promise<Response>((resolve, reject) => {\n this._outgoingRequests.set(id, new PendingRpcRequest(resolve, reject, false));\n });\n\n // Send request call.\n const sending = this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: false,\n },\n });\n\n // Wait until send completes or throws an error (or response throws a timeout), the resume waiting.\n const waiting = asyncTimeout<any>(responseReceived, options?.timeout ?? this._params.timeout ?? DEFAULT_TIMEOUT);\n await Promise.race([sending, waiting]);\n response = await waiting;\n invariant(response.id === id);\n } catch (err) {\n if (err instanceof RpcClosedError) {\n // Rethrow the error here to have the correct stack-trace.\n const error = new RpcClosedError();\n error.stack += `\\n\\n info: RPC client was closed at:\\n${err.stack?.split('\\n').slice(1).join('\\n')}`;\n throw error;\n }\n\n throw err;\n }\n\n if (response.payload) {\n return response.payload;\n } else if (response.error) {\n throw decodeRpcError(response.error, method);\n } else {\n throw new Error('Malformed response.');\n }\n }\n\n /**\n * Make RPC call with a streaming response.\n * Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n callStream(method: string, request: Any, options?: RequestOptions): Stream<Any> {\n throwIfNotOpen(this._state);\n const id = this._nextId++;\n\n return new Stream(({ ready, next, close }) => {\n const onResponse = (response: Response) => {\n if (response.streamReady) {\n ready();\n } else if (response.close) {\n close();\n } else if (response.error) {\n // TODO(dmaretskyi): Stack trace might be lost because the stream producer function is called asynchronously.\n close(decodeRpcError(response.error, method));\n } else if (response.payload) {\n next(response.payload);\n } else {\n throw new Error('Malformed response.');\n }\n };\n\n const stack = new StackTrace();\n const closeStream = (err?: Error) => {\n if (!err) {\n close();\n } else {\n err.stack += `\\n\\nError happened in the stream at:\\n${stack.getStack()}`;\n close(err);\n }\n };\n\n this._outgoingRequests.set(id, new PendingRpcRequest(onResponse, closeStream, true));\n\n this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: true,\n },\n }).catch((err) => {\n close(err);\n });\n\n return () => {\n this._sendMessage({\n streamClose: { id },\n }).catch((err) => {\n log.catch(err);\n });\n };\n });\n }\n\n private async _sendMessage(message: RpcMessage, timeout?: number) {\n log('sending message', { type: Object.keys(message)[0] });\n await this._params.port.send(RpcMessage.encode(message, { preserveAny: true }), timeout);\n }\n\n private async _callHandler(req: Request): Promise<Response> {\n try {\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const response = await this._params.callHandler(req.method, req.payload);\n return {\n id: req.id,\n payload: response,\n };\n } catch (err) {\n return {\n id: req.id,\n error: encodeError(err),\n };\n }\n }\n\n private _callStreamHandler(req: Request, callback: (response: Response) => void) {\n try {\n invariant(this._params.streamHandler, 'Requests with streaming responses are not supported.');\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const responseStream = this._params.streamHandler(req.method, req.payload);\n responseStream.onReady(() => {\n callback({\n id: req.id,\n streamReady: true,\n });\n });\n\n responseStream.subscribe(\n (msg) => {\n callback({\n id: req.id,\n payload: msg,\n });\n },\n (error) => {\n if (error) {\n callback({\n id: req.id,\n error: encodeError(error),\n });\n } else {\n callback({\n id: req.id,\n close: true,\n });\n }\n },\n );\n\n this._localStreams.set(req.id, responseStream);\n } catch (err: any) {\n callback({\n id: req.id,\n error: encodeError(err),\n });\n }\n }\n}\n\nconst throwIfNotOpen = (state: RpcState) => {\n switch (state) {\n case RpcState.OPENED: {\n return;\n }\n case RpcState.INITIAL: {\n throw new RpcNotOpenError();\n }\n case RpcState.CLOSED: {\n throw new RpcClosedError();\n }\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { StackTrace } from '@dxos/debug';\nimport { decodeError } from '@dxos/protocols';\nimport { type Error as ErrorResponse } from '@dxos/protocols/proto/dxos/error';\n\nexport const decodeRpcError = (err: ErrorResponse, rpcMethod: string): Error =>\n decodeError(err, {\n appendStack: `\\n at RPC ${rpcMethod} \\n` + new StackTrace().getStack(1),\n });\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport {\n type EncodingOptions,\n type ServiceDescriptor,\n type ServiceHandler,\n type ServiceProvider,\n} from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\n\nimport { RpcPeer, type RpcPeerOptions } from './rpc';\n\n/**\n * Map of service definitions.\n */\n// TODO(burdon): Rename ServiceMap.\nexport type ServiceBundle<Services> = { [Key in keyof Services]: ServiceDescriptor<Services[Key]> };\n\nexport type ServiceHandlers<Services> = { [ServiceName in keyof Services]: ServiceProvider<Services[ServiceName]> };\n\nexport type ServiceTypesOf<Bundle extends ServiceBundle<any>> =\n Bundle extends ServiceBundle<infer Services> ? Services : never;\n\n/**\n * Groups multiple services together to be served by a single RPC peer.\n */\nexport const createServiceBundle = <Service>(services: ServiceBundle<Service>): ServiceBundle<Service> => services;\n\n/**\n * Type-safe RPC peer.\n */\nexport class ProtoRpcPeer<Service> {\n constructor(\n public readonly rpc: Service,\n private readonly _peer: RpcPeer,\n ) {}\n\n async open() {\n await this._peer.open();\n }\n\n async close() {\n await this._peer.close();\n }\n\n async abort() {\n await this._peer.abort();\n }\n}\n\nexport interface ProtoRpcPeerOptions<Client, Server> extends Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'> {\n /**\n * Services that are expected to be implemented by the counter-space.\n */\n // TODO(burdon): Rename proxy.\n requested?: ServiceBundle<Client>;\n\n /**\n * Services exposed to the counter-space.\n */\n // TODO(burdon): Rename service.\n exposed?: ServiceBundle<Server>;\n\n /**\n * Handlers for the exposed services\n */\n handlers?: ServiceHandlers<Server>;\n\n /**\n * Encoding options passed to the underlying proto codec.\n */\n encodingOptions?: EncodingOptions;\n}\n\n/**\n * Create type-safe RPC peer from a service bundle.\n * Can both handle and issue requests.\n */\n// TODO(burdon): Currently assumes that the proto service name is unique.\n// Support multiple instances services definitions (e.g., halo/space invitations).\nexport const createProtoRpcPeer = <Client = {}, Server = {}>({\n requested,\n exposed,\n handlers,\n encodingOptions,\n ...rest\n}: ProtoRpcPeerOptions<Client, Server>): ProtoRpcPeer<Client> => {\n // Create map of RPCs.\n const exposedRpcs: Record<string, ServiceHandler<any>> = {};\n if (exposed) {\n invariant(handlers);\n for (const serviceName of Object.keys(exposed) as (keyof Server)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = exposed[serviceName].serviceProto.fullName.slice(1);\n const serviceProvider = handlers[serviceName];\n exposedRpcs[serviceFqn] = exposed[serviceName].createServer(serviceProvider, encodingOptions);\n }\n }\n\n // Create peer.\n const peer = new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].callStream(methodName, request);\n },\n });\n\n const requestedRpcs: Client = {} as Client;\n if (requested) {\n for (const serviceName of Object.keys(requested) as (keyof Client)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = requested[serviceName].serviceProto.fullName.slice(1);\n\n requestedRpcs[serviceName] = requested[serviceName].createClient(\n {\n call: (method, req, options) => peer.call(`${serviceFqn}.${method}`, req, options),\n callStream: (method, req, options) => peer.callStream(`${serviceFqn}.${method}`, req, options),\n },\n encodingOptions,\n );\n }\n }\n\n return new ProtoRpcPeer(requestedRpcs, peer);\n};\n\nexport const parseMethodName = (method: string): [serviceName: string, methodName: string] => {\n const separator = method.lastIndexOf('.');\n const serviceName = method.slice(0, separator);\n const methodName = method.slice(separator + 1);\n if (serviceName.length === 0 || methodName.length === 0) {\n throw new Error(`Invalid method: ${method}`);\n }\n\n return [serviceName, methodName];\n};\n\n//\n// TODO(burdon): Remove deprecated (only bot factory).\n//\n\n/**\n * Create a type-safe RPC client.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcClient = <S>(\n serviceDef: ServiceDescriptor<S>,\n options: Omit<RpcPeerOptions, 'callHandler'>,\n): ProtoRpcPeer<S> => {\n const peer = new RpcPeer({\n ...options,\n callHandler: () => {\n throw new Error('Requests to client are not supported.');\n },\n });\n\n const client = serviceDef.createClient({\n call: peer.call.bind(peer),\n callStream: peer.callStream.bind(peer),\n });\n\n return new ProtoRpcPeer(client, peer);\n};\n\n/**\n * @deprecated\n */\nexport interface RpcServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n service: ServiceDescriptor<S>;\n handlers: S;\n}\n\n/**\n * Create a type-safe RPC server.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcServer = <S>({ service, handlers, ...rest }: RpcServerOptions<S>): RpcPeer => {\n const server = service.createServer(handlers);\n return new RpcPeer({\n ...rest,\n callHandler: server.call.bind(server),\n streamHandler: server.callStream.bind(server),\n });\n};\n\n/**\n * Create type-safe RPC client from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createBundledRpcClient = <S>(\n descriptors: ServiceBundle<S>,\n options: Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>,\n): ProtoRpcPeer<S> => {\n return createProtoRpcPeer({\n requested: descriptors,\n ...options,\n });\n};\n\n/**\n * @deprecated\n */\nexport interface RpcBundledServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n services: ServiceBundle<S>;\n handlers: S;\n}\n\n/**\n * Create type-safe RPC server from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\n// TODO(burdon): Support late-binding via providers.\nexport const createBundledRpcServer = <S>({ services, handlers, ...rest }: RpcBundledServerOptions<S>): RpcPeer => {\n const rpc: Record<string, ServiceHandler<any>> = {};\n for (const serviceName of Object.keys(services) as (keyof S)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = services[serviceName].serviceProto.fullName.slice(1);\n rpc[serviceFqn] = services[serviceName].createServer(handlers[serviceName] as any);\n }\n\n return new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].callStream(methodName, request);\n },\n });\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type RpcPort } from './rpc';\n\nexport type CreateLinkedPortsOptions = {\n delay?: number;\n};\n\n/**\n * Create bi-directionally linked ports.\n */\nexport const createLinkedPorts = ({ delay }: CreateLinkedPortsOptions = {}): [RpcPort, RpcPort] => {\n let port1Received: RpcPort['send'] | undefined;\n let port2Received: RpcPort['send'] | undefined;\n\n const send = (handler: RpcPort['send'] | undefined, msg: Uint8Array) => {\n if (delay) {\n setTimeout(() => handler?.(msg), delay);\n } else {\n void handler?.(msg);\n }\n };\n\n const port1: RpcPort = {\n send: (msg) => send(port2Received, msg),\n subscribe: (cb) => {\n port1Received = cb;\n },\n };\n\n const port2: RpcPort = {\n send: (msg) => send(port1Received, msg),\n subscribe: (cb) => {\n port2Received = cb;\n },\n };\n\n return [port1, port2];\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { MessageTrace } from '@dxos/protocols/proto/dxos/rpc';\n\nimport { type RpcPort } from './rpc';\n\nexport class PortTracer {\n readonly message = new Event<MessageTrace>();\n\n private readonly _port: RpcPort;\n\n constructor(private readonly _wrappedPort: RpcPort) {\n this._port = {\n send: (msg: Uint8Array) => {\n this.message.emit({\n direction: MessageTrace.Direction.OUTGOING,\n data: msg,\n });\n\n return this._wrappedPort.send(msg);\n },\n subscribe: (cb: (msg: Uint8Array) => void) => {\n return this._wrappedPort.subscribe((msg) => {\n this.message.emit({\n direction: MessageTrace.Direction.INCOMING,\n data: msg,\n });\n cb(msg);\n });\n },\n };\n }\n\n public get port() {\n return this._port;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport { asyncTimeout, synchronized, Trigger } from '@dxos/async';\nimport { type Any, Stream, type RequestOptions } from '@dxos/codec-protobuf';\nimport { StackTrace } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { encodeError, RpcClosedError, RpcNotOpenError, schema } from '@dxos/protocols';\nimport { type Request, type Response, RpcMessage } from '@dxos/protocols/proto/dxos/rpc';\nimport { exponentialBackoffInterval } from '@dxos/util';\n\nimport { decodeRpcError } from './errors';\n\nconst DEFAULT_TIMEOUT = 3_000;\nconst BYE_SEND_TIMEOUT = 2_000;\n\ntype MaybePromise<T> = Promise<T> | T;\n\nexport interface RpcPeerOptions {\n port: RpcPort;\n\n /**\n * Time to wait for a response to an RPC call.\n */\n timeout?: number;\n\n callHandler: (method: string, request: Any) => MaybePromise<Any>;\n streamHandler?: (method: string, request: Any) => Stream<Any>;\n\n /**\n * Do not require or send handshake messages.\n */\n noHandshake?: boolean;\n}\n\n/**\n * Interface for a transport-agnostic port to send/receive binary messages.\n */\nexport interface RpcPort {\n send: (msg: Uint8Array, timeout?: number) => MaybePromise<void>;\n subscribe: (cb: (msg: Uint8Array) => void) => (() => void) | void;\n}\n\nconst CLOSE_TIMEOUT = 3_000;\n\nexport type CloseOptions = {\n /**\n * Time to wait for the other side to confirm close.\n */\n timeout?: number;\n};\n\nclass PendingRpcRequest {\n constructor(\n public readonly resolve: (response: Response) => void,\n public readonly reject: (error?: Error) => void,\n public readonly stream: boolean,\n ) {}\n}\n\nconst RpcMessage = schema.getCodecForType('dxos.rpc.RpcMessage');\n\nenum RpcState {\n INITIAL = 'INITIAL',\n\n OPENING = 'OPENING',\n\n OPENED = 'OPENED',\n\n /**\n * Bye message sent, waiting for the other side to close.\n * Not possible to send requests.\n * All pending requests will be rejected.\n */\n CLOSING = 'CLOSING',\n\n /**\n * Connection fully closed.\n * The underlying transport can be disposed.\n */\n CLOSED = 'CLOSED',\n}\n\n/**\n * A remote procedure call peer.\n *\n * Provides a away to make RPC calls and get a response back as a promise.\n * Does not handle encoding/decoding and only works with byte buffers.\n * For type safe approach see `createRpcClient` and `createRpcServer`.\n *\n * Must be connected with another instance on the other side via `send`/`receive` methods.\n * Both sides must be opened before making any RPC calls.\n *\n * Errors inside the handler get serialized and sent to the other side.\n *\n * Inspired by JSON-RPC 2.0 https://www.jsonrpc.org/specification.\n */\nexport class RpcPeer {\n private readonly _params: RpcPeerOptions;\n\n private readonly _outgoingRequests = new Map<number, PendingRpcRequest>();\n private readonly _localStreams = new Map<number, Stream<any>>();\n private readonly _remoteOpenTrigger = new Trigger();\n\n /**\n * Triggered when the peer starts closing.\n */\n private readonly _closingTrigger = new Trigger();\n\n /**\n * Triggered when peer receives a bye message.\n */\n private readonly _byeTrigger = new Trigger();\n\n private _nextId = 0;\n private _state = RpcState.INITIAL;\n private _unsubscribeFromPort: (() => void) | undefined = undefined;\n private _clearOpenInterval: (() => void) | undefined = undefined;\n\n constructor(params: RpcPeerOptions) {\n this._params = {\n timeout: undefined,\n streamHandler: undefined,\n noHandshake: false,\n ...params,\n };\n }\n\n /**\n * Open the peer. Required before making any calls.\n *\n * Will block before the other peer calls `open`.\n */\n @synchronized\n async open() {\n if (this._state !== RpcState.INITIAL) {\n return;\n }\n\n this._unsubscribeFromPort = this._params.port.subscribe(async (msg) => {\n try {\n await this._receive(msg);\n } catch (err: any) {\n log.catch(err);\n }\n }) as any;\n\n this._state = RpcState.OPENING;\n\n if (this._params.noHandshake) {\n this._state = RpcState.OPENED;\n this._remoteOpenTrigger.wake();\n return;\n }\n\n log('sending open message');\n await this._sendMessage({ open: true });\n\n if (this._state !== RpcState.OPENING) {\n return;\n }\n\n // Retry sending.\n this._clearOpenInterval = exponentialBackoffInterval(() => {\n void this._sendMessage({ open: true }).catch((err) => log.warn(err));\n }, 50);\n\n await Promise.race([this._remoteOpenTrigger.wait(), this._closingTrigger.wait()]);\n\n this._clearOpenInterval?.();\n this._state = RpcState.OPENED;\n\n if (this._state !== RpcState.OPENED) {\n // Closed while opening.\n return; // TODO(dmaretskyi): Throw error?\n }\n\n // TODO(burdon): This seems error prone.\n // Send an \"open\" message in case the other peer has missed our first \"open\" message and is still waiting.\n log('sending second open message');\n await this._sendMessage({ openAck: true });\n }\n\n /**\n * Close the peer.\n * Stop taking or making requests.\n * Will wait for confirmation from the other side.\n * Any responses for RPC calls made before close will be delivered.\n */\n async close({ timeout = CLOSE_TIMEOUT }: CloseOptions = {}) {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n\n if (this._state === RpcState.OPENED && !this._params.noHandshake) {\n try {\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} }, BYE_SEND_TIMEOUT);\n } catch (err: any) {\n log('error closing peer, sending bye', { err });\n }\n try {\n log('closing waiting on bye');\n await this._byeTrigger.wait({ timeout });\n } catch (err: any) {\n log('error closing peer', { err });\n return;\n }\n }\n\n this._disposeAndClose();\n }\n\n /**\n * Dispose the connection without waiting for the other side.\n */\n async abort() {\n if (this._state === RpcState.CLOSED) {\n return;\n }\n\n this._abortRequests();\n this._disposeAndClose();\n }\n\n private _abortRequests() {\n // Abort open\n this._clearOpenInterval?.();\n this._closingTrigger.wake();\n\n // Abort pending requests\n for (const req of this._outgoingRequests.values()) {\n req.reject(new RpcClosedError());\n }\n this._outgoingRequests.clear();\n }\n\n private _disposeAndClose() {\n this._unsubscribeFromPort?.();\n this._unsubscribeFromPort = undefined;\n this._clearOpenInterval?.();\n this._state = RpcState.CLOSED;\n }\n\n /**\n * Handle incoming message. Should be called as the result of other peer's `send` callback.\n */\n private async _receive(msg: Uint8Array): Promise<void> {\n const decoded = RpcMessage.decode(msg, { preserveAny: true });\n log('received message', { type: Object.keys(decoded)[0] });\n\n if (decoded.request) {\n if (this._state !== RpcState.OPENED && this._state !== RpcState.OPENING) {\n log('received request while closed');\n await this._sendMessage({\n response: {\n id: decoded.request.id,\n error: encodeError(new RpcClosedError()),\n },\n });\n return;\n }\n\n const req = decoded.request;\n if (req.stream) {\n log('stream request', { method: req.method });\n this._callStreamHandler(req, (response) => {\n log('sending stream response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n close: response.close,\n });\n\n void this._sendMessage({ response }).catch((err) => {\n log.warn('failed during close', err);\n });\n });\n } else {\n log('request', { method: req.method });\n const response = await this._callHandler(req);\n\n log('sending response', {\n method: req.method,\n response: response.payload?.type_url,\n error: response.error,\n });\n await this._sendMessage({ response });\n }\n } else if (decoded.response) {\n if (this._state !== RpcState.OPENED) {\n log('received response while closed');\n return; // Ignore when not open.\n }\n\n const responseId = decoded.response.id;\n invariant(typeof responseId === 'number');\n if (!this._outgoingRequests.has(responseId)) {\n log('received response with invalid id', { responseId });\n return; // Ignore requests with incorrect id.\n }\n\n const item = this._outgoingRequests.get(responseId)!;\n // Delete the request record if no more responses are expected.\n if (!item.stream) {\n this._outgoingRequests.delete(responseId);\n }\n\n log('response', { type_url: decoded.response.payload?.type_url });\n item.resolve(decoded.response);\n } else if (decoded.open) {\n log('received open message');\n if (this._params.noHandshake) {\n return;\n }\n\n await this._sendMessage({ openAck: true });\n } else if (decoded.openAck) {\n log('received openAck message');\n if (this._params.noHandshake) {\n return;\n }\n\n this._remoteOpenTrigger.wake();\n } else if (decoded.streamClose) {\n if (this._state !== RpcState.OPENED) {\n log('received stream close while closed');\n return; // Ignore when not open.\n }\n\n log('received stream close', { id: decoded.streamClose.id });\n invariant(typeof decoded.streamClose.id === 'number');\n const stream = this._localStreams.get(decoded.streamClose.id);\n if (!stream) {\n log('no local stream', { id: decoded.streamClose.id });\n return; // Ignore requests with incorrect id.\n }\n\n this._localStreams.delete(decoded.streamClose.id);\n await stream.close();\n } else if (decoded.bye) {\n this._byeTrigger.wake();\n // If we haven't already started closing, close now.\n if (this._state !== RpcState.CLOSING && this._state !== RpcState.CLOSED) {\n log('replying to bye');\n this._state = RpcState.CLOSING;\n await this._sendMessage({ bye: {} });\n\n this._abortRequests();\n this._disposeAndClose();\n }\n } else {\n log.error('received malformed message', { msg });\n throw new Error('Malformed message.');\n }\n }\n\n /**\n * Make RPC call. Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n async call(method: string, request: Any, options?: RequestOptions): Promise<Any> {\n log('calling', { method });\n throwIfNotOpen(this._state);\n\n let response: Response;\n try {\n // Set-up response listener.\n const id = this._nextId++;\n const responseReceived = new Promise<Response>((resolve, reject) => {\n this._outgoingRequests.set(id, new PendingRpcRequest(resolve, reject, false));\n });\n\n // Send request call.\n const sending = this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: false,\n },\n });\n\n // Wait until send completes or throws an error (or response throws a timeout), the resume waiting.\n const waiting = asyncTimeout<any>(responseReceived, options?.timeout ?? this._params.timeout ?? DEFAULT_TIMEOUT);\n await Promise.race([sending, waiting]);\n response = await waiting;\n invariant(response.id === id);\n } catch (err) {\n if (err instanceof RpcClosedError) {\n // Rethrow the error here to have the correct stack-trace.\n const error = new RpcClosedError();\n error.stack += `\\n\\n info: RPC client was closed at:\\n${err.stack?.split('\\n').slice(1).join('\\n')}`;\n throw error;\n }\n\n throw err;\n }\n\n if (response.payload) {\n return response.payload;\n } else if (response.error) {\n throw decodeRpcError(response.error, method);\n } else {\n throw new Error('Malformed response.');\n }\n }\n\n /**\n * Make RPC call with a streaming response.\n * Will trigger a handler on the other side.\n * Peer should be open before making this call.\n */\n callStream(method: string, request: Any, options?: RequestOptions): Stream<Any> {\n throwIfNotOpen(this._state);\n const id = this._nextId++;\n\n return new Stream(({ ready, next, close }) => {\n const onResponse = (response: Response) => {\n if (response.streamReady) {\n ready();\n } else if (response.close) {\n close();\n } else if (response.error) {\n // TODO(dmaretskyi): Stack trace might be lost because the stream producer function is called asynchronously.\n close(decodeRpcError(response.error, method));\n } else if (response.payload) {\n next(response.payload);\n } else {\n throw new Error('Malformed response.');\n }\n };\n\n const stack = new StackTrace();\n const closeStream = (err?: Error) => {\n if (!err) {\n close();\n } else {\n err.stack += `\\n\\nError happened in the stream at:\\n${stack.getStack()}`;\n close(err);\n }\n };\n\n this._outgoingRequests.set(id, new PendingRpcRequest(onResponse, closeStream, true));\n\n this._sendMessage({\n request: {\n id,\n method,\n payload: request,\n stream: true,\n },\n }).catch((err) => {\n close(err);\n });\n\n return () => {\n this._sendMessage({\n streamClose: { id },\n }).catch((err) => {\n log.catch(err);\n });\n };\n });\n }\n\n private async _sendMessage(message: RpcMessage, timeout?: number) {\n log('sending message', { type: Object.keys(message)[0] });\n await this._params.port.send(RpcMessage.encode(message, { preserveAny: true }), timeout);\n }\n\n private async _callHandler(req: Request): Promise<Response> {\n try {\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const response = await this._params.callHandler(req.method, req.payload);\n return {\n id: req.id,\n payload: response,\n };\n } catch (err) {\n return {\n id: req.id,\n error: encodeError(err),\n };\n }\n }\n\n private _callStreamHandler(req: Request, callback: (response: Response) => void) {\n try {\n invariant(this._params.streamHandler, 'Requests with streaming responses are not supported.');\n invariant(typeof req.id === 'number');\n invariant(req.payload);\n invariant(req.method);\n\n const responseStream = this._params.streamHandler(req.method, req.payload);\n responseStream.onReady(() => {\n callback({\n id: req.id,\n streamReady: true,\n });\n });\n\n responseStream.subscribe(\n (msg) => {\n callback({\n id: req.id,\n payload: msg,\n });\n },\n (error) => {\n if (error) {\n callback({\n id: req.id,\n error: encodeError(error),\n });\n } else {\n callback({\n id: req.id,\n close: true,\n });\n }\n },\n );\n\n this._localStreams.set(req.id, responseStream);\n } catch (err: any) {\n callback({\n id: req.id,\n error: encodeError(err),\n });\n }\n }\n}\n\nconst throwIfNotOpen = (state: RpcState) => {\n switch (state) {\n case RpcState.OPENED: {\n return;\n }\n case RpcState.INITIAL: {\n throw new RpcNotOpenError();\n }\n case RpcState.CLOSED: {\n throw new RpcClosedError();\n }\n }\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { StackTrace } from '@dxos/debug';\nimport { decodeError } from '@dxos/protocols';\nimport { type Error as ErrorResponse } from '@dxos/protocols/proto/dxos/error';\n\nexport const decodeRpcError = (err: ErrorResponse, rpcMethod: string): Error =>\n decodeError(err, {\n appendStack: `\\n at RPC ${rpcMethod} \\n` + new StackTrace().getStack(1),\n });\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport {\n type EncodingOptions,\n type ServiceDescriptor,\n type ServiceHandler,\n type ServiceProvider,\n} from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\n\nimport { RpcPeer, type RpcPeerOptions } from './rpc';\n\n/**\n * Map of service definitions.\n */\n// TODO(burdon): Rename ServiceMap.\nexport type ServiceBundle<Services> = { [Key in keyof Services]: ServiceDescriptor<Services[Key]> };\n\nexport type ServiceHandlers<Services> = { [ServiceName in keyof Services]: ServiceProvider<Services[ServiceName]> };\n\nexport type ServiceTypesOf<Bundle extends ServiceBundle<any>> =\n Bundle extends ServiceBundle<infer Services> ? Services : never;\n\n/**\n * Groups multiple services together to be served by a single RPC peer.\n */\nexport const createServiceBundle = <Service>(services: ServiceBundle<Service>): ServiceBundle<Service> => services;\n\n/**\n * Type-safe RPC peer.\n */\nexport class ProtoRpcPeer<Service> {\n constructor(\n public readonly rpc: Service,\n private readonly _peer: RpcPeer,\n ) {}\n\n async open() {\n await this._peer.open();\n }\n\n async close() {\n await this._peer.close();\n }\n\n async abort() {\n await this._peer.abort();\n }\n}\n\nexport interface ProtoRpcPeerOptions<Client, Server> extends Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'> {\n /**\n * Services that are expected to be implemented by the counter-space.\n */\n // TODO(burdon): Rename proxy.\n requested?: ServiceBundle<Client>;\n\n /**\n * Services exposed to the counter-space.\n */\n // TODO(burdon): Rename service.\n exposed?: ServiceBundle<Server>;\n\n /**\n * Handlers for the exposed services\n */\n handlers?: ServiceHandlers<Server>;\n\n /**\n * Encoding options passed to the underlying proto codec.\n */\n encodingOptions?: EncodingOptions;\n}\n\n/**\n * Create type-safe RPC peer from a service bundle.\n * Can both handle and issue requests.\n */\n// TODO(burdon): Currently assumes that the proto service name is unique.\n// Support multiple instances services definitions (e.g., halo/space invitations).\nexport const createProtoRpcPeer = <Client = {}, Server = {}>({\n requested,\n exposed,\n handlers,\n encodingOptions,\n ...rest\n}: ProtoRpcPeerOptions<Client, Server>): ProtoRpcPeer<Client> => {\n // Create map of RPCs.\n const exposedRpcs: Record<string, ServiceHandler<any>> = {};\n if (exposed) {\n invariant(handlers);\n for (const serviceName of Object.keys(exposed) as (keyof Server)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = exposed[serviceName].serviceProto.fullName.slice(1);\n const serviceProvider = handlers[serviceName];\n exposedRpcs[serviceFqn] = exposed[serviceName].createServer(serviceProvider, encodingOptions);\n }\n }\n\n // Create peer.\n const peer = new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!exposedRpcs[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return exposedRpcs[serviceName].callStream(methodName, request);\n },\n });\n\n const requestedRpcs: Client = {} as Client;\n if (requested) {\n for (const serviceName of Object.keys(requested) as (keyof Client)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = requested[serviceName].serviceProto.fullName.slice(1);\n\n requestedRpcs[serviceName] = requested[serviceName].createClient(\n {\n call: (method, req, options) => peer.call(`${serviceFqn}.${method}`, req, options),\n callStream: (method, req, options) => peer.callStream(`${serviceFqn}.${method}`, req, options),\n },\n encodingOptions,\n );\n }\n }\n\n return new ProtoRpcPeer(requestedRpcs, peer);\n};\n\nexport const parseMethodName = (method: string): [serviceName: string, methodName: string] => {\n const separator = method.lastIndexOf('.');\n const serviceName = method.slice(0, separator);\n const methodName = method.slice(separator + 1);\n if (serviceName.length === 0 || methodName.length === 0) {\n throw new Error(`Invalid method: ${method}`);\n }\n\n return [serviceName, methodName];\n};\n\n//\n// TODO(burdon): Remove deprecated (only bot factory).\n//\n\n/**\n * Create a type-safe RPC client.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcClient = <S>(\n serviceDef: ServiceDescriptor<S>,\n options: Omit<RpcPeerOptions, 'callHandler'>,\n): ProtoRpcPeer<S> => {\n const peer = new RpcPeer({\n ...options,\n callHandler: () => {\n throw new Error('Requests to client are not supported.');\n },\n });\n\n const client = serviceDef.createClient({\n call: peer.call.bind(peer),\n callStream: peer.callStream.bind(peer),\n });\n\n return new ProtoRpcPeer(client, peer);\n};\n\n/**\n * @deprecated\n */\nexport interface RpcServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n service: ServiceDescriptor<S>;\n handlers: S;\n}\n\n/**\n * Create a type-safe RPC server.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createRpcServer = <S>({ service, handlers, ...rest }: RpcServerOptions<S>): RpcPeer => {\n const server = service.createServer(handlers);\n return new RpcPeer({\n ...rest,\n callHandler: server.call.bind(server),\n streamHandler: server.callStream.bind(server),\n });\n};\n\n/**\n * Create type-safe RPC client from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\nexport const createBundledRpcClient = <S>(\n descriptors: ServiceBundle<S>,\n options: Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>,\n): ProtoRpcPeer<S> => {\n return createProtoRpcPeer({\n requested: descriptors,\n ...options,\n });\n};\n\n/**\n * @deprecated\n */\nexport interface RpcBundledServerOptions<S> extends Omit<RpcPeerOptions, 'callHandler'> {\n services: ServiceBundle<S>;\n handlers: S;\n}\n\n/**\n * Create type-safe RPC server from a service bundle.\n * @deprecated Use createProtoRpcPeer instead.\n */\n// TODO(burdon): Support late-binding via providers.\nexport const createBundledRpcServer = <S>({ services, handlers, ...rest }: RpcBundledServerOptions<S>): RpcPeer => {\n const rpc: Record<string, ServiceHandler<any>> = {};\n for (const serviceName of Object.keys(services) as (keyof S)[]) {\n // Get full service name with the package name without '.' at the beginning.\n const serviceFqn = services[serviceName].serviceProto.fullName.slice(1);\n rpc[serviceFqn] = services[serviceName].createServer(handlers[serviceName] as any);\n }\n\n return new RpcPeer({\n ...rest,\n\n callHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].call(methodName, request);\n },\n\n streamHandler: (method, request) => {\n const [serviceName, methodName] = parseMethodName(method);\n if (!rpc[serviceName]) {\n throw new Error(`Service not supported: ${serviceName}`);\n }\n\n return rpc[serviceName].callStream(methodName, request);\n },\n });\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { type RpcPort } from './rpc';\n\nexport type CreateLinkedPortsOptions = {\n delay?: number;\n};\n\n/**\n * Create bi-directionally linked ports.\n */\nexport const createLinkedPorts = ({ delay }: CreateLinkedPortsOptions = {}): [RpcPort, RpcPort] => {\n let port1Received: RpcPort['send'] | undefined;\n let port2Received: RpcPort['send'] | undefined;\n\n const send = (handler: RpcPort['send'] | undefined, msg: Uint8Array) => {\n if (delay) {\n setTimeout(() => handler?.(msg), delay);\n } else {\n void handler?.(msg);\n }\n };\n\n const port1: RpcPort = {\n send: (msg) => send(port2Received, msg),\n subscribe: (cb) => {\n port1Received = cb;\n },\n };\n\n const port2: RpcPort = {\n send: (msg) => send(port1Received, msg),\n subscribe: (cb) => {\n port2Received = cb;\n },\n };\n\n return [port1, port2];\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { MessageTrace } from '@dxos/protocols/proto/dxos/rpc';\n\nimport { type RpcPort } from './rpc';\n\nexport class PortTracer {\n readonly message = new Event<MessageTrace>();\n\n private readonly _port: RpcPort;\n\n constructor(private readonly _wrappedPort: RpcPort) {\n this._port = {\n send: (msg: Uint8Array) => {\n this.message.emit({\n direction: MessageTrace.Direction.OUTGOING,\n data: msg,\n });\n\n return this._wrappedPort.send(msg);\n },\n subscribe: (cb: (msg: Uint8Array) => void) => {\n return this._wrappedPort.subscribe((msg) => {\n this.message.emit({\n direction: MessageTrace.Direction.INCOMING,\n data: msg,\n });\n cb(msg);\n });\n },\n };\n }\n\n public get port() {\n return this._port;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAAoD;AACpD,4BAAsD;AACtD,mBAA2B;AAC3B,uBAA0B;AAC1B,iBAAoB;AACpB,uBAAqE;AAErE,kBAA2C;ACP3C,IAAAA,gBAA2B;AAC3B,IAAAC,oBAA4B;ACK5B,IAAAC,oBAA0B;AEN1B,IAAAC,gBAAsB;AACtB,iBAA6B;AHGtB,IAAMC,iBAAiB,CAACC,KAAoBC,kBACjDC,+BAAYF,KAAK;EACfG,aAAa;aAAgBF,SAAAA;IAAiB,IAAIG,yBAAAA,EAAaC,SAAS,CAAA;AAC1E,CAAA;;;;;;;;;;;;ADIF,IAAMC,kBAAkB;AACxB,IAAMC,mBAAmB;AA6BzB,IAAMC,gBAAgB;AAStB,IAAMC,oBAAN,MAAMA;EACJC,YACkBC,SACAC,QACAC,QAChB;SAHgBF,UAAAA;SACAC,SAAAA;SACAC,SAAAA;EACf;AACL;AAEA,IAAMC,aAAaC,wBAAOC,gBAAgB,qBAAA;;UAErCC,WAAAA;;;;AAWFA,YAAA,SAAA,IAAA;AAMAA,YAAA,QAAA,IAAA;GAjBEA,aAAAA,WAAAA,CAAAA,EAAAA;AAmCE,IAAMC,UAAN,MAAMA;EAsBXR,YAAYS,QAAwB;AAnBnBC,SAAAA,oBAAoB,oBAAIC,IAAAA;AACxBC,SAAAA,gBAAgB,oBAAID,IAAAA;AACpBE,SAAAA,qBAAqB,IAAIC,qBAAAA;2BAKP,IAAIA,qBAAAA;uBAKR,IAAIA,qBAAAA;AAE3BC,SAAAA,UAAU;AACVC,SAAAA,SAAAA;AACAC,SAAAA,uBAAiDC;AACjDC,SAAAA,qBAA+CD;AAGrD,SAAKE,UAAU;MACbC,SAASH;MACTI,eAAeJ;MACfK,aAAa;MACb,GAAGd;IACL;EACF;;;;;;EAOA,MACMe,OAAO;AACX,QAAI,KAAKR,WAAM,WAAuB;AACpC;IACF;AAEA,SAAKC,uBAAuB,KAAKG,QAAQK,KAAKC,UAAU,OAAOC,QAAAA;AAC7D,UAAI;AACF,cAAM,KAAKC,SAASD,GAAAA;MACtB,SAASrC,KAAU;AACjBuC,uBAAIC,MAAMxC,KAAAA,QAAAA;;;;;;MACZ;IACF,CAAA;AAEA,SAAK0B,SAAM;AAEX,QAAI,KAAKI,QAAQG,aAAa;AAC5B,WAAKP,SAAM;AACX,WAAKH,mBAAmBkB,KAAI;AAC5B;IACF;AAEAF,wBAAI,wBAAA,QAAA;;;;;;AACJ,UAAM,KAAKG,aAAa;MAAER,MAAM;IAAK,CAAA;AAErC,QAAI,KAAKR,WAAM,WAAuB;AACpC;IACF;AAGA,SAAKG,yBAAqBc,wCAA2B,MAAA;AACnD,WAAK,KAAKD,aAAa;QAAER,MAAM;MAAK,CAAA,EAAGM,MAAM,CAACxC,QAAQuC,eAAIK,KAAK5C,KAAAA,QAAAA;;;;;;IACjE,GAAG,EAAA;AAEH,UAAM6C,QAAQC,KAAK;MAAC,KAAKvB,mBAAmBwB,KAAI;MAAI,KAAKC,gBAAgBD,KAAI;KAAG;AAEhF,SAAKlB,qBAAkB;AACvB,SAAKH,SAAM;AAEX,QAAI,KAAKA,WAAM,UAAsB;AAEnC;IACF;AAIAa,wBAAI,+BAAA,QAAA;;;;;;AACJ,UAAM,KAAKG,aAAa;MAAEO,SAAS;IAAK,CAAA;EAC1C;;;;;;;EAQA,MAAMC,MAAM,EAAEnB,UAAUvB,cAAa,IAAmB,CAAC,GAAG;AAC1D,QAAI,KAAKkB,WAAM,UAAsB;AACnC;IACF;AAEA,SAAKyB,eAAc;AAEnB,QAAI,KAAKzB,WAAM,YAAwB,CAAC,KAAKI,QAAQG,aAAa;AAChE,UAAI;AACF,aAAKP,SAAM;AACX,cAAM,KAAKgB,aAAa;UAAEU,KAAK,CAAC;QAAE,GAAG7C,gBAAAA;MACvC,SAASP,KAAU;AACjBuC,4BAAI,mCAAmC;UAAEvC;QAAI,GAAA;;;;;;MAC/C;AACA,UAAI;AACFuC,4BAAI,0BAAA,QAAA;;;;;;AACJ,cAAM,KAAKc,YAAYN,KAAK;UAAEhB;QAAQ,CAAA;MACxC,SAAS/B,KAAU;AACjBuC,4BAAI,sBAAsB;UAAEvC;QAAI,GAAA;;;;;;AAChC;MACF;IACF;AAEA,SAAKsD,iBAAgB;EACvB;;;;EAKA,MAAMC,QAAQ;AACZ,QAAI,KAAK7B,WAAM,UAAsB;AACnC;IACF;AAEA,SAAKyB,eAAc;AACnB,SAAKG,iBAAgB;EACvB;EAEQH,iBAAiB;AAEvB,SAAKtB,qBAAkB;AACvB,SAAKmB,gBAAgBP,KAAI;AAGzB,eAAWe,OAAO,KAAKpC,kBAAkBqC,OAAM,GAAI;AACjDD,UAAI5C,OAAO,IAAI8C,gCAAAA,CAAAA;IACjB;AACA,SAAKtC,kBAAkBuC,MAAK;EAC9B;EAEQL,mBAAmB;AACzB,SAAK3B,uBAAoB;AACzB,SAAKA,uBAAuBC;AAC5B,SAAKC,qBAAkB;AACvB,SAAKH,SAAM;EACb;;;;EAKA,MAAcY,SAASD,KAAgC;AACrD,UAAMuB,UAAU9C,WAAW+C,OAAOxB,KAAK;MAAEyB,aAAa;IAAK,CAAA;AAC3DvB,wBAAI,oBAAoB;MAAEwB,MAAMC,OAAOC,KAAKL,OAAAA,EAAS,CAAA;IAAG,GAAA;;;;;;AAExD,QAAIA,QAAQM,SAAS;AACnB,UAAI,KAAKxC,WAAM,YAAwB,KAAKA,WAAM,WAAuB;AACvEa,4BAAI,iCAAA,QAAA;;;;;;AACJ,cAAM,KAAKG,aAAa;UACtByB,UAAU;YACRC,IAAIR,QAAQM,QAAQE;YACpBC,WAAOC,8BAAY,IAAIZ,gCAAAA,CAAAA;UACzB;QACF,CAAA;AACA;MACF;AAEA,YAAMF,MAAMI,QAAQM;AACpB,UAAIV,IAAI3C,QAAQ;AACd0B,4BAAI,kBAAkB;UAAEgC,QAAQf,IAAIe;QAAO,GAAA;;;;;;AAC3C,aAAKC,mBAAmBhB,KAAK,CAACW,aAAAA;AAC5B5B,8BAAI,2BAA2B;YAC7BgC,QAAQf,IAAIe;YACZJ,UAAUA,SAASM,SAASC;YAC5BL,OAAOF,SAASE;YAChBnB,OAAOiB,SAASjB;UAClB,GAAA;;;;;;AAEA,eAAK,KAAKR,aAAa;YAAEyB;UAAS,CAAA,EAAG3B,MAAM,CAACxC,QAAAA;AAC1CuC,2BAAIK,KAAK,uBAAuB5C,KAAAA;;;;;;UAClC,CAAA;QACF,CAAA;MACF,OAAO;AACLuC,4BAAI,WAAW;UAAEgC,QAAQf,IAAIe;QAAO,GAAA;;;;;;AACpC,cAAMJ,WAAW,MAAM,KAAKQ,aAAanB,GAAAA;AAEzCjB,4BAAI,oBAAoB;UACtBgC,QAAQf,IAAIe;UACZJ,UAAUA,SAASM,SAASC;UAC5BL,OAAOF,SAASE;QAClB,GAAA;;;;;;AACA,cAAM,KAAK3B,aAAa;UAAEyB;QAAS,CAAA;MACrC;IACF,WAAWP,QAAQO,UAAU;AAC3B,UAAI,KAAKzC,WAAM,UAAsB;AACnCa,4BAAI,kCAAA,QAAA;;;;;;AACJ;MACF;AAEA,YAAMqC,aAAahB,QAAQO,SAASC;AACpCS,sCAAU,OAAOD,eAAe,UAAA,QAAA;;;;;;;;;AAChC,UAAI,CAAC,KAAKxD,kBAAkB0D,IAAIF,UAAAA,GAAa;AAC3CrC,4BAAI,qCAAqC;UAAEqC;QAAW,GAAA;;;;;;AACtD;MACF;AAEA,YAAMG,OAAO,KAAK3D,kBAAkB4D,IAAIJ,UAAAA;AAExC,UAAI,CAACG,KAAKlE,QAAQ;AAChB,aAAKO,kBAAkB6D,OAAOL,UAAAA;MAChC;AAEArC,0BAAI,YAAY;QAAEmC,UAAUd,QAAQO,SAASM,SAASC;MAAS,GAAA;;;;;;AAC/DK,WAAKpE,QAAQiD,QAAQO,QAAQ;IAC/B,WAAWP,QAAQ1B,MAAM;AACvBK,0BAAI,yBAAA,QAAA;;;;;;AACJ,UAAI,KAAKT,QAAQG,aAAa;AAC5B;MACF;AAEA,YAAM,KAAKS,aAAa;QAAEO,SAAS;MAAK,CAAA;IAC1C,WAAWW,QAAQX,SAAS;AAC1BV,0BAAI,4BAAA,QAAA;;;;;;AACJ,UAAI,KAAKT,QAAQG,aAAa;AAC5B;MACF;AAEA,WAAKV,mBAAmBkB,KAAI;IAC9B,WAAWmB,QAAQsB,aAAa;AAC9B,UAAI,KAAKxD,WAAM,UAAsB;AACnCa,4BAAI,sCAAA,QAAA;;;;;;AACJ;MACF;AAEAA,0BAAI,yBAAyB;QAAE6B,IAAIR,QAAQsB,YAAYd;MAAG,GAAA;;;;;;AAC1DS,sCAAU,OAAOjB,QAAQsB,YAAYd,OAAO,UAAA,QAAA;;;;;;;;;AAC5C,YAAMvD,SAAS,KAAKS,cAAc0D,IAAIpB,QAAQsB,YAAYd,EAAE;AAC5D,UAAI,CAACvD,QAAQ;AACX0B,4BAAI,mBAAmB;UAAE6B,IAAIR,QAAQsB,YAAYd;QAAG,GAAA;;;;;;AACpD;MACF;AAEA,WAAK9C,cAAc2D,OAAOrB,QAAQsB,YAAYd,EAAE;AAChD,YAAMvD,OAAOqC,MAAK;IACpB,WAAWU,QAAQR,KAAK;AACtB,WAAKC,YAAYZ,KAAI;AAErB,UAAI,KAAKf,WAAM,aAAyB,KAAKA,WAAM,UAAsB;AACvEa,4BAAI,mBAAA,QAAA;;;;;;AACJ,aAAKb,SAAM;AACX,cAAM,KAAKgB,aAAa;UAAEU,KAAK,CAAC;QAAE,CAAA;AAElC,aAAKD,eAAc;AACnB,aAAKG,iBAAgB;MACvB;IACF,OAAO;AACLf,qBAAI8B,MAAM,8BAA8B;QAAEhC;MAAI,GAAA;;;;;;AAC9C,YAAM,IAAI8C,MAAM,oBAAA;IAClB;EACF;;;;;EAMA,MAAMC,KAAKb,QAAgBL,SAAcmB,SAAwC;AAC/E9C,wBAAI,WAAW;MAAEgC;IAAO,GAAA;;;;;;AACxBe,mBAAe,KAAK5D,MAAM;AAE1B,QAAIyC;AACJ,QAAI;AAEF,YAAMC,KAAK,KAAK3C;AAChB,YAAM8D,mBAAmB,IAAI1C,QAAkB,CAAClC,SAASC,WAAAA;AACvD,aAAKQ,kBAAkBoE,IAAIpB,IAAI,IAAI3D,kBAAkBE,SAASC,QAAQ,KAAA,CAAA;MACxE,CAAA;AAGA,YAAM6E,UAAU,KAAK/C,aAAa;QAChCwB,SAAS;UACPE;UACAG;UACAE,SAASP;UACTrD,QAAQ;QACV;MACF,CAAA;AAGA,YAAM6E,cAAUC,2BAAkBJ,kBAAkBF,SAAStD,WAAW,KAAKD,QAAQC,WAAWzB,eAAAA;AAChG,YAAMuC,QAAQC,KAAK;QAAC2C;QAASC;OAAQ;AACrCvB,iBAAW,MAAMuB;AACjBb,sCAAUV,SAASC,OAAOA,IAAAA,QAAAA;;;;;;;;;IAC5B,SAASpE,KAAK;AACZ,UAAIA,eAAe0D,iCAAgB;AAEjC,cAAMW,QAAQ,IAAIX,gCAAAA;AAClBW,cAAMuB,SAAS;;;EAAyC5F,IAAI4F,OAAOC,MAAM,IAAA,EAAMC,MAAM,CAAA,EAAGC,KAAK,IAAA,CAAA;AAC7F,cAAM1B;MACR;AAEA,YAAMrE;IACR;AAEA,QAAImE,SAASM,SAAS;AACpB,aAAON,SAASM;IAClB,WAAWN,SAASE,OAAO;AACzB,YAAMtE,eAAeoE,SAASE,OAAOE,MAAAA;IACvC,OAAO;AACL,YAAM,IAAIY,MAAM,qBAAA;IAClB;EACF;;;;;;EAOAa,WAAWzB,QAAgBL,SAAcmB,SAAuC;AAC9EC,mBAAe,KAAK5D,MAAM;AAC1B,UAAM0C,KAAK,KAAK3C;AAEhB,WAAO,IAAIwE,6BAAO,CAAC,EAAEC,OAAOC,MAAMjD,MAAK,MAAE;AACvC,YAAMkD,aAAa,CAACjC,aAAAA;AAClB,YAAIA,SAASkC,aAAa;AACxBH,gBAAAA;QACF,WAAW/B,SAASjB,OAAO;AACzBA,gBAAAA;QACF,WAAWiB,SAASE,OAAO;AAEzBnB,gBAAMnD,eAAeoE,SAASE,OAAOE,MAAAA,CAAAA;QACvC,WAAWJ,SAASM,SAAS;AAC3B0B,eAAKhC,SAASM,OAAO;QACvB,OAAO;AACL,gBAAM,IAAIU,MAAM,qBAAA;QAClB;MACF;AAEA,YAAMS,QAAQ,IAAIxF,aAAAA,WAAAA;AAClB,YAAMkG,cAAc,CAACtG,QAAAA;AACnB,YAAI,CAACA,KAAK;AACRkD,gBAAAA;QACF,OAAO;AACLlD,cAAI4F,SAAS;;;EAAyCA,MAAMvF,SAAQ,CAAA;AACpE6C,gBAAMlD,GAAAA;QACR;MACF;AAEA,WAAKoB,kBAAkBoE,IAAIpB,IAAI,IAAI3D,kBAAkB2F,YAAYE,aAAa,IAAA,CAAA;AAE9E,WAAK5D,aAAa;QAChBwB,SAAS;UACPE;UACAG;UACAE,SAASP;UACTrD,QAAQ;QACV;MACF,CAAA,EAAG2B,MAAM,CAACxC,QAAAA;AACRkD,cAAMlD,GAAAA;MACR,CAAA;AAEA,aAAO,MAAA;AACL,aAAK0C,aAAa;UAChBwC,aAAa;YAAEd;UAAG;QACpB,CAAA,EAAG5B,MAAM,CAACxC,QAAAA;AACRuC,yBAAIC,MAAMxC,KAAAA,QAAAA;;;;;;QACZ,CAAA;MACF;IACF,CAAA;EACF;EAEA,MAAc0C,aAAa6D,SAAqBxE,SAAkB;AAChEQ,wBAAI,mBAAmB;MAAEwB,MAAMC,OAAOC,KAAKsC,OAAAA,EAAS,CAAA;IAAG,GAAA;;;;;;AACvD,UAAM,KAAKzE,QAAQK,KAAKqE,KAAK1F,WAAW2F,OAAOF,SAAS;MAAEzC,aAAa;IAAK,CAAA,GAAI/B,OAAAA;EAClF;EAEA,MAAc4C,aAAanB,KAAiC;AAC1D,QAAI;AACFqB,sCAAU,OAAOrB,IAAIY,OAAO,UAAA,QAAA;;;;;;;;;AAC5BS,sCAAUrB,IAAIiB,SAAO,QAAA;;;;;;;;;AACrBI,sCAAUrB,IAAIe,QAAM,QAAA;;;;;;;;;AAEpB,YAAMJ,WAAW,MAAM,KAAKrC,QAAQ4E,YAAYlD,IAAIe,QAAQf,IAAIiB,OAAO;AACvE,aAAO;QACLL,IAAIZ,IAAIY;QACRK,SAASN;MACX;IACF,SAASnE,KAAK;AACZ,aAAO;QACLoE,IAAIZ,IAAIY;QACRC,WAAOC,8BAAYtE,GAAAA;MACrB;IACF;EACF;EAEQwE,mBAAmBhB,KAAcmD,UAAwC;AAC/E,QAAI;AACF9B,sCAAU,KAAK/C,QAAQE,eAAe,wDAAA;;;;;;;;;AACtC6C,sCAAU,OAAOrB,IAAIY,OAAO,UAAA,QAAA;;;;;;;;;AAC5BS,sCAAUrB,IAAIiB,SAAO,QAAA;;;;;;;;;AACrBI,sCAAUrB,IAAIe,QAAM,QAAA;;;;;;;;;AAEpB,YAAMqC,iBAAiB,KAAK9E,QAAQE,cAAcwB,IAAIe,QAAQf,IAAIiB,OAAO;AACzEmC,qBAAeC,QAAQ,MAAA;AACrBF,iBAAS;UACPvC,IAAIZ,IAAIY;UACRiC,aAAa;QACf,CAAA;MACF,CAAA;AAEAO,qBAAexE,UACb,CAACC,QAAAA;AACCsE,iBAAS;UACPvC,IAAIZ,IAAIY;UACRK,SAASpC;QACX,CAAA;MACF,GACA,CAACgC,UAAAA;AACC,YAAIA,OAAO;AACTsC,mBAAS;YACPvC,IAAIZ,IAAIY;YACRC,WAAOC,8BAAYD,KAAAA;UACrB,CAAA;QACF,OAAO;AACLsC,mBAAS;YACPvC,IAAIZ,IAAIY;YACRlB,OAAO;UACT,CAAA;QACF;MACF,CAAA;AAGF,WAAK5B,cAAckE,IAAIhC,IAAIY,IAAIwC,cAAAA;IACjC,SAAS5G,KAAU;AACjB2G,eAAS;QACPvC,IAAIZ,IAAIY;QACRC,WAAOC,8BAAYtE,GAAAA;MACrB,CAAA;IACF;EACF;AACF;;EApZG8G;GApCU5F,QAAAA,WAAAA,QAAAA,IAAAA;AA0bb,IAAMoE,iBAAiB,CAACyB,UAAAA;AACtB,UAAQA,OAAAA;IACN,KAAA,UAAsB;AACpB;IACF;IACA,KAAA,WAAuB;AACrB,YAAM,IAAIC,iCAAAA;IACZ;IACA,KAAA,UAAsB;AACpB,YAAM,IAAItD,gCAAAA;IACZ;EACF;AACF;;AE7gBO,IAAMuD,sBAAsB,CAAUC,aAA6DA;AAKnG,IAAMC,eAAN,MAAMA;EACXzG,YACkB0G,KACCC,OACjB;SAFgBD,MAAAA;SACCC,QAAAA;EAChB;EAEH,MAAMnF,OAAO;AACX,UAAM,KAAKmF,MAAMnF,KAAI;EACvB;EAEA,MAAMgB,QAAQ;AACZ,UAAM,KAAKmE,MAAMnE,MAAK;EACxB;EAEA,MAAMK,QAAQ;AACZ,UAAM,KAAK8D,MAAM9D,MAAK;EACxB;AACF;AAgCO,IAAM+D,qBAAqB,CAA2B,EAC3DC,WACAC,SACAC,UACAC,iBACA,GAAGC,KAAAA,MACiC;AAEpC,QAAMC,cAAmD,CAAC;AAC1D,MAAIJ,SAAS;AACX3C,0BAAAA,WAAU4C,UAAAA,QAAAA;;;;;;;;;AACV,eAAWI,eAAe7D,OAAOC,KAAKuD,OAAAA,GAA8B;AAElE,YAAMM,aAAaN,QAAQK,WAAAA,EAAaE,aAAaC,SAASlC,MAAM,CAAA;AACpE,YAAMmC,kBAAkBR,SAASI,WAAAA;AACjCD,kBAAYE,UAAAA,IAAcN,QAAQK,WAAAA,EAAaK,aAAaD,iBAAiBP,eAAAA;IAC/E;EACF;AAGA,QAAMS,OAAO,IAAIjH,QAAQ;IACvB,GAAGyG;IAEHjB,aAAa,CAACnC,QAAQL,YAAAA;AACpB,YAAM,CAAC2D,aAAaO,UAAAA,IAAcC,gBAAgB9D,MAAAA;AAClD,UAAI,CAACqD,YAAYC,WAAAA,GAAc;AAC7B,cAAM,IAAI1C,MAAM,0BAA0B0C,WAAAA,EAAa;MACzD;AAEA,aAAOD,YAAYC,WAAAA,EAAazC,KAAKgD,YAAYlE,OAAAA;IACnD;IAEAlC,eAAe,CAACuC,QAAQL,YAAAA;AACtB,YAAM,CAAC2D,aAAaO,UAAAA,IAAcC,gBAAgB9D,MAAAA;AAClD,UAAI,CAACqD,YAAYC,WAAAA,GAAc;AAC7B,cAAM,IAAI1C,MAAM,0BAA0B0C,WAAAA,EAAa;MACzD;AAEA,aAAOD,YAAYC,WAAAA,EAAa7B,WAAWoC,YAAYlE,OAAAA;IACzD;EACF,CAAA;AAEA,QAAMoE,gBAAwB,CAAC;AAC/B,MAAIf,WAAW;AACb,eAAWM,eAAe7D,OAAOC,KAAKsD,SAAAA,GAAgC;AAEpE,YAAMO,aAAaP,UAAUM,WAAAA,EAAaE,aAAaC,SAASlC,MAAM,CAAA;AAEtEwC,oBAAcT,WAAAA,IAAeN,UAAUM,WAAAA,EAAaU,aAClD;QACEnD,MAAM,CAACb,QAAQf,KAAK6B,YAAY8C,KAAK/C,KAAK,GAAG0C,UAAAA,IAAcvD,MAAAA,IAAUf,KAAK6B,OAAAA;QAC1EW,YAAY,CAACzB,QAAQf,KAAK6B,YAAY8C,KAAKnC,WAAW,GAAG8B,UAAAA,IAAcvD,MAAAA,IAAUf,KAAK6B,OAAAA;MACxF,GACAqC,eAAAA;IAEJ;EACF;AAEA,SAAO,IAAIP,aAAamB,eAAeH,IAAAA;AACzC;AAEO,IAAME,kBAAkB,CAAC9D,WAAAA;AAC9B,QAAMiE,YAAYjE,OAAOkE,YAAY,GAAA;AACrC,QAAMZ,cAActD,OAAOuB,MAAM,GAAG0C,SAAAA;AACpC,QAAMJ,aAAa7D,OAAOuB,MAAM0C,YAAY,CAAA;AAC5C,MAAIX,YAAYa,WAAW,KAAKN,WAAWM,WAAW,GAAG;AACvD,UAAM,IAAIvD,MAAM,mBAAmBZ,MAAAA,EAAQ;EAC7C;AAEA,SAAO;IAACsD;IAAaO;;AACvB;AAUO,IAAMO,kBAAkB,CAC7BC,YACAvD,YAAAA;AAEA,QAAM8C,OAAO,IAAIjH,QAAQ;IACvB,GAAGmE;IACHqB,aAAa,MAAA;AACX,YAAM,IAAIvB,MAAM,uCAAA;IAClB;EACF,CAAA;AAEA,QAAM0D,SAASD,WAAWL,aAAa;IACrCnD,MAAM+C,KAAK/C,KAAK0D,KAAKX,IAAAA;IACrBnC,YAAYmC,KAAKnC,WAAW8C,KAAKX,IAAAA;EACnC,CAAA;AAEA,SAAO,IAAIhB,aAAa0B,QAAQV,IAAAA;AAClC;AAcO,IAAMY,kBAAkB,CAAI,EAAEC,SAASvB,UAAU,GAAGE,KAAAA,MAA2B;AACpF,QAAMsB,SAASD,QAAQd,aAAaT,QAAAA;AACpC,SAAO,IAAIvG,QAAQ;IACjB,GAAGyG;IACHjB,aAAauC,OAAO7D,KAAK0D,KAAKG,MAAAA;IAC9BjH,eAAeiH,OAAOjD,WAAW8C,KAAKG,MAAAA;EACxC,CAAA;AACF;AAMO,IAAMC,yBAAyB,CACpCC,aACA9D,YAAAA;AAEA,SAAOiC,mBAAmB;IACxBC,WAAW4B;IACX,GAAG9D;EACL,CAAA;AACF;AAeO,IAAM+D,yBAAyB,CAAI,EAAElC,UAAUO,UAAU,GAAGE,KAAAA,MAAkC;AACnG,QAAMP,MAA2C,CAAC;AAClD,aAAWS,eAAe7D,OAAOC,KAAKiD,QAAAA,GAA0B;AAE9D,UAAMY,aAAaZ,SAASW,WAAAA,EAAaE,aAAaC,SAASlC,MAAM,CAAA;AACrEsB,QAAIU,UAAAA,IAAcZ,SAASW,WAAAA,EAAaK,aAAaT,SAASI,WAAAA,CAAY;EAC5E;AAEA,SAAO,IAAI3G,QAAQ;IACjB,GAAGyG;IAEHjB,aAAa,CAACnC,QAAQL,YAAAA;AACpB,YAAM,CAAC2D,aAAaO,UAAAA,IAAcC,gBAAgB9D,MAAAA;AAClD,UAAI,CAAC6C,IAAIS,WAAAA,GAAc;AACrB,cAAM,IAAI1C,MAAM,0BAA0B0C,WAAAA,EAAa;MACzD;AAEA,aAAOT,IAAIS,WAAAA,EAAazC,KAAKgD,YAAYlE,OAAAA;IAC3C;IAEAlC,eAAe,CAACuC,QAAQL,YAAAA;AACtB,YAAM,CAAC2D,aAAaO,UAAAA,IAAcC,gBAAgB9D,MAAAA;AAClD,UAAI,CAAC6C,IAAIS,WAAAA,GAAc;AACrB,cAAM,IAAI1C,MAAM,0BAA0B0C,WAAAA,EAAa;MACzD;AAEA,aAAOT,IAAIS,WAAAA,EAAa7B,WAAWoC,YAAYlE,OAAAA;IACjD;EACF,CAAA;AACF;ACrPO,IAAMmF,oBAAoB,CAAC,EAAEC,MAAK,IAA+B,CAAC,MAAC;AACxE,MAAIC;AACJ,MAAIC;AAEJ,QAAMhD,OAAO,CAACiD,SAAsCpH,QAAAA;AAClD,QAAIiH,OAAO;AACTI,iBAAW,MAAMD,UAAUpH,GAAAA,GAAMiH,KAAAA;IACnC,OAAO;AACL,WAAKG,UAAUpH,GAAAA;IACjB;EACF;AAEA,QAAMsH,QAAiB;IACrBnD,MAAM,CAACnE,QAAQmE,KAAKgD,eAAenH,GAAAA;IACnCD,WAAW,CAACwH,OAAAA;AACVL,sBAAgBK;IAClB;EACF;AAEA,QAAMC,QAAiB;IACrBrD,MAAM,CAACnE,QAAQmE,KAAK+C,eAAelH,GAAAA;IACnCD,WAAW,CAACwH,OAAAA;AACVJ,sBAAgBI;IAClB;EACF;AAEA,SAAO;IAACD;IAAOE;;AACjB;AC/BO,IAAMC,aAAN,MAAMA;EAKXpJ,YAA6BqJ,cAAuB;SAAvBA,eAAAA;SAJpBxD,UAAU,IAAIyD,oBAAAA;AAKrB,SAAKC,QAAQ;MACXzD,MAAM,CAACnE,QAAAA;AACL,aAAKkE,QAAQ2D,KAAK;UAChBC,WAAWC,wBAAaC,UAAUC;UAClCC,MAAMlI;QACR,CAAA;AAEA,eAAO,KAAK0H,aAAavD,KAAKnE,GAAAA;MAChC;MACAD,WAAW,CAACwH,OAAAA;AACV,eAAO,KAAKG,aAAa3H,UAAU,CAACC,QAAAA;AAClC,eAAKkE,QAAQ2D,KAAK;YAChBC,WAAWC,wBAAaC,UAAUG;YAClCD,MAAMlI;UACR,CAAA;AACAuH,aAAGvH,GAAAA;QACL,CAAA;MACF;IACF;EACF;EAEA,IAAWF,OAAO;AAChB,WAAO,KAAK8H;EACd;AACF;",
|
|
6
6
|
"names": ["import_debug", "import_protocols", "import_invariant", "import_async", "decodeRpcError", "err", "rpcMethod", "decodeError", "appendStack", "StackTrace", "getStack", "DEFAULT_TIMEOUT", "BYE_SEND_TIMEOUT", "CLOSE_TIMEOUT", "PendingRpcRequest", "constructor", "resolve", "reject", "stream", "RpcMessage", "schema", "getCodecForType", "RpcState", "RpcPeer", "params", "_outgoingRequests", "Map", "_localStreams", "_remoteOpenTrigger", "Trigger", "_nextId", "_state", "_unsubscribeFromPort", "undefined", "_clearOpenInterval", "_params", "timeout", "streamHandler", "noHandshake", "open", "port", "subscribe", "msg", "_receive", "log", "catch", "wake", "_sendMessage", "exponentialBackoffInterval", "warn", "Promise", "race", "wait", "_closingTrigger", "openAck", "close", "_abortRequests", "bye", "_byeTrigger", "_disposeAndClose", "abort", "req", "values", "RpcClosedError", "clear", "decoded", "decode", "preserveAny", "type", "Object", "keys", "request", "response", "id", "error", "encodeError", "method", "_callStreamHandler", "payload", "type_url", "_callHandler", "responseId", "invariant", "has", "item", "get", "delete", "streamClose", "Error", "call", "options", "throwIfNotOpen", "responseReceived", "set", "sending", "waiting", "asyncTimeout", "stack", "split", "slice", "join", "callStream", "Stream", "ready", "next", "onResponse", "streamReady", "closeStream", "message", "send", "encode", "callHandler", "callback", "responseStream", "onReady", "synchronized", "state", "RpcNotOpenError", "createServiceBundle", "services", "ProtoRpcPeer", "rpc", "_peer", "createProtoRpcPeer", "requested", "exposed", "handlers", "encodingOptions", "rest", "exposedRpcs", "serviceName", "serviceFqn", "serviceProto", "fullName", "serviceProvider", "createServer", "peer", "methodName", "parseMethodName", "requestedRpcs", "createClient", "separator", "lastIndexOf", "length", "createRpcClient", "serviceDef", "client", "bind", "createRpcServer", "service", "server", "createBundledRpcClient", "descriptors", "createBundledRpcServer", "createLinkedPorts", "delay", "port1Received", "port2Received", "handler", "setTimeout", "port1", "cb", "port2", "PortTracer", "_wrappedPort", "Event", "_port", "emit", "direction", "MessageTrace", "Direction", "OUTGOING", "data", "INCOMING"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/core/mesh/rpc/src/errors.ts":{"bytes":1482,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/rpc.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/core/mesh/rpc/src/errors.ts":{"bytes":1482,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/rpc.ts":{"bytes":59849,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/rpc/src/errors.ts","kind":"import-statement","original":"./errors"}],"format":"esm"},"packages/core/mesh/rpc/src/service.ts":{"bytes":22257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/core/mesh/rpc/src/rpc.ts","kind":"import-statement","original":"./rpc"}],"format":"esm"},"packages/core/mesh/rpc/src/testing.ts":{"bytes":2972,"imports":[],"format":"esm"},"packages/core/mesh/rpc/src/trace.ts":{"bytes":3543,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/rpc/src/index.ts":{"bytes":786,"imports":[{"path":"packages/core/mesh/rpc/src/rpc.ts","kind":"import-statement","original":"./rpc"},{"path":"packages/core/mesh/rpc/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/rpc/src/service.ts","kind":"import-statement","original":"./service"},{"path":"packages/core/mesh/rpc/src/testing.ts","kind":"import-statement","original":"./testing"},{"path":"packages/core/mesh/rpc/src/trace.ts","kind":"import-statement","original":"./trace"}],"format":"esm"}},"outputs":{"packages/core/mesh/rpc/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":41813},"packages/core/mesh/rpc/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/rpc","kind":"import-statement","external":true}],"exports":["PortTracer","ProtoRpcPeer","RpcPeer","createBundledRpcClient","createBundledRpcServer","createLinkedPorts","createProtoRpcPeer","createRpcClient","createRpcServer","createServiceBundle","decodeRpcError","parseMethodName"],"entryPoint":"packages/core/mesh/rpc/src/index.ts","inputs":{"packages/core/mesh/rpc/src/rpc.ts":{"bytesInOutput":17637},"packages/core/mesh/rpc/src/errors.ts":{"bytesInOutput":228},"packages/core/mesh/rpc/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/rpc/src/service.ts":{"bytesInOutput":4206},"packages/core/mesh/rpc/src/testing.ts":{"bytesInOutput":528},"packages/core/mesh/rpc/src/trace.ts":{"bytesInOutput":732}},"bytes":23851}}}
|
package/dist/types/src/rpc.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import { type Any, Stream, type RequestOptions } from '@dxos/codec-protobuf';
|
|
|
2
2
|
type MaybePromise<T> = Promise<T> | T;
|
|
3
3
|
export interface RpcPeerOptions {
|
|
4
4
|
port: RpcPort;
|
|
5
|
+
/**
|
|
6
|
+
* Time to wait for a response to an RPC call.
|
|
7
|
+
*/
|
|
5
8
|
timeout?: number;
|
|
6
9
|
callHandler: (method: string, request: Any) => MaybePromise<Any>;
|
|
7
10
|
streamHandler?: (method: string, request: Any) => Stream<Any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/rpc.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa7E,KAAK,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/rpc.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa7E,KAAK,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC;IACjE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC;IAE9D;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAChE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;CACnE;AAID,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAiCF;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IAEzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;IAEpD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAE7C,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,oBAAoB,CAAuC;IACnE,OAAO,CAAC,kBAAkB,CAAuC;gBAErD,MAAM,EAAE,cAAc;IASlC;;;;OAIG;IAEG,IAAI;IAiDV;;;;;OAKG;IACG,KAAK,CAAC,EAAE,OAAuB,EAAE,GAAE,YAAiB;IA0B1D;;OAEG;IACG,KAAK;IASX,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,QAAQ;IA8GtB;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IA+ChF;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC;YAqDjE,YAAY;YAKZ,YAAY;IAmB1B,OAAO,CAAC,kBAAkB;CA6C3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/rpc",
|
|
3
|
-
"version": "0.4.7-main.
|
|
3
|
+
"version": "0.4.7-main.340e96b",
|
|
4
4
|
"description": "A lightweight, transport-agnostic RPC implementation",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
"src"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@dxos/async": "0.4.7-main.
|
|
20
|
-
"@dxos/codec-protobuf": "0.4.7-main.
|
|
21
|
-
"@dxos/
|
|
22
|
-
"@dxos/
|
|
23
|
-
"@dxos/log": "0.4.7-main.
|
|
24
|
-
"@dxos/node-std": "0.4.7-main.
|
|
25
|
-
"@dxos/
|
|
26
|
-
"@dxos/
|
|
19
|
+
"@dxos/async": "0.4.7-main.340e96b",
|
|
20
|
+
"@dxos/codec-protobuf": "0.4.7-main.340e96b",
|
|
21
|
+
"@dxos/invariant": "0.4.7-main.340e96b",
|
|
22
|
+
"@dxos/debug": "0.4.7-main.340e96b",
|
|
23
|
+
"@dxos/log": "0.4.7-main.340e96b",
|
|
24
|
+
"@dxos/node-std": "0.4.7-main.340e96b",
|
|
25
|
+
"@dxos/util": "0.4.7-main.340e96b",
|
|
26
|
+
"@dxos/protocols": "0.4.7-main.340e96b"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"earljs": "~0.1.10",
|
package/src/rpc.ts
CHANGED