@dxos/client-services 0.3.11-main.dd122a6 → 0.3.11-main.df1e30a

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 (53) hide show
  1. package/dist/lib/browser/{chunk-JCTGTOQ4.mjs → chunk-NA7EQA7E.mjs} +200 -103
  2. package/dist/lib/browser/chunk-NA7EQA7E.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  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 +4 -11
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-6VE2OLVY.cjs → chunk-LTQYCVFH.cjs} +283 -186
  9. package/dist/lib/node/chunk-LTQYCVFH.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +37 -37
  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 +11 -18
  14. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  15. package/dist/types/src/packlets/identity/identity-service.d.ts +3 -3
  16. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  17. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +2 -0
  18. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  19. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +28 -3
  20. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  21. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  22. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -0
  23. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  24. package/dist/types/src/packlets/services/diagnostics.d.ts +4 -0
  25. package/dist/types/src/packlets/services/diagnostics.d.ts.map +1 -1
  26. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  27. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +2 -0
  28. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
  29. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  30. package/dist/types/src/packlets/spaces/data-space.d.ts +1 -0
  31. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  32. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  33. package/dist/types/src/version.d.ts +1 -1
  34. package/package.json +35 -35
  35. package/src/packlets/identity/identity-manager.ts +1 -1
  36. package/src/packlets/identity/identity-service.test.ts +1 -1
  37. package/src/packlets/identity/identity-service.ts +6 -3
  38. package/src/packlets/invitations/device-invitation-protocol.test.ts +14 -0
  39. package/src/packlets/invitations/device-invitation-protocol.ts +14 -0
  40. package/src/packlets/invitations/invitation-protocol.ts +44 -6
  41. package/src/packlets/invitations/invitations-handler.ts +20 -18
  42. package/src/packlets/invitations/space-invitation-protocol.test.ts +28 -0
  43. package/src/packlets/invitations/space-invitation-protocol.ts +11 -0
  44. package/src/packlets/services/diagnostics.ts +18 -0
  45. package/src/packlets/services/service-host.ts +27 -12
  46. package/src/packlets/spaces/automerge-space-state.ts +4 -0
  47. package/src/packlets/spaces/data-space-manager.ts +5 -1
  48. package/src/packlets/spaces/data-space.ts +21 -1
  49. package/src/packlets/spaces/spaces-service.ts +1 -1
  50. package/src/packlets/testing/invitation-utils.ts +2 -10
  51. package/src/version.ts +1 -1
  52. package/dist/lib/browser/chunk-JCTGTOQ4.mjs.map +0 -7
  53. package/dist/lib/node/chunk-6VE2OLVY.cjs.map +0 -7
@@ -483,7 +483,7 @@ function _ts_decorate(decorators, target, key, desc) {
483
483
  return c > 3 && r && Object.defineProperty(target, key, r), r;
484
484
  }
485
485
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity.ts";
486
- var Identity = class Identity2 {
486
+ var Identity = class {
487
487
  constructor({ space, signer, identityKey, deviceKey }) {
488
488
  this.stateUpdate = new Event();
489
489
  this.space = space;
@@ -665,7 +665,7 @@ function _ts_decorate2(decorators, target, key, desc) {
665
665
  return c > 3 && r && Object.defineProperty(target, key, r), r;
666
666
  }
667
667
  var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity-manager.ts";
668
- var IdentityManager = class IdentityManager2 {
668
+ var IdentityManager = class {
669
669
  // TODO(burdon): IdentityManagerParams.
670
670
  // TODO(dmaretskyi): Perhaps this should take/generate the peerKey outside of an initialized identity.
671
671
  constructor(_metadataStore, _keyring, _feedStore, _spaceManager) {
@@ -996,7 +996,7 @@ var IdentityManager = class IdentityManager2 {
996
996
  genesisFeedKey: spaceRecord.genesisFeedKey
997
997
  },
998
998
  swarmIdentity,
999
- onNetworkConnection: () => {
999
+ onAuthorizedConnection: () => {
1000
1000
  },
1001
1001
  onAuthFailure: () => {
1002
1002
  log3.warn("auth failure", void 0, {
@@ -1025,6 +1025,7 @@ import { signPresentation } from "@dxos/credentials";
1025
1025
  import { todo } from "@dxos/debug";
1026
1026
  import { invariant as invariant3 } from "@dxos/invariant";
1027
1027
  var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/identity/identity-service.ts";
1028
+ var CREATE_PROFILE_WITH_AUTOMERGE_DEFAULT = true;
1028
1029
  var IdentityServiceImpl = class {
1029
1030
  constructor(_createIdentity, _identityManager, _keyring, _onProfileUpdate) {
1030
1031
  this._createIdentity = _createIdentity;
@@ -1033,7 +1034,7 @@ var IdentityServiceImpl = class {
1033
1034
  this._onProfileUpdate = _onProfileUpdate;
1034
1035
  }
1035
1036
  async createIdentity(request) {
1036
- await this._createIdentity(request);
1037
+ await this._createIdentity(request.profile ?? {}, request.useAutomerge ?? CREATE_PROFILE_WITH_AUTOMERGE_DEFAULT);
1037
1038
  return this._getIdentity();
1038
1039
  }
1039
1040
  async recoverIdentity(request) {
@@ -1061,7 +1062,7 @@ var IdentityServiceImpl = class {
1061
1062
  async updateProfile(profile) {
1062
1063
  invariant3(this._identityManager.identity, "Identity not initialized.", {
1063
1064
  F: __dxlog_file4,
1064
- L: 60,
1065
+ L: 63,
1065
1066
  S: this,
1066
1067
  A: [
1067
1068
  "this._identityManager.identity",
@@ -1075,7 +1076,7 @@ var IdentityServiceImpl = class {
1075
1076
  async signPresentation({ presentation, nonce }) {
1076
1077
  invariant3(this._identityManager.identity, "Identity not initialized.", {
1077
1078
  F: __dxlog_file4,
1078
- L: 67,
1079
+ L: 70,
1079
1080
  S: this,
1080
1081
  A: [
1081
1082
  "this._identityManager.identity",
@@ -1094,6 +1095,7 @@ var IdentityServiceImpl = class {
1094
1095
 
1095
1096
  // packages/sdk/client-services/src/packlets/invitations/device-invitation-protocol.ts
1096
1097
  import { invariant as invariant4 } from "@dxos/invariant";
1098
+ import { AlreadyJoinedError } from "@dxos/protocols";
1097
1099
  import { Invitation } from "@dxos/protocols/proto/dxos/client/services";
1098
1100
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/device-invitation-protocol.ts";
1099
1101
  var DeviceInvitationProtocol = class {
@@ -1113,7 +1115,7 @@ var DeviceInvitationProtocol = class {
1113
1115
  async admit(request) {
1114
1116
  invariant4(request.device, void 0, {
1115
1117
  F: __dxlog_file5,
1116
- L: 35,
1118
+ L: 36,
1117
1119
  S: this,
1118
1120
  A: [
1119
1121
  "request.device",
@@ -1131,6 +1133,15 @@ var DeviceInvitationProtocol = class {
1131
1133
  }
1132
1134
  };
1133
1135
  }
1136
+ checkInvitation(invitation) {
1137
+ try {
1138
+ const identity = this._getIdentity();
1139
+ if (identity) {
1140
+ return new AlreadyJoinedError("Currently only one identity per client is supported.");
1141
+ }
1142
+ } catch {
1143
+ }
1144
+ }
1134
1145
  createIntroduction() {
1135
1146
  return {};
1136
1147
  }
@@ -1149,7 +1160,7 @@ var DeviceInvitationProtocol = class {
1149
1160
  async accept(response, request) {
1150
1161
  invariant4(response.device, void 0, {
1151
1162
  F: __dxlog_file5,
1152
- L: 68,
1163
+ L: 80,
1153
1164
  S: this,
1154
1165
  A: [
1155
1166
  "response.device",
@@ -1159,7 +1170,7 @@ var DeviceInvitationProtocol = class {
1159
1170
  const { identityKey, haloSpaceKey, genesisFeedKey, controlTimeframe } = response.device;
1160
1171
  invariant4(request.device, void 0, {
1161
1172
  F: __dxlog_file5,
1162
- L: 71,
1173
+ L: 83,
1163
1174
  S: this,
1164
1175
  A: [
1165
1176
  "request.device",
@@ -1941,16 +1952,12 @@ var InvitationsHandler = class {
1941
1952
  }
1942
1953
  }
1943
1954
  }
1944
- } else {
1945
- setState({
1946
- state: Invitation3.State.READY_FOR_AUTHENTICATION
1947
- });
1948
1955
  }
1949
1956
  log5("request admission", {
1950
1957
  ...protocol.toJSON()
1951
1958
  }, {
1952
1959
  F: __dxlog_file7,
1953
- L: 312,
1960
+ L: 309,
1954
1961
  S: this,
1955
1962
  C: (f, a) => f(...a)
1956
1963
  });
@@ -1962,19 +1969,20 @@ var InvitationsHandler = class {
1962
1969
  ...protocol.toJSON()
1963
1970
  }, {
1964
1971
  F: __dxlog_file7,
1965
- L: 323,
1972
+ L: 320,
1966
1973
  S: this,
1967
1974
  C: (f, a) => f(...a)
1968
1975
  });
1969
1976
  setState({
1970
1977
  ...result,
1978
+ target: invitation.target,
1971
1979
  state: Invitation3.State.SUCCESS
1972
1980
  });
1973
1981
  log5.trace("dxos.sdk.invitations-handler.guest.onOpen", trace4.end({
1974
1982
  id: traceId
1975
1983
  }), {
1976
1984
  F: __dxlog_file7,
1977
- L: 325,
1985
+ L: 322,
1978
1986
  S: this,
1979
1987
  C: (f, a) => f(...a)
1980
1988
  });
@@ -1984,7 +1992,7 @@ var InvitationsHandler = class {
1984
1992
  ...protocol.toJSON()
1985
1993
  }, {
1986
1994
  F: __dxlog_file7,
1987
- L: 328,
1995
+ L: 325,
1988
1996
  S: this,
1989
1997
  C: (f, a) => f(...a)
1990
1998
  });
@@ -1994,7 +2002,7 @@ var InvitationsHandler = class {
1994
2002
  } else {
1995
2003
  log5("auth failed", err, {
1996
2004
  F: __dxlog_file7,
1997
- L: 331,
2005
+ L: 328,
1998
2006
  S: this,
1999
2007
  C: (f, a) => f(...a)
2000
2008
  });
@@ -2005,7 +2013,7 @@ var InvitationsHandler = class {
2005
2013
  error: err
2006
2014
  }), {
2007
2015
  F: __dxlog_file7,
2008
- L: 334,
2016
+ L: 331,
2009
2017
  S: this,
2010
2018
  C: (f, a) => f(...a)
2011
2019
  });
@@ -2023,7 +2031,7 @@ var InvitationsHandler = class {
2023
2031
  ...protocol.toJSON()
2024
2032
  }, {
2025
2033
  F: __dxlog_file7,
2026
- L: 345,
2034
+ L: 342,
2027
2035
  S: this,
2028
2036
  C: (f, a) => f(...a)
2029
2037
  });
@@ -2033,7 +2041,7 @@ var InvitationsHandler = class {
2033
2041
  } else {
2034
2042
  log5("auth failed", err, {
2035
2043
  F: __dxlog_file7,
2036
- L: 348,
2044
+ L: 345,
2037
2045
  S: this,
2038
2046
  C: (f, a) => f(...a)
2039
2047
  });
@@ -2044,29 +2052,34 @@ var InvitationsHandler = class {
2044
2052
  return extension;
2045
2053
  };
2046
2054
  scheduleTask2(ctx, async () => {
2047
- invariant6(invitation.swarmKey, void 0, {
2048
- F: __dxlog_file7,
2049
- L: 358,
2050
- S: this,
2051
- A: [
2052
- "invitation.swarmKey",
2053
- ""
2054
- ]
2055
- });
2056
- const topic = invitation.swarmKey;
2057
- const swarmConnection = await this._networkManager.joinSwarm({
2058
- topic,
2059
- peerId: PublicKey6.random(),
2060
- protocolProvider: createTeleportProtocolFactory(async (teleport) => {
2061
- teleport.addExtension("dxos.halo.invitations", createExtension());
2062
- }),
2063
- topology: new StarTopology(topic),
2064
- label: "invitation guest"
2065
- });
2066
- ctx.onDispose(() => swarmConnection.close());
2067
- setState({
2068
- state: Invitation3.State.CONNECTING
2069
- });
2055
+ const error = protocol.checkInvitation(invitation);
2056
+ if (error) {
2057
+ stream.error(error);
2058
+ } else {
2059
+ invariant6(invitation.swarmKey, void 0, {
2060
+ F: __dxlog_file7,
2061
+ L: 359,
2062
+ S: this,
2063
+ A: [
2064
+ "invitation.swarmKey",
2065
+ ""
2066
+ ]
2067
+ });
2068
+ const topic = invitation.swarmKey;
2069
+ const swarmConnection = await this._networkManager.joinSwarm({
2070
+ topic,
2071
+ peerId: PublicKey6.random(),
2072
+ protocolProvider: createTeleportProtocolFactory(async (teleport) => {
2073
+ teleport.addExtension("dxos.halo.invitations", createExtension());
2074
+ }),
2075
+ topology: new StarTopology(topic),
2076
+ label: "invitation guest"
2077
+ });
2078
+ ctx.onDispose(() => swarmConnection.close());
2079
+ setState({
2080
+ state: Invitation3.State.CONNECTING
2081
+ });
2082
+ }
2070
2083
  });
2071
2084
  const observable = new AuthenticatingInvitation({
2072
2085
  initialInvitation: invitation,
@@ -2272,6 +2285,7 @@ import { createAdmissionCredentials, getCredentialAssertion } from "@dxos/creden
2272
2285
  import { writeMessages as writeMessages2 } from "@dxos/feed-store";
2273
2286
  import { invariant as invariant8 } from "@dxos/invariant";
2274
2287
  import { log as log7 } from "@dxos/log";
2288
+ import { AlreadyJoinedError as AlreadyJoinedError2 } from "@dxos/protocols";
2275
2289
  import { Invitation as Invitation5 } from "@dxos/protocols/proto/dxos/client/services";
2276
2290
  var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts";
2277
2291
  var SpaceInvitationProtocol = class {
@@ -2296,7 +2310,7 @@ var SpaceInvitationProtocol = class {
2296
2310
  async admit(request, guestProfile) {
2297
2311
  invariant8(this._spaceKey, void 0, {
2298
2312
  F: __dxlog_file9,
2299
- L: 46,
2313
+ L: 47,
2300
2314
  S: this,
2301
2315
  A: [
2302
2316
  "this._spaceKey",
@@ -2306,7 +2320,7 @@ var SpaceInvitationProtocol = class {
2306
2320
  const space = await this._spaceManager.spaces.get(this._spaceKey);
2307
2321
  invariant8(space, void 0, {
2308
2322
  F: __dxlog_file9,
2309
- L: 48,
2323
+ L: 49,
2310
2324
  S: this,
2311
2325
  A: [
2312
2326
  "space",
@@ -2315,7 +2329,7 @@ var SpaceInvitationProtocol = class {
2315
2329
  });
2316
2330
  invariant8(request.space, void 0, {
2317
2331
  F: __dxlog_file9,
2318
- L: 50,
2332
+ L: 51,
2319
2333
  S: this,
2320
2334
  A: [
2321
2335
  "request.space",
@@ -2328,14 +2342,14 @@ var SpaceInvitationProtocol = class {
2328
2342
  guest: deviceKey
2329
2343
  }, {
2330
2344
  F: __dxlog_file9,
2331
- L: 53,
2345
+ L: 54,
2332
2346
  S: this,
2333
2347
  C: (f, a) => f(...a)
2334
2348
  });
2335
2349
  const credentials = await createAdmissionCredentials(this._signingContext.credentialSigner, identityKey, space.key, space.inner.genesisFeedKey, guestProfile);
2336
2350
  invariant8(credentials[0].credential, void 0, {
2337
2351
  F: __dxlog_file9,
2338
- L: 64,
2352
+ L: 65,
2339
2353
  S: this,
2340
2354
  A: [
2341
2355
  "credentials[0].credential",
@@ -2345,7 +2359,7 @@ var SpaceInvitationProtocol = class {
2345
2359
  const spaceMemberCredential = credentials[0].credential.credential;
2346
2360
  invariant8(getCredentialAssertion(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
2347
2361
  F: __dxlog_file9,
2348
- L: 66,
2362
+ L: 67,
2349
2363
  S: this,
2350
2364
  A: [
2351
2365
  "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -2361,6 +2375,11 @@ var SpaceInvitationProtocol = class {
2361
2375
  }
2362
2376
  };
2363
2377
  }
2378
+ checkInvitation(invitation) {
2379
+ if (invitation.spaceKey && this._spaceManager.spaces.has(invitation.spaceKey)) {
2380
+ return new AlreadyJoinedError2("Already joined space.");
2381
+ }
2382
+ }
2364
2383
  createIntroduction() {
2365
2384
  return {
2366
2385
  profile: this._signingContext.getProfile()
@@ -2381,7 +2400,7 @@ var SpaceInvitationProtocol = class {
2381
2400
  async accept(response) {
2382
2401
  invariant8(response.space, void 0, {
2383
2402
  F: __dxlog_file9,
2384
- L: 101,
2403
+ L: 108,
2385
2404
  S: this,
2386
2405
  A: [
2387
2406
  "response.space",
@@ -2392,7 +2411,7 @@ var SpaceInvitationProtocol = class {
2392
2411
  const assertion = getCredentialAssertion(credential);
2393
2412
  invariant8(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
2394
2413
  F: __dxlog_file9,
2395
- L: 104,
2414
+ L: 111,
2396
2415
  S: this,
2397
2416
  A: [
2398
2417
  "assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -2401,13 +2420,16 @@ var SpaceInvitationProtocol = class {
2401
2420
  });
2402
2421
  invariant8(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
2403
2422
  F: __dxlog_file9,
2404
- L: 105,
2423
+ L: 112,
2405
2424
  S: this,
2406
2425
  A: [
2407
2426
  "credential.subject.id.equals(this._signingContext.identityKey)",
2408
2427
  ""
2409
2428
  ]
2410
2429
  });
2430
+ if (this._spaceManager.spaces.has(assertion.spaceKey)) {
2431
+ throw new AlreadyJoinedError2("Already joined space.");
2432
+ }
2411
2433
  await this._spaceManager.acceptSpace({
2412
2434
  spaceKey: assertion.spaceKey,
2413
2435
  genesisFeedKey: assertion.genesisFeedKey,
@@ -2436,7 +2458,7 @@ function _ts_decorate3(decorators, target, key, desc) {
2436
2458
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2437
2459
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2438
2460
  }
2439
- var ClientRpcServer = class ClientRpcServer2 {
2461
+ var ClientRpcServer = class {
2440
2462
  constructor(params) {
2441
2463
  this._handlerCache = /* @__PURE__ */ new Map();
2442
2464
  this._callMetrics = new MapCounter();
@@ -2541,7 +2563,7 @@ var getPlatform = () => {
2541
2563
  };
2542
2564
 
2543
2565
  // packages/sdk/client-services/src/version.ts
2544
- var DXOS_VERSION = "0.3.11-main.dd122a6";
2566
+ var DXOS_VERSION = "0.3.11-main.df1e30a";
2545
2567
 
2546
2568
  // packages/sdk/client-services/src/packlets/services/diagnostics.ts
2547
2569
  var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/diagnostics.ts";
@@ -2560,7 +2582,7 @@ var createDiagnostics = async (clientServices, serviceContext, config) => {
2560
2582
  {
2561
2583
  invariant9(clientServices.LoggingService, "SystemService is not available.", {
2562
2584
  F: __dxlog_file10,
2563
- L: 92,
2585
+ L: 93,
2564
2586
  S: void 0,
2565
2587
  A: [
2566
2588
  "clientServices.LoggingService",
@@ -2571,6 +2593,21 @@ var createDiagnostics = async (clientServices, serviceContext, config) => {
2571
2593
  timeout: DEFAULT_TIMEOUT
2572
2594
  }).catch(() => void 0);
2573
2595
  }
2596
+ if (typeof navigator !== "undefined" && navigator.storage) {
2597
+ const map = /* @__PURE__ */ new Map();
2598
+ const dir = await navigator.storage.getDirectory();
2599
+ for await (const filename of dir?.keys()) {
2600
+ const idx = filename.indexOf("-", filename.indexOf("-") + 1);
2601
+ if (idx === -1) {
2602
+ continue;
2603
+ }
2604
+ map.set(filename.slice(0, idx), (map.get(filename.slice(0, idx)) ?? 0) + 1);
2605
+ }
2606
+ diagnostics.storage = Array.from(map.entries()).sort((a, b) => b[1] - a[1]).map(([file, count]) => ({
2607
+ file,
2608
+ count
2609
+ }));
2610
+ }
2574
2611
  const identity = serviceContext.identityManager.identity;
2575
2612
  if (identity) {
2576
2613
  diagnostics.identity = {
@@ -2611,7 +2648,7 @@ var getProperties = (space) => {
2611
2648
  } catch (err) {
2612
2649
  log8.warn(err.message, void 0, {
2613
2650
  F: __dxlog_file10,
2614
- L: 160,
2651
+ L: 178,
2615
2652
  S: void 0,
2616
2653
  C: (f, a) => f(...a)
2617
2654
  });
@@ -2672,6 +2709,7 @@ import { AUTH_TIMEOUT as AUTH_TIMEOUT2 } from "@dxos/client-protocol";
2672
2709
  import { cancelWithContext as cancelWithContext2, Context as Context7 } from "@dxos/context";
2673
2710
  import { timed } from "@dxos/debug";
2674
2711
  import { createMappedFeedWriter } from "@dxos/echo-pipeline";
2712
+ import { failedInvariant } from "@dxos/invariant";
2675
2713
  import { PublicKey as PublicKey8 } from "@dxos/keys";
2676
2714
  import { log as log10 } from "@dxos/log";
2677
2715
  import { CancelledError, SystemError } from "@dxos/protocols";
@@ -2684,7 +2722,8 @@ import { ComplexSet as ComplexSet3 } from "@dxos/util";
2684
2722
  // packages/sdk/client-services/src/packlets/spaces/automerge-space-state.ts
2685
2723
  import { checkCredentialType } from "@dxos/credentials";
2686
2724
  var AutomergeSpaceState = class {
2687
- constructor() {
2725
+ constructor(_onNewRoot) {
2726
+ this._onNewRoot = _onNewRoot;
2688
2727
  this.rootUrl = void 0;
2689
2728
  this.lastEpoch = void 0;
2690
2729
  }
@@ -2695,6 +2734,7 @@ var AutomergeSpaceState = class {
2695
2734
  this.lastEpoch = credential;
2696
2735
  if (credential.subject.assertion.automergeRoot) {
2697
2736
  this.rootUrl = credential.subject.assertion.automergeRoot;
2737
+ this._onNewRoot(this.rootUrl);
2698
2738
  }
2699
2739
  }
2700
2740
  };
@@ -2980,13 +3020,13 @@ function _ts_decorate4(decorators, target, key, desc) {
2980
3020
  }
2981
3021
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
2982
3022
  var ENABLE_FEED_PURGE = false;
2983
- var DataSpace = class DataSpace2 {
3023
+ var DataSpace = class {
2984
3024
  constructor(params) {
2985
3025
  this._ctx = new Context7();
2986
3026
  this._notarizationPlugin = new NotarizationPlugin();
2987
3027
  this._cache = void 0;
2988
3028
  // TODO(dmaretskyi): Move into Space?
2989
- this._automergeSpaceState = new AutomergeSpaceState();
3029
+ this._automergeSpaceState = new AutomergeSpaceState((rootUrl) => this._onNewAutomergeRoot(rootUrl));
2990
3030
  this._state = SpaceState.CLOSED;
2991
3031
  /**
2992
3032
  * Error for _state === SpaceState.ERROR.
@@ -3015,7 +3055,7 @@ var DataSpace = class DataSpace2 {
3015
3055
  state: SpaceState[this._state]
3016
3056
  }, {
3017
3057
  F: __dxlog_file12,
3018
- L: 137,
3058
+ L: 138,
3019
3059
  S: this,
3020
3060
  C: (f, a) => f(...a)
3021
3061
  });
@@ -3062,7 +3102,7 @@ var DataSpace = class DataSpace2 {
3062
3102
  state: SpaceState[this._state]
3063
3103
  }, {
3064
3104
  F: __dxlog_file12,
3065
- L: 189,
3105
+ L: 190,
3066
3106
  S: this,
3067
3107
  C: (f, a) => f(...a)
3068
3108
  });
@@ -3080,7 +3120,7 @@ var DataSpace = class DataSpace2 {
3080
3120
  state: SpaceState[this._state]
3081
3121
  }, {
3082
3122
  F: __dxlog_file12,
3083
- L: 203,
3123
+ L: 204,
3084
3124
  S: this,
3085
3125
  C: (f, a) => f(...a)
3086
3126
  });
@@ -3112,7 +3152,7 @@ var DataSpace = class DataSpace2 {
3112
3152
  if (err instanceof CancelledError) {
3113
3153
  log10("data pipeline initialization cancelled", err, {
3114
3154
  F: __dxlog_file12,
3115
- L: 236,
3155
+ L: 237,
3116
3156
  S: this,
3117
3157
  C: (f, a) => f(...a)
3118
3158
  });
@@ -3120,7 +3160,7 @@ var DataSpace = class DataSpace2 {
3120
3160
  }
3121
3161
  log10.error("Error initializing data pipeline", err, {
3122
3162
  F: __dxlog_file12,
3123
- L: 240,
3163
+ L: 241,
3124
3164
  S: this,
3125
3165
  C: (f, a) => f(...a)
3126
3166
  });
@@ -3129,7 +3169,7 @@ var DataSpace = class DataSpace2 {
3129
3169
  state: SpaceState[this._state]
3130
3170
  }, {
3131
3171
  F: __dxlog_file12,
3132
- L: 242,
3172
+ L: 243,
3133
3173
  S: this,
3134
3174
  C: (f, a) => f(...a)
3135
3175
  });
@@ -3149,7 +3189,7 @@ var DataSpace = class DataSpace2 {
3149
3189
  state: SpaceState[this._state]
3150
3190
  }, {
3151
3191
  F: __dxlog_file12,
3152
- L: 258,
3192
+ L: 259,
3153
3193
  S: this,
3154
3194
  C: (f, a) => f(...a)
3155
3195
  });
@@ -3160,7 +3200,7 @@ var DataSpace = class DataSpace2 {
3160
3200
  await cancelWithContext2(this._ctx, this._inner.dataPipeline.ensureEpochInitialized());
3161
3201
  log10("waiting for data pipeline to reach target timeframe", void 0, {
3162
3202
  F: __dxlog_file12,
3163
- L: 272,
3203
+ L: 273,
3164
3204
  S: this,
3165
3205
  C: (f, a) => f(...a)
3166
3206
  });
@@ -3171,7 +3211,7 @@ var DataSpace = class DataSpace2 {
3171
3211
  this.metrics.dataPipelineReady = /* @__PURE__ */ new Date();
3172
3212
  log10("data pipeline ready", void 0, {
3173
3213
  F: __dxlog_file12,
3174
- L: 281,
3214
+ L: 282,
3175
3215
  S: this,
3176
3216
  C: (f, a) => f(...a)
3177
3217
  });
@@ -3181,7 +3221,7 @@ var DataSpace = class DataSpace2 {
3181
3221
  state: SpaceState[this._state]
3182
3222
  }, {
3183
3223
  F: __dxlog_file12,
3184
- L: 285,
3224
+ L: 286,
3185
3225
  S: this,
3186
3226
  C: (f, a) => f(...a)
3187
3227
  });
@@ -3197,7 +3237,7 @@ var DataSpace = class DataSpace2 {
3197
3237
  await this._createWritableFeeds();
3198
3238
  log10("writable feeds created", void 0, {
3199
3239
  F: __dxlog_file12,
3200
- L: 301,
3240
+ L: 302,
3201
3241
  S: this,
3202
3242
  C: (f, a) => f(...a)
3203
3243
  });
@@ -3254,6 +3294,40 @@ var DataSpace = class DataSpace2 {
3254
3294
  await this._metadataStore.setWritableFeedKeys(this.key, this.inner.controlFeedKey, this.inner.dataFeedKey);
3255
3295
  }
3256
3296
  }
3297
+ _onNewAutomergeRoot(rootUrl) {
3298
+ log10.info("loading automerge root doc for space", {
3299
+ space: this.key,
3300
+ rootUrl
3301
+ }, {
3302
+ F: __dxlog_file12,
3303
+ L: 368,
3304
+ S: this,
3305
+ C: (f, a) => f(...a)
3306
+ });
3307
+ const handle = this._automergeHost.repo.find(rootUrl);
3308
+ queueMicrotask(async () => {
3309
+ try {
3310
+ await handle.whenReady();
3311
+ const doc = handle.docSync() ?? failedInvariant();
3312
+ if (!doc.experimental_spaceKey) {
3313
+ handle.change((doc2) => {
3314
+ doc2.experimental_spaceKey = this.key.toHex();
3315
+ });
3316
+ }
3317
+ } catch (err) {
3318
+ log10.warn("error loading automerge root doc", {
3319
+ space: this.key,
3320
+ rootUrl,
3321
+ err
3322
+ }, {
3323
+ F: __dxlog_file12,
3324
+ L: 381,
3325
+ S: this,
3326
+ C: (f, a) => f(...a)
3327
+ });
3328
+ }
3329
+ });
3330
+ }
3257
3331
  // TODO(dmaretskyi): Use profile from signing context.
3258
3332
  async updateOwnProfile(profile) {
3259
3333
  const credential = await this._signingContext.credentialSigner.createCredential({
@@ -3337,7 +3411,7 @@ var DataSpace = class DataSpace2 {
3337
3411
  state: SpaceState[this._state]
3338
3412
  }, {
3339
3413
  F: __dxlog_file12,
3340
- L: 450,
3414
+ L: 470,
3341
3415
  S: this,
3342
3416
  C: (f, a) => f(...a)
3343
3417
  });
@@ -3469,7 +3543,7 @@ function _ts_decorate5(decorators, target, key, desc) {
3469
3543
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
3470
3544
  var PRESENCE_ANNOUNCE_INTERVAL = 1e4;
3471
3545
  var PRESENCE_OFFLINE_TIMEOUT = 2e4;
3472
- var DataSpaceManager = class DataSpaceManager2 {
3546
+ var DataSpaceManager = class {
3473
3547
  constructor(_spaceManager, _metadataStore, _dataServiceSubscriptions, _keyring, _signingContext, _feedStore, _automergeHost) {
3474
3548
  this._spaceManager = _spaceManager;
3475
3549
  this._metadataStore = _metadataStore;
@@ -3596,12 +3670,15 @@ var DataSpaceManager = class DataSpaceManager2 {
3596
3670
  });
3597
3671
  const space = await this._constructSpace(metadata);
3598
3672
  const automergeRoot = this._automergeHost.repo.create();
3673
+ automergeRoot.change((doc) => {
3674
+ doc.experimental_spaceKey = spaceKey.toHex();
3675
+ });
3599
3676
  const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner, automergeRoot.url);
3600
3677
  await this._metadataStore.addSpace(metadata);
3601
3678
  const memberCredential = credentials[1];
3602
3679
  invariant11(getCredentialAssertion2(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
3603
3680
  F: __dxlog_file13,
3604
- L: 151,
3681
+ L: 154,
3605
3682
  S: this,
3606
3683
  A: [
3607
3684
  "getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -3619,13 +3696,13 @@ var DataSpaceManager = class DataSpaceManager2 {
3619
3696
  opts
3620
3697
  }, {
3621
3698
  F: __dxlog_file13,
3622
- L: 163,
3699
+ L: 166,
3623
3700
  S: this,
3624
3701
  C: (f, a) => f(...a)
3625
3702
  });
3626
3703
  invariant11(this._isOpen, "Not open.", {
3627
3704
  F: __dxlog_file13,
3628
- L: 164,
3705
+ L: 167,
3629
3706
  S: this,
3630
3707
  A: [
3631
3708
  "this._isOpen",
@@ -3634,7 +3711,7 @@ var DataSpaceManager = class DataSpaceManager2 {
3634
3711
  });
3635
3712
  invariant11(!this._spaces.has(opts.spaceKey), "Space already exists.", {
3636
3713
  F: __dxlog_file13,
3637
- L: 165,
3714
+ L: 168,
3638
3715
  S: this,
3639
3716
  A: [
3640
3717
  "!this._spaces.has(opts.spaceKey)",
@@ -3669,7 +3746,7 @@ var DataSpaceManager = class DataSpaceManager2 {
3669
3746
  metadata
3670
3747
  }, {
3671
3748
  F: __dxlog_file13,
3672
- L: 198,
3749
+ L: 201,
3673
3750
  S: this,
3674
3751
  C: (f, a) => f(...a)
3675
3752
  });
@@ -3696,17 +3773,18 @@ var DataSpaceManager = class DataSpaceManager2 {
3696
3773
  credentialProvider: createAuthProvider(this._signingContext.credentialSigner),
3697
3774
  credentialAuthenticator: deferFunction2(() => dataSpace.authVerifier.verifier)
3698
3775
  },
3699
- onNetworkConnection: (session) => {
3776
+ onAuthorizedConnection: (session) => {
3700
3777
  session.addExtension("dxos.mesh.teleport.gossip", gossip.createExtension({
3701
3778
  remotePeerId: session.remotePeerId
3702
3779
  }));
3703
3780
  session.addExtension("dxos.mesh.teleport.notarization", dataSpace.notarizationPlugin.createExtension());
3781
+ this._automergeHost.authorizeDevice(space.key, session.remotePeerId);
3704
3782
  session.addExtension("dxos.mesh.teleport.automerge", this._automergeHost.createExtension());
3705
3783
  },
3706
3784
  onAuthFailure: () => {
3707
3785
  log11.warn("auth failure", void 0, {
3708
3786
  F: __dxlog_file13,
3709
- L: 234,
3787
+ L: 238,
3710
3788
  S: this,
3711
3789
  C: (f, a) => f(...a)
3712
3790
  });
@@ -3730,7 +3808,7 @@ var DataSpaceManager = class DataSpaceManager2 {
3730
3808
  space: space.key
3731
3809
  }, {
3732
3810
  F: __dxlog_file13,
3733
- L: 252,
3811
+ L: 256,
3734
3812
  S: this,
3735
3813
  C: (f, a) => f(...a)
3736
3814
  });
@@ -3742,7 +3820,7 @@ var DataSpaceManager = class DataSpaceManager2 {
3742
3820
  open: this._isOpen
3743
3821
  }, {
3744
3822
  F: __dxlog_file13,
3745
- L: 259,
3823
+ L: 263,
3746
3824
  S: this,
3747
3825
  C: (f, a) => f(...a)
3748
3826
  });
@@ -3755,7 +3833,7 @@ var DataSpaceManager = class DataSpaceManager2 {
3755
3833
  space: space.key
3756
3834
  }, {
3757
3835
  F: __dxlog_file13,
3758
- L: 265,
3836
+ L: 269,
3759
3837
  S: this,
3760
3838
  C: (f, a) => f(...a)
3761
3839
  });
@@ -3812,7 +3890,7 @@ var SpacesServiceImpl = class {
3812
3890
  }
3813
3891
  async createSpace() {
3814
3892
  if (!this._identityManager.identity) {
3815
- throw new Error("This device has no HALO identity available. See https://docs.dxos.org/guide/halo");
3893
+ throw new Error("This device has no HALO identity available. See https://docs.dxos.org/guide/platform/halo");
3816
3894
  }
3817
3895
  const dataSpaceManager = await this._getDataSpaceManager();
3818
3896
  const space = await dataSpaceManager.createSpace();
@@ -4042,7 +4120,7 @@ function _ts_decorate6(decorators, target, key, desc) {
4042
4120
  return c > 3 && r && Object.defineProperty(target, key, r), r;
4043
4121
  }
4044
4122
  var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
4045
- var ServiceContext = class ServiceContext2 {
4123
+ var ServiceContext = class {
4046
4124
  constructor(storage, networkManager, signalManager, modelFactory) {
4047
4125
  this.storage = storage;
4048
4126
  this.networkManager = networkManager;
@@ -4343,7 +4421,7 @@ var Lock = class {
4343
4421
  }
4344
4422
  async acquire() {
4345
4423
  this._broadcastChannel.postMessage({
4346
- message: Message.ACQUIRING
4424
+ message: "acquiring"
4347
4425
  });
4348
4426
  try {
4349
4427
  log14("aquiring lock...", void 0, {
@@ -4379,7 +4457,7 @@ var Lock = class {
4379
4457
  this._releaseTrigger.wake();
4380
4458
  }
4381
4459
  _onMessage(event) {
4382
- if (event.data.message === Message.ACQUIRING) {
4460
+ if (event.data.message === "acquiring") {
4383
4461
  this._releaseTrigger.wake();
4384
4462
  }
4385
4463
  }
@@ -4489,7 +4567,7 @@ import { clientServiceBundle, defaultKey, Properties } from "@dxos/client-protoc
4489
4567
  import { Context as Context10 } from "@dxos/context";
4490
4568
  import { DocumentModel as DocumentModel2 } from "@dxos/document-model";
4491
4569
  import { DataServiceImpl } from "@dxos/echo-pipeline";
4492
- import { base } from "@dxos/echo-schema";
4570
+ import { base, getRawDoc } from "@dxos/echo-schema";
4493
4571
  import { invariant as invariant14 } from "@dxos/invariant";
4494
4572
  import { PublicKey as PublicKey11 } from "@dxos/keys";
4495
4573
  import { log as log16 } from "@dxos/log";
@@ -4776,7 +4854,7 @@ var createGenesisMutationFromTypedObject = (obj) => {
4776
4854
  }
4777
4855
  };
4778
4856
  };
4779
- var ClientServicesHost = class ClientServicesHost2 {
4857
+ var ClientServicesHost = class {
4780
4858
  constructor({
4781
4859
  config,
4782
4860
  modelFactory = createDefaultModelFactory(),
@@ -4978,7 +5056,7 @@ var ClientServicesHost = class ClientServicesHost2 {
4978
5056
  this._serviceContext = new ServiceContext(this._storage, this._networkManager, this._signalManager, this._modelFactory);
4979
5057
  this._serviceRegistry.setServices({
4980
5058
  SystemService: this._systemService,
4981
- IdentityService: new IdentityServiceImpl((params) => this._createIdentity(params), this._serviceContext.identityManager, this._serviceContext.keyring, (profile) => this._serviceContext.broadcastProfileUpdate(profile)),
5059
+ IdentityService: new IdentityServiceImpl((params, useAutomerge) => this._createIdentity(params, useAutomerge), this._serviceContext.identityManager, this._serviceContext.keyring, (profile) => this._serviceContext.broadcastProfileUpdate(profile)),
4982
5060
  InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitations, (invitation) => this._serviceContext.getInvitationHandler(invitation)),
4983
5061
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
4984
5062
  SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, this._serviceContext.dataServiceSubscriptions, async () => {
@@ -5092,25 +5170,44 @@ var ClientServicesHost = class ClientServicesHost2 {
5092
5170
  });
5093
5171
  await this._callbacks?.onReset?.();
5094
5172
  }
5095
- async _createIdentity(params) {
5173
+ async _createIdentity(params, useAutomerge) {
5096
5174
  const identity = await this._serviceContext.createIdentity(params);
5097
5175
  await this._serviceContext.initialized.wait();
5098
5176
  const space = await this._serviceContext.dataSpaceManager.createSpace();
5099
5177
  const obj = new Properties(void 0, {
5100
- automerge: false
5178
+ automerge: useAutomerge
5101
5179
  });
5102
5180
  obj[defaultKey] = identity.identityKey.toHex();
5103
- await this._serviceRegistry.services.DataService.write({
5104
- spaceKey: space.key,
5105
- batch: {
5106
- objects: [
5107
- createGenesisMutationFromTypedObject(obj)
5181
+ if (!useAutomerge) {
5182
+ await this._serviceRegistry.services.DataService.write({
5183
+ spaceKey: space.key,
5184
+ batch: {
5185
+ objects: [
5186
+ createGenesisMutationFromTypedObject(obj)
5187
+ ]
5188
+ }
5189
+ });
5190
+ await this._serviceRegistry.services.DataService.flush({
5191
+ spaceKey: space.key
5192
+ });
5193
+ } else {
5194
+ const automergeIndex = space.automergeSpaceState.rootUrl;
5195
+ invariant14(automergeIndex, void 0, {
5196
+ F: __dxlog_file17,
5197
+ L: 375,
5198
+ S: this,
5199
+ A: [
5200
+ "automergeIndex",
5201
+ ""
5108
5202
  ]
5109
- }
5110
- });
5111
- await this._serviceRegistry.services.DataService.flush({
5112
- spaceKey: space.key
5113
- });
5203
+ });
5204
+ const document = await this._serviceContext.automergeHost.repo.find(automergeIndex);
5205
+ await document.whenReady();
5206
+ document.change((doc) => {
5207
+ doc.objects ??= {};
5208
+ doc.objects[obj[base]._id] = getRawDoc(obj).handle.docSync();
5209
+ });
5210
+ }
5114
5211
  return identity;
5115
5212
  }
5116
5213
  };
@@ -5166,4 +5263,4 @@ export {
5166
5263
  createDefaultModelFactory,
5167
5264
  ClientServicesHost
5168
5265
  };
5169
- //# sourceMappingURL=chunk-JCTGTOQ4.mjs.map
5266
+ //# sourceMappingURL=chunk-NA7EQA7E.mjs.map