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

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-PB5T4DLC.mjs} +174 -40
  2. package/dist/lib/browser/chunk-PB5T4DLC.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-WGNVVL2H.cjs} +173 -42
  8. package/dist/lib/node/chunk-WGNVVL2H.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 +120 -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,108 @@ 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
+ if (!doc.experimental_spaceKey) {
2800
+ log13.warn("space key not found for share policy check", {
2801
+ peerId,
2802
+ documentId
2803
+ }, {
2804
+ F: __dxlog_file14,
2805
+ L: 71,
2806
+ S: this,
2807
+ C: (f, a) => f(...a)
2808
+ });
2809
+ return false;
2810
+ }
2811
+ const spaceKey = PublicKey8.from(doc.experimental_spaceKey);
2812
+ const authorizedDevices = this._authorizedDevices.get(spaceKey);
2813
+ const deviceKeyHex = this.repo.peerMetadataByPeerId[peerId]?.dxos_deviceKey;
2814
+ if (!deviceKeyHex) {
2815
+ log13.warn("device key not found for share policy check", {
2816
+ peerId,
2817
+ documentId
2818
+ }, {
2819
+ F: __dxlog_file14,
2820
+ L: 81,
2821
+ S: this,
2822
+ C: (f, a) => f(...a)
2823
+ });
2824
+ return false;
2825
+ }
2826
+ const deviceKey = PublicKey8.from(deviceKeyHex);
2827
+ const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;
2828
+ log13.info("share policy check", {
2829
+ peerId,
2830
+ documentId,
2831
+ deviceKey,
2832
+ spaceKey,
2833
+ isAuthorized
2834
+ }, {
2835
+ F: __dxlog_file14,
2836
+ L: 87,
2837
+ S: this,
2838
+ C: (f, a) => f(...a)
2839
+ });
2840
+ return isAuthorized;
2841
+ } catch (err) {
2842
+ log13.catch(err, void 0, {
2843
+ F: __dxlog_file14,
2844
+ L: 90,
2845
+ S: this,
2846
+ C: (f, a) => f(...a)
2847
+ });
2848
+ return false;
2849
+ }
2850
+ }
2766
2851
  });
2767
2852
  this._clientNetwork.ready();
2768
2853
  this._meshNetwork.ready();
@@ -2771,6 +2856,7 @@ var AutomergeHost = class {
2771
2856
  return this._repo;
2772
2857
  }
2773
2858
  async close() {
2859
+ this._storage instanceof AutomergeStorageAdapter && await this._storage.close();
2774
2860
  await this._clientNetwork.close();
2775
2861
  }
2776
2862
  //
@@ -2782,7 +2868,7 @@ var AutomergeHost = class {
2782
2868
  sendSyncMessage(request) {
2783
2869
  return this._clientNetwork.sendSyncMessage(request);
2784
2870
  }
2785
- getHostInfo() {
2871
+ async getHostInfo() {
2786
2872
  return this._clientNetwork.getHostInfo();
2787
2873
  }
2788
2874
  //
@@ -2791,11 +2877,15 @@ var AutomergeHost = class {
2791
2877
  createExtension() {
2792
2878
  return this._meshNetwork.createExtension();
2793
2879
  }
2880
+ authorizeDevice(spaceKey, deviceKey) {
2881
+ defaultMap(this._authorizedDevices, spaceKey, () => new ComplexSet(PublicKey8.hash)).add(deviceKey);
2882
+ }
2794
2883
  };
2795
2884
  var LocalHostNetworkAdapter = class extends NetworkAdapter {
2796
2885
  constructor() {
2797
2886
  super(...arguments);
2798
2887
  this._peers = /* @__PURE__ */ new Map();
2888
+ this._connected = new Trigger2();
2799
2889
  }
2800
2890
  /**
2801
2891
  * Emits `ready` event. That signals to `Repo` that it can start using the adapter.
@@ -2807,12 +2897,13 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2807
2897
  }
2808
2898
  connect(peerId) {
2809
2899
  this.peerId = peerId;
2900
+ this._connected.wake();
2810
2901
  }
2811
2902
  send(message) {
2812
2903
  const peer = this._peers.get(message.targetId);
2813
2904
  invariant10(peer, "Peer not found.", {
2814
2905
  F: __dxlog_file14,
2815
- L: 108,
2906
+ L: 170,
2816
2907
  S: this,
2817
2908
  A: [
2818
2909
  "peer",
@@ -2832,7 +2923,7 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2832
2923
  return new Stream2(({ next, close }) => {
2833
2924
  invariant10(!this._peers.has(peerId), "Peer already connected.", {
2834
2925
  F: __dxlog_file14,
2835
- L: 126,
2926
+ L: 188,
2836
2927
  S: this,
2837
2928
  A: [
2838
2929
  "!this._peers.has(peerId)",
@@ -2854,19 +2945,35 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
2854
2945
  });
2855
2946
  }
2856
2947
  });
2857
- this.emit("peer-candidate", {
2858
- peerId
2859
- });
2948
+ this._connected.wait({
2949
+ timeout: 1e3
2950
+ }).then(() => {
2951
+ this.emit("peer-candidate", {
2952
+ peerMetadata: {},
2953
+ peerId
2954
+ });
2955
+ }).catch((err) => log13.catch(err, void 0, {
2956
+ F: __dxlog_file14,
2957
+ L: 213,
2958
+ S: this,
2959
+ C: (f, a) => f(...a)
2960
+ }));
2860
2961
  });
2861
2962
  }
2862
2963
  async sendSyncMessage({ id, syncMessage }) {
2964
+ await this._connected.wait({
2965
+ timeout: 1e3
2966
+ });
2863
2967
  const message = cbor.decode(syncMessage);
2864
2968
  this.emit("message", message);
2865
2969
  }
2866
- getHostInfo() {
2970
+ async getHostInfo() {
2971
+ await this._connected.wait({
2972
+ timeout: 1e3
2973
+ });
2867
2974
  invariant10(this.peerId, "Peer id not set.", {
2868
2975
  F: __dxlog_file14,
2869
- L: 155,
2976
+ L: 225,
2870
2977
  S: this,
2871
2978
  A: [
2872
2979
  "this.peerId",
@@ -2902,7 +3009,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2902
3009
  const extension = this._extensions.get(receiverId);
2903
3010
  invariant10(extension, "Extension not found.", {
2904
3011
  F: __dxlog_file14,
2905
- L: 190,
3012
+ L: 260,
2906
3013
  S: this,
2907
3014
  A: [
2908
3015
  "extension",
@@ -2913,7 +3020,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2913
3020
  payload: cbor.encode(message)
2914
3021
  }).catch((err) => log13.catch(err, void 0, {
2915
3022
  F: __dxlog_file14,
2916
- L: 191,
3023
+ L: 261,
2917
3024
  S: this,
2918
3025
  C: (f, a) => f(...a)
2919
3026
  }));
@@ -2923,7 +3030,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2923
3030
  createExtension() {
2924
3031
  invariant10(this.peerId, "Peer id not set.", {
2925
3032
  F: __dxlog_file14,
2926
- L: 199,
3033
+ L: 269,
2927
3034
  S: this,
2928
3035
  A: [
2929
3036
  "this.peerId",
@@ -2934,13 +3041,17 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2934
3041
  const extension = new AutomergeReplicator({
2935
3042
  peerId: this.peerId
2936
3043
  }, {
2937
- onStartReplication: async (info) => {
3044
+ onStartReplication: async (info, remotePeerId) => {
2938
3045
  if (this._extensions.has(info.id)) {
2939
3046
  return;
2940
3047
  }
2941
3048
  peerInfo = info;
2942
3049
  this._extensions.set(info.id, extension);
2943
3050
  this.emit("peer-candidate", {
3051
+ // TODO(mykola): Hack, stop abusing `peerMetadata` field.
3052
+ peerMetadata: {
3053
+ dxos_deviceKey: remotePeerId.toHex()
3054
+ },
2944
3055
  peerId: info.id
2945
3056
  });
2946
3057
  },
@@ -2949,9 +3060,13 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
2949
3060
  this.emit("message", message);
2950
3061
  },
2951
3062
  onClose: async () => {
2952
- peerInfo && this.emit("peer-disconnected", {
3063
+ if (!peerInfo) {
3064
+ return;
3065
+ }
3066
+ this.emit("peer-disconnected", {
2953
3067
  peerId: peerInfo.id
2954
3068
  });
3069
+ this._extensions.delete(peerInfo.id);
2955
3070
  }
2956
3071
  });
2957
3072
  return extension;
@@ -2961,8 +3076,12 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2961
3076
  constructor(_directory) {
2962
3077
  super();
2963
3078
  this._directory = _directory;
3079
+ this._state = "opened";
2964
3080
  }
2965
3081
  async load(key) {
3082
+ if (this._state !== "opened") {
3083
+ return void 0;
3084
+ }
2966
3085
  const filename = this._getFilename(key);
2967
3086
  const file = this._directory.getOrCreateFile(filename);
2968
3087
  const { size } = await file.stat();
@@ -2973,6 +3092,9 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2973
3092
  return bufferToArray(buffer);
2974
3093
  }
2975
3094
  async save(key, data) {
3095
+ if (this._state !== "opened") {
3096
+ return void 0;
3097
+ }
2976
3098
  const filename = this._getFilename(key);
2977
3099
  const file = this._directory.getOrCreateFile(filename);
2978
3100
  await file.write(0, arrayToBuffer2(data));
@@ -2980,11 +3102,17 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2980
3102
  await file.flush?.();
2981
3103
  }
2982
3104
  async remove(key) {
3105
+ if (this._state !== "opened") {
3106
+ return void 0;
3107
+ }
2983
3108
  const filename = this._getFilename(key);
2984
3109
  const file = this._directory.getOrCreateFile(filename);
2985
- await file.truncate?.(0);
3110
+ await file.destroy();
2986
3111
  }
2987
3112
  async loadRange(keyPrefix) {
3113
+ if (this._state !== "opened") {
3114
+ return [];
3115
+ }
2988
3116
  const filename = this._getFilename(keyPrefix);
2989
3117
  const entries = await this._directory.list();
2990
3118
  return Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
@@ -2998,13 +3126,19 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
2998
3126
  }));
2999
3127
  }
3000
3128
  async removeRange(keyPrefix) {
3129
+ if (this._state !== "opened") {
3130
+ return void 0;
3131
+ }
3001
3132
  const filename = this._getFilename(keyPrefix);
3002
3133
  const entries = await this._directory.list();
3003
3134
  await Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
3004
- const file = this._directory.getOrCreateFile(filename);
3005
- await file.truncate?.(0);
3135
+ const file = this._directory.getOrCreateFile(entry);
3136
+ await file.destroy();
3006
3137
  }));
3007
3138
  }
3139
+ async close() {
3140
+ this._state = "closed";
3141
+ }
3008
3142
  _getFilename(key) {
3009
3143
  return key.map((k) => k.replaceAll("%", "%25").replaceAll("-", "%2D")).join("-");
3010
3144
  }
@@ -3040,4 +3174,4 @@ export {
3040
3174
  SpaceManager,
3041
3175
  AutomergeHost
3042
3176
  };
3043
- //# sourceMappingURL=chunk-W3SSYW3X.mjs.map
3177
+ //# sourceMappingURL=chunk-PB5T4DLC.mjs.map