@dxos/client-services 0.5.9-main.bf0ae3e → 0.5.9-main.c2c4258

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 (51) hide show
  1. package/dist/lib/browser/{chunk-4IR3JP4U.mjs → chunk-YUU4EUWY.mjs} +1347 -822
  2. package/dist/lib/browser/chunk-YUU4EUWY.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +13 -4
  4. package/dist/lib/browser/index.mjs.map +1 -1
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +10 -3
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +1 -1
  8. package/dist/lib/node/{chunk-ZBIDLLZ4.cjs → chunk-6FKYSRZO.cjs} +1481 -959
  9. package/dist/lib/node/chunk-6FKYSRZO.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +53 -44
  11. package/dist/lib/node/index.cjs.map +1 -1
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/packlets/testing/index.cjs +17 -10
  14. package/dist/lib/node/packlets/testing/index.cjs.map +1 -1
  15. package/dist/types/src/packlets/identity/contacts-service.d.ts +14 -0
  16. package/dist/types/src/packlets/identity/contacts-service.d.ts.map +1 -0
  17. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  18. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  19. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  20. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  21. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +4 -1
  22. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
  23. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +10 -1
  24. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  25. package/dist/types/src/packlets/spaces/data-space.d.ts +9 -9
  26. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  27. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts +23 -0
  28. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts.map +1 -0
  29. package/dist/types/src/packlets/spaces/spaces-service.d.ts +5 -2
  30. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  31. package/dist/types/src/packlets/storage/index.d.ts +1 -0
  32. package/dist/types/src/packlets/storage/index.d.ts.map +1 -1
  33. package/dist/types/src/packlets/storage/profile-archive.d.ts +14 -0
  34. package/dist/types/src/packlets/storage/profile-archive.d.ts.map +1 -0
  35. package/dist/types/src/version.d.ts +1 -1
  36. package/package.json +36 -36
  37. package/src/packlets/identity/contacts-service.ts +85 -0
  38. package/src/packlets/identity/identity-service.ts +33 -7
  39. package/src/packlets/invitations/invitations-handler.ts +13 -5
  40. package/src/packlets/invitations/space-invitation-protocol.ts +11 -32
  41. package/src/packlets/services/service-host.ts +12 -4
  42. package/src/packlets/spaces/automerge-space-state.ts +11 -2
  43. package/src/packlets/spaces/data-space-manager.ts +90 -16
  44. package/src/packlets/spaces/data-space.ts +76 -148
  45. package/src/packlets/spaces/epoch-migrations.ts +135 -0
  46. package/src/packlets/spaces/spaces-service.ts +54 -4
  47. package/src/packlets/storage/index.ts +1 -0
  48. package/src/packlets/storage/profile-archive.ts +97 -0
  49. package/src/version.ts +1 -1
  50. package/dist/lib/browser/chunk-4IR3JP4U.mjs.map +0 -7
  51. package/dist/lib/node/chunk-ZBIDLLZ4.cjs.map +0 -7
@@ -85,6 +85,7 @@ var subscribeToFeedBlocks = ({ feedStore }, { feedKey, maxBlocks = 10 }) => {
85
85
  import { Stream as Stream2 } from "@dxos/codec-protobuf";
86
86
  import { Context } from "@dxos/context";
87
87
  import { PublicKey as PublicKey2 } from "@dxos/keys";
88
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/devtools/network.ts";
88
89
  var subscribeToNetworkStatus = ({ signalManager }) => new Stream2(({ next, close }) => {
89
90
  const update = () => {
90
91
  try {
@@ -100,7 +101,10 @@ var subscribeToNetworkStatus = ({ signalManager }) => new Stream2(({ next, close
100
101
  update();
101
102
  });
102
103
  var subscribeToSignal = ({ signalManager }) => new Stream2(({ next }) => {
103
- const ctx = new Context();
104
+ const ctx = new Context(void 0, {
105
+ F: __dxlog_file,
106
+ L: 36
107
+ });
104
108
  signalManager.onMessage.on(ctx, (message) => {
105
109
  next({
106
110
  message: {
@@ -355,7 +359,7 @@ import { SpaceMember } from "@dxos/protocols/proto/dxos/client/services";
355
359
  import { TRACE_PROCESSOR } from "@dxos/tracing";
356
360
 
357
361
  // packages/sdk/client-services/src/version.ts
358
- var DXOS_VERSION = "0.5.9-main.bf0ae3e";
362
+ var DXOS_VERSION = "0.5.9-main.c2c4258";
359
363
 
360
364
  // packages/sdk/client-services/src/packlets/services/platform.ts
361
365
  import { Platform } from "@dxos/protocols/proto/dxos/client/services";
@@ -388,7 +392,7 @@ var getPlatform = () => {
388
392
  };
389
393
 
390
394
  // packages/sdk/client-services/src/packlets/diagnostics/diagnostics.ts
391
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/diagnostics.ts";
395
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/diagnostics.ts";
392
396
  var DEFAULT_TIMEOUT = 1e3;
393
397
  var createDiagnostics = async (clientServices, serviceContext, config) => {
394
398
  const diagnostics = {
@@ -405,7 +409,7 @@ var createDiagnostics = async (clientServices, serviceContext, config) => {
405
409
  await Promise.all([
406
410
  (async () => {
407
411
  invariant(clientServices.LoggingService, "SystemService is not available.", {
408
- F: __dxlog_file,
412
+ F: __dxlog_file2,
409
413
  L: 110,
410
414
  S: void 0,
411
415
  A: [
@@ -510,7 +514,7 @@ var getStorageDiagnostics = async () => {
510
514
  // packages/sdk/client-services/src/packlets/diagnostics/browser-diagnostics-broadcast.ts
511
515
  import { Trigger } from "@dxos/async";
512
516
  import { log } from "@dxos/log";
513
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/browser-diagnostics-broadcast.ts";
517
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/browser-diagnostics-broadcast.ts";
514
518
  var CHANNEL_NAME = "dxos.diagnostics.broadcast";
515
519
  var MessageType;
516
520
  (function(MessageType2) {
@@ -579,7 +583,7 @@ var createCollectDiagnosticsBroadcastHandler = (systemService) => {
579
583
  }
580
584
  } catch (error) {
581
585
  log.catch(error, void 0, {
582
- F: __dxlog_file2,
586
+ F: __dxlog_file3,
583
587
  L: 77,
584
588
  S: void 0,
585
589
  C: (f, a) => f(...a)
@@ -687,7 +691,7 @@ import { Context as Context2 } from "@dxos/context";
687
691
  import { verifyCredential } from "@dxos/credentials";
688
692
  import { log as log2 } from "@dxos/log";
689
693
  import { schema } from "@dxos/protocols";
690
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/authenticator.ts";
694
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/authenticator.ts";
691
695
  var Credential = schema.getCodecForType("dxos.halo.credentials.Credential");
692
696
  var createAuthProvider = (signer) => async (nonce) => {
693
697
  const credential = await signer.createCredential({
@@ -702,7 +706,10 @@ var createAuthProvider = (signer) => async (nonce) => {
702
706
  var TrustedKeySetAuthVerifier = class {
703
707
  constructor(_params) {
704
708
  this._params = _params;
705
- this._ctx = new Context2();
709
+ this._ctx = new Context2(void 0, {
710
+ F: __dxlog_file4,
711
+ L: 45
712
+ });
706
713
  }
707
714
  async close() {
708
715
  await this._ctx.dispose();
@@ -713,7 +720,7 @@ var TrustedKeySetAuthVerifier = class {
713
720
  log2("authenticating...", {
714
721
  credential
715
722
  }, {
716
- F: __dxlog_file3,
723
+ F: __dxlog_file4,
717
724
  L: 56,
718
725
  S: this,
719
726
  C: (f, a) => f(...a)
@@ -723,7 +730,7 @@ var TrustedKeySetAuthVerifier = class {
723
730
  log2("Invalid credential", {
724
731
  result
725
732
  }, {
726
- F: __dxlog_file3,
733
+ F: __dxlog_file4,
727
734
  L: 60,
728
735
  S: this,
729
736
  C: (f, a) => f(...a)
@@ -735,7 +742,7 @@ var TrustedKeySetAuthVerifier = class {
735
742
  nonce,
736
743
  credential
737
744
  }, {
738
- F: __dxlog_file3,
745
+ F: __dxlog_file4,
739
746
  L: 65,
740
747
  S: this,
741
748
  C: (f, a) => f(...a)
@@ -746,7 +753,7 @@ var TrustedKeySetAuthVerifier = class {
746
753
  log2("key is not currently in trusted set, waiting...", {
747
754
  key: credential.issuer
748
755
  }, {
749
- F: __dxlog_file3,
756
+ F: __dxlog_file4,
750
757
  L: 70,
751
758
  S: this,
752
759
  C: (f, a) => f(...a)
@@ -762,7 +769,7 @@ var TrustedKeySetAuthVerifier = class {
762
769
  log2("auth success", {
763
770
  key: credential.issuer
764
771
  }, {
765
- F: __dxlog_file3,
772
+ F: __dxlog_file4,
766
773
  L: 81,
767
774
  S: this,
768
775
  C: (f, a) => f(...a)
@@ -772,7 +779,7 @@ var TrustedKeySetAuthVerifier = class {
772
779
  log2("key is not currently in trusted set, waiting...", {
773
780
  key: credential.issuer
774
781
  }, {
775
- F: __dxlog_file3,
782
+ F: __dxlog_file4,
776
783
  L: 84,
777
784
  S: this,
778
785
  C: (f, a) => f(...a)
@@ -813,7 +820,7 @@ import { ComplexSet } from "@dxos/util";
813
820
  import { getCredentialAssertion } from "@dxos/credentials";
814
821
  import { SpaceId } from "@dxos/keys";
815
822
  import { log as log3 } from "@dxos/log";
816
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/default-space-state-machine.ts";
823
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/default-space-state-machine.ts";
817
824
  var DefaultSpaceStateMachine = class {
818
825
  constructor(_params) {
819
826
  this._params = _params;
@@ -830,7 +837,7 @@ var DefaultSpaceStateMachine = class {
830
837
  expectedIdentity: this._params.identityKey,
831
838
  credential
832
839
  }, {
833
- F: __dxlog_file4,
840
+ F: __dxlog_file5,
834
841
  L: 32,
835
842
  S: this,
836
843
  C: (f, a) => f(...a)
@@ -841,7 +848,7 @@ var DefaultSpaceStateMachine = class {
841
848
  log3.warn("Invalid default space id", {
842
849
  id: assertion.spaceId
843
850
  }, {
844
- F: __dxlog_file4,
851
+ F: __dxlog_file5,
845
852
  L: 36,
846
853
  S: this,
847
854
  C: (f, a) => f(...a)
@@ -866,7 +873,7 @@ function _ts_decorate2(decorators, target, key, desc) {
866
873
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
867
874
  return c > 3 && r && Object.defineProperty(target, key, r), r;
868
875
  }
869
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity.ts";
876
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity.ts";
870
877
  var Identity = class {
871
878
  constructor({ space, signer, identityKey, deviceKey, presence }) {
872
879
  this.stateUpdate = new Event();
@@ -878,7 +885,7 @@ var Identity = class {
878
885
  log4.trace("dxos.halo.device", {
879
886
  deviceKey
880
887
  }, {
881
- F: __dxlog_file5,
888
+ F: __dxlog_file6,
882
889
  L: 70,
883
890
  S: this,
884
891
  C: (f, a) => f(...a)
@@ -957,7 +964,7 @@ var Identity = class {
957
964
  */
958
965
  getIdentityCredentialSigner() {
959
966
  invariant2(this._deviceStateMachine.deviceCredentialChain, "Device credential chain is not ready.", {
960
- F: __dxlog_file5,
967
+ F: __dxlog_file6,
961
968
  L: 159,
962
969
  S: this,
963
970
  A: [
@@ -1001,7 +1008,7 @@ var Identity = class {
1001
1008
  controlFeedKey,
1002
1009
  dataFeedKey
1003
1010
  }, {
1004
- F: __dxlog_file5,
1011
+ F: __dxlog_file6,
1005
1012
  L: 184,
1006
1013
  S: this,
1007
1014
  C: (f, a) => f(...a)
@@ -1078,7 +1085,7 @@ function _ts_decorate3(decorators, target, key, desc) {
1078
1085
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1079
1086
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1080
1087
  }
1081
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity-manager.ts";
1088
+ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity-manager.ts";
1082
1089
  var DEVICE_PRESENCE_ANNOUNCE_INTERVAL = 1e4;
1083
1090
  var DEVICE_PRESENCE_OFFLINE_TIMEOUT = 2e4;
1084
1091
  var IdentityManager = class {
@@ -1102,7 +1109,7 @@ var IdentityManager = class {
1102
1109
  log5.trace("dxos.halo.identity-manager.open", trace3.begin({
1103
1110
  id: traceId
1104
1111
  }), {
1105
- F: __dxlog_file6,
1112
+ F: __dxlog_file7,
1106
1113
  L: 104,
1107
1114
  S: this,
1108
1115
  C: (f, a) => f(...a)
@@ -1111,7 +1118,7 @@ var IdentityManager = class {
1111
1118
  log5("identity record", {
1112
1119
  identityRecord
1113
1120
  }, {
1114
- F: __dxlog_file6,
1121
+ F: __dxlog_file7,
1115
1122
  L: 107,
1116
1123
  S: this,
1117
1124
  C: (f, a) => f(...a)
@@ -1124,7 +1131,7 @@ var IdentityManager = class {
1124
1131
  identityKey: identityRecord.identityKey,
1125
1132
  displayName: this._identity.profileDocument?.displayName
1126
1133
  }, {
1127
- F: __dxlog_file6,
1134
+ F: __dxlog_file7,
1128
1135
  L: 112,
1129
1136
  S: this,
1130
1137
  C: (f, a) => f(...a)
@@ -1134,18 +1141,21 @@ var IdentityManager = class {
1134
1141
  log5.trace("dxos.halo.identity-manager.open", trace3.end({
1135
1142
  id: traceId
1136
1143
  }), {
1137
- F: __dxlog_file6,
1144
+ F: __dxlog_file7,
1138
1145
  L: 119,
1139
1146
  S: this,
1140
1147
  C: (f, a) => f(...a)
1141
1148
  });
1142
1149
  }
1143
1150
  async close() {
1144
- await this._identity?.close(new Context3());
1151
+ await this._identity?.close(new Context3(void 0, {
1152
+ F: __dxlog_file7,
1153
+ L: 123
1154
+ }));
1145
1155
  }
1146
1156
  async createIdentity({ displayName, deviceProfile } = {}) {
1147
1157
  invariant3(!this._identity, "Identity already exists.", {
1148
- F: __dxlog_file6,
1158
+ F: __dxlog_file7,
1149
1159
  L: 128,
1150
1160
  S: this,
1151
1161
  A: [
@@ -1154,7 +1164,7 @@ var IdentityManager = class {
1154
1164
  ]
1155
1165
  });
1156
1166
  log5("creating identity...", void 0, {
1157
- F: __dxlog_file6,
1167
+ F: __dxlog_file7,
1158
1168
  L: 129,
1159
1169
  S: this,
1160
1170
  C: (f, a) => f(...a)
@@ -1171,11 +1181,14 @@ var IdentityManager = class {
1171
1181
  }
1172
1182
  };
1173
1183
  const identity = await this._constructIdentity(identityRecord);
1174
- await identity.open(new Context3());
1184
+ await identity.open(new Context3(void 0, {
1185
+ F: __dxlog_file7,
1186
+ L: 144
1187
+ }));
1175
1188
  {
1176
1189
  const generator = new CredentialGenerator(this._keyring, identityRecord.identityKey, identityRecord.deviceKey);
1177
1190
  invariant3(identityRecord.haloSpace.genesisFeedKey, "Genesis feed key is required.", {
1178
- F: __dxlog_file6,
1191
+ F: __dxlog_file7,
1179
1192
  L: 148,
1180
1193
  S: this,
1181
1194
  A: [
@@ -1184,7 +1197,7 @@ var IdentityManager = class {
1184
1197
  ]
1185
1198
  });
1186
1199
  invariant3(identityRecord.haloSpace.dataFeedKey, "Data feed key is required.", {
1187
- F: __dxlog_file6,
1200
+ F: __dxlog_file7,
1188
1201
  L: 149,
1189
1202
  S: this,
1190
1203
  A: [
@@ -1223,7 +1236,7 @@ var IdentityManager = class {
1223
1236
  identityKey: identityRecord.identityKey,
1224
1237
  displayName: this._identity.profileDocument?.displayName
1225
1238
  }, {
1226
- F: __dxlog_file6,
1239
+ F: __dxlog_file7,
1227
1240
  L: 191,
1228
1241
  S: this,
1229
1242
  C: (f, a) => f(...a)
@@ -1234,7 +1247,7 @@ var IdentityManager = class {
1234
1247
  deviceKey: identity.deviceKey,
1235
1248
  profile: identity.profileDocument
1236
1249
  }, {
1237
- F: __dxlog_file6,
1250
+ F: __dxlog_file7,
1238
1251
  L: 197,
1239
1252
  S: this,
1240
1253
  C: (f, a) => f(...a)
@@ -1271,13 +1284,13 @@ var IdentityManager = class {
1271
1284
  log5("accepting identity", {
1272
1285
  params
1273
1286
  }, {
1274
- F: __dxlog_file6,
1287
+ F: __dxlog_file7,
1275
1288
  L: 235,
1276
1289
  S: this,
1277
1290
  C: (f, a) => f(...a)
1278
1291
  });
1279
1292
  invariant3(!this._identity, "Identity already exists.", {
1280
- F: __dxlog_file6,
1293
+ F: __dxlog_file7,
1281
1294
  L: 236,
1282
1295
  S: this,
1283
1296
  A: [
@@ -1297,7 +1310,10 @@ var IdentityManager = class {
1297
1310
  }
1298
1311
  };
1299
1312
  const identity = await this._constructIdentity(identityRecord);
1300
- await identity.open(new Context3());
1313
+ await identity.open(new Context3(void 0, {
1314
+ F: __dxlog_file7,
1315
+ L: 251
1316
+ }));
1301
1317
  this._identity = identity;
1302
1318
  await this._metadataStore.setIdentityRecord(identityRecord);
1303
1319
  await this._identity.ready();
@@ -1305,7 +1321,7 @@ var IdentityManager = class {
1305
1321
  identityKey: identityRecord.identityKey,
1306
1322
  displayName: this._identity.profileDocument?.displayName
1307
1323
  }, {
1308
- F: __dxlog_file6,
1324
+ F: __dxlog_file7,
1309
1325
  L: 255,
1310
1326
  S: this,
1311
1327
  C: (f, a) => f(...a)
@@ -1319,7 +1335,7 @@ var IdentityManager = class {
1319
1335
  identityKey: identity.identityKey,
1320
1336
  deviceKey: identity.deviceKey
1321
1337
  }, {
1322
- F: __dxlog_file6,
1338
+ F: __dxlog_file7,
1323
1339
  L: 265,
1324
1340
  S: this,
1325
1341
  C: (f, a) => f(...a)
@@ -1331,7 +1347,7 @@ var IdentityManager = class {
1331
1347
  */
1332
1348
  async updateProfile(profile) {
1333
1349
  invariant3(this._identity, "Identity not initialized.", {
1334
- F: __dxlog_file6,
1350
+ F: __dxlog_file7,
1335
1351
  L: 273,
1336
1352
  S: this,
1337
1353
  A: [
@@ -1362,7 +1378,7 @@ var IdentityManager = class {
1362
1378
  }
1363
1379
  async updateDeviceProfile(profile) {
1364
1380
  invariant3(this._identity, "Identity not initialized.", {
1365
- F: __dxlog_file6,
1381
+ F: __dxlog_file7,
1366
1382
  L: 290,
1367
1383
  S: this,
1368
1384
  A: [
@@ -1398,7 +1414,7 @@ var IdentityManager = class {
1398
1414
  }
1399
1415
  async _constructIdentity(identityRecord) {
1400
1416
  invariant3(!this._identity, void 0, {
1401
- F: __dxlog_file6,
1417
+ F: __dxlog_file7,
1402
1418
  L: 316,
1403
1419
  S: this,
1404
1420
  A: [
@@ -1409,7 +1425,7 @@ var IdentityManager = class {
1409
1425
  log5("constructing identity", {
1410
1426
  identityRecord
1411
1427
  }, {
1412
- F: __dxlog_file6,
1428
+ F: __dxlog_file7,
1413
1429
  L: 317,
1414
1430
  S: this,
1415
1431
  C: (f, a) => f(...a)
@@ -1424,7 +1440,7 @@ var IdentityManager = class {
1424
1440
  gossip
1425
1441
  });
1426
1442
  invariant3(identityRecord.haloSpace.controlFeedKey, void 0, {
1427
- F: __dxlog_file6,
1443
+ F: __dxlog_file7,
1428
1444
  L: 330,
1429
1445
  S: this,
1430
1446
  A: [
@@ -1436,7 +1452,7 @@ var IdentityManager = class {
1436
1452
  writable: true
1437
1453
  });
1438
1454
  invariant3(identityRecord.haloSpace.dataFeedKey, void 0, {
1439
- F: __dxlog_file6,
1455
+ F: __dxlog_file7,
1440
1456
  L: 334,
1441
1457
  S: this,
1442
1458
  A: [
@@ -1470,7 +1486,7 @@ var IdentityManager = class {
1470
1486
  log5("done", {
1471
1487
  identityKey: identityRecord.identityKey
1472
1488
  }, {
1473
- F: __dxlog_file6,
1489
+ F: __dxlog_file7,
1474
1490
  L: 360,
1475
1491
  S: this,
1476
1492
  C: (f, a) => f(...a)
@@ -1495,7 +1511,7 @@ var IdentityManager = class {
1495
1511
  },
1496
1512
  onAuthFailure: () => {
1497
1513
  log5.warn("auth failure", void 0, {
1498
- F: __dxlog_file6,
1514
+ F: __dxlog_file7,
1499
1515
  L: 385,
1500
1516
  S: this,
1501
1517
  C: (f, a) => f(...a)
@@ -1519,13 +1535,17 @@ IdentityManager = _ts_decorate3([
1519
1535
  ], IdentityManager);
1520
1536
 
1521
1537
  // packages/sdk/client-services/src/packlets/identity/identity-service.ts
1538
+ import { Trigger as Trigger3, sleep } from "@dxos/async";
1522
1539
  import { Stream as Stream8 } from "@dxos/codec-protobuf";
1523
1540
  import { Resource } from "@dxos/context";
1524
1541
  import { signPresentation } from "@dxos/credentials";
1525
1542
  import { todo } from "@dxos/debug";
1526
1543
  import { invariant as invariant4 } from "@dxos/invariant";
1544
+ import { log as log6 } from "@dxos/log";
1527
1545
  import { SpaceState } from "@dxos/protocols/proto/dxos/client/services";
1528
- var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity-service.ts";
1546
+ import { safeAwaitAll } from "@dxos/util";
1547
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity-service.ts";
1548
+ var DEFAULT_SPACE_SEARCH_TIMEOUT = 1e4;
1529
1549
  var IdentityServiceImpl = class extends Resource {
1530
1550
  constructor(_identityManager, _keyring, _dataSpaceManagerProvider, _createIdentity, _onProfileUpdate) {
1531
1551
  super();
@@ -1554,8 +1574,8 @@ var IdentityServiceImpl = class extends Resource {
1554
1574
  const space = await dataSpaceManager.createDefaultSpace();
1555
1575
  const identity = this._identityManager.identity;
1556
1576
  invariant4(identity, void 0, {
1557
- F: __dxlog_file7,
1558
- L: 54,
1577
+ F: __dxlog_file8,
1578
+ L: 59,
1559
1579
  S: this,
1560
1580
  A: [
1561
1581
  "identity",
@@ -1588,8 +1608,8 @@ var IdentityServiceImpl = class extends Resource {
1588
1608
  }
1589
1609
  async updateProfile(profile) {
1590
1610
  invariant4(this._identityManager.identity, "Identity not initialized.", {
1591
- F: __dxlog_file7,
1592
- L: 84,
1611
+ F: __dxlog_file8,
1612
+ L: 89,
1593
1613
  S: this,
1594
1614
  A: [
1595
1615
  "this._identityManager.identity",
@@ -1602,8 +1622,8 @@ var IdentityServiceImpl = class extends Resource {
1602
1622
  }
1603
1623
  async signPresentation({ presentation, nonce }) {
1604
1624
  invariant4(this._identityManager.identity, "Identity not initialized.", {
1605
- F: __dxlog_file7,
1606
- L: 91,
1625
+ F: __dxlog_file8,
1626
+ L: 96,
1607
1627
  S: this,
1608
1628
  A: [
1609
1629
  "this._identityManager.identity",
@@ -1619,20 +1639,43 @@ var IdentityServiceImpl = class extends Resource {
1619
1639
  });
1620
1640
  }
1621
1641
  async _fixIdentityWithoutDefaultSpace(identity) {
1622
- let hasDefaultSpace = false;
1642
+ let recodedDefaultSpace = false;
1643
+ let foundDefaultSpace = false;
1623
1644
  const dataSpaceManager = this._dataSpaceManagerProvider();
1624
- for (const space of dataSpaceManager.spaces.values()) {
1645
+ const recordedDefaultSpaceTrigger = new Trigger3();
1646
+ const allProcessed = safeAwaitAll(dataSpaceManager.spaces.values(), async (space) => {
1625
1647
  if (space.state === SpaceState.CLOSED) {
1626
1648
  await space.open();
1627
- await space.initializeDataPipeline();
1649
+ const requiresMigration = space.stateUpdate.waitForCondition(() => space.state === SpaceState.REQUIRES_MIGRATION);
1650
+ await Promise.race([
1651
+ space.initializeDataPipeline(),
1652
+ requiresMigration
1653
+ ]);
1628
1654
  }
1629
1655
  if (await dataSpaceManager.isDefaultSpace(space)) {
1656
+ if (foundDefaultSpace) {
1657
+ log6.warn("Multiple default spaces found. Using the first one.", {
1658
+ duplicate: space.id
1659
+ }, {
1660
+ F: __dxlog_file8,
1661
+ L: 127,
1662
+ S: this,
1663
+ C: (f, a) => f(...a)
1664
+ });
1665
+ return;
1666
+ }
1667
+ foundDefaultSpace = true;
1630
1668
  await identity.updateDefaultSpace(space.id);
1631
- hasDefaultSpace = true;
1632
- break;
1669
+ recodedDefaultSpace = true;
1670
+ recordedDefaultSpaceTrigger.wake();
1633
1671
  }
1634
- }
1635
- if (!hasDefaultSpace) {
1672
+ });
1673
+ await Promise.race([
1674
+ allProcessed,
1675
+ recordedDefaultSpaceTrigger.wait(),
1676
+ sleep(DEFAULT_SPACE_SEARCH_TIMEOUT)
1677
+ ]);
1678
+ if (!recodedDefaultSpace) {
1636
1679
  await this._createDefaultSpace(dataSpaceManager);
1637
1680
  }
1638
1681
  }
@@ -1642,7 +1685,7 @@ var IdentityServiceImpl = class extends Resource {
1642
1685
  import { invariant as invariant5 } from "@dxos/invariant";
1643
1686
  import { AlreadyJoinedError } from "@dxos/protocols";
1644
1687
  import { Invitation } from "@dxos/protocols/proto/dxos/client/services";
1645
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/device-invitation-protocol.ts";
1688
+ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/device-invitation-protocol.ts";
1646
1689
  var DeviceInvitationProtocol = class {
1647
1690
  constructor(_keyring, _getIdentity, _acceptIdentity) {
1648
1691
  this._keyring = _keyring;
@@ -1668,7 +1711,7 @@ var DeviceInvitationProtocol = class {
1668
1711
  }
1669
1712
  async admit(_, request) {
1670
1713
  invariant5(request.device, void 0, {
1671
- F: __dxlog_file8,
1714
+ F: __dxlog_file9,
1672
1715
  L: 50,
1673
1716
  S: this,
1674
1717
  A: [
@@ -1714,7 +1757,7 @@ var DeviceInvitationProtocol = class {
1714
1757
  }
1715
1758
  async accept(response, request) {
1716
1759
  invariant5(response.device, void 0, {
1717
- F: __dxlog_file8,
1760
+ F: __dxlog_file9,
1718
1761
  L: 95,
1719
1762
  S: this,
1720
1763
  A: [
@@ -1724,7 +1767,7 @@ var DeviceInvitationProtocol = class {
1724
1767
  });
1725
1768
  const { identityKey, haloSpaceKey, genesisFeedKey, controlTimeframe } = response.device;
1726
1769
  invariant5(request.device, void 0, {
1727
- F: __dxlog_file8,
1770
+ F: __dxlog_file9,
1728
1771
  L: 98,
1729
1772
  S: this,
1730
1773
  A: [
@@ -1756,7 +1799,7 @@ import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
1756
1799
  import { createKeyPair, sign } from "@dxos/crypto";
1757
1800
  import { invariant as invariant9 } from "@dxos/invariant";
1758
1801
  import { PublicKey as PublicKey7 } from "@dxos/keys";
1759
- import { log as log9 } from "@dxos/log";
1802
+ import { log as log10 } from "@dxos/log";
1760
1803
  import { createTeleportProtocolFactory } from "@dxos/network-manager";
1761
1804
  import { InvalidInvitationExtensionRoleError as InvalidInvitationExtensionRoleError3, trace as trace5 } from "@dxos/protocols";
1762
1805
  import { Invitation as Invitation4 } from "@dxos/protocols/proto/dxos/client/services";
@@ -1765,10 +1808,10 @@ import { Options as Options4 } from "@dxos/protocols/proto/dxos/halo/invitations
1765
1808
  import { ComplexSet as ComplexSet3 } from "@dxos/util";
1766
1809
 
1767
1810
  // packages/sdk/client-services/src/packlets/invitations/invitation-guest-extenstion.ts
1768
- import { Trigger as Trigger3 } from "@dxos/async";
1811
+ import { Trigger as Trigger4 } from "@dxos/async";
1769
1812
  import { cancelWithContext as cancelWithContext2, Context as Context4 } from "@dxos/context";
1770
1813
  import { invariant as invariant6 } from "@dxos/invariant";
1771
- import { log as log6 } from "@dxos/log";
1814
+ import { log as log7 } from "@dxos/log";
1772
1815
  import { InvalidInvitationExtensionRoleError, schema as schema2 } from "@dxos/protocols";
1773
1816
  import { Options } from "@dxos/protocols/proto/dxos/halo/invitations";
1774
1817
  import { RpcExtension } from "@dxos/teleport";
@@ -1793,7 +1836,7 @@ var tryAcquireBeforeContextDisposed = async (ctx, mutex) => {
1793
1836
  };
1794
1837
 
1795
1838
  // packages/sdk/client-services/src/packlets/invitations/invitation-guest-extenstion.ts
1796
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitation-guest-extenstion.ts";
1839
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitation-guest-extenstion.ts";
1797
1840
  var OPTIONS_TIMEOUT = 1e4;
1798
1841
  var InvitationGuestExtension = class extends RpcExtension {
1799
1842
  constructor(_invitationFlowMutex, _callbacks) {
@@ -1807,8 +1850,11 @@ var InvitationGuestExtension = class extends RpcExtension {
1807
1850
  });
1808
1851
  this._invitationFlowMutex = _invitationFlowMutex;
1809
1852
  this._callbacks = _callbacks;
1810
- this._ctx = new Context4();
1811
- this._remoteOptionsTrigger = new Trigger3();
1853
+ this._ctx = new Context4(void 0, {
1854
+ F: __dxlog_file10,
1855
+ L: 33
1856
+ });
1857
+ this._remoteOptionsTrigger = new Trigger4();
1812
1858
  this._invitationFlowLock = null;
1813
1859
  }
1814
1860
  hasFlowLock() {
@@ -1819,7 +1865,7 @@ var InvitationGuestExtension = class extends RpcExtension {
1819
1865
  InvitationHostService: {
1820
1866
  options: async (options) => {
1821
1867
  invariant6(!this._remoteOptions, "Remote options already set.", {
1822
- F: __dxlog_file9,
1868
+ F: __dxlog_file10,
1823
1869
  L: 63,
1824
1870
  S: this,
1825
1871
  A: [
@@ -1845,15 +1891,15 @@ var InvitationGuestExtension = class extends RpcExtension {
1845
1891
  async onOpen(context) {
1846
1892
  await super.onOpen(context);
1847
1893
  try {
1848
- log6("guest acquire lock", void 0, {
1849
- F: __dxlog_file9,
1894
+ log7("guest acquire lock", void 0, {
1895
+ F: __dxlog_file10,
1850
1896
  L: 84,
1851
1897
  S: this,
1852
1898
  C: (f, a) => f(...a)
1853
1899
  });
1854
1900
  this._invitationFlowLock = await tryAcquireBeforeContextDisposed(this._ctx, this._invitationFlowMutex);
1855
- log6("guest lock acquired", void 0, {
1856
- F: __dxlog_file9,
1901
+ log7("guest lock acquired", void 0, {
1902
+ F: __dxlog_file10,
1857
1903
  L: 86,
1858
1904
  S: this,
1859
1905
  C: (f, a) => f(...a)
@@ -1861,8 +1907,8 @@ var InvitationGuestExtension = class extends RpcExtension {
1861
1907
  await cancelWithContext2(this._ctx, this.rpc.InvitationHostService.options({
1862
1908
  role: Options.Role.GUEST
1863
1909
  }));
1864
- log6("options sent", void 0, {
1865
- F: __dxlog_file9,
1910
+ log7("options sent", void 0, {
1911
+ F: __dxlog_file10,
1866
1912
  L: 88,
1867
1913
  S: this,
1868
1914
  C: (f, a) => f(...a)
@@ -1870,8 +1916,8 @@ var InvitationGuestExtension = class extends RpcExtension {
1870
1916
  await cancelWithContext2(this._ctx, this._remoteOptionsTrigger.wait({
1871
1917
  timeout: OPTIONS_TIMEOUT
1872
1918
  }));
1873
- log6("options received", void 0, {
1874
- F: __dxlog_file9,
1919
+ log7("options received", void 0, {
1920
+ F: __dxlog_file10,
1875
1921
  L: 90,
1876
1922
  S: this,
1877
1923
  C: (f, a) => f(...a)
@@ -1904,8 +1950,8 @@ var InvitationGuestExtension = class extends RpcExtension {
1904
1950
  if (this._invitationFlowLock != null) {
1905
1951
  this._invitationFlowLock.release();
1906
1952
  this._invitationFlowLock = null;
1907
- log6("invitation flow lock released", void 0, {
1908
- F: __dxlog_file9,
1953
+ log7("invitation flow lock released", void 0, {
1954
+ F: __dxlog_file10,
1909
1955
  L: 123,
1910
1956
  S: this,
1911
1957
  C: (f, a) => f(...a)
@@ -1915,17 +1961,17 @@ var InvitationGuestExtension = class extends RpcExtension {
1915
1961
  };
1916
1962
 
1917
1963
  // packages/sdk/client-services/src/packlets/invitations/invitation-host-extension.ts
1918
- import { Trigger as Trigger4, scheduleTask as scheduleTask2 } from "@dxos/async";
1964
+ import { Trigger as Trigger5, scheduleTask as scheduleTask2 } from "@dxos/async";
1919
1965
  import { cancelWithContext as cancelWithContext3, Context as Context5 } from "@dxos/context";
1920
1966
  import { randomBytes, verify } from "@dxos/crypto";
1921
1967
  import { invariant as invariant7, InvariantViolation } from "@dxos/invariant";
1922
1968
  import { PublicKey as PublicKey5 } from "@dxos/keys";
1923
- import { log as log7 } from "@dxos/log";
1969
+ import { log as log8 } from "@dxos/log";
1924
1970
  import { InvalidInvitationExtensionRoleError as InvalidInvitationExtensionRoleError2, schema as schema3, trace as trace4 } from "@dxos/protocols";
1925
1971
  import { Invitation as Invitation3 } from "@dxos/protocols/proto/dxos/client/services";
1926
1972
  import { AuthenticationResponse, Options as Options2 } from "@dxos/protocols/proto/dxos/halo/invitations";
1927
1973
  import { RpcExtension as RpcExtension2 } from "@dxos/teleport";
1928
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitation-host-extension.ts";
1974
+ var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitation-host-extension.ts";
1929
1975
  var OPTIONS_TIMEOUT2 = 1e4;
1930
1976
  var MAX_OTP_ATTEMPTS = 3;
1931
1977
  var InvitationHostExtension = class extends RpcExtension2 {
@@ -1940,13 +1986,16 @@ var InvitationHostExtension = class extends RpcExtension2 {
1940
1986
  });
1941
1987
  this._invitationFlowMutex = _invitationFlowMutex;
1942
1988
  this._callbacks = _callbacks;
1943
- this._ctx = new Context5();
1944
- this._remoteOptionsTrigger = new Trigger4();
1989
+ this._ctx = new Context5(void 0, {
1990
+ F: __dxlog_file11,
1991
+ L: 52
1992
+ });
1993
+ this._remoteOptionsTrigger = new Trigger5();
1945
1994
  this._challenge = void 0;
1946
1995
  this.guestProfile = void 0;
1947
1996
  this.authenticationPassed = false;
1948
1997
  this.authenticationRetry = 0;
1949
- this.completedTrigger = new Trigger4();
1998
+ this.completedTrigger = new Trigger5();
1950
1999
  this._invitationFlowLock = null;
1951
2000
  }
1952
2001
  hasFlowLock() {
@@ -1959,7 +2008,7 @@ var InvitationHostExtension = class extends RpcExtension2 {
1959
2008
  InvitationHostService: {
1960
2009
  options: async (options) => {
1961
2010
  invariant7(!this._remoteOptions, "Remote options already set.", {
1962
- F: __dxlog_file10,
2011
+ F: __dxlog_file11,
1963
2012
  L: 101,
1964
2013
  S: this,
1965
2014
  A: [
@@ -1973,10 +2022,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
1973
2022
  introduce: async (request) => {
1974
2023
  const { profile, invitationId } = request;
1975
2024
  const traceId = PublicKey5.random().toHex();
1976
- log7.trace("dxos.sdk.invitation-handler.host.introduce", trace4.begin({
2025
+ log8.trace("dxos.sdk.invitation-handler.host.introduce", trace4.begin({
1977
2026
  id: traceId
1978
2027
  }), {
1979
- F: __dxlog_file10,
2028
+ F: __dxlog_file11,
1980
2029
  L: 110,
1981
2030
  S: this,
1982
2031
  C: (f, a) => f(...a)
@@ -1984,11 +2033,11 @@ var InvitationHostExtension = class extends RpcExtension2 {
1984
2033
  const invitation = this._requireActiveInvitation();
1985
2034
  this._assertInvitationState(Invitation3.State.CONNECTED);
1986
2035
  if (invitationId !== invitation?.invitationId) {
1987
- log7.warn("incorrect invitationId", {
2036
+ log8.warn("incorrect invitationId", {
1988
2037
  expected: invitation.invitationId,
1989
2038
  actual: invitationId
1990
2039
  }, {
1991
- F: __dxlog_file10,
2040
+ F: __dxlog_file11,
1992
2041
  L: 116,
1993
2042
  S: this,
1994
2043
  C: (f, a) => f(...a)
@@ -1999,10 +2048,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
1999
2048
  authMethod: Invitation3.AuthMethod.NONE
2000
2049
  };
2001
2050
  }
2002
- log7("guest introduced themselves", {
2051
+ log8("guest introduced themselves", {
2003
2052
  guestProfile: profile
2004
2053
  }, {
2005
- F: __dxlog_file10,
2054
+ F: __dxlog_file11,
2006
2055
  L: 125,
2007
2056
  S: this,
2008
2057
  C: (f, a) => f(...a)
@@ -2010,10 +2059,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
2010
2059
  this.guestProfile = profile;
2011
2060
  this._callbacks.onStateUpdate(Invitation3.State.READY_FOR_AUTHENTICATION);
2012
2061
  this._challenge = invitation.authMethod === Invitation3.AuthMethod.KNOWN_PUBLIC_KEY ? randomBytes(32) : void 0;
2013
- log7.trace("dxos.sdk.invitation-handler.host.introduce", trace4.end({
2062
+ log8.trace("dxos.sdk.invitation-handler.host.introduce", trace4.end({
2014
2063
  id: traceId
2015
2064
  }), {
2016
- F: __dxlog_file10,
2065
+ F: __dxlog_file11,
2017
2066
  L: 132,
2018
2067
  S: this,
2019
2068
  C: (f, a) => f(...a)
@@ -2025,19 +2074,19 @@ var InvitationHostExtension = class extends RpcExtension2 {
2025
2074
  },
2026
2075
  authenticate: async ({ authCode: code, signedChallenge }) => {
2027
2076
  const traceId = PublicKey5.random().toHex();
2028
- log7.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.begin({
2077
+ log8.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.begin({
2029
2078
  id: traceId
2030
2079
  }), {
2031
- F: __dxlog_file10,
2080
+ F: __dxlog_file11,
2032
2081
  L: 141,
2033
2082
  S: this,
2034
2083
  C: (f, a) => f(...a)
2035
2084
  });
2036
2085
  const invitation = this._requireActiveInvitation();
2037
- log7("received authentication request", {
2086
+ log8("received authentication request", {
2038
2087
  authCode: code
2039
2088
  }, {
2040
- F: __dxlog_file10,
2089
+ F: __dxlog_file11,
2041
2090
  L: 144,
2042
2091
  S: this,
2043
2092
  C: (f, a) => f(...a)
@@ -2050,8 +2099,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
2050
2099
  this._callbacks.onStateUpdate(Invitation3.State.AUTHENTICATING);
2051
2100
  switch (invitation.authMethod) {
2052
2101
  case Invitation3.AuthMethod.NONE: {
2053
- log7("authentication not required", void 0, {
2054
- F: __dxlog_file10,
2102
+ log8("authentication not required", void 0, {
2103
+ F: __dxlog_file11,
2055
2104
  L: 152,
2056
2105
  S: this,
2057
2106
  C: (f, a) => f(...a)
@@ -2086,10 +2135,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
2086
2135
  break;
2087
2136
  }
2088
2137
  default: {
2089
- log7.error("invalid authentication method", {
2138
+ log8.error("invalid authentication method", {
2090
2139
  authMethod: invitation.authMethod
2091
2140
  }, {
2092
- F: __dxlog_file10,
2141
+ F: __dxlog_file11,
2093
2142
  L: 190,
2094
2143
  S: this,
2095
2144
  C: (f, a) => f(...a)
@@ -2108,13 +2157,13 @@ var InvitationHostExtension = class extends RpcExtension2 {
2108
2157
  status
2109
2158
  };
2110
2159
  }
2111
- log7.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.end({
2160
+ log8.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.end({
2112
2161
  id: traceId,
2113
2162
  data: {
2114
2163
  status
2115
2164
  }
2116
2165
  }), {
2117
- F: __dxlog_file10,
2166
+ F: __dxlog_file11,
2118
2167
  L: 202,
2119
2168
  S: this,
2120
2169
  C: (f, a) => f(...a)
@@ -2125,10 +2174,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
2125
2174
  },
2126
2175
  admit: async (request) => {
2127
2176
  const traceId = PublicKey5.random().toHex();
2128
- log7.trace("dxos.sdk.invitation-handler.host.admit", trace4.begin({
2177
+ log8.trace("dxos.sdk.invitation-handler.host.admit", trace4.begin({
2129
2178
  id: traceId
2130
2179
  }), {
2131
- F: __dxlog_file10,
2180
+ F: __dxlog_file11,
2132
2181
  L: 208,
2133
2182
  S: this,
2134
2183
  C: (f, a) => f(...a)
@@ -2142,10 +2191,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
2142
2191
  }
2143
2192
  }
2144
2193
  const response = await this._callbacks.admit(request);
2145
- log7.trace("dxos.sdk.invitation-handler.host.admit", trace4.end({
2194
+ log8.trace("dxos.sdk.invitation-handler.host.admit", trace4.end({
2146
2195
  id: traceId
2147
2196
  }), {
2148
- F: __dxlog_file10,
2197
+ F: __dxlog_file11,
2149
2198
  L: 222,
2150
2199
  S: this,
2151
2200
  C: (f, a) => f(...a)
@@ -2162,15 +2211,15 @@ var InvitationHostExtension = class extends RpcExtension2 {
2162
2211
  async onOpen(context) {
2163
2212
  await super.onOpen(context);
2164
2213
  try {
2165
- log7("host acquire lock", void 0, {
2166
- F: __dxlog_file10,
2214
+ log8("host acquire lock", void 0, {
2215
+ F: __dxlog_file11,
2167
2216
  L: 237,
2168
2217
  S: this,
2169
2218
  C: (f, a) => f(...a)
2170
2219
  });
2171
2220
  this._invitationFlowLock = await tryAcquireBeforeContextDisposed(this._ctx, this._invitationFlowMutex);
2172
- log7("host lock acquired", void 0, {
2173
- F: __dxlog_file10,
2221
+ log8("host lock acquired", void 0, {
2222
+ F: __dxlog_file11,
2174
2223
  L: 239,
2175
2224
  S: this,
2176
2225
  C: (f, a) => f(...a)
@@ -2180,8 +2229,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
2180
2229
  await this.rpc.InvitationHostService.options({
2181
2230
  role: Options2.Role.HOST
2182
2231
  });
2183
- log7("options sent", void 0, {
2184
- F: __dxlog_file10,
2232
+ log8("options sent", void 0, {
2233
+ F: __dxlog_file11,
2185
2234
  L: 243,
2186
2235
  S: this,
2187
2236
  C: (f, a) => f(...a)
@@ -2189,8 +2238,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
2189
2238
  await cancelWithContext3(this._ctx, this._remoteOptionsTrigger.wait({
2190
2239
  timeout: OPTIONS_TIMEOUT2
2191
2240
  }));
2192
- log7("options received", void 0, {
2193
- F: __dxlog_file10,
2241
+ log8("options received", void 0, {
2242
+ F: __dxlog_file11,
2194
2243
  L: 245,
2195
2244
  S: this,
2196
2245
  C: (f, a) => f(...a)
@@ -2243,8 +2292,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
2243
2292
  if (this._invitationFlowLock != null) {
2244
2293
  this._invitationFlowLock?.release();
2245
2294
  this._invitationFlowLock = null;
2246
- log7("invitation flow lock released", void 0, {
2247
- F: __dxlog_file10,
2295
+ log8("invitation flow lock released", void 0, {
2296
+ F: __dxlog_file11,
2248
2297
  L: 300,
2249
2298
  S: this,
2250
2299
  C: (f, a) => f(...a)
@@ -2257,10 +2306,10 @@ var isAuthenticationRequired = (invitation) => invitation.authMethod !== Invitat
2257
2306
  // packages/sdk/client-services/src/packlets/invitations/invitation-topology.ts
2258
2307
  import { invariant as invariant8 } from "@dxos/invariant";
2259
2308
  import { PublicKey as PublicKey6 } from "@dxos/keys";
2260
- import { log as log8 } from "@dxos/log";
2309
+ import { log as log9 } from "@dxos/log";
2261
2310
  import { Options as Options3 } from "@dxos/protocols/proto/dxos/halo/invitations";
2262
2311
  import { ComplexSet as ComplexSet2 } from "@dxos/util";
2263
- var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitation-topology.ts";
2312
+ var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitation-topology.ts";
2264
2313
  var InvitationTopology = class {
2265
2314
  constructor(_role) {
2266
2315
  this._role = _role;
@@ -2268,7 +2317,7 @@ var InvitationTopology = class {
2268
2317
  }
2269
2318
  init(controller) {
2270
2319
  invariant8(!this._controller, "Already initialized.", {
2271
- F: __dxlog_file11,
2320
+ F: __dxlog_file12,
2272
2321
  L: 42,
2273
2322
  S: this,
2274
2323
  A: [
@@ -2280,7 +2329,7 @@ var InvitationTopology = class {
2280
2329
  }
2281
2330
  update() {
2282
2331
  invariant8(this._controller, "Not initialized.", {
2283
- F: __dxlog_file11,
2332
+ F: __dxlog_file12,
2284
2333
  L: 47,
2285
2334
  S: this,
2286
2335
  A: [
@@ -2299,11 +2348,11 @@ var InvitationTopology = class {
2299
2348
  const firstUnknownPeer = candidates.find((peerId) => !this._seenPeers.has(peerId));
2300
2349
  this._seenPeers = new ComplexSet2(PublicKey6.hash, allPeers.filter((peerId) => this._seenPeers.has(peerId)));
2301
2350
  if (firstUnknownPeer != null) {
2302
- log8("invitation connect", {
2351
+ log9("invitation connect", {
2303
2352
  ownPeerId,
2304
2353
  remotePeerId: firstUnknownPeer
2305
2354
  }, {
2306
- F: __dxlog_file11,
2355
+ F: __dxlog_file12,
2307
2356
  L: 69,
2308
2357
  S: this,
2309
2358
  C: (f, a) => f(...a)
@@ -2314,7 +2363,7 @@ var InvitationTopology = class {
2314
2363
  }
2315
2364
  async onOffer(peer) {
2316
2365
  invariant8(this._controller, "Not initialized.", {
2317
- F: __dxlog_file11,
2366
+ F: __dxlog_file12,
2318
2367
  L: 76,
2319
2368
  S: this,
2320
2369
  A: [
@@ -2333,7 +2382,7 @@ var InvitationTopology = class {
2333
2382
  };
2334
2383
 
2335
2384
  // packages/sdk/client-services/src/packlets/invitations/invitations-handler.ts
2336
- var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-handler.ts";
2385
+ var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-handler.ts";
2337
2386
  var MAX_DELEGATED_INVITATION_HOST_TRIES = 3;
2338
2387
  var InvitationsHandler = class {
2339
2388
  /**
@@ -2358,7 +2407,7 @@ var InvitationsHandler = class {
2358
2407
  try {
2359
2408
  const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;
2360
2409
  invariant9(deviceKey, void 0, {
2361
- F: __dxlog_file12,
2410
+ F: __dxlog_file13,
2362
2411
  L: 90,
2363
2412
  S: this,
2364
2413
  A: [
@@ -2384,18 +2433,18 @@ var InvitationsHandler = class {
2384
2433
  scheduleTask3(connectionCtx, async () => {
2385
2434
  const traceId = PublicKey7.random().toHex();
2386
2435
  try {
2387
- log9.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.begin({
2436
+ log10.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.begin({
2388
2437
  id: traceId
2389
2438
  }), {
2390
- F: __dxlog_file12,
2439
+ F: __dxlog_file13,
2391
2440
  L: 115,
2392
2441
  S: this,
2393
2442
  C: (f, a) => f(...a)
2394
2443
  });
2395
- log9("connected", {
2444
+ log10("connected", {
2396
2445
  ...protocol.toJSON()
2397
2446
  }, {
2398
- F: __dxlog_file12,
2447
+ F: __dxlog_file13,
2399
2448
  L: 116,
2400
2449
  S: this,
2401
2450
  C: (f, a) => f(...a)
@@ -2403,20 +2452,20 @@ var InvitationsHandler = class {
2403
2452
  const deviceKey = await extension.completedTrigger.wait({
2404
2453
  timeout: invitation.timeout
2405
2454
  });
2406
- log9("admitted guest", {
2455
+ log10("admitted guest", {
2407
2456
  guest: deviceKey,
2408
2457
  ...protocol.toJSON()
2409
2458
  }, {
2410
- F: __dxlog_file12,
2459
+ F: __dxlog_file13,
2411
2460
  L: 118,
2412
2461
  S: this,
2413
2462
  C: (f, a) => f(...a)
2414
2463
  });
2415
2464
  guardedState.set(extension, Invitation4.State.SUCCESS);
2416
- log9.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.end({
2465
+ log10.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.end({
2417
2466
  id: traceId
2418
2467
  }), {
2419
- F: __dxlog_file12,
2468
+ F: __dxlog_file13,
2420
2469
  L: 120,
2421
2470
  S: this,
2422
2471
  C: (f, a) => f(...a)
@@ -2428,10 +2477,10 @@ var InvitationsHandler = class {
2428
2477
  } catch (err) {
2429
2478
  if (err instanceof TimeoutError) {
2430
2479
  if (guardedState.set(extension, Invitation4.State.TIMEOUT)) {
2431
- log9("timeout", {
2480
+ log10("timeout", {
2432
2481
  ...protocol.toJSON()
2433
2482
  }, {
2434
- F: __dxlog_file12,
2483
+ F: __dxlog_file13,
2435
2484
  L: 129,
2436
2485
  S: this,
2437
2486
  C: (f, a) => f(...a)
@@ -2439,19 +2488,19 @@ var InvitationsHandler = class {
2439
2488
  }
2440
2489
  } else {
2441
2490
  if (guardedState.error(extension, err)) {
2442
- log9.error("failed", err, {
2443
- F: __dxlog_file12,
2491
+ log10.error("failed", err, {
2492
+ F: __dxlog_file13,
2444
2493
  L: 133,
2445
2494
  S: this,
2446
2495
  C: (f, a) => f(...a)
2447
2496
  });
2448
2497
  }
2449
2498
  }
2450
- log9.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.error({
2499
+ log10.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.error({
2451
2500
  id: traceId,
2452
2501
  error: err
2453
2502
  }), {
2454
- F: __dxlog_file12,
2503
+ F: __dxlog_file13,
2455
2504
  L: 136,
2456
2505
  S: this,
2457
2506
  C: (f, a) => f(...a)
@@ -2462,10 +2511,10 @@ var InvitationsHandler = class {
2462
2511
  },
2463
2512
  onError: (err) => {
2464
2513
  if (err instanceof InvalidInvitationExtensionRoleError3) {
2465
- log9("invalid role", {
2514
+ log10("invalid role", {
2466
2515
  ...err.context
2467
2516
  }, {
2468
- F: __dxlog_file12,
2517
+ F: __dxlog_file13,
2469
2518
  L: 144,
2470
2519
  S: this,
2471
2520
  C: (f, a) => f(...a)
@@ -2474,10 +2523,10 @@ var InvitationsHandler = class {
2474
2523
  }
2475
2524
  if (err instanceof TimeoutError) {
2476
2525
  if (guardedState.set(extension, Invitation4.State.TIMEOUT)) {
2477
- log9("timeout", {
2526
+ log10("timeout", {
2478
2527
  err
2479
2528
  }, {
2480
- F: __dxlog_file12,
2529
+ F: __dxlog_file13,
2481
2530
  L: 149,
2482
2531
  S: this,
2483
2532
  C: (f, a) => f(...a)
@@ -2485,8 +2534,8 @@ var InvitationsHandler = class {
2485
2534
  }
2486
2535
  } else {
2487
2536
  if (guardedState.error(extension, err)) {
2488
- log9.error("failed", err, {
2489
- F: __dxlog_file12,
2537
+ log10.error("failed", err, {
2538
+ F: __dxlog_file13,
2490
2539
  L: 153,
2491
2540
  S: this,
2492
2541
  C: (f, a) => f(...a)
@@ -2499,8 +2548,8 @@ var InvitationsHandler = class {
2499
2548
  };
2500
2549
  if (invitation.lifetime && invitation.created) {
2501
2550
  if (invitation.created.getTime() + invitation.lifetime * 1e3 < Date.now()) {
2502
- log9.warn("invitation has already expired", void 0, {
2503
- F: __dxlog_file12,
2551
+ log10.warn("invitation has already expired", void 0, {
2552
+ F: __dxlog_file13,
2504
2553
  L: 164,
2505
2554
  S: this,
2506
2555
  C: (f, a) => f(...a)
@@ -2523,7 +2572,7 @@ var InvitationsHandler = class {
2523
2572
  const { timeout = INVITATION_TIMEOUT } = invitation;
2524
2573
  if (deviceProfile) {
2525
2574
  invariant9(invitation.kind === Invitation4.Kind.DEVICE, "deviceProfile provided for non-device invitation", {
2526
- F: __dxlog_file12,
2575
+ F: __dxlog_file13,
2527
2576
  L: 197,
2528
2577
  S: this,
2529
2578
  A: [
@@ -2536,12 +2585,12 @@ var InvitationsHandler = class {
2536
2585
  const guardedState = this._createGuardedState(ctx, invitation, stream);
2537
2586
  const shouldCancelInvitationFlow = (extension) => {
2538
2587
  const isLockedByAnotherConnection = guardedState.mutex.isLocked() && !extension.hasFlowLock();
2539
- log9("should cancel invitation flow", {
2588
+ log10("should cancel invitation flow", {
2540
2589
  isLockedByAnotherConnection,
2541
2590
  invitationType: Invitation4.Type.DELEGATED,
2542
2591
  triedPeers: triedPeersIds.size
2543
2592
  }, {
2544
- F: __dxlog_file12,
2593
+ F: __dxlog_file13,
2545
2594
  L: 205,
2546
2595
  S: this,
2547
2596
  C: (f, a) => f(...a)
@@ -2564,11 +2613,11 @@ var InvitationsHandler = class {
2564
2613
  return;
2565
2614
  }
2566
2615
  connectionCtx.onDispose(async () => {
2567
- log9("extension disposed", {
2616
+ log10("extension disposed", {
2568
2617
  admitted,
2569
2618
  currentState: guardedState.current.state
2570
2619
  }, {
2571
- F: __dxlog_file12,
2620
+ F: __dxlog_file13,
2572
2621
  L: 233,
2573
2622
  S: this,
2574
2623
  C: (f, a) => f(...a)
@@ -2583,10 +2632,10 @@ var InvitationsHandler = class {
2583
2632
  scheduleTask3(connectionCtx, async () => {
2584
2633
  const traceId = PublicKey7.random().toHex();
2585
2634
  try {
2586
- log9.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.begin({
2635
+ log10.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.begin({
2587
2636
  id: traceId
2588
2637
  }), {
2589
- F: __dxlog_file12,
2638
+ F: __dxlog_file13,
2590
2639
  L: 245,
2591
2640
  S: this,
2592
2641
  C: (f, a) => f(...a)
@@ -2595,19 +2644,19 @@ var InvitationsHandler = class {
2595
2644
  guardedState.set(extension, Invitation4.State.TIMEOUT);
2596
2645
  extensionCtx.close();
2597
2646
  }, timeout);
2598
- log9("connected", {
2647
+ log10("connected", {
2599
2648
  ...protocol.toJSON()
2600
2649
  }, {
2601
- F: __dxlog_file12,
2650
+ F: __dxlog_file13,
2602
2651
  L: 256,
2603
2652
  S: this,
2604
2653
  C: (f, a) => f(...a)
2605
2654
  });
2606
2655
  guardedState.set(extension, Invitation4.State.CONNECTED);
2607
- log9("introduce", {
2656
+ log10("introduce", {
2608
2657
  ...protocol.toJSON()
2609
2658
  }, {
2610
- F: __dxlog_file12,
2659
+ F: __dxlog_file13,
2611
2660
  L: 260,
2612
2661
  S: this,
2613
2662
  C: (f, a) => f(...a)
@@ -2616,11 +2665,11 @@ var InvitationsHandler = class {
2616
2665
  invitationId: invitation.invitationId,
2617
2666
  ...protocol.createIntroduction()
2618
2667
  });
2619
- log9("introduce response", {
2668
+ log10("introduce response", {
2620
2669
  ...protocol.toJSON(),
2621
2670
  response: introductionResponse
2622
2671
  }, {
2623
- F: __dxlog_file12,
2672
+ F: __dxlog_file13,
2624
2673
  L: 265,
2625
2674
  S: this,
2626
2675
  C: (f, a) => f(...a)
@@ -2638,10 +2687,10 @@ var InvitationsHandler = class {
2638
2687
  break;
2639
2688
  }
2640
2689
  }
2641
- log9("request admission", {
2690
+ log10("request admission", {
2642
2691
  ...protocol.toJSON()
2643
2692
  }, {
2644
- F: __dxlog_file12,
2693
+ F: __dxlog_file13,
2645
2694
  L: 291,
2646
2695
  S: this,
2647
2696
  C: (f, a) => f(...a)
@@ -2650,10 +2699,10 @@ var InvitationsHandler = class {
2650
2699
  const admissionResponse = await extension.rpc.InvitationHostService.admit(admissionRequest);
2651
2700
  admitted = true;
2652
2701
  const result = await protocol.accept(admissionResponse, admissionRequest);
2653
- log9("admitted by host", {
2702
+ log10("admitted by host", {
2654
2703
  ...protocol.toJSON()
2655
2704
  }, {
2656
- F: __dxlog_file12,
2705
+ F: __dxlog_file13,
2657
2706
  L: 302,
2658
2707
  S: this,
2659
2708
  C: (f, a) => f(...a)
@@ -2663,28 +2712,28 @@ var InvitationsHandler = class {
2663
2712
  ...result,
2664
2713
  state: Invitation4.State.SUCCESS
2665
2714
  });
2666
- log9.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.end({
2715
+ log10.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.end({
2667
2716
  id: traceId
2668
2717
  }), {
2669
- F: __dxlog_file12,
2718
+ F: __dxlog_file13,
2670
2719
  L: 308,
2671
2720
  S: this,
2672
2721
  C: (f, a) => f(...a)
2673
2722
  });
2674
2723
  } catch (err) {
2675
2724
  if (err instanceof TimeoutError) {
2676
- log9("timeout", {
2725
+ log10("timeout", {
2677
2726
  ...protocol.toJSON()
2678
2727
  }, {
2679
- F: __dxlog_file12,
2728
+ F: __dxlog_file13,
2680
2729
  L: 311,
2681
2730
  S: this,
2682
2731
  C: (f, a) => f(...a)
2683
2732
  });
2684
2733
  guardedState.set(extension, Invitation4.State.TIMEOUT);
2685
2734
  } else {
2686
- log9("auth failed", err, {
2687
- F: __dxlog_file12,
2735
+ log10("auth failed", err, {
2736
+ F: __dxlog_file13,
2688
2737
  L: 314,
2689
2738
  S: this,
2690
2739
  C: (f, a) => f(...a)
@@ -2692,11 +2741,11 @@ var InvitationsHandler = class {
2692
2741
  guardedState.error(extension, err);
2693
2742
  }
2694
2743
  extensionCtx.close(err);
2695
- log9.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.error({
2744
+ log10.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.error({
2696
2745
  id: traceId,
2697
2746
  error: err
2698
2747
  }), {
2699
- F: __dxlog_file12,
2748
+ F: __dxlog_file13,
2700
2749
  L: 318,
2701
2750
  S: this,
2702
2751
  C: (f, a) => f(...a)
@@ -2709,18 +2758,18 @@ var InvitationsHandler = class {
2709
2758
  return;
2710
2759
  }
2711
2760
  if (err instanceof TimeoutError) {
2712
- log9("timeout", {
2761
+ log10("timeout", {
2713
2762
  ...protocol.toJSON()
2714
2763
  }, {
2715
- F: __dxlog_file12,
2764
+ F: __dxlog_file13,
2716
2765
  L: 327,
2717
2766
  S: this,
2718
2767
  C: (f, a) => f(...a)
2719
2768
  });
2720
2769
  guardedState.set(extension, Invitation4.State.TIMEOUT);
2721
2770
  } else {
2722
- log9("auth failed", err, {
2723
- F: __dxlog_file12,
2771
+ log10("auth failed", err, {
2772
+ F: __dxlog_file13,
2724
2773
  L: 330,
2725
2774
  S: this,
2726
2775
  C: (f, a) => f(...a)
@@ -2738,7 +2787,7 @@ var InvitationsHandler = class {
2738
2787
  await ctx.dispose();
2739
2788
  } else {
2740
2789
  invariant9(invitation.swarmKey, void 0, {
2741
- F: __dxlog_file12,
2790
+ F: __dxlog_file13,
2742
2791
  L: 345,
2743
2792
  S: this,
2744
2793
  A: [
@@ -2832,16 +2881,29 @@ var InvitationsHandler = class {
2832
2881
  };
2833
2882
  }
2834
2883
  _logStateUpdate(invitation, actor, newState) {
2835
- log9("invitation state update", {
2836
- actor: actor?.constructor.name,
2837
- newState: stateToString(newState),
2838
- oldState: stateToString(invitation.state)
2839
- }, {
2840
- F: __dxlog_file12,
2841
- L: 438,
2842
- S: this,
2843
- C: (f, a) => f(...a)
2844
- });
2884
+ if (this._isNotTerminal(newState)) {
2885
+ log10("invitation state update", {
2886
+ actor: actor?.constructor.name,
2887
+ newState: stateToString(newState),
2888
+ oldState: stateToString(invitation.state)
2889
+ }, {
2890
+ F: __dxlog_file13,
2891
+ L: 439,
2892
+ S: this,
2893
+ C: (f, a) => f(...a)
2894
+ });
2895
+ } else {
2896
+ log10.info("invitation state update", {
2897
+ actor: actor?.constructor.name,
2898
+ newState: stateToString(newState),
2899
+ oldState: stateToString(invitation.state)
2900
+ }, {
2901
+ F: __dxlog_file13,
2902
+ L: 445,
2903
+ S: this,
2904
+ C: (f, a) => f(...a)
2905
+ });
2906
+ }
2845
2907
  }
2846
2908
  _isNotTerminal(currentState) {
2847
2909
  return ![
@@ -2854,17 +2916,17 @@ var InvitationsHandler = class {
2854
2916
  }
2855
2917
  async _handleGuestOtpAuth(extension, setState, authenticated, options) {
2856
2918
  for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {
2857
- log9("guest waiting for authentication code...", void 0, {
2858
- F: __dxlog_file12,
2859
- L: 462,
2919
+ log10("guest waiting for authentication code...", void 0, {
2920
+ F: __dxlog_file13,
2921
+ L: 470,
2860
2922
  S: this,
2861
2923
  C: (f, a) => f(...a)
2862
2924
  });
2863
2925
  setState(Invitation4.State.READY_FOR_AUTHENTICATION);
2864
2926
  const authCode = await authenticated.wait(options);
2865
- log9("sending authentication request", void 0, {
2866
- F: __dxlog_file12,
2867
- L: 466,
2927
+ log10("sending authentication request", void 0, {
2928
+ F: __dxlog_file13,
2929
+ L: 474,
2868
2930
  S: this,
2869
2931
  C: (f, a) => f(...a)
2870
2932
  });
@@ -2879,11 +2941,11 @@ var InvitationsHandler = class {
2879
2941
  if (attempt === MAX_OTP_ATTEMPTS) {
2880
2942
  throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);
2881
2943
  } else {
2882
- log9("retrying invalid code", {
2944
+ log10("retrying invalid code", {
2883
2945
  attempt
2884
2946
  }, {
2885
- F: __dxlog_file12,
2886
- L: 477,
2947
+ F: __dxlog_file13,
2948
+ L: 485,
2887
2949
  S: this,
2888
2950
  C: (f, a) => f(...a)
2889
2951
  });
@@ -2899,9 +2961,9 @@ var InvitationsHandler = class {
2899
2961
  if (introductionResponse.challenge == null) {
2900
2962
  throw new Error("challenge missing in the introduction");
2901
2963
  }
2902
- log9("sending authentication request", void 0, {
2903
- F: __dxlog_file12,
2904
- L: 496,
2964
+ log10("sending authentication request", void 0, {
2965
+ F: __dxlog_file13,
2966
+ L: 504,
2905
2967
  S: this,
2906
2968
  C: (f, a) => f(...a)
2907
2969
  });
@@ -3021,14 +3083,14 @@ var InvitationsServiceImpl = class {
3021
3083
  };
3022
3084
 
3023
3085
  // packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts
3024
- import { createAdmissionCredentials, createCancelDelegatedSpaceInvitationCredential, createDelegatedSpaceInvitationCredential, getCredentialAssertion as getCredentialAssertion2 } from "@dxos/credentials";
3086
+ import { createCancelDelegatedSpaceInvitationCredential, createDelegatedSpaceInvitationCredential, getCredentialAssertion as getCredentialAssertion2 } from "@dxos/credentials";
3025
3087
  import { writeMessages as writeMessages2 } from "@dxos/feed-store";
3026
3088
  import { invariant as invariant10 } from "@dxos/invariant";
3027
- import { log as log10 } from "@dxos/log";
3089
+ import { log as log11 } from "@dxos/log";
3028
3090
  import { AlreadyJoinedError as AlreadyJoinedError2, AuthorizationError, InvalidInvitationError, SpaceNotFoundError } from "@dxos/protocols";
3029
3091
  import { Invitation as Invitation5 } from "@dxos/protocols/proto/dxos/client/services";
3030
3092
  import { SpaceMember as SpaceMember2 } from "@dxos/protocols/proto/dxos/halo/credentials";
3031
- var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts";
3093
+ var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts";
3032
3094
  var SpaceInvitationProtocol = class {
3033
3095
  constructor(_spaceManager, _signingContext, _keyring, _spaceKey) {
3034
3096
  this._spaceManager = _spaceManager;
@@ -3062,79 +3124,43 @@ var SpaceInvitationProtocol = class {
3062
3124
  };
3063
3125
  }
3064
3126
  async admit(invitation, request, guestProfile) {
3065
- invariant10(this._spaceKey, void 0, {
3066
- F: __dxlog_file13,
3067
- L: 76,
3068
- S: this,
3069
- A: [
3070
- "this._spaceKey",
3071
- ""
3072
- ]
3073
- });
3074
- const space = this._spaceManager.spaces.get(this._spaceKey);
3075
- invariant10(space, void 0, {
3076
- F: __dxlog_file13,
3077
- L: 78,
3078
- S: this,
3079
- A: [
3080
- "space",
3081
- ""
3082
- ]
3083
- });
3084
- invariant10(request.space, void 0, {
3085
- F: __dxlog_file13,
3086
- L: 80,
3127
+ invariant10(this._spaceKey && request.space, void 0, {
3128
+ F: __dxlog_file14,
3129
+ L: 74,
3087
3130
  S: this,
3088
3131
  A: [
3089
- "request.space",
3132
+ "this._spaceKey && request.space",
3090
3133
  ""
3091
3134
  ]
3092
3135
  });
3093
- const { identityKey, deviceKey } = request.space;
3094
- if (space.inner.spaceState.getMemberRole(identityKey) !== SpaceMember2.Role.REMOVED) {
3095
- throw new AlreadyJoinedError2();
3096
- }
3097
- log10("writing guest credentials", {
3136
+ log11("writing guest credentials", {
3098
3137
  host: this._signingContext.deviceKey,
3099
- guest: deviceKey
3138
+ guest: request.space.deviceKey
3100
3139
  }, {
3101
- F: __dxlog_file13,
3102
- L: 87,
3140
+ F: __dxlog_file14,
3141
+ L: 75,
3103
3142
  S: this,
3104
3143
  C: (f, a) => f(...a)
3105
3144
  });
3106
- const credentials = await createAdmissionCredentials(this._signingContext.credentialSigner, identityKey, space.key, space.inner.genesisFeedKey, invitation.role ?? SpaceMember2.Role.ADMIN, space.inner.spaceState.membershipChainHeads, guestProfile, invitation.delegationCredentialId);
3107
- invariant10(credentials[0].credential, void 0, {
3108
- F: __dxlog_file13,
3109
- L: 101,
3110
- S: this,
3111
- A: [
3112
- "credentials[0].credential",
3113
- ""
3114
- ]
3115
- });
3116
- const spaceMemberCredential = credentials[0].credential.credential;
3117
- invariant10(getCredentialAssertion2(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
3118
- F: __dxlog_file13,
3119
- L: 103,
3120
- S: this,
3121
- A: [
3122
- "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
3123
- ""
3124
- ]
3145
+ const spaceMemberCredential = await this._spaceManager.admitMember({
3146
+ spaceKey: this._spaceKey,
3147
+ identityKey: request.space.identityKey,
3148
+ role: invitation.role ?? SpaceMember2.Role.ADMIN,
3149
+ profile: guestProfile,
3150
+ delegationCredentialId: invitation.delegationCredentialId
3125
3151
  });
3126
- await writeMessages2(space.inner.controlPipeline.writer, credentials);
3152
+ const space = this._spaceManager.spaces.get(this._spaceKey);
3127
3153
  return {
3128
3154
  space: {
3129
3155
  credential: spaceMemberCredential,
3130
- controlTimeframe: space.inner.controlPipeline.state.timeframe
3156
+ controlTimeframe: space?.inner.controlPipeline.state.timeframe
3131
3157
  }
3132
3158
  };
3133
3159
  }
3134
3160
  async delegate(invitation) {
3135
3161
  invariant10(this._spaceKey, void 0, {
3136
- F: __dxlog_file13,
3137
- L: 116,
3162
+ F: __dxlog_file14,
3163
+ L: 95,
3138
3164
  S: this,
3139
3165
  A: [
3140
3166
  "this._spaceKey",
@@ -3143,8 +3169,8 @@ var SpaceInvitationProtocol = class {
3143
3169
  });
3144
3170
  const space = this._spaceManager.spaces.get(this._spaceKey);
3145
3171
  invariant10(space, void 0, {
3146
- F: __dxlog_file13,
3147
- L: 118,
3172
+ F: __dxlog_file14,
3173
+ L: 97,
3148
3174
  S: this,
3149
3175
  A: [
3150
3176
  "space",
@@ -3153,8 +3179,8 @@ var SpaceInvitationProtocol = class {
3153
3179
  });
3154
3180
  if (invitation.authMethod === Invitation5.AuthMethod.KNOWN_PUBLIC_KEY) {
3155
3181
  invariant10(invitation.guestKeypair?.publicKey, void 0, {
3156
- F: __dxlog_file13,
3157
- L: 120,
3182
+ F: __dxlog_file14,
3183
+ L: 99,
3158
3184
  S: this,
3159
3185
  A: [
3160
3186
  "invitation.guestKeypair?.publicKey",
@@ -3162,12 +3188,12 @@ var SpaceInvitationProtocol = class {
3162
3188
  ]
3163
3189
  });
3164
3190
  }
3165
- log10("writing delegate space invitation", {
3191
+ log11("writing delegate space invitation", {
3166
3192
  host: this._signingContext.deviceKey,
3167
3193
  id: invitation.invitationId
3168
3194
  }, {
3169
- F: __dxlog_file13,
3170
- L: 123,
3195
+ F: __dxlog_file14,
3196
+ L: 102,
3171
3197
  S: this,
3172
3198
  C: (f, a) => f(...a)
3173
3199
  });
@@ -3181,8 +3207,8 @@ var SpaceInvitationProtocol = class {
3181
3207
  guestKey: invitation.authMethod === Invitation5.AuthMethod.KNOWN_PUBLIC_KEY ? invitation.guestKeypair.publicKey : void 0
3182
3208
  });
3183
3209
  invariant10(credential.credential, void 0, {
3184
- F: __dxlog_file13,
3185
- L: 143,
3210
+ F: __dxlog_file14,
3211
+ L: 122,
3186
3212
  S: this,
3187
3213
  A: [
3188
3214
  "credential.credential",
@@ -3196,8 +3222,8 @@ var SpaceInvitationProtocol = class {
3196
3222
  }
3197
3223
  async cancelDelegation(invitation) {
3198
3224
  invariant10(this._spaceKey, void 0, {
3199
- F: __dxlog_file13,
3200
- L: 149,
3225
+ F: __dxlog_file14,
3226
+ L: 128,
3201
3227
  S: this,
3202
3228
  A: [
3203
3229
  "this._spaceKey",
@@ -3205,8 +3231,8 @@ var SpaceInvitationProtocol = class {
3205
3231
  ]
3206
3232
  });
3207
3233
  invariant10(invitation.type === Invitation5.Type.DELEGATED && invitation.delegationCredentialId, void 0, {
3208
- F: __dxlog_file13,
3209
- L: 150,
3234
+ F: __dxlog_file14,
3235
+ L: 129,
3210
3236
  S: this,
3211
3237
  A: [
3212
3238
  "invitation.type === Invitation.Type.DELEGATED && invitation.delegationCredentialId",
@@ -3215,27 +3241,27 @@ var SpaceInvitationProtocol = class {
3215
3241
  });
3216
3242
  const space = this._spaceManager.spaces.get(this._spaceKey);
3217
3243
  invariant10(space, void 0, {
3218
- F: __dxlog_file13,
3219
- L: 152,
3244
+ F: __dxlog_file14,
3245
+ L: 131,
3220
3246
  S: this,
3221
3247
  A: [
3222
3248
  "space",
3223
3249
  ""
3224
3250
  ]
3225
3251
  });
3226
- log10("cancelling delegated space invitation", {
3252
+ log11("cancelling delegated space invitation", {
3227
3253
  host: this._signingContext.deviceKey,
3228
3254
  id: invitation.invitationId
3229
3255
  }, {
3230
- F: __dxlog_file13,
3231
- L: 154,
3256
+ F: __dxlog_file14,
3257
+ L: 133,
3232
3258
  S: this,
3233
3259
  C: (f, a) => f(...a)
3234
3260
  });
3235
3261
  const credential = await createCancelDelegatedSpaceInvitationCredential(this._signingContext.credentialSigner, space.key, invitation.delegationCredentialId);
3236
3262
  invariant10(credential.credential, void 0, {
3237
- F: __dxlog_file13,
3238
- L: 161,
3263
+ F: __dxlog_file14,
3264
+ L: 140,
3239
3265
  S: this,
3240
3266
  A: [
3241
3267
  "credential.credential",
@@ -3273,8 +3299,8 @@ var SpaceInvitationProtocol = class {
3273
3299
  }
3274
3300
  async accept(response) {
3275
3301
  invariant10(response.space, void 0, {
3276
- F: __dxlog_file13,
3277
- L: 196,
3302
+ F: __dxlog_file14,
3303
+ L: 175,
3278
3304
  S: this,
3279
3305
  A: [
3280
3306
  "response.space",
@@ -3284,8 +3310,8 @@ var SpaceInvitationProtocol = class {
3284
3310
  const { credential, controlTimeframe, dataTimeframe } = response.space;
3285
3311
  const assertion = getCredentialAssertion2(credential);
3286
3312
  invariant10(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
3287
- F: __dxlog_file13,
3288
- L: 199,
3313
+ F: __dxlog_file14,
3314
+ L: 178,
3289
3315
  S: this,
3290
3316
  A: [
3291
3317
  "assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -3293,8 +3319,8 @@ var SpaceInvitationProtocol = class {
3293
3319
  ]
3294
3320
  });
3295
3321
  invariant10(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
3296
- F: __dxlog_file13,
3297
- L: 200,
3322
+ F: __dxlog_file14,
3323
+ L: 179,
3298
3324
  S: this,
3299
3325
  A: [
3300
3326
  "credential.subject.id.equals(this._signingContext.identityKey)",
@@ -3318,17 +3344,17 @@ var SpaceInvitationProtocol = class {
3318
3344
  };
3319
3345
 
3320
3346
  // packages/sdk/client-services/src/packlets/invitations/invitations-manager.ts
3321
- import { Event as Event3, PushStream, TimeoutError as TimeoutError2, Trigger as Trigger5 } from "@dxos/async";
3347
+ import { Event as Event3, PushStream, TimeoutError as TimeoutError2, Trigger as Trigger6 } from "@dxos/async";
3322
3348
  import { AuthenticatingInvitation, AUTHENTICATION_CODE_LENGTH, CancellableInvitation, INVITATION_TIMEOUT as INVITATION_TIMEOUT2 } from "@dxos/client-protocol";
3323
3349
  import { Context as Context6 } from "@dxos/context";
3324
3350
  import { generatePasscode } from "@dxos/credentials";
3325
3351
  import { hasInvitationExpired } from "@dxos/echo-pipeline";
3326
3352
  import { invariant as invariant11 } from "@dxos/invariant";
3327
3353
  import { PublicKey as PublicKey8 } from "@dxos/keys";
3328
- import { log as log11 } from "@dxos/log";
3354
+ import { log as log12 } from "@dxos/log";
3329
3355
  import { Invitation as Invitation6 } from "@dxos/protocols/proto/dxos/client/services";
3330
3356
  import { SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
3331
- var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-manager.ts";
3357
+ var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-manager.ts";
3332
3358
  var InvitationsManager = class {
3333
3359
  constructor(_invitationsHandler, _getHandler, _metadataStore) {
3334
3360
  this._invitationsHandler = _invitationsHandler;
@@ -3370,8 +3396,8 @@ var InvitationsManager = class {
3370
3396
  try {
3371
3397
  await this._persistIfRequired(handler, stream, invitation);
3372
3398
  } catch (err) {
3373
- log11.catch(err, void 0, {
3374
- F: __dxlog_file14,
3399
+ log12.catch(err, void 0, {
3400
+ F: __dxlog_file15,
3375
3401
  L: 82,
3376
3402
  S: this,
3377
3403
  C: (f, a) => f(...a)
@@ -3394,7 +3420,7 @@ var InvitationsManager = class {
3394
3420
  const freshInvitations = persistentInvitations.filter((invitation) => !hasInvitationExpired(invitation));
3395
3421
  const loadTasks = freshInvitations.map((persistentInvitation) => {
3396
3422
  invariant11(!this._createInvitations.get(persistentInvitation.invitationId), "invitation already exists", {
3397
- F: __dxlog_file14,
3423
+ F: __dxlog_file15,
3398
3424
  L: 103,
3399
3425
  S: this,
3400
3426
  A: [
@@ -3412,8 +3438,8 @@ var InvitationsManager = class {
3412
3438
  invitations: cInvitations.map((invitation) => invitation.get())
3413
3439
  };
3414
3440
  } catch (err) {
3415
- log11.catch(err, void 0, {
3416
- F: __dxlog_file14,
3441
+ log12.catch(err, void 0, {
3442
+ F: __dxlog_file15,
3417
3443
  L: 110,
3418
3444
  S: this,
3419
3445
  C: (f, a) => f(...a)
@@ -3444,14 +3470,14 @@ var InvitationsManager = class {
3444
3470
  return invitation;
3445
3471
  }
3446
3472
  async authenticate({ invitationId, authCode }) {
3447
- log11("authenticating...", void 0, {
3448
- F: __dxlog_file14,
3473
+ log12("authenticating...", void 0, {
3474
+ F: __dxlog_file15,
3449
3475
  L: 140,
3450
3476
  S: this,
3451
3477
  C: (f, a) => f(...a)
3452
3478
  });
3453
3479
  invariant11(invitationId, void 0, {
3454
- F: __dxlog_file14,
3480
+ F: __dxlog_file15,
3455
3481
  L: 141,
3456
3482
  S: this,
3457
3483
  A: [
@@ -3461,10 +3487,10 @@ var InvitationsManager = class {
3461
3487
  });
3462
3488
  const observable = this._acceptInvitations.get(invitationId);
3463
3489
  if (!observable) {
3464
- log11.warn("invalid invitation", {
3490
+ log12.warn("invalid invitation", {
3465
3491
  invitationId
3466
3492
  }, {
3467
- F: __dxlog_file14,
3493
+ F: __dxlog_file15,
3468
3494
  L: 144,
3469
3495
  S: this,
3470
3496
  C: (f, a) => f(...a)
@@ -3474,16 +3500,16 @@ var InvitationsManager = class {
3474
3500
  }
3475
3501
  }
3476
3502
  async cancelInvitation({ invitationId }) {
3477
- log11("cancelInvitation...", {
3503
+ log12("cancelInvitation...", {
3478
3504
  invitationId
3479
3505
  }, {
3480
- F: __dxlog_file14,
3506
+ F: __dxlog_file15,
3481
3507
  L: 151,
3482
3508
  S: this,
3483
3509
  C: (f, a) => f(...a)
3484
3510
  });
3485
3511
  invariant11(invitationId, void 0, {
3486
- F: __dxlog_file14,
3512
+ F: __dxlog_file15,
3487
3513
  L: 152,
3488
3514
  S: this,
3489
3515
  A: [
@@ -3557,12 +3583,15 @@ var InvitationsManager = class {
3557
3583
  stream.error(err);
3558
3584
  void ctx.dispose();
3559
3585
  }
3586
+ }, {
3587
+ F: __dxlog_file15,
3588
+ L: 234
3560
3589
  });
3561
3590
  ctx.onDispose(() => {
3562
- log11("complete", {
3591
+ log12("complete", {
3563
3592
  ...handler.toJSON()
3564
3593
  }, {
3565
- F: __dxlog_file14,
3594
+ F: __dxlog_file15,
3566
3595
  L: 241,
3567
3596
  S: this,
3568
3597
  C: (f, a) => f(...a)
@@ -3587,15 +3616,15 @@ var InvitationsManager = class {
3587
3616
  };
3588
3617
  }
3589
3618
  _createObservableAcceptingInvitation(handler, initialState) {
3590
- const otpEnteredTrigger = new Trigger5();
3619
+ const otpEnteredTrigger = new Trigger6();
3591
3620
  const stream = new PushStream();
3592
3621
  const ctx = new Context6({
3593
3622
  onError: (err) => {
3594
3623
  if (err instanceof TimeoutError2) {
3595
- log11("timeout", {
3624
+ log12("timeout", {
3596
3625
  ...handler.toJSON()
3597
3626
  }, {
3598
- F: __dxlog_file14,
3627
+ F: __dxlog_file15,
3599
3628
  L: 261,
3600
3629
  S: this,
3601
3630
  C: (f, a) => f(...a)
@@ -3605,8 +3634,8 @@ var InvitationsManager = class {
3605
3634
  state: Invitation6.State.TIMEOUT
3606
3635
  });
3607
3636
  } else {
3608
- log11.warn("auth failed", err, {
3609
- F: __dxlog_file14,
3637
+ log12.warn("auth failed", err, {
3638
+ F: __dxlog_file15,
3610
3639
  L: 264,
3611
3640
  S: this,
3612
3641
  C: (f, a) => f(...a)
@@ -3618,12 +3647,15 @@ var InvitationsManager = class {
3618
3647
  }
3619
3648
  void ctx.dispose();
3620
3649
  }
3650
+ }, {
3651
+ F: __dxlog_file15,
3652
+ L: 258
3621
3653
  });
3622
3654
  ctx.onDispose(() => {
3623
- log11("complete", {
3655
+ log12("complete", {
3624
3656
  ...handler.toJSON()
3625
3657
  }, {
3626
- F: __dxlog_file14,
3658
+ F: __dxlog_file15,
3627
3659
  L: 271,
3628
3660
  S: this,
3629
3661
  C: (f, a) => f(...a)
@@ -3667,8 +3699,8 @@ var InvitationsManager = class {
3667
3699
  try {
3668
3700
  await this._metadataStore.removeInvitation(invitation.invitationId);
3669
3701
  } catch (err) {
3670
- log11.catch(err, void 0, {
3671
- F: __dxlog_file14,
3702
+ log12.catch(err, void 0, {
3703
+ F: __dxlog_file15,
3672
3704
  L: 307,
3673
3705
  S: this,
3674
3706
  C: (f, a) => f(...a)
@@ -3683,33 +3715,40 @@ var InvitationsManager = class {
3683
3715
  };
3684
3716
 
3685
3717
  // packages/sdk/client-services/src/packlets/spaces/data-space.ts
3686
- import { Event as Event6, asyncTimeout as asyncTimeout2, scheduleTask as scheduleTask5, sleep as sleep2, synchronized, trackLeaks } from "@dxos/async";
3718
+ import { Event as Event6, Mutex as Mutex2, scheduleTask as scheduleTask5, sleep as sleep3, synchronized, trackLeaks } from "@dxos/async";
3687
3719
  import { AUTH_TIMEOUT as AUTH_TIMEOUT2 } from "@dxos/client-protocol";
3688
- import { Context as Context8, ContextDisposedError as ContextDisposedError3, cancelWithContext as cancelWithContext4 } from "@dxos/context";
3720
+ import { Context as Context8, ContextDisposedError as ContextDisposedError3, cancelWithContext as cancelWithContext5 } from "@dxos/context";
3689
3721
  import { timed, warnAfterTimeout } from "@dxos/debug";
3690
- import { AutomergeDocumentLoaderImpl, createIdFromSpaceKey, createMappedFeedWriter } from "@dxos/echo-pipeline";
3691
- import { TYPE_PROPERTIES } from "@dxos/echo-schema";
3692
- import { failedInvariant, invariant as invariant13 } from "@dxos/invariant";
3722
+ import { createMappedFeedWriter } from "@dxos/echo-pipeline";
3723
+ import { SpaceDocVersion } from "@dxos/echo-protocol";
3724
+ import { failedInvariant } from "@dxos/invariant";
3693
3725
  import { PublicKey as PublicKey10 } from "@dxos/keys";
3694
- import { log as log13 } from "@dxos/log";
3726
+ import { log as log15 } from "@dxos/log";
3695
3727
  import { CancelledError, SystemError } from "@dxos/protocols";
3696
- import { CreateEpochRequest, SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
3728
+ import { SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
3697
3729
  import { AdmittedFeed as AdmittedFeed3, SpaceMember as SpaceMember4 } from "@dxos/protocols/proto/dxos/halo/credentials";
3698
3730
  import { Timeframe as Timeframe3 } from "@dxos/timeframe";
3699
3731
  import { trace as trace6 } from "@dxos/tracing";
3700
- import { ComplexSet as ComplexSet5, assignDeep } from "@dxos/util";
3732
+ import { ComplexSet as ComplexSet5 } from "@dxos/util";
3701
3733
 
3702
3734
  // packages/sdk/client-services/src/packlets/spaces/automerge-space-state.ts
3703
3735
  import { Event as Event4 } from "@dxos/async";
3736
+ import { Resource as Resource2 } from "@dxos/context";
3704
3737
  import { checkCredentialType } from "@dxos/credentials";
3705
- var AutomergeSpaceState = class {
3738
+ var AutomergeSpaceState = class extends Resource2 {
3706
3739
  constructor(_onNewRoot) {
3740
+ super();
3707
3741
  this._onNewRoot = _onNewRoot;
3708
3742
  this.rootUrl = void 0;
3709
3743
  this.lastEpoch = void 0;
3710
3744
  this.onNewEpoch = new Event4();
3711
3745
  this._isProcessingRootDocs = false;
3712
3746
  }
3747
+ async _open(ctx) {
3748
+ }
3749
+ async _close(ctx) {
3750
+ this._isProcessingRootDocs = false;
3751
+ }
3713
3752
  async processCredential(credential) {
3714
3753
  if (!checkCredentialType(credential, "dxos.halo.credentials.Epoch")) {
3715
3754
  return;
@@ -3737,23 +3776,172 @@ var AutomergeSpaceState = class {
3737
3776
  }
3738
3777
  };
3739
3778
 
3779
+ // packages/sdk/client-services/src/packlets/spaces/epoch-migrations.ts
3780
+ import { asyncTimeout as asyncTimeout2 } from "@dxos/async";
3781
+ import { next as am } from "@dxos/automerge/automerge";
3782
+ import { cancelWithContext as cancelWithContext4 } from "@dxos/context";
3783
+ import { convertLegacyReferences, convertLegacySpaceRootDoc, findInlineObjectOfType, migrateDocument } from "@dxos/echo-db";
3784
+ import { AutomergeDocumentLoaderImpl } from "@dxos/echo-pipeline";
3785
+ import { TYPE_PROPERTIES } from "@dxos/echo-schema";
3786
+ import { invariant as invariant12 } from "@dxos/invariant";
3787
+ import { log as log13 } from "@dxos/log";
3788
+ import { CreateEpochRequest } from "@dxos/protocols/proto/dxos/client/services";
3789
+ import { assignDeep } from "@dxos/util";
3790
+ var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/epoch-migrations.ts";
3791
+ var runEpochMigration = async (ctx, context) => {
3792
+ switch (context.migration) {
3793
+ case CreateEpochRequest.Migration.INIT_AUTOMERGE: {
3794
+ const document = context.repo.create();
3795
+ await context.repo.flush();
3796
+ return {
3797
+ newRoot: document.url
3798
+ };
3799
+ }
3800
+ case CreateEpochRequest.Migration.PRUNE_AUTOMERGE_ROOT_HISTORY: {
3801
+ if (!context.currentRoot) {
3802
+ throw new Error("Space does not have an automerge root");
3803
+ }
3804
+ const rootHandle = context.repo.find(context.currentRoot);
3805
+ await cancelWithContext4(ctx, asyncTimeout2(rootHandle.whenReady(), 1e4));
3806
+ const newRoot = context.repo.create(rootHandle.docSync());
3807
+ await context.repo.flush();
3808
+ return {
3809
+ newRoot: newRoot.url
3810
+ };
3811
+ }
3812
+ case CreateEpochRequest.Migration.FRAGMENT_AUTOMERGE_ROOT: {
3813
+ log13.info("Fragmenting", void 0, {
3814
+ F: __dxlog_file16,
3815
+ L: 63,
3816
+ S: void 0,
3817
+ C: (f, a) => f(...a)
3818
+ });
3819
+ const currentRootUrl = context.currentRoot;
3820
+ const rootHandle = context.repo.find(currentRootUrl);
3821
+ await cancelWithContext4(ctx, asyncTimeout2(rootHandle.whenReady(), 1e4));
3822
+ const objects = Object.entries(rootHandle.docSync().objects);
3823
+ const properties = findInlineObjectOfType(rootHandle.docSync(), TYPE_PROPERTIES);
3824
+ const otherObjects = objects.filter(([key]) => key !== properties?.[0]);
3825
+ invariant12(properties, "Properties not found", {
3826
+ F: __dxlog_file16,
3827
+ L: 73,
3828
+ S: void 0,
3829
+ A: [
3830
+ "properties",
3831
+ "'Properties not found'"
3832
+ ]
3833
+ });
3834
+ const newSpaceDoc = {
3835
+ ...rootHandle.docSync(),
3836
+ objects: Object.fromEntries([
3837
+ properties
3838
+ ])
3839
+ };
3840
+ const newRoot = context.repo.create(newSpaceDoc);
3841
+ invariant12(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3842
+ F: __dxlog_file16,
3843
+ L: 78,
3844
+ S: void 0,
3845
+ A: [
3846
+ "typeof newRoot.url === 'string' && newRoot.url.length > 0",
3847
+ ""
3848
+ ]
3849
+ });
3850
+ const docLoader = new AutomergeDocumentLoaderImpl(context.spaceId, context.repo, context.spaceKey);
3851
+ await docLoader.loadSpaceRootDocHandle(ctx, {
3852
+ rootUrl: newRoot.url
3853
+ });
3854
+ otherObjects.forEach(([key, value]) => {
3855
+ const handle = docLoader.createDocumentForObject(key);
3856
+ handle.change((doc) => {
3857
+ assignDeep(doc, [
3858
+ "objects",
3859
+ key
3860
+ ], value);
3861
+ });
3862
+ });
3863
+ await context.repo.flush();
3864
+ return {
3865
+ newRoot: newRoot.url
3866
+ };
3867
+ }
3868
+ case CreateEpochRequest.Migration.MIGRATE_REFERENCES_TO_DXN: {
3869
+ const currentRootUrl = context.currentRoot;
3870
+ const rootHandle = context.repo.find(currentRootUrl);
3871
+ await cancelWithContext4(ctx, asyncTimeout2(rootHandle.whenReady(), 1e4));
3872
+ invariant12(rootHandle.docSync(), "Root doc not found", {
3873
+ F: __dxlog_file16,
3874
+ L: 100,
3875
+ S: void 0,
3876
+ A: [
3877
+ "rootHandle.docSync()",
3878
+ "'Root doc not found'"
3879
+ ]
3880
+ });
3881
+ const newRootContent = await convertLegacySpaceRootDoc(structuredClone(rootHandle.docSync()));
3882
+ for (const [id, url] of Object.entries(newRootContent.links ?? {})) {
3883
+ const handle = context.repo.find(url);
3884
+ await cancelWithContext4(ctx, asyncTimeout2(handle.whenReady(), 1e4));
3885
+ invariant12(handle.docSync(), "Doc not found", {
3886
+ F: __dxlog_file16,
3887
+ L: 107,
3888
+ S: void 0,
3889
+ A: [
3890
+ "handle.docSync()",
3891
+ "'Doc not found'"
3892
+ ]
3893
+ });
3894
+ const newDoc = await convertLegacyReferences(structuredClone(handle.docSync()));
3895
+ const migratedDoc = migrateDocument(handle.docSync(), newDoc);
3896
+ const newHandle = context.repo.import(am.save(migratedDoc));
3897
+ newRootContent.links[id] = newHandle.url;
3898
+ }
3899
+ const migratedRoot = migrateDocument(rootHandle.docSync(), newRootContent);
3900
+ const newRoot = context.repo.import(am.save(migratedRoot));
3901
+ await context.repo.flush();
3902
+ return {
3903
+ newRoot: newRoot.url
3904
+ };
3905
+ }
3906
+ case CreateEpochRequest.Migration.REPLACE_AUTOMERGE_ROOT: {
3907
+ invariant12(context.newAutomergeRoot, void 0, {
3908
+ F: __dxlog_file16,
3909
+ L: 124,
3910
+ S: void 0,
3911
+ A: [
3912
+ "context.newAutomergeRoot",
3913
+ ""
3914
+ ]
3915
+ });
3916
+ await context.repo.flush();
3917
+ return {
3918
+ newRoot: context.newAutomergeRoot
3919
+ };
3920
+ }
3921
+ }
3922
+ return {};
3923
+ };
3924
+
3740
3925
  // packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts
3741
- import { DeferredTask, Event as Event5, scheduleTask as scheduleTask4, sleep, TimeoutError as TimeoutError3, Trigger as Trigger6 } from "@dxos/async";
3926
+ import { DeferredTask, Event as Event5, scheduleTask as scheduleTask4, sleep as sleep2, TimeoutError as TimeoutError3, Trigger as Trigger7 } from "@dxos/async";
3742
3927
  import { Context as Context7, rejectOnDispose } from "@dxos/context";
3743
- import { invariant as invariant12 } from "@dxos/invariant";
3928
+ import { invariant as invariant13 } from "@dxos/invariant";
3744
3929
  import { PublicKey as PublicKey9 } from "@dxos/keys";
3745
- import { log as log12 } from "@dxos/log";
3930
+ import { log as log14 } from "@dxos/log";
3746
3931
  import { schema as schema4 } from "@dxos/protocols";
3747
3932
  import { RpcExtension as RpcExtension3 } from "@dxos/teleport";
3748
3933
  import { ComplexMap as ComplexMap2, ComplexSet as ComplexSet4, entry } from "@dxos/util";
3749
- var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
3934
+ var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
3750
3935
  var DEFAULT_RETRY_TIMEOUT = 1e3;
3751
3936
  var DEFAULT_SUCCESS_DELAY = 1e3;
3752
3937
  var DEFAULT_NOTARIZE_TIMEOUT = 1e4;
3753
3938
  var WRITER_NOT_SET_ERROR_CODE = "WRITER_NOT_SET";
3754
3939
  var NotarizationPlugin = class {
3755
3940
  constructor() {
3756
- this._ctx = new Context7();
3941
+ this._ctx = new Context7(void 0, {
3942
+ F: __dxlog_file17,
3943
+ L: 62
3944
+ });
3757
3945
  this._extensionOpened = new Event5();
3758
3946
  this._extensions = /* @__PURE__ */ new Set();
3759
3947
  this._processedCredentials = new ComplexSet4(PublicKey9.hash);
@@ -3771,16 +3959,16 @@ var NotarizationPlugin = class {
3771
3959
  * Request credentials to be notarized.
3772
3960
  */
3773
3961
  async notarize({ ctx: opCtx, credentials, timeout = DEFAULT_NOTARIZE_TIMEOUT, retryTimeout = DEFAULT_RETRY_TIMEOUT, successDelay = DEFAULT_SUCCESS_DELAY }) {
3774
- log12("notarize", {
3962
+ log14("notarize", {
3775
3963
  credentials
3776
3964
  }, {
3777
- F: __dxlog_file15,
3965
+ F: __dxlog_file17,
3778
3966
  L: 90,
3779
3967
  S: this,
3780
3968
  C: (f, a) => f(...a)
3781
3969
  });
3782
- invariant12(credentials.every((credential) => credential.id), "Credentials must have an id", {
3783
- F: __dxlog_file15,
3970
+ invariant13(credentials.every((credential) => credential.id), "Credentials must have an id", {
3971
+ F: __dxlog_file17,
3784
3972
  L: 91,
3785
3973
  S: this,
3786
3974
  A: [
@@ -3788,13 +3976,13 @@ var NotarizationPlugin = class {
3788
3976
  "'Credentials must have an id'"
3789
3977
  ]
3790
3978
  });
3791
- const errors = new Trigger6();
3979
+ const errors = new Trigger7();
3792
3980
  const ctx = this._ctx.derive({
3793
3981
  onError: (err) => {
3794
- log12.warn("Notarization error", {
3982
+ log14.warn("Notarization error", {
3795
3983
  err
3796
3984
  }, {
3797
- F: __dxlog_file15,
3985
+ F: __dxlog_file17,
3798
3986
  L: 99,
3799
3987
  S: this,
3800
3988
  C: (f, a) => f(...a)
@@ -3806,11 +3994,11 @@ var NotarizationPlugin = class {
3806
3994
  opCtx?.onDispose(() => ctx.dispose());
3807
3995
  if (timeout !== 0) {
3808
3996
  scheduleTask4(ctx, () => {
3809
- log12.warn("Notarization timeout", {
3997
+ log14.warn("Notarization timeout", {
3810
3998
  timeout,
3811
3999
  peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)
3812
4000
  }, {
3813
- F: __dxlog_file15,
4001
+ F: __dxlog_file17,
3814
4002
  L: 111,
3815
4003
  S: this,
3816
4004
  C: (f, a) => f(...a)
@@ -3830,10 +4018,10 @@ var NotarizationPlugin = class {
3830
4018
  ...this._extensions
3831
4019
  ].find((peer2) => !peersTried.has(peer2));
3832
4020
  if (!peer) {
3833
- log12.info("Exhausted all peers to notarize with", {
4021
+ log14.info("Exhausted all peers to notarize with", {
3834
4022
  retryIn: retryTimeout
3835
4023
  }, {
3836
- F: __dxlog_file15,
4024
+ F: __dxlog_file17,
3837
4025
  L: 136,
3838
4026
  S: this,
3839
4027
  C: (f, a) => f(...a)
@@ -3843,11 +4031,11 @@ var NotarizationPlugin = class {
3843
4031
  return;
3844
4032
  }
3845
4033
  peersTried.add(peer);
3846
- log12("try notarizing", {
4034
+ log14("try notarizing", {
3847
4035
  peer: peer.localPeerId,
3848
4036
  credentialId: credentials.map((credential) => credential.id)
3849
4037
  }, {
3850
- F: __dxlog_file15,
4038
+ F: __dxlog_file17,
3851
4039
  L: 143,
3852
4040
  S: this,
3853
4041
  C: (f, a) => f(...a)
@@ -3855,17 +4043,17 @@ var NotarizationPlugin = class {
3855
4043
  await peer.rpc.NotarizationService.notarize({
3856
4044
  credentials: credentials.filter((credential) => !this._processedCredentials.has(credential.id))
3857
4045
  });
3858
- log12("success", void 0, {
3859
- F: __dxlog_file15,
4046
+ log14("success", void 0, {
4047
+ F: __dxlog_file17,
3860
4048
  L: 147,
3861
4049
  S: this,
3862
4050
  C: (f, a) => f(...a)
3863
4051
  });
3864
- await sleep(successDelay);
4052
+ await sleep2(successDelay);
3865
4053
  } catch (err) {
3866
4054
  if (!ctx.disposed && !err.message.includes(WRITER_NOT_SET_ERROR_CODE)) {
3867
- log12.info("error notarizing (recoverable)", err, {
3868
- F: __dxlog_file15,
4055
+ log14.info("error notarizing (recoverable)", err, {
4056
+ F: __dxlog_file17,
3869
4057
  L: 151,
3870
4058
  S: this,
3871
4059
  C: (f, a) => f(...a)
@@ -3882,8 +4070,8 @@ var NotarizationPlugin = class {
3882
4070
  allNotarized,
3883
4071
  errors.wait()
3884
4072
  ]);
3885
- log12("done", void 0, {
3886
- F: __dxlog_file15,
4073
+ log14("done", void 0, {
4074
+ F: __dxlog_file17,
3887
4075
  L: 162,
3888
4076
  S: this,
3889
4077
  C: (f, a) => f(...a)
@@ -3904,8 +4092,8 @@ var NotarizationPlugin = class {
3904
4092
  this._processCredentialsTriggers.delete(credential.id);
3905
4093
  }
3906
4094
  setWriter(writer) {
3907
- invariant12(!this._writer, "Writer already set.", {
3908
- F: __dxlog_file15,
4095
+ invariant13(!this._writer, "Writer already set.", {
4096
+ F: __dxlog_file17,
3909
4097
  L: 181,
3910
4098
  S: this,
3911
4099
  A: [
@@ -3919,7 +4107,7 @@ var NotarizationPlugin = class {
3919
4107
  if (this._processedCredentials.has(id)) {
3920
4108
  return;
3921
4109
  }
3922
- await entry(this._processCredentialsTriggers, id).orInsert(new Trigger6()).value.wait();
4110
+ await entry(this._processCredentialsTriggers, id).orInsert(new Trigger7()).value.wait();
3923
4111
  }
3924
4112
  /**
3925
4113
  * Requests from other peers to notarize credentials.
@@ -3929,8 +4117,8 @@ var NotarizationPlugin = class {
3929
4117
  throw new Error(WRITER_NOT_SET_ERROR_CODE);
3930
4118
  }
3931
4119
  for (const credential of request.credentials ?? []) {
3932
- invariant12(credential.id, "Credential must have an id", {
3933
- F: __dxlog_file15,
4120
+ invariant13(credential.id, "Credential must have an id", {
4121
+ F: __dxlog_file17,
3934
4122
  L: 200,
3935
4123
  S: this,
3936
4124
  A: [
@@ -3947,10 +4135,10 @@ var NotarizationPlugin = class {
3947
4135
  createExtension() {
3948
4136
  const extension = new NotarizationTeleportExtension({
3949
4137
  onOpen: async () => {
3950
- log12("extension opened", {
4138
+ log14("extension opened", {
3951
4139
  peer: extension.localPeerId
3952
4140
  }, {
3953
- F: __dxlog_file15,
4141
+ F: __dxlog_file17,
3954
4142
  L: 211,
3955
4143
  S: this,
3956
4144
  C: (f, a) => f(...a)
@@ -3959,10 +4147,10 @@ var NotarizationPlugin = class {
3959
4147
  this._extensionOpened.emit();
3960
4148
  },
3961
4149
  onClose: async () => {
3962
- log12("extension closed", {
4150
+ log14("extension closed", {
3963
4151
  peer: extension.localPeerId
3964
4152
  }, {
3965
- F: __dxlog_file15,
4153
+ F: __dxlog_file17,
3966
4154
  L: 216,
3967
4155
  S: this,
3968
4156
  C: (f, a) => f(...a)
@@ -4016,15 +4204,83 @@ function _ts_decorate4(decorators, target, key, desc) {
4016
4204
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
4017
4205
  return c > 3 && r && Object.defineProperty(target, key, r), r;
4018
4206
  }
4019
- var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
4207
+ function _using_ctx() {
4208
+ var _disposeSuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed) {
4209
+ var err = new Error();
4210
+ err.name = "SuppressedError";
4211
+ err.suppressed = suppressed;
4212
+ err.error = error;
4213
+ return err;
4214
+ }, empty = {}, stack = [];
4215
+ function using(isAwait, value) {
4216
+ if (value != null) {
4217
+ if (Object(value) !== value) {
4218
+ throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");
4219
+ }
4220
+ if (isAwait) {
4221
+ var dispose = value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")];
4222
+ }
4223
+ if (dispose == null) {
4224
+ dispose = value[Symbol.dispose || Symbol.for("Symbol.dispose")];
4225
+ }
4226
+ if (typeof dispose !== "function") {
4227
+ throw new TypeError(`Property [Symbol.dispose] is not a function.`);
4228
+ }
4229
+ stack.push({
4230
+ v: value,
4231
+ d: dispose,
4232
+ a: isAwait
4233
+ });
4234
+ } else if (isAwait) {
4235
+ stack.push({
4236
+ d: value,
4237
+ a: isAwait
4238
+ });
4239
+ }
4240
+ return value;
4241
+ }
4242
+ return {
4243
+ e: empty,
4244
+ u: using.bind(null, false),
4245
+ a: using.bind(null, true),
4246
+ d: function() {
4247
+ var error = this.e;
4248
+ function next() {
4249
+ while (resource = stack.pop()) {
4250
+ try {
4251
+ var resource, disposalResult = resource.d && resource.d.call(resource.v);
4252
+ if (resource.a) {
4253
+ return Promise.resolve(disposalResult).then(next, err);
4254
+ }
4255
+ } catch (e) {
4256
+ return err(e);
4257
+ }
4258
+ }
4259
+ if (error !== empty)
4260
+ throw error;
4261
+ }
4262
+ function err(e) {
4263
+ error = error !== empty ? new _disposeSuppressedError(error, e) : e;
4264
+ return next();
4265
+ }
4266
+ return next();
4267
+ }
4268
+ };
4269
+ }
4270
+ var __dxlog_file18 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
4020
4271
  var DataSpace = class {
4021
4272
  constructor(params) {
4022
- this._ctx = new Context8();
4273
+ this._ctx = new Context8(void 0, {
4274
+ F: __dxlog_file18,
4275
+ L: 84
4276
+ });
4023
4277
  this._notarizationPlugin = new NotarizationPlugin();
4024
4278
  this._cache = void 0;
4025
4279
  // TODO(dmaretskyi): Move into Space?
4026
4280
  this._automergeSpaceState = new AutomergeSpaceState((rootUrl) => this._onNewAutomergeRoot(rootUrl));
4281
+ this._epochProcessingMutex = new Mutex2();
4027
4282
  this._state = SpaceState2.CLOSED;
4283
+ this._databaseRoot = null;
4028
4284
  /**
4029
4285
  * Error for _state === SpaceState.ERROR.
4030
4286
  */
@@ -4048,11 +4304,11 @@ var DataSpace = class {
4048
4304
  });
4049
4305
  this._cache = params.cache;
4050
4306
  this._state = params.initialState;
4051
- log13("new state", {
4307
+ log15("new state", {
4052
4308
  state: SpaceState2[this._state]
4053
4309
  }, {
4054
- F: __dxlog_file16,
4055
- L: 143,
4310
+ F: __dxlog_file18,
4311
+ L: 146,
4056
4312
  S: this,
4057
4313
  C: (f, a) => f(...a)
4058
4314
  });
@@ -4085,6 +4341,9 @@ var DataSpace = class {
4085
4341
  get automergeSpaceState() {
4086
4342
  return this._automergeSpaceState;
4087
4343
  }
4344
+ get databaseRoot() {
4345
+ return this._databaseRoot;
4346
+ }
4088
4347
  get _automergeInfo() {
4089
4348
  return {
4090
4349
  rootUrl: this._automergeSpaceState.rootUrl,
@@ -4101,14 +4360,18 @@ var DataSpace = class {
4101
4360
  await this._gossip.open();
4102
4361
  await this._notarizationPlugin.open();
4103
4362
  await this._inner.spaceState.addCredentialProcessor(this._notarizationPlugin);
4363
+ await this._automergeSpaceState.open();
4104
4364
  await this._inner.spaceState.addCredentialProcessor(this._automergeSpaceState);
4105
- await this._inner.open(new Context8());
4365
+ await this._inner.open(new Context8(void 0, {
4366
+ F: __dxlog_file18,
4367
+ L: 215
4368
+ }));
4106
4369
  this._state = SpaceState2.CONTROL_ONLY;
4107
- log13("new state", {
4370
+ log15("new state", {
4108
4371
  state: SpaceState2[this._state]
4109
4372
  }, {
4110
- F: __dxlog_file16,
4111
- L: 209,
4373
+ F: __dxlog_file18,
4374
+ L: 217,
4112
4375
  S: this,
4113
4376
  C: (f, a) => f(...a)
4114
4377
  });
@@ -4122,19 +4385,23 @@ var DataSpace = class {
4122
4385
  async _close() {
4123
4386
  await this._callbacks.beforeClose?.();
4124
4387
  this._state = SpaceState2.CLOSED;
4125
- log13("new state", {
4388
+ log15("new state", {
4126
4389
  state: SpaceState2[this._state]
4127
4390
  }, {
4128
- F: __dxlog_file16,
4129
- L: 223,
4391
+ F: __dxlog_file18,
4392
+ L: 231,
4130
4393
  S: this,
4131
4394
  C: (f, a) => f(...a)
4132
4395
  });
4133
4396
  await this._ctx.dispose();
4134
- this._ctx = new Context8();
4397
+ this._ctx = new Context8(void 0, {
4398
+ F: __dxlog_file18,
4399
+ L: 233
4400
+ });
4135
4401
  await this.authVerifier.close();
4136
4402
  await this._inner.close();
4137
4403
  await this._inner.spaceState.removeCredentialProcessor(this._automergeSpaceState);
4404
+ await this._automergeSpaceState.close();
4138
4405
  await this._inner.spaceState.removeCredentialProcessor(this._notarizationPlugin);
4139
4406
  await this._notarizationPlugin.close();
4140
4407
  await this._presence.close();
@@ -4156,26 +4423,26 @@ var DataSpace = class {
4156
4423
  await this.initializeDataPipeline();
4157
4424
  } catch (err) {
4158
4425
  if (err instanceof CancelledError || err instanceof ContextDisposedError3) {
4159
- log13("data pipeline initialization cancelled", err, {
4160
- F: __dxlog_file16,
4161
- L: 256,
4426
+ log15("data pipeline initialization cancelled", err, {
4427
+ F: __dxlog_file18,
4428
+ L: 265,
4162
4429
  S: this,
4163
4430
  C: (f, a) => f(...a)
4164
4431
  });
4165
4432
  return;
4166
4433
  }
4167
- log13.error("Error initializing data pipeline", err, {
4168
- F: __dxlog_file16,
4169
- L: 260,
4434
+ log15.error("Error initializing data pipeline", err, {
4435
+ F: __dxlog_file18,
4436
+ L: 269,
4170
4437
  S: this,
4171
4438
  C: (f, a) => f(...a)
4172
4439
  });
4173
4440
  this._state = SpaceState2.ERROR;
4174
- log13("new state", {
4441
+ log15("new state", {
4175
4442
  state: SpaceState2[this._state]
4176
4443
  }, {
4177
- F: __dxlog_file16,
4178
- L: 262,
4444
+ F: __dxlog_file18,
4445
+ L: 271,
4179
4446
  S: this,
4180
4447
  C: (f, a) => f(...a)
4181
4448
  });
@@ -4191,31 +4458,28 @@ var DataSpace = class {
4191
4458
  throw new SystemError("Invalid operation");
4192
4459
  }
4193
4460
  this._state = SpaceState2.INITIALIZING;
4194
- log13("new state", {
4461
+ log15("new state", {
4195
4462
  state: SpaceState2[this._state]
4196
4463
  }, {
4197
- F: __dxlog_file16,
4198
- L: 278,
4464
+ F: __dxlog_file18,
4465
+ L: 287,
4199
4466
  S: this,
4200
4467
  C: (f, a) => f(...a)
4201
4468
  });
4202
4469
  await this._initializeAndReadControlPipeline();
4203
- await sleep2(1);
4470
+ await sleep3(1);
4471
+ const ready = this.stateUpdate.waitForCondition(() => this._state === SpaceState2.READY);
4204
4472
  this._automergeSpaceState.startProcessingRootDocs();
4205
- await cancelWithContext4(this._ctx, this.automergeSpaceState.ensureEpochInitialized());
4206
- log13("data pipeline ready", void 0, {
4207
- F: __dxlog_file16,
4208
- L: 290,
4209
- S: this,
4210
- C: (f, a) => f(...a)
4211
- });
4473
+ await ready;
4474
+ }
4475
+ async _enterReadyState() {
4212
4476
  await this._callbacks.beforeReady?.();
4213
4477
  this._state = SpaceState2.READY;
4214
- log13("new state", {
4478
+ log15("new state", {
4215
4479
  state: SpaceState2[this._state]
4216
4480
  }, {
4217
- F: __dxlog_file16,
4218
- L: 294,
4481
+ F: __dxlog_file18,
4482
+ L: 306,
4219
4483
  S: this,
4220
4484
  C: (f, a) => f(...a)
4221
4485
  });
@@ -4229,9 +4493,9 @@ var DataSpace = class {
4229
4493
  });
4230
4494
  this.metrics.controlPipelineReady = /* @__PURE__ */ new Date();
4231
4495
  await this._createWritableFeeds();
4232
- log13("writable feeds created", void 0, {
4233
- F: __dxlog_file16,
4234
- L: 310,
4496
+ log15("writable feeds created", void 0, {
4497
+ F: __dxlog_file18,
4498
+ L: 322,
4235
4499
  S: this,
4236
4500
  C: (f, a) => f(...a)
4237
4501
  });
@@ -4289,57 +4553,66 @@ var DataSpace = class {
4289
4553
  }
4290
4554
  }
4291
4555
  _onNewAutomergeRoot(rootUrl) {
4292
- log13("loading automerge root doc for space", {
4556
+ log15("loading automerge root doc for space", {
4293
4557
  space: this.key,
4294
4558
  rootUrl
4295
4559
  }, {
4296
- F: __dxlog_file16,
4297
- L: 376,
4560
+ F: __dxlog_file18,
4561
+ L: 388,
4298
4562
  S: this,
4299
4563
  C: (f, a) => f(...a)
4300
4564
  });
4301
- this._echoHost.replicateDocument(rootUrl);
4302
4565
  const handle = this._echoHost.automergeRepo.find(rootUrl);
4303
4566
  queueMicrotask(async () => {
4304
4567
  try {
4305
- await warnAfterTimeout(5e3, "Automerge root doc load timeout (DataSpace)", async () => {
4306
- await cancelWithContext4(this._ctx, handle.whenReady());
4307
- });
4308
- if (this._ctx.disposed) {
4309
- return;
4310
- }
4311
- const doc = handle.docSync() ?? failedInvariant();
4312
- if (!doc.access?.spaceKey) {
4313
- handle.change((doc2) => {
4314
- doc2.access = {
4315
- spaceKey: this.key.toHex()
4316
- };
4317
- });
4318
- }
4319
- if (!this._echoHost.roots.has(handle.documentId)) {
4320
- await this._echoHost.openSpaceRoot(handle.url);
4321
- } else {
4322
- log13.warn("echo database root already exists", {
4323
- space: this.key,
4324
- rootUrl
4325
- }, {
4326
- F: __dxlog_file16,
4327
- L: 403,
4328
- S: this,
4329
- C: (f, a) => f(...a)
4568
+ try {
4569
+ var _usingCtx = _using_ctx();
4570
+ await warnAfterTimeout(5e3, "Automerge root doc load timeout (DataSpace)", async () => {
4571
+ await cancelWithContext5(this._ctx, handle.whenReady());
4330
4572
  });
4573
+ if (this._ctx.disposed) {
4574
+ return;
4575
+ }
4576
+ const _guard = (
4577
+ // Ensure only one root is processed at a time.
4578
+ _usingCtx.u(await this._epochProcessingMutex.acquire())
4579
+ );
4580
+ const doc = handle.docSync() ?? failedInvariant();
4581
+ if (!doc.access?.spaceKey) {
4582
+ handle.change((doc2) => {
4583
+ doc2.access = {
4584
+ spaceKey: this.key.toHex()
4585
+ };
4586
+ });
4587
+ }
4588
+ const root = await this._echoHost.openSpaceRoot(handle.url);
4589
+ this._databaseRoot = root;
4590
+ if (root.getVersion() !== SpaceDocVersion.CURRENT) {
4591
+ if (this._state !== SpaceState2.REQUIRES_MIGRATION) {
4592
+ this._state = SpaceState2.REQUIRES_MIGRATION;
4593
+ this.stateUpdate.emit();
4594
+ }
4595
+ } else {
4596
+ if (this._state !== SpaceState2.READY) {
4597
+ await this._enterReadyState();
4598
+ }
4599
+ }
4600
+ } catch (_) {
4601
+ _usingCtx.e = _;
4602
+ } finally {
4603
+ _usingCtx.d();
4331
4604
  }
4332
4605
  } catch (err) {
4333
4606
  if (err instanceof ContextDisposedError3) {
4334
4607
  return;
4335
4608
  }
4336
- log13.warn("error loading automerge root doc", {
4609
+ log15.warn("error loading automerge root doc", {
4337
4610
  space: this.key,
4338
4611
  rootUrl,
4339
4612
  err
4340
4613
  }, {
4341
- F: __dxlog_file16,
4342
- L: 409,
4614
+ F: __dxlog_file18,
4615
+ L: 431,
4343
4616
  S: this,
4344
4617
  C: (f, a) => f(...a)
4345
4618
  });
@@ -4362,148 +4635,34 @@ var DataSpace = class {
4362
4635
  });
4363
4636
  }
4364
4637
  async createEpoch(options) {
4365
- let epoch;
4366
- switch (options?.migration) {
4367
- case void 0:
4368
- case CreateEpochRequest.Migration.NONE:
4369
- {
4370
- epoch = {
4371
- previousId: this._automergeSpaceState.lastEpoch?.id,
4372
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4373
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe3(),
4374
- automergeRoot: this._automergeSpaceState.lastEpoch?.subject.assertion?.automergeRoot
4375
- };
4376
- }
4377
- break;
4378
- case CreateEpochRequest.Migration.INIT_AUTOMERGE:
4379
- {
4380
- const document = this._echoHost.automergeRepo.create();
4381
- epoch = {
4382
- previousId: this._automergeSpaceState.lastEpoch?.id,
4383
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4384
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe3(),
4385
- automergeRoot: document.url
4386
- };
4387
- }
4388
- break;
4389
- case CreateEpochRequest.Migration.PRUNE_AUTOMERGE_ROOT_HISTORY:
4390
- {
4391
- const currentRootUrl = this._automergeSpaceState.rootUrl;
4392
- const rootHandle = this._echoHost.automergeRepo.find(currentRootUrl);
4393
- await cancelWithContext4(this._ctx, asyncTimeout2(rootHandle.whenReady(), 1e4));
4394
- const newRoot = this._echoHost.automergeRepo.create(rootHandle.docSync());
4395
- await this._echoHost.automergeRepo.flush([
4396
- newRoot.documentId
4397
- ]);
4398
- invariant13(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
4399
- F: __dxlog_file16,
4400
- L: 460,
4401
- S: this,
4402
- A: [
4403
- "typeof newRoot.url === 'string' && newRoot.url.length > 0",
4404
- ""
4405
- ]
4406
- });
4407
- epoch = {
4408
- previousId: this._automergeSpaceState.lastEpoch?.id,
4409
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4410
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe3(),
4411
- automergeRoot: newRoot.url
4412
- };
4413
- }
4414
- break;
4415
- case CreateEpochRequest.Migration.FRAGMENT_AUTOMERGE_ROOT:
4416
- {
4417
- log13.info("Fragmenting", void 0, {
4418
- F: __dxlog_file16,
4419
- L: 472,
4420
- S: this,
4421
- C: (f, a) => f(...a)
4422
- });
4423
- const currentRootUrl = this._automergeSpaceState.rootUrl;
4424
- const rootHandle = this._echoHost.automergeRepo.find(currentRootUrl);
4425
- await cancelWithContext4(this._ctx, asyncTimeout2(rootHandle.whenReady(), 1e4));
4426
- const objects = Object.entries(rootHandle.docSync().objects);
4427
- const properties = findPropertiesObject(rootHandle.docSync());
4428
- const otherObjects = objects.filter(([key]) => key !== properties?.[0]);
4429
- invariant13(properties, "Properties not found", {
4430
- F: __dxlog_file16,
4431
- L: 482,
4432
- S: this,
4433
- A: [
4434
- "properties",
4435
- "'Properties not found'"
4436
- ]
4437
- });
4438
- const newSpaceDoc = {
4439
- ...rootHandle.docSync(),
4440
- objects: Object.fromEntries([
4441
- properties
4442
- ])
4443
- };
4444
- const newRoot = this._echoHost.automergeRepo.create(newSpaceDoc);
4445
- invariant13(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
4446
- F: __dxlog_file16,
4447
- L: 487,
4448
- S: this,
4449
- A: [
4450
- "typeof newRoot.url === 'string' && newRoot.url.length > 0",
4451
- ""
4452
- ]
4453
- });
4454
- const docLoader = new AutomergeDocumentLoaderImpl(await createIdFromSpaceKey(this.key), this._echoHost.automergeRepo, this.key);
4455
- await docLoader.loadSpaceRootDocHandle(this._ctx, {
4456
- rootUrl: newRoot.url
4457
- });
4458
- otherObjects.forEach(([key, value]) => {
4459
- const handle = docLoader.createDocumentForObject(key);
4460
- handle.change((doc) => {
4461
- assignDeep(doc, [
4462
- "objects",
4463
- key
4464
- ], value);
4465
- });
4466
- });
4467
- epoch = {
4468
- previousId: this._automergeSpaceState.lastEpoch?.id,
4469
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4470
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe3(),
4471
- automergeRoot: newRoot.url
4472
- };
4473
- }
4474
- break;
4475
- case CreateEpochRequest.Migration.REPLACE_AUTOMERGE_ROOT:
4476
- {
4477
- invariant13(options.newAutomergeRoot, void 0, {
4478
- F: __dxlog_file16,
4479
- L: 517,
4480
- S: this,
4481
- A: [
4482
- "options.newAutomergeRoot",
4483
- ""
4484
- ]
4485
- });
4486
- epoch = {
4487
- previousId: this._automergeSpaceState.lastEpoch?.id,
4488
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4489
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe3(),
4490
- automergeRoot: options.newAutomergeRoot
4491
- };
4492
- }
4493
- break;
4494
- }
4495
- if (!epoch) {
4496
- return;
4638
+ const ctx = this._ctx.derive();
4639
+ if (!options?.migration) {
4640
+ return null;
4497
4641
  }
4642
+ const { newRoot } = await runEpochMigration(ctx, {
4643
+ repo: this._echoHost.automergeRepo,
4644
+ spaceId: this.id,
4645
+ spaceKey: this.key,
4646
+ migration: options.migration,
4647
+ currentRoot: this._automergeSpaceState.rootUrl ?? null,
4648
+ newAutomergeRoot: options.newAutomergeRoot
4649
+ });
4650
+ const epoch = {
4651
+ previousId: this._automergeSpaceState.lastEpoch?.id,
4652
+ number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4653
+ timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe3(),
4654
+ automergeRoot: newRoot ?? this._automergeSpaceState.rootUrl
4655
+ };
4656
+ const credential = await this._signingContext.credentialSigner.createCredential({
4657
+ subject: this.key,
4658
+ assertion: {
4659
+ "@type": "dxos.halo.credentials.Epoch",
4660
+ ...epoch
4661
+ }
4662
+ });
4498
4663
  const receipt = await this.inner.controlPipeline.writer.write({
4499
4664
  credential: {
4500
- credential: await this._signingContext.credentialSigner.createCredential({
4501
- subject: this.key,
4502
- assertion: {
4503
- "@type": "dxos.halo.credentials.Epoch",
4504
- ...epoch
4505
- }
4506
- })
4665
+ credential
4507
4666
  }
4508
4667
  });
4509
4668
  await this.inner.controlPipeline.state.waitUntilTimeframe(new Timeframe3([
@@ -4513,6 +4672,7 @@ var DataSpace = class {
4513
4672
  ]
4514
4673
  ]));
4515
4674
  await this._echoHost.updateIndexes();
4675
+ return credential;
4516
4676
  }
4517
4677
  async activate() {
4518
4678
  if (![
@@ -4534,11 +4694,11 @@ var DataSpace = class {
4534
4694
  await this._close();
4535
4695
  }
4536
4696
  this._state = SpaceState2.INACTIVE;
4537
- log13("new state", {
4697
+ log15("new state", {
4538
4698
  state: SpaceState2[this._state]
4539
4699
  }, {
4540
- F: __dxlog_file16,
4541
- L: 571,
4700
+ F: __dxlog_file18,
4701
+ L: 512,
4542
4702
  S: this,
4543
4703
  C: (f, a) => f(...a)
4544
4704
  });
@@ -4593,36 +4753,27 @@ DataSpace = _ts_decorate4([
4593
4753
  trackLeaks("open", "close"),
4594
4754
  trace6.resource()
4595
4755
  ], DataSpace);
4596
- var findPropertiesObject = (spaceDoc) => {
4597
- for (const id in spaceDoc.objects ?? {}) {
4598
- const obj = spaceDoc.objects[id];
4599
- if (obj.system.type?.itemId === TYPE_PROPERTIES) {
4600
- return [
4601
- id,
4602
- obj
4603
- ];
4604
- }
4605
- }
4606
- return void 0;
4607
- };
4608
4756
 
4609
4757
  // packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts
4610
4758
  import { Event as Event7, synchronized as synchronized2, trackLeaks as trackLeaks2 } from "@dxos/async";
4611
4759
  import { PropertiesType } from "@dxos/client-protocol";
4612
- import { cancelWithContext as cancelWithContext5, Context as Context9 } from "@dxos/context";
4613
- import { getCredentialAssertion as getCredentialAssertion3 } from "@dxos/credentials";
4760
+ import { Context as Context9, cancelWithContext as cancelWithContext6 } from "@dxos/context";
4761
+ import { getCredentialAssertion as getCredentialAssertion3, createAdmissionCredentials } from "@dxos/credentials";
4762
+ import { convertLegacyReferences as convertLegacyReferences2, findInlineObjectOfType as findInlineObjectOfType2 } from "@dxos/echo-db";
4614
4763
  import { AuthStatus } from "@dxos/echo-pipeline";
4615
- import { encodeReference } from "@dxos/echo-protocol";
4616
- import { getTypeReference } from "@dxos/echo-schema";
4764
+ import { CredentialServerExtension } from "@dxos/echo-pipeline";
4765
+ import { LEGACY_TYPE_PROPERTIES, SpaceDocVersion as SpaceDocVersion2, encodeReference } from "@dxos/echo-protocol";
4766
+ import { TYPE_PROPERTIES as TYPE_PROPERTIES2, generateEchoId, getTypeReference } from "@dxos/echo-schema";
4767
+ import { writeMessages as writeMessages3 } from "@dxos/feed-store";
4617
4768
  import { invariant as invariant14 } from "@dxos/invariant";
4618
4769
  import { PublicKey as PublicKey11 } from "@dxos/keys";
4619
- import { log as log14 } from "@dxos/log";
4620
- import { trace as Trace2 } from "@dxos/protocols";
4770
+ import { log as log16 } from "@dxos/log";
4771
+ import { trace as Trace2, AlreadyJoinedError as AlreadyJoinedError3 } from "@dxos/protocols";
4621
4772
  import { Invitation as Invitation7, SpaceState as SpaceState3 } from "@dxos/protocols/proto/dxos/client/services";
4622
4773
  import { SpaceMember as SpaceMember6 } from "@dxos/protocols/proto/dxos/halo/credentials";
4623
4774
  import { Gossip as Gossip2, Presence as Presence2 } from "@dxos/teleport-extension-gossip";
4624
4775
  import { trace as trace7 } from "@dxos/tracing";
4625
- import { assignDeep as assignDeep2, ComplexMap as ComplexMap3, deferFunction as deferFunction2, forEachAsync } from "@dxos/util";
4776
+ import { ComplexMap as ComplexMap3, assignDeep as assignDeep2, deferFunction as deferFunction2, forEachAsync } from "@dxos/util";
4626
4777
 
4627
4778
  // packages/sdk/client-services/src/packlets/spaces/genesis.ts
4628
4779
  import { createCredential } from "@dxos/credentials";
@@ -4705,7 +4856,7 @@ function _ts_decorate5(decorators, target, key, desc) {
4705
4856
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
4706
4857
  return c > 3 && r && Object.defineProperty(target, key, r), r;
4707
4858
  }
4708
- var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
4859
+ var __dxlog_file19 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
4709
4860
  var PRESENCE_ANNOUNCE_INTERVAL = 1e4;
4710
4861
  var PRESENCE_OFFLINE_TIMEOUT = 2e4;
4711
4862
  var DEFAULT_SPACE_KEY = "__DEFAULT__";
@@ -4719,7 +4870,10 @@ var DataSpaceManager = class {
4719
4870
  this._echoHost = _echoHost;
4720
4871
  this._invitationsManager = _invitationsManager;
4721
4872
  this._params = _params;
4722
- this._ctx = new Context9();
4873
+ this._ctx = new Context9(void 0, {
4874
+ F: __dxlog_file19,
4875
+ L: 104
4876
+ });
4723
4877
  this.updated = new Event7();
4724
4878
  this._spaces = new ComplexMap3(PublicKey11.hash);
4725
4879
  this._isOpen = false;
@@ -4732,7 +4886,7 @@ var DataSpaceManager = class {
4732
4886
  const rootUrl = space.automergeSpaceState.rootUrl;
4733
4887
  const rootHandle = rootUrl ? this._echoHost.automergeRepo.find(rootUrl) : void 0;
4734
4888
  const rootDoc = rootHandle?.docSync();
4735
- const properties = rootDoc && findPropertiesObject(rootDoc);
4889
+ const properties = rootDoc && findInlineObjectOfType2(rootDoc, TYPE_PROPERTIES2);
4736
4890
  return {
4737
4891
  key: space.key.toHex(),
4738
4892
  state: SpaceState3[space.state],
@@ -4752,46 +4906,46 @@ var DataSpaceManager = class {
4752
4906
  return this._spaces;
4753
4907
  }
4754
4908
  async open() {
4755
- log14("open", void 0, {
4756
- F: __dxlog_file17,
4757
- L: 140,
4909
+ log16("open", void 0, {
4910
+ F: __dxlog_file19,
4911
+ L: 156,
4758
4912
  S: this,
4759
4913
  C: (f, a) => f(...a)
4760
4914
  });
4761
- log14.trace("dxos.echo.data-space-manager.open", Trace2.begin({
4915
+ log16.trace("dxos.echo.data-space-manager.open", Trace2.begin({
4762
4916
  id: this._instanceId
4763
4917
  }), {
4764
- F: __dxlog_file17,
4765
- L: 141,
4918
+ F: __dxlog_file19,
4919
+ L: 157,
4766
4920
  S: this,
4767
4921
  C: (f, a) => f(...a)
4768
4922
  });
4769
- log14("metadata loaded", {
4923
+ log16("metadata loaded", {
4770
4924
  spaces: this._metadataStore.spaces.length
4771
4925
  }, {
4772
- F: __dxlog_file17,
4773
- L: 142,
4926
+ F: __dxlog_file19,
4927
+ L: 158,
4774
4928
  S: this,
4775
4929
  C: (f, a) => f(...a)
4776
4930
  });
4777
4931
  await forEachAsync(this._metadataStore.spaces, async (spaceMetadata) => {
4778
4932
  try {
4779
- log14("load space", {
4933
+ log16("load space", {
4780
4934
  spaceMetadata
4781
4935
  }, {
4782
- F: __dxlog_file17,
4783
- L: 146,
4936
+ F: __dxlog_file19,
4937
+ L: 162,
4784
4938
  S: this,
4785
4939
  C: (f, a) => f(...a)
4786
4940
  });
4787
4941
  await this._constructSpace(spaceMetadata);
4788
4942
  } catch (err) {
4789
- log14.error("Error loading space", {
4943
+ log16.error("Error loading space", {
4790
4944
  spaceMetadata,
4791
4945
  err
4792
4946
  }, {
4793
- F: __dxlog_file17,
4794
- L: 149,
4947
+ F: __dxlog_file19,
4948
+ L: 165,
4795
4949
  S: this,
4796
4950
  C: (f, a) => f(...a)
4797
4951
  });
@@ -4799,19 +4953,19 @@ var DataSpaceManager = class {
4799
4953
  });
4800
4954
  this._isOpen = true;
4801
4955
  this.updated.emit();
4802
- log14.trace("dxos.echo.data-space-manager.open", Trace2.end({
4956
+ log16.trace("dxos.echo.data-space-manager.open", Trace2.end({
4803
4957
  id: this._instanceId
4804
4958
  }), {
4805
- F: __dxlog_file17,
4806
- L: 156,
4959
+ F: __dxlog_file19,
4960
+ L: 172,
4807
4961
  S: this,
4808
4962
  C: (f, a) => f(...a)
4809
4963
  });
4810
4964
  }
4811
4965
  async close() {
4812
- log14("close", void 0, {
4813
- F: __dxlog_file17,
4814
- L: 161,
4966
+ log16("close", void 0, {
4967
+ F: __dxlog_file19,
4968
+ L: 177,
4815
4969
  S: this,
4816
4970
  C: (f, a) => f(...a)
4817
4971
  });
@@ -4827,8 +4981,8 @@ var DataSpaceManager = class {
4827
4981
  */
4828
4982
  async createSpace() {
4829
4983
  invariant14(this._isOpen, "Not open.", {
4830
- F: __dxlog_file17,
4831
- L: 175,
4984
+ F: __dxlog_file19,
4985
+ L: 191,
4832
4986
  S: this,
4833
4987
  A: [
4834
4988
  "this._isOpen",
@@ -4845,11 +4999,11 @@ var DataSpaceManager = class {
4845
4999
  dataFeedKey,
4846
5000
  state: SpaceState3.ACTIVE
4847
5001
  };
4848
- log14("creating space...", {
5002
+ log16("creating space...", {
4849
5003
  spaceKey
4850
5004
  }, {
4851
- F: __dxlog_file17,
4852
- L: 187,
5005
+ F: __dxlog_file19,
5006
+ L: 203,
4853
5007
  S: this,
4854
5008
  C: (f, a) => f(...a)
4855
5009
  });
@@ -4860,8 +5014,8 @@ var DataSpaceManager = class {
4860
5014
  await this._metadataStore.addSpace(metadata);
4861
5015
  const memberCredential = credentials[1];
4862
5016
  invariant14(getCredentialAssertion3(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
4863
- F: __dxlog_file17,
4864
- L: 197,
5017
+ F: __dxlog_file19,
5018
+ L: 213,
4865
5019
  S: this,
4866
5020
  A: [
4867
5021
  "getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -4874,9 +5028,31 @@ var DataSpaceManager = class {
4874
5028
  return space;
4875
5029
  }
4876
5030
  async isDefaultSpace(space) {
4877
- const rootDoc = await this._getSpaceRootDocument(space);
4878
- const [_, properties] = findPropertiesObject(rootDoc.docSync()) ?? [];
4879
- return properties?.data?.[DEFAULT_SPACE_KEY] === this._signingContext.identityKey.toHex();
5031
+ if (!space.databaseRoot) {
5032
+ return false;
5033
+ }
5034
+ switch (space.databaseRoot.getVersion()) {
5035
+ case SpaceDocVersion2.CURRENT: {
5036
+ const [_, properties] = findInlineObjectOfType2(space.databaseRoot.docSync(), TYPE_PROPERTIES2) ?? [];
5037
+ return properties?.data?.[DEFAULT_SPACE_KEY] === this._signingContext.identityKey.toHex();
5038
+ }
5039
+ case SpaceDocVersion2.LEGACY: {
5040
+ const convertedDoc = await convertLegacyReferences2(space.databaseRoot.docSync());
5041
+ const [_, properties] = findInlineObjectOfType2(convertedDoc, LEGACY_TYPE_PROPERTIES) ?? [];
5042
+ return properties?.data?.[DEFAULT_SPACE_KEY] === this._signingContext.identityKey.toHex();
5043
+ }
5044
+ default:
5045
+ log16.warn("unknown space version", {
5046
+ version: space.databaseRoot.getVersion(),
5047
+ spaceId: space.id
5048
+ }, {
5049
+ F: __dxlog_file19,
5050
+ L: 238,
5051
+ S: this,
5052
+ C: (f, a) => f(...a)
5053
+ });
5054
+ return false;
5055
+ }
4880
5056
  }
4881
5057
  async createDefaultSpace() {
4882
5058
  const space = await this.createSpace();
@@ -4892,7 +5068,7 @@ var DataSpaceManager = class {
4892
5068
  keys: []
4893
5069
  }
4894
5070
  };
4895
- const propertiesId = PublicKey11.random().toHex();
5071
+ const propertiesId = generateEchoId();
4896
5072
  document.change((doc) => {
4897
5073
  assignDeep2(doc, [
4898
5074
  "objects",
@@ -4905,8 +5081,8 @@ var DataSpaceManager = class {
4905
5081
  async _getSpaceRootDocument(space) {
4906
5082
  const automergeIndex = space.automergeSpaceState.rootUrl;
4907
5083
  invariant14(automergeIndex, void 0, {
4908
- F: __dxlog_file17,
4909
- L: 240,
5084
+ F: __dxlog_file19,
5085
+ L: 271,
4910
5086
  S: this,
4911
5087
  A: [
4912
5088
  "automergeIndex",
@@ -4919,17 +5095,17 @@ var DataSpaceManager = class {
4919
5095
  }
4920
5096
  // TODO(burdon): Rename join space.
4921
5097
  async acceptSpace(opts) {
4922
- log14("accept space", {
5098
+ log16("accept space", {
4923
5099
  opts
4924
5100
  }, {
4925
- F: __dxlog_file17,
4926
- L: 249,
5101
+ F: __dxlog_file19,
5102
+ L: 280,
4927
5103
  S: this,
4928
5104
  C: (f, a) => f(...a)
4929
5105
  });
4930
5106
  invariant14(this._isOpen, "Not open.", {
4931
- F: __dxlog_file17,
4932
- L: 250,
5107
+ F: __dxlog_file19,
5108
+ L: 281,
4933
5109
  S: this,
4934
5110
  A: [
4935
5111
  "this._isOpen",
@@ -4937,8 +5113,8 @@ var DataSpaceManager = class {
4937
5113
  ]
4938
5114
  });
4939
5115
  invariant14(!this._spaces.has(opts.spaceKey), "Space already exists.", {
4940
- F: __dxlog_file17,
4941
- L: 251,
5116
+ F: __dxlog_file19,
5117
+ L: 282,
4942
5118
  S: this,
4943
5119
  A: [
4944
5120
  "!this._spaces.has(opts.spaceKey)",
@@ -4958,23 +5134,72 @@ var DataSpaceManager = class {
4958
5134
  this.updated.emit();
4959
5135
  return space;
4960
5136
  }
5137
+ async admitMember(options) {
5138
+ const space = this._spaceManager.spaces.get(options.spaceKey);
5139
+ invariant14(space, void 0, {
5140
+ F: __dxlog_file19,
5141
+ L: 302,
5142
+ S: this,
5143
+ A: [
5144
+ "space",
5145
+ ""
5146
+ ]
5147
+ });
5148
+ if (space.spaceState.getMemberRole(options.identityKey) !== SpaceMember6.Role.REMOVED) {
5149
+ throw new AlreadyJoinedError3();
5150
+ }
5151
+ const credentials = await createAdmissionCredentials(this._signingContext.credentialSigner, options.identityKey, space.key, space.genesisFeedKey, options.role, space.spaceState.membershipChainHeads, options.profile, options.delegationCredentialId);
5152
+ invariant14(credentials[0].credential, void 0, {
5153
+ F: __dxlog_file19,
5154
+ L: 321,
5155
+ S: this,
5156
+ A: [
5157
+ "credentials[0].credential",
5158
+ ""
5159
+ ]
5160
+ });
5161
+ const spaceMemberCredential = credentials[0].credential.credential;
5162
+ invariant14(getCredentialAssertion3(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
5163
+ F: __dxlog_file19,
5164
+ L: 323,
5165
+ S: this,
5166
+ A: [
5167
+ "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
5168
+ ""
5169
+ ]
5170
+ });
5171
+ await writeMessages3(space.controlPipeline.writer, credentials);
5172
+ return spaceMemberCredential;
5173
+ }
4961
5174
  /**
4962
5175
  * Wait until the space data pipeline is fully initialized.
4963
5176
  * Used by invitation handler.
4964
5177
  * TODO(dmaretskyi): Consider removing.
4965
5178
  */
4966
5179
  async waitUntilSpaceReady(spaceKey) {
4967
- await cancelWithContext5(this._ctx, this.updated.waitForCondition(() => {
5180
+ await cancelWithContext6(this._ctx, this.updated.waitForCondition(() => {
4968
5181
  const space = this._spaces.get(spaceKey);
4969
5182
  return !!space && space.state === SpaceState3.READY;
4970
5183
  }));
4971
5184
  }
5185
+ async requestSpaceAdmissionCredential(spaceKey) {
5186
+ return this._spaceManager.requestSpaceAdmissionCredential({
5187
+ spaceKey,
5188
+ identityKey: this._signingContext.identityKey,
5189
+ timeout: 15e3,
5190
+ swarmIdentity: {
5191
+ peerKey: this._signingContext.deviceKey,
5192
+ credentialProvider: createAuthProvider(this._signingContext.credentialSigner),
5193
+ credentialAuthenticator: async () => true
5194
+ }
5195
+ });
5196
+ }
4972
5197
  async _constructSpace(metadata) {
4973
- log14("construct space", {
5198
+ log16("construct space", {
4974
5199
  metadata
4975
5200
  }, {
4976
- F: __dxlog_file17,
4977
- L: 285,
5201
+ F: __dxlog_file19,
5202
+ L: 358,
4978
5203
  S: this,
4979
5204
  C: (f, a) => f(...a)
4980
5205
  });
@@ -5002,6 +5227,7 @@ var DataSpaceManager = class {
5002
5227
  credentialAuthenticator: deferFunction2(() => dataSpace.authVerifier.verifier)
5003
5228
  },
5004
5229
  onAuthorizedConnection: (session) => {
5230
+ session.addExtension("dxos.mesh.teleport.admission-discovery", new CredentialServerExtension(space));
5005
5231
  session.addExtension("dxos.mesh.teleport.gossip", gossip.createExtension({
5006
5232
  remotePeerId: session.remotePeerId
5007
5233
  }));
@@ -5010,9 +5236,9 @@ var DataSpaceManager = class {
5010
5236
  session.addExtension("dxos.mesh.teleport.automerge", this._echoHost.createReplicationExtension());
5011
5237
  },
5012
5238
  onAuthFailure: () => {
5013
- log14.warn("auth failure", void 0, {
5014
- F: __dxlog_file17,
5015
- L: 322,
5239
+ log16.warn("auth failure", void 0, {
5240
+ F: __dxlog_file19,
5241
+ L: 396,
5016
5242
  S: this,
5017
5243
  C: (f, a) => f(...a)
5018
5244
  });
@@ -5041,22 +5267,22 @@ var DataSpaceManager = class {
5041
5267
  signingContext: this._signingContext,
5042
5268
  callbacks: {
5043
5269
  beforeReady: async () => {
5044
- log14("before space ready", {
5270
+ log16("before space ready", {
5045
5271
  space: space.key
5046
5272
  }, {
5047
- F: __dxlog_file17,
5048
- L: 349,
5273
+ F: __dxlog_file19,
5274
+ L: 423,
5049
5275
  S: this,
5050
5276
  C: (f, a) => f(...a)
5051
5277
  });
5052
5278
  },
5053
5279
  afterReady: async () => {
5054
- log14("after space ready", {
5280
+ log16("after space ready", {
5055
5281
  space: space.key,
5056
5282
  open: this._isOpen
5057
5283
  }, {
5058
- F: __dxlog_file17,
5059
- L: 352,
5284
+ F: __dxlog_file19,
5285
+ L: 426,
5060
5286
  S: this,
5061
5287
  C: (f, a) => f(...a)
5062
5288
  });
@@ -5071,11 +5297,11 @@ var DataSpaceManager = class {
5071
5297
  }
5072
5298
  },
5073
5299
  beforeClose: async () => {
5074
- log14("before space close", {
5300
+ log16("before space close", {
5075
5301
  space: space.key
5076
5302
  }, {
5077
- F: __dxlog_file17,
5078
- L: 360,
5303
+ F: __dxlog_file19,
5304
+ L: 434,
5079
5305
  S: this,
5080
5306
  C: (f, a) => f(...a)
5081
5307
  });
@@ -5106,17 +5332,17 @@ var DataSpaceManager = class {
5106
5332
  return (s && member.role === SpaceMember6.Role.REMOVED !== (s.authStatus === AuthStatus.FAILURE)) ?? false;
5107
5333
  });
5108
5334
  sessionsToClose.forEach((session) => {
5109
- void session.close().catch(log14.error);
5335
+ void session.close().catch(log16.error);
5110
5336
  });
5111
5337
  closedSessions += sessionsToClose.length;
5112
5338
  }
5113
- log14("processed member role changes", {
5339
+ log16("processed member role changes", {
5114
5340
  roleChangeCount: memberInfo.length,
5115
5341
  peersOnline: presence.getPeersOnline().length,
5116
5342
  closedSessions
5117
5343
  }, {
5118
- F: __dxlog_file17,
5119
- L: 396,
5344
+ F: __dxlog_file19,
5345
+ L: 470,
5120
5346
  S: this,
5121
5347
  C: (f, a) => f(...a)
5122
5348
  });
@@ -5127,15 +5353,15 @@ var DataSpaceManager = class {
5127
5353
  if (role === SpaceMember6.Role.REMOVED) {
5128
5354
  const session = peerState.peerId && space.protocol.sessions.get(peerState.peerId);
5129
5355
  if (session != null) {
5130
- log14("closing a session with a removed peer", {
5356
+ log16("closing a session with a removed peer", {
5131
5357
  peerId: peerState.peerId
5132
5358
  }, {
5133
- F: __dxlog_file17,
5134
- L: 410,
5359
+ F: __dxlog_file19,
5360
+ L: 484,
5135
5361
  S: this,
5136
5362
  C: (f, a) => f(...a)
5137
5363
  });
5138
- void session.close().catch(log14.error);
5364
+ void session.close().catch(log16.error);
5139
5365
  }
5140
5366
  }
5141
5367
  }
@@ -5196,13 +5422,13 @@ import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTas
5196
5422
  import { Stream as Stream10 } from "@dxos/codec-protobuf";
5197
5423
  import { createAdmissionCredentials as createAdmissionCredentials2, getCredentialAssertion as getCredentialAssertion4 } from "@dxos/credentials";
5198
5424
  import { raise as raise2 } from "@dxos/debug";
5199
- import { writeMessages as writeMessages3 } from "@dxos/feed-store";
5425
+ import { writeMessages as writeMessages4 } from "@dxos/feed-store";
5200
5426
  import { invariant as invariant15 } from "@dxos/invariant";
5201
- import { log as log15 } from "@dxos/log";
5427
+ import { log as log17 } from "@dxos/log";
5202
5428
  import { ApiError, SpaceNotFoundError as SpaceNotFoundError2, encodeError, IdentityNotInitializedError, AuthorizationError as AuthorizationError2 } from "@dxos/protocols";
5203
5429
  import { SpaceMember as SpaceMember7, SpaceState as SpaceState4 } from "@dxos/protocols/proto/dxos/client/services";
5204
5430
  import { trace as trace8 } from "@dxos/tracing";
5205
- var __dxlog_file18 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
5431
+ var __dxlog_file20 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
5206
5432
  var SpacesServiceImpl = class {
5207
5433
  constructor(_identityManager, _spaceManager, _getDataSpaceManager) {
5208
5434
  this._identityManager = _identityManager;
@@ -5246,8 +5472,8 @@ var SpacesServiceImpl = class {
5246
5472
  }
5247
5473
  const credentials = await createAdmissionCredentials2(identity.getIdentityCredentialSigner(), request.memberKey, space.key, space.genesisFeedKey, request.newRole, space.spaceState.membershipChainHeads);
5248
5474
  invariant15(credentials[0].credential, void 0, {
5249
- F: __dxlog_file18,
5250
- L: 97,
5475
+ F: __dxlog_file20,
5476
+ L: 102,
5251
5477
  S: this,
5252
5478
  A: [
5253
5479
  "credentials[0].credential",
@@ -5256,26 +5482,26 @@ var SpacesServiceImpl = class {
5256
5482
  });
5257
5483
  const spaceMemberCredential = credentials[0].credential.credential;
5258
5484
  invariant15(getCredentialAssertion4(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
5259
- F: __dxlog_file18,
5260
- L: 99,
5485
+ F: __dxlog_file20,
5486
+ L: 104,
5261
5487
  S: this,
5262
5488
  A: [
5263
5489
  "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
5264
5490
  ""
5265
5491
  ]
5266
5492
  });
5267
- await writeMessages3(space.controlPipeline.writer, credentials);
5493
+ await writeMessages4(space.controlPipeline.writer, credentials);
5268
5494
  }
5269
5495
  querySpaces() {
5270
5496
  return new Stream10(({ next, ctx }) => {
5271
5497
  const scheduler = new UpdateScheduler(ctx, async () => {
5272
5498
  const dataSpaceManager = await this._getDataSpaceManager();
5273
5499
  const spaces = Array.from(dataSpaceManager.spaces.values()).map((space) => this._serializeSpace(space));
5274
- log15("update", {
5500
+ log17("update", {
5275
5501
  spaces
5276
5502
  }, {
5277
- F: __dxlog_file18,
5278
- L: 110,
5503
+ F: __dxlog_file20,
5504
+ L: 115,
5279
5505
  S: this,
5280
5506
  C: (f, a) => f(...a)
5281
5507
  });
@@ -5293,7 +5519,15 @@ var SpacesServiceImpl = class {
5293
5519
  const subscribeSpaces = () => {
5294
5520
  subscriptions.clear();
5295
5521
  for (const space of dataSpaceManager.spaces.values()) {
5296
- subscriptions.add(space.stateUpdate.on(ctx, () => scheduler.forceTrigger()));
5522
+ let lastState;
5523
+ subscriptions.add(space.stateUpdate.on(ctx, () => {
5524
+ if (space.state !== lastState) {
5525
+ scheduler.forceTrigger();
5526
+ } else {
5527
+ scheduler.trigger();
5528
+ }
5529
+ lastState = space.state;
5530
+ }));
5297
5531
  subscriptions.add(space.presence.updated.on(ctx, () => scheduler.trigger()));
5298
5532
  subscriptions.add(space.automergeSpaceState.onNewEpoch.on(ctx, () => scheduler.trigger()));
5299
5533
  subscriptions.add(space.inner.controlPipeline.state.timeframeUpdate.on(ctx, () => scheduler.trigger()));
@@ -5358,8 +5592,8 @@ var SpacesServiceImpl = class {
5358
5592
  });
5359
5593
  } else {
5360
5594
  invariant15(!credential.id, "Id on unsigned credentials is not allowed", {
5361
- F: __dxlog_file18,
5362
- L: 198,
5595
+ F: __dxlog_file20,
5596
+ L: 213,
5363
5597
  S: this,
5364
5598
  A: [
5365
5599
  "!credential.id",
@@ -5367,8 +5601,8 @@ var SpacesServiceImpl = class {
5367
5601
  ]
5368
5602
  });
5369
5603
  invariant15(this._identityManager.identity, "Identity is not available", {
5370
- F: __dxlog_file18,
5371
- L: 199,
5604
+ F: __dxlog_file20,
5605
+ L: 214,
5372
5606
  S: this,
5373
5607
  A: [
5374
5608
  "this._identityManager.identity",
@@ -5377,8 +5611,8 @@ var SpacesServiceImpl = class {
5377
5611
  });
5378
5612
  const signer = this._identityManager.identity.getIdentityCredentialSigner();
5379
5613
  invariant15(credential.issuer.equals(signer.getIssuer()), void 0, {
5380
- F: __dxlog_file18,
5381
- L: 201,
5614
+ F: __dxlog_file20,
5615
+ L: 216,
5382
5616
  S: this,
5383
5617
  A: [
5384
5618
  "credential.issuer.equals(signer.getIssuer())",
@@ -5400,10 +5634,66 @@ var SpacesServiceImpl = class {
5400
5634
  async createEpoch({ spaceKey, migration, automergeRootUrl }) {
5401
5635
  const dataSpaceManager = await this._getDataSpaceManager();
5402
5636
  const space = dataSpaceManager.spaces.get(spaceKey) ?? raise2(new SpaceNotFoundError2(spaceKey));
5403
- await space.createEpoch({
5637
+ const credential = await space.createEpoch({
5404
5638
  migration,
5405
5639
  newAutomergeRoot: automergeRootUrl
5406
5640
  });
5641
+ return {
5642
+ epochCredential: credential ?? void 0
5643
+ };
5644
+ }
5645
+ async admitContact(request) {
5646
+ const dataSpaceManager = await this._getDataSpaceManager();
5647
+ await dataSpaceManager.admitMember({
5648
+ spaceKey: request.spaceKey,
5649
+ identityKey: request.contact.identityKey,
5650
+ role: request.role
5651
+ });
5652
+ }
5653
+ async joinBySpaceKey({ spaceKey }) {
5654
+ const dataSpaceManager = await this._getDataSpaceManager();
5655
+ const credential = await dataSpaceManager.requestSpaceAdmissionCredential(spaceKey);
5656
+ return this._joinByAdmission({
5657
+ credential
5658
+ });
5659
+ }
5660
+ async _joinByAdmission({ credential }) {
5661
+ const assertion = getCredentialAssertion4(credential);
5662
+ invariant15(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
5663
+ F: __dxlog_file20,
5664
+ L: 250,
5665
+ S: this,
5666
+ A: [
5667
+ "assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
5668
+ "'Invalid credential'"
5669
+ ]
5670
+ });
5671
+ const myIdentity = this._identityManager.identity;
5672
+ invariant15(myIdentity && credential.subject.id.equals(myIdentity.identityKey), void 0, {
5673
+ F: __dxlog_file20,
5674
+ L: 252,
5675
+ S: this,
5676
+ A: [
5677
+ "myIdentity && credential.subject.id.equals(myIdentity.identityKey)",
5678
+ ""
5679
+ ]
5680
+ });
5681
+ const dataSpaceManager = await this._getDataSpaceManager();
5682
+ let dataSpace = dataSpaceManager.spaces.get(assertion.spaceKey);
5683
+ if (!dataSpace) {
5684
+ dataSpace = await dataSpaceManager.acceptSpace({
5685
+ spaceKey: assertion.spaceKey,
5686
+ genesisFeedKey: assertion.genesisFeedKey
5687
+ });
5688
+ await myIdentity.controlPipeline.writer.write({
5689
+ credential: {
5690
+ credential
5691
+ }
5692
+ });
5693
+ }
5694
+ return {
5695
+ space: this._serializeSpace(dataSpace)
5696
+ };
5407
5697
  }
5408
5698
  _serializeSpace(space) {
5409
5699
  return {
@@ -5466,8 +5756,8 @@ var SpacesServiceImpl = class {
5466
5756
  var getChannelId = (channel) => `user-channel/${channel}`;
5467
5757
 
5468
5758
  // packages/sdk/client-services/src/packlets/services/service-context.ts
5469
- import { Trigger as Trigger7 } from "@dxos/async";
5470
- import { Context as Context10, Resource as Resource2 } from "@dxos/context";
5759
+ import { Trigger as Trigger8 } from "@dxos/async";
5760
+ import { Context as Context10, Resource as Resource3 } from "@dxos/context";
5471
5761
  import { getCredentialAssertion as getCredentialAssertion5 } from "@dxos/credentials";
5472
5762
  import { failUndefined as failUndefined2 } from "@dxos/debug";
5473
5763
  import { EchoHost } from "@dxos/echo-db";
@@ -5476,7 +5766,7 @@ import { FeedFactory, FeedStore } from "@dxos/feed-store";
5476
5766
  import { invariant as invariant16 } from "@dxos/invariant";
5477
5767
  import { Keyring } from "@dxos/keyring";
5478
5768
  import { PublicKey as PublicKey12 } from "@dxos/keys";
5479
- import { log as log16 } from "@dxos/log";
5769
+ import { log as log18 } from "@dxos/log";
5480
5770
  import { InvalidStorageVersionError, STORAGE_VERSION as STORAGE_VERSION2, trace as trace9 } from "@dxos/protocols";
5481
5771
  import { Invitation as Invitation8 } from "@dxos/protocols/proto/dxos/client/services";
5482
5772
  import { BlobStore } from "@dxos/teleport-extension-object-sync";
@@ -5492,8 +5782,8 @@ function _ts_decorate6(decorators, target, key, desc) {
5492
5782
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5493
5783
  return c > 3 && r && Object.defineProperty(target, key, r), r;
5494
5784
  }
5495
- var __dxlog_file19 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
5496
- var ServiceContext = class extends Resource2 {
5785
+ var __dxlog_file21 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
5786
+ var ServiceContext = class extends Resource3 {
5497
5787
  constructor(storage, level, networkManager, signalManager, _runtimeParams) {
5498
5788
  super();
5499
5789
  this.storage = storage;
@@ -5501,7 +5791,7 @@ var ServiceContext = class extends Resource2 {
5501
5791
  this.networkManager = networkManager;
5502
5792
  this.signalManager = signalManager;
5503
5793
  this._runtimeParams = _runtimeParams;
5504
- this.initialized = new Trigger7();
5794
+ this.initialized = new Trigger8();
5505
5795
  this._handlerFactories = /* @__PURE__ */ new Map();
5506
5796
  this._instanceId = PublicKey12.random().toHex();
5507
5797
  this.metadataStore = new MetadataStore(storage.createDirectory("metadata"));
@@ -5535,16 +5825,16 @@ var ServiceContext = class extends Resource2 {
5535
5825
  }
5536
5826
  async _open(ctx) {
5537
5827
  await this._checkStorageVersion();
5538
- log16("opening...", void 0, {
5539
- F: __dxlog_file19,
5828
+ log18("opening...", void 0, {
5829
+ F: __dxlog_file21,
5540
5830
  L: 149,
5541
5831
  S: this,
5542
5832
  C: (f, a) => f(...a)
5543
5833
  });
5544
- log16.trace("dxos.sdk.service-context.open", trace9.begin({
5834
+ log18.trace("dxos.sdk.service-context.open", trace9.begin({
5545
5835
  id: this._instanceId
5546
5836
  }), {
5547
- F: __dxlog_file19,
5837
+ F: __dxlog_file21,
5548
5838
  L: 150,
5549
5839
  S: this,
5550
5840
  C: (f, a) => f(...a)
@@ -5559,32 +5849,32 @@ var ServiceContext = class extends Resource2 {
5559
5849
  await this._initialize(ctx);
5560
5850
  }
5561
5851
  const loadedInvitations = await this.invitationsManager.loadPersistentInvitations();
5562
- log16("loaded persistent invitations", {
5852
+ log18("loaded persistent invitations", {
5563
5853
  count: loadedInvitations.invitations?.length
5564
5854
  }, {
5565
- F: __dxlog_file19,
5855
+ F: __dxlog_file21,
5566
5856
  L: 163,
5567
5857
  S: this,
5568
5858
  C: (f, a) => f(...a)
5569
5859
  });
5570
- log16.trace("dxos.sdk.service-context.open", trace9.end({
5860
+ log18.trace("dxos.sdk.service-context.open", trace9.end({
5571
5861
  id: this._instanceId
5572
5862
  }), {
5573
- F: __dxlog_file19,
5863
+ F: __dxlog_file21,
5574
5864
  L: 165,
5575
5865
  S: this,
5576
5866
  C: (f, a) => f(...a)
5577
5867
  });
5578
- log16("opened", void 0, {
5579
- F: __dxlog_file19,
5868
+ log18("opened", void 0, {
5869
+ F: __dxlog_file21,
5580
5870
  L: 166,
5581
5871
  S: this,
5582
5872
  C: (f, a) => f(...a)
5583
5873
  });
5584
5874
  }
5585
5875
  async _close(ctx) {
5586
- log16("closing...", void 0, {
5587
- F: __dxlog_file19,
5876
+ log18("closing...", void 0, {
5877
+ F: __dxlog_file21,
5588
5878
  L: 170,
5589
5879
  S: this,
5590
5880
  C: (f, a) => f(...a)
@@ -5600,8 +5890,8 @@ var ServiceContext = class extends Resource2 {
5600
5890
  await this.echoHost.close(ctx);
5601
5891
  await this.networkManager.close();
5602
5892
  await this.signalManager.close();
5603
- log16("closed", void 0, {
5604
- F: __dxlog_file19,
5893
+ log18("closed", void 0, {
5894
+ F: __dxlog_file21,
5605
5895
  L: 182,
5606
5896
  S: this,
5607
5897
  C: (f, a) => f(...a)
@@ -5609,13 +5899,16 @@ var ServiceContext = class extends Resource2 {
5609
5899
  }
5610
5900
  async createIdentity(params = {}) {
5611
5901
  const identity = await this.identityManager.createIdentity(params);
5612
- await this._initialize(new Context10());
5902
+ await this._initialize(new Context10(void 0, {
5903
+ F: __dxlog_file21,
5904
+ L: 187
5905
+ }));
5613
5906
  return identity;
5614
5907
  }
5615
5908
  getInvitationHandler(invitation) {
5616
5909
  const factory = this._handlerFactories.get(invitation.kind);
5617
5910
  invariant16(factory, `Unknown invitation kind: ${invitation.kind}`, {
5618
- F: __dxlog_file19,
5911
+ F: __dxlog_file21,
5619
5912
  L: 193,
5620
5913
  S: this,
5621
5914
  A: [
@@ -5635,7 +5928,10 @@ var ServiceContext = class extends Resource2 {
5635
5928
  }
5636
5929
  async _acceptIdentity(params) {
5637
5930
  const identity = await this.identityManager.acceptIdentity(params);
5638
- await this._initialize(new Context10());
5931
+ await this._initialize(new Context10(void 0, {
5932
+ F: __dxlog_file21,
5933
+ L: 209
5934
+ }));
5639
5935
  return identity;
5640
5936
  }
5641
5937
  async _checkStorageVersion() {
@@ -5646,8 +5942,8 @@ var ServiceContext = class extends Resource2 {
5646
5942
  }
5647
5943
  // Called when identity is created.
5648
5944
  async _initialize(ctx) {
5649
- log16("initializing spaces...", void 0, {
5650
- F: __dxlog_file19,
5945
+ log18("initializing spaces...", void 0, {
5946
+ F: __dxlog_file21,
5651
5947
  L: 224,
5652
5948
  S: this,
5653
5949
  C: (f, a) => f(...a)
@@ -5670,7 +5966,7 @@ var ServiceContext = class extends Resource2 {
5670
5966
  await this.dataSpaceManager.open();
5671
5967
  this._handlerFactories.set(Invitation8.Kind.SPACE, (invitation) => {
5672
5968
  invariant16(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
5673
- F: __dxlog_file19,
5969
+ F: __dxlog_file21,
5674
5970
  L: 249,
5675
5971
  S: this,
5676
5972
  A: [
@@ -5691,10 +5987,10 @@ var ServiceContext = class extends Resource2 {
5691
5987
  return;
5692
5988
  }
5693
5989
  if (!this.dataSpaceManager) {
5694
- log16("dataSpaceManager not initialized yet, ignoring space admission", {
5990
+ log18("dataSpaceManager not initialized yet, ignoring space admission", {
5695
5991
  details: assertion
5696
5992
  }, {
5697
- F: __dxlog_file19,
5993
+ F: __dxlog_file21,
5698
5994
  L: 265,
5699
5995
  S: this,
5700
5996
  C: (f, a) => f(...a)
@@ -5702,10 +5998,10 @@ var ServiceContext = class extends Resource2 {
5702
5998
  return;
5703
5999
  }
5704
6000
  if (this.dataSpaceManager.spaces.has(assertion.spaceKey)) {
5705
- log16("space already exists, ignoring space admission", {
6001
+ log18("space already exists, ignoring space admission", {
5706
6002
  details: assertion
5707
6003
  }, {
5708
- F: __dxlog_file19,
6004
+ F: __dxlog_file21,
5709
6005
  L: 269,
5710
6006
  S: this,
5711
6007
  C: (f, a) => f(...a)
@@ -5713,10 +6009,10 @@ var ServiceContext = class extends Resource2 {
5713
6009
  return;
5714
6010
  }
5715
6011
  try {
5716
- log16("accepting space recorded in halo", {
6012
+ log18("accepting space recorded in halo", {
5717
6013
  details: assertion
5718
6014
  }, {
5719
- F: __dxlog_file19,
6015
+ F: __dxlog_file21,
5720
6016
  L: 274,
5721
6017
  S: this,
5722
6018
  C: (f, a) => f(...a)
@@ -5726,8 +6022,8 @@ var ServiceContext = class extends Resource2 {
5726
6022
  genesisFeedKey: assertion.genesisFeedKey
5727
6023
  });
5728
6024
  } catch (err) {
5729
- log16.catch(err, void 0, {
5730
- F: __dxlog_file19,
6025
+ log18.catch(err, void 0, {
6026
+ F: __dxlog_file21,
5731
6027
  L: 280,
5732
6028
  S: this,
5733
6029
  C: (f, a) => f(...a)
@@ -5774,9 +6070,9 @@ var ServiceRegistry = class {
5774
6070
  };
5775
6071
 
5776
6072
  // packages/sdk/client-services/src/packlets/locks/browser.ts
5777
- import { asyncTimeout as asyncTimeout3, Trigger as Trigger8 } from "@dxos/async";
6073
+ import { asyncTimeout as asyncTimeout3, Trigger as Trigger9 } from "@dxos/async";
5778
6074
  import { RESOURCE_LOCK_TIMEOUT } from "@dxos/client-protocol";
5779
- import { log as log17, logInfo } from "@dxos/log";
6075
+ import { log as log19, logInfo } from "@dxos/log";
5780
6076
  function _ts_decorate7(decorators, target, key, desc) {
5781
6077
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5782
6078
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -5787,7 +6083,7 @@ function _ts_decorate7(decorators, target, key, desc) {
5787
6083
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5788
6084
  return c > 3 && r && Object.defineProperty(target, key, r), r;
5789
6085
  }
5790
- var __dxlog_file20 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
6086
+ var __dxlog_file22 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
5791
6087
  var Message;
5792
6088
  (function(Message2) {
5793
6089
  Message2["ACQUIRING"] = "acquiring";
@@ -5795,7 +6091,7 @@ var Message;
5795
6091
  var Lock = class {
5796
6092
  constructor({ lockKey, onAcquire, onRelease }) {
5797
6093
  this._broadcastChannel = new BroadcastChannel("vault-resource-lock");
5798
- this._releaseTrigger = new Trigger8();
6094
+ this._releaseTrigger = new Trigger9();
5799
6095
  this._lockKey = lockKey;
5800
6096
  this._onAcquire = onAcquire;
5801
6097
  this._onRelease = onRelease;
@@ -5809,29 +6105,29 @@ var Lock = class {
5809
6105
  message: "acquiring"
5810
6106
  });
5811
6107
  try {
5812
- log17("aquiring lock...", void 0, {
5813
- F: __dxlog_file20,
6108
+ log19("aquiring lock...", void 0, {
6109
+ F: __dxlog_file22,
5814
6110
  L: 42,
5815
6111
  S: this,
5816
6112
  C: (f, a) => f(...a)
5817
6113
  });
5818
6114
  await asyncTimeout3(this._requestLock(), RESOURCE_LOCK_TIMEOUT);
5819
- log17("acquired lock", void 0, {
5820
- F: __dxlog_file20,
6115
+ log19("acquired lock", void 0, {
6116
+ F: __dxlog_file22,
5821
6117
  L: 44,
5822
6118
  S: this,
5823
6119
  C: (f, a) => f(...a)
5824
6120
  });
5825
6121
  } catch {
5826
- log17("stealing lock...", void 0, {
5827
- F: __dxlog_file20,
6122
+ log19("stealing lock...", void 0, {
6123
+ F: __dxlog_file22,
5828
6124
  L: 46,
5829
6125
  S: this,
5830
6126
  C: (f, a) => f(...a)
5831
6127
  });
5832
6128
  await this._requestLock(true);
5833
- log17("stolen lock", void 0, {
5834
- F: __dxlog_file20,
6129
+ log19("stolen lock", void 0, {
6130
+ F: __dxlog_file22,
5835
6131
  L: 48,
5836
6132
  S: this,
5837
6133
  C: (f, a) => f(...a)
@@ -5847,31 +6143,31 @@ var Lock = class {
5847
6143
  }
5848
6144
  }
5849
6145
  async _requestLock(steal = false) {
5850
- log17("requesting lock...", {
6146
+ log19("requesting lock...", {
5851
6147
  steal
5852
6148
  }, {
5853
- F: __dxlog_file20,
6149
+ F: __dxlog_file22,
5854
6150
  L: 63,
5855
6151
  S: this,
5856
6152
  C: (f, a) => f(...a)
5857
6153
  });
5858
- const acquired = new Trigger8();
6154
+ const acquired = new Trigger9();
5859
6155
  void navigator.locks.request(this._lockKey, {
5860
6156
  steal
5861
6157
  }, async () => {
5862
6158
  await this._onAcquire?.();
5863
6159
  acquired.wake();
5864
- this._releaseTrigger = new Trigger8();
6160
+ this._releaseTrigger = new Trigger9();
5865
6161
  await this._releaseTrigger.wait();
5866
- log17("releasing lock...", void 0, {
5867
- F: __dxlog_file20,
6162
+ log19("releasing lock...", void 0, {
6163
+ F: __dxlog_file22,
5868
6164
  L: 72,
5869
6165
  S: this,
5870
6166
  C: (f, a) => f(...a)
5871
6167
  });
5872
6168
  await this._onRelease?.();
5873
- log17("released lock", void 0, {
5874
- F: __dxlog_file20,
6169
+ log19("released lock", void 0, {
6170
+ F: __dxlog_file22,
5875
6171
  L: 74,
5876
6172
  S: this,
5877
6173
  C: (f, a) => f(...a)
@@ -5880,10 +6176,10 @@ var Lock = class {
5880
6176
  await this._onRelease?.();
5881
6177
  });
5882
6178
  await acquired.wait();
5883
- log17("recieved lock", {
6179
+ log19("recieved lock", {
5884
6180
  steal
5885
6181
  }, {
5886
- F: __dxlog_file20,
6182
+ F: __dxlog_file22,
5887
6183
  L: 81,
5888
6184
  S: this,
5889
6185
  C: (f, a) => f(...a)
@@ -5971,13 +6267,151 @@ var createLevel = async (config) => {
5971
6267
  return level;
5972
6268
  };
5973
6269
 
6270
+ // packages/sdk/client-services/src/packlets/storage/profile-archive.ts
6271
+ import { cbor } from "@dxos/automerge/automerge-repo";
6272
+ import { invariant as invariant17 } from "@dxos/invariant";
6273
+ import { log as log20 } from "@dxos/log";
6274
+ import { ProfileArchiveEntryType } from "@dxos/protocols";
6275
+ import { arrayToBuffer } from "@dxos/util";
6276
+ var __dxlog_file23 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/storage/profile-archive.ts";
6277
+ var encodeProfileArchive = (profile) => cbor.encode(profile);
6278
+ var decodeProfileArchive = (data) => cbor.decode(data);
6279
+ var exportProfileData = async ({ storage, level }) => {
6280
+ const archive = {
6281
+ storage: [],
6282
+ meta: {
6283
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
6284
+ }
6285
+ };
6286
+ {
6287
+ const directory = await storage.createDirectory();
6288
+ const files = await directory.list();
6289
+ log20.info("begin exporting files", {
6290
+ count: files.length
6291
+ }, {
6292
+ F: __dxlog_file23,
6293
+ L: 30,
6294
+ S: void 0,
6295
+ C: (f, a) => f(...a)
6296
+ });
6297
+ for (const filename of files) {
6298
+ const file = await directory.getOrCreateFile(filename);
6299
+ const { size } = await file.stat();
6300
+ const data = await file.read(0, size);
6301
+ archive.storage.push({
6302
+ type: ProfileArchiveEntryType.FILE,
6303
+ key: filename,
6304
+ value: data
6305
+ });
6306
+ }
6307
+ log20.info("done exporting files", {
6308
+ count: files.length
6309
+ }, {
6310
+ F: __dxlog_file23,
6311
+ L: 41,
6312
+ S: void 0,
6313
+ C: (f, a) => f(...a)
6314
+ });
6315
+ }
6316
+ {
6317
+ log20.info("begin exporting kv pairs", void 0, {
6318
+ F: __dxlog_file23,
6319
+ L: 45,
6320
+ S: void 0,
6321
+ C: (f, a) => f(...a)
6322
+ });
6323
+ const iter = await level.iterator({
6324
+ keyEncoding: "binary",
6325
+ valueEncoding: "binary"
6326
+ });
6327
+ let count = 0;
6328
+ for await (const [key, value] of iter) {
6329
+ archive.storage.push({
6330
+ type: ProfileArchiveEntryType.KEY_VALUE,
6331
+ key,
6332
+ value
6333
+ });
6334
+ count++;
6335
+ }
6336
+ log20.info("done exporting kv pairs", {
6337
+ count
6338
+ }, {
6339
+ F: __dxlog_file23,
6340
+ L: 56,
6341
+ S: void 0,
6342
+ C: (f, a) => f(...a)
6343
+ });
6344
+ }
6345
+ return archive;
6346
+ };
6347
+ var importProfileData = async ({ storage, level }, archive) => {
6348
+ const batch = level.batch();
6349
+ for (const entry2 of archive.storage) {
6350
+ switch (entry2.type) {
6351
+ case ProfileArchiveEntryType.FILE: {
6352
+ const directory = await storage.createDirectory();
6353
+ invariant17(typeof entry2.key === "string", "Invalid key type", {
6354
+ F: __dxlog_file23,
6355
+ L: 78,
6356
+ S: void 0,
6357
+ A: [
6358
+ "typeof entry.key === 'string'",
6359
+ "'Invalid key type'"
6360
+ ]
6361
+ });
6362
+ const file = await directory.getOrCreateFile(entry2.key);
6363
+ invariant17(entry2.value instanceof Uint8Array, "Invalid value type", {
6364
+ F: __dxlog_file23,
6365
+ L: 80,
6366
+ S: void 0,
6367
+ A: [
6368
+ "entry.value instanceof Uint8Array",
6369
+ "'Invalid value type'"
6370
+ ]
6371
+ });
6372
+ await file.write(0, arrayToBuffer(entry2.value));
6373
+ await file.close();
6374
+ break;
6375
+ }
6376
+ case ProfileArchiveEntryType.KEY_VALUE: {
6377
+ invariant17(entry2.key instanceof Uint8Array, "Invalid key type", {
6378
+ F: __dxlog_file23,
6379
+ L: 86,
6380
+ S: void 0,
6381
+ A: [
6382
+ "entry.key instanceof Uint8Array",
6383
+ "'Invalid key type'"
6384
+ ]
6385
+ });
6386
+ invariant17(entry2.value instanceof Uint8Array, "Invalid value type", {
6387
+ F: __dxlog_file23,
6388
+ L: 87,
6389
+ S: void 0,
6390
+ A: [
6391
+ "entry.value instanceof Uint8Array",
6392
+ "'Invalid value type'"
6393
+ ]
6394
+ });
6395
+ batch.put(entry2.key, entry2.value, {
6396
+ keyEncoding: "binary",
6397
+ valueEncoding: "binary"
6398
+ });
6399
+ break;
6400
+ }
6401
+ default:
6402
+ throw new Error(`Invalid entry type: ${entry2.type}`);
6403
+ }
6404
+ }
6405
+ await batch.write();
6406
+ };
6407
+
5974
6408
  // packages/sdk/client-services/src/packlets/services/service-host.ts
5975
6409
  import { Event as Event9, synchronized as synchronized3 } from "@dxos/async";
5976
6410
  import { clientServiceBundle } from "@dxos/client-protocol";
5977
6411
  import { Context as Context11 } from "@dxos/context";
5978
- import { invariant as invariant18 } from "@dxos/invariant";
5979
- import { PublicKey as PublicKey16 } from "@dxos/keys";
5980
- import { log as log19 } from "@dxos/log";
6412
+ import { invariant as invariant19 } from "@dxos/invariant";
6413
+ import { PublicKey as PublicKey17 } from "@dxos/keys";
6414
+ import { log as log22 } from "@dxos/log";
5981
6415
  import { WebsocketSignalManager } from "@dxos/messaging";
5982
6416
  import { SwarmNetworkManager, createSimplePeerTransportFactory } from "@dxos/network-manager";
5983
6417
  import { trace as trace10 } from "@dxos/protocols";
@@ -5988,9 +6422,9 @@ import { WebsocketRpcClient } from "@dxos/websocket-rpc";
5988
6422
  // packages/sdk/client-services/src/packlets/devices/devices-service.ts
5989
6423
  import { EventSubscriptions as EventSubscriptions3 } from "@dxos/async";
5990
6424
  import { Stream as Stream11 } from "@dxos/codec-protobuf";
5991
- import { invariant as invariant17 } from "@dxos/invariant";
6425
+ import { invariant as invariant18 } from "@dxos/invariant";
5992
6426
  import { Device as Device2, DeviceKind as DeviceKind2 } from "@dxos/protocols/proto/dxos/client/services";
5993
- var __dxlog_file21 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/devices/devices-service.ts";
6427
+ var __dxlog_file24 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/devices/devices-service.ts";
5994
6428
  var DevicesServiceImpl = class {
5995
6429
  constructor(_identityManager) {
5996
6430
  this._identityManager = _identityManager;
@@ -6007,8 +6441,8 @@ var DevicesServiceImpl = class {
6007
6441
  devices: []
6008
6442
  });
6009
6443
  } else {
6010
- invariant17(this._identityManager.identity?.presence, "presence not present", {
6011
- F: __dxlog_file21,
6444
+ invariant18(this._identityManager.identity?.presence, "presence not present", {
6445
+ F: __dxlog_file24,
6012
6446
  L: 32,
6013
6447
  S: this,
6014
6448
  A: [
@@ -6114,28 +6548,111 @@ var findConfigs = () => {
6114
6548
  return configs.map((r) => r.instance.deref()).filter(nonNullable);
6115
6549
  };
6116
6550
 
6117
- // packages/sdk/client-services/src/packlets/logging/logging-service.ts
6118
- import { Event as Event8 } from "@dxos/async";
6551
+ // packages/sdk/client-services/src/packlets/identity/contacts-service.ts
6552
+ import { EventSubscriptions as EventSubscriptions4, scheduleTask as scheduleTask7, UpdateScheduler as UpdateScheduler2 } from "@dxos/async";
6119
6553
  import { Stream as Stream12 } from "@dxos/codec-protobuf";
6120
6554
  import { PublicKey as PublicKey15 } from "@dxos/keys";
6121
- import { getContextFromEntry, log as log18 } from "@dxos/log";
6555
+ import { ComplexMap as ComplexMap4, ComplexSet as ComplexSet6 } from "@dxos/util";
6556
+ var ContactsServiceImpl = class {
6557
+ constructor(_identityManager, _spaceManager, _dataSpaceManagerProvider) {
6558
+ this._identityManager = _identityManager;
6559
+ this._spaceManager = _spaceManager;
6560
+ this._dataSpaceManagerProvider = _dataSpaceManagerProvider;
6561
+ }
6562
+ async getContacts() {
6563
+ const identity = this._identityManager.identity;
6564
+ if (identity == null) {
6565
+ return {
6566
+ contacts: []
6567
+ };
6568
+ }
6569
+ const contacts = [
6570
+ ...this._spaceManager.spaces.values()
6571
+ ].flatMap((s) => [
6572
+ ...s.spaceState.members.values()
6573
+ ].map((m) => [
6574
+ s.key,
6575
+ m
6576
+ ])).reduce((acc, v) => {
6577
+ const [spaceKey, memberInfo] = v;
6578
+ if (memberInfo.key.equals(identity.identityKey)) {
6579
+ return acc;
6580
+ }
6581
+ const existing = acc.get(memberInfo.key);
6582
+ if (existing != null) {
6583
+ existing.profile ??= memberInfo.profile;
6584
+ existing.commonSpaces?.push(spaceKey);
6585
+ } else {
6586
+ acc.set(memberInfo.key, {
6587
+ identityKey: memberInfo.key,
6588
+ profile: memberInfo.profile,
6589
+ commonSpaces: [
6590
+ spaceKey
6591
+ ]
6592
+ });
6593
+ }
6594
+ return acc;
6595
+ }, new ComplexMap4(PublicKey15.hash));
6596
+ return {
6597
+ contacts: [
6598
+ ...contacts.values()
6599
+ ]
6600
+ };
6601
+ }
6602
+ queryContacts() {
6603
+ const subscribedSpaceKeySet = new ComplexSet6(PublicKey15.hash);
6604
+ return new Stream12(({ next, ctx }) => {
6605
+ const pushUpdateTask = new UpdateScheduler2(ctx, async () => {
6606
+ const contacts = await this.getContacts();
6607
+ next(contacts);
6608
+ }, {
6609
+ maxFrequency: 2
6610
+ });
6611
+ scheduleTask7(ctx, async () => {
6612
+ const subscriptions = new EventSubscriptions4();
6613
+ ctx.onDispose(() => subscriptions.clear());
6614
+ const subscribeToSpaceAndUpdate = () => {
6615
+ const oldSetSize = subscribedSpaceKeySet.size;
6616
+ for (const space of this._spaceManager.spaces.values()) {
6617
+ if (!subscribedSpaceKeySet.has(space.key)) {
6618
+ subscriptions.add(space.stateUpdate.on(ctx, () => pushUpdateTask.trigger()));
6619
+ subscribedSpaceKeySet.add(space.key);
6620
+ }
6621
+ }
6622
+ if (oldSetSize !== subscribedSpaceKeySet.size) {
6623
+ pushUpdateTask.trigger();
6624
+ }
6625
+ };
6626
+ const unsubscribe = (await this._dataSpaceManagerProvider()).updated.on(ctx, subscribeToSpaceAndUpdate);
6627
+ ctx.onDispose(unsubscribe);
6628
+ subscribeToSpaceAndUpdate();
6629
+ });
6630
+ });
6631
+ }
6632
+ };
6633
+
6634
+ // packages/sdk/client-services/src/packlets/logging/logging-service.ts
6635
+ import { Event as Event8 } from "@dxos/async";
6636
+ import { Stream as Stream13 } from "@dxos/codec-protobuf";
6637
+ import { PublicKey as PublicKey16 } from "@dxos/keys";
6638
+ import { getContextFromEntry, log as log21 } from "@dxos/log";
6122
6639
  import { QueryLogsRequest } from "@dxos/protocols/proto/dxos/client/services";
6123
6640
  import { getDebugName, jsonify, numericalValues, tracer } from "@dxos/util";
6124
6641
  var LoggingServiceImpl = class {
6125
6642
  constructor() {
6126
6643
  this._logs = new Event8();
6127
6644
  this._started = Date.now();
6128
- this._sessionId = PublicKey15.random().toHex();
6645
+ this._sessionId = PublicKey16.random().toHex();
6129
6646
  this._logProcessor = (_config, entry2) => {
6130
6647
  this._logs.emit(entry2);
6131
6648
  };
6132
6649
  }
6133
6650
  async open() {
6134
- log18.runtimeConfig.processors.push(this._logProcessor);
6651
+ log21.runtimeConfig.processors.push(this._logProcessor);
6135
6652
  }
6136
6653
  async close() {
6137
- const index = log18.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);
6138
- log18.runtimeConfig.processors.splice(index, 1);
6654
+ const index = log21.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);
6655
+ log21.runtimeConfig.processors.splice(index, 1);
6139
6656
  }
6140
6657
  async controlMetrics({ reset, record }) {
6141
6658
  if (reset) {
@@ -6161,7 +6678,7 @@ var LoggingServiceImpl = class {
6161
6678
  stats: numericalValues(events, "duration")
6162
6679
  };
6163
6680
  };
6164
- return new Stream12(({ next }) => {
6681
+ return new Stream13(({ next }) => {
6165
6682
  const update = () => {
6166
6683
  const metrics = {
6167
6684
  timestamp: /* @__PURE__ */ new Date(),
@@ -6183,7 +6700,7 @@ var LoggingServiceImpl = class {
6183
6700
  });
6184
6701
  }
6185
6702
  queryLogs(request) {
6186
- return new Stream12(({ ctx, next }) => {
6703
+ return new Stream13(({ ctx, next }) => {
6187
6704
  const handler = (entry2) => {
6188
6705
  if (LOG_PROCESSING > 0) {
6189
6706
  return;
@@ -6239,14 +6756,14 @@ var shouldLog = (entry2, request) => {
6239
6756
  var LOG_PROCESSING = 0;
6240
6757
 
6241
6758
  // packages/sdk/client-services/src/packlets/network/network-service.ts
6242
- import { Stream as Stream13 } from "@dxos/codec-protobuf";
6759
+ import { Stream as Stream14 } from "@dxos/codec-protobuf";
6243
6760
  var NetworkServiceImpl = class {
6244
6761
  constructor(networkManager, signalManager) {
6245
6762
  this.networkManager = networkManager;
6246
6763
  this.signalManager = signalManager;
6247
6764
  }
6248
6765
  queryStatus() {
6249
- return new Stream13(({ next }) => {
6766
+ return new Stream14(({ next }) => {
6250
6767
  const update = () => {
6251
6768
  next({
6252
6769
  swarm: this.networkManager.connectionState,
@@ -6272,7 +6789,7 @@ var NetworkServiceImpl = class {
6272
6789
  };
6273
6790
 
6274
6791
  // packages/sdk/client-services/src/packlets/system/system-service.ts
6275
- import { Stream as Stream14 } from "@dxos/codec-protobuf";
6792
+ import { Stream as Stream15 } from "@dxos/codec-protobuf";
6276
6793
  import { GetDiagnosticsRequest as GetDiagnosticsRequest2 } from "@dxos/protocols/proto/dxos/client/services";
6277
6794
  import { jsonKeyReplacer as jsonKeyReplacer2 } from "@dxos/util";
6278
6795
  var SystemServiceImpl = class {
@@ -6308,7 +6825,7 @@ var SystemServiceImpl = class {
6308
6825
  }
6309
6826
  // TODO(burdon): Standardize interval option in stream request?
6310
6827
  queryStatus({ interval = 3e3 } = {}) {
6311
- return new Stream14(({ next }) => {
6828
+ return new Stream15(({ next }) => {
6312
6829
  const update = () => {
6313
6830
  next({
6314
6831
  status: this._getCurrentStatus()
@@ -6339,7 +6856,7 @@ function _ts_decorate8(decorators, target, key, desc) {
6339
6856
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6340
6857
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6341
6858
  }
6342
- var __dxlog_file22 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-host.ts";
6859
+ var __dxlog_file25 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-host.ts";
6343
6860
  var ClientServicesHost = class {
6344
6861
  constructor({
6345
6862
  config,
@@ -6372,7 +6889,10 @@ var ClientServicesHost = class {
6372
6889
  lockKey,
6373
6890
  onAcquire: () => {
6374
6891
  if (!this._opening) {
6375
- void this.open(new Context11());
6892
+ void this.open(new Context11(void 0, {
6893
+ F: __dxlog_file25,
6894
+ L: 121
6895
+ }));
6376
6896
  }
6377
6897
  },
6378
6898
  onRelease: () => this.close()
@@ -6427,25 +6947,25 @@ var ClientServicesHost = class {
6427
6947
  * Can only be called once.
6428
6948
  */
6429
6949
  initialize({ config, ...options }) {
6430
- invariant18(!this._open, "service host is open", {
6431
- F: __dxlog_file22,
6432
- L: 186,
6950
+ invariant19(!this._open, "service host is open", {
6951
+ F: __dxlog_file25,
6952
+ L: 187,
6433
6953
  S: this,
6434
6954
  A: [
6435
6955
  "!this._open",
6436
6956
  "'service host is open'"
6437
6957
  ]
6438
6958
  });
6439
- log19("initializing...", void 0, {
6440
- F: __dxlog_file22,
6441
- L: 187,
6959
+ log22("initializing...", void 0, {
6960
+ F: __dxlog_file25,
6961
+ L: 188,
6442
6962
  S: this,
6443
6963
  C: (f, a) => f(...a)
6444
6964
  });
6445
6965
  if (config) {
6446
- invariant18(!this._config, "config already set", {
6447
- F: __dxlog_file22,
6448
- L: 190,
6966
+ invariant19(!this._config, "config already set", {
6967
+ F: __dxlog_file25,
6968
+ L: 191,
6449
6969
  S: this,
6450
6970
  A: [
6451
6971
  "!this._config",
@@ -6458,9 +6978,9 @@ var ClientServicesHost = class {
6458
6978
  }
6459
6979
  }
6460
6980
  if (!options.signalManager) {
6461
- log19.warn("running signaling without telemetry metadata.", void 0, {
6462
- F: __dxlog_file22,
6463
- L: 198,
6981
+ log22.warn("running signaling without telemetry metadata.", void 0, {
6982
+ F: __dxlog_file25,
6983
+ L: 199,
6464
6984
  S: this,
6465
6985
  C: (f, a) => f(...a)
6466
6986
  });
@@ -6469,9 +6989,9 @@ var ClientServicesHost = class {
6469
6989
  iceServers: this._config?.get("runtime.services.ice")
6470
6990
  }), signalManager = new WebsocketSignalManager(this._config?.get("runtime.services.signaling") ?? []) } = options;
6471
6991
  this._signalManager = signalManager;
6472
- invariant18(!this._networkManager, "network manager already set", {
6473
- F: __dxlog_file22,
6474
- L: 209,
6992
+ invariant19(!this._networkManager, "network manager already set", {
6993
+ F: __dxlog_file25,
6994
+ L: 210,
6475
6995
  S: this,
6476
6996
  A: [
6477
6997
  "!this._networkManager",
@@ -6483,9 +7003,9 @@ var ClientServicesHost = class {
6483
7003
  transportFactory,
6484
7004
  signalManager
6485
7005
  });
6486
- log19("initialized", void 0, {
6487
- F: __dxlog_file22,
6488
- L: 216,
7006
+ log22("initialized", void 0, {
7007
+ F: __dxlog_file25,
7008
+ L: 217,
6489
7009
  S: this,
6490
7010
  C: (f, a) => f(...a)
6491
7011
  });
@@ -6494,45 +7014,45 @@ var ClientServicesHost = class {
6494
7014
  if (this._open) {
6495
7015
  return;
6496
7016
  }
6497
- const traceId = PublicKey16.random().toHex();
6498
- log19.trace("dxos.client-services.host.open", trace10.begin({
7017
+ const traceId = PublicKey17.random().toHex();
7018
+ log22.trace("dxos.client-services.host.open", trace10.begin({
6499
7019
  id: traceId
6500
7020
  }), {
6501
- F: __dxlog_file22,
6502
- L: 227,
7021
+ F: __dxlog_file25,
7022
+ L: 228,
6503
7023
  S: this,
6504
7024
  C: (f, a) => f(...a)
6505
7025
  });
6506
- invariant18(this._config, "config not set", {
6507
- F: __dxlog_file22,
6508
- L: 229,
7026
+ invariant19(this._config, "config not set", {
7027
+ F: __dxlog_file25,
7028
+ L: 230,
6509
7029
  S: this,
6510
7030
  A: [
6511
7031
  "this._config",
6512
7032
  "'config not set'"
6513
7033
  ]
6514
7034
  });
6515
- invariant18(this._storage, "storage not set", {
6516
- F: __dxlog_file22,
6517
- L: 230,
7035
+ invariant19(this._storage, "storage not set", {
7036
+ F: __dxlog_file25,
7037
+ L: 231,
6518
7038
  S: this,
6519
7039
  A: [
6520
7040
  "this._storage",
6521
7041
  "'storage not set'"
6522
7042
  ]
6523
7043
  });
6524
- invariant18(this._signalManager, "signal manager not set", {
6525
- F: __dxlog_file22,
6526
- L: 231,
7044
+ invariant19(this._signalManager, "signal manager not set", {
7045
+ F: __dxlog_file25,
7046
+ L: 232,
6527
7047
  S: this,
6528
7048
  A: [
6529
7049
  "this._signalManager",
6530
7050
  "'signal manager not set'"
6531
7051
  ]
6532
7052
  });
6533
- invariant18(this._networkManager, "network manager not set", {
6534
- F: __dxlog_file22,
6535
- L: 232,
7053
+ invariant19(this._networkManager, "network manager not set", {
7054
+ F: __dxlog_file25,
7055
+ L: 233,
6536
7056
  S: this,
6537
7057
  A: [
6538
7058
  "this._networkManager",
@@ -6540,11 +7060,11 @@ var ClientServicesHost = class {
6540
7060
  ]
6541
7061
  });
6542
7062
  this._opening = true;
6543
- log19("opening...", {
7063
+ log22("opening...", {
6544
7064
  lockKey: this._resourceLock?.lockKey
6545
7065
  }, {
6546
- F: __dxlog_file22,
6547
- L: 235,
7066
+ F: __dxlog_file25,
7067
+ L: 236,
6548
7068
  S: this,
6549
7069
  C: (f, a) => f(...a)
6550
7070
  });
@@ -6555,16 +7075,18 @@ var ClientServicesHost = class {
6555
7075
  await this._level.open();
6556
7076
  await this._loggingService.open();
6557
7077
  this._serviceContext = new ServiceContext(this._storage, this._level, this._networkManager, this._signalManager, this._runtimeParams);
7078
+ const dataSpaceManagerProvider = async () => {
7079
+ await this._serviceContext.initialized.wait();
7080
+ return this._serviceContext.dataSpaceManager;
7081
+ };
6558
7082
  const identityService = new IdentityServiceImpl(this._serviceContext.identityManager, this._serviceContext.keyring, () => this._serviceContext.dataSpaceManager, (params) => this._createIdentity(params), (profile) => this._serviceContext.broadcastProfileUpdate(profile));
6559
7083
  this._serviceRegistry.setServices({
6560
7084
  SystemService: this._systemService,
6561
7085
  IdentityService: identityService,
7086
+ ContactsService: new ContactsServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, dataSpaceManagerProvider),
6562
7087
  InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitationsManager),
6563
7088
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
6564
- SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, async () => {
6565
- await this._serviceContext.initialized.wait();
6566
- return this._serviceContext.dataSpaceManager;
6567
- }),
7089
+ SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, dataSpaceManagerProvider),
6568
7090
  DataService: this._serviceContext.echoHost.dataService,
6569
7091
  QueryService: this._serviceContext.echoHost.queryService,
6570
7092
  NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager, this._serviceContext.signalManager),
@@ -6594,19 +7116,19 @@ var ClientServicesHost = class {
6594
7116
  this._open = true;
6595
7117
  this._statusUpdate.emit();
6596
7118
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
6597
- log19("opened", {
7119
+ log22("opened", {
6598
7120
  deviceKey
6599
7121
  }, {
6600
- F: __dxlog_file22,
6601
- L: 314,
7122
+ F: __dxlog_file25,
7123
+ L: 322,
6602
7124
  S: this,
6603
7125
  C: (f, a) => f(...a)
6604
7126
  });
6605
- log19.trace("dxos.client-services.host.open", trace10.end({
7127
+ log22.trace("dxos.client-services.host.open", trace10.end({
6606
7128
  id: traceId
6607
7129
  }), {
6608
- F: __dxlog_file22,
6609
- L: 315,
7130
+ F: __dxlog_file25,
7131
+ L: 323,
6610
7132
  S: this,
6611
7133
  C: (f, a) => f(...a)
6612
7134
  });
@@ -6616,11 +7138,11 @@ var ClientServicesHost = class {
6616
7138
  return;
6617
7139
  }
6618
7140
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
6619
- log19("closing...", {
7141
+ log22("closing...", {
6620
7142
  deviceKey
6621
7143
  }, {
6622
- F: __dxlog_file22,
6623
- L: 326,
7144
+ F: __dxlog_file25,
7145
+ L: 334,
6624
7146
  S: this,
6625
7147
  C: (f, a) => f(...a)
6626
7148
  });
@@ -6634,44 +7156,44 @@ var ClientServicesHost = class {
6634
7156
  await this._level?.close();
6635
7157
  this._open = false;
6636
7158
  this._statusUpdate.emit();
6637
- log19("closed", {
7159
+ log22("closed", {
6638
7160
  deviceKey
6639
7161
  }, {
6640
- F: __dxlog_file22,
6641
- L: 335,
7162
+ F: __dxlog_file25,
7163
+ L: 343,
6642
7164
  S: this,
6643
7165
  C: (f, a) => f(...a)
6644
7166
  });
6645
7167
  }
6646
7168
  async reset() {
6647
- const traceId = PublicKey16.random().toHex();
6648
- log19.trace("dxos.sdk.client-services-host.reset", trace10.begin({
7169
+ const traceId = PublicKey17.random().toHex();
7170
+ log22.trace("dxos.sdk.client-services-host.reset", trace10.begin({
6649
7171
  id: traceId
6650
7172
  }), {
6651
- F: __dxlog_file22,
6652
- L: 340,
7173
+ F: __dxlog_file25,
7174
+ L: 348,
6653
7175
  S: this,
6654
7176
  C: (f, a) => f(...a)
6655
7177
  });
6656
- log19.info("resetting...", void 0, {
6657
- F: __dxlog_file22,
6658
- L: 342,
7178
+ log22.info("resetting...", void 0, {
7179
+ F: __dxlog_file25,
7180
+ L: 350,
6659
7181
  S: this,
6660
7182
  C: (f, a) => f(...a)
6661
7183
  });
6662
7184
  await this._serviceContext?.close();
6663
7185
  await this._storage.reset();
6664
- log19.info("reset", void 0, {
6665
- F: __dxlog_file22,
6666
- L: 345,
7186
+ log22.info("reset", void 0, {
7187
+ F: __dxlog_file25,
7188
+ L: 353,
6667
7189
  S: this,
6668
7190
  C: (f, a) => f(...a)
6669
7191
  });
6670
- log19.trace("dxos.sdk.client-services-host.reset", trace10.end({
7192
+ log22.trace("dxos.sdk.client-services-host.reset", trace10.end({
6671
7193
  id: traceId
6672
7194
  }), {
6673
- F: __dxlog_file22,
6674
- L: 346,
7195
+ F: __dxlog_file25,
7196
+ L: 354,
6675
7197
  S: this,
6676
7198
  C: (f, a) => f(...a)
6677
7199
  });
@@ -6729,7 +7251,6 @@ export {
6729
7251
  SpaceInvitationProtocol,
6730
7252
  InvitationsManager,
6731
7253
  DataSpace,
6732
- findPropertiesObject,
6733
7254
  DataSpaceManager,
6734
7255
  SpacesServiceImpl,
6735
7256
  ServiceContext,
@@ -6738,8 +7259,12 @@ export {
6738
7259
  isLocked,
6739
7260
  createStorageObjects,
6740
7261
  createLevel,
7262
+ encodeProfileArchive,
7263
+ decodeProfileArchive,
7264
+ exportProfileData,
7265
+ importProfileData,
6741
7266
  ClientServicesHost,
6742
7267
  ClientServicesProviderResource,
6743
7268
  DiagnosticsCollector
6744
7269
  };
6745
- //# sourceMappingURL=chunk-4IR3JP4U.mjs.map
7270
+ //# sourceMappingURL=chunk-YUU4EUWY.mjs.map