@dxos/teleport 0.1.53-next.db41187 → 0.1.53-next.e9dc2bc

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.
@@ -1,8 +1,8 @@
1
- import "@dxos/node-std/globals"
1
+ import "@dxos/node-std/globals";
2
2
 
3
3
  // packages/core/mesh/teleport/src/muxing/framer.ts
4
- import assert from "@dxos/node-std/assert";
5
4
  import { Duplex } from "@dxos/node-std/stream";
5
+ import invariant from "tiny-invariant";
6
6
  import * as varint from "varint";
7
7
  var Framer = class {
8
8
  constructor() {
@@ -11,7 +11,7 @@ var Framer = class {
11
11
  read: () => {
12
12
  },
13
13
  write: (chunk, encoding, callback) => {
14
- assert(!this._subscribeCb, "Internal Framer bug. Concurrent writes detected.");
14
+ invariant(!this._subscribeCb, "Internal Framer bug. Concurrent writes detected.");
15
15
  if (this._buffer && this._buffer.length > 0) {
16
16
  this._buffer = Buffer.concat([
17
17
  this._buffer,
@@ -38,7 +38,7 @@ var Framer = class {
38
38
  },
39
39
  subscribe: (callback) => {
40
40
  var _a;
41
- assert(!this._messageCb, "Rpc port already has a message listener.");
41
+ invariant(!this._messageCb, "Rpc port already has a message listener.");
42
42
  this._messageCb = callback;
43
43
  (_a = this._subscribeCb) == null ? void 0 : _a.call(this);
44
44
  return () => {
@@ -102,15 +102,16 @@ var encodeFrame = (payload) => {
102
102
  };
103
103
 
104
104
  // packages/core/mesh/teleport/src/muxing/muxer.ts
105
- import assert2 from "@dxos/node-std/assert";
106
105
  import { Duplex as Duplex2 } from "@dxos/node-std/stream";
107
- import { DeferredTask, Event, sleep } from "@dxos/async";
106
+ import invariant2 from "tiny-invariant";
107
+ import { Event, scheduleTaskInterval } from "@dxos/async";
108
108
  import { Context } from "@dxos/context";
109
109
  import { failUndefined } from "@dxos/debug";
110
110
  import { log } from "@dxos/log";
111
111
  import { schema } from "@dxos/protocols";
112
- var codec = schema.getCodecForType("dxos.mesh.muxer.Command");
113
- var DEBOUNCE_STATS_INTERVAL = 1e3;
112
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/muxing/muxer.ts";
113
+ var Command = schema.getCodecForType("dxos.mesh.muxer.Command");
114
+ var STATS_INTERVAL = 1e3;
114
115
  var Muxer = class {
115
116
  constructor() {
116
117
  this._framer = new Framer();
@@ -123,21 +124,10 @@ var Muxer = class {
123
124
  this.close = new Event();
124
125
  this.statsUpdated = new Event();
125
126
  this._ctx = new Context();
126
- this._emitStats = new DeferredTask(this._ctx, async () => {
127
- if (this._destroyed || this._destroying) {
128
- return;
129
- }
130
- this.statsUpdated.emit(Array.from(this._channelsByTag.values()).map((channel) => ({
131
- id: channel.id,
132
- tag: channel.tag,
133
- bytesSent: channel.stats.bytesSent,
134
- bytesReceived: channel.stats.bytesReceived
135
- })));
136
- await sleep(DEBOUNCE_STATS_INTERVAL);
137
- });
138
127
  this._framer.port.subscribe((msg) => {
139
- this._handleCommand(codec.decode(msg));
128
+ this._handleCommand(Command.decode(msg));
140
129
  });
130
+ scheduleTaskInterval(this._ctx, async () => this._emitStats(), STATS_INTERVAL);
141
131
  }
142
132
  /**
143
133
  * Creates a duplex Node.js-style stream.
@@ -150,7 +140,7 @@ var Muxer = class {
150
140
  tag,
151
141
  contentType: opts.contentType
152
142
  });
153
- assert2(!channel.push, `Channel already open: ${tag}`);
143
+ invariant2(!channel.push, `Channel already open: ${tag}`);
154
144
  const stream = new Duplex2({
155
145
  write: (data, encoding, callback) => {
156
146
  this._sendData(channel, data);
@@ -161,7 +151,6 @@ var Muxer = class {
161
151
  });
162
152
  channel.push = (data) => {
163
153
  channel.stats.bytesReceived += data.length;
164
- this._emitStats.schedule();
165
154
  stream.push(data);
166
155
  };
167
156
  channel.destroy = (err) => {
@@ -187,12 +176,11 @@ var Muxer = class {
187
176
  tag,
188
177
  contentType: opts.contentType
189
178
  });
190
- assert2(!channel.push, `Channel already open: ${tag}`);
179
+ invariant2(!channel.push, `Channel already open: ${tag}`);
191
180
  let inboundBuffer = [];
192
181
  let callback;
193
182
  channel.push = (data) => {
194
183
  channel.stats.bytesReceived += data.length;
195
- this._emitStats.schedule();
196
184
  if (callback) {
197
185
  callback(data);
198
186
  } else {
@@ -204,7 +192,7 @@ var Muxer = class {
204
192
  this._sendData(channel, data);
205
193
  },
206
194
  subscribe: (cb) => {
207
- assert2(!callback, "Only one subscriber is allowed");
195
+ invariant2(!callback, "Only one subscriber is allowed");
208
196
  callback = cb;
209
197
  for (const data of inboundBuffer) {
210
198
  cb(data);
@@ -235,6 +223,7 @@ var Muxer = class {
235
223
  }
236
224
  });
237
225
  this._dispose();
226
+ void this._ctx.dispose();
238
227
  }
239
228
  _dispose(err) {
240
229
  var _a;
@@ -249,24 +238,23 @@ var Muxer = class {
249
238
  this.close.emit(err);
250
239
  this._channelsByLocalId.clear();
251
240
  this._channelsByTag.clear();
252
- void this._ctx.dispose();
253
241
  }
254
242
  _handleCommand(cmd) {
255
243
  var _a;
256
244
  log("Received command", {
257
245
  cmd
258
246
  }, {
259
- file: "muxer.ts",
260
- line: 224,
261
- scope: this,
262
- callSite: (f, a) => f(...a)
247
+ F: __dxlog_file,
248
+ L: 207,
249
+ S: this,
250
+ C: (f, a) => f(...a)
263
251
  });
264
252
  if (this._destroyed || this._destroying) {
265
- log.warn("Received command after destroy", {}, {
266
- file: "muxer.ts",
267
- line: 227,
268
- scope: this,
269
- callSite: (f, a) => f(...a)
253
+ log.warn("Received command after destroy", void 0, {
254
+ F: __dxlog_file,
255
+ L: 210,
256
+ S: this,
257
+ C: (f, a) => f(...a)
270
258
  });
271
259
  return;
272
260
  }
@@ -291,10 +279,10 @@ var Muxer = class {
291
279
  log.warn("Received data for channel before it was opened", {
292
280
  tag: stream.tag
293
281
  }, {
294
- file: "muxer.ts",
295
- line: 251,
296
- scope: this,
297
- callSite: (f, a) => f(...a)
282
+ F: __dxlog_file,
283
+ L: 234,
284
+ S: this,
285
+ C: (f, a) => f(...a)
298
286
  });
299
287
  return;
300
288
  }
@@ -304,7 +292,7 @@ var Muxer = class {
304
292
  }
305
293
  }
306
294
  _sendCommand(cmd) {
307
- Promise.resolve(this._framer.port.send(codec.encode(cmd))).catch((err) => {
295
+ Promise.resolve(this._framer.port.send(Command.encode(cmd))).catch((err) => {
308
296
  this.destroy(err);
309
297
  });
310
298
  }
@@ -331,7 +319,6 @@ var Muxer = class {
331
319
  }
332
320
  _sendData(channel, data) {
333
321
  channel.stats.bytesSent += data.length;
334
- this._emitStats.schedule();
335
322
  if (channel.remoteId === null) {
336
323
  channel.buffer.push(data);
337
324
  } else {
@@ -343,11 +330,22 @@ var Muxer = class {
343
330
  });
344
331
  }
345
332
  }
333
+ async _emitStats() {
334
+ if (this._destroyed || this._destroying) {
335
+ return;
336
+ }
337
+ this.statsUpdated.emit(Array.from(this._channelsByTag.values()).map((channel) => ({
338
+ id: channel.id,
339
+ tag: channel.tag,
340
+ bytesSent: channel.stats.bytesSent,
341
+ bytesReceived: channel.stats.bytesReceived
342
+ })));
343
+ }
346
344
  };
347
345
 
348
346
  // packages/core/mesh/teleport/src/teleport.ts
349
- import assert3 from "@dxos/node-std/assert";
350
- import { asyncTimeout, scheduleTaskInterval, runInContextAsync, synchronized, scheduleTask } from "@dxos/async";
347
+ import invariant3 from "tiny-invariant";
348
+ import { asyncTimeout, scheduleTaskInterval as scheduleTaskInterval2, runInContextAsync, synchronized, scheduleTask } from "@dxos/async";
351
349
  import { Context as Context2 } from "@dxos/context";
352
350
  import { failUndefined as failUndefined2 } from "@dxos/debug";
353
351
  import { PublicKey } from "@dxos/keys";
@@ -355,7 +353,7 @@ import { log as log2 } from "@dxos/log";
355
353
  import { schema as schema2, RpcClosedError } from "@dxos/protocols";
356
354
  import { createProtoRpcPeer } from "@dxos/rpc";
357
355
  import { Callback } from "@dxos/util";
358
- var __decorate = function(decorators, target, key, desc) {
356
+ function _ts_decorate(decorators, target, key, desc) {
359
357
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
360
358
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
361
359
  r = Reflect.decorate(decorators, target, key, desc);
@@ -364,17 +362,18 @@ var __decorate = function(decorators, target, key, desc) {
364
362
  if (d = decorators[i])
365
363
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
366
364
  return c > 3 && r && Object.defineProperty(target, key, r), r;
367
- };
365
+ }
366
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/teleport.ts";
368
367
  var Teleport = class {
369
368
  constructor({ initiator, localPeerId, remotePeerId }) {
370
369
  this._ctx = new Context2({
371
370
  onError: (err) => {
372
371
  void this.destroy(err).catch(() => {
373
372
  log2.error("Error during destroy", err, {
374
- file: "teleport.ts",
375
- line: 35,
376
- scope: this,
377
- callSite: (f, a) => f(...a)
373
+ F: __dxlog_file2,
374
+ L: 35,
375
+ S: this,
376
+ C: (f, a) => f(...a)
378
377
  });
379
378
  });
380
379
  }
@@ -384,21 +383,21 @@ var Teleport = class {
384
383
  heartbeatInterval: 1e4,
385
384
  heartbeatTimeout: 1e4,
386
385
  onTimeout: () => {
387
- this.destroy(new Error("Connection timed out")).catch((err) => log2.catch(err, {}, {
388
- file: "teleport.ts",
389
- line: 46,
390
- scope: this,
391
- callSite: (f, a) => f(...a)
386
+ this.destroy(new Error("Connection timed out")).catch((err) => log2.catch(err, void 0, {
387
+ F: __dxlog_file2,
388
+ L: 46,
389
+ S: this,
390
+ C: (f, a) => f(...a)
392
391
  }));
393
392
  }
394
393
  });
395
394
  this._extensions = /* @__PURE__ */ new Map();
396
395
  this._remoteExtensions = /* @__PURE__ */ new Set();
397
396
  this._open = false;
398
- assert3(typeof initiator === "boolean");
399
- assert3(PublicKey.isPublicKey(localPeerId));
400
- assert3(PublicKey.isPublicKey(remotePeerId));
401
- assert3(typeof initiator === "boolean");
397
+ invariant3(typeof initiator === "boolean");
398
+ invariant3(PublicKey.isPublicKey(localPeerId));
399
+ invariant3(PublicKey.isPublicKey(remotePeerId));
400
+ invariant3(typeof initiator === "boolean");
402
401
  this.initiator = initiator;
403
402
  this.localPeerId = localPeerId;
404
403
  this.remotePeerId = remotePeerId;
@@ -406,12 +405,12 @@ var Teleport = class {
406
405
  log2("remote extension", {
407
406
  name
408
407
  }, {
409
- file: "teleport.ts",
410
- line: 65,
411
- scope: this,
412
- callSite: (f, a) => f(...a)
408
+ F: __dxlog_file2,
409
+ L: 65,
410
+ S: this,
411
+ C: (f, a) => f(...a)
413
412
  });
414
- assert3(!this._remoteExtensions.has(name), "Remote extension already exists");
413
+ invariant3(!this._remoteExtensions.has(name), "Remote extension already exists");
415
414
  this._remoteExtensions.add(name);
416
415
  if (this._extensions.has(name)) {
417
416
  try {
@@ -455,12 +454,12 @@ var Teleport = class {
455
454
  for (const extension of this._extensions.values()) {
456
455
  try {
457
456
  await extension.onClose(err);
458
- } catch (err1) {
459
- log2.catch(err1, {}, {
460
- file: "teleport.ts",
461
- line: 125,
462
- scope: this,
463
- callSite: (f, a) => f(...a)
457
+ } catch (err2) {
458
+ log2.catch(err2, void 0, {
459
+ F: __dxlog_file2,
460
+ L: 125,
461
+ S: this,
462
+ C: (f, a) => f(...a)
464
463
  });
465
464
  }
466
465
  }
@@ -473,10 +472,10 @@ var Teleport = class {
473
472
  log2("addExtension", {
474
473
  name
475
474
  }, {
476
- file: "teleport.ts",
477
- line: 137,
478
- scope: this,
479
- callSite: (f, a) => f(...a)
475
+ F: __dxlog_file2,
476
+ L: 137,
477
+ S: this,
478
+ C: (f, a) => f(...a)
480
479
  });
481
480
  this._setExtension(name, extension);
482
481
  scheduleTask(this._ctx, async () => {
@@ -496,8 +495,8 @@ var Teleport = class {
496
495
  }
497
496
  }
498
497
  _setExtension(extensionName, extension) {
499
- assert3(!extensionName.includes("/"), "Invalid extension name");
500
- assert3(!this._extensions.has(extensionName), "Extension already exists");
498
+ invariant3(!extensionName.includes("/"), "Invalid extension name");
499
+ invariant3(!this._extensions.has(extensionName), "Extension already exists");
501
500
  this._extensions.set(extensionName, extension);
502
501
  }
503
502
  async _openExtension(extensionName) {
@@ -505,10 +504,10 @@ var Teleport = class {
505
504
  log2("open extension", {
506
505
  extensionName
507
506
  }, {
508
- file: "teleport.ts",
509
- line: 167,
510
- scope: this,
511
- callSite: (f, a) => f(...a)
507
+ F: __dxlog_file2,
508
+ L: 167,
509
+ S: this,
510
+ C: (f, a) => f(...a)
512
511
  });
513
512
  const extension = (_a = this._extensions.get(extensionName)) != null ? _a : failUndefined2();
514
513
  const context = {
@@ -516,11 +515,11 @@ var Teleport = class {
516
515
  localPeerId: this.localPeerId,
517
516
  remotePeerId: this.remotePeerId,
518
517
  createPort: (channelName, opts) => {
519
- assert3(!channelName.includes("/"), "Invalid channel name");
518
+ invariant3(!channelName.includes("/"), "Invalid channel name");
520
519
  return this._muxer.createPort(`${extensionName}/${channelName}`, opts);
521
520
  },
522
521
  createStream: (channelName, opts) => {
523
- assert3(!channelName.includes("/"), "Invalid channel name");
522
+ invariant3(!channelName.includes("/"), "Invalid channel name");
524
523
  return this._muxer.createStream(`${extensionName}/${channelName}`, opts);
525
524
  },
526
525
  close: (err) => {
@@ -533,14 +532,14 @@ var Teleport = class {
533
532
  log2("extension opened", {
534
533
  extensionName
535
534
  }, {
536
- file: "teleport.ts",
537
- line: 190,
538
- scope: this,
539
- callSite: (f, a) => f(...a)
535
+ F: __dxlog_file2,
536
+ L: 190,
537
+ S: this,
538
+ C: (f, a) => f(...a)
540
539
  });
541
540
  }
542
541
  };
543
- __decorate([
542
+ _ts_decorate([
544
543
  synchronized
545
544
  ], Teleport.prototype, "destroy", null);
546
545
  var ControlExtension = class {
@@ -576,7 +575,7 @@ var ControlExtension = class {
576
575
  })
577
576
  });
578
577
  await this._rpc.open();
579
- scheduleTaskInterval(this._ctx, async () => {
578
+ scheduleTaskInterval2(this._ctx, async () => {
580
579
  try {
581
580
  await asyncTimeout(this._rpc.rpc.Control.heartbeat(), this.opts.heartbeatTimeout);
582
581
  } catch (err) {
@@ -596,11 +595,12 @@ var ControlExtension = class {
596
595
  };
597
596
 
598
597
  // packages/core/mesh/teleport/src/testing/test-extension.ts
599
- import assert4 from "@dxos/node-std/assert";
598
+ import invariant4 from "tiny-invariant";
600
599
  import { asyncTimeout as asyncTimeout2, Trigger } from "@dxos/async";
601
600
  import { log as log3 } from "@dxos/log";
602
601
  import { schema as schema3 } from "@dxos/protocols";
603
602
  import { createProtoRpcPeer as createProtoRpcPeer2 } from "@dxos/rpc";
603
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/testing/test-extension.ts";
604
604
  var TestExtension = class {
605
605
  constructor(callbacks = {}) {
606
606
  this.callbacks = callbacks;
@@ -617,10 +617,10 @@ var TestExtension = class {
617
617
  localPeerId: context.localPeerId,
618
618
  remotePeerId: context.remotePeerId
619
619
  }, {
620
- file: "test-extension.ts",
621
- line: 33,
622
- scope: this,
623
- callSite: (f, a) => f(...a)
620
+ F: __dxlog_file3,
621
+ L: 33,
622
+ S: this,
623
+ C: (f, a) => f(...a)
624
624
  });
625
625
  this.extensionContext = context;
626
626
  this._rpc = createProtoRpcPeer2({
@@ -655,10 +655,10 @@ var TestExtension = class {
655
655
  log3("onClose", {
656
656
  err
657
657
  }, {
658
- file: "test-extension.ts",
659
- line: 67,
660
- scope: this,
661
- callSite: (f, a) => f(...a)
658
+ F: __dxlog_file3,
659
+ L: 67,
660
+ S: this,
661
+ C: (f, a) => f(...a)
662
662
  });
663
663
  await ((_b = (_a = this.callbacks).onClose) == null ? void 0 : _b.call(_a));
664
664
  this.closed.wake();
@@ -671,7 +671,7 @@ var TestExtension = class {
671
671
  const res = await asyncTimeout2(this._rpc.rpc.TestService.testCall({
672
672
  data: message
673
673
  }), 500);
674
- assert4(res.data === message);
674
+ invariant4(res.data === message);
675
675
  }
676
676
  /**
677
677
  * Force-close the connection.
@@ -690,4 +690,4 @@ export {
690
690
  Teleport,
691
691
  TestExtension
692
692
  };
693
- //# sourceMappingURL=chunk-XWWASTDK.mjs.map
693
+ //# sourceMappingURL=chunk-EIJETGTE.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/muxing/framer.ts", "../../../src/muxing/muxer.ts", "../../../src/teleport.ts", "../../../src/testing/test-extension.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Duplex } from 'node:stream';\nimport invariant from 'tiny-invariant';\nimport * as varint from 'varint';\n\nimport { RpcPort } from './rpc-port';\n\n/**\n * Framer that turns a stream of binary messages into a framed RpcPort.\n *\n * Buffers are written prefixed by their length encoded as a varint.\n */\nexport class Framer {\n // private readonly _tagBuffer = Buffer.alloc(4)\n private _messageCb?: (msg: Uint8Array) => void;\n private _subscribeCb?: () => void;\n private _buffer?: Buffer; // The rest of the bytes from the previous write call.\n\n private readonly _stream = new Duplex({\n objectMode: false,\n read: () => {},\n write: (chunk, encoding, callback) => {\n invariant(!this._subscribeCb, 'Internal Framer bug. Concurrent writes detected.');\n\n if (this._buffer && this._buffer.length > 0) {\n this._buffer = Buffer.concat([this._buffer, chunk]);\n } else {\n this._buffer = chunk;\n }\n\n if (this._messageCb) {\n this._popFrames();\n callback();\n } else {\n this._subscribeCb = () => {\n // Schedule the processing of the chunk after the peer subscribes to the messages.\n this._popFrames();\n this._subscribeCb = undefined;\n callback();\n };\n }\n },\n });\n\n public readonly port: RpcPort = {\n send: (message) => {\n // log('write', { len: message.length, frame: Buffer.from(message).toString('hex') })\n this._stream.push(encodeFrame(message));\n },\n subscribe: (callback) => {\n invariant(!this._messageCb, 'Rpc port already has a message listener.');\n this._messageCb = callback;\n this._subscribeCb?.();\n return () => {\n this._messageCb = undefined;\n };\n },\n };\n\n get stream(): Duplex {\n return this._stream;\n }\n\n /**\n * Attempts to pop frames from the buffer and call the message callback.\n */\n private _popFrames() {\n let offset = 0;\n while (offset < this._buffer!.length) {\n const frame = decodeFrame(this._buffer!, offset);\n\n if (!frame) {\n break; // Couldn't read frame but there are still bytes left in the buffer.\n }\n offset += frame.bytesConsumed;\n // TODO(dmaretskyi): Possible bug if the peer unsubscribes while we're reading frames.\n // log('read', { len: frame.payload.length, frame: Buffer.from(frame.payload).toString('hex') })\n this._messageCb!(frame.payload);\n }\n\n if (offset < this._buffer!.length) {\n // Save the rest of the bytes for the next write call.\n this._buffer = this._buffer!.subarray(offset);\n } else {\n this._buffer = undefined;\n }\n }\n\n destroy() {\n // TODO(dmaretskyi): Call stream.end() instead?\n this._stream.destroy();\n }\n}\n\n/**\n * Attempts to read a frame from the input buffer.\n */\nexport const decodeFrame = (buffer: Buffer, offset: number): { payload: Buffer; bytesConsumed: number } | undefined => {\n try {\n const frameLength = varint.decode(buffer, offset);\n const tagLength = varint.decode.bytes;\n\n if (buffer.length < offset + tagLength + frameLength) {\n // Not enough bytes to read the frame.\n return undefined;\n }\n\n const payload = buffer.subarray(offset + tagLength, offset + tagLength + frameLength);\n\n return {\n payload,\n bytesConsumed: tagLength + frameLength,\n };\n } catch (err) {\n if (err instanceof RangeError) {\n // Not enough bytes to read the tag.\n return undefined;\n } else {\n throw err;\n }\n }\n};\n\nexport const encodeFrame = (payload: Uint8Array): Buffer => {\n const tagLength = varint.encodingLength(payload.length);\n const frame = Buffer.allocUnsafe(tagLength + payload.length);\n varint.encode(payload.length, frame);\n frame.set(payload, tagLength);\n return frame;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Duplex } from 'node:stream';\nimport invariant from 'tiny-invariant';\n\nimport { Event, scheduleTaskInterval } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { failUndefined } from '@dxos/debug';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { ConnectionInfo } from '@dxos/protocols/proto/dxos/devtools/swarm';\nimport { Command } from '@dxos/protocols/proto/dxos/mesh/muxer';\n\nimport { Framer } from './framer';\nimport { RpcPort } from './rpc-port';\n\nconst Command = schema.getCodecForType('dxos.mesh.muxer.Command');\n\nexport type CleanupCb = void | (() => void);\n\nexport type CreateChannelOpts = {\n /**\n * MIME type of the wire content.\n *\n * Examples:\n * - application/octet-stream\n * - application/x-protobuf; messageType=\"dxos.rpc.Message\"\n */\n contentType?: string;\n};\n\nconst STATS_INTERVAL = 1000;\n\n/**\n * Channel based multiplexer.\n *\n * Can be used to open a number of channels represented by streams or RPC ports.\n * Performs framing for RPC ports.\n * Will buffer data until the remote peer opens the channel.\n *\n * The API will not advertise channels that as they are opened by the remote peer.\n * A higher level API (could be build on top of this muxer) for channel discovery is required.\n */\nexport class Muxer {\n private readonly _framer = new Framer();\n public readonly stream = this._framer.stream;\n\n private readonly _channelsByLocalId = new Map<number, Channel>();\n private readonly _channelsByTag = new Map<string, Channel>();\n\n private _nextId = 0;\n private _destroyed = false;\n private _destroying = false;\n\n public close = new Event<Error | undefined>();\n\n public statsUpdated = new Event<ConnectionInfo.StreamStats[]>();\n\n private readonly _ctx = new Context();\n\n constructor() {\n this._framer.port.subscribe((msg) => {\n this._handleCommand(Command.decode(msg));\n });\n\n scheduleTaskInterval(this._ctx, async () => this._emitStats(), STATS_INTERVAL);\n }\n\n /**\n * Creates a duplex Node.js-style stream.\n * The remote peer is expected to call `createStream` with the same tag.\n * The stream is immediately readable and writable.\n * NOTE: The data will be buffered until the stream is opened remotely with the same tag (may cause a memory leak).\n */\n createStream(tag: string, opts: CreateChannelOpts = {}): Duplex {\n const channel = this._getOrCreateStream({\n tag,\n contentType: opts.contentType,\n });\n invariant(!channel.push, `Channel already open: ${tag}`);\n\n const stream = new Duplex({\n write: (data, encoding, callback) => {\n this._sendData(channel, data);\n // TODO(dmaretskyi): Should we error if sending data has errored?\n callback();\n },\n read: () => {}, // No-op. We will push data when we receive it.\n });\n\n channel.push = (data) => {\n channel.stats.bytesReceived += data.length;\n stream.push(data);\n };\n channel.destroy = (err) => {\n // TODO(dmaretskyi): Call stream.end() instead?\n stream.destroy(err);\n };\n\n // NOTE: Make sure channel.push is set before sending the command.\n this._sendCommand({\n openChannel: {\n id: channel.id,\n tag: channel.tag,\n contentType: channel.contentType,\n },\n });\n\n return stream;\n }\n\n /**\n * Creates an RPC port.\n * The remote peer is expected to call `createPort` with the same tag.\n * The port is immediately usable.\n * NOTE: The data will be buffered until the stream is opened remotely with the same tag (may cause a memory leak).\n */\n createPort(tag: string, opts: CreateChannelOpts = {}): RpcPort {\n const channel = this._getOrCreateStream({\n tag,\n contentType: opts.contentType,\n });\n invariant(!channel.push, `Channel already open: ${tag}`);\n\n // We need to buffer incoming data until the port is subscribed to.\n let inboundBuffer: Uint8Array[] = [];\n let callback: ((data: Uint8Array) => void) | undefined;\n\n channel.push = (data) => {\n channel.stats.bytesReceived += data.length;\n if (callback) {\n callback(data);\n } else {\n inboundBuffer.push(data);\n }\n };\n\n const port: RpcPort = {\n send: (data: Uint8Array) => {\n this._sendData(channel, data); // TODO(dmaretskyi): Error propagation?\n\n // TODO(dmaretskyi): Debugging.\n // appendFileSync('log.json', JSON.stringify(schema.getCodecForType('dxos.rpc.RpcMessage').decode(data), null, 2) + '\\n')\n },\n subscribe: (cb: (data: Uint8Array) => void) => {\n invariant(!callback, 'Only one subscriber is allowed');\n callback = cb;\n for (const data of inboundBuffer) {\n cb(data);\n }\n inboundBuffer = [];\n },\n };\n\n // NOTE: Make sure channel.push is set before sending the command.\n this._sendCommand({\n openChannel: {\n id: channel.id,\n tag: channel.tag,\n contentType: channel.contentType,\n },\n });\n\n return port;\n }\n\n /**\n * Force-close with optional error.\n */\n destroy(err?: Error) {\n if (this._destroying) {\n return;\n }\n this._destroying = true;\n\n this._sendCommand({\n destroy: {\n error: err?.message,\n },\n });\n this._dispose();\n void this._ctx.dispose();\n }\n\n private _dispose(err?: Error) {\n if (this._destroyed) {\n return;\n }\n\n this._destroyed = true;\n this._framer.destroy();\n\n for (const channel of this._channelsByTag.values()) {\n channel.destroy?.(err);\n }\n\n this.close.emit(err);\n\n // Make it easy for GC.\n this._channelsByLocalId.clear();\n this._channelsByTag.clear();\n }\n\n private _handleCommand(cmd: Command) {\n log('Received command', { cmd });\n\n if (this._destroyed || this._destroying) {\n log.warn('Received command after destroy');\n return;\n }\n\n if (cmd.openChannel) {\n const channel = this._getOrCreateStream({\n tag: cmd.openChannel.tag,\n contentType: cmd.openChannel.contentType,\n });\n channel.remoteId = cmd.openChannel.id;\n\n // Flush any buffered data.\n for (const data of channel.buffer) {\n this._sendCommand({\n data: {\n channelId: channel.remoteId,\n data,\n },\n });\n }\n channel.buffer = [];\n } else if (cmd.data) {\n const stream = this._channelsByLocalId.get(cmd.data.channelId) ?? failUndefined();\n if (!stream.push) {\n log.warn('Received data for channel before it was opened', { tag: stream.tag });\n return;\n }\n stream.push(cmd.data.data);\n } else if (cmd.destroy) {\n this._dispose();\n }\n }\n\n private _sendCommand(cmd: Command) {\n Promise.resolve(this._framer.port.send(Command.encode(cmd))).catch((err) => {\n this.destroy(err);\n });\n }\n\n private _getOrCreateStream(params: CreateChannelInternalParams): Channel {\n let channel = this._channelsByTag.get(params.tag);\n if (!channel) {\n channel = {\n id: this._nextId++,\n remoteId: null,\n tag: params.tag,\n contentType: params.contentType,\n buffer: [],\n push: null,\n destroy: null,\n stats: {\n bytesSent: 0,\n bytesReceived: 0,\n },\n };\n this._channelsByTag.set(channel.tag, channel);\n this._channelsByLocalId.set(channel.id, channel);\n }\n return channel;\n }\n\n private _sendData(channel: Channel, data: Uint8Array) {\n channel.stats.bytesSent += data.length;\n if (channel.remoteId === null) {\n // Remote side has not opened the channel yet.\n channel.buffer.push(data);\n } else {\n this._sendCommand({\n data: {\n channelId: channel.remoteId,\n data,\n },\n });\n }\n }\n\n private async _emitStats() {\n if (this._destroyed || this._destroying) {\n return;\n }\n\n this.statsUpdated.emit(\n Array.from(this._channelsByTag.values()).map((channel) => ({\n id: channel.id,\n tag: channel.tag,\n bytesSent: channel.stats.bytesSent,\n bytesReceived: channel.stats.bytesReceived,\n })),\n );\n }\n}\n\ntype Channel = {\n /**\n * Our local channel ID.\n * Incoming Data commands will have this ID.\n */\n id: number;\n tag: string;\n\n /**\n * Remote id is set when we receive an OpenChannel command.\n * The originating Data commands should carry this id.\n */\n remoteId: null | number;\n\n contentType?: string;\n\n /**\n * Send buffer.\n */\n buffer: Uint8Array[];\n\n /**\n * Set when we initialize a NodeJS stream or an RPC port consuming the channel.\n */\n push: null | ((data: Uint8Array) => void);\n\n destroy: null | ((err?: Error) => void);\n\n stats: {\n bytesSent: number;\n bytesReceived: number;\n };\n};\n\ntype CreateChannelInternalParams = {\n tag: string;\n contentType?: string;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Duplex } from 'node:stream';\nimport invariant from 'tiny-invariant';\n\nimport { asyncTimeout, scheduleTaskInterval, runInContextAsync, synchronized, scheduleTask, Event } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { failUndefined } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, RpcClosedError } from '@dxos/protocols';\nimport { ConnectionInfo } from '@dxos/protocols/proto/dxos/devtools/swarm';\nimport { ControlService } from '@dxos/protocols/proto/dxos/mesh/teleport/control';\nimport { createProtoRpcPeer, ProtoRpcPeer } from '@dxos/rpc';\nimport { Callback } from '@dxos/util';\n\nimport { CreateChannelOpts, Muxer, RpcPort } from './muxing';\n\nexport type TeleportParams = {\n initiator: boolean;\n localPeerId: PublicKey;\n remotePeerId: PublicKey;\n};\n\nexport class Teleport {\n public readonly initiator: boolean;\n public readonly localPeerId: PublicKey;\n public readonly remotePeerId: PublicKey;\n\n private readonly _ctx = new Context({\n onError: (err) => {\n void this.destroy(err).catch(() => {\n log.error('Error during destroy', err);\n });\n },\n });\n\n private readonly _muxer = new Muxer();\n\n private readonly _control = new ControlExtension({\n heartbeatInterval: 10_000,\n heartbeatTimeout: 10_000,\n onTimeout: () => {\n this.destroy(new Error('Connection timed out')).catch((err) => log.catch(err));\n },\n });\n\n private readonly _extensions = new Map<string, TeleportExtension>();\n private readonly _remoteExtensions = new Set<string>();\n\n private _open = false;\n\n constructor({ initiator, localPeerId, remotePeerId }: TeleportParams) {\n invariant(typeof initiator === 'boolean');\n invariant(PublicKey.isPublicKey(localPeerId));\n invariant(PublicKey.isPublicKey(remotePeerId));\n invariant(typeof initiator === 'boolean');\n this.initiator = initiator;\n this.localPeerId = localPeerId;\n this.remotePeerId = remotePeerId;\n\n this._control.onExtensionRegistered.set(async (name) => {\n log('remote extension', { name });\n invariant(!this._remoteExtensions.has(name), 'Remote extension already exists');\n this._remoteExtensions.add(name);\n\n if (this._extensions.has(name)) {\n try {\n await this._openExtension(name);\n } catch (err: any) {\n await this.destroy(err);\n }\n }\n });\n\n {\n // Destroy Teleport when the stream is closed.\n this._muxer.stream.on('close', async () => {\n await this.destroy();\n });\n\n this._muxer.stream.on('error', async (err) => {\n await this.destroy(err);\n });\n }\n }\n\n get stream(): Duplex {\n return this._muxer.stream;\n }\n\n get stats(): Event<ConnectionInfo.StreamStats[]> {\n return this._muxer.statsUpdated;\n }\n\n /**\n * Blocks until the handshake is complete.\n */\n async open() {\n this._setExtension('dxos.mesh.teleport.control', this._control);\n await this._openExtension('dxos.mesh.teleport.control');\n this._open = true;\n }\n\n async close(err?: Error) {\n // TODO(dmaretskyi): Try soft close.\n\n await this.destroy(err);\n }\n\n @synchronized\n async destroy(err?: Error) {\n if (this._ctx.disposed) {\n return;\n }\n\n await this._ctx.dispose();\n\n for (const extension of this._extensions.values()) {\n try {\n await extension.onClose(err);\n } catch (err: any) {\n log.catch(err);\n }\n }\n\n this._muxer.destroy(err);\n }\n\n addExtension(name: string, extension: TeleportExtension) {\n if (!this._open) {\n throw new Error('Not open');\n }\n\n log('addExtension', { name });\n this._setExtension(name, extension);\n\n // Perform the registration in a separate tick as this might block while the remote side is opening the extension.\n scheduleTask(this._ctx, async () => {\n try {\n await this._control.registerExtension(name);\n } catch (err) {\n if (err instanceof RpcClosedError) {\n return;\n }\n throw err;\n }\n });\n\n if (this._remoteExtensions.has(name)) {\n // Open the extension in a separate tick.\n scheduleTask(this._ctx, async () => {\n await this._openExtension(name);\n });\n }\n }\n\n private _setExtension(extensionName: string, extension: TeleportExtension) {\n invariant(!extensionName.includes('/'), 'Invalid extension name');\n invariant(!this._extensions.has(extensionName), 'Extension already exists');\n this._extensions.set(extensionName, extension);\n }\n\n private async _openExtension(extensionName: string) {\n log('open extension', { extensionName });\n const extension = this._extensions.get(extensionName) ?? failUndefined();\n\n const context: ExtensionContext = {\n initiator: this.initiator,\n localPeerId: this.localPeerId,\n remotePeerId: this.remotePeerId,\n createPort: (channelName: string, opts?: CreateChannelOpts) => {\n invariant(!channelName.includes('/'), 'Invalid channel name');\n return this._muxer.createPort(`${extensionName}/${channelName}`, opts);\n },\n createStream: (channelName: string, opts?: CreateChannelOpts) => {\n invariant(!channelName.includes('/'), 'Invalid channel name');\n return this._muxer.createStream(`${extensionName}/${channelName}`, opts);\n },\n close: (err) => {\n void runInContextAsync(this._ctx, async () => {\n await this.close(err);\n });\n },\n };\n\n await extension.onOpen(context);\n log('extension opened', { extensionName });\n }\n}\n\nexport type ExtensionContext = {\n /**\n * One of the peers will be designated an initiator.\n */\n initiator: boolean;\n localPeerId: PublicKey;\n remotePeerId: PublicKey;\n createStream(tag: string, opts?: CreateChannelOpts): Duplex;\n createPort(tag: string, opts?: CreateChannelOpts): RpcPort;\n close(err?: Error): void;\n};\n\nexport interface TeleportExtension {\n onOpen(context: ExtensionContext): Promise<void>;\n onClose(err?: Error): Promise<void>;\n}\n\ntype ControlExtensionOpts = {\n heartbeatInterval: number;\n heartbeatTimeout: number;\n onTimeout: () => void;\n};\n\nclass ControlExtension implements TeleportExtension {\n private readonly _ctx = new Context({\n onError: (err) => {\n this._extensionContext.close(err);\n },\n });\n\n private _extensionContext!: ExtensionContext;\n private _rpc!: ProtoRpcPeer<{ Control: ControlService }>;\n\n public readonly onExtensionRegistered = new Callback<(extensionName: string) => void>();\n\n constructor(private readonly opts: ControlExtensionOpts) {}\n\n async onOpen(extensionContext: ExtensionContext): Promise<void> {\n this._extensionContext = extensionContext;\n\n // NOTE: Make sure that RPC timeout is greater than the heartbeat timeout.\n // TODO(dmaretskyi): Allow overwriting the timeout on individual RPC calls?\n this._rpc = createProtoRpcPeer<ControlRpcBundle, ControlRpcBundle>({\n requested: {\n Control: schema.getService('dxos.mesh.teleport.control.ControlService'),\n },\n exposed: {\n Control: schema.getService('dxos.mesh.teleport.control.ControlService'),\n },\n handlers: {\n Control: {\n registerExtension: async (request) => {\n this.onExtensionRegistered.call(request.name);\n },\n heartbeat: async (request) => {\n // Ok.\n },\n },\n },\n port: extensionContext.createPort('rpc', {\n contentType: 'application/x-protobuf; messagType=\"dxos.rpc.Message\"',\n }),\n });\n\n await this._rpc.open();\n\n scheduleTaskInterval(\n this._ctx,\n async () => {\n try {\n await asyncTimeout(this._rpc.rpc.Control.heartbeat(), this.opts.heartbeatTimeout);\n } catch (err: any) {\n this.opts.onTimeout();\n }\n },\n this.opts.heartbeatInterval,\n );\n }\n\n async onClose(err?: Error): Promise<void> {\n await this._ctx.dispose();\n await this._rpc.close();\n }\n\n async registerExtension(name: string) {\n await this._rpc.rpc.Control.registerExtension({ name });\n }\n}\n\ntype ControlRpcBundle = {\n Control: ControlService;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport invariant from 'tiny-invariant';\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { TestService } from '@dxos/protocols/proto/example/testing/rpc';\nimport { createProtoRpcPeer, ProtoRpcPeer } from '@dxos/rpc';\n\nimport { ExtensionContext, TeleportExtension } from '../teleport';\n\ninterface TestExtensionCallbacks {\n onOpen?: () => Promise<void>;\n onClose?: () => Promise<void>;\n}\n\nexport class TestExtension implements TeleportExtension {\n public readonly open = new Trigger();\n public readonly closed = new Trigger();\n public extensionContext: ExtensionContext | undefined;\n private _rpc!: ProtoRpcPeer<{ TestService: TestService }>;\n\n constructor(public readonly callbacks: TestExtensionCallbacks = {}) {}\n\n get remotePeerId() {\n return this.extensionContext?.remotePeerId;\n }\n\n async onOpen(context: ExtensionContext) {\n log('onOpen', { localPeerId: context.localPeerId, remotePeerId: context.remotePeerId });\n this.extensionContext = context;\n this._rpc = createProtoRpcPeer<{ TestService: TestService }, { TestService: TestService }>({\n port: context.createPort('rpc', {\n contentType: 'application/x-protobuf; messageType=\"dxos.rpc.Message\"',\n }),\n requested: {\n TestService: schema.getService('example.testing.rpc.TestService'),\n },\n exposed: {\n TestService: schema.getService('example.testing.rpc.TestService'),\n },\n handlers: {\n TestService: {\n voidCall: async (request) => {\n // Ok.\n },\n testCall: async (request) => {\n return {\n data: request.data,\n };\n },\n },\n },\n timeout: 1000,\n });\n\n await this._rpc.open();\n await this.callbacks.onOpen?.();\n\n this.open.wake();\n }\n\n async onClose(err?: Error) {\n log('onClose', { err });\n await this.callbacks.onClose?.();\n this.closed.wake();\n await this._rpc?.close();\n }\n\n async test(message = 'test') {\n await this.open.wait({ timeout: 500 });\n const res = await asyncTimeout(this._rpc.rpc.TestService.testCall({ data: message }), 500);\n invariant(res.data === message);\n }\n\n /**\n * Force-close the connection.\n */\n async closeConnection(err?: Error) {\n this.extensionContext?.close(err);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Duplex", "invariant", "varint", "Framer", "_stream", "Duplex", "objectMode", "read", "write", "chunk", "encoding", "callback", "invariant", "_subscribeCb", "_buffer", "length", "Buffer", "concat", "_messageCb", "_popFrames", "undefined", "port", "send", "message", "push", "encodeFrame", "subscribe", "stream", "offset", "frame", "decodeFrame", "bytesConsumed", "payload", "subarray", "destroy", "buffer", "frameLength", "decode", "tagLength", "bytes", "err", "RangeError", "encodingLength", "allocUnsafe", "varint", "encode", "set", "Duplex", "invariant", "Event", "scheduleTaskInterval", "Context", "failUndefined", "log", "schema", "Command", "schema", "getCodecForType", "STATS_INTERVAL", "Muxer", "constructor", "_framer", "Framer", "stream", "_channelsByLocalId", "Map", "_channelsByTag", "_nextId", "_destroyed", "_destroying", "close", "Event", "statsUpdated", "_ctx", "Context", "port", "subscribe", "msg", "_handleCommand", "decode", "scheduleTaskInterval", "_emitStats", "createStream", "tag", "opts", "channel", "_getOrCreateStream", "contentType", "invariant", "push", "Duplex", "write", "data", "encoding", "callback", "_sendData", "read", "stats", "bytesReceived", "length", "destroy", "err", "_sendCommand", "openChannel", "id", "createPort", "inboundBuffer", "send", "cb", "error", "message", "_dispose", "dispose", "values", "emit", "clear", "cmd", "log", "warn", "remoteId", "buffer", "channelId", "get", "failUndefined", "Promise", "resolve", "encode", "catch", "params", "bytesSent", "set", "Array", "from", "map", "invariant", "asyncTimeout", "scheduleTaskInterval", "runInContextAsync", "synchronized", "scheduleTask", "Context", "failUndefined", "PublicKey", "log", "schema", "RpcClosedError", "createProtoRpcPeer", "Callback", "Teleport", "constructor", "initiator", "localPeerId", "remotePeerId", "_ctx", "Context", "onError", "err", "destroy", "catch", "log", "error", "_muxer", "Muxer", "_control", "ControlExtension", "heartbeatInterval", "heartbeatTimeout", "onTimeout", "Error", "_extensions", "Map", "_remoteExtensions", "Set", "_open", "invariant", "PublicKey", "isPublicKey", "onExtensionRegistered", "set", "name", "has", "add", "_openExtension", "stream", "on", "stats", "statsUpdated", "open", "_setExtension", "close", "disposed", "dispose", "extension", "values", "onClose", "addExtension", "scheduleTask", "registerExtension", "RpcClosedError", "extensionName", "includes", "get", "failUndefined", "context", "createPort", "channelName", "opts", "createStream", "runInContextAsync", "onOpen", "synchronized", "_extensionContext", "Callback", "extensionContext", "_rpc", "createProtoRpcPeer", "requested", "Control", "schema", "getService", "exposed", "handlers", "request", "call", "heartbeat", "port", "contentType", "scheduleTaskInterval", "asyncTimeout", "rpc", "invariant", "asyncTimeout", "Trigger", "log", "schema", "createProtoRpcPeer", "TestExtension", "constructor", "callbacks", "open", "closed", "remotePeerId", "extensionContext", "onOpen", "context", "localPeerId", "_rpc", "port", "createPort", "contentType", "requested", "TestService", "getService", "exposed", "handlers", "voidCall", "request", "testCall", "data", "timeout", "wake", "onClose", "err", "close", "test", "message", "wait", "res", "rpc", "closeConnection"]
7
+ }
@@ -1,4 +1,4 @@
1
- import "@dxos/node-std/globals"
1
+ import "@dxos/node-std/globals";
2
2
  import {
3
3
  Framer,
4
4
  Muxer,
@@ -6,10 +6,10 @@ import {
6
6
  TestExtension,
7
7
  decodeFrame,
8
8
  encodeFrame
9
- } from "./chunk-XWWASTDK.mjs";
9
+ } from "./chunk-EIJETGTE.mjs";
10
10
 
11
11
  // packages/core/mesh/teleport/src/rpc-extension.ts
12
- import assert from "@dxos/node-std/assert";
12
+ import invariant from "tiny-invariant";
13
13
  import { createProtoRpcPeer } from "@dxos/rpc";
14
14
  var RpcExtension = class {
15
15
  constructor(_rpcParams) {
@@ -26,7 +26,7 @@ var RpcExtension = class {
26
26
  return this._extensionContext.remotePeerId;
27
27
  }
28
28
  get rpc() {
29
- assert(this._rpc);
29
+ invariant(this._rpc);
30
30
  return this._rpc.rpc;
31
31
  }
32
32
  async onOpen(context) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/rpc-extension.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { createProtoRpcPeer, ProtoRpcPeer, ProtoRpcPeerOptions } from '@dxos/rpc';\n\nimport { ExtensionContext, TeleportExtension } from './teleport';\n\nexport abstract class RpcExtension<Client, Server> implements TeleportExtension {\n // TODO(dmaretskyi): Type optionally.\n private _extensionContext!: ExtensionContext;\n private _rpc?: ProtoRpcPeer<Client>;\n\n private _isClosed = false;\n\n constructor(private readonly _rpcParams: Omit<ProtoRpcPeerOptions<Client, Server>, 'port' | 'handlers'>) {}\n\n get initiator() {\n return this._extensionContext.initiator;\n }\n\n get localPeerId() {\n return this._extensionContext.localPeerId;\n }\n\n get remotePeerId() {\n return this._extensionContext.remotePeerId;\n }\n\n get rpc(): Client {\n assert(this._rpc);\n return this._rpc.rpc;\n }\n\n protected abstract getHandlers(): Promise<Server>;\n\n async onOpen(context: ExtensionContext): Promise<void> {\n this._extensionContext = context;\n\n const handlers = await this.getHandlers();\n\n if (this._isClosed) {\n return;\n }\n\n const port = context.createPort('rpc', {\n contentType: 'application/x-protobuf; messageType=\"dxos.rpc.Message\"',\n });\n this._rpc = createProtoRpcPeer({\n ...this._rpcParams,\n handlers,\n port,\n });\n\n await this._rpc.open();\n }\n\n async onClose(err?: Error | undefined): Promise<void> {\n this._isClosed = true;\n await this._rpc?.close();\n }\n\n close() {\n this._extensionContext.close();\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;AAIA,OAAOA,YAAY;AAEnB,SAASC,0BAA6D;AAI/D,IAAeC,eAAf,MAAeA;EAOpBC,YAA6BC,YAA4E;sBAA5EA;SAFrBC,YAAY;EAEsF;EAE1G,IAAIC,YAAY;AACd,WAAO,KAAKC,kBAAkBD;EAChC;EAEA,IAAIE,cAAc;AAChB,WAAO,KAAKD,kBAAkBC;EAChC;EAEA,IAAIC,eAAe;AACjB,WAAO,KAAKF,kBAAkBE;EAChC;EAEA,IAAIC,MAAc;AAChBV,WAAO,KAAKW,IAAI;AAChB,WAAO,KAAKA,KAAKD;EACnB;EAIA,MAAME,OAAOC,SAA0C;AACrD,SAAKN,oBAAoBM;AAEzB,UAAMC,WAAW,MAAM,KAAKC,YAAW;AAEvC,QAAI,KAAKV,WAAW;AAClB;IACF;AAEA,UAAMW,OAAOH,QAAQI,WAAW,OAAO;MACrCC,aAAa;IACf,CAAA;AACA,SAAKP,OAAOV,mBAAmB;MAC7B,GAAG,KAAKG;MACRU;MACAE;IACF,CAAA;AAEA,UAAM,KAAKL,KAAKQ,KAAI;EACtB;EAEA,MAAMC,QAAQC,KAAwC;AA3DxD;AA4DI,SAAKhB,YAAY;AACjB,YAAM,UAAKM,SAAL,mBAAWW;EACnB;EAEAA,QAAQ;AACN,SAAKf,kBAAkBe,MAAK;EAC9B;AACF;",
6
- "names": ["assert", "createProtoRpcPeer", "RpcExtension", "constructor", "_rpcParams", "_isClosed", "initiator", "_extensionContext", "localPeerId", "remotePeerId", "rpc", "_rpc", "onOpen", "context", "handlers", "getHandlers", "port", "createPort", "contentType", "open", "onClose", "err", "close"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport invariant from 'tiny-invariant';\n\nimport { createProtoRpcPeer, ProtoRpcPeer, ProtoRpcPeerOptions } from '@dxos/rpc';\n\nimport { ExtensionContext, TeleportExtension } from './teleport';\n\nexport abstract class RpcExtension<Client, Server> implements TeleportExtension {\n // TODO(dmaretskyi): Type optionally.\n private _extensionContext!: ExtensionContext;\n private _rpc?: ProtoRpcPeer<Client>;\n\n private _isClosed = false;\n\n constructor(private readonly _rpcParams: Omit<ProtoRpcPeerOptions<Client, Server>, 'port' | 'handlers'>) {}\n\n get initiator() {\n return this._extensionContext.initiator;\n }\n\n get localPeerId() {\n return this._extensionContext.localPeerId;\n }\n\n get remotePeerId() {\n return this._extensionContext.remotePeerId;\n }\n\n get rpc(): Client {\n invariant(this._rpc);\n return this._rpc.rpc;\n }\n\n protected abstract getHandlers(): Promise<Server>;\n\n async onOpen(context: ExtensionContext): Promise<void> {\n this._extensionContext = context;\n\n const handlers = await this.getHandlers();\n\n if (this._isClosed) {\n return;\n }\n\n const port = context.createPort('rpc', {\n contentType: 'application/x-protobuf; messageType=\"dxos.rpc.Message\"',\n });\n this._rpc = createProtoRpcPeer({\n ...this._rpcParams,\n handlers,\n port,\n });\n\n await this._rpc.open();\n }\n\n async onClose(err?: Error | undefined): Promise<void> {\n this._isClosed = true;\n await this._rpc?.close();\n }\n\n close() {\n this._extensionContext.close();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AAIA,OAAOA,eAAe;AAEtB,SAASC,0BAA6D;AAI/D,IAAeC,eAAf,MAAeA;EAOpBC,YAA6BC,YAA4E;sBAA5EA;SAFrBC,YAAY;EAEsF;EAE1G,IAAIC,YAAY;AACd,WAAO,KAAKC,kBAAkBD;EAChC;EAEA,IAAIE,cAAc;AAChB,WAAO,KAAKD,kBAAkBC;EAChC;EAEA,IAAIC,eAAe;AACjB,WAAO,KAAKF,kBAAkBE;EAChC;EAEA,IAAIC,MAAc;AAChBC,cAAU,KAAKC,IAAI;AACnB,WAAO,KAAKA,KAAKF;EACnB;EAIA,MAAMG,OAAOC,SAA0C;AACrD,SAAKP,oBAAoBO;AAEzB,UAAMC,WAAW,MAAM,KAAKC,YAAW;AAEvC,QAAI,KAAKX,WAAW;AAClB;IACF;AAEA,UAAMY,OAAOH,QAAQI,WAAW,OAAO;MACrCC,aAAa;IACf,CAAA;AACA,SAAKP,OAAOQ,mBAAmB;MAC7B,GAAG,KAAKhB;MACRW;MACAE;IACF,CAAA;AAEA,UAAM,KAAKL,KAAKS,KAAI;EACtB;EAEA,MAAMC,QAAQC,KAAwC;AA3DxD;AA4DI,SAAKlB,YAAY;AACjB,YAAM,UAAKO,SAAL,mBAAWY;EACnB;EAEAA,QAAQ;AACN,SAAKjB,kBAAkBiB,MAAK;EAC9B;AACF;",
6
+ "names": ["invariant", "createProtoRpcPeer", "RpcExtension", "constructor", "_rpcParams", "_isClosed", "initiator", "_extensionContext", "localPeerId", "remotePeerId", "rpc", "invariant", "_rpc", "onOpen", "context", "handlers", "getHandlers", "port", "createPort", "contentType", "createProtoRpcPeer", "open", "onClose", "err", "close"]
7
7
  }