@dxos/echo-pipeline 0.8.3 → 0.8.4-main.28f8d3d

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.
Files changed (128) hide show
  1. package/dist/lib/browser/{chunk-35I6ERLG.mjs → chunk-2543T5DX.mjs} +224 -145
  2. package/dist/lib/browser/chunk-2543T5DX.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-TQJTKNMS.mjs → chunk-VUXUDIPM.mjs} +2 -2
  4. package/dist/lib/{node/chunk-HOPOFWAL.cjs.map → browser/chunk-VUXUDIPM.mjs.map} +3 -3
  5. package/dist/lib/browser/filter/index.mjs +1 -1
  6. package/dist/lib/browser/index.mjs +419 -242
  7. package/dist/lib/browser/index.mjs.map +4 -4
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/testing/index.mjs +42 -17
  10. package/dist/lib/browser/testing/index.mjs.map +3 -3
  11. package/dist/lib/node-esm/{chunk-RVK35BS7.mjs → chunk-PGZYXNYE.mjs} +2 -2
  12. package/dist/lib/node-esm/{chunk-RVK35BS7.mjs.map → chunk-PGZYXNYE.mjs.map} +2 -2
  13. package/dist/lib/node-esm/{chunk-5BHLPT24.mjs → chunk-UQI6R3TD.mjs} +224 -145
  14. package/dist/lib/node-esm/chunk-UQI6R3TD.mjs.map +7 -0
  15. package/dist/lib/node-esm/filter/index.mjs +1 -1
  16. package/dist/lib/node-esm/index.mjs +419 -242
  17. package/dist/lib/node-esm/index.mjs.map +4 -4
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/testing/index.mjs +42 -17
  20. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  21. package/dist/types/src/automerge/automerge-host.d.ts +1 -1
  22. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  23. package/dist/types/src/automerge/collection-synchronizer.d.ts +1 -1
  24. package/dist/types/src/automerge/collection-synchronizer.d.ts.map +1 -1
  25. package/dist/types/src/automerge/echo-network-adapter.d.ts +1 -1
  26. package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
  27. package/dist/types/src/automerge/echo-replicator.d.ts +1 -1
  28. package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
  29. package/dist/types/src/automerge/index.d.ts +1 -1
  30. package/dist/types/src/automerge/index.d.ts.map +1 -1
  31. package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +1 -1
  32. package/dist/types/src/automerge/leveldb-storage-adapter.d.ts.map +1 -1
  33. package/dist/types/src/automerge/mesh-echo-replicator.d.ts.map +1 -1
  34. package/dist/types/src/db-host/data-service.d.ts +2 -2
  35. package/dist/types/src/db-host/data-service.d.ts.map +1 -1
  36. package/dist/types/src/db-host/database-root.d.ts.map +1 -1
  37. package/dist/types/src/db-host/documents-synchronizer.d.ts +2 -2
  38. package/dist/types/src/db-host/documents-synchronizer.d.ts.map +1 -1
  39. package/dist/types/src/db-host/echo-host.d.ts +2 -2
  40. package/dist/types/src/db-host/echo-host.d.ts.map +1 -1
  41. package/dist/types/src/db-host/query-service.d.ts +1 -1
  42. package/dist/types/src/db-host/query-service.d.ts.map +1 -1
  43. package/dist/types/src/db-host/space-state-manager.d.ts +1 -1
  44. package/dist/types/src/db-host/space-state-manager.d.ts.map +1 -1
  45. package/dist/types/src/edge/echo-edge-replicator.d.ts.map +1 -1
  46. package/dist/types/src/filter/filter-match.d.ts +1 -1
  47. package/dist/types/src/filter/filter-match.d.ts.map +1 -1
  48. package/dist/types/src/metadata/metadata-store.d.ts +1 -1
  49. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  50. package/dist/types/src/pipeline/pipeline.d.ts +1 -1
  51. package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
  52. package/dist/types/src/query/errors.d.ts +19 -6
  53. package/dist/types/src/query/errors.d.ts.map +1 -1
  54. package/dist/types/src/query/query-executor.d.ts +1 -1
  55. package/dist/types/src/query/query-executor.d.ts.map +1 -1
  56. package/dist/types/src/space/admission-discovery-extension.d.ts.map +1 -1
  57. package/dist/types/src/space/control-pipeline.d.ts +1 -1
  58. package/dist/types/src/space/control-pipeline.d.ts.map +1 -1
  59. package/dist/types/src/space/space-manager.d.ts +1 -1
  60. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  61. package/dist/types/src/space/space-protocol.d.ts +1 -1
  62. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  63. package/dist/types/src/space/space.d.ts +1 -1
  64. package/dist/types/src/space/space.d.ts.map +1 -1
  65. package/dist/types/src/testing/test-agent-builder.d.ts +2 -2
  66. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  67. package/dist/types/src/util.d.ts +1 -1
  68. package/dist/types/src/util.d.ts.map +1 -1
  69. package/dist/types/tsconfig.tsbuildinfo +1 -1
  70. package/package.json +41 -38
  71. package/src/automerge/automerge-host.test.ts +3 -2
  72. package/src/automerge/automerge-host.ts +20 -10
  73. package/src/automerge/automerge-repo.test.ts +67 -16
  74. package/src/automerge/collection-synchronizer.test.ts +2 -2
  75. package/src/automerge/collection-synchronizer.ts +2 -2
  76. package/src/automerge/echo-data-monitor.ts +1 -1
  77. package/src/automerge/echo-network-adapter.test.ts +3 -3
  78. package/src/automerge/echo-network-adapter.ts +8 -6
  79. package/src/automerge/echo-replicator.ts +2 -1
  80. package/src/automerge/index.ts +1 -1
  81. package/src/automerge/leveldb-storage-adapter.ts +1 -1
  82. package/src/automerge/mesh-echo-replicator.ts +2 -1
  83. package/src/automerge/storage-adapter.test.ts +1 -1
  84. package/src/common/space-id.ts +1 -1
  85. package/src/db-host/data-service.ts +8 -7
  86. package/src/db-host/database-root.ts +2 -2
  87. package/src/db-host/documents-synchronizer.test.ts +1 -1
  88. package/src/db-host/documents-synchronizer.ts +39 -26
  89. package/src/db-host/echo-host.ts +13 -12
  90. package/src/db-host/query-service.ts +8 -1
  91. package/src/db-host/space-state-manager.ts +2 -2
  92. package/src/edge/echo-edge-replicator.test.ts +3 -2
  93. package/src/edge/echo-edge-replicator.ts +36 -15
  94. package/src/filter/filter-match.test.ts +2 -2
  95. package/src/filter/filter-match.ts +1 -1
  96. package/src/metadata/metadata-store.ts +3 -3
  97. package/src/pipeline/pipeline-stress.test.ts +4 -2
  98. package/src/pipeline/pipeline.test.ts +3 -2
  99. package/src/pipeline/pipeline.ts +8 -5
  100. package/src/query/query-executor.ts +7 -7
  101. package/src/query/query-planner.test.ts +2 -1
  102. package/src/space/admission-discovery-extension.ts +2 -2
  103. package/src/space/control-pipeline.test.ts +4 -3
  104. package/src/space/control-pipeline.ts +4 -4
  105. package/src/space/space-manager.browser.test.ts +1 -1
  106. package/src/space/space-manager.ts +5 -4
  107. package/src/space/space-protocol.browser.test.ts +2 -2
  108. package/src/space/space-protocol.test.ts +3 -2
  109. package/src/space/space-protocol.ts +6 -3
  110. package/src/space/space.test.ts +1 -1
  111. package/src/space/space.ts +3 -2
  112. package/src/testing/test-agent-builder.ts +4 -3
  113. package/src/util.ts +1 -1
  114. package/dist/lib/browser/chunk-35I6ERLG.mjs.map +0 -7
  115. package/dist/lib/browser/chunk-TQJTKNMS.mjs.map +0 -7
  116. package/dist/lib/node/chunk-HOPOFWAL.cjs +0 -147
  117. package/dist/lib/node/chunk-JXX6LF5U.cjs +0 -2084
  118. package/dist/lib/node/chunk-JXX6LF5U.cjs.map +0 -7
  119. package/dist/lib/node/chunk-Q7SFCCGT.cjs +0 -33
  120. package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +0 -7
  121. package/dist/lib/node/filter/index.cjs +0 -32
  122. package/dist/lib/node/filter/index.cjs.map +0 -7
  123. package/dist/lib/node/index.cjs +0 -4699
  124. package/dist/lib/node/index.cjs.map +0 -7
  125. package/dist/lib/node/meta.json +0 -1
  126. package/dist/lib/node/testing/index.cjs +0 -753
  127. package/dist/lib/node/testing/index.cjs.map +0 -7
  128. package/dist/lib/node-esm/chunk-5BHLPT24.mjs.map +0 -7
@@ -2,7 +2,7 @@ import "@dxos/node-std/globals";
2
2
  import {
3
3
  filterMatchObject,
4
4
  filterMatchValue
5
- } from "./chunk-TQJTKNMS.mjs";
5
+ } from "./chunk-VUXUDIPM.mjs";
6
6
  import {
7
7
  AuthExtension,
8
8
  AuthStatus,
@@ -25,25 +25,18 @@ import {
25
25
  mapTimeframeToFeedIndexes,
26
26
  startAfter,
27
27
  valueEncoding
28
- } from "./chunk-35I6ERLG.mjs";
28
+ } from "./chunk-2543T5DX.mjs";
29
29
  import "./chunk-CGS2ULMK.mjs";
30
30
 
31
- // packages/core/echo/echo-pipeline/src/db-host/data-service.ts
31
+ // src/db-host/data-service.ts
32
32
  import { UpdateScheduler as UpdateScheduler2 } from "@dxos/async";
33
33
  import { Stream } from "@dxos/codec-protobuf/stream";
34
34
  import { invariant as invariant7 } from "@dxos/invariant";
35
35
  import { SpaceId as SpaceId2 } from "@dxos/keys";
36
36
  import { log as log7 } from "@dxos/log";
37
37
 
38
- // packages/core/echo/echo-pipeline/src/db-host/documents-synchronizer.ts
39
- import { next as A2 } from "@automerge/automerge";
40
- import { UpdateScheduler } from "@dxos/async";
41
- import { Resource as Resource5 } from "@dxos/context";
42
- import { invariant as invariant6 } from "@dxos/invariant";
43
- import { log as log6 } from "@dxos/log";
44
-
45
- // packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
46
- import { getBackend, getHeads, isAutomerge, equals as headsEquals, save } from "@automerge/automerge";
38
+ // src/automerge/automerge-host.ts
39
+ import { getBackend, getHeads, equals as headsEquals, isAutomerge, save } from "@automerge/automerge";
47
40
  import { Repo, interpretAsDocumentId } from "@automerge/automerge-repo";
48
41
  import { Event as Event2, asyncTimeout } from "@dxos/async";
49
42
  import { Context, Resource as Resource3, cancelWithContext } from "@dxos/context";
@@ -55,9 +48,9 @@ import { objectPointerCodec } from "@dxos/protocols";
55
48
  import { trace as trace2 } from "@dxos/tracing";
56
49
  import { bufferToArray } from "@dxos/util";
57
50
 
58
- // packages/core/echo/echo-pipeline/src/automerge/collection-synchronizer.ts
51
+ // src/automerge/collection-synchronizer.ts
59
52
  import { next as am } from "@automerge/automerge";
60
- import { asyncReturn, Event, scheduleTask, scheduleTaskInterval } from "@dxos/async";
53
+ import { Event, asyncReturn, scheduleTask, scheduleTaskInterval } from "@dxos/async";
61
54
  import { Resource } from "@dxos/context";
62
55
  import { log } from "@dxos/log";
63
56
  import { trace } from "@dxos/tracing";
@@ -68,19 +61,22 @@ function _ts_decorate(decorators, target, key, desc) {
68
61
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
69
62
  return c > 3 && r && Object.defineProperty(target, key, r), r;
70
63
  }
71
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/collection-synchronizer.ts";
64
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/collection-synchronizer.ts";
72
65
  var MIN_QUERY_INTERVAL = 5e3;
73
66
  var POLL_INTERVAL = 3e4;
74
67
  var CollectionSynchronizer = class extends Resource {
68
+ _sendCollectionState;
69
+ _queryCollectionState;
70
+ _shouldSyncCollection;
71
+ /**
72
+ * CollectionId -> State.
73
+ */
74
+ _perCollectionStates = /* @__PURE__ */ new Map();
75
+ _activeCollections = /* @__PURE__ */ new Set();
76
+ _connectedPeers = /* @__PURE__ */ new Set();
77
+ remoteStateUpdated = new Event();
75
78
  constructor(params) {
76
79
  super();
77
- /**
78
- * CollectionId -> State.
79
- */
80
- this._perCollectionStates = /* @__PURE__ */ new Map();
81
- this._activeCollections = /* @__PURE__ */ new Set();
82
- this._connectedPeers = /* @__PURE__ */ new Set();
83
- this.remoteStateUpdated = new Event();
84
80
  this._sendCollectionState = params.sendCollectionState;
85
81
  this._queryCollectionState = params.queryCollectionState;
86
82
  this._shouldSyncCollection = params.shouldSyncCollection;
@@ -307,28 +303,37 @@ var getSpanName = (peerId) => {
307
303
  return `collection-sync-${peerId}`;
308
304
  };
309
305
 
310
- // packages/core/echo/echo-pipeline/src/automerge/echo-network-adapter.ts
306
+ // src/automerge/echo-network-adapter.ts
311
307
  import { NetworkAdapter } from "@automerge/automerge-repo";
312
- import { synchronized, Trigger } from "@dxos/async";
308
+ import { Trigger, synchronized } from "@dxos/async";
313
309
  import { LifecycleState } from "@dxos/context";
314
310
  import { invariant } from "@dxos/invariant";
315
311
  import { log as log2 } from "@dxos/log";
316
312
  import { isNonNullable } from "@dxos/util";
317
313
 
318
- // packages/core/echo/echo-pipeline/src/automerge/network-protocol.ts
314
+ // src/automerge/network-protocol.ts
319
315
  import { MESSAGE_TYPE_COLLECTION_QUERY, MESSAGE_TYPE_COLLECTION_STATE } from "@dxos/protocols";
320
316
  var isCollectionQueryMessage = (message) => message.type === MESSAGE_TYPE_COLLECTION_QUERY;
321
317
  var isCollectionStateMessage = (message) => message.type === MESSAGE_TYPE_COLLECTION_STATE;
322
318
 
323
- // packages/core/echo/echo-pipeline/src/automerge/echo-network-adapter.ts
319
+ // src/automerge/echo-network-adapter.ts
324
320
  function _ts_decorate2(decorators, target, key, desc) {
325
321
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
326
322
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
327
323
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
328
324
  return c > 3 && r && Object.defineProperty(target, key, r), r;
329
325
  }
330
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/echo-network-adapter.ts";
326
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/echo-network-adapter.ts";
331
327
  var EchoNetworkAdapter = class extends NetworkAdapter {
328
+ _params;
329
+ _replicators;
330
+ /**
331
+ * Remote peer id -> connection.
332
+ */
333
+ _connections;
334
+ _lifecycleState;
335
+ _connected;
336
+ _ready;
332
337
  constructor(_params) {
333
338
  super(), this._params = _params, this._replicators = /* @__PURE__ */ new Set(), this._connections = /* @__PURE__ */ new Map(), this._lifecycleState = LifecycleState.CLOSED, this._connected = new Trigger(), this._ready = new Trigger();
334
339
  }
@@ -380,7 +385,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
380
385
  async addReplicator(replicator) {
381
386
  invariant(this._lifecycleState === LifecycleState.OPEN, void 0, {
382
387
  F: __dxlog_file2,
383
- L: 129,
388
+ L: 130,
384
389
  S: this,
385
390
  A: [
386
391
  "this._lifecycleState === LifecycleState.OPEN",
@@ -389,7 +394,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
389
394
  });
390
395
  invariant(this.peerId, void 0, {
391
396
  F: __dxlog_file2,
392
- L: 130,
397
+ L: 131,
393
398
  S: this,
394
399
  A: [
395
400
  "this.peerId",
@@ -398,7 +403,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
398
403
  });
399
404
  invariant(!this._replicators.has(replicator), void 0, {
400
405
  F: __dxlog_file2,
401
- L: 131,
406
+ L: 132,
402
407
  S: this,
403
408
  A: [
404
409
  "!this._replicators.has(replicator)",
@@ -422,7 +427,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
422
427
  async removeReplicator(replicator) {
423
428
  invariant(this._lifecycleState === LifecycleState.OPEN, void 0, {
424
429
  F: __dxlog_file2,
425
- L: 150,
430
+ L: 151,
426
431
  S: this,
427
432
  A: [
428
433
  "this._lifecycleState === LifecycleState.OPEN",
@@ -431,7 +436,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
431
436
  });
432
437
  invariant(this._replicators.has(replicator), void 0, {
433
438
  F: __dxlog_file2,
434
- L: 151,
439
+ L: 152,
435
440
  S: this,
436
441
  A: [
437
442
  "this._replicators.has(replicator)",
@@ -494,7 +499,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
494
499
  if (connectionEntry.isOpen) {
495
500
  log2.catch(err, void 0, {
496
501
  F: __dxlog_file2,
497
- L: 221,
502
+ L: 222,
498
503
  S: this,
499
504
  C: (f, a) => f(...a)
500
505
  });
@@ -507,13 +512,13 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
507
512
  peerId: connection.peerId
508
513
  }, {
509
514
  F: __dxlog_file2,
510
- L: 229,
515
+ L: 230,
511
516
  S: this,
512
517
  C: (f, a) => f(...a)
513
518
  });
514
519
  invariant(!this._connections.has(connection.peerId), void 0, {
515
520
  F: __dxlog_file2,
516
- L: 230,
521
+ L: 231,
517
522
  S: this,
518
523
  A: [
519
524
  "!this._connections.has(connection.peerId as PeerId)",
@@ -540,7 +545,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
540
545
  if (connectionEntry.isOpen) {
541
546
  log2.catch(err, void 0, {
542
547
  F: __dxlog_file2,
543
- L: 254,
548
+ L: 255,
544
549
  S: this,
545
550
  C: (f, a) => f(...a)
546
551
  });
@@ -551,7 +556,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
551
556
  peerId: connection.peerId
552
557
  }, {
553
558
  F: __dxlog_file2,
554
- L: 259,
559
+ L: 260,
555
560
  S: this,
556
561
  C: (f, a) => f(...a)
557
562
  });
@@ -573,14 +578,14 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
573
578
  peerId: connection.peerId
574
579
  }, {
575
580
  F: __dxlog_file2,
576
- L: 276,
581
+ L: 277,
577
582
  S: this,
578
583
  C: (f, a) => f(...a)
579
584
  });
580
585
  const entry = this._connections.get(connection.peerId);
581
586
  invariant(entry, void 0, {
582
587
  F: __dxlog_file2,
583
- L: 278,
588
+ L: 279,
584
589
  S: this,
585
590
  A: [
586
591
  "entry",
@@ -592,15 +597,15 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
592
597
  peerId: connection.peerId
593
598
  });
594
599
  this._params.monitor?.recordPeerDisconnected(connection.peerId);
595
- void entry.reader.cancel().catch((err) => log2.catch(err, void 0, {
600
+ void entry.writer.abort().catch((err) => log2.catch(err, void 0, {
596
601
  F: __dxlog_file2,
597
- L: 284,
602
+ L: 285,
598
603
  S: this,
599
604
  C: (f, a) => f(...a)
600
605
  }));
601
- void entry.writer.abort().catch((err) => log2.catch(err, void 0, {
606
+ void entry.reader.cancel().catch((err) => log2.catch(err, void 0, {
602
607
  F: __dxlog_file2,
603
- L: 285,
608
+ L: 286,
604
609
  S: this,
605
610
  C: (f, a) => f(...a)
606
611
  }));
@@ -615,14 +620,14 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
615
620
  peerId: connection.peerId
616
621
  }, {
617
622
  F: __dxlog_file2,
618
- L: 294,
623
+ L: 296,
619
624
  S: this,
620
625
  C: (f, a) => f(...a)
621
626
  });
622
627
  const entry = this._connections.get(connection.peerId);
623
628
  invariant(entry, void 0, {
624
629
  F: __dxlog_file2,
625
- L: 296,
630
+ L: 298,
626
631
  S: this,
627
632
  A: [
628
633
  "entry",
@@ -659,9 +664,10 @@ var createEchoPeerMetadata = () => ({
659
664
  });
660
665
  var isEchoPeerMetadata = (metadata) => metadata?.dxos_peerSource === "EchoNetworkAdapter";
661
666
 
662
- // packages/core/echo/echo-pipeline/src/automerge/heads-store.ts
667
+ // src/automerge/heads-store.ts
663
668
  import { headsEncoding } from "@dxos/indexing";
664
669
  var HeadsStore = class {
670
+ _db;
665
671
  constructor({ db }) {
666
672
  this._db = db;
667
673
  }
@@ -681,9 +687,10 @@ var HeadsStore = class {
681
687
  }
682
688
  };
683
689
 
684
- // packages/core/echo/echo-pipeline/src/automerge/leveldb-storage-adapter.ts
690
+ // src/automerge/leveldb-storage-adapter.ts
685
691
  import { LifecycleState as LifecycleState2, Resource as Resource2 } from "@dxos/context";
686
692
  var LevelDBStorageAdapter = class extends Resource2 {
693
+ _params;
687
694
  constructor(_params) {
688
695
  super(), this._params = _params;
689
696
  }
@@ -786,14 +793,14 @@ var encodingOptions = {
786
793
  };
787
794
  var isLevelDbNotFoundError = (err) => err.code === "LEVEL_NOT_FOUND";
788
795
 
789
- // packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
796
+ // src/automerge/automerge-host.ts
790
797
  function _ts_decorate3(decorators, target, key, desc) {
791
798
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
792
799
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
793
800
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
794
801
  return c > 3 && r && Object.defineProperty(target, key, r), r;
795
802
  }
796
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
803
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
797
804
  var FIND_PARAMS = {
798
805
  allowableStates: [
799
806
  "ready",
@@ -801,18 +808,27 @@ var FIND_PARAMS = {
801
808
  ]
802
809
  };
803
810
  var AutomergeHost = class extends Resource3 {
811
+ _db;
812
+ _indexMetadataStore;
813
+ _echoNetworkAdapter;
814
+ _collectionSynchronizer = new CollectionSynchronizer({
815
+ queryCollectionState: this._queryCollectionState.bind(this),
816
+ sendCollectionState: this._sendCollectionState.bind(this),
817
+ shouldSyncCollection: this._shouldSyncCollection.bind(this)
818
+ });
819
+ _repo;
820
+ _storage;
821
+ _headsStore;
822
+ _peerId;
823
+ _peerIdProvider;
824
+ _getSpaceKeyByRootDocumentId;
825
+ collectionStateUpdated = new Event2();
826
+ /**
827
+ * Fired after a batch of documents was saved to disk.
828
+ */
829
+ documentsSaved = new Event2();
804
830
  constructor({ db, indexMetadataStore, dataMonitor, peerIdProvider, getSpaceKeyByRootDocumentId }) {
805
831
  super();
806
- this._collectionSynchronizer = new CollectionSynchronizer({
807
- queryCollectionState: this._queryCollectionState.bind(this),
808
- sendCollectionState: this._sendCollectionState.bind(this),
809
- shouldSyncCollection: this._shouldSyncCollection.bind(this)
810
- });
811
- this.collectionStateUpdated = new Event2();
812
- /**
813
- * Fired after a batch of documents was saved to disk.
814
- */
815
- this.documentsSaved = new Event2();
816
832
  this._db = db;
817
833
  this._storage = new LevelDBStorageAdapter({
818
834
  db: db.sublevel("automerge"),
@@ -1173,6 +1189,14 @@ var AutomergeHost = class extends Resource3 {
1173
1189
  this._collectionSynchronizer.setLocalCollectionState(collectionId, {
1174
1190
  documents
1175
1191
  });
1192
+ const interestedPeers = this._echoNetworkAdapter.getPeersInterestedInCollection(collectionId);
1193
+ if (interestedPeers.length > 0) {
1194
+ for (const peerId of interestedPeers) {
1195
+ this._sendCollectionState(collectionId, peerId, {
1196
+ documents
1197
+ });
1198
+ }
1199
+ }
1176
1200
  }
1177
1201
  async clearLocalCollectionState(collectionId) {
1178
1202
  this._collectionSynchronizer.clearLocalCollectionState(collectionId);
@@ -1217,7 +1241,7 @@ var AutomergeHost = class extends Resource3 {
1217
1241
  count: toReplicate.length
1218
1242
  }, {
1219
1243
  F: __dxlog_file3,
1220
- L: 563,
1244
+ L: 573,
1221
1245
  S: this,
1222
1246
  C: (f, a) => f(...a)
1223
1247
  });
@@ -1277,7 +1301,7 @@ var changeIsPresentInDoc = (doc, changeHash) => {
1277
1301
  var decodeCollectionState = (state) => {
1278
1302
  invariant2(typeof state === "object" && state !== null, "Invalid state", {
1279
1303
  F: __dxlog_file3,
1280
- L: 614,
1304
+ L: 624,
1281
1305
  S: void 0,
1282
1306
  A: [
1283
1307
  "typeof state === 'object' && state !== null",
@@ -1290,22 +1314,29 @@ var encodeCollectionState = (state) => {
1290
1314
  return state;
1291
1315
  };
1292
1316
 
1293
- // packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator.ts
1317
+ // src/automerge/mesh-echo-replicator.ts
1294
1318
  import { invariant as invariant5 } from "@dxos/invariant";
1295
1319
  import { PublicKey as PublicKey2 } from "@dxos/keys";
1296
1320
  import { log as log5 } from "@dxos/log";
1297
1321
  import { ComplexSet, defaultMap as defaultMap2 } from "@dxos/util";
1298
1322
 
1299
- // packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator-connection.ts
1323
+ // src/automerge/mesh-echo-replicator-connection.ts
1300
1324
  import * as A from "@automerge/automerge";
1301
1325
  import { cbor } from "@automerge/automerge-repo";
1302
1326
  import { Resource as Resource4 } from "@dxos/context";
1303
1327
  import { invariant as invariant3 } from "@dxos/invariant";
1304
1328
  import { log as log4 } from "@dxos/log";
1305
1329
  import { AutomergeReplicator } from "@dxos/teleport-extension-automerge-replicator";
1306
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator-connection.ts";
1330
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator-connection.ts";
1307
1331
  var DEFAULT_FACTORY = (params) => new AutomergeReplicator(...params);
1308
1332
  var MeshReplicatorConnection = class extends Resource4 {
1333
+ _params;
1334
+ readable;
1335
+ writable;
1336
+ remoteDeviceKey;
1337
+ replicatorExtension;
1338
+ _remotePeerId;
1339
+ _isEnabled;
1309
1340
  constructor(_params) {
1310
1341
  super(), this._params = _params, this.remoteDeviceKey = null, this._remotePeerId = null, this._isEnabled = false;
1311
1342
  let readableStreamController;
@@ -1441,10 +1472,10 @@ var logSendSync = (message) => {
1441
1472
  });
1442
1473
  };
1443
1474
 
1444
- // packages/core/echo/echo-pipeline/src/automerge/space-collection.ts
1475
+ // src/automerge/space-collection.ts
1445
1476
  import { invariant as invariant4 } from "@dxos/invariant";
1446
1477
  import { SpaceId } from "@dxos/keys";
1447
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/space-collection.ts";
1478
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/space-collection.ts";
1448
1479
  var deriveCollectionIdFromSpaceId = (spaceId, rootDocumentId) => rootDocumentId ? `space:${spaceId}:${rootDocumentId}` : `space:${spaceId}`;
1449
1480
  var getSpaceIdFromCollectionId = (collectionId) => {
1450
1481
  const spaceId = collectionId.split(":")[1];
@@ -1460,27 +1491,25 @@ var getSpaceIdFromCollectionId = (collectionId) => {
1460
1491
  return spaceId;
1461
1492
  };
1462
1493
 
1463
- // packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator.ts
1464
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator.ts";
1494
+ // src/automerge/mesh-echo-replicator.ts
1495
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator.ts";
1465
1496
  var MeshEchoReplicator = class {
1466
- constructor() {
1467
- /**
1468
- * We might have multiple connections open with a peer (one per space), but there'll be only one enabled
1469
- * connection at any given moment, because there's a single repo for all the spaces.
1470
- * When a connection closes (space was closed) it gets removed from the list and the next connection
1471
- * in the line gets enabled.
1472
- */
1473
- this._connectionsPerPeer = /* @__PURE__ */ new Map();
1474
- /**
1475
- * A set of all connections (enabled and disabled).
1476
- */
1477
- this._connections = /* @__PURE__ */ new Set();
1478
- /**
1479
- * spaceId -> deviceKey[]
1480
- */
1481
- this._authorizedDevices = /* @__PURE__ */ new Map();
1482
- this._context = null;
1483
- }
1497
+ /**
1498
+ * We might have multiple connections open with a peer (one per space), but there'll be only one enabled
1499
+ * connection at any given moment, because there's a single repo for all the spaces.
1500
+ * When a connection closes (space was closed) it gets removed from the list and the next connection
1501
+ * in the line gets enabled.
1502
+ */
1503
+ _connectionsPerPeer = /* @__PURE__ */ new Map();
1504
+ /**
1505
+ * A set of all connections (enabled and disabled).
1506
+ */
1507
+ _connections = /* @__PURE__ */ new Set();
1508
+ /**
1509
+ * spaceId -> deviceKey[]
1510
+ */
1511
+ _authorizedDevices = /* @__PURE__ */ new Map();
1512
+ _context = null;
1484
1513
  async connect(context) {
1485
1514
  this._context = context;
1486
1515
  }
@@ -1500,7 +1529,7 @@ var MeshEchoReplicator = class {
1500
1529
  createExtension(extensionFactory) {
1501
1530
  invariant5(this._context, void 0, {
1502
1531
  F: __dxlog_file6,
1503
- L: 67,
1532
+ L: 68,
1504
1533
  S: this,
1505
1534
  A: [
1506
1535
  "this._context",
@@ -1515,13 +1544,13 @@ var MeshEchoReplicator = class {
1515
1544
  peerId: connection.peerId
1516
1545
  }, {
1517
1546
  F: __dxlog_file6,
1518
- L: 73,
1547
+ L: 74,
1519
1548
  S: this,
1520
1549
  C: (f, a) => f(...a)
1521
1550
  });
1522
1551
  invariant5(this._context, void 0, {
1523
1552
  F: __dxlog_file6,
1524
- L: 74,
1553
+ L: 75,
1525
1554
  S: this,
1526
1555
  A: [
1527
1556
  "this._context",
@@ -1546,7 +1575,7 @@ var MeshEchoReplicator = class {
1546
1575
  peerId: connection.peerId
1547
1576
  }, {
1548
1577
  F: __dxlog_file6,
1549
- L: 88,
1578
+ L: 89,
1550
1579
  S: this,
1551
1580
  C: (f, a) => f(...a)
1552
1581
  });
@@ -1558,7 +1587,7 @@ var MeshEchoReplicator = class {
1558
1587
  peerId: connection.peerId
1559
1588
  }, {
1560
1589
  F: __dxlog_file6,
1561
- L: 96,
1590
+ L: 97,
1562
1591
  S: this,
1563
1592
  C: (f, a) => f(...a)
1564
1593
  });
@@ -1580,13 +1609,13 @@ var MeshEchoReplicator = class {
1580
1609
  documentId: params.documentId
1581
1610
  }, {
1582
1611
  F: __dxlog_file6,
1583
- L: 114,
1612
+ L: 115,
1584
1613
  S: this,
1585
1614
  C: (f, a) => f(...a)
1586
1615
  });
1587
1616
  invariant5(this._context, void 0, {
1588
1617
  F: __dxlog_file6,
1589
- L: 115,
1618
+ L: 116,
1590
1619
  S: this,
1591
1620
  A: [
1592
1621
  "this._context",
@@ -1606,7 +1635,7 @@ var MeshEchoReplicator = class {
1606
1635
  acceptDocument: remoteDocumentExists
1607
1636
  }, {
1608
1637
  F: __dxlog_file6,
1609
- L: 123,
1638
+ L: 124,
1610
1639
  S: this,
1611
1640
  C: (f, a) => f(...a)
1612
1641
  });
@@ -1620,7 +1649,7 @@ var MeshEchoReplicator = class {
1620
1649
  documentId: params.documentId
1621
1650
  }, {
1622
1651
  F: __dxlog_file6,
1623
- L: 140,
1652
+ L: 141,
1624
1653
  S: this,
1625
1654
  C: (f, a) => f(...a)
1626
1655
  });
@@ -1636,7 +1665,7 @@ var MeshEchoReplicator = class {
1636
1665
  isAuthorized
1637
1666
  }, {
1638
1667
  F: __dxlog_file6,
1639
- L: 148,
1668
+ L: 149,
1640
1669
  S: this,
1641
1670
  C: (f, a) => f(...a)
1642
1671
  });
@@ -1644,7 +1673,7 @@ var MeshEchoReplicator = class {
1644
1673
  } catch (err) {
1645
1674
  log5.catch(err, void 0, {
1646
1675
  F: __dxlog_file6,
1647
- L: 158,
1676
+ L: 159,
1648
1677
  S: this,
1649
1678
  C: (f, a) => f(...a)
1650
1679
  });
@@ -1660,7 +1689,7 @@ var MeshEchoReplicator = class {
1660
1689
  collectionId
1661
1690
  }, {
1662
1691
  F: __dxlog_file6,
1663
- L: 168,
1692
+ L: 169,
1664
1693
  S: this,
1665
1694
  C: (f, a) => f(...a)
1666
1695
  });
@@ -1679,7 +1708,7 @@ var MeshEchoReplicator = class {
1679
1708
  deviceKey
1680
1709
  }, {
1681
1710
  F: __dxlog_file6,
1682
- L: 185,
1711
+ L: 186,
1683
1712
  S: this,
1684
1713
  C: (f, a) => f(...a)
1685
1714
  });
@@ -1695,9 +1724,9 @@ var MeshEchoReplicator = class {
1695
1724
  }
1696
1725
  };
1697
1726
 
1698
- // packages/core/echo/echo-pipeline/src/automerge/echo-data-monitor.ts
1727
+ // src/automerge/echo-data-monitor.ts
1699
1728
  import { trace as trace3 } from "@dxos/tracing";
1700
- import { CircularBuffer, mapValues, SlidingWindowSummary } from "@dxos/util";
1729
+ import { CircularBuffer, SlidingWindowSummary, mapValues } from "@dxos/util";
1701
1730
  function _ts_decorate4(decorators, target, key, desc) {
1702
1731
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1703
1732
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1707,6 +1736,17 @@ function _ts_decorate4(decorators, target, key, desc) {
1707
1736
  var PER_SECOND_RATE_AVG_WINDOW_SIZE = 5;
1708
1737
  var DEFAULT_AVG_WINDOW_SIZE = 25;
1709
1738
  var EchoDataMonitor = class {
1739
+ _params;
1740
+ _lastTick;
1741
+ _activeCounters;
1742
+ _lastCompleteCounters;
1743
+ _localTimeSeries;
1744
+ _storageAverages;
1745
+ _replicationAverages;
1746
+ _sizeByMessage;
1747
+ _lastReceivedMessages;
1748
+ _lastSentMessages;
1749
+ _connectionsCount;
1710
1750
  constructor(_params = {
1711
1751
  timeSeriesLength: 30
1712
1752
  }) {
@@ -2056,20 +2096,38 @@ var getByteCount = (message) => {
2056
2096
  return message.type.length + message.senderId.length + message.targetId.length + (message.data?.byteLength ?? 0) + (message.documentId?.length ?? 0);
2057
2097
  };
2058
2098
 
2059
- // packages/core/echo/echo-pipeline/src/db-host/documents-synchronizer.ts
2060
- var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/documents-synchronizer.ts";
2099
+ // src/db-host/documents-synchronizer.ts
2100
+ import { next as A2 } from "@automerge/automerge";
2101
+ import { UpdateScheduler, sleep } from "@dxos/async";
2102
+ import { LifecycleState as LifecycleState3, Resource as Resource5, cancelWithContext as cancelWithContext2 } from "@dxos/context";
2103
+ import { invariant as invariant6 } from "@dxos/invariant";
2104
+ import { log as log6 } from "@dxos/log";
2105
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/documents-synchronizer.ts";
2061
2106
  var MAX_UPDATE_FREQ = 10;
2107
+ var WRAP_AROUND_RETRY_LIMIT = 3;
2108
+ var WRAP_AROUND_RETRY_INITIAL_DELAY = 100;
2062
2109
  var DocumentsSynchronizer = class extends Resource5 {
2110
+ _params;
2111
+ _syncStates;
2112
+ /**
2113
+ * Documents that have pending updates.
2114
+ * Used to batch updates.
2115
+ */
2116
+ _pendingUpdates;
2117
+ /**
2118
+ * Job that schedules if there are pending updates.
2119
+ */
2120
+ _sendUpdatesJob;
2063
2121
  constructor(_params) {
2064
2122
  super(), this._params = _params, this._syncStates = /* @__PURE__ */ new Map(), this._pendingUpdates = /* @__PURE__ */ new Set(), this._sendUpdatesJob = void 0;
2065
2123
  }
2066
- addDocuments(documentIds, retryCounter = 0) {
2067
- if (retryCounter > 3) {
2124
+ addDocuments(documentIds, retryCounter = 0, wrapAroundRetryDelay = WRAP_AROUND_RETRY_INITIAL_DELAY) {
2125
+ if (retryCounter > WRAP_AROUND_RETRY_LIMIT) {
2068
2126
  log6.warn("Failed to load document, retry limit reached", {
2069
2127
  documentIds
2070
2128
  }, {
2071
2129
  F: __dxlog_file7,
2072
- L: 52,
2130
+ L: 57,
2073
2131
  S: this,
2074
2132
  C: (f, a) => f(...a)
2075
2133
  });
@@ -2087,13 +2145,13 @@ var DocumentsSynchronizer = class extends Resource5 {
2087
2145
  error
2088
2146
  }, {
2089
2147
  F: __dxlog_file7,
2090
- L: 66,
2148
+ L: 71,
2091
2149
  S: this,
2092
2150
  C: (f, a) => f(...a)
2093
2151
  });
2094
- this.addDocuments([
2152
+ void cancelWithContext2(this._ctx, sleep(wrapAroundRetryDelay)).then(() => this.addDocuments([
2095
2153
  documentId
2096
- ], retryCounter + 1);
2154
+ ], retryCounter + 1, wrapAroundRetryDelay * 2));
2097
2155
  });
2098
2156
  }
2099
2157
  }
@@ -2115,14 +2173,9 @@ var DocumentsSynchronizer = class extends Resource5 {
2115
2173
  }
2116
2174
  async update(updates) {
2117
2175
  for (const { documentId, mutation, isNew } of updates) {
2118
- if (isNew) {
2119
- const doc = await this._params.repo.find(documentId, FIND_PARAMS);
2120
- doc.update((doc2) => A2.loadIncremental(doc2, mutation));
2121
- this._startSync(doc);
2122
- } else {
2123
- this._writeMutation(documentId, mutation);
2124
- }
2176
+ this._writeMutation(documentId, mutation, isNew);
2125
2177
  }
2178
+ await this._params.repo.flush(updates.map(({ documentId }) => documentId));
2126
2179
  }
2127
2180
  _startSync(doc) {
2128
2181
  if (this._syncStates.has(doc.documentId)) {
@@ -2130,7 +2183,7 @@ var DocumentsSynchronizer = class extends Resource5 {
2130
2183
  documentId: doc.documentId
2131
2184
  }, {
2132
2185
  F: __dxlog_file7,
2133
- L: 105,
2186
+ L: 108,
2134
2187
  S: this,
2135
2188
  C: (f, a) => f(...a)
2136
2189
  });
@@ -2141,6 +2194,7 @@ var DocumentsSynchronizer = class extends Resource5 {
2141
2194
  };
2142
2195
  this._subscribeForChanges(syncState);
2143
2196
  this._syncStates.set(doc.documentId, syncState);
2197
+ return syncState;
2144
2198
  }
2145
2199
  _subscribeForChanges(syncState) {
2146
2200
  const handler = () => {
@@ -2173,7 +2227,7 @@ var DocumentsSynchronizer = class extends Resource5 {
2173
2227
  const syncState = this._syncStates.get(documentId);
2174
2228
  invariant6(syncState, "Sync state for document not found", {
2175
2229
  F: __dxlog_file7,
2176
- L: 146,
2230
+ L: 150,
2177
2231
  S: this,
2178
2232
  A: [
2179
2233
  "syncState",
@@ -2192,37 +2246,50 @@ var DocumentsSynchronizer = class extends Resource5 {
2192
2246
  syncState.lastSentHead = A2.getHeads(doc);
2193
2247
  return mutation;
2194
2248
  }
2195
- _writeMutation(documentId, mutation) {
2196
- const syncState = this._syncStates.get(documentId);
2197
- invariant6(syncState, "Sync state for document not found", {
2198
- F: __dxlog_file7,
2199
- L: 162,
2200
- S: this,
2201
- A: [
2202
- "syncState",
2203
- "'Sync state for document not found'"
2204
- ]
2205
- });
2206
- syncState.handle.update((doc) => {
2207
- const headsBefore = A2.getHeads(doc);
2208
- const newDoc = A2.loadIncremental(doc, mutation);
2249
+ _writeMutation(documentId, mutation, isNew) {
2250
+ if (this._lifecycleState === LifecycleState3.CLOSED) {
2251
+ return;
2252
+ }
2253
+ if (isNew) {
2254
+ const newHandle = this._params.repo.import(mutation, {
2255
+ docId: documentId
2256
+ });
2257
+ const syncState = this._startSync(newHandle);
2258
+ syncState.lastSentHead = A2.getHeads(newHandle.doc());
2259
+ } else {
2260
+ const syncState = this._syncStates.get(documentId);
2261
+ invariant6(syncState, "Sync state for document not found", {
2262
+ F: __dxlog_file7,
2263
+ L: 174,
2264
+ S: this,
2265
+ A: [
2266
+ "syncState",
2267
+ "'Sync state for document not found'"
2268
+ ]
2269
+ });
2270
+ const headsBefore = A2.getHeads(syncState.handle.doc());
2271
+ this._params.repo.import(mutation, {
2272
+ docId: documentId
2273
+ });
2209
2274
  if (A2.equals(headsBefore, syncState.lastSentHead)) {
2210
- syncState.lastSentHead = A2.getHeads(newDoc);
2275
+ syncState.lastSentHead = A2.getHeads(syncState.handle.doc());
2211
2276
  }
2212
- return newDoc;
2213
- });
2277
+ }
2214
2278
  }
2215
2279
  };
2216
2280
 
2217
- // packages/core/echo/echo-pipeline/src/db-host/data-service.ts
2218
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/data-service.ts";
2281
+ // src/db-host/data-service.ts
2282
+ var __dxlog_file8 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/data-service.ts";
2219
2283
  var DataServiceImpl = class {
2284
+ /**
2285
+ * Map of subscriptions.
2286
+ * subscriptionId -> DocumentsSynchronizer
2287
+ */
2288
+ _subscriptions = /* @__PURE__ */ new Map();
2289
+ _automergeHost;
2290
+ _spaceStateManager;
2291
+ _updateIndexes;
2220
2292
  constructor(params) {
2221
- /**
2222
- * Map of subscriptions.
2223
- * subscriptionId -> DocumentsSynchronizer
2224
- */
2225
- this._subscriptions = /* @__PURE__ */ new Map();
2226
2293
  this._automergeHost = params.automergeHost;
2227
2294
  this._spaceStateManager = params.spaceStateManager;
2228
2295
  this._updateIndexes = params.updateIndexes;
@@ -2238,7 +2305,7 @@ var DataServiceImpl = class {
2238
2305
  ready();
2239
2306
  }).catch((err) => log7.catch(err, void 0, {
2240
2307
  F: __dxlog_file8,
2241
- L: 71,
2308
+ L: 72,
2242
2309
  S: this,
2243
2310
  C: (f, a) => f(...a)
2244
2311
  }));
@@ -2249,7 +2316,7 @@ var DataServiceImpl = class {
2249
2316
  const synchronizer = this._subscriptions.get(request.subscriptionId);
2250
2317
  invariant7(synchronizer, "Subscription not found", {
2251
2318
  F: __dxlog_file8,
2252
- L: 78,
2319
+ L: 79,
2253
2320
  S: this,
2254
2321
  A: [
2255
2322
  "synchronizer",
@@ -2270,7 +2337,7 @@ var DataServiceImpl = class {
2270
2337
  const synchronizer = this._subscriptions.get(request.subscriptionId);
2271
2338
  invariant7(synchronizer, "Subscription not found", {
2272
2339
  F: __dxlog_file8,
2273
- L: 93,
2340
+ L: 94,
2274
2341
  S: this,
2275
2342
  A: [
2276
2343
  "synchronizer",
@@ -2315,7 +2382,7 @@ var DataServiceImpl = class {
2315
2382
  const spaceId = request.spaceId;
2316
2383
  invariant7(SpaceId2.isValid(spaceId), void 0, {
2317
2384
  F: __dxlog_file8,
2318
- L: 133,
2385
+ L: 134,
2319
2386
  S: this,
2320
2387
  A: [
2321
2388
  "SpaceId.isValid(spaceId)",
@@ -2356,23 +2423,23 @@ var DataServiceImpl = class {
2356
2423
  }
2357
2424
  };
2358
2425
 
2359
- // packages/core/echo/echo-pipeline/src/db-host/echo-host.ts
2360
- import { LifecycleState as LifecycleState5, Resource as Resource9 } from "@dxos/context";
2426
+ // src/db-host/echo-host.ts
2427
+ import { LifecycleState as LifecycleState6, Resource as Resource9 } from "@dxos/context";
2361
2428
  import { todo } from "@dxos/debug";
2362
- import { createIdFromSpaceKey as createIdFromSpaceKey2, SpaceDocVersion as SpaceDocVersion3 } from "@dxos/echo-protocol";
2429
+ import { SpaceDocVersion as SpaceDocVersion3, createIdFromSpaceKey as createIdFromSpaceKey2 } from "@dxos/echo-protocol";
2363
2430
  import { IndexMetadataStore, IndexStore, Indexer } from "@dxos/indexing";
2364
2431
  import { invariant as invariant13 } from "@dxos/invariant";
2365
2432
  import { IndexKind } from "@dxos/protocols/proto/dxos/echo/indexing";
2366
2433
  import { trace as trace5 } from "@dxos/tracing";
2367
2434
 
2368
- // packages/core/echo/echo-pipeline/src/db-host/documents-iterator.ts
2435
+ // src/db-host/documents-iterator.ts
2369
2436
  import * as A3 from "@automerge/automerge";
2370
2437
  import { Context as Context2 } from "@dxos/context";
2371
2438
  import { DatabaseDirectory as DatabaseDirectory2, SpaceDocVersion } from "@dxos/echo-protocol";
2372
2439
  import { invariant as invariant8 } from "@dxos/invariant";
2373
2440
  import { log as log8 } from "@dxos/log";
2374
2441
  import { ObjectPointerVersion, objectPointerCodec as objectPointerCodec2 } from "@dxos/protocols";
2375
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/documents-iterator.ts";
2442
+ var __dxlog_file9 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/documents-iterator.ts";
2376
2443
  var LOG_VIEW_OPERATION_THRESHOLD = 300;
2377
2444
  var createSelectedDocumentsIterator = (automergeHost) => (
2378
2445
  /**
@@ -2453,7 +2520,7 @@ var createSelectedDocumentsIterator = (automergeHost) => (
2453
2520
  }
2454
2521
  );
2455
2522
 
2456
- // packages/core/echo/echo-pipeline/src/db-host/query-service.ts
2523
+ // src/db-host/query-service.ts
2457
2524
  import { getHeads as getHeads3 } from "@automerge/automerge";
2458
2525
  import { Schema } from "effect";
2459
2526
  import { DeferredTask, scheduleMicroTask, synchronized as synchronized2 } from "@dxos/async";
@@ -2465,10 +2532,10 @@ import { log as log10 } from "@dxos/log";
2465
2532
  import { objectPointerCodec as objectPointerCodec4 } from "@dxos/protocols";
2466
2533
  import { trace as trace4 } from "@dxos/tracing";
2467
2534
 
2468
- // packages/core/echo/echo-pipeline/src/query/query-executor.ts
2535
+ // src/query/query-executor.ts
2469
2536
  import { Match } from "effect";
2470
- import { Context as Context3, ContextDisposedError, LifecycleState as LifecycleState3, Resource as Resource6 } from "@dxos/context";
2471
- import { DatabaseDirectory as DatabaseDirectory3, isEncodedReference, ObjectStructure } from "@dxos/echo-protocol";
2537
+ import { Context as Context3, ContextDisposedError, LifecycleState as LifecycleState4, Resource as Resource6 } from "@dxos/context";
2538
+ import { DatabaseDirectory as DatabaseDirectory3, ObjectStructure, isEncodedReference } from "@dxos/echo-protocol";
2472
2539
  import { EscapedPropPath } from "@dxos/indexing";
2473
2540
  import { invariant as invariant10 } from "@dxos/invariant";
2474
2541
  import { DXN, PublicKey as PublicKey3 } from "@dxos/keys";
@@ -2476,15 +2543,15 @@ import { log as log9 } from "@dxos/log";
2476
2543
  import { objectPointerCodec as objectPointerCodec3 } from "@dxos/protocols";
2477
2544
  import { getDeep, isNonNullable as isNonNullable2 } from "@dxos/util";
2478
2545
 
2479
- // packages/core/echo/echo-pipeline/src/query/query-planner.ts
2546
+ // src/query/query-planner.ts
2480
2547
  import { invariant as invariant9 } from "@dxos/invariant";
2481
2548
 
2482
- // packages/core/echo/echo-pipeline/src/query/errors.ts
2549
+ // src/query/errors.ts
2483
2550
  import { BaseError } from "@dxos/errors";
2484
2551
  var QueryError = class extends BaseError.extend("QUERY_ERROR") {
2485
2552
  };
2486
2553
 
2487
- // packages/core/echo/echo-pipeline/src/query/plan.ts
2554
+ // src/query/plan.ts
2488
2555
  (function(QueryPlan2) {
2489
2556
  QueryPlan2.Plan = Object.freeze({
2490
2557
  make: (steps) => ({
@@ -2505,12 +2572,13 @@ var QueryError = class extends BaseError.extend("QUERY_ERROR") {
2505
2572
  })(QueryPlan || (QueryPlan = {}));
2506
2573
  var QueryPlan;
2507
2574
 
2508
- // packages/core/echo/echo-pipeline/src/query/query-planner.ts
2509
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/query/query-planner.ts";
2575
+ // src/query/query-planner.ts
2576
+ var __dxlog_file10 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/query/query-planner.ts";
2510
2577
  var DEFAULT_OPTIONS = {
2511
2578
  defaultTextSearchKind: "full-text"
2512
2579
  };
2513
2580
  var QueryPlanner = class {
2581
+ _options;
2514
2582
  constructor(options) {
2515
2583
  this._options = {
2516
2584
  ...DEFAULT_OPTIONS,
@@ -2950,8 +3018,8 @@ var isTrivialTypenameFilter = (filter) => {
2950
3018
  return filter.type === "object" && filter.typename !== null && Object.keys(filter.props).length === 0 && (filter.id === void 0 || filter.id.length === 0) && (filter.foreignKeys === void 0 || filter.foreignKeys.length === 0);
2951
3019
  };
2952
3020
 
2953
- // packages/core/echo/echo-pipeline/src/query/query-executor.ts
2954
- var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/query/query-executor.ts";
3021
+ // src/query/query-executor.ts
3022
+ var __dxlog_file11 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/query/query-executor.ts";
2955
3023
  var ExecutionTrace = Object.freeze({
2956
3024
  makeEmpty: () => ({
2957
3025
  name: "Empty",
@@ -2978,10 +3046,21 @@ var ExecutionTrace = Object.freeze({
2978
3046
  });
2979
3047
  var TRACE_QUERY_EXECUTION = false;
2980
3048
  var QueryExecutor = class extends Resource6 {
3049
+ _indexer;
3050
+ _automergeHost;
3051
+ _spaceStateManager;
3052
+ /**
3053
+ * Id of this query.
3054
+ */
3055
+ _id;
3056
+ _query;
3057
+ // TODO(dmaretskyi): Might be used in the future.
3058
+ _reactivity;
3059
+ _plan;
3060
+ _trace = ExecutionTrace.makeEmpty();
3061
+ _lastResultSet = [];
2981
3062
  constructor(options) {
2982
3063
  super();
2983
- this._trace = ExecutionTrace.makeEmpty();
2984
- this._lastResultSet = [];
2985
3064
  this._indexer = options.indexer;
2986
3065
  this._automergeHost = options.automergeHost;
2987
3066
  this._spaceStateManager = options.spaceStateManager;
@@ -3014,9 +3093,9 @@ var QueryExecutor = class extends Resource6 {
3014
3093
  }));
3015
3094
  }
3016
3095
  async execQuery() {
3017
- invariant10(this._lifecycleState === LifecycleState3.OPEN, void 0, {
3096
+ invariant10(this._lifecycleState === LifecycleState4.OPEN, void 0, {
3018
3097
  F: __dxlog_file11,
3019
- L: 173,
3098
+ L: 174,
3020
3099
  S: this,
3021
3100
  A: [
3022
3101
  "this._lifecycleState === LifecycleState.OPEN",
@@ -3213,7 +3292,7 @@ var QueryExecutor = class extends Resource6 {
3213
3292
  }
3214
3293
  async _execFilterDeletedStep(step, workingSet) {
3215
3294
  if (workingSet.length === 6) {
3216
- log9.info("FilterDeletedStep", {
3295
+ log9("filter deleted step", {
3217
3296
  step,
3218
3297
  workingSet
3219
3298
  }, {
@@ -3260,7 +3339,7 @@ var QueryExecutor = class extends Resource6 {
3260
3339
  spaceId: item.spaceId
3261
3340
  } : null;
3262
3341
  } catch {
3263
- log9.warn("Invalid reference", {
3342
+ log9.warn("invalid reference", {
3264
3343
  ref: ref2["/"]
3265
3344
  }, {
3266
3345
  F: __dxlog_file11,
@@ -3318,7 +3397,7 @@ var QueryExecutor = class extends Resource6 {
3318
3397
  spaceId: item.spaceId
3319
3398
  };
3320
3399
  } catch {
3321
- log9.warn("Invalid reference", {
3400
+ log9.warn("invalid reference", {
3322
3401
  ref: ref["/"]
3323
3402
  }, {
3324
3403
  F: __dxlog_file11,
@@ -3513,15 +3592,18 @@ var QueryExecutor = class extends Resource6 {
3513
3592
  }
3514
3593
  };
3515
3594
 
3516
- // packages/core/echo/echo-pipeline/src/db-host/query-service.ts
3595
+ // src/db-host/query-service.ts
3517
3596
  function _ts_decorate5(decorators, target, key, desc) {
3518
3597
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3519
3598
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
3520
3599
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3521
3600
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3522
3601
  }
3523
- var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/query-service.ts";
3602
+ var __dxlog_file12 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/query-service.ts";
3524
3603
  var QueryServiceImpl = class extends Resource7 {
3604
+ _params;
3605
+ _queries;
3606
+ _updateQueries;
3525
3607
  // TODO(burdon): OK for options, but not params. Pass separately and type readonly here.
3526
3608
  constructor(_params) {
3527
3609
  super(), this._params = _params, this._queries = /* @__PURE__ */ new Set();
@@ -3552,6 +3634,18 @@ var QueryServiceImpl = class extends Resource7 {
3552
3634
  }
3553
3635
  execQuery(request) {
3554
3636
  return new Stream2(({ next, close, ctx }) => {
3637
+ if (this._params.indexer.config?.enabled !== true) {
3638
+ log10.error("indexer is disabled", {
3639
+ config: this._params.indexer.config
3640
+ }, {
3641
+ F: __dxlog_file12,
3642
+ L: 101,
3643
+ S: this,
3644
+ C: (f, a) => f(...a)
3645
+ });
3646
+ close();
3647
+ return;
3648
+ }
3555
3649
  const queryEntry = this._createQuery(ctx, request, next, close, close);
3556
3650
  scheduleMicroTask(ctx, async () => {
3557
3651
  await queryEntry.executor.open();
@@ -3567,7 +3661,7 @@ var QueryServiceImpl = class extends Resource7 {
3567
3661
  async reindex() {
3568
3662
  log10("Reindexing all documents...", void 0, {
3569
3663
  F: __dxlog_file12,
3570
- L: 113,
3664
+ L: 120,
3571
3665
  S: this,
3572
3666
  C: (f, a) => f(...a)
3573
3667
  });
@@ -3582,7 +3676,7 @@ var QueryServiceImpl = class extends Resource7 {
3582
3676
  count: ids.size
3583
3677
  }, {
3584
3678
  F: __dxlog_file12,
3585
- L: 121,
3679
+ L: 128,
3586
3680
  S: this,
3587
3681
  C: (f, a) => f(...a)
3588
3682
  });
@@ -3592,7 +3686,7 @@ var QueryServiceImpl = class extends Resource7 {
3592
3686
  count: ids.size
3593
3687
  }, {
3594
3688
  F: __dxlog_file12,
3595
- L: 125,
3689
+ L: 132,
3596
3690
  S: this,
3597
3691
  C: (f, a) => f(...a)
3598
3692
  });
@@ -3658,7 +3752,7 @@ var QueryServiceImpl = class extends Resource7 {
3658
3752
  } catch (err) {
3659
3753
  log10.catch(err, void 0, {
3660
3754
  F: __dxlog_file12,
3661
- L: 196,
3755
+ L: 203,
3662
3756
  S: this,
3663
3757
  C: (f, a) => f(...a)
3664
3758
  });
@@ -3669,7 +3763,7 @@ var QueryServiceImpl = class extends Resource7 {
3669
3763
  duration: performance.now() - begin
3670
3764
  }, {
3671
3765
  F: __dxlog_file12,
3672
- L: 200,
3766
+ L: 207,
3673
3767
  S: this,
3674
3768
  C: (f, a) => f(...a)
3675
3769
  });
@@ -3720,7 +3814,7 @@ var createDocumentsIterator = (automergeHost) => (
3720
3814
  }
3721
3815
  const linkHandle = await automergeHost.loadDoc(Context4.default(void 0, {
3722
3816
  F: __dxlog_file12,
3723
- L: 240
3817
+ L: 247
3724
3818
  }), urlString);
3725
3819
  for await (const result of getObjectsFromHandle(linkHandle)) {
3726
3820
  yield result;
@@ -3741,22 +3835,22 @@ var createDocumentsIterator = (automergeHost) => (
3741
3835
  }
3742
3836
  );
3743
3837
 
3744
- // packages/core/echo/echo-pipeline/src/db-host/space-state-manager.ts
3838
+ // src/db-host/space-state-manager.ts
3745
3839
  import { interpretAsDocumentId as interpretAsDocumentId3 } from "@automerge/automerge-repo";
3746
3840
  import isEqual from "lodash.isequal";
3747
3841
  import { Event as Event3, UpdateScheduler as UpdateScheduler3 } from "@dxos/async";
3748
- import { Resource as Resource8, Context as Context5, LifecycleState as LifecycleState4 } from "@dxos/context";
3842
+ import { Context as Context5, LifecycleState as LifecycleState5, Resource as Resource8 } from "@dxos/context";
3749
3843
  import { invariant as invariant12 } from "@dxos/invariant";
3750
3844
 
3751
- // packages/core/echo/echo-pipeline/src/db-host/database-root.ts
3845
+ // src/db-host/database-root.ts
3752
3846
  import { interpretAsDocumentId as interpretAsDocumentId2 } from "@automerge/automerge-repo";
3753
3847
  import { DatabaseDirectory as DatabaseDirectory5, SpaceDocVersion as SpaceDocVersion2 } from "@dxos/echo-protocol";
3754
3848
  import { invariant as invariant11 } from "@dxos/invariant";
3755
3849
 
3756
- // packages/core/echo/echo-pipeline/src/db-host/automerge-metrics.ts
3850
+ // src/db-host/automerge-metrics.ts
3757
3851
  import * as A4 from "@automerge/automerge";
3758
3852
  import { log as log11 } from "@dxos/log";
3759
- var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/automerge-metrics.ts";
3853
+ var __dxlog_file13 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/automerge-metrics.ts";
3760
3854
  var measureDocMetrics = (doc) => {
3761
3855
  const snapshot = A4.save(doc);
3762
3856
  const start = Date.now();
@@ -3783,9 +3877,10 @@ var measureDocMetrics = (doc) => {
3783
3877
  };
3784
3878
  };
3785
3879
 
3786
- // packages/core/echo/echo-pipeline/src/db-host/database-root.ts
3787
- var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/database-root.ts";
3880
+ // src/db-host/database-root.ts
3881
+ var __dxlog_file14 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/database-root.ts";
3788
3882
  var DatabaseRoot = class {
3883
+ _rootHandle;
3789
3884
  static mapLinks(doc, mapping) {
3790
3885
  doc.change((d) => {
3791
3886
  if (!d.links) {
@@ -3867,17 +3962,14 @@ var DatabaseRoot = class {
3867
3962
  }
3868
3963
  };
3869
3964
 
3870
- // packages/core/echo/echo-pipeline/src/db-host/space-state-manager.ts
3871
- var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/space-state-manager.ts";
3965
+ // src/db-host/space-state-manager.ts
3966
+ var __dxlog_file15 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/space-state-manager.ts";
3872
3967
  var SpaceStateManager = class extends Resource8 {
3873
- constructor() {
3874
- super(...arguments);
3875
- this._roots = /* @__PURE__ */ new Map();
3876
- this._rootBySpace = /* @__PURE__ */ new Map();
3877
- this._perRootContext = /* @__PURE__ */ new Map();
3878
- this._lastSpaceDocumentList = /* @__PURE__ */ new Map();
3879
- this.spaceDocumentListUpdated = new Event3();
3880
- }
3968
+ _roots = /* @__PURE__ */ new Map();
3969
+ _rootBySpace = /* @__PURE__ */ new Map();
3970
+ _perRootContext = /* @__PURE__ */ new Map();
3971
+ _lastSpaceDocumentList = /* @__PURE__ */ new Map();
3972
+ spaceDocumentListUpdated = new Event3();
3881
3973
  async _close(ctx) {
3882
3974
  for (const [_, rootCtx] of this._perRootContext) {
3883
3975
  await rootCtx.dispose();
@@ -3894,7 +3986,7 @@ var SpaceStateManager = class extends Resource8 {
3894
3986
  return this._rootBySpace.get(spaceId);
3895
3987
  }
3896
3988
  getRootBySpaceId(spaceId) {
3897
- invariant12(this._lifecycleState === LifecycleState4.OPEN, void 0, {
3989
+ invariant12(this._lifecycleState === LifecycleState5.OPEN, void 0, {
3898
3990
  F: __dxlog_file15,
3899
3991
  L: 44,
3900
3992
  S: this,
@@ -3952,6 +4044,10 @@ var SpaceStateManager = class extends Resource8 {
3952
4044
  }
3953
4045
  };
3954
4046
  var SpaceDocumentListUpdatedEvent = class {
4047
+ spaceId;
4048
+ spaceRootId;
4049
+ previousRootId;
4050
+ documentIds;
3955
4051
  constructor(spaceId, spaceRootId, previousRootId, documentIds) {
3956
4052
  this.spaceId = spaceId;
3957
4053
  this.spaceRootId = spaceRootId;
@@ -3960,17 +4056,23 @@ var SpaceDocumentListUpdatedEvent = class {
3960
4056
  }
3961
4057
  };
3962
4058
 
3963
- // packages/core/echo/echo-pipeline/src/db-host/echo-host.ts
3964
- var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/echo-host.ts";
4059
+ // src/db-host/echo-host.ts
4060
+ var __dxlog_file16 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/echo-host.ts";
3965
4061
  var DEFAULT_INDEXING_CONFIG = {
3966
4062
  // TODO(dmaretskyi): Disabled by default since embedding generation is expensive.
3967
4063
  fullText: false,
3968
4064
  vector: false
3969
4065
  };
3970
4066
  var EchoHost = class extends Resource9 {
4067
+ _indexMetadataStore;
4068
+ _indexer;
4069
+ _automergeHost;
4070
+ _queryService;
4071
+ _dataService;
4072
+ _spaceStateManager = new SpaceStateManager();
4073
+ _echoDataMonitor;
3971
4074
  constructor({ kv, indexing = {}, peerIdProvider, getSpaceKeyByRootDocumentId }) {
3972
4075
  super();
3973
- this._spaceStateManager = new SpaceStateManager();
3974
4076
  const indexingConfig = {
3975
4077
  ...DEFAULT_INDEXING_CONFIG,
3976
4078
  ...indexing
@@ -4135,9 +4237,9 @@ var EchoHost = class extends Resource9 {
4135
4237
  * Create new space root.
4136
4238
  */
4137
4239
  async createSpaceRoot(spaceKey) {
4138
- invariant13(this._lifecycleState === LifecycleState5.OPEN, void 0, {
4240
+ invariant13(this._lifecycleState === LifecycleState6.OPEN, void 0, {
4139
4241
  F: __dxlog_file16,
4140
- L: 255,
4242
+ L: 256,
4141
4243
  S: this,
4142
4244
  A: [
4143
4245
  "this._lifecycleState === LifecycleState.OPEN",
@@ -4163,9 +4265,9 @@ var EchoHost = class extends Resource9 {
4163
4265
  }
4164
4266
  // TODO(dmaretskyi): Change to document id.
4165
4267
  async openSpaceRoot(spaceId, automergeUrl) {
4166
- invariant13(this._lifecycleState === LifecycleState5.OPEN, void 0, {
4268
+ invariant13(this._lifecycleState === LifecycleState6.OPEN, void 0, {
4167
4269
  F: __dxlog_file16,
4168
- L: 274,
4270
+ L: 275,
4169
4271
  S: this,
4170
4272
  A: [
4171
4273
  "this._lifecycleState === LifecycleState.OPEN",
@@ -4194,9 +4296,9 @@ var EchoHost = class extends Resource9 {
4194
4296
  }
4195
4297
  };
4196
4298
 
4197
- // packages/core/echo/echo-pipeline/src/edge/echo-edge-replicator.ts
4299
+ // src/edge/echo-edge-replicator.ts
4198
4300
  import { cbor as cbor2 } from "@automerge/automerge-repo";
4199
- import { Mutex, scheduleTask as scheduleTask2, scheduleMicroTask as scheduleMicroTask2 } from "@dxos/async";
4301
+ import { Mutex, scheduleMicroTask as scheduleMicroTask2, scheduleTask as scheduleTask2 } from "@dxos/async";
4200
4302
  import { Context as Context6, Resource as Resource11 } from "@dxos/context";
4201
4303
  import { randomUUID } from "@dxos/crypto";
4202
4304
  import { invariant as invariant14 } from "@dxos/invariant";
@@ -4206,12 +4308,21 @@ import { buf } from "@dxos/protocols/buf";
4206
4308
  import { MessageSchema as RouterMessageSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
4207
4309
  import { bufferToArray as bufferToArray2 } from "@dxos/util";
4208
4310
 
4209
- // packages/core/echo/echo-pipeline/src/edge/inflight-request-limiter.ts
4311
+ // src/edge/inflight-request-limiter.ts
4210
4312
  import { Trigger as Trigger2 } from "@dxos/async";
4211
4313
  import { Resource as Resource10 } from "@dxos/context";
4212
4314
  import { log as log12 } from "@dxos/log";
4213
- var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/edge/inflight-request-limiter.ts";
4315
+ var __dxlog_file17 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/edge/inflight-request-limiter.ts";
4214
4316
  var InflightRequestLimiter = class extends Resource10 {
4317
+ _config;
4318
+ /**
4319
+ * Decrement when we receive a sync message, increment when we send one.
4320
+ * Can't exceed _config.maxInflightRequests.
4321
+ * Resets after timeout to avoid replicator being stuck.
4322
+ */
4323
+ _inflightRequestBalance;
4324
+ _requestBarrier;
4325
+ _resetBalanceTimeout;
4215
4326
  constructor(_config) {
4216
4327
  super(), this._config = _config, this._inflightRequestBalance = 0, this._requestBarrier = new Trigger2();
4217
4328
  }
@@ -4259,7 +4370,7 @@ var InflightRequestLimiter = class extends Resource10 {
4259
4370
  }
4260
4371
  };
4261
4372
 
4262
- // packages/core/echo/echo-pipeline/src/edge/echo-edge-replicator.ts
4373
+ // src/edge/echo-edge-replicator.ts
4263
4374
  function _ts_add_disposable_resource(env, value, async) {
4264
4375
  if (value !== null && value !== void 0) {
4265
4376
  if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
@@ -4325,18 +4436,19 @@ function _ts_dispose_resources(env) {
4325
4436
  return next();
4326
4437
  })(env);
4327
4438
  }
4328
- var __dxlog_file18 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/edge/echo-edge-replicator.ts";
4439
+ var __dxlog_file18 = "/__w/dxos/dxos/packages/core/echo/echo-pipeline/src/edge/echo-edge-replicator.ts";
4329
4440
  var INITIAL_RESTART_DELAY = 500;
4330
4441
  var RESTART_DELAY_JITTER = 250;
4331
4442
  var MAX_RESTART_DELAY = 5e3;
4332
4443
  var EchoEdgeReplicator = class {
4444
+ _edgeConnection;
4445
+ _mutex = new Mutex();
4446
+ _ctx = void 0;
4447
+ _context = null;
4448
+ _connectedSpaces = /* @__PURE__ */ new Set();
4449
+ _connections = /* @__PURE__ */ new Map();
4450
+ _sharePolicyEnabled = true;
4333
4451
  constructor({ edgeConnection, disableSharePolicy }) {
4334
- this._mutex = new Mutex();
4335
- this._ctx = void 0;
4336
- this._context = null;
4337
- this._connectedSpaces = /* @__PURE__ */ new Set();
4338
- this._connections = /* @__PURE__ */ new Map();
4339
- this._sharePolicyEnabled = true;
4340
4452
  this._edgeConnection = edgeConnection;
4341
4453
  this._sharePolicyEnabled = !disableSharePolicy;
4342
4454
  }
@@ -4346,14 +4458,14 @@ var EchoEdgeReplicator = class {
4346
4458
  connectedSpaces: this._connectedSpaces.size
4347
4459
  }, {
4348
4460
  F: __dxlog_file18,
4349
- L: 61,
4461
+ L: 62,
4350
4462
  S: this,
4351
4463
  C: (f, a) => f(...a)
4352
4464
  });
4353
4465
  this._context = context;
4354
4466
  this._ctx = Context6.default(void 0, {
4355
4467
  F: __dxlog_file18,
4356
- L: 63
4468
+ L: 64
4357
4469
  });
4358
4470
  this._ctx.onDispose(this._edgeConnection.onReconnected(() => {
4359
4471
  this._ctx && scheduleMicroTask2(this._ctx, () => this._handleReconnect());
@@ -4452,7 +4564,7 @@ var EchoEdgeReplicator = class {
4452
4564
  async _openConnection(spaceId, reconnects = 0) {
4453
4565
  invariant14(this._context, void 0, {
4454
4566
  F: __dxlog_file18,
4455
- L: 124,
4567
+ L: 125,
4456
4568
  S: this,
4457
4569
  A: [
4458
4570
  "this._context",
@@ -4461,7 +4573,7 @@ var EchoEdgeReplicator = class {
4461
4573
  });
4462
4574
  invariant14(!this._connections.has(spaceId), void 0, {
4463
4575
  F: __dxlog_file18,
4464
- L: 125,
4576
+ L: 126,
4465
4577
  S: this,
4466
4578
  A: [
4467
4579
  "!this._connections.has(spaceId)",
@@ -4475,9 +4587,25 @@ var EchoEdgeReplicator = class {
4475
4587
  context: this._context,
4476
4588
  sharedPolicyEnabled: this._sharePolicyEnabled,
4477
4589
  onRemoteConnected: async () => {
4590
+ log13.trace("dxos.echo.edge.replicator.onRemoteConnected", {
4591
+ spaceId
4592
+ }, {
4593
+ F: __dxlog_file18,
4594
+ L: 136,
4595
+ S: this,
4596
+ C: (f, a) => f(...a)
4597
+ });
4478
4598
  this._context?.onConnectionOpen(connection);
4479
4599
  },
4480
4600
  onRemoteDisconnected: async () => {
4601
+ log13.trace("dxos.echo.edge.replicator.onRemoteDisconnected", {
4602
+ spaceId
4603
+ }, {
4604
+ F: __dxlog_file18,
4605
+ L: 140,
4606
+ S: this,
4607
+ C: (f, a) => f(...a)
4608
+ });
4481
4609
  this._context?.onConnectionClosed(connection);
4482
4610
  },
4483
4611
  onRestartRequested: async () => {
@@ -4491,7 +4619,7 @@ var EchoEdgeReplicator = class {
4491
4619
  restartDelay
4492
4620
  }, {
4493
4621
  F: __dxlog_file18,
4494
- L: 148,
4622
+ L: 151,
4495
4623
  S: this,
4496
4624
  C: (f, a) => f(...a)
4497
4625
  });
@@ -4513,6 +4641,16 @@ var EchoEdgeReplicator = class {
4513
4641
  if (ctx?.disposed) {
4514
4642
  return;
4515
4643
  }
4644
+ log13.trace("dxos.echo.edge.replicator.restart", {
4645
+ spaceId,
4646
+ reconnects,
4647
+ restartDelay
4648
+ }, {
4649
+ F: __dxlog_file18,
4650
+ L: 168,
4651
+ S: this,
4652
+ C: (f, a) => f(...a)
4653
+ });
4516
4654
  await this._openConnection(spaceId, reconnects + 1);
4517
4655
  } catch (e) {
4518
4656
  env.error = e;
@@ -4530,13 +4668,24 @@ var EchoEdgeReplicator = class {
4530
4668
  var MAX_INFLIGHT_REQUESTS = 5;
4531
4669
  var MAX_RATE_LIMIT_WAIT_TIME_MS = 3e3;
4532
4670
  var EdgeReplicatorConnection = class extends Resource11 {
4671
+ _edgeConnection;
4672
+ _remotePeerId = null;
4673
+ _targetServiceId;
4674
+ _spaceId;
4675
+ _context;
4676
+ _sharedPolicyEnabled;
4677
+ _onRemoteConnected;
4678
+ _onRemoteDisconnected;
4679
+ _onRestartRequested;
4680
+ _requestLimiter = new InflightRequestLimiter({
4681
+ maxInflightRequests: MAX_INFLIGHT_REQUESTS,
4682
+ resetBalanceTimeoutMs: MAX_RATE_LIMIT_WAIT_TIME_MS
4683
+ });
4684
+ _readableStreamController;
4685
+ readable;
4686
+ writable;
4533
4687
  constructor({ edgeConnection, spaceId, context, sharedPolicyEnabled, onRemoteConnected, onRemoteDisconnected, onRestartRequested }) {
4534
4688
  super();
4535
- this._remotePeerId = null;
4536
- this._requestLimiter = new InflightRequestLimiter({
4537
- maxInflightRequests: MAX_INFLIGHT_REQUESTS,
4538
- resetBalanceTimeoutMs: MAX_RATE_LIMIT_WAIT_TIME_MS
4539
- });
4540
4689
  this._edgeConnection = edgeConnection;
4541
4690
  this._spaceId = spaceId;
4542
4691
  this._context = context;
@@ -4561,7 +4710,7 @@ var EdgeReplicatorConnection = class extends Resource11 {
4561
4710
  async _open(ctx) {
4562
4711
  log13("opening...", void 0, {
4563
4712
  F: __dxlog_file18,
4564
- L: 251,
4713
+ L: 255,
4565
4714
  S: this,
4566
4715
  C: (f, a) => f(...a)
4567
4716
  });
@@ -4569,12 +4718,29 @@ var EdgeReplicatorConnection = class extends Resource11 {
4569
4718
  this._ctx.onDispose(this._edgeConnection.onMessage((msg) => {
4570
4719
  this._onMessage(msg);
4571
4720
  }));
4721
+ let firstReconnect = true;
4722
+ this._ctx.onDispose(
4723
+ // NOTE: This will fire immediately if the connection is already open.
4724
+ this._edgeConnection.onReconnected(async () => {
4725
+ if (firstReconnect) {
4726
+ log13.verbose("first reconnect skipped", void 0, {
4727
+ F: __dxlog_file18,
4728
+ L: 270,
4729
+ S: this,
4730
+ C: (f, a) => f(...a)
4731
+ });
4732
+ firstReconnect = false;
4733
+ return;
4734
+ }
4735
+ this._onRestartRequested();
4736
+ })
4737
+ );
4572
4738
  await this._onRemoteConnected();
4573
4739
  }
4574
4740
  async _close() {
4575
4741
  log13("closing...", void 0, {
4576
4742
  F: __dxlog_file18,
4577
- L: 266,
4743
+ L: 283,
4578
4744
  S: this,
4579
4745
  C: (f, a) => f(...a)
4580
4746
  });
@@ -4585,7 +4751,7 @@ var EdgeReplicatorConnection = class extends Resource11 {
4585
4751
  get peerId() {
4586
4752
  invariant14(this._remotePeerId, "Not connected", {
4587
4753
  F: __dxlog_file18,
4588
- L: 275,
4754
+ L: 292,
4589
4755
  S: this,
4590
4756
  A: [
4591
4757
  "this._remotePeerId",
@@ -4610,7 +4776,7 @@ var EdgeReplicatorConnection = class extends Resource11 {
4610
4776
  remoteId: this._remotePeerId
4611
4777
  }, {
4612
4778
  F: __dxlog_file18,
4613
- L: 290,
4779
+ L: 307,
4614
4780
  S: this,
4615
4781
  C: (f, a) => f(...a)
4616
4782
  });
@@ -4636,7 +4802,7 @@ var EdgeReplicatorConnection = class extends Resource11 {
4636
4802
  remoteId: this._remotePeerId
4637
4803
  }, {
4638
4804
  F: __dxlog_file18,
4639
- L: 319,
4805
+ L: 336,
4640
4806
  S: this,
4641
4807
  C: (f, a) => f(...a)
4642
4808
  });
@@ -4659,27 +4825,38 @@ var EdgeReplicatorConnection = class extends Resource11 {
4659
4825
  remoteId: this._remotePeerId
4660
4826
  }, {
4661
4827
  F: __dxlog_file18,
4662
- L: 348,
4828
+ L: 365,
4663
4829
  S: this,
4664
4830
  C: (f, a) => f(...a)
4665
4831
  });
4666
4832
  const encoded = cbor2.encode(message);
4667
- await this._edgeConnection.send(buf.create(RouterMessageSchema, {
4668
- serviceId: this._targetServiceId,
4669
- source: {
4670
- identityKey: this._edgeConnection.identityKey,
4671
- peerKey: this._edgeConnection.peerKey
4672
- },
4673
- payload: {
4674
- value: bufferToArray2(encoded)
4675
- }
4676
- }));
4833
+ try {
4834
+ await this._edgeConnection.send(buf.create(RouterMessageSchema, {
4835
+ serviceId: this._targetServiceId,
4836
+ source: {
4837
+ identityKey: this._edgeConnection.identityKey,
4838
+ peerKey: this._edgeConnection.peerKey
4839
+ },
4840
+ payload: {
4841
+ value: bufferToArray2(encoded)
4842
+ }
4843
+ }));
4844
+ } catch (err) {
4845
+ log13.error("failed to send message", {
4846
+ err
4847
+ }, {
4848
+ F: __dxlog_file18,
4849
+ L: 385,
4850
+ S: this,
4851
+ C: (f, a) => f(...a)
4852
+ });
4853
+ }
4677
4854
  }
4678
4855
  };
4679
4856
  var isForbiddenErrorMessage = (message) => message.type === "error" && message.message === "Forbidden";
4680
4857
 
4681
- // packages/core/echo/echo-pipeline/src/util.ts
4682
- import { decodeReference, ObjectStructure as ObjectStructure2 } from "@dxos/echo-protocol";
4858
+ // src/util.ts
4859
+ import { ObjectStructure as ObjectStructure2, decodeReference } from "@dxos/echo-protocol";
4683
4860
  var findInlineObjectOfType = (spaceDoc, typename) => {
4684
4861
  for (const id in spaceDoc.objects ?? {}) {
4685
4862
  const obj = spaceDoc.objects[id];