@yielded/auth 0.1.0-beta.1
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/LICENSE +21 -0
- package/README.md +18 -0
- package/dist/Atom.d.mts +5 -0
- package/dist/Atom.mjs +5 -0
- package/dist/Auth.d.mts +9 -0
- package/dist/Auth.mjs +7 -0
- package/dist/AuthContract.d.mts +4 -0
- package/dist/AuthContract.mjs +4 -0
- package/dist/AuthSession.d.mts +82 -0
- package/dist/AuthSession.mjs +138 -0
- package/dist/AuthSession.mjs.map +1 -0
- package/dist/AuthStore.d.mts +68 -0
- package/dist/AuthStore.mjs +194 -0
- package/dist/AuthStore.mjs.map +1 -0
- package/dist/AuthTokenCodec.d.mts +40 -0
- package/dist/AuthTokenCodec.mjs +104 -0
- package/dist/AuthTokenCodec.mjs.map +1 -0
- package/dist/Client.d.mts +2 -0
- package/dist/Client.mjs +2 -0
- package/dist/Cloudflare.d.mts +89 -0
- package/dist/Cloudflare.mjs +166 -0
- package/dist/Cloudflare.mjs.map +1 -0
- package/dist/Drizzle.d.mts +28 -0
- package/dist/Drizzle.mjs +27 -0
- package/dist/DrizzleD1.d.mts +935 -0
- package/dist/DrizzleD1.mjs +29 -0
- package/dist/DrizzleD1.mjs.map +1 -0
- package/dist/DrizzleLibsql.d.mts +2288 -0
- package/dist/DrizzleLibsql.mjs +85 -0
- package/dist/DrizzleLibsql.mjs.map +1 -0
- package/dist/DrizzleMysql2.d.mts +1809 -0
- package/dist/DrizzleMysql2.mjs +55 -0
- package/dist/DrizzleMysql2.mjs.map +1 -0
- package/dist/DrizzlePglite.d.mts +1808 -0
- package/dist/DrizzlePglite.mjs +45 -0
- package/dist/DrizzlePglite.mjs.map +1 -0
- package/dist/DrizzlePostgres.d.mts +1808 -0
- package/dist/DrizzlePostgres.mjs +45 -0
- package/dist/DrizzlePostgres.mjs.map +1 -0
- package/dist/DrizzleSqliteBun.d.mts +2287 -0
- package/dist/DrizzleSqliteBun.mjs +62 -0
- package/dist/DrizzleSqliteBun.mjs.map +1 -0
- package/dist/DrizzleSqliteDo.d.mts +2343 -0
- package/dist/DrizzleSqliteDo.mjs +105 -0
- package/dist/DrizzleSqliteDo.mjs.map +1 -0
- package/dist/DrizzleSqliteNode.d.mts +2287 -0
- package/dist/DrizzleSqliteNode.mjs +62 -0
- package/dist/DrizzleSqliteNode.mjs.map +1 -0
- package/dist/DrizzleSqliteWasm.d.mts +2287 -0
- package/dist/DrizzleSqliteWasm.mjs +62 -0
- package/dist/DrizzleSqliteWasm.mjs.map +1 -0
- package/dist/Email.d.mts +12 -0
- package/dist/Email.mjs +11 -0
- package/dist/EmailOtp.d.mts +42 -0
- package/dist/EmailOtp.mjs +120 -0
- package/dist/EmailOtp.mjs.map +1 -0
- package/dist/EmailOtpSender.d.mts +22 -0
- package/dist/EmailOtpSender.mjs +18 -0
- package/dist/EmailOtpSender.mjs.map +1 -0
- package/dist/Errors.d.mts +55 -0
- package/dist/Errors.mjs +31 -0
- package/dist/Errors.mjs.map +1 -0
- package/dist/GitHub.d.mts +5 -0
- package/dist/GitHub.mjs +4 -0
- package/dist/Hooks.d.mts +6 -0
- package/dist/Hooks.mjs +6 -0
- package/dist/Http.d.mts +12 -0
- package/dist/Http.mjs +12 -0
- package/dist/HttpServer.d.mts +103 -0
- package/dist/HttpServer.mjs +326 -0
- package/dist/HttpServer.mjs.map +1 -0
- package/dist/Identity.d.mts +9 -0
- package/dist/Identity.mjs +9 -0
- package/dist/IdentityResolver.d.mts +16 -0
- package/dist/IdentityResolver.mjs +12 -0
- package/dist/IdentityResolver.mjs.map +1 -0
- package/dist/OAuth.d.mts +36 -0
- package/dist/OAuth.mjs +35 -0
- package/dist/OpenIdClient.d.mts +3 -0
- package/dist/OpenIdClient.mjs +3 -0
- package/dist/OpenIdClientConnected.d.mts +4 -0
- package/dist/OpenIdClientConnected.mjs +3 -0
- package/dist/OperationHttp.d.mts +3 -0
- package/dist/OperationHttp.mjs +3 -0
- package/dist/OperationHttpClient.d.mts +2 -0
- package/dist/OperationHttpClient.mjs +2 -0
- package/dist/OperationHttpServer.d.mts +5 -0
- package/dist/OperationHttpServer.mjs +4 -0
- package/dist/Operations.d.mts +8 -0
- package/dist/Operations.mjs +8 -0
- package/dist/Passkey.d.mts +12 -0
- package/dist/Passkey.mjs +12 -0
- package/dist/PasskeyBrowser.d.mts +4 -0
- package/dist/PasskeyBrowser.mjs +4 -0
- package/dist/PasskeyContract.d.mts +641 -0
- package/dist/PasskeyContract.mjs +174 -0
- package/dist/PasskeyContract.mjs.map +1 -0
- package/dist/PasskeyPassword.d.mts +412 -0
- package/dist/PasskeyPassword.mjs +174 -0
- package/dist/PasskeyPassword.mjs.map +1 -0
- package/dist/PasskeySimpleWebAuthn.d.mts +3 -0
- package/dist/PasskeySimpleWebAuthn.mjs +3 -0
- package/dist/Password.d.mts +19 -0
- package/dist/Password.mjs +17 -0
- package/dist/PasswordAuth.d.mts +45 -0
- package/dist/PasswordAuth.mjs +79 -0
- package/dist/PasswordAuth.mjs.map +1 -0
- package/dist/PasswordCredentialStore.d.mts +46 -0
- package/dist/PasswordCredentialStore.mjs +62 -0
- package/dist/PasswordCredentialStore.mjs.map +1 -0
- package/dist/PasswordHasher.d.mts +31 -0
- package/dist/PasswordHasher.mjs +76 -0
- package/dist/PasswordHasher.mjs.map +1 -0
- package/dist/PhoneOtp.d.mts +11 -0
- package/dist/PhoneOtp.mjs +11 -0
- package/dist/Policy.d.mts +52 -0
- package/dist/Policy.mjs +36 -0
- package/dist/Policy.mjs.map +1 -0
- package/dist/Proofs.d.mts +14 -0
- package/dist/Proofs.mjs +13 -0
- package/dist/Rpc.d.mts +12 -0
- package/dist/Rpc.mjs +11 -0
- package/dist/Rpc.mjs.map +1 -0
- package/dist/Schema.d.mts +160 -0
- package/dist/Schema.mjs +141 -0
- package/dist/Schema.mjs.map +1 -0
- package/dist/SessionContract.d.mts +3 -0
- package/dist/SessionContract.mjs +3 -0
- package/dist/Sessions.d.mts +14 -0
- package/dist/Sessions.mjs +12 -0
- package/dist/Testing.d.mts +7 -0
- package/dist/Testing.mjs +7 -0
- package/dist/Totp.d.mts +8 -0
- package/dist/Totp.mjs +8 -0
- package/dist/TotpContract.d.mts +318 -0
- package/dist/TotpContract.mjs +119 -0
- package/dist/TotpContract.mjs.map +1 -0
- package/dist/WebCrypto.d.mts +28 -0
- package/dist/WebCrypto.mjs +42 -0
- package/dist/WebCrypto.mjs.map +1 -0
- package/dist/Workflows.d.mts +16 -0
- package/dist/Workflows.mjs +11 -0
- package/dist/Workflows.mjs.map +1 -0
- package/dist/atom/AuthAtomLifetime.d.mts +35 -0
- package/dist/atom/AuthAtomLifetime.mjs +50 -0
- package/dist/atom/AuthAtomLifetime.mjs.map +1 -0
- package/dist/atom/AuthAtomWorkflow.d.mts +17 -0
- package/dist/atom/AuthAtomWorkflow.mjs +9 -0
- package/dist/atom/AuthAtomWorkflow.mjs.map +1 -0
- package/dist/atom/client.d.mts +43 -0
- package/dist/atom/client.mjs +168 -0
- package/dist/atom/client.mjs.map +1 -0
- package/dist/atom/operations.d.mts +35 -0
- package/dist/atom/operations.mjs +58 -0
- package/dist/atom/operations.mjs.map +1 -0
- package/dist/atom/scoped-runtime.mjs +151 -0
- package/dist/atom/scoped-runtime.mjs.map +1 -0
- package/dist/auth/Auth.d.mts +7806 -0
- package/dist/auth/Auth.mjs +141 -0
- package/dist/auth/Auth.mjs.map +1 -0
- package/dist/auth/AuthConfigurationError.d.mts +10 -0
- package/dist/auth/AuthConfigurationError.mjs +14 -0
- package/dist/auth/AuthConfigurationError.mjs.map +1 -0
- package/dist/auth/AuthRequest.d.mts +21 -0
- package/dist/auth/AuthRequest.mjs +10 -0
- package/dist/auth/AuthRequest.mjs.map +1 -0
- package/dist/auth/AuthStrategy.d.mts +23 -0
- package/dist/auth/AuthStrategy.mjs +33 -0
- package/dist/auth/AuthStrategy.mjs.map +1 -0
- package/dist/auth/ConsumeDecision.d.mts +11 -0
- package/dist/auth/actions.d.mts +18 -0
- package/dist/auth/actions.mjs +70 -0
- package/dist/auth/actions.mjs.map +1 -0
- package/dist/auth/defaults.mjs +12 -0
- package/dist/auth/defaults.mjs.map +1 -0
- package/dist/auth/definition.d.mts +46 -0
- package/dist/auth/session.d.mts +27 -0
- package/dist/auth/session.mjs +56 -0
- package/dist/auth/session.mjs.map +1 -0
- package/dist/drizzle/D1BatchStatements.d.mts +11 -0
- package/dist/drizzle/D1BatchStatements.mjs +8 -0
- package/dist/drizzle/D1BatchStatements.mjs.map +1 -0
- package/dist/drizzle/PasswordPreparedPostconditions.mjs +12 -0
- package/dist/drizzle/PasswordPreparedPostconditions.mjs.map +1 -0
- package/dist/drizzle/SuppliedService.d.mts +10 -0
- package/dist/drizzle/d1-emails.d.mts +68 -0
- package/dist/drizzle/d1-emails.mjs +580 -0
- package/dist/drizzle/d1-emails.mjs.map +1 -0
- package/dist/drizzle/d1-generated-statement.mjs +79 -0
- package/dist/drizzle/d1-generated-statement.mjs.map +1 -0
- package/dist/drizzle/d1-identity.d.mts +33 -0
- package/dist/drizzle/d1-identity.mjs +120 -0
- package/dist/drizzle/d1-identity.mjs.map +1 -0
- package/dist/drizzle/d1-oauth.d.mts +316 -0
- package/dist/drizzle/d1-oauth.mjs +79 -0
- package/dist/drizzle/d1-oauth.mjs.map +1 -0
- package/dist/drizzle/d1-passkey.d.mts +52 -0
- package/dist/drizzle/d1-passkey.mjs +97 -0
- package/dist/drizzle/d1-passkey.mjs.map +1 -0
- package/dist/drizzle/d1-password-prepared.d.mts +27 -0
- package/dist/drizzle/d1-password-prepared.mjs +464 -0
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -0
- package/dist/drizzle/d1-passwords.d.mts +96 -0
- package/dist/drizzle/d1-passwords.mjs +1008 -0
- package/dist/drizzle/d1-passwords.mjs.map +1 -0
- package/dist/drizzle/d1-phone.d.mts +29 -0
- package/dist/drizzle/d1-phone.mjs +33 -0
- package/dist/drizzle/d1-phone.mjs.map +1 -0
- package/dist/drizzle/d1-planning.d.mts +12 -0
- package/dist/drizzle/d1-planning.mjs +43 -0
- package/dist/drizzle/d1-planning.mjs.map +1 -0
- package/dist/drizzle/d1-proofs.d.mts +88 -0
- package/dist/drizzle/d1-proofs.mjs +833 -0
- package/dist/drizzle/d1-proofs.mjs.map +1 -0
- package/dist/drizzle/d1-sessions.d.mts +77 -0
- package/dist/drizzle/d1-sessions.mjs +970 -0
- package/dist/drizzle/d1-sessions.mjs.map +1 -0
- package/dist/drizzle/d1-totp.d.mts +27 -0
- package/dist/drizzle/d1-totp.mjs +28 -0
- package/dist/drizzle/d1-totp.mjs.map +1 -0
- package/dist/drizzle/email-model.d.mts +352 -0
- package/dist/drizzle/email-model.mjs +21 -0
- package/dist/drizzle/email-model.mjs.map +1 -0
- package/dist/drizzle/email-registration.d.mts +33 -0
- package/dist/drizzle/email-registration.mjs +238 -0
- package/dist/drizzle/email-registration.mjs.map +1 -0
- package/dist/drizzle/email-sql.d.mts +18 -0
- package/dist/drizzle/email-sql.mjs +473 -0
- package/dist/drizzle/email-sql.mjs.map +1 -0
- package/dist/drizzle/email-target.d.mts +28 -0
- package/dist/drizzle/email-target.mjs +75 -0
- package/dist/drizzle/email-target.mjs.map +1 -0
- package/dist/drizzle/model.d.mts +259 -0
- package/dist/drizzle/model.mjs +81 -0
- package/dist/drizzle/model.mjs.map +1 -0
- package/dist/drizzle/mysql-emails.d.mts +82 -0
- package/dist/drizzle/mysql-emails.mjs +38 -0
- package/dist/drizzle/mysql-emails.mjs.map +1 -0
- package/dist/drizzle/mysql-identity.d.mts +24 -0
- package/dist/drizzle/mysql-identity.mjs +95 -0
- package/dist/drizzle/mysql-identity.mjs.map +1 -0
- package/dist/drizzle/mysql-password-prepared.d.mts +32 -0
- package/dist/drizzle/mysql-password-prepared.mjs +16 -0
- package/dist/drizzle/mysql-password-prepared.mjs.map +1 -0
- package/dist/drizzle/mysql-passwords.d.mts +102 -0
- package/dist/drizzle/mysql-passwords.mjs +38 -0
- package/dist/drizzle/mysql-passwords.mjs.map +1 -0
- package/dist/drizzle/mysql-proofs.d.mts +83 -0
- package/dist/drizzle/mysql-proofs.mjs +23 -0
- package/dist/drizzle/mysql-proofs.mjs.map +1 -0
- package/dist/drizzle/mysql-sessions.d.mts +250 -0
- package/dist/drizzle/mysql-sessions.mjs +53 -0
- package/dist/drizzle/mysql-sessions.mjs.map +1 -0
- package/dist/drizzle/mysql.d.mts +73 -0
- package/dist/drizzle/mysql.mjs +221 -0
- package/dist/drizzle/mysql.mjs.map +1 -0
- package/dist/drizzle/oauth-accounts.mjs +361 -0
- package/dist/drizzle/oauth-accounts.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-access.mjs +210 -0
- package/dist/drizzle/oauth-connected-access.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-collection.mjs +202 -0
- package/dist/drizzle/oauth-connected-collection.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-custody.mjs +146 -0
- package/dist/drizzle/oauth-connected-custody.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-drivers.mjs +78 -0
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-flow.mjs +248 -0
- package/dist/drizzle/oauth-connected-flow.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-input.mjs +105 -0
- package/dist/drizzle/oauth-connected-input.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-maintenance.mjs +215 -0
- package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-management.mjs +228 -0
- package/dist/drizzle/oauth-connected-management.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-model.d.mts +278 -0
- package/dist/drizzle/oauth-connected-model.mjs +22 -0
- package/dist/drizzle/oauth-connected-model.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-reference.d.mts +17 -0
- package/dist/drizzle/oauth-connected-reference.mjs +53 -0
- package/dist/drizzle/oauth-connected-reference.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-settlement.mjs +117 -0
- package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-state.d.mts +16 -0
- package/dist/drizzle/oauth-connected-state.mjs +422 -0
- package/dist/drizzle/oauth-connected-state.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-target.d.mts +114 -0
- package/dist/drizzle/oauth-connected-target.mjs +94 -0
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -0
- package/dist/drizzle/oauth-drivers.mjs +53 -0
- package/dist/drizzle/oauth-drivers.mjs.map +1 -0
- package/dist/drizzle/oauth-flow.d.mts +7 -0
- package/dist/drizzle/oauth-flow.mjs +255 -0
- package/dist/drizzle/oauth-flow.mjs.map +1 -0
- package/dist/drizzle/oauth-input.mjs +130 -0
- package/dist/drizzle/oauth-input.mjs.map +1 -0
- package/dist/drizzle/oauth-model.d.mts +468 -0
- package/dist/drizzle/oauth-model.mjs +49 -0
- package/dist/drizzle/oauth-model.mjs.map +1 -0
- package/dist/drizzle/oauth-mysql.mjs +8 -0
- package/dist/drizzle/oauth-mysql.mjs.map +1 -0
- package/dist/drizzle/oauth-owner.d.mts +4 -0
- package/dist/drizzle/oauth-owner.mjs +10 -0
- package/dist/drizzle/oauth-owner.mjs.map +1 -0
- package/dist/drizzle/oauth-registration.d.mts +8 -0
- package/dist/drizzle/oauth-registration.mjs +375 -0
- package/dist/drizzle/oauth-registration.mjs.map +1 -0
- package/dist/drizzle/oauth-state.mjs +109 -0
- package/dist/drizzle/oauth-state.mjs.map +1 -0
- package/dist/drizzle/oauth-target.d.mts +125 -0
- package/dist/drizzle/oauth-target.mjs +252 -0
- package/dist/drizzle/oauth-target.mjs.map +1 -0
- package/dist/drizzle/passkey-admission.mjs +203 -0
- package/dist/drizzle/passkey-admission.mjs.map +1 -0
- package/dist/drizzle/passkey-credentials.mjs +239 -0
- package/dist/drizzle/passkey-credentials.mjs.map +1 -0
- package/dist/drizzle/passkey-drivers.mjs +34 -0
- package/dist/drizzle/passkey-drivers.mjs.map +1 -0
- package/dist/drizzle/passkey-enrollment.mjs +132 -0
- package/dist/drizzle/passkey-enrollment.mjs.map +1 -0
- package/dist/drizzle/passkey-flow.mjs +436 -0
- package/dist/drizzle/passkey-flow.mjs.map +1 -0
- package/dist/drizzle/passkey-management.mjs +225 -0
- package/dist/drizzle/passkey-management.mjs.map +1 -0
- package/dist/drizzle/passkey-model.d.mts +275 -0
- package/dist/drizzle/passkey-model.mjs +36 -0
- package/dist/drizzle/passkey-model.mjs.map +1 -0
- package/dist/drizzle/passkey-registration-ceremony-model.d.mts +50 -0
- package/dist/drizzle/passkey-registration-ceremony-model.mjs +18 -0
- package/dist/drizzle/passkey-registration-ceremony-model.mjs.map +1 -0
- package/dist/drizzle/passkey-registration-ceremony.mjs +124 -0
- package/dist/drizzle/passkey-registration-ceremony.mjs.map +1 -0
- package/dist/drizzle/passkey-registration-custody.mjs +51 -0
- package/dist/drizzle/passkey-registration-custody.mjs.map +1 -0
- package/dist/drizzle/passkey-registration-write.mjs +205 -0
- package/dist/drizzle/passkey-registration-write.mjs.map +1 -0
- package/dist/drizzle/passkey-state.d.mts +5 -0
- package/dist/drizzle/passkey-state.mjs +207 -0
- package/dist/drizzle/passkey-state.mjs.map +1 -0
- package/dist/drizzle/passkey-target.d.mts +16 -0
- package/dist/drizzle/passkey-target.mjs +174 -0
- package/dist/drizzle/passkey-target.mjs.map +1 -0
- package/dist/drizzle/passkey-write-drivers.mjs +33 -0
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -0
- package/dist/drizzle/passkey-write-model.d.mts +192 -0
- package/dist/drizzle/passkey-write-model.mjs +13 -0
- package/dist/drizzle/passkey-write-model.mjs.map +1 -0
- package/dist/drizzle/passkey-write-state.mjs +326 -0
- package/dist/drizzle/passkey-write-state.mjs.map +1 -0
- package/dist/drizzle/passkey-write-target.d.mts +14 -0
- package/dist/drizzle/passkey-write-target.mjs +185 -0
- package/dist/drizzle/passkey-write-target.mjs.map +1 -0
- package/dist/drizzle/password-model.d.mts +330 -0
- package/dist/drizzle/password-model.mjs +22 -0
- package/dist/drizzle/password-model.mjs.map +1 -0
- package/dist/drizzle/password-prepared-model.d.mts +93 -0
- package/dist/drizzle/password-prepared-model.mjs +11 -0
- package/dist/drizzle/password-prepared-model.mjs.map +1 -0
- package/dist/drizzle/password-prepared-sql.mjs +394 -0
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -0
- package/dist/drizzle/password-prepared-state.mjs +107 -0
- package/dist/drizzle/password-prepared-state.mjs.map +1 -0
- package/dist/drizzle/password-prepared-target.d.mts +12 -0
- package/dist/drizzle/password-prepared-target.mjs +57 -0
- package/dist/drizzle/password-prepared-target.mjs.map +1 -0
- package/dist/drizzle/password-registration.d.mts +23 -0
- package/dist/drizzle/password-registration.mjs +136 -0
- package/dist/drizzle/password-registration.mjs.map +1 -0
- package/dist/drizzle/password-sql.d.mts +20 -0
- package/dist/drizzle/password-sql.mjs +702 -0
- package/dist/drizzle/password-sql.mjs.map +1 -0
- package/dist/drizzle/password-target.d.mts +25 -0
- package/dist/drizzle/password-target.mjs +63 -0
- package/dist/drizzle/password-target.mjs.map +1 -0
- package/dist/drizzle/pg-emails.d.mts +83 -0
- package/dist/drizzle/pg-emails.mjs +38 -0
- package/dist/drizzle/pg-emails.mjs.map +1 -0
- package/dist/drizzle/pg-password-prepared.d.mts +33 -0
- package/dist/drizzle/pg-password-prepared.mjs +16 -0
- package/dist/drizzle/pg-password-prepared.mjs.map +1 -0
- package/dist/drizzle/pg-passwords.d.mts +103 -0
- package/dist/drizzle/pg-passwords.mjs +38 -0
- package/dist/drizzle/pg-passwords.mjs.map +1 -0
- package/dist/drizzle/pg-proofs.d.mts +84 -0
- package/dist/drizzle/pg-proofs.mjs +22 -0
- package/dist/drizzle/pg-proofs.mjs.map +1 -0
- package/dist/drizzle/pg-sessions.d.mts +251 -0
- package/dist/drizzle/pg-sessions.mjs +53 -0
- package/dist/drizzle/pg-sessions.mjs.map +1 -0
- package/dist/drizzle/pg.d.mts +88 -0
- package/dist/drizzle/pg.mjs +294 -0
- package/dist/drizzle/pg.mjs.map +1 -0
- package/dist/drizzle/phone-model.d.mts +117 -0
- package/dist/drizzle/phone-model.mjs +39 -0
- package/dist/drizzle/phone-model.mjs.map +1 -0
- package/dist/drizzle/phone-state.mjs +426 -0
- package/dist/drizzle/phone-state.mjs.map +1 -0
- package/dist/drizzle/phone-target.d.mts +19 -0
- package/dist/drizzle/phone-target.mjs +171 -0
- package/dist/drizzle/phone-target.mjs.map +1 -0
- package/dist/drizzle/proof-model.d.mts +287 -0
- package/dist/drizzle/proof-model.mjs +17 -0
- package/dist/drizzle/proof-model.mjs.map +1 -0
- package/dist/drizzle/proof-sql.d.mts +16 -0
- package/dist/drizzle/proof-sql.mjs +618 -0
- package/dist/drizzle/proof-sql.mjs.map +1 -0
- package/dist/drizzle/proof-target.d.mts +17 -0
- package/dist/drizzle/proof-target.mjs +38 -0
- package/dist/drizzle/proof-target.mjs.map +1 -0
- package/dist/drizzle/session-model.d.mts +201 -0
- package/dist/drizzle/session-model.mjs +19 -0
- package/dist/drizzle/session-model.mjs.map +1 -0
- package/dist/drizzle/session-sql.mjs +732 -0
- package/dist/drizzle/session-sql.mjs.map +1 -0
- package/dist/drizzle/session-target.d.mts +37 -0
- package/dist/drizzle/session-target.mjs +47 -0
- package/dist/drizzle/session-target.mjs.map +1 -0
- package/dist/drizzle/sqlite-emails.mjs +45 -0
- package/dist/drizzle/sqlite-emails.mjs.map +1 -0
- package/dist/drizzle/sqlite-identity.mjs +92 -0
- package/dist/drizzle/sqlite-identity.mjs.map +1 -0
- package/dist/drizzle/sqlite-password-prepared.mjs +21 -0
- package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -0
- package/dist/drizzle/sqlite-passwords.mjs +49 -0
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -0
- package/dist/drizzle/sqlite-proofs.mjs +29 -0
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -0
- package/dist/drizzle/sqlite-sessions.mjs +74 -0
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -0
- package/dist/drizzle/sqlite.d.mts +81 -0
- package/dist/drizzle/sqlite.mjs +220 -0
- package/dist/drizzle/sqlite.mjs.map +1 -0
- package/dist/drizzle/standalone-guard.mjs +19 -0
- package/dist/drizzle/standalone-guard.mjs.map +1 -0
- package/dist/drizzle/step-up-model.d.mts +65 -0
- package/dist/drizzle/step-up-model.mjs +9 -0
- package/dist/drizzle/step-up-model.mjs.map +1 -0
- package/dist/drizzle/step-up-state.mjs +34 -0
- package/dist/drizzle/step-up-state.mjs.map +1 -0
- package/dist/drizzle/totp-model.d.mts +85 -0
- package/dist/drizzle/totp-model.mjs +13 -0
- package/dist/drizzle/totp-model.mjs.map +1 -0
- package/dist/drizzle/totp-state.d.mts +39 -0
- package/dist/drizzle/totp-state.mjs +288 -0
- package/dist/drizzle/totp-state.mjs.map +1 -0
- package/dist/drizzle/totp-target.d.mts +16 -0
- package/dist/drizzle/totp-target.mjs +83 -0
- package/dist/drizzle/totp-target.mjs.map +1 -0
- package/dist/drizzle/transaction-execution.d.mts +20 -0
- package/dist/drizzle/transaction-execution.mjs +111 -0
- package/dist/drizzle/transaction-execution.mjs.map +1 -0
- package/dist/drizzle/transaction-mysql.mjs +46 -0
- package/dist/drizzle/transaction-mysql.mjs.map +1 -0
- package/dist/drizzle/transaction-owner.d.mts +6 -0
- package/dist/drizzle/transaction-owner.mjs +252 -0
- package/dist/drizzle/transaction-owner.mjs.map +1 -0
- package/dist/email/EmailActionEvidence.d.mts +33 -0
- package/dist/email/EmailActionEvidence.mjs +15 -0
- package/dist/email/EmailActionEvidence.mjs.map +1 -0
- package/dist/email/EmailAddressPersistence.d.mts +63 -0
- package/dist/email/EmailAddressPersistence.mjs +19 -0
- package/dist/email/EmailAddressPersistence.mjs.map +1 -0
- package/dist/email/EmailIdentifierNotifier.d.mts +30 -0
- package/dist/email/EmailIdentifierNotifier.mjs +31 -0
- package/dist/email/EmailIdentifierNotifier.mjs.map +1 -0
- package/dist/email/EmailReturnTargets.d.mts +19 -0
- package/dist/email/EmailReturnTargets.mjs +29 -0
- package/dist/email/EmailReturnTargets.mjs.map +1 -0
- package/dist/email/EmailSignInTargets.d.mts +20 -0
- package/dist/email/EmailSignInTargets.mjs +12 -0
- package/dist/email/EmailSignInTargets.mjs.map +1 -0
- package/dist/email/addresses.d.mts +33 -0
- package/dist/email/addresses.mjs +404 -0
- package/dist/email/addresses.mjs.map +1 -0
- package/dist/email/definition.d.mts +10153 -0
- package/dist/email/definition.mjs +111 -0
- package/dist/email/definition.mjs.map +1 -0
- package/dist/email/errors.d.mts +15 -0
- package/dist/email/errors.mjs +11 -0
- package/dist/email/errors.mjs.map +1 -0
- package/dist/email/magicLink.d.mts +33 -0
- package/dist/email/magicLink.mjs +58 -0
- package/dist/email/magicLink.mjs.map +1 -0
- package/dist/email/models.d.mts +56 -0
- package/dist/email/models.mjs +31 -0
- package/dist/email/models.mjs.map +1 -0
- package/dist/email/module.d.mts +22296 -0
- package/dist/email/module.mjs +415 -0
- package/dist/email/module.mjs.map +1 -0
- package/dist/email/registration.d.mts +28 -0
- package/dist/email/registration.mjs +243 -0
- package/dist/email/registration.mjs.map +1 -0
- package/dist/email/snapshot.mjs +37 -0
- package/dist/email/snapshot.mjs.map +1 -0
- package/dist/hooks/LifecycleHooks.d.mts +34 -0
- package/dist/hooks/LifecycleHooks.mjs +74 -0
- package/dist/hooks/LifecycleHooks.mjs.map +1 -0
- package/dist/hooks/commit.d.mts +66 -0
- package/dist/hooks/commit.mjs +136 -0
- package/dist/hooks/commit.mjs.map +1 -0
- package/dist/hooks/models.d.mts +51 -0
- package/dist/hooks/models.mjs +87 -0
- package/dist/hooks/models.mjs.map +1 -0
- package/dist/hooks/plugins.d.mts +36 -0
- package/dist/hooks/plugins.mjs +60 -0
- package/dist/hooks/plugins.mjs.map +1 -0
- package/dist/hooks/transactions.d.mts +31 -0
- package/dist/hooks/transactions.mjs +38 -0
- package/dist/hooks/transactions.mjs.map +1 -0
- package/dist/http/auth-api.d.mts +9 -0
- package/dist/http/auth-api.mjs +13 -0
- package/dist/http/auth-api.mjs.map +1 -0
- package/dist/http/auth-contract.d.mts +84 -0
- package/dist/http/auth-contract.mjs +75 -0
- package/dist/http/auth-contract.mjs.map +1 -0
- package/dist/http/auth-http.d.mts +216 -0
- package/dist/http/auth-http.mjs +184 -0
- package/dist/http/auth-http.mjs.map +1 -0
- package/dist/http/endpoints/get-session.d.mts +8 -0
- package/dist/http/endpoints/get-session.mjs +12 -0
- package/dist/http/endpoints/get-session.mjs.map +1 -0
- package/dist/http/endpoints/password-sign-in.d.mts +8 -0
- package/dist/http/endpoints/password-sign-in.mjs +18 -0
- package/dist/http/endpoints/password-sign-in.mjs.map +1 -0
- package/dist/http/endpoints/request-email-otp.d.mts +8 -0
- package/dist/http/endpoints/request-email-otp.mjs +17 -0
- package/dist/http/endpoints/request-email-otp.mjs.map +1 -0
- package/dist/http/endpoints/set-password.d.mts +9 -0
- package/dist/http/endpoints/set-password.mjs +19 -0
- package/dist/http/endpoints/set-password.mjs.map +1 -0
- package/dist/http/endpoints/sign-out.d.mts +6 -0
- package/dist/http/endpoints/sign-out.mjs +7 -0
- package/dist/http/endpoints/sign-out.mjs.map +1 -0
- package/dist/http/endpoints/verify-email-otp.d.mts +9 -0
- package/dist/http/endpoints/verify-email-otp.mjs +18 -0
- package/dist/http/endpoints/verify-email-otp.mjs.map +1 -0
- package/dist/http/models.d.mts +49 -0
- package/dist/http/models.mjs +35 -0
- package/dist/http/models.mjs.map +1 -0
- package/dist/http/security.d.mts +91 -0
- package/dist/http/security.mjs +77 -0
- package/dist/http/security.mjs.map +1 -0
- package/dist/http/session-contract.d.mts +303 -0
- package/dist/http/session-contract.mjs +38 -0
- package/dist/http/session-contract.mjs.map +1 -0
- package/dist/http-operation/OperationHttpInvocation.d.mts +16 -0
- package/dist/http-operation/OperationHttpInvocation.mjs +11 -0
- package/dist/http-operation/OperationHttpInvocation.mjs.map +1 -0
- package/dist/http-operation/OperationHttpServerConfig.d.mts +18 -0
- package/dist/http-operation/OperationHttpServerConfig.mjs +72 -0
- package/dist/http-operation/OperationHttpServerConfig.mjs.map +1 -0
- package/dist/http-operation/auth-client.d.mts +75 -0
- package/dist/http-operation/auth-client.mjs +116 -0
- package/dist/http-operation/auth-client.mjs.map +1 -0
- package/dist/http-operation/client.d.mts +50 -0
- package/dist/http-operation/client.mjs +188 -0
- package/dist/http-operation/client.mjs.map +1 -0
- package/dist/http-operation/configuration-schema.mjs +19 -0
- package/dist/http-operation/configuration-schema.mjs.map +1 -0
- package/dist/http-operation/contract.d.mts +40 -0
- package/dist/http-operation/contract.mjs +37 -0
- package/dist/http-operation/contract.mjs.map +1 -0
- package/dist/http-operation/errors.d.mts +13 -0
- package/dist/http-operation/errors.mjs +31 -0
- package/dist/http-operation/errors.mjs.map +1 -0
- package/dist/http-operation/models.d.mts +32 -0
- package/dist/http-operation/models.mjs +14 -0
- package/dist/http-operation/models.mjs.map +1 -0
- package/dist/http-operation/private.mjs +35 -0
- package/dist/http-operation/private.mjs.map +1 -0
- package/dist/http-operation/security.mjs +58 -0
- package/dist/http-operation/security.mjs.map +1 -0
- package/dist/http-operation/server.d.mts +33 -0
- package/dist/http-operation/server.mjs +268 -0
- package/dist/http-operation/server.mjs.map +1 -0
- package/dist/identity/ExternalIdentityMutation.d.mts +15 -0
- package/dist/identity/ExternalIdentityMutation.mjs +11 -0
- package/dist/identity/ExternalIdentityMutation.mjs.map +1 -0
- package/dist/identity/IdentityMutation.d.mts +22 -0
- package/dist/identity/IdentityMutation.mjs +17 -0
- package/dist/identity/IdentityMutation.mjs.map +1 -0
- package/dist/identity/IdentityRepository.d.mts +20 -0
- package/dist/identity/IdentityRepository.mjs +11 -0
- package/dist/identity/IdentityRepository.mjs.map +1 -0
- package/dist/identity/SubjectLifecycle.d.mts +58 -0
- package/dist/identity/SubjectLifecycle.mjs +43 -0
- package/dist/identity/SubjectLifecycle.mjs.map +1 -0
- package/dist/identity/SubjectProvisioner.d.mts +37 -0
- package/dist/identity/SubjectProvisioner.mjs +20 -0
- package/dist/identity/SubjectProvisioner.mjs.map +1 -0
- package/dist/identity/codecs.d.mts +34 -0
- package/dist/identity/codecs.mjs +40 -0
- package/dist/identity/codecs.mjs.map +1 -0
- package/dist/identity/models.d.mts +62 -0
- package/dist/identity/models.mjs +51 -0
- package/dist/identity/models.mjs.map +1 -0
- package/dist/identity/operations.d.mts +118 -0
- package/dist/identity/operations.mjs +124 -0
- package/dist/identity/operations.mjs.map +1 -0
- package/dist/index.d.mts +23 -0
- package/dist/index.mjs +23 -0
- package/dist/internal/AuthStoreDecisions.d.mts +22 -0
- package/dist/internal/AuthStoreDecisions.mjs +8 -0
- package/dist/internal/AuthStoreDecisions.mjs.map +1 -0
- package/dist/internal/CurrentSession.d.mts +9 -0
- package/dist/internal/CurrentSession.mjs +8 -0
- package/dist/internal/CurrentSession.mjs.map +1 -0
- package/dist/internal/diagnostics.mjs +23 -0
- package/dist/internal/diagnostics.mjs.map +1 -0
- package/dist/oauth/GithubOAuthProvider.d.mts +43 -0
- package/dist/oauth/GithubOAuthProvider.mjs +66 -0
- package/dist/oauth/GithubOAuthProvider.mjs.map +1 -0
- package/dist/oauth/OAuth.d.mts +73 -0
- package/dist/oauth/OAuth.mjs +180 -0
- package/dist/oauth/OAuth.mjs.map +1 -0
- package/dist/oauth/OAuthAccountsPersistence.d.mts +109 -0
- package/dist/oauth/OAuthAccountsPersistence.mjs +12 -0
- package/dist/oauth/OAuthAccountsPersistence.mjs.map +1 -0
- package/dist/oauth/OAuthActionEvidence.d.mts +28 -0
- package/dist/oauth/OAuthActionEvidence.mjs +15 -0
- package/dist/oauth/OAuthActionEvidence.mjs.map +1 -0
- package/dist/oauth/OAuthConnectedActionEvidence.d.mts +22 -0
- package/dist/oauth/OAuthConnectedActionEvidence.mjs +9 -0
- package/dist/oauth/OAuthConnectedActionEvidence.mjs.map +1 -0
- package/dist/oauth/OAuthConnectedPersistence.d.mts +129 -0
- package/dist/oauth/OAuthConnectedPersistence.mjs +12 -0
- package/dist/oauth/OAuthConnectedPersistence.mjs.map +1 -0
- package/dist/oauth/OAuthConnectedProtocol.d.mts +41 -0
- package/dist/oauth/OAuthConnectedProtocol.mjs +13 -0
- package/dist/oauth/OAuthConnectedProtocol.mjs.map +1 -0
- package/dist/oauth/OAuthConnectedRevocations.d.mts +167 -0
- package/dist/oauth/OAuthConnectedRevocations.mjs +21 -0
- package/dist/oauth/OAuthConnectedRevocations.mjs.map +1 -0
- package/dist/oauth/OAuthConnectedTokenProtector.d.mts +24 -0
- package/dist/oauth/OAuthConnectedTokenProtector.mjs +153 -0
- package/dist/oauth/OAuthConnectedTokenProtector.mjs.map +1 -0
- package/dist/oauth/OAuthConnectedTransactionProtector.d.mts +23 -0
- package/dist/oauth/OAuthConnectedTransactionProtector.mjs +37 -0
- package/dist/oauth/OAuthConnectedTransactionProtector.mjs.map +1 -0
- package/dist/oauth/OAuthConnectedUseAuthority.d.mts +22 -0
- package/dist/oauth/OAuthConnectedUseAuthority.mjs +10 -0
- package/dist/oauth/OAuthConnectedUseAuthority.mjs.map +1 -0
- package/dist/oauth/OAuthConnectionStore.d.mts +33 -0
- package/dist/oauth/OAuthConnectionStore.mjs +38 -0
- package/dist/oauth/OAuthConnectionStore.mjs.map +1 -0
- package/dist/oauth/OAuthLinkTransactionProtector.d.mts +25 -0
- package/dist/oauth/OAuthLinkTransactionProtector.mjs +39 -0
- package/dist/oauth/OAuthLinkTransactionProtector.mjs.map +1 -0
- package/dist/oauth/OAuthProtocol.d.mts +33 -0
- package/dist/oauth/OAuthProtocol.mjs +16 -0
- package/dist/oauth/OAuthProtocol.mjs.map +1 -0
- package/dist/oauth/OAuthProvider.d.mts +70 -0
- package/dist/oauth/OAuthProvider.mjs +39 -0
- package/dist/oauth/OAuthProvider.mjs.map +1 -0
- package/dist/oauth/OAuthProviders.d.mts +27 -0
- package/dist/oauth/OAuthProviders.mjs +33 -0
- package/dist/oauth/OAuthProviders.mjs.map +1 -0
- package/dist/oauth/OAuthRegistrationIntents.d.mts +87 -0
- package/dist/oauth/OAuthRegistrationIntents.mjs +19 -0
- package/dist/oauth/OAuthRegistrationIntents.mjs.map +1 -0
- package/dist/oauth/OAuthReturnTargets.d.mts +15 -0
- package/dist/oauth/OAuthReturnTargets.mjs +24 -0
- package/dist/oauth/OAuthReturnTargets.mjs.map +1 -0
- package/dist/oauth/OAuthSignInPersistence.d.mts +68 -0
- package/dist/oauth/OAuthSignInPersistence.mjs +12 -0
- package/dist/oauth/OAuthSignInPersistence.mjs.map +1 -0
- package/dist/oauth/OAuthStateDecisions.d.mts +14 -0
- package/dist/oauth/OAuthStateDecisions.mjs +8 -0
- package/dist/oauth/OAuthStateDecisions.mjs.map +1 -0
- package/dist/oauth/OAuthStateStore.d.mts +35 -0
- package/dist/oauth/OAuthStateStore.mjs +64 -0
- package/dist/oauth/OAuthStateStore.mjs.map +1 -0
- package/dist/oauth/OAuthTransactionProtector.d.mts +26 -0
- package/dist/oauth/OAuthTransactionProtector.mjs +78 -0
- package/dist/oauth/OAuthTransactionProtector.mjs.map +1 -0
- package/dist/oauth/accounts.d.mts +29 -0
- package/dist/oauth/accounts.mjs +515 -0
- package/dist/oauth/accounts.mjs.map +1 -0
- package/dist/oauth/accountsModels.d.mts +463 -0
- package/dist/oauth/accountsModels.mjs +155 -0
- package/dist/oauth/accountsModels.mjs.map +1 -0
- package/dist/oauth/connected.d.mts +442 -0
- package/dist/oauth/connected.mjs +526 -0
- package/dist/oauth/connected.mjs.map +1 -0
- package/dist/oauth/connectedAccess.d.mts +20 -0
- package/dist/oauth/connectedAccess.mjs +279 -0
- package/dist/oauth/connectedAccess.mjs.map +1 -0
- package/dist/oauth/connectedMaintenance.d.mts +19 -0
- package/dist/oauth/connectedMaintenance.mjs +133 -0
- package/dist/oauth/connectedMaintenance.mjs.map +1 -0
- package/dist/oauth/connectedModels.d.mts +2023 -0
- package/dist/oauth/connectedModels.mjs +375 -0
- package/dist/oauth/connectedModels.mjs.map +1 -0
- package/dist/oauth/definition.d.mts +4396 -0
- package/dist/oauth/definition.mjs +120 -0
- package/dist/oauth/definition.mjs.map +1 -0
- package/dist/oauth/errors.d.mts +49 -0
- package/dist/oauth/errors.mjs +42 -0
- package/dist/oauth/errors.mjs.map +1 -0
- package/dist/oauth/github/identity.d.mts +8 -0
- package/dist/oauth/github/identity.mjs +24 -0
- package/dist/oauth/github/identity.mjs.map +1 -0
- package/dist/oauth/github/models.d.mts +34 -0
- package/dist/oauth/github/protocol.d.mts +54 -0
- package/dist/oauth/github/protocol.mjs +204 -0
- package/dist/oauth/github/protocol.mjs.map +1 -0
- package/dist/oauth/openid-client/ProviderRevocation.d.mts +4 -0
- package/dist/oauth/openid-client/ProviderRevocation.mjs +11 -0
- package/dist/oauth/openid-client/ProviderRevocation.mjs.map +1 -0
- package/dist/oauth/openid-client/compatibility.d.mts +1 -0
- package/dist/oauth/openid-client/compatibility.mjs +6 -0
- package/dist/oauth/openid-client/compatibility.mjs.map +1 -0
- package/dist/oauth/openid-client/configuration.mjs +305 -0
- package/dist/oauth/openid-client/configuration.mjs.map +1 -0
- package/dist/oauth/openid-client/connected/configuration.mjs +338 -0
- package/dist/oauth/openid-client/connected/configuration.mjs.map +1 -0
- package/dist/oauth/openid-client/connected/models.d.mts +42 -0
- package/dist/oauth/openid-client/connected/protocol.d.mts +16 -0
- package/dist/oauth/openid-client/connected/protocol.mjs +402 -0
- package/dist/oauth/openid-client/connected/protocol.mjs.map +1 -0
- package/dist/oauth/openid-client/models.d.mts +67 -0
- package/dist/oauth/openid-client/models.mjs +16 -0
- package/dist/oauth/openid-client/models.mjs.map +1 -0
- package/dist/oauth/openid-client/protocol.d.mts +27 -0
- package/dist/oauth/openid-client/protocol.mjs +218 -0
- package/dist/oauth/openid-client/protocol.mjs.map +1 -0
- package/dist/oauth/openid-client/transport.mjs +59 -0
- package/dist/oauth/openid-client/transport.mjs.map +1 -0
- package/dist/oauth/policy.d.mts +18 -0
- package/dist/oauth/policy.mjs +16 -0
- package/dist/oauth/policy.mjs.map +1 -0
- package/dist/oauth/registration.d.mts +24 -0
- package/dist/oauth/registration.mjs +177 -0
- package/dist/oauth/registration.mjs.map +1 -0
- package/dist/oauth/registrationModels.d.mts +152 -0
- package/dist/oauth/registrationModels.mjs +93 -0
- package/dist/oauth/registrationModels.mjs.map +1 -0
- package/dist/oauth/registrationSecrets.mjs +70 -0
- package/dist/oauth/registrationSecrets.mjs.map +1 -0
- package/dist/oauth/schema.d.mts +86 -0
- package/dist/oauth/schema.mjs +81 -0
- package/dist/oauth/schema.mjs.map +1 -0
- package/dist/oauth/signInErrors.d.mts +17 -0
- package/dist/oauth/signInErrors.mjs +16 -0
- package/dist/oauth/signInErrors.mjs.map +1 -0
- package/dist/oauth/signInModels.d.mts +343 -0
- package/dist/oauth/signInModels.mjs +181 -0
- package/dist/oauth/signInModels.mjs.map +1 -0
- package/dist/oauth/signInModule.d.mts +1546 -0
- package/dist/oauth/signInModule.mjs +430 -0
- package/dist/oauth/signInModule.mjs.map +1 -0
- package/dist/oauth/signInSnapshot.mjs +29 -0
- package/dist/oauth/signInSnapshot.mjs.map +1 -0
- package/dist/oauth/transactionEncryption.d.mts +14 -0
- package/dist/oauth/transactionEncryption.mjs +129 -0
- package/dist/oauth/transactionEncryption.mjs.map +1 -0
- package/dist/operations/RequestBindingConfig.d.mts +11 -0
- package/dist/operations/RequestBindingConfig.mjs +10 -0
- package/dist/operations/RequestBindingConfig.mjs.map +1 -0
- package/dist/operations/actions.d.mts +947 -0
- package/dist/operations/actions.mjs +148 -0
- package/dist/operations/actions.mjs.map +1 -0
- package/dist/operations/context.d.mts +63 -0
- package/dist/operations/context.mjs +55 -0
- package/dist/operations/context.mjs.map +1 -0
- package/dist/operations/credentials.d.mts +39 -0
- package/dist/operations/credentials.mjs +60 -0
- package/dist/operations/credentials.mjs.map +1 -0
- package/dist/operations/errors.d.mts +24 -0
- package/dist/operations/errors.mjs +31 -0
- package/dist/operations/errors.mjs.map +1 -0
- package/dist/operations/operation.d.mts +124 -0
- package/dist/operations/operation.mjs +220 -0
- package/dist/operations/operation.mjs.map +1 -0
- package/dist/operations/requestBinding.d.mts +46 -0
- package/dist/operations/requestBinding.mjs +130 -0
- package/dist/operations/requestBinding.mjs.map +1 -0
- package/dist/operations/requestBindingModels.d.mts +13 -0
- package/dist/operations/requestBindingModels.mjs +12 -0
- package/dist/operations/requestBindingModels.mjs.map +1 -0
- package/dist/operations/reveals.d.mts +28 -0
- package/dist/operations/reveals.mjs +88 -0
- package/dist/operations/reveals.mjs.map +1 -0
- package/dist/passkey/PasskeyActionEvidence.d.mts +22 -0
- package/dist/passkey/PasskeyActionEvidence.mjs +9 -0
- package/dist/passkey/PasskeyActionEvidence.mjs.map +1 -0
- package/dist/passkey/PasskeyCredentials.d.mts +16 -0
- package/dist/passkey/PasskeyCredentials.mjs +9 -0
- package/dist/passkey/PasskeyCredentials.mjs.map +1 -0
- package/dist/passkey/PasskeyEnrollmentContext.d.mts +22 -0
- package/dist/passkey/PasskeyEnrollmentContext.mjs +9 -0
- package/dist/passkey/PasskeyEnrollmentContext.mjs.map +1 -0
- package/dist/passkey/PasskeyManagementPersistence.d.mts +106 -0
- package/dist/passkey/PasskeyManagementPersistence.mjs +9 -0
- package/dist/passkey/PasskeyManagementPersistence.mjs.map +1 -0
- package/dist/passkey/PasskeyPersistence.d.mts +63 -0
- package/dist/passkey/PasskeyPersistence.mjs +10 -0
- package/dist/passkey/PasskeyPersistence.mjs.map +1 -0
- package/dist/passkey/PasskeyProtocol.d.mts +38 -0
- package/dist/passkey/PasskeyProtocol.mjs +11 -0
- package/dist/passkey/PasskeyProtocol.mjs.map +1 -0
- package/dist/passkey/actions.d.mts +50 -0
- package/dist/passkey/actions.mjs +376 -0
- package/dist/passkey/actions.mjs.map +1 -0
- package/dist/passkey/browser/PasskeyBrowser.d.mts +18 -0
- package/dist/passkey/browser/PasskeyBrowser.mjs +9 -0
- package/dist/passkey/browser/PasskeyBrowser.mjs.map +1 -0
- package/dist/passkey/browser/models.d.mts +38 -0
- package/dist/passkey/browser/models.mjs +41 -0
- package/dist/passkey/browser/models.mjs.map +1 -0
- package/dist/passkey/browser/simplewebauthn.d.mts +17 -0
- package/dist/passkey/browser/simplewebauthn.mjs +411 -0
- package/dist/passkey/browser/simplewebauthn.mjs.map +1 -0
- package/dist/passkey/definition.d.mts +5626 -0
- package/dist/passkey/definition.mjs +114 -0
- package/dist/passkey/definition.mjs.map +1 -0
- package/dist/passkey/errors.d.mts +20 -0
- package/dist/passkey/errors.mjs +20 -0
- package/dist/passkey/errors.mjs.map +1 -0
- package/dist/passkey/management.mjs +276 -0
- package/dist/passkey/management.mjs.map +1 -0
- package/dist/passkey/models.d.mts +1245 -0
- package/dist/passkey/models.mjs +301 -0
- package/dist/passkey/models.mjs.map +1 -0
- package/dist/passkey/module.d.mts +2132 -0
- package/dist/passkey/module.mjs +174 -0
- package/dist/passkey/module.mjs.map +1 -0
- package/dist/passkey/pending.mjs +99 -0
- package/dist/passkey/pending.mjs.map +1 -0
- package/dist/passkey/policy.d.mts +48 -0
- package/dist/passkey/policy.mjs +77 -0
- package/dist/passkey/policy.mjs.map +1 -0
- package/dist/passkey/registration.mjs +107 -0
- package/dist/passkey/registration.mjs.map +1 -0
- package/dist/passkey/simplewebauthn/configuration.mjs +45 -0
- package/dist/passkey/simplewebauthn/configuration.mjs.map +1 -0
- package/dist/passkey/simplewebauthn/models.d.mts +21 -0
- package/dist/passkey/simplewebauthn/models.mjs +8 -0
- package/dist/passkey/simplewebauthn/models.mjs.map +1 -0
- package/dist/passkey/simplewebauthn/protocol.d.mts +62 -0
- package/dist/passkey/simplewebauthn/protocol.mjs +402 -0
- package/dist/passkey/simplewebauthn/protocol.mjs.map +1 -0
- package/dist/passkey/snapshot.mjs +31 -0
- package/dist/passkey/snapshot.mjs.map +1 -0
- package/dist/passkey/stepUp.mjs +101 -0
- package/dist/passkey/stepUp.mjs.map +1 -0
- package/dist/password/CompromisedPasswords.d.mts +26 -0
- package/dist/password/CompromisedPasswords.mjs +23 -0
- package/dist/password/CompromisedPasswords.mjs.map +1 -0
- package/dist/password/NewPasswordCheck.d.mts +21 -0
- package/dist/password/NewPasswordCheck.mjs +39 -0
- package/dist/password/NewPasswordCheck.mjs.map +1 -0
- package/dist/password/PasswordHashing.d.mts +24 -0
- package/dist/password/PasswordHashing.mjs +96 -0
- package/dist/password/PasswordHashing.mjs.map +1 -0
- package/dist/password/PasswordKdfAdmission.d.mts +19 -0
- package/dist/password/PasswordKdfAdmission.mjs +25 -0
- package/dist/password/PasswordKdfAdmission.mjs.map +1 -0
- package/dist/password/configuration.d.mts +43 -0
- package/dist/password/configuration.mjs +64 -0
- package/dist/password/configuration.mjs.map +1 -0
- package/dist/password/defaults.mjs +13 -0
- package/dist/password/defaults.mjs.map +1 -0
- package/dist/password/encoding.mjs +64 -0
- package/dist/password/encoding.mjs.map +1 -0
- package/dist/password/errors.d.mts +28 -0
- package/dist/password/errors.mjs +25 -0
- package/dist/password/errors.mjs.map +1 -0
- package/dist/password/methods/PasswordActionEvidence.d.mts +38 -0
- package/dist/password/methods/PasswordActionEvidence.mjs +22 -0
- package/dist/password/methods/PasswordActionEvidence.mjs.map +1 -0
- package/dist/password/methods/PasswordPersistence.d.mts +102 -0
- package/dist/password/methods/PasswordPersistence.mjs +13 -0
- package/dist/password/methods/PasswordPersistence.mjs.map +1 -0
- package/dist/password/methods/PasswordPreparedPersistence.d.mts +111 -0
- package/dist/password/methods/contracts.d.mts +43 -0
- package/dist/password/methods/contracts.mjs +33 -0
- package/dist/password/methods/contracts.mjs.map +1 -0
- package/dist/password/methods/definition.d.mts +3813 -0
- package/dist/password/methods/definition.mjs +56 -0
- package/dist/password/methods/definition.mjs.map +1 -0
- package/dist/password/methods/errors.d.mts +15 -0
- package/dist/password/methods/errors.mjs +11 -0
- package/dist/password/methods/errors.mjs.map +1 -0
- package/dist/password/methods/models.d.mts +70 -0
- package/dist/password/methods/models.mjs +44 -0
- package/dist/password/methods/models.mjs.map +1 -0
- package/dist/password/methods/module.d.mts +3567 -0
- package/dist/password/methods/module.mjs +553 -0
- package/dist/password/methods/module.mjs.map +1 -0
- package/dist/password/methods/policy.d.mts +84 -0
- package/dist/password/methods/policy.mjs +80 -0
- package/dist/password/methods/policy.mjs.map +1 -0
- package/dist/password/methods/preparation.mjs +54 -0
- package/dist/password/methods/preparation.mjs.map +1 -0
- package/dist/password/methods/prepared.d.mts +53 -0
- package/dist/password/methods/prepared.mjs +610 -0
- package/dist/password/methods/prepared.mjs.map +1 -0
- package/dist/password/methods/preparedModels.d.mts +1295 -0
- package/dist/password/methods/preparedModels.mjs +278 -0
- package/dist/password/methods/preparedModels.mjs.map +1 -0
- package/dist/password/methods/signIn.d.mts +180 -0
- package/dist/password/methods/signIn.mjs +73 -0
- package/dist/password/methods/signIn.mjs.map +1 -0
- package/dist/password/methods/snapshot.mjs +38 -0
- package/dist/password/methods/snapshot.mjs.map +1 -0
- package/dist/password/methods/verification.mjs +138 -0
- package/dist/password/methods/verification.mjs.map +1 -0
- package/dist/password/models.d.mts +13 -0
- package/dist/password/models.mjs +12 -0
- package/dist/password/models.mjs.map +1 -0
- package/dist/password/policy.d.mts +33 -0
- package/dist/password/policy.mjs +37 -0
- package/dist/password/policy.mjs.map +1 -0
- package/dist/phone/PhoneActionEvidence.d.mts +23 -0
- package/dist/phone/PhoneActionEvidence.mjs +10 -0
- package/dist/phone/PhoneActionEvidence.mjs.map +1 -0
- package/dist/phone/PhoneAdmission.d.mts +29 -0
- package/dist/phone/PhoneAdmission.mjs +10 -0
- package/dist/phone/PhoneAdmission.mjs.map +1 -0
- package/dist/phone/PhoneDeliveryEligibility.d.mts +11 -0
- package/dist/phone/PhoneDeliveryEligibility.mjs +8 -0
- package/dist/phone/PhoneDeliveryEligibility.mjs.map +1 -0
- package/dist/phone/PhonePersistence.d.mts +33 -0
- package/dist/phone/PhonePersistence.mjs +10 -0
- package/dist/phone/PhonePersistence.mjs.map +1 -0
- package/dist/phone/PhoneRequestContext.d.mts +10 -0
- package/dist/phone/PhoneRequestContext.mjs +8 -0
- package/dist/phone/PhoneRequestContext.mjs.map +1 -0
- package/dist/phone/PhoneSignInTargets.d.mts +19 -0
- package/dist/phone/PhoneSignInTargets.mjs +13 -0
- package/dist/phone/PhoneSignInTargets.mjs.map +1 -0
- package/dist/phone/definition.d.mts +7190 -0
- package/dist/phone/definition.mjs +28 -0
- package/dist/phone/definition.mjs.map +1 -0
- package/dist/phone/failure.mjs +23 -0
- package/dist/phone/failure.mjs.map +1 -0
- package/dist/phone/lifecycle.mjs +427 -0
- package/dist/phone/lifecycle.mjs.map +1 -0
- package/dist/phone/lifecycleModels.d.mts +164 -0
- package/dist/phone/lifecycleModels.mjs +91 -0
- package/dist/phone/lifecycleModels.mjs.map +1 -0
- package/dist/phone/models.d.mts +41 -0
- package/dist/phone/models.mjs +29 -0
- package/dist/phone/models.mjs.map +1 -0
- package/dist/phone/module.d.mts +6027 -0
- package/dist/phone/module.mjs +293 -0
- package/dist/phone/module.mjs.map +1 -0
- package/dist/proofs/EmailProofDelivery.d.mts +13 -0
- package/dist/proofs/EmailProofDelivery.mjs +11 -0
- package/dist/proofs/EmailProofDelivery.mjs.map +1 -0
- package/dist/proofs/HostIngressLimiter.d.mts +20 -0
- package/dist/proofs/HostIngressLimiter.mjs +13 -0
- package/dist/proofs/HostIngressLimiter.mjs.map +1 -0
- package/dist/proofs/ProofPersistence.d.mts +140 -0
- package/dist/proofs/ProofPersistence.mjs +13 -0
- package/dist/proofs/ProofPersistence.mjs.map +1 -0
- package/dist/proofs/SmsProofDelivery.d.mts +13 -0
- package/dist/proofs/SmsProofDelivery.mjs +11 -0
- package/dist/proofs/SmsProofDelivery.mjs.map +1 -0
- package/dist/proofs/abuse.d.mts +15 -0
- package/dist/proofs/abuse.mjs +12 -0
- package/dist/proofs/abuse.mjs.map +1 -0
- package/dist/proofs/completion.d.mts +22 -0
- package/dist/proofs/crypto.d.mts +196 -0
- package/dist/proofs/crypto.mjs +189 -0
- package/dist/proofs/crypto.mjs.map +1 -0
- package/dist/proofs/definition.d.mts +335 -0
- package/dist/proofs/definition.mjs +10 -0
- package/dist/proofs/definition.mjs.map +1 -0
- package/dist/proofs/delivery.d.mts +30 -0
- package/dist/proofs/delivery.mjs +26 -0
- package/dist/proofs/delivery.mjs.map +1 -0
- package/dist/proofs/dispatch.d.mts +20 -0
- package/dist/proofs/dispatch.mjs +54 -0
- package/dist/proofs/dispatch.mjs.map +1 -0
- package/dist/proofs/errors.d.mts +21 -0
- package/dist/proofs/errors.mjs +25 -0
- package/dist/proofs/errors.mjs.map +1 -0
- package/dist/proofs/models.d.mts +141 -0
- package/dist/proofs/models.mjs +93 -0
- package/dist/proofs/models.mjs.map +1 -0
- package/dist/proofs/module.d.mts +344 -0
- package/dist/proofs/module.mjs +350 -0
- package/dist/proofs/module.mjs.map +1 -0
- package/dist/proofs/policy.d.mts +152 -0
- package/dist/proofs/policy.mjs +51 -0
- package/dist/proofs/policy.mjs.map +1 -0
- package/dist/sessions/AuthenticationAuthority.d.mts +31 -0
- package/dist/sessions/AuthenticationAuthority.mjs +8 -0
- package/dist/sessions/AuthenticationAuthority.mjs.map +1 -0
- package/dist/sessions/PendingAuthentication.d.mts +108 -0
- package/dist/sessions/PendingAuthentication.mjs +40 -0
- package/dist/sessions/PendingAuthentication.mjs.map +1 -0
- package/dist/sessions/SessionStepUpPersistence.d.mts +152 -0
- package/dist/sessions/SessionStepUpPersistence.mjs +63 -0
- package/dist/sessions/SessionStepUpPersistence.mjs.map +1 -0
- package/dist/sessions/assurance.d.mts +163 -0
- package/dist/sessions/assurance.mjs +95 -0
- package/dist/sessions/assurance.mjs.map +1 -0
- package/dist/sessions/commit.d.mts +13 -0
- package/dist/sessions/configuration.d.mts +46 -0
- package/dist/sessions/configuration.mjs +55 -0
- package/dist/sessions/configuration.mjs.map +1 -0
- package/dist/sessions/contract.d.mts +663 -0
- package/dist/sessions/contract.mjs +174 -0
- package/dist/sessions/contract.mjs.map +1 -0
- package/dist/sessions/crypto.d.mts +24 -0
- package/dist/sessions/crypto.mjs +106 -0
- package/dist/sessions/crypto.mjs.map +1 -0
- package/dist/sessions/definition.d.mts +11 -0
- package/dist/sessions/definition.mjs +10 -0
- package/dist/sessions/definition.mjs.map +1 -0
- package/dist/sessions/errors.d.mts +35 -0
- package/dist/sessions/errors.mjs +34 -0
- package/dist/sessions/errors.mjs.map +1 -0
- package/dist/sessions/invalidation.d.mts +23 -0
- package/dist/sessions/invalidation.mjs +33 -0
- package/dist/sessions/invalidation.mjs.map +1 -0
- package/dist/sessions/models.d.mts +143 -0
- package/dist/sessions/models.mjs +94 -0
- package/dist/sessions/models.mjs.map +1 -0
- package/dist/sessions/module.d.mts +1091 -0
- package/dist/sessions/module.mjs +943 -0
- package/dist/sessions/module.mjs.map +1 -0
- package/dist/sessions/persistence.d.mts +93 -0
- package/dist/sessions/policy.d.mts +80 -0
- package/dist/sessions/policy.mjs +66 -0
- package/dist/sessions/policy.mjs.map +1 -0
- package/dist/testing/conformance/AuthStore.d.mts +11 -0
- package/dist/testing/conformance/AuthStore.mjs +173 -0
- package/dist/testing/conformance/AuthStore.mjs.map +1 -0
- package/dist/testing/conformance/OAuthConnectionStore.d.mts +11 -0
- package/dist/testing/conformance/OAuthConnectionStore.mjs +102 -0
- package/dist/testing/conformance/OAuthConnectionStore.mjs.map +1 -0
- package/dist/testing/conformance/OAuthStateStore.d.mts +11 -0
- package/dist/testing/conformance/OAuthStateStore.mjs +45 -0
- package/dist/testing/conformance/OAuthStateStore.mjs.map +1 -0
- package/dist/testing/conformance/PasswordCredentialStore.d.mts +20 -0
- package/dist/testing/conformance/PasswordCredentialStore.mjs +103 -0
- package/dist/testing/conformance/PasswordCredentialStore.mjs.map +1 -0
- package/dist/testing/conformance/support.mjs +17 -0
- package/dist/testing/conformance/support.mjs.map +1 -0
- package/dist/testing/crypto.d.mts +11 -0
- package/dist/testing/crypto.mjs +41 -0
- package/dist/testing/crypto.mjs.map +1 -0
- package/dist/testing/keyring.d.mts +9 -0
- package/dist/testing/keyring.mjs +17 -0
- package/dist/testing/keyring.mjs.map +1 -0
- package/dist/totp/TotpActionEvidence.d.mts +18 -0
- package/dist/totp/TotpActionEvidence.mjs +8 -0
- package/dist/totp/TotpActionEvidence.mjs.map +1 -0
- package/dist/totp/TotpPersistence.d.mts +19 -0
- package/dist/totp/TotpPersistence.mjs +8 -0
- package/dist/totp/TotpPersistence.mjs.map +1 -0
- package/dist/totp/TotpSecretKeys.d.mts +15 -0
- package/dist/totp/TotpSecretKeys.mjs +8 -0
- package/dist/totp/TotpSecretKeys.mjs.map +1 -0
- package/dist/totp/crypto.mjs +96 -0
- package/dist/totp/crypto.mjs.map +1 -0
- package/dist/totp/definition.d.mts +764 -0
- package/dist/totp/definition.mjs +24 -0
- package/dist/totp/definition.mjs.map +1 -0
- package/dist/totp/errors.d.mts +16 -0
- package/dist/totp/errors.mjs +18 -0
- package/dist/totp/errors.mjs.map +1 -0
- package/dist/totp/models.d.mts +377 -0
- package/dist/totp/models.mjs +137 -0
- package/dist/totp/models.mjs.map +1 -0
- package/dist/totp/module.d.mts +737 -0
- package/dist/totp/module.mjs +355 -0
- package/dist/totp/module.mjs.map +1 -0
- package/package.json +1 -0
- package/src/Atom.ts +4 -0
- package/src/Auth.ts +16 -0
- package/src/AuthContract.ts +17 -0
- package/src/AuthSession.ts +298 -0
- package/src/AuthStore.ts +367 -0
- package/src/AuthTokenCodec.ts +226 -0
- package/src/Client.ts +9 -0
- package/src/Cloudflare.ts +345 -0
- package/src/Drizzle.ts +378 -0
- package/src/DrizzleD1.ts +136 -0
- package/src/DrizzleLibsql.ts +288 -0
- package/src/DrizzleMysql2.ts +184 -0
- package/src/DrizzlePglite.ts +160 -0
- package/src/DrizzlePostgres.ts +160 -0
- package/src/DrizzleSqliteBun.ts +244 -0
- package/src/DrizzleSqliteDo.ts +473 -0
- package/src/DrizzleSqliteNode.ts +245 -0
- package/src/DrizzleSqliteWasm.ts +245 -0
- package/src/Email.ts +55 -0
- package/src/EmailOtp.ts +250 -0
- package/src/EmailOtpSender.ts +28 -0
- package/src/Errors.ts +103 -0
- package/src/GitHub.ts +16 -0
- package/src/Hooks.ts +50 -0
- package/src/Http.ts +47 -0
- package/src/HttpServer.ts +742 -0
- package/src/Identity.ts +53 -0
- package/src/IdentityResolver.ts +18 -0
- package/src/OAuth.ts +242 -0
- package/src/OpenIdClient.ts +13 -0
- package/src/OpenIdClientConnected.ts +18 -0
- package/src/OperationHttp.ts +14 -0
- package/src/OperationHttpClient.ts +6 -0
- package/src/OperationHttpServer.ts +15 -0
- package/src/Operations.ts +69 -0
- package/src/Passkey.ts +81 -0
- package/src/PasskeyBrowser.ts +19 -0
- package/src/PasskeyContract.ts +212 -0
- package/src/PasskeyPassword.ts +319 -0
- package/src/PasskeySimpleWebAuthn.ts +6 -0
- package/src/Password.ts +113 -0
- package/src/PasswordAuth.ts +197 -0
- package/src/PasswordCredentialStore.ts +140 -0
- package/src/PasswordHasher.ts +147 -0
- package/src/PhoneOtp.ts +32 -0
- package/src/Policy.ts +95 -0
- package/src/Proofs.ts +71 -0
- package/src/Rpc.ts +15 -0
- package/src/Schema.ts +235 -0
- package/src/SessionContract.ts +2 -0
- package/src/Sessions.ts +105 -0
- package/src/Testing.ts +24 -0
- package/src/Totp.ts +28 -0
- package/src/TotpContract.ts +147 -0
- package/src/WebCrypto.ts +61 -0
- package/src/Workflows.ts +12 -0
- package/src/atom/AuthAtomLifetime.ts +87 -0
- package/src/atom/AuthAtomWorkflow.ts +27 -0
- package/src/atom/client.ts +364 -0
- package/src/atom/operations.ts +183 -0
- package/src/atom/scoped-runtime.ts +249 -0
- package/src/auth/Auth.ts +482 -0
- package/src/auth/AuthConfigurationError.ts +9 -0
- package/src/auth/AuthRequest.ts +21 -0
- package/src/auth/AuthStrategy.ts +116 -0
- package/src/auth/ConsumeDecision.ts +4 -0
- package/src/auth/actions.ts +220 -0
- package/src/auth/defaults.ts +23 -0
- package/src/auth/definition.ts +88 -0
- package/src/auth/session.ts +146 -0
- package/src/drizzle/D1BatchStatements.ts +10 -0
- package/src/drizzle/PasswordPreparedPostconditions.ts +30 -0
- package/src/drizzle/SuppliedService.ts +10 -0
- package/src/drizzle/d1-emails.ts +1808 -0
- package/src/drizzle/d1-generated-statement.ts +129 -0
- package/src/drizzle/d1-identity.ts +374 -0
- package/src/drizzle/d1-oauth.ts +338 -0
- package/src/drizzle/d1-passkey.ts +371 -0
- package/src/drizzle/d1-password-prepared.ts +1273 -0
- package/src/drizzle/d1-passwords.ts +2661 -0
- package/src/drizzle/d1-phone.ts +94 -0
- package/src/drizzle/d1-planning.ts +105 -0
- package/src/drizzle/d1-proofs.ts +2305 -0
- package/src/drizzle/d1-sessions.ts +2867 -0
- package/src/drizzle/d1-totp.ts +79 -0
- package/src/drizzle/email-model.ts +512 -0
- package/src/drizzle/email-registration.ts +696 -0
- package/src/drizzle/email-sql.ts +1468 -0
- package/src/drizzle/email-target.ts +243 -0
- package/src/drizzle/model.ts +492 -0
- package/src/drizzle/mysql-emails.ts +323 -0
- package/src/drizzle/mysql-identity.ts +323 -0
- package/src/drizzle/mysql-password-prepared.ts +206 -0
- package/src/drizzle/mysql-passwords.ts +341 -0
- package/src/drizzle/mysql-proofs.ts +183 -0
- package/src/drizzle/mysql-sessions.ts +742 -0
- package/src/drizzle/mysql.ts +686 -0
- package/src/drizzle/oauth-accounts.ts +801 -0
- package/src/drizzle/oauth-connected-access.ts +354 -0
- package/src/drizzle/oauth-connected-collection.ts +324 -0
- package/src/drizzle/oauth-connected-custody.ts +277 -0
- package/src/drizzle/oauth-connected-drivers.ts +463 -0
- package/src/drizzle/oauth-connected-flow.ts +439 -0
- package/src/drizzle/oauth-connected-input.ts +128 -0
- package/src/drizzle/oauth-connected-maintenance.ts +345 -0
- package/src/drizzle/oauth-connected-management.ts +365 -0
- package/src/drizzle/oauth-connected-model.ts +347 -0
- package/src/drizzle/oauth-connected-reference.ts +112 -0
- package/src/drizzle/oauth-connected-settlement.ts +226 -0
- package/src/drizzle/oauth-connected-state.ts +846 -0
- package/src/drizzle/oauth-connected-target.ts +264 -0
- package/src/drizzle/oauth-drivers.ts +567 -0
- package/src/drizzle/oauth-flow.ts +461 -0
- package/src/drizzle/oauth-input.ts +205 -0
- package/src/drizzle/oauth-model.ts +610 -0
- package/src/drizzle/oauth-mysql.ts +10 -0
- package/src/drizzle/oauth-owner.ts +29 -0
- package/src/drizzle/oauth-registration.ts +638 -0
- package/src/drizzle/oauth-state.ts +213 -0
- package/src/drizzle/oauth-target.ts +751 -0
- package/src/drizzle/passkey-admission.ts +333 -0
- package/src/drizzle/passkey-credentials.ts +465 -0
- package/src/drizzle/passkey-drivers.ts +385 -0
- package/src/drizzle/passkey-enrollment.ts +280 -0
- package/src/drizzle/passkey-flow.ts +983 -0
- package/src/drizzle/passkey-management.ts +369 -0
- package/src/drizzle/passkey-model.ts +350 -0
- package/src/drizzle/passkey-registration-ceremony-model.ts +69 -0
- package/src/drizzle/passkey-registration-ceremony.ts +254 -0
- package/src/drizzle/passkey-registration-custody.ts +82 -0
- package/src/drizzle/passkey-registration-write.ts +378 -0
- package/src/drizzle/passkey-state.ts +307 -0
- package/src/drizzle/passkey-target.ts +528 -0
- package/src/drizzle/passkey-write-drivers.ts +396 -0
- package/src/drizzle/passkey-write-model.ts +265 -0
- package/src/drizzle/passkey-write-state.ts +627 -0
- package/src/drizzle/passkey-write-target.ts +406 -0
- package/src/drizzle/password-model.ts +491 -0
- package/src/drizzle/password-prepared-model.ts +259 -0
- package/src/drizzle/password-prepared-sql.ts +1198 -0
- package/src/drizzle/password-prepared-state.ts +232 -0
- package/src/drizzle/password-prepared-target.ts +158 -0
- package/src/drizzle/password-registration.ts +372 -0
- package/src/drizzle/password-sql.ts +2082 -0
- package/src/drizzle/password-target.ts +223 -0
- package/src/drizzle/pg-emails.ts +323 -0
- package/src/drizzle/pg-password-prepared.ts +207 -0
- package/src/drizzle/pg-passwords.ts +340 -0
- package/src/drizzle/pg-proofs.ts +193 -0
- package/src/drizzle/pg-sessions.ts +751 -0
- package/src/drizzle/pg.ts +982 -0
- package/src/drizzle/phone-model.ts +185 -0
- package/src/drizzle/phone-state.ts +802 -0
- package/src/drizzle/phone-target.ts +471 -0
- package/src/drizzle/proof-model.ts +398 -0
- package/src/drizzle/proof-sql.ts +1912 -0
- package/src/drizzle/proof-target.ts +120 -0
- package/src/drizzle/session-model.ts +368 -0
- package/src/drizzle/session-sql.ts +2152 -0
- package/src/drizzle/session-target.ts +335 -0
- package/src/drizzle/sqlite-emails.ts +368 -0
- package/src/drizzle/sqlite-identity.ts +343 -0
- package/src/drizzle/sqlite-password-prepared.ts +262 -0
- package/src/drizzle/sqlite-passwords.ts +499 -0
- package/src/drizzle/sqlite-proofs.ts +204 -0
- package/src/drizzle/sqlite-sessions.ts +972 -0
- package/src/drizzle/sqlite.ts +704 -0
- package/src/drizzle/standalone-guard.ts +38 -0
- package/src/drizzle/step-up-model.ts +129 -0
- package/src/drizzle/step-up-state.ts +141 -0
- package/src/drizzle/totp-model.ts +91 -0
- package/src/drizzle/totp-state.ts +520 -0
- package/src/drizzle/totp-target.ts +304 -0
- package/src/drizzle/transaction-execution.ts +290 -0
- package/src/drizzle/transaction-mysql.ts +104 -0
- package/src/drizzle/transaction-owner.ts +570 -0
- package/src/email/EmailActionEvidence.ts +37 -0
- package/src/email/EmailAddressPersistence.ts +71 -0
- package/src/email/EmailIdentifierNotifier.ts +48 -0
- package/src/email/EmailReturnTargets.ts +50 -0
- package/src/email/EmailSignInTargets.ts +20 -0
- package/src/email/addresses.ts +630 -0
- package/src/email/definition.ts +309 -0
- package/src/email/errors.ts +23 -0
- package/src/email/magicLink.ts +84 -0
- package/src/email/models.ts +50 -0
- package/src/email/module.ts +664 -0
- package/src/email/registration.ts +415 -0
- package/src/email/snapshot.ts +51 -0
- package/src/hooks/LifecycleHooks.ts +136 -0
- package/src/hooks/commit.ts +271 -0
- package/src/hooks/models.ts +111 -0
- package/src/hooks/plugins.ts +87 -0
- package/src/hooks/transactions.ts +51 -0
- package/src/http/auth-api.ts +17 -0
- package/src/http/auth-contract.ts +148 -0
- package/src/http/auth-http.ts +467 -0
- package/src/http/endpoints/get-session.ts +9 -0
- package/src/http/endpoints/password-sign-in.ts +19 -0
- package/src/http/endpoints/request-email-otp.ts +10 -0
- package/src/http/endpoints/set-password.ts +18 -0
- package/src/http/endpoints/sign-out.ts +5 -0
- package/src/http/endpoints/verify-email-otp.ts +15 -0
- package/src/http/models.ts +80 -0
- package/src/http/security.ts +102 -0
- package/src/http/session-contract.ts +92 -0
- package/src/http-operation/OperationHttpInvocation.ts +39 -0
- package/src/http-operation/OperationHttpServerConfig.ts +124 -0
- package/src/http-operation/auth-client.ts +273 -0
- package/src/http-operation/client.ts +453 -0
- package/src/http-operation/configuration-schema.ts +19 -0
- package/src/http-operation/contract.ts +116 -0
- package/src/http-operation/errors.ts +38 -0
- package/src/http-operation/models.ts +42 -0
- package/src/http-operation/private.ts +50 -0
- package/src/http-operation/security.ts +93 -0
- package/src/http-operation/server.ts +544 -0
- package/src/identity/ExternalIdentityMutation.ts +18 -0
- package/src/identity/IdentityMutation.ts +41 -0
- package/src/identity/IdentityRepository.ts +37 -0
- package/src/identity/SubjectLifecycle.ts +80 -0
- package/src/identity/SubjectProvisioner.ts +40 -0
- package/src/identity/codecs.ts +54 -0
- package/src/identity/models.ts +82 -0
- package/src/identity/operations.ts +182 -0
- package/src/index.ts +23 -0
- package/src/internal/AuthStoreDecisions.ts +23 -0
- package/src/internal/CurrentSession.ts +8 -0
- package/src/internal/diagnostics.ts +71 -0
- package/src/oauth/GithubOAuthProvider.ts +106 -0
- package/src/oauth/OAuth.ts +436 -0
- package/src/oauth/OAuthAccountsPersistence.ts +142 -0
- package/src/oauth/OAuthActionEvidence.ts +31 -0
- package/src/oauth/OAuthConnectedActionEvidence.ts +28 -0
- package/src/oauth/OAuthConnectedPersistence.ts +163 -0
- package/src/oauth/OAuthConnectedProtocol.ts +54 -0
- package/src/oauth/OAuthConnectedRevocations.ts +48 -0
- package/src/oauth/OAuthConnectedTokenProtector.ts +240 -0
- package/src/oauth/OAuthConnectedTransactionProtector.ts +56 -0
- package/src/oauth/OAuthConnectedUseAuthority.ts +26 -0
- package/src/oauth/OAuthConnectionStore.ts +59 -0
- package/src/oauth/OAuthLinkTransactionProtector.ts +58 -0
- package/src/oauth/OAuthProtocol.ts +39 -0
- package/src/oauth/OAuthProvider.ts +126 -0
- package/src/oauth/OAuthProviders.ts +53 -0
- package/src/oauth/OAuthRegistrationIntents.ts +42 -0
- package/src/oauth/OAuthReturnTargets.ts +44 -0
- package/src/oauth/OAuthSignInPersistence.ts +91 -0
- package/src/oauth/OAuthStateDecisions.ts +16 -0
- package/src/oauth/OAuthStateStore.ts +102 -0
- package/src/oauth/OAuthTransactionProtector.ts +103 -0
- package/src/oauth/accounts.ts +987 -0
- package/src/oauth/accountsModels.ts +214 -0
- package/src/oauth/connected.ts +995 -0
- package/src/oauth/connectedAccess.ts +644 -0
- package/src/oauth/connectedMaintenance.ts +248 -0
- package/src/oauth/connectedModels.ts +495 -0
- package/src/oauth/definition.ts +414 -0
- package/src/oauth/errors.ts +78 -0
- package/src/oauth/github/identity.ts +26 -0
- package/src/oauth/github/models.ts +37 -0
- package/src/oauth/github/protocol.ts +329 -0
- package/src/oauth/openid-client/ProviderRevocation.ts +22 -0
- package/src/oauth/openid-client/compatibility.ts +47 -0
- package/src/oauth/openid-client/configuration.ts +472 -0
- package/src/oauth/openid-client/connected/configuration.ts +565 -0
- package/src/oauth/openid-client/connected/models.ts +58 -0
- package/src/oauth/openid-client/connected/protocol.ts +866 -0
- package/src/oauth/openid-client/models.ts +78 -0
- package/src/oauth/openid-client/protocol.ts +437 -0
- package/src/oauth/openid-client/transport.ts +67 -0
- package/src/oauth/policy.ts +26 -0
- package/src/oauth/registration.ts +410 -0
- package/src/oauth/registrationModels.ts +115 -0
- package/src/oauth/registrationSecrets.ts +127 -0
- package/src/oauth/schema.ts +102 -0
- package/src/oauth/signInErrors.ts +23 -0
- package/src/oauth/signInModels.ts +266 -0
- package/src/oauth/signInModule.ts +875 -0
- package/src/oauth/signInSnapshot.ts +37 -0
- package/src/oauth/transactionEncryption.ts +198 -0
- package/src/operations/RequestBindingConfig.ts +12 -0
- package/src/operations/actions.ts +342 -0
- package/src/operations/context.ts +130 -0
- package/src/operations/credentials.ts +121 -0
- package/src/operations/errors.ts +53 -0
- package/src/operations/operation.ts +740 -0
- package/src/operations/requestBinding.ts +237 -0
- package/src/operations/requestBindingModels.ts +18 -0
- package/src/operations/reveals.ts +147 -0
- package/src/passkey/PasskeyActionEvidence.ts +25 -0
- package/src/passkey/PasskeyCredentials.ts +16 -0
- package/src/passkey/PasskeyEnrollmentContext.ts +26 -0
- package/src/passkey/PasskeyManagementPersistence.ts +124 -0
- package/src/passkey/PasskeyPersistence.ts +85 -0
- package/src/passkey/PasskeyProtocol.ts +48 -0
- package/src/passkey/actions.ts +905 -0
- package/src/passkey/browser/PasskeyBrowser.ts +26 -0
- package/src/passkey/browser/models.ts +67 -0
- package/src/passkey/browser/simplewebauthn.ts +621 -0
- package/src/passkey/definition.ts +386 -0
- package/src/passkey/errors.ts +39 -0
- package/src/passkey/management.ts +552 -0
- package/src/passkey/models.ts +414 -0
- package/src/passkey/module.ts +367 -0
- package/src/passkey/pending.ts +203 -0
- package/src/passkey/policy.ts +88 -0
- package/src/passkey/registration.ts +251 -0
- package/src/passkey/simplewebauthn/configuration.ts +97 -0
- package/src/passkey/simplewebauthn/models.ts +9 -0
- package/src/passkey/simplewebauthn/protocol.ts +729 -0
- package/src/passkey/snapshot.ts +48 -0
- package/src/passkey/stepUp.ts +212 -0
- package/src/password/CompromisedPasswords.ts +36 -0
- package/src/password/NewPasswordCheck.ts +89 -0
- package/src/password/PasswordHashing.ts +209 -0
- package/src/password/PasswordKdfAdmission.ts +44 -0
- package/src/password/configuration.ts +52 -0
- package/src/password/defaults.ts +15 -0
- package/src/password/encoding.ts +137 -0
- package/src/password/errors.ts +43 -0
- package/src/password/methods/PasswordActionEvidence.ts +41 -0
- package/src/password/methods/PasswordPersistence.ts +128 -0
- package/src/password/methods/PasswordPreparedPersistence.ts +123 -0
- package/src/password/methods/contracts.ts +47 -0
- package/src/password/methods/definition.ts +199 -0
- package/src/password/methods/errors.ts +26 -0
- package/src/password/methods/models.ts +80 -0
- package/src/password/methods/module.ts +986 -0
- package/src/password/methods/policy.ts +68 -0
- package/src/password/methods/preparation.ts +73 -0
- package/src/password/methods/prepared.ts +1199 -0
- package/src/password/methods/preparedModels.ts +496 -0
- package/src/password/methods/signIn.ts +136 -0
- package/src/password/methods/snapshot.ts +53 -0
- package/src/password/methods/verification.ts +266 -0
- package/src/password/models.ts +15 -0
- package/src/password/policy.ts +41 -0
- package/src/phone/PhoneActionEvidence.ts +26 -0
- package/src/phone/PhoneAdmission.ts +29 -0
- package/src/phone/PhoneDeliveryEligibility.ts +9 -0
- package/src/phone/PhonePersistence.ts +43 -0
- package/src/phone/PhoneRequestContext.ts +7 -0
- package/src/phone/PhoneSignInTargets.ts +19 -0
- package/src/phone/definition.ts +87 -0
- package/src/phone/failure.ts +40 -0
- package/src/phone/lifecycle.ts +662 -0
- package/src/phone/lifecycleModels.ts +108 -0
- package/src/phone/models.ts +41 -0
- package/src/phone/module.ts +433 -0
- package/src/proofs/EmailProofDelivery.ts +19 -0
- package/src/proofs/HostIngressLimiter.ts +20 -0
- package/src/proofs/ProofPersistence.ts +172 -0
- package/src/proofs/SmsProofDelivery.ts +19 -0
- package/src/proofs/abuse.ts +23 -0
- package/src/proofs/completion.ts +23 -0
- package/src/proofs/crypto.ts +326 -0
- package/src/proofs/definition.ts +39 -0
- package/src/proofs/delivery.ts +73 -0
- package/src/proofs/dispatch.ts +99 -0
- package/src/proofs/errors.ts +46 -0
- package/src/proofs/models.ts +131 -0
- package/src/proofs/module.ts +620 -0
- package/src/proofs/policy.ts +77 -0
- package/src/sessions/AuthenticationAuthority.ts +51 -0
- package/src/sessions/PendingAuthentication.ts +121 -0
- package/src/sessions/SessionStepUpPersistence.ts +164 -0
- package/src/sessions/assurance.ts +192 -0
- package/src/sessions/commit.ts +13 -0
- package/src/sessions/configuration.ts +133 -0
- package/src/sessions/contract.ts +203 -0
- package/src/sessions/crypto.ts +181 -0
- package/src/sessions/definition.ts +25 -0
- package/src/sessions/errors.ts +68 -0
- package/src/sessions/invalidation.ts +46 -0
- package/src/sessions/models.ts +138 -0
- package/src/sessions/module.ts +1991 -0
- package/src/sessions/persistence.ts +135 -0
- package/src/sessions/policy.ts +103 -0
- package/src/testing/conformance/AuthStore.ts +314 -0
- package/src/testing/conformance/OAuthConnectionStore.ts +167 -0
- package/src/testing/conformance/OAuthStateStore.ts +105 -0
- package/src/testing/conformance/PasswordCredentialStore.ts +205 -0
- package/src/testing/conformance/support.ts +38 -0
- package/src/testing/crypto.ts +55 -0
- package/src/testing/keyring.ts +17 -0
- package/src/totp/TotpActionEvidence.ts +18 -0
- package/src/totp/TotpPersistence.ts +26 -0
- package/src/totp/TotpSecretKeys.ts +15 -0
- package/src/totp/crypto.ts +160 -0
- package/src/totp/definition.ts +78 -0
- package/src/totp/errors.ts +25 -0
- package/src/totp/models.ts +164 -0
- package/src/totp/module.ts +717 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.mjs","names":[],"sources":["../../../src/passkey/simplewebauthn/protocol.ts"],"sourcesContent":["import {\n generateAuthenticationOptions,\n generateRegistrationOptions,\n verifyAuthenticationResponse,\n verifyRegistrationResponse,\n} from \"@simplewebauthn/server\";\nimport {\n decodeAttestationObject,\n decodeClientDataJSON,\n decodeCredentialPublicKey,\n isoCBOR,\n parseAuthenticatorData,\n} from \"@simplewebauthn/server/helpers\";\nimport type { Context } from \"effect\";\nimport { Cause, DateTime, Effect, Encoding, Layer, Redacted, Schema } from \"effect\";\n\nimport { reportAuthFailure } from \"../../internal/diagnostics\";\nimport type { PasskeyConfigurationError } from \"../errors\";\nimport { PasskeyProtocolRejected, PasskeyUnavailable } from \"../errors\";\nimport {\n PasskeyAssertion,\n PasskeyAssertionVerified,\n PasskeyAttestation,\n PasskeyAuthenticationOptions,\n PasskeyCeremony,\n PasskeyChallenge,\n PasskeyCounter,\n PasskeyCredential,\n PasskeyDescriptor,\n PasskeyLabel,\n PasskeyProfile,\n PasskeyProtocolCredentialId,\n PasskeyRegistrationOptions,\n PasskeyRegistrationVerified,\n PasskeyUserHandle,\n} from \"../models\";\nimport { PasskeyProtocol } from \"../PasskeyProtocol\";\nimport { samePasskey, snapshotPasskey } from \"../snapshot\";\nimport { captureSimpleWebAuthnProfiles } from \"./configuration\";\nimport type { SimpleWebAuthnPasskeyProtocolOptions } from \"./models\";\n\ntype Protocol = Context.Service.Shape<typeof PasskeyProtocol>;\ntype Input<K extends keyof Protocol> = Parameters<Protocol[K]>[0];\nconst rejected = () => PasskeyProtocolRejected.make({});\nconst unavailable = () => PasskeyUnavailable.make({});\n\nconst unexpected = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(\n Effect.catchCause((cause): Effect.Effect<never, E | PasskeyUnavailable> =>\n Cause.hasDies(cause)\n ? reportAuthFailure(\"passkey-protocol\", cause).pipe(\n Effect.andThen(Effect.fail(unavailable())),\n )\n : Effect.failCause(cause),\n ),\n );\n\nconst maintained = <A>(call: () => Promise<A>) =>\n Effect.tryPromise(call).pipe(\n Effect.onError((cause) => reportAuthFailure(\"passkey-protocol\", cause)),\n Effect.mapError(unavailable),\n );\n\nconst parsed = <A>(call: () => A) => Effect.try({ try: call, catch: rejected });\n\nconst decode = <S extends Schema.Codec<unknown, unknown, never, never>>(\n schema: S,\n input: unknown,\n) =>\n // Maintained JSON/CBOR parsers and their map lookups return untyped wire data.\n // eslint-disable-next-line no-restricted-properties\n Schema.decodeUnknownEffect(schema)(input).pipe(Effect.mapError(rejected));\n\nconst capture = <S extends Schema.Codec<unknown, unknown, never, never>>(\n schema: S,\n input: S[\"Type\"],\n) => snapshotPasskey(schema, input).pipe(Effect.mapError(rejected));\n\nconst sameBytes = (left: Uint8Array, right: Uint8Array) =>\n left.length === right.length && left.every((byte, index) => byte === right[index]);\n\nconst binary = (minimum: number, maximum: number) =>\n Schema.String.check(\n Schema.isMaxLength(Math.ceil((maximum * 4) / 3)),\n Schema.makeFilter((value) => {\n const result = Encoding.decodeBase64Url(value);\n\n return (\n result._tag === \"Success\" &&\n result.success.length >= minimum &&\n result.success.length <= maximum &&\n Encoding.encodeBase64Url(result.success) === value\n );\n }),\n );\n\nconst bytes = Effect.fn(\"simpleWebAuthnBytes\")(function* (value: string) {\n const result = Encoding.decodeBase64Url(value);\n\n if (result._tag === \"Failure\") return yield* rejected();\n\n return new Uint8Array(result.success);\n});\n\nconst duration = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 300000 }));\n\nconst prepareAuthenticationInput = Schema.Struct({\n profile: PasskeyProfile,\n challenge: PasskeyChallenge,\n timeoutMillis: duration,\n allowedCredentials: Schema.Array(PasskeyDescriptor).check(Schema.isMaxLength(64)),\n});\n\nconst prepareRegistrationInput = Schema.Struct({\n profile: PasskeyProfile,\n challenge: PasskeyChallenge,\n timeoutMillis: duration,\n userHandle: PasskeyUserHandle,\n name: PasskeyLabel,\n displayName: PasskeyLabel,\n excludedCredentials: Schema.Array(PasskeyDescriptor).check(Schema.isMaxLength(64)),\n});\n\nconst authenticationInput = Schema.Struct({\n ceremony: PasskeyCeremony,\n credential: PasskeyCredential,\n response: PasskeyAssertion,\n});\n\nconst registrationInput = Schema.Struct({\n ceremony: PasskeyCeremony,\n response: PasskeyAttestation,\n});\n\nconst envelope = {\n id: PasskeyProtocolCredentialId,\n rawId: PasskeyProtocolCredentialId,\n type: Schema.Literal(\"public-key\"),\n};\n\nconst authenticationResponse = Schema.Struct({\n ...envelope,\n response: Schema.Struct({\n clientDataJSON: binary(1, 8192),\n authenticatorData: binary(37, 16384),\n signature: binary(1, 1024),\n userHandle: Schema.optionalKey(Schema.NullOr(PasskeyUserHandle)),\n }),\n});\n\nconst registrationResponse = Schema.Struct({\n ...envelope,\n response: Schema.Struct({ clientDataJSON: binary(1, 8192), attestationObject: binary(1, 65536) }),\n});\n\nconst clientData = Schema.Struct({\n type: Schema.String,\n challenge: PasskeyChallenge,\n origin: Schema.String.check(Schema.isMaxLength(2048)),\n crossOrigin: Schema.optionalKey(Schema.Boolean),\n topOrigin: Schema.optionalKey(Schema.Unknown),\n});\n\ntype CborData =\n | string\n | number\n | boolean\n | null\n | Uint8Array\n | ReadonlyArray<CborData>\n | ReadonlyMap<string | number, CborData>;\n\nconst cborLeaf = Schema.Union([\n Schema.String.check(Schema.isMaxLength(8192)),\n Schema.Number.check(Schema.isFinite()),\n Schema.Boolean,\n Schema.Null,\n Schema.Uint8Array.check(Schema.makeFilter((value) => value.length <= 16384)),\n]);\n\nconst cborValue = (depth: number): Schema.Codec<CborData> => {\n if (depth === 0) return cborLeaf;\n const child = cborValue(depth - 1);\n\n return Schema.Union([\n cborLeaf,\n Schema.Array(child).check(Schema.isMaxLength(64)),\n Schema.ReadonlyMap(\n Schema.Union([Schema.String.check(Schema.isMaxLength(128)), Schema.Int]),\n child,\n ).check(Schema.makeFilter((value) => value.size <= 32)),\n ]);\n};\n\nconst cborMap = Schema.ReadonlyMap(\n Schema.Union([Schema.String.check(Schema.isMaxLength(128)), Schema.Int]),\n cborValue(4),\n).check(Schema.makeFilter((value) => value.size <= 32));\n\nconst encodeCbor = (value: CborData) => {\n // The maintained encoder reads these Schema-validated Maps/arrays; its type\n // requires mutable collections although no mutation is performed.\n return isoCBOR.encode(value as Parameters<typeof isoCBOR.encode>[0]);\n};\n\nconst exactMap = Effect.fn(\"simpleWebAuthnExactMap\")(function* (input: Uint8Array, value: unknown) {\n const result = yield* decode(cborMap, value);\n const encoded = yield* parsed(() => encodeCbor(result));\n\n if (!sameBytes(input, encoded)) return yield* rejected();\n\n return result;\n});\n\nconst byteValue = (minimum: number, maximum: number) =>\n Schema.Uint8Array.check(\n Schema.makeFilter((value) => value.length >= minimum && value.length <= maximum),\n );\n\nconst fresh = Effect.fn(\"simpleWebAuthnFresh\")(function* (ceremony: PasskeyCeremony) {\n const now = DateTime.toEpochMillis(yield* DateTime.now);\n\n if (\n ceremony.issuedAtMillis > now ||\n now >= ceremony.expiresAtMillis ||\n now >= ceremony.requestBindingExpiresAtMillis ||\n ceremony.expiresAtMillis <= ceremony.issuedAtMillis\n )\n return yield* rejected();\n});\n\nconst checkClient = Effect.fn(\"simpleWebAuthnClientData\")(function* (\n value: string,\n ceremony: PasskeyCeremony,\n type: \"webauthn.create\" | \"webauthn.get\",\n) {\n const client = yield* decode(clientData, yield* parsed(() => decodeClientDataJSON(value)));\n\n if (\n client.type !== type ||\n client.challenge !== ceremony.challenge ||\n !ceremony.profile.origins.includes(client.origin) ||\n client.crossOrigin === true ||\n \"topOrigin\" in client\n )\n return yield* rejected();\n\n return client;\n});\n\nconst checkAuthenticator = Effect.fn(\"simpleWebAuthnAuthenticatorData\")(function* (\n original: Uint8Array,\n registration: boolean,\n profile: PasskeyProfile,\n) {\n if (\n original.length < 37 ||\n original.length > 16384 ||\n Boolean(original[32]! & 64) !== registration\n )\n return yield* rejected();\n let prefix = 37;\n\n if (registration) {\n if (original.length < 55) return yield* rejected();\n\n const length = new DataView(\n original.buffer,\n original.byteOffset,\n original.byteLength,\n ).getUint16(53, false);\n\n if (length < 1 || length > 1023 || original.length < 55 + length) return yield* rejected();\n prefix = 55 + length;\n }\n const result = yield* parsed(() => parseAuthenticatorData(new Uint8Array(original)));\n\n if (\n !result.flags.up ||\n (profile.userVerification === \"required\" && !result.flags.uv) ||\n (result.flags.bs && !result.flags.be) ||\n result.flags.at !== registration ||\n result.flags.flagsInt !== original[32]\n )\n return yield* rejected();\n yield* decode(PasskeyCounter, result.counter);\n const chunks: Uint8Array[] = [original.slice(0, prefix)];\n\n if (registration) {\n const id = yield* decode(byteValue(1, 1023), result.credentialID);\n const key = yield* decode(byteValue(1, 8192), result.credentialPublicKey);\n\n if (!sameBytes(id, original.slice(55, prefix))) return yield* rejected();\n chunks.push(key);\n }\n if (result.flags.ed) {\n const extension = yield* decode(byteValue(1, 16384), result.extensionsDataBuffer);\n\n yield* exactMap(\n extension,\n yield* parsed(() => isoCBOR.decodeFirst<unknown>(new Uint8Array(extension))),\n );\n chunks.push(extension);\n } else if (result.extensionsDataBuffer !== undefined) return yield* rejected();\n const length = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n\n if (length !== original.length) return yield* rejected();\n let offset = 0;\n\n for (const chunk of chunks) {\n if (!sameBytes(chunk, original.slice(offset, offset + chunk.length))) return yield* rejected();\n offset += chunk.length;\n }\n\n const rpHash = new Uint8Array(\n yield* maintained(() =>\n globalThis.crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(profile.rpId)),\n ),\n );\n\n if (!sameBytes(rpHash, original.slice(0, 32))) return yield* rejected();\n\n return result;\n});\n\nconst checkKey = Effect.fn(\"simpleWebAuthnPublicKey\")(function* (\n input: Uint8Array,\n allowed: ReadonlyArray<-7 | -257>,\n expected?: -7 | -257,\n) {\n const map = yield* exactMap(\n input,\n yield* parsed(() => decodeCredentialPublicKey(new Uint8Array(input))),\n );\n\n const algorithmId = yield* decode(Schema.Literals([-7, -257]), map.get(3));\n\n if (!allowed.includes(algorithmId) || (expected !== undefined && algorithmId !== expected))\n return yield* rejected();\n let jwk: JsonWebKey;\n let algorithm: EcKeyImportParams | RsaHashedImportParams;\n\n if (algorithmId === -7) {\n if (\n map.size !== 5 ||\n ![1, 3, -1, -2, -3].every((key) => map.has(key)) ||\n map.get(1) !== 2 ||\n map.get(-1) !== 1\n )\n return yield* rejected();\n const x = yield* decode(byteValue(32, 32), map.get(-2));\n const y = yield* decode(byteValue(32, 32), map.get(-3));\n\n jwk = {\n kty: \"EC\",\n crv: \"P-256\",\n x: Encoding.encodeBase64Url(x),\n y: Encoding.encodeBase64Url(y),\n ext: false,\n };\n algorithm = { name: \"ECDSA\", namedCurve: \"P-256\" };\n } else {\n if (map.size !== 4 || ![1, 3, -1, -2].every((key) => map.has(key)) || map.get(1) !== 3)\n return yield* rejected();\n const n = yield* decode(byteValue(256, 512), map.get(-1));\n const e = yield* decode(byteValue(1, 4), map.get(-2));\n const exponent = e.reduce((value, byte) => value * 256 + byte, 0);\n\n if (\n n[0]! < 128 ||\n (n[n.length - 1]! & 1) === 0 ||\n e[0] === 0 ||\n exponent < 3 ||\n exponent % 2 !== 1\n )\n return yield* rejected();\n jwk = {\n kty: \"RSA\",\n alg: \"RS256\",\n n: Encoding.encodeBase64Url(n),\n e: Encoding.encodeBase64Url(e),\n ext: false,\n };\n algorithm = { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" };\n }\n yield* maintained(() =>\n globalThis.crypto.subtle.importKey(\"jwk\", jwk, algorithm, false, [\"verify\"]),\n );\n\n return algorithmId;\n});\n\nexport const makeSimpleWebAuthnPasskeyProtocol = Effect.fn(\"makeSimpleWebAuthnPasskeyProtocol\")(\n function* (\n options: SimpleWebAuthnPasskeyProtocolOptions,\n ): Effect.fn.Return<Protocol, PasskeyConfigurationError> {\n const select = yield* captureSimpleWebAuthnProfiles(options);\n\n const prepareAuthentication = Effect.fn(\"SimpleWebAuthnPasskeyProtocol.prepareAuthentication\")(\n function* (input: Input<\"prepareAuthentication\">) {\n const fixed = yield* capture(prepareAuthenticationInput, input);\n const profile = yield* select(fixed.profile);\n const challenge = yield* bytes(fixed.challenge);\n\n const result = yield* maintained(() =>\n generateAuthenticationOptions({\n rpID: profile.rpId,\n challenge,\n timeout: fixed.timeoutMillis,\n userVerification: profile.userVerification,\n allowCredentials: fixed.allowedCredentials.map((value) => ({ ...value })),\n }),\n );\n\n const value = yield* decode(PasskeyAuthenticationOptions, {\n challenge: result.challenge,\n rpId: result.rpId,\n timeout: result.timeout,\n userVerification: result.userVerification,\n allowCredentials: result.allowCredentials ?? [],\n });\n\n if (\n !(yield* samePasskey(PasskeyAuthenticationOptions, value, {\n challenge: fixed.challenge,\n rpId: profile.rpId,\n timeout: fixed.timeoutMillis,\n userVerification: profile.userVerification,\n allowCredentials: fixed.allowedCredentials,\n }))\n )\n return yield* unavailable();\n\n return yield* capture(PasskeyAuthenticationOptions, value);\n },\n unexpected,\n );\n\n const prepareRegistration = Effect.fn(\"SimpleWebAuthnPasskeyProtocol.prepareRegistration\")(\n function* (input: Input<\"prepareRegistration\">) {\n const fixed = yield* capture(prepareRegistrationInput, input);\n const profile = yield* select(fixed.profile);\n\n const challenge = yield* bytes(fixed.challenge),\n userID = yield* bytes(fixed.userHandle);\n\n const result = yield* maintained(() =>\n generateRegistrationOptions({\n rpName: profile.rpName,\n rpID: profile.rpId,\n userName: fixed.name,\n userDisplayName: fixed.displayName,\n userID,\n challenge,\n timeout: fixed.timeoutMillis,\n attestationType: \"none\",\n supportedAlgorithmIDs: [...profile.algorithms],\n authenticatorSelection: {\n residentKey: profile.residentKey,\n userVerification: profile.userVerification,\n },\n excludeCredentials: fixed.excludedCredentials.map((value) => ({ ...value })),\n }),\n );\n\n const value = yield* decode(PasskeyRegistrationOptions, {\n challenge: result.challenge,\n rp: result.rp,\n user: result.user,\n pubKeyCredParams: result.pubKeyCredParams,\n timeout: result.timeout,\n attestation: result.attestation,\n authenticatorSelection: result.authenticatorSelection,\n excludeCredentials: result.excludeCredentials ?? [],\n });\n\n const expected = {\n challenge: fixed.challenge,\n rp: { id: profile.rpId, name: profile.rpName },\n user: { id: fixed.userHandle, name: fixed.name, displayName: fixed.displayName },\n pubKeyCredParams: profile.algorithms.map((alg) => ({ type: \"public-key\", alg })),\n timeout: fixed.timeoutMillis,\n attestation: \"none\",\n authenticatorSelection: {\n residentKey: profile.residentKey,\n userVerification: profile.userVerification,\n },\n excludeCredentials: fixed.excludedCredentials,\n };\n\n if (\n !(yield* samePasskey(\n PasskeyRegistrationOptions,\n value,\n yield* decode(PasskeyRegistrationOptions, expected),\n ))\n )\n return yield* unavailable();\n\n return yield* capture(PasskeyRegistrationOptions, value);\n },\n unexpected,\n );\n\n const verifyRegistration = Effect.fn(\"SimpleWebAuthnPasskeyProtocol.verifyRegistration\")(\n function* (input: Input<\"verifyRegistration\">) {\n const fixed = yield* capture(registrationInput, input),\n ceremony = fixed.ceremony;\n\n const profile = yield* select(ceremony.profile);\n\n if (\n (ceremony.purpose !== \"registration\" || ceremony.context._tag !== \"Registration\") &&\n (ceremony.purpose !== \"enrollment\" || ceremony.context._tag !== \"Enrollment\")\n )\n return yield* rejected();\n yield* fresh(ceremony);\n\n const wire = yield* decode(\n Schema.fromJsonString(registrationResponse),\n Redacted.value(fixed.response),\n );\n\n if (wire.id !== wire.rawId) return yield* rejected();\n\n const client = yield* checkClient(\n wire.response.clientDataJSON,\n ceremony,\n \"webauthn.create\",\n );\n\n const attestationBytes = yield* bytes(wire.response.attestationObject);\n\n const attestation = yield* exactMap(\n attestationBytes,\n yield* parsed(() => decodeAttestationObject(new Uint8Array(attestationBytes))),\n );\n\n if (\n attestation.size !== 3 ||\n attestation.get(\"fmt\") !== \"none\" ||\n !attestation.has(\"attStmt\") ||\n !attestation.has(\"authData\")\n )\n return yield* rejected();\n const statement = yield* decode(cborMap, attestation.get(\"attStmt\"));\n\n if (statement.size !== 0) return yield* rejected();\n const authenticatorBytes = yield* decode(byteValue(37, 16384), attestation.get(\"authData\"));\n const auth = yield* checkAuthenticator(authenticatorBytes, true, profile);\n const id = yield* decode(byteValue(1, 1023), auth.credentialID);\n const key = yield* decode(byteValue(1, 8192), auth.credentialPublicKey);\n\n if (Encoding.encodeBase64Url(id) !== wire.id) return yield* rejected();\n const algorithm = yield* checkKey(key, profile.algorithms);\n\n const result = yield* maintained(() =>\n verifyRegistrationResponse({\n response: { ...wire, clientExtensionResults: {} },\n expectedChallenge: ceremony.challenge,\n expectedOrigin: [...profile.origins],\n expectedRPID: profile.rpId,\n expectedType: \"webauthn.create\",\n requireUserPresence: true,\n requireUserVerification: profile.userVerification === \"required\",\n supportedAlgorithmIDs: [...profile.algorithms],\n }),\n );\n\n if (!result.verified || result.registrationInfo === undefined) return yield* rejected();\n const info = result.registrationInfo;\n\n if (\n info.fmt !== \"none\" ||\n info.origin !== client.origin ||\n info.rpID !== profile.rpId ||\n info.credential.id !== wire.id ||\n !sameBytes(info.credential.publicKey, key) ||\n info.credential.counter !== auth.counter ||\n info.userVerified !== auth.flags.uv ||\n (info.credentialDeviceType === \"multiDevice\") !== auth.flags.be ||\n info.credentialBackedUp !== auth.flags.bs\n )\n return yield* rejected();\n yield* fresh(ceremony);\n\n return yield* capture(\n PasskeyRegistrationVerified,\n yield* decode(PasskeyRegistrationVerified, {\n protocolCredentialId: info.credential.id,\n publicKey: Encoding.encodeBase64Url(info.credential.publicKey),\n algorithm,\n counter: info.credential.counter,\n userVerified: info.userVerified,\n backupEligible: info.credentialDeviceType === \"multiDevice\",\n backupState: info.credentialBackedUp,\n }),\n );\n },\n unexpected,\n );\n\n const verifyAuthentication = Effect.fn(\"SimpleWebAuthnPasskeyProtocol.verifyAuthentication\")(\n function* (input: Input<\"verifyAuthentication\">) {\n const fixed = yield* capture(authenticationInput, input),\n ceremony = fixed.ceremony,\n credential = fixed.credential;\n\n const profile = yield* select(ceremony.profile),\n original = yield* select(credential.profile);\n\n const contexts = {\n \"sign-in\": \"SignIn\",\n pending: \"Pending\",\n \"step-up\": \"StepUp\",\n action: \"Action\",\n } as const;\n\n if (\n ceremony.purpose === \"registration\" ||\n ceremony.purpose === \"enrollment\" ||\n contexts[ceremony.purpose] !== ceremony.context._tag ||\n !credential.active ||\n credential.rpId !== profile.rpId ||\n original.rpId !== profile.rpId ||\n !original.algorithms.includes(credential.algorithm) ||\n !profile.algorithms.includes(credential.algorithm)\n )\n return yield* rejected();\n yield* fresh(ceremony);\n\n const wire = yield* decode(\n Schema.fromJsonString(authenticationResponse),\n Redacted.value(fixed.response),\n );\n\n const userHandle = wire.response.userHandle ?? undefined;\n\n if (\n wire.id !== wire.rawId ||\n wire.id !== credential.protocolCredentialId ||\n (userHandle !== undefined && userHandle !== credential.userHandle) ||\n (ceremony.context._tag === \"SignIn\" && userHandle === undefined) ||\n (ceremony.allowedCredentials.length > 0 &&\n !ceremony.allowedCredentials.some((value) => value.id === wire.id))\n )\n return yield* rejected();\n const client = yield* checkClient(wire.response.clientDataJSON, ceremony, \"webauthn.get\");\n\n const auth = yield* checkAuthenticator(\n yield* bytes(wire.response.authenticatorData),\n false,\n profile,\n );\n\n if (\n auth.flags.be !== credential.backupEligible ||\n (!credential.backupEligible &&\n (credential.counter > 0 || auth.counter > 0) &&\n auth.counter <= credential.counter)\n )\n return yield* rejected();\n const publicKey = yield* bytes(credential.publicKey);\n\n yield* checkKey(publicKey, profile.algorithms, credential.algorithm);\n\n const result = yield* maintained(() =>\n verifyAuthenticationResponse({\n response: {\n ...wire,\n response: { ...wire.response, userHandle },\n clientExtensionResults: {},\n },\n expectedChallenge: ceremony.challenge,\n expectedOrigin: [...profile.origins],\n expectedRPID: profile.rpId,\n expectedType: \"webauthn.get\",\n requireUserVerification: profile.userVerification === \"required\",\n credential: {\n id: credential.protocolCredentialId,\n publicKey,\n counter: credential.backupEligible ? 0 : credential.counter,\n },\n }),\n );\n\n if (!result.verified) return yield* rejected();\n const info = result.authenticationInfo;\n\n if (\n info.credentialID !== wire.id ||\n info.origin !== client.origin ||\n info.rpID !== profile.rpId ||\n info.newCounter !== auth.counter ||\n info.userVerified !== auth.flags.uv ||\n (info.credentialDeviceType === \"multiDevice\") !== credential.backupEligible ||\n info.credentialBackedUp !== auth.flags.bs\n )\n return yield* rejected();\n yield* fresh(ceremony);\n\n return yield* capture(\n PasskeyAssertionVerified,\n yield* decode(PasskeyAssertionVerified, {\n protocolCredentialId: info.credentialID,\n ...(userHandle === undefined ? {} : { userHandle }),\n counter: info.newCounter,\n userVerified: info.userVerified,\n backupEligible: info.credentialDeviceType === \"multiDevice\",\n backupState: info.credentialBackedUp,\n }),\n );\n },\n unexpected,\n );\n\n return PasskeyProtocol.of({\n prepareAuthentication,\n prepareRegistration,\n verifyRegistration,\n verifyAuthentication,\n });\n },\n);\n\nexport const layerSimpleWebAuthnPasskeyProtocol = (\n options: SimpleWebAuthnPasskeyProtocolOptions,\n): Layer.Layer<PasskeyProtocol, PasskeyConfigurationError> =>\n Layer.effect(PasskeyProtocol, makeSimpleWebAuthnPasskeyProtocol(options));\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PasskeyUnavailable } from "./errors.mjs";
|
|
2
|
+
import { DateTime, Effect, Predicate, Schema } from "effect";
|
|
3
|
+
//#region src/passkey/snapshot.ts
|
|
4
|
+
const freezePasskey = (value) => {
|
|
5
|
+
if (!Predicate.isObjectOrArray(value) || Object.isFrozen(value)) return;
|
|
6
|
+
if (DateTime.isDateTime(value)) Object.freeze(DateTime.toPartsUtc(value));
|
|
7
|
+
for (const child of Object.values(value)) freezePasskey(child);
|
|
8
|
+
Object.freeze(value);
|
|
9
|
+
};
|
|
10
|
+
const snapshotPasskeySync = (schema, value) => {
|
|
11
|
+
try {
|
|
12
|
+
const codec = Schema.toCodecJson(Schema.toType(schema));
|
|
13
|
+
const result = Schema.decodeSync(codec)(Schema.encodeSync(codec)(value));
|
|
14
|
+
freezePasskey(result);
|
|
15
|
+
return result;
|
|
16
|
+
} catch {
|
|
17
|
+
throw PasskeyUnavailable.make({});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const snapshotPasskey = (schema, value) => Effect.try({
|
|
21
|
+
try: () => snapshotPasskeySync(schema, value),
|
|
22
|
+
catch: () => PasskeyUnavailable.make({})
|
|
23
|
+
});
|
|
24
|
+
const samePasskey = (schema, left, right) => Effect.gen(function* () {
|
|
25
|
+
const codec = Schema.fromJsonString(Schema.toCodecJson(Schema.toType(schema)));
|
|
26
|
+
return (yield* Schema.encodeEffect(codec)(left)) === (yield* Schema.encodeEffect(codec)(right));
|
|
27
|
+
}).pipe(Effect.mapError(() => PasskeyUnavailable.make({})));
|
|
28
|
+
//#endregion
|
|
29
|
+
export { freezePasskey, samePasskey, snapshotPasskey, snapshotPasskeySync };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=snapshot.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.mjs","names":[],"sources":["../../src/passkey/snapshot.ts"],"sourcesContent":["import { DateTime, Effect, Predicate, Schema } from \"effect\";\n\nimport { PasskeyUnavailable } from \"./errors\";\n\nexport const freezePasskey = (value: unknown): void => {\n if (!Predicate.isObjectOrArray(value) || Object.isFrozen(value)) return;\n if (DateTime.isDateTime(value)) Object.freeze(DateTime.toPartsUtc(value));\n for (const child of Object.values(value)) freezePasskey(child);\n Object.freeze(value);\n};\n\nexport const snapshotPasskeySync = <S extends Schema.Codec<unknown, unknown, never, never>>(\n schema: S,\n value: S[\"Type\"],\n): S[\"Type\"] => {\n try {\n const codec = Schema.toCodecJson(Schema.toType(schema));\n const result = Schema.decodeSync(codec)(Schema.encodeSync(codec)(value));\n\n freezePasskey(result);\n\n return result;\n } catch {\n throw PasskeyUnavailable.make({});\n }\n};\n\nexport const snapshotPasskey = <S extends Schema.Codec<unknown, unknown, never, never>>(\n schema: S,\n value: S[\"Type\"],\n) =>\n Effect.try({\n try: () => snapshotPasskeySync(schema, value),\n catch: () => PasskeyUnavailable.make({}),\n });\n\nexport const samePasskey = <S extends Schema.Codec<unknown, unknown, never, never>>(\n schema: S,\n left: S[\"Type\"],\n right: S[\"Type\"],\n) =>\n Effect.gen(function* () {\n const codec = Schema.fromJsonString(Schema.toCodecJson(Schema.toType(schema)));\n const a = yield* Schema.encodeEffect(codec)(left);\n const b = yield* Schema.encodeEffect(codec)(right);\n\n return a === b;\n }).pipe(Effect.mapError(() => PasskeyUnavailable.make({})));\n"],"mappings":";;;AAIA,MAAa,iBAAiB,UAAyB;CACrD,IAAI,CAAC,UAAU,gBAAgB,KAAK,KAAK,OAAO,SAAS,KAAK,GAAG;CACjE,IAAI,SAAS,WAAW,KAAK,GAAG,OAAO,OAAO,SAAS,WAAW,KAAK,CAAC;CACxE,KAAK,MAAM,SAAS,OAAO,OAAO,KAAK,GAAG,cAAc,KAAK;CAC7D,OAAO,OAAO,KAAK;AACrB;AAEA,MAAa,uBACX,QACA,UACc;CACd,IAAI;EACF,MAAM,QAAQ,OAAO,YAAY,OAAO,OAAO,MAAM,CAAC;EACtD,MAAM,SAAS,OAAO,WAAW,KAAK,CAAC,CAAC,OAAO,WAAW,KAAK,CAAC,CAAC,KAAK,CAAC;EAEvE,cAAc,MAAM;EAEpB,OAAO;CACT,QAAQ;EACN,MAAM,mBAAmB,KAAK,CAAC,CAAC;CAClC;AACF;AAEA,MAAa,mBACX,QACA,UAEA,OAAO,IAAI;CACT,WAAW,oBAAoB,QAAQ,KAAK;CAC5C,aAAa,mBAAmB,KAAK,CAAC,CAAC;AACzC,CAAC;AAEH,MAAa,eACX,QACA,MACA,UAEA,OAAO,IAAI,aAAa;CACtB,MAAM,QAAQ,OAAO,eAAe,OAAO,YAAY,OAAO,OAAO,MAAM,CAAC,CAAC;CAI7E,QAAO,OAHU,OAAO,aAAa,KAAK,CAAC,CAAC,IAAI,QAGnC,OAFI,OAAO,aAAa,KAAK,CAAC,CAAC,KAAK;AAGnD,CAAC,CAAC,CAAC,KAAK,OAAO,eAAe,mBAAmB,KAAK,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { makeOperation, operationGroup } from "../operations/operation.mjs";
|
|
2
|
+
import { PasskeyFailure, PasskeyMethodUnsupported, PasskeyRejected, PasskeyUnavailable } from "./errors.mjs";
|
|
3
|
+
import { PasskeyAuthenticationStarted, PasskeyBegin, PasskeyComplete, PasskeyTarget } from "./models.mjs";
|
|
4
|
+
import { snapshotPasskey } from "./snapshot.mjs";
|
|
5
|
+
import { makePasskeyCeremony, passkeyNoAmbient, passkeyUnexpected, readPasskeyCommit } from "./actions.mjs";
|
|
6
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
7
|
+
//#region src/passkey/stepUp.ts
|
|
8
|
+
const credential = Schema.RedactedFromValue(Schema.NonEmptyString.check(Schema.isMaxLength(16384)));
|
|
9
|
+
const makePasskeyStepUp = (moduleId, source, sessions) => {
|
|
10
|
+
const ceremony = makePasskeyCeremony(moduleId, source, "step-up");
|
|
11
|
+
const BeginInput = Schema.Struct({
|
|
12
|
+
...PasskeyBegin.fields,
|
|
13
|
+
stepUpCredential: credential
|
|
14
|
+
});
|
|
15
|
+
const CompleteInput = Schema.Struct({
|
|
16
|
+
...PasskeyComplete.fields,
|
|
17
|
+
stepUpCredential: credential,
|
|
18
|
+
sourceCredential: credential
|
|
19
|
+
});
|
|
20
|
+
const StepUp = Context.Service(`effect-auth/PasskeyStepUp/${moduleId.length}:${moduleId}`);
|
|
21
|
+
const layer = Layer.effect(StepUp, Effect.gen(function* () {
|
|
22
|
+
const runtime = yield* ceremony.make, stepUp = yield* sessions.SessionStepUp;
|
|
23
|
+
const services = yield* Effect.context();
|
|
24
|
+
const target = Effect.fn("PasskeyStepUp.target")(function* (invocation, token) {
|
|
25
|
+
if (invocation._tag !== "Authenticated") return yield* PasskeyRejected.make({});
|
|
26
|
+
const context = yield* stepUp.context(token).pipe(Effect.mapError((error) => error._tag === "HookDenied" ? error : error._tag === "SessionUnavailable" ? PasskeyUnavailable.make({}) : error._tag === "SessionCapabilityUnsupported" ? PasskeyMethodUnsupported.make({}) : PasskeyRejected.make({})));
|
|
27
|
+
if (context.revision.subjectId !== invocation.subjectId) return yield* PasskeyRejected.make({});
|
|
28
|
+
return yield* snapshotPasskey(PasskeyTarget, {
|
|
29
|
+
...context,
|
|
30
|
+
moduleId: sessions.moduleId,
|
|
31
|
+
kind: "session-step-up",
|
|
32
|
+
commandId: context.flowId
|
|
33
|
+
});
|
|
34
|
+
}, passkeyUnexpected);
|
|
35
|
+
return StepUp.of({
|
|
36
|
+
begin: Effect.fn("PasskeyStepUp.begin")(function* (invocation, input) {
|
|
37
|
+
input = yield* snapshotPasskey(Schema.toType(BeginInput), input);
|
|
38
|
+
yield* passkeyNoAmbient();
|
|
39
|
+
const fixed = yield* target(invocation, input.stepUpCredential), captured = yield* runtime.exclusions(input.profileId, fixed.revision.subjectId).pipe(Effect.provide(services));
|
|
40
|
+
return yield* runtime.beginAuthentication(input, {
|
|
41
|
+
_tag: "StepUp",
|
|
42
|
+
target: fixed
|
|
43
|
+
}, captured.credentials);
|
|
44
|
+
}, passkeyUnexpected),
|
|
45
|
+
complete: Effect.fn("PasskeyStepUp.complete")(function* (invocation, input) {
|
|
46
|
+
input = yield* snapshotPasskey(Schema.toType(CompleteInput), input);
|
|
47
|
+
yield* passkeyNoAmbient();
|
|
48
|
+
const fixed = yield* target(invocation, input.stepUpCredential);
|
|
49
|
+
const verified = yield* runtime.authentication(input, {
|
|
50
|
+
_tag: "StepUp",
|
|
51
|
+
target: fixed
|
|
52
|
+
}).pipe(Effect.provide(services), Effect.catchTag("PasskeyRejected", () => Effect.gen(function* () {
|
|
53
|
+
yield* readPasskeyCommit(yield* stepUp.rejectCredential(input.stepUpCredential).pipe(Effect.mapError(() => PasskeyUnavailable.make({}))));
|
|
54
|
+
return yield* PasskeyRejected.make({});
|
|
55
|
+
})));
|
|
56
|
+
const result = yield* readPasskeyCommit(yield* stepUp.prepareComplete({
|
|
57
|
+
sourceCredential: input.sourceCredential,
|
|
58
|
+
stepUpCredential: input.stepUpCredential,
|
|
59
|
+
additional: verified.evidence
|
|
60
|
+
}).pipe(Effect.mapError((error) => error._tag === "HookDenied" ? error : error._tag === "SessionUnavailable" ? PasskeyUnavailable.make({}) : error._tag === "SessionCapabilityUnsupported" ? PasskeyMethodUnsupported.make({}) : PasskeyRejected.make({}))));
|
|
61
|
+
return {
|
|
62
|
+
value: result.value,
|
|
63
|
+
credentialCommands: [...verified.credentialCommands, ...result.credentialCommands]
|
|
64
|
+
};
|
|
65
|
+
}, passkeyUnexpected)
|
|
66
|
+
});
|
|
67
|
+
}));
|
|
68
|
+
const Begin = makeOperation(`${moduleId}/passkey/step-up/begin`, {
|
|
69
|
+
payload: BeginInput,
|
|
70
|
+
success: PasskeyAuthenticationStarted,
|
|
71
|
+
error: PasskeyFailure,
|
|
72
|
+
exposure: "public",
|
|
73
|
+
access: "authenticated",
|
|
74
|
+
replay: "single-use",
|
|
75
|
+
credentials: true
|
|
76
|
+
});
|
|
77
|
+
const Complete = makeOperation(`${moduleId}/passkey/step-up/complete`, {
|
|
78
|
+
payload: CompleteInput,
|
|
79
|
+
success: sessions.Session,
|
|
80
|
+
error: PasskeyFailure,
|
|
81
|
+
exposure: "public",
|
|
82
|
+
access: "authenticated",
|
|
83
|
+
replay: "single-use",
|
|
84
|
+
credentials: true
|
|
85
|
+
});
|
|
86
|
+
return Object.freeze({
|
|
87
|
+
StepUp,
|
|
88
|
+
binding: ceremony.binding,
|
|
89
|
+
layer,
|
|
90
|
+
operations: Object.freeze({
|
|
91
|
+
Begin,
|
|
92
|
+
Complete
|
|
93
|
+
}),
|
|
94
|
+
group: operationGroup(Begin, Complete),
|
|
95
|
+
handlersLayer: Layer.mergeAll(Begin.credentialHandlerLayer((input, invocation) => Effect.flatMap(StepUp, (service) => service.begin(invocation, input))), Complete.credentialHandlerLayer((input, invocation) => Effect.flatMap(StepUp, (service) => service.complete(invocation, input))))
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
//#endregion
|
|
99
|
+
export { makePasskeyStepUp };
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=stepUp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepUp.mjs","names":[],"sources":["../../src/passkey/stepUp.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema, type Types } from \"effect\";\n\nimport type { AuthInvocation } from \"../operations/context\";\nimport type { AuthOperationResult } from \"../operations/credentials\";\nimport { makeOperation, operationGroup } from \"../operations/operation\";\nimport type { AuthenticationAuthority } from \"../sessions/AuthenticationAuthority\";\nimport type { makeSessionModule } from \"../sessions/module\";\nimport {\n passkeyUnexpected,\n makePasskeyCeremony,\n passkeyNoAmbient,\n readPasskeyCommit,\n} from \"./actions\";\nimport type { PasskeyConfigurationError } from \"./errors\";\nimport {\n PasskeyFailure,\n PasskeyMethodUnsupported,\n PasskeyRejected,\n PasskeyUnavailable,\n} from \"./errors\";\nimport {\n PasskeyAuthenticationStarted,\n PasskeyBegin,\n PasskeyComplete,\n PasskeyTarget,\n} from \"./models\";\nimport type { PasskeyCredentials } from \"./PasskeyCredentials\";\nimport type { PasskeyEnrollmentContext } from \"./PasskeyEnrollmentContext\";\nimport type { PasskeyMethodPolicy } from \"./policy\";\nimport { snapshotPasskey } from \"./snapshot\";\nconst credential = Schema.RedactedFromValue(Schema.NonEmptyString.check(Schema.isMaxLength(16384)));\n\nexport const makePasskeyStepUp = <\n const Id extends string,\n const SessionId extends string,\n Claims extends Schema.Codec<unknown, unknown, unknown, unknown>,\n>(\n moduleId: Id,\n source: Effect.Effect<PasskeyMethodPolicy, PasskeyConfigurationError>,\n sessions: ReturnType<typeof makeSessionModule<SessionId, Claims>>,\n) => {\n const ceremony = makePasskeyCeremony(moduleId, source, \"step-up\");\n const BeginInput = Schema.Struct({ ...PasskeyBegin.fields, stepUpCredential: credential });\n\n const CompleteInput = Schema.Struct({\n ...PasskeyComplete.fields,\n stepUpCredential: credential,\n sourceCredential: credential,\n });\n\n const StepUp = Context.Service<\n {\n readonly moduleId: Id;\n readonly kind: \"passkey-step-up\";\n readonly claims: Types.Invariant<Claims[\"Type\"]>;\n },\n {\n readonly begin: (\n invocation: AuthInvocation,\n input: typeof BeginInput.Type,\n ) => Effect.Effect<AuthOperationResult<PasskeyAuthenticationStarted>, PasskeyFailure>;\n readonly complete: (\n invocation: AuthInvocation,\n input: typeof CompleteInput.Type,\n ) => Effect.Effect<AuthOperationResult<typeof sessions.Session.Type>, PasskeyFailure>;\n }\n >(`effect-auth/PasskeyStepUp/${moduleId.length}:${moduleId}`);\n\n const layer = Layer.effect(\n StepUp,\n Effect.gen(function* () {\n const runtime = yield* ceremony.make,\n stepUp = yield* sessions.SessionStepUp;\n\n const services = yield* Effect.context<\n PasskeyCredentials | PasskeyEnrollmentContext | AuthenticationAuthority\n >();\n\n const target = Effect.fn(\"PasskeyStepUp.target\")(function* (\n invocation: AuthInvocation,\n token: typeof credential.Type,\n ) {\n if (invocation._tag !== \"Authenticated\") return yield* PasskeyRejected.make({});\n\n const context = yield* stepUp\n .context(token)\n .pipe(\n Effect.mapError((error) =>\n error._tag === \"HookDenied\"\n ? error\n : error._tag === \"SessionUnavailable\"\n ? PasskeyUnavailable.make({})\n : error._tag === \"SessionCapabilityUnsupported\"\n ? PasskeyMethodUnsupported.make({})\n : PasskeyRejected.make({}),\n ),\n );\n\n if (context.revision.subjectId !== invocation.subjectId)\n return yield* PasskeyRejected.make({});\n\n return yield* snapshotPasskey(PasskeyTarget, {\n ...context,\n moduleId: sessions.moduleId,\n kind: \"session-step-up\",\n commandId: context.flowId,\n });\n }, passkeyUnexpected);\n\n return StepUp.of({\n begin: Effect.fn(\"PasskeyStepUp.begin\")(function* (invocation, input) {\n input = yield* snapshotPasskey(Schema.toType(BeginInput), input);\n yield* passkeyNoAmbient();\n\n const fixed = yield* target(invocation, input.stepUpCredential),\n captured = yield* runtime\n .exclusions(input.profileId, fixed.revision.subjectId)\n .pipe(Effect.provide(services));\n\n return yield* runtime.beginAuthentication(\n input,\n { _tag: \"StepUp\", target: fixed },\n captured.credentials,\n );\n }, passkeyUnexpected),\n complete: Effect.fn(\"PasskeyStepUp.complete\")(function* (invocation, input) {\n input = yield* snapshotPasskey(Schema.toType(CompleteInput), input);\n yield* passkeyNoAmbient();\n const fixed = yield* target(invocation, input.stepUpCredential);\n\n const verified = yield* runtime\n .authentication(input, { _tag: \"StepUp\", target: fixed })\n .pipe(\n Effect.provide(services),\n Effect.catchTag(\"PasskeyRejected\", () =>\n Effect.gen(function* () {\n yield* readPasskeyCommit(\n yield* stepUp\n .rejectCredential(input.stepUpCredential)\n .pipe(Effect.mapError(() => PasskeyUnavailable.make({}))),\n );\n\n return yield* PasskeyRejected.make({});\n }),\n ),\n );\n\n const result = yield* readPasskeyCommit(\n yield* stepUp\n .prepareComplete({\n sourceCredential: input.sourceCredential,\n stepUpCredential: input.stepUpCredential,\n additional: verified.evidence,\n })\n .pipe(\n Effect.mapError((error) =>\n error._tag === \"HookDenied\"\n ? error\n : error._tag === \"SessionUnavailable\"\n ? PasskeyUnavailable.make({})\n : error._tag === \"SessionCapabilityUnsupported\"\n ? PasskeyMethodUnsupported.make({})\n : PasskeyRejected.make({}),\n ),\n ),\n );\n\n return {\n value: result.value,\n credentialCommands: [...verified.credentialCommands, ...result.credentialCommands],\n };\n }, passkeyUnexpected),\n });\n }),\n );\n\n const Begin = makeOperation(`${moduleId}/passkey/step-up/begin`, {\n payload: BeginInput,\n success: PasskeyAuthenticationStarted,\n error: PasskeyFailure,\n exposure: \"public\",\n access: \"authenticated\",\n replay: \"single-use\",\n credentials: true,\n });\n\n const Complete = makeOperation(`${moduleId}/passkey/step-up/complete`, {\n payload: CompleteInput,\n success: sessions.Session,\n error: PasskeyFailure,\n exposure: \"public\",\n access: \"authenticated\",\n replay: \"single-use\",\n credentials: true,\n });\n\n return Object.freeze({\n StepUp,\n binding: ceremony.binding,\n layer,\n operations: Object.freeze({ Begin, Complete }),\n group: operationGroup(Begin, Complete),\n handlersLayer: Layer.mergeAll(\n Begin.credentialHandlerLayer((input, invocation) =>\n Effect.flatMap(StepUp, (service) => service.begin(invocation, input)),\n ),\n Complete.credentialHandlerLayer((input, invocation) =>\n Effect.flatMap(StepUp, (service) => service.complete(invocation, input)),\n ),\n ),\n });\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PasswordCheckUnavailable } from "./errors.mjs";
|
|
2
|
+
import { Context, Effect, Redacted, Schema } from "effect";
|
|
3
|
+
//#region src/password/CompromisedPasswords.d.ts
|
|
4
|
+
/** Request-specific local screening hints. Never log these or implicitly send
|
|
5
|
+
* them to a remote breached-password service. Context is not authorization.
|
|
6
|
+
*/
|
|
7
|
+
declare const PasswordScreeningContext: Schema.Struct<{
|
|
8
|
+
readonly accountName: Schema.optionalKey<Schema.String>;
|
|
9
|
+
readonly serviceName: Schema.optionalKey<Schema.String>;
|
|
10
|
+
}>;
|
|
11
|
+
type PasswordScreeningContext = typeof PasswordScreeningContext.Type;
|
|
12
|
+
declare const PasswordScreening: Schema.Union<readonly [Schema.TaggedStruct<"Allowed", {}>, Schema.TaggedStruct<"Rejected", {
|
|
13
|
+
readonly reason: Schema.Literals<readonly ["compromised", "common", "contextual"]>;
|
|
14
|
+
}>]>;
|
|
15
|
+
type PasswordScreening = typeof PasswordScreening.Type;
|
|
16
|
+
declare const CompromisedPasswords_base: Context.ServiceClass<CompromisedPasswords, "effect-auth/CompromisedPasswords", {
|
|
17
|
+
readonly check: (password: Redacted.Redacted<string>, context: PasswordScreeningContext) => Effect.Effect<PasswordScreening, PasswordCheckUnavailable>;
|
|
18
|
+
}>;
|
|
19
|
+
/** Required consumer capability for new passwords. No implicit network call or
|
|
20
|
+
* permissive default. Remote adapters must explicitly document any disclosure.
|
|
21
|
+
* A common/compromised corpus and contextual rules belong to this capability.
|
|
22
|
+
*/
|
|
23
|
+
declare class CompromisedPasswords extends CompromisedPasswords_base {}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { CompromisedPasswords, PasswordScreening, PasswordScreeningContext };
|
|
26
|
+
//# sourceMappingURL=CompromisedPasswords.d.mts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Context, Schema } from "effect";
|
|
2
|
+
//#region src/password/CompromisedPasswords.ts
|
|
3
|
+
/** Request-specific local screening hints. Never log these or implicitly send
|
|
4
|
+
* them to a remote breached-password service. Context is not authorization.
|
|
5
|
+
*/
|
|
6
|
+
const PasswordScreeningContext = Schema.Struct({
|
|
7
|
+
accountName: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256))),
|
|
8
|
+
serviceName: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256)))
|
|
9
|
+
});
|
|
10
|
+
const PasswordScreening = Schema.Union([Schema.TaggedStruct("Allowed", {}), Schema.TaggedStruct("Rejected", { reason: Schema.Literals([
|
|
11
|
+
"compromised",
|
|
12
|
+
"common",
|
|
13
|
+
"contextual"
|
|
14
|
+
]) })]);
|
|
15
|
+
/** Required consumer capability for new passwords. No implicit network call or
|
|
16
|
+
* permissive default. Remote adapters must explicitly document any disclosure.
|
|
17
|
+
* A common/compromised corpus and contextual rules belong to this capability.
|
|
18
|
+
*/
|
|
19
|
+
var CompromisedPasswords = class extends Context.Service()("effect-auth/CompromisedPasswords") {};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { CompromisedPasswords, PasswordScreening, PasswordScreeningContext };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=CompromisedPasswords.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompromisedPasswords.mjs","names":[],"sources":["../../src/password/CompromisedPasswords.ts"],"sourcesContent":["import { Context, type Effect, Schema, type Redacted } from \"effect\";\n\nimport type { PasswordCheckUnavailable } from \"./errors\";\n\n/** Request-specific local screening hints. Never log these or implicitly send\n * them to a remote breached-password service. Context is not authorization.\n */\nexport const PasswordScreeningContext = Schema.Struct({\n accountName: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256))),\n serviceName: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256))),\n});\n\nexport type PasswordScreeningContext = typeof PasswordScreeningContext.Type;\n\nexport const PasswordScreening = Schema.Union([\n Schema.TaggedStruct(\"Allowed\", {}),\n Schema.TaggedStruct(\"Rejected\", {\n reason: Schema.Literals([\"compromised\", \"common\", \"contextual\"]),\n }),\n]);\n\nexport type PasswordScreening = typeof PasswordScreening.Type;\n\n/** Required consumer capability for new passwords. No implicit network call or\n * permissive default. Remote adapters must explicitly document any disclosure.\n * A common/compromised corpus and contextual rules belong to this capability.\n */\nexport class CompromisedPasswords extends Context.Service<\n CompromisedPasswords,\n {\n readonly check: (\n password: Redacted.Redacted<string>,\n context: PasswordScreeningContext,\n ) => Effect.Effect<PasswordScreening, PasswordCheckUnavailable>;\n }\n>()(\"effect-auth/CompromisedPasswords\") {}\n"],"mappings":";;;;;AAOA,MAAa,2BAA2B,OAAO,OAAO;CACpD,aAAa,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC,CAAC;CAC5E,aAAa,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC,CAAC;AAC9E,CAAC;AAID,MAAa,oBAAoB,OAAO,MAAM,CAC5C,OAAO,aAAa,WAAW,CAAC,CAAC,GACjC,OAAO,aAAa,YAAY,EAC9B,QAAQ,OAAO,SAAS;CAAC;CAAe;CAAU;AAAY,CAAC,EACjE,CAAC,CACH,CAAC;;;;;AAQD,IAAa,uBAAb,cAA0C,QAAQ,QAQhD,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NewPasswordRejected, PasswordCheckUnavailable, PasswordConfigurationError } from "./errors.mjs";
|
|
2
|
+
import { CompromisedPasswords, PasswordScreeningContext } from "./CompromisedPasswords.mjs";
|
|
3
|
+
import { PasswordNormalization, PasswordPolicy } from "./policy.mjs";
|
|
4
|
+
import { Context, Effect, Layer, Redacted } from "effect";
|
|
5
|
+
//#region src/password/NewPasswordCheck.d.ts
|
|
6
|
+
interface CheckedNewPassword {
|
|
7
|
+
readonly password: Redacted.Redacted<string>;
|
|
8
|
+
readonly normalization: PasswordNormalization;
|
|
9
|
+
}
|
|
10
|
+
declare const NewPasswordCheck_base: Context.ServiceClass<NewPasswordCheck, "effect-auth/NewPasswordCheck", {
|
|
11
|
+
readonly check: (password: Redacted.Redacted<string>, context?: PasswordScreeningContext) => Effect.Effect<CheckedNewPassword, NewPasswordRejected | PasswordCheckUnavailable>;
|
|
12
|
+
}>;
|
|
13
|
+
/** Apply only to new credentials. Persist normalization beside the verifier;
|
|
14
|
+
* login uses that stored mode, while legacy verification/rehash retains none.
|
|
15
|
+
*/
|
|
16
|
+
declare class NewPasswordCheck extends NewPasswordCheck_base {
|
|
17
|
+
static readonly layer: (input?: PasswordPolicy) => Layer.Layer<NewPasswordCheck, PasswordConfigurationError, CompromisedPasswords>;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { CheckedNewPassword, NewPasswordCheck };
|
|
21
|
+
//# sourceMappingURL=NewPasswordCheck.d.mts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { reportAuthFailure } from "../internal/diagnostics.mjs";
|
|
2
|
+
import { NewPasswordRejected, PasswordCheckUnavailable } from "./errors.mjs";
|
|
3
|
+
import { defaultPasswordPolicy, validatePasswordPolicy } from "./policy.mjs";
|
|
4
|
+
import { CompromisedPasswords, PasswordScreening, PasswordScreeningContext } from "./CompromisedPasswords.mjs";
|
|
5
|
+
import { Context, Effect, Layer, Redacted, Schema } from "effect";
|
|
6
|
+
//#region src/password/NewPasswordCheck.ts
|
|
7
|
+
/** Apply only to new credentials. Persist normalization beside the verifier;
|
|
8
|
+
* login uses that stored mode, while legacy verification/rehash retains none.
|
|
9
|
+
*/
|
|
10
|
+
var NewPasswordCheck = class NewPasswordCheck extends Context.Service()("effect-auth/NewPasswordCheck") {
|
|
11
|
+
static layer = (input = defaultPasswordPolicy) => {
|
|
12
|
+
const snapshot = { ...input };
|
|
13
|
+
return Layer.effect(this, Effect.gen(function* () {
|
|
14
|
+
const policy = yield* validatePasswordPolicy(snapshot);
|
|
15
|
+
const screening = (yield* CompromisedPasswords).check;
|
|
16
|
+
return NewPasswordCheck.of({ check: Effect.fn("NewPasswordCheck.check")(function* (password, context = {}) {
|
|
17
|
+
const checkedContext = Object.freeze(yield* Schema.decodeEffect(PasswordScreeningContext)(context).pipe(Effect.mapError(() => PasswordCheckUnavailable.make({}))));
|
|
18
|
+
const raw = Redacted.value(password);
|
|
19
|
+
yield* Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(policy.maximumBytes)))(raw).pipe(Effect.mapError(() => NewPasswordRejected.make({ reason: "too-long" })));
|
|
20
|
+
yield* Schema.decodeEffect(Schema.String.check(Schema.isPattern(/^[^\uD800-\uDFFF]*$/u)))(raw).pipe(Effect.mapError(() => NewPasswordRejected.make({ reason: "ill-formed" })));
|
|
21
|
+
const value = policy.normalization === "NFC" ? raw.normalize("NFC") : raw;
|
|
22
|
+
const length = [...value].length;
|
|
23
|
+
if (length < (policy.assurance === "single-factor" ? 15 : 8)) return yield* NewPasswordRejected.make({ reason: "too-short" });
|
|
24
|
+
if (length > policy.maximumCodePoints || new TextEncoder().encode(value).byteLength > policy.maximumBytes) return yield* NewPasswordRejected.make({ reason: "too-long" });
|
|
25
|
+
const normalized = Redacted.make(value);
|
|
26
|
+
const result = yield* Effect.suspend(() => screening(normalized, checkedContext)).pipe(Effect.flatMap(Schema.decodeEffect(PasswordScreening)), Effect.catchCause((cause) => reportAuthFailure("password-screening", cause).pipe(Effect.andThen(Effect.fail(PasswordCheckUnavailable.make({}))))));
|
|
27
|
+
if (result._tag === "Rejected") return yield* NewPasswordRejected.make({ reason: result.reason });
|
|
28
|
+
return Object.freeze({
|
|
29
|
+
password: normalized,
|
|
30
|
+
normalization: policy.normalization
|
|
31
|
+
});
|
|
32
|
+
}) });
|
|
33
|
+
}));
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
export { NewPasswordCheck };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=NewPasswordCheck.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewPasswordCheck.mjs","names":[],"sources":["../../src/password/NewPasswordCheck.ts"],"sourcesContent":["import { Context, Effect, Layer, Redacted, Schema } from \"effect\";\n\nimport { reportAuthFailure } from \"../internal/diagnostics\";\nimport {\n CompromisedPasswords,\n PasswordScreening,\n PasswordScreeningContext,\n} from \"./CompromisedPasswords\";\nimport { NewPasswordRejected, PasswordCheckUnavailable } from \"./errors\";\nimport {\n defaultPasswordPolicy,\n validatePasswordPolicy,\n type PasswordNormalization,\n type PasswordPolicy,\n} from \"./policy\";\n\nexport interface CheckedNewPassword {\n readonly password: Redacted.Redacted<string>;\n readonly normalization: PasswordNormalization;\n}\n\n/** Apply only to new credentials. Persist normalization beside the verifier;\n * login uses that stored mode, while legacy verification/rehash retains none.\n */\nexport class NewPasswordCheck extends Context.Service<\n NewPasswordCheck,\n {\n readonly check: (\n password: Redacted.Redacted<string>,\n context?: PasswordScreeningContext,\n ) => Effect.Effect<CheckedNewPassword, NewPasswordRejected | PasswordCheckUnavailable>;\n }\n>()(\"effect-auth/NewPasswordCheck\") {\n static readonly layer = (input: PasswordPolicy = defaultPasswordPolicy) => {\n const snapshot = { ...input };\n\n return Layer.effect(\n this,\n Effect.gen(function* () {\n const policy = yield* validatePasswordPolicy(snapshot);\n const screening = (yield* CompromisedPasswords).check;\n\n return NewPasswordCheck.of({\n check: Effect.fn(\"NewPasswordCheck.check\")(function* (password, context = {}) {\n const checkedContext = Object.freeze(\n yield* Schema.decodeEffect(PasswordScreeningContext)(context).pipe(\n Effect.mapError(() => PasswordCheckUnavailable.make({})),\n ),\n );\n\n const raw = Redacted.value(password);\n\n yield* Schema.decodeEffect(\n Schema.String.check(Schema.isMaxLength(policy.maximumBytes)),\n )(raw).pipe(Effect.mapError(() => NewPasswordRejected.make({ reason: \"too-long\" })));\n yield* Schema.decodeEffect(\n Schema.String.check(Schema.isPattern(/^[^\\uD800-\\uDFFF]*$/u)),\n )(raw).pipe(Effect.mapError(() => NewPasswordRejected.make({ reason: \"ill-formed\" })));\n const value = policy.normalization === \"NFC\" ? raw.normalize(\"NFC\") : raw;\n const length = [...value].length;\n\n if (length < (policy.assurance === \"single-factor\" ? 15 : 8))\n return yield* NewPasswordRejected.make({ reason: \"too-short\" });\n if (\n length > policy.maximumCodePoints ||\n new TextEncoder().encode(value).byteLength > policy.maximumBytes\n )\n return yield* NewPasswordRejected.make({ reason: \"too-long\" });\n const normalized = Redacted.make(value);\n\n const result = yield* Effect.suspend(() => screening(normalized, checkedContext)).pipe(\n Effect.flatMap(Schema.decodeEffect(PasswordScreening)),\n Effect.catchCause((cause) =>\n reportAuthFailure(\"password-screening\", cause).pipe(\n Effect.andThen(Effect.fail(PasswordCheckUnavailable.make({}))),\n ),\n ),\n );\n\n if (result._tag === \"Rejected\")\n return yield* NewPasswordRejected.make({ reason: result.reason });\n\n return Object.freeze({ password: normalized, normalization: policy.normalization });\n }),\n });\n }),\n );\n };\n}\n"],"mappings":";;;;;;;;;AAwBA,IAAa,mBAAb,MAAa,yBAAyB,QAAQ,QAQ5C,CAAC,CAAC,8BAA8B,CAAC,CAAC;CAClC,OAAgB,SAAS,QAAwB,0BAA0B;EACzE,MAAM,WAAW,EAAE,GAAG,MAAM;EAE5B,OAAO,MAAM,OACX,MACA,OAAO,IAAI,aAAa;GACtB,MAAM,SAAS,OAAO,uBAAuB,QAAQ;GACrD,MAAM,aAAa,OAAO,qBAAA,CAAsB;GAEhD,OAAO,iBAAiB,GAAG,EACzB,OAAO,OAAO,GAAG,wBAAwB,CAAC,CAAC,WAAW,UAAU,UAAU,CAAC,GAAG;IAC5E,MAAM,iBAAiB,OAAO,OAC5B,OAAO,OAAO,aAAa,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,KAC5D,OAAO,eAAe,yBAAyB,KAAK,CAAC,CAAC,CAAC,CACzD,CACF;IAEA,MAAM,MAAM,SAAS,MAAM,QAAQ;IAEnC,OAAO,OAAO,aACZ,OAAO,OAAO,MAAM,OAAO,YAAY,OAAO,YAAY,CAAC,CAC7D,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,OAAO,eAAe,oBAAoB,KAAK,EAAE,QAAQ,WAAW,CAAC,CAAC,CAAC;IACnF,OAAO,OAAO,aACZ,OAAO,OAAO,MAAM,OAAO,UAAU,sBAAsB,CAAC,CAC9D,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,OAAO,eAAe,oBAAoB,KAAK,EAAE,QAAQ,aAAa,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,OAAO,kBAAkB,QAAQ,IAAI,UAAU,KAAK,IAAI;IACtE,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC;IAE1B,IAAI,UAAU,OAAO,cAAc,kBAAkB,KAAK,IACxD,OAAO,OAAO,oBAAoB,KAAK,EAAE,QAAQ,YAAY,CAAC;IAChE,IACE,SAAS,OAAO,qBAChB,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,aAAa,OAAO,cAEpD,OAAO,OAAO,oBAAoB,KAAK,EAAE,QAAQ,WAAW,CAAC;IAC/D,MAAM,aAAa,SAAS,KAAK,KAAK;IAEtC,MAAM,SAAS,OAAO,OAAO,cAAc,UAAU,YAAY,cAAc,CAAC,CAAC,CAAC,KAChF,OAAO,QAAQ,OAAO,aAAa,iBAAiB,CAAC,GACrD,OAAO,YAAY,UACjB,kBAAkB,sBAAsB,KAAK,CAAC,CAAC,KAC7C,OAAO,QAAQ,OAAO,KAAK,yBAAyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/D,CACF,CACF;IAEA,IAAI,OAAO,SAAS,YAClB,OAAO,OAAO,oBAAoB,KAAK,EAAE,QAAQ,OAAO,OAAO,CAAC;IAElE,OAAO,OAAO,OAAO;KAAE,UAAU;KAAY,eAAe,OAAO;IAAc,CAAC;GACpF,CAAC,EACH,CAAC;EACH,CAAC,CACH;CACF;AACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PasswordConfigurationError, PasswordHashingUnavailable, PasswordInputInvalid, PasswordKdfBusy, PasswordVerifierInvalid } from "./errors.mjs";
|
|
2
|
+
import { PasswordHashingConfig } from "./configuration.mjs";
|
|
3
|
+
import { EncodedPasswordHash, PasswordVerification } from "./models.mjs";
|
|
4
|
+
import { PasswordKdfAdmission } from "./PasswordKdfAdmission.mjs";
|
|
5
|
+
import { Context, Crypto, Effect, Layer, Redacted } from "effect";
|
|
6
|
+
//#region src/password/PasswordHashing.d.ts
|
|
7
|
+
type HashFailure = PasswordHashingUnavailable | PasswordInputInvalid | PasswordKdfBusy;
|
|
8
|
+
declare const PasswordHashing_base: Context.ServiceClass<PasswordHashing, "effect-auth/PasswordHashing", {
|
|
9
|
+
readonly hash: (password: Redacted.Redacted<string>) => Effect.Effect<Redacted.Redacted<EncodedPasswordHash>, HashFailure>;
|
|
10
|
+
readonly verify: (password: Redacted.Redacted<string>, verifier: Redacted.Redacted<EncodedPasswordHash>) => Effect.Effect<PasswordVerification, HashFailure | PasswordVerifierInvalid>;
|
|
11
|
+
/** One current-cost derivation, including on the first unknown-identifier attempt. */
|
|
12
|
+
readonly dummy: (password: Redacted.Redacted<string>) => Effect.Effect<void, HashFailure>;
|
|
13
|
+
}>;
|
|
14
|
+
/** Byte-preserving KDF capability. Text normalization belongs to trusted credential
|
|
15
|
+
* provenance, never the algorithm identifier. Rehash legacy passwords with mode none.
|
|
16
|
+
* Replacements must retain admission until actual work completion, including native
|
|
17
|
+
* callbacks. Portable async KDFs yield microtasks; they are not off-thread workers.
|
|
18
|
+
*/
|
|
19
|
+
declare class PasswordHashing extends PasswordHashing_base {
|
|
20
|
+
static readonly portableLayer: (input?: PasswordHashingConfig) => Layer.Layer<PasswordHashing, PasswordConfigurationError, Crypto.Crypto | PasswordKdfAdmission>;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { PasswordHashing };
|
|
24
|
+
//# sourceMappingURL=PasswordHashing.d.mts.map
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { PasswordHashingUnavailable, PasswordInputInvalid } from "./errors.mjs";
|
|
2
|
+
import { EncodedPasswordHash } from "./models.mjs";
|
|
3
|
+
import { defaultPasswordHashingConfig, validatePasswordHashingConfig } from "./configuration.mjs";
|
|
4
|
+
import { parsePasswordHash, phcBase64 } from "./encoding.mjs";
|
|
5
|
+
import { PasswordKdfAdmission } from "./PasswordKdfAdmission.mjs";
|
|
6
|
+
import { Context, Crypto, Effect, Layer, Redacted, Schema } from "effect";
|
|
7
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
8
|
+
import { equalBytes } from "@noble/ciphers/utils.js";
|
|
9
|
+
import { argon2idAsync } from "@noble/hashes/argon2.js";
|
|
10
|
+
import { pbkdf2Async } from "@noble/hashes/pbkdf2.js";
|
|
11
|
+
//#region src/password/PasswordHashing.ts
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
/** Byte-preserving KDF capability. Text normalization belongs to trusted credential
|
|
14
|
+
* provenance, never the algorithm identifier. Rehash legacy passwords with mode none.
|
|
15
|
+
* Replacements must retain admission until actual work completion, including native
|
|
16
|
+
* callbacks. Portable async KDFs yield microtasks; they are not off-thread workers.
|
|
17
|
+
*/
|
|
18
|
+
var PasswordHashing = class PasswordHashing extends Context.Service()("effect-auth/PasswordHashing") {
|
|
19
|
+
static portableLayer = (input = defaultPasswordHashingConfig) => {
|
|
20
|
+
const snapshot = { ...input };
|
|
21
|
+
return Layer.effect(this, Effect.gen(function* () {
|
|
22
|
+
const config = yield* validatePasswordHashingConfig(snapshot);
|
|
23
|
+
const admission = yield* PasswordKdfAdmission;
|
|
24
|
+
const crypto = yield* Crypto.Crypto;
|
|
25
|
+
const passwordBytes = Effect.fn("PasswordHashing.passwordBytes")(function* (password) {
|
|
26
|
+
const value = Redacted.value(password);
|
|
27
|
+
yield* Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(config.maximumPasswordBytes)))(value).pipe(Effect.mapError(() => PasswordInputInvalid.make({ reason: "too-long" })));
|
|
28
|
+
const buffer = new Uint8Array(config.maximumPasswordBytes);
|
|
29
|
+
const encoded = encoder.encodeInto(value, buffer);
|
|
30
|
+
if (encoded.read !== value.length) {
|
|
31
|
+
buffer.fill(0);
|
|
32
|
+
return yield* PasswordInputInvalid.make({ reason: "too-long" });
|
|
33
|
+
}
|
|
34
|
+
return buffer.subarray(0, encoded.written);
|
|
35
|
+
});
|
|
36
|
+
const derive = (password, salt, memoryKiB, passes, parallelism, length) => Effect.tryPromise({
|
|
37
|
+
try: () => argon2idAsync(password, salt, {
|
|
38
|
+
m: memoryKiB,
|
|
39
|
+
t: passes,
|
|
40
|
+
p: parallelism,
|
|
41
|
+
version: 19,
|
|
42
|
+
dkLen: length,
|
|
43
|
+
maxmem: config.maximumMemoryKiB * 1024,
|
|
44
|
+
asyncTick: 10
|
|
45
|
+
}),
|
|
46
|
+
catch: () => PasswordHashingUnavailable.make({})
|
|
47
|
+
});
|
|
48
|
+
const withPassword = (password, prepare, body) => admission.run(Effect.gen(function* () {
|
|
49
|
+
const prepared = yield* prepare;
|
|
50
|
+
const bytes = yield* passwordBytes(password);
|
|
51
|
+
return yield* body(bytes, prepared).pipe(Effect.ensuring(Effect.sync(() => bytes.fill(0))));
|
|
52
|
+
}));
|
|
53
|
+
return PasswordHashing.of({
|
|
54
|
+
hash: (password) => withPassword(password, Effect.void, (bytes) => Effect.gen(function* () {
|
|
55
|
+
const salt = yield* crypto.randomBytes(16).pipe(Effect.mapError(() => PasswordHashingUnavailable.make({})));
|
|
56
|
+
const output = yield* derive(bytes, salt, config.memoryKiB, config.passes, config.parallelism, 32);
|
|
57
|
+
try {
|
|
58
|
+
return Redacted.make(EncodedPasswordHash.make(`$argon2id$v=19$m=${config.memoryKiB},t=${config.passes},p=${config.parallelism}$${phcBase64(salt)}$${phcBase64(output)}`));
|
|
59
|
+
} finally {
|
|
60
|
+
output.fill(0);
|
|
61
|
+
salt.fill(0);
|
|
62
|
+
}
|
|
63
|
+
})),
|
|
64
|
+
verify: (password, verifier) => withPassword(password, parsePasswordHash(Redacted.value(verifier), config), (bytes, parsed) => Effect.gen(function* () {
|
|
65
|
+
const output = yield* parsed._tag === "Argon2id" ? derive(bytes, parsed.salt, parsed.memoryKiB, parsed.passes, parsed.parallelism, parsed.expected.length) : Effect.tryPromise({
|
|
66
|
+
try: () => pbkdf2Async(sha256, bytes, parsed.salt, {
|
|
67
|
+
c: parsed.iterations,
|
|
68
|
+
dkLen: 32,
|
|
69
|
+
asyncTick: 10
|
|
70
|
+
}),
|
|
71
|
+
catch: () => PasswordHashingUnavailable.make({})
|
|
72
|
+
});
|
|
73
|
+
try {
|
|
74
|
+
const matches = equalBytes(output, parsed.expected);
|
|
75
|
+
const upgrade = parsed._tag === "LegacyPbkdf2" || parsed.memoryKiB < config.memoryKiB || parsed.passes < config.passes || parsed.salt.length < 16 || parsed.expected.length < 32;
|
|
76
|
+
return {
|
|
77
|
+
matches,
|
|
78
|
+
needsRehash: matches && upgrade
|
|
79
|
+
};
|
|
80
|
+
} finally {
|
|
81
|
+
output.fill(0);
|
|
82
|
+
parsed.expected.fill(0);
|
|
83
|
+
parsed.salt.fill(0);
|
|
84
|
+
}
|
|
85
|
+
})),
|
|
86
|
+
dummy: (password) => withPassword(password, Effect.void, (bytes) => derive(bytes, /* @__PURE__ */ new Uint8Array(16), config.memoryKiB, config.passes, config.parallelism, 32).pipe(Effect.flatMap((output) => Effect.sync(() => {
|
|
87
|
+
output.fill(0);
|
|
88
|
+
}))))
|
|
89
|
+
});
|
|
90
|
+
}));
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
//#endregion
|
|
94
|
+
export { PasswordHashing };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=PasswordHashing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordHashing.mjs","names":[],"sources":["../../src/password/PasswordHashing.ts"],"sourcesContent":["/* eslint-disable import/extensions -- Noble exposes these package subpaths only with the .js suffix. */\nimport { equalBytes } from \"@noble/ciphers/utils.js\";\nimport { argon2idAsync } from \"@noble/hashes/argon2.js\";\nimport { pbkdf2Async } from \"@noble/hashes/pbkdf2.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { Context, Crypto, Effect, Layer, Redacted, Schema } from \"effect\";\n\nimport {\n defaultPasswordHashingConfig,\n validatePasswordHashingConfig,\n type PasswordHashingConfig,\n} from \"./configuration\";\nimport { parsePasswordHash, phcBase64 } from \"./encoding\";\nimport {\n PasswordHashingUnavailable,\n PasswordInputInvalid,\n type PasswordKdfBusy,\n type PasswordVerifierInvalid,\n} from \"./errors\";\nimport { EncodedPasswordHash, type PasswordVerification } from \"./models\";\nimport { PasswordKdfAdmission } from \"./PasswordKdfAdmission\";\n\nconst encoder = new TextEncoder();\n\ntype HashFailure = PasswordHashingUnavailable | PasswordInputInvalid | PasswordKdfBusy;\n\n/** Byte-preserving KDF capability. Text normalization belongs to trusted credential\n * provenance, never the algorithm identifier. Rehash legacy passwords with mode none.\n * Replacements must retain admission until actual work completion, including native\n * callbacks. Portable async KDFs yield microtasks; they are not off-thread workers.\n */\nexport class PasswordHashing extends Context.Service<\n PasswordHashing,\n {\n readonly hash: (\n password: Redacted.Redacted<string>,\n ) => Effect.Effect<Redacted.Redacted<EncodedPasswordHash>, HashFailure>;\n readonly verify: (\n password: Redacted.Redacted<string>,\n verifier: Redacted.Redacted<EncodedPasswordHash>,\n ) => Effect.Effect<PasswordVerification, HashFailure | PasswordVerifierInvalid>;\n /** One current-cost derivation, including on the first unknown-identifier attempt. */\n readonly dummy: (password: Redacted.Redacted<string>) => Effect.Effect<void, HashFailure>;\n }\n>()(\"effect-auth/PasswordHashing\") {\n static readonly portableLayer = (input: PasswordHashingConfig = defaultPasswordHashingConfig) => {\n const snapshot = { ...input };\n\n return Layer.effect(\n this,\n Effect.gen(function* () {\n const config = yield* validatePasswordHashingConfig(snapshot);\n const admission = yield* PasswordKdfAdmission;\n const crypto = yield* Crypto.Crypto;\n\n const passwordBytes = Effect.fn(\"PasswordHashing.passwordBytes\")(function* (\n password: Redacted.Redacted<string>,\n ) {\n const value = Redacted.value(password);\n\n yield* Schema.decodeEffect(\n Schema.String.check(Schema.isMaxLength(config.maximumPasswordBytes)),\n )(value).pipe(Effect.mapError(() => PasswordInputInvalid.make({ reason: \"too-long\" })));\n const buffer = new Uint8Array(config.maximumPasswordBytes);\n const encoded = encoder.encodeInto(value, buffer);\n\n if (encoded.read !== value.length) {\n buffer.fill(0);\n\n return yield* PasswordInputInvalid.make({ reason: \"too-long\" });\n }\n\n return buffer.subarray(0, encoded.written);\n });\n\n const derive = (\n password: Uint8Array,\n salt: Uint8Array,\n memoryKiB: number,\n passes: number,\n parallelism: number,\n length: number,\n ) =>\n Effect.tryPromise({\n try: () =>\n argon2idAsync(password, salt, {\n m: memoryKiB,\n t: passes,\n p: parallelism,\n version: 19,\n dkLen: length,\n maxmem: config.maximumMemoryKiB * 1024,\n asyncTick: 10,\n }),\n catch: () => PasswordHashingUnavailable.make({}),\n });\n\n const withPassword = <A, E, P, E2>(\n password: Redacted.Redacted<string>,\n prepare: Effect.Effect<P, E2>,\n body: (bytes: Uint8Array, prepared: P) => Effect.Effect<A, E>,\n ) =>\n admission.run(\n Effect.gen(function* () {\n const prepared = yield* prepare;\n const bytes = yield* passwordBytes(password);\n\n return yield* body(bytes, prepared).pipe(\n Effect.ensuring(Effect.sync(() => bytes.fill(0))),\n );\n }),\n );\n\n return PasswordHashing.of({\n hash: (password) =>\n withPassword(password, Effect.void, (bytes) =>\n Effect.gen(function* () {\n const salt = yield* crypto\n .randomBytes(16)\n .pipe(Effect.mapError(() => PasswordHashingUnavailable.make({})));\n\n const output = yield* derive(\n bytes,\n salt,\n config.memoryKiB,\n config.passes,\n config.parallelism,\n 32,\n );\n\n try {\n return Redacted.make(\n EncodedPasswordHash.make(\n `$argon2id$v=19$m=${config.memoryKiB},t=${config.passes},p=${config.parallelism}$${phcBase64(salt)}$${phcBase64(output)}`,\n ),\n );\n } finally {\n output.fill(0);\n salt.fill(0);\n }\n }),\n ),\n verify: (password, verifier) =>\n withPassword(\n password,\n parsePasswordHash(Redacted.value(verifier), config),\n (bytes, parsed) =>\n Effect.gen(function* () {\n const output = yield* parsed._tag === \"Argon2id\"\n ? derive(\n bytes,\n parsed.salt,\n parsed.memoryKiB,\n parsed.passes,\n parsed.parallelism,\n parsed.expected.length,\n )\n : Effect.tryPromise({\n try: () =>\n pbkdf2Async(sha256, bytes, parsed.salt, {\n c: parsed.iterations,\n dkLen: 32,\n asyncTick: 10,\n }),\n catch: () => PasswordHashingUnavailable.make({}),\n });\n\n try {\n // Maintained fixed-length byte comparison; JavaScript/JIT gives no hard timing guarantee.\n const matches = equalBytes(output, parsed.expected);\n\n // Parallelism is a scheduling profile, not compensation for weak memory/passes.\n const upgrade =\n parsed._tag === \"LegacyPbkdf2\" ||\n parsed.memoryKiB < config.memoryKiB ||\n parsed.passes < config.passes ||\n parsed.salt.length < 16 ||\n parsed.expected.length < 32;\n\n return { matches, needsRehash: matches && upgrade };\n } finally {\n output.fill(0);\n parsed.expected.fill(0);\n parsed.salt.fill(0);\n }\n }),\n ),\n dummy: (password) =>\n withPassword(password, Effect.void, (bytes) =>\n derive(\n bytes,\n new Uint8Array(16),\n config.memoryKiB,\n config.passes,\n config.parallelism,\n 32,\n ).pipe(\n Effect.flatMap((output) =>\n Effect.sync(() => {\n output.fill(0);\n }),\n ),\n ),\n ),\n });\n }),\n );\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PasswordConfigurationError, PasswordKdfBusy } from "./errors.mjs";
|
|
2
|
+
import { Context, Effect, Layer } from "effect";
|
|
3
|
+
//#region src/password/PasswordKdfAdmission.d.ts
|
|
4
|
+
declare const PasswordKdfAdmission_base: Context.ServiceClass<PasswordKdfAdmission, "effect-auth/PasswordKdfAdmission", {
|
|
5
|
+
readonly run: <A, E, R>(work: Effect.Effect<A, E, R>) => Effect.Effect<A, E | PasswordKdfBusy, R>;
|
|
6
|
+
}>;
|
|
7
|
+
/** Share ONE Layer instance across hashers in a runtime. This bounds actual
|
|
8
|
+
* nonabortable work, not distributed guesses. Callbacks must finish only after
|
|
9
|
+
* their underlying computation finishes: an already-detached Promise is unsafe.
|
|
10
|
+
* Work includes allocation, derive, comparison and cleanup. No waiting queue.
|
|
11
|
+
*/
|
|
12
|
+
declare class PasswordKdfAdmission extends PasswordKdfAdmission_base {
|
|
13
|
+
static readonly layer: (options?: {
|
|
14
|
+
readonly concurrency: number;
|
|
15
|
+
}) => Layer.Layer<PasswordKdfAdmission, PasswordConfigurationError, never>;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { PasswordKdfAdmission };
|
|
19
|
+
//# sourceMappingURL=PasswordKdfAdmission.d.mts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { PasswordConfigurationError, PasswordKdfBusy } from "./errors.mjs";
|
|
2
|
+
import { Context, Effect, Layer, Option, Schema, Semaphore } from "effect";
|
|
3
|
+
//#region src/password/PasswordKdfAdmission.ts
|
|
4
|
+
/** Share ONE Layer instance across hashers in a runtime. This bounds actual
|
|
5
|
+
* nonabortable work, not distributed guesses. Callbacks must finish only after
|
|
6
|
+
* their underlying computation finishes: an already-detached Promise is unsafe.
|
|
7
|
+
* Work includes allocation, derive, comparison and cleanup. No waiting queue.
|
|
8
|
+
*/
|
|
9
|
+
var PasswordKdfAdmission = class PasswordKdfAdmission extends Context.Service()("effect-auth/PasswordKdfAdmission") {
|
|
10
|
+
static layer = (options = { concurrency: 1 }) => {
|
|
11
|
+
const concurrency = options.concurrency;
|
|
12
|
+
return Layer.effect(this, Effect.gen(function* () {
|
|
13
|
+
yield* Schema.decodeEffect(Schema.Int.check(Schema.isBetween({
|
|
14
|
+
minimum: 1,
|
|
15
|
+
maximum: 32
|
|
16
|
+
})))(concurrency).pipe(Effect.mapError(() => PasswordConfigurationError.make({ component: "admission" })));
|
|
17
|
+
const semaphore = yield* Semaphore.make(concurrency);
|
|
18
|
+
return PasswordKdfAdmission.of({ run: (work) => semaphore.withPermitsIfAvailable(1)(Effect.uninterruptible(work)).pipe(Effect.flatMap((result) => Option.isSome(result) ? Effect.succeed(result.value) : Effect.fail(PasswordKdfBusy.make({})))) });
|
|
19
|
+
}));
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { PasswordKdfAdmission };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=PasswordKdfAdmission.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordKdfAdmission.mjs","names":[],"sources":["../../src/password/PasswordKdfAdmission.ts"],"sourcesContent":["import { Context, Effect, Layer, Option, Schema, Semaphore } from \"effect\";\n\nimport { PasswordConfigurationError, PasswordKdfBusy } from \"./errors\";\n\n/** Share ONE Layer instance across hashers in a runtime. This bounds actual\n * nonabortable work, not distributed guesses. Callbacks must finish only after\n * their underlying computation finishes: an already-detached Promise is unsafe.\n * Work includes allocation, derive, comparison and cleanup. No waiting queue.\n */\nexport class PasswordKdfAdmission extends Context.Service<\n PasswordKdfAdmission,\n {\n readonly run: <A, E, R>(\n work: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | PasswordKdfBusy, R>;\n }\n>()(\"effect-auth/PasswordKdfAdmission\") {\n static readonly layer = (options: { readonly concurrency: number } = { concurrency: 1 }) => {\n const concurrency = options.concurrency;\n\n return Layer.effect(\n this,\n Effect.gen(function* () {\n yield* Schema.decodeEffect(Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 32 })))(\n concurrency,\n ).pipe(Effect.mapError(() => PasswordConfigurationError.make({ component: \"admission\" })));\n const semaphore = yield* Semaphore.make(concurrency);\n\n return PasswordKdfAdmission.of({\n run: <A, E, R>(work: Effect.Effect<A, E, R>) =>\n semaphore\n .withPermitsIfAvailable(1)(Effect.uninterruptible(work))\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(PasswordKdfBusy.make({})),\n ),\n ),\n });\n }),\n );\n };\n}\n"],"mappings":";;;;;;;;AASA,IAAa,uBAAb,MAAa,6BAA6B,QAAQ,QAOhD,CAAC,CAAC,kCAAkC,CAAC,CAAC;CACtC,OAAgB,SAAS,UAA4C,EAAE,aAAa,EAAE,MAAM;EAC1F,MAAM,cAAc,QAAQ;EAE5B,OAAO,MAAM,OACX,MACA,OAAO,IAAI,aAAa;GACtB,OAAO,OAAO,aAAa,OAAO,IAAI,MAAM,OAAO,UAAU;IAAE,SAAS;IAAG,SAAS;GAAG,CAAC,CAAC,CAAC,CAAC,CACzF,WACF,CAAC,CAAC,KAAK,OAAO,eAAe,2BAA2B,KAAK,EAAE,WAAW,YAAY,CAAC,CAAC,CAAC;GACzF,MAAM,YAAY,OAAO,UAAU,KAAK,WAAW;GAEnD,OAAO,qBAAqB,GAAG,EAC7B,MAAe,SACb,UACG,uBAAuB,CAAC,CAAC,CAAC,OAAO,gBAAgB,IAAI,CAAC,CAAC,CACvD,KACC,OAAO,SAAS,WACd,OAAO,OAAO,MAAM,IAChB,OAAO,QAAQ,OAAO,KAAK,IAC3B,OAAO,KAAK,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAC1C,CACF,EACN,CAAC;EACH,CAAC,CACH;CACF;AACF"}
|