@dxos/teleport 0.3.3-main.ff5734a → 0.3.3

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.
@@ -45,7 +45,7 @@ var import_keys2 = require("@dxos/keys");
45
45
  var import_log4 = require("@dxos/log");
46
46
 
47
47
  // packages/core/mesh/teleport/src/teleport.ts
48
- var import_async3 = require("@dxos/async");
48
+ var import_async4 = require("@dxos/async");
49
49
  var import_context2 = require("@dxos/context");
50
50
  var import_debug2 = require("@dxos/debug");
51
51
  var import_invariant3 = require("@dxos/invariant");
@@ -57,8 +57,9 @@ var import_util = require("@dxos/util");
57
57
 
58
58
  // packages/core/mesh/teleport/src/muxing/framer.ts
59
59
  var import_node_stream = require("node:stream");
60
+ var import_async = require("@dxos/async");
60
61
  var import_invariant = require("@dxos/invariant");
61
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/muxing/framer.ts";
62
+ var __dxlog_file = "/mnt/ramdisk/work/packages/core/mesh/teleport/src/muxing/framer.ts";
62
63
  var FRAME_LENGTH_SIZE = 2;
63
64
  var Framer = class {
64
65
  constructor() {
@@ -69,6 +70,9 @@ var Framer = class {
69
70
  this._sendCallbacks = [];
70
71
  this._bytesSent = 0;
71
72
  this._bytesReceived = 0;
73
+ this._writable = true;
74
+ this.drain = new import_async.Event();
75
+ // TODO(egorgripasov): Consider using a Transform stream if it provides better backpressure handling.
72
76
  this._stream = new import_node_stream.Duplex({
73
77
  objectMode: false,
74
78
  read: () => {
@@ -77,7 +81,7 @@ var Framer = class {
77
81
  write: (chunk, encoding, callback) => {
78
82
  (0, import_invariant.invariant)(!this._subscribeCb, "Internal Framer bug. Concurrent writes detected.", {
79
83
  F: __dxlog_file,
80
- L: 33,
84
+ L: 39,
81
85
  S: this,
82
86
  A: [
83
87
  "!this._subscribeCb",
@@ -110,8 +114,8 @@ var Framer = class {
110
114
  return new Promise((resolve) => {
111
115
  const frame = encodeFrame(message);
112
116
  this._bytesSent += frame.length;
113
- const canContinue = this._stream.push(frame);
114
- if (!canContinue) {
117
+ this._writable = this._stream.push(frame);
118
+ if (!this._writable) {
115
119
  this._sendCallbacks.push(resolve);
116
120
  } else {
117
121
  resolve();
@@ -121,7 +125,7 @@ var Framer = class {
121
125
  subscribe: (callback) => {
122
126
  (0, import_invariant.invariant)(!this._messageCb, "Rpc port already has a message listener.", {
123
127
  F: __dxlog_file,
124
- L: 72,
128
+ L: 78,
125
129
  S: this,
126
130
  A: [
127
131
  "!this._messageCb",
@@ -145,9 +149,14 @@ var Framer = class {
145
149
  get bytesReceived() {
146
150
  return this._bytesReceived;
147
151
  }
152
+ get writable() {
153
+ return this._writable;
154
+ }
148
155
  _processResponseQueue() {
149
156
  const responseQueue = this._sendCallbacks;
150
157
  this._sendCallbacks = [];
158
+ this._writable = true;
159
+ this.drain.emit();
151
160
  responseQueue.forEach((cb) => cb());
152
161
  }
153
162
  /**
@@ -197,7 +206,7 @@ var encodeFrame = (payload) => {
197
206
 
198
207
  // packages/core/mesh/teleport/src/muxing/muxer.ts
199
208
  var import_node_stream2 = require("node:stream");
200
- var import_async2 = require("@dxos/async");
209
+ var import_async3 = require("@dxos/async");
201
210
  var import_context = require("@dxos/context");
202
211
  var import_debug = require("@dxos/debug");
203
212
  var import_invariant2 = require("@dxos/invariant");
@@ -206,9 +215,9 @@ var import_protocols = require("@dxos/protocols");
206
215
 
207
216
  // packages/core/mesh/teleport/src/muxing/balancer.ts
208
217
  var varint = __toESM(require("varint"));
209
- var import_async = require("@dxos/async");
218
+ var import_async2 = require("@dxos/async");
210
219
  var import_log = require("@dxos/log");
211
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/muxing/balancer.ts";
220
+ var __dxlog_file2 = "/mnt/ramdisk/work/packages/core/mesh/teleport/src/muxing/balancer.ts";
212
221
  var MAX_CHUNK_SIZE = 8192;
213
222
  var Balancer = class {
214
223
  constructor(_sysChannelId) {
@@ -218,7 +227,7 @@ var Balancer = class {
218
227
  this._framer = new Framer();
219
228
  this._sendBuffers = /* @__PURE__ */ new Map();
220
229
  this._receiveBuffers = /* @__PURE__ */ new Map();
221
- this.incomingData = new import_async.Event();
230
+ this.incomingData = new import_async2.Event();
222
231
  this.stream = this._framer.stream;
223
232
  this._channels.push(_sysChannelId);
224
233
  this._framer.port.subscribe(this._processIncomingMessage.bind(this));
@@ -229,6 +238,9 @@ var Balancer = class {
229
238
  get bytesReceived() {
230
239
  return this._framer.bytesReceived;
231
240
  }
241
+ get buffersCount() {
242
+ return this._sendBuffers.size;
243
+ }
232
244
  addChannel(channel) {
233
245
  this._channels.push(channel);
234
246
  }
@@ -257,9 +269,9 @@ var Balancer = class {
257
269
  });
258
270
  });
259
271
  if (noCalls) {
260
- this._sendChunks().catch((err) => import_log.log.catch(err, void 0, {
272
+ this._sendChunk().catch((err) => import_log.log.catch(err, void 0, {
261
273
  F: __dxlog_file2,
262
- L: 96,
274
+ L: 100,
263
275
  S: this,
264
276
  C: (f, a) => f(...a)
265
277
  }));
@@ -317,10 +329,13 @@ var Balancer = class {
317
329
  }
318
330
  return chunk;
319
331
  }
320
- async _sendChunks() {
332
+ async _sendChunk() {
321
333
  if (this._sendBuffers.size === 0) {
322
334
  return;
323
335
  }
336
+ if (!this._framer.writable) {
337
+ await this._framer.drain.waitForCount(1);
338
+ }
324
339
  const chunk = this._getNextChunk();
325
340
  try {
326
341
  await this._framer.port.send(chunk.msg);
@@ -328,7 +343,7 @@ var Balancer = class {
328
343
  } catch (err) {
329
344
  chunk.trigger?.throw(err);
330
345
  }
331
- await this._sendChunks();
346
+ await this._sendChunk();
332
347
  }
333
348
  };
334
349
  var encodeChunk = ({ channelId, dataLength, chunk }) => {
@@ -359,7 +374,7 @@ var decodeChunk = (data, withLength) => {
359
374
  };
360
375
 
361
376
  // packages/core/mesh/teleport/src/muxing/muxer.ts
362
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/muxing/muxer.ts";
377
+ var __dxlog_file3 = "/mnt/ramdisk/work/packages/core/mesh/teleport/src/muxing/muxer.ts";
363
378
  var Command = import_protocols.schema.getCodecForType("dxos.mesh.muxer.Command");
364
379
  var STATS_INTERVAL = 1e3;
365
380
  var MAX_SAFE_FRAME_SIZE = 1e6;
@@ -375,13 +390,13 @@ var Muxer = class {
375
390
  this._destroying = false;
376
391
  this._lastStats = void 0;
377
392
  this._lastChannelStats = /* @__PURE__ */ new Map();
378
- this.close = new import_async2.Event();
379
- this.statsUpdated = new import_async2.Event();
393
+ this.close = new import_async3.Event();
394
+ this.statsUpdated = new import_async3.Event();
380
395
  this.stream = this._balancer.stream;
381
396
  this._balancer.incomingData.on(async (msg) => {
382
397
  await this._handleCommand(Command.decode(msg));
383
398
  });
384
- (0, import_async2.scheduleTaskInterval)(this._ctx, async () => this._emitStats(), STATS_INTERVAL);
399
+ (0, import_async3.scheduleTaskInterval)(this._ctx, async () => this._emitStats(), STATS_INTERVAL);
385
400
  }
386
401
  /**
387
402
  * Creates a duplex Node.js-style stream.
@@ -586,7 +601,7 @@ var Muxer = class {
586
601
  }
587
602
  async _sendCommand(cmd, channelId = -1) {
588
603
  try {
589
- const trigger = new import_async2.Trigger();
604
+ const trigger = new import_async3.Trigger();
590
605
  this._balancer.pushData(Command.encode(cmd), trigger, channelId);
591
606
  await trigger.wait();
592
607
  } catch (err) {
@@ -699,7 +714,7 @@ function _ts_decorate(decorators, target, key, desc) {
699
714
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
700
715
  return c > 3 && r && Object.defineProperty(target, key, r), r;
701
716
  }
702
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/teleport.ts";
717
+ var __dxlog_file4 = "/mnt/ramdisk/work/packages/core/mesh/teleport/src/teleport.ts";
703
718
  var Teleport = class {
704
719
  constructor({ initiator, localPeerId, remotePeerId }) {
705
720
  this._ctx = new import_context2.Context({
@@ -908,7 +923,7 @@ var Teleport = class {
908
923
  C: (f, a) => f(...a)
909
924
  });
910
925
  this._setExtension(name, extension);
911
- (0, import_async3.scheduleTask)(this._ctx, async () => {
926
+ (0, import_async4.scheduleTask)(this._ctx, async () => {
912
927
  try {
913
928
  await this._control.registerExtension(name);
914
929
  } catch (err) {
@@ -919,7 +934,7 @@ var Teleport = class {
919
934
  }
920
935
  });
921
936
  if (this._remoteExtensions.has(name)) {
922
- (0, import_async3.scheduleTask)(this._ctx, async () => {
937
+ (0, import_async4.scheduleTask)(this._ctx, async () => {
923
938
  await this._openExtension(name);
924
939
  });
925
940
  }
@@ -984,7 +999,7 @@ var Teleport = class {
984
999
  return this._muxer.createStream(`${extensionName}/${channelName}`, opts);
985
1000
  },
986
1001
  close: (err) => {
987
- void (0, import_async3.runInContextAsync)(this._ctx, async () => {
1002
+ void (0, import_async4.runInContextAsync)(this._ctx, async () => {
988
1003
  await this.close(err);
989
1004
  });
990
1005
  }
@@ -1001,10 +1016,10 @@ var Teleport = class {
1001
1016
  }
1002
1017
  };
1003
1018
  _ts_decorate([
1004
- import_async3.synchronized
1019
+ import_async4.synchronized
1005
1020
  ], Teleport.prototype, "abort", null);
1006
1021
  _ts_decorate([
1007
- import_async3.synchronized
1022
+ import_async4.synchronized
1008
1023
  ], Teleport.prototype, "destroy", null);
1009
1024
  var ControlExtension = class {
1010
1025
  constructor(opts) {
@@ -1044,9 +1059,9 @@ var ControlExtension = class {
1044
1059
  })
1045
1060
  });
1046
1061
  await this._rpc.open();
1047
- (0, import_async3.scheduleTaskInterval)(this._ctx, async () => {
1062
+ (0, import_async4.scheduleTaskInterval)(this._ctx, async () => {
1048
1063
  try {
1049
- await (0, import_async3.asyncTimeout)(this._rpc.rpc.Control.heartbeat(), this.opts.heartbeatTimeout);
1064
+ await (0, import_async4.asyncTimeout)(this._rpc.rpc.Control.heartbeat(), this.opts.heartbeatTimeout);
1050
1065
  } catch (err) {
1051
1066
  this.opts.onTimeout();
1052
1067
  }
@@ -1063,7 +1078,7 @@ var ControlExtension = class {
1063
1078
  };
1064
1079
 
1065
1080
  // packages/core/mesh/teleport/src/testing/test-builder.ts
1066
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/testing/test-builder.ts";
1081
+ var __dxlog_file5 = "/mnt/ramdisk/work/packages/core/mesh/teleport/src/testing/test-builder.ts";
1067
1082
  var TestBuilder = class {
1068
1083
  constructor() {
1069
1084
  this._peers = /* @__PURE__ */ new Set();
@@ -1264,18 +1279,18 @@ var TestConnection = class {
1264
1279
  };
1265
1280
 
1266
1281
  // packages/core/mesh/teleport/src/testing/test-extension.ts
1267
- var import_async4 = require("@dxos/async");
1282
+ var import_async5 = require("@dxos/async");
1268
1283
  var import_invariant5 = require("@dxos/invariant");
1269
1284
  var import_log5 = require("@dxos/log");
1270
1285
  var import_protocols3 = require("@dxos/protocols");
1271
1286
  var import_rpc2 = require("@dxos/rpc");
1272
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/testing/test-extension.ts";
1287
+ var __dxlog_file6 = "/mnt/ramdisk/work/packages/core/mesh/teleport/src/testing/test-extension.ts";
1273
1288
  var TestExtension = class {
1274
1289
  constructor(callbacks = {}) {
1275
1290
  this.callbacks = callbacks;
1276
- this.open = new import_async4.Trigger();
1277
- this.closed = new import_async4.Trigger();
1278
- this.aborted = new import_async4.Trigger();
1291
+ this.open = new import_async5.Trigger();
1292
+ this.closed = new import_async5.Trigger();
1293
+ this.aborted = new import_async5.Trigger();
1279
1294
  }
1280
1295
  get remotePeerId() {
1281
1296
  return this.extensionContext?.remotePeerId;
@@ -1348,7 +1363,7 @@ var TestExtension = class {
1348
1363
  await this.open.wait({
1349
1364
  timeout: 1500
1350
1365
  });
1351
- const res = await (0, import_async4.asyncTimeout)(this._rpc.rpc.TestService.testCall({
1366
+ const res = await (0, import_async5.asyncTimeout)(this._rpc.rpc.TestService.testCall({
1352
1367
  data: message
1353
1368
  }), 1500);
1354
1369
  (0, import_invariant5.invariant)(res.data === message, void 0, {
@@ -1371,18 +1386,18 @@ var TestExtension = class {
1371
1386
 
1372
1387
  // packages/core/mesh/teleport/src/testing/test-extension-with-streams.ts
1373
1388
  var import_node_crypto = require("node:crypto");
1374
- var import_async5 = require("@dxos/async");
1389
+ var import_async6 = require("@dxos/async");
1375
1390
  var import_invariant6 = require("@dxos/invariant");
1376
1391
  var import_log6 = require("@dxos/log");
1377
1392
  var import_protocols4 = require("@dxos/protocols");
1378
1393
  var import_rpc3 = require("@dxos/rpc");
1379
- var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport/src/testing/test-extension-with-streams.ts";
1394
+ var __dxlog_file7 = "/mnt/ramdisk/work/packages/core/mesh/teleport/src/testing/test-extension-with-streams.ts";
1380
1395
  var TestExtensionWithStreams = class {
1381
1396
  constructor(callbacks = {}) {
1382
1397
  this.callbacks = callbacks;
1383
- this.open = new import_async5.Trigger();
1384
- this.closed = new import_async5.Trigger();
1385
- this.aborted = new import_async5.Trigger();
1398
+ this.open = new import_async6.Trigger();
1399
+ this.closed = new import_async6.Trigger();
1400
+ this.aborted = new import_async6.Trigger();
1386
1401
  this._streams = /* @__PURE__ */ new Map();
1387
1402
  }
1388
1403
  get remotePeerId() {