@dxos/client-services 0.4.10-main.b9b4602 → 0.4.10-main.bf49328

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 (69) hide show
  1. package/dist/lib/browser/{chunk-TPPBOJTA.mjs → chunk-OJG7GULD.mjs} +756 -572
  2. package/dist/lib/browser/chunk-OJG7GULD.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +5 -3
  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 +133 -115
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-33Q7F4MM.cjs → chunk-LCYSS5ZM.cjs} +848 -665
  9. package/dist/lib/node/chunk-LCYSS5ZM.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +45 -43
  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 +133 -118
  14. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  15. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  16. package/dist/types/src/packlets/indexing/util.d.ts +2 -6
  17. package/dist/types/src/packlets/indexing/util.d.ts.map +1 -1
  18. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +3 -1
  19. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  20. package/dist/types/src/packlets/invitations/index.d.ts +1 -0
  21. package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
  22. package/dist/types/src/packlets/invitations/invitation-extension.d.ts +1 -0
  23. package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +1 -1
  24. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +6 -1
  25. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  26. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +8 -4
  27. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  28. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +44 -0
  29. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -0
  30. package/dist/types/src/packlets/invitations/invitations-service.d.ts +7 -23
  31. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  32. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -1
  33. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  34. package/dist/types/src/packlets/services/service-context.d.ts +2 -0
  35. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  36. package/dist/types/src/packlets/services/service-host.d.ts +4 -1
  37. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  38. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +5 -1
  39. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  40. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  41. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  42. package/dist/types/src/packlets/testing/test-builder.d.ts +6 -1
  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 +34 -34
  46. package/src/packlets/identity/identity-manager.ts +1 -0
  47. package/src/packlets/identity/identity.test.ts +3 -0
  48. package/src/packlets/indexing/util.ts +9 -66
  49. package/src/packlets/invitations/device-invitation-protocol.ts +6 -1
  50. package/src/packlets/invitations/index.ts +1 -0
  51. package/src/packlets/invitations/invitation-extension.ts +28 -1
  52. package/src/packlets/invitations/invitation-protocol.ts +7 -1
  53. package/src/packlets/invitations/invitations-handler.ts +75 -96
  54. package/src/packlets/invitations/invitations-manager.ts +271 -0
  55. package/src/packlets/invitations/invitations-service.ts +23 -168
  56. package/src/packlets/invitations/space-invitation-protocol.ts +45 -3
  57. package/src/packlets/services/automerge-host.test.ts +10 -4
  58. package/src/packlets/services/service-context.test.ts +4 -1
  59. package/src/packlets/services/service-context.ts +19 -5
  60. package/src/packlets/services/service-host.ts +25 -18
  61. package/src/packlets/spaces/data-space-manager.test.ts +4 -4
  62. package/src/packlets/spaces/data-space-manager.ts +48 -2
  63. package/src/packlets/spaces/data-space.ts +1 -1
  64. package/src/packlets/storage/level.ts +1 -1
  65. package/src/packlets/testing/invitation-utils.ts +100 -97
  66. package/src/packlets/testing/test-builder.ts +39 -5
  67. package/src/version.ts +1 -1
  68. package/dist/lib/browser/chunk-TPPBOJTA.mjs.map +0 -7
  69. package/dist/lib/node/chunk-33Q7F4MM.cjs.map +0 -7
@@ -1086,7 +1086,9 @@ var IdentityManager = class {
1086
1086
  C: (f, a) => f(...a)
1087
1087
  });
1088
1088
  },
1089
- memberKey: identityKey
1089
+ memberKey: identityKey,
1090
+ onDelegatedInvitationStatusChange: async () => {
1091
+ }
1090
1092
  });
1091
1093
  }
1092
1094
  };
@@ -1194,10 +1196,13 @@ var DeviceInvitationProtocol = class {
1194
1196
  kind: Invitation.Kind.DEVICE
1195
1197
  };
1196
1198
  }
1197
- async admit(request) {
1199
+ async delegate(invitation) {
1200
+ throw new Error("delegation not supported");
1201
+ }
1202
+ async admit(_, request) {
1198
1203
  invariant4(request.device, void 0, {
1199
1204
  F: __dxlog_file5,
1200
- L: 37,
1205
+ L: 42,
1201
1206
  S: this,
1202
1207
  A: [
1203
1208
  "request.device",
@@ -1243,7 +1248,7 @@ var DeviceInvitationProtocol = class {
1243
1248
  async accept(response, request) {
1244
1249
  invariant4(response.device, void 0, {
1245
1250
  F: __dxlog_file5,
1246
- L: 82,
1251
+ L: 87,
1247
1252
  S: this,
1248
1253
  A: [
1249
1254
  "response.device",
@@ -1253,7 +1258,7 @@ var DeviceInvitationProtocol = class {
1253
1258
  const { identityKey, haloSpaceKey, genesisFeedKey, controlTimeframe } = response.device;
1254
1259
  invariant4(request.device, void 0, {
1255
1260
  F: __dxlog_file5,
1256
- L: 85,
1261
+ L: 90,
1257
1262
  S: this,
1258
1263
  A: [
1259
1264
  "request.device",
@@ -1279,9 +1284,9 @@ var DeviceInvitationProtocol = class {
1279
1284
 
1280
1285
  // packages/sdk/client-services/src/packlets/invitations/invitations-handler.ts
1281
1286
  import { PushStream, scheduleTask as scheduleTask2, TimeoutError, Trigger as Trigger3 } from "@dxos/async";
1282
- import { AuthenticatingInvitation, AUTHENTICATION_CODE_LENGTH, CancellableInvitation, INVITATION_TIMEOUT } from "@dxos/client-protocol";
1287
+ import { AuthenticatingInvitation, INVITATION_TIMEOUT } from "@dxos/client-protocol";
1283
1288
  import { Context as Context5 } from "@dxos/context";
1284
- import { generatePasscode } from "@dxos/credentials";
1289
+ import { createKeyPair, sign } from "@dxos/crypto";
1285
1290
  import { invariant as invariant6 } from "@dxos/invariant";
1286
1291
  import { PublicKey as PublicKey6 } from "@dxos/keys";
1287
1292
  import { log as log5 } from "@dxos/log";
@@ -1293,6 +1298,7 @@ import { AuthenticationResponse as AuthenticationResponse2 } from "@dxos/protoco
1293
1298
  // packages/sdk/client-services/src/packlets/invitations/invitation-extension.ts
1294
1299
  import { Trigger as Trigger2 } from "@dxos/async";
1295
1300
  import { cancelWithContext, Context as Context4 } from "@dxos/context";
1301
+ import { randomBytes, verify } from "@dxos/crypto";
1296
1302
  import { invariant as invariant5 } from "@dxos/invariant";
1297
1303
  import { PublicKey as PublicKey5 } from "@dxos/keys";
1298
1304
  import { log as log4 } from "@dxos/log";
@@ -1316,6 +1322,7 @@ var InvitationHostExtension = class extends RpcExtension {
1316
1322
  this._callbacks = _callbacks;
1317
1323
  this._ctx = new Context4();
1318
1324
  this._remoteOptionsTrigger = new Trigger2();
1325
+ this._challenge = void 0;
1319
1326
  this.invitation = void 0;
1320
1327
  this.guestProfile = void 0;
1321
1328
  this.authenticationPassed = false;
@@ -1330,7 +1337,7 @@ var InvitationHostExtension = class extends RpcExtension {
1330
1337
  options: async (options) => {
1331
1338
  invariant5(!this._remoteOptions, "Remote options already set.", {
1332
1339
  F: __dxlog_file6,
1333
- L: 87,
1340
+ L: 90,
1334
1341
  S: this,
1335
1342
  A: [
1336
1343
  "!this._remoteOptions",
@@ -1347,7 +1354,7 @@ var InvitationHostExtension = class extends RpcExtension {
1347
1354
  id: traceId
1348
1355
  }), {
1349
1356
  F: __dxlog_file6,
1350
- L: 96,
1357
+ L: 99,
1351
1358
  S: this,
1352
1359
  C: (f, a) => f(...a)
1353
1360
  });
@@ -1357,7 +1364,7 @@ var InvitationHostExtension = class extends RpcExtension {
1357
1364
  invitationId
1358
1365
  }, {
1359
1366
  F: __dxlog_file6,
1360
- L: 100,
1367
+ L: 103,
1361
1368
  S: this,
1362
1369
  C: (f, a) => f(...a)
1363
1370
  });
@@ -1371,7 +1378,7 @@ var InvitationHostExtension = class extends RpcExtension {
1371
1378
  guestProfile: profile
1372
1379
  }, {
1373
1380
  F: __dxlog_file6,
1374
- L: 109,
1381
+ L: 112,
1375
1382
  S: this,
1376
1383
  C: (f, a) => f(...a)
1377
1384
  });
@@ -1380,25 +1387,27 @@ var InvitationHostExtension = class extends RpcExtension {
1380
1387
  ...this.invitation,
1381
1388
  state: Invitation2.State.READY_FOR_AUTHENTICATION
1382
1389
  });
1390
+ this._challenge = this.invitation.authMethod === Invitation2.AuthMethod.KNOWN_PUBLIC_KEY ? randomBytes(32) : void 0;
1383
1391
  log4.trace("dxos.sdk.invitation-handler.host.introduce", trace3.end({
1384
1392
  id: traceId
1385
1393
  }), {
1386
1394
  F: __dxlog_file6,
1387
- L: 116,
1395
+ L: 122,
1388
1396
  S: this,
1389
1397
  C: (f, a) => f(...a)
1390
1398
  });
1391
1399
  return {
1392
- authMethod: this.invitation.authMethod
1400
+ authMethod: this.invitation.authMethod,
1401
+ challenge: this._challenge
1393
1402
  };
1394
1403
  },
1395
- authenticate: async ({ authCode: code }) => {
1404
+ authenticate: async ({ authCode: code, signedChallenge }) => {
1396
1405
  const traceId = PublicKey5.random().toHex();
1397
1406
  log4.trace("dxos.sdk.invitation-handler.host.authenticate", trace3.begin({
1398
1407
  id: traceId
1399
1408
  }), {
1400
1409
  F: __dxlog_file6,
1401
- L: 124,
1410
+ L: 131,
1402
1411
  S: this,
1403
1412
  C: (f, a) => f(...a)
1404
1413
  });
@@ -1406,14 +1415,14 @@ var InvitationHostExtension = class extends RpcExtension {
1406
1415
  authCode: code
1407
1416
  }, {
1408
1417
  F: __dxlog_file6,
1409
- L: 125,
1418
+ L: 132,
1410
1419
  S: this,
1411
1420
  C: (f, a) => f(...a)
1412
1421
  });
1413
1422
  let status = AuthenticationResponse.Status.OK;
1414
1423
  invariant5(this.invitation, "Invitation is not set.", {
1415
1424
  F: __dxlog_file6,
1416
- L: 128,
1425
+ L: 135,
1417
1426
  S: this,
1418
1427
  A: [
1419
1428
  "this.invitation",
@@ -1424,7 +1433,7 @@ var InvitationHostExtension = class extends RpcExtension {
1424
1433
  case Invitation2.AuthMethod.NONE: {
1425
1434
  log4("authentication not required", void 0, {
1426
1435
  F: __dxlog_file6,
1427
- L: 131,
1436
+ L: 138,
1428
1437
  S: this,
1429
1438
  C: (f, a) => f(...a)
1430
1439
  });
@@ -1444,12 +1453,25 @@ var InvitationHostExtension = class extends RpcExtension {
1444
1453
  }
1445
1454
  break;
1446
1455
  }
1456
+ case Invitation2.AuthMethod.KNOWN_PUBLIC_KEY: {
1457
+ if (!this.invitation.guestKeypair) {
1458
+ status = AuthenticationResponse.Status.INTERNAL_ERROR;
1459
+ break;
1460
+ }
1461
+ const isSignatureValid = this._challenge && verify(this._challenge, Buffer.from(signedChallenge ?? []), this.invitation.guestKeypair.publicKey.asBuffer());
1462
+ if (isSignatureValid) {
1463
+ this.authenticationPassed = true;
1464
+ } else {
1465
+ status = AuthenticationResponse.Status.INVALID_SIGNATURE;
1466
+ }
1467
+ break;
1468
+ }
1447
1469
  default: {
1448
1470
  log4.error("invalid authentication method", {
1449
1471
  authMethod: this.invitation.authMethod
1450
1472
  }, {
1451
1473
  F: __dxlog_file6,
1452
- L: 149,
1474
+ L: 176,
1453
1475
  S: this,
1454
1476
  C: (f, a) => f(...a)
1455
1477
  });
@@ -1464,7 +1486,7 @@ var InvitationHostExtension = class extends RpcExtension {
1464
1486
  }
1465
1487
  }), {
1466
1488
  F: __dxlog_file6,
1467
- L: 155,
1489
+ L: 182,
1468
1490
  S: this,
1469
1491
  C: (f, a) => f(...a)
1470
1492
  });
@@ -1478,14 +1500,14 @@ var InvitationHostExtension = class extends RpcExtension {
1478
1500
  id: traceId
1479
1501
  }), {
1480
1502
  F: __dxlog_file6,
1481
- L: 161,
1503
+ L: 188,
1482
1504
  S: this,
1483
1505
  C: (f, a) => f(...a)
1484
1506
  });
1485
1507
  try {
1486
1508
  invariant5(this.invitation, "Invitation is not set.", {
1487
1509
  F: __dxlog_file6,
1488
- L: 164,
1510
+ L: 191,
1489
1511
  S: this,
1490
1512
  A: [
1491
1513
  "this.invitation",
@@ -1500,7 +1522,7 @@ var InvitationHostExtension = class extends RpcExtension {
1500
1522
  id: traceId
1501
1523
  }), {
1502
1524
  F: __dxlog_file6,
1503
- L: 172,
1525
+ L: 199,
1504
1526
  S: this,
1505
1527
  C: (f, a) => f(...a)
1506
1528
  });
@@ -1557,7 +1579,7 @@ var InvitationGuestExtension = class extends RpcExtension {
1557
1579
  options: async (options) => {
1558
1580
  invariant5(!this._remoteOptions, "Remote options already set.", {
1559
1581
  F: __dxlog_file6,
1560
- L: 239,
1582
+ L: 266,
1561
1583
  S: this,
1562
1584
  A: [
1563
1585
  "!this._remoteOptions",
@@ -1584,7 +1606,7 @@ var InvitationGuestExtension = class extends RpcExtension {
1584
1606
  try {
1585
1607
  log4("begin options", void 0, {
1586
1608
  F: __dxlog_file6,
1587
- L: 260,
1609
+ L: 287,
1588
1610
  S: this,
1589
1611
  C: (f, a) => f(...a)
1590
1612
  });
@@ -1596,7 +1618,7 @@ var InvitationGuestExtension = class extends RpcExtension {
1596
1618
  }));
1597
1619
  log4("end options", void 0, {
1598
1620
  F: __dxlog_file6,
1599
- L: 263,
1621
+ L: 290,
1600
1622
  S: this,
1601
1623
  C: (f, a) => f(...a)
1602
1624
  });
@@ -1610,7 +1632,7 @@ var InvitationGuestExtension = class extends RpcExtension {
1610
1632
  } catch (err) {
1611
1633
  log4("openError", err, {
1612
1634
  F: __dxlog_file6,
1613
- L: 273,
1635
+ L: 300,
1614
1636
  S: this,
1615
1637
  C: (f, a) => f(...a)
1616
1638
  });
@@ -1620,7 +1642,7 @@ var InvitationGuestExtension = class extends RpcExtension {
1620
1642
  async onClose() {
1621
1643
  log4("onClose", void 0, {
1622
1644
  F: __dxlog_file6,
1623
- L: 279,
1645
+ L: 306,
1624
1646
  S: this,
1625
1647
  C: (f, a) => f(...a)
1626
1648
  });
@@ -1638,49 +1660,7 @@ var InvitationsHandler = class {
1638
1660
  constructor(_networkManager) {
1639
1661
  this._networkManager = _networkManager;
1640
1662
  }
1641
- createInvitation(protocol, options) {
1642
- const { invitationId = PublicKey6.random().toHex(), type = Invitation3.Type.INTERACTIVE, authMethod = Invitation3.AuthMethod.SHARED_SECRET, state = Invitation3.State.INIT, timeout = INVITATION_TIMEOUT, swarmKey = PublicKey6.random(), persistent = true, created = /* @__PURE__ */ new Date(), lifetime = 86400 } = options ?? {};
1643
- const authCode = options?.authCode ?? (authMethod === Invitation3.AuthMethod.SHARED_SECRET ? generatePasscode(AUTHENTICATION_CODE_LENGTH) : void 0);
1644
- invariant6(protocol, void 0, {
1645
- F: __dxlog_file7,
1646
- L: 84,
1647
- S: this,
1648
- A: [
1649
- "protocol",
1650
- ""
1651
- ]
1652
- });
1653
- const invitation = {
1654
- invitationId,
1655
- type,
1656
- authMethod,
1657
- state,
1658
- swarmKey,
1659
- authCode,
1660
- timeout,
1661
- persistent,
1662
- created,
1663
- lifetime,
1664
- ...protocol.getInvitationContext()
1665
- };
1666
- const stream = new PushStream();
1667
- const ctx = new Context5({
1668
- onError: (err) => {
1669
- stream.error(err);
1670
- void ctx.dispose();
1671
- }
1672
- });
1673
- ctx.onDispose(() => {
1674
- log5("complete", {
1675
- ...protocol.toJSON()
1676
- }, {
1677
- F: __dxlog_file7,
1678
- L: 109,
1679
- S: this,
1680
- C: (f, a) => f(...a)
1681
- });
1682
- stream.complete();
1683
- });
1663
+ handleInvitationFlow(ctx, stream, protocol, invitation) {
1684
1664
  const createExtension = () => {
1685
1665
  const extension = new InvitationHostExtension({
1686
1666
  onStateUpdate: (invitation2) => {
@@ -1689,8 +1669,8 @@ var InvitationsHandler = class {
1689
1669
  state: Invitation3.State.READY_FOR_AUTHENTICATION
1690
1670
  });
1691
1671
  },
1692
- resolveInvitation: async ({ invitationId: invitationId2 }) => {
1693
- if (invitationId2 && invitationId2 !== invitation.invitationId) {
1672
+ resolveInvitation: async ({ invitationId }) => {
1673
+ if (invitationId && invitationId !== invitation.invitationId) {
1694
1674
  return void 0;
1695
1675
  }
1696
1676
  return invitation;
@@ -1700,14 +1680,14 @@ var InvitationsHandler = class {
1700
1680
  const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;
1701
1681
  invariant6(deviceKey, void 0, {
1702
1682
  F: __dxlog_file7,
1703
- L: 130,
1683
+ L: 87,
1704
1684
  S: this,
1705
1685
  A: [
1706
1686
  "deviceKey",
1707
1687
  ""
1708
1688
  ]
1709
1689
  });
1710
- const admissionResponse = await protocol.admit(admissionRequest, extension.guestProfile);
1690
+ const admissionResponse = await protocol.admit(invitation, admissionRequest, extension.guestProfile);
1711
1691
  extension.completedTrigger.wake(deviceKey);
1712
1692
  return admissionResponse;
1713
1693
  } catch (err) {
@@ -1723,7 +1703,7 @@ var InvitationsHandler = class {
1723
1703
  id: traceId
1724
1704
  }), {
1725
1705
  F: __dxlog_file7,
1726
- L: 148,
1706
+ L: 105,
1727
1707
  S: this,
1728
1708
  C: (f, a) => f(...a)
1729
1709
  });
@@ -1731,7 +1711,7 @@ var InvitationsHandler = class {
1731
1711
  ...protocol.toJSON()
1732
1712
  }, {
1733
1713
  F: __dxlog_file7,
1734
- L: 149,
1714
+ L: 106,
1735
1715
  S: this,
1736
1716
  C: (f, a) => f(...a)
1737
1717
  });
@@ -1740,14 +1720,14 @@ var InvitationsHandler = class {
1740
1720
  state: Invitation3.State.CONNECTED
1741
1721
  });
1742
1722
  const deviceKey = await extension.completedTrigger.wait({
1743
- timeout
1723
+ timeout: invitation.timeout
1744
1724
  });
1745
1725
  log5("admitted guest", {
1746
1726
  guest: deviceKey,
1747
1727
  ...protocol.toJSON()
1748
1728
  }, {
1749
1729
  F: __dxlog_file7,
1750
- L: 152,
1730
+ L: 109,
1751
1731
  S: this,
1752
1732
  C: (f, a) => f(...a)
1753
1733
  });
@@ -1759,7 +1739,7 @@ var InvitationsHandler = class {
1759
1739
  id: traceId
1760
1740
  }), {
1761
1741
  F: __dxlog_file7,
1762
- L: 154,
1742
+ L: 111,
1763
1743
  S: this,
1764
1744
  C: (f, a) => f(...a)
1765
1745
  });
@@ -1769,7 +1749,7 @@ var InvitationsHandler = class {
1769
1749
  ...protocol.toJSON()
1770
1750
  }, {
1771
1751
  F: __dxlog_file7,
1772
- L: 157,
1752
+ L: 114,
1773
1753
  S: this,
1774
1754
  C: (f, a) => f(...a)
1775
1755
  });
@@ -1780,7 +1760,7 @@ var InvitationsHandler = class {
1780
1760
  } else {
1781
1761
  log5.error("failed", err, {
1782
1762
  F: __dxlog_file7,
1783
- L: 160,
1763
+ L: 117,
1784
1764
  S: this,
1785
1765
  C: (f, a) => f(...a)
1786
1766
  });
@@ -1791,12 +1771,12 @@ var InvitationsHandler = class {
1791
1771
  error: err
1792
1772
  }), {
1793
1773
  F: __dxlog_file7,
1794
- L: 163,
1774
+ L: 120,
1795
1775
  S: this,
1796
1776
  C: (f, a) => f(...a)
1797
1777
  });
1798
1778
  } finally {
1799
- if (type !== Invitation3.Type.MULTIUSE) {
1779
+ if (!invitation.multiUse) {
1800
1780
  await swarmConnection.close();
1801
1781
  await ctx.dispose();
1802
1782
  }
@@ -1812,7 +1792,7 @@ var InvitationsHandler = class {
1812
1792
  ...protocol.toJSON()
1813
1793
  }, {
1814
1794
  F: __dxlog_file7,
1815
- L: 178,
1795
+ L: 135,
1816
1796
  S: this,
1817
1797
  C: (f, a) => f(...a)
1818
1798
  });
@@ -1823,7 +1803,7 @@ var InvitationsHandler = class {
1823
1803
  } else {
1824
1804
  log5.error("failed", err, {
1825
1805
  F: __dxlog_file7,
1826
- L: 181,
1806
+ L: 138,
1827
1807
  S: this,
1828
1808
  C: (f, a) => f(...a)
1829
1809
  });
@@ -1833,11 +1813,11 @@ var InvitationsHandler = class {
1833
1813
  });
1834
1814
  return extension;
1835
1815
  };
1836
- if (invitation.lifetime && invitation.created && invitation.lifetime !== 0) {
1816
+ if (invitation.lifetime && invitation.created) {
1837
1817
  if (invitation.created.getTime() + invitation.lifetime * 1e3 < Date.now()) {
1838
1818
  log5.warn("invitation has already expired", void 0, {
1839
1819
  F: __dxlog_file7,
1840
- L: 192,
1820
+ L: 149,
1841
1821
  S: this,
1842
1822
  C: (f, a) => f(...a)
1843
1823
  });
@@ -1871,24 +1851,12 @@ var InvitationsHandler = class {
1871
1851
  state: Invitation3.State.CONNECTING
1872
1852
  });
1873
1853
  });
1874
- const observable = new CancellableInvitation({
1875
- initialInvitation: invitation,
1876
- subscriber: stream.observable,
1877
- onCancel: async () => {
1878
- stream.next({
1879
- ...invitation,
1880
- state: Invitation3.State.CANCELLED
1881
- });
1882
- await ctx.dispose();
1883
- }
1884
- });
1885
- return observable;
1886
1854
  }
1887
1855
  acceptInvitation(protocol, invitation, deviceProfile) {
1888
1856
  const { timeout = INVITATION_TIMEOUT } = invitation;
1889
1857
  invariant6(protocol, void 0, {
1890
1858
  F: __dxlog_file7,
1891
- L: 246,
1859
+ L: 191,
1892
1860
  S: this,
1893
1861
  A: [
1894
1862
  "protocol",
@@ -1898,7 +1866,7 @@ var InvitationsHandler = class {
1898
1866
  if (deviceProfile) {
1899
1867
  invariant6(invitation.kind === Invitation3.Kind.DEVICE, "deviceProfile provided for non-device invitation", {
1900
1868
  F: __dxlog_file7,
1901
- L: 250,
1869
+ L: 194,
1902
1870
  S: this,
1903
1871
  A: [
1904
1872
  "invitation.kind === Invitation.Kind.DEVICE",
@@ -1913,7 +1881,7 @@ var InvitationsHandler = class {
1913
1881
  const setState = (newData) => {
1914
1882
  invariant6(newData.state !== void 0, void 0, {
1915
1883
  F: __dxlog_file7,
1916
- L: 261,
1884
+ L: 205,
1917
1885
  S: this,
1918
1886
  A: [
1919
1887
  "newData.state !== undefined",
@@ -1933,7 +1901,7 @@ var InvitationsHandler = class {
1933
1901
  ...protocol.toJSON()
1934
1902
  }, {
1935
1903
  F: __dxlog_file7,
1936
- L: 269,
1904
+ L: 213,
1937
1905
  S: this,
1938
1906
  C: (f, a) => f(...a)
1939
1907
  });
@@ -1943,7 +1911,7 @@ var InvitationsHandler = class {
1943
1911
  } else {
1944
1912
  log5.warn("auth failed", err, {
1945
1913
  F: __dxlog_file7,
1946
- L: 272,
1914
+ L: 216,
1947
1915
  S: this,
1948
1916
  C: (f, a) => f(...a)
1949
1917
  });
@@ -1957,7 +1925,7 @@ var InvitationsHandler = class {
1957
1925
  ...protocol.toJSON()
1958
1926
  }, {
1959
1927
  F: __dxlog_file7,
1960
- L: 280,
1928
+ L: 224,
1961
1929
  S: this,
1962
1930
  C: (f, a) => f(...a)
1963
1931
  });
@@ -1972,7 +1940,7 @@ var InvitationsHandler = class {
1972
1940
  currentState
1973
1941
  }, {
1974
1942
  F: __dxlog_file7,
1975
- L: 290,
1943
+ L: 234,
1976
1944
  S: this,
1977
1945
  C: (f, a) => f(...a)
1978
1946
  });
@@ -1987,7 +1955,7 @@ var InvitationsHandler = class {
1987
1955
  id: traceId
1988
1956
  }), {
1989
1957
  F: __dxlog_file7,
1990
- L: 299,
1958
+ L: 243,
1991
1959
  S: this,
1992
1960
  C: (f, a) => f(...a)
1993
1961
  });
@@ -1999,7 +1967,7 @@ var InvitationsHandler = class {
1999
1967
  ...protocol.toJSON()
2000
1968
  }, {
2001
1969
  F: __dxlog_file7,
2002
- L: 307,
1970
+ L: 251,
2003
1971
  S: this,
2004
1972
  C: (f, a) => f(...a)
2005
1973
  });
@@ -2010,7 +1978,7 @@ var InvitationsHandler = class {
2010
1978
  ...protocol.toJSON()
2011
1979
  }, {
2012
1980
  F: __dxlog_file7,
2013
- L: 311,
1981
+ L: 255,
2014
1982
  S: this,
2015
1983
  C: (f, a) => f(...a)
2016
1984
  });
@@ -2020,62 +1988,28 @@ var InvitationsHandler = class {
2020
1988
  response: introductionResponse
2021
1989
  }, {
2022
1990
  F: __dxlog_file7,
2023
- L: 315,
1991
+ L: 259,
2024
1992
  S: this,
2025
1993
  C: (f, a) => f(...a)
2026
1994
  });
2027
1995
  invitation.authMethod = introductionResponse.authMethod;
2028
1996
  if (isAuthenticationRequired(invitation)) {
2029
- for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {
2030
- log5("guest waiting for authentication code...", void 0, {
2031
- F: __dxlog_file7,
2032
- L: 321,
2033
- S: this,
2034
- C: (f, a) => f(...a)
2035
- });
2036
- setState({
2037
- state: Invitation3.State.READY_FOR_AUTHENTICATION
2038
- });
2039
- const authCode = await authenticated.wait({
2040
- timeout
2041
- });
2042
- log5("sending authentication request", void 0, {
2043
- F: __dxlog_file7,
2044
- L: 325,
2045
- S: this,
2046
- C: (f, a) => f(...a)
2047
- });
2048
- setState({
2049
- state: Invitation3.State.AUTHENTICATING
2050
- });
2051
- const response = await extension.rpc.InvitationHostService.authenticate({
2052
- authCode
2053
- });
2054
- if (response.status === void 0 || response.status === AuthenticationResponse2.Status.OK) {
1997
+ switch (invitation.authMethod) {
1998
+ case Invitation3.AuthMethod.SHARED_SECRET:
1999
+ await this._handleGuestOtpAuth(extension, setState, authenticated, {
2000
+ timeout
2001
+ });
2002
+ break;
2003
+ case Invitation3.AuthMethod.KNOWN_PUBLIC_KEY:
2004
+ await this._handleGuestKpkAuth(extension, setState, invitation, introductionResponse);
2055
2005
  break;
2056
- }
2057
- if (response.status === AuthenticationResponse2.Status.INVALID_OTP) {
2058
- if (attempt === MAX_OTP_ATTEMPTS) {
2059
- throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);
2060
- } else {
2061
- log5("retrying invalid code", {
2062
- attempt
2063
- }, {
2064
- F: __dxlog_file7,
2065
- L: 336,
2066
- S: this,
2067
- C: (f, a) => f(...a)
2068
- });
2069
- authenticated.reset();
2070
- }
2071
- }
2072
2006
  }
2073
2007
  }
2074
2008
  log5("request admission", {
2075
2009
  ...protocol.toJSON()
2076
2010
  }, {
2077
2011
  F: __dxlog_file7,
2078
- L: 344,
2012
+ L: 275,
2079
2013
  S: this,
2080
2014
  C: (f, a) => f(...a)
2081
2015
  });
@@ -2087,7 +2021,7 @@ var InvitationsHandler = class {
2087
2021
  ...protocol.toJSON()
2088
2022
  }, {
2089
2023
  F: __dxlog_file7,
2090
- L: 355,
2024
+ L: 286,
2091
2025
  S: this,
2092
2026
  C: (f, a) => f(...a)
2093
2027
  });
@@ -2100,7 +2034,7 @@ var InvitationsHandler = class {
2100
2034
  id: traceId
2101
2035
  }), {
2102
2036
  F: __dxlog_file7,
2103
- L: 357,
2037
+ L: 288,
2104
2038
  S: this,
2105
2039
  C: (f, a) => f(...a)
2106
2040
  });
@@ -2110,7 +2044,7 @@ var InvitationsHandler = class {
2110
2044
  ...protocol.toJSON()
2111
2045
  }, {
2112
2046
  F: __dxlog_file7,
2113
- L: 360,
2047
+ L: 291,
2114
2048
  S: this,
2115
2049
  C: (f, a) => f(...a)
2116
2050
  });
@@ -2120,7 +2054,7 @@ var InvitationsHandler = class {
2120
2054
  } else {
2121
2055
  log5("auth failed", err, {
2122
2056
  F: __dxlog_file7,
2123
- L: 363,
2057
+ L: 294,
2124
2058
  S: this,
2125
2059
  C: (f, a) => f(...a)
2126
2060
  });
@@ -2131,7 +2065,7 @@ var InvitationsHandler = class {
2131
2065
  error: err
2132
2066
  }), {
2133
2067
  F: __dxlog_file7,
2134
- L: 366,
2068
+ L: 297,
2135
2069
  S: this,
2136
2070
  C: (f, a) => f(...a)
2137
2071
  });
@@ -2149,7 +2083,7 @@ var InvitationsHandler = class {
2149
2083
  ...protocol.toJSON()
2150
2084
  }, {
2151
2085
  F: __dxlog_file7,
2152
- L: 377,
2086
+ L: 308,
2153
2087
  S: this,
2154
2088
  C: (f, a) => f(...a)
2155
2089
  });
@@ -2159,7 +2093,7 @@ var InvitationsHandler = class {
2159
2093
  } else {
2160
2094
  log5("auth failed", err, {
2161
2095
  F: __dxlog_file7,
2162
- L: 380,
2096
+ L: 311,
2163
2097
  S: this,
2164
2098
  C: (f, a) => f(...a)
2165
2099
  });
@@ -2176,7 +2110,7 @@ var InvitationsHandler = class {
2176
2110
  } else {
2177
2111
  invariant6(invitation.swarmKey, void 0, {
2178
2112
  F: __dxlog_file7,
2179
- L: 394,
2113
+ L: 325,
2180
2114
  S: this,
2181
2115
  A: [
2182
2116
  "invitation.swarmKey",
@@ -2214,206 +2148,114 @@ var InvitationsHandler = class {
2214
2148
  });
2215
2149
  return observable;
2216
2150
  }
2151
+ async _handleGuestOtpAuth(extension, setState, authenticated, options) {
2152
+ for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {
2153
+ log5("guest waiting for authentication code...", void 0, {
2154
+ F: __dxlog_file7,
2155
+ L: 365,
2156
+ S: this,
2157
+ C: (f, a) => f(...a)
2158
+ });
2159
+ setState({
2160
+ state: Invitation3.State.READY_FOR_AUTHENTICATION
2161
+ });
2162
+ const authCode = await authenticated.wait(options);
2163
+ log5("sending authentication request", void 0, {
2164
+ F: __dxlog_file7,
2165
+ L: 369,
2166
+ S: this,
2167
+ C: (f, a) => f(...a)
2168
+ });
2169
+ setState({
2170
+ state: Invitation3.State.AUTHENTICATING
2171
+ });
2172
+ const response = await extension.rpc.InvitationHostService.authenticate({
2173
+ authCode
2174
+ });
2175
+ if (response.status === void 0 || response.status === AuthenticationResponse2.Status.OK) {
2176
+ break;
2177
+ }
2178
+ if (response.status === AuthenticationResponse2.Status.INVALID_OTP) {
2179
+ if (attempt === MAX_OTP_ATTEMPTS) {
2180
+ throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);
2181
+ } else {
2182
+ log5("retrying invalid code", {
2183
+ attempt
2184
+ }, {
2185
+ F: __dxlog_file7,
2186
+ L: 380,
2187
+ S: this,
2188
+ C: (f, a) => f(...a)
2189
+ });
2190
+ authenticated.reset();
2191
+ }
2192
+ }
2193
+ }
2194
+ }
2195
+ async _handleGuestKpkAuth(extension, setState, invitation, introductionResponse) {
2196
+ if (invitation.guestKeypair?.privateKey == null) {
2197
+ throw new Error("keypair missing in the invitation");
2198
+ }
2199
+ if (introductionResponse.challenge == null) {
2200
+ throw new Error("challenge missing in the introduction");
2201
+ }
2202
+ log5("sending authentication request", void 0, {
2203
+ F: __dxlog_file7,
2204
+ L: 399,
2205
+ S: this,
2206
+ C: (f, a) => f(...a)
2207
+ });
2208
+ setState({
2209
+ state: Invitation3.State.AUTHENTICATING
2210
+ });
2211
+ const signature = sign(Buffer.from(introductionResponse.challenge), invitation.guestKeypair.privateKey);
2212
+ const response = await extension.rpc.InvitationHostService.authenticate({
2213
+ signedChallenge: signature
2214
+ });
2215
+ if (response.status !== AuthenticationResponse2.Status.OK) {
2216
+ throw new Error(`Authentication failed with code: ${response.status}`);
2217
+ }
2218
+ }
2217
2219
  };
2218
- var invitationExpired = (invitation) => {
2219
- return invitation.created && invitation.lifetime && invitation.lifetime !== 0 && invitation.created.getTime() + invitation.lifetime * 1e3 < Date.now();
2220
+ var createAdmissionKeypair = () => {
2221
+ const keypair = createKeyPair();
2222
+ return {
2223
+ publicKey: PublicKey6.from(keypair.publicKey),
2224
+ privateKey: keypair.secretKey
2225
+ };
2220
2226
  };
2221
2227
 
2222
2228
  // packages/sdk/client-services/src/packlets/invitations/invitations-service.ts
2223
- import { Event as Event3, scheduleTask as scheduleTask3 } from "@dxos/async";
2224
2229
  import { Stream as Stream8 } from "@dxos/codec-protobuf";
2225
- import { Context as Context6 } from "@dxos/context";
2226
- import { invariant as invariant7 } from "@dxos/invariant";
2227
- import { log as log6 } from "@dxos/log";
2228
- import { Invitation as Invitation4, QueryInvitationsResponse } from "@dxos/protocols/proto/dxos/client/services";
2229
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-service.ts";
2230
+ import { QueryInvitationsResponse } from "@dxos/protocols/proto/dxos/client/services";
2230
2231
  var InvitationsServiceImpl = class {
2231
- constructor(_invitationsHandler, _getHandler, _metadataStore) {
2232
- this._invitationsHandler = _invitationsHandler;
2233
- this._getHandler = _getHandler;
2234
- this._metadataStore = _metadataStore;
2235
- this._createInvitations = /* @__PURE__ */ new Map();
2236
- this._acceptInvitations = /* @__PURE__ */ new Map();
2237
- this._invitationCreated = new Event3();
2238
- this._invitationAccepted = new Event3();
2239
- this._removedCreated = new Event3();
2240
- this._removedAccepted = new Event3();
2241
- this._saved = new Event3();
2242
- this._persistentInvitationsLoadedEvent = new Event3();
2243
- this._persistentInvitationsLoaded = false;
2232
+ constructor(_invitationsManager) {
2233
+ this._invitationsManager = _invitationsManager;
2244
2234
  }
2245
2235
  // TODO(burdon): Guest/host label.
2246
2236
  getLoggingContext() {
2247
2237
  return {};
2248
2238
  }
2249
2239
  createInvitation(options) {
2250
- let invitation;
2251
- const savePersistentInvitationCtx = new Context6();
2252
- const existingInvitation = this._createInvitations.get(options.invitationId);
2253
- if (existingInvitation) {
2254
- invitation = existingInvitation;
2255
- } else {
2256
- const handler = this._getHandler(options);
2257
- invitation = this._invitationsHandler.createInvitation(handler, options);
2258
- this._createInvitations.set(invitation.get().invitationId, invitation);
2259
- this._invitationCreated.emit(invitation.get());
2260
- }
2261
2240
  return new Stream8(({ next, close }) => {
2262
- if (invitation.get().persistent) {
2263
- scheduleTask3(savePersistentInvitationCtx, async () => {
2264
- try {
2265
- await this._metadataStore.addInvitation(invitation.get());
2266
- this._saved.emit(invitation.get());
2267
- } catch (err) {
2268
- close(err);
2269
- }
2270
- });
2271
- }
2272
- invitation.subscribe((invitation2) => {
2273
- next(invitation2);
2274
- }, async (err) => {
2275
- await savePersistentInvitationCtx.dispose();
2276
- close(err);
2277
- }, async () => {
2278
- close();
2279
- if (invitation.get().persistent) {
2280
- await savePersistentInvitationCtx.dispose();
2281
- await this._metadataStore.removeInvitation(invitation.get().invitationId);
2282
- }
2283
- this._createInvitations.delete(invitation.get().invitationId);
2284
- if (invitation.get().type !== Invitation4.Type.MULTIUSE) {
2285
- this._removedCreated.emit(invitation.get());
2286
- }
2287
- });
2241
+ void this._invitationsManager.createInvitation(options).then((invitation) => invitation.subscribe(next, close, close)).catch(close);
2288
2242
  });
2289
2243
  }
2290
- async loadPersistentInvitations() {
2291
- const persistentInvitations = this._metadataStore.getInvitations();
2292
- const freshInvitations = persistentInvitations.filter(async (invitation) => !invitationExpired(invitation));
2293
- const cInvitations = freshInvitations.map((persistentInvitation) => {
2294
- invariant7(!this._createInvitations.get(persistentInvitation.invitationId), "invitation already exists", {
2295
- F: __dxlog_file8,
2296
- L: 109,
2297
- S: this,
2298
- A: [
2299
- "!this._createInvitations.get(persistentInvitation.invitationId)",
2300
- "'invitation already exists'"
2301
- ]
2302
- });
2303
- const handler = this._getHandler(persistentInvitation);
2304
- const invitation = this._invitationsHandler.createInvitation(handler, persistentInvitation);
2305
- this._createInvitations.set(invitation.get().invitationId, invitation);
2306
- this._invitationCreated.emit(invitation.get());
2307
- return persistentInvitation;
2308
- });
2309
- this._persistentInvitationsLoadedEvent.emit();
2310
- this._persistentInvitationsLoaded = true;
2311
- return {
2312
- invitations: cInvitations
2313
- };
2314
- }
2315
- acceptInvitation({ invitation: options, deviceProfile }) {
2316
- let invitation;
2317
- if (deviceProfile) {
2318
- invariant7(options.kind === Invitation4.Kind.DEVICE, "deviceProfile provided for non-device invitation", {
2319
- F: __dxlog_file8,
2320
- L: 127,
2321
- S: this,
2322
- A: [
2323
- "options.kind === Invitation.Kind.DEVICE",
2324
- "'deviceProfile provided for non-device invitation'"
2325
- ]
2326
- });
2327
- }
2328
- const existingInvitation = this._acceptInvitations.get(options.invitationId);
2329
- if (existingInvitation) {
2330
- invitation = existingInvitation;
2331
- } else {
2332
- const handler = this._getHandler(options);
2333
- invitation = this._invitationsHandler.acceptInvitation(handler, options, deviceProfile);
2334
- this._acceptInvitations.set(invitation.get().invitationId, invitation);
2335
- this._invitationAccepted.emit(invitation.get());
2336
- }
2244
+ acceptInvitation(request) {
2245
+ const invitation = this._invitationsManager.acceptInvitation(request);
2337
2246
  return new Stream8(({ next, close }) => {
2338
- invitation.subscribe((invitation2) => {
2339
- next(invitation2);
2340
- }, (err) => {
2341
- close(err);
2342
- }, () => {
2343
- close();
2344
- this._acceptInvitations.delete(invitation.get().invitationId);
2345
- if (invitation.get().type !== Invitation4.Type.MULTIUSE) {
2346
- this._removedAccepted.emit(invitation.get());
2347
- }
2348
- });
2247
+ invitation.subscribe(next, close, close);
2349
2248
  });
2350
2249
  }
2351
- async authenticate({ invitationId, authCode }) {
2352
- log6("authenticating...", void 0, {
2353
- F: __dxlog_file8,
2354
- L: 160,
2355
- S: this,
2356
- C: (f, a) => f(...a)
2357
- });
2358
- invariant7(invitationId, void 0, {
2359
- F: __dxlog_file8,
2360
- L: 161,
2361
- S: this,
2362
- A: [
2363
- "invitationId",
2364
- ""
2365
- ]
2366
- });
2367
- const observable = this._acceptInvitations.get(invitationId);
2368
- if (!observable) {
2369
- log6.warn("invalid invitation", {
2370
- invitationId
2371
- }, {
2372
- F: __dxlog_file8,
2373
- L: 164,
2374
- S: this,
2375
- C: (f, a) => f(...a)
2376
- });
2377
- } else {
2378
- await observable.authenticate(authCode);
2379
- }
2250
+ async authenticate(request) {
2251
+ return this._invitationsManager.authenticate(request);
2380
2252
  }
2381
- async cancelInvitation({ invitationId }) {
2382
- log6("cancelInvitation...", {
2383
- invitationId
2384
- }, {
2385
- F: __dxlog_file8,
2386
- L: 171,
2387
- S: this,
2388
- C: (f, a) => f(...a)
2389
- });
2390
- invariant7(invitationId, void 0, {
2391
- F: __dxlog_file8,
2392
- L: 172,
2393
- S: this,
2394
- A: [
2395
- "invitationId",
2396
- ""
2397
- ]
2398
- });
2399
- const created = this._createInvitations.get(invitationId);
2400
- const accepted = this._acceptInvitations.get(invitationId);
2401
- if (created) {
2402
- await created.cancel();
2403
- this._createInvitations.delete(invitationId);
2404
- this._removedCreated.emit(created.get());
2405
- if (created.get().persistent) {
2406
- await this._metadataStore.removeInvitation(created.get().invitationId);
2407
- }
2408
- } else if (accepted) {
2409
- await accepted.cancel();
2410
- this._acceptInvitations.delete(invitationId);
2411
- this._removedAccepted.emit(accepted.get());
2412
- }
2253
+ async cancelInvitation(request) {
2254
+ return this._invitationsManager.cancelInvitation(request);
2413
2255
  }
2414
2256
  queryInvitations() {
2415
2257
  return new Stream8(({ next, ctx }) => {
2416
- this._invitationCreated.on(ctx, (invitation) => {
2258
+ this._invitationsManager.invitationCreated.on(ctx, (invitation) => {
2417
2259
  next({
2418
2260
  action: QueryInvitationsResponse.Action.ADDED,
2419
2261
  type: QueryInvitationsResponse.Type.CREATED,
@@ -2422,7 +2264,7 @@ var InvitationsServiceImpl = class {
2422
2264
  ]
2423
2265
  });
2424
2266
  });
2425
- this._invitationAccepted.on(ctx, (invitation) => {
2267
+ this._invitationsManager.invitationAccepted.on(ctx, (invitation) => {
2426
2268
  next({
2427
2269
  action: QueryInvitationsResponse.Action.ADDED,
2428
2270
  type: QueryInvitationsResponse.Type.ACCEPTED,
@@ -2431,7 +2273,7 @@ var InvitationsServiceImpl = class {
2431
2273
  ]
2432
2274
  });
2433
2275
  });
2434
- this._removedCreated.on(ctx, (invitation) => {
2276
+ this._invitationsManager.removedCreated.on(ctx, (invitation) => {
2435
2277
  next({
2436
2278
  action: QueryInvitationsResponse.Action.REMOVED,
2437
2279
  type: QueryInvitationsResponse.Type.CREATED,
@@ -2440,7 +2282,7 @@ var InvitationsServiceImpl = class {
2440
2282
  ]
2441
2283
  });
2442
2284
  });
2443
- this._removedAccepted.on(ctx, (invitation) => {
2285
+ this._invitationsManager.removedAccepted.on(ctx, (invitation) => {
2444
2286
  next({
2445
2287
  action: QueryInvitationsResponse.Action.REMOVED,
2446
2288
  type: QueryInvitationsResponse.Type.ACCEPTED,
@@ -2449,7 +2291,7 @@ var InvitationsServiceImpl = class {
2449
2291
  ]
2450
2292
  });
2451
2293
  });
2452
- this._saved.on(ctx, (invitation) => {
2294
+ this._invitationsManager.saved.on(ctx, (invitation) => {
2453
2295
  next({
2454
2296
  action: QueryInvitationsResponse.Action.SAVED,
2455
2297
  type: QueryInvitationsResponse.Type.CREATED,
@@ -2461,40 +2303,34 @@ var InvitationsServiceImpl = class {
2461
2303
  next({
2462
2304
  action: QueryInvitationsResponse.Action.ADDED,
2463
2305
  type: QueryInvitationsResponse.Type.CREATED,
2464
- invitations: Array.from(this._createInvitations.values()).map((invitation) => invitation.get()),
2306
+ invitations: this._invitationsManager.getCreatedInvitations(),
2465
2307
  existing: true
2466
2308
  });
2467
2309
  next({
2468
2310
  action: QueryInvitationsResponse.Action.ADDED,
2469
2311
  type: QueryInvitationsResponse.Type.ACCEPTED,
2470
- invitations: Array.from(this._acceptInvitations.values()).map((invitation) => invitation.get()),
2312
+ invitations: this._invitationsManager.getAcceptedInvitations(),
2471
2313
  existing: true
2472
2314
  });
2473
- if (this._persistentInvitationsLoaded) {
2315
+ this._invitationsManager.onPersistentInvitationsLoaded(ctx, () => {
2474
2316
  next({
2475
2317
  action: QueryInvitationsResponse.Action.LOAD_COMPLETE,
2476
2318
  type: QueryInvitationsResponse.Type.CREATED
2477
2319
  });
2478
- } else {
2479
- this._persistentInvitationsLoadedEvent.on(ctx, () => {
2480
- next({
2481
- action: QueryInvitationsResponse.Action.LOAD_COMPLETE,
2482
- type: QueryInvitationsResponse.Type.CREATED
2483
- });
2484
- });
2485
- }
2320
+ });
2486
2321
  });
2487
2322
  }
2488
2323
  };
2489
2324
 
2490
2325
  // packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts
2491
- import { createAdmissionCredentials, getCredentialAssertion } from "@dxos/credentials";
2326
+ import { createAdmissionCredentials, createDelegatedSpaceInvitationCredential, getCredentialAssertion } from "@dxos/credentials";
2492
2327
  import { writeMessages as writeMessages2 } from "@dxos/feed-store";
2493
- import { invariant as invariant8 } from "@dxos/invariant";
2494
- import { log as log7 } from "@dxos/log";
2328
+ import { invariant as invariant7 } from "@dxos/invariant";
2329
+ import { log as log6 } from "@dxos/log";
2495
2330
  import { AlreadyJoinedError as AlreadyJoinedError2 } from "@dxos/protocols";
2496
- import { Invitation as Invitation5 } from "@dxos/protocols/proto/dxos/client/services";
2497
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts";
2331
+ import { Invitation as Invitation4 } from "@dxos/protocols/proto/dxos/client/services";
2332
+ import { SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
2333
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts";
2498
2334
  var SpaceInvitationProtocol = class {
2499
2335
  constructor(_spaceManager, _signingContext, _keyring, _spaceKey) {
2500
2336
  this._spaceManager = _spaceManager;
@@ -2510,14 +2346,14 @@ var SpaceInvitationProtocol = class {
2510
2346
  }
2511
2347
  getInvitationContext() {
2512
2348
  return {
2513
- kind: Invitation5.Kind.SPACE,
2349
+ kind: Invitation4.Kind.SPACE,
2514
2350
  spaceKey: this._spaceKey
2515
2351
  };
2516
2352
  }
2517
- async admit(request, guestProfile) {
2518
- invariant8(this._spaceKey, void 0, {
2519
- F: __dxlog_file9,
2520
- L: 47,
2353
+ async admit(invitation, request, guestProfile) {
2354
+ invariant7(this._spaceKey, void 0, {
2355
+ F: __dxlog_file8,
2356
+ L: 55,
2521
2357
  S: this,
2522
2358
  A: [
2523
2359
  "this._spaceKey",
@@ -2525,18 +2361,18 @@ var SpaceInvitationProtocol = class {
2525
2361
  ]
2526
2362
  });
2527
2363
  const space = await this._spaceManager.spaces.get(this._spaceKey);
2528
- invariant8(space, void 0, {
2529
- F: __dxlog_file9,
2530
- L: 49,
2364
+ invariant7(space, void 0, {
2365
+ F: __dxlog_file8,
2366
+ L: 57,
2531
2367
  S: this,
2532
2368
  A: [
2533
2369
  "space",
2534
2370
  ""
2535
2371
  ]
2536
2372
  });
2537
- invariant8(request.space, void 0, {
2538
- F: __dxlog_file9,
2539
- L: 51,
2373
+ invariant7(request.space, void 0, {
2374
+ F: __dxlog_file8,
2375
+ L: 59,
2540
2376
  S: this,
2541
2377
  A: [
2542
2378
  "request.space",
@@ -2544,19 +2380,19 @@ var SpaceInvitationProtocol = class {
2544
2380
  ]
2545
2381
  });
2546
2382
  const { identityKey, deviceKey } = request.space;
2547
- log7("writing guest credentials", {
2383
+ log6("writing guest credentials", {
2548
2384
  host: this._signingContext.deviceKey,
2549
2385
  guest: deviceKey
2550
2386
  }, {
2551
- F: __dxlog_file9,
2552
- L: 54,
2387
+ F: __dxlog_file8,
2388
+ L: 62,
2553
2389
  S: this,
2554
2390
  C: (f, a) => f(...a)
2555
2391
  });
2556
- const credentials = await createAdmissionCredentials(this._signingContext.credentialSigner, identityKey, space.key, space.inner.genesisFeedKey, guestProfile);
2557
- invariant8(credentials[0].credential, void 0, {
2558
- F: __dxlog_file9,
2559
- L: 65,
2392
+ const credentials = await createAdmissionCredentials(this._signingContext.credentialSigner, identityKey, space.key, space.inner.genesisFeedKey, guestProfile, invitation.delegationCredentialId);
2393
+ invariant7(credentials[0].credential, void 0, {
2394
+ F: __dxlog_file8,
2395
+ L: 74,
2560
2396
  S: this,
2561
2397
  A: [
2562
2398
  "credentials[0].credential",
@@ -2564,9 +2400,9 @@ var SpaceInvitationProtocol = class {
2564
2400
  ]
2565
2401
  });
2566
2402
  const spaceMemberCredential = credentials[0].credential.credential;
2567
- invariant8(getCredentialAssertion(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
2568
- F: __dxlog_file9,
2569
- L: 67,
2403
+ invariant7(getCredentialAssertion(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
2404
+ F: __dxlog_file8,
2405
+ L: 76,
2570
2406
  S: this,
2571
2407
  A: [
2572
2408
  "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -2581,6 +2417,69 @@ var SpaceInvitationProtocol = class {
2581
2417
  }
2582
2418
  };
2583
2419
  }
2420
+ async delegate(invitation) {
2421
+ invariant7(this._spaceKey, void 0, {
2422
+ F: __dxlog_file8,
2423
+ L: 89,
2424
+ S: this,
2425
+ A: [
2426
+ "this._spaceKey",
2427
+ ""
2428
+ ]
2429
+ });
2430
+ const space = await this._spaceManager.spaces.get(this._spaceKey);
2431
+ invariant7(space, void 0, {
2432
+ F: __dxlog_file8,
2433
+ L: 91,
2434
+ S: this,
2435
+ A: [
2436
+ "space",
2437
+ ""
2438
+ ]
2439
+ });
2440
+ if (invitation.authMethod === Invitation4.AuthMethod.KNOWN_PUBLIC_KEY) {
2441
+ invariant7(invitation.guestKeypair?.publicKey, void 0, {
2442
+ F: __dxlog_file8,
2443
+ L: 93,
2444
+ S: this,
2445
+ A: [
2446
+ "invitation.guestKeypair?.publicKey",
2447
+ ""
2448
+ ]
2449
+ });
2450
+ }
2451
+ log6("writing delegate space invitation", {
2452
+ host: this._signingContext.deviceKey,
2453
+ id: invitation.invitationId
2454
+ }, {
2455
+ F: __dxlog_file8,
2456
+ L: 96,
2457
+ S: this,
2458
+ C: (f, a) => f(...a)
2459
+ });
2460
+ const credential = await createDelegatedSpaceInvitationCredential(this._signingContext.credentialSigner, space.key, {
2461
+ invitationId: invitation.invitationId,
2462
+ authMethod: invitation.authMethod,
2463
+ swarmKey: invitation.swarmKey,
2464
+ role: SpaceMember.Role.ADMIN,
2465
+ expiresOn: invitation.lifetime ? new Date((invitation.created?.getTime() ?? Date.now()) + invitation.lifetime) : void 0,
2466
+ multiUse: invitation.multiUse ?? false,
2467
+ guestKey: invitation.authMethod === Invitation4.AuthMethod.KNOWN_PUBLIC_KEY ? invitation.guestKeypair.publicKey : void 0
2468
+ });
2469
+ invariant7(credential.credential, void 0, {
2470
+ F: __dxlog_file8,
2471
+ L: 116,
2472
+ S: this,
2473
+ A: [
2474
+ "credential.credential",
2475
+ ""
2476
+ ]
2477
+ });
2478
+ await writeMessages2(space.inner.controlPipeline.writer, [
2479
+ credential
2480
+ ]);
2481
+ return credential.credential.credential.id;
2482
+ }
2584
2483
  checkInvitation(invitation) {
2585
2484
  if (invitation.spaceKey && this._spaceManager.spaces.has(invitation.spaceKey)) {
2586
2485
  return new AlreadyJoinedError2("Already joined space.");
@@ -2604,9 +2503,9 @@ var SpaceInvitationProtocol = class {
2604
2503
  };
2605
2504
  }
2606
2505
  async accept(response) {
2607
- invariant8(response.space, void 0, {
2608
- F: __dxlog_file9,
2609
- L: 107,
2506
+ invariant7(response.space, void 0, {
2507
+ F: __dxlog_file8,
2508
+ L: 149,
2610
2509
  S: this,
2611
2510
  A: [
2612
2511
  "response.space",
@@ -2615,18 +2514,18 @@ var SpaceInvitationProtocol = class {
2615
2514
  });
2616
2515
  const { credential, controlTimeframe, dataTimeframe } = response.space;
2617
2516
  const assertion = getCredentialAssertion(credential);
2618
- invariant8(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
2619
- F: __dxlog_file9,
2620
- L: 110,
2517
+ invariant7(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
2518
+ F: __dxlog_file8,
2519
+ L: 152,
2621
2520
  S: this,
2622
2521
  A: [
2623
2522
  "assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
2624
2523
  "'Invalid credential'"
2625
2524
  ]
2626
2525
  });
2627
- invariant8(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
2628
- F: __dxlog_file9,
2629
- L: 111,
2526
+ invariant7(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
2527
+ F: __dxlog_file8,
2528
+ L: 153,
2630
2529
  S: this,
2631
2530
  A: [
2632
2531
  "credential.subject.id.equals(this._signingContext.identityKey)",
@@ -2649,6 +2548,295 @@ var SpaceInvitationProtocol = class {
2649
2548
  }
2650
2549
  };
2651
2550
 
2551
+ // packages/sdk/client-services/src/packlets/invitations/invitations-manager.ts
2552
+ import { Event as Event3, PushStream as PushStream2 } from "@dxos/async";
2553
+ import { AUTHENTICATION_CODE_LENGTH, CancellableInvitation, INVITATION_TIMEOUT as INVITATION_TIMEOUT2 } from "@dxos/client-protocol";
2554
+ import { Context as Context6 } from "@dxos/context";
2555
+ import { generatePasscode } from "@dxos/credentials";
2556
+ import { hasInvitationExpired } from "@dxos/echo-pipeline";
2557
+ import { invariant as invariant8 } from "@dxos/invariant";
2558
+ import { PublicKey as PublicKey7 } from "@dxos/keys";
2559
+ import { log as log7 } from "@dxos/log";
2560
+ import { Invitation as Invitation5 } from "@dxos/protocols/proto/dxos/client/services";
2561
+ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-manager.ts";
2562
+ var InvitationsManager = class {
2563
+ constructor(_invitationsHandler, _getHandler, _metadataStore) {
2564
+ this._invitationsHandler = _invitationsHandler;
2565
+ this._getHandler = _getHandler;
2566
+ this._metadataStore = _metadataStore;
2567
+ this._createInvitations = /* @__PURE__ */ new Map();
2568
+ this._acceptInvitations = /* @__PURE__ */ new Map();
2569
+ this.invitationCreated = new Event3();
2570
+ this.invitationAccepted = new Event3();
2571
+ this.removedCreated = new Event3();
2572
+ this.removedAccepted = new Event3();
2573
+ this.saved = new Event3();
2574
+ this._persistentInvitationsLoadedEvent = new Event3();
2575
+ this._persistentInvitationsLoaded = false;
2576
+ }
2577
+ async createInvitation(options) {
2578
+ if (options.invitationId) {
2579
+ const existingInvitation = this._createInvitations.get(options.invitationId);
2580
+ if (existingInvitation) {
2581
+ return existingInvitation;
2582
+ }
2583
+ }
2584
+ const handler = this._getHandler(options);
2585
+ const invitation = this._createInvitation(handler, options);
2586
+ const { ctx, stream, observableInvitation } = this._createObservableInvitation(handler, invitation);
2587
+ this._createInvitations.set(invitation.invitationId, observableInvitation);
2588
+ this.invitationCreated.emit(invitation);
2589
+ this._onInvitationComplete(observableInvitation, async () => {
2590
+ this._createInvitations.delete(observableInvitation.get().invitationId);
2591
+ this.removedCreated.emit(observableInvitation.get());
2592
+ if (observableInvitation.get().persistent) {
2593
+ await this._safeDeleteInvitation(observableInvitation.get());
2594
+ }
2595
+ });
2596
+ try {
2597
+ await this._persistIfRequired(handler, stream, invitation);
2598
+ } catch (err) {
2599
+ log7.catch(err, void 0, {
2600
+ F: __dxlog_file9,
2601
+ L: 76,
2602
+ S: this,
2603
+ C: (f, a) => f(...a)
2604
+ });
2605
+ await observableInvitation.cancel();
2606
+ return observableInvitation;
2607
+ }
2608
+ this._invitationsHandler.handleInvitationFlow(ctx, stream, handler, observableInvitation.get());
2609
+ return observableInvitation;
2610
+ }
2611
+ async loadPersistentInvitations() {
2612
+ if (this._persistentInvitationsLoaded) {
2613
+ const invitations = this.getCreatedInvitations().filter((i) => i.persistent);
2614
+ return {
2615
+ invitations
2616
+ };
2617
+ }
2618
+ try {
2619
+ const persistentInvitations = this._metadataStore.getInvitations();
2620
+ const freshInvitations = persistentInvitations.filter((invitation) => !hasInvitationExpired(invitation));
2621
+ const loadTasks = freshInvitations.map((persistentInvitation) => {
2622
+ invariant8(!this._createInvitations.get(persistentInvitation.invitationId), "invitation already exists", {
2623
+ F: __dxlog_file9,
2624
+ L: 97,
2625
+ S: this,
2626
+ A: [
2627
+ "!this._createInvitations.get(persistentInvitation.invitationId)",
2628
+ "'invitation already exists'"
2629
+ ]
2630
+ });
2631
+ return this.createInvitation({
2632
+ ...persistentInvitation,
2633
+ persistent: false
2634
+ });
2635
+ });
2636
+ const cInvitations = await Promise.all(loadTasks);
2637
+ return {
2638
+ invitations: cInvitations.map((invitation) => invitation.get())
2639
+ };
2640
+ } catch (err) {
2641
+ log7.catch(err, void 0, {
2642
+ F: __dxlog_file9,
2643
+ L: 104,
2644
+ S: this,
2645
+ C: (f, a) => f(...a)
2646
+ });
2647
+ return {
2648
+ invitations: []
2649
+ };
2650
+ } finally {
2651
+ this._persistentInvitationsLoadedEvent.emit();
2652
+ this._persistentInvitationsLoaded = true;
2653
+ }
2654
+ }
2655
+ acceptInvitation(request) {
2656
+ const options = request.invitation;
2657
+ const existingInvitation = this._acceptInvitations.get(options.invitationId);
2658
+ if (existingInvitation) {
2659
+ return existingInvitation;
2660
+ }
2661
+ const handler = this._getHandler(options);
2662
+ const invitation = this._invitationsHandler.acceptInvitation(handler, options, request.deviceProfile);
2663
+ this._acceptInvitations.set(invitation.get().invitationId, invitation);
2664
+ this.invitationAccepted.emit(invitation.get());
2665
+ this._onInvitationComplete(invitation, () => {
2666
+ this._acceptInvitations.delete(invitation.get().invitationId);
2667
+ this.removedAccepted.emit(invitation.get());
2668
+ });
2669
+ return invitation;
2670
+ }
2671
+ async authenticate({ invitationId, authCode }) {
2672
+ log7("authenticating...", void 0, {
2673
+ F: __dxlog_file9,
2674
+ L: 133,
2675
+ S: this,
2676
+ C: (f, a) => f(...a)
2677
+ });
2678
+ invariant8(invitationId, void 0, {
2679
+ F: __dxlog_file9,
2680
+ L: 134,
2681
+ S: this,
2682
+ A: [
2683
+ "invitationId",
2684
+ ""
2685
+ ]
2686
+ });
2687
+ const observable = this._acceptInvitations.get(invitationId);
2688
+ if (!observable) {
2689
+ log7.warn("invalid invitation", {
2690
+ invitationId
2691
+ }, {
2692
+ F: __dxlog_file9,
2693
+ L: 137,
2694
+ S: this,
2695
+ C: (f, a) => f(...a)
2696
+ });
2697
+ } else {
2698
+ await observable.authenticate(authCode);
2699
+ }
2700
+ }
2701
+ async cancelInvitation({ invitationId }) {
2702
+ log7("cancelInvitation...", {
2703
+ invitationId
2704
+ }, {
2705
+ F: __dxlog_file9,
2706
+ L: 144,
2707
+ S: this,
2708
+ C: (f, a) => f(...a)
2709
+ });
2710
+ invariant8(invitationId, void 0, {
2711
+ F: __dxlog_file9,
2712
+ L: 145,
2713
+ S: this,
2714
+ A: [
2715
+ "invitationId",
2716
+ ""
2717
+ ]
2718
+ });
2719
+ const created = this._createInvitations.get(invitationId);
2720
+ if (created) {
2721
+ if (created.get().persistent) {
2722
+ await this._metadataStore.removeInvitation(invitationId);
2723
+ }
2724
+ await created.cancel();
2725
+ this._createInvitations.delete(invitationId);
2726
+ this.removedCreated.emit(created.get());
2727
+ return;
2728
+ }
2729
+ const accepted = this._acceptInvitations.get(invitationId);
2730
+ if (accepted) {
2731
+ await accepted.cancel();
2732
+ this._acceptInvitations.delete(invitationId);
2733
+ this.removedAccepted.emit(accepted.get());
2734
+ }
2735
+ }
2736
+ getCreatedInvitations() {
2737
+ return [
2738
+ ...this._createInvitations.values()
2739
+ ].map((i) => i.get());
2740
+ }
2741
+ getAcceptedInvitations() {
2742
+ return [
2743
+ ...this._acceptInvitations.values()
2744
+ ].map((i) => i.get());
2745
+ }
2746
+ onPersistentInvitationsLoaded(ctx, callback) {
2747
+ if (this._persistentInvitationsLoaded) {
2748
+ callback();
2749
+ } else {
2750
+ this._persistentInvitationsLoadedEvent.once(ctx, () => callback());
2751
+ }
2752
+ }
2753
+ _createInvitation(protocol, options) {
2754
+ const { invitationId = PublicKey7.random().toHex(), type = Invitation5.Type.INTERACTIVE, authMethod = Invitation5.AuthMethod.SHARED_SECRET, state = Invitation5.State.INIT, timeout = INVITATION_TIMEOUT2, swarmKey = PublicKey7.random(), persistent = options?.authMethod !== Invitation5.AuthMethod.KNOWN_PUBLIC_KEY, created = /* @__PURE__ */ new Date(), guestKeypair = void 0, lifetime = 86400, multiUse = false } = options ?? {};
2755
+ const authCode = options?.authCode ?? (authMethod === Invitation5.AuthMethod.SHARED_SECRET ? generatePasscode(AUTHENTICATION_CODE_LENGTH) : void 0);
2756
+ return {
2757
+ invitationId,
2758
+ type,
2759
+ authMethod,
2760
+ state,
2761
+ swarmKey,
2762
+ authCode,
2763
+ timeout,
2764
+ persistent: persistent && type !== Invitation5.Type.DELEGATED,
2765
+ guestKeypair: guestKeypair ?? (authMethod === Invitation5.AuthMethod.KNOWN_PUBLIC_KEY ? createAdmissionKeypair() : void 0),
2766
+ created,
2767
+ lifetime,
2768
+ multiUse,
2769
+ delegationCredentialId: options?.delegationCredentialId,
2770
+ ...protocol.getInvitationContext()
2771
+ };
2772
+ }
2773
+ _createObservableInvitation(handler, invitation) {
2774
+ const stream = new PushStream2();
2775
+ const ctx = new Context6({
2776
+ onError: (err) => {
2777
+ stream.error(err);
2778
+ void ctx.dispose();
2779
+ }
2780
+ });
2781
+ ctx.onDispose(() => {
2782
+ log7("complete", {
2783
+ ...handler.toJSON()
2784
+ }, {
2785
+ F: __dxlog_file9,
2786
+ L: 228,
2787
+ S: this,
2788
+ C: (f, a) => f(...a)
2789
+ });
2790
+ stream.complete();
2791
+ });
2792
+ const observableInvitation = new CancellableInvitation({
2793
+ initialInvitation: invitation,
2794
+ subscriber: stream.observable,
2795
+ onCancel: async () => {
2796
+ stream.next({
2797
+ ...invitation,
2798
+ state: Invitation5.State.CANCELLED
2799
+ });
2800
+ await ctx.dispose();
2801
+ }
2802
+ });
2803
+ return {
2804
+ ctx,
2805
+ stream,
2806
+ observableInvitation
2807
+ };
2808
+ }
2809
+ async _persistIfRequired(handler, changeStream, invitation) {
2810
+ if (invitation.type === Invitation5.Type.DELEGATED && invitation.delegationCredentialId == null) {
2811
+ const delegationCredentialId = await handler.delegate(invitation);
2812
+ changeStream.next({
2813
+ ...invitation,
2814
+ delegationCredentialId
2815
+ });
2816
+ } else if (invitation.persistent) {
2817
+ await this._metadataStore.addInvitation(invitation);
2818
+ this.saved.emit(invitation);
2819
+ }
2820
+ }
2821
+ async _safeDeleteInvitation(invitation) {
2822
+ try {
2823
+ await this._metadataStore.removeInvitation(invitation.invitationId);
2824
+ } catch (err) {
2825
+ log7.catch(err, void 0, {
2826
+ F: __dxlog_file9,
2827
+ L: 260,
2828
+ S: this,
2829
+ C: (f, a) => f(...a)
2830
+ });
2831
+ }
2832
+ }
2833
+ _onInvitationComplete(invitation, callback) {
2834
+ invitation.subscribe(() => {
2835
+ }, () => {
2836
+ }, callback);
2837
+ }
2838
+ };
2839
+
2652
2840
  // packages/sdk/client-services/src/packlets/services/client-rpc-server.ts
2653
2841
  import { Stream as Stream9 } from "@dxos/codec-protobuf";
2654
2842
  import { raise } from "@dxos/debug";
@@ -2731,15 +2919,15 @@ ClientRpcServer = _ts_decorate3([
2731
2919
  ], ClientRpcServer);
2732
2920
 
2733
2921
  // packages/sdk/client-services/src/packlets/spaces/data-space.ts
2734
- import { Event as Event6, asyncTimeout, scheduleTask as scheduleTask5, sleep as sleep2, synchronized, trackLeaks } from "@dxos/async";
2922
+ import { Event as Event6, asyncTimeout, scheduleTask as scheduleTask4, sleep as sleep2, synchronized, trackLeaks } from "@dxos/async";
2735
2923
  import { AUTH_TIMEOUT as AUTH_TIMEOUT2 } from "@dxos/client-protocol";
2736
2924
  import { cancelWithContext as cancelWithContext2, Context as Context8, ContextDisposedError } from "@dxos/context";
2737
2925
  import { timed, warnAfterTimeout } from "@dxos/debug";
2738
- import { TYPE_PROPERTIES } from "@dxos/echo-db";
2739
2926
  import { createMappedFeedWriter } from "@dxos/echo-pipeline";
2740
2927
  import { AutomergeDocumentLoaderImpl } from "@dxos/echo-pipeline";
2928
+ import { TYPE_PROPERTIES } from "@dxos/echo-schema";
2741
2929
  import { failedInvariant, invariant as invariant10 } from "@dxos/invariant";
2742
- import { PublicKey as PublicKey8 } from "@dxos/keys";
2930
+ import { PublicKey as PublicKey9 } from "@dxos/keys";
2743
2931
  import { log as log9 } from "@dxos/log";
2744
2932
  import { CancelledError, SystemError } from "@dxos/protocols";
2745
2933
  import { SpaceState, CreateEpochRequest } from "@dxos/protocols/proto/dxos/client/services";
@@ -2787,10 +2975,10 @@ var AutomergeSpaceState = class {
2787
2975
  };
2788
2976
 
2789
2977
  // packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts
2790
- import { DeferredTask, Event as Event5, scheduleTask as scheduleTask4, sleep, TimeoutError as TimeoutError2, Trigger as Trigger4 } from "@dxos/async";
2978
+ import { DeferredTask, Event as Event5, scheduleTask as scheduleTask3, sleep, TimeoutError as TimeoutError2, Trigger as Trigger4 } from "@dxos/async";
2791
2979
  import { Context as Context7, rejectOnDispose } from "@dxos/context";
2792
2980
  import { invariant as invariant9 } from "@dxos/invariant";
2793
- import { PublicKey as PublicKey7 } from "@dxos/keys";
2981
+ import { PublicKey as PublicKey8 } from "@dxos/keys";
2794
2982
  import { log as log8 } from "@dxos/log";
2795
2983
  import { schema as schema3 } from "@dxos/protocols";
2796
2984
  import { RpcExtension as RpcExtension2 } from "@dxos/teleport";
@@ -2805,8 +2993,8 @@ var NotarizationPlugin = class {
2805
2993
  this._ctx = new Context7();
2806
2994
  this._extensionOpened = new Event5();
2807
2995
  this._extensions = /* @__PURE__ */ new Set();
2808
- this._processedCredentials = new ComplexSet2(PublicKey7.hash);
2809
- this._processCredentialsTriggers = new ComplexMap2(PublicKey7.hash);
2996
+ this._processedCredentials = new ComplexSet2(PublicKey8.hash);
2997
+ this._processCredentialsTriggers = new ComplexMap2(PublicKey8.hash);
2810
2998
  }
2811
2999
  get hasWriter() {
2812
3000
  return !!this._writer;
@@ -2854,7 +3042,7 @@ var NotarizationPlugin = class {
2854
3042
  });
2855
3043
  opCtx?.onDispose(() => ctx.dispose());
2856
3044
  if (timeout !== 0) {
2857
- scheduleTask4(ctx, () => {
3045
+ scheduleTask3(ctx, () => {
2858
3046
  log8.warn("Notarization timeout", {
2859
3047
  timeout,
2860
3048
  peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)
@@ -2888,7 +3076,7 @@ var NotarizationPlugin = class {
2888
3076
  C: (f, a) => f(...a)
2889
3077
  });
2890
3078
  peersTried.clear();
2891
- scheduleTask4(ctx, () => notarizeTask.schedule(), retryTimeout);
3079
+ scheduleTask3(ctx, () => notarizeTask.schedule(), retryTimeout);
2892
3080
  return;
2893
3081
  }
2894
3082
  peersTried.add(peer);
@@ -3091,7 +3279,7 @@ var DataSpace = class {
3091
3279
  this._callbacks = params.callbacks ?? {};
3092
3280
  this._automergeHost = params.automergeHost;
3093
3281
  this.authVerifier = new TrustedKeySetAuthVerifier({
3094
- trustedKeysProvider: () => new ComplexSet3(PublicKey8.hash, Array.from(this._inner.spaceState.members.values()).filter((member) => !member.removed).map((member) => member.key)),
3282
+ trustedKeysProvider: () => new ComplexSet3(PublicKey9.hash, Array.from(this._inner.spaceState.members.values()).filter((member) => !member.removed).map((member) => member.key)),
3095
3283
  update: this._inner.stateUpdate,
3096
3284
  authTimeout: AUTH_TIMEOUT2
3097
3285
  });
@@ -3193,7 +3381,7 @@ var DataSpace = class {
3193
3381
  * Initialize the data pipeline in a separate task.
3194
3382
  */
3195
3383
  initializeDataPipelineAsync() {
3196
- scheduleTask5(this._ctx, async () => {
3384
+ scheduleTask4(this._ctx, async () => {
3197
3385
  try {
3198
3386
  this.metrics.pipelineInitBegin = /* @__PURE__ */ new Date();
3199
3387
  await this.initializeDataPipeline();
@@ -3598,17 +3786,17 @@ import { Event as Event7, synchronized as synchronized2, trackLeaks as trackLeak
3598
3786
  import { Context as Context9, cancelWithContext as cancelWithContext3 } from "@dxos/context";
3599
3787
  import { getCredentialAssertion as getCredentialAssertion2 } from "@dxos/credentials";
3600
3788
  import { invariant as invariant11 } from "@dxos/invariant";
3601
- import { PublicKey as PublicKey9 } from "@dxos/keys";
3789
+ import { PublicKey as PublicKey10 } from "@dxos/keys";
3602
3790
  import { log as log10 } from "@dxos/log";
3603
3791
  import { trace as trace7 } from "@dxos/protocols";
3604
- import { SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
3792
+ import { Invitation as Invitation6, SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
3605
3793
  import { Gossip as Gossip2, Presence as Presence2 } from "@dxos/teleport-extension-gossip";
3606
3794
  import { ComplexMap as ComplexMap3, deferFunction as deferFunction2, forEachAsync } from "@dxos/util";
3607
3795
 
3608
3796
  // packages/sdk/client-services/src/packlets/spaces/genesis.ts
3609
3797
  import { createCredential } from "@dxos/credentials";
3610
3798
  import { failUndefined } from "@dxos/debug";
3611
- import { AdmittedFeed as AdmittedFeed4, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
3799
+ import { AdmittedFeed as AdmittedFeed4, SpaceMember as SpaceMember2 } from "@dxos/protocols/proto/dxos/halo/credentials";
3612
3800
  import { Timeframe as Timeframe3 } from "@dxos/timeframe";
3613
3801
  var spaceGenesis = async (keyring, signingContext, space, automergeRoot) => {
3614
3802
  const credentials = [
@@ -3628,7 +3816,7 @@ var spaceGenesis = async (keyring, signingContext, space, automergeRoot) => {
3628
3816
  assertion: {
3629
3817
  "@type": "dxos.halo.credentials.SpaceMember",
3630
3818
  spaceKey: space.key,
3631
- role: SpaceMember.Role.ADMIN,
3819
+ role: SpaceMember2.Role.ADMIN,
3632
3820
  profile: signingContext.getProfile(),
3633
3821
  genesisFeedKey: space.controlFeedKey ?? failUndefined()
3634
3822
  }
@@ -3690,18 +3878,19 @@ var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/s
3690
3878
  var PRESENCE_ANNOUNCE_INTERVAL = 1e4;
3691
3879
  var PRESENCE_OFFLINE_TIMEOUT = 2e4;
3692
3880
  var DataSpaceManager = class {
3693
- constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _automergeHost, params) {
3881
+ constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _automergeHost, _invitationsManager, params) {
3694
3882
  this._spaceManager = _spaceManager;
3695
3883
  this._metadataStore = _metadataStore;
3696
3884
  this._keyring = _keyring;
3697
3885
  this._signingContext = _signingContext;
3698
3886
  this._feedStore = _feedStore;
3699
3887
  this._automergeHost = _automergeHost;
3888
+ this._invitationsManager = _invitationsManager;
3700
3889
  this._ctx = new Context9();
3701
3890
  this.updated = new Event7();
3702
- this._spaces = new ComplexMap3(PublicKey9.hash);
3891
+ this._spaces = new ComplexMap3(PublicKey10.hash);
3703
3892
  this._isOpen = false;
3704
- this._instanceId = PublicKey9.random().toHex();
3893
+ this._instanceId = PublicKey10.random().toHex();
3705
3894
  const { spaceMemberPresenceAnnounceInterval = PRESENCE_ANNOUNCE_INTERVAL, spaceMemberPresenceOfflineTimeout = PRESENCE_OFFLINE_TIMEOUT } = params ?? {};
3706
3895
  this._spaceMemberPresenceAnnounceInterval = spaceMemberPresenceAnnounceInterval;
3707
3896
  this._spaceMemberPresenceOfflineTimeout = spaceMemberPresenceOfflineTimeout;
@@ -3713,7 +3902,7 @@ var DataSpaceManager = class {
3713
3902
  async open() {
3714
3903
  log10("open", void 0, {
3715
3904
  F: __dxlog_file12,
3716
- L: 98,
3905
+ L: 101,
3717
3906
  S: this,
3718
3907
  C: (f, a) => f(...a)
3719
3908
  });
@@ -3721,7 +3910,7 @@ var DataSpaceManager = class {
3721
3910
  id: this._instanceId
3722
3911
  }), {
3723
3912
  F: __dxlog_file12,
3724
- L: 99,
3913
+ L: 102,
3725
3914
  S: this,
3726
3915
  C: (f, a) => f(...a)
3727
3916
  });
@@ -3729,7 +3918,7 @@ var DataSpaceManager = class {
3729
3918
  spaces: this._metadataStore.spaces.length
3730
3919
  }, {
3731
3920
  F: __dxlog_file12,
3732
- L: 100,
3921
+ L: 103,
3733
3922
  S: this,
3734
3923
  C: (f, a) => f(...a)
3735
3924
  });
@@ -3739,7 +3928,7 @@ var DataSpaceManager = class {
3739
3928
  spaceMetadata
3740
3929
  }, {
3741
3930
  F: __dxlog_file12,
3742
- L: 104,
3931
+ L: 107,
3743
3932
  S: this,
3744
3933
  C: (f, a) => f(...a)
3745
3934
  });
@@ -3750,7 +3939,7 @@ var DataSpaceManager = class {
3750
3939
  err
3751
3940
  }, {
3752
3941
  F: __dxlog_file12,
3753
- L: 107,
3942
+ L: 110,
3754
3943
  S: this,
3755
3944
  C: (f, a) => f(...a)
3756
3945
  });
@@ -3767,7 +3956,7 @@ var DataSpaceManager = class {
3767
3956
  id: this._instanceId
3768
3957
  }), {
3769
3958
  F: __dxlog_file12,
3770
- L: 120,
3959
+ L: 123,
3771
3960
  S: this,
3772
3961
  C: (f, a) => f(...a)
3773
3962
  });
@@ -3775,7 +3964,7 @@ var DataSpaceManager = class {
3775
3964
  async close() {
3776
3965
  log10("close", void 0, {
3777
3966
  F: __dxlog_file12,
3778
- L: 125,
3967
+ L: 128,
3779
3968
  S: this,
3780
3969
  C: (f, a) => f(...a)
3781
3970
  });
@@ -3791,7 +3980,7 @@ var DataSpaceManager = class {
3791
3980
  async createSpace() {
3792
3981
  invariant11(this._isOpen, "Not open.", {
3793
3982
  F: __dxlog_file12,
3794
- L: 138,
3983
+ L: 141,
3795
3984
  S: this,
3796
3985
  A: [
3797
3986
  "this._isOpen",
@@ -3812,7 +4001,7 @@ var DataSpaceManager = class {
3812
4001
  spaceKey
3813
4002
  }, {
3814
4003
  F: __dxlog_file12,
3815
- L: 150,
4004
+ L: 153,
3816
4005
  S: this,
3817
4006
  C: (f, a) => f(...a)
3818
4007
  });
@@ -3828,7 +4017,7 @@ var DataSpaceManager = class {
3828
4017
  const memberCredential = credentials[1];
3829
4018
  invariant11(getCredentialAssertion2(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
3830
4019
  F: __dxlog_file12,
3831
- L: 163,
4020
+ L: 166,
3832
4021
  S: this,
3833
4022
  A: [
3834
4023
  "getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -3846,13 +4035,13 @@ var DataSpaceManager = class {
3846
4035
  opts
3847
4036
  }, {
3848
4037
  F: __dxlog_file12,
3849
- L: 175,
4038
+ L: 178,
3850
4039
  S: this,
3851
4040
  C: (f, a) => f(...a)
3852
4041
  });
3853
4042
  invariant11(this._isOpen, "Not open.", {
3854
4043
  F: __dxlog_file12,
3855
- L: 176,
4044
+ L: 179,
3856
4045
  S: this,
3857
4046
  A: [
3858
4047
  "this._isOpen",
@@ -3861,7 +4050,7 @@ var DataSpaceManager = class {
3861
4050
  });
3862
4051
  invariant11(!this._spaces.has(opts.spaceKey), "Space already exists.", {
3863
4052
  F: __dxlog_file12,
3864
- L: 177,
4053
+ L: 180,
3865
4054
  S: this,
3866
4055
  A: [
3867
4056
  "!this._spaces.has(opts.spaceKey)",
@@ -3896,7 +4085,7 @@ var DataSpaceManager = class {
3896
4085
  metadata
3897
4086
  }, {
3898
4087
  F: __dxlog_file12,
3899
- L: 210,
4088
+ L: 213,
3900
4089
  S: this,
3901
4090
  C: (f, a) => f(...a)
3902
4091
  });
@@ -3934,12 +4123,15 @@ var DataSpaceManager = class {
3934
4123
  onAuthFailure: () => {
3935
4124
  log10.warn("auth failure", void 0, {
3936
4125
  F: __dxlog_file12,
3937
- L: 247,
4126
+ L: 250,
3938
4127
  S: this,
3939
4128
  C: (f, a) => f(...a)
3940
4129
  });
3941
4130
  },
3942
- memberKey: this._signingContext.identityKey
4131
+ memberKey: this._signingContext.identityKey,
4132
+ onDelegatedInvitationStatusChange: (invitation, isActive) => {
4133
+ return this._handleInvitationStatusChange(dataSpace, invitation, isActive);
4134
+ }
3943
4135
  });
3944
4136
  controlFeed && await space.setControlFeed(controlFeed);
3945
4137
  dataFeed && await space.setDataFeed(dataFeed);
@@ -3958,7 +4150,7 @@ var DataSpaceManager = class {
3958
4150
  space: space.key
3959
4151
  }, {
3960
4152
  F: __dxlog_file12,
3961
- L: 265,
4153
+ L: 271,
3962
4154
  S: this,
3963
4155
  C: (f, a) => f(...a)
3964
4156
  });
@@ -3969,11 +4161,14 @@ var DataSpaceManager = class {
3969
4161
  open: this._isOpen
3970
4162
  }, {
3971
4163
  F: __dxlog_file12,
3972
- L: 268,
4164
+ L: 274,
3973
4165
  S: this,
3974
4166
  C: (f, a) => f(...a)
3975
4167
  });
3976
4168
  if (this._isOpen) {
4169
+ await this._createDelegatedInvitations(dataSpace, [
4170
+ ...space.spaceState.invitations.entries()
4171
+ ]);
3977
4172
  this.updated.emit();
3978
4173
  }
3979
4174
  },
@@ -3982,7 +4177,7 @@ var DataSpaceManager = class {
3982
4177
  space: space.key
3983
4178
  }, {
3984
4179
  F: __dxlog_file12,
3985
- L: 274,
4180
+ L: 281,
3986
4181
  S: this,
3987
4182
  C: (f, a) => f(...a)
3988
4183
  });
@@ -4000,6 +4195,41 @@ var DataSpaceManager = class {
4000
4195
  this._spaces.set(metadata.key, dataSpace);
4001
4196
  return dataSpace;
4002
4197
  }
4198
+ async _handleInvitationStatusChange(dataSpace, delegatedInvitation, isActive) {
4199
+ if (dataSpace?.state !== SpaceState2.READY) {
4200
+ return;
4201
+ }
4202
+ if (isActive) {
4203
+ await this._createDelegatedInvitations(dataSpace, [
4204
+ [
4205
+ delegatedInvitation.credentialId,
4206
+ delegatedInvitation.invitation
4207
+ ]
4208
+ ]);
4209
+ } else {
4210
+ await this._invitationsManager.cancelInvitation(delegatedInvitation.invitation);
4211
+ }
4212
+ }
4213
+ async _createDelegatedInvitations(space, invitations) {
4214
+ const tasks = invitations.map(([credentialId, invitation]) => {
4215
+ return this._invitationsManager.createInvitation({
4216
+ type: Invitation6.Type.DELEGATED,
4217
+ kind: Invitation6.Kind.SPACE,
4218
+ spaceKey: space.key,
4219
+ authMethod: invitation.authMethod,
4220
+ invitationId: invitation.invitationId,
4221
+ swarmKey: invitation.swarmKey,
4222
+ guestKeypair: invitation.guestKey ? {
4223
+ publicKey: invitation.guestKey
4224
+ } : void 0,
4225
+ lifetime: invitation.expiresOn ? invitation.expiresOn.getTime() - Date.now() : void 0,
4226
+ multiUse: invitation.multiUse,
4227
+ delegationCredentialId: credentialId,
4228
+ persistent: false
4229
+ });
4230
+ });
4231
+ await Promise.all(tasks);
4232
+ }
4003
4233
  };
4004
4234
  _ts_decorate5([
4005
4235
  synchronized2
@@ -4018,13 +4248,13 @@ DataSpaceManager = _ts_decorate5([
4018
4248
  ], DataSpaceManager);
4019
4249
 
4020
4250
  // packages/sdk/client-services/src/packlets/spaces/spaces-service.ts
4021
- import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTask as scheduleTask6 } from "@dxos/async";
4251
+ import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTask as scheduleTask5 } from "@dxos/async";
4022
4252
  import { Stream as Stream10 } from "@dxos/codec-protobuf";
4023
4253
  import { raise as raise2 } from "@dxos/debug";
4024
4254
  import { invariant as invariant12 } from "@dxos/invariant";
4025
4255
  import { log as log11 } from "@dxos/log";
4026
4256
  import { ApiError, SpaceNotFoundError, encodeError } from "@dxos/protocols";
4027
- import { SpaceMember as SpaceMember2, SpaceState as SpaceState3 } from "@dxos/protocols/proto/dxos/client/services";
4257
+ import { SpaceMember as SpaceMember3, SpaceState as SpaceState3 } from "@dxos/protocols/proto/dxos/client/services";
4028
4258
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
4029
4259
  var SpacesServiceImpl = class {
4030
4260
  constructor(_identityManager, _spaceManager, _getDataSpaceManager) {
@@ -4075,7 +4305,7 @@ var SpacesServiceImpl = class {
4075
4305
  }, {
4076
4306
  maxFrequency: false ? void 0 : 2
4077
4307
  });
4078
- scheduleTask6(ctx, async () => {
4308
+ scheduleTask5(ctx, async () => {
4079
4309
  const dataSpaceManager = await this._getDataSpaceManager();
4080
4310
  const subscriptions = new EventSubscriptions2();
4081
4311
  ctx.onDispose(() => subscriptions.clear());
@@ -4109,7 +4339,7 @@ var SpacesServiceImpl = class {
4109
4339
  }
4110
4340
  subscribeMessages({ spaceKey, channel }) {
4111
4341
  return new Stream10(({ ctx, next }) => {
4112
- scheduleTask6(ctx, async () => {
4342
+ scheduleTask5(ctx, async () => {
4113
4343
  const dataSpaceManager = await this._getDataSpaceManager();
4114
4344
  const space = dataSpaceManager.spaces.get(spaceKey) ?? raise2(new SpaceNotFoundError(spaceKey));
4115
4345
  const handle = space.listen(getChannelId(channel), (message) => {
@@ -4128,7 +4358,7 @@ var SpacesServiceImpl = class {
4128
4358
  }
4129
4359
  };
4130
4360
  ctx.onDispose(() => space.spaceState.removeCredentialProcessor(processor));
4131
- scheduleTask6(ctx, async () => {
4361
+ scheduleTask5(ctx, async () => {
4132
4362
  await space.spaceState.addCredentialProcessor(processor);
4133
4363
  if (noTail) {
4134
4364
  close();
@@ -4222,7 +4452,7 @@ var SpacesServiceImpl = class {
4222
4452
  identityKey: member.key,
4223
4453
  profile: member.profile ?? {}
4224
4454
  },
4225
- presence: member.removed ? SpaceMember2.PresenceState.REMOVED : isMe || peers.length > 0 ? SpaceMember2.PresenceState.ONLINE : SpaceMember2.PresenceState.OFFLINE,
4455
+ presence: member.removed ? SpaceMember3.PresenceState.REMOVED : isMe || peers.length > 0 ? SpaceMember3.PresenceState.ONLINE : SpaceMember3.PresenceState.OFFLINE,
4226
4456
  peerStates: peers
4227
4457
  };
4228
4458
  }),
@@ -4241,20 +4471,19 @@ import { getCredentialAssertion as getCredentialAssertion3 } from "@dxos/credent
4241
4471
  import { failUndefined as failUndefined2 } from "@dxos/debug";
4242
4472
  import { AutomergeHost, MetadataStore, SnapshotStore, SpaceManager, valueEncoding } from "@dxos/echo-pipeline";
4243
4473
  import { FeedFactory, FeedStore } from "@dxos/feed-store";
4244
- import { IndexMetadataStore, IndexStore, Indexer } from "@dxos/indexing";
4474
+ import { IndexMetadataStore, IndexStore, Indexer, createStorageCallbacks } from "@dxos/indexing";
4245
4475
  import { invariant as invariant13 } from "@dxos/invariant";
4246
4476
  import { Keyring } from "@dxos/keyring";
4247
- import { PublicKey as PublicKey10 } from "@dxos/keys";
4477
+ import { PublicKey as PublicKey11 } from "@dxos/keys";
4248
4478
  import { log as log12 } from "@dxos/log";
4249
4479
  import { InvalidStorageVersionError, STORAGE_VERSION, trace as trace8 } from "@dxos/protocols";
4250
- import { Invitation as Invitation6 } from "@dxos/protocols/proto/dxos/client/services";
4480
+ import { Invitation as Invitation7 } from "@dxos/protocols/proto/dxos/client/services";
4251
4481
  import { BlobStore } from "@dxos/teleport-extension-object-sync";
4252
4482
  import { trace as Trace2 } from "@dxos/tracing";
4253
4483
  import { safeInstanceof } from "@dxos/util";
4254
4484
 
4255
4485
  // packages/sdk/client-services/src/packlets/indexing/util.ts
4256
4486
  import { getHeads } from "@dxos/automerge/automerge";
4257
- import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
4258
4487
  import { idCodec } from "@dxos/protocols";
4259
4488
  var createSelectedDocumentsIterator = (automergeHost) => (
4260
4489
  /**
@@ -4265,8 +4494,10 @@ var createSelectedDocumentsIterator = (automergeHost) => (
4265
4494
  async function* loadDocuments(ids) {
4266
4495
  for (const id of ids) {
4267
4496
  const { documentId, objectId } = idCodec.decode(id);
4268
- const handle = automergeHost.repo.find(documentId);
4269
- await warnAfterTimeout2(5e3, "to long to load doc", () => handle.whenReady());
4497
+ const handle = automergeHost.repo.handles[documentId] ?? automergeHost.repo.find(documentId);
4498
+ if (!handle.isReady()) {
4499
+ await handle.whenReady();
4500
+ }
4270
4501
  const doc = handle.docSync();
4271
4502
  const hash = getHeads(doc).join("");
4272
4503
  yield doc.objects?.[objectId] ? [
@@ -4279,57 +4510,6 @@ var createSelectedDocumentsIterator = (automergeHost) => (
4279
4510
  }
4280
4511
  }
4281
4512
  );
4282
- var createDocumentsIterator = (automergeHost) => (
4283
- /**
4284
- * Recursively get all object data blobs from Automerge Repo.
4285
- * @param ids
4286
- */
4287
- // TODO(mykola): Unload automerge handles after usage.
4288
- async function* getAllDocuments() {
4289
- const visited = /* @__PURE__ */ new Set();
4290
- async function* getObjectsFromHandle(handle) {
4291
- if (visited.has(handle.documentId)) {
4292
- return;
4293
- }
4294
- await warnAfterTimeout2(5e3, "to long to load doc", () => handle.whenReady());
4295
- const doc = handle.docSync();
4296
- const heads = getHeads(doc);
4297
- if (doc.objects) {
4298
- yield Object.entries(doc.objects).map(([objectId, object]) => {
4299
- return {
4300
- id: idCodec.encode({
4301
- documentId: handle.documentId,
4302
- objectId
4303
- }),
4304
- object,
4305
- currentHash: heads.join("")
4306
- };
4307
- });
4308
- }
4309
- if (doc.links) {
4310
- for (const id of Object.values(doc.links)) {
4311
- if (visited.has(id)) {
4312
- continue;
4313
- }
4314
- const linkHandle = automergeHost.repo.find(id);
4315
- for await (const result of getObjectsFromHandle(linkHandle)) {
4316
- yield result;
4317
- }
4318
- }
4319
- }
4320
- visited.add(handle.documentId);
4321
- }
4322
- for (const handle of Object.values(automergeHost.repo.handles)) {
4323
- if (visited.has(handle.documentId)) {
4324
- continue;
4325
- }
4326
- for await (const result of getObjectsFromHandle(handle)) {
4327
- yield result;
4328
- }
4329
- visited.add(handle.documentId);
4330
- }
4331
- }
4332
- );
4333
4513
 
4334
4514
  // packages/sdk/client-services/src/packlets/services/service-context.ts
4335
4515
  function _ts_decorate6(decorators, target, key, desc) {
@@ -4353,7 +4533,7 @@ var ServiceContext = class extends Resource {
4353
4533
  this._runtimeParams = _runtimeParams;
4354
4534
  this.initialized = new Trigger5();
4355
4535
  this._handlerFactories = /* @__PURE__ */ new Map();
4356
- this._instanceId = PublicKey10.random().toHex();
4536
+ this._instanceId = PublicKey11.random().toHex();
4357
4537
  this.metadataStore = new MetadataStore(storage.createDirectory("metadata"));
4358
4538
  this.snapshotStore = new SnapshotStore(storage.createDirectory("snapshots"));
4359
4539
  this.blobStore = new BlobStore(storage.createDirectory("blobs"));
@@ -4381,24 +4561,29 @@ var ServiceContext = class extends Resource {
4381
4561
  });
4382
4562
  this.automergeHost = new AutomergeHost({
4383
4563
  directory: storage.createDirectory("automerge"),
4384
- metadata: this.indexMetadata
4564
+ db: level.sublevel("automerge"),
4565
+ storageCallbacks: createStorageCallbacks({
4566
+ host: () => this.automergeHost,
4567
+ metadata: this.indexMetadata
4568
+ })
4385
4569
  });
4386
4570
  this.indexer = new Indexer({
4571
+ db: this.level,
4387
4572
  indexStore: new IndexStore({
4388
- directory: storage.createDirectory("index-store")
4573
+ db: level.sublevel("index-storage")
4389
4574
  }),
4390
4575
  metadataStore: this.indexMetadata,
4391
- loadDocuments: createSelectedDocumentsIterator(this.automergeHost),
4392
- getAllDocuments: createDocumentsIterator(this.automergeHost)
4576
+ loadDocuments: createSelectedDocumentsIterator(this.automergeHost)
4393
4577
  });
4394
4578
  this.invitations = new InvitationsHandler(this.networkManager);
4395
- this._handlerFactories.set(Invitation6.Kind.DEVICE, () => new DeviceInvitationProtocol(this.keyring, () => this.identityManager.identity ?? failUndefined2(), this._acceptIdentity.bind(this)));
4579
+ this.invitationsManager = new InvitationsManager(this.invitations, (invitation) => this.getInvitationHandler(invitation), this.metadataStore);
4580
+ this._handlerFactories.set(Invitation7.Kind.DEVICE, () => new DeviceInvitationProtocol(this.keyring, () => this.identityManager.identity ?? failUndefined2(), this._acceptIdentity.bind(this)));
4396
4581
  }
4397
4582
  async _open(ctx) {
4398
4583
  await this._checkStorageVersion();
4399
4584
  log12("opening...", void 0, {
4400
4585
  F: __dxlog_file14,
4401
- L: 156,
4586
+ L: 164,
4402
4587
  S: this,
4403
4588
  C: (f, a) => f(...a)
4404
4589
  });
@@ -4406,29 +4591,39 @@ var ServiceContext = class extends Resource {
4406
4591
  id: this._instanceId
4407
4592
  }), {
4408
4593
  F: __dxlog_file14,
4409
- L: 157,
4594
+ L: 165,
4410
4595
  S: this,
4411
4596
  C: (f, a) => f(...a)
4412
4597
  });
4413
4598
  await this.signalManager.open();
4414
4599
  await this.networkManager.open();
4600
+ await this.automergeHost.open();
4415
4601
  await this.metadataStore.load();
4416
4602
  await this.spaceManager.open();
4417
4603
  await this.identityManager.open(ctx);
4418
4604
  if (this.identityManager.identity) {
4419
4605
  await this._initialize(ctx);
4420
4606
  }
4607
+ const loadedInvitations = await this.invitationsManager.loadPersistentInvitations();
4608
+ log12("loaded persistent invitations", {
4609
+ count: loadedInvitations.invitations?.length
4610
+ }, {
4611
+ F: __dxlog_file14,
4612
+ L: 178,
4613
+ S: this,
4614
+ C: (f, a) => f(...a)
4615
+ });
4421
4616
  log12.trace("dxos.sdk.service-context.open", trace8.end({
4422
4617
  id: this._instanceId
4423
4618
  }), {
4424
4619
  F: __dxlog_file14,
4425
- L: 167,
4620
+ L: 180,
4426
4621
  S: this,
4427
4622
  C: (f, a) => f(...a)
4428
4623
  });
4429
4624
  log12("opened", void 0, {
4430
4625
  F: __dxlog_file14,
4431
- L: 168,
4626
+ L: 181,
4432
4627
  S: this,
4433
4628
  C: (f, a) => f(...a)
4434
4629
  });
@@ -4436,7 +4631,7 @@ var ServiceContext = class extends Resource {
4436
4631
  async _close() {
4437
4632
  log12("closing...", void 0, {
4438
4633
  F: __dxlog_file14,
4439
- L: 172,
4634
+ L: 185,
4440
4635
  S: this,
4441
4636
  C: (f, a) => f(...a)
4442
4637
  });
@@ -4454,7 +4649,7 @@ var ServiceContext = class extends Resource {
4454
4649
  await this.indexer.destroy();
4455
4650
  log12("closed", void 0, {
4456
4651
  F: __dxlog_file14,
4457
- L: 185,
4652
+ L: 198,
4458
4653
  S: this,
4459
4654
  C: (f, a) => f(...a)
4460
4655
  });
@@ -4468,7 +4663,7 @@ var ServiceContext = class extends Resource {
4468
4663
  const factory = this._handlerFactories.get(invitation.kind);
4469
4664
  invariant13(factory, `Unknown invitation kind: ${invitation.kind}`, {
4470
4665
  F: __dxlog_file14,
4471
- L: 196,
4666
+ L: 209,
4472
4667
  S: this,
4473
4668
  A: [
4474
4669
  "factory",
@@ -4500,7 +4695,7 @@ var ServiceContext = class extends Resource {
4500
4695
  async _initialize(ctx) {
4501
4696
  log12("initializing spaces...", void 0, {
4502
4697
  F: __dxlog_file14,
4503
- L: 227,
4698
+ L: 240,
4504
4699
  S: this,
4505
4700
  C: (f, a) => f(...a)
4506
4701
  });
@@ -4518,12 +4713,12 @@ var ServiceContext = class extends Resource {
4518
4713
  });
4519
4714
  }
4520
4715
  };
4521
- this.dataSpaceManager = new DataSpaceManager(this.spaceManager, this.metadataStore, this.keyring, signingContext, this.feedStore, this.automergeHost, this._runtimeParams);
4716
+ this.dataSpaceManager = new DataSpaceManager(this.spaceManager, this.metadataStore, this.keyring, signingContext, this.feedStore, this.automergeHost, this.invitationsManager, this._runtimeParams);
4522
4717
  await this.dataSpaceManager.open();
4523
- this._handlerFactories.set(Invitation6.Kind.SPACE, (invitation) => {
4718
+ this._handlerFactories.set(Invitation7.Kind.SPACE, (invitation) => {
4524
4719
  invariant13(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
4525
4720
  F: __dxlog_file14,
4526
- L: 251,
4721
+ L: 265,
4527
4722
  S: this,
4528
4723
  A: [
4529
4724
  "this.dataSpaceManager",
@@ -4547,7 +4742,7 @@ var ServiceContext = class extends Resource {
4547
4742
  details: assertion
4548
4743
  }, {
4549
4744
  F: __dxlog_file14,
4550
- L: 267,
4745
+ L: 281,
4551
4746
  S: this,
4552
4747
  C: (f, a) => f(...a)
4553
4748
  });
@@ -4558,7 +4753,7 @@ var ServiceContext = class extends Resource {
4558
4753
  details: assertion
4559
4754
  }, {
4560
4755
  F: __dxlog_file14,
4561
- L: 271,
4756
+ L: 285,
4562
4757
  S: this,
4563
4758
  C: (f, a) => f(...a)
4564
4759
  });
@@ -4569,7 +4764,7 @@ var ServiceContext = class extends Resource {
4569
4764
  details: assertion
4570
4765
  }, {
4571
4766
  F: __dxlog_file14,
4572
- L: 276,
4767
+ L: 290,
4573
4768
  S: this,
4574
4769
  C: (f, a) => f(...a)
4575
4770
  });
@@ -4580,7 +4775,7 @@ var ServiceContext = class extends Resource {
4580
4775
  } catch (err) {
4581
4776
  log12.catch(err, void 0, {
4582
4777
  F: __dxlog_file14,
4583
- L: 282,
4778
+ L: 296,
4584
4779
  S: this,
4585
4780
  C: (f, a) => f(...a)
4586
4781
  });
@@ -4630,11 +4825,11 @@ import { getFirstStreamValue } from "@dxos/codec-protobuf";
4630
4825
  import { credentialTypeFilter } from "@dxos/credentials";
4631
4826
  import { invariant as invariant14 } from "@dxos/invariant";
4632
4827
  import { STORAGE_VERSION as STORAGE_VERSION2 } from "@dxos/protocols";
4633
- import { SpaceMember as SpaceMember3 } from "@dxos/protocols/proto/dxos/client/services";
4828
+ import { SpaceMember as SpaceMember4 } from "@dxos/protocols/proto/dxos/client/services";
4634
4829
  import { TRACE_PROCESSOR } from "@dxos/tracing";
4635
4830
 
4636
4831
  // packages/sdk/client-services/src/version.ts
4637
- var DXOS_VERSION = "0.4.10-main.b9b4602";
4832
+ var DXOS_VERSION = "0.4.10-main.bf49328";
4638
4833
 
4639
4834
  // packages/sdk/client-services/src/packlets/services/platform.ts
4640
4835
  import { Platform } from "@dxos/protocols/proto/dxos/client/services";
@@ -4756,7 +4951,7 @@ var getSpaceStats = async (space) => {
4756
4951
  displayName: member.assertion.profile?.displayName
4757
4952
  }
4758
4953
  },
4759
- presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ? SpaceMember3.PresenceState.ONLINE : SpaceMember3.PresenceState.OFFLINE
4954
+ presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ? SpaceMember4.PresenceState.ONLINE : SpaceMember4.PresenceState.OFFLINE
4760
4955
  })),
4761
4956
  pipeline: {
4762
4957
  // TODO(burdon): Pick properties from credentials if needed.
@@ -4879,10 +5074,10 @@ import { Event as Event9, synchronized as synchronized3 } from "@dxos/async";
4879
5074
  import { clientServiceBundle, defaultKey, Properties } from "@dxos/client-protocol";
4880
5075
  import { Context as Context11 } from "@dxos/context";
4881
5076
  import { DataServiceImpl, encodeReference } from "@dxos/echo-pipeline";
4882
- import * as E from "@dxos/echo-schema";
4883
- import { IndexServiceImpl } from "@dxos/indexing";
5077
+ import { getTypeReference } from "@dxos/echo-schema";
5078
+ import { QueryServiceImpl } from "@dxos/indexing";
4884
5079
  import { invariant as invariant16 } from "@dxos/invariant";
4885
- import { PublicKey as PublicKey13 } from "@dxos/keys";
5080
+ import { PublicKey as PublicKey14 } from "@dxos/keys";
4886
5081
  import { log as log16 } from "@dxos/log";
4887
5082
  import { WebsocketSignalManager } from "@dxos/messaging";
4888
5083
  import { NetworkManager, createSimplePeerTransportFactory } from "@dxos/network-manager";
@@ -5101,7 +5296,7 @@ var isLocked = (lockPath) => {
5101
5296
  // packages/sdk/client-services/src/packlets/logging/logging-service.ts
5102
5297
  import { Event as Event8 } from "@dxos/async";
5103
5298
  import { Stream as Stream12 } from "@dxos/codec-protobuf";
5104
- import { PublicKey as PublicKey11 } from "@dxos/keys";
5299
+ import { PublicKey as PublicKey12 } from "@dxos/keys";
5105
5300
  import { getContextFromEntry, log as log15 } from "@dxos/log";
5106
5301
  import { QueryLogsRequest } from "@dxos/protocols/proto/dxos/client/services";
5107
5302
  import { getDebugName, jsonify, numericalValues, tracer } from "@dxos/util";
@@ -5109,7 +5304,7 @@ var LoggingServiceImpl = class {
5109
5304
  constructor() {
5110
5305
  this._logs = new Event8();
5111
5306
  this._started = Date.now();
5112
- this._sessionId = PublicKey11.random().toHex();
5307
+ this._sessionId = PublicKey12.random().toHex();
5113
5308
  this._logProcessor = (_config, entry2) => {
5114
5309
  this._logs.emit(entry2);
5115
5310
  };
@@ -5320,10 +5515,10 @@ var toStorageType = (type) => {
5320
5515
  // packages/sdk/client-services/src/packlets/storage/level.ts
5321
5516
  import { Level } from "level";
5322
5517
  import path from "@dxos/node-std/path";
5323
- import { PublicKey as PublicKey12 } from "@dxos/keys";
5518
+ import { PublicKey as PublicKey13 } from "@dxos/keys";
5324
5519
  var createLevel = async (config) => {
5325
5520
  const persistent = isPersistent(config);
5326
- const storagePath = persistent ? getRootPath(config) : path.join("tmp", "level", PublicKey12.random().toHex());
5521
+ const storagePath = persistent ? path.join(getRootPath(config), "level") : `/tmp/dxos-${PublicKey13.random().toHex()}`;
5327
5522
  const level = new Level(storagePath);
5328
5523
  await level.open();
5329
5524
  return level;
@@ -5404,6 +5599,7 @@ var ClientServicesHost = class {
5404
5599
  transportFactory,
5405
5600
  signalManager,
5406
5601
  storage,
5602
+ level,
5407
5603
  // TODO(wittjosiah): Turn this on by default.
5408
5604
  lockKey,
5409
5605
  callbacks,
@@ -5414,6 +5610,7 @@ var ClientServicesHost = class {
5414
5610
  this._opening = false;
5415
5611
  this._open = false;
5416
5612
  this._storage = storage;
5613
+ this._level = level;
5417
5614
  this._callbacks = callbacks;
5418
5615
  this._runtimeParams = runtimeParams;
5419
5616
  if (config) {
@@ -5485,7 +5682,7 @@ var ClientServicesHost = class {
5485
5682
  initialize({ config, ...options }) {
5486
5683
  invariant16(!this._open, "service host is open", {
5487
5684
  F: __dxlog_file19,
5488
- L: 188,
5685
+ L: 198,
5489
5686
  S: this,
5490
5687
  A: [
5491
5688
  "!this._open",
@@ -5494,14 +5691,14 @@ var ClientServicesHost = class {
5494
5691
  });
5495
5692
  log16("initializing...", void 0, {
5496
5693
  F: __dxlog_file19,
5497
- L: 189,
5694
+ L: 199,
5498
5695
  S: this,
5499
5696
  C: (f, a) => f(...a)
5500
5697
  });
5501
5698
  if (config) {
5502
5699
  invariant16(!this._config, "config already set", {
5503
5700
  F: __dxlog_file19,
5504
- L: 192,
5701
+ L: 202,
5505
5702
  S: this,
5506
5703
  A: [
5507
5704
  "!this._config",
@@ -5516,7 +5713,7 @@ var ClientServicesHost = class {
5516
5713
  if (!options.signalManager) {
5517
5714
  log16.warn("running signaling without telemetry metadata.", void 0, {
5518
5715
  F: __dxlog_file19,
5519
- L: 200,
5716
+ L: 210,
5520
5717
  S: this,
5521
5718
  C: (f, a) => f(...a)
5522
5719
  });
@@ -5527,7 +5724,7 @@ var ClientServicesHost = class {
5527
5724
  this._signalManager = signalManager;
5528
5725
  invariant16(!this._networkManager, "network manager already set", {
5529
5726
  F: __dxlog_file19,
5530
- L: 211,
5727
+ L: 221,
5531
5728
  S: this,
5532
5729
  A: [
5533
5730
  "!this._networkManager",
@@ -5541,7 +5738,7 @@ var ClientServicesHost = class {
5541
5738
  });
5542
5739
  log16("initialized", void 0, {
5543
5740
  F: __dxlog_file19,
5544
- L: 218,
5741
+ L: 228,
5545
5742
  S: this,
5546
5743
  C: (f, a) => f(...a)
5547
5744
  });
@@ -5550,18 +5747,18 @@ var ClientServicesHost = class {
5550
5747
  if (this._open) {
5551
5748
  return;
5552
5749
  }
5553
- const traceId = PublicKey13.random().toHex();
5750
+ const traceId = PublicKey14.random().toHex();
5554
5751
  log16.trace("dxos.client-services.host.open", trace9.begin({
5555
5752
  id: traceId
5556
5753
  }), {
5557
5754
  F: __dxlog_file19,
5558
- L: 229,
5755
+ L: 239,
5559
5756
  S: this,
5560
5757
  C: (f, a) => f(...a)
5561
5758
  });
5562
5759
  invariant16(this._config, "config not set", {
5563
5760
  F: __dxlog_file19,
5564
- L: 231,
5761
+ L: 241,
5565
5762
  S: this,
5566
5763
  A: [
5567
5764
  "this._config",
@@ -5570,7 +5767,7 @@ var ClientServicesHost = class {
5570
5767
  });
5571
5768
  invariant16(this._storage, "storage not set", {
5572
5769
  F: __dxlog_file19,
5573
- L: 232,
5770
+ L: 242,
5574
5771
  S: this,
5575
5772
  A: [
5576
5773
  "this._storage",
@@ -5579,7 +5776,7 @@ var ClientServicesHost = class {
5579
5776
  });
5580
5777
  invariant16(this._signalManager, "signal manager not set", {
5581
5778
  F: __dxlog_file19,
5582
- L: 233,
5779
+ L: 243,
5583
5780
  S: this,
5584
5781
  A: [
5585
5782
  "this._signalManager",
@@ -5588,7 +5785,7 @@ var ClientServicesHost = class {
5588
5785
  });
5589
5786
  invariant16(this._networkManager, "network manager not set", {
5590
5787
  F: __dxlog_file19,
5591
- L: 234,
5788
+ L: 244,
5592
5789
  S: this,
5593
5790
  A: [
5594
5791
  "this._networkManager",
@@ -5600,30 +5797,33 @@ var ClientServicesHost = class {
5600
5797
  lockKey: this._resourceLock?.lockKey
5601
5798
  }, {
5602
5799
  F: __dxlog_file19,
5603
- L: 237,
5800
+ L: 247,
5604
5801
  S: this,
5605
5802
  C: (f, a) => f(...a)
5606
5803
  });
5607
5804
  if (!this._level) {
5608
5805
  this._level = await createLevel(this._config.get("runtime.client.storage", {}));
5609
5806
  }
5807
+ await this._level.open();
5610
5808
  await this._resourceLock?.acquire();
5611
5809
  await this._loggingService.open();
5612
5810
  this._serviceContext = new ServiceContext(this._storage, this._level, this._networkManager, this._signalManager, this._runtimeParams);
5811
+ this._queryService = new QueryServiceImpl({
5812
+ indexer: this._serviceContext.indexer,
5813
+ automergeHost: this._serviceContext.automergeHost
5814
+ });
5815
+ await this._queryService.open(ctx);
5613
5816
  this._serviceRegistry.setServices({
5614
5817
  SystemService: this._systemService,
5615
5818
  IdentityService: new IdentityServiceImpl((params) => this._createIdentity(params), this._serviceContext.identityManager, this._serviceContext.keyring, (profile) => this._serviceContext.broadcastProfileUpdate(profile)),
5616
- InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitations, (invitation) => this._serviceContext.getInvitationHandler(invitation), this._serviceContext.metadataStore),
5819
+ InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitationsManager),
5617
5820
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
5618
5821
  SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, async () => {
5619
5822
  await this._serviceContext.initialized.wait();
5620
5823
  return this._serviceContext.dataSpaceManager;
5621
5824
  }),
5622
5825
  DataService: new DataServiceImpl(this._serviceContext.automergeHost),
5623
- IndexService: new IndexServiceImpl({
5624
- indexer: this._serviceContext.indexer,
5625
- automergeHost: this._serviceContext.automergeHost
5626
- }),
5826
+ QueryService: this._queryService,
5627
5827
  NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager, this._serviceContext.signalManager),
5628
5828
  LoggingService: this._loggingService,
5629
5829
  TracingService: this._tracingService,
@@ -5635,24 +5835,6 @@ var ClientServicesHost = class {
5635
5835
  })
5636
5836
  });
5637
5837
  await this._serviceContext.open(ctx);
5638
- invariant16(this.serviceRegistry.services.InvitationsService, void 0, {
5639
- F: __dxlog_file19,
5640
- L: 303,
5641
- S: this,
5642
- A: [
5643
- "this.serviceRegistry.services.InvitationsService",
5644
- ""
5645
- ]
5646
- });
5647
- const loadedInvitations = await this.serviceRegistry.services.InvitationsService.loadPersistentInvitations();
5648
- log16("loaded persistent invitations", {
5649
- count: loadedInvitations.invitations?.length
5650
- }, {
5651
- F: __dxlog_file19,
5652
- L: 306,
5653
- S: this,
5654
- C: (f, a) => f(...a)
5655
- });
5656
5838
  const devtoolsProxy = this._config?.get("runtime.client.devtoolsProxy");
5657
5839
  if (devtoolsProxy) {
5658
5840
  this._devtoolsProxy = new WebsocketRpcClient({
@@ -5672,7 +5854,7 @@ var ClientServicesHost = class {
5672
5854
  deviceKey
5673
5855
  }, {
5674
5856
  F: __dxlog_file19,
5675
- L: 324,
5857
+ L: 330,
5676
5858
  S: this,
5677
5859
  C: (f, a) => f(...a)
5678
5860
  });
@@ -5680,7 +5862,7 @@ var ClientServicesHost = class {
5680
5862
  id: traceId
5681
5863
  }), {
5682
5864
  F: __dxlog_file19,
5683
- L: 325,
5865
+ L: 331,
5684
5866
  S: this,
5685
5867
  C: (f, a) => f(...a)
5686
5868
  });
@@ -5694,7 +5876,7 @@ var ClientServicesHost = class {
5694
5876
  deviceKey
5695
5877
  }, {
5696
5878
  F: __dxlog_file19,
5697
- L: 336,
5879
+ L: 342,
5698
5880
  S: this,
5699
5881
  C: (f, a) => f(...a)
5700
5882
  });
@@ -5704,6 +5886,7 @@ var ClientServicesHost = class {
5704
5886
  SystemService: this._systemService
5705
5887
  });
5706
5888
  await this._loggingService.close();
5889
+ await this._queryService.close();
5707
5890
  await this._serviceContext.close();
5708
5891
  await this._level?.close();
5709
5892
  this._open = false;
@@ -5712,24 +5895,24 @@ var ClientServicesHost = class {
5712
5895
  deviceKey
5713
5896
  }, {
5714
5897
  F: __dxlog_file19,
5715
- L: 345,
5898
+ L: 352,
5716
5899
  S: this,
5717
5900
  C: (f, a) => f(...a)
5718
5901
  });
5719
5902
  }
5720
5903
  async reset() {
5721
- const traceId = PublicKey13.random().toHex();
5904
+ const traceId = PublicKey14.random().toHex();
5722
5905
  log16.trace("dxos.sdk.client-services-host.reset", trace9.begin({
5723
5906
  id: traceId
5724
5907
  }), {
5725
5908
  F: __dxlog_file19,
5726
- L: 350,
5909
+ L: 357,
5727
5910
  S: this,
5728
5911
  C: (f, a) => f(...a)
5729
5912
  });
5730
5913
  log16("resetting...", void 0, {
5731
5914
  F: __dxlog_file19,
5732
- L: 352,
5915
+ L: 359,
5733
5916
  S: this,
5734
5917
  C: (f, a) => f(...a)
5735
5918
  });
@@ -5737,7 +5920,7 @@ var ClientServicesHost = class {
5737
5920
  await this._storage.reset();
5738
5921
  log16("reset", void 0, {
5739
5922
  F: __dxlog_file19,
5740
- L: 355,
5923
+ L: 362,
5741
5924
  S: this,
5742
5925
  C: (f, a) => f(...a)
5743
5926
  });
@@ -5745,7 +5928,7 @@ var ClientServicesHost = class {
5745
5928
  id: traceId
5746
5929
  }), {
5747
5930
  F: __dxlog_file19,
5748
- L: 356,
5931
+ L: 363,
5749
5932
  S: this,
5750
5933
  C: (f, a) => f(...a)
5751
5934
  });
@@ -5758,7 +5941,7 @@ var ClientServicesHost = class {
5758
5941
  const automergeIndex = space.automergeSpaceState.rootUrl;
5759
5942
  invariant16(automergeIndex, void 0, {
5760
5943
  F: __dxlog_file19,
5761
- L: 368,
5944
+ L: 375,
5762
5945
  S: this,
5763
5946
  A: [
5764
5947
  "automergeIndex",
@@ -5769,7 +5952,7 @@ var ClientServicesHost = class {
5769
5952
  await document.whenReady();
5770
5953
  const properties = {
5771
5954
  system: {
5772
- type: encodeReference(E.getTypeReference(Properties))
5955
+ type: encodeReference(getTypeReference(Properties))
5773
5956
  },
5774
5957
  data: {
5775
5958
  [defaultKey]: identity.identityKey.toHex()
@@ -5778,7 +5961,7 @@ var ClientServicesHost = class {
5778
5961
  keys: []
5779
5962
  }
5780
5963
  };
5781
- const propertiesId = PublicKey13.random().toHex();
5964
+ const propertiesId = PublicKey14.random().toHex();
5782
5965
  document.change((doc) => {
5783
5966
  assignDeep2(doc, [
5784
5967
  "objects",
@@ -5808,7 +5991,7 @@ ClientServicesHost = _ts_decorate8([
5808
5991
  ], ClientServicesHost);
5809
5992
 
5810
5993
  // packages/sdk/client-services/src/packlets/services/util.ts
5811
- import { PublicKey as PublicKey14 } from "@dxos/keys";
5994
+ import { PublicKey as PublicKey15 } from "@dxos/keys";
5812
5995
  import { humanize } from "@dxos/util";
5813
5996
  var ClientServicesProviderResource = Symbol.for("dxos.resource.ClientServices");
5814
5997
 
@@ -5864,9 +6047,10 @@ export {
5864
6047
  IdentityServiceImpl,
5865
6048
  DeviceInvitationProtocol,
5866
6049
  InvitationsHandler,
5867
- invitationExpired,
6050
+ createAdmissionKeypair,
5868
6051
  InvitationsServiceImpl,
5869
6052
  SpaceInvitationProtocol,
6053
+ InvitationsManager,
5870
6054
  ClientRpcServer,
5871
6055
  DataSpace,
5872
6056
  DataSpaceManager,
@@ -5884,4 +6068,4 @@ export {
5884
6068
  ClientServicesHost,
5885
6069
  ClientServicesProviderResource
5886
6070
  };
5887
- //# sourceMappingURL=chunk-TPPBOJTA.mjs.map
6071
+ //# sourceMappingURL=chunk-OJG7GULD.mjs.map