@dxos/echo-pipeline 0.3.11-main.e0dc42b → 0.3.11-main.e26c0a5

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 (43) hide show
  1. package/dist/lib/browser/{chunk-W3SSYW3X.mjs → chunk-CTE522SL.mjs} +247 -61
  2. package/dist/lib/browser/chunk-CTE522SL.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +33 -11
  6. package/dist/lib/browser/testing/index.mjs.map +4 -4
  7. package/dist/lib/node/{chunk-KTFCZMAY.cjs → chunk-ZLVSOBWV.cjs} +243 -60
  8. package/dist/lib/node/chunk-ZLVSOBWV.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +26 -26
  10. package/dist/lib/node/index.cjs.map +1 -1
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/testing/index.cjs +46 -25
  13. package/dist/lib/node/testing/index.cjs.map +4 -4
  14. package/dist/types/src/automerge/automerge-host.d.ts +37 -2
  15. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  16. package/dist/types/src/automerge/index.d.ts +1 -1
  17. package/dist/types/src/automerge/index.d.ts.map +1 -1
  18. package/dist/types/src/metadata/metadata-store.d.ts +1 -3
  19. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  20. package/dist/types/src/space/space-manager.d.ts +2 -2
  21. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  22. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  23. package/dist/types/src/space/space.d.ts.map +1 -1
  24. package/dist/types/src/testing/change-metadata.d.ts +8 -0
  25. package/dist/types/src/testing/change-metadata.d.ts.map +1 -0
  26. package/dist/types/src/testing/database-test-rig.d.ts.map +1 -1
  27. package/dist/types/src/testing/index.d.ts +1 -0
  28. package/dist/types/src/testing/index.d.ts.map +1 -1
  29. package/package.json +33 -33
  30. package/src/automerge/automerge-host.test.ts +319 -34
  31. package/src/automerge/automerge-host.ts +137 -20
  32. package/src/automerge/index.ts +1 -1
  33. package/src/metadata/metadata-store.ts +12 -2
  34. package/src/pipeline/pipeline-stress.test.ts +9 -2
  35. package/src/space/space-manager.ts +3 -3
  36. package/src/space/space-protocol.ts +4 -0
  37. package/src/space/space.ts +5 -0
  38. package/src/testing/change-metadata.ts +27 -0
  39. package/src/testing/database-test-rig.ts +4 -1
  40. package/src/testing/index.ts +1 -0
  41. package/src/testing/test-agent-builder.ts +1 -1
  42. package/dist/lib/browser/chunk-W3SSYW3X.mjs.map +0 -7
  43. package/dist/lib/node/chunk-KTFCZMAY.cjs.map +0 -7
@@ -519,12 +519,12 @@ var emptyLargeSpaceMetadata = () => ({});
519
519
  var EchoMetadata = schema4.getCodecForType("dxos.echo.metadata.EchoMetadata");
520
520
  var LargeSpaceMetadata = schema4.getCodecForType("dxos.echo.metadata.LargeSpaceMetadata");
521
521
  var MetadataStore = class {
522
- constructor(_directory) {
523
- this._directory = _directory;
522
+ constructor(directory) {
524
523
  this._metadata = emptyEchoMetadata();
525
524
  this._spaceLargeMetadata = new ComplexMap3(PublicKey3.hash);
526
525
  this._metadataFile = void 0;
527
526
  this.update = new Event();
527
+ this._directory = directory;
528
528
  }
529
529
  get metadata() {
530
530
  return this._metadata;
@@ -553,7 +553,7 @@ var MetadataStore = class {
553
553
  name: file.filename
554
554
  }, {
555
555
  F: __dxlog_file4,
556
- L: 78,
556
+ L: 85,
557
557
  S: this,
558
558
  C: (f, a) => f(...a)
559
559
  });
@@ -573,6 +573,9 @@ var MetadataStore = class {
573
573
  await file.close();
574
574
  }
575
575
  }
576
+ /**
577
+ * @internal
578
+ */
576
579
  async _writeFile(file, codec2, data) {
577
580
  const encoded = arrayToBuffer(codec2.encode(data));
578
581
  const checksum = CRC32.buf(encoded);
@@ -586,7 +589,7 @@ var MetadataStore = class {
586
589
  checksum
587
590
  }, {
588
591
  F: __dxlog_file4,
589
- L: 110,
592
+ L: 120,
590
593
  S: this,
591
594
  C: (f, a) => f(...a)
592
595
  });
@@ -618,7 +621,7 @@ var MetadataStore = class {
618
621
  err
619
622
  }, {
620
623
  F: __dxlog_file4,
621
- L: 141,
624
+ L: 151,
622
625
  S: this,
623
626
  C: (f, a) => f(...a)
624
627
  });
@@ -635,7 +638,7 @@ var MetadataStore = class {
635
638
  err
636
639
  }, {
637
640
  F: __dxlog_file4,
638
- L: 153,
641
+ L: 163,
639
642
  S: this,
640
643
  C: (f, a) => f(...a)
641
644
  });
@@ -665,7 +668,7 @@ var MetadataStore = class {
665
668
  err
666
669
  }, {
667
670
  F: __dxlog_file4,
668
- L: 182,
671
+ L: 192,
669
672
  S: this,
670
673
  C: (f, a) => f(...a)
671
674
  });
@@ -686,7 +689,7 @@ var MetadataStore = class {
686
689
  const space = this.spaces.find((space2) => space2.key === spaceKey);
687
690
  invariant4(space, "Space not found", {
688
691
  F: __dxlog_file4,
689
- L: 204,
692
+ L: 214,
690
693
  S: this,
691
694
  A: [
692
695
  "space",
@@ -710,7 +713,7 @@ var MetadataStore = class {
710
713
  async clear() {
711
714
  log3("clearing all metadata", void 0, {
712
715
  F: __dxlog_file4,
713
- L: 223,
716
+ L: 233,
714
717
  S: this,
715
718
  C: (f, a) => f(...a)
716
719
  });
@@ -723,7 +726,7 @@ var MetadataStore = class {
723
726
  async setIdentityRecord(record) {
724
727
  invariant4(!this._metadata.identity, "Cannot overwrite existing identity in metadata", {
725
728
  F: __dxlog_file4,
726
- L: 233,
729
+ L: 243,
727
730
  S: this,
728
731
  A: [
729
732
  "!this._metadata.identity",
@@ -737,7 +740,7 @@ var MetadataStore = class {
737
740
  async addSpace(record) {
738
741
  invariant4(!(this._metadata.spaces ?? []).find((space) => space.key === record.key), "Cannot overwrite existing space in metadata", {
739
742
  F: __dxlog_file4,
740
- L: 241,
743
+ L: 251,
741
744
  S: this,
742
745
  A: [
743
746
  "!(this._metadata.spaces ?? []).find((space) => space.key === record.key)",
@@ -1478,7 +1481,7 @@ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipelin
1478
1481
  var MESSAGES_PER_SNAPSHOT = 10;
1479
1482
  var AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL = 5e3;
1480
1483
  var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 5e3;
1481
- var DataPipeline = class DataPipeline2 {
1484
+ var DataPipeline = class {
1482
1485
  constructor(_params) {
1483
1486
  this._params = _params;
1484
1487
  this._ctx = new Context4();
@@ -1952,7 +1955,7 @@ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeli
1952
1955
  var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL2 = 500;
1953
1956
  var CONTROL_PIPELINE_SNAPSHOT_DELAY = 1e4;
1954
1957
  var USE_SNAPSHOTS = true;
1955
- var ControlPipeline = class ControlPipeline2 {
1958
+ var ControlPipeline = class {
1956
1959
  constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }) {
1957
1960
  this._ctx = new Context5();
1958
1961
  this._lastTimeframeSaveTime = Date.now();
@@ -2198,7 +2201,7 @@ function _ts_decorate6(decorators, target, key, desc) {
2198
2201
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2199
2202
  }
2200
2203
  var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space.ts";
2201
- var Space = class Space2 {
2204
+ var Space = class {
2202
2205
  constructor(params) {
2203
2206
  this._addFeedLock = new Lock();
2204
2207
  this.onCredentialProcessed = new Callback2();
@@ -2206,7 +2209,7 @@ var Space = class Space2 {
2206
2209
  this._isOpen = false;
2207
2210
  invariant9(params.spaceKey && params.feedProvider, void 0, {
2208
2211
  F: __dxlog_file11,
2209
- L: 73,
2212
+ L: 78,
2210
2213
  S: this,
2211
2214
  A: [
2212
2215
  "params.spaceKey && params.feedProvider",
@@ -2250,7 +2253,7 @@ var Space = class Space2 {
2250
2253
  credential
2251
2254
  }, {
2252
2255
  F: __dxlog_file11,
2253
- L: 111,
2256
+ L: 116,
2254
2257
  S: this,
2255
2258
  C: (f, a) => f(...a)
2256
2259
  });
@@ -2315,7 +2318,7 @@ var Space = class Space2 {
2315
2318
  setControlFeed(feed) {
2316
2319
  invariant9(!this._controlFeed, "Control feed already set.", {
2317
2320
  F: __dxlog_file11,
2318
- L: 186,
2321
+ L: 191,
2319
2322
  S: this,
2320
2323
  A: [
2321
2324
  "!this._controlFeed",
@@ -2329,7 +2332,7 @@ var Space = class Space2 {
2329
2332
  setDataFeed(feed) {
2330
2333
  invariant9(!this._dataFeed, "Data feed already set.", {
2331
2334
  F: __dxlog_file11,
2332
- L: 193,
2335
+ L: 198,
2333
2336
  S: this,
2334
2337
  A: [
2335
2338
  "!this._dataFeed",
@@ -2355,7 +2358,7 @@ var Space = class Space2 {
2355
2358
  async open(ctx) {
2356
2359
  log10("opening...", void 0, {
2357
2360
  F: __dxlog_file11,
2358
- L: 215,
2361
+ L: 220,
2359
2362
  S: this,
2360
2363
  C: (f, a) => f(...a)
2361
2364
  });
@@ -2368,7 +2371,7 @@ var Space = class Space2 {
2368
2371
  this._isOpen = true;
2369
2372
  log10("opened", void 0, {
2370
2373
  F: __dxlog_file11,
2371
- L: 226,
2374
+ L: 231,
2372
2375
  S: this,
2373
2376
  C: (f, a) => f(...a)
2374
2377
  });
@@ -2378,7 +2381,7 @@ var Space = class Space2 {
2378
2381
  key: this._key
2379
2382
  }, {
2380
2383
  F: __dxlog_file11,
2381
- L: 231,
2384
+ L: 236,
2382
2385
  S: this,
2383
2386
  C: (f, a) => f(...a)
2384
2387
  });
@@ -2392,7 +2395,7 @@ var Space = class Space2 {
2392
2395
  this._isOpen = false;
2393
2396
  log10("closed", void 0, {
2394
2397
  F: __dxlog_file11,
2395
- L: 244,
2398
+ L: 249,
2396
2399
  S: this,
2397
2400
  C: (f, a) => f(...a)
2398
2401
  });
@@ -2400,13 +2403,13 @@ var Space = class Space2 {
2400
2403
  async initializeDataPipeline() {
2401
2404
  log10("initializeDataPipeline", void 0, {
2402
2405
  F: __dxlog_file11,
2403
- L: 249,
2406
+ L: 254,
2404
2407
  S: this,
2405
2408
  C: (f, a) => f(...a)
2406
2409
  });
2407
2410
  invariant9(this._isOpen, "Space must be open to initialize data pipeline.", {
2408
2411
  F: __dxlog_file11,
2409
- L: 250,
2412
+ L: 255,
2410
2413
  S: this,
2411
2414
  A: [
2412
2415
  "this._isOpen",
@@ -2416,6 +2419,15 @@ var Space = class Space2 {
2416
2419
  await this._dataPipeline.open();
2417
2420
  }
2418
2421
  };
2422
+ _ts_decorate6([
2423
+ trace3.info()
2424
+ ], Space.prototype, "protocol", void 0);
2425
+ _ts_decorate6([
2426
+ trace3.info()
2427
+ ], Space.prototype, "_controlPipeline", void 0);
2428
+ _ts_decorate6([
2429
+ trace3.info()
2430
+ ], Space.prototype, "_dataPipeline", void 0);
2419
2431
  _ts_decorate6([
2420
2432
  logInfo,
2421
2433
  trace3.info()
@@ -2443,6 +2455,7 @@ import { MMSTTopology } from "@dxos/network-manager";
2443
2455
  import { Teleport } from "@dxos/teleport";
2444
2456
  import { BlobSync } from "@dxos/teleport-extension-object-sync";
2445
2457
  import { ReplicatorExtension } from "@dxos/teleport-extension-replicator";
2458
+ import { trace as trace4 } from "@dxos/tracing";
2446
2459
  import { ComplexMap as ComplexMap5 } from "@dxos/util";
2447
2460
  function _ts_decorate7(decorators, target, key, desc) {
2448
2461
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -2486,7 +2499,7 @@ var SpaceProtocol = class {
2486
2499
  key: feed.key
2487
2500
  }, {
2488
2501
  F: __dxlog_file12,
2489
- L: 99,
2502
+ L: 103,
2490
2503
  S: this,
2491
2504
  C: (f, a) => f(...a)
2492
2505
  });
@@ -2509,7 +2522,7 @@ var SpaceProtocol = class {
2509
2522
  await this.blobSync.open();
2510
2523
  log11("starting...", void 0, {
2511
2524
  F: __dxlog_file12,
2512
- L: 125,
2525
+ L: 129,
2513
2526
  S: this,
2514
2527
  C: (f, a) => f(...a)
2515
2528
  });
@@ -2523,7 +2536,7 @@ var SpaceProtocol = class {
2523
2536
  });
2524
2537
  log11("started", void 0, {
2525
2538
  F: __dxlog_file12,
2526
- L: 135,
2539
+ L: 139,
2527
2540
  S: this,
2528
2541
  C: (f, a) => f(...a)
2529
2542
  });
@@ -2533,14 +2546,14 @@ var SpaceProtocol = class {
2533
2546
  if (this._connection) {
2534
2547
  log11("stopping...", void 0, {
2535
2548
  F: __dxlog_file12,
2536
- L: 142,
2549
+ L: 146,
2537
2550
  S: this,
2538
2551
  C: (f, a) => f(...a)
2539
2552
  });
2540
2553
  await this._connection.close();
2541
2554
  log11("stopped", void 0, {
2542
2555
  F: __dxlog_file12,
2543
- L: 144,
2556
+ L: 148,
2544
2557
  S: this,
2545
2558
  C: (f, a) => f(...a)
2546
2559
  });
@@ -2564,11 +2577,18 @@ var SpaceProtocol = class {
2564
2577
  }
2565
2578
  };
2566
2579
  _ts_decorate7([
2567
- logInfo2
2580
+ logInfo2,
2581
+ trace4.info()
2568
2582
  ], SpaceProtocol.prototype, "_topic", void 0);
2583
+ _ts_decorate7([
2584
+ trace4.info()
2585
+ ], SpaceProtocol.prototype, "_spaceKey", void 0);
2569
2586
  _ts_decorate7([
2570
2587
  logInfo2
2571
2588
  ], SpaceProtocol.prototype, "_ownPeerKey", null);
2589
+ SpaceProtocol = _ts_decorate7([
2590
+ trace4.resource()
2591
+ ], SpaceProtocol);
2572
2592
  var AuthStatus;
2573
2593
  (function(AuthStatus2) {
2574
2594
  AuthStatus2["INITIAL"] = "INITIAL";
@@ -2582,7 +2602,7 @@ var SpaceProtocolSession = class {
2582
2602
  this.replicator = new ReplicatorExtension().setOptions({
2583
2603
  upload: true
2584
2604
  });
2585
- this._authStatus = AuthStatus.INITIAL;
2605
+ this._authStatus = "INITIAL";
2586
2606
  this._wireParams = wireParams;
2587
2607
  this._swarmIdentity = swarmIdentity;
2588
2608
  this._onSessionAuth = onSessionAuth;
@@ -2607,15 +2627,15 @@ var SpaceProtocolSession = class {
2607
2627
  onAuthSuccess: () => {
2608
2628
  log11("Peer authenticated", void 0, {
2609
2629
  F: __dxlog_file12,
2610
- L: 241,
2630
+ L: 245,
2611
2631
  S: this,
2612
2632
  C: (f, a) => f(...a)
2613
2633
  });
2614
- this._authStatus = AuthStatus.SUCCESS;
2634
+ this._authStatus = "SUCCESS";
2615
2635
  this._onSessionAuth?.(this._teleport);
2616
2636
  },
2617
2637
  onAuthFailure: () => {
2618
- this._authStatus = AuthStatus.FAILURE;
2638
+ this._authStatus = "FAILURE";
2619
2639
  this._onAuthFailure?.(this._teleport);
2620
2640
  }
2621
2641
  }));
@@ -2625,7 +2645,7 @@ var SpaceProtocolSession = class {
2625
2645
  async close() {
2626
2646
  log11("close", void 0, {
2627
2647
  F: __dxlog_file12,
2628
- L: 257,
2648
+ L: 261,
2629
2649
  S: this,
2630
2650
  C: (f, a) => f(...a)
2631
2651
  });
@@ -2647,7 +2667,7 @@ import { synchronized as synchronized5, trackLeaks as trackLeaks4 } from "@dxos/
2647
2667
  import { failUndefined as failUndefined2 } from "@dxos/debug";
2648
2668
  import { PublicKey as PublicKey7 } from "@dxos/keys";
2649
2669
  import { log as log12 } from "@dxos/log";
2650
- import { trace as trace4 } from "@dxos/protocols";
2670
+ import { trace as trace5 } from "@dxos/protocols";
2651
2671
  import { ComplexMap as ComplexMap6 } from "@dxos/util";
2652
2672
  function _ts_decorate8(decorators, target, key, desc) {
2653
2673
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -2660,7 +2680,7 @@ function _ts_decorate8(decorators, target, key, desc) {
2660
2680
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2661
2681
  }
2662
2682
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space-manager.ts";
2663
- var SpaceManager = class SpaceManager2 {
2683
+ var SpaceManager = class {
2664
2684
  constructor({ feedStore, networkManager, modelFactory, metadataStore, snapshotStore, blobStore }) {
2665
2685
  this._spaces = new ComplexMap6(PublicKey7.hash);
2666
2686
  this._instanceId = PublicKey7.random().toHex();
@@ -2682,8 +2702,8 @@ var SpaceManager = class SpaceManager2 {
2682
2702
  ...this._spaces.values()
2683
2703
  ].map((space) => space.close()));
2684
2704
  }
2685
- async constructSpace({ metadata, swarmIdentity, onNetworkConnection, onAuthFailure, memberKey }) {
2686
- log12.trace("dxos.echo.space-manager.construct-space", trace4.begin({
2705
+ async constructSpace({ metadata, swarmIdentity, onAuthorizedConnection, onAuthFailure, memberKey }) {
2706
+ log12.trace("dxos.echo.space-manager.construct-space", trace5.begin({
2687
2707
  id: this._instanceId
2688
2708
  }), {
2689
2709
  F: __dxlog_file13,
@@ -2705,7 +2725,7 @@ var SpaceManager = class SpaceManager2 {
2705
2725
  topic: spaceKey,
2706
2726
  swarmIdentity,
2707
2727
  networkManager: this._networkManager,
2708
- onSessionAuth: onNetworkConnection,
2728
+ onSessionAuth: onAuthorizedConnection,
2709
2729
  onAuthFailure,
2710
2730
  blobStore: this._blobStore
2711
2731
  });
@@ -2721,7 +2741,7 @@ var SpaceManager = class SpaceManager2 {
2721
2741
  memberKey
2722
2742
  });
2723
2743
  this._spaces.set(space.key, space);
2724
- log12.trace("dxos.echo.space-manager.construct-space", trace4.end({
2744
+ log12.trace("dxos.echo.space-manager.construct-space", trace5.end({
2725
2745
  id: this._instanceId
2726
2746
  }), {
2727
2747
  F: __dxlog_file13,
@@ -2743,26 +2763,120 @@ SpaceManager = _ts_decorate8([
2743
2763
  ], SpaceManager);
2744
2764
 
2745
2765
  // packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
2766
+ import { Trigger as Trigger2 } from "@dxos/async";
2767
+ import { next as automerge } from "@dxos/automerge/automerge";
2746
2768
  import { Repo, NetworkAdapter, StorageAdapter, cbor } from "@dxos/automerge/automerge-repo";
2769
+ import { IndexedDBStorageAdapter } from "@dxos/automerge/automerge-repo-storage-indexeddb";
2747
2770
  import { Stream as Stream2 } from "@dxos/codec-protobuf";
2748
2771
  import { invariant as invariant10 } from "@dxos/invariant";
2772
+ import { PublicKey as PublicKey8 } from "@dxos/keys";
2749
2773
  import { log as log13 } from "@dxos/log";
2774
+ import { StorageType } from "@dxos/random-access-storage";
2750
2775
  import { AutomergeReplicator } from "@dxos/teleport-extension-automerge-replicator";
2751
- import { arrayToBuffer as arrayToBuffer2, bufferToArray } from "@dxos/util";
2776
+ import { trace as trace6 } from "@dxos/tracing";
2777
+ import { ComplexMap as ComplexMap7, ComplexSet, arrayToBuffer as arrayToBuffer2, bufferToArray, defaultMap, mapValues } from "@dxos/util";
2778
+ function _ts_decorate9(decorators, target, key, desc) {
2779
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2780
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
2781
+ r = Reflect.decorate(decorators, target, key, desc);
2782
+ else
2783
+ for (var i = decorators.length - 1; i >= 0; i--)
2784
+ if (d = decorators[i])
2785
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2786
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2787
+ }
2752
2788
  var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
2753
2789
  var AutomergeHost = class {
2754
2790
  constructor(storageDirectory) {
2791
+ /**
2792
+ * spaceKey -> deviceKey[]
2793
+ */
2794
+ this._authorizedDevices = new ComplexMap7(PublicKey8.hash);
2755
2795
  this._meshNetwork = new MeshNetworkAdapter();
2756
2796
  this._clientNetwork = new LocalHostNetworkAdapter();
2757
- this._storage = new AutomergeStorageAdapter(storageDirectory);
2797
+ this._storage = storageDirectory.type === StorageType.IDB ? new IndexedDBStorageAdapter(storageDirectory.path, "data") : new AutomergeStorageAdapter(storageDirectory);
2758
2798
  this._repo = new Repo({
2799
+ peerId: `host-${PublicKey8.random().toHex()}`,
2759
2800
  network: [
2760
2801
  this._clientNetwork,
2761
2802
  this._meshNetwork
2762
2803
  ],
2763
2804
  storage: this._storage,
2764
2805
  // TODO(dmaretskyi): Share based on HALO permissions and space affinity.
2765
- sharePolicy: async (peerId, documentId) => true
2806
+ // Hosts, running in the worker, don't share documents unless requested by other peers.
2807
+ sharePolicy: async (peerId, documentId) => {
2808
+ if (peerId.startsWith("client-")) {
2809
+ return true;
2810
+ }
2811
+ if (!documentId) {
2812
+ return false;
2813
+ }
2814
+ const doc = this._repo.handles[documentId]?.docSync();
2815
+ if (!doc) {
2816
+ log13("doc not found for share policy check", {
2817
+ peerId,
2818
+ documentId
2819
+ }, {
2820
+ F: __dxlog_file14,
2821
+ L: 68,
2822
+ S: this,
2823
+ C: (f, a) => f(...a)
2824
+ });
2825
+ return false;
2826
+ }
2827
+ try {
2828
+ if (!doc.experimental_spaceKey) {
2829
+ log13.warn("space key not found for share policy check", {
2830
+ peerId,
2831
+ documentId
2832
+ }, {
2833
+ F: __dxlog_file14,
2834
+ L: 74,
2835
+ S: this,
2836
+ C: (f, a) => f(...a)
2837
+ });
2838
+ return false;
2839
+ }
2840
+ const spaceKey = PublicKey8.from(doc.experimental_spaceKey);
2841
+ const authorizedDevices = this._authorizedDevices.get(spaceKey);
2842
+ const deviceKeyHex = this.repo.peerMetadataByPeerId[peerId]?.dxos_deviceKey;
2843
+ if (!deviceKeyHex) {
2844
+ log13.warn("device key not found for share policy check", {
2845
+ peerId,
2846
+ documentId
2847
+ }, {
2848
+ F: __dxlog_file14,
2849
+ L: 84,
2850
+ S: this,
2851
+ C: (f, a) => f(...a)
2852
+ });
2853
+ return false;
2854
+ }
2855
+ const deviceKey = PublicKey8.from(deviceKeyHex);
2856
+ const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;
2857
+ log13.info("share policy check", {
2858
+ peerId,
2859
+ documentId,
2860
+ deviceKey,
2861
+ spaceKey,
2862
+ isAuthorized
2863
+ }, {
2864
+ F: __dxlog_file14,
2865
+ L: 90,
2866
+ S: this,
2867
+ C: (f, a) => f(...a)
2868
+ });
2869
+ return isAuthorized;
2870
+ } catch (err) {
2871
+ log13.catch(err, void 0, {
2872
+ F: __dxlog_file14,
2873
+ L: 93,
2874
+ S: this,
2875
+ C: (f, a) => f(...a)
2876
+ });
2877
+ return false;
2878
+ }
2879
+ }
2766
2880
  });
2767
2881
  this._clientNetwork.ready();
2768
2882
  this._meshNetwork.ready();
@@ -2770,7 +2884,18 @@ var AutomergeHost = class {
2770
2884
  get repo() {
2771
2885
  return this._repo;
2772
2886
  }
2887
+ _automergeDocs() {
2888
+ return mapValues(this._repo.handles, (handle) => ({
2889
+ state: handle.state,
2890
+ hasDoc: !!handle.docSync(),
2891
+ heads: handle.docSync() ? automerge.getHeads(handle.docSync()) : null
2892
+ }));
2893
+ }
2894
+ _automergePeers() {
2895
+ return this._repo.peers;
2896
+ }
2773
2897
  async close() {
2898
+ this._storage instanceof AutomergeStorageAdapter && await this._storage.close();
2774
2899
  await this._clientNetwork.close();
2775
2900
  }
2776
2901
  //
@@ -2782,7 +2907,7 @@ var AutomergeHost = class {
2782
2907
  sendSyncMessage(request) {
2783
2908
  return this._clientNetwork.sendSyncMessage(request);
2784
2909
  }
2785
- getHostInfo() {
2910
+ async getHostInfo() {
2786
2911
  return this._clientNetwork.getHostInfo();
2787
2912
  }
2788
2913
  //
@@ -2791,11 +2916,28 @@ var AutomergeHost = class {
2791
2916
  createExtension() {
2792
2917
  return this._meshNetwork.createExtension();
2793
2918
  }
2919
+ authorizeDevice(spaceKey, deviceKey) {
2920
+ defaultMap(this._authorizedDevices, spaceKey, () => new ComplexSet(PublicKey8.hash)).add(deviceKey);
2921
+ }
2794
2922
  };
2923
+ _ts_decorate9([
2924
+ trace6.info({
2925
+ depth: null
2926
+ })
2927
+ ], AutomergeHost.prototype, "_automergeDocs", null);
2928
+ _ts_decorate9([
2929
+ trace6.info({
2930
+ depth: null
2931
+ })
2932
+ ], AutomergeHost.prototype, "_automergePeers", null);
2933
+ AutomergeHost = _ts_decorate9([
2934
+ trace6.resource()
2935
+ ], AutomergeHost);
2795
2936
  var LocalHostNetworkAdapter = class extends NetworkAdapter {
2796
2937
  constructor() {
2797
2938
  super(...arguments);
2798
2939
  this._peers = /* @__PURE__ */ new Map();
2940
+ this._connected = new Trigger2();
2799
2941
  }
2800
2942
  /**
2801
2943
  * Emits `ready` event. That signals to `Repo` that it can start using the adapter.
@@ -2807,12 +2949,13 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2807
2949
  }
2808
2950
  connect(peerId) {
2809
2951
  this.peerId = peerId;
2952
+ this._connected.wake();
2810
2953
  }
2811
2954
  send(message) {
2812
2955
  const peer = this._peers.get(message.targetId);
2813
2956
  invariant10(peer, "Peer not found.", {
2814
2957
  F: __dxlog_file14,
2815
- L: 108,
2958
+ L: 187,
2816
2959
  S: this,
2817
2960
  A: [
2818
2961
  "peer",
@@ -2832,7 +2975,7 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2832
2975
  return new Stream2(({ next, close }) => {
2833
2976
  invariant10(!this._peers.has(peerId), "Peer already connected.", {
2834
2977
  F: __dxlog_file14,
2835
- L: 126,
2978
+ L: 205,
2836
2979
  S: this,
2837
2980
  A: [
2838
2981
  "!this._peers.has(peerId)",
@@ -2854,19 +2997,35 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2854
2997
  });
2855
2998
  }
2856
2999
  });
2857
- this.emit("peer-candidate", {
2858
- peerId
2859
- });
3000
+ this._connected.wait({
3001
+ timeout: 1e3
3002
+ }).then(() => {
3003
+ this.emit("peer-candidate", {
3004
+ peerMetadata: {},
3005
+ peerId
3006
+ });
3007
+ }).catch((err) => log13.catch(err, void 0, {
3008
+ F: __dxlog_file14,
3009
+ L: 230,
3010
+ S: this,
3011
+ C: (f, a) => f(...a)
3012
+ }));
2860
3013
  });
2861
3014
  }
2862
3015
  async sendSyncMessage({ id, syncMessage }) {
3016
+ await this._connected.wait({
3017
+ timeout: 1e3
3018
+ });
2863
3019
  const message = cbor.decode(syncMessage);
2864
3020
  this.emit("message", message);
2865
3021
  }
2866
- getHostInfo() {
3022
+ async getHostInfo() {
3023
+ await this._connected.wait({
3024
+ timeout: 1e3
3025
+ });
2867
3026
  invariant10(this.peerId, "Peer id not set.", {
2868
3027
  F: __dxlog_file14,
2869
- L: 155,
3028
+ L: 242,
2870
3029
  S: this,
2871
3030
  A: [
2872
3031
  "this.peerId",
@@ -2902,7 +3061,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2902
3061
  const extension = this._extensions.get(receiverId);
2903
3062
  invariant10(extension, "Extension not found.", {
2904
3063
  F: __dxlog_file14,
2905
- L: 190,
3064
+ L: 277,
2906
3065
  S: this,
2907
3066
  A: [
2908
3067
  "extension",
@@ -2913,7 +3072,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2913
3072
  payload: cbor.encode(message)
2914
3073
  }).catch((err) => log13.catch(err, void 0, {
2915
3074
  F: __dxlog_file14,
2916
- L: 191,
3075
+ L: 278,
2917
3076
  S: this,
2918
3077
  C: (f, a) => f(...a)
2919
3078
  }));
@@ -2923,7 +3082,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2923
3082
  createExtension() {
2924
3083
  invariant10(this.peerId, "Peer id not set.", {
2925
3084
  F: __dxlog_file14,
2926
- L: 199,
3085
+ L: 286,
2927
3086
  S: this,
2928
3087
  A: [
2929
3088
  "this.peerId",
@@ -2934,13 +3093,17 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2934
3093
  const extension = new AutomergeReplicator({
2935
3094
  peerId: this.peerId
2936
3095
  }, {
2937
- onStartReplication: async (info) => {
3096
+ onStartReplication: async (info, remotePeerId) => {
2938
3097
  if (this._extensions.has(info.id)) {
2939
3098
  return;
2940
3099
  }
2941
3100
  peerInfo = info;
2942
3101
  this._extensions.set(info.id, extension);
2943
3102
  this.emit("peer-candidate", {
3103
+ // TODO(mykola): Hack, stop abusing `peerMetadata` field.
3104
+ peerMetadata: {
3105
+ dxos_deviceKey: remotePeerId.toHex()
3106
+ },
2944
3107
  peerId: info.id
2945
3108
  });
2946
3109
  },
@@ -2949,9 +3112,13 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2949
3112
  this.emit("message", message);
2950
3113
  },
2951
3114
  onClose: async () => {
2952
- peerInfo && this.emit("peer-disconnected", {
3115
+ if (!peerInfo) {
3116
+ return;
3117
+ }
3118
+ this.emit("peer-disconnected", {
2953
3119
  peerId: peerInfo.id
2954
3120
  });
3121
+ this._extensions.delete(peerInfo.id);
2955
3122
  }
2956
3123
  });
2957
3124
  return extension;
@@ -2961,8 +3128,12 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2961
3128
  constructor(_directory) {
2962
3129
  super();
2963
3130
  this._directory = _directory;
3131
+ this._state = "opened";
2964
3132
  }
2965
3133
  async load(key) {
3134
+ if (this._state !== "opened") {
3135
+ return void 0;
3136
+ }
2966
3137
  const filename = this._getFilename(key);
2967
3138
  const file = this._directory.getOrCreateFile(filename);
2968
3139
  const { size } = await file.stat();
@@ -2973,6 +3144,9 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2973
3144
  return bufferToArray(buffer);
2974
3145
  }
2975
3146
  async save(key, data) {
3147
+ if (this._state !== "opened") {
3148
+ return void 0;
3149
+ }
2976
3150
  const filename = this._getFilename(key);
2977
3151
  const file = this._directory.getOrCreateFile(filename);
2978
3152
  await file.write(0, arrayToBuffer2(data));
@@ -2980,11 +3154,17 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2980
3154
  await file.flush?.();
2981
3155
  }
2982
3156
  async remove(key) {
3157
+ if (this._state !== "opened") {
3158
+ return void 0;
3159
+ }
2983
3160
  const filename = this._getFilename(key);
2984
3161
  const file = this._directory.getOrCreateFile(filename);
2985
- await file.truncate?.(0);
3162
+ await file.destroy();
2986
3163
  }
2987
3164
  async loadRange(keyPrefix) {
3165
+ if (this._state !== "opened") {
3166
+ return [];
3167
+ }
2988
3168
  const filename = this._getFilename(keyPrefix);
2989
3169
  const entries = await this._directory.list();
2990
3170
  return Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
@@ -2998,13 +3178,19 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2998
3178
  }));
2999
3179
  }
3000
3180
  async removeRange(keyPrefix) {
3181
+ if (this._state !== "opened") {
3182
+ return void 0;
3183
+ }
3001
3184
  const filename = this._getFilename(keyPrefix);
3002
3185
  const entries = await this._directory.list();
3003
3186
  await Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
3004
- const file = this._directory.getOrCreateFile(filename);
3005
- await file.truncate?.(0);
3187
+ const file = this._directory.getOrCreateFile(entry);
3188
+ await file.destroy();
3006
3189
  }));
3007
3190
  }
3191
+ async close() {
3192
+ this._state = "closed";
3193
+ }
3008
3194
  _getFilename(key) {
3009
3195
  return key.map((k) => k.replaceAll("%", "%25").replaceAll("-", "%2D")).join("-");
3010
3196
  }
@@ -3040,4 +3226,4 @@ export {
3040
3226
  SpaceManager,
3041
3227
  AutomergeHost
3042
3228
  };
3043
- //# sourceMappingURL=chunk-W3SSYW3X.mjs.map
3229
+ //# sourceMappingURL=chunk-CTE522SL.mjs.map