@passlock/server 2.2.1 → 2.3.0
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/effect.d.ts +2 -2
- package/dist/effect.js +2 -2
- package/dist/effect.js.map +1 -1
- package/dist/index.d.ts +16 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/dist/passkey/passkey.d.ts +31 -6
- package/dist/passkey/passkey.d.ts.map +1 -1
- package/dist/passkey/passkey.js +22 -2
- package/dist/passkey/passkey.js.map +1 -1
- package/dist/safe-result.js +1 -1
- package/dist/safe-result.js.map +1 -1
- package/dist/safe.d.ts +17 -11
- package/dist/safe.d.ts.map +1 -1
- package/dist/safe.js +13 -7
- package/dist/safe.js.map +1 -1
- package/dist/schemas/passkey.d.ts +12 -0
- package/dist/schemas/passkey.d.ts.map +1 -1
- package/dist/schemas/passkey.js +8 -0
- package/dist/schemas/passkey.js.map +1 -1
- package/package.json +1 -1
package/dist/effect.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Effect-first exports for `@passlock/server`.
|
|
3
3
|
*
|
|
4
|
-
* This entrypoint exposes
|
|
5
|
-
* with the public schemas used by the package.
|
|
4
|
+
* This entrypoint exposes selected original `Effect`-returning functions
|
|
5
|
+
* together with the public schemas used by the package.
|
|
6
6
|
*
|
|
7
7
|
* @module effect
|
|
8
8
|
*/
|
package/dist/effect.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Effect-first exports for `@passlock/server`.
|
|
3
3
|
*
|
|
4
|
-
* This entrypoint exposes
|
|
5
|
-
* with the public schemas used by the package.
|
|
4
|
+
* This entrypoint exposes selected original `Effect`-returning functions
|
|
5
|
+
* together with the public schemas used by the package.
|
|
6
6
|
*
|
|
7
7
|
* @module effect
|
|
8
8
|
*/
|
package/dist/effect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,0BAA0B,CAAA;AACjC,cAAc,oBAAoB,CAAA","sourcesContent":["/**\n * Effect-first exports for `@passlock/server`.\n *\n * This entrypoint exposes
|
|
1
|
+
{"version":3,"file":"effect.js","sourceRoot":"","sources":["../src/effect.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,0BAA0B,CAAA;AACjC,cAAc,oBAAoB,CAAA","sourcesContent":["/**\n * Effect-first exports for `@passlock/server`.\n *\n * This entrypoint exposes selected original `Effect`-returning functions\n * together with the public schemas used by the package.\n *\n * @module effect\n */\n\nexport type {\n AssignUserOptions,\n ListPasskeyOptions,\n} from \"./passkey/passkey.js\"\nexport {\n assignUser,\n deletePasskey,\n getPasskey,\n listPasskeys,\n} from \"./passkey/passkey.js\"\nexport type {} from \"./principal/principal.js\"\nexport {\n exchangeCode,\n VerificationError,\n verifyIdToken,\n} from \"./principal/principal.js\"\nexport * from \"./schemas/index.js\"\nexport type {\n AuthenticatedOptions,\n PasslockOptions,\n} from \"./shared.js\"\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,13 +5,17 @@
|
|
|
5
5
|
* Unexpected runtime defects may still throw.
|
|
6
6
|
*
|
|
7
7
|
* @categoryDescription Passkeys
|
|
8
|
-
* Functions and related types for managing passkeys
|
|
8
|
+
* Functions and related types for managing passkeys.
|
|
9
|
+
*
|
|
10
|
+
* @categoryDescription Principal
|
|
11
|
+
* Functions and related types for exchanging client codes and verifying
|
|
12
|
+
* Passlock tokens.
|
|
9
13
|
*
|
|
10
14
|
* @showCategories
|
|
11
15
|
*
|
|
12
16
|
* @module unsafe (default)
|
|
13
17
|
*/
|
|
14
|
-
import type { AssignUserOptions, DeletePasskeyOptions, DeleteUserPasskeysOptions,
|
|
18
|
+
import type { AssignUserOptions, DeletedPasskey, DeletedPasskeys, DeletePasskeyOptions, DeleteUserPasskeysOptions, FindAllPasskeys, GetPasskeyOptions, ListPasskeyOptions, Passkey, UpdatedCredentials, UpdatePasskeyOptions, UpdateUsernamesOptions } from "./passkey/passkey.js";
|
|
15
19
|
import type { ExchangeCodeOptions, VerifyIdTokenOptions } from "./principal/principal.js";
|
|
16
20
|
import type { ExtendedPrincipal, Principal } from "./schemas/principal.js";
|
|
17
21
|
/**
|
|
@@ -43,13 +47,15 @@ export declare const assignUser: (request: AssignUserOptions) => Promise<Passkey
|
|
|
43
47
|
*/
|
|
44
48
|
export declare const updatePasskey: (request: UpdatePasskeyOptions) => Promise<Passkey>;
|
|
45
49
|
/**
|
|
46
|
-
* Update the username
|
|
50
|
+
* Update the stored username metadata for all passkeys belonging to a given
|
|
51
|
+
* user, and prepare client-side credential updates for those passkeys.
|
|
47
52
|
*
|
|
48
|
-
* **Important:** changing these values has no bearing on authentication
|
|
49
|
-
*
|
|
50
|
-
*
|
|
53
|
+
* **Important:** changing these values has no bearing on authentication. The
|
|
54
|
+
* server-side operation updates the username stored in Passlock. The optional
|
|
55
|
+
* `displayName` is only included in the returned credential updates for
|
|
56
|
+
* follow-up use with `@passlock/client`; it is not persisted in the vault.
|
|
51
57
|
*
|
|
52
|
-
* However you might choose to align the
|
|
58
|
+
* However you might choose to align the username in your vault with the
|
|
53
59
|
* client-side component to simplify end user support.
|
|
54
60
|
*
|
|
55
61
|
* **Note:** This can be used alongside `@passlock/client`'s
|
|
@@ -69,13 +75,13 @@ export declare const updatePasskeyUsernames: (request: UpdateUsernamesOptions) =
|
|
|
69
75
|
* `@passlock/client` to coordinate client-side removal when needed.
|
|
70
76
|
*
|
|
71
77
|
* @param options
|
|
72
|
-
* @returns A promise resolving to the deleted
|
|
78
|
+
* @returns A promise resolving to the deleted credential.
|
|
73
79
|
* @throws {@link NotFoundError} if passkey does not exist
|
|
74
80
|
* @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid
|
|
75
81
|
*
|
|
76
82
|
* @category Passkeys
|
|
77
83
|
*/
|
|
78
|
-
export declare const deletePasskey: (options: DeletePasskeyOptions) => Promise<
|
|
84
|
+
export declare const deletePasskey: (options: DeletePasskeyOptions) => Promise<DeletedPasskey>;
|
|
79
85
|
/**
|
|
80
86
|
* Call the Passlock backend API to delete all passkeys associated with a user.
|
|
81
87
|
*
|
|
@@ -141,7 +147,7 @@ export declare const exchangeCode: (options: ExchangeCodeOptions) => Promise<Ext
|
|
|
141
147
|
export declare const verifyIdToken: (options: VerifyIdTokenOptions) => Promise<Principal>;
|
|
142
148
|
export type { BadRequestError, DuplicateEmailError, ForbiddenError, InvalidCodeError, InvalidEmailError, InvalidTenancyError, NotFoundError, PasskeyNotFoundError, UnauthorizedError, VerificationError, } from "./errors.js";
|
|
143
149
|
export { isBadRequestError, isDuplicateEmailError, isForbiddenError, isInvalidCodeError, isInvalidEmailError, isInvalidTenancyError, isNotFoundError, isPasskeyNotFoundError, isUnauthorizedError, isVerificationError, } from "./errors.js";
|
|
144
|
-
export type { AssignUserOptions, Credential, DeletePasskeyOptions, DeleteUserPasskeysOptions,
|
|
150
|
+
export type { AssignUserOptions, Credential, DeletedPasskey, DeletedPasskeys, DeletePasskeyOptions, DeleteUserPasskeysOptions, FindAllPasskeys, GetPasskeyOptions, ListPasskeyOptions, Passkey, PasskeyCredential, PasskeySummary, Platform, UpdatedCredentials as UpdatedUserDetails, UpdatedPasskeys, UpdatePasskeyOptions, UpdateUsernamesOptions as UpdateUserDetailsOptions, } from "./passkey/passkey.js";
|
|
145
151
|
export { isDeletedPasskeys, isPasskey, isPasskeySummary, isUpdatedPasskeys, isUpdatedUserDetails, } from "./passkey/passkey.js";
|
|
146
152
|
export type { ExchangeCodeOptions, VerifyIdTokenOptions, } from "./principal/principal.js";
|
|
147
153
|
export type { CredentialDeviceType, Transports, } from "./schemas/passkey.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
* Unexpected runtime defects may still throw.
|
|
6
6
|
*
|
|
7
7
|
* @categoryDescription Passkeys
|
|
8
|
-
* Functions and related types for managing passkeys
|
|
8
|
+
* Functions and related types for managing passkeys.
|
|
9
|
+
*
|
|
10
|
+
* @categoryDescription Principal
|
|
11
|
+
* Functions and related types for exchanging client codes and verifying
|
|
12
|
+
* Passlock tokens.
|
|
9
13
|
*
|
|
10
14
|
* @showCategories
|
|
11
15
|
*
|
|
@@ -43,13 +47,15 @@ export const assignUser = (request) => pipe(assignUserE(request), Effect.runProm
|
|
|
43
47
|
*/
|
|
44
48
|
export const updatePasskey = (request) => pipe(updatePasskeyE(request), Effect.runPromise);
|
|
45
49
|
/**
|
|
46
|
-
* Update the username
|
|
50
|
+
* Update the stored username metadata for all passkeys belonging to a given
|
|
51
|
+
* user, and prepare client-side credential updates for those passkeys.
|
|
47
52
|
*
|
|
48
|
-
* **Important:** changing these values has no bearing on authentication
|
|
49
|
-
*
|
|
50
|
-
*
|
|
53
|
+
* **Important:** changing these values has no bearing on authentication. The
|
|
54
|
+
* server-side operation updates the username stored in Passlock. The optional
|
|
55
|
+
* `displayName` is only included in the returned credential updates for
|
|
56
|
+
* follow-up use with `@passlock/client`; it is not persisted in the vault.
|
|
51
57
|
*
|
|
52
|
-
* However you might choose to align the
|
|
58
|
+
* However you might choose to align the username in your vault with the
|
|
53
59
|
* client-side component to simplify end user support.
|
|
54
60
|
*
|
|
55
61
|
* **Note:** This can be used alongside `@passlock/client`'s
|
|
@@ -69,7 +75,7 @@ export const updatePasskeyUsernames = (request) => pipe(updatePasskeyUsernamesE(
|
|
|
69
75
|
* `@passlock/client` to coordinate client-side removal when needed.
|
|
70
76
|
*
|
|
71
77
|
* @param options
|
|
72
|
-
* @returns A promise resolving to the deleted
|
|
78
|
+
* @returns A promise resolving to the deleted credential.
|
|
73
79
|
* @throws {@link NotFoundError} if passkey does not exist
|
|
74
80
|
* @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid
|
|
75
81
|
*
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAcrC,OAAO,EACL,UAAU,IAAI,WAAW,EACzB,aAAa,IAAI,cAAc,EAC/B,kBAAkB,IAAI,mBAAmB,EACzC,UAAU,IAAI,WAAW,EACzB,YAAY,IAAI,aAAa,EAC7B,aAAa,IAAI,cAAc,EAC/B,sBAAsB,IAAI,uBAAuB,GAClD,MAAM,sBAAsB,CAAA;AAK7B,OAAO,EACL,YAAY,IAAI,aAAa,EAC7B,aAAa,IAAI,cAAc,GAChC,MAAM,0BAA0B,CAAA;AAGjC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAoB,EAAE,CACzE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACX,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEvE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAA+B,EACF,EAAE,CAC/B,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACX,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEvE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAkC,EACR,EAAE,CAC5B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEvD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAoB,EAAE,CACzE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE/C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA2B,EACD,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA4B,EACA,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACT,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAgBzE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAA;AAmBpB,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,sBAAsB,CAAA;AAU7B,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA","sourcesContent":["/**\n * Promise-based functions that reject with tagged error payloads for expected\n * API failures.\n *\n * Unexpected runtime defects may still throw.\n *\n * @categoryDescription Passkeys\n * Functions and related types for managing passkeys\n *\n * @showCategories\n *\n * @module unsafe (default)\n */\n\nimport { Effect, pipe } from \"effect\"\nimport type {\n AssignUserOptions,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n DeletedPasskeys,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n UpdatedCredentials,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions,\n} from \"./passkey/passkey.js\"\nimport {\n assignUser as assignUserE,\n deletePasskey as deletePasskeyE,\n deleteUserPasskeys as deleteUserPasskeysE,\n getPasskey as getPasskeyE,\n listPasskeys as listPasskeysE,\n updatePasskey as updatePasskeyE,\n updatePasskeyUsernames as updatePasskeyUsernamesE,\n} from \"./passkey/passkey.js\"\nimport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nimport {\n exchangeCode as exchangeCodeE,\n verifyIdToken as verifyIdTokenE,\n} from \"./principal/principal.js\"\nimport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\n\n/**\n * Assign a custom user ID to a passkey in the Passlock vault.\n *\n * This updates Passlock's server-side mapping for the passkey. It does not\n * change the underlying WebAuthn credential's `userId`.\n *\n * @param request\n * @returns A promise resolving to the updated passkey.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const assignUser = (request: AssignUserOptions): Promise<Passkey> =>\n pipe(assignUserE(request), Effect.runPromise)\n\n/**\n * Update a passkey's custom user ID and/or username metadata.\n *\n * Updating the username only affects the metadata stored in the vault. It does\n * not affect whether the passkey can be used for authentication.\n *\n * @param request\n * @returns A promise resolving to the updated passkey.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const updatePasskey = (\n request: UpdatePasskeyOptions\n): Promise<Passkey> => pipe(updatePasskeyE(request), Effect.runPromise)\n\n/**\n * Update the username and/or display name for all passkeys belonging to a given user.\n *\n * **Important:** changing these values has no bearing on authentication, as\n * it's typically only used in the client-side component of the passkey\n * (so the user knows which account the passkey relates to).\n *\n * However you might choose to align the names in your vault with the\n * client-side component to simplify end user support.\n *\n * **Note:** This can be used alongside `@passlock/client`'s\n * `updatePasskeyUsernames` helper to update those details on the user's device.\n *\n * @param request\n * @returns A promise resolving to an {@link UpdatedCredentials} payload.\n * Its `credentials` array can be passed to the client's `updatePasskeyUsernames` function.\n *\n * @category Passkeys\n */\nexport const updatePasskeyUsernames = (\n request: UpdateUsernamesOptions\n): Promise<UpdatedCredentials> =>\n pipe(updatePasskeyUsernamesE(request), Effect.runPromise)\n\n/**\n * Delete a passkey from the Passlock vault.\n *\n * This does not remove the passkey from the user's device. Use\n * `@passlock/client` to coordinate client-side removal when needed.\n *\n * @param options\n * @returns A promise resolving to the deleted passkey.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const deletePasskey = (\n options: DeletePasskeyOptions\n): Promise<Passkey> => pipe(deletePasskeyE(options), Effect.runPromise)\n\n/**\n * Call the Passlock backend API to delete all passkeys associated with a user.\n *\n * @param request\n * @returns A promise resolving to a {@link DeletedPasskeys} payload.\n * Its `deleted` array can be passed directly into `@passlock/client`'s\n * `deleteUserPasskeys` helper for follow-up client-side passkey removal.\n * @throws {@link NotFoundError} if the user does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const deleteUserPasskeys = (\n request: DeleteUserPasskeysOptions\n): Promise<DeletedPasskeys> =>\n pipe(deleteUserPasskeysE(request), Effect.runPromise)\n\n/**\n * Fetch a single passkey from the Passlock vault.\n *\n * @param options\n * @returns A promise resolving to the passkey.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const getPasskey = (options: GetPasskeyOptions): Promise<Passkey> =>\n pipe(getPasskeyE(options), Effect.runPromise)\n\n/**\n * List passkeys for the given tenancy. Note this could return a cursor,\n * in which case the function should be called again with the given cursor.\n *\n * @param options\n * @returns A promise resolving to a page of passkey summaries.\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const listPasskeys = (\n options: ListPasskeyOptions\n): Promise<FindAllPasskeys> => pipe(listPasskeysE(options), Effect.runPromise)\n\n/**\n * Exchange a short-lived code from `@passlock/client` for an\n * {@link ExtendedPrincipal}.\n *\n * @param options\n * @returns A promise resolving to an extended principal.\n * @throws {@link InvalidCodeError} if the code is invalid or expired\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Principal\n */\nexport const exchangeCode = (\n options: ExchangeCodeOptions\n): Promise<ExtendedPrincipal> => pipe(exchangeCodeE(options), Effect.runPromise)\n\n/**\n * Decode and verify a Passlock `id_token` (JWT).\n *\n * Note: this will make a network call to\n * `https://api.passlock.dev/.well-known/jwks.json` (or your configured `endpoint`)\n * to fetch the relevant public key. The response will be cached, however\n * bear in mind that for environments such as AWS Lambda it will make the call\n * on each cold start, so it might be slower than {@link exchangeCode}.\n *\n * @param options\n * @returns A promise resolving to the verified principal.\n * @throws {@link VerificationError} if token verification fails\n *\n * @category Principal\n */\nexport const verifyIdToken = (\n options: VerifyIdTokenOptions\n): Promise<Principal> => pipe(verifyIdTokenE(options), Effect.runPromise)\n\n/* Re-exports */\n\nexport type {\n BadRequestError,\n DuplicateEmailError,\n ForbiddenError,\n InvalidCodeError,\n InvalidEmailError,\n InvalidTenancyError,\n NotFoundError,\n PasskeyNotFoundError,\n UnauthorizedError,\n VerificationError,\n} from \"./errors.js\"\nexport {\n isBadRequestError,\n isDuplicateEmailError,\n isForbiddenError,\n isInvalidCodeError,\n isInvalidEmailError,\n isInvalidTenancyError,\n isNotFoundError,\n isPasskeyNotFoundError,\n isUnauthorizedError,\n isVerificationError,\n} from \"./errors.js\"\nexport type {\n AssignUserOptions,\n Credential,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n DeletedPasskeys,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n PasskeyCredential,\n PasskeySummary,\n Platform,\n UpdatedPasskeys,\n UpdatedCredentials as UpdatedUserDetails,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions as UpdateUserDetailsOptions,\n} from \"./passkey/passkey.js\"\nexport {\n isDeletedPasskeys,\n isPasskey,\n isPasskeySummary,\n isUpdatedPasskeys,\n isUpdatedUserDetails,\n} from \"./passkey/passkey.js\"\nexport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nexport type {\n CredentialDeviceType,\n Transports,\n} from \"./schemas/passkey.js\"\nexport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\nexport { isExtendedPrincipal, isPrincipal } from \"./schemas/principal.js\"\nexport type {\n AuthenticatedOptions,\n PasslockOptions,\n} from \"./shared.js\"\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAerC,OAAO,EACL,UAAU,IAAI,WAAW,EACzB,aAAa,IAAI,cAAc,EAC/B,kBAAkB,IAAI,mBAAmB,EACzC,UAAU,IAAI,WAAW,EACzB,YAAY,IAAI,aAAa,EAC7B,aAAa,IAAI,cAAc,EAC/B,sBAAsB,IAAI,uBAAuB,GAClD,MAAM,sBAAsB,CAAA;AAK7B,OAAO,EACL,YAAY,IAAI,aAAa,EAC7B,aAAa,IAAI,cAAc,GAChC,MAAM,0BAA0B,CAAA;AAGjC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAoB,EAAE,CACzE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACX,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEvE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAA+B,EACF,EAAE,CAC/B,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACJ,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAkC,EACR,EAAE,CAC5B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEvD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA0B,EAAoB,EAAE,CACzE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE/C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA2B,EACD,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAA4B,EACA,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAA6B,EACT,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;AAgBzE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAA;AAoBpB,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,sBAAsB,CAAA;AAU7B,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA","sourcesContent":["/**\n * Promise-based functions that reject with tagged error payloads for expected\n * API failures.\n *\n * Unexpected runtime defects may still throw.\n *\n * @categoryDescription Passkeys\n * Functions and related types for managing passkeys.\n *\n * @categoryDescription Principal\n * Functions and related types for exchanging client codes and verifying\n * Passlock tokens.\n *\n * @showCategories\n *\n * @module unsafe (default)\n */\n\nimport { Effect, pipe } from \"effect\"\nimport type {\n AssignUserOptions,\n DeletedPasskey,\n DeletedPasskeys,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n UpdatedCredentials,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions,\n} from \"./passkey/passkey.js\"\nimport {\n assignUser as assignUserE,\n deletePasskey as deletePasskeyE,\n deleteUserPasskeys as deleteUserPasskeysE,\n getPasskey as getPasskeyE,\n listPasskeys as listPasskeysE,\n updatePasskey as updatePasskeyE,\n updatePasskeyUsernames as updatePasskeyUsernamesE,\n} from \"./passkey/passkey.js\"\nimport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nimport {\n exchangeCode as exchangeCodeE,\n verifyIdToken as verifyIdTokenE,\n} from \"./principal/principal.js\"\nimport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\n\n/**\n * Assign a custom user ID to a passkey in the Passlock vault.\n *\n * This updates Passlock's server-side mapping for the passkey. It does not\n * change the underlying WebAuthn credential's `userId`.\n *\n * @param request\n * @returns A promise resolving to the updated passkey.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const assignUser = (request: AssignUserOptions): Promise<Passkey> =>\n pipe(assignUserE(request), Effect.runPromise)\n\n/**\n * Update a passkey's custom user ID and/or username metadata.\n *\n * Updating the username only affects the metadata stored in the vault. It does\n * not affect whether the passkey can be used for authentication.\n *\n * @param request\n * @returns A promise resolving to the updated passkey.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const updatePasskey = (\n request: UpdatePasskeyOptions\n): Promise<Passkey> => pipe(updatePasskeyE(request), Effect.runPromise)\n\n/**\n * Update the stored username metadata for all passkeys belonging to a given\n * user, and prepare client-side credential updates for those passkeys.\n *\n * **Important:** changing these values has no bearing on authentication. The\n * server-side operation updates the username stored in Passlock. The optional\n * `displayName` is only included in the returned credential updates for\n * follow-up use with `@passlock/client`; it is not persisted in the vault.\n *\n * However you might choose to align the username in your vault with the\n * client-side component to simplify end user support.\n *\n * **Note:** This can be used alongside `@passlock/client`'s\n * `updatePasskeyUsernames` helper to update those details on the user's device.\n *\n * @param request\n * @returns A promise resolving to an {@link UpdatedCredentials} payload.\n * Its `credentials` array can be passed to the client's `updatePasskeyUsernames` function.\n *\n * @category Passkeys\n */\nexport const updatePasskeyUsernames = (\n request: UpdateUsernamesOptions\n): Promise<UpdatedCredentials> =>\n pipe(updatePasskeyUsernamesE(request), Effect.runPromise)\n\n/**\n * Delete a passkey from the Passlock vault.\n *\n * This does not remove the passkey from the user's device. Use\n * `@passlock/client` to coordinate client-side removal when needed.\n *\n * @param options\n * @returns A promise resolving to the deleted credential.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const deletePasskey = (\n options: DeletePasskeyOptions\n): Promise<DeletedPasskey> => pipe(deletePasskeyE(options), Effect.runPromise)\n\n/**\n * Call the Passlock backend API to delete all passkeys associated with a user.\n *\n * @param request\n * @returns A promise resolving to a {@link DeletedPasskeys} payload.\n * Its `deleted` array can be passed directly into `@passlock/client`'s\n * `deleteUserPasskeys` helper for follow-up client-side passkey removal.\n * @throws {@link NotFoundError} if the user does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const deleteUserPasskeys = (\n request: DeleteUserPasskeysOptions\n): Promise<DeletedPasskeys> =>\n pipe(deleteUserPasskeysE(request), Effect.runPromise)\n\n/**\n * Fetch a single passkey from the Passlock vault.\n *\n * @param options\n * @returns A promise resolving to the passkey.\n * @throws {@link NotFoundError} if passkey does not exist\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const getPasskey = (options: GetPasskeyOptions): Promise<Passkey> =>\n pipe(getPasskeyE(options), Effect.runPromise)\n\n/**\n * List passkeys for the given tenancy. Note this could return a cursor,\n * in which case the function should be called again with the given cursor.\n *\n * @param options\n * @returns A promise resolving to a page of passkey summaries.\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Passkeys\n */\nexport const listPasskeys = (\n options: ListPasskeyOptions\n): Promise<FindAllPasskeys> => pipe(listPasskeysE(options), Effect.runPromise)\n\n/**\n * Exchange a short-lived code from `@passlock/client` for an\n * {@link ExtendedPrincipal}.\n *\n * @param options\n * @returns A promise resolving to an extended principal.\n * @throws {@link InvalidCodeError} if the code is invalid or expired\n * @throws {@link ForbiddenError} if the Tenancy ID or API key is invalid\n *\n * @category Principal\n */\nexport const exchangeCode = (\n options: ExchangeCodeOptions\n): Promise<ExtendedPrincipal> => pipe(exchangeCodeE(options), Effect.runPromise)\n\n/**\n * Decode and verify a Passlock `id_token` (JWT).\n *\n * Note: this will make a network call to\n * `https://api.passlock.dev/.well-known/jwks.json` (or your configured `endpoint`)\n * to fetch the relevant public key. The response will be cached, however\n * bear in mind that for environments such as AWS Lambda it will make the call\n * on each cold start, so it might be slower than {@link exchangeCode}.\n *\n * @param options\n * @returns A promise resolving to the verified principal.\n * @throws {@link VerificationError} if token verification fails\n *\n * @category Principal\n */\nexport const verifyIdToken = (\n options: VerifyIdTokenOptions\n): Promise<Principal> => pipe(verifyIdTokenE(options), Effect.runPromise)\n\n/* Re-exports */\n\nexport type {\n BadRequestError,\n DuplicateEmailError,\n ForbiddenError,\n InvalidCodeError,\n InvalidEmailError,\n InvalidTenancyError,\n NotFoundError,\n PasskeyNotFoundError,\n UnauthorizedError,\n VerificationError,\n} from \"./errors.js\"\nexport {\n isBadRequestError,\n isDuplicateEmailError,\n isForbiddenError,\n isInvalidCodeError,\n isInvalidEmailError,\n isInvalidTenancyError,\n isNotFoundError,\n isPasskeyNotFoundError,\n isUnauthorizedError,\n isVerificationError,\n} from \"./errors.js\"\nexport type {\n AssignUserOptions,\n Credential,\n DeletedPasskey,\n DeletedPasskeys,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n PasskeyCredential,\n PasskeySummary,\n Platform,\n UpdatedCredentials as UpdatedUserDetails,\n UpdatedPasskeys,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions as UpdateUserDetailsOptions,\n} from \"./passkey/passkey.js\"\nexport {\n isDeletedPasskeys,\n isPasskey,\n isPasskeySummary,\n isUpdatedPasskeys,\n isUpdatedUserDetails,\n} from \"./passkey/passkey.js\"\nexport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nexport type {\n CredentialDeviceType,\n Transports,\n} from \"./schemas/passkey.js\"\nexport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\nexport { isExtendedPrincipal, isPrincipal } from \"./schemas/principal.js\"\nexport type {\n AuthenticatedOptions,\n PasslockOptions,\n} from \"./shared.js\"\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect,
|
|
1
|
+
import { Effect, type Layer, Stream } from "effect";
|
|
2
2
|
import { type NetworkFetch } from "../network.js";
|
|
3
3
|
import { ForbiddenError, NotFoundError } from "../schemas/index.js";
|
|
4
4
|
import * as PasskeySchemas from "../schemas/passkey.js";
|
|
@@ -119,6 +119,21 @@ export type Credential = {
|
|
|
119
119
|
userId: string;
|
|
120
120
|
rpId: string;
|
|
121
121
|
};
|
|
122
|
+
/**
|
|
123
|
+
* Result payload returned when a single passkey has been deleted.
|
|
124
|
+
*
|
|
125
|
+
* @category Passkeys
|
|
126
|
+
*/
|
|
127
|
+
export type DeletedPasskey = {
|
|
128
|
+
_tag: "DeletedPasskey";
|
|
129
|
+
deleted: Credential;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Type guard for {@link DeletedPasskey}.
|
|
133
|
+
*
|
|
134
|
+
* @category Passkeys
|
|
135
|
+
*/
|
|
136
|
+
export declare const isDeletedPasskey: (payload: unknown) => payload is DeletedPasskey;
|
|
122
137
|
/**
|
|
123
138
|
* Result payload returned when all passkeys for a user have been deleted.
|
|
124
139
|
*
|
|
@@ -144,12 +159,20 @@ export type FindAllPasskeys = {
|
|
|
144
159
|
readonly cursor: string | null;
|
|
145
160
|
readonly records: ReadonlyArray<PasskeySummary>;
|
|
146
161
|
};
|
|
162
|
+
/**
|
|
163
|
+
* Type guard for {@link FindAllPasskeys}.
|
|
164
|
+
*
|
|
165
|
+
* @category Passkeys
|
|
166
|
+
*/
|
|
147
167
|
export declare const isFindAllPasskeys: (payload: unknown) => payload is FindAllPasskeys;
|
|
148
168
|
/**
|
|
149
169
|
* Client-facing credential update payload returned by
|
|
150
170
|
* {@link updatePasskeyUsernames}.
|
|
151
171
|
*
|
|
152
|
-
* Each entry describes one credential to update on the user's device.
|
|
172
|
+
* Each entry describes one credential to update on the user's device. The
|
|
173
|
+
* returned `displayName` is derived from
|
|
174
|
+
* {@link UpdateUsernamesOptions#displayName} when provided, otherwise it falls
|
|
175
|
+
* back to the stored username.
|
|
153
176
|
*
|
|
154
177
|
* @category Passkeys
|
|
155
178
|
*/
|
|
@@ -208,11 +231,11 @@ export interface DeletePasskeyOptions extends AuthenticatedOptions {
|
|
|
208
231
|
*
|
|
209
232
|
* @param options Request options including the passkey identifier.
|
|
210
233
|
* @param fetchLayer Optional fetch service override for testing or custom runtimes.
|
|
211
|
-
* @returns An Effect that succeeds with the deleted
|
|
234
|
+
* @returns An Effect that succeeds with the deleted credential.
|
|
212
235
|
*
|
|
213
236
|
* @category Passkeys
|
|
214
237
|
*/
|
|
215
|
-
export declare const deletePasskey: (options: DeletePasskeyOptions, fetchLayer?: Layer.Layer<NetworkFetch>) => Effect.Effect<
|
|
238
|
+
export declare const deletePasskey: (options: DeletePasskeyOptions, fetchLayer?: Layer.Layer<NetworkFetch>) => Effect.Effect<DeletedPasskey, NotFoundError | ForbiddenError>;
|
|
216
239
|
/**
|
|
217
240
|
* Options for assigning a custom user ID to a single passkey.
|
|
218
241
|
*
|
|
@@ -296,8 +319,8 @@ export interface DeleteUserPasskeysOptions extends AuthenticatedOptions {
|
|
|
296
319
|
*/
|
|
297
320
|
export declare const deleteUserPasskeys: (options: DeleteUserPasskeysOptions, fetchLayer?: Layer.Layer<NetworkFetch>) => Effect.Effect<DeletedPasskeys, NotFoundError | ForbiddenError>;
|
|
298
321
|
/**
|
|
299
|
-
* Options for updating
|
|
300
|
-
*
|
|
322
|
+
* Options for updating username metadata for all passkeys that share a custom
|
|
323
|
+
* user ID, plus optional display-name data to return for client-side updates.
|
|
301
324
|
*
|
|
302
325
|
* @category Passkeys
|
|
303
326
|
*/
|
|
@@ -322,6 +345,8 @@ export interface UpdateUsernamesOptions extends AuthenticatedOptions {
|
|
|
322
345
|
*
|
|
323
346
|
* The resulting payload is designed to be passed to
|
|
324
347
|
* `@passlock/client` so matching device credentials can be updated.
|
|
348
|
+
* The optional `displayName` is not stored in Passlock; it is only copied into
|
|
349
|
+
* the returned client payload.
|
|
325
350
|
*
|
|
326
351
|
* @param options Request options including the custom user ID and username metadata.
|
|
327
352
|
* @param fetchLayer Optional fetch service override for testing or custom runtimes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey.d.ts","sourceRoot":"","sources":["../../src/passkey/passkey.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,MAAM,
|
|
1
|
+
{"version":3,"file":"passkey.d.ts","sourceRoot":"","sources":["../../src/passkey/passkey.ts"],"names":[],"mappings":"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"}
|
package/dist/passkey/passkey.js
CHANGED
|
@@ -20,12 +20,23 @@ export const isPasskeySummary = (payload) => Schema.is(PasskeySchemas.PasskeySum
|
|
|
20
20
|
* @category Passkeys
|
|
21
21
|
*/
|
|
22
22
|
export const isUpdatedPasskeys = (payload) => Schema.is(PasskeySchemas.UpdatedPasskeys)(payload);
|
|
23
|
+
/**
|
|
24
|
+
* Type guard for {@link DeletedPasskey}.
|
|
25
|
+
*
|
|
26
|
+
* @category Passkeys
|
|
27
|
+
*/
|
|
28
|
+
export const isDeletedPasskey = (payload) => Schema.is(PasskeySchemas.DeletedPasskey)(payload);
|
|
23
29
|
/**
|
|
24
30
|
* Type guard for {@link DeletedPasskeys}.
|
|
25
31
|
*
|
|
26
32
|
* @category Passkeys
|
|
27
33
|
*/
|
|
28
34
|
export const isDeletedPasskeys = (payload) => Schema.is(PasskeySchemas.DeletedPasskeys)(payload);
|
|
35
|
+
/**
|
|
36
|
+
* Type guard for {@link FindAllPasskeys}.
|
|
37
|
+
*
|
|
38
|
+
* @category Passkeys
|
|
39
|
+
*/
|
|
29
40
|
export const isFindAllPasskeys = (payload) => Schema.is(PasskeySchemas.FindAllPasskeys)(payload);
|
|
30
41
|
/**
|
|
31
42
|
* Narrow an unknown value to an `UpdatedCredentials`-tagged payload.
|
|
@@ -85,7 +96,7 @@ export const getPasskey = (options, fetchLayer = NetworkFetchLive) => pipe(Effec
|
|
|
85
96
|
*
|
|
86
97
|
* @param options Request options including the passkey identifier.
|
|
87
98
|
* @param fetchLayer Optional fetch service override for testing or custom runtimes.
|
|
88
|
-
* @returns An Effect that succeeds with the deleted
|
|
99
|
+
* @returns An Effect that succeeds with the deleted credential.
|
|
89
100
|
*
|
|
90
101
|
* @category Passkeys
|
|
91
102
|
*/
|
|
@@ -100,7 +111,14 @@ export const deletePasskey = (options, fetchLayer = NetworkFetchLive) => pipe(Ef
|
|
|
100
111
|
"2xx": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),
|
|
101
112
|
orElse: (res) => decodeResponseJson(res, Schema.Union(ForbiddenError, NotFoundError)),
|
|
102
113
|
});
|
|
103
|
-
return yield* pipe(Match.value(encoded), Match.tag("Passkey", (
|
|
114
|
+
return yield* pipe(Match.value(encoded), Match.tag("Passkey", (passkey) => Effect.succeed({
|
|
115
|
+
_tag: "DeletedPasskey",
|
|
116
|
+
deleted: {
|
|
117
|
+
credentialId: passkey.credential.id,
|
|
118
|
+
userId: passkey.credential.userId,
|
|
119
|
+
rpId: passkey.credential.rpId,
|
|
120
|
+
},
|
|
121
|
+
})), Match.tag("@error/Forbidden", (err) => Effect.fail(err)), Match.tag("@error/NotFound", (err) => Effect.fail(err)), Match.exhaustive);
|
|
104
122
|
}), Effect.catchTags({
|
|
105
123
|
"@error/NetworkPayload": (err) => Effect.die(err),
|
|
106
124
|
"@error/NetworkRequest": (err) => Effect.die(err),
|
|
@@ -229,6 +247,8 @@ export const deleteUserPasskeys = (options, fetchLayer = NetworkFetchLive) => pi
|
|
|
229
247
|
*
|
|
230
248
|
* The resulting payload is designed to be passed to
|
|
231
249
|
* `@passlock/client` so matching device credentials can be updated.
|
|
250
|
+
* The optional `displayName` is not stored in Passlock; it is only copied into
|
|
251
|
+
* the returned client payload.
|
|
232
252
|
*
|
|
233
253
|
* @param options Request options including the custom user ID and username metadata.
|
|
234
254
|
* @param fetchLayer Optional fetch service override for testing or custom runtimes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../src/passkey/passkey.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Array,\n Chunk,\n Effect,\n Match,\n Option,\n pipe,\n Schema,\n Stream,\n type Layer,\n} from \"effect\"\nimport type { satisfy } from \"src/schemas/satisfy.js\"\nimport {\n fetchNetwork,\n matchStatus,\n NetworkFetchLive,\n type NetworkFetch,\n type NetworkPayloadError,\n type NetworkRequestError,\n type NetworkResponse,\n type NetworkResponseError,\n} from \"../network.js\"\nimport {\n FindAllPasskeys as FindAllPasskeysSchema,\n ForbiddenError,\n NotFoundError,\n} from \"../schemas/index.js\"\nimport * as PasskeySchemas from \"../schemas/passkey.js\"\nimport type { AuthenticatedOptions } from \"../shared.js\"\n\n/* Passkey */\n\n/**\n * WebAuthn-specific credential data stored for a passkey in the Passlock vault.\n *\n * The `id` and `userId` fields are the underlying WebAuthn values, encoded as\n * Base64URL strings.\n *\n * @category Passkeys\n */\nexport type PasskeyCredential = {\n id: string\n userId: string\n username: string\n aaguid: string\n backedUp: boolean\n counter: number\n deviceType: PasskeySchemas.CredentialDeviceType\n transports: ReadonlyArray<PasskeySchemas.Transports>\n publicKey: Uint8Array<ArrayBufferLike>\n rpId: string\n}\n\n/**\n * Passkeys are usually synced across devices **but only within\n * a specific platform/ecosystem** e.g. a passkey created on Apple\n * devices would typically be synced across devices sharing the same\n * iCloud ID.\n *\n * However, if the user also wants to sign in from their Windows\n * or Android/Chrome devices they will need an additional passkey.\n * Therefore when listing the passkeys registered to a user's account\n * it's a good idea to tell them which platform the passkeys relate to.\n *\n * We've also included links to icons (SVG) so you can give your users\n * a quick visual indication.\n *\n * @category Passkeys\n */\nexport type Platform = {\n name?: string | undefined\n icon?: string | undefined\n}\n\n/**\n * The server-side representation of a passkey stored in the Passlock vault.\n *\n * @category Passkeys\n */\nexport type Passkey = {\n _tag: \"Passkey\"\n /**\n * Not to be confused with the credential.id\n */\n id: string\n /**\n * Not to be confused with the credential.userId\n */\n userId?: string | undefined\n enabled: boolean\n credential: PasskeyCredential\n platform?: Platform | undefined\n lastUsed?: number | undefined\n createdAt: number\n updatedAt: number\n}\n\n/**\n * Type guard for {@link Passkey}.\n *\n * @category Passkeys\n */\nexport const isPasskey = (payload: unknown): payload is Passkey =>\n Schema.is(PasskeySchemas.Passkey)(payload)\n\n/**\n * needed to ensure the Passkey === Passkey.Type\n * @internal\n * */\nexport type _Passkey = satisfy<typeof PasskeySchemas.Passkey.Type, Passkey>\n\n/**\n * needed to ensure the PasskeyCredential === PasskeyCredential.Type\n * @internal\n * */\nexport type _PasskeyCredential = satisfy<\n typeof PasskeySchemas.PasskeyCredential.Type,\n PasskeyCredential\n>\n\n/* PasskeySummary */\n\n/**\n * Compact passkey payload returned by list operations.\n *\n * @category Passkeys\n */\nexport type PasskeySummary = {\n readonly _tag: \"PasskeySummary\"\n readonly id: string\n readonly userId: string\n readonly enabled: boolean\n readonly credential: {\n readonly id: string\n readonly userId: string\n }\n readonly lastUsed?: number | undefined\n readonly createdAt: number\n}\n\n/**\n * Type guard for {@link PasskeySummary}.\n *\n * @category Passkeys\n */\nexport const isPasskeySummary = (payload: unknown): payload is PasskeySummary =>\n Schema.is(PasskeySchemas.PasskeySummary)(payload)\n\n/**\n * needed to ensure the PasskeySummary === PasskeySummary.Type\n * @internal\n */\nexport type _PasskeySummary = satisfy<\n typeof PasskeySchemas.PasskeySummary.Type,\n PasskeySummary\n>\n\n/* UpdatedPasskeys */\n\n/**\n * Result payload returned when passkeys are updated in bulk for a user.\n *\n * @category Passkeys\n */\nexport type UpdatedPasskeys = {\n _tag: \"UpdatedPasskeys\"\n updated: ReadonlyArray<Passkey>\n}\n\n/**\n * Type guard for {@link UpdatedPasskeys}.\n *\n * @category Passkeys\n */\nexport const isUpdatedPasskeys = (\n payload: unknown\n): payload is UpdatedPasskeys =>\n Schema.is(PasskeySchemas.UpdatedPasskeys)(payload)\n\n/**\n * needed to ensure the UpdatedPasskeys === UpdatedPasskeys.Type\n * @internal\n * */\nexport type _UpdatedPasskeys = satisfy<\n typeof PasskeySchemas.UpdatedPasskeys.Type,\n UpdatedPasskeys\n>\n\n/* Credential */\n\n/**\n * Credential identifiers returned by passkey deletion operations.\n *\n * @category Passkeys\n */\nexport type Credential = {\n credentialId: string\n userId: string\n rpId: string\n}\n\n/**\n * needed to ensure the Credential === Credential.Type\n * @internal\n */\nexport type _Credential = satisfy<\n typeof PasskeySchemas.Credential.Type,\n Credential\n>\n\n/* DeletedPasskeys */\n\n/**\n * Result payload returned when all passkeys for a user have been deleted.\n *\n * @category Passkeys\n */\nexport type DeletedPasskeys = {\n _tag: \"DeletedPasskeys\"\n deleted: ReadonlyArray<Credential>\n}\n\n/**\n * Type guard for {@link DeletedPasskeys}.\n *\n * @category Passkeys\n */\nexport const isDeletedPasskeys = (\n payload: unknown\n): payload is DeletedPasskeys =>\n Schema.is(PasskeySchemas.DeletedPasskeys)(payload)\n\n/**\n * needed to ensure the DeletedPasskeys === DeletedPasskeys.Type\n * @internal\n * */\nexport type _DeletedPasskeys = satisfy<\n typeof PasskeySchemas.DeletedPasskeys.Type,\n DeletedPasskeys\n>\n\n/* FindAllPasskeys */\n\n/**\n * A single page of passkey summaries returned by {@link listPasskeys}.\n *\n * @category Passkeys\n */\nexport type FindAllPasskeys = {\n readonly _tag: \"FindAllPasskeys\"\n readonly cursor: string | null\n readonly records: ReadonlyArray<PasskeySummary>\n}\n\nexport const isFindAllPasskeys = (\n payload: unknown\n): payload is FindAllPasskeys =>\n Schema.is(PasskeySchemas.FindAllPasskeys)(payload)\n\n/**\n * needed to ensure the FindAllPasskeys === FindAllPasskeys.Type\n * @internal\n */\nexport type _FindAllPasskeys = satisfy<\n typeof FindAllPasskeysSchema.Type,\n FindAllPasskeys\n>\n\n/* UpdatedCredentials (update names by userId) */\n\n/**\n * Client-facing credential update payload returned by\n * {@link updatePasskeyUsernames}.\n *\n * Each entry describes one credential to update on the user's device.\n *\n * @category Passkeys\n */\nexport type UpdatedCredentials = {\n _tag: \"UpdatedCredentials\"\n credentials: ReadonlyArray<{\n rpId: string\n userId: string\n username: string\n displayName: string\n }>\n}\n\n/**\n * Narrow an unknown value to an `UpdatedCredentials`-tagged payload.\n *\n * @category Passkeys\n */\nexport const isUpdatedUserDetails = (\n payload: unknown\n): payload is UpdatedCredentials => {\n if (typeof payload !== \"object\") return false\n if (payload === null) return false\n if (!(\"_tag\" in payload)) return false\n if (typeof payload._tag !== \"string\") return false\n if (payload._tag !== \"UpdatedCredentials\") return false\n\n return true\n}\n\n/* END UpdatedUserDetails */\n\nconst authorizationHeaders = (apiKey: string) => ({\n authorization: `Bearer ${apiKey}`,\n})\n\nconst decodeResponseJson = <A, I, R>(\n response: NetworkResponse,\n schema: Schema.Schema<A, I, R>\n) => pipe(response.json, Effect.flatMap(Schema.decodeUnknown(schema)))\n\n/* Get Passkey */\n\n/**\n * Options for fetching a single passkey.\n *\n * @category Passkeys\n */\nexport interface GetPasskeyOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to fetch.\n */\n passkeyId: string\n}\n\n/**\n * Fetch a single passkey from the Passlock vault.\n *\n * @param options Request options including the passkey identifier.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the requested passkey.\n *\n * @category Passkeys\n */\nexport const getPasskey = (\n options: GetPasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<Passkey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { tenancyId, passkeyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(url, \"get\", undefined, {\n headers: authorizationHeaders(options.apiKey),\n })\n\n const encoded: Passkey | ForbiddenError | NotFoundError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(ForbiddenError, NotFoundError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (data) => Effect.succeed(data)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Delete Passkey */\n\n/**\n * Options for deleting a single passkey.\n *\n * @category Passkeys\n */\nexport interface DeletePasskeyOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to delete.\n */\n passkeyId: string\n}\n\n/**\n * Delete a single passkey from the Passlock vault.\n *\n * This only removes the server-side record. It does not remove the passkey\n * from the user's device.\n *\n * @param options Request options including the passkey identifier.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the deleted passkey.\n *\n * @category Passkeys\n */\nexport const deletePasskey = (\n options: DeletePasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<Passkey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { tenancyId, passkeyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(url, \"delete\", undefined, {\n headers: authorizationHeaders(options.apiKey),\n })\n\n const encoded: Passkey | ForbiddenError | NotFoundError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(ForbiddenError, NotFoundError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (deletedPasskey) =>\n Effect.succeed(deletedPasskey)\n ),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Assign User */\n\n/**\n * Options for assigning a custom user ID to a single passkey.\n *\n * @category Passkeys\n */\nexport interface AssignUserOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to update.\n */\n passkeyId: string\n\n /**\n * Custom User ID to align with your own systems\n */\n userId: string\n}\n\n// TODO reuse updatePasskey\n/**\n * Assign a custom user ID to a single passkey.\n *\n * This updates Passlock's mapping for the passkey. It does not change the\n * underlying WebAuthn credential's `userId`.\n *\n * @param options Request options including the passkey identifier and custom user ID.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the updated passkey.\n *\n * @category Passkeys\n */\nexport const assignUser = (\n options: AssignUserOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<Passkey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { userId, passkeyId } = options\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"patch\",\n { userId },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded: Passkey | NotFoundError | ForbiddenError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(NotFoundError, ForbiddenError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (passkey) => Effect.succeed(passkey)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Update passkey */\n\n/**\n * Options for updating a single passkey's metadata.\n *\n * @category Passkeys\n */\nexport interface UpdatePasskeyOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to update.\n */\n passkeyId: string\n /**\n * Custom user ID to associate with the passkey.\n */\n userId?: string\n /**\n * Username metadata stored alongside the passkey.\n */\n username?: string\n}\n\n/**\n * Update a single passkey's custom user ID and/or username metadata.\n *\n * @param options Request options including the passkey identifier and fields to update.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the updated passkey.\n *\n * @category Passkeys\n */\nexport const updatePasskey = (\n options: UpdatePasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<Passkey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n\n const { userId, passkeyId, username } = options\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"patch\",\n { userId, username },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded: Passkey | NotFoundError | ForbiddenError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(NotFoundError, ForbiddenError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (passkey) => Effect.succeed(passkey)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Update passkeys by userId (currently not exported) */\n\ninterface UpdateUserPasskeyOptions extends AuthenticatedOptions {\n userId: string\n username?: string\n}\n\nconst updateUserPasskeys = (\n options: UpdateUserPasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<UpdatedPasskeys, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n\n const { userId, username } = options\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/users/${userId}/passkeys/`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"patch\",\n { userId, username },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded: UpdatedPasskeys | NotFoundError | ForbiddenError =\n yield* matchStatus(response, {\n \"2xx\": (res) =>\n decodeResponseJson(res, PasskeySchemas.UpdatedPasskeys),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(NotFoundError, ForbiddenError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"UpdatedPasskeys\", (result) => Effect.succeed(result)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Delete passkeys by userId */\n\n/**\n * Options for deleting all passkeys belonging to a user.\n *\n * @category Passkeys\n */\nexport interface DeleteUserPasskeysOptions extends AuthenticatedOptions {\n /**\n * Custom user ID whose passkeys should be deleted.\n */\n userId: string\n}\n\n/**\n * Delete all passkeys associated with a custom user ID.\n *\n * The resulting `deleted` credentials can be passed to\n * `@passlock/client` to remove the corresponding passkeys from the user's\n * device.\n *\n * @param options Request options including the custom user ID.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the deleted credential identifiers.\n *\n * @category Passkeys\n */\nexport const deleteUserPasskeys = (\n options: DeleteUserPasskeysOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<DeletedPasskeys, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n\n const { tenancyId, userId } = options\n\n const url = new URL(`/${tenancyId}/users/${userId}/passkeys/`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"delete\",\n { userId },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded:\n | typeof PasskeySchemas.DeletedPasskeysResponse.Type\n | NotFoundError\n | ForbiddenError = yield* matchStatus(response, {\n \"2xx\": (res) =>\n decodeResponseJson(res, PasskeySchemas.DeletedPasskeysResponse),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(NotFoundError, ForbiddenError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"DeletedPasskeys\", (result) =>\n Effect.succeed({\n _tag: \"DeletedPasskeys\" as const,\n deleted: result.deleted.map((passkey) => ({\n credentialId: passkey.credential.id,\n userId: passkey.credential.userId,\n rpId: passkey.credential.rpId,\n })),\n })\n ),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Update user details by userId */\n\n/**\n * Options for updating the username and display name for all passkeys that\n * share a custom user ID.\n *\n * @category Passkeys\n */\nexport interface UpdateUsernamesOptions extends AuthenticatedOptions {\n /**\n * Custom user ID whose passkeys should be updated.\n */\n userId: string\n /**\n * Username to write back to each stored passkey.\n */\n username: string\n /**\n * Optional display name to return for client-side credential updates.\n *\n * When omitted, the returned credentials use `username` as the display name.\n */\n displayName?: string\n}\n\n/**\n * Update the username metadata for all passkeys belonging to a custom user ID.\n *\n * The resulting payload is designed to be passed to\n * `@passlock/client` so matching device credentials can be updated.\n *\n * @param options Request options including the custom user ID and username metadata.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with one credential update per updated passkey.\n *\n * @category Passkeys\n */\nexport const updatePasskeyUsernames = (\n options: UpdateUsernamesOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<UpdatedCredentials, NotFoundError | ForbiddenError> =>\n pipe(\n updateUserPasskeys(options, fetchLayer),\n Effect.map((result) => result.updated),\n Effect.map(\n Array.map((passkey) => {\n return {\n rpId: passkey.credential.rpId,\n userId: passkey.credential.userId,\n username: passkey.credential.username,\n displayName: options.displayName ?? passkey.credential.username,\n }\n })\n ),\n Effect.map((credentials) => ({\n _tag: \"UpdatedCredentials\",\n credentials,\n }))\n )\n\n/* List Passkeys */\n\n/**\n * Stream every passkey summary for a tenancy across all result pages.\n *\n * @param options Request options used for each paginated request.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns A stream of passkey summaries.\n *\n * @category Passkeys\n */\nexport const listPasskeysStream = (\n options: AuthenticatedOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Stream.Stream<PasskeySummary, ForbiddenError> =>\n pipe(\n Stream.paginateChunkEffect(null as string | null, (cursor) =>\n pipe(\n listPasskeys(cursor ? { ...options, cursor } : options, fetchLayer),\n Effect.map((result) => [\n Chunk.fromIterable(result.records),\n Option.fromNullable(result.cursor),\n ])\n )\n )\n )\n\n/**\n * Options for listing passkeys.\n *\n * @category Passkeys\n */\nexport interface ListPasskeyOptions extends AuthenticatedOptions {\n /**\n * Pagination cursor returned from a previous {@link listPasskeys} call.\n */\n cursor?: string\n}\n\n/**\n * Fetch a single page of passkey summaries for a tenancy.\n *\n * @param options Request options including an optional pagination cursor.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with one page of passkey summaries.\n *\n * @category Passkeys\n */\nexport const listPasskeys = (\n options: ListPasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<FindAllPasskeys, ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/`, baseUrl)\n if (options.cursor) {\n url.searchParams.append(\"cursor\", options.cursor)\n }\n\n const response = yield* fetchNetwork(url, \"get\", undefined, {\n headers: authorizationHeaders(options.apiKey),\n })\n\n const encoded: FindAllPasskeys | ForbiddenError = yield* matchStatus(\n response,\n {\n \"2xx\": (res) => decodeResponseJson(res, FindAllPasskeysSchema),\n orElse: (res) => decodeResponseJson(res, ForbiddenError),\n }\n )\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"FindAllPasskeys\", (data) => Effect.succeed(data)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n"]}
|
|
1
|
+
{"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../src/passkey/passkey.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Array,\n Chunk,\n Effect,\n type Layer,\n Match,\n Option,\n pipe,\n Schema,\n Stream,\n} from \"effect\"\nimport type { satisfy } from \"src/schemas/satisfy.js\"\nimport {\n fetchNetwork,\n matchStatus,\n type NetworkFetch,\n NetworkFetchLive,\n type NetworkPayloadError,\n type NetworkRequestError,\n type NetworkResponse,\n type NetworkResponseError,\n} from \"../network.js\"\nimport {\n FindAllPasskeys as FindAllPasskeysSchema,\n ForbiddenError,\n NotFoundError,\n} from \"../schemas/index.js\"\nimport * as PasskeySchemas from \"../schemas/passkey.js\"\nimport type { AuthenticatedOptions } from \"../shared.js\"\n\n/* Passkey */\n\n/**\n * WebAuthn-specific credential data stored for a passkey in the Passlock vault.\n *\n * The `id` and `userId` fields are the underlying WebAuthn values, encoded as\n * Base64URL strings.\n *\n * @category Passkeys\n */\nexport type PasskeyCredential = {\n id: string\n userId: string\n username: string\n aaguid: string\n backedUp: boolean\n counter: number\n deviceType: PasskeySchemas.CredentialDeviceType\n transports: ReadonlyArray<PasskeySchemas.Transports>\n publicKey: Uint8Array<ArrayBufferLike>\n rpId: string\n}\n\n/**\n * Passkeys are usually synced across devices **but only within\n * a specific platform/ecosystem** e.g. a passkey created on Apple\n * devices would typically be synced across devices sharing the same\n * iCloud ID.\n *\n * However, if the user also wants to sign in from their Windows\n * or Android/Chrome devices they will need an additional passkey.\n * Therefore when listing the passkeys registered to a user's account\n * it's a good idea to tell them which platform the passkeys relate to.\n *\n * We've also included links to icons (SVG) so you can give your users\n * a quick visual indication.\n *\n * @category Passkeys\n */\nexport type Platform = {\n name?: string | undefined\n icon?: string | undefined\n}\n\n/**\n * The server-side representation of a passkey stored in the Passlock vault.\n *\n * @category Passkeys\n */\nexport type Passkey = {\n _tag: \"Passkey\"\n /**\n * Not to be confused with the credential.id\n */\n id: string\n /**\n * Not to be confused with the credential.userId\n */\n userId?: string | undefined\n enabled: boolean\n credential: PasskeyCredential\n platform?: Platform | undefined\n lastUsed?: number | undefined\n createdAt: number\n updatedAt: number\n}\n\n/**\n * Type guard for {@link Passkey}.\n *\n * @category Passkeys\n */\nexport const isPasskey = (payload: unknown): payload is Passkey =>\n Schema.is(PasskeySchemas.Passkey)(payload)\n\n/**\n * needed to ensure the Passkey === Passkey.Type\n * @internal\n * */\nexport type _Passkey = satisfy<typeof PasskeySchemas.Passkey.Type, Passkey>\n\n/**\n * needed to ensure the PasskeyCredential === PasskeyCredential.Type\n * @internal\n * */\nexport type _PasskeyCredential = satisfy<\n typeof PasskeySchemas.PasskeyCredential.Type,\n PasskeyCredential\n>\n\n/* PasskeySummary */\n\n/**\n * Compact passkey payload returned by list operations.\n *\n * @category Passkeys\n */\nexport type PasskeySummary = {\n readonly _tag: \"PasskeySummary\"\n readonly id: string\n readonly userId: string\n readonly enabled: boolean\n readonly credential: {\n readonly id: string\n readonly userId: string\n }\n readonly lastUsed?: number | undefined\n readonly createdAt: number\n}\n\n/**\n * Type guard for {@link PasskeySummary}.\n *\n * @category Passkeys\n */\nexport const isPasskeySummary = (payload: unknown): payload is PasskeySummary =>\n Schema.is(PasskeySchemas.PasskeySummary)(payload)\n\n/**\n * needed to ensure the PasskeySummary === PasskeySummary.Type\n * @internal\n */\nexport type _PasskeySummary = satisfy<\n typeof PasskeySchemas.PasskeySummary.Type,\n PasskeySummary\n>\n\n/* UpdatedPasskeys */\n\n/**\n * Result payload returned when passkeys are updated in bulk for a user.\n *\n * @category Passkeys\n */\nexport type UpdatedPasskeys = {\n _tag: \"UpdatedPasskeys\"\n updated: ReadonlyArray<Passkey>\n}\n\n/**\n * Type guard for {@link UpdatedPasskeys}.\n *\n * @category Passkeys\n */\nexport const isUpdatedPasskeys = (\n payload: unknown\n): payload is UpdatedPasskeys =>\n Schema.is(PasskeySchemas.UpdatedPasskeys)(payload)\n\n/**\n * needed to ensure the UpdatedPasskeys === UpdatedPasskeys.Type\n * @internal\n * */\nexport type _UpdatedPasskeys = satisfy<\n typeof PasskeySchemas.UpdatedPasskeys.Type,\n UpdatedPasskeys\n>\n\n/* Credential */\n\n/**\n * Credential identifiers returned by passkey deletion operations.\n *\n * @category Passkeys\n */\nexport type Credential = {\n credentialId: string\n userId: string\n rpId: string\n}\n\n/**\n * needed to ensure the Credential === Credential.Type\n * @internal\n */\nexport type _Credential = satisfy<\n typeof PasskeySchemas.Credential.Type,\n Credential\n>\n\n/* DeletedPasskey */\n\n/**\n * Result payload returned when a single passkey has been deleted.\n *\n * @category Passkeys\n */\nexport type DeletedPasskey = {\n _tag: \"DeletedPasskey\"\n deleted: Credential\n}\n\n/**\n * Type guard for {@link DeletedPasskey}.\n *\n * @category Passkeys\n */\nexport const isDeletedPasskey = (payload: unknown): payload is DeletedPasskey =>\n Schema.is(PasskeySchemas.DeletedPasskey)(payload)\n\n/**\n * needed to ensure the DeletedPasskey === DeletedPasskey.Type\n * @internal\n * */\nexport type _DeletedPasskey = satisfy<\n typeof PasskeySchemas.DeletedPasskey.Type,\n DeletedPasskey\n>\n\n/* DeletedPasskeys */\n\n/**\n * Result payload returned when all passkeys for a user have been deleted.\n *\n * @category Passkeys\n */\nexport type DeletedPasskeys = {\n _tag: \"DeletedPasskeys\"\n deleted: ReadonlyArray<Credential>\n}\n\n/**\n * Type guard for {@link DeletedPasskeys}.\n *\n * @category Passkeys\n */\nexport const isDeletedPasskeys = (\n payload: unknown\n): payload is DeletedPasskeys =>\n Schema.is(PasskeySchemas.DeletedPasskeys)(payload)\n\n/**\n * needed to ensure the DeletedPasskeys === DeletedPasskeys.Type\n * @internal\n * */\nexport type _DeletedPasskeys = satisfy<\n typeof PasskeySchemas.DeletedPasskeys.Type,\n DeletedPasskeys\n>\n\n/* FindAllPasskeys */\n\n/**\n * A single page of passkey summaries returned by {@link listPasskeys}.\n *\n * @category Passkeys\n */\nexport type FindAllPasskeys = {\n readonly _tag: \"FindAllPasskeys\"\n readonly cursor: string | null\n readonly records: ReadonlyArray<PasskeySummary>\n}\n\n/**\n * Type guard for {@link FindAllPasskeys}.\n *\n * @category Passkeys\n */\nexport const isFindAllPasskeys = (\n payload: unknown\n): payload is FindAllPasskeys =>\n Schema.is(PasskeySchemas.FindAllPasskeys)(payload)\n\n/**\n * needed to ensure the FindAllPasskeys === FindAllPasskeys.Type\n * @internal\n */\nexport type _FindAllPasskeys = satisfy<\n typeof FindAllPasskeysSchema.Type,\n FindAllPasskeys\n>\n\n/* UpdatedCredentials (update names by userId) */\n\n/**\n * Client-facing credential update payload returned by\n * {@link updatePasskeyUsernames}.\n *\n * Each entry describes one credential to update on the user's device. The\n * returned `displayName` is derived from\n * {@link UpdateUsernamesOptions#displayName} when provided, otherwise it falls\n * back to the stored username.\n *\n * @category Passkeys\n */\nexport type UpdatedCredentials = {\n _tag: \"UpdatedCredentials\"\n credentials: ReadonlyArray<{\n rpId: string\n userId: string\n username: string\n displayName: string\n }>\n}\n\n/**\n * Narrow an unknown value to an `UpdatedCredentials`-tagged payload.\n *\n * @category Passkeys\n */\nexport const isUpdatedUserDetails = (\n payload: unknown\n): payload is UpdatedCredentials => {\n if (typeof payload !== \"object\") return false\n if (payload === null) return false\n if (!(\"_tag\" in payload)) return false\n if (typeof payload._tag !== \"string\") return false\n if (payload._tag !== \"UpdatedCredentials\") return false\n\n return true\n}\n\n/* END UpdatedUserDetails */\n\nconst authorizationHeaders = (apiKey: string) => ({\n authorization: `Bearer ${apiKey}`,\n})\n\nconst decodeResponseJson = <A, I, R>(\n response: NetworkResponse,\n schema: Schema.Schema<A, I, R>\n) => pipe(response.json, Effect.flatMap(Schema.decodeUnknown(schema)))\n\n/* Get Passkey */\n\n/**\n * Options for fetching a single passkey.\n *\n * @category Passkeys\n */\nexport interface GetPasskeyOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to fetch.\n */\n passkeyId: string\n}\n\n/**\n * Fetch a single passkey from the Passlock vault.\n *\n * @param options Request options including the passkey identifier.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the requested passkey.\n *\n * @category Passkeys\n */\nexport const getPasskey = (\n options: GetPasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<Passkey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { tenancyId, passkeyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(url, \"get\", undefined, {\n headers: authorizationHeaders(options.apiKey),\n })\n\n const encoded: Passkey | ForbiddenError | NotFoundError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(ForbiddenError, NotFoundError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (data) => Effect.succeed(data)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Delete Passkey */\n\n/**\n * Options for deleting a single passkey.\n *\n * @category Passkeys\n */\nexport interface DeletePasskeyOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to delete.\n */\n passkeyId: string\n}\n\n/**\n * Delete a single passkey from the Passlock vault.\n *\n * This only removes the server-side record. It does not remove the passkey\n * from the user's device.\n *\n * @param options Request options including the passkey identifier.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the deleted credential.\n *\n * @category Passkeys\n */\nexport const deletePasskey = (\n options: DeletePasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<DeletedPasskey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { tenancyId, passkeyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(url, \"delete\", undefined, {\n headers: authorizationHeaders(options.apiKey),\n })\n\n const encoded: Passkey | ForbiddenError | NotFoundError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(ForbiddenError, NotFoundError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (passkey) =>\n Effect.succeed({\n _tag: \"DeletedPasskey\" as const,\n deleted: {\n credentialId: passkey.credential.id,\n userId: passkey.credential.userId,\n rpId: passkey.credential.rpId,\n },\n })\n ),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Assign User */\n\n/**\n * Options for assigning a custom user ID to a single passkey.\n *\n * @category Passkeys\n */\nexport interface AssignUserOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to update.\n */\n passkeyId: string\n\n /**\n * Custom User ID to align with your own systems\n */\n userId: string\n}\n\n// TODO reuse updatePasskey\n/**\n * Assign a custom user ID to a single passkey.\n *\n * This updates Passlock's mapping for the passkey. It does not change the\n * underlying WebAuthn credential's `userId`.\n *\n * @param options Request options including the passkey identifier and custom user ID.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the updated passkey.\n *\n * @category Passkeys\n */\nexport const assignUser = (\n options: AssignUserOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<Passkey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { userId, passkeyId } = options\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"patch\",\n { userId },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded: Passkey | NotFoundError | ForbiddenError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(NotFoundError, ForbiddenError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (passkey) => Effect.succeed(passkey)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Update passkey */\n\n/**\n * Options for updating a single passkey's metadata.\n *\n * @category Passkeys\n */\nexport interface UpdatePasskeyOptions extends AuthenticatedOptions {\n /**\n * Identifier of the passkey to update.\n */\n passkeyId: string\n /**\n * Custom user ID to associate with the passkey.\n */\n userId?: string\n /**\n * Username metadata stored alongside the passkey.\n */\n username?: string\n}\n\n/**\n * Update a single passkey's custom user ID and/or username metadata.\n *\n * @param options Request options including the passkey identifier and fields to update.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the updated passkey.\n *\n * @category Passkeys\n */\nexport const updatePasskey = (\n options: UpdatePasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<Passkey, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n\n const { userId, passkeyId, username } = options\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/${passkeyId}`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"patch\",\n { userId, username },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded: Passkey | NotFoundError | ForbiddenError =\n yield* matchStatus(response, {\n \"2xx\": (res) => decodeResponseJson(res, PasskeySchemas.Passkey),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(NotFoundError, ForbiddenError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"Passkey\", (passkey) => Effect.succeed(passkey)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Update passkeys by userId (currently not exported) */\n\ninterface UpdateUserPasskeyOptions extends AuthenticatedOptions {\n userId: string\n username?: string\n}\n\nconst updateUserPasskeys = (\n options: UpdateUserPasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<UpdatedPasskeys, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n\n const { userId, username } = options\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/users/${userId}/passkeys/`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"patch\",\n { userId, username },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded: UpdatedPasskeys | NotFoundError | ForbiddenError =\n yield* matchStatus(response, {\n \"2xx\": (res) =>\n decodeResponseJson(res, PasskeySchemas.UpdatedPasskeys),\n orElse: (res) =>\n decodeResponseJson(\n res,\n Schema.Union(NotFoundError, ForbiddenError)\n ),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"UpdatedPasskeys\", (result) => Effect.succeed(result)),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Delete passkeys by userId */\n\n/**\n * Options for deleting all passkeys belonging to a user.\n *\n * @category Passkeys\n */\nexport interface DeleteUserPasskeysOptions extends AuthenticatedOptions {\n /**\n * Custom user ID whose passkeys should be deleted.\n */\n userId: string\n}\n\n/**\n * Delete all passkeys associated with a custom user ID.\n *\n * The resulting `deleted` credentials can be passed to\n * `@passlock/client` to remove the corresponding passkeys from the user's\n * device.\n *\n * @param options Request options including the custom user ID.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with the deleted credential identifiers.\n *\n * @category Passkeys\n */\nexport const deleteUserPasskeys = (\n options: DeleteUserPasskeysOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<DeletedPasskeys, NotFoundError | ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n\n const { tenancyId, userId } = options\n\n const url = new URL(`/${tenancyId}/users/${userId}/passkeys/`, baseUrl)\n\n const response = yield* fetchNetwork(\n url,\n \"delete\",\n { userId },\n {\n headers: authorizationHeaders(options.apiKey),\n }\n )\n\n const encoded:\n | typeof PasskeySchemas.DeletedPasskeysResponse.Type\n | NotFoundError\n | ForbiddenError = yield* matchStatus(response, {\n \"2xx\": (res) =>\n decodeResponseJson(res, PasskeySchemas.DeletedPasskeysResponse),\n orElse: (res) =>\n decodeResponseJson(res, Schema.Union(NotFoundError, ForbiddenError)),\n })\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"DeletedPasskeys\", (result) =>\n Effect.succeed({\n _tag: \"DeletedPasskeys\" as const,\n deleted: result.deleted.map((passkey) => ({\n credentialId: passkey.credential.id,\n userId: passkey.credential.userId,\n rpId: passkey.credential.rpId,\n })),\n })\n ),\n Match.tag(\"@error/NotFound\", (err) => Effect.fail(err)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n\n/* Update user details by userId */\n\n/**\n * Options for updating username metadata for all passkeys that share a custom\n * user ID, plus optional display-name data to return for client-side updates.\n *\n * @category Passkeys\n */\nexport interface UpdateUsernamesOptions extends AuthenticatedOptions {\n /**\n * Custom user ID whose passkeys should be updated.\n */\n userId: string\n /**\n * Username to write back to each stored passkey.\n */\n username: string\n /**\n * Optional display name to return for client-side credential updates.\n *\n * When omitted, the returned credentials use `username` as the display name.\n */\n displayName?: string\n}\n\n/**\n * Update the username metadata for all passkeys belonging to a custom user ID.\n *\n * The resulting payload is designed to be passed to\n * `@passlock/client` so matching device credentials can be updated.\n * The optional `displayName` is not stored in Passlock; it is only copied into\n * the returned client payload.\n *\n * @param options Request options including the custom user ID and username metadata.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with one credential update per updated passkey.\n *\n * @category Passkeys\n */\nexport const updatePasskeyUsernames = (\n options: UpdateUsernamesOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<UpdatedCredentials, NotFoundError | ForbiddenError> =>\n pipe(\n updateUserPasskeys(options, fetchLayer),\n Effect.map((result) => result.updated),\n Effect.map(\n Array.map((passkey) => {\n return {\n rpId: passkey.credential.rpId,\n userId: passkey.credential.userId,\n username: passkey.credential.username,\n displayName: options.displayName ?? passkey.credential.username,\n }\n })\n ),\n Effect.map((credentials) => ({\n _tag: \"UpdatedCredentials\",\n credentials,\n }))\n )\n\n/* List Passkeys */\n\n/**\n * Stream every passkey summary for a tenancy across all result pages.\n *\n * @param options Request options used for each paginated request.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns A stream of passkey summaries.\n *\n * @category Passkeys\n */\nexport const listPasskeysStream = (\n options: AuthenticatedOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Stream.Stream<PasskeySummary, ForbiddenError> =>\n pipe(\n Stream.paginateChunkEffect(null as string | null, (cursor) =>\n pipe(\n listPasskeys(cursor ? { ...options, cursor } : options, fetchLayer),\n Effect.map((result) => [\n Chunk.fromIterable(result.records),\n Option.fromNullable(result.cursor),\n ])\n )\n )\n )\n\n/**\n * Options for listing passkeys.\n *\n * @category Passkeys\n */\nexport interface ListPasskeyOptions extends AuthenticatedOptions {\n /**\n * Pagination cursor returned from a previous {@link listPasskeys} call.\n */\n cursor?: string\n}\n\n/**\n * Fetch a single page of passkey summaries for a tenancy.\n *\n * @param options Request options including an optional pagination cursor.\n * @param fetchLayer Optional fetch service override for testing or custom runtimes.\n * @returns An Effect that succeeds with one page of passkey summaries.\n *\n * @category Passkeys\n */\nexport const listPasskeys = (\n options: ListPasskeyOptions,\n fetchLayer: Layer.Layer<NetworkFetch> = NetworkFetchLive\n): Effect.Effect<FindAllPasskeys, ForbiddenError> =>\n pipe(\n Effect.gen(function* () {\n const baseUrl = options.endpoint ?? \"https://api.passlock.dev\"\n const { tenancyId } = options\n\n const url = new URL(`/${tenancyId}/passkeys/`, baseUrl)\n if (options.cursor) {\n url.searchParams.append(\"cursor\", options.cursor)\n }\n\n const response = yield* fetchNetwork(url, \"get\", undefined, {\n headers: authorizationHeaders(options.apiKey),\n })\n\n const encoded: FindAllPasskeys | ForbiddenError = yield* matchStatus(\n response,\n {\n \"2xx\": (res) => decodeResponseJson(res, FindAllPasskeysSchema),\n orElse: (res) => decodeResponseJson(res, ForbiddenError),\n }\n )\n\n return yield* pipe(\n Match.value(encoded),\n Match.tag(\"FindAllPasskeys\", (data) => Effect.succeed(data)),\n Match.tag(\"@error/Forbidden\", (err) => Effect.fail(err)),\n Match.exhaustive\n )\n }),\n Effect.catchTags({\n \"@error/NetworkPayload\": (err: NetworkPayloadError) => Effect.die(err),\n \"@error/NetworkRequest\": (err: NetworkRequestError) => Effect.die(err),\n \"@error/NetworkResponse\": (err: NetworkResponseError) => Effect.die(err),\n ParseError: (err) => Effect.die(err),\n }),\n Effect.provide(fetchLayer)\n )\n"]}
|
package/dist/safe-result.js
CHANGED
package/dist/safe-result.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-result.js","sourceRoot":"","sources":["../src/safe-result.ts"],"names":[],"mappings":"AAmCA,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,QAAqB,EAAW,EAAE,CACzE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"safe-result.js","sourceRoot":"","sources":["../src/safe-result.ts"],"names":[],"mappings":"AAmCA,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,QAAqB,EAAW,EAAE,CACzE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAElC,MAAM,cAAc,GAAG,CAAmB,OAAU,EAAE,EAAE,CAAC,CAAC;IACxD,YAAY,EAAE,KAAK;IACnB,UAAU,EAAE,KAAK;IACjB,GAAG,EAAE,GAAM,EAAE,CAAC,OAAO;CACtB,CAAC,CAAA;AAEF,MAAM,QAAQ,GAAG,CAKf,OAAU,EACV,OAAgB,EAChB,GAAQ,EACL,EAAE;IACL,MAAM,WAAW,GAA0B,EAAE,CAAA;IAE7C,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QACxC,WAAW,CAAC,OAAO,GAAG;YACpB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,KAAK;SAChB,CAAA;IACH,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QACxC,WAAW,CAAC,OAAO,GAAG;YACpB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,CAAC,OAAO;YACf,QAAQ,EAAE,KAAK;SAChB,CAAA;IACH,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QAClC,WAAW,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC/C,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAmB,OAAU,EAAS,EAAE,CAChE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAU,CAAA;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAmB,OAAU,EAAU,EAAE,CAClE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAW,CAAA","sourcesContent":["/**\n * Result envelope applied to successful values returned from\n * `@passlock/server/safe`.\n *\n * The top-level object still exposes its original `_tag`, so\n * existing `_tag` checks and type guards continue to work, while\n * `success` and `failure` provide boolean branch narrowing.\n */\nexport type Ok<T extends object> = T & {\n readonly success: true\n readonly failure: false\n readonly value: T\n}\n\n/**\n * Result envelope applied to expected error values returned from\n * `@passlock/server/safe`.\n *\n * The top-level object still exposes its original `_tag`, so\n * existing `_tag` checks and type guards continue to work, while\n * `success` and `failure` provide boolean branch narrowing.\n */\nexport type Err<E extends object> = E & {\n readonly success: false\n readonly failure: true\n readonly error: E\n}\n\n/**\n * Result envelope used by the `@passlock/server/safe` entrypoint.\n */\nexport type Result<T extends object, E extends object> =\n | Ok<T>\n | (E extends unknown ? Err<E> : never)\n\nconst hasOwnProperty = (payload: object, property: PropertyKey): boolean =>\n Object.hasOwn(payload, property)\n\nconst toSelfAccessor = <T extends object>(payload: T) => ({\n configurable: false,\n enumerable: false,\n get: (): T => payload,\n})\n\nconst decorate = <\n T extends object,\n Success extends boolean,\n Key extends \"value\" | \"error\",\n>(\n payload: T,\n success: Success,\n key: Key\n): T => {\n const descriptors: PropertyDescriptorMap = {}\n\n if (!hasOwnProperty(payload, \"success\")) {\n descriptors.success = {\n configurable: false,\n enumerable: false,\n value: success,\n writable: false,\n }\n }\n\n if (!hasOwnProperty(payload, \"failure\")) {\n descriptors.failure = {\n configurable: false,\n enumerable: false,\n value: !success,\n writable: false,\n }\n }\n\n if (!hasOwnProperty(payload, key)) {\n descriptors[key] = toSelfAccessor(payload)\n }\n\n if (Object.keys(descriptors).length > 0) {\n Object.defineProperties(payload, descriptors)\n }\n\n return payload\n}\n\nexport const toOkResult = <T extends object>(payload: T): Ok<T> =>\n decorate(payload, true, \"value\") as Ok<T>\n\nexport const toErrResult = <E extends object>(payload: E): Err<E> =>\n decorate(payload, false, \"error\") as Err<E>\n"]}
|
package/dist/safe.d.ts
CHANGED
|
@@ -27,14 +27,18 @@
|
|
|
27
27
|
* ```
|
|
28
28
|
*
|
|
29
29
|
* @categoryDescription Passkeys
|
|
30
|
-
* Functions and related types for managing passkeys
|
|
30
|
+
* Functions and related types for managing passkeys.
|
|
31
|
+
*
|
|
32
|
+
* @categoryDescription Principal
|
|
33
|
+
* Functions and related types for exchanging client codes and verifying
|
|
34
|
+
* Passlock tokens.
|
|
31
35
|
*
|
|
32
36
|
* @showCategories
|
|
33
37
|
*
|
|
34
38
|
* @module safe
|
|
35
39
|
*/
|
|
36
40
|
import type { ForbiddenError, InvalidCodeError, NotFoundError, VerificationError } from "./errors.js";
|
|
37
|
-
import type { AssignUserOptions, DeletePasskeyOptions, DeleteUserPasskeysOptions,
|
|
41
|
+
import type { AssignUserOptions, DeletedPasskey, DeletedPasskeys, DeletePasskeyOptions, DeleteUserPasskeysOptions, FindAllPasskeys, GetPasskeyOptions, ListPasskeyOptions, Passkey, UpdatedCredentials, UpdatePasskeyOptions, UpdateUsernamesOptions } from "./passkey/passkey.js";
|
|
38
42
|
import type { ExchangeCodeOptions, VerifyIdTokenOptions } from "./principal/principal.js";
|
|
39
43
|
import { type Result } from "./safe-result.js";
|
|
40
44
|
import type { ExtendedPrincipal, Principal } from "./schemas/principal.js";
|
|
@@ -74,13 +78,15 @@ export declare const assignUser: (request: AssignUserOptions) => Promise<Result<
|
|
|
74
78
|
*/
|
|
75
79
|
export declare const updatePasskey: (request: UpdatePasskeyOptions) => Promise<Result<Passkey, NotFoundError | ForbiddenError>>;
|
|
76
80
|
/**
|
|
77
|
-
* Update the username
|
|
81
|
+
* Update the stored username metadata for all passkeys belonging to a given
|
|
82
|
+
* user, and prepare client-side credential updates for those passkeys.
|
|
78
83
|
*
|
|
79
|
-
* **Important:** changing these values has no bearing on authentication
|
|
80
|
-
*
|
|
81
|
-
*
|
|
84
|
+
* **Important:** changing these values has no bearing on authentication. The
|
|
85
|
+
* server-side operation updates the username stored in Passlock. The optional
|
|
86
|
+
* `displayName` is only included in the returned credential updates for
|
|
87
|
+
* follow-up use with `@passlock/client`; it is not persisted in the vault.
|
|
82
88
|
*
|
|
83
|
-
* However you might choose to align the username
|
|
89
|
+
* However you might choose to align the username in your vault with the
|
|
84
90
|
* client-side component to simplify end user support.
|
|
85
91
|
*
|
|
86
92
|
* **Note:** This can be used alongside `@passlock/client`'s
|
|
@@ -117,11 +123,11 @@ export declare const updatePasskeyUsernames: (request: UpdateUsernamesOptions) =
|
|
|
117
123
|
*
|
|
118
124
|
* @param options
|
|
119
125
|
* @returns A promise resolving to a {@link Result} whose success branch contains
|
|
120
|
-
* the deleted
|
|
126
|
+
* the deleted credential and whose error branch contains an API error.
|
|
121
127
|
*
|
|
122
128
|
* @category Passkeys
|
|
123
129
|
*/
|
|
124
|
-
export declare const deletePasskey: (options: DeletePasskeyOptions) => Promise<Result<
|
|
130
|
+
export declare const deletePasskey: (options: DeletePasskeyOptions) => Promise<Result<DeletedPasskey, ForbiddenError | NotFoundError>>;
|
|
125
131
|
/**
|
|
126
132
|
* Delete all passkeys associated with a user.
|
|
127
133
|
*
|
|
@@ -192,12 +198,12 @@ export declare const exchangeCode: (options: ExchangeCodeOptions) => Promise<Res
|
|
|
192
198
|
* @category Principal
|
|
193
199
|
*/
|
|
194
200
|
export declare const verifyIdToken: (options: VerifyIdTokenOptions) => Promise<Result<Principal, VerificationError>>;
|
|
195
|
-
export type { Err, Ok, Result } from "./safe-result.js";
|
|
196
201
|
export type { BadRequestError, DuplicateEmailError, ForbiddenError, InvalidCodeError, InvalidEmailError, InvalidTenancyError, NotFoundError, PasskeyNotFoundError, UnauthorizedError, VerificationError, } from "./errors.js";
|
|
197
202
|
export { isBadRequestError, isDuplicateEmailError, isForbiddenError, isInvalidCodeError, isInvalidEmailError, isInvalidTenancyError, isNotFoundError, isPasskeyNotFoundError, isUnauthorizedError, isVerificationError, } from "./errors.js";
|
|
198
|
-
export type { AssignUserOptions, Credential, DeletePasskeyOptions, DeleteUserPasskeysOptions,
|
|
203
|
+
export type { AssignUserOptions, Credential, DeletedPasskey, DeletedPasskeys, DeletePasskeyOptions, DeleteUserPasskeysOptions, FindAllPasskeys, GetPasskeyOptions, ListPasskeyOptions, Passkey, PasskeyCredential, PasskeySummary, Platform, UpdatedCredentials as UpdatedUserDetails, UpdatedPasskeys, UpdatePasskeyOptions, UpdateUsernamesOptions as UpdateUserDetailsOptions, } from "./passkey/passkey.js";
|
|
199
204
|
export { isDeletedPasskeys, isPasskey, isPasskeySummary, isUpdatedPasskeys, isUpdatedUserDetails, } from "./passkey/passkey.js";
|
|
200
205
|
export type { ExchangeCodeOptions, VerifyIdTokenOptions, } from "./principal/principal.js";
|
|
206
|
+
export type { Err, Ok, Result } from "./safe-result.js";
|
|
201
207
|
export type { CredentialDeviceType, Transports, } from "./schemas/passkey.js";
|
|
202
208
|
export type { ExtendedPrincipal, Principal } from "./schemas/principal.js";
|
|
203
209
|
export { isExtendedPrincipal, isPrincipal } from "./schemas/principal.js";
|
package/dist/safe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"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"}
|
package/dist/safe.js
CHANGED
|
@@ -27,7 +27,11 @@
|
|
|
27
27
|
* ```
|
|
28
28
|
*
|
|
29
29
|
* @categoryDescription Passkeys
|
|
30
|
-
* Functions and related types for managing passkeys
|
|
30
|
+
* Functions and related types for managing passkeys.
|
|
31
|
+
*
|
|
32
|
+
* @categoryDescription Principal
|
|
33
|
+
* Functions and related types for exchanging client codes and verifying
|
|
34
|
+
* Passlock tokens.
|
|
31
35
|
*
|
|
32
36
|
* @showCategories
|
|
33
37
|
*
|
|
@@ -77,13 +81,15 @@ export const assignUser = (request) => runSafe(assignUserE(request));
|
|
|
77
81
|
*/
|
|
78
82
|
export const updatePasskey = (request) => runSafe(updatePasskeyE(request));
|
|
79
83
|
/**
|
|
80
|
-
* Update the username
|
|
84
|
+
* Update the stored username metadata for all passkeys belonging to a given
|
|
85
|
+
* user, and prepare client-side credential updates for those passkeys.
|
|
81
86
|
*
|
|
82
|
-
* **Important:** changing these values has no bearing on authentication
|
|
83
|
-
*
|
|
84
|
-
*
|
|
87
|
+
* **Important:** changing these values has no bearing on authentication. The
|
|
88
|
+
* server-side operation updates the username stored in Passlock. The optional
|
|
89
|
+
* `displayName` is only included in the returned credential updates for
|
|
90
|
+
* follow-up use with `@passlock/client`; it is not persisted in the vault.
|
|
85
91
|
*
|
|
86
|
-
* However you might choose to align the username
|
|
92
|
+
* However you might choose to align the username in your vault with the
|
|
87
93
|
* client-side component to simplify end user support.
|
|
88
94
|
*
|
|
89
95
|
* **Note:** This can be used alongside `@passlock/client`'s
|
|
@@ -120,7 +126,7 @@ export const updatePasskeyUsernames = (request) => runSafe(updatePasskeyUsername
|
|
|
120
126
|
*
|
|
121
127
|
* @param options
|
|
122
128
|
* @returns A promise resolving to a {@link Result} whose success branch contains
|
|
123
|
-
* the deleted
|
|
129
|
+
* the deleted credential and whose error branch contains an API error.
|
|
124
130
|
*
|
|
125
131
|
* @category Passkeys
|
|
126
132
|
*/
|
package/dist/safe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe.js","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Safe functions that return result envelopes over the original\n * tagged success and error payloads. The returned value keeps\n * its original `_tag` shape, and is also augmented with a\n * result envelope for `success`- or `failure`-style branching.\n *\n * Note: unexpected runtime failures may still throw.\n *\n * ```ts\n * const result = await exchangeCode({\n * apiKey,\n * code,\n * tenancyId,\n * })\n *\n * if (result.success) {\n * console.log(result.value.id)\n * }\n *\n * if (result.failure) {\n * console.log(result.error.message)\n * }\n *\n * if (isExtendedPrincipal(result)) {\n * console.log(result.id)\n * }\n * ```\n *\n * @categoryDescription Passkeys\n * Functions and related types for managing passkeys\n *\n * @showCategories\n *\n * @module safe\n */\n\nimport { Effect, pipe } from \"effect\"\nimport type {\n ForbiddenError,\n InvalidCodeError,\n NotFoundError,\n VerificationError,\n} from \"./errors.js\"\nimport type {\n AssignUserOptions,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n DeletedPasskeys,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n UpdatedCredentials,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions,\n} from \"./passkey/passkey.js\"\nimport {\n assignUser as assignUserE,\n deletePasskey as deletePasskeyE,\n deleteUserPasskeys as deleteUserPasskeysE,\n getPasskey as getPasskeyE,\n listPasskeys as listPasskeysE,\n updatePasskey as updatePasskeyE,\n updatePasskeyUsernames as updatePasskeyUsernamesE,\n} from \"./passkey/passkey.js\"\nimport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nimport {\n exchangeCode as exchangeCodeE,\n verifyIdToken as verifyIdTokenE,\n} from \"./principal/principal.js\"\nimport { type Result, toErrResult, toOkResult } from \"./safe-result.js\"\nimport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\n\nconst runSafe = <A extends object, E extends object>(\n effect: Effect.Effect<A, E>\n): Promise<Result<A, E>> =>\n pipe(\n effect,\n Effect.match({\n onFailure: (error): Result<A, E> => toErrResult(error) as Result<A, E>,\n onSuccess: (value): Result<A, E> => toOkResult(value) as Result<A, E>,\n }),\n Effect.runPromise\n )\n\n/**\n * Assign a custom User ID to a passkey. Will be reflected in the next\n * {@link Principal} or {@link ExtendedPrincipal} generated.\n *\n * **Note:** This does not change the underlying WebAuthn credential's `userId`.\n * Instead we apply a layer of indirection.\n *\n * @see {@link Principal}\n * @see {@link ExtendedPrincipal}\n * @see [credential](https://passlock.dev/rest-api/credential/)\n *\n * @param request\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a passkey and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const assignUser = (\n request: AssignUserOptions\n): Promise<Result<Passkey, NotFoundError | ForbiddenError>> =>\n runSafe(assignUserE(request))\n\n/**\n * Update a passkey's custom user ID and/or username metadata.\n *\n * **Important:** changing the username has no bearing on authentication, as\n * it's typically only used in the client-side component of the passkey\n * (so the user knows which account the passkey relates to).\n *\n * However you might choose to align the username in your vault with the\n * client-side component to simplify end user support.\n *\n * @param request\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a passkey and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const updatePasskey = (\n request: UpdatePasskeyOptions\n): Promise<Result<Passkey, NotFoundError | ForbiddenError>> =>\n runSafe(updatePasskeyE(request))\n\n/**\n * Update the username and/or display name for all passkeys belonging to a given user.\n *\n * **Important:** changing these values has no bearing on authentication, as\n * it's typically only used in the client-side component of the passkey\n * (so the user knows which account the passkey relates to).\n *\n * However you might choose to align the username and display name in your vault with the\n * client-side component to simplify end user support.\n *\n * **Note:** This can be used alongside `@passlock/client`'s\n * `updatePasskeyUsernames` helper to update those details on the user's device.\n *\n * @param request\n * @returns A promise resolving to a {@link Result}.\n * The success branch contains an {@link UpdatedCredentials} payload, whose\n * `credentials` array can be passed into the client's `updatePasskeyUsernames` function.\n * The error branch contains\n * an API error.\n *\n * @category Passkeys\n */\nexport const updatePasskeyUsernames = (\n request: UpdateUsernamesOptions\n): Promise<Result<UpdatedCredentials, NotFoundError | ForbiddenError>> =>\n runSafe(updatePasskeyUsernamesE(request))\n\n/**\n * Delete a passkey from your vault.\n *\n * **Note:** The user will still retain the passkey on their device so\n * you will need to either:\n *\n * a) Use the @passlock/client functions to delete the passkey from the user's device.\n * b) Remind the user to delete the passkey\n *\n * See [deleting passkeys](https://passlock.dev/passkeys/passkey-removal/) in the documentation.\n *\n * In addition, during authentication you should handle a missing passkey scenario.\n * This happens when a user tries to authenticate with a passkey that is missing from\n * your vault. The @passlock/client library can help with this. See\n * [handling missing passkeys](https://passlock.dev/handling-missing-passkeys/)\n *\n * @see [deleting passkeys](https://passlock.dev/passkeys/passkey-removal/)\n * @see [handling missing passkeys](https://passlock.dev/handling-missing-passkeys/)\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * the deleted passkey and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const deletePasskey = (\n options: DeletePasskeyOptions\n): Promise<Result<Passkey, ForbiddenError | NotFoundError>> =>\n runSafe(deletePasskeyE(options))\n\n/**\n * Delete all passkeys associated with a user.\n *\n * @param request\n * @returns A promise resolving to a {@link Result}.\n * The success branch contains a {@link DeletedPasskeys} payload whose\n * `deleted` array can be passed directly into `@passlock/client`'s\n * `deleteUserPasskeys` helper for follow-up client-side passkey removal.\n * The error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const deleteUserPasskeys = (\n request: DeleteUserPasskeysOptions\n): Promise<Result<DeletedPasskeys, ForbiddenError | NotFoundError>> =>\n runSafe(deleteUserPasskeysE(request))\n\n/**\n * Fetch details about a passkey. **Important**: Not to be confused with\n * the {@link exchangeCode} or {@link verifyIdToken} functions, which\n * return details about specific authentication or registration operations.\n * Use this function for passkey management, not authentication.\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * passkey details and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const getPasskey = (\n options: GetPasskeyOptions\n): Promise<Result<Passkey, ForbiddenError | NotFoundError>> =>\n runSafe(getPasskeyE(options))\n\n/**\n * List passkeys for the given tenancy. Note: This could return a cursor.\n * If so, call again, passing the cursor back in.\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a page of passkey summaries and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const listPasskeys = (\n options: ListPasskeyOptions\n): Promise<Result<FindAllPasskeys, ForbiddenError>> =>\n runSafe(listPasskeysE(options))\n\n/**\n * The @passlock/client library generates codes, which you should send to\n * your backend. Use this function to exchange the code for details about\n * the registration or authentication operation. **Note:** a code is valid\n * for 5 minutes.\n *\n * @see {@link ExtendedPrincipal}\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * an extended principal and whose error branch contains an API error.\n *\n * @category Principal\n */\nexport const exchangeCode = (\n options: ExchangeCodeOptions\n): Promise<Result<ExtendedPrincipal, ForbiddenError | InvalidCodeError>> =>\n runSafe(exchangeCodeE(options))\n\n/**\n * Decode and verify an id_token (JWT) locally.\n *\n * **Note:** This will make a network call to\n * `https://api.passlock.dev/.well-known/jwks.json` (or your configured `endpoint`)\n * to fetch the relevant public key. The response will be cached, however\n * bear in mind that for environments such as AWS Lambda it will make the call\n * on each cold start, so it might be slower than {@link exchangeCode}.\n *\n * @see {@link Principal}\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a verified principal and whose error branch contains a verification error.\n *\n * @category Principal\n */\nexport const verifyIdToken = (\n options: VerifyIdTokenOptions\n): Promise<Result<Principal, VerificationError>> =>\n runSafe(verifyIdTokenE(options))\n\n/* Re-exports */\n\nexport type { Err, Ok, Result } from \"./safe-result.js\"\nexport type {\n BadRequestError,\n DuplicateEmailError,\n ForbiddenError,\n InvalidCodeError,\n InvalidEmailError,\n InvalidTenancyError,\n NotFoundError,\n PasskeyNotFoundError,\n UnauthorizedError,\n VerificationError,\n} from \"./errors.js\"\nexport {\n isBadRequestError,\n isDuplicateEmailError,\n isForbiddenError,\n isInvalidCodeError,\n isInvalidEmailError,\n isInvalidTenancyError,\n isNotFoundError,\n isPasskeyNotFoundError,\n isUnauthorizedError,\n isVerificationError,\n} from \"./errors.js\"\nexport type {\n AssignUserOptions,\n Credential,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n DeletedPasskeys,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n PasskeyCredential,\n PasskeySummary,\n Platform,\n UpdatedPasskeys,\n UpdatedCredentials as UpdatedUserDetails,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions as UpdateUserDetailsOptions,\n} from \"./passkey/passkey.js\"\nexport {\n isDeletedPasskeys,\n isPasskey,\n isPasskeySummary,\n isUpdatedPasskeys,\n isUpdatedUserDetails,\n} from \"./passkey/passkey.js\"\nexport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nexport type {\n CredentialDeviceType,\n Transports,\n} from \"./schemas/passkey.js\"\nexport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\nexport { isExtendedPrincipal, isPrincipal } from \"./schemas/principal.js\"\nexport type {\n AuthenticatedOptions,\n PasslockOptions,\n} from \"./shared.js\"\n"]}
|
|
1
|
+
{"version":3,"file":"safe.js","sourceRoot":"","sources":["../src/safe.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Safe functions that return result envelopes over the original\n * tagged success and error payloads. The returned value keeps\n * its original `_tag` shape, and is also augmented with a\n * result envelope for `success`- or `failure`-style branching.\n *\n * Note: unexpected runtime failures may still throw.\n *\n * ```ts\n * const result = await exchangeCode({\n * apiKey,\n * code,\n * tenancyId,\n * })\n *\n * if (result.success) {\n * console.log(result.value.id)\n * }\n *\n * if (result.failure) {\n * console.log(result.error.message)\n * }\n *\n * if (isExtendedPrincipal(result)) {\n * console.log(result.id)\n * }\n * ```\n *\n * @categoryDescription Passkeys\n * Functions and related types for managing passkeys.\n *\n * @categoryDescription Principal\n * Functions and related types for exchanging client codes and verifying\n * Passlock tokens.\n *\n * @showCategories\n *\n * @module safe\n */\n\nimport { Effect, pipe } from \"effect\"\nimport type {\n ForbiddenError,\n InvalidCodeError,\n NotFoundError,\n VerificationError,\n} from \"./errors.js\"\nimport type {\n AssignUserOptions,\n DeletedPasskey,\n DeletedPasskeys,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n UpdatedCredentials,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions,\n} from \"./passkey/passkey.js\"\nimport {\n assignUser as assignUserE,\n deletePasskey as deletePasskeyE,\n deleteUserPasskeys as deleteUserPasskeysE,\n getPasskey as getPasskeyE,\n listPasskeys as listPasskeysE,\n updatePasskey as updatePasskeyE,\n updatePasskeyUsernames as updatePasskeyUsernamesE,\n} from \"./passkey/passkey.js\"\nimport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nimport {\n exchangeCode as exchangeCodeE,\n verifyIdToken as verifyIdTokenE,\n} from \"./principal/principal.js\"\nimport { type Result, toErrResult, toOkResult } from \"./safe-result.js\"\nimport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\n\nconst runSafe = <A extends object, E extends object>(\n effect: Effect.Effect<A, E>\n): Promise<Result<A, E>> =>\n pipe(\n effect,\n Effect.match({\n onFailure: (error): Result<A, E> => toErrResult(error) as Result<A, E>,\n onSuccess: (value): Result<A, E> => toOkResult(value) as Result<A, E>,\n }),\n Effect.runPromise\n )\n\n/**\n * Assign a custom User ID to a passkey. Will be reflected in the next\n * {@link Principal} or {@link ExtendedPrincipal} generated.\n *\n * **Note:** This does not change the underlying WebAuthn credential's `userId`.\n * Instead we apply a layer of indirection.\n *\n * @see {@link Principal}\n * @see {@link ExtendedPrincipal}\n * @see [credential](https://passlock.dev/rest-api/credential/)\n *\n * @param request\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a passkey and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const assignUser = (\n request: AssignUserOptions\n): Promise<Result<Passkey, NotFoundError | ForbiddenError>> =>\n runSafe(assignUserE(request))\n\n/**\n * Update a passkey's custom user ID and/or username metadata.\n *\n * **Important:** changing the username has no bearing on authentication, as\n * it's typically only used in the client-side component of the passkey\n * (so the user knows which account the passkey relates to).\n *\n * However you might choose to align the username in your vault with the\n * client-side component to simplify end user support.\n *\n * @param request\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a passkey and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const updatePasskey = (\n request: UpdatePasskeyOptions\n): Promise<Result<Passkey, NotFoundError | ForbiddenError>> =>\n runSafe(updatePasskeyE(request))\n\n/**\n * Update the stored username metadata for all passkeys belonging to a given\n * user, and prepare client-side credential updates for those passkeys.\n *\n * **Important:** changing these values has no bearing on authentication. The\n * server-side operation updates the username stored in Passlock. The optional\n * `displayName` is only included in the returned credential updates for\n * follow-up use with `@passlock/client`; it is not persisted in the vault.\n *\n * However you might choose to align the username in your vault with the\n * client-side component to simplify end user support.\n *\n * **Note:** This can be used alongside `@passlock/client`'s\n * `updatePasskeyUsernames` helper to update those details on the user's device.\n *\n * @param request\n * @returns A promise resolving to a {@link Result}.\n * The success branch contains an {@link UpdatedCredentials} payload, whose\n * `credentials` array can be passed into the client's `updatePasskeyUsernames` function.\n * The error branch contains\n * an API error.\n *\n * @category Passkeys\n */\nexport const updatePasskeyUsernames = (\n request: UpdateUsernamesOptions\n): Promise<Result<UpdatedCredentials, NotFoundError | ForbiddenError>> =>\n runSafe(updatePasskeyUsernamesE(request))\n\n/**\n * Delete a passkey from your vault.\n *\n * **Note:** The user will still retain the passkey on their device so\n * you will need to either:\n *\n * a) Use the @passlock/client functions to delete the passkey from the user's device.\n * b) Remind the user to delete the passkey\n *\n * See [deleting passkeys](https://passlock.dev/passkeys/passkey-removal/) in the documentation.\n *\n * In addition, during authentication you should handle a missing passkey scenario.\n * This happens when a user tries to authenticate with a passkey that is missing from\n * your vault. The @passlock/client library can help with this. See\n * [handling missing passkeys](https://passlock.dev/handling-missing-passkeys/)\n *\n * @see [deleting passkeys](https://passlock.dev/passkeys/passkey-removal/)\n * @see [handling missing passkeys](https://passlock.dev/handling-missing-passkeys/)\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * the deleted credential and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const deletePasskey = (\n options: DeletePasskeyOptions\n): Promise<Result<DeletedPasskey, ForbiddenError | NotFoundError>> =>\n runSafe(deletePasskeyE(options))\n\n/**\n * Delete all passkeys associated with a user.\n *\n * @param request\n * @returns A promise resolving to a {@link Result}.\n * The success branch contains a {@link DeletedPasskeys} payload whose\n * `deleted` array can be passed directly into `@passlock/client`'s\n * `deleteUserPasskeys` helper for follow-up client-side passkey removal.\n * The error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const deleteUserPasskeys = (\n request: DeleteUserPasskeysOptions\n): Promise<Result<DeletedPasskeys, ForbiddenError | NotFoundError>> =>\n runSafe(deleteUserPasskeysE(request))\n\n/**\n * Fetch details about a passkey. **Important**: Not to be confused with\n * the {@link exchangeCode} or {@link verifyIdToken} functions, which\n * return details about specific authentication or registration operations.\n * Use this function for passkey management, not authentication.\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * passkey details and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const getPasskey = (\n options: GetPasskeyOptions\n): Promise<Result<Passkey, ForbiddenError | NotFoundError>> =>\n runSafe(getPasskeyE(options))\n\n/**\n * List passkeys for the given tenancy. Note: This could return a cursor.\n * If so, call again, passing the cursor back in.\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a page of passkey summaries and whose error branch contains an API error.\n *\n * @category Passkeys\n */\nexport const listPasskeys = (\n options: ListPasskeyOptions\n): Promise<Result<FindAllPasskeys, ForbiddenError>> =>\n runSafe(listPasskeysE(options))\n\n/**\n * The @passlock/client library generates codes, which you should send to\n * your backend. Use this function to exchange the code for details about\n * the registration or authentication operation. **Note:** a code is valid\n * for 5 minutes.\n *\n * @see {@link ExtendedPrincipal}\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * an extended principal and whose error branch contains an API error.\n *\n * @category Principal\n */\nexport const exchangeCode = (\n options: ExchangeCodeOptions\n): Promise<Result<ExtendedPrincipal, ForbiddenError | InvalidCodeError>> =>\n runSafe(exchangeCodeE(options))\n\n/**\n * Decode and verify an id_token (JWT) locally.\n *\n * **Note:** This will make a network call to\n * `https://api.passlock.dev/.well-known/jwks.json` (or your configured `endpoint`)\n * to fetch the relevant public key. The response will be cached, however\n * bear in mind that for environments such as AWS Lambda it will make the call\n * on each cold start, so it might be slower than {@link exchangeCode}.\n *\n * @see {@link Principal}\n *\n * @param options\n * @returns A promise resolving to a {@link Result} whose success branch contains\n * a verified principal and whose error branch contains a verification error.\n *\n * @category Principal\n */\nexport const verifyIdToken = (\n options: VerifyIdTokenOptions\n): Promise<Result<Principal, VerificationError>> =>\n runSafe(verifyIdTokenE(options))\n\n/* Re-exports */\n\nexport type {\n BadRequestError,\n DuplicateEmailError,\n ForbiddenError,\n InvalidCodeError,\n InvalidEmailError,\n InvalidTenancyError,\n NotFoundError,\n PasskeyNotFoundError,\n UnauthorizedError,\n VerificationError,\n} from \"./errors.js\"\nexport {\n isBadRequestError,\n isDuplicateEmailError,\n isForbiddenError,\n isInvalidCodeError,\n isInvalidEmailError,\n isInvalidTenancyError,\n isNotFoundError,\n isPasskeyNotFoundError,\n isUnauthorizedError,\n isVerificationError,\n} from \"./errors.js\"\nexport type {\n AssignUserOptions,\n Credential,\n DeletedPasskey,\n DeletedPasskeys,\n DeletePasskeyOptions,\n DeleteUserPasskeysOptions,\n FindAllPasskeys,\n GetPasskeyOptions,\n ListPasskeyOptions,\n Passkey,\n PasskeyCredential,\n PasskeySummary,\n Platform,\n UpdatedCredentials as UpdatedUserDetails,\n UpdatedPasskeys,\n UpdatePasskeyOptions,\n UpdateUsernamesOptions as UpdateUserDetailsOptions,\n} from \"./passkey/passkey.js\"\nexport {\n isDeletedPasskeys,\n isPasskey,\n isPasskeySummary,\n isUpdatedPasskeys,\n isUpdatedUserDetails,\n} from \"./passkey/passkey.js\"\nexport type {\n ExchangeCodeOptions,\n VerifyIdTokenOptions,\n} from \"./principal/principal.js\"\nexport type { Err, Ok, Result } from \"./safe-result.js\"\nexport type {\n CredentialDeviceType,\n Transports,\n} from \"./schemas/passkey.js\"\nexport type { ExtendedPrincipal, Principal } from \"./schemas/principal.js\"\nexport { isExtendedPrincipal, isPrincipal } from \"./schemas/principal.js\"\nexport type {\n AuthenticatedOptions,\n PasslockOptions,\n} from \"./shared.js\"\n"]}
|
|
@@ -230,4 +230,16 @@ export declare const DeletedPasskeys: Schema.TaggedStruct<"DeletedPasskeys", {
|
|
|
230
230
|
rpId: typeof Schema.String;
|
|
231
231
|
}>>;
|
|
232
232
|
}>;
|
|
233
|
+
/**
|
|
234
|
+
* Public schema returned when a single passkey is deleted.
|
|
235
|
+
*
|
|
236
|
+
* @category Passkeys
|
|
237
|
+
*/
|
|
238
|
+
export declare const DeletedPasskey: Schema.TaggedStruct<"DeletedPasskey", {
|
|
239
|
+
deleted: Schema.Struct<{
|
|
240
|
+
credentialId: typeof Schema.String;
|
|
241
|
+
userId: typeof Schema.String;
|
|
242
|
+
rpId: typeof Schema.String;
|
|
243
|
+
}>;
|
|
244
|
+
}>;
|
|
233
245
|
//# sourceMappingURL=passkey.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey.d.ts","sourceRoot":"","sources":["../../src/schemas/passkey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAW/B;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,0DAI5B,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,0CAA2C,CAAA;AAE5E;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAExE;;;;GAIG;AACH,eAAO,MAAM,UAAU,6EAQb,CAAA;AAEV;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAIpD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;EAW5B,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAE7D;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;EAclB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,OAAO,CAAC,OAAO,CAAA;AAEnD;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;EAUzB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;EAG1B,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;EAE1B,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;;EAIrB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;EAElC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAA"}
|
|
1
|
+
{"version":3,"file":"passkey.d.ts","sourceRoot":"","sources":["../../src/schemas/passkey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAW/B;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,0DAI5B,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,0CAA2C,CAAA;AAE5E;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAExE;;;;GAIG;AACH,eAAO,MAAM,UAAU,6EAQb,CAAA;AAEV;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAIpD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;EAW5B,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAE7D;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;EAclB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,OAAO,CAAC,OAAO,CAAA;AAEnD;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;EAUzB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;EAG1B,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;EAE1B,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;;EAIrB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;EAElC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;EAEzB,CAAA"}
|
package/dist/schemas/passkey.js
CHANGED
|
@@ -131,4 +131,12 @@ export const DeletedPasskeysResponse = Schema.TaggedStruct("DeletedPasskeys", {
|
|
|
131
131
|
export const DeletedPasskeys = Schema.TaggedStruct("DeletedPasskeys", {
|
|
132
132
|
deleted: Schema.Array(Credential),
|
|
133
133
|
});
|
|
134
|
+
/**
|
|
135
|
+
* Public schema returned when a single passkey is deleted.
|
|
136
|
+
*
|
|
137
|
+
* @category Passkeys
|
|
138
|
+
*/
|
|
139
|
+
export const DeletedPasskey = Schema.TaggedStruct("DeletedPasskey", {
|
|
140
|
+
deleted: Credential,
|
|
141
|
+
});
|
|
134
142
|
//# sourceMappingURL=passkey.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../src/schemas/passkey.ts"],"names":[],"mappings":"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","sourcesContent":["import { Schema } from \"effect\"\n\n/*\n * Important. We don't use `type X = typeof X.Type` because it won't generate\n * the Typedoc docs, so instead we mirror the types and use a dummy\n * `type _x = satisfy<typeof X.Type, X>`\n * kind of a type level satisfies\n */\n\n/* Registration Options */\n\n/**\n * Valid user verification requirements for WebAuthn operations.\n *\n * @category Passkeys\n */\nexport const UserVerification = Schema.Literal(\n \"required\",\n \"preferred\",\n \"discouraged\"\n)\n\n/* Passkey */\n\n/**\n * Possible device types reported for a passkey credential.\n *\n * @category Passkeys\n */\nexport const CredentialDeviceType = [\"singleDevice\", \"multiDevice\"] as const\n\n/**\n * Union of device types reported for a passkey credential.\n *\n * @category Passkeys\n */\nexport type CredentialDeviceType = (typeof CredentialDeviceType)[number]\n\n/**\n * Possible authenticator transport hints exposed by Passlock.\n *\n * @category Passkeys\n */\nexport const Transports = [\n \"ble\",\n \"hybrid\",\n \"internal\",\n \"nfc\",\n \"usb\",\n \"cable\",\n \"smart-card\",\n] as const\n\n/**\n * Union of authenticator transport hints exposed by Passlock.\n *\n * @category Passkeys\n */\nexport type Transports = (typeof Transports)[number]\n\n/* Passkey */\n\n/**\n * Schema for the WebAuthn credential portion of a passkey.\n *\n * @category Passkeys\n */\nexport const PasskeyCredential = Schema.Struct({\n id: Schema.String, // webAuthnId (Base64Url)\n userId: Schema.String, // webAuthnUserId (Base64Url)\n username: Schema.String,\n aaguid: Schema.String,\n backedUp: Schema.Boolean,\n counter: Schema.Number,\n deviceType: Schema.Literal(...CredentialDeviceType),\n transports: Schema.Array(Schema.Literal(...Transports)),\n publicKey: Schema.Uint8ArrayFromBase64Url,\n rpId: Schema.String,\n})\n\n/**\n * Type produced by {@link PasskeyCredential}.\n *\n * @category Passkeys\n */\nexport type PasskeyCredential = typeof PasskeyCredential.Type\n\n/**\n * Schema for a passkey stored in the Passlock vault.\n *\n * @category Passkeys\n */\nexport const Passkey = Schema.TaggedStruct(\"Passkey\", {\n id: Schema.String,\n userId: Schema.optional(Schema.String),\n enabled: Schema.Boolean,\n credential: PasskeyCredential,\n platform: Schema.optional(\n Schema.Struct({\n icon: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n })\n ),\n lastUsed: Schema.optional(Schema.Number),\n createdAt: Schema.Number,\n updatedAt: Schema.Number,\n})\n\n/**\n * Type produced by {@link Passkey}.\n *\n * @category Passkeys\n */\nexport type Passkey = typeof Passkey.Type\n\n/**\n * Encoded transport shape for {@link Passkey}.\n *\n * Binary fields such as `publicKey` are represented using schema-friendly\n * encoded values.\n *\n * @category Passkeys\n */\nexport type PasskeyEncoded = typeof Passkey.Encoded\n\n/**\n * Schema for the compact passkey payload returned by listing operations.\n *\n * @category Passkeys\n */\nexport const PasskeySummary = Schema.TaggedStruct(\"PasskeySummary\", {\n id: Schema.String,\n userId: Schema.String,\n credential: Schema.Struct({\n id: Schema.String,\n userId: Schema.String,\n }),\n enabled: Schema.Boolean,\n createdAt: Schema.Number,\n lastUsed: Schema.optional(Schema.Number),\n})\n\n/**\n * Type produced by {@link PasskeySummary}.\n *\n * @category Passkeys\n */\nexport type PasskeySummary = typeof PasskeySummary.Type\n\n/**\n * Schema for one page of passkey summaries.\n *\n * @category Passkeys\n */\nexport const FindAllPasskeys = Schema.TaggedStruct(\"FindAllPasskeys\", {\n cursor: Schema.NullOr(Schema.String),\n records: Schema.Array(PasskeySummary),\n})\n\n/**\n * Schema for a bulk passkey update response.\n *\n * @category Passkeys\n */\nexport const UpdatedPasskeys = Schema.TaggedStruct(\"UpdatedPasskeys\", {\n updated: Schema.Array(Passkey),\n})\n\n/**\n * Schema for the credential identifiers returned after deleting passkeys.\n *\n * @category Passkeys\n */\nexport const Credential = Schema.Struct({\n credentialId: Schema.String,\n userId: Schema.String,\n rpId: Schema.String,\n})\n\n/**\n * Type produced by {@link Credential}.\n *\n * @category Passkeys\n */\nexport type Credential = typeof Credential.Type\n\n/**\n * Raw REST API schema returned when passkeys are deleted.\n *\n * The package maps this into {@link DeletedPasskeys} before exposing it from\n * the higher-level APIs.\n *\n * @category Passkeys\n */\nexport const DeletedPasskeysResponse = Schema.TaggedStruct(\"DeletedPasskeys\", {\n deleted: Schema.Array(Passkey),\n})\n\n/**\n * Public schema returned when passkeys are deleted by user ID.\n *\n * @category Passkeys\n */\nexport const DeletedPasskeys = Schema.TaggedStruct(\"DeletedPasskeys\", {\n deleted: Schema.Array(Credential),\n})\n"]}
|
|
1
|
+
{"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../src/schemas/passkey.ts"],"names":[],"mappings":"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","sourcesContent":["import { Schema } from \"effect\"\n\n/*\n * Important. We don't use `type X = typeof X.Type` because it won't generate\n * the Typedoc docs, so instead we mirror the types and use a dummy\n * `type _x = satisfy<typeof X.Type, X>`\n * kind of a type level satisfies\n */\n\n/* Registration Options */\n\n/**\n * Valid user verification requirements for WebAuthn operations.\n *\n * @category Passkeys\n */\nexport const UserVerification = Schema.Literal(\n \"required\",\n \"preferred\",\n \"discouraged\"\n)\n\n/* Passkey */\n\n/**\n * Possible device types reported for a passkey credential.\n *\n * @category Passkeys\n */\nexport const CredentialDeviceType = [\"singleDevice\", \"multiDevice\"] as const\n\n/**\n * Union of device types reported for a passkey credential.\n *\n * @category Passkeys\n */\nexport type CredentialDeviceType = (typeof CredentialDeviceType)[number]\n\n/**\n * Possible authenticator transport hints exposed by Passlock.\n *\n * @category Passkeys\n */\nexport const Transports = [\n \"ble\",\n \"hybrid\",\n \"internal\",\n \"nfc\",\n \"usb\",\n \"cable\",\n \"smart-card\",\n] as const\n\n/**\n * Union of authenticator transport hints exposed by Passlock.\n *\n * @category Passkeys\n */\nexport type Transports = (typeof Transports)[number]\n\n/* Passkey */\n\n/**\n * Schema for the WebAuthn credential portion of a passkey.\n *\n * @category Passkeys\n */\nexport const PasskeyCredential = Schema.Struct({\n id: Schema.String, // webAuthnId (Base64Url)\n userId: Schema.String, // webAuthnUserId (Base64Url)\n username: Schema.String,\n aaguid: Schema.String,\n backedUp: Schema.Boolean,\n counter: Schema.Number,\n deviceType: Schema.Literal(...CredentialDeviceType),\n transports: Schema.Array(Schema.Literal(...Transports)),\n publicKey: Schema.Uint8ArrayFromBase64Url,\n rpId: Schema.String,\n})\n\n/**\n * Type produced by {@link PasskeyCredential}.\n *\n * @category Passkeys\n */\nexport type PasskeyCredential = typeof PasskeyCredential.Type\n\n/**\n * Schema for a passkey stored in the Passlock vault.\n *\n * @category Passkeys\n */\nexport const Passkey = Schema.TaggedStruct(\"Passkey\", {\n id: Schema.String,\n userId: Schema.optional(Schema.String),\n enabled: Schema.Boolean,\n credential: PasskeyCredential,\n platform: Schema.optional(\n Schema.Struct({\n icon: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n })\n ),\n lastUsed: Schema.optional(Schema.Number),\n createdAt: Schema.Number,\n updatedAt: Schema.Number,\n})\n\n/**\n * Type produced by {@link Passkey}.\n *\n * @category Passkeys\n */\nexport type Passkey = typeof Passkey.Type\n\n/**\n * Encoded transport shape for {@link Passkey}.\n *\n * Binary fields such as `publicKey` are represented using schema-friendly\n * encoded values.\n *\n * @category Passkeys\n */\nexport type PasskeyEncoded = typeof Passkey.Encoded\n\n/**\n * Schema for the compact passkey payload returned by listing operations.\n *\n * @category Passkeys\n */\nexport const PasskeySummary = Schema.TaggedStruct(\"PasskeySummary\", {\n id: Schema.String,\n userId: Schema.String,\n credential: Schema.Struct({\n id: Schema.String,\n userId: Schema.String,\n }),\n enabled: Schema.Boolean,\n createdAt: Schema.Number,\n lastUsed: Schema.optional(Schema.Number),\n})\n\n/**\n * Type produced by {@link PasskeySummary}.\n *\n * @category Passkeys\n */\nexport type PasskeySummary = typeof PasskeySummary.Type\n\n/**\n * Schema for one page of passkey summaries.\n *\n * @category Passkeys\n */\nexport const FindAllPasskeys = Schema.TaggedStruct(\"FindAllPasskeys\", {\n cursor: Schema.NullOr(Schema.String),\n records: Schema.Array(PasskeySummary),\n})\n\n/**\n * Schema for a bulk passkey update response.\n *\n * @category Passkeys\n */\nexport const UpdatedPasskeys = Schema.TaggedStruct(\"UpdatedPasskeys\", {\n updated: Schema.Array(Passkey),\n})\n\n/**\n * Schema for the credential identifiers returned after deleting passkeys.\n *\n * @category Passkeys\n */\nexport const Credential = Schema.Struct({\n credentialId: Schema.String,\n userId: Schema.String,\n rpId: Schema.String,\n})\n\n/**\n * Type produced by {@link Credential}.\n *\n * @category Passkeys\n */\nexport type Credential = typeof Credential.Type\n\n/**\n * Raw REST API schema returned when passkeys are deleted.\n *\n * The package maps this into {@link DeletedPasskeys} before exposing it from\n * the higher-level APIs.\n *\n * @category Passkeys\n */\nexport const DeletedPasskeysResponse = Schema.TaggedStruct(\"DeletedPasskeys\", {\n deleted: Schema.Array(Passkey),\n})\n\n/**\n * Public schema returned when passkeys are deleted by user ID.\n *\n * @category Passkeys\n */\nexport const DeletedPasskeys = Schema.TaggedStruct(\"DeletedPasskeys\", {\n deleted: Schema.Array(Credential),\n})\n\n/**\n * Public schema returned when a single passkey is deleted.\n *\n * @category Passkeys\n */\nexport const DeletedPasskey = Schema.TaggedStruct(\"DeletedPasskey\", {\n deleted: Credential,\n})\n"]}
|