@dxos/client-services 0.4.10-main.c42bfdb → 0.4.10-main.c61b011
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.
- package/dist/lib/browser/{chunk-W7UANCHR.mjs → chunk-ZWMG6QKN.mjs} +831 -706
- package/dist/lib/browser/chunk-ZWMG6QKN.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +10 -6
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +138 -118
- package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
- package/dist/lib/node/{chunk-JSVLZGJM.cjs → chunk-PP42CXTU.cjs} +862 -734
- package/dist/lib/node/chunk-PP42CXTU.cjs.map +7 -0
- package/dist/lib/node/index.cjs +50 -46
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/packlets/testing/index.cjs +137 -120
- package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
- package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +3 -1
- package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/index.d.ts +1 -0
- package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-extension.d.ts +1 -0
- package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +6 -1
- package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts +8 -4
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-manager.d.ts +44 -0
- package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -0
- package/dist/types/src/packlets/invitations/invitations-service.d.ts +7 -23
- package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -1
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts +6 -6
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +3 -1
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts +8 -3
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space.d.ts +4 -3
- package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
- package/dist/types/src/packlets/storage/level.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/test-builder.d.ts +9 -3
- package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/packlets/vault/worker-runtime.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +1 -1
- package/package.json +34 -34
- package/src/packlets/identity/identity-manager.ts +1 -0
- package/src/packlets/identity/identity.test.ts +3 -0
- package/src/packlets/invitations/device-invitation-protocol.ts +6 -1
- package/src/packlets/invitations/index.ts +1 -0
- package/src/packlets/invitations/invitation-extension.ts +28 -1
- package/src/packlets/invitations/invitation-protocol.ts +7 -1
- package/src/packlets/invitations/invitations-handler.ts +75 -96
- package/src/packlets/invitations/invitations-manager.ts +271 -0
- package/src/packlets/invitations/invitations-service.ts +23 -168
- package/src/packlets/invitations/space-invitation-protocol.ts +45 -3
- package/src/packlets/services/automerge-host.test.ts +13 -7
- package/src/packlets/services/service-context.test.ts +4 -1
- package/src/packlets/services/service-context.ts +23 -23
- package/src/packlets/services/service-host.test.ts +6 -0
- package/src/packlets/services/service-host.ts +13 -22
- package/src/packlets/spaces/data-space-manager.test.ts +4 -4
- package/src/packlets/spaces/data-space-manager.ts +56 -13
- package/src/packlets/spaces/data-space.ts +14 -19
- package/src/packlets/storage/level.ts +2 -1
- package/src/packlets/testing/invitation-utils.ts +100 -97
- package/src/packlets/testing/test-builder.ts +37 -8
- package/src/packlets/vault/worker-runtime.ts +3 -1
- package/src/version.ts +1 -1
- package/dist/lib/browser/chunk-W7UANCHR.mjs.map +0 -7
- package/dist/lib/node/chunk-JSVLZGJM.cjs.map +0 -7
- package/dist/types/src/packlets/indexing/index.d.ts +0 -2
- package/dist/types/src/packlets/indexing/index.d.ts.map +0 -1
- package/dist/types/src/packlets/indexing/util.d.ts +0 -15
- package/dist/types/src/packlets/indexing/util.d.ts.map +0 -1
- package/src/packlets/indexing/index.ts +0 -5
- package/src/packlets/indexing/util.ts +0 -89
|
@@ -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
|
|
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:
|
|
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:
|
|
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:
|
|
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,
|
|
1287
|
+
import { AuthenticatingInvitation, INVITATION_TIMEOUT } from "@dxos/client-protocol";
|
|
1283
1288
|
import { Context as Context5 } from "@dxos/context";
|
|
1284
|
-
import {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
|
1693
|
-
if (
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1774
|
+
L: 120,
|
|
1795
1775
|
S: this,
|
|
1796
1776
|
C: (f, a) => f(...a)
|
|
1797
1777
|
});
|
|
1798
1778
|
} finally {
|
|
1799
|
-
if (
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
2219
|
-
|
|
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 {
|
|
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(
|
|
2232
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
2291
|
-
const
|
|
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(
|
|
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(
|
|
2352
|
-
|
|
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(
|
|
2382
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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:
|
|
2312
|
+
invitations: this._invitationsManager.getAcceptedInvitations(),
|
|
2471
2313
|
existing: true
|
|
2472
2314
|
});
|
|
2473
|
-
|
|
2315
|
+
this._invitationsManager.onPersistentInvitationsLoaded(ctx, () => {
|
|
2474
2316
|
next({
|
|
2475
2317
|
action: QueryInvitationsResponse.Action.LOAD_COMPLETE,
|
|
2476
2318
|
type: QueryInvitationsResponse.Type.CREATED
|
|
2477
2319
|
});
|
|
2478
|
-
}
|
|
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
|
|
2494
|
-
import { log as
|
|
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
|
|
2497
|
-
|
|
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,143 +2346,495 @@ var SpaceInvitationProtocol = class {
|
|
|
2510
2346
|
}
|
|
2511
2347
|
getInvitationContext() {
|
|
2512
2348
|
return {
|
|
2513
|
-
kind:
|
|
2349
|
+
kind: Invitation4.Kind.SPACE,
|
|
2514
2350
|
spaceKey: this._spaceKey
|
|
2515
2351
|
};
|
|
2516
2352
|
}
|
|
2517
|
-
async admit(request, guestProfile) {
|
|
2518
|
-
|
|
2519
|
-
F:
|
|
2520
|
-
L:
|
|
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",
|
|
2524
2360
|
""
|
|
2525
2361
|
]
|
|
2526
2362
|
});
|
|
2527
|
-
const space = await this._spaceManager.spaces.get(this._spaceKey);
|
|
2528
|
-
|
|
2363
|
+
const space = await this._spaceManager.spaces.get(this._spaceKey);
|
|
2364
|
+
invariant7(space, void 0, {
|
|
2365
|
+
F: __dxlog_file8,
|
|
2366
|
+
L: 57,
|
|
2367
|
+
S: this,
|
|
2368
|
+
A: [
|
|
2369
|
+
"space",
|
|
2370
|
+
""
|
|
2371
|
+
]
|
|
2372
|
+
});
|
|
2373
|
+
invariant7(request.space, void 0, {
|
|
2374
|
+
F: __dxlog_file8,
|
|
2375
|
+
L: 59,
|
|
2376
|
+
S: this,
|
|
2377
|
+
A: [
|
|
2378
|
+
"request.space",
|
|
2379
|
+
""
|
|
2380
|
+
]
|
|
2381
|
+
});
|
|
2382
|
+
const { identityKey, deviceKey } = request.space;
|
|
2383
|
+
log6("writing guest credentials", {
|
|
2384
|
+
host: this._signingContext.deviceKey,
|
|
2385
|
+
guest: deviceKey
|
|
2386
|
+
}, {
|
|
2387
|
+
F: __dxlog_file8,
|
|
2388
|
+
L: 62,
|
|
2389
|
+
S: this,
|
|
2390
|
+
C: (f, a) => f(...a)
|
|
2391
|
+
});
|
|
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,
|
|
2396
|
+
S: this,
|
|
2397
|
+
A: [
|
|
2398
|
+
"credentials[0].credential",
|
|
2399
|
+
""
|
|
2400
|
+
]
|
|
2401
|
+
});
|
|
2402
|
+
const spaceMemberCredential = credentials[0].credential.credential;
|
|
2403
|
+
invariant7(getCredentialAssertion(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
|
|
2404
|
+
F: __dxlog_file8,
|
|
2405
|
+
L: 76,
|
|
2406
|
+
S: this,
|
|
2407
|
+
A: [
|
|
2408
|
+
"getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
|
|
2409
|
+
""
|
|
2410
|
+
]
|
|
2411
|
+
});
|
|
2412
|
+
await writeMessages2(space.inner.controlPipeline.writer, credentials);
|
|
2413
|
+
return {
|
|
2414
|
+
space: {
|
|
2415
|
+
credential: spaceMemberCredential,
|
|
2416
|
+
controlTimeframe: space.inner.controlPipeline.state.timeframe
|
|
2417
|
+
}
|
|
2418
|
+
};
|
|
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
|
+
}
|
|
2483
|
+
checkInvitation(invitation) {
|
|
2484
|
+
if (invitation.spaceKey && this._spaceManager.spaces.has(invitation.spaceKey)) {
|
|
2485
|
+
return new AlreadyJoinedError2("Already joined space.");
|
|
2486
|
+
}
|
|
2487
|
+
}
|
|
2488
|
+
createIntroduction() {
|
|
2489
|
+
return {
|
|
2490
|
+
profile: this._signingContext.getProfile()
|
|
2491
|
+
};
|
|
2492
|
+
}
|
|
2493
|
+
async createAdmissionRequest() {
|
|
2494
|
+
const controlFeedKey = await this._keyring.createKey();
|
|
2495
|
+
const dataFeedKey = await this._keyring.createKey();
|
|
2496
|
+
return {
|
|
2497
|
+
space: {
|
|
2498
|
+
identityKey: this._signingContext.identityKey,
|
|
2499
|
+
deviceKey: this._signingContext.deviceKey,
|
|
2500
|
+
controlFeedKey,
|
|
2501
|
+
dataFeedKey
|
|
2502
|
+
}
|
|
2503
|
+
};
|
|
2504
|
+
}
|
|
2505
|
+
async accept(response) {
|
|
2506
|
+
invariant7(response.space, void 0, {
|
|
2507
|
+
F: __dxlog_file8,
|
|
2508
|
+
L: 149,
|
|
2509
|
+
S: this,
|
|
2510
|
+
A: [
|
|
2511
|
+
"response.space",
|
|
2512
|
+
""
|
|
2513
|
+
]
|
|
2514
|
+
});
|
|
2515
|
+
const { credential, controlTimeframe, dataTimeframe } = response.space;
|
|
2516
|
+
const assertion = getCredentialAssertion(credential);
|
|
2517
|
+
invariant7(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
|
|
2518
|
+
F: __dxlog_file8,
|
|
2519
|
+
L: 152,
|
|
2520
|
+
S: this,
|
|
2521
|
+
A: [
|
|
2522
|
+
"assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
|
|
2523
|
+
"'Invalid credential'"
|
|
2524
|
+
]
|
|
2525
|
+
});
|
|
2526
|
+
invariant7(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
|
|
2527
|
+
F: __dxlog_file8,
|
|
2528
|
+
L: 153,
|
|
2529
|
+
S: this,
|
|
2530
|
+
A: [
|
|
2531
|
+
"credential.subject.id.equals(this._signingContext.identityKey)",
|
|
2532
|
+
""
|
|
2533
|
+
]
|
|
2534
|
+
});
|
|
2535
|
+
if (this._spaceManager.spaces.has(assertion.spaceKey)) {
|
|
2536
|
+
throw new AlreadyJoinedError2("Already joined space.");
|
|
2537
|
+
}
|
|
2538
|
+
await this._spaceManager.acceptSpace({
|
|
2539
|
+
spaceKey: assertion.spaceKey,
|
|
2540
|
+
genesisFeedKey: assertion.genesisFeedKey,
|
|
2541
|
+
controlTimeframe,
|
|
2542
|
+
dataTimeframe
|
|
2543
|
+
});
|
|
2544
|
+
await this._signingContext.recordCredential(credential);
|
|
2545
|
+
return {
|
|
2546
|
+
spaceKey: assertion.spaceKey
|
|
2547
|
+
};
|
|
2548
|
+
}
|
|
2549
|
+
};
|
|
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, {
|
|
2529
2673
|
F: __dxlog_file9,
|
|
2530
|
-
L:
|
|
2674
|
+
L: 133,
|
|
2531
2675
|
S: this,
|
|
2532
|
-
|
|
2533
|
-
"space",
|
|
2534
|
-
""
|
|
2535
|
-
]
|
|
2676
|
+
C: (f, a) => f(...a)
|
|
2536
2677
|
});
|
|
2537
|
-
invariant8(
|
|
2678
|
+
invariant8(invitationId, void 0, {
|
|
2538
2679
|
F: __dxlog_file9,
|
|
2539
|
-
L:
|
|
2680
|
+
L: 134,
|
|
2540
2681
|
S: this,
|
|
2541
2682
|
A: [
|
|
2542
|
-
"
|
|
2683
|
+
"invitationId",
|
|
2543
2684
|
""
|
|
2544
2685
|
]
|
|
2545
2686
|
});
|
|
2546
|
-
const
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
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
|
|
2550
2704
|
}, {
|
|
2551
2705
|
F: __dxlog_file9,
|
|
2552
|
-
L:
|
|
2706
|
+
L: 144,
|
|
2553
2707
|
S: this,
|
|
2554
2708
|
C: (f, a) => f(...a)
|
|
2555
2709
|
});
|
|
2556
|
-
|
|
2557
|
-
invariant8(credentials[0].credential, void 0, {
|
|
2558
|
-
F: __dxlog_file9,
|
|
2559
|
-
L: 65,
|
|
2560
|
-
S: this,
|
|
2561
|
-
A: [
|
|
2562
|
-
"credentials[0].credential",
|
|
2563
|
-
""
|
|
2564
|
-
]
|
|
2565
|
-
});
|
|
2566
|
-
const spaceMemberCredential = credentials[0].credential.credential;
|
|
2567
|
-
invariant8(getCredentialAssertion(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
|
|
2710
|
+
invariant8(invitationId, void 0, {
|
|
2568
2711
|
F: __dxlog_file9,
|
|
2569
|
-
L:
|
|
2712
|
+
L: 145,
|
|
2570
2713
|
S: this,
|
|
2571
2714
|
A: [
|
|
2572
|
-
"
|
|
2715
|
+
"invitationId",
|
|
2573
2716
|
""
|
|
2574
2717
|
]
|
|
2575
2718
|
});
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
controlTimeframe: space.inner.controlPipeline.state.timeframe
|
|
2719
|
+
const created = this._createInvitations.get(invitationId);
|
|
2720
|
+
if (created) {
|
|
2721
|
+
if (created.get().persistent) {
|
|
2722
|
+
await this._metadataStore.removeInvitation(invitationId);
|
|
2581
2723
|
}
|
|
2582
|
-
|
|
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
|
+
}
|
|
2583
2735
|
}
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
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());
|
|
2587
2751
|
}
|
|
2588
2752
|
}
|
|
2589
|
-
|
|
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);
|
|
2590
2756
|
return {
|
|
2591
|
-
|
|
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()
|
|
2592
2771
|
};
|
|
2593
2772
|
}
|
|
2594
|
-
|
|
2595
|
-
const
|
|
2596
|
-
const
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
deviceKey: this._signingContext.deviceKey,
|
|
2601
|
-
controlFeedKey,
|
|
2602
|
-
dataFeedKey
|
|
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();
|
|
2603
2779
|
}
|
|
2604
|
-
};
|
|
2605
|
-
}
|
|
2606
|
-
async accept(response) {
|
|
2607
|
-
invariant8(response.space, void 0, {
|
|
2608
|
-
F: __dxlog_file9,
|
|
2609
|
-
L: 107,
|
|
2610
|
-
S: this,
|
|
2611
|
-
A: [
|
|
2612
|
-
"response.space",
|
|
2613
|
-
""
|
|
2614
|
-
]
|
|
2615
|
-
});
|
|
2616
|
-
const { credential, controlTimeframe, dataTimeframe } = response.space;
|
|
2617
|
-
const assertion = getCredentialAssertion(credential);
|
|
2618
|
-
invariant8(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
|
|
2619
|
-
F: __dxlog_file9,
|
|
2620
|
-
L: 110,
|
|
2621
|
-
S: this,
|
|
2622
|
-
A: [
|
|
2623
|
-
"assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
|
|
2624
|
-
"'Invalid credential'"
|
|
2625
|
-
]
|
|
2626
2780
|
});
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
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();
|
|
2635
2791
|
});
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
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
|
+
}
|
|
2644
2802
|
});
|
|
2645
|
-
await this._signingContext.recordCredential(credential);
|
|
2646
2803
|
return {
|
|
2647
|
-
|
|
2804
|
+
ctx,
|
|
2805
|
+
stream,
|
|
2806
|
+
observableInvitation
|
|
2648
2807
|
};
|
|
2649
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
|
+
}
|
|
2650
2838
|
};
|
|
2651
2839
|
|
|
2652
2840
|
// packages/sdk/client-services/src/packlets/services/client-rpc-server.ts
|
|
@@ -2731,15 +2919,15 @@ ClientRpcServer = _ts_decorate3([
|
|
|
2731
2919
|
], ClientRpcServer);
|
|
2732
2920
|
|
|
2733
2921
|
// packages/sdk/client-services/src/packlets/spaces/data-space.ts
|
|
2734
|
-
import { Event as Event6, asyncTimeout, scheduleTask as
|
|
2922
|
+
import { Event as Event6, asyncTimeout, scheduleTask as scheduleTask4, sleep as sleep2, synchronized, trackLeaks } from "@dxos/async";
|
|
2735
2923
|
import { AUTH_TIMEOUT as AUTH_TIMEOUT2 } from "@dxos/client-protocol";
|
|
2736
2924
|
import { cancelWithContext as cancelWithContext2, Context as Context8, ContextDisposedError } from "@dxos/context";
|
|
2737
2925
|
import { timed, warnAfterTimeout } from "@dxos/debug";
|
|
2738
|
-
import { TYPE_PROPERTIES } from "@dxos/echo-db";
|
|
2739
2926
|
import { createMappedFeedWriter } from "@dxos/echo-pipeline";
|
|
2740
2927
|
import { AutomergeDocumentLoaderImpl } from "@dxos/echo-pipeline";
|
|
2928
|
+
import { TYPE_PROPERTIES } from "@dxos/echo-schema";
|
|
2741
2929
|
import { failedInvariant, invariant as invariant10 } from "@dxos/invariant";
|
|
2742
|
-
import { PublicKey as
|
|
2930
|
+
import { PublicKey as PublicKey9 } from "@dxos/keys";
|
|
2743
2931
|
import { log as log9 } from "@dxos/log";
|
|
2744
2932
|
import { CancelledError, SystemError } from "@dxos/protocols";
|
|
2745
2933
|
import { SpaceState, CreateEpochRequest } from "@dxos/protocols/proto/dxos/client/services";
|
|
@@ -2787,10 +2975,10 @@ var AutomergeSpaceState = class {
|
|
|
2787
2975
|
};
|
|
2788
2976
|
|
|
2789
2977
|
// packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts
|
|
2790
|
-
import { DeferredTask, Event as Event5, scheduleTask as
|
|
2978
|
+
import { DeferredTask, Event as Event5, scheduleTask as scheduleTask3, sleep, TimeoutError as TimeoutError2, Trigger as Trigger4 } from "@dxos/async";
|
|
2791
2979
|
import { Context as Context7, rejectOnDispose } from "@dxos/context";
|
|
2792
2980
|
import { invariant as invariant9 } from "@dxos/invariant";
|
|
2793
|
-
import { PublicKey as
|
|
2981
|
+
import { PublicKey as PublicKey8 } from "@dxos/keys";
|
|
2794
2982
|
import { log as log8 } from "@dxos/log";
|
|
2795
2983
|
import { schema as schema3 } from "@dxos/protocols";
|
|
2796
2984
|
import { RpcExtension as RpcExtension2 } from "@dxos/teleport";
|
|
@@ -2805,8 +2993,8 @@ var NotarizationPlugin = class {
|
|
|
2805
2993
|
this._ctx = new Context7();
|
|
2806
2994
|
this._extensionOpened = new Event5();
|
|
2807
2995
|
this._extensions = /* @__PURE__ */ new Set();
|
|
2808
|
-
this._processedCredentials = new ComplexSet2(
|
|
2809
|
-
this._processCredentialsTriggers = new ComplexMap2(
|
|
2996
|
+
this._processedCredentials = new ComplexSet2(PublicKey8.hash);
|
|
2997
|
+
this._processCredentialsTriggers = new ComplexMap2(PublicKey8.hash);
|
|
2810
2998
|
}
|
|
2811
2999
|
get hasWriter() {
|
|
2812
3000
|
return !!this._writer;
|
|
@@ -2854,7 +3042,7 @@ var NotarizationPlugin = class {
|
|
|
2854
3042
|
});
|
|
2855
3043
|
opCtx?.onDispose(() => ctx.dispose());
|
|
2856
3044
|
if (timeout !== 0) {
|
|
2857
|
-
|
|
3045
|
+
scheduleTask3(ctx, () => {
|
|
2858
3046
|
log8.warn("Notarization timeout", {
|
|
2859
3047
|
timeout,
|
|
2860
3048
|
peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)
|
|
@@ -2888,7 +3076,7 @@ var NotarizationPlugin = class {
|
|
|
2888
3076
|
C: (f, a) => f(...a)
|
|
2889
3077
|
});
|
|
2890
3078
|
peersTried.clear();
|
|
2891
|
-
|
|
3079
|
+
scheduleTask3(ctx, () => notarizeTask.schedule(), retryTimeout);
|
|
2892
3080
|
return;
|
|
2893
3081
|
}
|
|
2894
3082
|
peersTried.add(peer);
|
|
@@ -3089,9 +3277,9 @@ var DataSpace = class {
|
|
|
3089
3277
|
this._metadataStore = params.metadataStore;
|
|
3090
3278
|
this._signingContext = params.signingContext;
|
|
3091
3279
|
this._callbacks = params.callbacks ?? {};
|
|
3092
|
-
this.
|
|
3280
|
+
this._echoHost = params.echoHost;
|
|
3093
3281
|
this.authVerifier = new TrustedKeySetAuthVerifier({
|
|
3094
|
-
trustedKeysProvider: () => new ComplexSet3(
|
|
3282
|
+
trustedKeysProvider: () => new ComplexSet3(PublicKey9.hash, Array.from(this._inner.spaceState.members.values()).filter((member) => !member.removed).map((member) => member.key)),
|
|
3095
3283
|
update: this._inner.stateUpdate,
|
|
3096
3284
|
authTimeout: AUTH_TIMEOUT2
|
|
3097
3285
|
});
|
|
@@ -3101,7 +3289,7 @@ var DataSpace = class {
|
|
|
3101
3289
|
state: SpaceState[this._state]
|
|
3102
3290
|
}, {
|
|
3103
3291
|
F: __dxlog_file11,
|
|
3104
|
-
L:
|
|
3292
|
+
L: 135,
|
|
3105
3293
|
S: this,
|
|
3106
3294
|
C: (f, a) => f(...a)
|
|
3107
3295
|
});
|
|
@@ -3151,7 +3339,7 @@ var DataSpace = class {
|
|
|
3151
3339
|
state: SpaceState[this._state]
|
|
3152
3340
|
}, {
|
|
3153
3341
|
F: __dxlog_file11,
|
|
3154
|
-
L:
|
|
3342
|
+
L: 193,
|
|
3155
3343
|
S: this,
|
|
3156
3344
|
C: (f, a) => f(...a)
|
|
3157
3345
|
});
|
|
@@ -3169,7 +3357,7 @@ var DataSpace = class {
|
|
|
3169
3357
|
state: SpaceState[this._state]
|
|
3170
3358
|
}, {
|
|
3171
3359
|
F: __dxlog_file11,
|
|
3172
|
-
L:
|
|
3360
|
+
L: 207,
|
|
3173
3361
|
S: this,
|
|
3174
3362
|
C: (f, a) => f(...a)
|
|
3175
3363
|
});
|
|
@@ -3193,7 +3381,7 @@ var DataSpace = class {
|
|
|
3193
3381
|
* Initialize the data pipeline in a separate task.
|
|
3194
3382
|
*/
|
|
3195
3383
|
initializeDataPipelineAsync() {
|
|
3196
|
-
|
|
3384
|
+
scheduleTask4(this._ctx, async () => {
|
|
3197
3385
|
try {
|
|
3198
3386
|
this.metrics.pipelineInitBegin = /* @__PURE__ */ new Date();
|
|
3199
3387
|
await this.initializeDataPipeline();
|
|
@@ -3201,7 +3389,7 @@ var DataSpace = class {
|
|
|
3201
3389
|
if (err instanceof CancelledError || err instanceof ContextDisposedError) {
|
|
3202
3390
|
log9("data pipeline initialization cancelled", err, {
|
|
3203
3391
|
F: __dxlog_file11,
|
|
3204
|
-
L:
|
|
3392
|
+
L: 240,
|
|
3205
3393
|
S: this,
|
|
3206
3394
|
C: (f, a) => f(...a)
|
|
3207
3395
|
});
|
|
@@ -3209,7 +3397,7 @@ var DataSpace = class {
|
|
|
3209
3397
|
}
|
|
3210
3398
|
log9.error("Error initializing data pipeline", err, {
|
|
3211
3399
|
F: __dxlog_file11,
|
|
3212
|
-
L:
|
|
3400
|
+
L: 244,
|
|
3213
3401
|
S: this,
|
|
3214
3402
|
C: (f, a) => f(...a)
|
|
3215
3403
|
});
|
|
@@ -3218,7 +3406,7 @@ var DataSpace = class {
|
|
|
3218
3406
|
state: SpaceState[this._state]
|
|
3219
3407
|
}, {
|
|
3220
3408
|
F: __dxlog_file11,
|
|
3221
|
-
L:
|
|
3409
|
+
L: 246,
|
|
3222
3410
|
S: this,
|
|
3223
3411
|
C: (f, a) => f(...a)
|
|
3224
3412
|
});
|
|
@@ -3238,7 +3426,7 @@ var DataSpace = class {
|
|
|
3238
3426
|
state: SpaceState[this._state]
|
|
3239
3427
|
}, {
|
|
3240
3428
|
F: __dxlog_file11,
|
|
3241
|
-
L:
|
|
3429
|
+
L: 262,
|
|
3242
3430
|
S: this,
|
|
3243
3431
|
C: (f, a) => f(...a)
|
|
3244
3432
|
});
|
|
@@ -3248,7 +3436,7 @@ var DataSpace = class {
|
|
|
3248
3436
|
await cancelWithContext2(this._ctx, this.automergeSpaceState.ensureEpochInitialized());
|
|
3249
3437
|
log9("data pipeline ready", void 0, {
|
|
3250
3438
|
F: __dxlog_file11,
|
|
3251
|
-
L:
|
|
3439
|
+
L: 274,
|
|
3252
3440
|
S: this,
|
|
3253
3441
|
C: (f, a) => f(...a)
|
|
3254
3442
|
});
|
|
@@ -3258,7 +3446,7 @@ var DataSpace = class {
|
|
|
3258
3446
|
state: SpaceState[this._state]
|
|
3259
3447
|
}, {
|
|
3260
3448
|
F: __dxlog_file11,
|
|
3261
|
-
L:
|
|
3449
|
+
L: 278,
|
|
3262
3450
|
S: this,
|
|
3263
3451
|
C: (f, a) => f(...a)
|
|
3264
3452
|
});
|
|
@@ -3274,7 +3462,7 @@ var DataSpace = class {
|
|
|
3274
3462
|
await this._createWritableFeeds();
|
|
3275
3463
|
log9("writable feeds created", void 0, {
|
|
3276
3464
|
F: __dxlog_file11,
|
|
3277
|
-
L:
|
|
3465
|
+
L: 294,
|
|
3278
3466
|
S: this,
|
|
3279
3467
|
C: (f, a) => f(...a)
|
|
3280
3468
|
});
|
|
@@ -3337,12 +3525,12 @@ var DataSpace = class {
|
|
|
3337
3525
|
rootUrl
|
|
3338
3526
|
}, {
|
|
3339
3527
|
F: __dxlog_file11,
|
|
3340
|
-
L:
|
|
3528
|
+
L: 360,
|
|
3341
3529
|
S: this,
|
|
3342
3530
|
C: (f, a) => f(...a)
|
|
3343
3531
|
});
|
|
3344
|
-
this.
|
|
3345
|
-
const handle = this.
|
|
3532
|
+
this._echoHost.replicateDocument(rootUrl);
|
|
3533
|
+
const handle = this._echoHost.automergeRepo.find(rootUrl);
|
|
3346
3534
|
queueMicrotask(async () => {
|
|
3347
3535
|
try {
|
|
3348
3536
|
await warnAfterTimeout(5e3, "Automerge root doc load timeout (DataSpace)", async () => {
|
|
@@ -3369,7 +3557,7 @@ var DataSpace = class {
|
|
|
3369
3557
|
err
|
|
3370
3558
|
}, {
|
|
3371
3559
|
F: __dxlog_file11,
|
|
3372
|
-
L:
|
|
3560
|
+
L: 383,
|
|
3373
3561
|
S: this,
|
|
3374
3562
|
C: (f, a) => f(...a)
|
|
3375
3563
|
});
|
|
@@ -3407,7 +3595,7 @@ var DataSpace = class {
|
|
|
3407
3595
|
break;
|
|
3408
3596
|
case CreateEpochRequest.Migration.INIT_AUTOMERGE:
|
|
3409
3597
|
{
|
|
3410
|
-
const document = this.
|
|
3598
|
+
const document = this._echoHost.automergeRepo.create();
|
|
3411
3599
|
epoch = {
|
|
3412
3600
|
previousId: this._automergeSpaceState.lastEpoch?.id,
|
|
3413
3601
|
number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
|
|
@@ -3419,12 +3607,12 @@ var DataSpace = class {
|
|
|
3419
3607
|
case CreateEpochRequest.Migration.PRUNE_AUTOMERGE_ROOT_HISTORY:
|
|
3420
3608
|
{
|
|
3421
3609
|
const currentRootUrl = this._automergeSpaceState.rootUrl;
|
|
3422
|
-
const rootHandle = this.
|
|
3610
|
+
const rootHandle = this._echoHost.automergeRepo.find(currentRootUrl);
|
|
3423
3611
|
await cancelWithContext2(this._ctx, asyncTimeout(rootHandle.whenReady(), 1e4));
|
|
3424
|
-
const newRoot = this.
|
|
3612
|
+
const newRoot = this._echoHost.automergeRepo.create(rootHandle.docSync());
|
|
3425
3613
|
invariant10(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
|
|
3426
3614
|
F: __dxlog_file11,
|
|
3427
|
-
L:
|
|
3615
|
+
L: 433,
|
|
3428
3616
|
S: this,
|
|
3429
3617
|
A: [
|
|
3430
3618
|
"typeof newRoot.url === 'string' && newRoot.url.length > 0",
|
|
@@ -3443,19 +3631,19 @@ var DataSpace = class {
|
|
|
3443
3631
|
{
|
|
3444
3632
|
log9.info("Fragmenting", void 0, {
|
|
3445
3633
|
F: __dxlog_file11,
|
|
3446
|
-
L:
|
|
3634
|
+
L: 445,
|
|
3447
3635
|
S: this,
|
|
3448
3636
|
C: (f, a) => f(...a)
|
|
3449
3637
|
});
|
|
3450
3638
|
const currentRootUrl = this._automergeSpaceState.rootUrl;
|
|
3451
|
-
const rootHandle = this.
|
|
3639
|
+
const rootHandle = this._echoHost.automergeRepo.find(currentRootUrl);
|
|
3452
3640
|
await cancelWithContext2(this._ctx, asyncTimeout(rootHandle.whenReady(), 1e4));
|
|
3453
3641
|
const objects = Object.entries(rootHandle.docSync().objects);
|
|
3454
3642
|
const properties = objects.find(([_, value]) => value.system.type?.itemId === TYPE_PROPERTIES);
|
|
3455
3643
|
const otherObjects = objects.filter(([key]) => key !== properties?.[0]);
|
|
3456
3644
|
invariant10(properties, "Properties not found", {
|
|
3457
3645
|
F: __dxlog_file11,
|
|
3458
|
-
L:
|
|
3646
|
+
L: 455,
|
|
3459
3647
|
S: this,
|
|
3460
3648
|
A: [
|
|
3461
3649
|
"properties",
|
|
@@ -3468,17 +3656,17 @@ var DataSpace = class {
|
|
|
3468
3656
|
properties
|
|
3469
3657
|
])
|
|
3470
3658
|
};
|
|
3471
|
-
const newRoot = this.
|
|
3659
|
+
const newRoot = this._echoHost.automergeRepo.create(newSpaceDoc);
|
|
3472
3660
|
invariant10(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
|
|
3473
3661
|
F: __dxlog_file11,
|
|
3474
|
-
L:
|
|
3662
|
+
L: 460,
|
|
3475
3663
|
S: this,
|
|
3476
3664
|
A: [
|
|
3477
3665
|
"typeof newRoot.url === 'string' && newRoot.url.length > 0",
|
|
3478
3666
|
""
|
|
3479
3667
|
]
|
|
3480
3668
|
});
|
|
3481
|
-
const docLoader = new AutomergeDocumentLoaderImpl(this.key, this.
|
|
3669
|
+
const docLoader = new AutomergeDocumentLoaderImpl(this.key, this._echoHost.automergeRepo);
|
|
3482
3670
|
await docLoader.loadSpaceRootDocHandle(this._ctx, {
|
|
3483
3671
|
rootUrl: newRoot.url
|
|
3484
3672
|
});
|
|
@@ -3540,7 +3728,7 @@ var DataSpace = class {
|
|
|
3540
3728
|
state: SpaceState[this._state]
|
|
3541
3729
|
}, {
|
|
3542
3730
|
F: __dxlog_file11,
|
|
3543
|
-
L:
|
|
3731
|
+
L: 526,
|
|
3544
3732
|
S: this,
|
|
3545
3733
|
C: (f, a) => f(...a)
|
|
3546
3734
|
});
|
|
@@ -3598,17 +3786,17 @@ import { Event as Event7, synchronized as synchronized2, trackLeaks as trackLeak
|
|
|
3598
3786
|
import { Context as Context9, cancelWithContext as cancelWithContext3 } from "@dxos/context";
|
|
3599
3787
|
import { getCredentialAssertion as getCredentialAssertion2 } from "@dxos/credentials";
|
|
3600
3788
|
import { invariant as invariant11 } from "@dxos/invariant";
|
|
3601
|
-
import { PublicKey as
|
|
3789
|
+
import { PublicKey as PublicKey10 } from "@dxos/keys";
|
|
3602
3790
|
import { log as log10 } from "@dxos/log";
|
|
3603
3791
|
import { trace as trace7 } from "@dxos/protocols";
|
|
3604
|
-
import { SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
|
|
3792
|
+
import { Invitation as Invitation6, SpaceState as SpaceState2 } from "@dxos/protocols/proto/dxos/client/services";
|
|
3605
3793
|
import { Gossip as Gossip2, Presence as Presence2 } from "@dxos/teleport-extension-gossip";
|
|
3606
3794
|
import { ComplexMap as ComplexMap3, deferFunction as deferFunction2, forEachAsync } from "@dxos/util";
|
|
3607
3795
|
|
|
3608
3796
|
// packages/sdk/client-services/src/packlets/spaces/genesis.ts
|
|
3609
3797
|
import { createCredential } from "@dxos/credentials";
|
|
3610
3798
|
import { failUndefined } from "@dxos/debug";
|
|
3611
|
-
import { AdmittedFeed as AdmittedFeed4, SpaceMember } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
3799
|
+
import { AdmittedFeed as AdmittedFeed4, SpaceMember as SpaceMember2 } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
3612
3800
|
import { Timeframe as Timeframe3 } from "@dxos/timeframe";
|
|
3613
3801
|
var spaceGenesis = async (keyring, signingContext, space, automergeRoot) => {
|
|
3614
3802
|
const credentials = [
|
|
@@ -3628,7 +3816,7 @@ var spaceGenesis = async (keyring, signingContext, space, automergeRoot) => {
|
|
|
3628
3816
|
assertion: {
|
|
3629
3817
|
"@type": "dxos.halo.credentials.SpaceMember",
|
|
3630
3818
|
spaceKey: space.key,
|
|
3631
|
-
role:
|
|
3819
|
+
role: SpaceMember2.Role.ADMIN,
|
|
3632
3820
|
profile: signingContext.getProfile(),
|
|
3633
3821
|
genesisFeedKey: space.controlFeedKey ?? failUndefined()
|
|
3634
3822
|
}
|
|
@@ -3690,18 +3878,19 @@ var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/s
|
|
|
3690
3878
|
var PRESENCE_ANNOUNCE_INTERVAL = 1e4;
|
|
3691
3879
|
var PRESENCE_OFFLINE_TIMEOUT = 2e4;
|
|
3692
3880
|
var DataSpaceManager = class {
|
|
3693
|
-
constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore,
|
|
3881
|
+
constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _echoHost, _invitationsManager, params) {
|
|
3694
3882
|
this._spaceManager = _spaceManager;
|
|
3695
3883
|
this._metadataStore = _metadataStore;
|
|
3696
3884
|
this._keyring = _keyring;
|
|
3697
3885
|
this._signingContext = _signingContext;
|
|
3698
3886
|
this._feedStore = _feedStore;
|
|
3699
|
-
this.
|
|
3887
|
+
this._echoHost = _echoHost;
|
|
3888
|
+
this._invitationsManager = _invitationsManager;
|
|
3700
3889
|
this._ctx = new Context9();
|
|
3701
3890
|
this.updated = new Event7();
|
|
3702
|
-
this._spaces = new ComplexMap3(
|
|
3891
|
+
this._spaces = new ComplexMap3(PublicKey10.hash);
|
|
3703
3892
|
this._isOpen = false;
|
|
3704
|
-
this._instanceId =
|
|
3893
|
+
this._instanceId = PublicKey10.random().toHex();
|
|
3705
3894
|
const { spaceMemberPresenceAnnounceInterval = PRESENCE_ANNOUNCE_INTERVAL, spaceMemberPresenceOfflineTimeout = PRESENCE_OFFLINE_TIMEOUT } = params ?? {};
|
|
3706
3895
|
this._spaceMemberPresenceAnnounceInterval = spaceMemberPresenceAnnounceInterval;
|
|
3707
3896
|
this._spaceMemberPresenceOfflineTimeout = spaceMemberPresenceOfflineTimeout;
|
|
@@ -3713,7 +3902,7 @@ var DataSpaceManager = class {
|
|
|
3713
3902
|
async open() {
|
|
3714
3903
|
log10("open", void 0, {
|
|
3715
3904
|
F: __dxlog_file12,
|
|
3716
|
-
L:
|
|
3905
|
+
L: 102,
|
|
3717
3906
|
S: this,
|
|
3718
3907
|
C: (f, a) => f(...a)
|
|
3719
3908
|
});
|
|
@@ -3721,7 +3910,7 @@ var DataSpaceManager = class {
|
|
|
3721
3910
|
id: this._instanceId
|
|
3722
3911
|
}), {
|
|
3723
3912
|
F: __dxlog_file12,
|
|
3724
|
-
L:
|
|
3913
|
+
L: 103,
|
|
3725
3914
|
S: this,
|
|
3726
3915
|
C: (f, a) => f(...a)
|
|
3727
3916
|
});
|
|
@@ -3729,7 +3918,7 @@ var DataSpaceManager = class {
|
|
|
3729
3918
|
spaces: this._metadataStore.spaces.length
|
|
3730
3919
|
}, {
|
|
3731
3920
|
F: __dxlog_file12,
|
|
3732
|
-
L:
|
|
3921
|
+
L: 104,
|
|
3733
3922
|
S: this,
|
|
3734
3923
|
C: (f, a) => f(...a)
|
|
3735
3924
|
});
|
|
@@ -3739,7 +3928,7 @@ var DataSpaceManager = class {
|
|
|
3739
3928
|
spaceMetadata
|
|
3740
3929
|
}, {
|
|
3741
3930
|
F: __dxlog_file12,
|
|
3742
|
-
L:
|
|
3931
|
+
L: 108,
|
|
3743
3932
|
S: this,
|
|
3744
3933
|
C: (f, a) => f(...a)
|
|
3745
3934
|
});
|
|
@@ -3750,7 +3939,7 @@ var DataSpaceManager = class {
|
|
|
3750
3939
|
err
|
|
3751
3940
|
}, {
|
|
3752
3941
|
F: __dxlog_file12,
|
|
3753
|
-
L:
|
|
3942
|
+
L: 111,
|
|
3754
3943
|
S: this,
|
|
3755
3944
|
C: (f, a) => f(...a)
|
|
3756
3945
|
});
|
|
@@ -3767,7 +3956,7 @@ var DataSpaceManager = class {
|
|
|
3767
3956
|
id: this._instanceId
|
|
3768
3957
|
}), {
|
|
3769
3958
|
F: __dxlog_file12,
|
|
3770
|
-
L:
|
|
3959
|
+
L: 124,
|
|
3771
3960
|
S: this,
|
|
3772
3961
|
C: (f, a) => f(...a)
|
|
3773
3962
|
});
|
|
@@ -3775,7 +3964,7 @@ var DataSpaceManager = class {
|
|
|
3775
3964
|
async close() {
|
|
3776
3965
|
log10("close", void 0, {
|
|
3777
3966
|
F: __dxlog_file12,
|
|
3778
|
-
L:
|
|
3967
|
+
L: 129,
|
|
3779
3968
|
S: this,
|
|
3780
3969
|
C: (f, a) => f(...a)
|
|
3781
3970
|
});
|
|
@@ -3791,7 +3980,7 @@ var DataSpaceManager = class {
|
|
|
3791
3980
|
async createSpace() {
|
|
3792
3981
|
invariant11(this._isOpen, "Not open.", {
|
|
3793
3982
|
F: __dxlog_file12,
|
|
3794
|
-
L:
|
|
3983
|
+
L: 142,
|
|
3795
3984
|
S: this,
|
|
3796
3985
|
A: [
|
|
3797
3986
|
"this._isOpen",
|
|
@@ -3812,18 +4001,13 @@ var DataSpaceManager = class {
|
|
|
3812
4001
|
spaceKey
|
|
3813
4002
|
}, {
|
|
3814
4003
|
F: __dxlog_file12,
|
|
3815
|
-
L:
|
|
4004
|
+
L: 154,
|
|
3816
4005
|
S: this,
|
|
3817
4006
|
C: (f, a) => f(...a)
|
|
3818
4007
|
});
|
|
3819
|
-
const
|
|
3820
|
-
automergeRoot.change((doc) => {
|
|
3821
|
-
doc.access = {
|
|
3822
|
-
spaceKey: spaceKey.toHex()
|
|
3823
|
-
};
|
|
3824
|
-
});
|
|
4008
|
+
const automergeRootUrl = await this._echoHost.createSpaceRoot(spaceKey);
|
|
3825
4009
|
const space = await this._constructSpace(metadata);
|
|
3826
|
-
const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner,
|
|
4010
|
+
const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner, automergeRootUrl);
|
|
3827
4011
|
await this._metadataStore.addSpace(metadata);
|
|
3828
4012
|
const memberCredential = credentials[1];
|
|
3829
4013
|
invariant11(getCredentialAssertion2(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
|
|
@@ -3928,8 +4112,8 @@ var DataSpaceManager = class {
|
|
|
3928
4112
|
remotePeerId: session.remotePeerId
|
|
3929
4113
|
}));
|
|
3930
4114
|
session.addExtension("dxos.mesh.teleport.notarization", dataSpace.notarizationPlugin.createExtension());
|
|
3931
|
-
this.
|
|
3932
|
-
session.addExtension("dxos.mesh.teleport.automerge", this.
|
|
4115
|
+
this._echoHost.authorizeDevice(space.key, session.remotePeerId);
|
|
4116
|
+
session.addExtension("dxos.mesh.teleport.automerge", this._echoHost.createReplicationExtension());
|
|
3933
4117
|
},
|
|
3934
4118
|
onAuthFailure: () => {
|
|
3935
4119
|
log10.warn("auth failure", void 0, {
|
|
@@ -3939,7 +4123,10 @@ var DataSpaceManager = class {
|
|
|
3939
4123
|
C: (f, a) => f(...a)
|
|
3940
4124
|
});
|
|
3941
4125
|
},
|
|
3942
|
-
memberKey: this._signingContext.identityKey
|
|
4126
|
+
memberKey: this._signingContext.identityKey,
|
|
4127
|
+
onDelegatedInvitationStatusChange: (invitation, isActive) => {
|
|
4128
|
+
return this._handleInvitationStatusChange(dataSpace, invitation, isActive);
|
|
4129
|
+
}
|
|
3943
4130
|
});
|
|
3944
4131
|
controlFeed && await space.setControlFeed(controlFeed);
|
|
3945
4132
|
dataFeed && await space.setDataFeed(dataFeed);
|
|
@@ -3951,6 +4138,7 @@ var DataSpaceManager = class {
|
|
|
3951
4138
|
presence,
|
|
3952
4139
|
keyring: this._keyring,
|
|
3953
4140
|
feedStore: this._feedStore,
|
|
4141
|
+
echoHost: this._echoHost,
|
|
3954
4142
|
signingContext: this._signingContext,
|
|
3955
4143
|
callbacks: {
|
|
3956
4144
|
beforeReady: async () => {
|
|
@@ -3958,7 +4146,7 @@ var DataSpaceManager = class {
|
|
|
3958
4146
|
space: space.key
|
|
3959
4147
|
}, {
|
|
3960
4148
|
F: __dxlog_file12,
|
|
3961
|
-
L:
|
|
4149
|
+
L: 269,
|
|
3962
4150
|
S: this,
|
|
3963
4151
|
C: (f, a) => f(...a)
|
|
3964
4152
|
});
|
|
@@ -3969,11 +4157,14 @@ var DataSpaceManager = class {
|
|
|
3969
4157
|
open: this._isOpen
|
|
3970
4158
|
}, {
|
|
3971
4159
|
F: __dxlog_file12,
|
|
3972
|
-
L:
|
|
4160
|
+
L: 272,
|
|
3973
4161
|
S: this,
|
|
3974
4162
|
C: (f, a) => f(...a)
|
|
3975
4163
|
});
|
|
3976
4164
|
if (this._isOpen) {
|
|
4165
|
+
await this._createDelegatedInvitations(dataSpace, [
|
|
4166
|
+
...space.spaceState.invitations.entries()
|
|
4167
|
+
]);
|
|
3977
4168
|
this.updated.emit();
|
|
3978
4169
|
}
|
|
3979
4170
|
},
|
|
@@ -3982,14 +4173,13 @@ var DataSpaceManager = class {
|
|
|
3982
4173
|
space: space.key
|
|
3983
4174
|
}, {
|
|
3984
4175
|
F: __dxlog_file12,
|
|
3985
|
-
L:
|
|
4176
|
+
L: 279,
|
|
3986
4177
|
S: this,
|
|
3987
4178
|
C: (f, a) => f(...a)
|
|
3988
4179
|
});
|
|
3989
4180
|
}
|
|
3990
4181
|
},
|
|
3991
|
-
cache: metadata.cache
|
|
3992
|
-
automergeHost: this._automergeHost
|
|
4182
|
+
cache: metadata.cache
|
|
3993
4183
|
});
|
|
3994
4184
|
if (metadata.state !== SpaceState2.INACTIVE) {
|
|
3995
4185
|
await dataSpace.open();
|
|
@@ -4000,6 +4190,41 @@ var DataSpaceManager = class {
|
|
|
4000
4190
|
this._spaces.set(metadata.key, dataSpace);
|
|
4001
4191
|
return dataSpace;
|
|
4002
4192
|
}
|
|
4193
|
+
async _handleInvitationStatusChange(dataSpace, delegatedInvitation, isActive) {
|
|
4194
|
+
if (dataSpace?.state !== SpaceState2.READY) {
|
|
4195
|
+
return;
|
|
4196
|
+
}
|
|
4197
|
+
if (isActive) {
|
|
4198
|
+
await this._createDelegatedInvitations(dataSpace, [
|
|
4199
|
+
[
|
|
4200
|
+
delegatedInvitation.credentialId,
|
|
4201
|
+
delegatedInvitation.invitation
|
|
4202
|
+
]
|
|
4203
|
+
]);
|
|
4204
|
+
} else {
|
|
4205
|
+
await this._invitationsManager.cancelInvitation(delegatedInvitation.invitation);
|
|
4206
|
+
}
|
|
4207
|
+
}
|
|
4208
|
+
async _createDelegatedInvitations(space, invitations) {
|
|
4209
|
+
const tasks = invitations.map(([credentialId, invitation]) => {
|
|
4210
|
+
return this._invitationsManager.createInvitation({
|
|
4211
|
+
type: Invitation6.Type.DELEGATED,
|
|
4212
|
+
kind: Invitation6.Kind.SPACE,
|
|
4213
|
+
spaceKey: space.key,
|
|
4214
|
+
authMethod: invitation.authMethod,
|
|
4215
|
+
invitationId: invitation.invitationId,
|
|
4216
|
+
swarmKey: invitation.swarmKey,
|
|
4217
|
+
guestKeypair: invitation.guestKey ? {
|
|
4218
|
+
publicKey: invitation.guestKey
|
|
4219
|
+
} : void 0,
|
|
4220
|
+
lifetime: invitation.expiresOn ? invitation.expiresOn.getTime() - Date.now() : void 0,
|
|
4221
|
+
multiUse: invitation.multiUse,
|
|
4222
|
+
delegationCredentialId: credentialId,
|
|
4223
|
+
persistent: false
|
|
4224
|
+
});
|
|
4225
|
+
});
|
|
4226
|
+
await Promise.all(tasks);
|
|
4227
|
+
}
|
|
4003
4228
|
};
|
|
4004
4229
|
_ts_decorate5([
|
|
4005
4230
|
synchronized2
|
|
@@ -4018,13 +4243,13 @@ DataSpaceManager = _ts_decorate5([
|
|
|
4018
4243
|
], DataSpaceManager);
|
|
4019
4244
|
|
|
4020
4245
|
// packages/sdk/client-services/src/packlets/spaces/spaces-service.ts
|
|
4021
|
-
import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTask as
|
|
4246
|
+
import { EventSubscriptions as EventSubscriptions2, UpdateScheduler, scheduleTask as scheduleTask5 } from "@dxos/async";
|
|
4022
4247
|
import { Stream as Stream10 } from "@dxos/codec-protobuf";
|
|
4023
4248
|
import { raise as raise2 } from "@dxos/debug";
|
|
4024
4249
|
import { invariant as invariant12 } from "@dxos/invariant";
|
|
4025
4250
|
import { log as log11 } from "@dxos/log";
|
|
4026
4251
|
import { ApiError, SpaceNotFoundError, encodeError } from "@dxos/protocols";
|
|
4027
|
-
import { SpaceMember as
|
|
4252
|
+
import { SpaceMember as SpaceMember3, SpaceState as SpaceState3 } from "@dxos/protocols/proto/dxos/client/services";
|
|
4028
4253
|
var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
|
|
4029
4254
|
var SpacesServiceImpl = class {
|
|
4030
4255
|
constructor(_identityManager, _spaceManager, _getDataSpaceManager) {
|
|
@@ -4075,7 +4300,7 @@ var SpacesServiceImpl = class {
|
|
|
4075
4300
|
}, {
|
|
4076
4301
|
maxFrequency: false ? void 0 : 2
|
|
4077
4302
|
});
|
|
4078
|
-
|
|
4303
|
+
scheduleTask5(ctx, async () => {
|
|
4079
4304
|
const dataSpaceManager = await this._getDataSpaceManager();
|
|
4080
4305
|
const subscriptions = new EventSubscriptions2();
|
|
4081
4306
|
ctx.onDispose(() => subscriptions.clear());
|
|
@@ -4109,7 +4334,7 @@ var SpacesServiceImpl = class {
|
|
|
4109
4334
|
}
|
|
4110
4335
|
subscribeMessages({ spaceKey, channel }) {
|
|
4111
4336
|
return new Stream10(({ ctx, next }) => {
|
|
4112
|
-
|
|
4337
|
+
scheduleTask5(ctx, async () => {
|
|
4113
4338
|
const dataSpaceManager = await this._getDataSpaceManager();
|
|
4114
4339
|
const space = dataSpaceManager.spaces.get(spaceKey) ?? raise2(new SpaceNotFoundError(spaceKey));
|
|
4115
4340
|
const handle = space.listen(getChannelId(channel), (message) => {
|
|
@@ -4128,7 +4353,7 @@ var SpacesServiceImpl = class {
|
|
|
4128
4353
|
}
|
|
4129
4354
|
};
|
|
4130
4355
|
ctx.onDispose(() => space.spaceState.removeCredentialProcessor(processor));
|
|
4131
|
-
|
|
4356
|
+
scheduleTask5(ctx, async () => {
|
|
4132
4357
|
await space.spaceState.addCredentialProcessor(processor);
|
|
4133
4358
|
if (noTail) {
|
|
4134
4359
|
close();
|
|
@@ -4222,7 +4447,7 @@ var SpacesServiceImpl = class {
|
|
|
4222
4447
|
identityKey: member.key,
|
|
4223
4448
|
profile: member.profile ?? {}
|
|
4224
4449
|
},
|
|
4225
|
-
presence: member.removed ?
|
|
4450
|
+
presence: member.removed ? SpaceMember3.PresenceState.REMOVED : isMe || peers.length > 0 ? SpaceMember3.PresenceState.ONLINE : SpaceMember3.PresenceState.OFFLINE,
|
|
4226
4451
|
peerStates: peers
|
|
4227
4452
|
};
|
|
4228
4453
|
}),
|
|
@@ -4239,99 +4464,18 @@ import { Trigger as Trigger5 } from "@dxos/async";
|
|
|
4239
4464
|
import { Context as Context10, Resource } from "@dxos/context";
|
|
4240
4465
|
import { getCredentialAssertion as getCredentialAssertion3 } from "@dxos/credentials";
|
|
4241
4466
|
import { failUndefined as failUndefined2 } from "@dxos/debug";
|
|
4242
|
-
import {
|
|
4467
|
+
import { EchoHost } from "@dxos/echo-db";
|
|
4468
|
+
import { MetadataStore, SnapshotStore, SpaceManager, valueEncoding } from "@dxos/echo-pipeline";
|
|
4243
4469
|
import { FeedFactory, FeedStore } from "@dxos/feed-store";
|
|
4244
|
-
import { IndexMetadataStore, IndexStore, Indexer } from "@dxos/indexing";
|
|
4245
4470
|
import { invariant as invariant13 } from "@dxos/invariant";
|
|
4246
4471
|
import { Keyring } from "@dxos/keyring";
|
|
4247
|
-
import { PublicKey as
|
|
4472
|
+
import { PublicKey as PublicKey11 } from "@dxos/keys";
|
|
4248
4473
|
import { log as log12 } from "@dxos/log";
|
|
4249
4474
|
import { InvalidStorageVersionError, STORAGE_VERSION, trace as trace8 } from "@dxos/protocols";
|
|
4250
|
-
import { Invitation as
|
|
4475
|
+
import { Invitation as Invitation7 } from "@dxos/protocols/proto/dxos/client/services";
|
|
4251
4476
|
import { BlobStore } from "@dxos/teleport-extension-object-sync";
|
|
4252
4477
|
import { trace as Trace2 } from "@dxos/tracing";
|
|
4253
4478
|
import { safeInstanceof } from "@dxos/util";
|
|
4254
|
-
|
|
4255
|
-
// packages/sdk/client-services/src/packlets/indexing/util.ts
|
|
4256
|
-
import { getHeads } from "@dxos/automerge/automerge";
|
|
4257
|
-
import { warnAfterTimeout as warnAfterTimeout2 } from "@dxos/debug";
|
|
4258
|
-
import { idCodec } from "@dxos/protocols";
|
|
4259
|
-
var createSelectedDocumentsIterator = (automergeHost) => (
|
|
4260
|
-
/**
|
|
4261
|
-
* Get object data blobs from Automerge Repo by ids.
|
|
4262
|
-
* @param ids
|
|
4263
|
-
*/
|
|
4264
|
-
// TODO(mykola): Unload automerge handles after usage.
|
|
4265
|
-
async function* loadDocuments(ids) {
|
|
4266
|
-
for (const id of ids) {
|
|
4267
|
-
const { documentId, objectId } = idCodec.decode(id);
|
|
4268
|
-
const handle = automergeHost.repo.find(documentId);
|
|
4269
|
-
await warnAfterTimeout2(5e3, "to long to load doc", () => handle.whenReady());
|
|
4270
|
-
const doc = handle.docSync();
|
|
4271
|
-
const hash = getHeads(doc).join("");
|
|
4272
|
-
yield doc.objects?.[objectId] ? [
|
|
4273
|
-
{
|
|
4274
|
-
id,
|
|
4275
|
-
object: doc.objects[objectId],
|
|
4276
|
-
currentHash: hash
|
|
4277
|
-
}
|
|
4278
|
-
] : [];
|
|
4279
|
-
}
|
|
4280
|
-
}
|
|
4281
|
-
);
|
|
4282
|
-
var createDocumentsIterator = (automergeHost) => (
|
|
4283
|
-
/**
|
|
4284
|
-
* Recursively get all object data blobs from Automerge Repo.
|
|
4285
|
-
* @param ids
|
|
4286
|
-
*/
|
|
4287
|
-
// TODO(mykola): Unload automerge handles after usage.
|
|
4288
|
-
async function* getAllDocuments() {
|
|
4289
|
-
const visited = /* @__PURE__ */ new Set();
|
|
4290
|
-
async function* getObjectsFromHandle(handle) {
|
|
4291
|
-
if (visited.has(handle.documentId)) {
|
|
4292
|
-
return;
|
|
4293
|
-
}
|
|
4294
|
-
await warnAfterTimeout2(5e3, "to long to load doc", () => handle.whenReady());
|
|
4295
|
-
const doc = handle.docSync();
|
|
4296
|
-
const heads = getHeads(doc);
|
|
4297
|
-
if (doc.objects) {
|
|
4298
|
-
yield Object.entries(doc.objects).map(([objectId, object]) => {
|
|
4299
|
-
return {
|
|
4300
|
-
id: idCodec.encode({
|
|
4301
|
-
documentId: handle.documentId,
|
|
4302
|
-
objectId
|
|
4303
|
-
}),
|
|
4304
|
-
object,
|
|
4305
|
-
currentHash: heads.join("")
|
|
4306
|
-
};
|
|
4307
|
-
});
|
|
4308
|
-
}
|
|
4309
|
-
if (doc.links) {
|
|
4310
|
-
for (const id of Object.values(doc.links)) {
|
|
4311
|
-
if (visited.has(id)) {
|
|
4312
|
-
continue;
|
|
4313
|
-
}
|
|
4314
|
-
const linkHandle = automergeHost.repo.find(id);
|
|
4315
|
-
for await (const result of getObjectsFromHandle(linkHandle)) {
|
|
4316
|
-
yield result;
|
|
4317
|
-
}
|
|
4318
|
-
}
|
|
4319
|
-
}
|
|
4320
|
-
visited.add(handle.documentId);
|
|
4321
|
-
}
|
|
4322
|
-
for (const handle of Object.values(automergeHost.repo.handles)) {
|
|
4323
|
-
if (visited.has(handle.documentId)) {
|
|
4324
|
-
continue;
|
|
4325
|
-
}
|
|
4326
|
-
for await (const result of getObjectsFromHandle(handle)) {
|
|
4327
|
-
yield result;
|
|
4328
|
-
}
|
|
4329
|
-
visited.add(handle.documentId);
|
|
4330
|
-
}
|
|
4331
|
-
}
|
|
4332
|
-
);
|
|
4333
|
-
|
|
4334
|
-
// packages/sdk/client-services/src/packlets/services/service-context.ts
|
|
4335
4479
|
function _ts_decorate6(decorators, target, key, desc) {
|
|
4336
4480
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4337
4481
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
@@ -4353,7 +4497,7 @@ var ServiceContext = class extends Resource {
|
|
|
4353
4497
|
this._runtimeParams = _runtimeParams;
|
|
4354
4498
|
this.initialized = new Trigger5();
|
|
4355
4499
|
this._handlerFactories = /* @__PURE__ */ new Map();
|
|
4356
|
-
this._instanceId =
|
|
4500
|
+
this._instanceId = PublicKey11.random().toHex();
|
|
4357
4501
|
this.metadataStore = new MetadataStore(storage.createDirectory("metadata"));
|
|
4358
4502
|
this.snapshotStore = new SnapshotStore(storage.createDirectory("snapshots"));
|
|
4359
4503
|
this.blobStore = new BlobStore(storage.createDirectory("blobs"));
|
|
@@ -4376,29 +4520,19 @@ var ServiceContext = class extends Resource {
|
|
|
4376
4520
|
snapshotStore: this.snapshotStore
|
|
4377
4521
|
});
|
|
4378
4522
|
this.identityManager = new IdentityManager(this.metadataStore, this.keyring, this.feedStore, this.spaceManager, this._runtimeParams);
|
|
4379
|
-
this.
|
|
4380
|
-
|
|
4381
|
-
|
|
4382
|
-
this.automergeHost = new AutomergeHost({
|
|
4383
|
-
directory: storage.createDirectory("automerge"),
|
|
4384
|
-
metadata: this.indexMetadata
|
|
4385
|
-
});
|
|
4386
|
-
this.indexer = new Indexer({
|
|
4387
|
-
indexStore: new IndexStore({
|
|
4388
|
-
directory: storage.createDirectory("index-store")
|
|
4389
|
-
}),
|
|
4390
|
-
metadataStore: this.indexMetadata,
|
|
4391
|
-
loadDocuments: createSelectedDocumentsIterator(this.automergeHost),
|
|
4392
|
-
getAllDocuments: createDocumentsIterator(this.automergeHost)
|
|
4523
|
+
this.echoHost = new EchoHost({
|
|
4524
|
+
kv: this.level,
|
|
4525
|
+
storage: this.storage
|
|
4393
4526
|
});
|
|
4394
4527
|
this.invitations = new InvitationsHandler(this.networkManager);
|
|
4395
|
-
this.
|
|
4528
|
+
this.invitationsManager = new InvitationsManager(this.invitations, (invitation) => this.getInvitationHandler(invitation), this.metadataStore);
|
|
4529
|
+
this._handlerFactories.set(Invitation7.Kind.DEVICE, () => new DeviceInvitationProtocol(this.keyring, () => this.identityManager.identity ?? failUndefined2(), this._acceptIdentity.bind(this)));
|
|
4396
4530
|
}
|
|
4397
4531
|
async _open(ctx) {
|
|
4398
4532
|
await this._checkStorageVersion();
|
|
4399
4533
|
log12("opening...", void 0, {
|
|
4400
4534
|
F: __dxlog_file14,
|
|
4401
|
-
L:
|
|
4535
|
+
L: 151,
|
|
4402
4536
|
S: this,
|
|
4403
4537
|
C: (f, a) => f(...a)
|
|
4404
4538
|
});
|
|
@@ -4406,18 +4540,28 @@ var ServiceContext = class extends Resource {
|
|
|
4406
4540
|
id: this._instanceId
|
|
4407
4541
|
}), {
|
|
4408
4542
|
F: __dxlog_file14,
|
|
4409
|
-
L:
|
|
4543
|
+
L: 152,
|
|
4410
4544
|
S: this,
|
|
4411
4545
|
C: (f, a) => f(...a)
|
|
4412
4546
|
});
|
|
4413
4547
|
await this.signalManager.open();
|
|
4414
4548
|
await this.networkManager.open();
|
|
4549
|
+
await this.echoHost.open(ctx);
|
|
4415
4550
|
await this.metadataStore.load();
|
|
4416
4551
|
await this.spaceManager.open();
|
|
4417
4552
|
await this.identityManager.open(ctx);
|
|
4418
4553
|
if (this.identityManager.identity) {
|
|
4419
4554
|
await this._initialize(ctx);
|
|
4420
4555
|
}
|
|
4556
|
+
const loadedInvitations = await this.invitationsManager.loadPersistentInvitations();
|
|
4557
|
+
log12("loaded persistent invitations", {
|
|
4558
|
+
count: loadedInvitations.invitations?.length
|
|
4559
|
+
}, {
|
|
4560
|
+
F: __dxlog_file14,
|
|
4561
|
+
L: 165,
|
|
4562
|
+
S: this,
|
|
4563
|
+
C: (f, a) => f(...a)
|
|
4564
|
+
});
|
|
4421
4565
|
log12.trace("dxos.sdk.service-context.open", trace8.end({
|
|
4422
4566
|
id: this._instanceId
|
|
4423
4567
|
}), {
|
|
@@ -4433,7 +4577,7 @@ var ServiceContext = class extends Resource {
|
|
|
4433
4577
|
C: (f, a) => f(...a)
|
|
4434
4578
|
});
|
|
4435
4579
|
}
|
|
4436
|
-
async _close() {
|
|
4580
|
+
async _close(ctx) {
|
|
4437
4581
|
log12("closing...", void 0, {
|
|
4438
4582
|
F: __dxlog_file14,
|
|
4439
4583
|
L: 172,
|
|
@@ -4443,18 +4587,17 @@ var ServiceContext = class extends Resource {
|
|
|
4443
4587
|
if (this._deviceSpaceSync && this.identityManager.identity) {
|
|
4444
4588
|
await this.identityManager.identity.space.spaceState.removeCredentialProcessor(this._deviceSpaceSync);
|
|
4445
4589
|
}
|
|
4446
|
-
await this.automergeHost.close();
|
|
4447
4590
|
await this.dataSpaceManager?.close();
|
|
4448
4591
|
await this.identityManager.close();
|
|
4449
4592
|
await this.spaceManager.close();
|
|
4450
4593
|
await this.feedStore.close();
|
|
4594
|
+
await this.metadataStore.close();
|
|
4595
|
+
await this.echoHost.close(ctx);
|
|
4451
4596
|
await this.networkManager.close();
|
|
4452
4597
|
await this.signalManager.close();
|
|
4453
|
-
await this.metadataStore.close();
|
|
4454
|
-
await this.indexer.destroy();
|
|
4455
4598
|
log12("closed", void 0, {
|
|
4456
4599
|
F: __dxlog_file14,
|
|
4457
|
-
L:
|
|
4600
|
+
L: 184,
|
|
4458
4601
|
S: this,
|
|
4459
4602
|
C: (f, a) => f(...a)
|
|
4460
4603
|
});
|
|
@@ -4468,7 +4611,7 @@ var ServiceContext = class extends Resource {
|
|
|
4468
4611
|
const factory = this._handlerFactories.get(invitation.kind);
|
|
4469
4612
|
invariant13(factory, `Unknown invitation kind: ${invitation.kind}`, {
|
|
4470
4613
|
F: __dxlog_file14,
|
|
4471
|
-
L:
|
|
4614
|
+
L: 195,
|
|
4472
4615
|
S: this,
|
|
4473
4616
|
A: [
|
|
4474
4617
|
"factory",
|
|
@@ -4500,7 +4643,7 @@ var ServiceContext = class extends Resource {
|
|
|
4500
4643
|
async _initialize(ctx) {
|
|
4501
4644
|
log12("initializing spaces...", void 0, {
|
|
4502
4645
|
F: __dxlog_file14,
|
|
4503
|
-
L:
|
|
4646
|
+
L: 226,
|
|
4504
4647
|
S: this,
|
|
4505
4648
|
C: (f, a) => f(...a)
|
|
4506
4649
|
});
|
|
@@ -4518,9 +4661,9 @@ var ServiceContext = class extends Resource {
|
|
|
4518
4661
|
});
|
|
4519
4662
|
}
|
|
4520
4663
|
};
|
|
4521
|
-
this.dataSpaceManager = new DataSpaceManager(this.spaceManager, this.metadataStore, this.keyring, signingContext, this.feedStore, this.
|
|
4664
|
+
this.dataSpaceManager = new DataSpaceManager(this.spaceManager, this.metadataStore, this.keyring, signingContext, this.feedStore, this.echoHost, this.invitationsManager, this._runtimeParams);
|
|
4522
4665
|
await this.dataSpaceManager.open();
|
|
4523
|
-
this._handlerFactories.set(
|
|
4666
|
+
this._handlerFactories.set(Invitation7.Kind.SPACE, (invitation) => {
|
|
4524
4667
|
invariant13(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
|
|
4525
4668
|
F: __dxlog_file14,
|
|
4526
4669
|
L: 251,
|
|
@@ -4630,11 +4773,11 @@ import { getFirstStreamValue } from "@dxos/codec-protobuf";
|
|
|
4630
4773
|
import { credentialTypeFilter } from "@dxos/credentials";
|
|
4631
4774
|
import { invariant as invariant14 } from "@dxos/invariant";
|
|
4632
4775
|
import { STORAGE_VERSION as STORAGE_VERSION2 } from "@dxos/protocols";
|
|
4633
|
-
import { SpaceMember as
|
|
4776
|
+
import { SpaceMember as SpaceMember4 } from "@dxos/protocols/proto/dxos/client/services";
|
|
4634
4777
|
import { TRACE_PROCESSOR } from "@dxos/tracing";
|
|
4635
4778
|
|
|
4636
4779
|
// packages/sdk/client-services/src/version.ts
|
|
4637
|
-
var DXOS_VERSION = "0.4.10-main.
|
|
4780
|
+
var DXOS_VERSION = "0.4.10-main.c61b011";
|
|
4638
4781
|
|
|
4639
4782
|
// packages/sdk/client-services/src/packlets/services/platform.ts
|
|
4640
4783
|
import { Platform } from "@dxos/protocols/proto/dxos/client/services";
|
|
@@ -4756,7 +4899,7 @@ var getSpaceStats = async (space) => {
|
|
|
4756
4899
|
displayName: member.assertion.profile?.displayName
|
|
4757
4900
|
}
|
|
4758
4901
|
},
|
|
4759
|
-
presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ?
|
|
4902
|
+
presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ? SpaceMember4.PresenceState.ONLINE : SpaceMember4.PresenceState.OFFLINE
|
|
4760
4903
|
})),
|
|
4761
4904
|
pipeline: {
|
|
4762
4905
|
// TODO(burdon): Pick properties from credentials if needed.
|
|
@@ -4878,11 +5021,10 @@ import { jsonKeyReplacer as jsonKeyReplacer2, nonNullable } from "@dxos/util";
|
|
|
4878
5021
|
import { Event as Event9, synchronized as synchronized3 } from "@dxos/async";
|
|
4879
5022
|
import { clientServiceBundle, defaultKey, Properties } from "@dxos/client-protocol";
|
|
4880
5023
|
import { Context as Context11 } from "@dxos/context";
|
|
4881
|
-
import {
|
|
4882
|
-
import
|
|
4883
|
-
import { IndexServiceImpl } from "@dxos/indexing";
|
|
5024
|
+
import { encodeReference } from "@dxos/echo-pipeline";
|
|
5025
|
+
import { getTypeReference } from "@dxos/echo-schema";
|
|
4884
5026
|
import { invariant as invariant16 } from "@dxos/invariant";
|
|
4885
|
-
import { PublicKey as
|
|
5027
|
+
import { PublicKey as PublicKey14 } from "@dxos/keys";
|
|
4886
5028
|
import { log as log16 } from "@dxos/log";
|
|
4887
5029
|
import { WebsocketSignalManager } from "@dxos/messaging";
|
|
4888
5030
|
import { NetworkManager, createSimplePeerTransportFactory } from "@dxos/network-manager";
|
|
@@ -5101,7 +5243,7 @@ var isLocked = (lockPath) => {
|
|
|
5101
5243
|
// packages/sdk/client-services/src/packlets/logging/logging-service.ts
|
|
5102
5244
|
import { Event as Event8 } from "@dxos/async";
|
|
5103
5245
|
import { Stream as Stream12 } from "@dxos/codec-protobuf";
|
|
5104
|
-
import { PublicKey as
|
|
5246
|
+
import { PublicKey as PublicKey12 } from "@dxos/keys";
|
|
5105
5247
|
import { getContextFromEntry, log as log15 } from "@dxos/log";
|
|
5106
5248
|
import { QueryLogsRequest } from "@dxos/protocols/proto/dxos/client/services";
|
|
5107
5249
|
import { getDebugName, jsonify, numericalValues, tracer } from "@dxos/util";
|
|
@@ -5109,7 +5251,7 @@ var LoggingServiceImpl = class {
|
|
|
5109
5251
|
constructor() {
|
|
5110
5252
|
this._logs = new Event8();
|
|
5111
5253
|
this._started = Date.now();
|
|
5112
|
-
this._sessionId =
|
|
5254
|
+
this._sessionId = PublicKey12.random().toHex();
|
|
5113
5255
|
this._logProcessor = (_config, entry2) => {
|
|
5114
5256
|
this._logs.emit(entry2);
|
|
5115
5257
|
};
|
|
@@ -5320,10 +5462,10 @@ var toStorageType = (type) => {
|
|
|
5320
5462
|
// packages/sdk/client-services/src/packlets/storage/level.ts
|
|
5321
5463
|
import { Level } from "level";
|
|
5322
5464
|
import path from "@dxos/node-std/path";
|
|
5323
|
-
import { PublicKey as
|
|
5465
|
+
import { PublicKey as PublicKey13 } from "@dxos/keys";
|
|
5324
5466
|
var createLevel = async (config) => {
|
|
5325
5467
|
const persistent = isPersistent(config);
|
|
5326
|
-
const storagePath = persistent ? getRootPath(config)
|
|
5468
|
+
const storagePath = persistent ? path.join(getRootPath(config), "level") : `/tmp/dxos-${PublicKey13.random().toHex()}`;
|
|
5327
5469
|
const level = new Level(storagePath);
|
|
5328
5470
|
await level.open();
|
|
5329
5471
|
return level;
|
|
@@ -5404,6 +5546,7 @@ var ClientServicesHost = class {
|
|
|
5404
5546
|
transportFactory,
|
|
5405
5547
|
signalManager,
|
|
5406
5548
|
storage,
|
|
5549
|
+
level,
|
|
5407
5550
|
// TODO(wittjosiah): Turn this on by default.
|
|
5408
5551
|
lockKey,
|
|
5409
5552
|
callbacks,
|
|
@@ -5414,6 +5557,7 @@ var ClientServicesHost = class {
|
|
|
5414
5557
|
this._opening = false;
|
|
5415
5558
|
this._open = false;
|
|
5416
5559
|
this._storage = storage;
|
|
5560
|
+
this._level = level;
|
|
5417
5561
|
this._callbacks = callbacks;
|
|
5418
5562
|
this._runtimeParams = runtimeParams;
|
|
5419
5563
|
if (config) {
|
|
@@ -5485,7 +5629,7 @@ var ClientServicesHost = class {
|
|
|
5485
5629
|
initialize({ config, ...options }) {
|
|
5486
5630
|
invariant16(!this._open, "service host is open", {
|
|
5487
5631
|
F: __dxlog_file19,
|
|
5488
|
-
L:
|
|
5632
|
+
L: 190,
|
|
5489
5633
|
S: this,
|
|
5490
5634
|
A: [
|
|
5491
5635
|
"!this._open",
|
|
@@ -5494,14 +5638,14 @@ var ClientServicesHost = class {
|
|
|
5494
5638
|
});
|
|
5495
5639
|
log16("initializing...", void 0, {
|
|
5496
5640
|
F: __dxlog_file19,
|
|
5497
|
-
L:
|
|
5641
|
+
L: 191,
|
|
5498
5642
|
S: this,
|
|
5499
5643
|
C: (f, a) => f(...a)
|
|
5500
5644
|
});
|
|
5501
5645
|
if (config) {
|
|
5502
5646
|
invariant16(!this._config, "config already set", {
|
|
5503
5647
|
F: __dxlog_file19,
|
|
5504
|
-
L:
|
|
5648
|
+
L: 194,
|
|
5505
5649
|
S: this,
|
|
5506
5650
|
A: [
|
|
5507
5651
|
"!this._config",
|
|
@@ -5516,7 +5660,7 @@ var ClientServicesHost = class {
|
|
|
5516
5660
|
if (!options.signalManager) {
|
|
5517
5661
|
log16.warn("running signaling without telemetry metadata.", void 0, {
|
|
5518
5662
|
F: __dxlog_file19,
|
|
5519
|
-
L:
|
|
5663
|
+
L: 202,
|
|
5520
5664
|
S: this,
|
|
5521
5665
|
C: (f, a) => f(...a)
|
|
5522
5666
|
});
|
|
@@ -5527,7 +5671,7 @@ var ClientServicesHost = class {
|
|
|
5527
5671
|
this._signalManager = signalManager;
|
|
5528
5672
|
invariant16(!this._networkManager, "network manager already set", {
|
|
5529
5673
|
F: __dxlog_file19,
|
|
5530
|
-
L:
|
|
5674
|
+
L: 213,
|
|
5531
5675
|
S: this,
|
|
5532
5676
|
A: [
|
|
5533
5677
|
"!this._networkManager",
|
|
@@ -5541,7 +5685,7 @@ var ClientServicesHost = class {
|
|
|
5541
5685
|
});
|
|
5542
5686
|
log16("initialized", void 0, {
|
|
5543
5687
|
F: __dxlog_file19,
|
|
5544
|
-
L:
|
|
5688
|
+
L: 220,
|
|
5545
5689
|
S: this,
|
|
5546
5690
|
C: (f, a) => f(...a)
|
|
5547
5691
|
});
|
|
@@ -5550,18 +5694,18 @@ var ClientServicesHost = class {
|
|
|
5550
5694
|
if (this._open) {
|
|
5551
5695
|
return;
|
|
5552
5696
|
}
|
|
5553
|
-
const traceId =
|
|
5697
|
+
const traceId = PublicKey14.random().toHex();
|
|
5554
5698
|
log16.trace("dxos.client-services.host.open", trace9.begin({
|
|
5555
5699
|
id: traceId
|
|
5556
5700
|
}), {
|
|
5557
5701
|
F: __dxlog_file19,
|
|
5558
|
-
L:
|
|
5702
|
+
L: 231,
|
|
5559
5703
|
S: this,
|
|
5560
5704
|
C: (f, a) => f(...a)
|
|
5561
5705
|
});
|
|
5562
5706
|
invariant16(this._config, "config not set", {
|
|
5563
5707
|
F: __dxlog_file19,
|
|
5564
|
-
L:
|
|
5708
|
+
L: 233,
|
|
5565
5709
|
S: this,
|
|
5566
5710
|
A: [
|
|
5567
5711
|
"this._config",
|
|
@@ -5570,7 +5714,7 @@ var ClientServicesHost = class {
|
|
|
5570
5714
|
});
|
|
5571
5715
|
invariant16(this._storage, "storage not set", {
|
|
5572
5716
|
F: __dxlog_file19,
|
|
5573
|
-
L:
|
|
5717
|
+
L: 234,
|
|
5574
5718
|
S: this,
|
|
5575
5719
|
A: [
|
|
5576
5720
|
"this._storage",
|
|
@@ -5579,7 +5723,7 @@ var ClientServicesHost = class {
|
|
|
5579
5723
|
});
|
|
5580
5724
|
invariant16(this._signalManager, "signal manager not set", {
|
|
5581
5725
|
F: __dxlog_file19,
|
|
5582
|
-
L:
|
|
5726
|
+
L: 235,
|
|
5583
5727
|
S: this,
|
|
5584
5728
|
A: [
|
|
5585
5729
|
"this._signalManager",
|
|
@@ -5588,7 +5732,7 @@ var ClientServicesHost = class {
|
|
|
5588
5732
|
});
|
|
5589
5733
|
invariant16(this._networkManager, "network manager not set", {
|
|
5590
5734
|
F: __dxlog_file19,
|
|
5591
|
-
L:
|
|
5735
|
+
L: 236,
|
|
5592
5736
|
S: this,
|
|
5593
5737
|
A: [
|
|
5594
5738
|
"this._networkManager",
|
|
@@ -5600,30 +5744,28 @@ var ClientServicesHost = class {
|
|
|
5600
5744
|
lockKey: this._resourceLock?.lockKey
|
|
5601
5745
|
}, {
|
|
5602
5746
|
F: __dxlog_file19,
|
|
5603
|
-
L:
|
|
5747
|
+
L: 239,
|
|
5604
5748
|
S: this,
|
|
5605
5749
|
C: (f, a) => f(...a)
|
|
5606
5750
|
});
|
|
5607
5751
|
if (!this._level) {
|
|
5608
5752
|
this._level = await createLevel(this._config.get("runtime.client.storage", {}));
|
|
5609
5753
|
}
|
|
5754
|
+
await this._level.open();
|
|
5610
5755
|
await this._resourceLock?.acquire();
|
|
5611
5756
|
await this._loggingService.open();
|
|
5612
5757
|
this._serviceContext = new ServiceContext(this._storage, this._level, this._networkManager, this._signalManager, this._runtimeParams);
|
|
5613
5758
|
this._serviceRegistry.setServices({
|
|
5614
5759
|
SystemService: this._systemService,
|
|
5615
5760
|
IdentityService: new IdentityServiceImpl((params) => this._createIdentity(params), this._serviceContext.identityManager, this._serviceContext.keyring, (profile) => this._serviceContext.broadcastProfileUpdate(profile)),
|
|
5616
|
-
InvitationsService: new InvitationsServiceImpl(this._serviceContext.
|
|
5761
|
+
InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitationsManager),
|
|
5617
5762
|
DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
|
|
5618
5763
|
SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, async () => {
|
|
5619
5764
|
await this._serviceContext.initialized.wait();
|
|
5620
5765
|
return this._serviceContext.dataSpaceManager;
|
|
5621
5766
|
}),
|
|
5622
|
-
DataService:
|
|
5623
|
-
|
|
5624
|
-
indexer: this._serviceContext.indexer,
|
|
5625
|
-
automergeHost: this._serviceContext.automergeHost
|
|
5626
|
-
}),
|
|
5767
|
+
DataService: this._serviceContext.echoHost.dataService,
|
|
5768
|
+
QueryService: this._serviceContext.echoHost.queryService,
|
|
5627
5769
|
NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager, this._serviceContext.signalManager),
|
|
5628
5770
|
LoggingService: this._loggingService,
|
|
5629
5771
|
TracingService: this._tracingService,
|
|
@@ -5635,24 +5777,6 @@ var ClientServicesHost = class {
|
|
|
5635
5777
|
})
|
|
5636
5778
|
});
|
|
5637
5779
|
await this._serviceContext.open(ctx);
|
|
5638
|
-
invariant16(this.serviceRegistry.services.InvitationsService, void 0, {
|
|
5639
|
-
F: __dxlog_file19,
|
|
5640
|
-
L: 303,
|
|
5641
|
-
S: this,
|
|
5642
|
-
A: [
|
|
5643
|
-
"this.serviceRegistry.services.InvitationsService",
|
|
5644
|
-
""
|
|
5645
|
-
]
|
|
5646
|
-
});
|
|
5647
|
-
const loadedInvitations = await this.serviceRegistry.services.InvitationsService.loadPersistentInvitations();
|
|
5648
|
-
log16("loaded persistent invitations", {
|
|
5649
|
-
count: loadedInvitations.invitations?.length
|
|
5650
|
-
}, {
|
|
5651
|
-
F: __dxlog_file19,
|
|
5652
|
-
L: 306,
|
|
5653
|
-
S: this,
|
|
5654
|
-
C: (f, a) => f(...a)
|
|
5655
|
-
});
|
|
5656
5780
|
const devtoolsProxy = this._config?.get("runtime.client.devtoolsProxy");
|
|
5657
5781
|
if (devtoolsProxy) {
|
|
5658
5782
|
this._devtoolsProxy = new WebsocketRpcClient({
|
|
@@ -5672,7 +5796,7 @@ var ClientServicesHost = class {
|
|
|
5672
5796
|
deviceKey
|
|
5673
5797
|
}, {
|
|
5674
5798
|
F: __dxlog_file19,
|
|
5675
|
-
L:
|
|
5799
|
+
L: 315,
|
|
5676
5800
|
S: this,
|
|
5677
5801
|
C: (f, a) => f(...a)
|
|
5678
5802
|
});
|
|
@@ -5680,7 +5804,7 @@ var ClientServicesHost = class {
|
|
|
5680
5804
|
id: traceId
|
|
5681
5805
|
}), {
|
|
5682
5806
|
F: __dxlog_file19,
|
|
5683
|
-
L:
|
|
5807
|
+
L: 316,
|
|
5684
5808
|
S: this,
|
|
5685
5809
|
C: (f, a) => f(...a)
|
|
5686
5810
|
});
|
|
@@ -5694,7 +5818,7 @@ var ClientServicesHost = class {
|
|
|
5694
5818
|
deviceKey
|
|
5695
5819
|
}, {
|
|
5696
5820
|
F: __dxlog_file19,
|
|
5697
|
-
L:
|
|
5821
|
+
L: 327,
|
|
5698
5822
|
S: this,
|
|
5699
5823
|
C: (f, a) => f(...a)
|
|
5700
5824
|
});
|
|
@@ -5712,24 +5836,24 @@ var ClientServicesHost = class {
|
|
|
5712
5836
|
deviceKey
|
|
5713
5837
|
}, {
|
|
5714
5838
|
F: __dxlog_file19,
|
|
5715
|
-
L:
|
|
5839
|
+
L: 336,
|
|
5716
5840
|
S: this,
|
|
5717
5841
|
C: (f, a) => f(...a)
|
|
5718
5842
|
});
|
|
5719
5843
|
}
|
|
5720
5844
|
async reset() {
|
|
5721
|
-
const traceId =
|
|
5845
|
+
const traceId = PublicKey14.random().toHex();
|
|
5722
5846
|
log16.trace("dxos.sdk.client-services-host.reset", trace9.begin({
|
|
5723
5847
|
id: traceId
|
|
5724
5848
|
}), {
|
|
5725
5849
|
F: __dxlog_file19,
|
|
5726
|
-
L:
|
|
5850
|
+
L: 341,
|
|
5727
5851
|
S: this,
|
|
5728
5852
|
C: (f, a) => f(...a)
|
|
5729
5853
|
});
|
|
5730
5854
|
log16("resetting...", void 0, {
|
|
5731
5855
|
F: __dxlog_file19,
|
|
5732
|
-
L:
|
|
5856
|
+
L: 343,
|
|
5733
5857
|
S: this,
|
|
5734
5858
|
C: (f, a) => f(...a)
|
|
5735
5859
|
});
|
|
@@ -5737,7 +5861,7 @@ var ClientServicesHost = class {
|
|
|
5737
5861
|
await this._storage.reset();
|
|
5738
5862
|
log16("reset", void 0, {
|
|
5739
5863
|
F: __dxlog_file19,
|
|
5740
|
-
L:
|
|
5864
|
+
L: 346,
|
|
5741
5865
|
S: this,
|
|
5742
5866
|
C: (f, a) => f(...a)
|
|
5743
5867
|
});
|
|
@@ -5745,7 +5869,7 @@ var ClientServicesHost = class {
|
|
|
5745
5869
|
id: traceId
|
|
5746
5870
|
}), {
|
|
5747
5871
|
F: __dxlog_file19,
|
|
5748
|
-
L:
|
|
5872
|
+
L: 347,
|
|
5749
5873
|
S: this,
|
|
5750
5874
|
C: (f, a) => f(...a)
|
|
5751
5875
|
});
|
|
@@ -5758,18 +5882,18 @@ var ClientServicesHost = class {
|
|
|
5758
5882
|
const automergeIndex = space.automergeSpaceState.rootUrl;
|
|
5759
5883
|
invariant16(automergeIndex, void 0, {
|
|
5760
5884
|
F: __dxlog_file19,
|
|
5761
|
-
L:
|
|
5885
|
+
L: 359,
|
|
5762
5886
|
S: this,
|
|
5763
5887
|
A: [
|
|
5764
5888
|
"automergeIndex",
|
|
5765
5889
|
""
|
|
5766
5890
|
]
|
|
5767
5891
|
});
|
|
5768
|
-
const document = await this._serviceContext.
|
|
5892
|
+
const document = await this._serviceContext.echoHost.automergeRepo.find(automergeIndex);
|
|
5769
5893
|
await document.whenReady();
|
|
5770
5894
|
const properties = {
|
|
5771
5895
|
system: {
|
|
5772
|
-
type: encodeReference(
|
|
5896
|
+
type: encodeReference(getTypeReference(Properties))
|
|
5773
5897
|
},
|
|
5774
5898
|
data: {
|
|
5775
5899
|
[defaultKey]: identity.identityKey.toHex()
|
|
@@ -5778,14 +5902,14 @@ var ClientServicesHost = class {
|
|
|
5778
5902
|
keys: []
|
|
5779
5903
|
}
|
|
5780
5904
|
};
|
|
5781
|
-
const propertiesId =
|
|
5905
|
+
const propertiesId = PublicKey14.random().toHex();
|
|
5782
5906
|
document.change((doc) => {
|
|
5783
5907
|
assignDeep2(doc, [
|
|
5784
5908
|
"objects",
|
|
5785
5909
|
propertiesId
|
|
5786
5910
|
], properties);
|
|
5787
5911
|
});
|
|
5788
|
-
await this._serviceContext.
|
|
5912
|
+
await this._serviceContext.echoHost.flush();
|
|
5789
5913
|
return identity;
|
|
5790
5914
|
}
|
|
5791
5915
|
};
|
|
@@ -5808,7 +5932,7 @@ ClientServicesHost = _ts_decorate8([
|
|
|
5808
5932
|
], ClientServicesHost);
|
|
5809
5933
|
|
|
5810
5934
|
// packages/sdk/client-services/src/packlets/services/util.ts
|
|
5811
|
-
import { PublicKey as
|
|
5935
|
+
import { PublicKey as PublicKey15 } from "@dxos/keys";
|
|
5812
5936
|
import { humanize } from "@dxos/util";
|
|
5813
5937
|
var ClientServicesProviderResource = Symbol.for("dxos.resource.ClientServices");
|
|
5814
5938
|
|
|
@@ -5864,9 +5988,10 @@ export {
|
|
|
5864
5988
|
IdentityServiceImpl,
|
|
5865
5989
|
DeviceInvitationProtocol,
|
|
5866
5990
|
InvitationsHandler,
|
|
5867
|
-
|
|
5991
|
+
createAdmissionKeypair,
|
|
5868
5992
|
InvitationsServiceImpl,
|
|
5869
5993
|
SpaceInvitationProtocol,
|
|
5994
|
+
InvitationsManager,
|
|
5870
5995
|
ClientRpcServer,
|
|
5871
5996
|
DataSpace,
|
|
5872
5997
|
DataSpaceManager,
|
|
@@ -5884,4 +6009,4 @@ export {
|
|
|
5884
6009
|
ClientServicesHost,
|
|
5885
6010
|
ClientServicesProviderResource
|
|
5886
6011
|
};
|
|
5887
|
-
//# sourceMappingURL=chunk-
|
|
6012
|
+
//# sourceMappingURL=chunk-ZWMG6QKN.mjs.map
|