@dxos/echo-pipeline 0.5.8 → 0.5.9-main.0a0e87d

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 (54) hide show
  1. package/dist/lib/browser/{chunk-GANAND63.mjs → chunk-I2J5TTHJ.mjs} +48 -23
  2. package/dist/lib/browser/{chunk-GANAND63.mjs.map → chunk-I2J5TTHJ.mjs.map} +3 -3
  3. package/dist/lib/browser/index.mjs +89 -51
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +99 -4
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node/{chunk-M475BGBI.cjs → chunk-QPCNQ4ZK.cjs} +51 -25
  9. package/dist/lib/node/chunk-QPCNQ4ZK.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +110 -72
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +107 -13
  14. package/dist/lib/node/testing/index.cjs.map +4 -4
  15. package/dist/types/src/automerge/automerge-doc-loader.d.ts +7 -3
  16. package/dist/types/src/automerge/automerge-doc-loader.d.ts.map +1 -1
  17. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  18. package/dist/types/src/automerge/echo-network-adapter.d.ts +6 -0
  19. package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
  20. package/dist/types/src/automerge/echo-replicator.d.ts +1 -0
  21. package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
  22. package/dist/types/src/automerge/mesh-echo-replicator.d.ts.map +1 -1
  23. package/dist/types/src/automerge/migrations.d.ts.map +1 -1
  24. package/dist/types/src/space/space-manager.d.ts +2 -2
  25. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  26. package/dist/types/src/space/space-protocol.d.ts +2 -2
  27. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  28. package/dist/types/src/space/space.d.ts +9 -1
  29. package/dist/types/src/space/space.d.ts.map +1 -1
  30. package/dist/types/src/testing/index.d.ts +1 -0
  31. package/dist/types/src/testing/index.d.ts.map +1 -1
  32. package/dist/types/src/testing/test-agent-builder.d.ts +2 -2
  33. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  34. package/dist/types/src/testing/test-network-adapter.d.ts +18 -0
  35. package/dist/types/src/testing/test-network-adapter.d.ts.map +1 -0
  36. package/package.json +33 -33
  37. package/src/automerge/automerge-doc-loader.test.ts +5 -2
  38. package/src/automerge/automerge-doc-loader.ts +6 -4
  39. package/src/automerge/automerge-host.test.ts +1 -553
  40. package/src/automerge/automerge-host.ts +12 -5
  41. package/src/automerge/automerge-repo.test.ts +450 -2
  42. package/src/automerge/echo-network-adapter.ts +24 -8
  43. package/src/automerge/echo-replicator.ts +2 -0
  44. package/src/automerge/mesh-echo-replicator.ts +3 -1
  45. package/src/automerge/migrations.ts +2 -1
  46. package/src/automerge/storage-adapter.test.ts +81 -15
  47. package/src/space/space-manager.ts +6 -4
  48. package/src/space/space-protocol.test.ts +5 -3
  49. package/src/space/space-protocol.ts +3 -3
  50. package/src/space/space.ts +32 -2
  51. package/src/testing/index.ts +1 -0
  52. package/src/testing/test-agent-builder.ts +4 -4
  53. package/src/testing/test-network-adapter.ts +62 -0
  54. package/dist/lib/node/chunk-M475BGBI.cjs.map +0 -7
@@ -16,13 +16,14 @@ import {
16
16
  SpaceProtocolSession,
17
17
  TimeframeClock,
18
18
  codec,
19
+ createIdFromSpaceKey,
19
20
  createMappedFeedWriter,
20
21
  hasInvitationExpired,
21
22
  mapFeedIndexesToTimeframe,
22
23
  mapTimeframeToFeedIndexes,
23
24
  startAfter,
24
25
  valueEncoding
25
- } from "./chunk-GANAND63.mjs";
26
+ } from "./chunk-I2J5TTHJ.mjs";
26
27
 
27
28
  // packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
28
29
  import { Event } from "@dxos/async";
@@ -160,13 +161,14 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
160
161
  peerId: this.peerId,
161
162
  onConnectionOpen: this._onConnectionOpen.bind(this),
162
163
  onConnectionClosed: this._onConnectionClosed.bind(this),
164
+ onConnectionAuthScopeChanged: this._onConnectionAuthScopeChanged.bind(this),
163
165
  getContainingSpaceForDocument: this._params.getContainingSpaceForDocument
164
166
  });
165
167
  }
166
168
  async removeReplicator(replicator) {
167
169
  invariant(this._lifecycleState === LifecycleState.OPEN, void 0, {
168
170
  F: __dxlog_file,
169
- L: 102,
171
+ L: 103,
170
172
  S: this,
171
173
  A: [
172
174
  "this._lifecycleState === LifecycleState.OPEN",
@@ -175,14 +177,13 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
175
177
  });
176
178
  invariant(this._replicators.has(replicator), void 0, {
177
179
  F: __dxlog_file,
178
- L: 103,
180
+ L: 104,
179
181
  S: this,
180
182
  A: [
181
183
  "this._replicators.has(replicator)",
182
184
  ""
183
185
  ]
184
186
  });
185
- "";
186
187
  await replicator.disconnect();
187
188
  this._replicators.delete(replicator);
188
189
  }
@@ -248,27 +249,49 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
248
249
  S: this,
249
250
  C: (f, a) => f(...a)
250
251
  });
251
- this.emit("peer-candidate", {
252
- peerId: connection.peerId,
253
- peerMetadata: {
254
- // TODO(dmaretskyi): Refactor this.
255
- dxos_peerSource: "EchoNetworkAdapter"
256
- }
252
+ this._emitPeerCandidate(connection);
253
+ }
254
+ /**
255
+ * Trigger doc-synchronizer shared documents set recalculation. Happens on peer-candidate.
256
+ * TODO(y): replace with a proper API call when sharePolicy update becomes supported by automerge-repo
257
+ */
258
+ _onConnectionAuthScopeChanged(connection) {
259
+ log("Connection auth scope changed", {
260
+ peerId: connection.peerId
261
+ }, {
262
+ F: __dxlog_file,
263
+ L: 153,
264
+ S: this,
265
+ C: (f, a) => f(...a)
266
+ });
267
+ const entry = this._connections.get(connection.peerId);
268
+ invariant(entry, void 0, {
269
+ F: __dxlog_file,
270
+ L: 155,
271
+ S: this,
272
+ A: [
273
+ "entry",
274
+ ""
275
+ ]
257
276
  });
277
+ this.emit("peer-disconnected", {
278
+ peerId: connection.peerId
279
+ });
280
+ this._emitPeerCandidate(connection);
258
281
  }
259
282
  _onConnectionClosed(connection) {
260
283
  log("Connection closed", {
261
284
  peerId: connection.peerId
262
285
  }, {
263
286
  F: __dxlog_file,
264
- L: 155,
287
+ L: 161,
265
288
  S: this,
266
289
  C: (f, a) => f(...a)
267
290
  });
268
291
  const entry = this._connections.get(connection.peerId);
269
292
  invariant(entry, void 0, {
270
293
  F: __dxlog_file,
271
- L: 157,
294
+ L: 163,
272
295
  S: this,
273
296
  A: [
274
297
  "entry",
@@ -281,18 +304,27 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
281
304
  });
282
305
  void entry.reader.cancel().catch((err) => log.catch(err, void 0, {
283
306
  F: __dxlog_file,
284
- L: 162,
307
+ L: 168,
285
308
  S: this,
286
309
  C: (f, a) => f(...a)
287
310
  }));
288
311
  void entry.writer.abort().catch((err) => log.catch(err, void 0, {
289
312
  F: __dxlog_file,
290
- L: 163,
313
+ L: 169,
291
314
  S: this,
292
315
  C: (f, a) => f(...a)
293
316
  }));
294
317
  this._connections.delete(connection.peerId);
295
318
  }
319
+ _emitPeerCandidate(connection) {
320
+ this.emit("peer-candidate", {
321
+ peerId: connection.peerId,
322
+ peerMetadata: {
323
+ // TODO(dmaretskyi): Refactor this.
324
+ dxos_peerSource: "EchoNetworkAdapter"
325
+ }
326
+ });
327
+ }
296
328
  };
297
329
  _ts_decorate([
298
330
  synchronized
@@ -641,7 +673,7 @@ var levelMigration = async ({ db, directory }) => {
641
673
  chunks: chunks.length
642
674
  }, {
643
675
  F: __dxlog_file3,
644
- L: 36,
676
+ L: 37,
645
677
  S: void 0,
646
678
  C: (f, a) => f(...a)
647
679
  });
@@ -677,6 +709,7 @@ var AutomergeHost = class {
677
709
  this._indexMetadataStore = indexMetadataStore;
678
710
  }
679
711
  async open() {
712
+ this._peerId = `host-${PublicKey.random().toHex()}`;
680
713
  this._directory && await levelMigration({
681
714
  db: this._db,
682
715
  directory: this._directory
@@ -689,16 +722,17 @@ var AutomergeHost = class {
689
722
  }
690
723
  });
691
724
  await this._storage.open?.();
692
- this._peerId = `host-${PublicKey.random().toHex()}`;
693
725
  this._clientNetwork = new LocalHostNetworkAdapter();
694
726
  this._repo = new Repo({
695
727
  peerId: this._peerId,
728
+ sharePolicy: this._sharePolicy.bind(this),
729
+ storage: this._storage,
696
730
  network: [
731
+ // Downstream client.
697
732
  this._clientNetwork,
733
+ // Upstream swarm.
698
734
  this._echoNetworkAdapter
699
- ],
700
- storage: this._storage,
701
- sharePolicy: this._sharePolicy.bind(this)
735
+ ]
702
736
  });
703
737
  this._clientNetwork.ready();
704
738
  await this._echoNetworkAdapter.open();
@@ -740,7 +774,7 @@ var AutomergeHost = class {
740
774
  isRequested
741
775
  }, {
742
776
  F: __dxlog_file4,
743
- L: 149,
777
+ L: 156,
744
778
  S: this,
745
779
  C: (f, a) => f(...a)
746
780
  });
@@ -826,7 +860,7 @@ var AutomergeHost = class {
826
860
  await Promise.all(states?.map(async ({ heads, documentId }) => {
827
861
  invariant3(heads, "heads are required for flush", {
828
862
  F: __dxlog_file4,
829
- L: 243,
863
+ L: 250,
830
864
  S: this,
831
865
  A: [
832
866
  "heads",
@@ -914,9 +948,10 @@ function _ts_decorate3(decorators, target, key, desc) {
914
948
  }
915
949
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-doc-loader.ts";
916
950
  var AutomergeDocumentLoaderImpl = class {
917
- constructor(_spaceKey, _repo) {
918
- this._spaceKey = _spaceKey;
951
+ constructor(_spaceId, _repo, _spaceKey) {
952
+ this._spaceId = _spaceId;
919
953
  this._repo = _repo;
954
+ this._spaceKey = _spaceKey;
920
955
  this._spaceRootDocHandle = null;
921
956
  this._objectDocumentHandles = /* @__PURE__ */ new Map();
922
957
  this._objectsPendingDocumentLoad = /* @__PURE__ */ new Set();
@@ -934,10 +969,10 @@ var AutomergeDocumentLoaderImpl = class {
934
969
  }
935
970
  if (!spaceState.rootUrl) {
936
971
  log4.error("Database opened with no rootUrl", {
937
- spaceKey: this._spaceKey
972
+ spaceId: this._spaceId
938
973
  }, {
939
974
  F: __dxlog_file5,
940
- L: 70,
975
+ L: 72,
941
976
  S: this,
942
977
  C: (f, a) => f(...a)
943
978
  });
@@ -947,7 +982,7 @@ var AutomergeDocumentLoaderImpl = class {
947
982
  const doc = existingDocHandle.docSync();
948
983
  invariant4(doc, void 0, {
949
984
  F: __dxlog_file5,
950
- L: 75,
985
+ L: 77,
951
986
  S: this,
952
987
  A: [
953
988
  "doc",
@@ -969,7 +1004,7 @@ var AutomergeDocumentLoaderImpl = class {
969
1004
  for (const objectId of objectIds) {
970
1005
  invariant4(this._spaceRootDocHandle, void 0, {
971
1006
  F: __dxlog_file5,
972
- L: 88,
1007
+ L: 90,
973
1008
  S: this,
974
1009
  A: [
975
1010
  "this._spaceRootDocHandle",
@@ -982,7 +1017,7 @@ var AutomergeDocumentLoaderImpl = class {
982
1017
  const spaceRootDoc = this._spaceRootDocHandle.docSync();
983
1018
  invariant4(spaceRootDoc, void 0, {
984
1019
  F: __dxlog_file5,
985
- L: 93,
1020
+ L: 95,
986
1021
  S: this,
987
1022
  A: [
988
1023
  "spaceRootDoc",
@@ -996,7 +1031,7 @@ var AutomergeDocumentLoaderImpl = class {
996
1031
  objectId
997
1032
  }, {
998
1033
  F: __dxlog_file5,
999
- L: 97,
1034
+ L: 99,
1000
1035
  S: this,
1001
1036
  C: (f, a) => f(...a)
1002
1037
  });
@@ -1020,7 +1055,7 @@ var AutomergeDocumentLoaderImpl = class {
1020
1055
  getSpaceRootDocHandle() {
1021
1056
  invariant4(this._spaceRootDocHandle, void 0, {
1022
1057
  F: __dxlog_file5,
1023
- L: 120,
1058
+ L: 122,
1024
1059
  S: this,
1025
1060
  A: [
1026
1061
  "this._spaceRootDocHandle",
@@ -1032,7 +1067,7 @@ var AutomergeDocumentLoaderImpl = class {
1032
1067
  createDocumentForObject(objectId) {
1033
1068
  invariant4(this._spaceRootDocHandle, void 0, {
1034
1069
  F: __dxlog_file5,
1035
- L: 125,
1070
+ L: 127,
1036
1071
  S: this,
1037
1072
  A: [
1038
1073
  "this._spaceRootDocHandle",
@@ -1075,7 +1110,7 @@ var AutomergeDocumentLoaderImpl = class {
1075
1110
  actualDocumentUrl: objectDocumentHandle.url
1076
1111
  }, {
1077
1112
  F: __dxlog_file5,
1078
- L: 155,
1113
+ L: 157,
1079
1114
  S: this,
1080
1115
  C: (f, a) => f(...a)
1081
1116
  });
@@ -1084,7 +1119,7 @@ var AutomergeDocumentLoaderImpl = class {
1084
1119
  if (objectDocumentHandle?.url === automergeUrl) {
1085
1120
  log4.warn("object document was already loaded", logMeta, {
1086
1121
  F: __dxlog_file5,
1087
- L: 162,
1122
+ L: 164,
1088
1123
  S: this,
1089
1124
  C: (f, a) => f(...a)
1090
1125
  });
@@ -1093,7 +1128,7 @@ var AutomergeDocumentLoaderImpl = class {
1093
1128
  const handle = this._repo.find(automergeUrl);
1094
1129
  log4.debug("document loading triggered", logMeta, {
1095
1130
  F: __dxlog_file5,
1096
- L: 166,
1131
+ L: 168,
1097
1132
  S: this,
1098
1133
  C: (f, a) => f(...a)
1099
1134
  });
@@ -1105,7 +1140,7 @@ var AutomergeDocumentLoaderImpl = class {
1105
1140
  const docHandle = this._repo.find(url);
1106
1141
  while (true) {
1107
1142
  try {
1108
- await warnAfterTimeout(5e3, "Automerge root doc load timeout (AutomergeDb)", async () => {
1143
+ await warnAfterTimeout(5e3, "Automerge root doc load timeout (CoreDatabase)", async () => {
1109
1144
  await cancelWithContext(ctx, docHandle.whenReady());
1110
1145
  });
1111
1146
  break;
@@ -1116,7 +1151,7 @@ var AutomergeDocumentLoaderImpl = class {
1116
1151
  state: docHandle.state
1117
1152
  }, {
1118
1153
  F: __dxlog_file5,
1119
- L: 182,
1154
+ L: 184,
1120
1155
  S: this,
1121
1156
  C: (f, a) => f(...a)
1122
1157
  });
@@ -1158,7 +1193,7 @@ var AutomergeDocumentLoaderImpl = class {
1158
1193
  if (this.onObjectDocumentLoaded.listenerCount() === 0) {
1159
1194
  log4.info("document loaded after all listeners were removed", logMeta, {
1160
1195
  F: __dxlog_file5,
1161
- L: 218,
1196
+ L: 220,
1162
1197
  S: this,
1163
1198
  C: (f, a) => f(...a)
1164
1199
  });
@@ -1168,7 +1203,7 @@ var AutomergeDocumentLoaderImpl = class {
1168
1203
  if (objectDocHandle?.url !== handle.url) {
1169
1204
  log4.warn("object was rebound while a document was loading, discarding handle", logMeta, {
1170
1205
  F: __dxlog_file5,
1171
- L: 223,
1206
+ L: 225,
1172
1207
  S: this,
1173
1208
  C: (f, a) => f(...a)
1174
1209
  });
@@ -1187,7 +1222,7 @@ var AutomergeDocumentLoaderImpl = class {
1187
1222
  err
1188
1223
  }, {
1189
1224
  F: __dxlog_file5,
1190
- L: 229,
1225
+ L: 231,
1191
1226
  S: this,
1192
1227
  C: (f, a) => f(...a)
1193
1228
  });
@@ -1269,7 +1304,9 @@ var MeshEchoReplicator = class {
1269
1304
  ""
1270
1305
  ]
1271
1306
  });
1272
- if (!this._connectionsPerPeer.has(connection.peerId)) {
1307
+ if (this._connectionsPerPeer.has(connection.peerId)) {
1308
+ this._context.onConnectionAuthScopeChanged(connection);
1309
+ } else {
1273
1310
  this._connectionsPerPeer.set(connection.peerId, connection);
1274
1311
  await connection.enable();
1275
1312
  this._context.onConnectionOpen(connection);
@@ -1280,7 +1317,7 @@ var MeshEchoReplicator = class {
1280
1317
  peerId: connection.peerId
1281
1318
  }, {
1282
1319
  F: __dxlog_file6,
1283
- L: 69,
1320
+ L: 71,
1284
1321
  S: this,
1285
1322
  C: (f, a) => f(...a)
1286
1323
  });
@@ -1295,13 +1332,13 @@ var MeshEchoReplicator = class {
1295
1332
  documentId: params.documentId
1296
1333
  }, {
1297
1334
  F: __dxlog_file6,
1298
- L: 76,
1335
+ L: 78,
1299
1336
  S: this,
1300
1337
  C: (f, a) => f(...a)
1301
1338
  });
1302
1339
  invariant5(this._context, void 0, {
1303
1340
  F: __dxlog_file6,
1304
- L: 77,
1341
+ L: 79,
1305
1342
  S: this,
1306
1343
  A: [
1307
1344
  "this._context",
@@ -1316,7 +1353,7 @@ var MeshEchoReplicator = class {
1316
1353
  documentId: params.documentId
1317
1354
  }, {
1318
1355
  F: __dxlog_file6,
1319
- L: 81,
1356
+ L: 83,
1320
1357
  S: this,
1321
1358
  C: (f, a) => f(...a)
1322
1359
  });
@@ -1329,7 +1366,7 @@ var MeshEchoReplicator = class {
1329
1366
  documentId: params.documentId
1330
1367
  }, {
1331
1368
  F: __dxlog_file6,
1332
- L: 91,
1369
+ L: 93,
1333
1370
  S: this,
1334
1371
  C: (f, a) => f(...a)
1335
1372
  });
@@ -1345,7 +1382,7 @@ var MeshEchoReplicator = class {
1345
1382
  isAuthorized
1346
1383
  }, {
1347
1384
  F: __dxlog_file6,
1348
- L: 99,
1385
+ L: 101,
1349
1386
  S: this,
1350
1387
  C: (f, a) => f(...a)
1351
1388
  });
@@ -1353,7 +1390,7 @@ var MeshEchoReplicator = class {
1353
1390
  } catch (err) {
1354
1391
  log5.catch(err, void 0, {
1355
1392
  F: __dxlog_file6,
1356
- L: 109,
1393
+ L: 111,
1357
1394
  S: this,
1358
1395
  C: (f, a) => f(...a)
1359
1396
  });
@@ -1370,7 +1407,7 @@ var MeshEchoReplicator = class {
1370
1407
  deviceKey
1371
1408
  }, {
1372
1409
  F: __dxlog_file6,
1373
- L: 120,
1410
+ L: 122,
1374
1411
  S: this,
1375
1412
  C: (f, a) => f(...a)
1376
1413
  });
@@ -1412,7 +1449,7 @@ var MeshReplicatorConnection = class extends Resource2 {
1412
1449
  remotePeerId: remotePeerId.toHex()
1413
1450
  }, {
1414
1451
  F: __dxlog_file6,
1415
- L: 185,
1452
+ L: 187,
1416
1453
  S: this,
1417
1454
  C: (f, a) => f(...a)
1418
1455
  });
@@ -1436,7 +1473,7 @@ var MeshReplicatorConnection = class extends Resource2 {
1436
1473
  get peerId() {
1437
1474
  invariant5(this._remotePeerId != null, "Remote peer has not connected yet.", {
1438
1475
  F: __dxlog_file6,
1439
- L: 208,
1476
+ L: 210,
1440
1477
  S: this,
1441
1478
  A: [
1442
1479
  "this._remotePeerId != null",
@@ -1455,7 +1492,7 @@ var MeshReplicatorConnection = class extends Resource2 {
1455
1492
  async enable() {
1456
1493
  invariant5(this._remotePeerId != null, "Remote peer has not connected yet.", {
1457
1494
  F: __dxlog_file6,
1458
- L: 221,
1495
+ L: 223,
1459
1496
  S: this,
1460
1497
  A: [
1461
1498
  "this._remotePeerId != null",
@@ -1493,6 +1530,7 @@ export {
1493
1530
  SpaceProtocolSession,
1494
1531
  TimeframeClock,
1495
1532
  codec,
1533
+ createIdFromSpaceKey,
1496
1534
  createMappedFeedWriter,
1497
1535
  encodingOptions,
1498
1536
  getSpaceKeyFromDoc,