@yielded/auth-persistence 0.1.0-beta.7
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/README.md +21 -0
- package/dist/Drizzle.d.mts +28 -0
- package/dist/Drizzle.mjs +28 -0
- package/dist/DrizzleD1.d.mts +963 -0
- package/dist/DrizzleD1.mjs +29 -0
- package/dist/DrizzleD1.mjs.map +1 -0
- package/dist/DrizzleLibsql.d.mts +2284 -0
- package/dist/DrizzleLibsql.mjs +92 -0
- package/dist/DrizzleLibsql.mjs.map +1 -0
- package/dist/DrizzleMysql2.d.mts +1820 -0
- package/dist/DrizzleMysql2.mjs +55 -0
- package/dist/DrizzleMysql2.mjs.map +1 -0
- package/dist/DrizzlePglite.d.mts +1826 -0
- package/dist/DrizzlePglite.mjs +53 -0
- package/dist/DrizzlePglite.mjs.map +1 -0
- package/dist/DrizzlePostgres.d.mts +1826 -0
- package/dist/DrizzlePostgres.mjs +53 -0
- package/dist/DrizzlePostgres.mjs.map +1 -0
- package/dist/DrizzleSqliteBun.d.mts +2279 -0
- package/dist/DrizzleSqliteBun.mjs +70 -0
- package/dist/DrizzleSqliteBun.mjs.map +1 -0
- package/dist/DrizzleSqliteDo.d.mts +2329 -0
- package/dist/DrizzleSqliteDo.mjs +105 -0
- package/dist/DrizzleSqliteDo.mjs.map +1 -0
- package/dist/DrizzleSqliteNode.d.mts +2279 -0
- package/dist/DrizzleSqliteNode.mjs +70 -0
- package/dist/DrizzleSqliteNode.mjs.map +1 -0
- package/dist/DrizzleSqliteWasm.d.mts +2282 -0
- package/dist/DrizzleSqliteWasm.mjs +70 -0
- package/dist/DrizzleSqliteWasm.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 +62 -0
- package/dist/drizzle/d1-emails.mjs +580 -0
- package/dist/drizzle/d1-emails.mjs.map +1 -0
- package/dist/drizzle/d1-generated-statement.d.mts +2 -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 +31 -0
- package/dist/drizzle/d1-identity.mjs +119 -0
- package/dist/drizzle/d1-identity.mjs.map +1 -0
- package/dist/drizzle/d1-oauth.d.mts +301 -0
- package/dist/drizzle/d1-oauth.mjs +76 -0
- package/dist/drizzle/d1-oauth.mjs.map +1 -0
- package/dist/drizzle/d1-passkey.d.mts +51 -0
- package/dist/drizzle/d1-passkey.mjs +95 -0
- package/dist/drizzle/d1-passkey.mjs.map +1 -0
- package/dist/drizzle/d1-password-prepared.d.mts +25 -0
- package/dist/drizzle/d1-password-prepared.mjs +461 -0
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -0
- package/dist/drizzle/d1-passwords.d.mts +87 -0
- package/dist/drizzle/d1-passwords.mjs +1004 -0
- package/dist/drizzle/d1-passwords.mjs.map +1 -0
- package/dist/drizzle/d1-phone.d.mts +26 -0
- package/dist/drizzle/d1-phone.mjs +30 -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 +80 -0
- package/dist/drizzle/d1-proofs.mjs +830 -0
- package/dist/drizzle/d1-proofs.mjs.map +1 -0
- package/dist/drizzle/d1-sessions.d.mts +67 -0
- package/dist/drizzle/d1-sessions.mjs +966 -0
- package/dist/drizzle/d1-sessions.mjs.map +1 -0
- package/dist/drizzle/d1-totp.d.mts +26 -0
- package/dist/drizzle/d1-totp.mjs +27 -0
- package/dist/drizzle/d1-totp.mjs.map +1 -0
- package/dist/drizzle/email-model.d.mts +354 -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 +30 -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 +4 -0
- package/dist/drizzle/email-sql.mjs +9 -0
- package/dist/drizzle/email-sql.mjs.map +1 -0
- package/dist/drizzle/email-target.d.mts +20 -0
- package/dist/drizzle/email-target.mjs +72 -0
- package/dist/drizzle/email-target.mjs.map +1 -0
- package/dist/drizzle/model.d.mts +250 -0
- package/dist/drizzle/model.mjs +58 -0
- package/dist/drizzle/model.mjs.map +1 -0
- package/dist/drizzle/mysql-emails.d.mts +71 -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 +22 -0
- package/dist/drizzle/mysql-identity.mjs +94 -0
- package/dist/drizzle/mysql-identity.mjs.map +1 -0
- package/dist/drizzle/mysql-password-prepared.d.mts +30 -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 +86 -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 +75 -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 +237 -0
- package/dist/drizzle/mysql-sessions.mjs +53 -0
- package/dist/drizzle/mysql-sessions.mjs.map +1 -0
- package/dist/drizzle/mysql.d.mts +70 -0
- package/dist/drizzle/mysql.mjs +218 -0
- package/dist/drizzle/mysql.mjs.map +1 -0
- package/dist/drizzle/oauth-accounts.mjs +358 -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 +76 -0
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-flow.mjs +247 -0
- package/dist/drizzle/oauth-connected-flow.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-input.mjs +103 -0
- package/dist/drizzle/oauth-connected-input.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-maintenance.mjs +214 -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 +14 -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 +753 -0
- package/dist/drizzle/oauth-connected-target.mjs +91 -0
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -0
- package/dist/drizzle/oauth-drivers.mjs +51 -0
- package/dist/drizzle/oauth-drivers.mjs.map +1 -0
- package/dist/drizzle/oauth-flow.d.mts +5 -0
- package/dist/drizzle/oauth-flow.mjs +253 -0
- package/dist/drizzle/oauth-flow.mjs.map +1 -0
- package/dist/drizzle/oauth-input.mjs +127 -0
- package/dist/drizzle/oauth-input.mjs.map +1 -0
- package/dist/drizzle/oauth-model.d.mts +463 -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 +6 -0
- package/dist/drizzle/oauth-registration.mjs +374 -0
- package/dist/drizzle/oauth-registration.mjs.map +1 -0
- package/dist/drizzle/oauth-state.mjs +107 -0
- package/dist/drizzle/oauth-state.mjs.map +1 -0
- package/dist/drizzle/oauth-target.d.mts +111 -0
- package/dist/drizzle/oauth-target.mjs +246 -0
- package/dist/drizzle/oauth-target.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-kernel.mjs +8 -0
- package/dist/drizzle/passkey-kernel.mjs.map +1 -0
- package/dist/drizzle/passkey-model.d.mts +272 -0
- package/dist/drizzle/passkey-model.mjs +34 -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-state.mjs +7 -0
- package/dist/drizzle/passkey-state.mjs.map +1 -0
- package/dist/drizzle/passkey-target.d.mts +9 -0
- package/dist/drizzle/passkey-target.mjs +7 -0
- package/dist/drizzle/passkey-target.mjs.map +1 -0
- package/dist/drizzle/passkey-write-drivers.mjs +32 -0
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -0
- package/dist/drizzle/passkey-write-model.d.mts +190 -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-target.d.mts +11 -0
- package/dist/drizzle/passkey-write-target.mjs +7 -0
- package/dist/drizzle/passkey-write-target.mjs.map +1 -0
- package/dist/drizzle/password-model.d.mts +329 -0
- package/dist/drizzle/password-model.mjs +23 -0
- package/dist/drizzle/password-model.mjs.map +1 -0
- package/dist/drizzle/password-prepared-model.d.mts +94 -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 +390 -0
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -0
- package/dist/drizzle/password-prepared-state.mjs +104 -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 +56 -0
- package/dist/drizzle/password-prepared-target.mjs.map +1 -0
- package/dist/drizzle/password-registration.d.mts +19 -0
- package/dist/drizzle/password-registration.mjs +135 -0
- package/dist/drizzle/password-registration.mjs.map +1 -0
- package/dist/drizzle/password-sql.d.mts +5 -0
- package/dist/drizzle/password-sql.mjs +9 -0
- package/dist/drizzle/password-sql.mjs.map +1 -0
- package/dist/drizzle/password-target.d.mts +17 -0
- package/dist/drizzle/password-target.mjs +61 -0
- package/dist/drizzle/password-target.mjs.map +1 -0
- package/dist/drizzle/pg-emails.d.mts +72 -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 +31 -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 +87 -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 +76 -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 +238 -0
- package/dist/drizzle/pg-sessions.mjs +53 -0
- package/dist/drizzle/pg-sessions.mjs.map +1 -0
- package/dist/drizzle/pg.d.mts +81 -0
- package/dist/drizzle/pg.mjs +290 -0
- package/dist/drizzle/pg.mjs.map +1 -0
- package/dist/drizzle/phone-model.d.mts +115 -0
- package/dist/drizzle/phone-model.mjs +39 -0
- package/dist/drizzle/phone-model.mjs.map +1 -0
- package/dist/drizzle/phone-state.mjs +16 -0
- package/dist/drizzle/phone-state.mjs.map +1 -0
- package/dist/drizzle/phone-target.d.mts +17 -0
- package/dist/drizzle/phone-target.mjs +170 -0
- package/dist/drizzle/phone-target.mjs.map +1 -0
- package/dist/drizzle/proof-model.d.mts +286 -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 +4 -0
- package/dist/drizzle/proof-sql.mjs +8 -0
- package/dist/drizzle/proof-sql.mjs.map +1 -0
- package/dist/drizzle/proof-target.d.mts +12 -0
- package/dist/drizzle/proof-target.mjs +36 -0
- package/dist/drizzle/proof-target.mjs.map +1 -0
- package/dist/drizzle/query-operations.mjs +26 -0
- package/dist/drizzle/query-operations.mjs.map +1 -0
- package/dist/drizzle/session-model.d.mts +200 -0
- package/dist/drizzle/session-model.mjs +20 -0
- package/dist/drizzle/session-model.mjs.map +1 -0
- package/dist/drizzle/session-sql.mjs +8 -0
- package/dist/drizzle/session-sql.mjs.map +1 -0
- package/dist/drizzle/session-target.d.mts +28 -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 +91 -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 +78 -0
- package/dist/drizzle/sqlite.mjs +217 -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 +32 -0
- package/dist/drizzle/step-up-state.mjs.map +1 -0
- package/dist/drizzle/totp-model.d.mts +84 -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 +38 -0
- package/dist/drizzle/totp-state.mjs +287 -0
- package/dist/drizzle/totp-state.mjs.map +1 -0
- package/dist/drizzle/totp-target.d.mts +17 -0
- package/dist/drizzle/totp-target.mjs +81 -0
- package/dist/drizzle/totp-target.mjs.map +1 -0
- package/dist/drizzle/transaction-execution.d.mts +4 -0
- package/dist/drizzle/transaction-execution.mjs +11 -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 +2 -0
- package/dist/drizzle/transaction-owner.mjs +8 -0
- package/dist/drizzle/transaction-owner.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +5 -0
- package/dist/internal/configuration.d.mts +174 -0
- package/dist/internal/configuration.mjs +7 -0
- package/dist/internal/configuration.mjs.map +1 -0
- package/dist/internal/drizzle-migrations.mjs +19 -0
- package/dist/internal/drizzle-migrations.mjs.map +1 -0
- package/dist/internal/drizzle-postgres.mjs +39 -0
- package/dist/internal/drizzle-postgres.mjs.map +1 -0
- package/dist/internal/drizzle-sqlite.mjs +37 -0
- package/dist/internal/drizzle-sqlite.mjs.map +1 -0
- package/dist/internal/email-kernel.d.mts +13 -0
- package/dist/internal/email-kernel.mjs +487 -0
- package/dist/internal/email-kernel.mjs.map +1 -0
- package/dist/internal/mapping-error.d.mts +11 -0
- package/dist/internal/mapping-error.mjs +30 -0
- package/dist/internal/mapping-error.mjs.map +1 -0
- package/dist/internal/passkey/admission.d.mts +7 -0
- package/dist/internal/passkey/admission.mjs +216 -0
- package/dist/internal/passkey/admission.mjs.map +1 -0
- package/dist/internal/passkey/credentials.d.mts +6 -0
- package/dist/internal/passkey/credentials.mjs +249 -0
- package/dist/internal/passkey/credentials.mjs.map +1 -0
- package/dist/internal/passkey/enrollment.mjs +138 -0
- package/dist/internal/passkey/enrollment.mjs.map +1 -0
- package/dist/internal/passkey/flow.d.mts +10 -0
- package/dist/internal/passkey/flow.mjs +452 -0
- package/dist/internal/passkey/flow.mjs.map +1 -0
- package/dist/internal/passkey/management.mjs +231 -0
- package/dist/internal/passkey/management.mjs.map +1 -0
- package/dist/internal/passkey/registration-ceremony.d.mts +9 -0
- package/dist/internal/passkey/registration-ceremony.mjs +129 -0
- package/dist/internal/passkey/registration-ceremony.mjs.map +1 -0
- package/dist/internal/passkey/registration-custody.d.mts +2 -0
- package/dist/internal/passkey/registration-custody.mjs +52 -0
- package/dist/internal/passkey/registration-custody.mjs.map +1 -0
- package/dist/internal/passkey/registration-write.mjs +211 -0
- package/dist/internal/passkey/registration-write.mjs.map +1 -0
- package/dist/internal/passkey/state.d.mts +5 -0
- package/dist/internal/passkey/state.mjs +234 -0
- package/dist/internal/passkey/state.mjs.map +1 -0
- package/dist/internal/passkey/target.d.mts +19 -0
- package/dist/internal/passkey/target.mjs +190 -0
- package/dist/internal/passkey/target.mjs.map +1 -0
- package/dist/internal/passkey/write-state.mjs +345 -0
- package/dist/internal/passkey/write-state.mjs.map +1 -0
- package/dist/internal/passkey/write-target.mjs +192 -0
- package/dist/internal/passkey/write-target.mjs.map +1 -0
- package/dist/internal/passkey-kernel.mjs +49 -0
- package/dist/internal/passkey-kernel.mjs.map +1 -0
- package/dist/internal/passkeys.mjs +367 -0
- package/dist/internal/passkeys.mjs.map +1 -0
- package/dist/internal/password-kernel.d.mts +13 -0
- package/dist/internal/password-kernel.mjs +704 -0
- package/dist/internal/password-kernel.mjs.map +1 -0
- package/dist/internal/persistence.mjs +289 -0
- package/dist/internal/persistence.mjs.map +1 -0
- package/dist/internal/phone-kernel.mjs +434 -0
- package/dist/internal/phone-kernel.mjs.map +1 -0
- package/dist/internal/proof-kernel.d.mts +9 -0
- package/dist/internal/proof-kernel.mjs +619 -0
- package/dist/internal/proof-kernel.mjs.map +1 -0
- package/dist/internal/query-operations.d.mts +3 -0
- package/dist/internal/registration.mjs +65 -0
- package/dist/internal/registration.mjs.map +1 -0
- package/dist/internal/session-kernel.mjs +737 -0
- package/dist/internal/session-kernel.mjs.map +1 -0
- package/dist/internal/sql-persistence.d.mts +11 -0
- package/dist/internal/sql-persistence.mjs +37 -0
- package/dist/internal/sql-persistence.mjs.map +1 -0
- package/dist/internal/sql-query.mjs +207 -0
- package/dist/internal/sql-query.mjs.map +1 -0
- package/dist/internal/sql-table.d.mts +37 -0
- package/dist/internal/sql-table.mjs +71 -0
- package/dist/internal/sql-table.mjs.map +1 -0
- package/dist/internal/storage-mapping.mjs +687 -0
- package/dist/internal/storage-mapping.mjs.map +1 -0
- package/dist/internal/storage-tables.d.mts +914 -0
- package/dist/internal/storage-tables.mjs +387 -0
- package/dist/internal/storage-tables.mjs.map +1 -0
- package/dist/internal/storage-validation.mjs +58 -0
- package/dist/internal/storage-validation.mjs.map +1 -0
- package/dist/internal/transaction-execution-kernel.d.mts +18 -0
- package/dist/internal/transaction-execution-kernel.mjs +118 -0
- package/dist/internal/transaction-execution-kernel.mjs.map +1 -0
- package/dist/internal/transaction-kernel.d.mts +7 -0
- package/dist/internal/transaction-kernel.mjs +260 -0
- package/dist/internal/transaction-kernel.mjs.map +1 -0
- package/package.json +1 -0
- package/src/Drizzle.ts +378 -0
- package/src/DrizzleD1.ts +136 -0
- package/src/DrizzleLibsql.ts +301 -0
- package/src/DrizzleMysql2.ts +184 -0
- package/src/DrizzlePglite.ts +174 -0
- package/src/DrizzlePostgres.ts +174 -0
- package/src/DrizzleSqliteBun.ts +258 -0
- package/src/DrizzleSqliteDo.ts +473 -0
- package/src/DrizzleSqliteNode.ts +259 -0
- package/src/DrizzleSqliteWasm.ts +263 -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 +1829 -0
- package/src/drizzle/d1-generated-statement.ts +129 -0
- package/src/drizzle/d1-identity.ts +375 -0
- package/src/drizzle/d1-oauth.ts +340 -0
- package/src/drizzle/d1-passkey.ts +373 -0
- package/src/drizzle/d1-password-prepared.ts +1270 -0
- package/src/drizzle/d1-passwords.ts +2656 -0
- package/src/drizzle/d1-phone.ts +96 -0
- package/src/drizzle/d1-planning.ts +104 -0
- package/src/drizzle/d1-proofs.ts +2305 -0
- package/src/drizzle/d1-sessions.ts +2857 -0
- package/src/drizzle/d1-totp.ts +78 -0
- package/src/drizzle/email-model.ts +516 -0
- package/src/drizzle/email-registration.ts +698 -0
- package/src/drizzle/email-sql.ts +24 -0
- package/src/drizzle/email-target.ts +243 -0
- package/src/drizzle/model.ts +463 -0
- package/src/drizzle/mysql-emails.ts +321 -0
- package/src/drizzle/mysql-identity.ts +324 -0
- package/src/drizzle/mysql-password-prepared.ts +204 -0
- package/src/drizzle/mysql-passwords.ts +339 -0
- package/src/drizzle/mysql-proofs.ts +181 -0
- package/src/drizzle/mysql-sessions.ts +741 -0
- package/src/drizzle/mysql.ts +687 -0
- package/src/drizzle/oauth-accounts.ts +804 -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 +465 -0
- package/src/drizzle/oauth-connected-flow.ts +441 -0
- package/src/drizzle/oauth-connected-input.ts +127 -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 +845 -0
- package/src/drizzle/oauth-connected-target.ts +264 -0
- package/src/drizzle/oauth-drivers.ts +569 -0
- package/src/drizzle/oauth-flow.ts +462 -0
- package/src/drizzle/oauth-input.ts +201 -0
- package/src/drizzle/oauth-model.ts +617 -0
- package/src/drizzle/oauth-mysql.ts +10 -0
- package/src/drizzle/oauth-owner.ts +29 -0
- package/src/drizzle/oauth-registration.ts +640 -0
- package/src/drizzle/oauth-state.ts +215 -0
- package/src/drizzle/oauth-target.ts +750 -0
- package/src/drizzle/passkey-drivers.ts +385 -0
- package/src/drizzle/passkey-kernel.ts +3 -0
- package/src/drizzle/passkey-model.ts +353 -0
- package/src/drizzle/passkey-registration-ceremony-model.ts +69 -0
- package/src/drizzle/passkey-state.ts +3 -0
- package/src/drizzle/passkey-target.ts +23 -0
- package/src/drizzle/passkey-write-drivers.ts +395 -0
- package/src/drizzle/passkey-write-model.ts +271 -0
- package/src/drizzle/passkey-write-target.ts +9 -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 +1191 -0
- package/src/drizzle/password-prepared-state.ts +231 -0
- package/src/drizzle/password-prepared-target.ts +160 -0
- package/src/drizzle/password-registration.ts +374 -0
- package/src/drizzle/password-sql.ts +12 -0
- package/src/drizzle/password-target.ts +224 -0
- package/src/drizzle/pg-emails.ts +321 -0
- package/src/drizzle/pg-password-prepared.ts +205 -0
- package/src/drizzle/pg-passwords.ts +338 -0
- package/src/drizzle/pg-proofs.ts +191 -0
- package/src/drizzle/pg-sessions.ts +750 -0
- package/src/drizzle/pg.ts +984 -0
- package/src/drizzle/phone-model.ts +190 -0
- package/src/drizzle/phone-state.ts +21 -0
- package/src/drizzle/phone-target.ts +472 -0
- package/src/drizzle/proof-model.ts +398 -0
- package/src/drizzle/proof-sql.ts +9 -0
- package/src/drizzle/proof-target.ts +122 -0
- package/src/drizzle/query-operations.ts +37 -0
- package/src/drizzle/session-model.ts +370 -0
- package/src/drizzle/session-sql.ts +13 -0
- package/src/drizzle/session-target.ts +338 -0
- package/src/drizzle/sqlite-emails.ts +366 -0
- package/src/drizzle/sqlite-identity.ts +344 -0
- package/src/drizzle/sqlite-password-prepared.ts +260 -0
- package/src/drizzle/sqlite-passwords.ts +497 -0
- package/src/drizzle/sqlite-proofs.ts +202 -0
- package/src/drizzle/sqlite-sessions.ts +971 -0
- package/src/drizzle/sqlite.ts +705 -0
- package/src/drizzle/standalone-guard.ts +38 -0
- package/src/drizzle/step-up-model.ts +128 -0
- package/src/drizzle/step-up-state.ts +139 -0
- package/src/drizzle/totp-model.ts +92 -0
- package/src/drizzle/totp-state.ts +525 -0
- package/src/drizzle/totp-target.ts +308 -0
- package/src/drizzle/transaction-execution.ts +12 -0
- package/src/drizzle/transaction-mysql.ts +104 -0
- package/src/drizzle/transaction-owner.ts +10 -0
- package/src/index.ts +4 -0
- package/src/internal/configuration.ts +282 -0
- package/src/internal/drizzle-migrations.ts +30 -0
- package/src/internal/drizzle-postgres.ts +81 -0
- package/src/internal/drizzle-sqlite.ts +79 -0
- package/src/internal/email-kernel.ts +1532 -0
- package/src/internal/mapping-error.ts +36 -0
- package/src/internal/passkey/admission.ts +362 -0
- package/src/internal/passkey/credentials.ts +511 -0
- package/src/internal/passkey/enrollment.ts +326 -0
- package/src/internal/passkey/flow.ts +1062 -0
- package/src/internal/passkey/management.ts +422 -0
- package/src/internal/passkey/registration-ceremony.ts +283 -0
- package/src/internal/passkey/registration-custody.ts +91 -0
- package/src/internal/passkey/registration-write.ts +426 -0
- package/src/internal/passkey/state.ts +354 -0
- package/src/internal/passkey/target.ts +586 -0
- package/src/internal/passkey/write-state.ts +681 -0
- package/src/internal/passkey/write-target.ts +452 -0
- package/src/internal/passkey-kernel.ts +102 -0
- package/src/internal/passkeys.ts +597 -0
- package/src/internal/password-kernel.ts +2122 -0
- package/src/internal/persistence.ts +590 -0
- package/src/internal/phone-kernel.ts +843 -0
- package/src/internal/proof-kernel.ts +1949 -0
- package/src/internal/query-operations.ts +26 -0
- package/src/internal/registration.ts +160 -0
- package/src/internal/session-kernel.ts +2210 -0
- package/src/internal/sql-persistence.ts +45 -0
- package/src/internal/sql-query.ts +298 -0
- package/src/internal/sql-table.ts +89 -0
- package/src/internal/storage-mapping.ts +706 -0
- package/src/internal/storage-tables.ts +408 -0
- package/src/internal/storage-validation.ts +117 -0
- package/src/internal/transaction-execution-kernel.ts +317 -0
- package/src/internal/transaction-kernel.ts +582 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Context, Effect, Option, Predicate } from "effect";
|
|
2
|
+
import type * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
3
|
+
|
|
4
|
+
type TransactionService = Context.Key<
|
|
5
|
+
SqlClient.TransactionConnection,
|
|
6
|
+
SqlClient.TransactionConnection.Service
|
|
7
|
+
>;
|
|
8
|
+
|
|
9
|
+
const transactionService = (database: unknown): TransactionService | undefined => {
|
|
10
|
+
if (
|
|
11
|
+
!Predicate.hasProperty(database, "$client") ||
|
|
12
|
+
!Predicate.hasProperty(database.$client, "transactionService") ||
|
|
13
|
+
!Context.isKey(database.$client.transactionService)
|
|
14
|
+
) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return database.$client.transactionService;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Bind the client-specific transaction marker at foreign adapter construction. */
|
|
22
|
+
export const sqlClientStandaloneGuard = <Failure>(
|
|
23
|
+
database: unknown,
|
|
24
|
+
unavailable: () => Failure,
|
|
25
|
+
): Effect.Effect<void, Failure> => {
|
|
26
|
+
const service = transactionService(database);
|
|
27
|
+
|
|
28
|
+
if (service === undefined) return Effect.suspend(() => Effect.fail(unavailable()));
|
|
29
|
+
|
|
30
|
+
return Effect.serviceOption(service).pipe(
|
|
31
|
+
Effect.flatMap(
|
|
32
|
+
Option.match({
|
|
33
|
+
onNone: () => Effect.void,
|
|
34
|
+
onSome: () => Effect.fail(unavailable()),
|
|
35
|
+
}),
|
|
36
|
+
),
|
|
37
|
+
);
|
|
38
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { SecurityRevision, SessionStepUpIntent } from "@yielded/auth/Sessions";
|
|
2
|
+
import type { InferInsertModel, Table } from "drizzle-orm";
|
|
3
|
+
import type { DateTime, Effect } from "effect";
|
|
4
|
+
|
|
5
|
+
import type { PersistenceMappingError } from "./model";
|
|
6
|
+
import type {
|
|
7
|
+
D1SessionClockMapping,
|
|
8
|
+
SessionAuthorityTables,
|
|
9
|
+
SessionConstraintClassifier,
|
|
10
|
+
SessionIdCodec,
|
|
11
|
+
SignedSessionValidityTables,
|
|
12
|
+
StatefulSessionTables,
|
|
13
|
+
} from "./session-model";
|
|
14
|
+
|
|
15
|
+
type ColumnKey<T extends Table> = Extract<keyof T["_"]["columns"], string>;
|
|
16
|
+
|
|
17
|
+
/** Distinct from login-pending storage. Snapshot is TEXT encoded by the core's
|
|
18
|
+
* SessionStepUpIntent schema; it contains no Claims and needs no consumer decoder. */
|
|
19
|
+
export interface SessionStepUpIntentTables<Intent extends Table, NativeSubjectId> {
|
|
20
|
+
readonly intent: {
|
|
21
|
+
readonly table: Intent;
|
|
22
|
+
readonly digest: ColumnKey<Intent>;
|
|
23
|
+
readonly version: ColumnKey<Intent>;
|
|
24
|
+
readonly flowId: ColumnKey<Intent>;
|
|
25
|
+
readonly subjectId: ColumnKey<Intent>;
|
|
26
|
+
readonly bindingDigest: ColumnKey<Intent>;
|
|
27
|
+
readonly snapshot: ColumnKey<Intent>;
|
|
28
|
+
readonly expiresAt: ColumnKey<Intent>;
|
|
29
|
+
readonly attemptLimit: ColumnKey<Intent>;
|
|
30
|
+
readonly failedAttempts: ColumnKey<Intent>;
|
|
31
|
+
readonly consumed: ColumnKey<Intent>;
|
|
32
|
+
readonly encodeInstant: (instant: DateTime.Utc) => unknown;
|
|
33
|
+
/** Consumer fields/defaults; the adapter sets all mapped security columns. */
|
|
34
|
+
readonly encodeInsert: (
|
|
35
|
+
intent: SessionStepUpIntent,
|
|
36
|
+
input: { readonly subjectId: NativeSubjectId },
|
|
37
|
+
) => InferInsertModel<Intent>;
|
|
38
|
+
readonly allocateVersion?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
|
|
39
|
+
readonly allocateVersionSync?: () => SecurityRevision;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface RequiredSessionStepUpConstraints {
|
|
44
|
+
readonly intentDigest: "unique(intent.digest)";
|
|
45
|
+
readonly intentFlow: "unique(intent.flowId)";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const requiredSessionStepUpConstraints: RequiredSessionStepUpConstraints = {
|
|
49
|
+
intentDigest: "unique(intent.digest)",
|
|
50
|
+
intentFlow: "unique(intent.flowId)",
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/** Fixed source discriminator is checked against every stored intent. A minimal
|
|
54
|
+
* pure-signed installation does not provide dummy session or tombstone tables. */
|
|
55
|
+
export type SessionStepUpSourceTables<
|
|
56
|
+
Claims,
|
|
57
|
+
Session extends Table,
|
|
58
|
+
Tombstone extends Table,
|
|
59
|
+
NativeSubjectId,
|
|
60
|
+
NativeSessionId,
|
|
61
|
+
> =
|
|
62
|
+
| { readonly kind: "StatelessSigned" }
|
|
63
|
+
| ({
|
|
64
|
+
readonly kind: "StateAssistedSigned";
|
|
65
|
+
readonly constraints: {
|
|
66
|
+
readonly tombstoneOwner: "unique(tombstone.subjectId,tombstone.sessionId)";
|
|
67
|
+
};
|
|
68
|
+
} & SignedSessionValidityTables<Tombstone, NativeSubjectId, NativeSessionId>)
|
|
69
|
+
| {
|
|
70
|
+
readonly kind: "Stateful";
|
|
71
|
+
readonly constraints: { readonly sessionDigest: "unique(session.digest)" };
|
|
72
|
+
readonly sessionId: SessionIdCodec<NativeSessionId>;
|
|
73
|
+
readonly session: StatefulSessionTables<
|
|
74
|
+
Claims,
|
|
75
|
+
Session,
|
|
76
|
+
Table,
|
|
77
|
+
NativeSubjectId,
|
|
78
|
+
NativeSessionId
|
|
79
|
+
>["session"] & {
|
|
80
|
+
readonly credentialVersion: ColumnKey<Session>;
|
|
81
|
+
readonly authenticatedAt: ColumnKey<Session>;
|
|
82
|
+
/** encodeRotation must persist the full replacement Claims/provenance and
|
|
83
|
+
* these queryable security fields, never preserve the old proof payload. */
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export type SessionStepUpMapping<
|
|
88
|
+
Claims,
|
|
89
|
+
Subject extends Table,
|
|
90
|
+
Credential extends Table,
|
|
91
|
+
Intent extends Table,
|
|
92
|
+
Session extends Table,
|
|
93
|
+
Tombstone extends Table,
|
|
94
|
+
NativeSubjectId,
|
|
95
|
+
NativeSessionId,
|
|
96
|
+
> = SessionAuthorityTables<Subject, Credential, NativeSubjectId> &
|
|
97
|
+
SessionStepUpIntentTables<Intent, NativeSubjectId> &
|
|
98
|
+
SessionConstraintClassifier & {
|
|
99
|
+
readonly source: SessionStepUpSourceTables<
|
|
100
|
+
Claims,
|
|
101
|
+
Session,
|
|
102
|
+
Tombstone,
|
|
103
|
+
NativeSubjectId,
|
|
104
|
+
NativeSessionId
|
|
105
|
+
>;
|
|
106
|
+
readonly constraints: RequiredSessionStepUpConstraints;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export type D1SessionStepUpMapping<
|
|
110
|
+
Claims,
|
|
111
|
+
Subject extends Table,
|
|
112
|
+
Credential extends Table,
|
|
113
|
+
Intent extends Table,
|
|
114
|
+
Session extends Table,
|
|
115
|
+
Tombstone extends Table,
|
|
116
|
+
NativeSubjectId,
|
|
117
|
+
NativeSessionId,
|
|
118
|
+
> = SessionStepUpMapping<
|
|
119
|
+
Claims,
|
|
120
|
+
Subject,
|
|
121
|
+
Credential,
|
|
122
|
+
Intent,
|
|
123
|
+
Session,
|
|
124
|
+
Tombstone,
|
|
125
|
+
NativeSubjectId,
|
|
126
|
+
NativeSessionId
|
|
127
|
+
> &
|
|
128
|
+
D1SessionClockMapping;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SessionStepUpInvalid,
|
|
3
|
+
SessionUnavailable,
|
|
4
|
+
AuthenticationEvidence,
|
|
5
|
+
type AuthenticationRevision,
|
|
6
|
+
SessionMetadata,
|
|
7
|
+
SessionStepUpIntent,
|
|
8
|
+
SessionStepUpRequirement,
|
|
9
|
+
type SessionStepUpCompletionPlan,
|
|
10
|
+
type StatefulSessionRecord,
|
|
11
|
+
} from "@yielded/auth/Sessions";
|
|
12
|
+
import { DateTime, Effect, Schema } from "effect";
|
|
13
|
+
|
|
14
|
+
export const stepUpIntentCodec = Schema.fromJsonString(SessionStepUpIntent);
|
|
15
|
+
const BoundedSnapshot = Schema.String.check(Schema.isMaxLength(131072));
|
|
16
|
+
|
|
17
|
+
export const encodeStepUpIntent = (intent: SessionStepUpIntent) =>
|
|
18
|
+
Schema.encodeEffect(stepUpIntentCodec)(intent).pipe(
|
|
19
|
+
Effect.flatMap(Schema.decodeEffect(BoundedSnapshot)),
|
|
20
|
+
Effect.mapError(() => SessionUnavailable.make({})),
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
export const decodeStepUpIntent = (snapshot: string) =>
|
|
24
|
+
Schema.decodeEffect(BoundedSnapshot)(snapshot).pipe(
|
|
25
|
+
Effect.flatMap(Schema.decodeEffect(stepUpIntentCodec)),
|
|
26
|
+
Effect.mapError(() => SessionUnavailable.make({})),
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
export const sameStepUpRevision = (left: AuthenticationRevision, right: AuthenticationRevision) =>
|
|
30
|
+
left.subjectId === right.subjectId &&
|
|
31
|
+
left.securityRevision === right.securityRevision &&
|
|
32
|
+
left.credentials.length === right.credentials.length &&
|
|
33
|
+
new Set(left.credentials.map((c) => c.credentialId)).size === left.credentials.length &&
|
|
34
|
+
left.credentials.every((item) =>
|
|
35
|
+
right.credentials.some(
|
|
36
|
+
(other) => item.credentialId === other.credentialId && item.revision === other.revision,
|
|
37
|
+
),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
export const stepUpIntentLive = (
|
|
41
|
+
intent: SessionStepUpIntent,
|
|
42
|
+
kind: SessionStepUpIntent["sourceKind"],
|
|
43
|
+
now: DateTime.Utc,
|
|
44
|
+
) => {
|
|
45
|
+
const n = DateTime.toEpochMillis(now),
|
|
46
|
+
authenticated = DateTime.toEpochMillis(intent.sourceAuthenticatedAt),
|
|
47
|
+
idle = DateTime.toEpochMillis(intent.sourceExpiresAt),
|
|
48
|
+
absolute = DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt),
|
|
49
|
+
expires = DateTime.toEpochMillis(intent.expiresAt);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
intent.sourceKind === kind &&
|
|
53
|
+
authenticated <= n &&
|
|
54
|
+
n < expires &&
|
|
55
|
+
expires <= idle &&
|
|
56
|
+
idle <= absolute
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const evidenceEncoding = Schema.encodeSync(Schema.fromJsonString(AuthenticationEvidence));
|
|
61
|
+
const requirementEncoding = Schema.encodeSync(Schema.fromJsonString(SessionStepUpRequirement));
|
|
62
|
+
const metadataEncoding = Schema.encodeSync(Schema.fromJsonString(SessionMetadata));
|
|
63
|
+
|
|
64
|
+
/** Validate core-owned plans before driver allocation/SQL expansion. No bearer or Claims decoding. */
|
|
65
|
+
export const validateStepUpPlan = Effect.fn("DrizzleStepUp.validatePlan")(function* <Claims>(
|
|
66
|
+
plan: SessionStepUpCompletionPlan<Claims>,
|
|
67
|
+
) {
|
|
68
|
+
const { intent, source, replacement, evidence } = plan;
|
|
69
|
+
const original = source.inspection;
|
|
70
|
+
|
|
71
|
+
if (
|
|
72
|
+
requirementEncoding(plan.profileRequirement) !== requirementEncoding(intent.requirement) ||
|
|
73
|
+
replacement.inspection.session.subjectId !== evidence.revision.subjectId ||
|
|
74
|
+
replacement.inspection.session.securityRevision !== evidence.revision.securityRevision ||
|
|
75
|
+
intent.revision.credentials.some(
|
|
76
|
+
(item) =>
|
|
77
|
+
!evidence.revision.credentials.some(
|
|
78
|
+
(actual) =>
|
|
79
|
+
actual.credentialId === item.credentialId && actual.revision === item.revision,
|
|
80
|
+
),
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
return yield* SessionStepUpInvalid.make({});
|
|
84
|
+
if (
|
|
85
|
+
intent.sourceKind !== source.guard._tag ||
|
|
86
|
+
intent.sourceKind !== replacement._tag ||
|
|
87
|
+
intent.sourceSessionId !== original.session.sessionId ||
|
|
88
|
+
intent.sourceCredentialVersion !== original.credentialVersion ||
|
|
89
|
+
!sameStepUpRevision(intent.revision, original.provenance.evidence.revision) ||
|
|
90
|
+
intent.revision.subjectId !== evidence.revision.subjectId ||
|
|
91
|
+
intent.revision.securityRevision !== evidence.revision.securityRevision ||
|
|
92
|
+
intent.flowId !== evidence.flowId ||
|
|
93
|
+
intent.bindingDigest !== evidence.bindingDigest ||
|
|
94
|
+
DateTime.toEpochMillis(intent.sourceAuthenticatedAt) !==
|
|
95
|
+
DateTime.toEpochMillis(original.session.assurance.authenticatedAt) ||
|
|
96
|
+
DateTime.toEpochMillis(intent.sourceExpiresAt) !==
|
|
97
|
+
DateTime.toEpochMillis(original.session.expiresAt) ||
|
|
98
|
+
DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt) !==
|
|
99
|
+
DateTime.toEpochMillis(original.session.absoluteExpiresAt) ||
|
|
100
|
+
DateTime.toEpochMillis(intent.sourceAuthenticatedAt) !==
|
|
101
|
+
DateTime.toEpochMillis(replacement.inspection.session.assurance.authenticatedAt) ||
|
|
102
|
+
DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt) !==
|
|
103
|
+
DateTime.toEpochMillis(replacement.inspection.session.absoluteExpiresAt) ||
|
|
104
|
+
evidenceEncoding(replacement.inspection.provenance.evidence) !== evidenceEncoding(evidence)
|
|
105
|
+
)
|
|
106
|
+
return yield* SessionStepUpInvalid.make({});
|
|
107
|
+
if (
|
|
108
|
+
replacement._tag === "Stateful" &&
|
|
109
|
+
(source.guard._tag !== "Stateful" ||
|
|
110
|
+
source.guard.digest !== replacement.expectedDigest ||
|
|
111
|
+
source.guard.rowVersion !== replacement.expectedRowVersion ||
|
|
112
|
+
replacement.inspection.session.sessionId !== intent.sourceSessionId)
|
|
113
|
+
)
|
|
114
|
+
return yield* SessionStepUpInvalid.make({});
|
|
115
|
+
if (
|
|
116
|
+
replacement._tag === "StateAssistedSigned" &&
|
|
117
|
+
(replacement.tombstoneSessionId !== intent.sourceSessionId ||
|
|
118
|
+
DateTime.toEpochMillis(replacement.tombstoneUntil) !==
|
|
119
|
+
DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt))
|
|
120
|
+
)
|
|
121
|
+
return yield* SessionStepUpInvalid.make({});
|
|
122
|
+
if (
|
|
123
|
+
replacement._tag !== "Stateful" &&
|
|
124
|
+
replacement.inspection.session.sessionId === intent.sourceSessionId
|
|
125
|
+
)
|
|
126
|
+
return yield* SessionStepUpInvalid.make({});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
/** Compare a consumer-decoded encoded update/readback with the intended rotation.
|
|
130
|
+
* Claims are consumer-owned; their lossless round trip remains the codec contract. */
|
|
131
|
+
export const stepUpRotationMatches = <Claims>(
|
|
132
|
+
plan: SessionStepUpCompletionPlan<Claims>,
|
|
133
|
+
record: StatefulSessionRecord<Claims>,
|
|
134
|
+
) =>
|
|
135
|
+
plan.replacement._tag === "Stateful" &&
|
|
136
|
+
record.digest === plan.replacement.nextDigest &&
|
|
137
|
+
record.credentialVersion === plan.replacement.inspection.credentialVersion &&
|
|
138
|
+
metadataEncoding(record) === metadataEncoding(plan.replacement.inspection.session) &&
|
|
139
|
+
evidenceEncoding(record.provenance.evidence) === evidenceEncoding(plan.evidence);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { SubjectId } from "@yielded/auth/Schema";
|
|
2
|
+
import type {
|
|
3
|
+
AuthenticationRequirement,
|
|
4
|
+
PendingAuthenticationContext,
|
|
5
|
+
} from "@yielded/auth/Sessions";
|
|
6
|
+
import { type TotpPolicy, TotpPersistence } from "@yielded/auth/Totp";
|
|
7
|
+
import type { InferInsertModel, InferSelectModel, SQL, Table } from "drizzle-orm";
|
|
8
|
+
import { Effect, Layer } from "effect";
|
|
9
|
+
|
|
10
|
+
import type { PersistenceMappingError } from "./model";
|
|
11
|
+
export type TotpColumn<T extends Table> = Extract<keyof T["_"]["columns"], string>;
|
|
12
|
+
export type TotpMappingSource<M, R = never> = M | Effect.Effect<M, PersistenceMappingError, R>;
|
|
13
|
+
|
|
14
|
+
export const requiredTotpConstraints = {
|
|
15
|
+
factor: "unique(scope)",
|
|
16
|
+
credential: "unique(credentialId)",
|
|
17
|
+
subject: "unique(id)",
|
|
18
|
+
} as const;
|
|
19
|
+
|
|
20
|
+
/** A dedicated encrypted factor row plus the shared authentication credential authority.
|
|
21
|
+
* factorEnabled is the consumer's TOTP requirement bit; central primary methods must
|
|
22
|
+
* read it when choosing their AuthenticationRequirement. Other factor policy is untouched.
|
|
23
|
+
* State JSON stores ciphertext and recovery digests only. The same table retains
|
|
24
|
+
* domain-separated management command tombstones; retain them while command IDs
|
|
25
|
+
* can be replayed. Encoders and current requirement decoding cannot suspend.
|
|
26
|
+
*/
|
|
27
|
+
export interface TotpMapping<S extends Table, F extends Table, C extends Table, N> {
|
|
28
|
+
readonly moduleId: string;
|
|
29
|
+
readonly policy: TotpPolicy;
|
|
30
|
+
readonly constraints: typeof requiredTotpConstraints;
|
|
31
|
+
readonly subjectIds: {
|
|
32
|
+
readonly toNative: (id: SubjectId) => N;
|
|
33
|
+
readonly toSubject: (id: N) => SubjectId;
|
|
34
|
+
};
|
|
35
|
+
readonly subject: {
|
|
36
|
+
readonly table: S;
|
|
37
|
+
readonly id: TotpColumn<S>;
|
|
38
|
+
readonly securityRevision: TotpColumn<S>;
|
|
39
|
+
readonly factorEnabled: TotpColumn<S>;
|
|
40
|
+
readonly activeCondition: SQL;
|
|
41
|
+
readonly encodeEnabled: (enabled: boolean) => unknown;
|
|
42
|
+
readonly decodeRequirement: (row: InferSelectModel<S>) => AuthenticationRequirement;
|
|
43
|
+
};
|
|
44
|
+
readonly factor: {
|
|
45
|
+
readonly table: F;
|
|
46
|
+
readonly scope: TotpColumn<F>;
|
|
47
|
+
readonly state: TotpColumn<F>;
|
|
48
|
+
readonly version: TotpColumn<F>;
|
|
49
|
+
readonly encodeInsert: (value: {
|
|
50
|
+
readonly scope: string;
|
|
51
|
+
readonly state: string;
|
|
52
|
+
readonly version: string;
|
|
53
|
+
}) => InferInsertModel<F>;
|
|
54
|
+
};
|
|
55
|
+
readonly credential: {
|
|
56
|
+
readonly table: C;
|
|
57
|
+
readonly id: TotpColumn<C>;
|
|
58
|
+
readonly subjectId: TotpColumn<C>;
|
|
59
|
+
readonly revision: TotpColumn<C>;
|
|
60
|
+
readonly status: TotpColumn<C>;
|
|
61
|
+
readonly activeCondition: SQL;
|
|
62
|
+
readonly encodeStatus: (active: boolean) => unknown;
|
|
63
|
+
readonly encodeInsert: (value: {
|
|
64
|
+
readonly credentialId: string;
|
|
65
|
+
readonly subjectId: N;
|
|
66
|
+
readonly revision: string;
|
|
67
|
+
readonly active: boolean;
|
|
68
|
+
}) => InferInsertModel<C>;
|
|
69
|
+
};
|
|
70
|
+
/** Unix epoch milliseconds, evaluated again at the final conditional write. */
|
|
71
|
+
readonly engineNowMillis: SQL;
|
|
72
|
+
/** Required for reset-with-recovery-code. Must assert the exact unconsumed,
|
|
73
|
+
* unexpired, unexhausted pending flow, binding digest and original credential
|
|
74
|
+
* revisions. No request-supplied SQL or external I/O is accepted. */
|
|
75
|
+
readonly pendingCondition?: (target: PendingAuthenticationContext, subjectId: N) => SQL;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface D1TotpMapping {
|
|
79
|
+
readonly d1: { readonly primary: true };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface TotpPersistenceServices {
|
|
83
|
+
readonly totpPersistence: TotpPersistence["Service"];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export const totpPersistenceLayer = <E, R>(
|
|
87
|
+
services: Effect.Effect<TotpPersistenceServices, E, R>,
|
|
88
|
+
) =>
|
|
89
|
+
Layer.effect(
|
|
90
|
+
TotpPersistence,
|
|
91
|
+
Effect.map(services, (value) => value.totpPersistence),
|
|
92
|
+
);
|