@dxos/client-services 0.5.9-main.cb71230 → 0.5.9-main.cd3aaf7

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 (66) hide show
  1. package/dist/lib/browser/{chunk-HSM5JUN6.mjs → chunk-4FNLRMHR.mjs} +1646 -966
  2. package/dist/lib/browser/chunk-4FNLRMHR.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 +20 -13
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-4OGPGXOU.cjs → chunk-ZTE7R6AZ.cjs} +1882 -1209
  9. package/dist/lib/node/chunk-ZTE7R6AZ.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 +26 -19
  14. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  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/default-space-state-machine.d.ts +19 -0
  18. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +1 -0
  19. package/dist/types/src/packlets/identity/identity-service.d.ts +14 -7
  20. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  21. package/dist/types/src/packlets/identity/identity.d.ts +4 -1
  22. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  23. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  24. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  25. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  26. package/dist/types/src/packlets/services/service-host.d.ts +1 -1
  27. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  28. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +4 -1
  29. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
  30. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +15 -4
  31. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  32. package/dist/types/src/packlets/spaces/data-space.d.ts +9 -9
  33. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  34. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts +23 -0
  35. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts.map +1 -0
  36. package/dist/types/src/packlets/spaces/spaces-service.d.ts +5 -2
  37. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  38. package/dist/types/src/packlets/storage/index.d.ts +1 -0
  39. package/dist/types/src/packlets/storage/index.d.ts.map +1 -1
  40. package/dist/types/src/packlets/storage/profile-archive.d.ts +14 -0
  41. package/dist/types/src/packlets/storage/profile-archive.d.ts.map +1 -0
  42. package/dist/types/src/packlets/testing/test-builder.d.ts +8 -6
  43. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  44. package/dist/types/src/version.d.ts +1 -1
  45. package/package.json +36 -36
  46. package/src/packlets/identity/contacts-service.ts +85 -0
  47. package/src/packlets/identity/default-space-state-machine.ts +44 -0
  48. package/src/packlets/identity/identity-service.test.ts +35 -5
  49. package/src/packlets/identity/identity-service.ts +76 -8
  50. package/src/packlets/identity/identity.ts +25 -2
  51. package/src/packlets/invitations/invitations-handler.ts +13 -5
  52. package/src/packlets/invitations/space-invitation-protocol.ts +11 -32
  53. package/src/packlets/services/service-context.ts +1 -4
  54. package/src/packlets/services/service-host.ts +23 -42
  55. package/src/packlets/spaces/automerge-space-state.ts +11 -2
  56. package/src/packlets/spaces/data-space-manager.test.ts +46 -1
  57. package/src/packlets/spaces/data-space-manager.ts +136 -33
  58. package/src/packlets/spaces/data-space.ts +85 -152
  59. package/src/packlets/spaces/epoch-migrations.ts +140 -0
  60. package/src/packlets/spaces/spaces-service.ts +54 -4
  61. package/src/packlets/storage/index.ts +1 -0
  62. package/src/packlets/storage/profile-archive.ts +97 -0
  63. package/src/packlets/testing/test-builder.ts +12 -10
  64. package/src/version.ts +1 -1
  65. package/dist/lib/browser/chunk-HSM5JUN6.mjs.map +0 -7
  66. package/dist/lib/node/chunk-4OGPGXOU.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.cb71230";
362
+ var DXOS_VERSION = "0.5.9-main.cd3aaf7";
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)
@@ -803,10 +810,59 @@ import { DeviceStateMachine, createCredentialSignerWithKey, createCredentialSign
803
810
  import { writeMessages } from "@dxos/feed-store";
804
811
  import { invariant as invariant2 } from "@dxos/invariant";
805
812
  import { PublicKey as PublicKey3 } from "@dxos/keys";
806
- import { log as log3 } from "@dxos/log";
813
+ import { log as log4 } from "@dxos/log";
807
814
  import { AdmittedFeed } from "@dxos/protocols/proto/dxos/halo/credentials";
815
+ import { Timeframe } from "@dxos/timeframe";
808
816
  import { trace as trace2 } from "@dxos/tracing";
809
817
  import { ComplexSet } from "@dxos/util";
818
+
819
+ // packages/sdk/client-services/src/packlets/identity/default-space-state-machine.ts
820
+ import { getCredentialAssertion } from "@dxos/credentials";
821
+ import { SpaceId } from "@dxos/keys";
822
+ import { log as log3 } from "@dxos/log";
823
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/default-space-state-machine.ts";
824
+ var DefaultSpaceStateMachine = class {
825
+ constructor(_params) {
826
+ this._params = _params;
827
+ }
828
+ get spaceId() {
829
+ return this._spaceId;
830
+ }
831
+ async processCredential(credential) {
832
+ const assertion = getCredentialAssertion(credential);
833
+ switch (assertion["@type"]) {
834
+ case "dxos.halo.credentials.DefaultSpace": {
835
+ if (!credential.subject.id.equals(this._params.identityKey)) {
836
+ log3.warn("Invalid default space credential", {
837
+ expectedIdentity: this._params.identityKey,
838
+ credential
839
+ }, {
840
+ F: __dxlog_file5,
841
+ L: 32,
842
+ S: this,
843
+ C: (f, a) => f(...a)
844
+ });
845
+ return;
846
+ }
847
+ if (!SpaceId.isValid(assertion.spaceId)) {
848
+ log3.warn("Invalid default space id", {
849
+ id: assertion.spaceId
850
+ }, {
851
+ F: __dxlog_file5,
852
+ L: 36,
853
+ S: this,
854
+ C: (f, a) => f(...a)
855
+ });
856
+ return;
857
+ }
858
+ this._spaceId = assertion.spaceId;
859
+ break;
860
+ }
861
+ }
862
+ }
863
+ };
864
+
865
+ // packages/sdk/client-services/src/packlets/identity/identity.ts
810
866
  function _ts_decorate2(decorators, target, key, desc) {
811
867
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
812
868
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -817,7 +873,7 @@ function _ts_decorate2(decorators, target, key, desc) {
817
873
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
818
874
  return c > 3 && r && Object.defineProperty(target, key, r), r;
819
875
  }
820
- var __dxlog_file4 = "/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";
821
877
  var Identity = class {
822
878
  constructor({ space, signer, identityKey, deviceKey, presence }) {
823
879
  this.stateUpdate = new Event();
@@ -826,11 +882,11 @@ var Identity = class {
826
882
  this._presence = presence;
827
883
  this.identityKey = identityKey;
828
884
  this.deviceKey = deviceKey;
829
- log3.trace("dxos.halo.device", {
885
+ log4.trace("dxos.halo.device", {
830
886
  deviceKey
831
887
  }, {
832
- F: __dxlog_file4,
833
- L: 67,
888
+ F: __dxlog_file6,
889
+ L: 70,
834
890
  S: this,
835
891
  C: (f, a) => f(...a)
836
892
  });
@@ -843,6 +899,10 @@ var Identity = class {
843
899
  identityKey: this.identityKey,
844
900
  onUpdate: () => this.stateUpdate.emit()
845
901
  });
902
+ this._defaultSpaceStateMachine = new DefaultSpaceStateMachine({
903
+ identityKey: this.identityKey,
904
+ onUpdate: () => this.stateUpdate.emit()
905
+ });
846
906
  this.authVerifier = new TrustedKeySetAuthVerifier({
847
907
  trustedKeysProvider: () => new ComplexSet(PublicKey3.hash, this.authorizedDeviceKeys.keys()),
848
908
  update: this.stateUpdate,
@@ -853,14 +913,20 @@ var Identity = class {
853
913
  get authorizedDeviceKeys() {
854
914
  return this._deviceStateMachine.authorizedDeviceKeys;
855
915
  }
916
+ get defaultSpaceId() {
917
+ return this._defaultSpaceStateMachine.spaceId;
918
+ }
856
919
  async open(ctx) {
920
+ await this._presence?.open();
857
921
  await this.space.spaceState.addCredentialProcessor(this._deviceStateMachine);
858
922
  await this.space.spaceState.addCredentialProcessor(this._profileStateMachine);
923
+ await this.space.spaceState.addCredentialProcessor(this._defaultSpaceStateMachine);
859
924
  await this.space.open(ctx);
860
925
  }
861
926
  async close(ctx) {
862
- await this._presence?.destroy();
927
+ await this._presence?.close();
863
928
  await this.authVerifier.close();
929
+ await this.space.spaceState.removeCredentialProcessor(this._defaultSpaceStateMachine);
864
930
  await this.space.spaceState.removeCredentialProcessor(this._profileStateMachine);
865
931
  await this.space.spaceState.removeCredentialProcessor(this._deviceStateMachine);
866
932
  await this.space.close();
@@ -898,8 +964,8 @@ var Identity = class {
898
964
  */
899
965
  getIdentityCredentialSigner() {
900
966
  invariant2(this._deviceStateMachine.deviceCredentialChain, "Device credential chain is not ready.", {
901
- F: __dxlog_file4,
902
- L: 145,
967
+ F: __dxlog_file6,
968
+ L: 159,
903
969
  S: this,
904
970
  A: [
905
971
  "this._deviceStateMachine.deviceCredentialChain",
@@ -914,16 +980,36 @@ var Identity = class {
914
980
  getDeviceCredentialSigner() {
915
981
  return createCredentialSignerWithKey(this._signer, this.deviceKey);
916
982
  }
983
+ async updateDefaultSpace(spaceId) {
984
+ const credential = await this.getDeviceCredentialSigner().createCredential({
985
+ subject: this.identityKey,
986
+ assertion: {
987
+ "@type": "dxos.halo.credentials.DefaultSpace",
988
+ spaceId
989
+ }
990
+ });
991
+ const receipt = await this.controlPipeline.writer.write({
992
+ credential: {
993
+ credential
994
+ }
995
+ });
996
+ await this.controlPipeline.state.waitUntilTimeframe(new Timeframe([
997
+ [
998
+ receipt.feedKey,
999
+ receipt.seq
1000
+ ]
1001
+ ]));
1002
+ }
917
1003
  async admitDevice({ deviceKey, controlFeedKey, dataFeedKey }) {
918
- log3("Admitting device:", {
1004
+ log4("Admitting device:", {
919
1005
  identityKey: this.identityKey,
920
1006
  hostDevice: this.deviceKey,
921
1007
  deviceKey,
922
1008
  controlFeedKey,
923
1009
  dataFeedKey
924
1010
  }, {
925
- F: __dxlog_file4,
926
- L: 161,
1011
+ F: __dxlog_file6,
1012
+ L: 184,
927
1013
  S: this,
928
1014
  C: (f, a) => f(...a)
929
1015
  });
@@ -981,12 +1067,12 @@ import { Context as Context3 } from "@dxos/context";
981
1067
  import { createCredentialSignerWithKey as createCredentialSignerWithKey2, CredentialGenerator } from "@dxos/credentials";
982
1068
  import { invariant as invariant3 } from "@dxos/invariant";
983
1069
  import { PublicKey as PublicKey4 } from "@dxos/keys";
984
- import { log as log4 } from "@dxos/log";
1070
+ import { log as log5 } from "@dxos/log";
985
1071
  import { trace as trace3 } from "@dxos/protocols";
986
1072
  import { Device, DeviceKind } from "@dxos/protocols/proto/dxos/client/services";
987
1073
  import { AdmittedFeed as AdmittedFeed2, DeviceType } from "@dxos/protocols/proto/dxos/halo/credentials";
988
1074
  import { Gossip, Presence } from "@dxos/teleport-extension-gossip";
989
- import { Timeframe } from "@dxos/timeframe";
1075
+ import { Timeframe as Timeframe2 } from "@dxos/timeframe";
990
1076
  import { trace as Trace } from "@dxos/tracing";
991
1077
  import { isNode, deferFunction } from "@dxos/util";
992
1078
  function _ts_decorate3(decorators, target, key, desc) {
@@ -999,7 +1085,7 @@ function _ts_decorate3(decorators, target, key, desc) {
999
1085
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1000
1086
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1001
1087
  }
1002
- var __dxlog_file5 = "/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";
1003
1089
  var DEVICE_PRESENCE_ANNOUNCE_INTERVAL = 1e4;
1004
1090
  var DEVICE_PRESENCE_OFFLINE_TIMEOUT = 2e4;
1005
1091
  var IdentityManager = class {
@@ -1020,19 +1106,19 @@ var IdentityManager = class {
1020
1106
  }
1021
1107
  async open(ctx) {
1022
1108
  const traceId = PublicKey4.random().toHex();
1023
- log4.trace("dxos.halo.identity-manager.open", trace3.begin({
1109
+ log5.trace("dxos.halo.identity-manager.open", trace3.begin({
1024
1110
  id: traceId
1025
1111
  }), {
1026
- F: __dxlog_file5,
1112
+ F: __dxlog_file7,
1027
1113
  L: 104,
1028
1114
  S: this,
1029
1115
  C: (f, a) => f(...a)
1030
1116
  });
1031
1117
  const identityRecord = this._metadataStore.getIdentityRecord();
1032
- log4("identity record", {
1118
+ log5("identity record", {
1033
1119
  identityRecord
1034
1120
  }, {
1035
- F: __dxlog_file5,
1121
+ F: __dxlog_file7,
1036
1122
  L: 107,
1037
1123
  S: this,
1038
1124
  C: (f, a) => f(...a)
@@ -1041,32 +1127,35 @@ var IdentityManager = class {
1041
1127
  this._identity = await this._constructIdentity(identityRecord);
1042
1128
  await this._identity.open(ctx);
1043
1129
  await this._identity.ready();
1044
- log4.trace("dxos.halo.identity", {
1130
+ log5.trace("dxos.halo.identity", {
1045
1131
  identityKey: identityRecord.identityKey,
1046
1132
  displayName: this._identity.profileDocument?.displayName
1047
1133
  }, {
1048
- F: __dxlog_file5,
1134
+ F: __dxlog_file7,
1049
1135
  L: 112,
1050
1136
  S: this,
1051
1137
  C: (f, a) => f(...a)
1052
1138
  });
1053
1139
  this.stateUpdate.emit();
1054
1140
  }
1055
- log4.trace("dxos.halo.identity-manager.open", trace3.end({
1141
+ log5.trace("dxos.halo.identity-manager.open", trace3.end({
1056
1142
  id: traceId
1057
1143
  }), {
1058
- F: __dxlog_file5,
1144
+ F: __dxlog_file7,
1059
1145
  L: 119,
1060
1146
  S: this,
1061
1147
  C: (f, a) => f(...a)
1062
1148
  });
1063
1149
  }
1064
1150
  async close() {
1065
- await this._identity?.close(new Context3());
1151
+ await this._identity?.close(new Context3(void 0, {
1152
+ F: __dxlog_file7,
1153
+ L: 123
1154
+ }));
1066
1155
  }
1067
1156
  async createIdentity({ displayName, deviceProfile } = {}) {
1068
1157
  invariant3(!this._identity, "Identity already exists.", {
1069
- F: __dxlog_file5,
1158
+ F: __dxlog_file7,
1070
1159
  L: 128,
1071
1160
  S: this,
1072
1161
  A: [
@@ -1074,8 +1163,8 @@ var IdentityManager = class {
1074
1163
  "'Identity already exists.'"
1075
1164
  ]
1076
1165
  });
1077
- log4("creating identity...", void 0, {
1078
- F: __dxlog_file5,
1166
+ log5("creating identity...", void 0, {
1167
+ F: __dxlog_file7,
1079
1168
  L: 129,
1080
1169
  S: this,
1081
1170
  C: (f, a) => f(...a)
@@ -1092,11 +1181,14 @@ var IdentityManager = class {
1092
1181
  }
1093
1182
  };
1094
1183
  const identity = await this._constructIdentity(identityRecord);
1095
- await identity.open(new Context3());
1184
+ await identity.open(new Context3(void 0, {
1185
+ F: __dxlog_file7,
1186
+ L: 144
1187
+ }));
1096
1188
  {
1097
1189
  const generator = new CredentialGenerator(this._keyring, identityRecord.identityKey, identityRecord.deviceKey);
1098
1190
  invariant3(identityRecord.haloSpace.genesisFeedKey, "Genesis feed key is required.", {
1099
- F: __dxlog_file5,
1191
+ F: __dxlog_file7,
1100
1192
  L: 148,
1101
1193
  S: this,
1102
1194
  A: [
@@ -1105,7 +1197,7 @@ var IdentityManager = class {
1105
1197
  ]
1106
1198
  });
1107
1199
  invariant3(identityRecord.haloSpace.dataFeedKey, "Data feed key is required.", {
1108
- F: __dxlog_file5,
1200
+ F: __dxlog_file7,
1109
1201
  L: 149,
1110
1202
  S: this,
1111
1203
  A: [
@@ -1140,22 +1232,22 @@ var IdentityManager = class {
1140
1232
  await this._metadataStore.setIdentityRecord(identityRecord);
1141
1233
  this._identity = identity;
1142
1234
  await this._identity.ready();
1143
- log4.trace("dxos.halo.identity", {
1235
+ log5.trace("dxos.halo.identity", {
1144
1236
  identityKey: identityRecord.identityKey,
1145
1237
  displayName: this._identity.profileDocument?.displayName
1146
1238
  }, {
1147
- F: __dxlog_file5,
1239
+ F: __dxlog_file7,
1148
1240
  L: 191,
1149
1241
  S: this,
1150
1242
  C: (f, a) => f(...a)
1151
1243
  });
1152
1244
  this.stateUpdate.emit();
1153
- log4("created identity", {
1245
+ log5("created identity", {
1154
1246
  identityKey: identity.identityKey,
1155
1247
  deviceKey: identity.deviceKey,
1156
1248
  profile: identity.profileDocument
1157
1249
  }, {
1158
- F: __dxlog_file5,
1250
+ F: __dxlog_file7,
1159
1251
  L: 197,
1160
1252
  S: this,
1161
1253
  C: (f, a) => f(...a)
@@ -1189,16 +1281,16 @@ var IdentityManager = class {
1189
1281
  * Accept an existing identity. Expects its device key to be authorized (now or later).
1190
1282
  */
1191
1283
  async acceptIdentity(params) {
1192
- log4("accepting identity", {
1284
+ log5("accepting identity", {
1193
1285
  params
1194
1286
  }, {
1195
- F: __dxlog_file5,
1287
+ F: __dxlog_file7,
1196
1288
  L: 235,
1197
1289
  S: this,
1198
1290
  C: (f, a) => f(...a)
1199
1291
  });
1200
1292
  invariant3(!this._identity, "Identity already exists.", {
1201
- F: __dxlog_file5,
1293
+ F: __dxlog_file7,
1202
1294
  L: 236,
1203
1295
  S: this,
1204
1296
  A: [
@@ -1218,15 +1310,18 @@ var IdentityManager = class {
1218
1310
  }
1219
1311
  };
1220
1312
  const identity = await this._constructIdentity(identityRecord);
1221
- await identity.open(new Context3());
1313
+ await identity.open(new Context3(void 0, {
1314
+ F: __dxlog_file7,
1315
+ L: 251
1316
+ }));
1222
1317
  this._identity = identity;
1223
1318
  await this._metadataStore.setIdentityRecord(identityRecord);
1224
1319
  await this._identity.ready();
1225
- log4.trace("dxos.halo.identity", {
1320
+ log5.trace("dxos.halo.identity", {
1226
1321
  identityKey: identityRecord.identityKey,
1227
1322
  displayName: this._identity.profileDocument?.displayName
1228
1323
  }, {
1229
- F: __dxlog_file5,
1324
+ F: __dxlog_file7,
1230
1325
  L: 255,
1231
1326
  S: this,
1232
1327
  C: (f, a) => f(...a)
@@ -1236,11 +1331,11 @@ var IdentityManager = class {
1236
1331
  ...params.deviceProfile
1237
1332
  });
1238
1333
  this.stateUpdate.emit();
1239
- log4("accepted identity", {
1334
+ log5("accepted identity", {
1240
1335
  identityKey: identity.identityKey,
1241
1336
  deviceKey: identity.deviceKey
1242
1337
  }, {
1243
- F: __dxlog_file5,
1338
+ F: __dxlog_file7,
1244
1339
  L: 265,
1245
1340
  S: this,
1246
1341
  C: (f, a) => f(...a)
@@ -1252,7 +1347,7 @@ var IdentityManager = class {
1252
1347
  */
1253
1348
  async updateProfile(profile) {
1254
1349
  invariant3(this._identity, "Identity not initialized.", {
1255
- F: __dxlog_file5,
1350
+ F: __dxlog_file7,
1256
1351
  L: 273,
1257
1352
  S: this,
1258
1353
  A: [
@@ -1272,7 +1367,7 @@ var IdentityManager = class {
1272
1367
  credential
1273
1368
  }
1274
1369
  });
1275
- await this._identity.controlPipeline.state.waitUntilTimeframe(new Timeframe([
1370
+ await this._identity.controlPipeline.state.waitUntilTimeframe(new Timeframe2([
1276
1371
  [
1277
1372
  receipt.feedKey,
1278
1373
  receipt.seq
@@ -1283,7 +1378,7 @@ var IdentityManager = class {
1283
1378
  }
1284
1379
  async updateDeviceProfile(profile) {
1285
1380
  invariant3(this._identity, "Identity not initialized.", {
1286
- F: __dxlog_file5,
1381
+ F: __dxlog_file7,
1287
1382
  L: 290,
1288
1383
  S: this,
1289
1384
  A: [
@@ -1303,7 +1398,7 @@ var IdentityManager = class {
1303
1398
  credential
1304
1399
  }
1305
1400
  });
1306
- await this._identity.controlPipeline.state.waitUntilTimeframe(new Timeframe([
1401
+ await this._identity.controlPipeline.state.waitUntilTimeframe(new Timeframe2([
1307
1402
  [
1308
1403
  receipt.feedKey,
1309
1404
  receipt.seq
@@ -1319,7 +1414,7 @@ var IdentityManager = class {
1319
1414
  }
1320
1415
  async _constructIdentity(identityRecord) {
1321
1416
  invariant3(!this._identity, void 0, {
1322
- F: __dxlog_file5,
1417
+ F: __dxlog_file7,
1323
1418
  L: 316,
1324
1419
  S: this,
1325
1420
  A: [
@@ -1327,10 +1422,10 @@ var IdentityManager = class {
1327
1422
  ""
1328
1423
  ]
1329
1424
  });
1330
- log4("constructing identity", {
1425
+ log5("constructing identity", {
1331
1426
  identityRecord
1332
1427
  }, {
1333
- F: __dxlog_file5,
1428
+ F: __dxlog_file7,
1334
1429
  L: 317,
1335
1430
  S: this,
1336
1431
  C: (f, a) => f(...a)
@@ -1345,7 +1440,7 @@ var IdentityManager = class {
1345
1440
  gossip
1346
1441
  });
1347
1442
  invariant3(identityRecord.haloSpace.controlFeedKey, void 0, {
1348
- F: __dxlog_file5,
1443
+ F: __dxlog_file7,
1349
1444
  L: 330,
1350
1445
  S: this,
1351
1446
  A: [
@@ -1357,7 +1452,7 @@ var IdentityManager = class {
1357
1452
  writable: true
1358
1453
  });
1359
1454
  invariant3(identityRecord.haloSpace.dataFeedKey, void 0, {
1360
- F: __dxlog_file5,
1455
+ F: __dxlog_file7,
1361
1456
  L: 334,
1362
1457
  S: this,
1363
1458
  A: [
@@ -1388,10 +1483,10 @@ var IdentityManager = class {
1388
1483
  identityKey: identityRecord.identityKey,
1389
1484
  deviceKey: identityRecord.deviceKey
1390
1485
  });
1391
- log4("done", {
1486
+ log5("done", {
1392
1487
  identityKey: identityRecord.identityKey
1393
1488
  }, {
1394
- F: __dxlog_file5,
1489
+ F: __dxlog_file7,
1395
1490
  L: 360,
1396
1491
  S: this,
1397
1492
  C: (f, a) => f(...a)
@@ -1415,8 +1510,8 @@ var IdentityManager = class {
1415
1510
  }));
1416
1511
  },
1417
1512
  onAuthFailure: () => {
1418
- log4.warn("auth failure", void 0, {
1419
- F: __dxlog_file5,
1513
+ log5.warn("auth failure", void 0, {
1514
+ F: __dxlog_file7,
1420
1515
  L: 385,
1421
1516
  S: this,
1422
1517
  C: (f, a) => f(...a)
@@ -1440,25 +1535,55 @@ IdentityManager = _ts_decorate3([
1440
1535
  ], IdentityManager);
1441
1536
 
1442
1537
  // packages/sdk/client-services/src/packlets/identity/identity-service.ts
1538
+ import { Trigger as Trigger3, sleep } from "@dxos/async";
1443
1539
  import { Stream as Stream8 } from "@dxos/codec-protobuf";
1540
+ import { Resource } from "@dxos/context";
1444
1541
  import { signPresentation } from "@dxos/credentials";
1445
1542
  import { todo } from "@dxos/debug";
1446
1543
  import { invariant as invariant4 } from "@dxos/invariant";
1447
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity-service.ts";
1448
- var IdentityServiceImpl = class {
1449
- constructor(_createIdentity, _identityManager, _keyring, _onProfileUpdate) {
1450
- this._createIdentity = _createIdentity;
1544
+ import { log as log6 } from "@dxos/log";
1545
+ import { SpaceState } from "@dxos/protocols/proto/dxos/client/services";
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;
1549
+ var IdentityServiceImpl = class extends Resource {
1550
+ constructor(_identityManager, _keyring, _dataSpaceManagerProvider, _createIdentity, _onProfileUpdate) {
1551
+ super();
1451
1552
  this._identityManager = _identityManager;
1452
1553
  this._keyring = _keyring;
1554
+ this._dataSpaceManagerProvider = _dataSpaceManagerProvider;
1555
+ this._createIdentity = _createIdentity;
1453
1556
  this._onProfileUpdate = _onProfileUpdate;
1454
1557
  }
1558
+ async _open() {
1559
+ const identity = this._identityManager.identity;
1560
+ if (identity && !identity.defaultSpaceId) {
1561
+ await this._fixIdentityWithoutDefaultSpace(identity);
1562
+ }
1563
+ }
1455
1564
  async createIdentity(request) {
1456
1565
  await this._createIdentity({
1457
1566
  displayName: request.profile?.displayName,
1458
1567
  deviceProfile: request.deviceProfile
1459
1568
  });
1569
+ const dataSpaceManager = this._dataSpaceManagerProvider();
1570
+ await this._createDefaultSpace(dataSpaceManager);
1460
1571
  return this._getIdentity();
1461
1572
  }
1573
+ async _createDefaultSpace(dataSpaceManager) {
1574
+ const space = await dataSpaceManager.createDefaultSpace();
1575
+ const identity = this._identityManager.identity;
1576
+ invariant4(identity, void 0, {
1577
+ F: __dxlog_file8,
1578
+ L: 59,
1579
+ S: this,
1580
+ A: [
1581
+ "identity",
1582
+ ""
1583
+ ]
1584
+ });
1585
+ await identity.updateDefaultSpace(space.id);
1586
+ }
1462
1587
  async recoverIdentity(request) {
1463
1588
  return todo();
1464
1589
  }
@@ -1483,8 +1608,8 @@ var IdentityServiceImpl = class {
1483
1608
  }
1484
1609
  async updateProfile(profile) {
1485
1610
  invariant4(this._identityManager.identity, "Identity not initialized.", {
1486
- F: __dxlog_file6,
1487
- L: 61,
1611
+ F: __dxlog_file8,
1612
+ L: 89,
1488
1613
  S: this,
1489
1614
  A: [
1490
1615
  "this._identityManager.identity",
@@ -1497,8 +1622,8 @@ var IdentityServiceImpl = class {
1497
1622
  }
1498
1623
  async signPresentation({ presentation, nonce }) {
1499
1624
  invariant4(this._identityManager.identity, "Identity not initialized.", {
1500
- F: __dxlog_file6,
1501
- L: 68,
1625
+ F: __dxlog_file8,
1626
+ L: 96,
1502
1627
  S: this,
1503
1628
  A: [
1504
1629
  "this._identityManager.identity",
@@ -1513,13 +1638,54 @@ var IdentityServiceImpl = class {
1513
1638
  nonce
1514
1639
  });
1515
1640
  }
1641
+ async _fixIdentityWithoutDefaultSpace(identity) {
1642
+ let recodedDefaultSpace = false;
1643
+ let foundDefaultSpace = false;
1644
+ const dataSpaceManager = this._dataSpaceManagerProvider();
1645
+ const recordedDefaultSpaceTrigger = new Trigger3();
1646
+ const allProcessed = safeAwaitAll(dataSpaceManager.spaces.values(), async (space) => {
1647
+ if (space.state === SpaceState.CLOSED) {
1648
+ await space.open();
1649
+ const requiresMigration = space.stateUpdate.waitForCondition(() => space.state === SpaceState.REQUIRES_MIGRATION);
1650
+ await Promise.race([
1651
+ space.initializeDataPipeline(),
1652
+ requiresMigration
1653
+ ]);
1654
+ }
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;
1668
+ await identity.updateDefaultSpace(space.id);
1669
+ recodedDefaultSpace = true;
1670
+ recordedDefaultSpaceTrigger.wake();
1671
+ }
1672
+ });
1673
+ await Promise.race([
1674
+ allProcessed,
1675
+ recordedDefaultSpaceTrigger.wait(),
1676
+ sleep(DEFAULT_SPACE_SEARCH_TIMEOUT)
1677
+ ]);
1678
+ if (!recodedDefaultSpace) {
1679
+ await this._createDefaultSpace(dataSpaceManager);
1680
+ }
1681
+ }
1516
1682
  };
1517
1683
 
1518
1684
  // packages/sdk/client-services/src/packlets/invitations/device-invitation-protocol.ts
1519
1685
  import { invariant as invariant5 } from "@dxos/invariant";
1520
1686
  import { AlreadyJoinedError } from "@dxos/protocols";
1521
1687
  import { Invitation } from "@dxos/protocols/proto/dxos/client/services";
1522
- var __dxlog_file7 = "/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";
1523
1689
  var DeviceInvitationProtocol = class {
1524
1690
  constructor(_keyring, _getIdentity, _acceptIdentity) {
1525
1691
  this._keyring = _keyring;
@@ -1545,7 +1711,7 @@ var DeviceInvitationProtocol = class {
1545
1711
  }
1546
1712
  async admit(_, request) {
1547
1713
  invariant5(request.device, void 0, {
1548
- F: __dxlog_file7,
1714
+ F: __dxlog_file9,
1549
1715
  L: 50,
1550
1716
  S: this,
1551
1717
  A: [
@@ -1591,7 +1757,7 @@ var DeviceInvitationProtocol = class {
1591
1757
  }
1592
1758
  async accept(response, request) {
1593
1759
  invariant5(response.device, void 0, {
1594
- F: __dxlog_file7,
1760
+ F: __dxlog_file9,
1595
1761
  L: 95,
1596
1762
  S: this,
1597
1763
  A: [
@@ -1601,7 +1767,7 @@ var DeviceInvitationProtocol = class {
1601
1767
  });
1602
1768
  const { identityKey, haloSpaceKey, genesisFeedKey, controlTimeframe } = response.device;
1603
1769
  invariant5(request.device, void 0, {
1604
- F: __dxlog_file7,
1770
+ F: __dxlog_file9,
1605
1771
  L: 98,
1606
1772
  S: this,
1607
1773
  A: [
@@ -1633,7 +1799,7 @@ import { ContextDisposedError as ContextDisposedError2 } from "@dxos/context";
1633
1799
  import { createKeyPair, sign } from "@dxos/crypto";
1634
1800
  import { invariant as invariant9 } from "@dxos/invariant";
1635
1801
  import { PublicKey as PublicKey7 } from "@dxos/keys";
1636
- import { log as log8 } from "@dxos/log";
1802
+ import { log as log10 } from "@dxos/log";
1637
1803
  import { createTeleportProtocolFactory } from "@dxos/network-manager";
1638
1804
  import { InvalidInvitationExtensionRoleError as InvalidInvitationExtensionRoleError3, trace as trace5 } from "@dxos/protocols";
1639
1805
  import { Invitation as Invitation4 } from "@dxos/protocols/proto/dxos/client/services";
@@ -1642,10 +1808,10 @@ import { Options as Options4 } from "@dxos/protocols/proto/dxos/halo/invitations
1642
1808
  import { ComplexSet as ComplexSet3 } from "@dxos/util";
1643
1809
 
1644
1810
  // packages/sdk/client-services/src/packlets/invitations/invitation-guest-extenstion.ts
1645
- import { Trigger as Trigger3 } from "@dxos/async";
1811
+ import { Trigger as Trigger4 } from "@dxos/async";
1646
1812
  import { cancelWithContext as cancelWithContext2, Context as Context4 } from "@dxos/context";
1647
1813
  import { invariant as invariant6 } from "@dxos/invariant";
1648
- import { log as log5 } from "@dxos/log";
1814
+ import { log as log7 } from "@dxos/log";
1649
1815
  import { InvalidInvitationExtensionRoleError, schema as schema2 } from "@dxos/protocols";
1650
1816
  import { Options } from "@dxos/protocols/proto/dxos/halo/invitations";
1651
1817
  import { RpcExtension } from "@dxos/teleport";
@@ -1670,7 +1836,7 @@ var tryAcquireBeforeContextDisposed = async (ctx, mutex) => {
1670
1836
  };
1671
1837
 
1672
1838
  // packages/sdk/client-services/src/packlets/invitations/invitation-guest-extenstion.ts
1673
- var __dxlog_file8 = "/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";
1674
1840
  var OPTIONS_TIMEOUT = 1e4;
1675
1841
  var InvitationGuestExtension = class extends RpcExtension {
1676
1842
  constructor(_invitationFlowMutex, _callbacks) {
@@ -1684,8 +1850,11 @@ var InvitationGuestExtension = class extends RpcExtension {
1684
1850
  });
1685
1851
  this._invitationFlowMutex = _invitationFlowMutex;
1686
1852
  this._callbacks = _callbacks;
1687
- this._ctx = new Context4();
1688
- this._remoteOptionsTrigger = new Trigger3();
1853
+ this._ctx = new Context4(void 0, {
1854
+ F: __dxlog_file10,
1855
+ L: 33
1856
+ });
1857
+ this._remoteOptionsTrigger = new Trigger4();
1689
1858
  this._invitationFlowLock = null;
1690
1859
  }
1691
1860
  hasFlowLock() {
@@ -1696,7 +1865,7 @@ var InvitationGuestExtension = class extends RpcExtension {
1696
1865
  InvitationHostService: {
1697
1866
  options: async (options) => {
1698
1867
  invariant6(!this._remoteOptions, "Remote options already set.", {
1699
- F: __dxlog_file8,
1868
+ F: __dxlog_file10,
1700
1869
  L: 63,
1701
1870
  S: this,
1702
1871
  A: [
@@ -1722,15 +1891,15 @@ var InvitationGuestExtension = class extends RpcExtension {
1722
1891
  async onOpen(context) {
1723
1892
  await super.onOpen(context);
1724
1893
  try {
1725
- log5("guest acquire lock", void 0, {
1726
- F: __dxlog_file8,
1894
+ log7("guest acquire lock", void 0, {
1895
+ F: __dxlog_file10,
1727
1896
  L: 84,
1728
1897
  S: this,
1729
1898
  C: (f, a) => f(...a)
1730
1899
  });
1731
1900
  this._invitationFlowLock = await tryAcquireBeforeContextDisposed(this._ctx, this._invitationFlowMutex);
1732
- log5("guest lock acquired", void 0, {
1733
- F: __dxlog_file8,
1901
+ log7("guest lock acquired", void 0, {
1902
+ F: __dxlog_file10,
1734
1903
  L: 86,
1735
1904
  S: this,
1736
1905
  C: (f, a) => f(...a)
@@ -1738,8 +1907,8 @@ var InvitationGuestExtension = class extends RpcExtension {
1738
1907
  await cancelWithContext2(this._ctx, this.rpc.InvitationHostService.options({
1739
1908
  role: Options.Role.GUEST
1740
1909
  }));
1741
- log5("options sent", void 0, {
1742
- F: __dxlog_file8,
1910
+ log7("options sent", void 0, {
1911
+ F: __dxlog_file10,
1743
1912
  L: 88,
1744
1913
  S: this,
1745
1914
  C: (f, a) => f(...a)
@@ -1747,8 +1916,8 @@ var InvitationGuestExtension = class extends RpcExtension {
1747
1916
  await cancelWithContext2(this._ctx, this._remoteOptionsTrigger.wait({
1748
1917
  timeout: OPTIONS_TIMEOUT
1749
1918
  }));
1750
- log5("options received", void 0, {
1751
- F: __dxlog_file8,
1919
+ log7("options received", void 0, {
1920
+ F: __dxlog_file10,
1752
1921
  L: 90,
1753
1922
  S: this,
1754
1923
  C: (f, a) => f(...a)
@@ -1781,8 +1950,8 @@ var InvitationGuestExtension = class extends RpcExtension {
1781
1950
  if (this._invitationFlowLock != null) {
1782
1951
  this._invitationFlowLock.release();
1783
1952
  this._invitationFlowLock = null;
1784
- log5("invitation flow lock released", void 0, {
1785
- F: __dxlog_file8,
1953
+ log7("invitation flow lock released", void 0, {
1954
+ F: __dxlog_file10,
1786
1955
  L: 123,
1787
1956
  S: this,
1788
1957
  C: (f, a) => f(...a)
@@ -1792,17 +1961,17 @@ var InvitationGuestExtension = class extends RpcExtension {
1792
1961
  };
1793
1962
 
1794
1963
  // packages/sdk/client-services/src/packlets/invitations/invitation-host-extension.ts
1795
- import { Trigger as Trigger4, scheduleTask as scheduleTask2 } from "@dxos/async";
1964
+ import { Trigger as Trigger5, scheduleTask as scheduleTask2 } from "@dxos/async";
1796
1965
  import { cancelWithContext as cancelWithContext3, Context as Context5 } from "@dxos/context";
1797
1966
  import { randomBytes, verify } from "@dxos/crypto";
1798
1967
  import { invariant as invariant7, InvariantViolation } from "@dxos/invariant";
1799
1968
  import { PublicKey as PublicKey5 } from "@dxos/keys";
1800
- import { log as log6 } from "@dxos/log";
1969
+ import { log as log8 } from "@dxos/log";
1801
1970
  import { InvalidInvitationExtensionRoleError as InvalidInvitationExtensionRoleError2, schema as schema3, trace as trace4 } from "@dxos/protocols";
1802
1971
  import { Invitation as Invitation3 } from "@dxos/protocols/proto/dxos/client/services";
1803
1972
  import { AuthenticationResponse, Options as Options2 } from "@dxos/protocols/proto/dxos/halo/invitations";
1804
1973
  import { RpcExtension as RpcExtension2 } from "@dxos/teleport";
1805
- var __dxlog_file9 = "/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";
1806
1975
  var OPTIONS_TIMEOUT2 = 1e4;
1807
1976
  var MAX_OTP_ATTEMPTS = 3;
1808
1977
  var InvitationHostExtension = class extends RpcExtension2 {
@@ -1817,13 +1986,16 @@ var InvitationHostExtension = class extends RpcExtension2 {
1817
1986
  });
1818
1987
  this._invitationFlowMutex = _invitationFlowMutex;
1819
1988
  this._callbacks = _callbacks;
1820
- this._ctx = new Context5();
1821
- this._remoteOptionsTrigger = new Trigger4();
1989
+ this._ctx = new Context5(void 0, {
1990
+ F: __dxlog_file11,
1991
+ L: 52
1992
+ });
1993
+ this._remoteOptionsTrigger = new Trigger5();
1822
1994
  this._challenge = void 0;
1823
1995
  this.guestProfile = void 0;
1824
1996
  this.authenticationPassed = false;
1825
1997
  this.authenticationRetry = 0;
1826
- this.completedTrigger = new Trigger4();
1998
+ this.completedTrigger = new Trigger5();
1827
1999
  this._invitationFlowLock = null;
1828
2000
  }
1829
2001
  hasFlowLock() {
@@ -1836,7 +2008,7 @@ var InvitationHostExtension = class extends RpcExtension2 {
1836
2008
  InvitationHostService: {
1837
2009
  options: async (options) => {
1838
2010
  invariant7(!this._remoteOptions, "Remote options already set.", {
1839
- F: __dxlog_file9,
2011
+ F: __dxlog_file11,
1840
2012
  L: 101,
1841
2013
  S: this,
1842
2014
  A: [
@@ -1850,10 +2022,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
1850
2022
  introduce: async (request) => {
1851
2023
  const { profile, invitationId } = request;
1852
2024
  const traceId = PublicKey5.random().toHex();
1853
- log6.trace("dxos.sdk.invitation-handler.host.introduce", trace4.begin({
2025
+ log8.trace("dxos.sdk.invitation-handler.host.introduce", trace4.begin({
1854
2026
  id: traceId
1855
2027
  }), {
1856
- F: __dxlog_file9,
2028
+ F: __dxlog_file11,
1857
2029
  L: 110,
1858
2030
  S: this,
1859
2031
  C: (f, a) => f(...a)
@@ -1861,11 +2033,11 @@ var InvitationHostExtension = class extends RpcExtension2 {
1861
2033
  const invitation = this._requireActiveInvitation();
1862
2034
  this._assertInvitationState(Invitation3.State.CONNECTED);
1863
2035
  if (invitationId !== invitation?.invitationId) {
1864
- log6.warn("incorrect invitationId", {
2036
+ log8.warn("incorrect invitationId", {
1865
2037
  expected: invitation.invitationId,
1866
2038
  actual: invitationId
1867
2039
  }, {
1868
- F: __dxlog_file9,
2040
+ F: __dxlog_file11,
1869
2041
  L: 116,
1870
2042
  S: this,
1871
2043
  C: (f, a) => f(...a)
@@ -1876,10 +2048,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
1876
2048
  authMethod: Invitation3.AuthMethod.NONE
1877
2049
  };
1878
2050
  }
1879
- log6("guest introduced themselves", {
2051
+ log8("guest introduced themselves", {
1880
2052
  guestProfile: profile
1881
2053
  }, {
1882
- F: __dxlog_file9,
2054
+ F: __dxlog_file11,
1883
2055
  L: 125,
1884
2056
  S: this,
1885
2057
  C: (f, a) => f(...a)
@@ -1887,10 +2059,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
1887
2059
  this.guestProfile = profile;
1888
2060
  this._callbacks.onStateUpdate(Invitation3.State.READY_FOR_AUTHENTICATION);
1889
2061
  this._challenge = invitation.authMethod === Invitation3.AuthMethod.KNOWN_PUBLIC_KEY ? randomBytes(32) : void 0;
1890
- log6.trace("dxos.sdk.invitation-handler.host.introduce", trace4.end({
2062
+ log8.trace("dxos.sdk.invitation-handler.host.introduce", trace4.end({
1891
2063
  id: traceId
1892
2064
  }), {
1893
- F: __dxlog_file9,
2065
+ F: __dxlog_file11,
1894
2066
  L: 132,
1895
2067
  S: this,
1896
2068
  C: (f, a) => f(...a)
@@ -1902,19 +2074,19 @@ var InvitationHostExtension = class extends RpcExtension2 {
1902
2074
  },
1903
2075
  authenticate: async ({ authCode: code, signedChallenge }) => {
1904
2076
  const traceId = PublicKey5.random().toHex();
1905
- log6.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.begin({
2077
+ log8.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.begin({
1906
2078
  id: traceId
1907
2079
  }), {
1908
- F: __dxlog_file9,
2080
+ F: __dxlog_file11,
1909
2081
  L: 141,
1910
2082
  S: this,
1911
2083
  C: (f, a) => f(...a)
1912
2084
  });
1913
2085
  const invitation = this._requireActiveInvitation();
1914
- log6("received authentication request", {
2086
+ log8("received authentication request", {
1915
2087
  authCode: code
1916
2088
  }, {
1917
- F: __dxlog_file9,
2089
+ F: __dxlog_file11,
1918
2090
  L: 144,
1919
2091
  S: this,
1920
2092
  C: (f, a) => f(...a)
@@ -1927,8 +2099,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
1927
2099
  this._callbacks.onStateUpdate(Invitation3.State.AUTHENTICATING);
1928
2100
  switch (invitation.authMethod) {
1929
2101
  case Invitation3.AuthMethod.NONE: {
1930
- log6("authentication not required", void 0, {
1931
- F: __dxlog_file9,
2102
+ log8("authentication not required", void 0, {
2103
+ F: __dxlog_file11,
1932
2104
  L: 152,
1933
2105
  S: this,
1934
2106
  C: (f, a) => f(...a)
@@ -1963,10 +2135,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
1963
2135
  break;
1964
2136
  }
1965
2137
  default: {
1966
- log6.error("invalid authentication method", {
2138
+ log8.error("invalid authentication method", {
1967
2139
  authMethod: invitation.authMethod
1968
2140
  }, {
1969
- F: __dxlog_file9,
2141
+ F: __dxlog_file11,
1970
2142
  L: 190,
1971
2143
  S: this,
1972
2144
  C: (f, a) => f(...a)
@@ -1985,13 +2157,13 @@ var InvitationHostExtension = class extends RpcExtension2 {
1985
2157
  status
1986
2158
  };
1987
2159
  }
1988
- log6.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.end({
2160
+ log8.trace("dxos.sdk.invitation-handler.host.authenticate", trace4.end({
1989
2161
  id: traceId,
1990
2162
  data: {
1991
2163
  status
1992
2164
  }
1993
2165
  }), {
1994
- F: __dxlog_file9,
2166
+ F: __dxlog_file11,
1995
2167
  L: 202,
1996
2168
  S: this,
1997
2169
  C: (f, a) => f(...a)
@@ -2002,10 +2174,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
2002
2174
  },
2003
2175
  admit: async (request) => {
2004
2176
  const traceId = PublicKey5.random().toHex();
2005
- log6.trace("dxos.sdk.invitation-handler.host.admit", trace4.begin({
2177
+ log8.trace("dxos.sdk.invitation-handler.host.admit", trace4.begin({
2006
2178
  id: traceId
2007
2179
  }), {
2008
- F: __dxlog_file9,
2180
+ F: __dxlog_file11,
2009
2181
  L: 208,
2010
2182
  S: this,
2011
2183
  C: (f, a) => f(...a)
@@ -2019,10 +2191,10 @@ var InvitationHostExtension = class extends RpcExtension2 {
2019
2191
  }
2020
2192
  }
2021
2193
  const response = await this._callbacks.admit(request);
2022
- log6.trace("dxos.sdk.invitation-handler.host.admit", trace4.end({
2194
+ log8.trace("dxos.sdk.invitation-handler.host.admit", trace4.end({
2023
2195
  id: traceId
2024
2196
  }), {
2025
- F: __dxlog_file9,
2197
+ F: __dxlog_file11,
2026
2198
  L: 222,
2027
2199
  S: this,
2028
2200
  C: (f, a) => f(...a)
@@ -2039,15 +2211,15 @@ var InvitationHostExtension = class extends RpcExtension2 {
2039
2211
  async onOpen(context) {
2040
2212
  await super.onOpen(context);
2041
2213
  try {
2042
- log6("host acquire lock", void 0, {
2043
- F: __dxlog_file9,
2214
+ log8("host acquire lock", void 0, {
2215
+ F: __dxlog_file11,
2044
2216
  L: 237,
2045
2217
  S: this,
2046
2218
  C: (f, a) => f(...a)
2047
2219
  });
2048
2220
  this._invitationFlowLock = await tryAcquireBeforeContextDisposed(this._ctx, this._invitationFlowMutex);
2049
- log6("host lock acquired", void 0, {
2050
- F: __dxlog_file9,
2221
+ log8("host lock acquired", void 0, {
2222
+ F: __dxlog_file11,
2051
2223
  L: 239,
2052
2224
  S: this,
2053
2225
  C: (f, a) => f(...a)
@@ -2057,8 +2229,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
2057
2229
  await this.rpc.InvitationHostService.options({
2058
2230
  role: Options2.Role.HOST
2059
2231
  });
2060
- log6("options sent", void 0, {
2061
- F: __dxlog_file9,
2232
+ log8("options sent", void 0, {
2233
+ F: __dxlog_file11,
2062
2234
  L: 243,
2063
2235
  S: this,
2064
2236
  C: (f, a) => f(...a)
@@ -2066,8 +2238,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
2066
2238
  await cancelWithContext3(this._ctx, this._remoteOptionsTrigger.wait({
2067
2239
  timeout: OPTIONS_TIMEOUT2
2068
2240
  }));
2069
- log6("options received", void 0, {
2070
- F: __dxlog_file9,
2241
+ log8("options received", void 0, {
2242
+ F: __dxlog_file11,
2071
2243
  L: 245,
2072
2244
  S: this,
2073
2245
  C: (f, a) => f(...a)
@@ -2120,8 +2292,8 @@ var InvitationHostExtension = class extends RpcExtension2 {
2120
2292
  if (this._invitationFlowLock != null) {
2121
2293
  this._invitationFlowLock?.release();
2122
2294
  this._invitationFlowLock = null;
2123
- log6("invitation flow lock released", void 0, {
2124
- F: __dxlog_file9,
2295
+ log8("invitation flow lock released", void 0, {
2296
+ F: __dxlog_file11,
2125
2297
  L: 300,
2126
2298
  S: this,
2127
2299
  C: (f, a) => f(...a)
@@ -2134,10 +2306,10 @@ var isAuthenticationRequired = (invitation) => invitation.authMethod !== Invitat
2134
2306
  // packages/sdk/client-services/src/packlets/invitations/invitation-topology.ts
2135
2307
  import { invariant as invariant8 } from "@dxos/invariant";
2136
2308
  import { PublicKey as PublicKey6 } from "@dxos/keys";
2137
- import { log as log7 } from "@dxos/log";
2309
+ import { log as log9 } from "@dxos/log";
2138
2310
  import { Options as Options3 } from "@dxos/protocols/proto/dxos/halo/invitations";
2139
2311
  import { ComplexSet as ComplexSet2 } from "@dxos/util";
2140
- var __dxlog_file10 = "/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";
2141
2313
  var InvitationTopology = class {
2142
2314
  constructor(_role) {
2143
2315
  this._role = _role;
@@ -2145,7 +2317,7 @@ var InvitationTopology = class {
2145
2317
  }
2146
2318
  init(controller) {
2147
2319
  invariant8(!this._controller, "Already initialized.", {
2148
- F: __dxlog_file10,
2320
+ F: __dxlog_file12,
2149
2321
  L: 42,
2150
2322
  S: this,
2151
2323
  A: [
@@ -2157,7 +2329,7 @@ var InvitationTopology = class {
2157
2329
  }
2158
2330
  update() {
2159
2331
  invariant8(this._controller, "Not initialized.", {
2160
- F: __dxlog_file10,
2332
+ F: __dxlog_file12,
2161
2333
  L: 47,
2162
2334
  S: this,
2163
2335
  A: [
@@ -2176,11 +2348,11 @@ var InvitationTopology = class {
2176
2348
  const firstUnknownPeer = candidates.find((peerId) => !this._seenPeers.has(peerId));
2177
2349
  this._seenPeers = new ComplexSet2(PublicKey6.hash, allPeers.filter((peerId) => this._seenPeers.has(peerId)));
2178
2350
  if (firstUnknownPeer != null) {
2179
- log7("invitation connect", {
2351
+ log9("invitation connect", {
2180
2352
  ownPeerId,
2181
2353
  remotePeerId: firstUnknownPeer
2182
2354
  }, {
2183
- F: __dxlog_file10,
2355
+ F: __dxlog_file12,
2184
2356
  L: 69,
2185
2357
  S: this,
2186
2358
  C: (f, a) => f(...a)
@@ -2191,7 +2363,7 @@ var InvitationTopology = class {
2191
2363
  }
2192
2364
  async onOffer(peer) {
2193
2365
  invariant8(this._controller, "Not initialized.", {
2194
- F: __dxlog_file10,
2366
+ F: __dxlog_file12,
2195
2367
  L: 76,
2196
2368
  S: this,
2197
2369
  A: [
@@ -2210,7 +2382,7 @@ var InvitationTopology = class {
2210
2382
  };
2211
2383
 
2212
2384
  // packages/sdk/client-services/src/packlets/invitations/invitations-handler.ts
2213
- var __dxlog_file11 = "/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";
2214
2386
  var MAX_DELEGATED_INVITATION_HOST_TRIES = 3;
2215
2387
  var InvitationsHandler = class {
2216
2388
  /**
@@ -2235,7 +2407,7 @@ var InvitationsHandler = class {
2235
2407
  try {
2236
2408
  const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;
2237
2409
  invariant9(deviceKey, void 0, {
2238
- F: __dxlog_file11,
2410
+ F: __dxlog_file13,
2239
2411
  L: 90,
2240
2412
  S: this,
2241
2413
  A: [
@@ -2261,18 +2433,18 @@ var InvitationsHandler = class {
2261
2433
  scheduleTask3(connectionCtx, async () => {
2262
2434
  const traceId = PublicKey7.random().toHex();
2263
2435
  try {
2264
- log8.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.begin({
2436
+ log10.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.begin({
2265
2437
  id: traceId
2266
2438
  }), {
2267
- F: __dxlog_file11,
2439
+ F: __dxlog_file13,
2268
2440
  L: 115,
2269
2441
  S: this,
2270
2442
  C: (f, a) => f(...a)
2271
2443
  });
2272
- log8("connected", {
2444
+ log10("connected", {
2273
2445
  ...protocol.toJSON()
2274
2446
  }, {
2275
- F: __dxlog_file11,
2447
+ F: __dxlog_file13,
2276
2448
  L: 116,
2277
2449
  S: this,
2278
2450
  C: (f, a) => f(...a)
@@ -2280,20 +2452,20 @@ var InvitationsHandler = class {
2280
2452
  const deviceKey = await extension.completedTrigger.wait({
2281
2453
  timeout: invitation.timeout
2282
2454
  });
2283
- log8("admitted guest", {
2455
+ log10("admitted guest", {
2284
2456
  guest: deviceKey,
2285
2457
  ...protocol.toJSON()
2286
2458
  }, {
2287
- F: __dxlog_file11,
2459
+ F: __dxlog_file13,
2288
2460
  L: 118,
2289
2461
  S: this,
2290
2462
  C: (f, a) => f(...a)
2291
2463
  });
2292
2464
  guardedState.set(extension, Invitation4.State.SUCCESS);
2293
- log8.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.end({
2465
+ log10.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.end({
2294
2466
  id: traceId
2295
2467
  }), {
2296
- F: __dxlog_file11,
2468
+ F: __dxlog_file13,
2297
2469
  L: 120,
2298
2470
  S: this,
2299
2471
  C: (f, a) => f(...a)
@@ -2305,10 +2477,10 @@ var InvitationsHandler = class {
2305
2477
  } catch (err) {
2306
2478
  if (err instanceof TimeoutError) {
2307
2479
  if (guardedState.set(extension, Invitation4.State.TIMEOUT)) {
2308
- log8("timeout", {
2480
+ log10("timeout", {
2309
2481
  ...protocol.toJSON()
2310
2482
  }, {
2311
- F: __dxlog_file11,
2483
+ F: __dxlog_file13,
2312
2484
  L: 129,
2313
2485
  S: this,
2314
2486
  C: (f, a) => f(...a)
@@ -2316,19 +2488,19 @@ var InvitationsHandler = class {
2316
2488
  }
2317
2489
  } else {
2318
2490
  if (guardedState.error(extension, err)) {
2319
- log8.error("failed", err, {
2320
- F: __dxlog_file11,
2491
+ log10.error("failed", err, {
2492
+ F: __dxlog_file13,
2321
2493
  L: 133,
2322
2494
  S: this,
2323
2495
  C: (f, a) => f(...a)
2324
2496
  });
2325
2497
  }
2326
2498
  }
2327
- log8.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.error({
2499
+ log10.trace("dxos.sdk.invitations-handler.host.onOpen", trace5.error({
2328
2500
  id: traceId,
2329
2501
  error: err
2330
2502
  }), {
2331
- F: __dxlog_file11,
2503
+ F: __dxlog_file13,
2332
2504
  L: 136,
2333
2505
  S: this,
2334
2506
  C: (f, a) => f(...a)
@@ -2339,10 +2511,10 @@ var InvitationsHandler = class {
2339
2511
  },
2340
2512
  onError: (err) => {
2341
2513
  if (err instanceof InvalidInvitationExtensionRoleError3) {
2342
- log8("invalid role", {
2514
+ log10("invalid role", {
2343
2515
  ...err.context
2344
2516
  }, {
2345
- F: __dxlog_file11,
2517
+ F: __dxlog_file13,
2346
2518
  L: 144,
2347
2519
  S: this,
2348
2520
  C: (f, a) => f(...a)
@@ -2351,10 +2523,10 @@ var InvitationsHandler = class {
2351
2523
  }
2352
2524
  if (err instanceof TimeoutError) {
2353
2525
  if (guardedState.set(extension, Invitation4.State.TIMEOUT)) {
2354
- log8("timeout", {
2526
+ log10("timeout", {
2355
2527
  err
2356
2528
  }, {
2357
- F: __dxlog_file11,
2529
+ F: __dxlog_file13,
2358
2530
  L: 149,
2359
2531
  S: this,
2360
2532
  C: (f, a) => f(...a)
@@ -2362,8 +2534,8 @@ var InvitationsHandler = class {
2362
2534
  }
2363
2535
  } else {
2364
2536
  if (guardedState.error(extension, err)) {
2365
- log8.error("failed", err, {
2366
- F: __dxlog_file11,
2537
+ log10.error("failed", err, {
2538
+ F: __dxlog_file13,
2367
2539
  L: 153,
2368
2540
  S: this,
2369
2541
  C: (f, a) => f(...a)
@@ -2376,8 +2548,8 @@ var InvitationsHandler = class {
2376
2548
  };
2377
2549
  if (invitation.lifetime && invitation.created) {
2378
2550
  if (invitation.created.getTime() + invitation.lifetime * 1e3 < Date.now()) {
2379
- log8.warn("invitation has already expired", void 0, {
2380
- F: __dxlog_file11,
2551
+ log10.warn("invitation has already expired", void 0, {
2552
+ F: __dxlog_file13,
2381
2553
  L: 164,
2382
2554
  S: this,
2383
2555
  C: (f, a) => f(...a)
@@ -2400,7 +2572,7 @@ var InvitationsHandler = class {
2400
2572
  const { timeout = INVITATION_TIMEOUT } = invitation;
2401
2573
  if (deviceProfile) {
2402
2574
  invariant9(invitation.kind === Invitation4.Kind.DEVICE, "deviceProfile provided for non-device invitation", {
2403
- F: __dxlog_file11,
2575
+ F: __dxlog_file13,
2404
2576
  L: 197,
2405
2577
  S: this,
2406
2578
  A: [
@@ -2413,12 +2585,12 @@ var InvitationsHandler = class {
2413
2585
  const guardedState = this._createGuardedState(ctx, invitation, stream);
2414
2586
  const shouldCancelInvitationFlow = (extension) => {
2415
2587
  const isLockedByAnotherConnection = guardedState.mutex.isLocked() && !extension.hasFlowLock();
2416
- log8("should cancel invitation flow", {
2588
+ log10("should cancel invitation flow", {
2417
2589
  isLockedByAnotherConnection,
2418
2590
  invitationType: Invitation4.Type.DELEGATED,
2419
2591
  triedPeers: triedPeersIds.size
2420
2592
  }, {
2421
- F: __dxlog_file11,
2593
+ F: __dxlog_file13,
2422
2594
  L: 205,
2423
2595
  S: this,
2424
2596
  C: (f, a) => f(...a)
@@ -2441,11 +2613,11 @@ var InvitationsHandler = class {
2441
2613
  return;
2442
2614
  }
2443
2615
  connectionCtx.onDispose(async () => {
2444
- log8("extension disposed", {
2616
+ log10("extension disposed", {
2445
2617
  admitted,
2446
2618
  currentState: guardedState.current.state
2447
2619
  }, {
2448
- F: __dxlog_file11,
2620
+ F: __dxlog_file13,
2449
2621
  L: 233,
2450
2622
  S: this,
2451
2623
  C: (f, a) => f(...a)
@@ -2460,10 +2632,10 @@ var InvitationsHandler = class {
2460
2632
  scheduleTask3(connectionCtx, async () => {
2461
2633
  const traceId = PublicKey7.random().toHex();
2462
2634
  try {
2463
- log8.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.begin({
2635
+ log10.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.begin({
2464
2636
  id: traceId
2465
2637
  }), {
2466
- F: __dxlog_file11,
2638
+ F: __dxlog_file13,
2467
2639
  L: 245,
2468
2640
  S: this,
2469
2641
  C: (f, a) => f(...a)
@@ -2472,19 +2644,19 @@ var InvitationsHandler = class {
2472
2644
  guardedState.set(extension, Invitation4.State.TIMEOUT);
2473
2645
  extensionCtx.close();
2474
2646
  }, timeout);
2475
- log8("connected", {
2647
+ log10("connected", {
2476
2648
  ...protocol.toJSON()
2477
2649
  }, {
2478
- F: __dxlog_file11,
2650
+ F: __dxlog_file13,
2479
2651
  L: 256,
2480
2652
  S: this,
2481
2653
  C: (f, a) => f(...a)
2482
2654
  });
2483
2655
  guardedState.set(extension, Invitation4.State.CONNECTED);
2484
- log8("introduce", {
2656
+ log10("introduce", {
2485
2657
  ...protocol.toJSON()
2486
2658
  }, {
2487
- F: __dxlog_file11,
2659
+ F: __dxlog_file13,
2488
2660
  L: 260,
2489
2661
  S: this,
2490
2662
  C: (f, a) => f(...a)
@@ -2493,11 +2665,11 @@ var InvitationsHandler = class {
2493
2665
  invitationId: invitation.invitationId,
2494
2666
  ...protocol.createIntroduction()
2495
2667
  });
2496
- log8("introduce response", {
2668
+ log10("introduce response", {
2497
2669
  ...protocol.toJSON(),
2498
2670
  response: introductionResponse
2499
2671
  }, {
2500
- F: __dxlog_file11,
2672
+ F: __dxlog_file13,
2501
2673
  L: 265,
2502
2674
  S: this,
2503
2675
  C: (f, a) => f(...a)
@@ -2515,10 +2687,10 @@ var InvitationsHandler = class {
2515
2687
  break;
2516
2688
  }
2517
2689
  }
2518
- log8("request admission", {
2690
+ log10("request admission", {
2519
2691
  ...protocol.toJSON()
2520
2692
  }, {
2521
- F: __dxlog_file11,
2693
+ F: __dxlog_file13,
2522
2694
  L: 291,
2523
2695
  S: this,
2524
2696
  C: (f, a) => f(...a)
@@ -2527,10 +2699,10 @@ var InvitationsHandler = class {
2527
2699
  const admissionResponse = await extension.rpc.InvitationHostService.admit(admissionRequest);
2528
2700
  admitted = true;
2529
2701
  const result = await protocol.accept(admissionResponse, admissionRequest);
2530
- log8("admitted by host", {
2702
+ log10("admitted by host", {
2531
2703
  ...protocol.toJSON()
2532
2704
  }, {
2533
- F: __dxlog_file11,
2705
+ F: __dxlog_file13,
2534
2706
  L: 302,
2535
2707
  S: this,
2536
2708
  C: (f, a) => f(...a)
@@ -2540,28 +2712,28 @@ var InvitationsHandler = class {
2540
2712
  ...result,
2541
2713
  state: Invitation4.State.SUCCESS
2542
2714
  });
2543
- log8.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.end({
2715
+ log10.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.end({
2544
2716
  id: traceId
2545
2717
  }), {
2546
- F: __dxlog_file11,
2718
+ F: __dxlog_file13,
2547
2719
  L: 308,
2548
2720
  S: this,
2549
2721
  C: (f, a) => f(...a)
2550
2722
  });
2551
2723
  } catch (err) {
2552
2724
  if (err instanceof TimeoutError) {
2553
- log8("timeout", {
2725
+ log10("timeout", {
2554
2726
  ...protocol.toJSON()
2555
2727
  }, {
2556
- F: __dxlog_file11,
2728
+ F: __dxlog_file13,
2557
2729
  L: 311,
2558
2730
  S: this,
2559
2731
  C: (f, a) => f(...a)
2560
2732
  });
2561
2733
  guardedState.set(extension, Invitation4.State.TIMEOUT);
2562
2734
  } else {
2563
- log8("auth failed", err, {
2564
- F: __dxlog_file11,
2735
+ log10("auth failed", err, {
2736
+ F: __dxlog_file13,
2565
2737
  L: 314,
2566
2738
  S: this,
2567
2739
  C: (f, a) => f(...a)
@@ -2569,11 +2741,11 @@ var InvitationsHandler = class {
2569
2741
  guardedState.error(extension, err);
2570
2742
  }
2571
2743
  extensionCtx.close(err);
2572
- log8.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.error({
2744
+ log10.trace("dxos.sdk.invitations-handler.guest.onOpen", trace5.error({
2573
2745
  id: traceId,
2574
2746
  error: err
2575
2747
  }), {
2576
- F: __dxlog_file11,
2748
+ F: __dxlog_file13,
2577
2749
  L: 318,
2578
2750
  S: this,
2579
2751
  C: (f, a) => f(...a)
@@ -2586,18 +2758,18 @@ var InvitationsHandler = class {
2586
2758
  return;
2587
2759
  }
2588
2760
  if (err instanceof TimeoutError) {
2589
- log8("timeout", {
2761
+ log10("timeout", {
2590
2762
  ...protocol.toJSON()
2591
2763
  }, {
2592
- F: __dxlog_file11,
2764
+ F: __dxlog_file13,
2593
2765
  L: 327,
2594
2766
  S: this,
2595
2767
  C: (f, a) => f(...a)
2596
2768
  });
2597
2769
  guardedState.set(extension, Invitation4.State.TIMEOUT);
2598
2770
  } else {
2599
- log8("auth failed", err, {
2600
- F: __dxlog_file11,
2771
+ log10("auth failed", err, {
2772
+ F: __dxlog_file13,
2601
2773
  L: 330,
2602
2774
  S: this,
2603
2775
  C: (f, a) => f(...a)
@@ -2615,7 +2787,7 @@ var InvitationsHandler = class {
2615
2787
  await ctx.dispose();
2616
2788
  } else {
2617
2789
  invariant9(invitation.swarmKey, void 0, {
2618
- F: __dxlog_file11,
2790
+ F: __dxlog_file13,
2619
2791
  L: 345,
2620
2792
  S: this,
2621
2793
  A: [
@@ -2709,16 +2881,29 @@ var InvitationsHandler = class {
2709
2881
  };
2710
2882
  }
2711
2883
  _logStateUpdate(invitation, actor, newState) {
2712
- log8("invitation state update", {
2713
- actor: actor?.constructor.name,
2714
- newState: stateToString(newState),
2715
- oldState: stateToString(invitation.state)
2716
- }, {
2717
- F: __dxlog_file11,
2718
- L: 438,
2719
- S: this,
2720
- C: (f, a) => f(...a)
2721
- });
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
+ }
2722
2907
  }
2723
2908
  _isNotTerminal(currentState) {
2724
2909
  return ![
@@ -2731,17 +2916,17 @@ var InvitationsHandler = class {
2731
2916
  }
2732
2917
  async _handleGuestOtpAuth(extension, setState, authenticated, options) {
2733
2918
  for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {
2734
- log8("guest waiting for authentication code...", void 0, {
2735
- F: __dxlog_file11,
2736
- L: 462,
2919
+ log10("guest waiting for authentication code...", void 0, {
2920
+ F: __dxlog_file13,
2921
+ L: 470,
2737
2922
  S: this,
2738
2923
  C: (f, a) => f(...a)
2739
2924
  });
2740
2925
  setState(Invitation4.State.READY_FOR_AUTHENTICATION);
2741
2926
  const authCode = await authenticated.wait(options);
2742
- log8("sending authentication request", void 0, {
2743
- F: __dxlog_file11,
2744
- L: 466,
2927
+ log10("sending authentication request", void 0, {
2928
+ F: __dxlog_file13,
2929
+ L: 474,
2745
2930
  S: this,
2746
2931
  C: (f, a) => f(...a)
2747
2932
  });
@@ -2756,11 +2941,11 @@ var InvitationsHandler = class {
2756
2941
  if (attempt === MAX_OTP_ATTEMPTS) {
2757
2942
  throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);
2758
2943
  } else {
2759
- log8("retrying invalid code", {
2944
+ log10("retrying invalid code", {
2760
2945
  attempt
2761
2946
  }, {
2762
- F: __dxlog_file11,
2763
- L: 477,
2947
+ F: __dxlog_file13,
2948
+ L: 485,
2764
2949
  S: this,
2765
2950
  C: (f, a) => f(...a)
2766
2951
  });
@@ -2776,9 +2961,9 @@ var InvitationsHandler = class {
2776
2961
  if (introductionResponse.challenge == null) {
2777
2962
  throw new Error("challenge missing in the introduction");
2778
2963
  }
2779
- log8("sending authentication request", void 0, {
2780
- F: __dxlog_file11,
2781
- L: 496,
2964
+ log10("sending authentication request", void 0, {
2965
+ F: __dxlog_file13,
2966
+ L: 504,
2782
2967
  S: this,
2783
2968
  C: (f, a) => f(...a)
2784
2969
  });
@@ -2898,14 +3083,14 @@ var InvitationsServiceImpl = class {
2898
3083
  };
2899
3084
 
2900
3085
  // packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts
2901
- import { createAdmissionCredentials, createCancelDelegatedSpaceInvitationCredential, createDelegatedSpaceInvitationCredential, getCredentialAssertion } from "@dxos/credentials";
3086
+ import { createCancelDelegatedSpaceInvitationCredential, createDelegatedSpaceInvitationCredential, getCredentialAssertion as getCredentialAssertion2 } from "@dxos/credentials";
2902
3087
  import { writeMessages as writeMessages2 } from "@dxos/feed-store";
2903
3088
  import { invariant as invariant10 } from "@dxos/invariant";
2904
- import { log as log9 } from "@dxos/log";
3089
+ import { log as log11 } from "@dxos/log";
2905
3090
  import { AlreadyJoinedError as AlreadyJoinedError2, AuthorizationError, InvalidInvitationError, SpaceNotFoundError } from "@dxos/protocols";
2906
3091
  import { Invitation as Invitation5 } from "@dxos/protocols/proto/dxos/client/services";
2907
3092
  import { SpaceMember as SpaceMember2 } from "@dxos/protocols/proto/dxos/halo/credentials";
2908
- var __dxlog_file12 = "/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";
2909
3094
  var SpaceInvitationProtocol = class {
2910
3095
  constructor(_spaceManager, _signingContext, _keyring, _spaceKey) {
2911
3096
  this._spaceManager = _spaceManager;
@@ -2939,99 +3124,63 @@ var SpaceInvitationProtocol = class {
2939
3124
  };
2940
3125
  }
2941
3126
  async admit(invitation, request, guestProfile) {
2942
- invariant10(this._spaceKey, void 0, {
2943
- F: __dxlog_file12,
2944
- L: 76,
3127
+ invariant10(this._spaceKey && request.space, void 0, {
3128
+ F: __dxlog_file14,
3129
+ L: 74,
2945
3130
  S: this,
2946
3131
  A: [
2947
- "this._spaceKey",
3132
+ "this._spaceKey && request.space",
2948
3133
  ""
2949
3134
  ]
2950
3135
  });
3136
+ log11("writing guest credentials", {
3137
+ host: this._signingContext.deviceKey,
3138
+ guest: request.space.deviceKey
3139
+ }, {
3140
+ F: __dxlog_file14,
3141
+ L: 75,
3142
+ S: this,
3143
+ C: (f, a) => f(...a)
3144
+ });
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
3151
+ });
2951
3152
  const space = this._spaceManager.spaces.get(this._spaceKey);
2952
- invariant10(space, void 0, {
2953
- F: __dxlog_file12,
2954
- L: 78,
3153
+ return {
3154
+ space: {
3155
+ credential: spaceMemberCredential,
3156
+ controlTimeframe: space?.inner.controlPipeline.state.timeframe
3157
+ }
3158
+ };
3159
+ }
3160
+ async delegate(invitation) {
3161
+ invariant10(this._spaceKey, void 0, {
3162
+ F: __dxlog_file14,
3163
+ L: 95,
2955
3164
  S: this,
2956
3165
  A: [
2957
- "space",
3166
+ "this._spaceKey",
2958
3167
  ""
2959
3168
  ]
2960
3169
  });
2961
- invariant10(request.space, void 0, {
2962
- F: __dxlog_file12,
2963
- L: 80,
3170
+ const space = this._spaceManager.spaces.get(this._spaceKey);
3171
+ invariant10(space, void 0, {
3172
+ F: __dxlog_file14,
3173
+ L: 97,
2964
3174
  S: this,
2965
3175
  A: [
2966
- "request.space",
2967
- ""
2968
- ]
2969
- });
2970
- const { identityKey, deviceKey } = request.space;
2971
- if (space.inner.spaceState.getMemberRole(identityKey) !== SpaceMember2.Role.REMOVED) {
2972
- throw new AlreadyJoinedError2();
2973
- }
2974
- log9("writing guest credentials", {
2975
- host: this._signingContext.deviceKey,
2976
- guest: deviceKey
2977
- }, {
2978
- F: __dxlog_file12,
2979
- L: 87,
2980
- S: this,
2981
- C: (f, a) => f(...a)
2982
- });
2983
- 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);
2984
- invariant10(credentials[0].credential, void 0, {
2985
- F: __dxlog_file12,
2986
- L: 101,
2987
- S: this,
2988
- A: [
2989
- "credentials[0].credential",
2990
- ""
2991
- ]
2992
- });
2993
- const spaceMemberCredential = credentials[0].credential.credential;
2994
- invariant10(getCredentialAssertion(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
2995
- F: __dxlog_file12,
2996
- L: 103,
2997
- S: this,
2998
- A: [
2999
- "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
3000
- ""
3001
- ]
3002
- });
3003
- await writeMessages2(space.inner.controlPipeline.writer, credentials);
3004
- return {
3005
- space: {
3006
- credential: spaceMemberCredential,
3007
- controlTimeframe: space.inner.controlPipeline.state.timeframe
3008
- }
3009
- };
3010
- }
3011
- async delegate(invitation) {
3012
- invariant10(this._spaceKey, void 0, {
3013
- F: __dxlog_file12,
3014
- L: 116,
3015
- S: this,
3016
- A: [
3017
- "this._spaceKey",
3018
- ""
3019
- ]
3020
- });
3021
- const space = this._spaceManager.spaces.get(this._spaceKey);
3022
- invariant10(space, void 0, {
3023
- F: __dxlog_file12,
3024
- L: 118,
3025
- S: this,
3026
- A: [
3027
- "space",
3176
+ "space",
3028
3177
  ""
3029
3178
  ]
3030
3179
  });
3031
3180
  if (invitation.authMethod === Invitation5.AuthMethod.KNOWN_PUBLIC_KEY) {
3032
3181
  invariant10(invitation.guestKeypair?.publicKey, void 0, {
3033
- F: __dxlog_file12,
3034
- L: 120,
3182
+ F: __dxlog_file14,
3183
+ L: 99,
3035
3184
  S: this,
3036
3185
  A: [
3037
3186
  "invitation.guestKeypair?.publicKey",
@@ -3039,12 +3188,12 @@ var SpaceInvitationProtocol = class {
3039
3188
  ]
3040
3189
  });
3041
3190
  }
3042
- log9("writing delegate space invitation", {
3191
+ log11("writing delegate space invitation", {
3043
3192
  host: this._signingContext.deviceKey,
3044
3193
  id: invitation.invitationId
3045
3194
  }, {
3046
- F: __dxlog_file12,
3047
- L: 123,
3195
+ F: __dxlog_file14,
3196
+ L: 102,
3048
3197
  S: this,
3049
3198
  C: (f, a) => f(...a)
3050
3199
  });
@@ -3058,8 +3207,8 @@ var SpaceInvitationProtocol = class {
3058
3207
  guestKey: invitation.authMethod === Invitation5.AuthMethod.KNOWN_PUBLIC_KEY ? invitation.guestKeypair.publicKey : void 0
3059
3208
  });
3060
3209
  invariant10(credential.credential, void 0, {
3061
- F: __dxlog_file12,
3062
- L: 143,
3210
+ F: __dxlog_file14,
3211
+ L: 122,
3063
3212
  S: this,
3064
3213
  A: [
3065
3214
  "credential.credential",
@@ -3073,8 +3222,8 @@ var SpaceInvitationProtocol = class {
3073
3222
  }
3074
3223
  async cancelDelegation(invitation) {
3075
3224
  invariant10(this._spaceKey, void 0, {
3076
- F: __dxlog_file12,
3077
- L: 149,
3225
+ F: __dxlog_file14,
3226
+ L: 128,
3078
3227
  S: this,
3079
3228
  A: [
3080
3229
  "this._spaceKey",
@@ -3082,8 +3231,8 @@ var SpaceInvitationProtocol = class {
3082
3231
  ]
3083
3232
  });
3084
3233
  invariant10(invitation.type === Invitation5.Type.DELEGATED && invitation.delegationCredentialId, void 0, {
3085
- F: __dxlog_file12,
3086
- L: 150,
3234
+ F: __dxlog_file14,
3235
+ L: 129,
3087
3236
  S: this,
3088
3237
  A: [
3089
3238
  "invitation.type === Invitation.Type.DELEGATED && invitation.delegationCredentialId",
@@ -3092,27 +3241,27 @@ var SpaceInvitationProtocol = class {
3092
3241
  });
3093
3242
  const space = this._spaceManager.spaces.get(this._spaceKey);
3094
3243
  invariant10(space, void 0, {
3095
- F: __dxlog_file12,
3096
- L: 152,
3244
+ F: __dxlog_file14,
3245
+ L: 131,
3097
3246
  S: this,
3098
3247
  A: [
3099
3248
  "space",
3100
3249
  ""
3101
3250
  ]
3102
3251
  });
3103
- log9("cancelling delegated space invitation", {
3252
+ log11("cancelling delegated space invitation", {
3104
3253
  host: this._signingContext.deviceKey,
3105
3254
  id: invitation.invitationId
3106
3255
  }, {
3107
- F: __dxlog_file12,
3108
- L: 154,
3256
+ F: __dxlog_file14,
3257
+ L: 133,
3109
3258
  S: this,
3110
3259
  C: (f, a) => f(...a)
3111
3260
  });
3112
3261
  const credential = await createCancelDelegatedSpaceInvitationCredential(this._signingContext.credentialSigner, space.key, invitation.delegationCredentialId);
3113
3262
  invariant10(credential.credential, void 0, {
3114
- F: __dxlog_file12,
3115
- L: 161,
3263
+ F: __dxlog_file14,
3264
+ L: 140,
3116
3265
  S: this,
3117
3266
  A: [
3118
3267
  "credential.credential",
@@ -3150,8 +3299,8 @@ var SpaceInvitationProtocol = class {
3150
3299
  }
3151
3300
  async accept(response) {
3152
3301
  invariant10(response.space, void 0, {
3153
- F: __dxlog_file12,
3154
- L: 196,
3302
+ F: __dxlog_file14,
3303
+ L: 175,
3155
3304
  S: this,
3156
3305
  A: [
3157
3306
  "response.space",
@@ -3159,10 +3308,10 @@ var SpaceInvitationProtocol = class {
3159
3308
  ]
3160
3309
  });
3161
3310
  const { credential, controlTimeframe, dataTimeframe } = response.space;
3162
- const assertion = getCredentialAssertion(credential);
3311
+ const assertion = getCredentialAssertion2(credential);
3163
3312
  invariant10(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
3164
- F: __dxlog_file12,
3165
- L: 199,
3313
+ F: __dxlog_file14,
3314
+ L: 178,
3166
3315
  S: this,
3167
3316
  A: [
3168
3317
  "assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -3170,8 +3319,8 @@ var SpaceInvitationProtocol = class {
3170
3319
  ]
3171
3320
  });
3172
3321
  invariant10(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
3173
- F: __dxlog_file12,
3174
- L: 200,
3322
+ F: __dxlog_file14,
3323
+ L: 179,
3175
3324
  S: this,
3176
3325
  A: [
3177
3326
  "credential.subject.id.equals(this._signingContext.identityKey)",
@@ -3195,17 +3344,17 @@ var SpaceInvitationProtocol = class {
3195
3344
  };
3196
3345
 
3197
3346
  // packages/sdk/client-services/src/packlets/invitations/invitations-manager.ts
3198
- 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";
3199
3348
  import { AuthenticatingInvitation, AUTHENTICATION_CODE_LENGTH, CancellableInvitation, INVITATION_TIMEOUT as INVITATION_TIMEOUT2 } from "@dxos/client-protocol";
3200
3349
  import { Context as Context6 } from "@dxos/context";
3201
3350
  import { generatePasscode } from "@dxos/credentials";
3202
3351
  import { hasInvitationExpired } from "@dxos/echo-pipeline";
3203
3352
  import { invariant as invariant11 } from "@dxos/invariant";
3204
3353
  import { PublicKey as PublicKey8 } from "@dxos/keys";
3205
- import { log as log10 } from "@dxos/log";
3354
+ import { log as log12 } from "@dxos/log";
3206
3355
  import { Invitation as Invitation6 } from "@dxos/protocols/proto/dxos/client/services";
3207
3356
  import { SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/halo/credentials";
3208
- var __dxlog_file13 = "/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";
3209
3358
  var InvitationsManager = class {
3210
3359
  constructor(_invitationsHandler, _getHandler, _metadataStore) {
3211
3360
  this._invitationsHandler = _invitationsHandler;
@@ -3247,8 +3396,8 @@ var InvitationsManager = class {
3247
3396
  try {
3248
3397
  await this._persistIfRequired(handler, stream, invitation);
3249
3398
  } catch (err) {
3250
- log10.catch(err, void 0, {
3251
- F: __dxlog_file13,
3399
+ log12.catch(err, void 0, {
3400
+ F: __dxlog_file15,
3252
3401
  L: 82,
3253
3402
  S: this,
3254
3403
  C: (f, a) => f(...a)
@@ -3271,7 +3420,7 @@ var InvitationsManager = class {
3271
3420
  const freshInvitations = persistentInvitations.filter((invitation) => !hasInvitationExpired(invitation));
3272
3421
  const loadTasks = freshInvitations.map((persistentInvitation) => {
3273
3422
  invariant11(!this._createInvitations.get(persistentInvitation.invitationId), "invitation already exists", {
3274
- F: __dxlog_file13,
3423
+ F: __dxlog_file15,
3275
3424
  L: 103,
3276
3425
  S: this,
3277
3426
  A: [
@@ -3289,8 +3438,8 @@ var InvitationsManager = class {
3289
3438
  invitations: cInvitations.map((invitation) => invitation.get())
3290
3439
  };
3291
3440
  } catch (err) {
3292
- log10.catch(err, void 0, {
3293
- F: __dxlog_file13,
3441
+ log12.catch(err, void 0, {
3442
+ F: __dxlog_file15,
3294
3443
  L: 110,
3295
3444
  S: this,
3296
3445
  C: (f, a) => f(...a)
@@ -3321,14 +3470,14 @@ var InvitationsManager = class {
3321
3470
  return invitation;
3322
3471
  }
3323
3472
  async authenticate({ invitationId, authCode }) {
3324
- log10("authenticating...", void 0, {
3325
- F: __dxlog_file13,
3473
+ log12("authenticating...", void 0, {
3474
+ F: __dxlog_file15,
3326
3475
  L: 140,
3327
3476
  S: this,
3328
3477
  C: (f, a) => f(...a)
3329
3478
  });
3330
3479
  invariant11(invitationId, void 0, {
3331
- F: __dxlog_file13,
3480
+ F: __dxlog_file15,
3332
3481
  L: 141,
3333
3482
  S: this,
3334
3483
  A: [
@@ -3338,10 +3487,10 @@ var InvitationsManager = class {
3338
3487
  });
3339
3488
  const observable = this._acceptInvitations.get(invitationId);
3340
3489
  if (!observable) {
3341
- log10.warn("invalid invitation", {
3490
+ log12.warn("invalid invitation", {
3342
3491
  invitationId
3343
3492
  }, {
3344
- F: __dxlog_file13,
3493
+ F: __dxlog_file15,
3345
3494
  L: 144,
3346
3495
  S: this,
3347
3496
  C: (f, a) => f(...a)
@@ -3351,16 +3500,16 @@ var InvitationsManager = class {
3351
3500
  }
3352
3501
  }
3353
3502
  async cancelInvitation({ invitationId }) {
3354
- log10("cancelInvitation...", {
3503
+ log12("cancelInvitation...", {
3355
3504
  invitationId
3356
3505
  }, {
3357
- F: __dxlog_file13,
3506
+ F: __dxlog_file15,
3358
3507
  L: 151,
3359
3508
  S: this,
3360
3509
  C: (f, a) => f(...a)
3361
3510
  });
3362
3511
  invariant11(invitationId, void 0, {
3363
- F: __dxlog_file13,
3512
+ F: __dxlog_file15,
3364
3513
  L: 152,
3365
3514
  S: this,
3366
3515
  A: [
@@ -3434,12 +3583,15 @@ var InvitationsManager = class {
3434
3583
  stream.error(err);
3435
3584
  void ctx.dispose();
3436
3585
  }
3586
+ }, {
3587
+ F: __dxlog_file15,
3588
+ L: 234
3437
3589
  });
3438
3590
  ctx.onDispose(() => {
3439
- log10("complete", {
3591
+ log12("complete", {
3440
3592
  ...handler.toJSON()
3441
3593
  }, {
3442
- F: __dxlog_file13,
3594
+ F: __dxlog_file15,
3443
3595
  L: 241,
3444
3596
  S: this,
3445
3597
  C: (f, a) => f(...a)
@@ -3464,15 +3616,15 @@ var InvitationsManager = class {
3464
3616
  };
3465
3617
  }
3466
3618
  _createObservableAcceptingInvitation(handler, initialState) {
3467
- const otpEnteredTrigger = new Trigger5();
3619
+ const otpEnteredTrigger = new Trigger6();
3468
3620
  const stream = new PushStream();
3469
3621
  const ctx = new Context6({
3470
3622
  onError: (err) => {
3471
3623
  if (err instanceof TimeoutError2) {
3472
- log10("timeout", {
3624
+ log12("timeout", {
3473
3625
  ...handler.toJSON()
3474
3626
  }, {
3475
- F: __dxlog_file13,
3627
+ F: __dxlog_file15,
3476
3628
  L: 261,
3477
3629
  S: this,
3478
3630
  C: (f, a) => f(...a)
@@ -3482,8 +3634,8 @@ var InvitationsManager = class {
3482
3634
  state: Invitation6.State.TIMEOUT
3483
3635
  });
3484
3636
  } else {
3485
- log10.warn("auth failed", err, {
3486
- F: __dxlog_file13,
3637
+ log12.warn("auth failed", err, {
3638
+ F: __dxlog_file15,
3487
3639
  L: 264,
3488
3640
  S: this,
3489
3641
  C: (f, a) => f(...a)
@@ -3495,12 +3647,15 @@ var InvitationsManager = class {
3495
3647
  }
3496
3648
  void ctx.dispose();
3497
3649
  }
3650
+ }, {
3651
+ F: __dxlog_file15,
3652
+ L: 258
3498
3653
  });
3499
3654
  ctx.onDispose(() => {
3500
- log10("complete", {
3655
+ log12("complete", {
3501
3656
  ...handler.toJSON()
3502
3657
  }, {
3503
- F: __dxlog_file13,
3658
+ F: __dxlog_file15,
3504
3659
  L: 271,
3505
3660
  S: this,
3506
3661
  C: (f, a) => f(...a)
@@ -3544,8 +3699,8 @@ var InvitationsManager = class {
3544
3699
  try {
3545
3700
  await this._metadataStore.removeInvitation(invitation.invitationId);
3546
3701
  } catch (err) {
3547
- log10.catch(err, void 0, {
3548
- F: __dxlog_file13,
3702
+ log12.catch(err, void 0, {
3703
+ F: __dxlog_file15,
3549
3704
  L: 307,
3550
3705
  S: this,
3551
3706
  C: (f, a) => f(...a)
@@ -3560,33 +3715,40 @@ var InvitationsManager = class {
3560
3715
  };
3561
3716
 
3562
3717
  // packages/sdk/client-services/src/packlets/spaces/data-space.ts
3563
- 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";
3564
3719
  import { AUTH_TIMEOUT as AUTH_TIMEOUT2 } from "@dxos/client-protocol";
3565
- 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";
3566
3721
  import { timed, warnAfterTimeout } from "@dxos/debug";
3567
- import { AutomergeDocumentLoaderImpl, createIdFromSpaceKey, createMappedFeedWriter } from "@dxos/echo-pipeline";
3568
- import { TYPE_PROPERTIES } from "@dxos/echo-schema";
3569
- 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";
3570
3725
  import { PublicKey as PublicKey10 } from "@dxos/keys";
3571
- import { log as log12 } from "@dxos/log";
3726
+ import { log as log15 } from "@dxos/log";
3572
3727
  import { CancelledError, SystemError } from "@dxos/protocols";
3573
- import { CreateEpochRequest, SpaceState } from "@dxos/protocols/proto/dxos/client/services";
3728
+ import { SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
3574
3729
  import { AdmittedFeed as AdmittedFeed3, SpaceMember as SpaceMember4 } from "@dxos/protocols/proto/dxos/halo/credentials";
3575
- import { Timeframe as Timeframe2 } from "@dxos/timeframe";
3730
+ import { Timeframe as Timeframe3 } from "@dxos/timeframe";
3576
3731
  import { trace as trace6 } from "@dxos/tracing";
3577
- import { ComplexSet as ComplexSet5, assignDeep } from "@dxos/util";
3732
+ import { ComplexSet as ComplexSet5 } from "@dxos/util";
3578
3733
 
3579
3734
  // packages/sdk/client-services/src/packlets/spaces/automerge-space-state.ts
3580
3735
  import { Event as Event4 } from "@dxos/async";
3736
+ import { Resource as Resource2 } from "@dxos/context";
3581
3737
  import { checkCredentialType } from "@dxos/credentials";
3582
- var AutomergeSpaceState = class {
3738
+ var AutomergeSpaceState = class extends Resource2 {
3583
3739
  constructor(_onNewRoot) {
3740
+ super();
3584
3741
  this._onNewRoot = _onNewRoot;
3585
3742
  this.rootUrl = void 0;
3586
3743
  this.lastEpoch = void 0;
3587
3744
  this.onNewEpoch = new Event4();
3588
3745
  this._isProcessingRootDocs = false;
3589
3746
  }
3747
+ async _open(ctx) {
3748
+ }
3749
+ async _close(ctx) {
3750
+ this._isProcessingRootDocs = false;
3751
+ }
3590
3752
  async processCredential(credential) {
3591
3753
  if (!checkCredentialType(credential, "dxos.halo.credentials.Epoch")) {
3592
3754
  return;
@@ -3614,23 +3776,186 @@ var AutomergeSpaceState = class {
3614
3776
  }
3615
3777
  };
3616
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
+ try {
3884
+ const handle = context.repo.find(url);
3885
+ await cancelWithContext4(ctx, asyncTimeout2(handle.whenReady(), 1e4));
3886
+ invariant12(handle.docSync(), "Doc not found", {
3887
+ F: __dxlog_file16,
3888
+ L: 108,
3889
+ S: void 0,
3890
+ A: [
3891
+ "handle.docSync()",
3892
+ "'Doc not found'"
3893
+ ]
3894
+ });
3895
+ const newDoc = await convertLegacyReferences(structuredClone(handle.docSync()));
3896
+ const migratedDoc = migrateDocument(handle.docSync(), newDoc);
3897
+ const newHandle = context.repo.import(am.save(migratedDoc));
3898
+ newRootContent.links[id] = newHandle.url;
3899
+ } catch (err) {
3900
+ log13.warn("Failed to migrate reference", {
3901
+ id,
3902
+ url,
3903
+ error: err
3904
+ }, {
3905
+ F: __dxlog_file16,
3906
+ L: 114,
3907
+ S: void 0,
3908
+ C: (f, a) => f(...a)
3909
+ });
3910
+ delete newRootContent.links[id];
3911
+ }
3912
+ }
3913
+ const migratedRoot = migrateDocument(rootHandle.docSync(), newRootContent);
3914
+ const newRoot = context.repo.import(am.save(migratedRoot));
3915
+ await context.repo.flush();
3916
+ return {
3917
+ newRoot: newRoot.url
3918
+ };
3919
+ }
3920
+ case CreateEpochRequest.Migration.REPLACE_AUTOMERGE_ROOT: {
3921
+ invariant12(context.newAutomergeRoot, void 0, {
3922
+ F: __dxlog_file16,
3923
+ L: 129,
3924
+ S: void 0,
3925
+ A: [
3926
+ "context.newAutomergeRoot",
3927
+ ""
3928
+ ]
3929
+ });
3930
+ await context.repo.flush();
3931
+ return {
3932
+ newRoot: context.newAutomergeRoot
3933
+ };
3934
+ }
3935
+ }
3936
+ return {};
3937
+ };
3938
+
3617
3939
  // packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts
3618
- import { DeferredTask, Event as Event5, scheduleTask as scheduleTask4, sleep, TimeoutError as TimeoutError3, Trigger as Trigger6 } from "@dxos/async";
3940
+ import { DeferredTask, Event as Event5, scheduleTask as scheduleTask4, sleep as sleep2, TimeoutError as TimeoutError3, Trigger as Trigger7 } from "@dxos/async";
3619
3941
  import { Context as Context7, rejectOnDispose } from "@dxos/context";
3620
- import { invariant as invariant12 } from "@dxos/invariant";
3942
+ import { invariant as invariant13 } from "@dxos/invariant";
3621
3943
  import { PublicKey as PublicKey9 } from "@dxos/keys";
3622
- import { log as log11 } from "@dxos/log";
3944
+ import { log as log14 } from "@dxos/log";
3623
3945
  import { schema as schema4 } from "@dxos/protocols";
3624
3946
  import { RpcExtension as RpcExtension3 } from "@dxos/teleport";
3625
3947
  import { ComplexMap as ComplexMap2, ComplexSet as ComplexSet4, entry } from "@dxos/util";
3626
- var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
3948
+ var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
3627
3949
  var DEFAULT_RETRY_TIMEOUT = 1e3;
3628
3950
  var DEFAULT_SUCCESS_DELAY = 1e3;
3629
3951
  var DEFAULT_NOTARIZE_TIMEOUT = 1e4;
3630
3952
  var WRITER_NOT_SET_ERROR_CODE = "WRITER_NOT_SET";
3631
3953
  var NotarizationPlugin = class {
3632
3954
  constructor() {
3633
- this._ctx = new Context7();
3955
+ this._ctx = new Context7(void 0, {
3956
+ F: __dxlog_file17,
3957
+ L: 62
3958
+ });
3634
3959
  this._extensionOpened = new Event5();
3635
3960
  this._extensions = /* @__PURE__ */ new Set();
3636
3961
  this._processedCredentials = new ComplexSet4(PublicKey9.hash);
@@ -3648,16 +3973,16 @@ var NotarizationPlugin = class {
3648
3973
  * Request credentials to be notarized.
3649
3974
  */
3650
3975
  async notarize({ ctx: opCtx, credentials, timeout = DEFAULT_NOTARIZE_TIMEOUT, retryTimeout = DEFAULT_RETRY_TIMEOUT, successDelay = DEFAULT_SUCCESS_DELAY }) {
3651
- log11("notarize", {
3976
+ log14("notarize", {
3652
3977
  credentials
3653
3978
  }, {
3654
- F: __dxlog_file14,
3979
+ F: __dxlog_file17,
3655
3980
  L: 90,
3656
3981
  S: this,
3657
3982
  C: (f, a) => f(...a)
3658
3983
  });
3659
- invariant12(credentials.every((credential) => credential.id), "Credentials must have an id", {
3660
- F: __dxlog_file14,
3984
+ invariant13(credentials.every((credential) => credential.id), "Credentials must have an id", {
3985
+ F: __dxlog_file17,
3661
3986
  L: 91,
3662
3987
  S: this,
3663
3988
  A: [
@@ -3665,13 +3990,13 @@ var NotarizationPlugin = class {
3665
3990
  "'Credentials must have an id'"
3666
3991
  ]
3667
3992
  });
3668
- const errors = new Trigger6();
3993
+ const errors = new Trigger7();
3669
3994
  const ctx = this._ctx.derive({
3670
3995
  onError: (err) => {
3671
- log11.warn("Notarization error", {
3996
+ log14.warn("Notarization error", {
3672
3997
  err
3673
3998
  }, {
3674
- F: __dxlog_file14,
3999
+ F: __dxlog_file17,
3675
4000
  L: 99,
3676
4001
  S: this,
3677
4002
  C: (f, a) => f(...a)
@@ -3683,11 +4008,11 @@ var NotarizationPlugin = class {
3683
4008
  opCtx?.onDispose(() => ctx.dispose());
3684
4009
  if (timeout !== 0) {
3685
4010
  scheduleTask4(ctx, () => {
3686
- log11.warn("Notarization timeout", {
4011
+ log14.warn("Notarization timeout", {
3687
4012
  timeout,
3688
4013
  peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)
3689
4014
  }, {
3690
- F: __dxlog_file14,
4015
+ F: __dxlog_file17,
3691
4016
  L: 111,
3692
4017
  S: this,
3693
4018
  C: (f, a) => f(...a)
@@ -3707,10 +4032,10 @@ var NotarizationPlugin = class {
3707
4032
  ...this._extensions
3708
4033
  ].find((peer2) => !peersTried.has(peer2));
3709
4034
  if (!peer) {
3710
- log11.info("Exhausted all peers to notarize with", {
4035
+ log14.info("Exhausted all peers to notarize with", {
3711
4036
  retryIn: retryTimeout
3712
4037
  }, {
3713
- F: __dxlog_file14,
4038
+ F: __dxlog_file17,
3714
4039
  L: 136,
3715
4040
  S: this,
3716
4041
  C: (f, a) => f(...a)
@@ -3720,11 +4045,11 @@ var NotarizationPlugin = class {
3720
4045
  return;
3721
4046
  }
3722
4047
  peersTried.add(peer);
3723
- log11("try notarizing", {
4048
+ log14("try notarizing", {
3724
4049
  peer: peer.localPeerId,
3725
4050
  credentialId: credentials.map((credential) => credential.id)
3726
4051
  }, {
3727
- F: __dxlog_file14,
4052
+ F: __dxlog_file17,
3728
4053
  L: 143,
3729
4054
  S: this,
3730
4055
  C: (f, a) => f(...a)
@@ -3732,17 +4057,17 @@ var NotarizationPlugin = class {
3732
4057
  await peer.rpc.NotarizationService.notarize({
3733
4058
  credentials: credentials.filter((credential) => !this._processedCredentials.has(credential.id))
3734
4059
  });
3735
- log11("success", void 0, {
3736
- F: __dxlog_file14,
4060
+ log14("success", void 0, {
4061
+ F: __dxlog_file17,
3737
4062
  L: 147,
3738
4063
  S: this,
3739
4064
  C: (f, a) => f(...a)
3740
4065
  });
3741
- await sleep(successDelay);
4066
+ await sleep2(successDelay);
3742
4067
  } catch (err) {
3743
4068
  if (!ctx.disposed && !err.message.includes(WRITER_NOT_SET_ERROR_CODE)) {
3744
- log11.info("error notarizing (recoverable)", err, {
3745
- F: __dxlog_file14,
4069
+ log14.info("error notarizing (recoverable)", err, {
4070
+ F: __dxlog_file17,
3746
4071
  L: 151,
3747
4072
  S: this,
3748
4073
  C: (f, a) => f(...a)
@@ -3759,8 +4084,8 @@ var NotarizationPlugin = class {
3759
4084
  allNotarized,
3760
4085
  errors.wait()
3761
4086
  ]);
3762
- log11("done", void 0, {
3763
- F: __dxlog_file14,
4087
+ log14("done", void 0, {
4088
+ F: __dxlog_file17,
3764
4089
  L: 162,
3765
4090
  S: this,
3766
4091
  C: (f, a) => f(...a)
@@ -3781,8 +4106,8 @@ var NotarizationPlugin = class {
3781
4106
  this._processCredentialsTriggers.delete(credential.id);
3782
4107
  }
3783
4108
  setWriter(writer) {
3784
- invariant12(!this._writer, "Writer already set.", {
3785
- F: __dxlog_file14,
4109
+ invariant13(!this._writer, "Writer already set.", {
4110
+ F: __dxlog_file17,
3786
4111
  L: 181,
3787
4112
  S: this,
3788
4113
  A: [
@@ -3796,7 +4121,7 @@ var NotarizationPlugin = class {
3796
4121
  if (this._processedCredentials.has(id)) {
3797
4122
  return;
3798
4123
  }
3799
- await entry(this._processCredentialsTriggers, id).orInsert(new Trigger6()).value.wait();
4124
+ await entry(this._processCredentialsTriggers, id).orInsert(new Trigger7()).value.wait();
3800
4125
  }
3801
4126
  /**
3802
4127
  * Requests from other peers to notarize credentials.
@@ -3806,8 +4131,8 @@ var NotarizationPlugin = class {
3806
4131
  throw new Error(WRITER_NOT_SET_ERROR_CODE);
3807
4132
  }
3808
4133
  for (const credential of request.credentials ?? []) {
3809
- invariant12(credential.id, "Credential must have an id", {
3810
- F: __dxlog_file14,
4134
+ invariant13(credential.id, "Credential must have an id", {
4135
+ F: __dxlog_file17,
3811
4136
  L: 200,
3812
4137
  S: this,
3813
4138
  A: [
@@ -3824,10 +4149,10 @@ var NotarizationPlugin = class {
3824
4149
  createExtension() {
3825
4150
  const extension = new NotarizationTeleportExtension({
3826
4151
  onOpen: async () => {
3827
- log11("extension opened", {
4152
+ log14("extension opened", {
3828
4153
  peer: extension.localPeerId
3829
4154
  }, {
3830
- F: __dxlog_file14,
4155
+ F: __dxlog_file17,
3831
4156
  L: 211,
3832
4157
  S: this,
3833
4158
  C: (f, a) => f(...a)
@@ -3836,10 +4161,10 @@ var NotarizationPlugin = class {
3836
4161
  this._extensionOpened.emit();
3837
4162
  },
3838
4163
  onClose: async () => {
3839
- log11("extension closed", {
4164
+ log14("extension closed", {
3840
4165
  peer: extension.localPeerId
3841
4166
  }, {
3842
- F: __dxlog_file14,
4167
+ F: __dxlog_file17,
3843
4168
  L: 216,
3844
4169
  S: this,
3845
4170
  C: (f, a) => f(...a)
@@ -3893,15 +4218,83 @@ function _ts_decorate4(decorators, target, key, desc) {
3893
4218
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3894
4219
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3895
4220
  }
3896
- var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
4221
+ function _using_ctx() {
4222
+ var _disposeSuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed) {
4223
+ var err = new Error();
4224
+ err.name = "SuppressedError";
4225
+ err.suppressed = suppressed;
4226
+ err.error = error;
4227
+ return err;
4228
+ }, empty = {}, stack = [];
4229
+ function using(isAwait, value) {
4230
+ if (value != null) {
4231
+ if (Object(value) !== value) {
4232
+ throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");
4233
+ }
4234
+ if (isAwait) {
4235
+ var dispose = value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")];
4236
+ }
4237
+ if (dispose == null) {
4238
+ dispose = value[Symbol.dispose || Symbol.for("Symbol.dispose")];
4239
+ }
4240
+ if (typeof dispose !== "function") {
4241
+ throw new TypeError(`Property [Symbol.dispose] is not a function.`);
4242
+ }
4243
+ stack.push({
4244
+ v: value,
4245
+ d: dispose,
4246
+ a: isAwait
4247
+ });
4248
+ } else if (isAwait) {
4249
+ stack.push({
4250
+ d: value,
4251
+ a: isAwait
4252
+ });
4253
+ }
4254
+ return value;
4255
+ }
4256
+ return {
4257
+ e: empty,
4258
+ u: using.bind(null, false),
4259
+ a: using.bind(null, true),
4260
+ d: function() {
4261
+ var error = this.e;
4262
+ function next() {
4263
+ while (resource = stack.pop()) {
4264
+ try {
4265
+ var resource, disposalResult = resource.d && resource.d.call(resource.v);
4266
+ if (resource.a) {
4267
+ return Promise.resolve(disposalResult).then(next, err);
4268
+ }
4269
+ } catch (e) {
4270
+ return err(e);
4271
+ }
4272
+ }
4273
+ if (error !== empty)
4274
+ throw error;
4275
+ }
4276
+ function err(e) {
4277
+ error = error !== empty ? new _disposeSuppressedError(error, e) : e;
4278
+ return next();
4279
+ }
4280
+ return next();
4281
+ }
4282
+ };
4283
+ }
4284
+ var __dxlog_file18 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
3897
4285
  var DataSpace = class {
3898
4286
  constructor(params) {
3899
- this._ctx = new Context8();
4287
+ this._ctx = new Context8(void 0, {
4288
+ F: __dxlog_file18,
4289
+ L: 84
4290
+ });
3900
4291
  this._notarizationPlugin = new NotarizationPlugin();
3901
4292
  this._cache = void 0;
3902
4293
  // TODO(dmaretskyi): Move into Space?
3903
4294
  this._automergeSpaceState = new AutomergeSpaceState((rootUrl) => this._onNewAutomergeRoot(rootUrl));
3904
- this._state = SpaceState.CLOSED;
4295
+ this._epochProcessingMutex = new Mutex2();
4296
+ this._state = SpaceState2.CLOSED;
4297
+ this._databaseRoot = null;
3905
4298
  /**
3906
4299
  * Error for _state === SpaceState.ERROR.
3907
4300
  */
@@ -3925,11 +4318,11 @@ var DataSpace = class {
3925
4318
  });
3926
4319
  this._cache = params.cache;
3927
4320
  this._state = params.initialState;
3928
- log12("new state", {
3929
- state: SpaceState[this._state]
4321
+ log15("new state", {
4322
+ state: SpaceState2[this._state]
3930
4323
  }, {
3931
- F: __dxlog_file15,
3932
- L: 143,
4324
+ F: __dxlog_file18,
4325
+ L: 146,
3933
4326
  S: this,
3934
4327
  C: (f, a) => f(...a)
3935
4328
  });
@@ -3962,6 +4355,9 @@ var DataSpace = class {
3962
4355
  get automergeSpaceState() {
3963
4356
  return this._automergeSpaceState;
3964
4357
  }
4358
+ get databaseRoot() {
4359
+ return this._databaseRoot;
4360
+ }
3965
4361
  get _automergeInfo() {
3966
4362
  return {
3967
4363
  rootUrl: this._automergeSpaceState.rootUrl,
@@ -3969,20 +4365,27 @@ var DataSpace = class {
3969
4365
  };
3970
4366
  }
3971
4367
  async open() {
3972
- await this._open();
4368
+ if (this._state === SpaceState2.CLOSED) {
4369
+ await this._open();
4370
+ }
3973
4371
  }
3974
4372
  async _open() {
4373
+ await this._presence.open();
3975
4374
  await this._gossip.open();
3976
4375
  await this._notarizationPlugin.open();
3977
4376
  await this._inner.spaceState.addCredentialProcessor(this._notarizationPlugin);
4377
+ await this._automergeSpaceState.open();
3978
4378
  await this._inner.spaceState.addCredentialProcessor(this._automergeSpaceState);
3979
- await this._inner.open(new Context8());
3980
- this._state = SpaceState.CONTROL_ONLY;
3981
- log12("new state", {
3982
- state: SpaceState[this._state]
4379
+ await this._inner.open(new Context8(void 0, {
4380
+ F: __dxlog_file18,
4381
+ L: 215
4382
+ }));
4383
+ this._state = SpaceState2.CONTROL_ONLY;
4384
+ log15("new state", {
4385
+ state: SpaceState2[this._state]
3983
4386
  }, {
3984
- F: __dxlog_file15,
3985
- L: 206,
4387
+ F: __dxlog_file18,
4388
+ L: 217,
3986
4389
  S: this,
3987
4390
  C: (f, a) => f(...a)
3988
4391
  });
@@ -3995,23 +4398,27 @@ var DataSpace = class {
3995
4398
  }
3996
4399
  async _close() {
3997
4400
  await this._callbacks.beforeClose?.();
3998
- this._state = SpaceState.CLOSED;
3999
- log12("new state", {
4000
- state: SpaceState[this._state]
4401
+ this._state = SpaceState2.CLOSED;
4402
+ log15("new state", {
4403
+ state: SpaceState2[this._state]
4001
4404
  }, {
4002
- F: __dxlog_file15,
4003
- L: 220,
4405
+ F: __dxlog_file18,
4406
+ L: 231,
4004
4407
  S: this,
4005
4408
  C: (f, a) => f(...a)
4006
4409
  });
4007
4410
  await this._ctx.dispose();
4008
- this._ctx = new Context8();
4411
+ this._ctx = new Context8(void 0, {
4412
+ F: __dxlog_file18,
4413
+ L: 233
4414
+ });
4009
4415
  await this.authVerifier.close();
4010
4416
  await this._inner.close();
4011
4417
  await this._inner.spaceState.removeCredentialProcessor(this._automergeSpaceState);
4418
+ await this._automergeSpaceState.close();
4012
4419
  await this._inner.spaceState.removeCredentialProcessor(this._notarizationPlugin);
4013
4420
  await this._notarizationPlugin.close();
4014
- await this._presence.destroy();
4421
+ await this._presence.close();
4015
4422
  await this._gossip.close();
4016
4423
  }
4017
4424
  async postMessage(channel, message) {
@@ -4030,26 +4437,26 @@ var DataSpace = class {
4030
4437
  await this.initializeDataPipeline();
4031
4438
  } catch (err) {
4032
4439
  if (err instanceof CancelledError || err instanceof ContextDisposedError3) {
4033
- log12("data pipeline initialization cancelled", err, {
4034
- F: __dxlog_file15,
4035
- L: 253,
4440
+ log15("data pipeline initialization cancelled", err, {
4441
+ F: __dxlog_file18,
4442
+ L: 265,
4036
4443
  S: this,
4037
4444
  C: (f, a) => f(...a)
4038
4445
  });
4039
4446
  return;
4040
4447
  }
4041
- log12.error("Error initializing data pipeline", err, {
4042
- F: __dxlog_file15,
4043
- L: 257,
4448
+ log15.error("Error initializing data pipeline", err, {
4449
+ F: __dxlog_file18,
4450
+ L: 269,
4044
4451
  S: this,
4045
4452
  C: (f, a) => f(...a)
4046
4453
  });
4047
- this._state = SpaceState.ERROR;
4048
- log12("new state", {
4049
- state: SpaceState[this._state]
4454
+ this._state = SpaceState2.ERROR;
4455
+ log15("new state", {
4456
+ state: SpaceState2[this._state]
4050
4457
  }, {
4051
- F: __dxlog_file15,
4052
- L: 259,
4458
+ F: __dxlog_file18,
4459
+ L: 271,
4053
4460
  S: this,
4054
4461
  C: (f, a) => f(...a)
4055
4462
  });
@@ -4061,35 +4468,32 @@ var DataSpace = class {
4061
4468
  });
4062
4469
  }
4063
4470
  async initializeDataPipeline() {
4064
- if (this._state !== SpaceState.CONTROL_ONLY) {
4471
+ if (this._state !== SpaceState2.CONTROL_ONLY) {
4065
4472
  throw new SystemError("Invalid operation");
4066
4473
  }
4067
- this._state = SpaceState.INITIALIZING;
4068
- log12("new state", {
4069
- state: SpaceState[this._state]
4474
+ this._state = SpaceState2.INITIALIZING;
4475
+ log15("new state", {
4476
+ state: SpaceState2[this._state]
4070
4477
  }, {
4071
- F: __dxlog_file15,
4072
- L: 275,
4478
+ F: __dxlog_file18,
4479
+ L: 287,
4073
4480
  S: this,
4074
4481
  C: (f, a) => f(...a)
4075
4482
  });
4076
4483
  await this._initializeAndReadControlPipeline();
4077
- await sleep2(1);
4484
+ await sleep3(1);
4485
+ const ready = this.stateUpdate.waitForCondition(() => this._state === SpaceState2.READY);
4078
4486
  this._automergeSpaceState.startProcessingRootDocs();
4079
- await cancelWithContext4(this._ctx, this.automergeSpaceState.ensureEpochInitialized());
4080
- log12("data pipeline ready", void 0, {
4081
- F: __dxlog_file15,
4082
- L: 287,
4083
- S: this,
4084
- C: (f, a) => f(...a)
4085
- });
4487
+ await ready;
4488
+ }
4489
+ async _enterReadyState() {
4086
4490
  await this._callbacks.beforeReady?.();
4087
- this._state = SpaceState.READY;
4088
- log12("new state", {
4089
- state: SpaceState[this._state]
4491
+ this._state = SpaceState2.READY;
4492
+ log15("new state", {
4493
+ state: SpaceState2[this._state]
4090
4494
  }, {
4091
- F: __dxlog_file15,
4092
- L: 291,
4495
+ F: __dxlog_file18,
4496
+ L: 306,
4093
4497
  S: this,
4094
4498
  C: (f, a) => f(...a)
4095
4499
  });
@@ -4103,9 +4507,9 @@ var DataSpace = class {
4103
4507
  });
4104
4508
  this.metrics.controlPipelineReady = /* @__PURE__ */ new Date();
4105
4509
  await this._createWritableFeeds();
4106
- log12("writable feeds created", void 0, {
4107
- F: __dxlog_file15,
4108
- L: 307,
4510
+ log15("writable feeds created", void 0, {
4511
+ F: __dxlog_file18,
4512
+ L: 322,
4109
4513
  S: this,
4110
4514
  C: (f, a) => f(...a)
4111
4515
  });
@@ -4163,57 +4567,66 @@ var DataSpace = class {
4163
4567
  }
4164
4568
  }
4165
4569
  _onNewAutomergeRoot(rootUrl) {
4166
- log12("loading automerge root doc for space", {
4570
+ log15("loading automerge root doc for space", {
4167
4571
  space: this.key,
4168
4572
  rootUrl
4169
4573
  }, {
4170
- F: __dxlog_file15,
4171
- L: 373,
4574
+ F: __dxlog_file18,
4575
+ L: 388,
4172
4576
  S: this,
4173
4577
  C: (f, a) => f(...a)
4174
4578
  });
4175
- this._echoHost.replicateDocument(rootUrl);
4176
4579
  const handle = this._echoHost.automergeRepo.find(rootUrl);
4177
4580
  queueMicrotask(async () => {
4178
4581
  try {
4179
- await warnAfterTimeout(5e3, "Automerge root doc load timeout (DataSpace)", async () => {
4180
- await cancelWithContext4(this._ctx, handle.whenReady());
4181
- });
4182
- if (this._ctx.disposed) {
4183
- return;
4184
- }
4185
- const doc = handle.docSync() ?? failedInvariant();
4186
- if (!doc.access?.spaceKey) {
4187
- handle.change((doc2) => {
4188
- doc2.access = {
4189
- spaceKey: this.key.toHex()
4190
- };
4191
- });
4192
- }
4193
- if (!this._echoHost.roots.has(handle.documentId)) {
4194
- await this._echoHost.openSpaceRoot(handle.url);
4195
- } else {
4196
- log12.warn("echo database root already exists", {
4197
- space: this.key,
4198
- rootUrl
4199
- }, {
4200
- F: __dxlog_file15,
4201
- L: 400,
4202
- S: this,
4203
- C: (f, a) => f(...a)
4582
+ try {
4583
+ var _usingCtx = _using_ctx();
4584
+ await warnAfterTimeout(5e3, "Automerge root doc load timeout (DataSpace)", async () => {
4585
+ await cancelWithContext5(this._ctx, handle.whenReady());
4204
4586
  });
4587
+ if (this._ctx.disposed) {
4588
+ return;
4589
+ }
4590
+ const _guard = (
4591
+ // Ensure only one root is processed at a time.
4592
+ _usingCtx.u(await this._epochProcessingMutex.acquire())
4593
+ );
4594
+ const doc = handle.docSync() ?? failedInvariant();
4595
+ if (!doc.access?.spaceKey) {
4596
+ handle.change((doc2) => {
4597
+ doc2.access = {
4598
+ spaceKey: this.key.toHex()
4599
+ };
4600
+ });
4601
+ }
4602
+ const root = await this._echoHost.openSpaceRoot(handle.url);
4603
+ this._databaseRoot = root;
4604
+ if (root.getVersion() !== SpaceDocVersion.CURRENT) {
4605
+ if (this._state !== SpaceState2.REQUIRES_MIGRATION) {
4606
+ this._state = SpaceState2.REQUIRES_MIGRATION;
4607
+ this.stateUpdate.emit();
4608
+ }
4609
+ } else {
4610
+ if (this._state !== SpaceState2.READY) {
4611
+ await this._enterReadyState();
4612
+ }
4613
+ }
4614
+ } catch (_) {
4615
+ _usingCtx.e = _;
4616
+ } finally {
4617
+ _usingCtx.d();
4205
4618
  }
4206
4619
  } catch (err) {
4207
4620
  if (err instanceof ContextDisposedError3) {
4208
4621
  return;
4209
4622
  }
4210
- log12.warn("error loading automerge root doc", {
4623
+ log15.warn("error loading automerge root doc", {
4211
4624
  space: this.key,
4212
4625
  rootUrl,
4213
4626
  err
4214
4627
  }, {
4215
- F: __dxlog_file15,
4216
- L: 406,
4628
+ F: __dxlog_file18,
4629
+ L: 431,
4217
4630
  S: this,
4218
4631
  C: (f, a) => f(...a)
4219
4632
  });
@@ -4236,175 +4649,70 @@ var DataSpace = class {
4236
4649
  });
4237
4650
  }
4238
4651
  async createEpoch(options) {
4239
- let epoch;
4240
- switch (options?.migration) {
4241
- case void 0:
4242
- case CreateEpochRequest.Migration.NONE:
4243
- {
4244
- epoch = {
4245
- previousId: this._automergeSpaceState.lastEpoch?.id,
4246
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4247
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe2(),
4248
- automergeRoot: this._automergeSpaceState.lastEpoch?.subject.assertion?.automergeRoot
4249
- };
4250
- }
4251
- break;
4252
- case CreateEpochRequest.Migration.INIT_AUTOMERGE:
4253
- {
4254
- const document = this._echoHost.automergeRepo.create();
4255
- epoch = {
4256
- previousId: this._automergeSpaceState.lastEpoch?.id,
4257
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4258
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe2(),
4259
- automergeRoot: document.url
4260
- };
4261
- }
4262
- break;
4263
- case CreateEpochRequest.Migration.PRUNE_AUTOMERGE_ROOT_HISTORY:
4264
- {
4265
- const currentRootUrl = this._automergeSpaceState.rootUrl;
4266
- const rootHandle = this._echoHost.automergeRepo.find(currentRootUrl);
4267
- await cancelWithContext4(this._ctx, asyncTimeout2(rootHandle.whenReady(), 1e4));
4268
- const newRoot = this._echoHost.automergeRepo.create(rootHandle.docSync());
4269
- invariant13(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
4270
- F: __dxlog_file15,
4271
- L: 456,
4272
- S: this,
4273
- A: [
4274
- "typeof newRoot.url === 'string' && newRoot.url.length > 0",
4275
- ""
4276
- ]
4277
- });
4278
- epoch = {
4279
- previousId: this._automergeSpaceState.lastEpoch?.id,
4280
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4281
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe2(),
4282
- automergeRoot: newRoot.url
4283
- };
4284
- }
4285
- break;
4286
- case CreateEpochRequest.Migration.FRAGMENT_AUTOMERGE_ROOT:
4287
- {
4288
- log12.info("Fragmenting", void 0, {
4289
- F: __dxlog_file15,
4290
- L: 468,
4291
- S: this,
4292
- C: (f, a) => f(...a)
4293
- });
4294
- const currentRootUrl = this._automergeSpaceState.rootUrl;
4295
- const rootHandle = this._echoHost.automergeRepo.find(currentRootUrl);
4296
- await cancelWithContext4(this._ctx, asyncTimeout2(rootHandle.whenReady(), 1e4));
4297
- const objects = Object.entries(rootHandle.docSync().objects);
4298
- const properties = findPropertiesObject(rootHandle.docSync());
4299
- const otherObjects = objects.filter(([key]) => key !== properties?.[0]);
4300
- invariant13(properties, "Properties not found", {
4301
- F: __dxlog_file15,
4302
- L: 478,
4303
- S: this,
4304
- A: [
4305
- "properties",
4306
- "'Properties not found'"
4307
- ]
4308
- });
4309
- const newSpaceDoc = {
4310
- ...rootHandle.docSync(),
4311
- objects: Object.fromEntries([
4312
- properties
4313
- ])
4314
- };
4315
- const newRoot = this._echoHost.automergeRepo.create(newSpaceDoc);
4316
- invariant13(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
4317
- F: __dxlog_file15,
4318
- L: 483,
4319
- S: this,
4320
- A: [
4321
- "typeof newRoot.url === 'string' && newRoot.url.length > 0",
4322
- ""
4323
- ]
4324
- });
4325
- const docLoader = new AutomergeDocumentLoaderImpl(await createIdFromSpaceKey(this.key), this._echoHost.automergeRepo, this.key);
4326
- await docLoader.loadSpaceRootDocHandle(this._ctx, {
4327
- rootUrl: newRoot.url
4328
- });
4329
- otherObjects.forEach(([key, value]) => {
4330
- const handle = docLoader.createDocumentForObject(key);
4331
- handle.change((doc) => {
4332
- assignDeep(doc, [
4333
- "objects",
4334
- key
4335
- ], value);
4336
- });
4337
- });
4338
- epoch = {
4339
- previousId: this._automergeSpaceState.lastEpoch?.id,
4340
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4341
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe2(),
4342
- automergeRoot: newRoot.url
4343
- };
4344
- }
4345
- break;
4346
- case CreateEpochRequest.Migration.REPLACE_AUTOMERGE_ROOT:
4347
- {
4348
- invariant13(options.newAutomergeRoot, void 0, {
4349
- F: __dxlog_file15,
4350
- L: 513,
4351
- S: this,
4352
- A: [
4353
- "options.newAutomergeRoot",
4354
- ""
4355
- ]
4356
- });
4357
- epoch = {
4358
- previousId: this._automergeSpaceState.lastEpoch?.id,
4359
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4360
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe2(),
4361
- automergeRoot: options.newAutomergeRoot
4362
- };
4363
- }
4364
- break;
4365
- }
4366
- if (!epoch) {
4367
- return;
4652
+ const ctx = this._ctx.derive();
4653
+ if (!options?.migration) {
4654
+ return null;
4368
4655
  }
4656
+ const { newRoot } = await runEpochMigration(ctx, {
4657
+ repo: this._echoHost.automergeRepo,
4658
+ spaceId: this.id,
4659
+ spaceKey: this.key,
4660
+ migration: options.migration,
4661
+ currentRoot: this._automergeSpaceState.rootUrl ?? null,
4662
+ newAutomergeRoot: options.newAutomergeRoot
4663
+ });
4664
+ const epoch = {
4665
+ previousId: this._automergeSpaceState.lastEpoch?.id,
4666
+ number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
4667
+ timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe3(),
4668
+ automergeRoot: newRoot ?? this._automergeSpaceState.rootUrl
4669
+ };
4670
+ const credential = await this._signingContext.credentialSigner.createCredential({
4671
+ subject: this.key,
4672
+ assertion: {
4673
+ "@type": "dxos.halo.credentials.Epoch",
4674
+ ...epoch
4675
+ }
4676
+ });
4369
4677
  const receipt = await this.inner.controlPipeline.writer.write({
4370
4678
  credential: {
4371
- credential: await this._signingContext.credentialSigner.createCredential({
4372
- subject: this.key,
4373
- assertion: {
4374
- "@type": "dxos.halo.credentials.Epoch",
4375
- ...epoch
4376
- }
4377
- })
4679
+ credential
4378
4680
  }
4379
4681
  });
4380
- await this.inner.controlPipeline.state.waitUntilTimeframe(new Timeframe2([
4682
+ await this.inner.controlPipeline.state.waitUntilTimeframe(new Timeframe3([
4381
4683
  [
4382
4684
  receipt.feedKey,
4383
4685
  receipt.seq
4384
4686
  ]
4385
4687
  ]));
4386
4688
  await this._echoHost.updateIndexes();
4689
+ return credential;
4387
4690
  }
4388
4691
  async activate() {
4389
- if (this._state !== SpaceState.INACTIVE) {
4692
+ if (![
4693
+ SpaceState2.CLOSED,
4694
+ SpaceState2.INACTIVE
4695
+ ].includes(this._state)) {
4390
4696
  return;
4391
4697
  }
4392
- await this._metadataStore.setSpaceState(this.key, SpaceState.ACTIVE);
4698
+ await this._metadataStore.setSpaceState(this.key, SpaceState2.ACTIVE);
4393
4699
  await this._open();
4394
4700
  this.initializeDataPipelineAsync();
4395
4701
  }
4396
4702
  async deactivate() {
4397
- if (this._state === SpaceState.INACTIVE) {
4703
+ if (this._state === SpaceState2.INACTIVE) {
4398
4704
  return;
4399
4705
  }
4400
- await this._metadataStore.setSpaceState(this.key, SpaceState.INACTIVE);
4401
- await this._close();
4402
- this._state = SpaceState.INACTIVE;
4403
- log12("new state", {
4404
- state: SpaceState[this._state]
4706
+ await this._metadataStore.setSpaceState(this.key, SpaceState2.INACTIVE);
4707
+ if (this._state !== SpaceState2.CLOSED) {
4708
+ await this._close();
4709
+ }
4710
+ this._state = SpaceState2.INACTIVE;
4711
+ log15("new state", {
4712
+ state: SpaceState2[this._state]
4405
4713
  }, {
4406
- F: __dxlog_file15,
4407
- L: 566,
4714
+ F: __dxlog_file18,
4715
+ L: 512,
4408
4716
  S: this,
4409
4717
  C: (f, a) => f(...a)
4410
4718
  });
@@ -4422,7 +4730,7 @@ _ts_decorate4([
4422
4730
  ], DataSpace.prototype, "key", null);
4423
4731
  _ts_decorate4([
4424
4732
  trace6.info({
4425
- enum: SpaceState
4733
+ enum: SpaceState2
4426
4734
  })
4427
4735
  ], DataSpace.prototype, "state", null);
4428
4736
  _ts_decorate4([
@@ -4459,39 +4767,33 @@ DataSpace = _ts_decorate4([
4459
4767
  trackLeaks("open", "close"),
4460
4768
  trace6.resource()
4461
4769
  ], DataSpace);
4462
- var findPropertiesObject = (spaceDoc) => {
4463
- for (const id in spaceDoc.objects ?? {}) {
4464
- const obj = spaceDoc.objects[id];
4465
- if (obj.system.type?.itemId === TYPE_PROPERTIES) {
4466
- return [
4467
- id,
4468
- obj
4469
- ];
4470
- }
4471
- }
4472
- return void 0;
4473
- };
4474
4770
 
4475
4771
  // packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts
4476
4772
  import { Event as Event7, synchronized as synchronized2, trackLeaks as trackLeaks2 } from "@dxos/async";
4477
- import { cancelWithContext as cancelWithContext5, Context as Context9 } from "@dxos/context";
4478
- import { getCredentialAssertion as getCredentialAssertion2 } from "@dxos/credentials";
4773
+ import { PropertiesType } from "@dxos/client-protocol";
4774
+ import { Context as Context9, cancelWithContext as cancelWithContext6 } from "@dxos/context";
4775
+ import { getCredentialAssertion as getCredentialAssertion3, createAdmissionCredentials } from "@dxos/credentials";
4776
+ import { convertLegacyReferences as convertLegacyReferences2, findInlineObjectOfType as findInlineObjectOfType2 } from "@dxos/echo-db";
4479
4777
  import { AuthStatus } from "@dxos/echo-pipeline";
4778
+ import { CredentialServerExtension } from "@dxos/echo-pipeline";
4779
+ import { LEGACY_TYPE_PROPERTIES, SpaceDocVersion as SpaceDocVersion2, encodeReference } from "@dxos/echo-protocol";
4780
+ import { TYPE_PROPERTIES as TYPE_PROPERTIES2, generateEchoId, getTypeReference } from "@dxos/echo-schema";
4781
+ import { writeMessages as writeMessages3 } from "@dxos/feed-store";
4480
4782
  import { invariant as invariant14 } from "@dxos/invariant";
4481
4783
  import { PublicKey as PublicKey11 } from "@dxos/keys";
4482
- import { log as log13 } from "@dxos/log";
4483
- import { trace as Trace2 } from "@dxos/protocols";
4484
- import { Invitation as Invitation7, SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
4784
+ import { log as log16 } from "@dxos/log";
4785
+ import { trace as Trace2, AlreadyJoinedError as AlreadyJoinedError3 } from "@dxos/protocols";
4786
+ import { Invitation as Invitation7, SpaceState as SpaceState3 } from "@dxos/protocols/proto/dxos/client/services";
4485
4787
  import { SpaceMember as SpaceMember6 } from "@dxos/protocols/proto/dxos/halo/credentials";
4486
4788
  import { Gossip as Gossip2, Presence as Presence2 } from "@dxos/teleport-extension-gossip";
4487
4789
  import { trace as trace7 } from "@dxos/tracing";
4488
- import { ComplexMap as ComplexMap3, deferFunction as deferFunction2, forEachAsync } from "@dxos/util";
4790
+ import { ComplexMap as ComplexMap3, assignDeep as assignDeep2, deferFunction as deferFunction2, forEachAsync } from "@dxos/util";
4489
4791
 
4490
4792
  // packages/sdk/client-services/src/packlets/spaces/genesis.ts
4491
4793
  import { createCredential } from "@dxos/credentials";
4492
4794
  import { failUndefined } from "@dxos/debug";
4493
4795
  import { AdmittedFeed as AdmittedFeed4, SpaceMember as SpaceMember5 } from "@dxos/protocols/proto/dxos/halo/credentials";
4494
- import { Timeframe as Timeframe3 } from "@dxos/timeframe";
4796
+ import { Timeframe as Timeframe4 } from "@dxos/timeframe";
4495
4797
  var spaceGenesis = async (keyring, signingContext, space, automergeRoot) => {
4496
4798
  const credentials = [
4497
4799
  await createCredential({
@@ -4541,7 +4843,7 @@ var spaceGenesis = async (keyring, signingContext, space, automergeRoot) => {
4541
4843
  "@type": "dxos.halo.credentials.Epoch",
4542
4844
  number: 0,
4543
4845
  previousId: void 0,
4544
- timeframe: new Timeframe3(),
4846
+ timeframe: new Timeframe4(),
4545
4847
  snapshotCid: void 0,
4546
4848
  automergeRoot
4547
4849
  }
@@ -4568,11 +4870,12 @@ function _ts_decorate5(decorators, target, key, desc) {
4568
4870
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
4569
4871
  return c > 3 && r && Object.defineProperty(target, key, r), r;
4570
4872
  }
4571
- var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
4873
+ var __dxlog_file19 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
4572
4874
  var PRESENCE_ANNOUNCE_INTERVAL = 1e4;
4573
4875
  var PRESENCE_OFFLINE_TIMEOUT = 2e4;
4876
+ var DEFAULT_SPACE_KEY = "__DEFAULT__";
4574
4877
  var DataSpaceManager = class {
4575
- constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _echoHost, _invitationsManager, params) {
4878
+ constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _echoHost, _invitationsManager, _params) {
4576
4879
  this._spaceManager = _spaceManager;
4577
4880
  this._metadataStore = _metadataStore;
4578
4881
  this._keyring = _keyring;
@@ -4580,14 +4883,15 @@ var DataSpaceManager = class {
4580
4883
  this._feedStore = _feedStore;
4581
4884
  this._echoHost = _echoHost;
4582
4885
  this._invitationsManager = _invitationsManager;
4583
- this._ctx = new Context9();
4886
+ this._params = _params;
4887
+ this._ctx = new Context9(void 0, {
4888
+ F: __dxlog_file19,
4889
+ L: 104
4890
+ });
4584
4891
  this.updated = new Event7();
4585
4892
  this._spaces = new ComplexMap3(PublicKey11.hash);
4586
4893
  this._isOpen = false;
4587
4894
  this._instanceId = PublicKey11.random().toHex();
4588
- const { spaceMemberPresenceAnnounceInterval = PRESENCE_ANNOUNCE_INTERVAL, spaceMemberPresenceOfflineTimeout = PRESENCE_OFFLINE_TIMEOUT } = params ?? {};
4589
- this._spaceMemberPresenceAnnounceInterval = spaceMemberPresenceAnnounceInterval;
4590
- this._spaceMemberPresenceOfflineTimeout = spaceMemberPresenceOfflineTimeout;
4591
4895
  trace7.diagnostic({
4592
4896
  id: "spaces",
4593
4897
  name: "Spaces",
@@ -4596,10 +4900,10 @@ var DataSpaceManager = class {
4596
4900
  const rootUrl = space.automergeSpaceState.rootUrl;
4597
4901
  const rootHandle = rootUrl ? this._echoHost.automergeRepo.find(rootUrl) : void 0;
4598
4902
  const rootDoc = rootHandle?.docSync();
4599
- const properties = rootDoc && findPropertiesObject(rootDoc);
4903
+ const properties = rootDoc && findInlineObjectOfType2(rootDoc, TYPE_PROPERTIES2);
4600
4904
  return {
4601
4905
  key: space.key.toHex(),
4602
- state: SpaceState2[space.state],
4906
+ state: SpaceState3[space.state],
4603
4907
  name: properties?.[1].data.name ?? null,
4604
4908
  inlineObjects: rootDoc ? Object.keys(rootDoc.objects ?? {}).length : null,
4605
4909
  linkedObjects: rootDoc ? Object.keys(rootDoc.links ?? {}).length : null,
@@ -4616,46 +4920,46 @@ var DataSpaceManager = class {
4616
4920
  return this._spaces;
4617
4921
  }
4618
4922
  async open() {
4619
- log13("open", void 0, {
4620
- F: __dxlog_file16,
4621
- L: 144,
4923
+ log16("open", void 0, {
4924
+ F: __dxlog_file19,
4925
+ L: 156,
4622
4926
  S: this,
4623
4927
  C: (f, a) => f(...a)
4624
4928
  });
4625
- log13.trace("dxos.echo.data-space-manager.open", Trace2.begin({
4929
+ log16.trace("dxos.echo.data-space-manager.open", Trace2.begin({
4626
4930
  id: this._instanceId
4627
4931
  }), {
4628
- F: __dxlog_file16,
4629
- L: 145,
4932
+ F: __dxlog_file19,
4933
+ L: 157,
4630
4934
  S: this,
4631
4935
  C: (f, a) => f(...a)
4632
4936
  });
4633
- log13("metadata loaded", {
4937
+ log16("metadata loaded", {
4634
4938
  spaces: this._metadataStore.spaces.length
4635
4939
  }, {
4636
- F: __dxlog_file16,
4637
- L: 146,
4940
+ F: __dxlog_file19,
4941
+ L: 158,
4638
4942
  S: this,
4639
4943
  C: (f, a) => f(...a)
4640
4944
  });
4641
4945
  await forEachAsync(this._metadataStore.spaces, async (spaceMetadata) => {
4642
4946
  try {
4643
- log13("load space", {
4947
+ log16("load space", {
4644
4948
  spaceMetadata
4645
4949
  }, {
4646
- F: __dxlog_file16,
4647
- L: 150,
4950
+ F: __dxlog_file19,
4951
+ L: 162,
4648
4952
  S: this,
4649
4953
  C: (f, a) => f(...a)
4650
4954
  });
4651
4955
  await this._constructSpace(spaceMetadata);
4652
4956
  } catch (err) {
4653
- log13.error("Error loading space", {
4957
+ log16.error("Error loading space", {
4654
4958
  spaceMetadata,
4655
4959
  err
4656
4960
  }, {
4657
- F: __dxlog_file16,
4658
- L: 153,
4961
+ F: __dxlog_file19,
4962
+ L: 165,
4659
4963
  S: this,
4660
4964
  C: (f, a) => f(...a)
4661
4965
  });
@@ -4663,24 +4967,19 @@ var DataSpaceManager = class {
4663
4967
  });
4664
4968
  this._isOpen = true;
4665
4969
  this.updated.emit();
4666
- for (const space of this._spaces.values()) {
4667
- if (space.state !== SpaceState2.INACTIVE) {
4668
- space.initializeDataPipelineAsync();
4669
- }
4670
- }
4671
- log13.trace("dxos.echo.data-space-manager.open", Trace2.end({
4970
+ log16.trace("dxos.echo.data-space-manager.open", Trace2.end({
4672
4971
  id: this._instanceId
4673
4972
  }), {
4674
- F: __dxlog_file16,
4675
- L: 166,
4973
+ F: __dxlog_file19,
4974
+ L: 172,
4676
4975
  S: this,
4677
4976
  C: (f, a) => f(...a)
4678
4977
  });
4679
4978
  }
4680
4979
  async close() {
4681
- log13("close", void 0, {
4682
- F: __dxlog_file16,
4683
- L: 171,
4980
+ log16("close", void 0, {
4981
+ F: __dxlog_file19,
4982
+ L: 177,
4684
4983
  S: this,
4685
4984
  C: (f, a) => f(...a)
4686
4985
  });
@@ -4689,14 +4988,15 @@ var DataSpaceManager = class {
4689
4988
  for (const space of this._spaces.values()) {
4690
4989
  await space.close();
4691
4990
  }
4991
+ this._spaces.clear();
4692
4992
  }
4693
4993
  /**
4694
4994
  * Creates a new space writing the genesis credentials to the control feed.
4695
4995
  */
4696
4996
  async createSpace() {
4697
4997
  invariant14(this._isOpen, "Not open.", {
4698
- F: __dxlog_file16,
4699
- L: 184,
4998
+ F: __dxlog_file19,
4999
+ L: 191,
4700
5000
  S: this,
4701
5001
  A: [
4702
5002
  "this._isOpen",
@@ -4711,24 +5011,25 @@ var DataSpaceManager = class {
4711
5011
  genesisFeedKey: controlFeedKey,
4712
5012
  controlFeedKey,
4713
5013
  dataFeedKey,
4714
- state: SpaceState2.ACTIVE
5014
+ state: SpaceState3.ACTIVE
4715
5015
  };
4716
- log13("creating space...", {
5016
+ log16("creating space...", {
4717
5017
  spaceKey
4718
5018
  }, {
4719
- F: __dxlog_file16,
4720
- L: 196,
5019
+ F: __dxlog_file19,
5020
+ L: 203,
4721
5021
  S: this,
4722
5022
  C: (f, a) => f(...a)
4723
5023
  });
4724
5024
  const root = await this._echoHost.createSpaceRoot(spaceKey);
4725
5025
  const space = await this._constructSpace(metadata);
5026
+ await space.open();
4726
5027
  const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner, root.url);
4727
5028
  await this._metadataStore.addSpace(metadata);
4728
5029
  const memberCredential = credentials[1];
4729
- invariant14(getCredentialAssertion2(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
4730
- F: __dxlog_file16,
4731
- L: 205,
5030
+ invariant14(getCredentialAssertion3(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
5031
+ F: __dxlog_file19,
5032
+ L: 213,
4732
5033
  S: this,
4733
5034
  A: [
4734
5035
  "getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -4740,19 +5041,85 @@ var DataSpaceManager = class {
4740
5041
  this.updated.emit();
4741
5042
  return space;
4742
5043
  }
5044
+ async isDefaultSpace(space) {
5045
+ if (!space.databaseRoot) {
5046
+ return false;
5047
+ }
5048
+ switch (space.databaseRoot.getVersion()) {
5049
+ case SpaceDocVersion2.CURRENT: {
5050
+ const [_, properties] = findInlineObjectOfType2(space.databaseRoot.docSync(), TYPE_PROPERTIES2) ?? [];
5051
+ return properties?.data?.[DEFAULT_SPACE_KEY] === this._signingContext.identityKey.toHex();
5052
+ }
5053
+ case SpaceDocVersion2.LEGACY: {
5054
+ const convertedDoc = await convertLegacyReferences2(space.databaseRoot.docSync());
5055
+ const [_, properties] = findInlineObjectOfType2(convertedDoc, LEGACY_TYPE_PROPERTIES) ?? [];
5056
+ return properties?.data?.[DEFAULT_SPACE_KEY] === this._signingContext.identityKey.toHex();
5057
+ }
5058
+ default:
5059
+ log16.warn("unknown space version", {
5060
+ version: space.databaseRoot.getVersion(),
5061
+ spaceId: space.id
5062
+ }, {
5063
+ F: __dxlog_file19,
5064
+ L: 238,
5065
+ S: this,
5066
+ C: (f, a) => f(...a)
5067
+ });
5068
+ return false;
5069
+ }
5070
+ }
5071
+ async createDefaultSpace() {
5072
+ const space = await this.createSpace();
5073
+ const document = await this._getSpaceRootDocument(space);
5074
+ const properties = {
5075
+ system: {
5076
+ type: encodeReference(getTypeReference(PropertiesType))
5077
+ },
5078
+ data: {
5079
+ [DEFAULT_SPACE_KEY]: this._signingContext.identityKey.toHex()
5080
+ },
5081
+ meta: {
5082
+ keys: []
5083
+ }
5084
+ };
5085
+ const propertiesId = generateEchoId();
5086
+ document.change((doc) => {
5087
+ assignDeep2(doc, [
5088
+ "objects",
5089
+ propertiesId
5090
+ ], properties);
5091
+ });
5092
+ await this._echoHost.flush();
5093
+ return space;
5094
+ }
5095
+ async _getSpaceRootDocument(space) {
5096
+ const automergeIndex = space.automergeSpaceState.rootUrl;
5097
+ invariant14(automergeIndex, void 0, {
5098
+ F: __dxlog_file19,
5099
+ L: 271,
5100
+ S: this,
5101
+ A: [
5102
+ "automergeIndex",
5103
+ ""
5104
+ ]
5105
+ });
5106
+ const document = this._echoHost.automergeRepo.find(automergeIndex);
5107
+ await document.whenReady();
5108
+ return document;
5109
+ }
4743
5110
  // TODO(burdon): Rename join space.
4744
5111
  async acceptSpace(opts) {
4745
- log13("accept space", {
5112
+ log16("accept space", {
4746
5113
  opts
4747
5114
  }, {
4748
- F: __dxlog_file16,
4749
- L: 217,
5115
+ F: __dxlog_file19,
5116
+ L: 280,
4750
5117
  S: this,
4751
5118
  C: (f, a) => f(...a)
4752
5119
  });
4753
5120
  invariant14(this._isOpen, "Not open.", {
4754
- F: __dxlog_file16,
4755
- L: 218,
5121
+ F: __dxlog_file19,
5122
+ L: 281,
4756
5123
  S: this,
4757
5124
  A: [
4758
5125
  "this._isOpen",
@@ -4760,25 +5127,63 @@ var DataSpaceManager = class {
4760
5127
  ]
4761
5128
  });
4762
5129
  invariant14(!this._spaces.has(opts.spaceKey), "Space already exists.", {
4763
- F: __dxlog_file16,
4764
- L: 219,
5130
+ F: __dxlog_file19,
5131
+ L: 282,
4765
5132
  S: this,
4766
5133
  A: [
4767
5134
  "!this._spaces.has(opts.spaceKey)",
4768
5135
  "'Space already exists.'"
4769
5136
  ]
4770
5137
  });
4771
- const metadata = {
4772
- key: opts.spaceKey,
4773
- genesisFeedKey: opts.genesisFeedKey,
4774
- controlTimeframe: opts.controlTimeframe,
4775
- dataTimeframe: opts.dataTimeframe
4776
- };
4777
- const space = await this._constructSpace(metadata);
4778
- await this._metadataStore.addSpace(metadata);
4779
- space.initializeDataPipelineAsync();
4780
- this.updated.emit();
4781
- return space;
5138
+ const metadata = {
5139
+ key: opts.spaceKey,
5140
+ genesisFeedKey: opts.genesisFeedKey,
5141
+ controlTimeframe: opts.controlTimeframe,
5142
+ dataTimeframe: opts.dataTimeframe
5143
+ };
5144
+ const space = await this._constructSpace(metadata);
5145
+ await space.open();
5146
+ await this._metadataStore.addSpace(metadata);
5147
+ space.initializeDataPipelineAsync();
5148
+ this.updated.emit();
5149
+ return space;
5150
+ }
5151
+ async admitMember(options) {
5152
+ const space = this._spaceManager.spaces.get(options.spaceKey);
5153
+ invariant14(space, void 0, {
5154
+ F: __dxlog_file19,
5155
+ L: 302,
5156
+ S: this,
5157
+ A: [
5158
+ "space",
5159
+ ""
5160
+ ]
5161
+ });
5162
+ if (space.spaceState.getMemberRole(options.identityKey) !== SpaceMember6.Role.REMOVED) {
5163
+ throw new AlreadyJoinedError3();
5164
+ }
5165
+ const credentials = await createAdmissionCredentials(this._signingContext.credentialSigner, options.identityKey, space.key, space.genesisFeedKey, options.role, space.spaceState.membershipChainHeads, options.profile, options.delegationCredentialId);
5166
+ invariant14(credentials[0].credential, void 0, {
5167
+ F: __dxlog_file19,
5168
+ L: 321,
5169
+ S: this,
5170
+ A: [
5171
+ "credentials[0].credential",
5172
+ ""
5173
+ ]
5174
+ });
5175
+ const spaceMemberCredential = credentials[0].credential.credential;
5176
+ invariant14(getCredentialAssertion3(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
5177
+ F: __dxlog_file19,
5178
+ L: 323,
5179
+ S: this,
5180
+ A: [
5181
+ "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
5182
+ ""
5183
+ ]
5184
+ });
5185
+ await writeMessages3(space.controlPipeline.writer, credentials);
5186
+ return spaceMemberCredential;
4782
5187
  }
4783
5188
  /**
4784
5189
  * Wait until the space data pipeline is fully initialized.
@@ -4786,17 +5191,29 @@ var DataSpaceManager = class {
4786
5191
  * TODO(dmaretskyi): Consider removing.
4787
5192
  */
4788
5193
  async waitUntilSpaceReady(spaceKey) {
4789
- await cancelWithContext5(this._ctx, this.updated.waitForCondition(() => {
5194
+ await cancelWithContext6(this._ctx, this.updated.waitForCondition(() => {
4790
5195
  const space = this._spaces.get(spaceKey);
4791
- return !!space && space.state === SpaceState2.READY;
5196
+ return !!space && space.state === SpaceState3.READY;
4792
5197
  }));
4793
5198
  }
5199
+ async requestSpaceAdmissionCredential(spaceKey) {
5200
+ return this._spaceManager.requestSpaceAdmissionCredential({
5201
+ spaceKey,
5202
+ identityKey: this._signingContext.identityKey,
5203
+ timeout: 15e3,
5204
+ swarmIdentity: {
5205
+ peerKey: this._signingContext.deviceKey,
5206
+ credentialProvider: createAuthProvider(this._signingContext.credentialSigner),
5207
+ credentialAuthenticator: async () => true
5208
+ }
5209
+ });
5210
+ }
4794
5211
  async _constructSpace(metadata) {
4795
- log13("construct space", {
5212
+ log16("construct space", {
4796
5213
  metadata
4797
5214
  }, {
4798
- F: __dxlog_file16,
4799
- L: 252,
5215
+ F: __dxlog_file19,
5216
+ L: 358,
4800
5217
  S: this,
4801
5218
  C: (f, a) => f(...a)
4802
5219
  });
@@ -4804,8 +5221,8 @@ var DataSpaceManager = class {
4804
5221
  localPeerId: this._signingContext.deviceKey
4805
5222
  });
4806
5223
  const presence = new Presence2({
4807
- announceInterval: this._spaceMemberPresenceAnnounceInterval,
4808
- offlineTimeout: this._spaceMemberPresenceOfflineTimeout,
5224
+ announceInterval: this._params?.spaceMemberPresenceAnnounceInterval ?? PRESENCE_ANNOUNCE_INTERVAL,
5225
+ offlineTimeout: this._params?.spaceMemberPresenceOfflineTimeout ?? PRESENCE_OFFLINE_TIMEOUT,
4809
5226
  identityKey: this._signingContext.identityKey,
4810
5227
  gossip
4811
5228
  });
@@ -4824,6 +5241,7 @@ var DataSpaceManager = class {
4824
5241
  credentialAuthenticator: deferFunction2(() => dataSpace.authVerifier.verifier)
4825
5242
  },
4826
5243
  onAuthorizedConnection: (session) => {
5244
+ session.addExtension("dxos.mesh.teleport.admission-discovery", new CredentialServerExtension(space));
4827
5245
  session.addExtension("dxos.mesh.teleport.gossip", gossip.createExtension({
4828
5246
  remotePeerId: session.remotePeerId
4829
5247
  }));
@@ -4832,15 +5250,15 @@ var DataSpaceManager = class {
4832
5250
  session.addExtension("dxos.mesh.teleport.automerge", this._echoHost.createReplicationExtension());
4833
5251
  },
4834
5252
  onAuthFailure: () => {
4835
- log13.warn("auth failure", void 0, {
4836
- F: __dxlog_file16,
4837
- L: 289,
5253
+ log16.warn("auth failure", void 0, {
5254
+ F: __dxlog_file19,
5255
+ L: 396,
4838
5256
  S: this,
4839
5257
  C: (f, a) => f(...a)
4840
5258
  });
4841
5259
  },
4842
5260
  onMemberRolesChanged: async (members) => {
4843
- if (dataSpace?.state === SpaceState2.READY) {
5261
+ if (dataSpace?.state === SpaceState3.READY) {
4844
5262
  this._handleMemberRoleChanges(presence, space.protocol, members);
4845
5263
  }
4846
5264
  },
@@ -4853,7 +5271,7 @@ var DataSpaceManager = class {
4853
5271
  dataFeed && await space.setDataFeed(dataFeed);
4854
5272
  const dataSpace = new DataSpace({
4855
5273
  inner: space,
4856
- initialState: metadata.state === SpaceState2.INACTIVE ? SpaceState2.INACTIVE : SpaceState2.CLOSED,
5274
+ initialState: metadata.state === SpaceState3.INACTIVE ? SpaceState3.INACTIVE : SpaceState3.CLOSED,
4857
5275
  metadataStore: this._metadataStore,
4858
5276
  gossip,
4859
5277
  presence,
@@ -4863,22 +5281,22 @@ var DataSpaceManager = class {
4863
5281
  signingContext: this._signingContext,
4864
5282
  callbacks: {
4865
5283
  beforeReady: async () => {
4866
- log13("before space ready", {
5284
+ log16("before space ready", {
4867
5285
  space: space.key
4868
5286
  }, {
4869
- F: __dxlog_file16,
4870
- L: 316,
5287
+ F: __dxlog_file19,
5288
+ L: 423,
4871
5289
  S: this,
4872
5290
  C: (f, a) => f(...a)
4873
5291
  });
4874
5292
  },
4875
5293
  afterReady: async () => {
4876
- log13("after space ready", {
5294
+ log16("after space ready", {
4877
5295
  space: space.key,
4878
5296
  open: this._isOpen
4879
5297
  }, {
4880
- F: __dxlog_file16,
4881
- L: 319,
5298
+ F: __dxlog_file19,
5299
+ L: 426,
4882
5300
  S: this,
4883
5301
  C: (f, a) => f(...a)
4884
5302
  });
@@ -4893,11 +5311,11 @@ var DataSpaceManager = class {
4893
5311
  }
4894
5312
  },
4895
5313
  beforeClose: async () => {
4896
- log13("before space close", {
5314
+ log16("before space close", {
4897
5315
  space: space.key
4898
5316
  }, {
4899
- F: __dxlog_file16,
4900
- L: 327,
5317
+ F: __dxlog_file19,
5318
+ L: 434,
4901
5319
  S: this,
4902
5320
  C: (f, a) => f(...a)
4903
5321
  });
@@ -4906,13 +5324,10 @@ var DataSpaceManager = class {
4906
5324
  cache: metadata.cache
4907
5325
  });
4908
5326
  presence.newPeer.on((peerState) => {
4909
- if (dataSpace.state === SpaceState2.READY) {
5327
+ if (dataSpace.state === SpaceState3.READY) {
4910
5328
  this._handleNewPeerConnected(space, peerState);
4911
5329
  }
4912
5330
  });
4913
- if (metadata.state !== SpaceState2.INACTIVE) {
4914
- await dataSpace.open();
4915
- }
4916
5331
  if (metadata.controlTimeframe) {
4917
5332
  dataSpace.inner.controlPipeline.state.setTargetTimeframe(metadata.controlTimeframe);
4918
5333
  }
@@ -4931,17 +5346,17 @@ var DataSpaceManager = class {
4931
5346
  return (s && member.role === SpaceMember6.Role.REMOVED !== (s.authStatus === AuthStatus.FAILURE)) ?? false;
4932
5347
  });
4933
5348
  sessionsToClose.forEach((session) => {
4934
- void session.close().catch(log13.error);
5349
+ void session.close().catch(log16.error);
4935
5350
  });
4936
5351
  closedSessions += sessionsToClose.length;
4937
5352
  }
4938
- log13("processed member role changes", {
5353
+ log16("processed member role changes", {
4939
5354
  roleChangeCount: memberInfo.length,
4940
5355
  peersOnline: presence.getPeersOnline().length,
4941
5356
  closedSessions
4942
5357
  }, {
4943
- F: __dxlog_file16,
4944
- L: 367,
5358
+ F: __dxlog_file19,
5359
+ L: 470,
4945
5360
  S: this,
4946
5361
  C: (f, a) => f(...a)
4947
5362
  });
@@ -4952,20 +5367,20 @@ var DataSpaceManager = class {
4952
5367
  if (role === SpaceMember6.Role.REMOVED) {
4953
5368
  const session = peerState.peerId && space.protocol.sessions.get(peerState.peerId);
4954
5369
  if (session != null) {
4955
- log13("closing a session with a removed peer", {
5370
+ log16("closing a session with a removed peer", {
4956
5371
  peerId: peerState.peerId
4957
5372
  }, {
4958
- F: __dxlog_file16,
4959
- L: 381,
5373
+ F: __dxlog_file19,
5374
+ L: 484,
4960
5375
  S: this,
4961
5376
  C: (f, a) => f(...a)
4962
5377
  });
4963
- void session.close().catch(log13.error);
5378
+ void session.close().catch(log16.error);
4964
5379
  }
4965
5380
  }
4966
5381
  }
4967
5382
  async _handleInvitationStatusChange(dataSpace, delegatedInvitation, isActive) {
4968
- if (dataSpace?.state !== SpaceState2.READY) {
5383
+ if (dataSpace?.state !== SpaceState3.READY) {
4969
5384
  return;
4970
5385
  }
4971
5386
  if (isActive) {
@@ -5019,15 +5434,15 @@ DataSpaceManager = _ts_decorate5([
5019
5434
  // packages/sdk/client-services/src/packlets/spaces/spaces-service.ts
5020
5435
  import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTask as scheduleTask6 } from "@dxos/async";
5021
5436
  import { Stream as Stream10 } from "@dxos/codec-protobuf";
5022
- import { createAdmissionCredentials as createAdmissionCredentials2, getCredentialAssertion as getCredentialAssertion3 } from "@dxos/credentials";
5437
+ import { createAdmissionCredentials as createAdmissionCredentials2, getCredentialAssertion as getCredentialAssertion4 } from "@dxos/credentials";
5023
5438
  import { raise as raise2 } from "@dxos/debug";
5024
- import { writeMessages as writeMessages3 } from "@dxos/feed-store";
5439
+ import { writeMessages as writeMessages4 } from "@dxos/feed-store";
5025
5440
  import { invariant as invariant15 } from "@dxos/invariant";
5026
- import { log as log14 } from "@dxos/log";
5441
+ import { log as log17 } from "@dxos/log";
5027
5442
  import { ApiError, SpaceNotFoundError as SpaceNotFoundError2, encodeError, IdentityNotInitializedError, AuthorizationError as AuthorizationError2 } from "@dxos/protocols";
5028
- import { SpaceMember as SpaceMember7, SpaceState as SpaceState3 } from "@dxos/protocols/proto/dxos/client/services";
5443
+ import { SpaceMember as SpaceMember7, SpaceState as SpaceState4 } from "@dxos/protocols/proto/dxos/client/services";
5029
5444
  import { trace as trace8 } from "@dxos/tracing";
5030
- var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
5445
+ var __dxlog_file20 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
5031
5446
  var SpacesServiceImpl = class {
5032
5447
  constructor(_identityManager, _spaceManager, _getDataSpaceManager) {
5033
5448
  this._identityManager = _identityManager;
@@ -5046,10 +5461,10 @@ var SpacesServiceImpl = class {
5046
5461
  const space = dataSpaceManager.spaces.get(spaceKey) ?? raise2(new SpaceNotFoundError2(spaceKey));
5047
5462
  if (state) {
5048
5463
  switch (state) {
5049
- case SpaceState3.ACTIVE:
5464
+ case SpaceState4.ACTIVE:
5050
5465
  await space.activate();
5051
5466
  break;
5052
- case SpaceState3.INACTIVE:
5467
+ case SpaceState4.INACTIVE:
5053
5468
  await space.deactivate();
5054
5469
  break;
5055
5470
  default:
@@ -5071,8 +5486,8 @@ var SpacesServiceImpl = class {
5071
5486
  }
5072
5487
  const credentials = await createAdmissionCredentials2(identity.getIdentityCredentialSigner(), request.memberKey, space.key, space.genesisFeedKey, request.newRole, space.spaceState.membershipChainHeads);
5073
5488
  invariant15(credentials[0].credential, void 0, {
5074
- F: __dxlog_file17,
5075
- L: 97,
5489
+ F: __dxlog_file20,
5490
+ L: 102,
5076
5491
  S: this,
5077
5492
  A: [
5078
5493
  "credentials[0].credential",
@@ -5080,27 +5495,27 @@ var SpacesServiceImpl = class {
5080
5495
  ]
5081
5496
  });
5082
5497
  const spaceMemberCredential = credentials[0].credential.credential;
5083
- invariant15(getCredentialAssertion3(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
5084
- F: __dxlog_file17,
5085
- L: 99,
5498
+ invariant15(getCredentialAssertion4(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
5499
+ F: __dxlog_file20,
5500
+ L: 104,
5086
5501
  S: this,
5087
5502
  A: [
5088
5503
  "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
5089
5504
  ""
5090
5505
  ]
5091
5506
  });
5092
- await writeMessages3(space.controlPipeline.writer, credentials);
5507
+ await writeMessages4(space.controlPipeline.writer, credentials);
5093
5508
  }
5094
5509
  querySpaces() {
5095
5510
  return new Stream10(({ next, ctx }) => {
5096
5511
  const scheduler = new UpdateScheduler(ctx, async () => {
5097
5512
  const dataSpaceManager = await this._getDataSpaceManager();
5098
5513
  const spaces = Array.from(dataSpaceManager.spaces.values()).map((space) => this._serializeSpace(space));
5099
- log14("update", {
5514
+ log17("update", {
5100
5515
  spaces
5101
5516
  }, {
5102
- F: __dxlog_file17,
5103
- L: 110,
5517
+ F: __dxlog_file20,
5518
+ L: 115,
5104
5519
  S: this,
5105
5520
  C: (f, a) => f(...a)
5106
5521
  });
@@ -5118,7 +5533,15 @@ var SpacesServiceImpl = class {
5118
5533
  const subscribeSpaces = () => {
5119
5534
  subscriptions.clear();
5120
5535
  for (const space of dataSpaceManager.spaces.values()) {
5121
- subscriptions.add(space.stateUpdate.on(ctx, () => scheduler.forceTrigger()));
5536
+ let lastState;
5537
+ subscriptions.add(space.stateUpdate.on(ctx, () => {
5538
+ if (space.state !== lastState) {
5539
+ scheduler.forceTrigger();
5540
+ } else {
5541
+ scheduler.trigger();
5542
+ }
5543
+ lastState = space.state;
5544
+ }));
5122
5545
  subscriptions.add(space.presence.updated.on(ctx, () => scheduler.trigger()));
5123
5546
  subscriptions.add(space.automergeSpaceState.onNewEpoch.on(ctx, () => scheduler.trigger()));
5124
5547
  subscriptions.add(space.inner.controlPipeline.state.timeframeUpdate.on(ctx, () => scheduler.trigger()));
@@ -5183,8 +5606,8 @@ var SpacesServiceImpl = class {
5183
5606
  });
5184
5607
  } else {
5185
5608
  invariant15(!credential.id, "Id on unsigned credentials is not allowed", {
5186
- F: __dxlog_file17,
5187
- L: 198,
5609
+ F: __dxlog_file20,
5610
+ L: 213,
5188
5611
  S: this,
5189
5612
  A: [
5190
5613
  "!credential.id",
@@ -5192,8 +5615,8 @@ var SpacesServiceImpl = class {
5192
5615
  ]
5193
5616
  });
5194
5617
  invariant15(this._identityManager.identity, "Identity is not available", {
5195
- F: __dxlog_file17,
5196
- L: 199,
5618
+ F: __dxlog_file20,
5619
+ L: 214,
5197
5620
  S: this,
5198
5621
  A: [
5199
5622
  "this._identityManager.identity",
@@ -5202,8 +5625,8 @@ var SpacesServiceImpl = class {
5202
5625
  });
5203
5626
  const signer = this._identityManager.identity.getIdentityCredentialSigner();
5204
5627
  invariant15(credential.issuer.equals(signer.getIssuer()), void 0, {
5205
- F: __dxlog_file17,
5206
- L: 201,
5628
+ F: __dxlog_file20,
5629
+ L: 216,
5207
5630
  S: this,
5208
5631
  A: [
5209
5632
  "credential.issuer.equals(signer.getIssuer())",
@@ -5225,10 +5648,66 @@ var SpacesServiceImpl = class {
5225
5648
  async createEpoch({ spaceKey, migration, automergeRootUrl }) {
5226
5649
  const dataSpaceManager = await this._getDataSpaceManager();
5227
5650
  const space = dataSpaceManager.spaces.get(spaceKey) ?? raise2(new SpaceNotFoundError2(spaceKey));
5228
- await space.createEpoch({
5651
+ const credential = await space.createEpoch({
5229
5652
  migration,
5230
5653
  newAutomergeRoot: automergeRootUrl
5231
5654
  });
5655
+ return {
5656
+ epochCredential: credential ?? void 0
5657
+ };
5658
+ }
5659
+ async admitContact(request) {
5660
+ const dataSpaceManager = await this._getDataSpaceManager();
5661
+ await dataSpaceManager.admitMember({
5662
+ spaceKey: request.spaceKey,
5663
+ identityKey: request.contact.identityKey,
5664
+ role: request.role
5665
+ });
5666
+ }
5667
+ async joinBySpaceKey({ spaceKey }) {
5668
+ const dataSpaceManager = await this._getDataSpaceManager();
5669
+ const credential = await dataSpaceManager.requestSpaceAdmissionCredential(spaceKey);
5670
+ return this._joinByAdmission({
5671
+ credential
5672
+ });
5673
+ }
5674
+ async _joinByAdmission({ credential }) {
5675
+ const assertion = getCredentialAssertion4(credential);
5676
+ invariant15(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
5677
+ F: __dxlog_file20,
5678
+ L: 250,
5679
+ S: this,
5680
+ A: [
5681
+ "assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
5682
+ "'Invalid credential'"
5683
+ ]
5684
+ });
5685
+ const myIdentity = this._identityManager.identity;
5686
+ invariant15(myIdentity && credential.subject.id.equals(myIdentity.identityKey), void 0, {
5687
+ F: __dxlog_file20,
5688
+ L: 252,
5689
+ S: this,
5690
+ A: [
5691
+ "myIdentity && credential.subject.id.equals(myIdentity.identityKey)",
5692
+ ""
5693
+ ]
5694
+ });
5695
+ const dataSpaceManager = await this._getDataSpaceManager();
5696
+ let dataSpace = dataSpaceManager.spaces.get(assertion.spaceKey);
5697
+ if (!dataSpace) {
5698
+ dataSpace = await dataSpaceManager.acceptSpace({
5699
+ spaceKey: assertion.spaceKey,
5700
+ genesisFeedKey: assertion.genesisFeedKey
5701
+ });
5702
+ await myIdentity.controlPipeline.writer.write({
5703
+ credential: {
5704
+ credential
5705
+ }
5706
+ });
5707
+ }
5708
+ return {
5709
+ space: this._serializeSpace(dataSpace)
5710
+ };
5232
5711
  }
5233
5712
  _serializeSpace(space) {
5234
5713
  return {
@@ -5291,9 +5770,9 @@ var SpacesServiceImpl = class {
5291
5770
  var getChannelId = (channel) => `user-channel/${channel}`;
5292
5771
 
5293
5772
  // packages/sdk/client-services/src/packlets/services/service-context.ts
5294
- import { Trigger as Trigger7 } from "@dxos/async";
5295
- import { Context as Context10, Resource } from "@dxos/context";
5296
- import { getCredentialAssertion as getCredentialAssertion4 } from "@dxos/credentials";
5773
+ import { Trigger as Trigger8 } from "@dxos/async";
5774
+ import { Context as Context10, Resource as Resource3 } from "@dxos/context";
5775
+ import { getCredentialAssertion as getCredentialAssertion5 } from "@dxos/credentials";
5297
5776
  import { failUndefined as failUndefined2 } from "@dxos/debug";
5298
5777
  import { EchoHost } from "@dxos/echo-db";
5299
5778
  import { MetadataStore, SnapshotStore, SpaceManager, valueEncoding } from "@dxos/echo-pipeline";
@@ -5301,7 +5780,7 @@ import { FeedFactory, FeedStore } from "@dxos/feed-store";
5301
5780
  import { invariant as invariant16 } from "@dxos/invariant";
5302
5781
  import { Keyring } from "@dxos/keyring";
5303
5782
  import { PublicKey as PublicKey12 } from "@dxos/keys";
5304
- import { log as log15 } from "@dxos/log";
5783
+ import { log as log18 } from "@dxos/log";
5305
5784
  import { InvalidStorageVersionError, STORAGE_VERSION as STORAGE_VERSION2, trace as trace9 } from "@dxos/protocols";
5306
5785
  import { Invitation as Invitation8 } from "@dxos/protocols/proto/dxos/client/services";
5307
5786
  import { BlobStore } from "@dxos/teleport-extension-object-sync";
@@ -5317,8 +5796,8 @@ function _ts_decorate6(decorators, target, key, desc) {
5317
5796
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5318
5797
  return c > 3 && r && Object.defineProperty(target, key, r), r;
5319
5798
  }
5320
- var __dxlog_file18 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
5321
- var ServiceContext = class extends Resource {
5799
+ var __dxlog_file21 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
5800
+ var ServiceContext = class extends Resource3 {
5322
5801
  constructor(storage, level, networkManager, signalManager, _runtimeParams) {
5323
5802
  super();
5324
5803
  this.storage = storage;
@@ -5326,7 +5805,7 @@ var ServiceContext = class extends Resource {
5326
5805
  this.networkManager = networkManager;
5327
5806
  this.signalManager = signalManager;
5328
5807
  this._runtimeParams = _runtimeParams;
5329
- this.initialized = new Trigger7();
5808
+ this.initialized = new Trigger8();
5330
5809
  this._handlerFactories = /* @__PURE__ */ new Map();
5331
5810
  this._instanceId = PublicKey12.random().toHex();
5332
5811
  this.metadataStore = new MetadataStore(storage.createDirectory("metadata"));
@@ -5352,8 +5831,7 @@ var ServiceContext = class extends Resource {
5352
5831
  });
5353
5832
  this.identityManager = new IdentityManager(this.metadataStore, this.keyring, this.feedStore, this.spaceManager, this._runtimeParams);
5354
5833
  this.echoHost = new EchoHost({
5355
- kv: this.level,
5356
- storage: this.storage
5834
+ kv: this.level
5357
5835
  });
5358
5836
  this.invitations = new InvitationsHandler(this.networkManager, _runtimeParams?.invitationConnectionDefaultParams);
5359
5837
  this.invitationsManager = new InvitationsManager(this.invitations, (invitation) => this.getInvitationHandler(invitation), this.metadataStore);
@@ -5361,17 +5839,17 @@ var ServiceContext = class extends Resource {
5361
5839
  }
5362
5840
  async _open(ctx) {
5363
5841
  await this._checkStorageVersion();
5364
- log15("opening...", void 0, {
5365
- F: __dxlog_file18,
5366
- L: 152,
5842
+ log18("opening...", void 0, {
5843
+ F: __dxlog_file21,
5844
+ L: 149,
5367
5845
  S: this,
5368
5846
  C: (f, a) => f(...a)
5369
5847
  });
5370
- log15.trace("dxos.sdk.service-context.open", trace9.begin({
5848
+ log18.trace("dxos.sdk.service-context.open", trace9.begin({
5371
5849
  id: this._instanceId
5372
5850
  }), {
5373
- F: __dxlog_file18,
5374
- L: 153,
5851
+ F: __dxlog_file21,
5852
+ L: 150,
5375
5853
  S: this,
5376
5854
  C: (f, a) => f(...a)
5377
5855
  });
@@ -5385,33 +5863,33 @@ var ServiceContext = class extends Resource {
5385
5863
  await this._initialize(ctx);
5386
5864
  }
5387
5865
  const loadedInvitations = await this.invitationsManager.loadPersistentInvitations();
5388
- log15("loaded persistent invitations", {
5866
+ log18("loaded persistent invitations", {
5389
5867
  count: loadedInvitations.invitations?.length
5390
5868
  }, {
5391
- F: __dxlog_file18,
5392
- L: 166,
5869
+ F: __dxlog_file21,
5870
+ L: 163,
5393
5871
  S: this,
5394
5872
  C: (f, a) => f(...a)
5395
5873
  });
5396
- log15.trace("dxos.sdk.service-context.open", trace9.end({
5874
+ log18.trace("dxos.sdk.service-context.open", trace9.end({
5397
5875
  id: this._instanceId
5398
5876
  }), {
5399
- F: __dxlog_file18,
5400
- L: 168,
5877
+ F: __dxlog_file21,
5878
+ L: 165,
5401
5879
  S: this,
5402
5880
  C: (f, a) => f(...a)
5403
5881
  });
5404
- log15("opened", void 0, {
5405
- F: __dxlog_file18,
5406
- L: 169,
5882
+ log18("opened", void 0, {
5883
+ F: __dxlog_file21,
5884
+ L: 166,
5407
5885
  S: this,
5408
5886
  C: (f, a) => f(...a)
5409
5887
  });
5410
5888
  }
5411
5889
  async _close(ctx) {
5412
- log15("closing...", void 0, {
5413
- F: __dxlog_file18,
5414
- L: 173,
5890
+ log18("closing...", void 0, {
5891
+ F: __dxlog_file21,
5892
+ L: 170,
5415
5893
  S: this,
5416
5894
  C: (f, a) => f(...a)
5417
5895
  });
@@ -5426,23 +5904,26 @@ var ServiceContext = class extends Resource {
5426
5904
  await this.echoHost.close(ctx);
5427
5905
  await this.networkManager.close();
5428
5906
  await this.signalManager.close();
5429
- log15("closed", void 0, {
5430
- F: __dxlog_file18,
5431
- L: 185,
5907
+ log18("closed", void 0, {
5908
+ F: __dxlog_file21,
5909
+ L: 182,
5432
5910
  S: this,
5433
5911
  C: (f, a) => f(...a)
5434
5912
  });
5435
5913
  }
5436
5914
  async createIdentity(params = {}) {
5437
5915
  const identity = await this.identityManager.createIdentity(params);
5438
- await this._initialize(new Context10());
5916
+ await this._initialize(new Context10(void 0, {
5917
+ F: __dxlog_file21,
5918
+ L: 187
5919
+ }));
5439
5920
  return identity;
5440
5921
  }
5441
5922
  getInvitationHandler(invitation) {
5442
5923
  const factory = this._handlerFactories.get(invitation.kind);
5443
5924
  invariant16(factory, `Unknown invitation kind: ${invitation.kind}`, {
5444
- F: __dxlog_file18,
5445
- L: 196,
5925
+ F: __dxlog_file21,
5926
+ L: 193,
5446
5927
  S: this,
5447
5928
  A: [
5448
5929
  "factory",
@@ -5461,7 +5942,10 @@ var ServiceContext = class extends Resource {
5461
5942
  }
5462
5943
  async _acceptIdentity(params) {
5463
5944
  const identity = await this.identityManager.acceptIdentity(params);
5464
- await this._initialize(new Context10());
5945
+ await this._initialize(new Context10(void 0, {
5946
+ F: __dxlog_file21,
5947
+ L: 209
5948
+ }));
5465
5949
  return identity;
5466
5950
  }
5467
5951
  async _checkStorageVersion() {
@@ -5472,9 +5956,9 @@ var ServiceContext = class extends Resource {
5472
5956
  }
5473
5957
  // Called when identity is created.
5474
5958
  async _initialize(ctx) {
5475
- log15("initializing spaces...", void 0, {
5476
- F: __dxlog_file18,
5477
- L: 227,
5959
+ log18("initializing spaces...", void 0, {
5960
+ F: __dxlog_file21,
5961
+ L: 224,
5478
5962
  S: this,
5479
5963
  C: (f, a) => f(...a)
5480
5964
  });
@@ -5496,8 +5980,8 @@ var ServiceContext = class extends Resource {
5496
5980
  await this.dataSpaceManager.open();
5497
5981
  this._handlerFactories.set(Invitation8.Kind.SPACE, (invitation) => {
5498
5982
  invariant16(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
5499
- F: __dxlog_file18,
5500
- L: 252,
5983
+ F: __dxlog_file21,
5984
+ L: 249,
5501
5985
  S: this,
5502
5986
  A: [
5503
5987
  "this.dataSpaceManager",
@@ -5509,7 +5993,7 @@ var ServiceContext = class extends Resource {
5509
5993
  this.initialized.wake();
5510
5994
  this._deviceSpaceSync = {
5511
5995
  processCredential: async (credential) => {
5512
- const assertion = getCredentialAssertion4(credential);
5996
+ const assertion = getCredentialAssertion5(credential);
5513
5997
  if (assertion["@type"] !== "dxos.halo.credentials.SpaceMember") {
5514
5998
  return;
5515
5999
  }
@@ -5517,33 +6001,33 @@ var ServiceContext = class extends Resource {
5517
6001
  return;
5518
6002
  }
5519
6003
  if (!this.dataSpaceManager) {
5520
- log15("dataSpaceManager not initialized yet, ignoring space admission", {
6004
+ log18("dataSpaceManager not initialized yet, ignoring space admission", {
5521
6005
  details: assertion
5522
6006
  }, {
5523
- F: __dxlog_file18,
5524
- L: 268,
6007
+ F: __dxlog_file21,
6008
+ L: 265,
5525
6009
  S: this,
5526
6010
  C: (f, a) => f(...a)
5527
6011
  });
5528
6012
  return;
5529
6013
  }
5530
6014
  if (this.dataSpaceManager.spaces.has(assertion.spaceKey)) {
5531
- log15("space already exists, ignoring space admission", {
6015
+ log18("space already exists, ignoring space admission", {
5532
6016
  details: assertion
5533
6017
  }, {
5534
- F: __dxlog_file18,
5535
- L: 272,
6018
+ F: __dxlog_file21,
6019
+ L: 269,
5536
6020
  S: this,
5537
6021
  C: (f, a) => f(...a)
5538
6022
  });
5539
6023
  return;
5540
6024
  }
5541
6025
  try {
5542
- log15("accepting space recorded in halo", {
6026
+ log18("accepting space recorded in halo", {
5543
6027
  details: assertion
5544
6028
  }, {
5545
- F: __dxlog_file18,
5546
- L: 277,
6029
+ F: __dxlog_file21,
6030
+ L: 274,
5547
6031
  S: this,
5548
6032
  C: (f, a) => f(...a)
5549
6033
  });
@@ -5552,9 +6036,9 @@ var ServiceContext = class extends Resource {
5552
6036
  genesisFeedKey: assertion.genesisFeedKey
5553
6037
  });
5554
6038
  } catch (err) {
5555
- log15.catch(err, void 0, {
5556
- F: __dxlog_file18,
5557
- L: 283,
6039
+ log18.catch(err, void 0, {
6040
+ F: __dxlog_file21,
6041
+ L: 280,
5558
6042
  S: this,
5559
6043
  C: (f, a) => f(...a)
5560
6044
  });
@@ -5600,9 +6084,9 @@ var ServiceRegistry = class {
5600
6084
  };
5601
6085
 
5602
6086
  // packages/sdk/client-services/src/packlets/locks/browser.ts
5603
- import { asyncTimeout as asyncTimeout3, Trigger as Trigger8 } from "@dxos/async";
6087
+ import { asyncTimeout as asyncTimeout3, Trigger as Trigger9 } from "@dxos/async";
5604
6088
  import { RESOURCE_LOCK_TIMEOUT } from "@dxos/client-protocol";
5605
- import { log as log16, logInfo } from "@dxos/log";
6089
+ import { log as log19, logInfo } from "@dxos/log";
5606
6090
  function _ts_decorate7(decorators, target, key, desc) {
5607
6091
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5608
6092
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -5613,7 +6097,7 @@ function _ts_decorate7(decorators, target, key, desc) {
5613
6097
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5614
6098
  return c > 3 && r && Object.defineProperty(target, key, r), r;
5615
6099
  }
5616
- var __dxlog_file19 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
6100
+ var __dxlog_file22 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
5617
6101
  var Message;
5618
6102
  (function(Message2) {
5619
6103
  Message2["ACQUIRING"] = "acquiring";
@@ -5621,7 +6105,7 @@ var Message;
5621
6105
  var Lock = class {
5622
6106
  constructor({ lockKey, onAcquire, onRelease }) {
5623
6107
  this._broadcastChannel = new BroadcastChannel("vault-resource-lock");
5624
- this._releaseTrigger = new Trigger8();
6108
+ this._releaseTrigger = new Trigger9();
5625
6109
  this._lockKey = lockKey;
5626
6110
  this._onAcquire = onAcquire;
5627
6111
  this._onRelease = onRelease;
@@ -5635,29 +6119,29 @@ var Lock = class {
5635
6119
  message: "acquiring"
5636
6120
  });
5637
6121
  try {
5638
- log16("aquiring lock...", void 0, {
5639
- F: __dxlog_file19,
6122
+ log19("aquiring lock...", void 0, {
6123
+ F: __dxlog_file22,
5640
6124
  L: 42,
5641
6125
  S: this,
5642
6126
  C: (f, a) => f(...a)
5643
6127
  });
5644
6128
  await asyncTimeout3(this._requestLock(), RESOURCE_LOCK_TIMEOUT);
5645
- log16("acquired lock", void 0, {
5646
- F: __dxlog_file19,
6129
+ log19("acquired lock", void 0, {
6130
+ F: __dxlog_file22,
5647
6131
  L: 44,
5648
6132
  S: this,
5649
6133
  C: (f, a) => f(...a)
5650
6134
  });
5651
6135
  } catch {
5652
- log16("stealing lock...", void 0, {
5653
- F: __dxlog_file19,
6136
+ log19("stealing lock...", void 0, {
6137
+ F: __dxlog_file22,
5654
6138
  L: 46,
5655
6139
  S: this,
5656
6140
  C: (f, a) => f(...a)
5657
6141
  });
5658
6142
  await this._requestLock(true);
5659
- log16("stolen lock", void 0, {
5660
- F: __dxlog_file19,
6143
+ log19("stolen lock", void 0, {
6144
+ F: __dxlog_file22,
5661
6145
  L: 48,
5662
6146
  S: this,
5663
6147
  C: (f, a) => f(...a)
@@ -5673,31 +6157,31 @@ var Lock = class {
5673
6157
  }
5674
6158
  }
5675
6159
  async _requestLock(steal = false) {
5676
- log16("requesting lock...", {
6160
+ log19("requesting lock...", {
5677
6161
  steal
5678
6162
  }, {
5679
- F: __dxlog_file19,
6163
+ F: __dxlog_file22,
5680
6164
  L: 63,
5681
6165
  S: this,
5682
6166
  C: (f, a) => f(...a)
5683
6167
  });
5684
- const acquired = new Trigger8();
6168
+ const acquired = new Trigger9();
5685
6169
  void navigator.locks.request(this._lockKey, {
5686
6170
  steal
5687
6171
  }, async () => {
5688
6172
  await this._onAcquire?.();
5689
6173
  acquired.wake();
5690
- this._releaseTrigger = new Trigger8();
6174
+ this._releaseTrigger = new Trigger9();
5691
6175
  await this._releaseTrigger.wait();
5692
- log16("releasing lock...", void 0, {
5693
- F: __dxlog_file19,
6176
+ log19("releasing lock...", void 0, {
6177
+ F: __dxlog_file22,
5694
6178
  L: 72,
5695
6179
  S: this,
5696
6180
  C: (f, a) => f(...a)
5697
6181
  });
5698
6182
  await this._onRelease?.();
5699
- log16("released lock", void 0, {
5700
- F: __dxlog_file19,
6183
+ log19("released lock", void 0, {
6184
+ F: __dxlog_file22,
5701
6185
  L: 74,
5702
6186
  S: this,
5703
6187
  C: (f, a) => f(...a)
@@ -5706,10 +6190,10 @@ var Lock = class {
5706
6190
  await this._onRelease?.();
5707
6191
  });
5708
6192
  await acquired.wait();
5709
- log16("recieved lock", {
6193
+ log19("recieved lock", {
5710
6194
  steal
5711
6195
  }, {
5712
- F: __dxlog_file19,
6196
+ F: __dxlog_file22,
5713
6197
  L: 81,
5714
6198
  S: this,
5715
6199
  C: (f, a) => f(...a)
@@ -5797,29 +6281,164 @@ var createLevel = async (config) => {
5797
6281
  return level;
5798
6282
  };
5799
6283
 
6284
+ // packages/sdk/client-services/src/packlets/storage/profile-archive.ts
6285
+ import { cbor } from "@dxos/automerge/automerge-repo";
6286
+ import { invariant as invariant17 } from "@dxos/invariant";
6287
+ import { log as log20 } from "@dxos/log";
6288
+ import { ProfileArchiveEntryType } from "@dxos/protocols";
6289
+ import { arrayToBuffer } from "@dxos/util";
6290
+ var __dxlog_file23 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/storage/profile-archive.ts";
6291
+ var encodeProfileArchive = (profile) => cbor.encode(profile);
6292
+ var decodeProfileArchive = (data) => cbor.decode(data);
6293
+ var exportProfileData = async ({ storage, level }) => {
6294
+ const archive = {
6295
+ storage: [],
6296
+ meta: {
6297
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
6298
+ }
6299
+ };
6300
+ {
6301
+ const directory = await storage.createDirectory();
6302
+ const files = await directory.list();
6303
+ log20.info("begin exporting files", {
6304
+ count: files.length
6305
+ }, {
6306
+ F: __dxlog_file23,
6307
+ L: 30,
6308
+ S: void 0,
6309
+ C: (f, a) => f(...a)
6310
+ });
6311
+ for (const filename of files) {
6312
+ const file = await directory.getOrCreateFile(filename);
6313
+ const { size } = await file.stat();
6314
+ const data = await file.read(0, size);
6315
+ archive.storage.push({
6316
+ type: ProfileArchiveEntryType.FILE,
6317
+ key: filename,
6318
+ value: data
6319
+ });
6320
+ }
6321
+ log20.info("done exporting files", {
6322
+ count: files.length
6323
+ }, {
6324
+ F: __dxlog_file23,
6325
+ L: 41,
6326
+ S: void 0,
6327
+ C: (f, a) => f(...a)
6328
+ });
6329
+ }
6330
+ {
6331
+ log20.info("begin exporting kv pairs", void 0, {
6332
+ F: __dxlog_file23,
6333
+ L: 45,
6334
+ S: void 0,
6335
+ C: (f, a) => f(...a)
6336
+ });
6337
+ const iter = await level.iterator({
6338
+ keyEncoding: "binary",
6339
+ valueEncoding: "binary"
6340
+ });
6341
+ let count = 0;
6342
+ for await (const [key, value] of iter) {
6343
+ archive.storage.push({
6344
+ type: ProfileArchiveEntryType.KEY_VALUE,
6345
+ key,
6346
+ value
6347
+ });
6348
+ count++;
6349
+ }
6350
+ log20.info("done exporting kv pairs", {
6351
+ count
6352
+ }, {
6353
+ F: __dxlog_file23,
6354
+ L: 56,
6355
+ S: void 0,
6356
+ C: (f, a) => f(...a)
6357
+ });
6358
+ }
6359
+ return archive;
6360
+ };
6361
+ var importProfileData = async ({ storage, level }, archive) => {
6362
+ const batch = level.batch();
6363
+ for (const entry2 of archive.storage) {
6364
+ switch (entry2.type) {
6365
+ case ProfileArchiveEntryType.FILE: {
6366
+ const directory = await storage.createDirectory();
6367
+ invariant17(typeof entry2.key === "string", "Invalid key type", {
6368
+ F: __dxlog_file23,
6369
+ L: 78,
6370
+ S: void 0,
6371
+ A: [
6372
+ "typeof entry.key === 'string'",
6373
+ "'Invalid key type'"
6374
+ ]
6375
+ });
6376
+ const file = await directory.getOrCreateFile(entry2.key);
6377
+ invariant17(entry2.value instanceof Uint8Array, "Invalid value type", {
6378
+ F: __dxlog_file23,
6379
+ L: 80,
6380
+ S: void 0,
6381
+ A: [
6382
+ "entry.value instanceof Uint8Array",
6383
+ "'Invalid value type'"
6384
+ ]
6385
+ });
6386
+ await file.write(0, arrayToBuffer(entry2.value));
6387
+ await file.close();
6388
+ break;
6389
+ }
6390
+ case ProfileArchiveEntryType.KEY_VALUE: {
6391
+ invariant17(entry2.key instanceof Uint8Array, "Invalid key type", {
6392
+ F: __dxlog_file23,
6393
+ L: 86,
6394
+ S: void 0,
6395
+ A: [
6396
+ "entry.key instanceof Uint8Array",
6397
+ "'Invalid key type'"
6398
+ ]
6399
+ });
6400
+ invariant17(entry2.value instanceof Uint8Array, "Invalid value type", {
6401
+ F: __dxlog_file23,
6402
+ L: 87,
6403
+ S: void 0,
6404
+ A: [
6405
+ "entry.value instanceof Uint8Array",
6406
+ "'Invalid value type'"
6407
+ ]
6408
+ });
6409
+ batch.put(entry2.key, entry2.value, {
6410
+ keyEncoding: "binary",
6411
+ valueEncoding: "binary"
6412
+ });
6413
+ break;
6414
+ }
6415
+ default:
6416
+ throw new Error(`Invalid entry type: ${entry2.type}`);
6417
+ }
6418
+ }
6419
+ await batch.write();
6420
+ };
6421
+
5800
6422
  // packages/sdk/client-services/src/packlets/services/service-host.ts
5801
6423
  import { Event as Event9, synchronized as synchronized3 } from "@dxos/async";
5802
- import { clientServiceBundle, defaultKey, PropertiesType } from "@dxos/client-protocol";
6424
+ import { clientServiceBundle } from "@dxos/client-protocol";
5803
6425
  import { Context as Context11 } from "@dxos/context";
5804
- import { encodeReference } from "@dxos/echo-protocol";
5805
- import { getTypeReference } from "@dxos/echo-schema";
5806
- import { invariant as invariant18 } from "@dxos/invariant";
5807
- import { PublicKey as PublicKey16 } from "@dxos/keys";
5808
- import { log as log18 } from "@dxos/log";
6426
+ import { invariant as invariant19 } from "@dxos/invariant";
6427
+ import { PublicKey as PublicKey17 } from "@dxos/keys";
6428
+ import { log as log22 } from "@dxos/log";
5809
6429
  import { WebsocketSignalManager } from "@dxos/messaging";
5810
6430
  import { SwarmNetworkManager, createSimplePeerTransportFactory } from "@dxos/network-manager";
5811
6431
  import { trace as trace10 } from "@dxos/protocols";
5812
6432
  import { SystemStatus } from "@dxos/protocols/proto/dxos/client/services";
5813
6433
  import { TRACE_PROCESSOR as TRACE_PROCESSOR3, trace as Trace4 } from "@dxos/tracing";
5814
- import { assignDeep as assignDeep2 } from "@dxos/util";
5815
6434
  import { WebsocketRpcClient } from "@dxos/websocket-rpc";
5816
6435
 
5817
6436
  // packages/sdk/client-services/src/packlets/devices/devices-service.ts
5818
6437
  import { EventSubscriptions as EventSubscriptions3 } from "@dxos/async";
5819
6438
  import { Stream as Stream11 } from "@dxos/codec-protobuf";
5820
- import { invariant as invariant17 } from "@dxos/invariant";
6439
+ import { invariant as invariant18 } from "@dxos/invariant";
5821
6440
  import { Device as Device2, DeviceKind as DeviceKind2 } from "@dxos/protocols/proto/dxos/client/services";
5822
- var __dxlog_file20 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/devices/devices-service.ts";
6441
+ var __dxlog_file24 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/devices/devices-service.ts";
5823
6442
  var DevicesServiceImpl = class {
5824
6443
  constructor(_identityManager) {
5825
6444
  this._identityManager = _identityManager;
@@ -5836,8 +6455,8 @@ var DevicesServiceImpl = class {
5836
6455
  devices: []
5837
6456
  });
5838
6457
  } else {
5839
- invariant17(this._identityManager.identity?.presence, "presence not present", {
5840
- F: __dxlog_file20,
6458
+ invariant18(this._identityManager.identity?.presence, "presence not present", {
6459
+ F: __dxlog_file24,
5841
6460
  L: 32,
5842
6461
  S: this,
5843
6462
  A: [
@@ -5943,28 +6562,111 @@ var findConfigs = () => {
5943
6562
  return configs.map((r) => r.instance.deref()).filter(nonNullable);
5944
6563
  };
5945
6564
 
5946
- // packages/sdk/client-services/src/packlets/logging/logging-service.ts
5947
- import { Event as Event8 } from "@dxos/async";
6565
+ // packages/sdk/client-services/src/packlets/identity/contacts-service.ts
6566
+ import { EventSubscriptions as EventSubscriptions4, scheduleTask as scheduleTask7, UpdateScheduler as UpdateScheduler2 } from "@dxos/async";
5948
6567
  import { Stream as Stream12 } from "@dxos/codec-protobuf";
5949
6568
  import { PublicKey as PublicKey15 } from "@dxos/keys";
5950
- import { getContextFromEntry, log as log17 } from "@dxos/log";
6569
+ import { ComplexMap as ComplexMap4, ComplexSet as ComplexSet6 } from "@dxos/util";
6570
+ var ContactsServiceImpl = class {
6571
+ constructor(_identityManager, _spaceManager, _dataSpaceManagerProvider) {
6572
+ this._identityManager = _identityManager;
6573
+ this._spaceManager = _spaceManager;
6574
+ this._dataSpaceManagerProvider = _dataSpaceManagerProvider;
6575
+ }
6576
+ async getContacts() {
6577
+ const identity = this._identityManager.identity;
6578
+ if (identity == null) {
6579
+ return {
6580
+ contacts: []
6581
+ };
6582
+ }
6583
+ const contacts = [
6584
+ ...this._spaceManager.spaces.values()
6585
+ ].flatMap((s) => [
6586
+ ...s.spaceState.members.values()
6587
+ ].map((m) => [
6588
+ s.key,
6589
+ m
6590
+ ])).reduce((acc, v) => {
6591
+ const [spaceKey, memberInfo] = v;
6592
+ if (memberInfo.key.equals(identity.identityKey)) {
6593
+ return acc;
6594
+ }
6595
+ const existing = acc.get(memberInfo.key);
6596
+ if (existing != null) {
6597
+ existing.profile ??= memberInfo.profile;
6598
+ existing.commonSpaces?.push(spaceKey);
6599
+ } else {
6600
+ acc.set(memberInfo.key, {
6601
+ identityKey: memberInfo.key,
6602
+ profile: memberInfo.profile,
6603
+ commonSpaces: [
6604
+ spaceKey
6605
+ ]
6606
+ });
6607
+ }
6608
+ return acc;
6609
+ }, new ComplexMap4(PublicKey15.hash));
6610
+ return {
6611
+ contacts: [
6612
+ ...contacts.values()
6613
+ ]
6614
+ };
6615
+ }
6616
+ queryContacts() {
6617
+ const subscribedSpaceKeySet = new ComplexSet6(PublicKey15.hash);
6618
+ return new Stream12(({ next, ctx }) => {
6619
+ const pushUpdateTask = new UpdateScheduler2(ctx, async () => {
6620
+ const contacts = await this.getContacts();
6621
+ next(contacts);
6622
+ }, {
6623
+ maxFrequency: 2
6624
+ });
6625
+ scheduleTask7(ctx, async () => {
6626
+ const subscriptions = new EventSubscriptions4();
6627
+ ctx.onDispose(() => subscriptions.clear());
6628
+ const subscribeToSpaceAndUpdate = () => {
6629
+ const oldSetSize = subscribedSpaceKeySet.size;
6630
+ for (const space of this._spaceManager.spaces.values()) {
6631
+ if (!subscribedSpaceKeySet.has(space.key)) {
6632
+ subscriptions.add(space.stateUpdate.on(ctx, () => pushUpdateTask.trigger()));
6633
+ subscribedSpaceKeySet.add(space.key);
6634
+ }
6635
+ }
6636
+ if (oldSetSize !== subscribedSpaceKeySet.size) {
6637
+ pushUpdateTask.trigger();
6638
+ }
6639
+ };
6640
+ const unsubscribe = (await this._dataSpaceManagerProvider()).updated.on(ctx, subscribeToSpaceAndUpdate);
6641
+ ctx.onDispose(unsubscribe);
6642
+ subscribeToSpaceAndUpdate();
6643
+ });
6644
+ });
6645
+ }
6646
+ };
6647
+
6648
+ // packages/sdk/client-services/src/packlets/logging/logging-service.ts
6649
+ import { Event as Event8 } from "@dxos/async";
6650
+ import { Stream as Stream13 } from "@dxos/codec-protobuf";
6651
+ import { PublicKey as PublicKey16 } from "@dxos/keys";
6652
+ import { getContextFromEntry, log as log21 } from "@dxos/log";
5951
6653
  import { QueryLogsRequest } from "@dxos/protocols/proto/dxos/client/services";
5952
6654
  import { getDebugName, jsonify, numericalValues, tracer } from "@dxos/util";
5953
6655
  var LoggingServiceImpl = class {
5954
6656
  constructor() {
5955
6657
  this._logs = new Event8();
5956
6658
  this._started = Date.now();
5957
- this._sessionId = PublicKey15.random().toHex();
6659
+ this._sessionId = PublicKey16.random().toHex();
5958
6660
  this._logProcessor = (_config, entry2) => {
5959
6661
  this._logs.emit(entry2);
5960
6662
  };
5961
6663
  }
5962
6664
  async open() {
5963
- log17.runtimeConfig.processors.push(this._logProcessor);
6665
+ log21.runtimeConfig.processors.push(this._logProcessor);
5964
6666
  }
5965
6667
  async close() {
5966
- const index = log17.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);
5967
- log17.runtimeConfig.processors.splice(index, 1);
6668
+ const index = log21.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);
6669
+ log21.runtimeConfig.processors.splice(index, 1);
5968
6670
  }
5969
6671
  async controlMetrics({ reset, record }) {
5970
6672
  if (reset) {
@@ -5990,7 +6692,7 @@ var LoggingServiceImpl = class {
5990
6692
  stats: numericalValues(events, "duration")
5991
6693
  };
5992
6694
  };
5993
- return new Stream12(({ next }) => {
6695
+ return new Stream13(({ next }) => {
5994
6696
  const update = () => {
5995
6697
  const metrics = {
5996
6698
  timestamp: /* @__PURE__ */ new Date(),
@@ -6012,7 +6714,7 @@ var LoggingServiceImpl = class {
6012
6714
  });
6013
6715
  }
6014
6716
  queryLogs(request) {
6015
- return new Stream12(({ ctx, next }) => {
6717
+ return new Stream13(({ ctx, next }) => {
6016
6718
  const handler = (entry2) => {
6017
6719
  if (LOG_PROCESSING > 0) {
6018
6720
  return;
@@ -6068,14 +6770,14 @@ var shouldLog = (entry2, request) => {
6068
6770
  var LOG_PROCESSING = 0;
6069
6771
 
6070
6772
  // packages/sdk/client-services/src/packlets/network/network-service.ts
6071
- import { Stream as Stream13 } from "@dxos/codec-protobuf";
6773
+ import { Stream as Stream14 } from "@dxos/codec-protobuf";
6072
6774
  var NetworkServiceImpl = class {
6073
6775
  constructor(networkManager, signalManager) {
6074
6776
  this.networkManager = networkManager;
6075
6777
  this.signalManager = signalManager;
6076
6778
  }
6077
6779
  queryStatus() {
6078
- return new Stream13(({ next }) => {
6780
+ return new Stream14(({ next }) => {
6079
6781
  const update = () => {
6080
6782
  next({
6081
6783
  swarm: this.networkManager.connectionState,
@@ -6101,7 +6803,7 @@ var NetworkServiceImpl = class {
6101
6803
  };
6102
6804
 
6103
6805
  // packages/sdk/client-services/src/packlets/system/system-service.ts
6104
- import { Stream as Stream14 } from "@dxos/codec-protobuf";
6806
+ import { Stream as Stream15 } from "@dxos/codec-protobuf";
6105
6807
  import { GetDiagnosticsRequest as GetDiagnosticsRequest2 } from "@dxos/protocols/proto/dxos/client/services";
6106
6808
  import { jsonKeyReplacer as jsonKeyReplacer2 } from "@dxos/util";
6107
6809
  var SystemServiceImpl = class {
@@ -6137,7 +6839,7 @@ var SystemServiceImpl = class {
6137
6839
  }
6138
6840
  // TODO(burdon): Standardize interval option in stream request?
6139
6841
  queryStatus({ interval = 3e3 } = {}) {
6140
- return new Stream14(({ next }) => {
6842
+ return new Stream15(({ next }) => {
6141
6843
  const update = () => {
6142
6844
  next({
6143
6845
  status: this._getCurrentStatus()
@@ -6168,7 +6870,7 @@ function _ts_decorate8(decorators, target, key, desc) {
6168
6870
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6169
6871
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6170
6872
  }
6171
- var __dxlog_file21 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-host.ts";
6873
+ var __dxlog_file25 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-host.ts";
6172
6874
  var ClientServicesHost = class {
6173
6875
  constructor({
6174
6876
  config,
@@ -6188,7 +6890,7 @@ var ClientServicesHost = class {
6188
6890
  this._storage = storage;
6189
6891
  this._level = level;
6190
6892
  this._callbacks = callbacks;
6191
- this._runtimeParams = runtimeParams;
6893
+ this._runtimeParams = runtimeParams ?? {};
6192
6894
  if (config) {
6193
6895
  this.initialize({
6194
6896
  config,
@@ -6201,7 +6903,10 @@ var ClientServicesHost = class {
6201
6903
  lockKey,
6202
6904
  onAcquire: () => {
6203
6905
  if (!this._opening) {
6204
- void this.open(new Context11());
6906
+ void this.open(new Context11(void 0, {
6907
+ F: __dxlog_file25,
6908
+ L: 121
6909
+ }));
6205
6910
  }
6206
6911
  },
6207
6912
  onRelease: () => this.close()
@@ -6256,25 +6961,25 @@ var ClientServicesHost = class {
6256
6961
  * Can only be called once.
6257
6962
  */
6258
6963
  initialize({ config, ...options }) {
6259
- invariant18(!this._open, "service host is open", {
6260
- F: __dxlog_file21,
6261
- L: 189,
6964
+ invariant19(!this._open, "service host is open", {
6965
+ F: __dxlog_file25,
6966
+ L: 187,
6262
6967
  S: this,
6263
6968
  A: [
6264
6969
  "!this._open",
6265
6970
  "'service host is open'"
6266
6971
  ]
6267
6972
  });
6268
- log18("initializing...", void 0, {
6269
- F: __dxlog_file21,
6270
- L: 190,
6973
+ log22("initializing...", void 0, {
6974
+ F: __dxlog_file25,
6975
+ L: 188,
6271
6976
  S: this,
6272
6977
  C: (f, a) => f(...a)
6273
6978
  });
6274
6979
  if (config) {
6275
- invariant18(!this._config, "config already set", {
6276
- F: __dxlog_file21,
6277
- L: 193,
6980
+ invariant19(!this._config, "config already set", {
6981
+ F: __dxlog_file25,
6982
+ L: 191,
6278
6983
  S: this,
6279
6984
  A: [
6280
6985
  "!this._config",
@@ -6287,9 +6992,9 @@ var ClientServicesHost = class {
6287
6992
  }
6288
6993
  }
6289
6994
  if (!options.signalManager) {
6290
- log18.warn("running signaling without telemetry metadata.", void 0, {
6291
- F: __dxlog_file21,
6292
- L: 201,
6995
+ log22.warn("running signaling without telemetry metadata.", void 0, {
6996
+ F: __dxlog_file25,
6997
+ L: 199,
6293
6998
  S: this,
6294
6999
  C: (f, a) => f(...a)
6295
7000
  });
@@ -6298,9 +7003,9 @@ var ClientServicesHost = class {
6298
7003
  iceServers: this._config?.get("runtime.services.ice")
6299
7004
  }), signalManager = new WebsocketSignalManager(this._config?.get("runtime.services.signaling") ?? []) } = options;
6300
7005
  this._signalManager = signalManager;
6301
- invariant18(!this._networkManager, "network manager already set", {
6302
- F: __dxlog_file21,
6303
- L: 212,
7006
+ invariant19(!this._networkManager, "network manager already set", {
7007
+ F: __dxlog_file25,
7008
+ L: 210,
6304
7009
  S: this,
6305
7010
  A: [
6306
7011
  "!this._networkManager",
@@ -6312,9 +7017,9 @@ var ClientServicesHost = class {
6312
7017
  transportFactory,
6313
7018
  signalManager
6314
7019
  });
6315
- log18("initialized", void 0, {
6316
- F: __dxlog_file21,
6317
- L: 219,
7020
+ log22("initialized", void 0, {
7021
+ F: __dxlog_file25,
7022
+ L: 217,
6318
7023
  S: this,
6319
7024
  C: (f, a) => f(...a)
6320
7025
  });
@@ -6323,45 +7028,45 @@ var ClientServicesHost = class {
6323
7028
  if (this._open) {
6324
7029
  return;
6325
7030
  }
6326
- const traceId = PublicKey16.random().toHex();
6327
- log18.trace("dxos.client-services.host.open", trace10.begin({
7031
+ const traceId = PublicKey17.random().toHex();
7032
+ log22.trace("dxos.client-services.host.open", trace10.begin({
6328
7033
  id: traceId
6329
7034
  }), {
6330
- F: __dxlog_file21,
6331
- L: 230,
7035
+ F: __dxlog_file25,
7036
+ L: 228,
6332
7037
  S: this,
6333
7038
  C: (f, a) => f(...a)
6334
7039
  });
6335
- invariant18(this._config, "config not set", {
6336
- F: __dxlog_file21,
6337
- L: 232,
7040
+ invariant19(this._config, "config not set", {
7041
+ F: __dxlog_file25,
7042
+ L: 230,
6338
7043
  S: this,
6339
7044
  A: [
6340
7045
  "this._config",
6341
7046
  "'config not set'"
6342
7047
  ]
6343
7048
  });
6344
- invariant18(this._storage, "storage not set", {
6345
- F: __dxlog_file21,
6346
- L: 233,
7049
+ invariant19(this._storage, "storage not set", {
7050
+ F: __dxlog_file25,
7051
+ L: 231,
6347
7052
  S: this,
6348
7053
  A: [
6349
7054
  "this._storage",
6350
7055
  "'storage not set'"
6351
7056
  ]
6352
7057
  });
6353
- invariant18(this._signalManager, "signal manager not set", {
6354
- F: __dxlog_file21,
6355
- L: 234,
7058
+ invariant19(this._signalManager, "signal manager not set", {
7059
+ F: __dxlog_file25,
7060
+ L: 232,
6356
7061
  S: this,
6357
7062
  A: [
6358
7063
  "this._signalManager",
6359
7064
  "'signal manager not set'"
6360
7065
  ]
6361
7066
  });
6362
- invariant18(this._networkManager, "network manager not set", {
6363
- F: __dxlog_file21,
6364
- L: 235,
7067
+ invariant19(this._networkManager, "network manager not set", {
7068
+ F: __dxlog_file25,
7069
+ L: 233,
6365
7070
  S: this,
6366
7071
  A: [
6367
7072
  "this._networkManager",
@@ -6369,11 +7074,11 @@ var ClientServicesHost = class {
6369
7074
  ]
6370
7075
  });
6371
7076
  this._opening = true;
6372
- log18("opening...", {
7077
+ log22("opening...", {
6373
7078
  lockKey: this._resourceLock?.lockKey
6374
7079
  }, {
6375
- F: __dxlog_file21,
6376
- L: 238,
7080
+ F: __dxlog_file25,
7081
+ L: 236,
6377
7082
  S: this,
6378
7083
  C: (f, a) => f(...a)
6379
7084
  });
@@ -6384,15 +7089,18 @@ var ClientServicesHost = class {
6384
7089
  await this._level.open();
6385
7090
  await this._loggingService.open();
6386
7091
  this._serviceContext = new ServiceContext(this._storage, this._level, this._networkManager, this._signalManager, this._runtimeParams);
7092
+ const dataSpaceManagerProvider = async () => {
7093
+ await this._serviceContext.initialized.wait();
7094
+ return this._serviceContext.dataSpaceManager;
7095
+ };
7096
+ const identityService = new IdentityServiceImpl(this._serviceContext.identityManager, this._serviceContext.keyring, () => this._serviceContext.dataSpaceManager, (params) => this._createIdentity(params), (profile) => this._serviceContext.broadcastProfileUpdate(profile));
6387
7097
  this._serviceRegistry.setServices({
6388
7098
  SystemService: this._systemService,
6389
- IdentityService: new IdentityServiceImpl((params) => this._createIdentity(params), this._serviceContext.identityManager, this._serviceContext.keyring, (profile) => this._serviceContext.broadcastProfileUpdate(profile)),
7099
+ IdentityService: identityService,
7100
+ ContactsService: new ContactsServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, dataSpaceManagerProvider),
6390
7101
  InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitationsManager),
6391
7102
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
6392
- SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, async () => {
6393
- await this._serviceContext.initialized.wait();
6394
- return this._serviceContext.dataSpaceManager;
6395
- }),
7103
+ SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, dataSpaceManagerProvider),
6396
7104
  DataService: this._serviceContext.echoHost.dataService,
6397
7105
  QueryService: this._serviceContext.echoHost.queryService,
6398
7106
  NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager, this._serviceContext.signalManager),
@@ -6406,6 +7114,7 @@ var ClientServicesHost = class {
6406
7114
  })
6407
7115
  });
6408
7116
  await this._serviceContext.open(ctx);
7117
+ await identityService.open();
6409
7118
  const devtoolsProxy = this._config?.get("runtime.client.devtoolsProxy");
6410
7119
  if (devtoolsProxy) {
6411
7120
  this._devtoolsProxy = new WebsocketRpcClient({
@@ -6421,19 +7130,19 @@ var ClientServicesHost = class {
6421
7130
  this._open = true;
6422
7131
  this._statusUpdate.emit();
6423
7132
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
6424
- log18("opened", {
7133
+ log22("opened", {
6425
7134
  deviceKey
6426
7135
  }, {
6427
- F: __dxlog_file21,
6428
- L: 314,
7136
+ F: __dxlog_file25,
7137
+ L: 322,
6429
7138
  S: this,
6430
7139
  C: (f, a) => f(...a)
6431
7140
  });
6432
- log18.trace("dxos.client-services.host.open", trace10.end({
7141
+ log22.trace("dxos.client-services.host.open", trace10.end({
6433
7142
  id: traceId
6434
7143
  }), {
6435
- F: __dxlog_file21,
6436
- L: 315,
7144
+ F: __dxlog_file25,
7145
+ L: 323,
6437
7146
  S: this,
6438
7147
  C: (f, a) => f(...a)
6439
7148
  });
@@ -6443,11 +7152,11 @@ var ClientServicesHost = class {
6443
7152
  return;
6444
7153
  }
6445
7154
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
6446
- log18("closing...", {
7155
+ log22("closing...", {
6447
7156
  deviceKey
6448
7157
  }, {
6449
- F: __dxlog_file21,
6450
- L: 326,
7158
+ F: __dxlog_file25,
7159
+ L: 334,
6451
7160
  S: this,
6452
7161
  C: (f, a) => f(...a)
6453
7162
  });
@@ -6461,44 +7170,44 @@ var ClientServicesHost = class {
6461
7170
  await this._level?.close();
6462
7171
  this._open = false;
6463
7172
  this._statusUpdate.emit();
6464
- log18("closed", {
7173
+ log22("closed", {
6465
7174
  deviceKey
6466
7175
  }, {
6467
- F: __dxlog_file21,
6468
- L: 335,
7176
+ F: __dxlog_file25,
7177
+ L: 343,
6469
7178
  S: this,
6470
7179
  C: (f, a) => f(...a)
6471
7180
  });
6472
7181
  }
6473
7182
  async reset() {
6474
- const traceId = PublicKey16.random().toHex();
6475
- log18.trace("dxos.sdk.client-services-host.reset", trace10.begin({
7183
+ const traceId = PublicKey17.random().toHex();
7184
+ log22.trace("dxos.sdk.client-services-host.reset", trace10.begin({
6476
7185
  id: traceId
6477
7186
  }), {
6478
- F: __dxlog_file21,
6479
- L: 340,
7187
+ F: __dxlog_file25,
7188
+ L: 348,
6480
7189
  S: this,
6481
7190
  C: (f, a) => f(...a)
6482
7191
  });
6483
- log18.info("resetting...", void 0, {
6484
- F: __dxlog_file21,
6485
- L: 342,
7192
+ log22.info("resetting...", void 0, {
7193
+ F: __dxlog_file25,
7194
+ L: 350,
6486
7195
  S: this,
6487
7196
  C: (f, a) => f(...a)
6488
7197
  });
6489
7198
  await this._serviceContext?.close();
6490
7199
  await this._storage.reset();
6491
- log18.info("reset", void 0, {
6492
- F: __dxlog_file21,
6493
- L: 345,
7200
+ log22.info("reset", void 0, {
7201
+ F: __dxlog_file25,
7202
+ L: 353,
6494
7203
  S: this,
6495
7204
  C: (f, a) => f(...a)
6496
7205
  });
6497
- log18.trace("dxos.sdk.client-services-host.reset", trace10.end({
7206
+ log22.trace("dxos.sdk.client-services-host.reset", trace10.end({
6498
7207
  id: traceId
6499
7208
  }), {
6500
- F: __dxlog_file21,
6501
- L: 346,
7209
+ F: __dxlog_file25,
7210
+ L: 354,
6502
7211
  S: this,
6503
7212
  C: (f, a) => f(...a)
6504
7213
  });
@@ -6507,38 +7216,6 @@ var ClientServicesHost = class {
6507
7216
  async _createIdentity(params) {
6508
7217
  const identity = await this._serviceContext.createIdentity(params);
6509
7218
  await this._serviceContext.initialized.wait();
6510
- const space = await this._serviceContext.dataSpaceManager.createSpace();
6511
- const automergeIndex = space.automergeSpaceState.rootUrl;
6512
- invariant18(automergeIndex, void 0, {
6513
- F: __dxlog_file21,
6514
- L: 358,
6515
- S: this,
6516
- A: [
6517
- "automergeIndex",
6518
- ""
6519
- ]
6520
- });
6521
- const document = this._serviceContext.echoHost.automergeRepo.find(automergeIndex);
6522
- await document.whenReady();
6523
- const properties = {
6524
- system: {
6525
- type: encodeReference(getTypeReference(PropertiesType))
6526
- },
6527
- data: {
6528
- [defaultKey]: identity.identityKey.toHex()
6529
- },
6530
- meta: {
6531
- keys: []
6532
- }
6533
- };
6534
- const propertiesId = PublicKey16.random().toHex();
6535
- document.change((doc) => {
6536
- assignDeep2(doc, [
6537
- "objects",
6538
- propertiesId
6539
- ], properties);
6540
- });
6541
- await this._serviceContext.echoHost.flush();
6542
7219
  return identity;
6543
7220
  }
6544
7221
  };
@@ -6588,7 +7265,6 @@ export {
6588
7265
  SpaceInvitationProtocol,
6589
7266
  InvitationsManager,
6590
7267
  DataSpace,
6591
- findPropertiesObject,
6592
7268
  DataSpaceManager,
6593
7269
  SpacesServiceImpl,
6594
7270
  ServiceContext,
@@ -6597,8 +7273,12 @@ export {
6597
7273
  isLocked,
6598
7274
  createStorageObjects,
6599
7275
  createLevel,
7276
+ encodeProfileArchive,
7277
+ decodeProfileArchive,
7278
+ exportProfileData,
7279
+ importProfileData,
6600
7280
  ClientServicesHost,
6601
7281
  ClientServicesProviderResource,
6602
7282
  DiagnosticsCollector
6603
7283
  };
6604
- //# sourceMappingURL=chunk-HSM5JUN6.mjs.map
7284
+ //# sourceMappingURL=chunk-4FNLRMHR.mjs.map