@dxos/rpc 0.4.6 → 0.4.7-main.0a4f1cd

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.
@@ -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: 142,
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: 154,
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: 163,
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: 178,
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: 200,
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: 203,
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: 206,
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: 250,
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: 254,
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: 266,
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: 268,
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: 276,
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: 280,
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: 283,
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: 292,
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: 297,
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: 299,
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: 309,
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: 312,
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: 319,
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: 327,
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: 331,
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: 332,
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: 335,
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: 345,
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: 353,
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: 363,
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: 388,
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: 461,
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: 468,
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: 474,
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: 475,
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: 476,
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: 493,
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: 494,
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: 495,
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: 496,
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":59761,"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":41756},"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}}}
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}}}
@@ -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: 142,
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: 154,
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: 163,
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: 178,
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: 200,
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: 203,
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: 206,
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: 250,
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: 254,
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: 266,
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: 268,
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: 276,
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: 280,
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: 283,
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: 292,
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: 297,
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: 299,
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: 309,
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: 312,
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: 319,
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: 327,
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: 331,
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: 332,
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: 335,
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: 345,
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: 353,
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: 363,
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: 388,
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: 461,
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: 468,
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: 474,
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: 475,
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: 476,
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: 493,
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: 494,
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: 495,
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: 496,
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": "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",
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
  }
@@ -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":59761,"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":41747},"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}}}
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}}}
@@ -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;IACd,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"}
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.6",
3
+ "version": "0.4.7-main.0a4f1cd",
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/codec-protobuf": "0.4.6",
20
- "@dxos/async": "0.4.6",
21
- "@dxos/debug": "0.4.6",
22
- "@dxos/invariant": "0.4.6",
23
- "@dxos/log": "0.4.6",
24
- "@dxos/protocols": "0.4.6",
25
- "@dxos/node-std": "0.4.6",
26
- "@dxos/util": "0.4.6"
19
+ "@dxos/async": "0.4.7-main.0a4f1cd",
20
+ "@dxos/codec-protobuf": "0.4.7-main.0a4f1cd",
21
+ "@dxos/invariant": "0.4.7-main.0a4f1cd",
22
+ "@dxos/debug": "0.4.7-main.0a4f1cd",
23
+ "@dxos/log": "0.4.7-main.0a4f1cd",
24
+ "@dxos/node-std": "0.4.7-main.0a4f1cd",
25
+ "@dxos/util": "0.4.7-main.0a4f1cd",
26
+ "@dxos/protocols": "0.4.7-main.0a4f1cd"
27
27
  },
28
28
  "devDependencies": {
29
29
  "earljs": "~0.1.10",
package/src/rpc.ts CHANGED
@@ -20,6 +20,10 @@ type MaybePromise<T> = Promise<T> | T;
20
20
 
21
21
  export interface RpcPeerOptions {
22
22
  port: RpcPort;
23
+
24
+ /**
25
+ * Time to wait for a response to an RPC call.
26
+ */
23
27
  timeout?: number;
24
28
 
25
29
  callHandler: (method: string, request: Any) => MaybePromise<Any>;