@dxos/echo-pipeline 0.4.7 → 0.4.8-main.0602afb

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 (30) hide show
  1. package/dist/lib/browser/{chunk-UIMWNUNO.mjs → chunk-XR2636AC.mjs} +86 -50
  2. package/dist/lib/browser/chunk-XR2636AC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +4 -4
  6. package/dist/lib/browser/testing/index.mjs.map +2 -2
  7. package/dist/lib/node/{chunk-Z3IT3GUD.cjs → chunk-LD4R726W.cjs} +100 -63
  8. package/dist/lib/node/chunk-LD4R726W.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +31 -29
  10. package/dist/lib/node/index.cjs.map +2 -2
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/testing/index.cjs +19 -19
  13. package/dist/lib/node/testing/index.cjs.map +2 -2
  14. package/dist/types/src/automerge/automerge-host.d.ts +2 -1
  15. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  16. package/dist/types/src/automerge/automerge-storage-adapter.d.ts +2 -2
  17. package/dist/types/src/automerge/automerge-storage-adapter.d.ts.map +1 -1
  18. package/dist/types/src/metadata/metadata-store.d.ts +6 -2
  19. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  20. package/dist/types/src/testing/database-test-rig.d.ts.map +1 -1
  21. package/package.json +33 -33
  22. package/src/automerge/automerge-host.ts +25 -23
  23. package/src/automerge/automerge-storage-adapter.ts +8 -10
  24. package/src/metadata/metadata-store.ts +46 -3
  25. package/src/testing/database-test-rig.ts +2 -0
  26. package/dist/lib/browser/chunk-UIMWNUNO.mjs.map +0 -7
  27. package/dist/lib/node/chunk-Z3IT3GUD.cjs.map +0 -7
  28. package/dist/types/src/tests/database-unit.test.d.ts +0 -2
  29. package/dist/types/src/tests/database-unit.test.d.ts.map +0 -1
  30. package/src/tests/database-unit.test.ts +0 -325
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_Z3IT3GUD_exports = {};
30
- __export(chunk_Z3IT3GUD_exports, {
29
+ var chunk_LD4R726W_exports = {};
30
+ __export(chunk_LD4R726W_exports, {
31
31
  AuthExtension: () => AuthExtension,
32
32
  AuthStatus: () => AuthStatus,
33
33
  AutomergeHost: () => AutomergeHost,
@@ -52,12 +52,13 @@ __export(chunk_Z3IT3GUD_exports, {
52
52
  TimeframeClock: () => TimeframeClock,
53
53
  codec: () => codec,
54
54
  createMappedFeedWriter: () => createMappedFeedWriter,
55
+ getSpaceKeyFromDoc: () => getSpaceKeyFromDoc,
55
56
  mapFeedIndexesToTimeframe: () => mapFeedIndexesToTimeframe,
56
57
  mapTimeframeToFeedIndexes: () => mapTimeframeToFeedIndexes,
57
58
  startAfter: () => startAfter,
58
59
  valueEncoding: () => valueEncoding
59
60
  });
60
- module.exports = __toCommonJS(chunk_Z3IT3GUD_exports);
61
+ module.exports = __toCommonJS(chunk_LD4R726W_exports);
61
62
  var import_hypercore = require("@dxos/hypercore");
62
63
  var import_protocols = require("@dxos/protocols");
63
64
  var import_invariant = require("@dxos/invariant");
@@ -83,6 +84,7 @@ var import_log2 = require("@dxos/log");
83
84
  var import_util2 = require("@dxos/util");
84
85
  var import_crc_32 = __toESM(require("crc-32"));
85
86
  var import_async2 = require("@dxos/async");
87
+ var import_context3 = require("@dxos/context");
86
88
  var import_invariant4 = require("@dxos/invariant");
87
89
  var import_keys3 = require("@dxos/keys");
88
90
  var import_log3 = require("@dxos/log");
@@ -94,7 +96,7 @@ var import_debug2 = require("@dxos/debug");
94
96
  var import_log4 = require("@dxos/log");
95
97
  var import_timeframe = require("@dxos/timeframe");
96
98
  var import_async4 = require("@dxos/async");
97
- var import_context3 = require("@dxos/context");
99
+ var import_context4 = require("@dxos/context");
98
100
  var import_debug3 = require("@dxos/debug");
99
101
  var import_feed_store = require("@dxos/feed-store");
100
102
  var import_invariant5 = require("@dxos/invariant");
@@ -105,14 +107,14 @@ var import_util4 = require("@dxos/util");
105
107
  var import_invariant6 = require("@dxos/invariant");
106
108
  var import_log6 = require("@dxos/log");
107
109
  var import_async5 = require("@dxos/async");
108
- var import_context4 = require("@dxos/context");
110
+ var import_context5 = require("@dxos/context");
109
111
  var import_crypto2 = require("@dxos/crypto");
110
112
  var import_invariant7 = require("@dxos/invariant");
111
113
  var import_log7 = require("@dxos/log");
112
114
  var import_protocols5 = require("@dxos/protocols");
113
115
  var import_teleport = require("@dxos/teleport");
114
116
  var import_async6 = require("@dxos/async");
115
- var import_context5 = require("@dxos/context");
117
+ var import_context6 = require("@dxos/context");
116
118
  var import_credentials = require("@dxos/credentials");
117
119
  var import_echo_db3 = require("@dxos/echo-db");
118
120
  var import_invariant8 = require("@dxos/invariant");
@@ -128,7 +130,7 @@ var import_credentials2 = require("@dxos/protocols/proto/dxos/halo/credentials")
128
130
  var import_tracing2 = require("@dxos/tracing");
129
131
  var import_util6 = require("@dxos/util");
130
132
  var import_async8 = require("@dxos/async");
131
- var import_context6 = require("@dxos/context");
133
+ var import_context7 = require("@dxos/context");
132
134
  var import_credentials3 = require("@dxos/credentials");
133
135
  var import_keys5 = require("@dxos/keys");
134
136
  var import_log10 = require("@dxos/log");
@@ -151,22 +153,21 @@ var import_keys7 = require("@dxos/keys");
151
153
  var import_log12 = require("@dxos/log");
152
154
  var import_protocols7 = require("@dxos/protocols");
153
155
  var import_util9 = require("@dxos/util");
154
- var import_automerge_repo = require("@dxos/automerge/automerge-repo");
155
156
  var import_util10 = require("@dxos/util");
156
157
  var import_async10 = require("@dxos/async");
157
- var import_automerge_repo2 = require("@dxos/automerge/automerge-repo");
158
+ var import_automerge_repo = require("@dxos/automerge/automerge-repo");
158
159
  var import_codec_protobuf2 = require("@dxos/codec-protobuf");
159
160
  var import_invariant10 = require("@dxos/invariant");
160
161
  var import_log13 = require("@dxos/log");
161
162
  var import_async11 = require("@dxos/async");
162
- var import_automerge_repo3 = require("@dxos/automerge/automerge-repo");
163
+ var import_automerge_repo2 = require("@dxos/automerge/automerge-repo");
163
164
  var import_invariant11 = require("@dxos/invariant");
164
165
  var import_log14 = require("@dxos/log");
165
166
  var import_teleport_extension_automerge_replicator = require("@dxos/teleport-extension-automerge-replicator");
166
167
  var import_automerge = require("@dxos/automerge/automerge");
167
- var import_automerge_repo4 = require("@dxos/automerge/automerge-repo");
168
+ var import_automerge_repo3 = require("@dxos/automerge/automerge-repo");
168
169
  var import_automerge_repo_storage_indexeddb = require("@dxos/automerge/automerge-repo-storage-indexeddb");
169
- var import_context7 = require("@dxos/context");
170
+ var import_context8 = require("@dxos/context");
170
171
  var import_keys8 = require("@dxos/keys");
171
172
  var import_log15 = require("@dxos/log");
172
173
  var import_protocols8 = require("@dxos/protocols");
@@ -629,6 +630,7 @@ function _ts_decorate(decorators, target, key, desc) {
629
630
  return c > 3 && r && Object.defineProperty(target, key, r), r;
630
631
  }
631
632
  var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/metadata/metadata-store.ts";
633
+ var EXPIRED_INVITATION_CLEANUP_INTERVAL = 60 * 60 * 1e3;
632
634
  var emptyEchoMetadata = () => ({
633
635
  version: import_protocols4.STORAGE_VERSION,
634
636
  spaces: [],
@@ -644,6 +646,7 @@ var MetadataStore = class {
644
646
  this._spaceLargeMetadata = new import_util3.ComplexMap(import_keys3.PublicKey.hash);
645
647
  this._metadataFile = void 0;
646
648
  this.update = new import_async2.Event();
649
+ this._invitationCleanupCtx = new import_context3.Context();
647
650
  this._directory = directory;
648
651
  }
649
652
  get metadata() {
@@ -673,7 +676,7 @@ var MetadataStore = class {
673
676
  name: file.filename
674
677
  }, {
675
678
  F: __dxlog_file4,
676
- L: 85,
679
+ L: 89,
677
680
  S: this,
678
681
  C: (f, a) => f(...a)
679
682
  });
@@ -709,12 +712,13 @@ var MetadataStore = class {
709
712
  checksum
710
713
  }, {
711
714
  F: __dxlog_file4,
712
- L: 120,
715
+ L: 124,
713
716
  S: this,
714
717
  C: (f, a) => f(...a)
715
718
  });
716
719
  }
717
720
  async close() {
721
+ await this._invitationCleanupCtx.dispose();
718
722
  await this.flush();
719
723
  await this._metadataFile?.close();
720
724
  this._metadataFile = void 0;
@@ -741,7 +745,7 @@ var MetadataStore = class {
741
745
  err
742
746
  }, {
743
747
  F: __dxlog_file4,
744
- L: 151,
748
+ L: 156,
745
749
  S: this,
746
750
  C: (f, a) => f(...a)
747
751
  });
@@ -758,12 +762,19 @@ var MetadataStore = class {
758
762
  err
759
763
  }, {
760
764
  F: __dxlog_file4,
761
- L: 163,
765
+ L: 168,
762
766
  S: this,
763
767
  C: (f, a) => f(...a)
764
768
  });
765
769
  }
766
770
  });
771
+ (0, import_async2.scheduleTaskInterval)(this._invitationCleanupCtx, async () => {
772
+ for (const invitation of this.getInvitations()) {
773
+ if (invitation.created && invitation.lifetime && invitation.lifetime !== 0 && invitation.created.getTime() + invitation.lifetime * 1e3 < Date.now()) {
774
+ await this.removeInvitation(invitation.invitationId);
775
+ }
776
+ }
777
+ }, EXPIRED_INVITATION_CLEANUP_INTERVAL);
767
778
  }
768
779
  async _save() {
769
780
  const data = {
@@ -788,7 +799,7 @@ var MetadataStore = class {
788
799
  err
789
800
  }, {
790
801
  F: __dxlog_file4,
791
- L: 192,
802
+ L: 215,
792
803
  S: this,
793
804
  C: (f, a) => f(...a)
794
805
  });
@@ -809,7 +820,7 @@ var MetadataStore = class {
809
820
  const space = this.spaces.find((space2) => space2.key === spaceKey);
810
821
  (0, import_invariant4.invariant)(space, "Space not found", {
811
822
  F: __dxlog_file4,
812
- L: 214,
823
+ L: 237,
813
824
  S: this,
814
825
  A: [
815
826
  "space",
@@ -833,7 +844,7 @@ var MetadataStore = class {
833
844
  async clear() {
834
845
  (0, import_log3.log)("clearing all metadata", void 0, {
835
846
  F: __dxlog_file4,
836
- L: 233,
847
+ L: 256,
837
848
  S: this,
838
849
  C: (f, a) => f(...a)
839
850
  });
@@ -846,7 +857,7 @@ var MetadataStore = class {
846
857
  async setIdentityRecord(record) {
847
858
  (0, import_invariant4.invariant)(!this._metadata.identity, "Cannot overwrite existing identity in metadata", {
848
859
  F: __dxlog_file4,
849
- L: 243,
860
+ L: 266,
850
861
  S: this,
851
862
  A: [
852
863
  "!this._metadata.identity",
@@ -857,10 +868,26 @@ var MetadataStore = class {
857
868
  await this._save();
858
869
  await this.flush();
859
870
  }
871
+ getInvitations() {
872
+ return this._metadata.invitations ?? [];
873
+ }
874
+ async addInvitation(invitation) {
875
+ if (this._metadata.invitations?.find((i) => i.invitationId === invitation.invitationId)) {
876
+ return;
877
+ }
878
+ (this._metadata.invitations ??= []).push(invitation);
879
+ await this._save();
880
+ await this.flush();
881
+ }
882
+ async removeInvitation(invitationId) {
883
+ this._metadata.invitations = (this._metadata.invitations ?? []).filter((i) => i.invitationId !== invitationId);
884
+ await this._save();
885
+ await this.flush();
886
+ }
860
887
  async addSpace(record) {
861
888
  (0, import_invariant4.invariant)(!(this._metadata.spaces ?? []).find((space) => space.key === record.key), "Cannot overwrite existing space in metadata", {
862
889
  F: __dxlog_file4,
863
- L: 251,
890
+ L: 294,
864
891
  S: this,
865
892
  A: [
866
893
  "!(this._metadata.spaces ?? []).find((space) => space.key === record.key)",
@@ -1047,7 +1074,7 @@ var PipelineState = class {
1047
1074
  constructor(_feeds, _timeframeClock) {
1048
1075
  this._feeds = _feeds;
1049
1076
  this._timeframeClock = _timeframeClock;
1050
- this._ctx = new import_context3.Context();
1077
+ this._ctx = new import_context4.Context();
1051
1078
  this.timeframeUpdate = this._timeframeClock.update;
1052
1079
  this.stalled = new import_async4.Event();
1053
1080
  this._startTimeframe = new import_timeframe2.Timeframe();
@@ -1095,7 +1122,7 @@ var PipelineState = class {
1095
1122
  *
1096
1123
  * @param timeout Timeout in milliseconds to specify the maximum wait time.
1097
1124
  */
1098
- async waitUntilReachedTargetTimeframe({ ctx = new import_context3.Context(), timeout, breakOnStall = true } = {}) {
1125
+ async waitUntilReachedTargetTimeframe({ ctx = new import_context4.Context(), timeout, breakOnStall = true } = {}) {
1099
1126
  (0, import_log5.log)("waitUntilReachedTargetTimeframe", {
1100
1127
  timeout,
1101
1128
  current: this.timeframe,
@@ -1117,8 +1144,8 @@ var PipelineState = class {
1117
1144
  let done = false;
1118
1145
  if (timeout) {
1119
1146
  return Promise.race([
1120
- (0, import_context3.rejectOnDispose)(ctx),
1121
- (0, import_context3.rejectOnDispose)(this._ctx),
1147
+ (0, import_context4.rejectOnDispose)(ctx),
1148
+ (0, import_context4.rejectOnDispose)(this._ctx),
1122
1149
  this._reachedTargetPromise.then(() => {
1123
1150
  done = true;
1124
1151
  this._reachedTarget = true;
@@ -1260,7 +1287,7 @@ var Pipeline = class {
1260
1287
  await this._feedSetIterator?.close();
1261
1288
  await this._processingTrigger.wait();
1262
1289
  await this._state._ctx.dispose();
1263
- this._state._ctx = new import_context3.Context();
1290
+ this._state._ctx = new import_context4.Context();
1264
1291
  this._state._reachedTargetPromise = void 0;
1265
1292
  this._state._reachedTarget = false;
1266
1293
  this._isStarted = false;
@@ -1455,7 +1482,7 @@ var AuthExtension = class extends import_teleport.RpcExtension {
1455
1482
  timeout: 60 * 1e3
1456
1483
  });
1457
1484
  this._authParams = _authParams;
1458
- this._ctx = new import_context4.Context({
1485
+ this._ctx = new import_context5.Context({
1459
1486
  onError: (err) => {
1460
1487
  import_log7.log.catch(err, void 0, {
1461
1488
  F: __dxlog_file8,
@@ -1557,7 +1584,7 @@ var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 5e3;
1557
1584
  var DataPipeline = class {
1558
1585
  constructor(_params) {
1559
1586
  this._params = _params;
1560
- this._ctx = new import_context5.Context();
1587
+ this._ctx = new import_context6.Context();
1561
1588
  this._pipeline = void 0;
1562
1589
  this._targetTimeframe = void 0;
1563
1590
  this._lastAutomaticSnapshotTimeframe = new import_timeframe3.Timeframe();
@@ -1665,7 +1692,7 @@ var DataPipeline = class {
1665
1692
  }
1666
1693
  await this.databaseHost?.close();
1667
1694
  await this.itemManager?.destroy();
1668
- this._ctx = new import_context5.Context();
1695
+ this._ctx = new import_context6.Context();
1669
1696
  this._pipeline = void 0;
1670
1697
  this._targetTimeframe = void 0;
1671
1698
  this._lastAutomaticSnapshotTimeframe = new import_timeframe3.Timeframe();
@@ -1812,7 +1839,7 @@ var DataPipeline = class {
1812
1839
  return;
1813
1840
  }
1814
1841
  await this._epochCtx?.dispose();
1815
- const ctx = new import_context5.Context({
1842
+ const ctx = new import_context6.Context({
1816
1843
  onError: (err) => {
1817
1844
  if (err instanceof import_protocols6.CancelledError) {
1818
1845
  (0, import_log8.log)("Epoch processing cancelled.", void 0, {
@@ -2012,7 +2039,7 @@ var CONTROL_PIPELINE_SNAPSHOT_DELAY = 1e4;
2012
2039
  var USE_SNAPSHOTS = true;
2013
2040
  var ControlPipeline = class {
2014
2041
  constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }) {
2015
- this._ctx = new import_context6.Context();
2042
+ this._ctx = new import_context7.Context();
2016
2043
  this._lastTimeframeSaveTime = Date.now();
2017
2044
  this.onFeedAdmitted = new import_util7.Callback();
2018
2045
  this._usage = new import_tracing3.TimeUsageCounter();
@@ -2087,7 +2114,7 @@ var ControlPipeline = class {
2087
2114
  C: (f, a) => f(...a)
2088
2115
  });
2089
2116
  setTimeout(async () => {
2090
- void this._consumePipeline(new import_context6.Context());
2117
+ void this._consumePipeline(new import_context7.Context());
2091
2118
  });
2092
2119
  await this._pipeline.start();
2093
2120
  (0, import_log10.log)("started", void 0, {
@@ -2796,9 +2823,8 @@ _ts_decorate8([
2796
2823
  SpaceManager = _ts_decorate8([
2797
2824
  (0, import_async9.trackLeaks)("open", "close")
2798
2825
  ], SpaceManager);
2799
- var AutomergeStorageAdapter = class extends import_automerge_repo.StorageAdapter {
2826
+ var AutomergeStorageAdapter = class {
2800
2827
  constructor(_directory) {
2801
- super();
2802
2828
  this._directory = _directory;
2803
2829
  this._state = "opened";
2804
2830
  }
@@ -2871,7 +2897,7 @@ var AutomergeStorageAdapter = class extends import_automerge_repo.StorageAdapter
2871
2897
  }
2872
2898
  };
2873
2899
  var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/local-host-network-adapter.ts";
2874
- var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapter {
2900
+ var LocalHostNetworkAdapter = class extends import_automerge_repo.NetworkAdapter {
2875
2901
  constructor() {
2876
2902
  super(...arguments);
2877
2903
  this._peers = /* @__PURE__ */ new Map();
@@ -2924,7 +2950,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
2924
2950
  connected: true,
2925
2951
  send: (message) => {
2926
2952
  next({
2927
- syncMessage: import_automerge_repo2.cbor.encode(message)
2953
+ syncMessage: import_automerge_repo.cbor.encode(message)
2928
2954
  });
2929
2955
  },
2930
2956
  disconnect: () => {
@@ -2954,7 +2980,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
2954
2980
  await this._connected.wait({
2955
2981
  timeout: 1e3
2956
2982
  });
2957
- const message = import_automerge_repo2.cbor.decode(syncMessage);
2983
+ const message = import_automerge_repo.cbor.decode(syncMessage);
2958
2984
  this.emit("message", message);
2959
2985
  }
2960
2986
  async getHostInfo() {
@@ -2979,7 +3005,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
2979
3005
  }
2980
3006
  };
2981
3007
  var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/mesh-network-adapter.ts";
2982
- var MeshNetworkAdapter = class extends import_automerge_repo3.NetworkAdapter {
3008
+ var MeshNetworkAdapter = class extends import_automerge_repo2.NetworkAdapter {
2983
3009
  constructor() {
2984
3010
  super(...arguments);
2985
3011
  this._extensions = /* @__PURE__ */ new Map();
@@ -3010,7 +3036,7 @@ var MeshNetworkAdapter = class extends import_automerge_repo3.NetworkAdapter {
3010
3036
  ]
3011
3037
  });
3012
3038
  extension.sendSyncMessage({
3013
- payload: import_automerge_repo3.cbor.encode(message)
3039
+ payload: import_automerge_repo2.cbor.encode(message)
3014
3040
  }).catch((err) => import_log14.log.catch(err, void 0, {
3015
3041
  F: __dxlog_file15,
3016
3042
  L: 39,
@@ -3072,7 +3098,7 @@ var MeshNetworkAdapter = class extends import_automerge_repo3.NetworkAdapter {
3072
3098
  if (!peerInfo) {
3073
3099
  return;
3074
3100
  }
3075
- const message = import_automerge_repo3.cbor.decode(payload);
3101
+ const message = import_automerge_repo2.cbor.decode(payload);
3076
3102
  this.emit("message", message);
3077
3103
  },
3078
3104
  onClose: async () => {
@@ -3129,7 +3155,7 @@ function _ts_decorate9(decorators, target, key, desc) {
3129
3155
  var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
3130
3156
  var AutomergeHost = class {
3131
3157
  constructor({ directory, metadata }) {
3132
- this._ctx = new import_context7.Context();
3158
+ this._ctx = new import_context8.Context();
3133
3159
  this._authorizedDevices = new import_util11.ComplexMap(import_keys8.PublicKey.hash);
3134
3160
  this._updatingMetadata = /* @__PURE__ */ new Map();
3135
3161
  this._requestedDocs = /* @__PURE__ */ new Set();
@@ -3146,7 +3172,7 @@ var AutomergeHost = class {
3146
3172
  }
3147
3173
  });
3148
3174
  this._peerId = `host-${import_keys8.PublicKey.random().toHex()}`;
3149
- this._repo = new import_automerge_repo4.Repo({
3175
+ this._repo = new import_automerge_repo3.Repo({
3150
3176
  peerId: this._peerId,
3151
3177
  network: [
3152
3178
  this._clientNetwork,
@@ -3157,7 +3183,7 @@ var AutomergeHost = class {
3157
3183
  // Hosts, running in the worker, don't share documents unless requested by other peers.
3158
3184
  sharePolicy: async (peerId, documentId) => {
3159
3185
  if (peerId.startsWith("client-")) {
3160
- return true;
3186
+ return false;
3161
3187
  }
3162
3188
  if (!documentId) {
3163
3189
  return false;
@@ -3178,21 +3204,20 @@ var AutomergeHost = class {
3178
3204
  return isRequested;
3179
3205
  }
3180
3206
  try {
3181
- const rawSpaceKey = doc.access?.spaceKey ?? doc.experimental_spaceKey;
3182
- if (!rawSpaceKey) {
3207
+ const spaceKey = getSpaceKeyFromDoc(doc);
3208
+ if (!spaceKey) {
3183
3209
  (0, import_log15.log)("space key not found for share policy check", {
3184
3210
  peerId,
3185
3211
  documentId
3186
3212
  }, {
3187
3213
  F: __dxlog_file16,
3188
- L: 104,
3214
+ L: 103,
3189
3215
  S: this,
3190
3216
  C: (f, a) => f(...a)
3191
3217
  });
3192
3218
  return false;
3193
3219
  }
3194
- const spaceKey = import_keys8.PublicKey.from(rawSpaceKey);
3195
- const authorizedDevices = this._authorizedDevices.get(spaceKey);
3220
+ const authorizedDevices = this._authorizedDevices.get(import_keys8.PublicKey.from(spaceKey));
3196
3221
  const deviceKeyHex = this.repo.peerMetadataByPeerId[peerId]?.dxos_deviceKey;
3197
3222
  if (!deviceKeyHex) {
3198
3223
  (0, import_log15.log)("device key not found for share policy check", {
@@ -3200,7 +3225,7 @@ var AutomergeHost = class {
3200
3225
  documentId
3201
3226
  }, {
3202
3227
  F: __dxlog_file16,
3203
- L: 114,
3228
+ L: 112,
3204
3229
  S: this,
3205
3230
  C: (f, a) => f(...a)
3206
3231
  });
@@ -3217,7 +3242,7 @@ var AutomergeHost = class {
3217
3242
  isAuthorized
3218
3243
  }, {
3219
3244
  F: __dxlog_file16,
3220
- L: 120,
3245
+ L: 118,
3221
3246
  S: this,
3222
3247
  C: (f, a) => f(...a)
3223
3248
  });
@@ -3225,7 +3250,7 @@ var AutomergeHost = class {
3225
3250
  } catch (err) {
3226
3251
  import_log15.log.catch(err, void 0, {
3227
3252
  F: __dxlog_file16,
3228
- L: 130,
3253
+ L: 128,
3229
3254
  S: this,
3230
3255
  C: (f, a) => f(...a)
3231
3256
  });
@@ -3260,8 +3285,8 @@ var AutomergeHost = class {
3260
3285
  });
3261
3286
  }
3262
3287
  _onUpdate(event) {
3263
- const spaceKey = event.doc.access?.spaceKey;
3264
- if (!spaceKey) {
3288
+ const spaceKey = getSpaceKeyFromDoc(event.doc);
3289
+ if (!spaceKey || this._metadata == null) {
3265
3290
  return;
3266
3291
  }
3267
3292
  const objectIds = getInlineChanges(event);
@@ -3273,17 +3298,21 @@ var AutomergeHost = class {
3273
3298
  if (!lastAvailableHash) {
3274
3299
  return;
3275
3300
  }
3276
- const markingDirtyPromise = Promise.all(objectIds.map(async (objectId) => {
3277
- await (0, import_context7.cancelWithContext)(this._ctx, this._metadata.markDirty(import_protocols8.idCodec.encode({
3278
- documentId: event.handle.documentId,
3279
- objectId
3280
- }), lastAvailableHash));
3281
- })).then(() => {
3301
+ const encodedIds = objectIds.map((objectId) => import_protocols8.idCodec.encode({
3302
+ documentId: event.handle.documentId,
3303
+ objectId,
3304
+ spaceKey
3305
+ }));
3306
+ const idToLastHash = new Map(encodedIds.map((id) => [
3307
+ id,
3308
+ lastAvailableHash
3309
+ ]));
3310
+ const markingDirtyPromise = this._metadata.markDirty(idToLastHash).then(() => {
3282
3311
  this._updatingMetadata.delete(event.handle.documentId);
3283
3312
  }).catch((err) => {
3284
- !this._ctx.disposed && import_log15.log.catch(err, void 0, {
3313
+ this._ctx.disposed && import_log15.log.catch(err, void 0, {
3285
3314
  F: __dxlog_file16,
3286
- L: 198,
3315
+ L: 191,
3287
3316
  S: this,
3288
3317
  C: (f, a) => f(...a)
3289
3318
  });
@@ -3344,7 +3373,7 @@ var AutomergeHost = class {
3344
3373
  deviceKey
3345
3374
  }, {
3346
3375
  F: __dxlog_file16,
3347
- L: 266,
3376
+ L: 258,
3348
3377
  S: this,
3349
3378
  C: (f, a) => f(...a)
3350
3379
  });
@@ -3385,6 +3414,13 @@ var getInlineChanges = (event) => {
3385
3414
  ...inlineChangedObjectIds
3386
3415
  ];
3387
3416
  };
3417
+ var getSpaceKeyFromDoc = (doc) => {
3418
+ const rawSpaceKey = doc.access?.spaceKey ?? doc.experimental_spaceKey;
3419
+ if (rawSpaceKey == null) {
3420
+ return null;
3421
+ }
3422
+ return String(rawSpaceKey);
3423
+ };
3388
3424
  // Annotate the CommonJS export names for ESM import in node:
3389
3425
  0 && (module.exports = {
3390
3426
  AuthExtension,
@@ -3411,9 +3447,10 @@ var getInlineChanges = (event) => {
3411
3447
  TimeframeClock,
3412
3448
  codec,
3413
3449
  createMappedFeedWriter,
3450
+ getSpaceKeyFromDoc,
3414
3451
  mapFeedIndexesToTimeframe,
3415
3452
  mapTimeframeToFeedIndexes,
3416
3453
  startAfter,
3417
3454
  valueEncoding
3418
3455
  });
3419
- //# sourceMappingURL=chunk-Z3IT3GUD.cjs.map
3456
+ //# sourceMappingURL=chunk-LD4R726W.cjs.map