@dxos/client-services 0.4.10-main.fa5a270 → 0.4.10-main.fd8ea31

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 (122) hide show
  1. package/dist/lib/browser/{chunk-7PYX6UUA.mjs → chunk-WLE7E36I.mjs} +1518 -1077
  2. package/dist/lib/browser/chunk-WLE7E36I.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +62 -22
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +136 -116
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-4TX623I7.cjs → chunk-YXZQQAQN.cjs} +1409 -1056
  9. package/dist/lib/node/chunk-YXZQQAQN.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +98 -58
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/packlets/testing/index.cjs +135 -118
  14. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  15. package/dist/types/src/index.d.ts +1 -0
  16. package/dist/types/src/index.d.ts.map +1 -1
  17. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts +5 -0
  18. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts.map +1 -0
  19. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +5 -0
  20. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -0
  21. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts +15 -0
  22. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts.map +1 -0
  23. package/dist/types/src/packlets/{services → diagnostics}/diagnostics.d.ts +1 -1
  24. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -0
  25. package/dist/types/src/packlets/diagnostics/index.d.ts +4 -0
  26. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -0
  27. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  28. package/dist/types/src/packlets/indexing/util.d.ts +2 -6
  29. package/dist/types/src/packlets/indexing/util.d.ts.map +1 -1
  30. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +3 -1
  31. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  32. package/dist/types/src/packlets/invitations/index.d.ts +1 -0
  33. package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
  34. package/dist/types/src/packlets/invitations/invitation-extension.d.ts +1 -0
  35. package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +1 -1
  36. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +6 -1
  37. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  38. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +8 -4
  39. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  40. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +44 -0
  41. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -0
  42. package/dist/types/src/packlets/invitations/invitations-service.d.ts +7 -23
  43. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  44. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -1
  45. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  46. package/dist/types/src/packlets/services/index.d.ts +1 -1
  47. package/dist/types/src/packlets/services/index.d.ts.map +1 -1
  48. package/dist/types/src/packlets/services/service-context.d.ts +9 -5
  49. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  50. package/dist/types/src/packlets/services/service-host.d.ts +6 -1
  51. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  52. package/dist/types/src/packlets/services/util.d.ts +1 -0
  53. package/dist/types/src/packlets/services/util.d.ts.map +1 -1
  54. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +5 -1
  55. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  56. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  57. package/dist/types/src/packlets/storage/index.d.ts +1 -0
  58. package/dist/types/src/packlets/storage/index.d.ts.map +1 -1
  59. package/dist/types/src/packlets/storage/level.d.ts +4 -0
  60. package/dist/types/src/packlets/storage/level.d.ts.map +1 -0
  61. package/dist/types/src/packlets/storage/storage.d.ts.map +1 -1
  62. package/dist/types/src/packlets/storage/util.d.ts +4 -0
  63. package/dist/types/src/packlets/storage/util.d.ts.map +1 -0
  64. package/dist/types/src/packlets/system/system-service.d.ts +1 -1
  65. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  66. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  67. package/dist/types/src/packlets/testing/test-builder.d.ts +7 -2
  68. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  69. package/dist/types/src/packlets/vault/shared-worker-connection.d.ts +5 -5
  70. package/dist/types/src/packlets/vault/shared-worker-connection.d.ts.map +1 -1
  71. package/dist/types/src/packlets/vault/worker-runtime.d.ts +2 -0
  72. package/dist/types/src/packlets/vault/worker-runtime.d.ts.map +1 -1
  73. package/dist/types/src/packlets/vault/worker-session.d.ts +2 -0
  74. package/dist/types/src/packlets/vault/worker-session.d.ts.map +1 -1
  75. package/dist/types/src/version.d.ts +1 -1
  76. package/package.json +36 -34
  77. package/src/index.ts +1 -0
  78. package/src/packlets/devices/devices-service.test.ts +1 -1
  79. package/src/packlets/diagnostics/browser-diagnostics-broadcast.ts +94 -0
  80. package/src/packlets/diagnostics/diagnostics-broadcast.ts +20 -0
  81. package/src/packlets/diagnostics/diagnostics-collector.ts +65 -0
  82. package/src/packlets/{services → diagnostics}/diagnostics.ts +2 -2
  83. package/src/packlets/diagnostics/index.ts +7 -0
  84. package/src/packlets/identity/identity-manager.ts +1 -0
  85. package/src/packlets/identity/identity-service.test.ts +1 -1
  86. package/src/packlets/identity/identity.test.ts +3 -0
  87. package/src/packlets/indexing/util.ts +11 -68
  88. package/src/packlets/invitations/device-invitation-protocol.test.ts +1 -1
  89. package/src/packlets/invitations/device-invitation-protocol.ts +6 -1
  90. package/src/packlets/invitations/index.ts +1 -0
  91. package/src/packlets/invitations/invitation-extension.ts +28 -1
  92. package/src/packlets/invitations/invitation-protocol.ts +7 -1
  93. package/src/packlets/invitations/invitations-handler.ts +75 -96
  94. package/src/packlets/invitations/invitations-manager.ts +271 -0
  95. package/src/packlets/invitations/invitations-service.ts +23 -168
  96. package/src/packlets/invitations/space-invitation-protocol.ts +45 -3
  97. package/src/packlets/network/network-service.test.ts +1 -1
  98. package/src/packlets/services/automerge-host.test.ts +10 -4
  99. package/src/packlets/services/index.ts +1 -1
  100. package/src/packlets/services/service-context.test.ts +9 -6
  101. package/src/packlets/services/service-context.ts +30 -11
  102. package/src/packlets/services/service-host.ts +63 -24
  103. package/src/packlets/services/service-registry.test.ts +1 -1
  104. package/src/packlets/services/util.ts +2 -0
  105. package/src/packlets/spaces/data-space-manager.test.ts +4 -4
  106. package/src/packlets/spaces/data-space-manager.ts +48 -2
  107. package/src/packlets/spaces/data-space.ts +51 -2
  108. package/src/packlets/spaces/spaces-service.test.ts +1 -1
  109. package/src/packlets/storage/index.ts +1 -0
  110. package/src/packlets/storage/level.ts +19 -0
  111. package/src/packlets/storage/storage.ts +3 -9
  112. package/src/packlets/storage/util.ts +19 -0
  113. package/src/packlets/system/system-service.ts +1 -1
  114. package/src/packlets/testing/invitation-utils.ts +100 -97
  115. package/src/packlets/testing/test-builder.ts +42 -6
  116. package/src/packlets/vault/shared-worker-connection.ts +3 -8
  117. package/src/packlets/vault/worker-runtime.ts +27 -2
  118. package/src/packlets/vault/worker-session.ts +6 -0
  119. package/src/version.ts +1 -1
  120. package/dist/lib/browser/chunk-7PYX6UUA.mjs.map +0 -7
  121. package/dist/lib/node/chunk-4TX623I7.cjs.map +0 -7
  122. package/dist/types/src/packlets/services/diagnostics.d.ts.map +0 -1
@@ -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,
2621
- S: this,
2517
+ invariant7(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
2518
+ F: __dxlog_file8,
2519
+ L: 152,
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";
@@ -2730,220 +2918,72 @@ ClientRpcServer = _ts_decorate3([
2730
2918
  trace5.resource()
2731
2919
  ], ClientRpcServer);
2732
2920
 
2733
- // packages/sdk/client-services/src/packlets/services/diagnostics.ts
2734
- import { getFirstStreamValue } from "@dxos/codec-protobuf";
2735
- import { credentialTypeFilter } from "@dxos/credentials";
2736
- import { invariant as invariant9 } from "@dxos/invariant";
2737
- import { STORAGE_VERSION } from "@dxos/protocols";
2738
- import { SpaceMember } from "@dxos/protocols/proto/dxos/client/services";
2739
- import { TRACE_PROCESSOR } from "@dxos/tracing";
2921
+ // packages/sdk/client-services/src/packlets/spaces/data-space.ts
2922
+ import { Event as Event6, asyncTimeout, scheduleTask as scheduleTask4, sleep as sleep2, synchronized, trackLeaks } from "@dxos/async";
2923
+ import { AUTH_TIMEOUT as AUTH_TIMEOUT2 } from "@dxos/client-protocol";
2924
+ import { cancelWithContext as cancelWithContext2, Context as Context8, ContextDisposedError } from "@dxos/context";
2925
+ import { timed, warnAfterTimeout } from "@dxos/debug";
2926
+ import { createMappedFeedWriter } from "@dxos/echo-pipeline";
2927
+ import { AutomergeDocumentLoaderImpl } from "@dxos/echo-pipeline";
2928
+ import { TYPE_PROPERTIES } from "@dxos/echo-schema";
2929
+ import { failedInvariant, invariant as invariant10 } from "@dxos/invariant";
2930
+ import { PublicKey as PublicKey9 } from "@dxos/keys";
2931
+ import { log as log9 } from "@dxos/log";
2932
+ import { CancelledError, SystemError } from "@dxos/protocols";
2933
+ import { SpaceState, CreateEpochRequest } from "@dxos/protocols/proto/dxos/client/services";
2934
+ import { AdmittedFeed as AdmittedFeed3 } from "@dxos/protocols/proto/dxos/halo/credentials";
2935
+ import { Timeframe as Timeframe2 } from "@dxos/timeframe";
2936
+ import { trace as trace6 } from "@dxos/tracing";
2937
+ import { ComplexSet as ComplexSet3, assignDeep } from "@dxos/util";
2740
2938
 
2741
- // packages/sdk/client-services/src/packlets/services/platform.ts
2742
- import { Platform } from "@dxos/protocols/proto/dxos/client/services";
2743
- var getPlatform = () => {
2744
- if (process.browser) {
2745
- if (typeof window !== "undefined") {
2746
- const { userAgent } = window.navigator;
2747
- return {
2748
- type: Platform.PLATFORM_TYPE.BROWSER,
2749
- userAgent,
2750
- uptime: Math.floor((Date.now() - window.performance.timeOrigin) / 1e3)
2751
- };
2752
- } else {
2753
- return {
2754
- type: Platform.PLATFORM_TYPE.SHARED_WORKER,
2755
- uptime: Math.floor((Date.now() - performance.timeOrigin) / 1e3)
2756
- };
2939
+ // packages/sdk/client-services/src/packlets/spaces/automerge-space-state.ts
2940
+ import { Event as Event4 } from "@dxos/async";
2941
+ import { checkCredentialType } from "@dxos/credentials";
2942
+ var AutomergeSpaceState = class {
2943
+ constructor(_onNewRoot) {
2944
+ this._onNewRoot = _onNewRoot;
2945
+ this.rootUrl = void 0;
2946
+ this.lastEpoch = void 0;
2947
+ this.onNewEpoch = new Event4();
2948
+ this._isProcessingRootDocs = false;
2949
+ }
2950
+ async processCredential(credential) {
2951
+ if (!checkCredentialType(credential, "dxos.halo.credentials.Epoch")) {
2952
+ return;
2757
2953
  }
2758
- } else {
2759
- const { platform: platform2, version, arch } = process;
2760
- return {
2761
- type: Platform.PLATFORM_TYPE.NODE,
2762
- platform: platform2,
2763
- arch,
2764
- runtime: version,
2765
- uptime: Math.floor(process.uptime()),
2766
- memory: process.memoryUsage()
2767
- };
2768
- }
2769
- };
2770
-
2771
- // packages/sdk/client-services/src/version.ts
2772
- var DXOS_VERSION = "0.4.10-main.fa5a270";
2773
-
2774
- // packages/sdk/client-services/src/packlets/services/diagnostics.ts
2775
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/diagnostics.ts";
2776
- var DEFAULT_TIMEOUT = 1e3;
2777
- var createDiagnostics = async (clientServices, serviceContext, config) => {
2778
- const diagnostics = {
2779
- created: (/* @__PURE__ */ new Date()).toISOString(),
2780
- platform: getPlatform(),
2781
- client: {
2782
- version: DXOS_VERSION,
2783
- storage: {
2784
- version: STORAGE_VERSION
2785
- }
2786
- },
2787
- trace: TRACE_PROCESSOR.getDiagnostics()
2788
- };
2789
- {
2790
- invariant9(clientServices.LoggingService, "SystemService is not available.", {
2791
- F: __dxlog_file10,
2792
- L: 108,
2793
- S: void 0,
2794
- A: [
2795
- "clientServices.LoggingService",
2796
- "'SystemService is not available.'"
2797
- ]
2798
- });
2799
- diagnostics.metrics = await getFirstStreamValue(clientServices.LoggingService.queryMetrics({}), {
2800
- timeout: DEFAULT_TIMEOUT
2801
- }).catch(() => void 0);
2802
- }
2803
- if (typeof navigator !== "undefined" && navigator.storage) {
2804
- const map = /* @__PURE__ */ new Map();
2805
- const dir = await navigator.storage.getDirectory();
2806
- for await (const filename of dir?.keys()) {
2807
- const idx = filename.indexOf("-", filename.indexOf("-") + 1);
2808
- if (idx === -1) {
2809
- continue;
2810
- }
2811
- map.set(filename.slice(0, idx), (map.get(filename.slice(0, idx)) ?? 0) + 1);
2812
- }
2813
- diagnostics.storage = Array.from(map.entries()).sort((a, b) => b[1] - a[1]).map(([file, count]) => ({
2814
- file,
2815
- count
2816
- }));
2817
- }
2818
- const identity = serviceContext.identityManager.identity;
2819
- if (identity) {
2820
- diagnostics.identity = {
2821
- identityKey: identity.identityKey,
2822
- spaceKey: identity.space.key,
2823
- profile: identity.profileDocument
2824
- };
2825
- const { devices } = await getFirstStreamValue(clientServices.DevicesService.queryDevices(), {
2826
- timeout: DEFAULT_TIMEOUT
2827
- }).catch(() => void 0) ?? {};
2828
- diagnostics.devices = devices;
2829
- if (serviceContext.dataSpaceManager) {
2830
- diagnostics.spaces = await Promise.all(Array.from(serviceContext.dataSpaceManager.spaces.values()).map((space) => getSpaceStats(space)) ?? []);
2831
- }
2832
- const { feeds = [] } = await getFirstStreamValue(clientServices.DevtoolsHost.subscribeToFeeds({}), {
2833
- timeout: DEFAULT_TIMEOUT
2834
- }).catch(() => void 0) ?? {};
2835
- diagnostics.feeds = feeds.map(({ feedKey, bytes, length }) => ({
2836
- feedKey,
2837
- bytes,
2838
- length
2839
- }));
2840
- const status = await getFirstStreamValue(clientServices.NetworkService.queryStatus(), {
2841
- timeout: DEFAULT_TIMEOUT
2842
- }).catch(() => void 0);
2843
- diagnostics.networkStatus = status;
2844
- diagnostics.swarms = serviceContext.networkManager.connectionLog?.swarms;
2845
- }
2846
- diagnostics.config = config.values;
2847
- return diagnostics;
2848
- };
2849
- var getSpaceStats = async (space) => {
2850
- const stats = {
2851
- key: space.key,
2852
- metrics: space.metrics,
2853
- epochs: space.inner.spaceState.credentials.filter(credentialTypeFilter("dxos.halo.credentials.Epoch")).map((credential) => ({
2854
- ...credential.subject.assertion,
2855
- id: credential.id
2856
- })),
2857
- members: Array.from(space.inner.spaceState.members.values()).map((member) => ({
2858
- identity: {
2859
- identityKey: member.key,
2860
- profile: {
2861
- displayName: member.assertion.profile?.displayName
2862
- }
2863
- },
2864
- presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ? SpaceMember.PresenceState.ONLINE : SpaceMember.PresenceState.OFFLINE
2865
- })),
2866
- pipeline: {
2867
- // TODO(burdon): Pick properties from credentials if needed.
2868
- currentEpoch: space.automergeSpaceState.lastEpoch,
2869
- appliedEpoch: space.automergeSpaceState.lastEpoch,
2870
- controlFeeds: space.inner.controlPipeline.state.feeds.map((feed) => feed.key),
2871
- currentControlTimeframe: space.inner.controlPipeline.state.timeframe,
2872
- targetControlTimeframe: space.inner.controlPipeline.state.targetTimeframe,
2873
- totalControlTimeframe: space.inner.controlPipeline.state.endTimeframe
2874
- }
2875
- };
2876
- if (stats.metrics) {
2877
- const { open, ready } = stats.metrics;
2878
- stats.metrics.startupTime = open && ready && ready.getTime() - open.getTime();
2879
- }
2880
- return stats;
2881
- };
2882
-
2883
- // packages/sdk/client-services/src/packlets/spaces/data-space.ts
2884
- import { Event as Event6, asyncTimeout, scheduleTask as scheduleTask5, sleep as sleep2, synchronized, trackLeaks } from "@dxos/async";
2885
- import { AUTH_TIMEOUT as AUTH_TIMEOUT2 } from "@dxos/client-protocol";
2886
- import { cancelWithContext as cancelWithContext2, Context as Context8, ContextDisposedError } from "@dxos/context";
2887
- import { timed, warnAfterTimeout } from "@dxos/debug";
2888
- import { createMappedFeedWriter } from "@dxos/echo-pipeline";
2889
- import { failedInvariant, invariant as invariant11 } from "@dxos/invariant";
2890
- import { PublicKey as PublicKey8 } from "@dxos/keys";
2891
- import { log as log9 } from "@dxos/log";
2892
- import { CancelledError, SystemError } from "@dxos/protocols";
2893
- import { SpaceState, CreateEpochRequest } from "@dxos/protocols/proto/dxos/client/services";
2894
- import { AdmittedFeed as AdmittedFeed3 } from "@dxos/protocols/proto/dxos/halo/credentials";
2895
- import { Timeframe as Timeframe2 } from "@dxos/timeframe";
2896
- import { trace as trace6 } from "@dxos/tracing";
2897
- import { ComplexSet as ComplexSet3 } from "@dxos/util";
2898
-
2899
- // packages/sdk/client-services/src/packlets/spaces/automerge-space-state.ts
2900
- import { Event as Event4 } from "@dxos/async";
2901
- import { checkCredentialType } from "@dxos/credentials";
2902
- var AutomergeSpaceState = class {
2903
- constructor(_onNewRoot) {
2904
- this._onNewRoot = _onNewRoot;
2905
- this.rootUrl = void 0;
2906
- this.lastEpoch = void 0;
2907
- this.onNewEpoch = new Event4();
2908
- this._isProcessingRootDocs = false;
2909
- }
2910
- async processCredential(credential) {
2911
- if (!checkCredentialType(credential, "dxos.halo.credentials.Epoch")) {
2912
- return;
2913
- }
2914
- this.lastEpoch = credential;
2915
- if (credential.subject.assertion.automergeRoot) {
2916
- this.rootUrl = credential.subject.assertion.automergeRoot;
2917
- if (this._isProcessingRootDocs) {
2918
- this._onNewRoot(this.rootUrl);
2919
- }
2920
- }
2921
- this.onNewEpoch.emit(credential);
2922
- }
2923
- startProcessingRootDocs() {
2924
- if (this._isProcessingRootDocs) {
2925
- return;
2926
- }
2927
- if (this.rootUrl) {
2928
- this._onNewRoot(this.rootUrl);
2929
- }
2930
- this._isProcessingRootDocs = true;
2931
- }
2932
- async ensureEpochInitialized() {
2933
- await this.onNewEpoch.waitForCondition(() => !!this.lastEpoch);
2954
+ this.lastEpoch = credential;
2955
+ if (credential.subject.assertion.automergeRoot) {
2956
+ this.rootUrl = credential.subject.assertion.automergeRoot;
2957
+ if (this._isProcessingRootDocs) {
2958
+ this._onNewRoot(this.rootUrl);
2959
+ }
2960
+ }
2961
+ this.onNewEpoch.emit(credential);
2962
+ }
2963
+ startProcessingRootDocs() {
2964
+ if (this._isProcessingRootDocs) {
2965
+ return;
2966
+ }
2967
+ if (this.rootUrl) {
2968
+ this._onNewRoot(this.rootUrl);
2969
+ }
2970
+ this._isProcessingRootDocs = true;
2971
+ }
2972
+ async ensureEpochInitialized() {
2973
+ await this.onNewEpoch.waitForCondition(() => !!this.lastEpoch);
2934
2974
  }
2935
2975
  };
2936
2976
 
2937
2977
  // packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts
2938
- 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";
2939
2979
  import { Context as Context7, rejectOnDispose } from "@dxos/context";
2940
- import { invariant as invariant10 } from "@dxos/invariant";
2941
- import { PublicKey as PublicKey7 } from "@dxos/keys";
2980
+ import { invariant as invariant9 } from "@dxos/invariant";
2981
+ import { PublicKey as PublicKey8 } from "@dxos/keys";
2942
2982
  import { log as log8 } from "@dxos/log";
2943
2983
  import { schema as schema3 } from "@dxos/protocols";
2944
2984
  import { RpcExtension as RpcExtension2 } from "@dxos/teleport";
2945
2985
  import { ComplexMap as ComplexMap2, ComplexSet as ComplexSet2, entry } from "@dxos/util";
2946
- var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
2986
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
2947
2987
  var DEFAULT_RETRY_TIMEOUT = 1e3;
2948
2988
  var DEFAULT_SUCCESS_DELAY = 1e3;
2949
2989
  var DEFAULT_NOTARIZE_TIMEOUT = 1e4;
@@ -2953,8 +2993,8 @@ var NotarizationPlugin = class {
2953
2993
  this._ctx = new Context7();
2954
2994
  this._extensionOpened = new Event5();
2955
2995
  this._extensions = /* @__PURE__ */ new Set();
2956
- this._processedCredentials = new ComplexSet2(PublicKey7.hash);
2957
- this._processCredentialsTriggers = new ComplexMap2(PublicKey7.hash);
2996
+ this._processedCredentials = new ComplexSet2(PublicKey8.hash);
2997
+ this._processCredentialsTriggers = new ComplexMap2(PublicKey8.hash);
2958
2998
  }
2959
2999
  get hasWriter() {
2960
3000
  return !!this._writer;
@@ -2971,13 +3011,13 @@ var NotarizationPlugin = class {
2971
3011
  log8("notarize", {
2972
3012
  credentials
2973
3013
  }, {
2974
- F: __dxlog_file11,
3014
+ F: __dxlog_file10,
2975
3015
  L: 90,
2976
3016
  S: this,
2977
3017
  C: (f, a) => f(...a)
2978
3018
  });
2979
- invariant10(credentials.every((credential) => credential.id), "Credentials must have an id", {
2980
- F: __dxlog_file11,
3019
+ invariant9(credentials.every((credential) => credential.id), "Credentials must have an id", {
3020
+ F: __dxlog_file10,
2981
3021
  L: 91,
2982
3022
  S: this,
2983
3023
  A: [
@@ -2991,7 +3031,7 @@ var NotarizationPlugin = class {
2991
3031
  log8.warn("Notarization error", {
2992
3032
  err
2993
3033
  }, {
2994
- F: __dxlog_file11,
3034
+ F: __dxlog_file10,
2995
3035
  L: 99,
2996
3036
  S: this,
2997
3037
  C: (f, a) => f(...a)
@@ -3002,12 +3042,12 @@ var NotarizationPlugin = class {
3002
3042
  });
3003
3043
  opCtx?.onDispose(() => ctx.dispose());
3004
3044
  if (timeout !== 0) {
3005
- scheduleTask4(ctx, () => {
3045
+ scheduleTask3(ctx, () => {
3006
3046
  log8.warn("Notarization timeout", {
3007
3047
  timeout,
3008
3048
  peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)
3009
3049
  }, {
3010
- F: __dxlog_file11,
3050
+ F: __dxlog_file10,
3011
3051
  L: 111,
3012
3052
  S: this,
3013
3053
  C: (f, a) => f(...a)
@@ -3030,13 +3070,13 @@ var NotarizationPlugin = class {
3030
3070
  log8.info("Exhausted all peers to notarize with", {
3031
3071
  retryIn: retryTimeout
3032
3072
  }, {
3033
- F: __dxlog_file11,
3073
+ F: __dxlog_file10,
3034
3074
  L: 136,
3035
3075
  S: this,
3036
3076
  C: (f, a) => f(...a)
3037
3077
  });
3038
3078
  peersTried.clear();
3039
- scheduleTask4(ctx, () => notarizeTask.schedule(), retryTimeout);
3079
+ scheduleTask3(ctx, () => notarizeTask.schedule(), retryTimeout);
3040
3080
  return;
3041
3081
  }
3042
3082
  peersTried.add(peer);
@@ -3044,7 +3084,7 @@ var NotarizationPlugin = class {
3044
3084
  peer: peer.localPeerId,
3045
3085
  credentialId: credentials.map((credential) => credential.id)
3046
3086
  }, {
3047
- F: __dxlog_file11,
3087
+ F: __dxlog_file10,
3048
3088
  L: 143,
3049
3089
  S: this,
3050
3090
  C: (f, a) => f(...a)
@@ -3053,7 +3093,7 @@ var NotarizationPlugin = class {
3053
3093
  credentials: credentials.filter((credential) => !this._processedCredentials.has(credential.id))
3054
3094
  });
3055
3095
  log8("success", void 0, {
3056
- F: __dxlog_file11,
3096
+ F: __dxlog_file10,
3057
3097
  L: 147,
3058
3098
  S: this,
3059
3099
  C: (f, a) => f(...a)
@@ -3062,7 +3102,7 @@ var NotarizationPlugin = class {
3062
3102
  } catch (err) {
3063
3103
  if (!ctx.disposed && !err.message.includes(WRITER_NOT_SET_ERROR_CODE)) {
3064
3104
  log8.info("error notarizing (recoverable)", err, {
3065
- F: __dxlog_file11,
3105
+ F: __dxlog_file10,
3066
3106
  L: 151,
3067
3107
  S: this,
3068
3108
  C: (f, a) => f(...a)
@@ -3080,7 +3120,7 @@ var NotarizationPlugin = class {
3080
3120
  errors.wait()
3081
3121
  ]);
3082
3122
  log8("done", void 0, {
3083
- F: __dxlog_file11,
3123
+ F: __dxlog_file10,
3084
3124
  L: 162,
3085
3125
  S: this,
3086
3126
  C: (f, a) => f(...a)
@@ -3101,8 +3141,8 @@ var NotarizationPlugin = class {
3101
3141
  this._processCredentialsTriggers.delete(credential.id);
3102
3142
  }
3103
3143
  setWriter(writer) {
3104
- invariant10(!this._writer, "Writer already set.", {
3105
- F: __dxlog_file11,
3144
+ invariant9(!this._writer, "Writer already set.", {
3145
+ F: __dxlog_file10,
3106
3146
  L: 181,
3107
3147
  S: this,
3108
3148
  A: [
@@ -3126,8 +3166,8 @@ var NotarizationPlugin = class {
3126
3166
  throw new Error(WRITER_NOT_SET_ERROR_CODE);
3127
3167
  }
3128
3168
  for (const credential of request.credentials ?? []) {
3129
- invariant10(credential.id, "Credential must have an id", {
3130
- F: __dxlog_file11,
3169
+ invariant9(credential.id, "Credential must have an id", {
3170
+ F: __dxlog_file10,
3131
3171
  L: 200,
3132
3172
  S: this,
3133
3173
  A: [
@@ -3147,7 +3187,7 @@ var NotarizationPlugin = class {
3147
3187
  log8("extension opened", {
3148
3188
  peer: extension.localPeerId
3149
3189
  }, {
3150
- F: __dxlog_file11,
3190
+ F: __dxlog_file10,
3151
3191
  L: 211,
3152
3192
  S: this,
3153
3193
  C: (f, a) => f(...a)
@@ -3159,7 +3199,7 @@ var NotarizationPlugin = class {
3159
3199
  log8("extension closed", {
3160
3200
  peer: extension.localPeerId
3161
3201
  }, {
3162
- F: __dxlog_file11,
3202
+ F: __dxlog_file10,
3163
3203
  L: 216,
3164
3204
  S: this,
3165
3205
  C: (f, a) => f(...a)
@@ -3213,7 +3253,7 @@ function _ts_decorate4(decorators, target, key, desc) {
3213
3253
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3214
3254
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3215
3255
  }
3216
- var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
3256
+ var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
3217
3257
  var DataSpace = class {
3218
3258
  constructor(params) {
3219
3259
  this._ctx = new Context8();
@@ -3239,7 +3279,7 @@ var DataSpace = class {
3239
3279
  this._callbacks = params.callbacks ?? {};
3240
3280
  this._automergeHost = params.automergeHost;
3241
3281
  this.authVerifier = new TrustedKeySetAuthVerifier({
3242
- 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)),
3243
3283
  update: this._inner.stateUpdate,
3244
3284
  authTimeout: AUTH_TIMEOUT2
3245
3285
  });
@@ -3248,8 +3288,8 @@ var DataSpace = class {
3248
3288
  log9("new state", {
3249
3289
  state: SpaceState[this._state]
3250
3290
  }, {
3251
- F: __dxlog_file12,
3252
- L: 132,
3291
+ F: __dxlog_file11,
3292
+ L: 140,
3253
3293
  S: this,
3254
3294
  C: (f, a) => f(...a)
3255
3295
  });
@@ -3298,8 +3338,8 @@ var DataSpace = class {
3298
3338
  log9("new state", {
3299
3339
  state: SpaceState[this._state]
3300
3340
  }, {
3301
- F: __dxlog_file12,
3302
- L: 190,
3341
+ F: __dxlog_file11,
3342
+ L: 198,
3303
3343
  S: this,
3304
3344
  C: (f, a) => f(...a)
3305
3345
  });
@@ -3316,8 +3356,8 @@ var DataSpace = class {
3316
3356
  log9("new state", {
3317
3357
  state: SpaceState[this._state]
3318
3358
  }, {
3319
- F: __dxlog_file12,
3320
- L: 204,
3359
+ F: __dxlog_file11,
3360
+ L: 212,
3321
3361
  S: this,
3322
3362
  C: (f, a) => f(...a)
3323
3363
  });
@@ -3341,23 +3381,23 @@ var DataSpace = class {
3341
3381
  * Initialize the data pipeline in a separate task.
3342
3382
  */
3343
3383
  initializeDataPipelineAsync() {
3344
- scheduleTask5(this._ctx, async () => {
3384
+ scheduleTask4(this._ctx, async () => {
3345
3385
  try {
3346
3386
  this.metrics.pipelineInitBegin = /* @__PURE__ */ new Date();
3347
3387
  await this.initializeDataPipeline();
3348
3388
  } catch (err) {
3349
3389
  if (err instanceof CancelledError || err instanceof ContextDisposedError) {
3350
3390
  log9("data pipeline initialization cancelled", err, {
3351
- F: __dxlog_file12,
3352
- L: 237,
3391
+ F: __dxlog_file11,
3392
+ L: 245,
3353
3393
  S: this,
3354
3394
  C: (f, a) => f(...a)
3355
3395
  });
3356
3396
  return;
3357
3397
  }
3358
3398
  log9.error("Error initializing data pipeline", err, {
3359
- F: __dxlog_file12,
3360
- L: 241,
3399
+ F: __dxlog_file11,
3400
+ L: 249,
3361
3401
  S: this,
3362
3402
  C: (f, a) => f(...a)
3363
3403
  });
@@ -3365,8 +3405,8 @@ var DataSpace = class {
3365
3405
  log9("new state", {
3366
3406
  state: SpaceState[this._state]
3367
3407
  }, {
3368
- F: __dxlog_file12,
3369
- L: 243,
3408
+ F: __dxlog_file11,
3409
+ L: 251,
3370
3410
  S: this,
3371
3411
  C: (f, a) => f(...a)
3372
3412
  });
@@ -3385,8 +3425,8 @@ var DataSpace = class {
3385
3425
  log9("new state", {
3386
3426
  state: SpaceState[this._state]
3387
3427
  }, {
3388
- F: __dxlog_file12,
3389
- L: 259,
3428
+ F: __dxlog_file11,
3429
+ L: 267,
3390
3430
  S: this,
3391
3431
  C: (f, a) => f(...a)
3392
3432
  });
@@ -3395,8 +3435,8 @@ var DataSpace = class {
3395
3435
  this._automergeSpaceState.startProcessingRootDocs();
3396
3436
  await cancelWithContext2(this._ctx, this.automergeSpaceState.ensureEpochInitialized());
3397
3437
  log9("data pipeline ready", void 0, {
3398
- F: __dxlog_file12,
3399
- L: 271,
3438
+ F: __dxlog_file11,
3439
+ L: 279,
3400
3440
  S: this,
3401
3441
  C: (f, a) => f(...a)
3402
3442
  });
@@ -3405,8 +3445,8 @@ var DataSpace = class {
3405
3445
  log9("new state", {
3406
3446
  state: SpaceState[this._state]
3407
3447
  }, {
3408
- F: __dxlog_file12,
3409
- L: 275,
3448
+ F: __dxlog_file11,
3449
+ L: 283,
3410
3450
  S: this,
3411
3451
  C: (f, a) => f(...a)
3412
3452
  });
@@ -3421,8 +3461,8 @@ var DataSpace = class {
3421
3461
  this.metrics.controlPipelineReady = /* @__PURE__ */ new Date();
3422
3462
  await this._createWritableFeeds();
3423
3463
  log9("writable feeds created", void 0, {
3424
- F: __dxlog_file12,
3425
- L: 291,
3464
+ F: __dxlog_file11,
3465
+ L: 299,
3426
3466
  S: this,
3427
3467
  C: (f, a) => f(...a)
3428
3468
  });
@@ -3484,8 +3524,8 @@ var DataSpace = class {
3484
3524
  space: this.key,
3485
3525
  rootUrl
3486
3526
  }, {
3487
- F: __dxlog_file12,
3488
- L: 357,
3527
+ F: __dxlog_file11,
3528
+ L: 365,
3489
3529
  S: this,
3490
3530
  C: (f, a) => f(...a)
3491
3531
  });
@@ -3516,8 +3556,8 @@ var DataSpace = class {
3516
3556
  rootUrl,
3517
3557
  err
3518
3558
  }, {
3519
- F: __dxlog_file12,
3520
- L: 380,
3559
+ F: __dxlog_file11,
3560
+ L: 388,
3521
3561
  S: this,
3522
3562
  C: (f, a) => f(...a)
3523
3563
  });
@@ -3570,15 +3610,75 @@ var DataSpace = class {
3570
3610
  const rootHandle = this._automergeHost.repo.find(currentRootUrl);
3571
3611
  await cancelWithContext2(this._ctx, asyncTimeout(rootHandle.whenReady(), 1e4));
3572
3612
  const newRoot = this._automergeHost.repo.create(rootHandle.docSync());
3573
- invariant11(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3574
- F: __dxlog_file12,
3575
- L: 430,
3613
+ invariant10(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3614
+ F: __dxlog_file11,
3615
+ L: 438,
3616
+ S: this,
3617
+ A: [
3618
+ "typeof newRoot.url === 'string' && newRoot.url.length > 0",
3619
+ ""
3620
+ ]
3621
+ });
3622
+ epoch = {
3623
+ previousId: this._automergeSpaceState.lastEpoch?.id,
3624
+ number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
3625
+ timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe2(),
3626
+ automergeRoot: newRoot.url
3627
+ };
3628
+ }
3629
+ break;
3630
+ case CreateEpochRequest.Migration.FRAGMENT_AUTOMERGE_ROOT:
3631
+ {
3632
+ log9.info("Fragmenting", void 0, {
3633
+ F: __dxlog_file11,
3634
+ L: 450,
3635
+ S: this,
3636
+ C: (f, a) => f(...a)
3637
+ });
3638
+ const currentRootUrl = this._automergeSpaceState.rootUrl;
3639
+ const rootHandle = this._automergeHost.repo.find(currentRootUrl);
3640
+ await cancelWithContext2(this._ctx, asyncTimeout(rootHandle.whenReady(), 1e4));
3641
+ const objects = Object.entries(rootHandle.docSync().objects);
3642
+ const properties = objects.find(([_, value]) => value.system.type?.itemId === TYPE_PROPERTIES);
3643
+ const otherObjects = objects.filter(([key]) => key !== properties?.[0]);
3644
+ invariant10(properties, "Properties not found", {
3645
+ F: __dxlog_file11,
3646
+ L: 460,
3647
+ S: this,
3648
+ A: [
3649
+ "properties",
3650
+ "'Properties not found'"
3651
+ ]
3652
+ });
3653
+ const newSpaceDoc = {
3654
+ ...rootHandle.docSync(),
3655
+ objects: Object.fromEntries([
3656
+ properties
3657
+ ])
3658
+ };
3659
+ const newRoot = this._automergeHost.repo.create(newSpaceDoc);
3660
+ invariant10(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3661
+ F: __dxlog_file11,
3662
+ L: 465,
3576
3663
  S: this,
3577
3664
  A: [
3578
3665
  "typeof newRoot.url === 'string' && newRoot.url.length > 0",
3579
3666
  ""
3580
3667
  ]
3581
3668
  });
3669
+ const docLoader = new AutomergeDocumentLoaderImpl(this.key, this._automergeHost.repo);
3670
+ await docLoader.loadSpaceRootDocHandle(this._ctx, {
3671
+ rootUrl: newRoot.url
3672
+ });
3673
+ otherObjects.forEach(([key, value]) => {
3674
+ const handle = docLoader.createDocumentForObject(key);
3675
+ handle.change((doc) => {
3676
+ assignDeep(doc, [
3677
+ "objects",
3678
+ key
3679
+ ], value);
3680
+ });
3681
+ });
3582
3682
  epoch = {
3583
3683
  previousId: this._automergeSpaceState.lastEpoch?.id,
3584
3684
  number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
@@ -3627,8 +3727,8 @@ var DataSpace = class {
3627
3727
  log9("new state", {
3628
3728
  state: SpaceState[this._state]
3629
3729
  }, {
3630
- F: __dxlog_file12,
3631
- L: 482,
3730
+ F: __dxlog_file11,
3731
+ L: 531,
3632
3732
  S: this,
3633
3733
  C: (f, a) => f(...a)
3634
3734
  });
@@ -3685,11 +3785,11 @@ DataSpace = _ts_decorate4([
3685
3785
  import { Event as Event7, synchronized as synchronized2, trackLeaks as trackLeaks2 } from "@dxos/async";
3686
3786
  import { Context as Context9, cancelWithContext as cancelWithContext3 } from "@dxos/context";
3687
3787
  import { getCredentialAssertion as getCredentialAssertion2 } from "@dxos/credentials";
3688
- import { invariant as invariant12 } from "@dxos/invariant";
3689
- import { PublicKey as PublicKey9 } from "@dxos/keys";
3788
+ import { invariant as invariant11 } from "@dxos/invariant";
3789
+ import { PublicKey as PublicKey10 } from "@dxos/keys";
3690
3790
  import { log as log10 } from "@dxos/log";
3691
3791
  import { trace as trace7 } from "@dxos/protocols";
3692
- 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";
3693
3793
  import { Gossip as Gossip2, Presence as Presence2 } from "@dxos/teleport-extension-gossip";
3694
3794
  import { ComplexMap as ComplexMap3, deferFunction as deferFunction2, forEachAsync } from "@dxos/util";
3695
3795
 
@@ -3774,22 +3874,23 @@ function _ts_decorate5(decorators, target, key, desc) {
3774
3874
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3775
3875
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3776
3876
  }
3777
- var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
3877
+ var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
3778
3878
  var PRESENCE_ANNOUNCE_INTERVAL = 1e4;
3779
3879
  var PRESENCE_OFFLINE_TIMEOUT = 2e4;
3780
3880
  var DataSpaceManager = class {
3781
- constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _automergeHost, params) {
3881
+ constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _automergeHost, _invitationsManager, params) {
3782
3882
  this._spaceManager = _spaceManager;
3783
3883
  this._metadataStore = _metadataStore;
3784
3884
  this._keyring = _keyring;
3785
3885
  this._signingContext = _signingContext;
3786
3886
  this._feedStore = _feedStore;
3787
3887
  this._automergeHost = _automergeHost;
3888
+ this._invitationsManager = _invitationsManager;
3788
3889
  this._ctx = new Context9();
3789
3890
  this.updated = new Event7();
3790
- this._spaces = new ComplexMap3(PublicKey9.hash);
3891
+ this._spaces = new ComplexMap3(PublicKey10.hash);
3791
3892
  this._isOpen = false;
3792
- this._instanceId = PublicKey9.random().toHex();
3893
+ this._instanceId = PublicKey10.random().toHex();
3793
3894
  const { spaceMemberPresenceAnnounceInterval = PRESENCE_ANNOUNCE_INTERVAL, spaceMemberPresenceOfflineTimeout = PRESENCE_OFFLINE_TIMEOUT } = params ?? {};
3794
3895
  this._spaceMemberPresenceAnnounceInterval = spaceMemberPresenceAnnounceInterval;
3795
3896
  this._spaceMemberPresenceOfflineTimeout = spaceMemberPresenceOfflineTimeout;
@@ -3800,24 +3901,24 @@ var DataSpaceManager = class {
3800
3901
  }
3801
3902
  async open() {
3802
3903
  log10("open", void 0, {
3803
- F: __dxlog_file13,
3804
- L: 98,
3904
+ F: __dxlog_file12,
3905
+ L: 101,
3805
3906
  S: this,
3806
3907
  C: (f, a) => f(...a)
3807
3908
  });
3808
3909
  log10.trace("dxos.echo.data-space-manager.open", trace7.begin({
3809
3910
  id: this._instanceId
3810
3911
  }), {
3811
- F: __dxlog_file13,
3812
- L: 99,
3912
+ F: __dxlog_file12,
3913
+ L: 102,
3813
3914
  S: this,
3814
3915
  C: (f, a) => f(...a)
3815
3916
  });
3816
3917
  log10("metadata loaded", {
3817
3918
  spaces: this._metadataStore.spaces.length
3818
3919
  }, {
3819
- F: __dxlog_file13,
3820
- L: 100,
3920
+ F: __dxlog_file12,
3921
+ L: 103,
3821
3922
  S: this,
3822
3923
  C: (f, a) => f(...a)
3823
3924
  });
@@ -3826,8 +3927,8 @@ var DataSpaceManager = class {
3826
3927
  log10("load space", {
3827
3928
  spaceMetadata
3828
3929
  }, {
3829
- F: __dxlog_file13,
3830
- L: 104,
3930
+ F: __dxlog_file12,
3931
+ L: 107,
3831
3932
  S: this,
3832
3933
  C: (f, a) => f(...a)
3833
3934
  });
@@ -3837,8 +3938,8 @@ var DataSpaceManager = class {
3837
3938
  spaceMetadata,
3838
3939
  err
3839
3940
  }, {
3840
- F: __dxlog_file13,
3841
- L: 107,
3941
+ F: __dxlog_file12,
3942
+ L: 110,
3842
3943
  S: this,
3843
3944
  C: (f, a) => f(...a)
3844
3945
  });
@@ -3854,16 +3955,16 @@ var DataSpaceManager = class {
3854
3955
  log10.trace("dxos.echo.data-space-manager.open", trace7.end({
3855
3956
  id: this._instanceId
3856
3957
  }), {
3857
- F: __dxlog_file13,
3858
- L: 120,
3958
+ F: __dxlog_file12,
3959
+ L: 123,
3859
3960
  S: this,
3860
3961
  C: (f, a) => f(...a)
3861
3962
  });
3862
3963
  }
3863
3964
  async close() {
3864
3965
  log10("close", void 0, {
3865
- F: __dxlog_file13,
3866
- L: 125,
3966
+ F: __dxlog_file12,
3967
+ L: 128,
3867
3968
  S: this,
3868
3969
  C: (f, a) => f(...a)
3869
3970
  });
@@ -3877,9 +3978,9 @@ var DataSpaceManager = class {
3877
3978
  * Creates a new space writing the genesis credentials to the control feed.
3878
3979
  */
3879
3980
  async createSpace() {
3880
- invariant12(this._isOpen, "Not open.", {
3881
- F: __dxlog_file13,
3882
- L: 138,
3981
+ invariant11(this._isOpen, "Not open.", {
3982
+ F: __dxlog_file12,
3983
+ L: 141,
3883
3984
  S: this,
3884
3985
  A: [
3885
3986
  "this._isOpen",
@@ -3899,8 +4000,8 @@ var DataSpaceManager = class {
3899
4000
  log10("creating space...", {
3900
4001
  spaceKey
3901
4002
  }, {
3902
- F: __dxlog_file13,
3903
- L: 150,
4003
+ F: __dxlog_file12,
4004
+ L: 153,
3904
4005
  S: this,
3905
4006
  C: (f, a) => f(...a)
3906
4007
  });
@@ -3914,9 +4015,9 @@ var DataSpaceManager = class {
3914
4015
  const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner, automergeRoot.url);
3915
4016
  await this._metadataStore.addSpace(metadata);
3916
4017
  const memberCredential = credentials[1];
3917
- invariant12(getCredentialAssertion2(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
3918
- F: __dxlog_file13,
3919
- L: 163,
4018
+ invariant11(getCredentialAssertion2(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
4019
+ F: __dxlog_file12,
4020
+ L: 166,
3920
4021
  S: this,
3921
4022
  A: [
3922
4023
  "getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -3933,23 +4034,23 @@ var DataSpaceManager = class {
3933
4034
  log10("accept space", {
3934
4035
  opts
3935
4036
  }, {
3936
- F: __dxlog_file13,
3937
- L: 175,
4037
+ F: __dxlog_file12,
4038
+ L: 178,
3938
4039
  S: this,
3939
4040
  C: (f, a) => f(...a)
3940
4041
  });
3941
- invariant12(this._isOpen, "Not open.", {
3942
- F: __dxlog_file13,
3943
- L: 176,
4042
+ invariant11(this._isOpen, "Not open.", {
4043
+ F: __dxlog_file12,
4044
+ L: 179,
3944
4045
  S: this,
3945
4046
  A: [
3946
4047
  "this._isOpen",
3947
4048
  "'Not open.'"
3948
4049
  ]
3949
4050
  });
3950
- invariant12(!this._spaces.has(opts.spaceKey), "Space already exists.", {
3951
- F: __dxlog_file13,
3952
- L: 177,
4051
+ invariant11(!this._spaces.has(opts.spaceKey), "Space already exists.", {
4052
+ F: __dxlog_file12,
4053
+ L: 180,
3953
4054
  S: this,
3954
4055
  A: [
3955
4056
  "!this._spaces.has(opts.spaceKey)",
@@ -3983,8 +4084,8 @@ var DataSpaceManager = class {
3983
4084
  log10("construct space", {
3984
4085
  metadata
3985
4086
  }, {
3986
- F: __dxlog_file13,
3987
- L: 210,
4087
+ F: __dxlog_file12,
4088
+ L: 213,
3988
4089
  S: this,
3989
4090
  C: (f, a) => f(...a)
3990
4091
  });
@@ -4021,13 +4122,16 @@ var DataSpaceManager = class {
4021
4122
  },
4022
4123
  onAuthFailure: () => {
4023
4124
  log10.warn("auth failure", void 0, {
4024
- F: __dxlog_file13,
4025
- L: 247,
4125
+ F: __dxlog_file12,
4126
+ L: 250,
4026
4127
  S: this,
4027
4128
  C: (f, a) => f(...a)
4028
4129
  });
4029
4130
  },
4030
- memberKey: this._signingContext.identityKey
4131
+ memberKey: this._signingContext.identityKey,
4132
+ onDelegatedInvitationStatusChange: (invitation, isActive) => {
4133
+ return this._handleInvitationStatusChange(dataSpace, invitation, isActive);
4134
+ }
4031
4135
  });
4032
4136
  controlFeed && await space.setControlFeed(controlFeed);
4033
4137
  dataFeed && await space.setDataFeed(dataFeed);
@@ -4045,8 +4149,8 @@ var DataSpaceManager = class {
4045
4149
  log10("before space ready", {
4046
4150
  space: space.key
4047
4151
  }, {
4048
- F: __dxlog_file13,
4049
- L: 265,
4152
+ F: __dxlog_file12,
4153
+ L: 271,
4050
4154
  S: this,
4051
4155
  C: (f, a) => f(...a)
4052
4156
  });
@@ -4056,12 +4160,15 @@ var DataSpaceManager = class {
4056
4160
  space: space.key,
4057
4161
  open: this._isOpen
4058
4162
  }, {
4059
- F: __dxlog_file13,
4060
- L: 268,
4163
+ F: __dxlog_file12,
4164
+ L: 274,
4061
4165
  S: this,
4062
4166
  C: (f, a) => f(...a)
4063
4167
  });
4064
4168
  if (this._isOpen) {
4169
+ await this._createDelegatedInvitations(dataSpace, [
4170
+ ...space.spaceState.invitations.entries()
4171
+ ]);
4065
4172
  this.updated.emit();
4066
4173
  }
4067
4174
  },
@@ -4069,8 +4176,8 @@ var DataSpaceManager = class {
4069
4176
  log10("before space close", {
4070
4177
  space: space.key
4071
4178
  }, {
4072
- F: __dxlog_file13,
4073
- L: 274,
4179
+ F: __dxlog_file12,
4180
+ L: 281,
4074
4181
  S: this,
4075
4182
  C: (f, a) => f(...a)
4076
4183
  });
@@ -4088,6 +4195,41 @@ var DataSpaceManager = class {
4088
4195
  this._spaces.set(metadata.key, dataSpace);
4089
4196
  return dataSpace;
4090
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
+ }
4091
4233
  };
4092
4234
  _ts_decorate5([
4093
4235
  synchronized2
@@ -4106,14 +4248,14 @@ DataSpaceManager = _ts_decorate5([
4106
4248
  ], DataSpaceManager);
4107
4249
 
4108
4250
  // packages/sdk/client-services/src/packlets/spaces/spaces-service.ts
4109
- import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTask as scheduleTask6 } from "@dxos/async";
4251
+ import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTask as scheduleTask5 } from "@dxos/async";
4110
4252
  import { Stream as Stream10 } from "@dxos/codec-protobuf";
4111
4253
  import { raise as raise2 } from "@dxos/debug";
4112
- import { invariant as invariant13 } from "@dxos/invariant";
4254
+ import { invariant as invariant12 } from "@dxos/invariant";
4113
4255
  import { log as log11 } from "@dxos/log";
4114
4256
  import { ApiError, SpaceNotFoundError, encodeError } from "@dxos/protocols";
4115
4257
  import { SpaceMember as SpaceMember3, SpaceState as SpaceState3 } from "@dxos/protocols/proto/dxos/client/services";
4116
- var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
4258
+ var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
4117
4259
  var SpacesServiceImpl = class {
4118
4260
  constructor(_identityManager, _spaceManager, _getDataSpaceManager) {
4119
4261
  this._identityManager = _identityManager;
@@ -4152,7 +4294,7 @@ var SpacesServiceImpl = class {
4152
4294
  log11("update", {
4153
4295
  spaces
4154
4296
  }, {
4155
- F: __dxlog_file14,
4297
+ F: __dxlog_file13,
4156
4298
  L: 77,
4157
4299
  S: this,
4158
4300
  C: (f, a) => f(...a)
@@ -4163,7 +4305,7 @@ var SpacesServiceImpl = class {
4163
4305
  }, {
4164
4306
  maxFrequency: false ? void 0 : 2
4165
4307
  });
4166
- scheduleTask6(ctx, async () => {
4308
+ scheduleTask5(ctx, async () => {
4167
4309
  const dataSpaceManager = await this._getDataSpaceManager();
4168
4310
  const subscriptions = new EventSubscriptions2();
4169
4311
  ctx.onDispose(() => subscriptions.clear());
@@ -4197,7 +4339,7 @@ var SpacesServiceImpl = class {
4197
4339
  }
4198
4340
  subscribeMessages({ spaceKey, channel }) {
4199
4341
  return new Stream10(({ ctx, next }) => {
4200
- scheduleTask6(ctx, async () => {
4342
+ scheduleTask5(ctx, async () => {
4201
4343
  const dataSpaceManager = await this._getDataSpaceManager();
4202
4344
  const space = dataSpaceManager.spaces.get(spaceKey) ?? raise2(new SpaceNotFoundError(spaceKey));
4203
4345
  const handle = space.listen(getChannelId(channel), (message) => {
@@ -4216,7 +4358,7 @@ var SpacesServiceImpl = class {
4216
4358
  }
4217
4359
  };
4218
4360
  ctx.onDispose(() => space.spaceState.removeCredentialProcessor(processor));
4219
- scheduleTask6(ctx, async () => {
4361
+ scheduleTask5(ctx, async () => {
4220
4362
  await space.spaceState.addCredentialProcessor(processor);
4221
4363
  if (noTail) {
4222
4364
  close();
@@ -4234,8 +4376,8 @@ var SpacesServiceImpl = class {
4234
4376
  }
4235
4377
  });
4236
4378
  } else {
4237
- invariant13(!credential.id, "Id on unsigned credentials is not allowed", {
4238
- F: __dxlog_file14,
4379
+ invariant12(!credential.id, "Id on unsigned credentials is not allowed", {
4380
+ F: __dxlog_file13,
4239
4381
  L: 164,
4240
4382
  S: this,
4241
4383
  A: [
@@ -4243,8 +4385,8 @@ var SpacesServiceImpl = class {
4243
4385
  "'Id on unsigned credentials is not allowed'"
4244
4386
  ]
4245
4387
  });
4246
- invariant13(this._identityManager.identity, "Identity is not available", {
4247
- F: __dxlog_file14,
4388
+ invariant12(this._identityManager.identity, "Identity is not available", {
4389
+ F: __dxlog_file13,
4248
4390
  L: 165,
4249
4391
  S: this,
4250
4392
  A: [
@@ -4253,8 +4395,8 @@ var SpacesServiceImpl = class {
4253
4395
  ]
4254
4396
  });
4255
4397
  const signer = this._identityManager.identity.getIdentityCredentialSigner();
4256
- invariant13(credential.issuer.equals(signer.getIssuer()), void 0, {
4257
- F: __dxlog_file14,
4398
+ invariant12(credential.issuer.equals(signer.getIssuer()), void 0, {
4399
+ F: __dxlog_file13,
4258
4400
  L: 167,
4259
4401
  S: this,
4260
4402
  A: [
@@ -4324,27 +4466,26 @@ var getChannelId = (channel) => `user-channel/${channel}`;
4324
4466
 
4325
4467
  // packages/sdk/client-services/src/packlets/services/service-context.ts
4326
4468
  import { Trigger as Trigger5 } from "@dxos/async";
4327
- import { Context as Context10 } from "@dxos/context";
4469
+ import { Context as Context10, Resource } from "@dxos/context";
4328
4470
  import { getCredentialAssertion as getCredentialAssertion3 } from "@dxos/credentials";
4329
4471
  import { failUndefined as failUndefined2 } from "@dxos/debug";
4330
4472
  import { AutomergeHost, MetadataStore, SnapshotStore, SpaceManager, valueEncoding } from "@dxos/echo-pipeline";
4331
4473
  import { FeedFactory, FeedStore } from "@dxos/feed-store";
4332
- import { IndexMetadataStore, IndexStore, Indexer } from "@dxos/indexing";
4333
- import { invariant as invariant14 } from "@dxos/invariant";
4474
+ import { IndexMetadataStore, IndexStore, Indexer, createStorageCallbacks } from "@dxos/indexing";
4475
+ import { invariant as invariant13 } from "@dxos/invariant";
4334
4476
  import { Keyring } from "@dxos/keyring";
4335
- import { PublicKey as PublicKey10 } from "@dxos/keys";
4477
+ import { PublicKey as PublicKey11 } from "@dxos/keys";
4336
4478
  import { log as log12 } from "@dxos/log";
4337
- import { InvalidStorageVersionError, STORAGE_VERSION as STORAGE_VERSION2, trace as trace8 } from "@dxos/protocols";
4338
- import { Invitation as Invitation6 } from "@dxos/protocols/proto/dxos/client/services";
4479
+ import { InvalidStorageVersionError, STORAGE_VERSION, trace as trace8 } from "@dxos/protocols";
4480
+ import { Invitation as Invitation7 } from "@dxos/protocols/proto/dxos/client/services";
4339
4481
  import { BlobStore } from "@dxos/teleport-extension-object-sync";
4340
4482
  import { trace as Trace2 } from "@dxos/tracing";
4341
4483
  import { safeInstanceof } from "@dxos/util";
4342
4484
 
4343
4485
  // packages/sdk/client-services/src/packlets/indexing/util.ts
4344
4486
  import { getHeads } from "@dxos/automerge/automerge";
4345
- import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
4346
4487
  import { idCodec } from "@dxos/protocols";
4347
- var createLoadDocuments = (automergeHost) => (
4488
+ var createSelectedDocumentsIterator = (automergeHost) => (
4348
4489
  /**
4349
4490
  * Get object data blobs from Automerge Repo by ids.
4350
4491
  * @param ids
@@ -4353,68 +4494,19 @@ var createLoadDocuments = (automergeHost) => (
4353
4494
  async function* loadDocuments(ids) {
4354
4495
  for (const id of ids) {
4355
4496
  const { documentId, objectId } = idCodec.decode(id);
4356
- const handle = automergeHost.repo.find(documentId);
4357
- 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
+ }
4358
4501
  const doc = handle.docSync();
4359
4502
  const hash = getHeads(doc).join("");
4360
- yield [
4503
+ yield doc.objects?.[objectId] ? [
4361
4504
  {
4362
4505
  id,
4363
4506
  object: doc.objects[objectId],
4364
4507
  currentHash: hash
4365
4508
  }
4366
- ];
4367
- }
4368
- }
4369
- );
4370
- var createGetAllDocuments = (automergeHost) => (
4371
- /**
4372
- * Recursively get all object data blobs from Automerge Repo.
4373
- * @param ids
4374
- */
4375
- // TODO(mykola): Unload automerge handles after usage.
4376
- async function* getAllDocuments() {
4377
- const visited = /* @__PURE__ */ new Set();
4378
- async function* getObjectsFromHandle(handle) {
4379
- if (visited.has(handle.documentId)) {
4380
- return;
4381
- }
4382
- await warnAfterTimeout2(5e3, "to long to load doc", () => handle.whenReady());
4383
- const doc = handle.docSync();
4384
- const heads = getHeads(doc);
4385
- if (doc.objects) {
4386
- yield Object.entries(doc.objects).map(([objectId, object]) => {
4387
- return {
4388
- id: idCodec.encode({
4389
- documentId: handle.documentId,
4390
- objectId
4391
- }),
4392
- object,
4393
- currentHash: heads.at(-1)
4394
- };
4395
- });
4396
- }
4397
- if (doc.links) {
4398
- for (const id of Object.values(doc.links)) {
4399
- if (visited.has(id)) {
4400
- continue;
4401
- }
4402
- const linkHandle = automergeHost.repo.find(id);
4403
- for await (const result of getObjectsFromHandle(linkHandle)) {
4404
- yield result;
4405
- }
4406
- }
4407
- }
4408
- visited.add(handle.documentId);
4409
- }
4410
- for (const handle of Object.values(automergeHost.repo.handles)) {
4411
- if (visited.has(handle.documentId)) {
4412
- continue;
4413
- }
4414
- for await (const result of getObjectsFromHandle(handle)) {
4415
- yield result;
4416
- }
4417
- visited.add(handle.documentId);
4509
+ ] : [];
4418
4510
  }
4419
4511
  }
4420
4512
  );
@@ -4430,16 +4522,18 @@ function _ts_decorate6(decorators, target, key, desc) {
4430
4522
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
4431
4523
  return c > 3 && r && Object.defineProperty(target, key, r), r;
4432
4524
  }
4433
- var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
4434
- var ServiceContext = class {
4435
- constructor(storage, networkManager, signalManager, _runtimeParams) {
4525
+ var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
4526
+ var ServiceContext = class extends Resource {
4527
+ constructor(storage, level, networkManager, signalManager, _runtimeParams) {
4528
+ super();
4436
4529
  this.storage = storage;
4530
+ this.level = level;
4437
4531
  this.networkManager = networkManager;
4438
4532
  this.signalManager = signalManager;
4439
4533
  this._runtimeParams = _runtimeParams;
4440
4534
  this.initialized = new Trigger5();
4441
4535
  this._handlerFactories = /* @__PURE__ */ new Map();
4442
- this._instanceId = PublicKey10.random().toHex();
4536
+ this._instanceId = PublicKey11.random().toHex();
4443
4537
  this.metadataStore = new MetadataStore(storage.createDirectory("metadata"));
4444
4538
  this.snapshotStore = new SnapshotStore(storage.createDirectory("snapshots"));
4445
4539
  this.blobStore = new BlobStore(storage.createDirectory("blobs"));
@@ -4463,66 +4557,81 @@ var ServiceContext = class {
4463
4557
  });
4464
4558
  this.identityManager = new IdentityManager(this.metadataStore, this.keyring, this.feedStore, this.spaceManager, this._runtimeParams);
4465
4559
  this.indexMetadata = new IndexMetadataStore({
4466
- directory: storage.createDirectory("index-metadata")
4560
+ db: level.sublevel("index-metadata")
4467
4561
  });
4468
4562
  this.automergeHost = new AutomergeHost({
4469
4563
  directory: storage.createDirectory("automerge"),
4470
- metadata: this.indexMetadata
4564
+ db: level.sublevel("automerge"),
4565
+ storageCallbacks: createStorageCallbacks({
4566
+ host: () => this.automergeHost,
4567
+ metadata: this.indexMetadata
4568
+ })
4471
4569
  });
4472
4570
  this.indexer = new Indexer({
4571
+ db: this.level,
4473
4572
  indexStore: new IndexStore({
4474
- directory: storage.createDirectory("index-store")
4573
+ db: level.sublevel("index-storage")
4475
4574
  }),
4476
4575
  metadataStore: this.indexMetadata,
4477
- loadDocuments: createLoadDocuments(this.automergeHost),
4478
- getAllDocuments: createGetAllDocuments(this.automergeHost)
4576
+ loadDocuments: createSelectedDocumentsIterator(this.automergeHost)
4479
4577
  });
4480
4578
  this.invitations = new InvitationsHandler(this.networkManager);
4481
- 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)));
4482
4581
  }
4483
- async open(ctx) {
4582
+ async _open(ctx) {
4484
4583
  await this._checkStorageVersion();
4485
4584
  log12("opening...", void 0, {
4486
- F: __dxlog_file15,
4487
- L: 151,
4585
+ F: __dxlog_file14,
4586
+ L: 164,
4488
4587
  S: this,
4489
4588
  C: (f, a) => f(...a)
4490
4589
  });
4491
4590
  log12.trace("dxos.sdk.service-context.open", trace8.begin({
4492
4591
  id: this._instanceId
4493
4592
  }), {
4494
- F: __dxlog_file15,
4495
- L: 152,
4593
+ F: __dxlog_file14,
4594
+ L: 165,
4496
4595
  S: this,
4497
4596
  C: (f, a) => f(...a)
4498
4597
  });
4499
4598
  await this.signalManager.open();
4500
4599
  await this.networkManager.open();
4600
+ await this.automergeHost.open();
4501
4601
  await this.metadataStore.load();
4502
4602
  await this.spaceManager.open();
4503
4603
  await this.identityManager.open(ctx);
4504
4604
  if (this.identityManager.identity) {
4505
4605
  await this._initialize(ctx);
4506
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
+ });
4507
4616
  log12.trace("dxos.sdk.service-context.open", trace8.end({
4508
4617
  id: this._instanceId
4509
4618
  }), {
4510
- F: __dxlog_file15,
4511
- L: 162,
4619
+ F: __dxlog_file14,
4620
+ L: 180,
4512
4621
  S: this,
4513
4622
  C: (f, a) => f(...a)
4514
4623
  });
4515
4624
  log12("opened", void 0, {
4516
- F: __dxlog_file15,
4517
- L: 163,
4625
+ F: __dxlog_file14,
4626
+ L: 181,
4518
4627
  S: this,
4519
4628
  C: (f, a) => f(...a)
4520
4629
  });
4521
4630
  }
4522
- async close() {
4631
+ async _close() {
4523
4632
  log12("closing...", void 0, {
4524
- F: __dxlog_file15,
4525
- L: 167,
4633
+ F: __dxlog_file14,
4634
+ L: 185,
4526
4635
  S: this,
4527
4636
  C: (f, a) => f(...a)
4528
4637
  });
@@ -4539,8 +4648,8 @@ var ServiceContext = class {
4539
4648
  await this.metadataStore.close();
4540
4649
  await this.indexer.destroy();
4541
4650
  log12("closed", void 0, {
4542
- F: __dxlog_file15,
4543
- L: 180,
4651
+ F: __dxlog_file14,
4652
+ L: 198,
4544
4653
  S: this,
4545
4654
  C: (f, a) => f(...a)
4546
4655
  });
@@ -4552,9 +4661,9 @@ var ServiceContext = class {
4552
4661
  }
4553
4662
  getInvitationHandler(invitation) {
4554
4663
  const factory = this._handlerFactories.get(invitation.kind);
4555
- invariant14(factory, `Unknown invitation kind: ${invitation.kind}`, {
4556
- F: __dxlog_file15,
4557
- L: 191,
4664
+ invariant13(factory, `Unknown invitation kind: ${invitation.kind}`, {
4665
+ F: __dxlog_file14,
4666
+ L: 209,
4558
4667
  S: this,
4559
4668
  A: [
4560
4669
  "factory",
@@ -4578,15 +4687,15 @@ var ServiceContext = class {
4578
4687
  }
4579
4688
  async _checkStorageVersion() {
4580
4689
  await this.metadataStore.load();
4581
- if (this.metadataStore.version !== STORAGE_VERSION2) {
4582
- throw new InvalidStorageVersionError(STORAGE_VERSION2, this.metadataStore.version);
4690
+ if (this.metadataStore.version !== STORAGE_VERSION) {
4691
+ throw new InvalidStorageVersionError(STORAGE_VERSION, this.metadataStore.version);
4583
4692
  }
4584
4693
  }
4585
4694
  // Called when identity is created.
4586
4695
  async _initialize(ctx) {
4587
4696
  log12("initializing spaces...", void 0, {
4588
- F: __dxlog_file15,
4589
- L: 222,
4697
+ F: __dxlog_file14,
4698
+ L: 240,
4590
4699
  S: this,
4591
4700
  C: (f, a) => f(...a)
4592
4701
  });
@@ -4604,12 +4713,12 @@ var ServiceContext = class {
4604
4713
  });
4605
4714
  }
4606
4715
  };
4607
- 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);
4608
4717
  await this.dataSpaceManager.open();
4609
- this._handlerFactories.set(Invitation6.Kind.SPACE, (invitation) => {
4610
- invariant14(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
4611
- F: __dxlog_file15,
4612
- L: 246,
4718
+ this._handlerFactories.set(Invitation7.Kind.SPACE, (invitation) => {
4719
+ invariant13(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
4720
+ F: __dxlog_file14,
4721
+ L: 265,
4613
4722
  S: this,
4614
4723
  A: [
4615
4724
  "this.dataSpaceManager",
@@ -4632,8 +4741,8 @@ var ServiceContext = class {
4632
4741
  log12("dataSpaceManager not initialized yet, ignoring space admission", {
4633
4742
  details: assertion
4634
4743
  }, {
4635
- F: __dxlog_file15,
4636
- L: 262,
4744
+ F: __dxlog_file14,
4745
+ L: 281,
4637
4746
  S: this,
4638
4747
  C: (f, a) => f(...a)
4639
4748
  });
@@ -4643,8 +4752,8 @@ var ServiceContext = class {
4643
4752
  log12("space already exists, ignoring space admission", {
4644
4753
  details: assertion
4645
4754
  }, {
4646
- F: __dxlog_file15,
4647
- L: 266,
4755
+ F: __dxlog_file14,
4756
+ L: 285,
4648
4757
  S: this,
4649
4758
  C: (f, a) => f(...a)
4650
4759
  });
@@ -4654,8 +4763,8 @@ var ServiceContext = class {
4654
4763
  log12("accepting space recorded in halo", {
4655
4764
  details: assertion
4656
4765
  }, {
4657
- F: __dxlog_file15,
4658
- L: 271,
4766
+ F: __dxlog_file14,
4767
+ L: 290,
4659
4768
  S: this,
4660
4769
  C: (f, a) => f(...a)
4661
4770
  });
@@ -4665,8 +4774,8 @@ var ServiceContext = class {
4665
4774
  });
4666
4775
  } catch (err) {
4667
4776
  log12.catch(err, void 0, {
4668
- F: __dxlog_file15,
4669
- L: 277,
4777
+ F: __dxlog_file14,
4778
+ L: 296,
4670
4779
  S: this,
4671
4780
  C: (f, a) => f(...a)
4672
4781
  });
@@ -4678,7 +4787,7 @@ var ServiceContext = class {
4678
4787
  };
4679
4788
  _ts_decorate6([
4680
4789
  Trace2.span()
4681
- ], ServiceContext.prototype, "open", null);
4790
+ ], ServiceContext.prototype, "_open", null);
4682
4791
  _ts_decorate6([
4683
4792
  Trace2.span()
4684
4793
  ], ServiceContext.prototype, "_initialize", null);
@@ -4711,195 +4820,271 @@ var ServiceRegistry = class {
4711
4820
  }
4712
4821
  };
4713
4822
 
4714
- // packages/sdk/client-services/src/packlets/locks/browser.ts
4715
- import { asyncTimeout as asyncTimeout2, Trigger as Trigger6 } from "@dxos/async";
4716
- import { RESOURCE_LOCK_TIMEOUT } from "@dxos/client-protocol";
4717
- import { log as log13, logInfo } from "@dxos/log";
4718
- function _ts_decorate7(decorators, target, key, desc) {
4719
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4720
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
4721
- r = Reflect.decorate(decorators, target, key, desc);
4722
- else
4723
- for (var i = decorators.length - 1; i >= 0; i--)
4724
- if (d = decorators[i])
4725
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
4726
- return c > 3 && r && Object.defineProperty(target, key, r), r;
4727
- }
4728
- var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
4729
- var Message;
4730
- (function(Message2) {
4731
- Message2["ACQUIRING"] = "acquiring";
4732
- })(Message || (Message = {}));
4733
- var Lock = class {
4734
- constructor({ lockKey, onAcquire, onRelease }) {
4735
- this._broadcastChannel = new BroadcastChannel("vault-resource-lock");
4736
- this._releaseTrigger = new Trigger6();
4737
- this._lockKey = lockKey;
4738
- this._onAcquire = onAcquire;
4739
- this._onRelease = onRelease;
4740
- this._broadcastChannel.onmessage = this._onMessage.bind(this);
4741
- }
4742
- get lockKey() {
4743
- return this._lockKey;
4744
- }
4745
- async acquire() {
4746
- this._broadcastChannel.postMessage({
4747
- message: "acquiring"
4748
- });
4749
- try {
4750
- log13("aquiring lock...", void 0, {
4751
- F: __dxlog_file16,
4752
- L: 42,
4753
- S: this,
4754
- C: (f, a) => f(...a)
4755
- });
4756
- await asyncTimeout2(this._requestLock(), RESOURCE_LOCK_TIMEOUT);
4757
- log13("acquired lock", void 0, {
4758
- F: __dxlog_file16,
4759
- L: 44,
4760
- S: this,
4761
- C: (f, a) => f(...a)
4762
- });
4763
- } catch {
4764
- log13("stealing lock...", void 0, {
4765
- F: __dxlog_file16,
4766
- L: 46,
4767
- S: this,
4768
- C: (f, a) => f(...a)
4769
- });
4770
- await this._requestLock(true);
4771
- log13("stolen lock", void 0, {
4772
- F: __dxlog_file16,
4773
- L: 48,
4774
- S: this,
4775
- C: (f, a) => f(...a)
4776
- });
4823
+ // packages/sdk/client-services/src/packlets/diagnostics/diagnostics.ts
4824
+ import { getFirstStreamValue } from "@dxos/codec-protobuf";
4825
+ import { credentialTypeFilter } from "@dxos/credentials";
4826
+ import { invariant as invariant14 } from "@dxos/invariant";
4827
+ import { STORAGE_VERSION as STORAGE_VERSION2 } from "@dxos/protocols";
4828
+ import { SpaceMember as SpaceMember4 } from "@dxos/protocols/proto/dxos/client/services";
4829
+ import { TRACE_PROCESSOR } from "@dxos/tracing";
4830
+
4831
+ // packages/sdk/client-services/src/version.ts
4832
+ var DXOS_VERSION = "0.4.10-main.fd8ea31";
4833
+
4834
+ // packages/sdk/client-services/src/packlets/services/platform.ts
4835
+ import { Platform } from "@dxos/protocols/proto/dxos/client/services";
4836
+ var getPlatform = () => {
4837
+ if (process.browser) {
4838
+ if (typeof window !== "undefined") {
4839
+ const { userAgent } = window.navigator;
4840
+ return {
4841
+ type: Platform.PLATFORM_TYPE.BROWSER,
4842
+ userAgent,
4843
+ uptime: Math.floor((Date.now() - window.performance.timeOrigin) / 1e3)
4844
+ };
4845
+ } else {
4846
+ return {
4847
+ type: Platform.PLATFORM_TYPE.SHARED_WORKER,
4848
+ uptime: Math.floor((Date.now() - performance.timeOrigin) / 1e3)
4849
+ };
4777
4850
  }
4851
+ } else {
4852
+ const { platform: platform2, version, arch } = process;
4853
+ return {
4854
+ type: Platform.PLATFORM_TYPE.NODE,
4855
+ platform: platform2,
4856
+ arch,
4857
+ runtime: version,
4858
+ uptime: Math.floor(process.uptime()),
4859
+ memory: process.memoryUsage()
4860
+ };
4778
4861
  }
4779
- async release() {
4780
- this._releaseTrigger.wake();
4862
+ };
4863
+
4864
+ // packages/sdk/client-services/src/packlets/diagnostics/diagnostics.ts
4865
+ var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/diagnostics.ts";
4866
+ var DEFAULT_TIMEOUT = 1e3;
4867
+ var createDiagnostics = async (clientServices, serviceContext, config) => {
4868
+ const diagnostics = {
4869
+ created: (/* @__PURE__ */ new Date()).toISOString(),
4870
+ platform: getPlatform(),
4871
+ client: {
4872
+ version: DXOS_VERSION,
4873
+ storage: {
4874
+ version: STORAGE_VERSION2
4875
+ }
4876
+ },
4877
+ trace: TRACE_PROCESSOR.getDiagnostics()
4878
+ };
4879
+ {
4880
+ invariant14(clientServices.LoggingService, "SystemService is not available.", {
4881
+ F: __dxlog_file15,
4882
+ L: 108,
4883
+ S: void 0,
4884
+ A: [
4885
+ "clientServices.LoggingService",
4886
+ "'SystemService is not available.'"
4887
+ ]
4888
+ });
4889
+ diagnostics.metrics = await getFirstStreamValue(clientServices.LoggingService.queryMetrics({}), {
4890
+ timeout: DEFAULT_TIMEOUT
4891
+ }).catch(() => void 0);
4781
4892
  }
4782
- _onMessage(event) {
4783
- if (event.data.message === "acquiring") {
4784
- this._releaseTrigger.wake();
4893
+ if (typeof navigator !== "undefined" && navigator.storage) {
4894
+ const map = /* @__PURE__ */ new Map();
4895
+ const dir = await navigator.storage.getDirectory();
4896
+ for await (const filename of dir?.keys()) {
4897
+ const idx = filename.indexOf("-", filename.indexOf("-") + 1);
4898
+ if (idx === -1) {
4899
+ continue;
4900
+ }
4901
+ map.set(filename.slice(0, idx), (map.get(filename.slice(0, idx)) ?? 0) + 1);
4785
4902
  }
4903
+ diagnostics.storage = Array.from(map.entries()).sort((a, b) => b[1] - a[1]).map(([file, count]) => ({
4904
+ file,
4905
+ count
4906
+ }));
4786
4907
  }
4787
- async _requestLock(steal = false) {
4788
- log13("requesting lock...", {
4789
- steal
4790
- }, {
4791
- F: __dxlog_file16,
4792
- L: 63,
4793
- S: this,
4794
- C: (f, a) => f(...a)
4795
- });
4796
- const acquired = new Trigger6();
4797
- void navigator.locks.request(this._lockKey, {
4798
- steal
4799
- }, async () => {
4800
- await this._onAcquire?.();
4801
- acquired.wake();
4802
- this._releaseTrigger = new Trigger6();
4803
- await this._releaseTrigger.wait();
4804
- log13("releasing lock...", void 0, {
4805
- F: __dxlog_file16,
4806
- L: 72,
4807
- S: this,
4808
- C: (f, a) => f(...a)
4809
- });
4810
- await this._onRelease?.();
4811
- log13("released lock", void 0, {
4812
- F: __dxlog_file16,
4813
- L: 74,
4814
- S: this,
4815
- C: (f, a) => f(...a)
4816
- });
4817
- }).catch(async () => {
4818
- await this._onRelease?.();
4819
- });
4820
- await acquired.wait();
4821
- log13("recieved lock", {
4822
- steal
4823
- }, {
4824
- F: __dxlog_file16,
4825
- L: 81,
4826
- S: this,
4827
- C: (f, a) => f(...a)
4828
- });
4908
+ const identity = serviceContext.identityManager.identity;
4909
+ if (identity) {
4910
+ diagnostics.identity = {
4911
+ identityKey: identity.identityKey,
4912
+ spaceKey: identity.space.key,
4913
+ profile: identity.profileDocument
4914
+ };
4915
+ const { devices } = await getFirstStreamValue(clientServices.DevicesService.queryDevices(), {
4916
+ timeout: DEFAULT_TIMEOUT
4917
+ }).catch(() => void 0) ?? {};
4918
+ diagnostics.devices = devices;
4919
+ if (serviceContext.dataSpaceManager) {
4920
+ diagnostics.spaces = await Promise.all(Array.from(serviceContext.dataSpaceManager.spaces.values()).map((space) => getSpaceStats(space)) ?? []);
4921
+ }
4922
+ const { feeds = [] } = await getFirstStreamValue(clientServices.DevtoolsHost.subscribeToFeeds({}), {
4923
+ timeout: DEFAULT_TIMEOUT
4924
+ }).catch(() => void 0) ?? {};
4925
+ diagnostics.feeds = feeds.map(({ feedKey, bytes, length }) => ({
4926
+ feedKey,
4927
+ bytes,
4928
+ length
4929
+ }));
4930
+ const status = await getFirstStreamValue(clientServices.NetworkService.queryStatus(), {
4931
+ timeout: DEFAULT_TIMEOUT
4932
+ }).catch(() => void 0);
4933
+ diagnostics.networkStatus = status;
4934
+ diagnostics.swarms = serviceContext.networkManager.connectionLog?.swarms;
4829
4935
  }
4936
+ diagnostics.config = config.values;
4937
+ return diagnostics;
4830
4938
  };
4831
- _ts_decorate7([
4832
- logInfo
4833
- ], Lock.prototype, "lockKey", null);
4834
- var isLocked = (lockPath) => {
4835
- throw new Error("Not implemented");
4939
+ var getSpaceStats = async (space) => {
4940
+ const stats = {
4941
+ key: space.key,
4942
+ metrics: space.metrics,
4943
+ epochs: space.inner.spaceState.credentials.filter(credentialTypeFilter("dxos.halo.credentials.Epoch")).map((credential) => ({
4944
+ ...credential.subject.assertion,
4945
+ id: credential.id
4946
+ })),
4947
+ members: Array.from(space.inner.spaceState.members.values()).map((member) => ({
4948
+ identity: {
4949
+ identityKey: member.key,
4950
+ profile: {
4951
+ displayName: member.assertion.profile?.displayName
4952
+ }
4953
+ },
4954
+ presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ? SpaceMember4.PresenceState.ONLINE : SpaceMember4.PresenceState.OFFLINE
4955
+ })),
4956
+ pipeline: {
4957
+ // TODO(burdon): Pick properties from credentials if needed.
4958
+ currentEpoch: space.automergeSpaceState.lastEpoch,
4959
+ appliedEpoch: space.automergeSpaceState.lastEpoch,
4960
+ controlFeeds: space.inner.controlPipeline.state.feeds.map((feed) => feed.key),
4961
+ currentControlTimeframe: space.inner.controlPipeline.state.timeframe,
4962
+ targetControlTimeframe: space.inner.controlPipeline.state.targetTimeframe,
4963
+ totalControlTimeframe: space.inner.controlPipeline.state.endTimeframe
4964
+ }
4965
+ };
4966
+ if (stats.metrics) {
4967
+ const { open, ready } = stats.metrics;
4968
+ stats.metrics.startupTime = open && ready && ready.getTime() - open.getTime();
4969
+ }
4970
+ return stats;
4836
4971
  };
4837
4972
 
4838
- // packages/sdk/client-services/src/packlets/storage/storage.ts
4839
- import { DX_DATA } from "@dxos/client-protocol";
4840
- import { InvalidConfigError } from "@dxos/protocols";
4841
- import { Runtime } from "@dxos/protocols/proto/dxos/config";
4842
- import { createStorage, StorageType } from "@dxos/random-access-storage";
4843
- import { isNode as isNode2 } from "@dxos/util";
4844
- var StorageDriver = Runtime.Client.Storage.StorageDriver;
4845
- var createStorageObjects = (config) => {
4846
- const { persistent = false, keyStore, dataStore, dataRoot = isNode2() ? DX_DATA : "dxos/storage" } = config ?? {};
4847
- if (persistent && dataStore === StorageDriver.RAM) {
4848
- throw new InvalidConfigError("RAM storage cannot be used in persistent mode.");
4849
- }
4850
- if (!persistent && dataStore !== void 0 && dataStore !== StorageDriver.RAM) {
4851
- throw new InvalidConfigError("Cannot use a persistent storage in not persistent mode.");
4852
- }
4853
- if (persistent && keyStore === StorageDriver.RAM) {
4854
- throw new InvalidConfigError("RAM key storage cannot be used in persistent mode.");
4855
- }
4856
- if (!persistent && keyStore !== StorageDriver.RAM && keyStore !== void 0) {
4857
- throw new InvalidConfigError("Cannot use a persistent key storage in not persistent mode.");
4858
- }
4973
+ // packages/sdk/client-services/src/packlets/diagnostics/browser-diagnostics-broadcast.ts
4974
+ import { Trigger as Trigger6 } from "@dxos/async";
4975
+ import { log as log13 } from "@dxos/log";
4976
+ var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/browser-diagnostics-broadcast.ts";
4977
+ var CHANNEL_NAME = "dxos.diagnostics.broadcast";
4978
+ var MessageType;
4979
+ (function(MessageType2) {
4980
+ MessageType2["PROBE"] = "probe";
4981
+ MessageType2["PROBE_ACK"] = "probe-ack";
4982
+ MessageType2["REQUEST_DIAGNOSTICS"] = "request-diagnostics";
4983
+ MessageType2["RECEIVE_DIAGNOSTICS"] = "receive-diagnostics";
4984
+ })(MessageType || (MessageType = {}));
4985
+ var createCollectDiagnosticsBroadcastSender = () => {
4859
4986
  return {
4860
- storage: createStorage({
4861
- type: persistent ? toStorageType(dataStore) : StorageType.RAM,
4862
- root: `${dataRoot}/`
4863
- })
4987
+ broadcastDiagnosticsRequest: async () => {
4988
+ let expectedResponse = "probe-ack";
4989
+ let channel;
4990
+ try {
4991
+ const trigger = new Trigger6();
4992
+ channel = new BroadcastChannel(CHANNEL_NAME);
4993
+ channel.onmessage = (msg) => {
4994
+ if (expectedResponse === msg.data.type) {
4995
+ trigger.wake(msg.data);
4996
+ }
4997
+ };
4998
+ channel.postMessage({
4999
+ type: "probe"
5000
+ });
5001
+ await trigger.wait({
5002
+ timeout: 200
5003
+ });
5004
+ expectedResponse = "receive-diagnostics";
5005
+ trigger.reset();
5006
+ channel.postMessage({
5007
+ type: "request-diagnostics"
5008
+ });
5009
+ const diagnostics = await trigger.wait({
5010
+ timeout: 5e3
5011
+ });
5012
+ return diagnostics.payload;
5013
+ } catch (e) {
5014
+ const errorDescription = e instanceof Error ? e.message : JSON.stringify(e);
5015
+ return {
5016
+ expectedResponse,
5017
+ errorDescription
5018
+ };
5019
+ } finally {
5020
+ safeClose(channel);
5021
+ }
5022
+ }
5023
+ };
5024
+ };
5025
+ var createCollectDiagnosticsBroadcastHandler = (systemService) => {
5026
+ let channel;
5027
+ return {
5028
+ start: () => {
5029
+ channel = new BroadcastChannel(CHANNEL_NAME);
5030
+ channel.onmessage = async (message) => {
5031
+ try {
5032
+ if (message.data.type === "probe") {
5033
+ channel?.postMessage({
5034
+ type: "probe-ack"
5035
+ });
5036
+ } else if (message.data.type === "request-diagnostics") {
5037
+ const diagnostics = await systemService.getDiagnostics({});
5038
+ channel?.postMessage({
5039
+ type: "receive-diagnostics",
5040
+ payload: diagnostics
5041
+ });
5042
+ }
5043
+ } catch (error) {
5044
+ log13.catch(error, void 0, {
5045
+ F: __dxlog_file16,
5046
+ L: 77,
5047
+ S: void 0,
5048
+ C: (f, a) => f(...a)
5049
+ });
5050
+ }
5051
+ };
5052
+ },
5053
+ stop: () => {
5054
+ safeClose(channel);
5055
+ channel = void 0;
5056
+ }
4864
5057
  };
4865
5058
  };
4866
- var toStorageType = (type) => {
4867
- switch (type) {
4868
- case void 0:
4869
- return void 0;
4870
- case StorageDriver.RAM:
4871
- return StorageType.RAM;
4872
- case StorageDriver.CHROME:
4873
- return StorageType.CHROME;
4874
- case StorageDriver.FIREFOX:
4875
- return StorageType.FIREFOX;
4876
- case StorageDriver.IDB:
4877
- return StorageType.IDB;
4878
- case StorageDriver.NODE:
4879
- return StorageType.NODE;
4880
- case StorageDriver.WEBFS:
4881
- return StorageType.WEBFS;
4882
- default:
4883
- throw new Error(`Invalid storage type: ${StorageDriver[type]}`);
5059
+ var safeClose = (channel) => {
5060
+ try {
5061
+ channel?.close();
5062
+ } catch (e) {
4884
5063
  }
4885
5064
  };
4886
5065
 
5066
+ // packages/sdk/client-services/src/packlets/diagnostics/diagnostics-collector.ts
5067
+ import { ConfigResource } from "@dxos/config";
5068
+ import { GetDiagnosticsRequest as GetDiagnosticsRequest2 } from "@dxos/protocols/proto/dxos/client/services";
5069
+ import { TRACE_PROCESSOR as TRACE_PROCESSOR3 } from "@dxos/tracing";
5070
+ import { jsonKeyReplacer as jsonKeyReplacer2, nonNullable } from "@dxos/util";
5071
+
4887
5072
  // packages/sdk/client-services/src/packlets/services/service-host.ts
4888
5073
  import { Event as Event9, synchronized as synchronized3 } from "@dxos/async";
4889
- import { Properties, clientServiceBundle, defaultKey } from "@dxos/client-protocol";
5074
+ import { clientServiceBundle, defaultKey, Properties } from "@dxos/client-protocol";
4890
5075
  import { Context as Context11 } from "@dxos/context";
4891
- import { DataServiceImpl } from "@dxos/echo-pipeline";
4892
- import { getAutomergeObjectCore, getRawDoc } from "@dxos/echo-schema";
4893
- import { IndexServiceImpl } from "@dxos/indexing";
5076
+ import { DataServiceImpl, encodeReference } from "@dxos/echo-pipeline";
5077
+ import { getTypeReference } from "@dxos/echo-schema";
5078
+ import { QueryServiceImpl } from "@dxos/indexing";
4894
5079
  import { invariant as invariant16 } from "@dxos/invariant";
4895
- import { PublicKey as PublicKey12 } from "@dxos/keys";
4896
- import { log as log15 } from "@dxos/log";
5080
+ import { PublicKey as PublicKey14 } from "@dxos/keys";
5081
+ import { log as log16 } from "@dxos/log";
4897
5082
  import { WebsocketSignalManager } from "@dxos/messaging";
4898
5083
  import { NetworkManager, createSimplePeerTransportFactory } from "@dxos/network-manager";
4899
5084
  import { trace as trace9 } from "@dxos/protocols";
4900
5085
  import { SystemStatus } from "@dxos/protocols/proto/dxos/client/services";
4901
5086
  import { TRACE_PROCESSOR as TRACE_PROCESSOR2, trace as Trace3 } from "@dxos/tracing";
4902
- import { assignDeep } from "@dxos/util";
5087
+ import { assignDeep as assignDeep2 } from "@dxos/util";
4903
5088
  import { WebsocketRpcClient } from "@dxos/websocket-rpc";
4904
5089
 
4905
5090
  // packages/sdk/client-services/src/packlets/devices/devices-service.ts
@@ -4984,28 +5169,152 @@ var DevicesServiceImpl = class {
4984
5169
  }
4985
5170
  };
4986
5171
 
5172
+ // packages/sdk/client-services/src/packlets/locks/browser.ts
5173
+ import { asyncTimeout as asyncTimeout2, Trigger as Trigger7 } from "@dxos/async";
5174
+ import { RESOURCE_LOCK_TIMEOUT } from "@dxos/client-protocol";
5175
+ import { log as log14, logInfo } from "@dxos/log";
5176
+ function _ts_decorate7(decorators, target, key, desc) {
5177
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5178
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
5179
+ r = Reflect.decorate(decorators, target, key, desc);
5180
+ else
5181
+ for (var i = decorators.length - 1; i >= 0; i--)
5182
+ if (d = decorators[i])
5183
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5184
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
5185
+ }
5186
+ var __dxlog_file18 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
5187
+ var Message;
5188
+ (function(Message2) {
5189
+ Message2["ACQUIRING"] = "acquiring";
5190
+ })(Message || (Message = {}));
5191
+ var Lock = class {
5192
+ constructor({ lockKey, onAcquire, onRelease }) {
5193
+ this._broadcastChannel = new BroadcastChannel("vault-resource-lock");
5194
+ this._releaseTrigger = new Trigger7();
5195
+ this._lockKey = lockKey;
5196
+ this._onAcquire = onAcquire;
5197
+ this._onRelease = onRelease;
5198
+ this._broadcastChannel.onmessage = this._onMessage.bind(this);
5199
+ }
5200
+ get lockKey() {
5201
+ return this._lockKey;
5202
+ }
5203
+ async acquire() {
5204
+ this._broadcastChannel.postMessage({
5205
+ message: "acquiring"
5206
+ });
5207
+ try {
5208
+ log14("aquiring lock...", void 0, {
5209
+ F: __dxlog_file18,
5210
+ L: 42,
5211
+ S: this,
5212
+ C: (f, a) => f(...a)
5213
+ });
5214
+ await asyncTimeout2(this._requestLock(), RESOURCE_LOCK_TIMEOUT);
5215
+ log14("acquired lock", void 0, {
5216
+ F: __dxlog_file18,
5217
+ L: 44,
5218
+ S: this,
5219
+ C: (f, a) => f(...a)
5220
+ });
5221
+ } catch {
5222
+ log14("stealing lock...", void 0, {
5223
+ F: __dxlog_file18,
5224
+ L: 46,
5225
+ S: this,
5226
+ C: (f, a) => f(...a)
5227
+ });
5228
+ await this._requestLock(true);
5229
+ log14("stolen lock", void 0, {
5230
+ F: __dxlog_file18,
5231
+ L: 48,
5232
+ S: this,
5233
+ C: (f, a) => f(...a)
5234
+ });
5235
+ }
5236
+ }
5237
+ async release() {
5238
+ this._releaseTrigger.wake();
5239
+ }
5240
+ _onMessage(event) {
5241
+ if (event.data.message === "acquiring") {
5242
+ this._releaseTrigger.wake();
5243
+ }
5244
+ }
5245
+ async _requestLock(steal = false) {
5246
+ log14("requesting lock...", {
5247
+ steal
5248
+ }, {
5249
+ F: __dxlog_file18,
5250
+ L: 63,
5251
+ S: this,
5252
+ C: (f, a) => f(...a)
5253
+ });
5254
+ const acquired = new Trigger7();
5255
+ void navigator.locks.request(this._lockKey, {
5256
+ steal
5257
+ }, async () => {
5258
+ await this._onAcquire?.();
5259
+ acquired.wake();
5260
+ this._releaseTrigger = new Trigger7();
5261
+ await this._releaseTrigger.wait();
5262
+ log14("releasing lock...", void 0, {
5263
+ F: __dxlog_file18,
5264
+ L: 72,
5265
+ S: this,
5266
+ C: (f, a) => f(...a)
5267
+ });
5268
+ await this._onRelease?.();
5269
+ log14("released lock", void 0, {
5270
+ F: __dxlog_file18,
5271
+ L: 74,
5272
+ S: this,
5273
+ C: (f, a) => f(...a)
5274
+ });
5275
+ }).catch(async () => {
5276
+ await this._onRelease?.();
5277
+ });
5278
+ await acquired.wait();
5279
+ log14("recieved lock", {
5280
+ steal
5281
+ }, {
5282
+ F: __dxlog_file18,
5283
+ L: 81,
5284
+ S: this,
5285
+ C: (f, a) => f(...a)
5286
+ });
5287
+ }
5288
+ };
5289
+ _ts_decorate7([
5290
+ logInfo
5291
+ ], Lock.prototype, "lockKey", null);
5292
+ var isLocked = (lockPath) => {
5293
+ throw new Error("Not implemented");
5294
+ };
5295
+
4987
5296
  // packages/sdk/client-services/src/packlets/logging/logging-service.ts
4988
5297
  import { Event as Event8 } from "@dxos/async";
4989
5298
  import { Stream as Stream12 } from "@dxos/codec-protobuf";
4990
- import { PublicKey as PublicKey11 } from "@dxos/keys";
4991
- import { getContextFromEntry, log as log14 } from "@dxos/log";
5299
+ import { PublicKey as PublicKey12 } from "@dxos/keys";
5300
+ import { getContextFromEntry, log as log15 } from "@dxos/log";
4992
5301
  import { QueryLogsRequest } from "@dxos/protocols/proto/dxos/client/services";
4993
5302
  import { getDebugName, jsonify, numericalValues, tracer } from "@dxos/util";
4994
5303
  var LoggingServiceImpl = class {
4995
5304
  constructor() {
4996
5305
  this._logs = new Event8();
4997
5306
  this._started = Date.now();
4998
- this._sessionId = PublicKey11.random().toHex();
5307
+ this._sessionId = PublicKey12.random().toHex();
4999
5308
  this._logProcessor = (_config, entry2) => {
5000
5309
  this._logs.emit(entry2);
5001
5310
  };
5002
5311
  }
5003
5312
  async open() {
5004
- log14.runtimeConfig.processors.push(this._logProcessor);
5313
+ log15.runtimeConfig.processors.push(this._logProcessor);
5005
5314
  }
5006
5315
  async close() {
5007
- const index = log14.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);
5008
- log14.runtimeConfig.processors.splice(index, 1);
5316
+ const index = log15.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);
5317
+ log15.runtimeConfig.processors.splice(index, 1);
5009
5318
  }
5010
5319
  async controlMetrics({ reset, record }) {
5011
5320
  if (reset) {
@@ -5090,12 +5399,12 @@ var LoggingServiceImpl = class {
5090
5399
  });
5091
5400
  }
5092
5401
  };
5093
- var matchFilter = (filter, level, path, options) => {
5402
+ var matchFilter = (filter, level, path2, options) => {
5094
5403
  switch (options) {
5095
5404
  case QueryLogsRequest.MatchingOptions.INCLUSIVE:
5096
- return level >= filter.level && (!filter.pattern || path.includes(filter.pattern));
5405
+ return level >= filter.level && (!filter.pattern || path2.includes(filter.pattern));
5097
5406
  case QueryLogsRequest.MatchingOptions.EXPLICIT:
5098
- return level === filter.level && (!filter.pattern || path.includes(filter.pattern));
5407
+ return level === filter.level && (!filter.pattern || path2.includes(filter.pattern));
5099
5408
  }
5100
5409
  };
5101
5410
  var shouldLog = (entry2, request) => {
@@ -5141,6 +5450,80 @@ var NetworkServiceImpl = class {
5141
5450
  }
5142
5451
  };
5143
5452
 
5453
+ // packages/sdk/client-services/src/packlets/storage/storage.ts
5454
+ import { InvalidConfigError } from "@dxos/protocols";
5455
+ import { Runtime as Runtime2 } from "@dxos/protocols/proto/dxos/config";
5456
+ import { createStorage, StorageType } from "@dxos/random-access-storage";
5457
+
5458
+ // packages/sdk/client-services/src/packlets/storage/util.ts
5459
+ import { DX_DATA } from "@dxos/client-protocol";
5460
+ import { Runtime } from "@dxos/protocols/proto/dxos/config";
5461
+ import { isNode as isNode2 } from "@dxos/util";
5462
+ var getRootPath = (config) => {
5463
+ const { dataRoot = isNode2() ? DX_DATA : "dxos/storage" } = config ?? {};
5464
+ return `${dataRoot}/`;
5465
+ };
5466
+ var isPersistent = (config) => {
5467
+ const { persistent = false } = config ?? {};
5468
+ return config.dataStore !== void 0 && config.dataStore !== Runtime.Client.Storage.StorageDriver.RAM || persistent;
5469
+ };
5470
+
5471
+ // packages/sdk/client-services/src/packlets/storage/storage.ts
5472
+ var StorageDriver = Runtime2.Client.Storage.StorageDriver;
5473
+ var createStorageObjects = (config) => {
5474
+ const { persistent = false, keyStore, dataStore } = config ?? {};
5475
+ if (persistent && dataStore === StorageDriver.RAM) {
5476
+ throw new InvalidConfigError("RAM storage cannot be used in persistent mode.");
5477
+ }
5478
+ if (!persistent && dataStore !== void 0 && dataStore !== StorageDriver.RAM) {
5479
+ throw new InvalidConfigError("Cannot use a persistent storage in not persistent mode.");
5480
+ }
5481
+ if (persistent && keyStore === StorageDriver.RAM) {
5482
+ throw new InvalidConfigError("RAM key storage cannot be used in persistent mode.");
5483
+ }
5484
+ if (!persistent && keyStore !== StorageDriver.RAM && keyStore !== void 0) {
5485
+ throw new InvalidConfigError("Cannot use a persistent key storage in not persistent mode.");
5486
+ }
5487
+ return {
5488
+ storage: createStorage({
5489
+ type: persistent ? toStorageType(dataStore) : StorageType.RAM,
5490
+ root: getRootPath(config)
5491
+ })
5492
+ };
5493
+ };
5494
+ var toStorageType = (type) => {
5495
+ switch (type) {
5496
+ case void 0:
5497
+ return void 0;
5498
+ case StorageDriver.RAM:
5499
+ return StorageType.RAM;
5500
+ case StorageDriver.CHROME:
5501
+ return StorageType.CHROME;
5502
+ case StorageDriver.FIREFOX:
5503
+ return StorageType.FIREFOX;
5504
+ case StorageDriver.IDB:
5505
+ return StorageType.IDB;
5506
+ case StorageDriver.NODE:
5507
+ return StorageType.NODE;
5508
+ case StorageDriver.WEBFS:
5509
+ return StorageType.WEBFS;
5510
+ default:
5511
+ throw new Error(`Invalid storage type: ${StorageDriver[type]}`);
5512
+ }
5513
+ };
5514
+
5515
+ // packages/sdk/client-services/src/packlets/storage/level.ts
5516
+ import { Level } from "level";
5517
+ import path from "@dxos/node-std/path";
5518
+ import { PublicKey as PublicKey13 } from "@dxos/keys";
5519
+ var createLevel = async (config) => {
5520
+ const persistent = isPersistent(config);
5521
+ const storagePath = persistent ? path.join(getRootPath(config), "level") : `/tmp/dxos-${PublicKey13.random().toHex()}`;
5522
+ const level = new Level(storagePath);
5523
+ await level.open();
5524
+ return level;
5525
+ };
5526
+
5144
5527
  // packages/sdk/client-services/src/packlets/system/system-service.ts
5145
5528
  import { Stream as Stream14 } from "@dxos/codec-protobuf";
5146
5529
  import { GetDiagnosticsRequest } from "@dxos/protocols/proto/dxos/client/services";
@@ -5209,13 +5592,14 @@ function _ts_decorate8(decorators, target, key, desc) {
5209
5592
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5210
5593
  return c > 3 && r && Object.defineProperty(target, key, r), r;
5211
5594
  }
5212
- var __dxlog_file18 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-host.ts";
5595
+ var __dxlog_file19 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-host.ts";
5213
5596
  var ClientServicesHost = class {
5214
5597
  constructor({
5215
5598
  config,
5216
5599
  transportFactory,
5217
5600
  signalManager,
5218
5601
  storage,
5602
+ level,
5219
5603
  // TODO(wittjosiah): Turn this on by default.
5220
5604
  lockKey,
5221
5605
  callbacks,
@@ -5226,6 +5610,7 @@ var ClientServicesHost = class {
5226
5610
  this._opening = false;
5227
5611
  this._open = false;
5228
5612
  this._storage = storage;
5613
+ this._level = level;
5229
5614
  this._callbacks = callbacks;
5230
5615
  this._runtimeParams = runtimeParams;
5231
5616
  if (config) {
@@ -5264,6 +5649,7 @@ var ClientServicesHost = class {
5264
5649
  await this.reset();
5265
5650
  }
5266
5651
  });
5652
+ this.diagnosticsBroadcastHandler = createCollectDiagnosticsBroadcastHandler(this._systemService);
5267
5653
  this._loggingService = new LoggingServiceImpl();
5268
5654
  this._serviceRegistry = new ServiceRegistry(clientServiceBundle, {
5269
5655
  SystemService: this._systemService,
@@ -5295,24 +5681,24 @@ var ClientServicesHost = class {
5295
5681
  */
5296
5682
  initialize({ config, ...options }) {
5297
5683
  invariant16(!this._open, "service host is open", {
5298
- F: __dxlog_file18,
5299
- L: 179,
5684
+ F: __dxlog_file19,
5685
+ L: 198,
5300
5686
  S: this,
5301
5687
  A: [
5302
5688
  "!this._open",
5303
5689
  "'service host is open'"
5304
5690
  ]
5305
5691
  });
5306
- log15("initializing...", void 0, {
5307
- F: __dxlog_file18,
5308
- L: 180,
5692
+ log16("initializing...", void 0, {
5693
+ F: __dxlog_file19,
5694
+ L: 199,
5309
5695
  S: this,
5310
5696
  C: (f, a) => f(...a)
5311
5697
  });
5312
5698
  if (config) {
5313
5699
  invariant16(!this._config, "config already set", {
5314
- F: __dxlog_file18,
5315
- L: 183,
5700
+ F: __dxlog_file19,
5701
+ L: 202,
5316
5702
  S: this,
5317
5703
  A: [
5318
5704
  "!this._config",
@@ -5324,13 +5710,21 @@ var ClientServicesHost = class {
5324
5710
  this._storage = createStorageObjects(config.get("runtime.client.storage", {})).storage;
5325
5711
  }
5326
5712
  }
5713
+ if (!options.signalManager) {
5714
+ log16.warn("running signaling without telemetry metadata.", void 0, {
5715
+ F: __dxlog_file19,
5716
+ L: 210,
5717
+ S: this,
5718
+ C: (f, a) => f(...a)
5719
+ });
5720
+ }
5327
5721
  const { connectionLog = true, transportFactory = createSimplePeerTransportFactory({
5328
5722
  iceServers: this._config?.get("runtime.services.ice")
5329
5723
  }), signalManager = new WebsocketSignalManager(this._config?.get("runtime.services.signaling") ?? []) } = options;
5330
5724
  this._signalManager = signalManager;
5331
5725
  invariant16(!this._networkManager, "network manager already set", {
5332
- F: __dxlog_file18,
5333
- L: 199,
5726
+ F: __dxlog_file19,
5727
+ L: 221,
5334
5728
  S: this,
5335
5729
  A: [
5336
5730
  "!this._networkManager",
@@ -5342,9 +5736,9 @@ var ClientServicesHost = class {
5342
5736
  transportFactory,
5343
5737
  signalManager
5344
5738
  });
5345
- log15("initialized", void 0, {
5346
- F: __dxlog_file18,
5347
- L: 206,
5739
+ log16("initialized", void 0, {
5740
+ F: __dxlog_file19,
5741
+ L: 228,
5348
5742
  S: this,
5349
5743
  C: (f, a) => f(...a)
5350
5744
  });
@@ -5353,18 +5747,18 @@ var ClientServicesHost = class {
5353
5747
  if (this._open) {
5354
5748
  return;
5355
5749
  }
5356
- const traceId = PublicKey12.random().toHex();
5357
- log15.trace("dxos.client-services.host.open", trace9.begin({
5750
+ const traceId = PublicKey14.random().toHex();
5751
+ log16.trace("dxos.client-services.host.open", trace9.begin({
5358
5752
  id: traceId
5359
5753
  }), {
5360
- F: __dxlog_file18,
5361
- L: 217,
5754
+ F: __dxlog_file19,
5755
+ L: 239,
5362
5756
  S: this,
5363
5757
  C: (f, a) => f(...a)
5364
5758
  });
5365
5759
  invariant16(this._config, "config not set", {
5366
- F: __dxlog_file18,
5367
- L: 219,
5760
+ F: __dxlog_file19,
5761
+ L: 241,
5368
5762
  S: this,
5369
5763
  A: [
5370
5764
  "this._config",
@@ -5372,8 +5766,8 @@ var ClientServicesHost = class {
5372
5766
  ]
5373
5767
  });
5374
5768
  invariant16(this._storage, "storage not set", {
5375
- F: __dxlog_file18,
5376
- L: 220,
5769
+ F: __dxlog_file19,
5770
+ L: 242,
5377
5771
  S: this,
5378
5772
  A: [
5379
5773
  "this._storage",
@@ -5381,8 +5775,8 @@ var ClientServicesHost = class {
5381
5775
  ]
5382
5776
  });
5383
5777
  invariant16(this._signalManager, "signal manager not set", {
5384
- F: __dxlog_file18,
5385
- L: 221,
5778
+ F: __dxlog_file19,
5779
+ L: 243,
5386
5780
  S: this,
5387
5781
  A: [
5388
5782
  "this._signalManager",
@@ -5390,8 +5784,8 @@ var ClientServicesHost = class {
5390
5784
  ]
5391
5785
  });
5392
5786
  invariant16(this._networkManager, "network manager not set", {
5393
- F: __dxlog_file18,
5394
- L: 222,
5787
+ F: __dxlog_file19,
5788
+ L: 244,
5395
5789
  S: this,
5396
5790
  A: [
5397
5791
  "this._networkManager",
@@ -5399,31 +5793,37 @@ var ClientServicesHost = class {
5399
5793
  ]
5400
5794
  });
5401
5795
  this._opening = true;
5402
- log15("opening...", {
5796
+ log16("opening...", {
5403
5797
  lockKey: this._resourceLock?.lockKey
5404
5798
  }, {
5405
- F: __dxlog_file18,
5406
- L: 225,
5799
+ F: __dxlog_file19,
5800
+ L: 247,
5407
5801
  S: this,
5408
5802
  C: (f, a) => f(...a)
5409
5803
  });
5804
+ if (!this._level) {
5805
+ this._level = await createLevel(this._config.get("runtime.client.storage", {}));
5806
+ }
5807
+ await this._level.open();
5410
5808
  await this._resourceLock?.acquire();
5411
5809
  await this._loggingService.open();
5412
- this._serviceContext = new ServiceContext(this._storage, this._networkManager, this._signalManager, this._runtimeParams);
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);
5413
5816
  this._serviceRegistry.setServices({
5414
5817
  SystemService: this._systemService,
5415
5818
  IdentityService: new IdentityServiceImpl((params) => this._createIdentity(params), this._serviceContext.identityManager, this._serviceContext.keyring, (profile) => this._serviceContext.broadcastProfileUpdate(profile)),
5416
- InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitations, (invitation) => this._serviceContext.getInvitationHandler(invitation), this._serviceContext.metadataStore),
5819
+ InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitationsManager),
5417
5820
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
5418
5821
  SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, async () => {
5419
5822
  await this._serviceContext.initialized.wait();
5420
5823
  return this._serviceContext.dataSpaceManager;
5421
5824
  }),
5422
5825
  DataService: new DataServiceImpl(this._serviceContext.automergeHost),
5423
- IndexService: new IndexServiceImpl({
5424
- indexer: this._serviceContext.indexer,
5425
- automergeHost: this._serviceContext.automergeHost
5426
- }),
5826
+ QueryService: this._queryService,
5427
5827
  NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager, this._serviceContext.signalManager),
5428
5828
  LoggingService: this._loggingService,
5429
5829
  TracingService: this._tracingService,
@@ -5435,24 +5835,6 @@ var ClientServicesHost = class {
5435
5835
  })
5436
5836
  });
5437
5837
  await this._serviceContext.open(ctx);
5438
- invariant16(this.serviceRegistry.services.InvitationsService, void 0, {
5439
- F: __dxlog_file18,
5440
- L: 286,
5441
- S: this,
5442
- A: [
5443
- "this.serviceRegistry.services.InvitationsService",
5444
- ""
5445
- ]
5446
- });
5447
- const loadedInvitations = await this.serviceRegistry.services.InvitationsService.loadPersistentInvitations();
5448
- log15("loaded persistent invitations", {
5449
- count: loadedInvitations.invitations?.length
5450
- }, {
5451
- F: __dxlog_file18,
5452
- L: 289,
5453
- S: this,
5454
- C: (f, a) => f(...a)
5455
- });
5456
5838
  const devtoolsProxy = this._config?.get("runtime.client.devtoolsProxy");
5457
5839
  if (devtoolsProxy) {
5458
5840
  this._devtoolsProxy = new WebsocketRpcClient({
@@ -5463,23 +5845,24 @@ var ClientServicesHost = class {
5463
5845
  });
5464
5846
  void this._devtoolsProxy.open();
5465
5847
  }
5848
+ this.diagnosticsBroadcastHandler.start();
5466
5849
  this._opening = false;
5467
5850
  this._open = true;
5468
5851
  this._statusUpdate.emit();
5469
5852
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
5470
- log15("opened", {
5853
+ log16("opened", {
5471
5854
  deviceKey
5472
5855
  }, {
5473
- F: __dxlog_file18,
5474
- L: 306,
5856
+ F: __dxlog_file19,
5857
+ L: 330,
5475
5858
  S: this,
5476
5859
  C: (f, a) => f(...a)
5477
5860
  });
5478
- log15.trace("dxos.client-services.host.open", trace9.end({
5861
+ log16.trace("dxos.client-services.host.open", trace9.end({
5479
5862
  id: traceId
5480
5863
  }), {
5481
- F: __dxlog_file18,
5482
- L: 307,
5864
+ F: __dxlog_file19,
5865
+ L: 331,
5483
5866
  S: this,
5484
5867
  C: (f, a) => f(...a)
5485
5868
  });
@@ -5489,60 +5872,63 @@ var ClientServicesHost = class {
5489
5872
  return;
5490
5873
  }
5491
5874
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
5492
- log15("closing...", {
5875
+ log16("closing...", {
5493
5876
  deviceKey
5494
5877
  }, {
5495
- F: __dxlog_file18,
5496
- L: 318,
5878
+ F: __dxlog_file19,
5879
+ L: 342,
5497
5880
  S: this,
5498
5881
  C: (f, a) => f(...a)
5499
5882
  });
5883
+ this.diagnosticsBroadcastHandler.stop();
5500
5884
  await this._devtoolsProxy?.close();
5501
5885
  this._serviceRegistry.setServices({
5502
5886
  SystemService: this._systemService
5503
5887
  });
5504
5888
  await this._loggingService.close();
5889
+ await this._queryService.close();
5505
5890
  await this._serviceContext.close();
5891
+ await this._level?.close();
5506
5892
  this._open = false;
5507
5893
  this._statusUpdate.emit();
5508
- log15("closed", {
5894
+ log16("closed", {
5509
5895
  deviceKey
5510
5896
  }, {
5511
- F: __dxlog_file18,
5512
- L: 325,
5897
+ F: __dxlog_file19,
5898
+ L: 352,
5513
5899
  S: this,
5514
5900
  C: (f, a) => f(...a)
5515
5901
  });
5516
5902
  }
5517
5903
  async reset() {
5518
- const traceId = PublicKey12.random().toHex();
5519
- log15.trace("dxos.sdk.client-services-host.reset", trace9.begin({
5904
+ const traceId = PublicKey14.random().toHex();
5905
+ log16.trace("dxos.sdk.client-services-host.reset", trace9.begin({
5520
5906
  id: traceId
5521
5907
  }), {
5522
- F: __dxlog_file18,
5523
- L: 330,
5908
+ F: __dxlog_file19,
5909
+ L: 357,
5524
5910
  S: this,
5525
5911
  C: (f, a) => f(...a)
5526
5912
  });
5527
- log15("resetting...", void 0, {
5528
- F: __dxlog_file18,
5529
- L: 332,
5913
+ log16("resetting...", void 0, {
5914
+ F: __dxlog_file19,
5915
+ L: 359,
5530
5916
  S: this,
5531
5917
  C: (f, a) => f(...a)
5532
5918
  });
5533
5919
  await this._serviceContext?.close();
5534
5920
  await this._storage.reset();
5535
- log15("reset", void 0, {
5536
- F: __dxlog_file18,
5537
- L: 335,
5921
+ log16("reset", void 0, {
5922
+ F: __dxlog_file19,
5923
+ L: 362,
5538
5924
  S: this,
5539
5925
  C: (f, a) => f(...a)
5540
5926
  });
5541
- log15.trace("dxos.sdk.client-services-host.reset", trace9.end({
5927
+ log16.trace("dxos.sdk.client-services-host.reset", trace9.end({
5542
5928
  id: traceId
5543
5929
  }), {
5544
- F: __dxlog_file18,
5545
- L: 336,
5930
+ F: __dxlog_file19,
5931
+ L: 363,
5546
5932
  S: this,
5547
5933
  C: (f, a) => f(...a)
5548
5934
  });
@@ -5552,12 +5938,10 @@ var ClientServicesHost = class {
5552
5938
  const identity = await this._serviceContext.createIdentity(params);
5553
5939
  await this._serviceContext.initialized.wait();
5554
5940
  const space = await this._serviceContext.dataSpaceManager.createSpace();
5555
- const obj = new Properties(void 0);
5556
- obj[defaultKey] = identity.identityKey.toHex();
5557
5941
  const automergeIndex = space.automergeSpaceState.rootUrl;
5558
5942
  invariant16(automergeIndex, void 0, {
5559
- F: __dxlog_file18,
5560
- L: 351,
5943
+ F: __dxlog_file19,
5944
+ L: 375,
5561
5945
  S: this,
5562
5946
  A: [
5563
5947
  "automergeIndex",
@@ -5566,12 +5950,25 @@ var ClientServicesHost = class {
5566
5950
  });
5567
5951
  const document = await this._serviceContext.automergeHost.repo.find(automergeIndex);
5568
5952
  await document.whenReady();
5953
+ const properties = {
5954
+ system: {
5955
+ type: encodeReference(getTypeReference(Properties))
5956
+ },
5957
+ data: {
5958
+ [defaultKey]: identity.identityKey.toHex()
5959
+ },
5960
+ meta: {
5961
+ keys: []
5962
+ }
5963
+ };
5964
+ const propertiesId = PublicKey14.random().toHex();
5569
5965
  document.change((doc) => {
5570
- assignDeep(doc, [
5966
+ assignDeep2(doc, [
5571
5967
  "objects",
5572
- getAutomergeObjectCore(obj).id
5573
- ], getRawDoc(obj).handle.docSync());
5968
+ propertiesId
5969
+ ], properties);
5574
5970
  });
5971
+ await this._serviceContext.automergeHost.repo.flush();
5575
5972
  return identity;
5576
5973
  }
5577
5974
  };
@@ -5593,6 +5990,44 @@ ClientServicesHost = _ts_decorate8([
5593
5990
  Trace3.resource()
5594
5991
  ], ClientServicesHost);
5595
5992
 
5993
+ // packages/sdk/client-services/src/packlets/services/util.ts
5994
+ import { PublicKey as PublicKey15 } from "@dxos/keys";
5995
+ import { humanize } from "@dxos/util";
5996
+ var ClientServicesProviderResource = Symbol.for("dxos.resource.ClientServices");
5997
+
5998
+ // packages/sdk/client-services/src/packlets/diagnostics/diagnostics-collector.ts
5999
+ var DiagnosticsCollector = class {
6000
+ static {
6001
+ this.broadcastSender = createCollectDiagnosticsBroadcastSender();
6002
+ }
6003
+ static async collect(config = findConfigs(), services = findSystemServiceProvider(), options = {}) {
6004
+ const serviceDiagnostics = await services?.services?.SystemService?.getDiagnostics({
6005
+ keys: options.humanize ? GetDiagnosticsRequest2.KEY_OPTION.HUMANIZE : options.truncate ? GetDiagnosticsRequest2.KEY_OPTION.TRUNCATE : void 0
6006
+ });
6007
+ const clientDiagnostics = {
6008
+ config,
6009
+ trace: TRACE_PROCESSOR3.getDiagnostics()
6010
+ };
6011
+ const diagnostics = serviceDiagnostics != null ? {
6012
+ client: clientDiagnostics,
6013
+ services: serviceDiagnostics
6014
+ } : {
6015
+ client: clientDiagnostics,
6016
+ broadcast: await this.broadcastSender.broadcastDiagnosticsRequest()
6017
+ };
6018
+ return JSON.parse(JSON.stringify(diagnostics, jsonKeyReplacer2(options)));
6019
+ }
6020
+ };
6021
+ var findSystemServiceProvider = () => {
6022
+ const serviceProviders = TRACE_PROCESSOR3.findByAnnotation(ClientServicesProviderResource);
6023
+ const providerResource = serviceProviders.find((r) => r.instance.deref()?.services?.SystemService != null);
6024
+ return providerResource?.instance?.deref() ?? null;
6025
+ };
6026
+ var findConfigs = () => {
6027
+ const configs = TRACE_PROCESSOR3.findByAnnotation(ConfigResource);
6028
+ return configs.map((r) => r.instance.deref()).filter(nonNullable);
6029
+ };
6030
+
5596
6031
  export {
5597
6032
  Buffer,
5598
6033
  subscribeToFeeds,
@@ -5612,19 +6047,25 @@ export {
5612
6047
  IdentityServiceImpl,
5613
6048
  DeviceInvitationProtocol,
5614
6049
  InvitationsHandler,
5615
- invitationExpired,
6050
+ createAdmissionKeypair,
5616
6051
  InvitationsServiceImpl,
5617
6052
  SpaceInvitationProtocol,
6053
+ InvitationsManager,
5618
6054
  ClientRpcServer,
5619
- createDiagnostics,
5620
6055
  DataSpace,
5621
6056
  DataSpaceManager,
5622
6057
  SpacesServiceImpl,
5623
6058
  ServiceContext,
5624
6059
  ServiceRegistry,
6060
+ createDiagnostics,
6061
+ createCollectDiagnosticsBroadcastSender,
6062
+ createCollectDiagnosticsBroadcastHandler,
6063
+ DiagnosticsCollector,
5625
6064
  Lock,
5626
6065
  isLocked,
5627
6066
  createStorageObjects,
5628
- ClientServicesHost
6067
+ createLevel,
6068
+ ClientServicesHost,
6069
+ ClientServicesProviderResource
5629
6070
  };
5630
- //# sourceMappingURL=chunk-7PYX6UUA.mjs.map
6071
+ //# sourceMappingURL=chunk-WLE7E36I.mjs.map