@dxos/echo-pipeline 0.3.11-main.a996413 → 0.3.11-main.afa73e0

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 (36) hide show
  1. package/dist/lib/browser/{chunk-W3SSYW3X.mjs → chunk-AUYVKEFF.mjs} +162 -40
  2. package/dist/lib/browser/chunk-AUYVKEFF.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 +30 -8
  6. package/dist/lib/browser/testing/index.mjs.map +4 -4
  7. package/dist/lib/node/{chunk-KTFCZMAY.cjs → chunk-ETE7TCKN.cjs} +161 -42
  8. package/dist/lib/node/chunk-ETE7TCKN.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 +43 -22
  13. package/dist/lib/node/testing/index.cjs.map +4 -4
  14. package/dist/types/src/automerge/automerge-host.d.ts +35 -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/testing/change-metadata.d.ts +8 -0
  23. package/dist/types/src/testing/change-metadata.d.ts.map +1 -0
  24. package/dist/types/src/testing/index.d.ts +1 -0
  25. package/dist/types/src/testing/index.d.ts.map +1 -1
  26. package/package.json +33 -33
  27. package/src/automerge/automerge-host.test.ts +319 -34
  28. package/src/automerge/automerge-host.ts +115 -20
  29. package/src/automerge/index.ts +1 -1
  30. package/src/metadata/metadata-store.ts +12 -2
  31. package/src/space/space-manager.ts +3 -3
  32. package/src/testing/change-metadata.ts +27 -0
  33. package/src/testing/index.ts +1 -0
  34. package/src/testing/test-agent-builder.ts +1 -1
  35. package/dist/lib/browser/chunk-W3SSYW3X.mjs.map +0 -7
  36. 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();
@@ -2582,7 +2585,7 @@ var SpaceProtocolSession = class {
2582
2585
  this.replicator = new ReplicatorExtension().setOptions({
2583
2586
  upload: true
2584
2587
  });
2585
- this._authStatus = AuthStatus.INITIAL;
2588
+ this._authStatus = "INITIAL";
2586
2589
  this._wireParams = wireParams;
2587
2590
  this._swarmIdentity = swarmIdentity;
2588
2591
  this._onSessionAuth = onSessionAuth;
@@ -2611,11 +2614,11 @@ var SpaceProtocolSession = class {
2611
2614
  S: this,
2612
2615
  C: (f, a) => f(...a)
2613
2616
  });
2614
- this._authStatus = AuthStatus.SUCCESS;
2617
+ this._authStatus = "SUCCESS";
2615
2618
  this._onSessionAuth?.(this._teleport);
2616
2619
  },
2617
2620
  onAuthFailure: () => {
2618
- this._authStatus = AuthStatus.FAILURE;
2621
+ this._authStatus = "FAILURE";
2619
2622
  this._onAuthFailure?.(this._teleport);
2620
2623
  }
2621
2624
  }));
@@ -2660,7 +2663,7 @@ function _ts_decorate8(decorators, target, key, desc) {
2660
2663
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2661
2664
  }
2662
2665
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space-manager.ts";
2663
- var SpaceManager = class SpaceManager2 {
2666
+ var SpaceManager = class {
2664
2667
  constructor({ feedStore, networkManager, modelFactory, metadataStore, snapshotStore, blobStore }) {
2665
2668
  this._spaces = new ComplexMap6(PublicKey7.hash);
2666
2669
  this._instanceId = PublicKey7.random().toHex();
@@ -2682,7 +2685,7 @@ var SpaceManager = class SpaceManager2 {
2682
2685
  ...this._spaces.values()
2683
2686
  ].map((space) => space.close()));
2684
2687
  }
2685
- async constructSpace({ metadata, swarmIdentity, onNetworkConnection, onAuthFailure, memberKey }) {
2688
+ async constructSpace({ metadata, swarmIdentity, onAuthorizedConnection, onAuthFailure, memberKey }) {
2686
2689
  log12.trace("dxos.echo.space-manager.construct-space", trace4.begin({
2687
2690
  id: this._instanceId
2688
2691
  }), {
@@ -2705,7 +2708,7 @@ var SpaceManager = class SpaceManager2 {
2705
2708
  topic: spaceKey,
2706
2709
  swarmIdentity,
2707
2710
  networkManager: this._networkManager,
2708
- onSessionAuth: onNetworkConnection,
2711
+ onSessionAuth: onAuthorizedConnection,
2709
2712
  onAuthFailure,
2710
2713
  blobStore: this._blobStore
2711
2714
  });
@@ -2743,26 +2746,96 @@ SpaceManager = _ts_decorate8([
2743
2746
  ], SpaceManager);
2744
2747
 
2745
2748
  // packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
2749
+ import { Trigger as Trigger2 } from "@dxos/async";
2746
2750
  import { Repo, NetworkAdapter, StorageAdapter, cbor } from "@dxos/automerge/automerge-repo";
2751
+ import { IndexedDBStorageAdapter } from "@dxos/automerge/automerge-repo-storage-indexeddb";
2747
2752
  import { Stream as Stream2 } from "@dxos/codec-protobuf";
2748
2753
  import { invariant as invariant10 } from "@dxos/invariant";
2754
+ import { PublicKey as PublicKey8 } from "@dxos/keys";
2749
2755
  import { log as log13 } from "@dxos/log";
2756
+ import { StorageType } from "@dxos/random-access-storage";
2750
2757
  import { AutomergeReplicator } from "@dxos/teleport-extension-automerge-replicator";
2751
- import { arrayToBuffer as arrayToBuffer2, bufferToArray } from "@dxos/util";
2758
+ import { ComplexMap as ComplexMap7, ComplexSet, arrayToBuffer as arrayToBuffer2, bufferToArray, defaultMap } from "@dxos/util";
2752
2759
  var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
2753
2760
  var AutomergeHost = class {
2754
2761
  constructor(storageDirectory) {
2762
+ /**
2763
+ * spaceKey -> deviceKey[]
2764
+ */
2765
+ this._authorizedDevices = new ComplexMap7(PublicKey8.hash);
2755
2766
  this._meshNetwork = new MeshNetworkAdapter();
2756
2767
  this._clientNetwork = new LocalHostNetworkAdapter();
2757
- this._storage = new AutomergeStorageAdapter(storageDirectory);
2768
+ this._storage = storageDirectory.type === StorageType.IDB ? new IndexedDBStorageAdapter(storageDirectory.path, "data") : new AutomergeStorageAdapter(storageDirectory);
2758
2769
  this._repo = new Repo({
2770
+ peerId: `host-${PublicKey8.random().toHex()}`,
2759
2771
  network: [
2760
2772
  this._clientNetwork,
2761
2773
  this._meshNetwork
2762
2774
  ],
2763
2775
  storage: this._storage,
2764
2776
  // TODO(dmaretskyi): Share based on HALO permissions and space affinity.
2765
- sharePolicy: async (peerId, documentId) => true
2777
+ // Hosts, running in the worker, don't share documents unless requested by other peers.
2778
+ sharePolicy: async (peerId, documentId) => {
2779
+ if (peerId.startsWith("client-")) {
2780
+ return true;
2781
+ }
2782
+ if (!documentId) {
2783
+ return false;
2784
+ }
2785
+ const doc = this._repo.handles[documentId]?.docSync();
2786
+ if (!doc) {
2787
+ log13("doc not found for share policy check", {
2788
+ peerId,
2789
+ documentId
2790
+ }, {
2791
+ F: __dxlog_file14,
2792
+ L: 65,
2793
+ S: this,
2794
+ C: (f, a) => f(...a)
2795
+ });
2796
+ return false;
2797
+ }
2798
+ try {
2799
+ const spaceKey = PublicKey8.from(doc.experimental_spaceKey);
2800
+ const authorizedDevices = this._authorizedDevices.get(spaceKey);
2801
+ const deviceKeyHex = this.repo.peerMetadataByPeerId[peerId]?.dxos_deviceKey;
2802
+ if (!deviceKeyHex) {
2803
+ log13.warn("device key not found for share policy check", {
2804
+ peerId,
2805
+ documentId
2806
+ }, {
2807
+ F: __dxlog_file14,
2808
+ L: 76,
2809
+ S: this,
2810
+ C: (f, a) => f(...a)
2811
+ });
2812
+ return false;
2813
+ }
2814
+ const deviceKey = PublicKey8.from(deviceKeyHex);
2815
+ const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;
2816
+ log13.info("share policy check", {
2817
+ peerId,
2818
+ documentId,
2819
+ deviceKey,
2820
+ spaceKey,
2821
+ isAuthorized
2822
+ }, {
2823
+ F: __dxlog_file14,
2824
+ L: 82,
2825
+ S: this,
2826
+ C: (f, a) => f(...a)
2827
+ });
2828
+ return isAuthorized;
2829
+ } catch (err) {
2830
+ log13.catch(err, void 0, {
2831
+ F: __dxlog_file14,
2832
+ L: 85,
2833
+ S: this,
2834
+ C: (f, a) => f(...a)
2835
+ });
2836
+ return false;
2837
+ }
2838
+ }
2766
2839
  });
2767
2840
  this._clientNetwork.ready();
2768
2841
  this._meshNetwork.ready();
@@ -2771,6 +2844,7 @@ var AutomergeHost = class {
2771
2844
  return this._repo;
2772
2845
  }
2773
2846
  async close() {
2847
+ this._storage instanceof AutomergeStorageAdapter && await this._storage.close();
2774
2848
  await this._clientNetwork.close();
2775
2849
  }
2776
2850
  //
@@ -2782,7 +2856,7 @@ var AutomergeHost = class {
2782
2856
  sendSyncMessage(request) {
2783
2857
  return this._clientNetwork.sendSyncMessage(request);
2784
2858
  }
2785
- getHostInfo() {
2859
+ async getHostInfo() {
2786
2860
  return this._clientNetwork.getHostInfo();
2787
2861
  }
2788
2862
  //
@@ -2791,11 +2865,15 @@ var AutomergeHost = class {
2791
2865
  createExtension() {
2792
2866
  return this._meshNetwork.createExtension();
2793
2867
  }
2868
+ authorizeDevice(spaceKey, deviceKey) {
2869
+ defaultMap(this._authorizedDevices, spaceKey, () => new ComplexSet(PublicKey8.hash)).add(deviceKey);
2870
+ }
2794
2871
  };
2795
2872
  var LocalHostNetworkAdapter = class extends NetworkAdapter {
2796
2873
  constructor() {
2797
2874
  super(...arguments);
2798
2875
  this._peers = /* @__PURE__ */ new Map();
2876
+ this._connected = new Trigger2();
2799
2877
  }
2800
2878
  /**
2801
2879
  * Emits `ready` event. That signals to `Repo` that it can start using the adapter.
@@ -2807,12 +2885,13 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2807
2885
  }
2808
2886
  connect(peerId) {
2809
2887
  this.peerId = peerId;
2888
+ this._connected.wake();
2810
2889
  }
2811
2890
  send(message) {
2812
2891
  const peer = this._peers.get(message.targetId);
2813
2892
  invariant10(peer, "Peer not found.", {
2814
2893
  F: __dxlog_file14,
2815
- L: 108,
2894
+ L: 165,
2816
2895
  S: this,
2817
2896
  A: [
2818
2897
  "peer",
@@ -2832,7 +2911,7 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2832
2911
  return new Stream2(({ next, close }) => {
2833
2912
  invariant10(!this._peers.has(peerId), "Peer already connected.", {
2834
2913
  F: __dxlog_file14,
2835
- L: 126,
2914
+ L: 183,
2836
2915
  S: this,
2837
2916
  A: [
2838
2917
  "!this._peers.has(peerId)",
@@ -2854,19 +2933,35 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2854
2933
  });
2855
2934
  }
2856
2935
  });
2857
- this.emit("peer-candidate", {
2858
- peerId
2859
- });
2936
+ this._connected.wait({
2937
+ timeout: 1e3
2938
+ }).then(() => {
2939
+ this.emit("peer-candidate", {
2940
+ peerMetadata: {},
2941
+ peerId
2942
+ });
2943
+ }).catch((err) => log13.catch(err, void 0, {
2944
+ F: __dxlog_file14,
2945
+ L: 208,
2946
+ S: this,
2947
+ C: (f, a) => f(...a)
2948
+ }));
2860
2949
  });
2861
2950
  }
2862
2951
  async sendSyncMessage({ id, syncMessage }) {
2952
+ await this._connected.wait({
2953
+ timeout: 1e3
2954
+ });
2863
2955
  const message = cbor.decode(syncMessage);
2864
2956
  this.emit("message", message);
2865
2957
  }
2866
- getHostInfo() {
2958
+ async getHostInfo() {
2959
+ await this._connected.wait({
2960
+ timeout: 1e3
2961
+ });
2867
2962
  invariant10(this.peerId, "Peer id not set.", {
2868
2963
  F: __dxlog_file14,
2869
- L: 155,
2964
+ L: 220,
2870
2965
  S: this,
2871
2966
  A: [
2872
2967
  "this.peerId",
@@ -2902,7 +2997,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2902
2997
  const extension = this._extensions.get(receiverId);
2903
2998
  invariant10(extension, "Extension not found.", {
2904
2999
  F: __dxlog_file14,
2905
- L: 190,
3000
+ L: 255,
2906
3001
  S: this,
2907
3002
  A: [
2908
3003
  "extension",
@@ -2913,7 +3008,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2913
3008
  payload: cbor.encode(message)
2914
3009
  }).catch((err) => log13.catch(err, void 0, {
2915
3010
  F: __dxlog_file14,
2916
- L: 191,
3011
+ L: 256,
2917
3012
  S: this,
2918
3013
  C: (f, a) => f(...a)
2919
3014
  }));
@@ -2923,7 +3018,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2923
3018
  createExtension() {
2924
3019
  invariant10(this.peerId, "Peer id not set.", {
2925
3020
  F: __dxlog_file14,
2926
- L: 199,
3021
+ L: 264,
2927
3022
  S: this,
2928
3023
  A: [
2929
3024
  "this.peerId",
@@ -2934,13 +3029,17 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2934
3029
  const extension = new AutomergeReplicator({
2935
3030
  peerId: this.peerId
2936
3031
  }, {
2937
- onStartReplication: async (info) => {
3032
+ onStartReplication: async (info, remotePeerId) => {
2938
3033
  if (this._extensions.has(info.id)) {
2939
3034
  return;
2940
3035
  }
2941
3036
  peerInfo = info;
2942
3037
  this._extensions.set(info.id, extension);
2943
3038
  this.emit("peer-candidate", {
3039
+ // TODO(mykola): Hack, stop abusing `peerMetadata` field.
3040
+ peerMetadata: {
3041
+ dxos_deviceKey: remotePeerId.toHex()
3042
+ },
2944
3043
  peerId: info.id
2945
3044
  });
2946
3045
  },
@@ -2949,9 +3048,13 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2949
3048
  this.emit("message", message);
2950
3049
  },
2951
3050
  onClose: async () => {
2952
- peerInfo && this.emit("peer-disconnected", {
3051
+ if (!peerInfo) {
3052
+ return;
3053
+ }
3054
+ this.emit("peer-disconnected", {
2953
3055
  peerId: peerInfo.id
2954
3056
  });
3057
+ this._extensions.delete(peerInfo.id);
2955
3058
  }
2956
3059
  });
2957
3060
  return extension;
@@ -2961,8 +3064,12 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2961
3064
  constructor(_directory) {
2962
3065
  super();
2963
3066
  this._directory = _directory;
3067
+ this._state = "opened";
2964
3068
  }
2965
3069
  async load(key) {
3070
+ if (this._state !== "opened") {
3071
+ return void 0;
3072
+ }
2966
3073
  const filename = this._getFilename(key);
2967
3074
  const file = this._directory.getOrCreateFile(filename);
2968
3075
  const { size } = await file.stat();
@@ -2973,6 +3080,9 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2973
3080
  return bufferToArray(buffer);
2974
3081
  }
2975
3082
  async save(key, data) {
3083
+ if (this._state !== "opened") {
3084
+ return void 0;
3085
+ }
2976
3086
  const filename = this._getFilename(key);
2977
3087
  const file = this._directory.getOrCreateFile(filename);
2978
3088
  await file.write(0, arrayToBuffer2(data));
@@ -2980,11 +3090,17 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2980
3090
  await file.flush?.();
2981
3091
  }
2982
3092
  async remove(key) {
3093
+ if (this._state !== "opened") {
3094
+ return void 0;
3095
+ }
2983
3096
  const filename = this._getFilename(key);
2984
3097
  const file = this._directory.getOrCreateFile(filename);
2985
- await file.truncate?.(0);
3098
+ await file.destroy();
2986
3099
  }
2987
3100
  async loadRange(keyPrefix) {
3101
+ if (this._state !== "opened") {
3102
+ return [];
3103
+ }
2988
3104
  const filename = this._getFilename(keyPrefix);
2989
3105
  const entries = await this._directory.list();
2990
3106
  return Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
@@ -2998,13 +3114,19 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2998
3114
  }));
2999
3115
  }
3000
3116
  async removeRange(keyPrefix) {
3117
+ if (this._state !== "opened") {
3118
+ return void 0;
3119
+ }
3001
3120
  const filename = this._getFilename(keyPrefix);
3002
3121
  const entries = await this._directory.list();
3003
3122
  await Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
3004
- const file = this._directory.getOrCreateFile(filename);
3005
- await file.truncate?.(0);
3123
+ const file = this._directory.getOrCreateFile(entry);
3124
+ await file.destroy();
3006
3125
  }));
3007
3126
  }
3127
+ async close() {
3128
+ this._state = "closed";
3129
+ }
3008
3130
  _getFilename(key) {
3009
3131
  return key.map((k) => k.replaceAll("%", "%25").replaceAll("-", "%2D")).join("-");
3010
3132
  }
@@ -3040,4 +3162,4 @@ export {
3040
3162
  SpaceManager,
3041
3163
  AutomergeHost
3042
3164
  };
3043
- //# sourceMappingURL=chunk-W3SSYW3X.mjs.map
3165
+ //# sourceMappingURL=chunk-AUYVKEFF.mjs.map