@passlock/client 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +2 -2
  2. package/README.template.md +2 -2
  3. package/dist/errors.d.ts +4 -0
  4. package/dist/errors.d.ts.map +1 -0
  5. package/dist/errors.js +14 -0
  6. package/dist/errors.js.map +1 -0
  7. package/dist/index.d.ts +236 -31
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +236 -34
  10. package/dist/index.js.map +1 -1
  11. package/dist/internal/index.d.ts +4 -0
  12. package/dist/internal/index.d.ts.map +1 -0
  13. package/dist/internal/index.js +4 -0
  14. package/dist/internal/index.js.map +1 -0
  15. package/dist/{shared → internal}/network.d.ts +19 -16
  16. package/dist/internal/network.d.ts.map +1 -0
  17. package/dist/{shared → internal}/network.js +40 -25
  18. package/dist/internal/network.js.map +1 -0
  19. package/dist/{shared → internal}/promise.d.ts +2 -2
  20. package/dist/internal/promise.d.ts.map +1 -0
  21. package/dist/{shared → internal}/promise.js +2 -2
  22. package/dist/internal/promise.js.map +1 -0
  23. package/dist/internal/tenancy.d.ts.map +1 -0
  24. package/dist/internal/tenancy.js.map +1 -0
  25. package/dist/{logger/index.d.ts → logger.d.ts} +19 -4
  26. package/dist/logger.d.ts.map +1 -0
  27. package/dist/{logger/index.js → logger.js} +19 -4
  28. package/dist/logger.js.map +1 -0
  29. package/dist/{shared/options.d.ts → options.d.ts} +4 -0
  30. package/dist/options.d.ts.map +1 -0
  31. package/dist/{shared/options.js.map → options.js.map} +1 -1
  32. package/dist/passkey/authentication/authentication.d.ts +134 -0
  33. package/dist/passkey/authentication/authentication.d.ts.map +1 -0
  34. package/dist/passkey/{authentication.js → authentication/authentication.js} +68 -50
  35. package/dist/passkey/authentication/authentication.js.map +1 -0
  36. package/dist/passkey/errors.d.ts +158 -16
  37. package/dist/passkey/errors.d.ts.map +1 -1
  38. package/dist/passkey/errors.js +214 -6
  39. package/dist/passkey/errors.js.map +1 -1
  40. package/dist/passkey/registration/registration.d.ts +145 -0
  41. package/dist/passkey/registration/registration.d.ts.map +1 -0
  42. package/dist/passkey/{registration.js → registration/registration.js} +43 -36
  43. package/dist/passkey/registration/registration.js.map +1 -0
  44. package/dist/passkey/shared.d.ts +8 -2
  45. package/dist/passkey/shared.d.ts.map +1 -1
  46. package/dist/passkey/signals/signals.d.ts +103 -0
  47. package/dist/passkey/signals/signals.d.ts.map +1 -0
  48. package/dist/passkey/{signals.js → signals/signals.js} +69 -71
  49. package/dist/passkey/signals/signals.js.map +1 -0
  50. package/dist/passkey/support.d.ts +15 -0
  51. package/dist/passkey/support.d.ts.map +1 -1
  52. package/dist/passkey/support.js +16 -1
  53. package/dist/passkey/support.js.map +1 -1
  54. package/dist/principal.d.ts +16 -0
  55. package/dist/principal.d.ts.map +1 -0
  56. package/dist/principal.js +2 -0
  57. package/dist/principal.js.map +1 -0
  58. package/dist/safe.d.ts +247 -0
  59. package/dist/safe.d.ts.map +1 -0
  60. package/dist/safe.js +254 -0
  61. package/dist/safe.js.map +1 -0
  62. package/package.json +21 -19
  63. package/dist/logger/index.d.ts.map +0 -1
  64. package/dist/logger/index.js.map +0 -1
  65. package/dist/passkey/authentication.d.ts +0 -118
  66. package/dist/passkey/authentication.d.ts.map +0 -1
  67. package/dist/passkey/authentication.js.map +0 -1
  68. package/dist/passkey/authentication.test.d.ts +0 -2
  69. package/dist/passkey/authentication.test.d.ts.map +0 -1
  70. package/dist/passkey/authentication.test.js +0 -157
  71. package/dist/passkey/authentication.test.js.map +0 -1
  72. package/dist/passkey/registration.d.ts +0 -136
  73. package/dist/passkey/registration.d.ts.map +0 -1
  74. package/dist/passkey/registration.js.map +0 -1
  75. package/dist/passkey/registration.test.d.ts +0 -2
  76. package/dist/passkey/registration.test.d.ts.map +0 -1
  77. package/dist/passkey/registration.test.js +0 -161
  78. package/dist/passkey/registration.test.js.map +0 -1
  79. package/dist/passkey/signals.d.ts +0 -113
  80. package/dist/passkey/signals.d.ts.map +0 -1
  81. package/dist/passkey/signals.js.map +0 -1
  82. package/dist/shared/network.d.ts.map +0 -1
  83. package/dist/shared/network.js.map +0 -1
  84. package/dist/shared/options.d.ts.map +0 -1
  85. package/dist/shared/promise.d.ts.map +0 -1
  86. package/dist/shared/promise.js.map +0 -1
  87. package/dist/shared/tenancy.d.ts.map +0 -1
  88. package/dist/shared/tenancy.js.map +0 -1
  89. package/dist/surface.test.d.ts +0 -2
  90. package/dist/surface.test.d.ts.map +0 -1
  91. package/dist/surface.test.js +0 -38
  92. package/dist/surface.test.js.map +0 -1
  93. package/dist/unsafe.d.ts +0 -41
  94. package/dist/unsafe.d.ts.map +0 -1
  95. package/dist/unsafe.js +0 -52
  96. package/dist/unsafe.js.map +0 -1
  97. /package/dist/{shared → internal}/tenancy.d.ts +0 -0
  98. /package/dist/{shared → internal}/tenancy.js +0 -0
  99. /package/dist/{shared/options.js → options.js} +0 -0
@@ -1,118 +0,0 @@
1
- import type { PasslockOptions } from "../shared/options";
2
- import type { UserVerification } from "./shared";
3
- import * as Helper from "@simplewebauthn/browser";
4
- import { type AuthenticationResponseJSON, type PublicKeyCredentialRequestOptionsJSON } from "@simplewebauthn/browser";
5
- import { Context, Micro } from "effect";
6
- import { Logger } from "../logger";
7
- import { Endpoint, type UnexpectedError } from "../shared/network";
8
- import { TenancyId } from "../shared/tenancy";
9
- import { OtherPasskeyError, PasskeyUnsupportedError } from "./errors";
10
- interface OptionsResponse {
11
- sessionToken: string;
12
- optionsJSON: PublicKeyCredentialRequestOptionsJSON;
13
- }
14
- declare const AuthenticationHelper_base: Context.TagClass<AuthenticationHelper, "AuthenticationHelper", {
15
- browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
16
- startAuthentication: typeof Helper.startAuthentication;
17
- }>;
18
- export declare class AuthenticationHelper extends AuthenticationHelper_base {
19
- static Default: {
20
- browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
21
- startAuthentication: typeof Helper.startAuthentication;
22
- };
23
- }
24
- export declare const authenticationEvent: readonly ["optionsRequest", "getCredential", "verifyCredential"];
25
- export type AuthenticationEvent = (typeof authenticationEvent)[number];
26
- export type OnEventFn = (event: AuthenticationEvent) => void;
27
- export interface AuthenticationOptions extends PasslockOptions {
28
- /**
29
- * Passlock userId. Essentially a shortcut to look up any
30
- * registered passkeys (allowCredentials) for a given user.
31
- */
32
- userId?: string | undefined;
33
- /**
34
- * Restrict the passkey(s) the device presents to the user to a given set
35
- *
36
- * @see {@link https://passlock.dev/passkeys/authentication/#allowcredentials|allowCredentials}
37
- */
38
- allowCredentials?: Array<string> | undefined;
39
- /**
40
- * Whether the device should re-authenticate the user locally before registering the passkey.
41
- *
42
- * @see {@link https://passlock.dev/passkeys/user-verification/|userVerification}
43
- */
44
- userVerification?: UserVerification | undefined;
45
- /**
46
- * Use browser autofill.
47
- */
48
- autofill?: boolean;
49
- /**
50
- * Receive notifications about key stages in the authentication process.
51
- * For example, you might use event notifications to toggle loading icons or
52
- * to disable certain form fields.
53
- * @param event
54
- * @returns
55
- */
56
- onEvent?: OnEventFn;
57
- timeout?: number | undefined;
58
- }
59
- export declare const fetchOptions: (options: Omit<AuthenticationOptions, keyof PasslockOptions>) => Micro.Micro<OptionsResponse, UnexpectedError, Logger | Endpoint | TenancyId>;
60
- declare const AuthenticationSuccessTag: "AuthenticationSuccess";
61
- type AuthenticationSuccessTag = typeof AuthenticationSuccessTag;
62
- /**
63
- * Represents the outcome of a successfull passkey authentication.
64
- * Submit the code and/or id_token to your backend, then either
65
- * exchange the code with the passlock REST API or decode and
66
- * verify the id_token (JWT).
67
- *
68
- * Note: The @passlock/node library includes utilities to do this
69
- * for you.
70
- */
71
- export interface AuthenticationSuccess {
72
- _tag: AuthenticationSuccessTag;
73
- principal: {
74
- authenticatorId: string;
75
- userId: string;
76
- };
77
- /**
78
- * A signed JWT representing the newly registered passkey.
79
- * Decode and verify this in your backend or use one of the @passlock/node
80
- * helper utilities.
81
- *
82
- * @see {@link https://passlock.dev/principal/idtoken-verification/|id_token}
83
- */
84
- id_token: string;
85
- /**
86
- * Call the Passlock API to exchange this code for details about the newly
87
- * registered passkey.
88
- *
89
- * @see {@link https://passlock.dev/principal/code-exchange//|code exchange}
90
- */
91
- code: string;
92
- }
93
- export declare const isAuthenticationSuccess: (payload: unknown) => payload is AuthenticationSuccess;
94
- export interface PasskeyNotFound {
95
- _tag: "@error/PasskeyNotFound";
96
- message: string;
97
- credentialId: string;
98
- rpId: string;
99
- }
100
- export declare const isPasskeyNotFound: (payload: unknown) => payload is PasskeyNotFound;
101
- export declare const startAuthentication: (optionsJSON: PublicKeyCredentialRequestOptionsJSON, { useBrowserAutofill, onEvent, }: {
102
- useBrowserAutofill: boolean;
103
- onEvent?: OnEventFn | undefined;
104
- }) => Micro.Micro<Helper.AuthenticationResponseJSON, PasskeyUnsupportedError | OtherPasskeyError, Logger | AuthenticationHelper>;
105
- export declare const verifyCredential: (sessionToken: string, response: AuthenticationResponseJSON, { onEvent }: {
106
- onEvent?: OnEventFn | undefined;
107
- }) => Micro.Micro<AuthenticationSuccess, UnexpectedError | PasskeyNotFound, Logger | Endpoint | TenancyId>;
108
- export type AuthenticationError = PasskeyUnsupportedError | OtherPasskeyError | PasskeyNotFound | UnexpectedError;
109
- /**
110
- * Trigger local passkey authentication then verify the passkey in the Passlock vault.
111
- * Returns a code and id_token that can be exchanged/decoded in your backend.
112
- *
113
- * @param options
114
- * @returns
115
- */
116
- export declare const authenticatePasskey: (options: AuthenticationOptions) => Micro.Micro<AuthenticationSuccess, AuthenticationError, Logger | AuthenticationHelper>;
117
- export {};
118
- //# sourceMappingURL=authentication.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../src/passkey/authentication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACjD,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,qCAAqC,EAE3C,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAQ,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAiB,QAAQ,EAAe,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAErE,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,qCAAqC,CAAA;CACnD;;6BAK4B,OAAO,MAAM,CAAC,uBAAuB;yBACzC,OAAO,MAAM,CAAC,mBAAmB;;AAJ1D,qBAAa,oBAAqB,SAAQ,yBAMvC;IACD,MAAM,CAAC,OAAO;;;MAGiC;CAChD;AAgBD,eAAO,MAAM,mBAAmB,kEAAmE,CAAA;AAEnG,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtE,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAA;AAE5D,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAC5C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAA;IAC/C;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;AAED,eAAO,MAAM,YAAY,GAAI,SAAS,IAAI,CAAC,qBAAqB,EAAE,MAAM,eAAe,CAAC,iFAyBpF,CAAA;AAEJ,QAAA,MAAM,wBAAwB,EAAG,uBAAgC,CAAA;AACjE,KAAK,wBAAwB,GAAG,OAAO,wBAAwB,CAAA;AAE/D;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,wBAAwB,CAAA;IAC9B,SAAS,EAAE;QACT,eAAe,EAAE,MAAM,CAAA;QACvB,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAO,MAAM,uBAAuB,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,qBASrE,CAAA;AAKD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,wBAAwB,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAO,MAAM,iBAAiB,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,eAkB/D,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,aAAa,qCAAqC,EAClD,kCAGG;IACD,kBAAkB,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CAChC,+HA8BC,CAAA;AAEJ,eAAO,MAAM,gBAAgB,GAC3B,cAAc,MAAM,EACpB,UAAU,0BAA0B,EACpC,aAAa;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,yGA8B9C,CAAA;AAEJ,MAAM,MAAM,mBAAmB,GAC3B,uBAAuB,GACvB,iBAAiB,GACjB,eAAe,GACf,eAAe,CAAA;AAEnB;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,qBAAqB,KAC7B,KAAK,CAAC,KAAK,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,GAAG,oBAAoB,CAiCvF,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authentication.js","sourceRoot":"","sources":["../../src/passkey/authentication.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=authentication.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authentication.test.d.ts","sourceRoot":"","sources":["../../src/passkey/authentication.test.ts"],"names":[],"mappings":""}
@@ -1,157 +0,0 @@
1
- import fetchMock from "@fetch-mock/vitest";
2
- import { Context, Micro, pipe } from "effect";
3
- import { afterAll, describe, expect, it, vi } from "vitest";
4
- import { Logger } from "../logger";
5
- import { Endpoint } from "../shared/network";
6
- import { TenancyId } from "../shared/tenancy";
7
- import { AuthenticationHelper, authenticatePasskey, fetchOptions, startAuthentication, verifyCredential, } from "./authentication";
8
- import { PasskeyUnsupportedError } from "./errors";
9
- const loggerTest = {
10
- logDebug: () => Micro.void,
11
- logError: () => Micro.void,
12
- logInfo: () => Micro.void,
13
- logWarn: () => Micro.void,
14
- };
15
- describe(fetchOptions.name, () => {
16
- const endpoint = "https://api.passlock.dev";
17
- const tenancyId = "dummyTenancyId";
18
- const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
19
- const expectedRoute = `${endpoint}/${tenancyId}/passkey/authentication/options`;
20
- const mockResponse = {
21
- optionsJSON: {},
22
- sessionToken: "dummySessionToken",
23
- };
24
- describe("given an empty set of options", () => {
25
- it("should fetch some PublicKeyCredentialCreationOptions", async () => {
26
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
27
- const result = await pipe(fetchOptions({}), Micro.provideContext(ctx), Micro.runPromise);
28
- expect(result.sessionToken).toBeTruthy();
29
- expect(result.optionsJSON).toBeTruthy();
30
- });
31
- });
32
- describe("given a userId", () => {
33
- const userId = "dummyUserId";
34
- it("should send it to the backend", async () => {
35
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
36
- await pipe(fetchOptions({ userId }), Micro.provideContext(ctx), Micro.runPromise);
37
- expect(fetchMock).toHavePosted(expectedRoute, { body: { userId } });
38
- });
39
- });
40
- describe("given a list of allowCredentials", () => {
41
- const allowCredentials = ["dummyCredential"];
42
- it("should send them to the backend", async () => {
43
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
44
- await pipe(fetchOptions({ allowCredentials }), Micro.provideContext(ctx), Micro.runPromise);
45
- expect(fetchMock).toHavePosted(expectedRoute, {
46
- body: { allowCredentials },
47
- });
48
- });
49
- });
50
- describe("given a userVerification", () => {
51
- const userVerification = "required";
52
- it("should send it to the backend", async () => {
53
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
54
- await pipe(fetchOptions({ userVerification }), Micro.provideContext(ctx), Micro.runPromise);
55
- expect(fetchMock).toHavePosted(expectedRoute, {
56
- body: { userVerification },
57
- });
58
- });
59
- });
60
- it("should invoke the onEvent handler", async () => {
61
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
62
- const onEvent = vi.fn();
63
- await pipe(fetchOptions({ onEvent }), Micro.provideContext(ctx), Micro.runPromise);
64
- expect(onEvent).toHaveBeenCalledWith("optionsRequest");
65
- });
66
- });
67
- describe(startAuthentication.name, () => {
68
- describe("given valid options", () => {
69
- const authenticationHelperTest = {
70
- browserSupportsWebAuthn: () => true,
71
- startAuthentication: () => Promise.resolve({}),
72
- };
73
- it("should invoke the underlying startAuthentication function", async () => {
74
- await pipe(startAuthentication({}, {
75
- useBrowserAutofill: false,
76
- }), Micro.provideService(Logger, loggerTest), Micro.provideService(AuthenticationHelper, authenticationHelperTest), Micro.runPromise);
77
- });
78
- });
79
- describe("if the device does not support passkeys", () => {
80
- const authenticationHelperTest = {
81
- browserSupportsWebAuthn: () => false,
82
- startAuthentication: () => Promise.resolve({}),
83
- };
84
- it("should return an error", async () => {
85
- const result = await pipe(startAuthentication({}, {
86
- useBrowserAutofill: false,
87
- }), Micro.flip, Micro.provideService(Logger, loggerTest), Micro.provideService(AuthenticationHelper, authenticationHelperTest), Micro.runPromise);
88
- expect(result).toBeInstanceOf(PasskeyUnsupportedError);
89
- });
90
- });
91
- });
92
- describe(verifyCredential.name, () => {
93
- const endpoint = "https://api.passlock.dev";
94
- const tenancyId = "dummyTenancyId";
95
- const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
96
- const expectedRoute = `${endpoint}/${tenancyId}/passkey/authentication/verification`;
97
- describe("when the passkey exists", () => {
98
- const mockResponse = {
99
- _tag: "AuthenticationSuccess",
100
- code: "dummyCode",
101
- id_token: "dummyIdToken",
102
- principal: {
103
- authenticatorId: "dummyPasskeyId",
104
- },
105
- };
106
- it("should return a successful response", async () => {
107
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
108
- const result = await pipe(verifyCredential("dummySessionToken", {}, {}), Micro.provideContext(ctx), Micro.runPromise);
109
- expect(result).toStrictEqual(mockResponse);
110
- });
111
- });
112
- describe("when the backend says the passkey does not exist", () => {
113
- it("should return an error", async () => {
114
- const mockResponse = {
115
- _tag: "@error/PasskeyNotFound",
116
- credentialId: "dummyWebAuthnId",
117
- message: "oops",
118
- rpId: "localhost",
119
- };
120
- fetchMock.mockGlobal().postOnce(expectedRoute, { body: mockResponse, status: 400 });
121
- const error = await pipe(verifyCredential("dummySessionToken", {}, {}), Micro.flip, Micro.provideContext(ctx), Micro.runPromise);
122
- expect(error).toStrictEqual(mockResponse);
123
- });
124
- });
125
- });
126
- describe(authenticatePasskey.name, () => {
127
- const endpoint = "https://api.passlock.dev";
128
- const tenancyId = "dummyTenancyId";
129
- const authenticationHelperTest = {
130
- browserSupportsWebAuthn: () => true,
131
- startAuthentication: () => Promise.resolve({}),
132
- };
133
- const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }), Context.add(AuthenticationHelper, authenticationHelperTest));
134
- const optionsRoute = `${endpoint}/${tenancyId}/passkey/authentication/options`;
135
- const optionsResponse = {
136
- optionsJSON: {},
137
- sessionToken: "dummySessionToken",
138
- };
139
- const verificationRoute = `${endpoint}/${tenancyId}/passkey/authentication/verification`;
140
- const verificationResponse = {
141
- _tag: "AuthenticationSuccess",
142
- code: "dummyCode",
143
- id_token: "dummyIdToken",
144
- principal: {
145
- authenticatorId: "dummyPasskeyId",
146
- },
147
- };
148
- it("should fetch the options and kick off the authentication", async () => {
149
- fetchMock.mockGlobal().postOnce(optionsRoute, optionsResponse);
150
- fetchMock.mockGlobal().postOnce(verificationRoute, verificationResponse);
151
- pipe(authenticatePasskey({ tenancyId }), Micro.provideContext(ctx), Micro.runPromise);
152
- });
153
- });
154
- afterAll(() => {
155
- fetchMock.unmockGlobal();
156
- });
157
- //# sourceMappingURL=authentication.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authentication.test.js","sourceRoot":"","sources":["../../src/passkey/authentication.test.ts"],"names":[],"mappings":"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"}
@@ -1,136 +0,0 @@
1
- import type { PasslockOptions } from "../shared/options";
2
- import type { UserVerification } from "./shared";
3
- import * as Helper from "@simplewebauthn/browser";
4
- import { type PublicKeyCredentialCreationOptionsJSON, type RegistrationResponseJSON } from "@simplewebauthn/browser";
5
- import { Context, Micro } from "effect";
6
- import { Logger } from "../logger";
7
- import { Endpoint, type UnexpectedError } from "../shared/network";
8
- import { TenancyId } from "../shared/tenancy";
9
- import { OtherPasskeyError, PasskeyUnsupportedError } from "./errors";
10
- interface OptionsResponse {
11
- sessionToken: string;
12
- optionsJSON: PublicKeyCredentialCreationOptionsJSON;
13
- }
14
- declare const RegistrationHelper_base: Context.TagClass<RegistrationHelper, "RegistrationHelper", {
15
- browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
16
- startRegistration: typeof Helper.startRegistration;
17
- }>;
18
- export declare class RegistrationHelper extends RegistrationHelper_base {
19
- static Default: {
20
- browserSupportsWebAuthn: typeof Helper.browserSupportsWebAuthn;
21
- startRegistration: typeof Helper.startRegistration;
22
- };
23
- }
24
- export declare const isDuplicatePasskey: (err: unknown) => err is DuplicatePasskeyError;
25
- declare const DuplicatePasskeyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Micro.YieldableError & {
26
- readonly _tag: "@error/DuplicatePasskey";
27
- } & Readonly<A>;
28
- /**
29
- * Raised if excludeCredentials or userId was provided and the
30
- * device recognises one of the passkey ids i.e. the user currently
31
- * has a passkey registered on the current device for a given userId.
32
- */
33
- export declare class DuplicatePasskeyError extends DuplicatePasskeyError_base<{
34
- readonly message: string;
35
- }> {
36
- static isDuplicatePasskey: (err: unknown) => err is DuplicatePasskeyError;
37
- }
38
- export declare const registrationEvent: readonly ["optionsRequest", "createCredential", "saveCredential"];
39
- export type RegistrationEvent = (typeof registrationEvent)[number];
40
- export type OnEventFn = (event: RegistrationEvent) => void;
41
- /**
42
- * Passkey registration options
43
- */
44
- export interface RegistrationOptions extends PasslockOptions {
45
- /**
46
- * The username associated with the newly reguistered passkey..
47
- *
48
- * @see {@link https://passlock.dev/getting-started/passkey-registration/#passkey-username|username}
49
- */
50
- username: string;
51
- /**
52
- * Human palateable username
53
- */
54
- userDisplayName?: string | undefined;
55
- /**
56
- * Passlock userId. Essentially a shortcut to look up any
57
- * currently registered passkeys (excludeCredentials) for a given user.
58
- */
59
- userId?: string | undefined;
60
- /**
61
- * Prevents the user registering a passkey if they already have one
62
- * (for the same user account) registered on the current device.
63
- *
64
- * @see {@link https://passlock.dev/passkeys/registration/#excludecredentials|excludeCredentials}
65
- */
66
- excludeCredentials?: Array<string> | undefined;
67
- /**
68
- * Whether the device should re-authenticate the user locally before registering the passkey.
69
- *
70
- * @see {@link https://passlock.dev/passkeys/user-verification/|userVerification}
71
- */
72
- userVerification?: UserVerification | undefined;
73
- /**
74
- * Receive notifications about key stages in the registration process.
75
- * For example, you might use event notifications to toggle loading icons or
76
- * to disable certain form fields.
77
- * @param event
78
- * @returns
79
- */
80
- onEvent?: OnEventFn;
81
- timeout?: number | undefined;
82
- }
83
- export declare const fetchOptions: (options: Omit<RegistrationOptions, keyof PasslockOptions>) => Micro.Micro<OptionsResponse, UnexpectedError, Logger | Endpoint | TenancyId>;
84
- declare const RegistrationSuccessTag: "RegistrationSuccess";
85
- type RegistrationSuccessTag = typeof RegistrationSuccessTag;
86
- /**
87
- * Represents the outcome of a successfull passkey registration.
88
- * Submit the code and/or id_token to your backend, then either
89
- * exchange the code with the passlock REST API or decode and
90
- * verify the id_token (JWT).
91
- *
92
- * Note: The @passlock/node library includes utilities to do this
93
- * for you.
94
- */
95
- export interface RegistrationSuccess {
96
- _tag: RegistrationSuccessTag;
97
- principal: {
98
- authenticatorId: string;
99
- userId: string;
100
- };
101
- /**
102
- * A signed JWT representing the newly registered passkey.
103
- * Decode and verify this in your backend or use one of the @passlock/node
104
- * helper utilities.
105
- *
106
- * @see {@link https://passlock.dev/principal/idtoken-verification/|id_token}
107
- */
108
- id_token: string;
109
- /**
110
- * Call the Passlock API to exchange this code for details about the newly
111
- * registered passkey.
112
- *
113
- * @see {@link https://passlock.dev/principal/code-exchange//|code exchange}
114
- */
115
- code: string;
116
- }
117
- export declare const isRegistrationSuccess: (payload: unknown) => payload is RegistrationSuccess;
118
- export declare const startRegistration: (optionsJSON: PublicKeyCredentialCreationOptionsJSON, { onEvent }: {
119
- onEvent?: OnEventFn | undefined;
120
- }) => Micro.Micro<Helper.RegistrationResponseJSON, PasskeyUnsupportedError | OtherPasskeyError | DuplicatePasskeyError, Logger | RegistrationHelper>;
121
- export declare const verifyCredential: (sessionToken: string, response: RegistrationResponseJSON, { onEvent }: {
122
- onEvent?: OnEventFn | undefined;
123
- }) => Micro.Micro<RegistrationSuccess, UnexpectedError, Logger | Endpoint | TenancyId>;
124
- /**
125
- * Potential errors associated with Passkey registration
126
- */
127
- export type RegistrationError = PasskeyUnsupportedError | DuplicatePasskeyError | OtherPasskeyError | UnexpectedError;
128
- /**
129
- * Register a passkey on the local device and store the
130
- * associated public key in the Passlock vault.
131
- * @param options
132
- * @returns
133
- */
134
- export declare const registerPasskey: (options: RegistrationOptions) => Micro.Micro<RegistrationSuccess, RegistrationError, Logger | RegistrationHelper>;
135
- export {};
136
- //# sourceMappingURL=registration.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/passkey/registration.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/passkey/registration.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=registration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registration.test.d.ts","sourceRoot":"","sources":["../../src/passkey/registration.test.ts"],"names":[],"mappings":""}
@@ -1,161 +0,0 @@
1
- import fetchMock from "@fetch-mock/vitest";
2
- import { Context, Micro, pipe } from "effect";
3
- import { afterAll, describe, expect, it, vi } from "vitest";
4
- import { Logger } from "../logger";
5
- import { Endpoint } from "../shared/network";
6
- import { TenancyId } from "../shared/tenancy";
7
- import { PasskeyUnsupportedError } from "./errors";
8
- import { fetchOptions, RegistrationHelper, registerPasskey, startRegistration, verifyCredential, } from "./registration";
9
- const loggerTest = {
10
- logDebug: () => Micro.void,
11
- logError: () => Micro.void,
12
- logInfo: () => Micro.void,
13
- logWarn: () => Micro.void,
14
- };
15
- describe(fetchOptions.name, () => {
16
- const endpoint = "https://api.passlock.dev";
17
- const tenancyId = "dummyTenancyId";
18
- const username = "dummyUsername";
19
- const userDisplayName = "dummyDisplayName";
20
- const userId = "dummyUserId";
21
- const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
22
- const expectedRoute = `${endpoint}/${tenancyId}/passkey/registration/options`;
23
- const mockResponse = {
24
- optionsJSON: {},
25
- sessionToken: "dummySessionToken",
26
- };
27
- describe("given an empty set of options", () => {
28
- it("should fetch some PublicKeyCredentialCreationOptions", async () => {
29
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
30
- const result = await pipe(fetchOptions({ username }), Micro.provideContext(ctx), Micro.runPromise);
31
- expect(result.sessionToken).toBeTruthy();
32
- expect(result.optionsJSON).toBeTruthy();
33
- });
34
- });
35
- describe("given a username", () => {
36
- it("should send it to the backend", async () => {
37
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
38
- await pipe(fetchOptions({ username }), Micro.provideContext(ctx), Micro.runPromise);
39
- expect(fetchMock).toHavePosted(expectedRoute, { body: { username } });
40
- });
41
- });
42
- describe("given a userDisplayName", () => {
43
- it("should send it to the backend", async () => {
44
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
45
- await pipe(fetchOptions({ userDisplayName, username }), Micro.provideContext(ctx), Micro.runPromise);
46
- expect(fetchMock).toHavePosted(expectedRoute, {
47
- body: { userDisplayName, username },
48
- });
49
- });
50
- });
51
- describe("given a userId", () => {
52
- it("should send it to the backend", async () => {
53
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
54
- await pipe(fetchOptions({ userId, username }), Micro.provideContext(ctx), Micro.runPromise);
55
- expect(fetchMock).toHavePosted(expectedRoute, {
56
- body: { userId, username },
57
- });
58
- });
59
- });
60
- describe("given a list of excludeCredentials", () => {
61
- const excludeCredentials = ["dummyCredential"];
62
- it("should send them to the backend", async () => {
63
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
64
- await pipe(fetchOptions({ excludeCredentials, username }), Micro.provideContext(ctx), Micro.runPromise);
65
- expect(fetchMock).toHavePosted(expectedRoute, {
66
- body: { excludeCredentials, username },
67
- });
68
- });
69
- });
70
- describe("given a userVerification", () => {
71
- const userVerification = "required";
72
- it("should send it to the backend", async () => {
73
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
74
- await pipe(fetchOptions({ username, userVerification }), Micro.provideContext(ctx), Micro.runPromise);
75
- expect(fetchMock).toHavePosted(expectedRoute, {
76
- body: { username, userVerification },
77
- });
78
- });
79
- });
80
- it("should invoke the onEvent handler", async () => {
81
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
82
- const onEvent = vi.fn();
83
- await pipe(fetchOptions({ onEvent, username }), Micro.provideContext(ctx), Micro.runPromise);
84
- expect(onEvent).toHaveBeenCalledWith("optionsRequest");
85
- });
86
- });
87
- describe(startRegistration.name, () => {
88
- describe("given valid options", () => {
89
- const registrationHelperTest = {
90
- browserSupportsWebAuthn: () => true,
91
- startRegistration: () => Promise.resolve({}),
92
- };
93
- it("should invoke the underlying startRegistration function", async () => {
94
- await pipe(startRegistration({}, {}), Micro.provideService(Logger, loggerTest), Micro.provideService(RegistrationHelper, registrationHelperTest), Micro.runPromise);
95
- });
96
- });
97
- describe("if the device does not support passkeys", () => {
98
- const registrationHelperTest = {
99
- browserSupportsWebAuthn: () => false,
100
- startRegistration: () => Promise.resolve({}),
101
- };
102
- it("should return an error", async () => {
103
- const result = await pipe(startRegistration({}, {}), Micro.flip, Micro.provideService(Logger, loggerTest), Micro.provideService(RegistrationHelper, registrationHelperTest), Micro.runPromise);
104
- expect(result).toBeInstanceOf(PasskeyUnsupportedError);
105
- });
106
- });
107
- });
108
- describe(verifyCredential.name, () => {
109
- const endpoint = "https://api.passlock.dev";
110
- const tenancyId = "dummyTenancyId";
111
- const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }));
112
- const expectedRoute = `${endpoint}/${tenancyId}/passkey/registration/verification`;
113
- describe("when the passkey exists", () => {
114
- const mockResponse = {
115
- _tag: "RegistrationSuccess",
116
- code: "dummyCode",
117
- id_token: "dummyIdToken",
118
- principal: {
119
- authenticatorId: "dummyPasskeyId",
120
- },
121
- };
122
- it("should return a successful response", async () => {
123
- fetchMock.mockGlobal().postOnce(expectedRoute, mockResponse);
124
- const result = await pipe(verifyCredential("dummySessionToken", {}, {}), Micro.provideContext(ctx), Micro.runPromise);
125
- expect(result).toStrictEqual(mockResponse);
126
- });
127
- });
128
- });
129
- describe(registerPasskey.name, () => {
130
- const endpoint = "https://api.passlock.dev";
131
- const tenancyId = "dummyTenancyId";
132
- const username = "dummyUsername";
133
- const registrationHelperTest = {
134
- browserSupportsWebAuthn: () => true,
135
- startRegistration: () => Promise.resolve({}),
136
- };
137
- const ctx = pipe(Context.make(Endpoint, { endpoint }), Context.add(Logger, loggerTest), Context.add(TenancyId, { tenancyId }), Context.add(RegistrationHelper, registrationHelperTest));
138
- const optionsRoute = `${endpoint}/${tenancyId}/passkey/registration/options`;
139
- const optionsResponse = {
140
- optionsJSON: {},
141
- sessionToken: "dummySessionToken",
142
- };
143
- const verificationRoute = `${endpoint}/${tenancyId}/passkey/registration/verification`;
144
- const verificationResponse = {
145
- _tag: "RegistrationSuccess",
146
- code: "dummyCode",
147
- id_token: "dummyIdToken",
148
- principal: {
149
- authenticatorId: "dummyPasskeyId",
150
- },
151
- };
152
- it("should fetch the options and kick off the registration", async () => {
153
- fetchMock.mockGlobal().postOnce(optionsRoute, optionsResponse);
154
- fetchMock.mockGlobal().postOnce(verificationRoute, verificationResponse);
155
- pipe(registerPasskey({ tenancyId, username }), Micro.provideContext(ctx), Micro.runPromise);
156
- });
157
- });
158
- afterAll(() => {
159
- fetchMock.unmockGlobal();
160
- });
161
- //# sourceMappingURL=registration.test.js.map