@dxos/client-services 0.1.46 → 0.1.47
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-MGKMTUPD.mjs → chunk-LGYQZ6UO.mjs} +210 -165
- package/dist/lib/browser/chunk-LGYQZ6UO.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +1 -1
- package/dist/lib/node/index.cjs +236 -191
- 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 +251 -206
- 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/invitation-extension.d.ts +20 -3
- package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/packlets/identity/identity-manager.ts +3 -0
- package/src/packlets/invitations/invitation-extension.ts +101 -13
- package/src/packlets/invitations/invitations-handler.ts +14 -65
- package/src/packlets/spaces/data-space-manager.ts +3 -0
- package/dist/lib/browser/chunk-MGKMTUPD.mjs.map +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/identity/identity-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,SAAS,CAAC;IACxB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,cAAc,EAAE,SAAS,CAAC;IAC1B,WAAW,EAAE,SAAS,CAAC;IAEvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAGF,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAVhC,QAAQ,CAAC,WAAW,cAAe;IAEnC,OAAO,CAAC,SAAS,CAAC,CAAW;gBAKV,cAAc,EAAE,aAAa,EAC7B,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,EAClC,aAAa,EAAE,YAAY;IAG9C,IAAI,QAAQ,yBAEX;IAEK,IAAI;IAoBJ,KAAK;IAIL,cAAc,CAAC,EAAE,WAAW,EAAE,GAAE,qBAA0B;IAmEhE;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,kBAAkB;YA+BjC,kBAAkB;YAwClB,eAAe;
|
|
1
|
+
{"version":3,"file":"identity-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/identity/identity-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,SAAS,CAAC;IACxB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,cAAc,EAAE,SAAS,CAAC;IAC1B,WAAW,EAAE,SAAS,CAAC;IAEvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAGF,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAVhC,QAAQ,CAAC,WAAW,cAAe;IAEnC,OAAO,CAAC,SAAS,CAAC,CAAW;gBAKV,cAAc,EAAE,aAAa,EAC7B,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,EAClC,aAAa,EAAE,YAAY;IAG9C,IAAI,QAAQ,yBAEX;IAEK,IAAI;IAoBJ,KAAK;IAIL,cAAc,CAAC,EAAE,WAAW,EAAE,GAAE,qBAA0B;IAmEhE;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,kBAAkB;YA+BjC,kBAAkB;YAwClB,eAAe;CAc9B"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import { Trigger } from '@dxos/async';
|
|
1
2
|
import { Context } from '@dxos/context';
|
|
2
|
-
import {
|
|
3
|
+
import { PublicKey } from '@dxos/keys';
|
|
4
|
+
import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
|
|
5
|
+
import { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
6
|
+
import { AdmissionRequest, AdmissionResponse, IntroductionRequest, InvitationHostService } from '@dxos/protocols/proto/dxos/halo/invitations';
|
|
3
7
|
import { ExtensionContext, RpcExtension } from '@dxos/teleport';
|
|
8
|
+
export declare const MAX_OTP_ATTEMPTS = 3;
|
|
4
9
|
type InvitationHostExtensionCallbacks = {
|
|
5
10
|
onOpen: () => void;
|
|
6
11
|
onError: (error: Error) => void;
|
|
7
|
-
|
|
8
|
-
|
|
12
|
+
onStateUpdate: (invitation: Invitation) => void;
|
|
13
|
+
resolveInvitation: (request: IntroductionRequest) => Promise<Invitation | undefined>;
|
|
9
14
|
admit: (request: AdmissionRequest) => Promise<AdmissionResponse>;
|
|
10
15
|
};
|
|
11
16
|
/**
|
|
@@ -19,6 +24,17 @@ export declare class InvitationHostExtension extends RpcExtension<{
|
|
|
19
24
|
private readonly _callbacks;
|
|
20
25
|
private _remoteOptions?;
|
|
21
26
|
private _remoteOptionsTrigger;
|
|
27
|
+
invitation?: Invitation;
|
|
28
|
+
guestProfile?: ProfileDocument;
|
|
29
|
+
authenticationPassed: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Retry counter for SHARED_SECRET authentication method.
|
|
32
|
+
*/
|
|
33
|
+
authenticationRetry: number;
|
|
34
|
+
/**
|
|
35
|
+
* Resolved when admission is completed.
|
|
36
|
+
*/
|
|
37
|
+
completedTrigger: Trigger<PublicKey>;
|
|
22
38
|
constructor(_callbacks: InvitationHostExtensionCallbacks);
|
|
23
39
|
protected getHandlers(): Promise<{
|
|
24
40
|
InvitationHostService: InvitationHostService;
|
|
@@ -49,5 +65,6 @@ export declare class InvitationGuestExtension extends RpcExtension<{
|
|
|
49
65
|
onOpen(context: ExtensionContext): Promise<void>;
|
|
50
66
|
onClose(): Promise<void>;
|
|
51
67
|
}
|
|
68
|
+
export declare const isAuthenticationRequired: (invitation: Invitation) => boolean;
|
|
52
69
|
export {};
|
|
53
70
|
//# sourceMappingURL=invitation-extension.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invitation-extension.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitation-extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"invitation-extension.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitation-extension.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAqB,OAAO,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EAEjB,mBAAmB,EACnB,qBAAqB,EAEtB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKhE,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,KAAK,gCAAgC,GAAG;IAEtC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEhC,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAEhD,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAErF,KAAK,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,YAAY,CACvD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,EAChD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,CACjD;IAwBa,OAAO,CAAC,QAAQ,CAAC,UAAU;IAnBvC,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,qBAAqB,CAAiB;IAEvC,UAAU,CAAC,EAAE,UAAU,CAAa;IAEpC,YAAY,CAAC,EAAE,eAAe,CAAa;IAE3C,oBAAoB,UAAS;IAEpC;;OAEG;IACI,mBAAmB,SAAK;IAE/B;;OAEG;IACI,gBAAgB,qBAA4B;gBAEtB,UAAU,EAAE,gCAAgC;cAWhD,WAAW,IAAI,OAAO,CAAC;QAAE,qBAAqB,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAuGlF,MAAM,CAAC,OAAO,EAAE,gBAAgB;IAmBhC,OAAO;CAGvB;AAED,KAAK,iCAAiC,GAAG;IAEvC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,YAAY,CACxD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,EAChD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,CACjD;IAKa,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJvC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,qBAAqB,CAAiB;gBAEjB,UAAU,EAAE,iCAAiC;cAWjD,WAAW,IAAI,OAAO,CAAC;QAAE,qBAAqB,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAqBlF,MAAM,CAAC,OAAO,EAAE,gBAAgB;IAsBhC,OAAO;CAIvB;AAED,eAAO,MAAM,wBAAwB,eAAgB,UAAU,YACT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invitations-handler.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitations-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kCAAkC,EAElC,+BAA+B,EAGhC,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"invitations-handler.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitations-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kCAAkC,EAElC,+BAA+B,EAGhC,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AASxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5C,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,+BAA+B;IA8I9G,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,GAAG,kCAAkC;CA2K3G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-space-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/data-space-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAA4B,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAS,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,EAAE,SAAS,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,qBACa,gBAAgB;IAWzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAf7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,SAAgB,OAAO,cAAe;IAEtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwD;IAEhF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAGvC,aAAa,EAAE,YAAY,EAC3B,cAAc,EAAE,aAAa,EAC7B,yBAAyB,EAAE,wBAAwB,EACnD,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;IAIrD,IAAI,MAAM,qCAET;IAGK,IAAI;IAsBJ,KAAK;IASX;;OAEG;IAEG,WAAW;IA8BX,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAqB/D;;;;OAIG;IACG,mBAAmB,CAAC,QAAQ,EAAE,SAAS;YAU/B,eAAe;
|
|
1
|
+
{"version":3,"file":"data-space-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/data-space-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAA4B,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAS,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,EAAE,SAAS,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,qBACa,gBAAgB;IAWzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAf7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,SAAgB,OAAO,cAAe;IAEtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwD;IAEhF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAGvC,aAAa,EAAE,YAAY,EAC3B,cAAc,EAAE,aAAa,EAC7B,yBAAyB,EAAE,wBAAwB,EACnD,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;IAIrD,IAAI,MAAM,qCAET;IAGK,IAAI;IAsBJ,KAAK;IASX;;OAEG;IAEG,WAAW;IA8BX,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAqB/D;;;;OAIG;IACG,mBAAmB,CAAC,QAAQ,EAAE,SAAS;YAU/B,eAAe;CA6E9B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/client-services",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.47",
|
|
4
4
|
"description": "DXOS client services implementation",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -20,38 +20,38 @@
|
|
|
20
20
|
"src"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@dxos/async": "0.1.
|
|
24
|
-
"@dxos/client-protocol": "0.1.
|
|
25
|
-
"@dxos/codec-protobuf": "0.1.
|
|
26
|
-
"@dxos/config": "0.1.
|
|
27
|
-
"@dxos/context": "0.1.
|
|
28
|
-
"@dxos/credentials": "0.1.
|
|
29
|
-
"@dxos/crypto": "0.1.
|
|
30
|
-
"@dxos/debug": "0.1.
|
|
31
|
-
"@dxos/document-model": "0.1.
|
|
32
|
-
"@dxos/echo-
|
|
33
|
-
"@dxos/echo-
|
|
34
|
-
"@dxos/errors": "0.1.
|
|
35
|
-
"@dxos/feed-store": "0.1.
|
|
36
|
-
"@dxos/keyring": "0.1.
|
|
37
|
-
"@dxos/keys": "0.1.
|
|
38
|
-
"@dxos/log": "0.1.
|
|
39
|
-
"@dxos/messaging": "0.1.
|
|
40
|
-
"@dxos/model-factory": "0.1.
|
|
41
|
-
"@dxos/network-manager": "0.1.
|
|
42
|
-
"@dxos/node-std": "0.1.
|
|
43
|
-
"@dxos/protocols": "0.1.
|
|
44
|
-
"@dxos/random-access-storage": "0.1.
|
|
45
|
-
"@dxos/rpc": "0.1.
|
|
46
|
-
"@dxos/teleport": "0.1.
|
|
47
|
-
"@dxos/teleport-extension-gossip": "0.1.
|
|
48
|
-
"@dxos/text-model": "0.1.
|
|
49
|
-
"@dxos/timeframe": "0.1.
|
|
50
|
-
"@dxos/util": "0.1.
|
|
23
|
+
"@dxos/async": "0.1.47",
|
|
24
|
+
"@dxos/client-protocol": "0.1.47",
|
|
25
|
+
"@dxos/codec-protobuf": "0.1.47",
|
|
26
|
+
"@dxos/config": "0.1.47",
|
|
27
|
+
"@dxos/context": "0.1.47",
|
|
28
|
+
"@dxos/credentials": "0.1.47",
|
|
29
|
+
"@dxos/crypto": "0.1.47",
|
|
30
|
+
"@dxos/debug": "0.1.47",
|
|
31
|
+
"@dxos/document-model": "0.1.47",
|
|
32
|
+
"@dxos/echo-db": "0.1.47",
|
|
33
|
+
"@dxos/echo-pipeline": "0.1.47",
|
|
34
|
+
"@dxos/errors": "0.1.47",
|
|
35
|
+
"@dxos/feed-store": "0.1.47",
|
|
36
|
+
"@dxos/keyring": "0.1.47",
|
|
37
|
+
"@dxos/keys": "0.1.47",
|
|
38
|
+
"@dxos/log": "0.1.47",
|
|
39
|
+
"@dxos/messaging": "0.1.47",
|
|
40
|
+
"@dxos/model-factory": "0.1.47",
|
|
41
|
+
"@dxos/network-manager": "0.1.47",
|
|
42
|
+
"@dxos/node-std": "0.1.47",
|
|
43
|
+
"@dxos/protocols": "0.1.47",
|
|
44
|
+
"@dxos/random-access-storage": "0.1.47",
|
|
45
|
+
"@dxos/rpc": "0.1.47",
|
|
46
|
+
"@dxos/teleport": "0.1.47",
|
|
47
|
+
"@dxos/teleport-extension-gossip": "0.1.47",
|
|
48
|
+
"@dxos/text-model": "0.1.47",
|
|
49
|
+
"@dxos/timeframe": "0.1.47",
|
|
50
|
+
"@dxos/util": "0.1.47"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/readable-stream": "^2.3.9",
|
|
54
|
-
"@dxos/signal": "0.1.
|
|
54
|
+
"@dxos/signal": "0.1.47"
|
|
55
55
|
},
|
|
56
56
|
"publishConfig": {
|
|
57
57
|
"access": "public"
|
|
@@ -10,13 +10,13 @@ import { InvalidInvitationExtensionRoleError } from '@dxos/errors';
|
|
|
10
10
|
import { PublicKey } from '@dxos/keys';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
import { schema, trace } from '@dxos/protocols';
|
|
13
|
+
import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
|
|
14
|
+
import { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
13
15
|
import {
|
|
14
16
|
AdmissionRequest,
|
|
15
17
|
AdmissionResponse,
|
|
16
|
-
AuthenticationRequest,
|
|
17
18
|
AuthenticationResponse,
|
|
18
19
|
IntroductionRequest,
|
|
19
|
-
IntroductionResponse,
|
|
20
20
|
InvitationHostService,
|
|
21
21
|
Options,
|
|
22
22
|
} from '@dxos/protocols/proto/dxos/halo/invitations';
|
|
@@ -25,13 +25,17 @@ import { ExtensionContext, RpcExtension } from '@dxos/teleport';
|
|
|
25
25
|
/// Timeout for the options exchange.
|
|
26
26
|
const OPTIONS_TIMEOUT = 10_000;
|
|
27
27
|
|
|
28
|
+
export const MAX_OTP_ATTEMPTS = 3;
|
|
29
|
+
|
|
28
30
|
type InvitationHostExtensionCallbacks = {
|
|
29
31
|
// Deliberately not async to not block the extensions opening.
|
|
30
32
|
onOpen: () => void;
|
|
31
33
|
onError: (error: Error) => void;
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
onStateUpdate: (invitation: Invitation) => void;
|
|
36
|
+
|
|
37
|
+
resolveInvitation: (request: IntroductionRequest) => Promise<Invitation | undefined>;
|
|
38
|
+
|
|
35
39
|
admit: (request: AdmissionRequest) => Promise<AdmissionResponse>;
|
|
36
40
|
};
|
|
37
41
|
|
|
@@ -49,6 +53,22 @@ export class InvitationHostExtension extends RpcExtension<
|
|
|
49
53
|
private _remoteOptions?: Options;
|
|
50
54
|
private _remoteOptionsTrigger = new Trigger();
|
|
51
55
|
|
|
56
|
+
public invitation?: Invitation = undefined;
|
|
57
|
+
|
|
58
|
+
public guestProfile?: ProfileDocument = undefined;
|
|
59
|
+
|
|
60
|
+
public authenticationPassed = false;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Retry counter for SHARED_SECRET authentication method.
|
|
64
|
+
*/
|
|
65
|
+
public authenticationRetry = 0;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Resolved when admission is completed.
|
|
69
|
+
*/
|
|
70
|
+
public completedTrigger = new Trigger<PublicKey>();
|
|
71
|
+
|
|
52
72
|
constructor(private readonly _callbacks: InvitationHostExtensionCallbacks) {
|
|
53
73
|
super({
|
|
54
74
|
requested: {
|
|
@@ -72,27 +92,92 @@ export class InvitationHostExtension extends RpcExtension<
|
|
|
72
92
|
},
|
|
73
93
|
|
|
74
94
|
introduce: async (request) => {
|
|
95
|
+
const { profile, invitationId } = request;
|
|
96
|
+
|
|
75
97
|
const traceId = PublicKey.random().toHex();
|
|
76
98
|
log.trace('dxos.sdk.invitation-handler.host.introduce', trace.begin({ id: traceId }));
|
|
77
|
-
|
|
99
|
+
|
|
100
|
+
const invitation = await this._callbacks.resolveInvitation(request);
|
|
101
|
+
if (!invitation) {
|
|
102
|
+
log.warn('invitation not found', { invitationId });
|
|
103
|
+
this._callbacks.onError(new Error('Invitation not found.'));
|
|
104
|
+
// TODO(dmaretskyi): Better error handling.
|
|
105
|
+
return {
|
|
106
|
+
authMethod: Invitation.AuthMethod.NONE,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
this.invitation = invitation;
|
|
110
|
+
|
|
111
|
+
log('guest introduced itself', {
|
|
112
|
+
guestProfile: profile,
|
|
113
|
+
});
|
|
114
|
+
this.guestProfile = profile;
|
|
115
|
+
|
|
116
|
+
this._callbacks.onStateUpdate({ ...this.invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });
|
|
117
|
+
|
|
78
118
|
log.trace('dxos.sdk.invitation-handler.host.introduce', trace.end({ id: traceId }));
|
|
79
|
-
return
|
|
119
|
+
return {
|
|
120
|
+
spaceKey: this.invitation.authMethod === Invitation.AuthMethod.NONE ? this.invitation.spaceKey : undefined,
|
|
121
|
+
authMethod: this.invitation.authMethod,
|
|
122
|
+
};
|
|
80
123
|
},
|
|
81
124
|
|
|
82
|
-
authenticate: async (
|
|
125
|
+
authenticate: async ({ authCode: code }) => {
|
|
83
126
|
const traceId = PublicKey.random().toHex();
|
|
84
127
|
log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.begin({ id: traceId }));
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
128
|
+
log('received authentication request', { authCode: code });
|
|
129
|
+
let status = AuthenticationResponse.Status.OK;
|
|
130
|
+
|
|
131
|
+
assert(this.invitation, 'Invitation is not set.');
|
|
132
|
+
switch (this.invitation.authMethod) {
|
|
133
|
+
case Invitation.AuthMethod.NONE: {
|
|
134
|
+
log('authentication not required');
|
|
135
|
+
return { status: AuthenticationResponse.Status.OK };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
case Invitation.AuthMethod.SHARED_SECRET: {
|
|
139
|
+
if (this.invitation.authCode) {
|
|
140
|
+
if (this.authenticationRetry++ > MAX_OTP_ATTEMPTS) {
|
|
141
|
+
status = AuthenticationResponse.Status.INVALID_OPT_ATTEMPTS;
|
|
142
|
+
} else if (code !== this.invitation.authCode) {
|
|
143
|
+
status = AuthenticationResponse.Status.INVALID_OTP;
|
|
144
|
+
} else {
|
|
145
|
+
this.authenticationPassed = true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
default: {
|
|
152
|
+
log.error('invalid authentication method', { authMethod: this.invitation.authMethod });
|
|
153
|
+
status = AuthenticationResponse.Status.INTERNAL_ERROR;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.end({ id: traceId, data: { status } }));
|
|
159
|
+
return { status };
|
|
88
160
|
},
|
|
89
161
|
|
|
90
162
|
admit: async (request) => {
|
|
91
163
|
const traceId = PublicKey.random().toHex();
|
|
92
164
|
log.trace('dxos.sdk.invitation-handler.host.admit', trace.begin({ id: traceId }));
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
165
|
+
|
|
166
|
+
try {
|
|
167
|
+
assert(this.invitation, 'Invitation is not set.');
|
|
168
|
+
// Check authenticated.
|
|
169
|
+
if (isAuthenticationRequired(this.invitation) && !this.authenticationPassed) {
|
|
170
|
+
throw new Error('Not authenticated');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const response = await this._callbacks.admit(request);
|
|
174
|
+
|
|
175
|
+
log.trace('dxos.sdk.invitation-handler.host.admit', trace.end({ id: traceId }));
|
|
176
|
+
return response;
|
|
177
|
+
} catch (err: any) {
|
|
178
|
+
this._callbacks.onError(err);
|
|
179
|
+
throw err;
|
|
180
|
+
}
|
|
96
181
|
},
|
|
97
182
|
},
|
|
98
183
|
};
|
|
@@ -198,3 +283,6 @@ export class InvitationGuestExtension extends RpcExtension<
|
|
|
198
283
|
await this._ctx.dispose();
|
|
199
284
|
}
|
|
200
285
|
}
|
|
286
|
+
|
|
287
|
+
export const isAuthenticationRequired = (invitation: Invitation) =>
|
|
288
|
+
invitation.authMethod !== Invitation.AuthMethod.NONE;
|
|
@@ -20,14 +20,16 @@ import { log } from '@dxos/log';
|
|
|
20
20
|
import { createTeleportProtocolFactory, NetworkManager, StarTopology } from '@dxos/network-manager';
|
|
21
21
|
import { trace } from '@dxos/protocols';
|
|
22
22
|
import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
|
|
23
|
-
import { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
24
23
|
import { AuthenticationResponse } from '@dxos/protocols/proto/dxos/halo/invitations';
|
|
25
24
|
|
|
26
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
InvitationGuestExtension,
|
|
27
|
+
InvitationHostExtension,
|
|
28
|
+
isAuthenticationRequired,
|
|
29
|
+
MAX_OTP_ATTEMPTS,
|
|
30
|
+
} from './invitation-extension';
|
|
27
31
|
import { InvitationProtocol } from './invitation-protocol';
|
|
28
32
|
|
|
29
|
-
const MAX_OTP_ATTEMPTS = 3;
|
|
30
|
-
|
|
31
33
|
/**
|
|
32
34
|
* Generic handler for Halo and Space invitations.
|
|
33
35
|
* Handles the life-cycle of invitations between peers.
|
|
@@ -101,77 +103,26 @@ export class InvitationsHandler {
|
|
|
101
103
|
|
|
102
104
|
// Called for every connecting peer.
|
|
103
105
|
const createExtension = (): InvitationHostExtension => {
|
|
104
|
-
const success = new Trigger<PublicKey>();
|
|
105
|
-
let guestProfile: ProfileDocument | undefined;
|
|
106
|
-
let authenticationPassed = false;
|
|
107
|
-
let authenticationRetry = 0;
|
|
108
|
-
|
|
109
106
|
const extension = new InvitationHostExtension({
|
|
110
|
-
|
|
111
|
-
log('guest introduced itself', {
|
|
112
|
-
guestProfile: profile,
|
|
113
|
-
...protocol.toJSON(),
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
guestProfile = profile;
|
|
117
|
-
|
|
118
|
-
// TODO(dmaretskyi): Should we expose guest's profile in this callback?
|
|
107
|
+
onStateUpdate: (invitation) => {
|
|
119
108
|
stream.next({ ...invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });
|
|
120
|
-
|
|
121
|
-
// TODO(wittjosiah): Make when the space details are revealed configurable.
|
|
122
|
-
// Spaces may want to have public details (name, member count, etc.) or hide that until guest is authed.
|
|
123
|
-
return {
|
|
124
|
-
spaceKey: authMethod === Invitation.AuthMethod.NONE ? protocol.getInvitationContext().spaceKey : undefined,
|
|
125
|
-
authMethod,
|
|
126
|
-
};
|
|
127
109
|
},
|
|
128
110
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
switch (invitation.authMethod) {
|
|
134
|
-
case Invitation.AuthMethod.NONE: {
|
|
135
|
-
log('authentication not required');
|
|
136
|
-
return { status: AuthenticationResponse.Status.OK };
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
case Invitation.AuthMethod.SHARED_SECRET: {
|
|
140
|
-
if (invitation.authCode) {
|
|
141
|
-
if (authenticationRetry++ > MAX_OTP_ATTEMPTS) {
|
|
142
|
-
status = AuthenticationResponse.Status.INVALID_OPT_ATTEMPTS;
|
|
143
|
-
} else if (code !== invitation.authCode) {
|
|
144
|
-
status = AuthenticationResponse.Status.INVALID_OTP;
|
|
145
|
-
} else {
|
|
146
|
-
authenticationPassed = true;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
default: {
|
|
153
|
-
log.error('invalid authentication method', { authMethod: invitation.authMethod });
|
|
154
|
-
status = AuthenticationResponse.Status.INTERNAL_ERROR;
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
111
|
+
resolveInvitation: async ({ invitationId }) => {
|
|
112
|
+
if (invitationId && invitationId !== invitation.invitationId) {
|
|
113
|
+
return undefined;
|
|
157
114
|
}
|
|
158
|
-
|
|
159
|
-
return { status };
|
|
115
|
+
return invitation;
|
|
160
116
|
},
|
|
161
117
|
|
|
162
118
|
admit: async (admissionRequest) => {
|
|
163
119
|
try {
|
|
164
|
-
// Check authenticated.
|
|
165
|
-
if (isAuthenticationRequired(invitation) && !authenticationPassed) {
|
|
166
|
-
throw new Error('Not authenticated');
|
|
167
|
-
}
|
|
168
|
-
|
|
169
120
|
const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;
|
|
170
121
|
assert(deviceKey);
|
|
171
|
-
const admissionResponse = await protocol.admit(admissionRequest, guestProfile);
|
|
122
|
+
const admissionResponse = await protocol.admit(admissionRequest, extension.guestProfile);
|
|
172
123
|
|
|
173
124
|
// Updating credentials complete.
|
|
174
|
-
|
|
125
|
+
extension.completedTrigger.wake(deviceKey);
|
|
175
126
|
|
|
176
127
|
return admissionResponse;
|
|
177
128
|
} catch (err: any) {
|
|
@@ -188,7 +139,7 @@ export class InvitationsHandler {
|
|
|
188
139
|
log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.begin({ id: traceId }));
|
|
189
140
|
log('connected', { ...protocol.toJSON() });
|
|
190
141
|
stream.next({ ...invitation, state: Invitation.State.CONNECTED });
|
|
191
|
-
const deviceKey = await
|
|
142
|
+
const deviceKey = await extension.completedTrigger.wait({ timeout });
|
|
192
143
|
log('admitted guest', { guest: deviceKey, ...protocol.toJSON() });
|
|
193
144
|
stream.next({ ...invitation, state: Invitation.State.SUCCESS });
|
|
194
145
|
log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.end({ id: traceId }));
|
|
@@ -426,5 +377,3 @@ export class InvitationsHandler {
|
|
|
426
377
|
return observable;
|
|
427
378
|
}
|
|
428
379
|
}
|
|
429
|
-
|
|
430
|
-
const isAuthenticationRequired = (invitation: Invitation) => invitation.authMethod !== Invitation.AuthMethod.NONE;
|
|
@@ -208,6 +208,9 @@ export class DataSpaceManager {
|
|
|
208
208
|
session.addExtension('dxos.mesh.teleport.objectsync', space.snapshotManager.objectSync.createExtension());
|
|
209
209
|
session.addExtension('dxos.mesh.teleport.notarization', dataSpace.notarizationPlugin.createExtension());
|
|
210
210
|
},
|
|
211
|
+
onAuthFailure: () => {
|
|
212
|
+
log.warn('auth failure');
|
|
213
|
+
},
|
|
211
214
|
memberKey: this._signingContext.identityKey,
|
|
212
215
|
});
|
|
213
216
|
controlFeed && space.setControlFeed(controlFeed);
|