@yielded/auth-persistence-drizzle 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/D1.d.mts +963 -0
- package/dist/D1.mjs +29 -0
- package/dist/D1.mjs.map +1 -0
- package/dist/Libsql.d.mts +2134 -0
- package/dist/Libsql.mjs +77 -0
- package/dist/Libsql.mjs.map +1 -0
- package/dist/Mysql2.d.mts +1817 -0
- package/dist/Mysql2.mjs +55 -0
- package/dist/Mysql2.mjs.map +1 -0
- package/dist/Pglite.d.mts +1821 -0
- package/dist/Pglite.mjs +53 -0
- package/dist/Pglite.mjs.map +1 -0
- package/dist/Postgres.d.mts +1821 -0
- package/dist/Postgres.mjs +53 -0
- package/dist/Postgres.mjs.map +1 -0
- package/dist/SqliteBun.d.mts +2129 -0
- package/dist/SqliteBun.mjs +70 -0
- package/dist/SqliteBun.mjs.map +1 -0
- package/dist/SqliteDo.d.mts +2181 -0
- package/dist/SqliteDo.mjs +105 -0
- package/dist/SqliteDo.mjs.map +1 -0
- package/dist/SqliteNode.d.mts +2129 -0
- package/dist/SqliteNode.mjs +70 -0
- package/dist/SqliteNode.mjs.map +1 -0
- package/dist/SqliteWasm.d.mts +2132 -0
- package/dist/SqliteWasm.mjs +70 -0
- package/dist/SqliteWasm.mjs.map +1 -0
- package/dist/_virtual/_rolldown/runtime.mjs +13 -0
- package/dist/drizzle/D1BatchStatements.d.mts +10 -0
- package/dist/drizzle/D1BatchStatements.mjs +8 -0
- package/dist/drizzle/D1BatchStatements.mjs.map +1 -0
- package/dist/drizzle/SuppliedService.d.mts +9 -0
- package/dist/drizzle/d1-emails.d.mts +61 -0
- package/dist/drizzle/d1-emails.mjs +578 -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 +30 -0
- package/dist/drizzle/d1-identity.mjs +118 -0
- package/dist/drizzle/d1-identity.mjs.map +1 -0
- package/dist/drizzle/d1-oauth.d.mts +300 -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 +47 -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 +24 -0
- package/dist/drizzle/d1-password-prepared.mjs +460 -0
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -0
- package/dist/drizzle/d1-passwords.d.mts +86 -0
- package/dist/drizzle/d1-passwords.mjs +1003 -0
- package/dist/drizzle/d1-passwords.mjs.map +1 -0
- package/dist/drizzle/d1-phone.d.mts +23 -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 +11 -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 +79 -0
- package/dist/drizzle/d1-proofs.mjs +829 -0
- package/dist/drizzle/d1-proofs.mjs.map +1 -0
- package/dist/drizzle/d1-sessions.d.mts +66 -0
- package/dist/drizzle/d1-sessions.mjs +965 -0
- package/dist/drizzle/d1-sessions.mjs.map +1 -0
- package/dist/drizzle/d1-totp.d.mts +23 -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 +30 -0
- package/dist/drizzle/email-model.mjs +2 -0
- package/dist/drizzle/email-registration.d.mts +29 -0
- package/dist/drizzle/email-registration.mjs +236 -0
- package/dist/drizzle/email-registration.mjs.map +1 -0
- package/dist/drizzle/email-sql.d.mts +1 -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 +19 -0
- package/dist/drizzle/email-target.mjs +72 -0
- package/dist/drizzle/email-target.mjs.map +1 -0
- package/dist/drizzle/model.d.mts +245 -0
- package/dist/drizzle/model.mjs +55 -0
- package/dist/drizzle/model.mjs.map +1 -0
- package/dist/drizzle/mysql-emails.d.mts +70 -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 +21 -0
- package/dist/drizzle/mysql-identity.mjs +93 -0
- package/dist/drizzle/mysql-identity.mjs.map +1 -0
- package/dist/drizzle/mysql-password-prepared.d.mts +29 -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 +85 -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 +74 -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 +91 -0
- package/dist/drizzle/mysql-sessions.mjs +53 -0
- package/dist/drizzle/mysql-sessions.mjs.map +1 -0
- package/dist/drizzle/mysql.d.mts +69 -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 +277 -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 +16 -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 +1954 -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 +752 -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 +22 -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 +461 -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 +10 -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 +5 -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 +109 -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 +43 -0
- package/dist/drizzle/passkey-model.mjs +8 -0
- package/dist/drizzle/passkey-model.mjs.map +1 -0
- package/dist/drizzle/passkey-registration-ceremony-model.d.mts +12 -0
- package/dist/drizzle/passkey-registration-ceremony-model.mjs +2 -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 +2 -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 +20 -0
- package/dist/drizzle/passkey-write-model.mjs +9 -0
- package/dist/drizzle/passkey-write-model.mjs.map +1 -0
- package/dist/drizzle/passkey-write-target.d.mts +5 -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 +24 -0
- package/dist/drizzle/password-model.mjs +2 -0
- package/dist/drizzle/password-prepared-model.d.mts +92 -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 +389 -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 +11 -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 +7 -0
- package/dist/drizzle/password-registration.mjs +134 -0
- package/dist/drizzle/password-registration.mjs.map +1 -0
- package/dist/drizzle/password-sql.d.mts +1 -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 +16 -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 +71 -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 +30 -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 +86 -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 +75 -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 +92 -0
- package/dist/drizzle/pg-sessions.mjs +53 -0
- package/dist/drizzle/pg-sessions.mjs.map +1 -0
- package/dist/drizzle/pg.d.mts +80 -0
- package/dist/drizzle/pg.mjs +289 -0
- package/dist/drizzle/pg.mjs.map +1 -0
- package/dist/drizzle/phone-model.d.mts +113 -0
- package/dist/drizzle/phone-model.mjs +39 -0
- package/dist/drizzle/phone-model.mjs.map +1 -0
- package/dist/drizzle/phone-state.mjs +14 -0
- package/dist/drizzle/phone-state.mjs.map +1 -0
- package/dist/drizzle/phone-target.d.mts +14 -0
- package/dist/drizzle/phone-target.mjs +168 -0
- package/dist/drizzle/phone-target.mjs.map +1 -0
- package/dist/drizzle/proof-model.d.mts +21 -0
- package/dist/drizzle/proof-model.mjs +2 -0
- package/dist/drizzle/proof-sql.d.mts +1 -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 +11 -0
- package/dist/drizzle/proof-target.mjs +36 -0
- package/dist/drizzle/proof-target.mjs.map +1 -0
- package/dist/drizzle/query-operations.mjs +27 -0
- package/dist/drizzle/query-operations.mjs.map +1 -0
- package/dist/drizzle/session-model.d.mts +31 -0
- package/dist/drizzle/session-model.mjs +2 -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 +27 -0
- package/dist/drizzle/session-target.mjs +46 -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 +90 -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 +77 -0
- package/dist/drizzle/sqlite.mjs +217 -0
- package/dist/drizzle/sqlite.mjs.map +1 -0
- package/dist/drizzle/standalone-guard.mjs +17 -0
- package/dist/drizzle/standalone-guard.mjs.map +1 -0
- package/dist/drizzle/step-up-model.d.mts +16 -0
- package/dist/drizzle/step-up-model.mjs +2 -0
- package/dist/drizzle/table-model.d.mts +11 -0
- package/dist/drizzle/totp-model.d.mts +82 -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 +37 -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 +14 -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 +2 -0
- package/dist/drizzle/transaction-execution.mjs +11 -0
- package/dist/drizzle/transaction-execution.mjs.map +1 -0
- package/dist/drizzle/transaction-mysql.mjs +47 -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 +27 -0
- package/dist/index.mjs +27 -0
- package/dist/internal/drizzle-migrations.mjs +19 -0
- package/dist/internal/drizzle-migrations.mjs.map +1 -0
- package/dist/internal/drizzle-postgres.mjs +37 -0
- package/dist/internal/drizzle-postgres.mjs.map +1 -0
- package/dist/internal/drizzle-sqlite.mjs +35 -0
- package/dist/internal/drizzle-sqlite.mjs.map +1 -0
- package/package.json +1 -0
- package/src/D1.ts +136 -0
- package/src/Libsql.ts +257 -0
- package/src/Mysql2.ts +184 -0
- package/src/Pglite.ts +174 -0
- package/src/Postgres.ts +174 -0
- package/src/SqliteBun.ts +258 -0
- package/src/SqliteDo.ts +473 -0
- package/src/SqliteNode.ts +259 -0
- package/src/SqliteWasm.ts +263 -0
- package/src/drizzle/D1BatchStatements.ts +10 -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 +202 -0
- package/src/drizzle/email-registration.ts +698 -0
- package/src/drizzle/email-sql.ts +25 -0
- package/src/drizzle/email-target.ts +243 -0
- package/src/drizzle/model.ts +459 -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 +4 -0
- package/src/drizzle/passkey-model.ts +153 -0
- package/src/drizzle/passkey-registration-ceremony-model.ts +32 -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 +103 -0
- package/src/drizzle/passkey-write-target.ts +9 -0
- package/src/drizzle/password-model.ts +169 -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 +363 -0
- package/src/drizzle/password-sql.ts +13 -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 +139 -0
- package/src/drizzle/proof-sql.ts +10 -0
- package/src/drizzle/proof-target.ts +122 -0
- package/src/drizzle/query-operations.ts +43 -0
- package/src/drizzle/session-model.ts +215 -0
- package/src/drizzle/session-sql.ts +14 -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 +32 -0
- package/src/drizzle/step-up-model.ts +73 -0
- package/src/drizzle/table-model.ts +9 -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 +13 -0
- package/src/drizzle/transaction-mysql.ts +106 -0
- package/src/drizzle/transaction-owner.ts +11 -0
- package/src/index.ts +378 -0
- package/src/internal/drizzle-migrations.ts +29 -0
- package/src/internal/drizzle-postgres.ts +83 -0
- package/src/internal/drizzle-sqlite.ts +81 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { coordinateTargetAuthenticationAuthority, coordinateTargetPendingAuthentication, coordinateTargetSessionStepUp, coordinateTargetSignedSessionValidity, coordinateTargetStatefulSessions, makeTargetAuthenticationAuthorityServices, makeTargetPendingAuthenticationServices, makeTargetSessionStepUpServices, makeTargetSignedSessionValidityServices, makeTargetStatefulSessionServices } from "./session-target.mjs";
|
|
2
|
+
import { Context, Effect } from "effect";
|
|
3
|
+
import { AuthenticationAuthority } from "@yielded/auth/Sessions";
|
|
4
|
+
//#region src/drizzle/sqlite-sessions.ts
|
|
5
|
+
const sqliteSessionConfiguration = (mode, standaloneGuard, coordinatorGuard) => ({
|
|
6
|
+
mode,
|
|
7
|
+
locking: false,
|
|
8
|
+
standaloneGuard,
|
|
9
|
+
...coordinatorGuard === void 0 ? {} : { coordinatorGuard }
|
|
10
|
+
});
|
|
11
|
+
const makeSqliteAuthenticationAuthorityServices = (database, mapping, configuration) => makeTargetAuthenticationAuthorityServices(database, mapping, configuration);
|
|
12
|
+
const makeSqlitePendingAuthenticationServices = (database, mapping, configuration) => makeTargetPendingAuthenticationServices(database, mapping, configuration);
|
|
13
|
+
const makeSqliteStatefulSessionServices = (database, mapping, configuration) => makeTargetStatefulSessionServices(database, mapping, configuration);
|
|
14
|
+
const makeSqliteSignedSessionValidityServices = (database, mapping, configuration) => makeTargetSignedSessionValidityServices(database, mapping, configuration);
|
|
15
|
+
const coordinateSqliteAuthenticationAuthority = (database, mapping, configuration, owner) => coordinateTargetAuthenticationAuthority(database, mapping, configuration, owner);
|
|
16
|
+
const coordinateSqlitePendingAuthentication = (database, mapping, configuration, owner) => coordinateTargetPendingAuthentication(database, mapping, configuration, owner);
|
|
17
|
+
const coordinateSqliteStatefulSessions = (database, mapping, configuration, owner) => coordinateTargetStatefulSessions(database, mapping, configuration, owner);
|
|
18
|
+
const coordinateSqliteSignedSessionValidity = (database, mapping, configuration, owner) => coordinateTargetSignedSessionValidity(database, mapping, configuration, owner);
|
|
19
|
+
const makeSqliteSessionTarget = (configuration) => {
|
|
20
|
+
const configurationFor = (database) => typeof configuration === "function" ? configuration(database) : configuration;
|
|
21
|
+
function coordinateSessionStepUp(acquire, options, body) {
|
|
22
|
+
return Effect.flatMap(acquire, (database) => coordinateSqliteSessionStepUp(database, options.mapping, options.target, configurationFor(database), (transaction, services) => {
|
|
23
|
+
const provided = Context.make(options.target, services.sessionStepUpPersistence);
|
|
24
|
+
const work = Effect.provideContext(body, provided);
|
|
25
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
function coordinateAuthenticationAuthority(acquire, options, body) {
|
|
29
|
+
return Effect.flatMap(acquire, (database) => coordinateSqliteAuthenticationAuthority(database, options.mapping, configurationFor(database), (transaction, services) => {
|
|
30
|
+
const provided = Context.make(AuthenticationAuthority, services.authenticationAuthority);
|
|
31
|
+
const work = Effect.provideContext(body, provided);
|
|
32
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
function coordinatePendingAuthentication(acquire, options, body) {
|
|
36
|
+
return Effect.flatMap(acquire, (database) => coordinateSqlitePendingAuthentication(database, options.mapping, configurationFor(database), (transaction, services) => {
|
|
37
|
+
const provided = Context.make(options.target, services.pendingAuthentication);
|
|
38
|
+
const work = Effect.provideContext(body, provided);
|
|
39
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
function coordinateStatefulSessions(acquire, options, body) {
|
|
43
|
+
return Effect.flatMap(acquire, (database) => coordinateSqliteStatefulSessions(database, options.mapping, configurationFor(database), (transaction, services) => {
|
|
44
|
+
const provided = Context.make(options.persistence, services.statefulSessionPersistence).pipe(Context.add(options.repository, services.sessionRepository));
|
|
45
|
+
const work = Effect.provideContext(body, provided);
|
|
46
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
function coordinateSignedSessionValidity(acquire, options, body) {
|
|
50
|
+
return Effect.flatMap(acquire, (database) => coordinateSqliteSignedSessionValidity(database, options.mapping, configurationFor(database), (transaction, services) => {
|
|
51
|
+
const provided = Context.make(options.target, services.signedSessionValidity);
|
|
52
|
+
const work = Effect.provideContext(body, provided);
|
|
53
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
makeSessionStepUpServices: (database, mapping, target) => makeSqliteSessionStepUpServices(database, mapping, target, configurationFor(database)),
|
|
58
|
+
coordinateSessionStepUp,
|
|
59
|
+
makeAuthenticationAuthorityServices: (database, mapping) => makeSqliteAuthenticationAuthorityServices(database, mapping, configurationFor(database)),
|
|
60
|
+
makePendingAuthenticationServices: (database, mapping) => makeSqlitePendingAuthenticationServices(database, mapping, configurationFor(database)),
|
|
61
|
+
makeStatefulSessionServices: (database, mapping) => makeSqliteStatefulSessionServices(database, mapping, configurationFor(database)),
|
|
62
|
+
makeSignedSessionValidityServices: (database, mapping) => makeSqliteSignedSessionValidityServices(database, mapping, configurationFor(database)),
|
|
63
|
+
coordinateAuthenticationAuthority,
|
|
64
|
+
coordinatePendingAuthentication,
|
|
65
|
+
coordinateStatefulSessions,
|
|
66
|
+
coordinateSignedSessionValidity
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
const makeSqliteSessionStepUpServices = (database, mapping, target, configuration) => makeTargetSessionStepUpServices(database, mapping, target, configuration);
|
|
70
|
+
const coordinateSqliteSessionStepUp = (database, mapping, target, configuration, owner) => coordinateTargetSessionStepUp(database, mapping, target, configuration, owner);
|
|
71
|
+
//#endregion
|
|
72
|
+
export { coordinateSqliteAuthenticationAuthority, coordinateSqlitePendingAuthentication, coordinateSqliteSessionStepUp, coordinateSqliteSignedSessionValidity, coordinateSqliteStatefulSessions, makeSqliteAuthenticationAuthorityServices, makeSqlitePendingAuthenticationServices, makeSqliteSessionStepUpServices, makeSqliteSessionTarget, makeSqliteSignedSessionValidityServices, makeSqliteStatefulSessionServices, sqliteSessionConfiguration };
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=sqlite-sessions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-sessions.mjs","names":[],"sources":["../../src/drizzle/sqlite-sessions.ts"],"sourcesContent":["import type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport {\n AuthenticationAuthority,\n type SessionUnavailable,\n type PendingAuthentication,\n type SessionRepository,\n type SignedSessionValidity,\n type StatefulSessionPersistence,\n type SessionStepUpPersistence,\n} from \"@yielded/auth/Sessions\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectLibsqlDatabase } from \"drizzle-orm/effect-libsql\";\nimport type { EffectSQLiteBunDatabase } from \"drizzle-orm/effect-sqlite-bun\";\nimport type { EffectSQLiteDoDatabase } from \"drizzle-orm/effect-sqlite-do\";\nimport type { EffectSQLiteNodeDatabase } from \"drizzle-orm/effect-sqlite-node\";\nimport type { EffectSQLiteWasmDatabase } from \"drizzle-orm/effect-sqlite-wasm\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Context, Effect } from \"effect\";\nimport type { SqlError } from \"effect/unstable/sql/SqlError\";\n\nimport type {\n AuthenticationAuthorityMapping,\n PendingAuthenticationMapping,\n SignedSessionValidityMapping,\n StatefulSessionMapping,\n} from \"./session-model\";\nimport {\n coordinateTargetAuthenticationAuthority,\n coordinateTargetPendingAuthentication,\n coordinateTargetSignedSessionValidity,\n coordinateTargetStatefulSessions,\n makeTargetAuthenticationAuthorityServices,\n makeTargetPendingAuthenticationServices,\n makeTargetSignedSessionValidityServices,\n makeTargetStatefulSessionServices,\n type SessionTargetConfiguration,\n makeTargetSessionStepUpServices,\n coordinateTargetSessionStepUp,\n} from \"./session-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database =\n | EffectLibsqlDatabase<AnyRelations>\n | EffectSQLiteBunDatabase<AnyRelations>\n | EffectSQLiteDoDatabase<AnyRelations>\n | EffectSQLiteNodeDatabase<AnyRelations>\n | EffectSQLiteWasmDatabase<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nexport const sqliteSessionConfiguration = (\n mode: \"interactive\" | \"synchronous\",\n standaloneGuard: Effect.Effect<void, SessionUnavailable>,\n coordinatorGuard?: Effect.Effect<void, SessionUnavailable>,\n): SessionTargetConfiguration => ({\n mode,\n locking: false,\n standaloneGuard,\n ...(coordinatorGuard === undefined ? {} : { coordinatorGuard }),\n});\n\nexport const makeSqliteAuthenticationAuthorityServices = <\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n>(\n database: Database,\n mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>,\n configuration: SessionTargetConfiguration,\n) => makeTargetAuthenticationAuthorityServices<Claims>(database, mapping, configuration);\n\nexport const makeSqlitePendingAuthenticationServices = <\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n P extends AnySQLiteTable,\n F extends AnySQLiteTable,\n NativeId,\n>(\n database: Database,\n mapping: PendingAuthenticationMapping<Claims, S, C, P, F, NativeId>,\n configuration: SessionTargetConfiguration,\n) => makeTargetPendingAuthenticationServices<Claims>(database, mapping, configuration);\n\nexport const makeSqliteStatefulSessionServices = <\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n>(\n database: Database,\n mapping: StatefulSessionMapping<Claims, S, C, Session, F, P, NativeId, NativeSessionId>,\n configuration: SessionTargetConfiguration,\n) => makeTargetStatefulSessionServices<Claims>(database, mapping, configuration);\n\nexport const makeSqliteSignedSessionValidityServices = <\n S extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n>(\n database: Database,\n mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>,\n configuration: SessionTargetConfiguration,\n) => makeTargetSignedSessionValidityServices(database, mapping, configuration);\n\nexport const coordinateSqliteAuthenticationAuthority = <\n Claims,\n D extends Database,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n>(\n database: D,\n mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: TransactionOf<D>,\n services: { readonly authenticationAuthority: AuthenticationAuthority[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinateTargetAuthenticationAuthority<Claims, TransactionOf<D>, A, E, R>(\n database,\n mapping,\n configuration,\n owner,\n );\n\nexport const coordinateSqlitePendingAuthentication = <\n Claims,\n D extends Database,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n P extends AnySQLiteTable,\n F extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n>(\n database: D,\n mapping: PendingAuthenticationMapping<Claims, S, C, P, F, NativeId>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: TransactionOf<D>,\n services: { readonly pendingAuthentication: PendingAuthentication<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinateTargetPendingAuthentication<Claims, TransactionOf<D>, A, E, R>(\n database,\n mapping,\n configuration,\n owner,\n );\n\nexport const coordinateSqliteStatefulSessions = <\n Claims,\n D extends Database,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n>(\n database: D,\n mapping: StatefulSessionMapping<Claims, S, C, Session, F, P, NativeId, NativeSessionId>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: TransactionOf<D>,\n services: {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinateTargetStatefulSessions<Claims, TransactionOf<D>, A, E, R>(\n database,\n mapping,\n configuration,\n owner,\n );\n\nexport const coordinateSqliteSignedSessionValidity = <\n D extends Database,\n S extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n>(\n database: D,\n mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: TransactionOf<D>,\n services: { readonly signedSessionValidity: SignedSessionValidity },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinateTargetSignedSessionValidity<TransactionOf<D>, A, E, R>(\n database,\n mapping,\n configuration,\n owner,\n );\n\nexport const makeSqliteSessionTarget = <D extends Database, Synchronous extends boolean = false>(\n configuration: SessionTargetConfiguration | ((database: D) => SessionTargetConfiguration),\n) => {\n const configurationFor = (database: D) =>\n typeof configuration === \"function\" ? configuration(database) : configuration;\n\n function coordinateSessionStepUp<\n Database extends D,\n Claims,\n Id,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n I extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<Id> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n (Synchronous extends true ? never : Exclude<R, Id>) | LifecycleHooks | DatabaseRequirements\n >;\n function coordinateSessionStepUp<\n Database extends D,\n Claims,\n Id,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n I extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<Id | TxId> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, Id | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateSessionStepUp<\n Database extends D,\n Claims,\n Id,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n I extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, Id> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateSqliteSessionStepUp(\n database,\n options.mapping,\n options.target,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },\n ) => {\n const provided = Context.make(options.target, services.sessionStepUpPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n function coordinateAuthenticationAuthority<\n Database extends D,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<AuthenticationAuthority> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, AuthenticationAuthority>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateAuthenticationAuthority<\n Database extends D,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<AuthenticationAuthority | TxId> : R\n >,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, AuthenticationAuthority | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateAuthenticationAuthority<\n Database extends D,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, AuthenticationAuthority> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateSqliteAuthenticationAuthority(\n database,\n options.mapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly authenticationAuthority: AuthenticationAuthority[\"Service\"] },\n ) => {\n const provided = Context.make(AuthenticationAuthority, services.authenticationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n function coordinatePendingAuthentication<\n Database extends D,\n TargetId,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n P extends AnySQLiteTable,\n F extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<TargetId> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinatePendingAuthentication<\n Database extends D,\n TargetId,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n P extends AnySQLiteTable,\n F extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<TargetId | TxId> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinatePendingAuthentication<\n Database extends D,\n TargetId,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n P extends AnySQLiteTable,\n F extends AnySQLiteTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateSqlitePendingAuthentication(\n database,\n options.mapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly pendingAuthentication: PendingAuthentication<Claims> },\n ) => {\n const provided = Context.make(options.target, services.pendingAuthentication);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n function coordinateStatefulSessions<\n Database extends D,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<PersistenceId | RepositoryId> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, PersistenceId | RepositoryId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateStatefulSessions<\n Database extends D,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<PersistenceId | RepositoryId | TxId> : R\n >,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, PersistenceId | RepositoryId | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateStatefulSessions<\n Database extends D,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PersistenceId | RepositoryId> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateSqliteStatefulSessions(\n database,\n options.mapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n ) => {\n const provided = Context.make(\n options.persistence,\n services.statefulSessionPersistence,\n ).pipe(Context.add(options.repository, services.sessionRepository));\n\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n function coordinateSignedSessionValidity<\n Database extends D,\n TargetId,\n S extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<TargetId> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateSignedSessionValidity<\n Database extends D,\n TargetId,\n S extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<TargetId | TxId> : R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateSignedSessionValidity<\n Database extends D,\n TargetId,\n S extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateSqliteSignedSessionValidity(\n database,\n options.mapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly signedSessionValidity: SignedSessionValidity },\n ) => {\n const provided = Context.make(options.target, services.signedSessionValidity);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n\n return {\n makeSessionStepUpServices: <\n Claims,\n Id,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n I extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n >(\n database: D,\n mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n ) => makeSqliteSessionStepUpServices(database, mapping, target, configurationFor(database)),\n coordinateSessionStepUp,\n makeAuthenticationAuthorityServices: <\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>,\n ) => makeSqliteAuthenticationAuthorityServices(database, mapping, configurationFor(database)),\n makePendingAuthenticationServices: <\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n P extends AnySQLiteTable,\n F extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: PendingAuthenticationMapping<Claims, S, C, P, F, NativeId>,\n ) => makeSqlitePendingAuthenticationServices(database, mapping, configurationFor(database)),\n makeStatefulSessionServices: <\n Claims,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n F extends AnySQLiteTable,\n P extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n >(\n database: D,\n mapping: StatefulSessionMapping<Claims, S, C, Session, F, P, NativeId, NativeSessionId>,\n ) => makeSqliteStatefulSessionServices(database, mapping, configurationFor(database)),\n makeSignedSessionValidityServices: <\n S extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n >(\n database: D,\n mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>,\n ) => makeSqliteSignedSessionValidityServices(database, mapping, configurationFor(database)),\n coordinateAuthenticationAuthority,\n coordinatePendingAuthentication,\n coordinateStatefulSessions,\n coordinateSignedSessionValidity,\n };\n};\n\nimport type { SessionStepUpMapping } from \"./step-up-model\";\n\nexport const makeSqliteSessionStepUpServices = <\n Claims,\n Id,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n I extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n>(\n database: Database,\n mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n) => makeTargetSessionStepUpServices(database, mapping, target, configuration);\n\nexport const coordinateSqliteSessionStepUp = <\n Claims,\n Id,\n S extends AnySQLiteTable,\n C extends AnySQLiteTable,\n I extends AnySQLiteTable,\n Session extends AnySQLiteTable,\n T extends AnySQLiteTable,\n NativeId,\n NativeSessionId,\n D extends Database,\n A,\n E,\n R,\n>(\n database: D,\n mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: TransactionOf<D>,\n services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinateTargetSessionStepUp<Claims, Id, TransactionOf<D>, A, E, R>(\n database,\n mapping,\n target,\n configuration,\n owner,\n );\n"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { AuthStoreTables, AuthTables, ChallengeConsumeDecision, ConsumeDecision, OAuthStateTables } from "./model.mjs";
|
|
2
|
+
import { SuppliedService } from "./SuppliedService.mjs";
|
|
3
|
+
import { EmailOtpRejected } from "@yielded/auth/AuthStore";
|
|
4
|
+
import { AuthStoreError, InvalidRegistration } from "@yielded/auth/Errors";
|
|
5
|
+
import { InvalidOAuthState, OAuthState, OAuthStateDecisions } from "@yielded/auth/OAuth";
|
|
6
|
+
import { ConsumeChallenge, ConsumeRegistration, NewChallenge, NewRegistration, TokenDigest, VerifiedEmail } from "@yielded/auth/Schema";
|
|
7
|
+
import { AnyRelations } from "drizzle-orm";
|
|
8
|
+
import { Effect } from "effect";
|
|
9
|
+
import { AuthStoreDecisions } from "@yielded/auth/Persistence";
|
|
10
|
+
import { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
11
|
+
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
12
|
+
import { QueryEffectHKTBase } from "drizzle-orm/effect-core";
|
|
13
|
+
import { SQLiteEffectDatabase } from "drizzle-orm/sqlite-core/effect/db";
|
|
14
|
+
//#region src/drizzle/sqlite.d.ts
|
|
15
|
+
type AnyDatabase = SQLiteEffectDatabase<any, any, AnyRelations>;
|
|
16
|
+
type ClosedQueryEffectHKT = QueryEffectHKTBase & {
|
|
17
|
+
readonly context: never;
|
|
18
|
+
};
|
|
19
|
+
type TransactionOf<D extends AnyDatabase> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
20
|
+
/**
|
|
21
|
+
* Shared SQLite semantics for libSQL, Node, Bun, WASM, Durable Objects and D1.
|
|
22
|
+
* Every mutation here is one conditional statement, so D1 never reaches its
|
|
23
|
+
* unsupported interactive transaction and Durable Objects never suspend in a
|
|
24
|
+
* transactionSync callback.
|
|
25
|
+
*/
|
|
26
|
+
export declare const makeSqliteAuthStoreServices: <C extends AnySQLiteTable, R extends AnySQLiteTable, HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT, RunResult = unknown>(database: SQLiteEffectDatabase<HKT, RunResult, AnyRelations>, mapping: AuthStoreTables<C, R>, standaloneGuard?: Effect.Effect<void, AuthStoreError>) => {
|
|
27
|
+
readonly authStore: {
|
|
28
|
+
readonly issueChallenge: (input: NewChallenge) => Effect.Effect<void, import("@yielded/auth/AuthStore").IssueChallengeError>;
|
|
29
|
+
readonly consumeChallenge: (input: ConsumeChallenge) => Effect.Effect<VerifiedEmail, EmailOtpRejected | AuthStoreError>;
|
|
30
|
+
readonly issueRegistration: (input: NewRegistration) => Effect.Effect<void, AuthStoreError>;
|
|
31
|
+
readonly inspectRegistration: (tokenDigest: TokenDigest) => Effect.Effect<import("@yielded/auth/Schema").PendingRegistration, InvalidRegistration | AuthStoreError>;
|
|
32
|
+
readonly consumeRegistration: (input: ConsumeRegistration) => Effect.Effect<void, InvalidRegistration | AuthStoreError>;
|
|
33
|
+
};
|
|
34
|
+
readonly decisions: {
|
|
35
|
+
readonly consumeChallenge: (input: ConsumeChallenge) => Effect.Effect<ChallengeConsumeDecision, AuthStoreError, never>;
|
|
36
|
+
readonly consumeRegistration: (input: ConsumeRegistration) => Effect.Effect<ConsumeDecision<void>, AuthStoreError, never>;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
export declare const makeSqliteOAuthStateServices: <S extends AnySQLiteTable, HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT, RunResult = unknown>(database: SQLiteEffectDatabase<HKT, RunResult, AnyRelations>, mapping: OAuthStateTables<S>, standaloneGuard?: Effect.Effect<void, AuthStoreError>) => {
|
|
40
|
+
readonly oauthStateStore: {
|
|
41
|
+
readonly issue: (state: OAuthState) => Effect.Effect<void, AuthStoreError>;
|
|
42
|
+
readonly consume: (stateDigest: TokenDigest) => Effect.Effect<OAuthState, InvalidOAuthState | AuthStoreError>;
|
|
43
|
+
};
|
|
44
|
+
readonly decisions: {
|
|
45
|
+
readonly consumeOAuthState: (digest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">) => Effect.Effect<ConsumeDecision<OAuthState>, AuthStoreError, never>;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Owns the native outer commit for interactive SQLite targets. Keep rejection
|
|
50
|
+
* as a decision value inside the owner; interruption before commit rolls back.
|
|
51
|
+
*/
|
|
52
|
+
export declare function coordinateSqliteAuthStoreTransaction<D extends AnyDatabase, C extends AnySQLiteTable, R extends AnySQLiteTable, A, E, Requirements, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
53
|
+
readonly mapping: AuthStoreTables<C, R>;
|
|
54
|
+
readonly transaction?: never;
|
|
55
|
+
}, body: Effect.Effect<A, E, Requirements>): Effect.Effect<A, E | DatabaseError | SqlError, Exclude<Requirements, AuthStoreDecisions> | DatabaseRequirements>;
|
|
56
|
+
export declare function coordinateSqliteAuthStoreTransaction<D extends AnyDatabase, C extends AnySQLiteTable, R extends AnySQLiteTable, A, E, Requirements, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
57
|
+
readonly mapping: AuthStoreTables<C, R>;
|
|
58
|
+
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
|
|
59
|
+
}, body: Effect.Effect<A, E, Requirements>): Effect.Effect<A, E | DatabaseError | SqlError, Exclude<Requirements, AuthStoreDecisions | TxId> | DatabaseRequirements>;
|
|
60
|
+
export declare function coordinateSqliteOAuthStateTransaction<D extends AnyDatabase, S extends AnySQLiteTable, A, E, Requirements, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
61
|
+
readonly mapping: OAuthStateTables<S>;
|
|
62
|
+
readonly transaction?: never;
|
|
63
|
+
}, body: Effect.Effect<A, E, Requirements>): Effect.Effect<A, E | DatabaseError | SqlError, Exclude<Requirements, OAuthStateDecisions> | DatabaseRequirements>;
|
|
64
|
+
export declare function coordinateSqliteOAuthStateTransaction<D extends AnyDatabase, S extends AnySQLiteTable, A, E, Requirements, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
65
|
+
readonly mapping: OAuthStateTables<S>;
|
|
66
|
+
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
|
|
67
|
+
}, body: Effect.Effect<A, E, Requirements>): Effect.Effect<A, E | DatabaseError | SqlError, Exclude<Requirements, OAuthStateDecisions | TxId> | DatabaseRequirements>;
|
|
68
|
+
export declare function coordinateSqliteAuthTransaction<D extends AnyDatabase, C extends AnySQLiteTable, R extends AnySQLiteTable, S extends AnySQLiteTable, A, E, Requirements, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
69
|
+
readonly mapping: AuthTables<C, R, S>;
|
|
70
|
+
readonly transaction?: never;
|
|
71
|
+
}, body: Effect.Effect<A, E, Requirements>): Effect.Effect<A, E | DatabaseError | SqlError, Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions> | DatabaseRequirements>;
|
|
72
|
+
export declare function coordinateSqliteAuthTransaction<D extends AnyDatabase, C extends AnySQLiteTable, R extends AnySQLiteTable, S extends AnySQLiteTable, A, E, Requirements, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
73
|
+
readonly mapping: AuthTables<C, R, S>;
|
|
74
|
+
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
|
|
75
|
+
}, body: Effect.Effect<A, E, Requirements>): Effect.Effect<A, E | DatabaseError | SqlError, Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions | TxId> | DatabaseRequirements>;
|
|
76
|
+
//#endregion
|
|
77
|
+
//# sourceMappingURL=sqlite.d.mts.map
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { column, requireStandaloneConsume, updateValues } from "./model.mjs";
|
|
2
|
+
import { AuthStore, EmailOtpRejected } from "@yielded/auth/AuthStore";
|
|
3
|
+
import { AuthRateLimited, AuthStoreError, InvalidRegistration } from "@yielded/auth/Errors";
|
|
4
|
+
import { InvalidOAuthState, OAuthStateDecisions, OAuthStateStore } from "@yielded/auth/OAuth";
|
|
5
|
+
import { VerifiedEmail } from "@yielded/auth/Schema";
|
|
6
|
+
import { and, eq, gt, lt, lte, ne, or, sql } from "drizzle-orm";
|
|
7
|
+
import { Cause, Context, DateTime, Duration, Effect, Schema } from "effect";
|
|
8
|
+
import { AuthStoreDecisions, reportPersistenceFailure } from "@yielded/auth/Persistence";
|
|
9
|
+
//#region src/drizzle/sqlite.ts
|
|
10
|
+
const storeReadError = () => AuthStoreError.make({ message: "Auth store read failed" });
|
|
11
|
+
const storeWriteError = () => AuthStoreError.make({ message: "Auth store write failed" });
|
|
12
|
+
const isStoreFailure = Schema.is(AuthStoreError);
|
|
13
|
+
const mapStoreFailure = (failure) => (effect) => reportPersistenceFailure(effect, isStoreFailure).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, failure))));
|
|
14
|
+
const mapStoreReadFailure = mapStoreFailure(storeReadError);
|
|
15
|
+
const mapStoreWriteFailure = mapStoreFailure(storeWriteError);
|
|
16
|
+
const selected = (row) => row;
|
|
17
|
+
/**
|
|
18
|
+
* Shared SQLite semantics for libSQL, Node, Bun, WASM, Durable Objects and D1.
|
|
19
|
+
* Every mutation here is one conditional statement, so D1 never reaches its
|
|
20
|
+
* unsupported interactive transaction and Durable Objects never suspend in a
|
|
21
|
+
* transactionSync callback.
|
|
22
|
+
*/
|
|
23
|
+
const makeSqliteAuthStoreServices = (database, mapping, standaloneGuard) => {
|
|
24
|
+
const db = database;
|
|
25
|
+
const requireStandalone = standaloneGuard ?? Effect.suspend(() => db.$client === void 0 ? AuthStoreError.make({ message: "Use a root auth store or its decision transaction API" }) : requireStandaloneConsume({ $client: db.$client }));
|
|
26
|
+
const challengeTable = mapping.challenge.table;
|
|
27
|
+
const challengeColumns = mapping.challenge.columns;
|
|
28
|
+
const challenge = {
|
|
29
|
+
challengeId: column(challengeTable, challengeColumns.challengeId),
|
|
30
|
+
tokenDigest: column(challengeTable, challengeColumns.tokenDigest),
|
|
31
|
+
namespace: column(challengeTable, challengeColumns.namespace),
|
|
32
|
+
value: column(challengeTable, challengeColumns.value),
|
|
33
|
+
purpose: column(challengeTable, challengeColumns.purpose),
|
|
34
|
+
otpKeyId: column(challengeTable, challengeColumns.otpKeyId),
|
|
35
|
+
otpDigest: column(challengeTable, challengeColumns.otpDigest),
|
|
36
|
+
issuedAt: column(challengeTable, challengeColumns.issuedAt),
|
|
37
|
+
expiresAt: column(challengeTable, challengeColumns.expiresAt),
|
|
38
|
+
attemptLimit: column(challengeTable, challengeColumns.attemptLimit),
|
|
39
|
+
failedAttempts: column(challengeTable, challengeColumns.failedAttempts),
|
|
40
|
+
consumed: column(challengeTable, challengeColumns.consumed)
|
|
41
|
+
};
|
|
42
|
+
const registrationTable = mapping.registration.table;
|
|
43
|
+
const registrationColumns = mapping.registration.columns;
|
|
44
|
+
const registration = {
|
|
45
|
+
tokenDigest: column(registrationTable, registrationColumns.tokenDigest),
|
|
46
|
+
expiresAt: column(registrationTable, registrationColumns.expiresAt),
|
|
47
|
+
consumed: column(registrationTable, registrationColumns.consumed)
|
|
48
|
+
};
|
|
49
|
+
const issueChallenge = Effect.fn("DrizzleSqliteAuthStore.issueChallenge")(function* (input) {
|
|
50
|
+
const now = yield* DateTime.now;
|
|
51
|
+
const cooldownCutoff = DateTime.mapEpochMillis(now, (millis) => millis - Duration.toMillis(input.resendCooldown));
|
|
52
|
+
if ((yield* Effect.suspend(() => {
|
|
53
|
+
const values = mapping.challenge.encodeInsert(input, {
|
|
54
|
+
namespace: mapping.challenge.identifierNamespace,
|
|
55
|
+
failedAttempts: 0,
|
|
56
|
+
consumed: false
|
|
57
|
+
});
|
|
58
|
+
const nativeNow = mapping.challenge.encodeInstant(now);
|
|
59
|
+
const nativeCutoff = mapping.challenge.encodeInstant(cooldownCutoff);
|
|
60
|
+
const nativeIssuedAt = mapping.challenge.encodeInstant(input.issuedAt);
|
|
61
|
+
const preservedAttempts = sql`case when ${gt(challenge.expiresAt, nativeNow)} then ${challenge.failedAttempts} else 0 end`;
|
|
62
|
+
const update = mapping.challenge.encodeUpdate(input, {
|
|
63
|
+
namespace: mapping.challenge.identifierNamespace,
|
|
64
|
+
failedAttempts: preservedAttempts,
|
|
65
|
+
consumed: false
|
|
66
|
+
});
|
|
67
|
+
return db.insert(challengeTable).values(values).onConflictDoUpdate({
|
|
68
|
+
target: [
|
|
69
|
+
challenge.namespace,
|
|
70
|
+
challenge.value,
|
|
71
|
+
challenge.purpose
|
|
72
|
+
],
|
|
73
|
+
set: update,
|
|
74
|
+
setWhere: and(ne(challenge.challengeId, input.challengeId), lt(challenge.issuedAt, nativeIssuedAt), or(eq(challenge.consumed, true), lte(challenge.issuedAt, nativeCutoff)))
|
|
75
|
+
}).returning();
|
|
76
|
+
}).pipe(mapStoreWriteFailure)).length > 0) return;
|
|
77
|
+
const existing = yield* Effect.suspend(() => db.select().from(challengeTable).where(and(eq(challenge.namespace, mapping.challenge.identifierNamespace), eq(challenge.value, input.email), eq(challenge.purpose, input.purpose))).limit(1)).pipe(mapStoreReadFailure);
|
|
78
|
+
const decoded = existing[0] === void 0 ? void 0 : yield* Effect.suspend(() => mapping.challenge.decode(selected(existing[0]))).pipe(mapStoreReadFailure);
|
|
79
|
+
const retryAfterSeconds = decoded === void 0 ? Math.max(1, Math.ceil(Duration.toMillis(input.resendCooldown) / 1e3)) : Math.max(1, Math.ceil((DateTime.toEpochMillis(decoded.challenge.issuedAt) + Duration.toMillis(input.resendCooldown) - DateTime.toEpochMillis(now)) / 1e3));
|
|
80
|
+
return yield* AuthRateLimited.make({ retryAfterSeconds });
|
|
81
|
+
});
|
|
82
|
+
const consumeChallengeDecision = Effect.fn("DrizzleSqliteAuthStore.consumeChallengeDecision")(function* (input) {
|
|
83
|
+
const now = yield* DateTime.now;
|
|
84
|
+
const alternatives = Object.entries(input.otpDigests).map(([keyId, digest]) => and(eq(challenge.otpKeyId, keyId), eq(challenge.otpDigest, digest)));
|
|
85
|
+
const matches = alternatives.length === 0 ? sql`false` : or(...alternatives);
|
|
86
|
+
const rows = yield* Effect.suspend(() => db.update(challengeTable).set(updateValues([[challengeColumns.consumed, sql`case when ${matches} then true else ${challenge.consumed} end`], [challengeColumns.failedAttempts, sql`${challenge.failedAttempts} + case when ${matches} then 0 else 1 end`]])).where(and(eq(challenge.tokenDigest, input.tokenDigest), eq(challenge.consumed, false), gt(challenge.expiresAt, mapping.challenge.encodeInstant(now)), sql`${challenge.failedAttempts} < ${challenge.attemptLimit}`)).returning()).pipe(mapStoreWriteFailure);
|
|
87
|
+
if (rows[0] === void 0) return {
|
|
88
|
+
_tag: "rejected",
|
|
89
|
+
reason: "missing_challenge"
|
|
90
|
+
};
|
|
91
|
+
const decoded = yield* Effect.suspend(() => mapping.challenge.decode(selected(rows[0]))).pipe(mapStoreReadFailure);
|
|
92
|
+
if (!decoded.consumed) return {
|
|
93
|
+
_tag: "rejected",
|
|
94
|
+
reason: "bad_code"
|
|
95
|
+
};
|
|
96
|
+
return {
|
|
97
|
+
_tag: "accepted",
|
|
98
|
+
value: VerifiedEmail.make({
|
|
99
|
+
email: decoded.challenge.email,
|
|
100
|
+
purpose: decoded.challenge.purpose
|
|
101
|
+
})
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
const consumeChallenge = Effect.fn("DrizzleSqliteAuthStore.consumeChallenge")(function* (input) {
|
|
105
|
+
yield* requireStandalone;
|
|
106
|
+
const decision = yield* consumeChallengeDecision(input);
|
|
107
|
+
return decision._tag === "accepted" ? decision.value : yield* EmailOtpRejected.make({ reason: decision.reason });
|
|
108
|
+
});
|
|
109
|
+
const issueRegistration = Effect.fn("DrizzleSqliteAuthStore.issueRegistration")(function* (input) {
|
|
110
|
+
yield* Effect.suspend(() => db.insert(registrationTable).values(mapping.registration.encodeInsert(input, false))).pipe(mapStoreWriteFailure);
|
|
111
|
+
});
|
|
112
|
+
const inspectRegistration = Effect.fn("DrizzleSqliteAuthStore.inspectRegistration")(function* (tokenDigest) {
|
|
113
|
+
const now = yield* DateTime.now;
|
|
114
|
+
const rows = yield* Effect.suspend(() => db.select().from(registrationTable).where(and(eq(registration.tokenDigest, tokenDigest), eq(registration.consumed, false), gt(registration.expiresAt, mapping.registration.encodeInstant(now)))).limit(1)).pipe(mapStoreReadFailure);
|
|
115
|
+
if (rows[0] === void 0) return yield* InvalidRegistration.make();
|
|
116
|
+
return (yield* Effect.suspend(() => mapping.registration.decode(selected(rows[0]))).pipe(mapStoreReadFailure)).registration;
|
|
117
|
+
});
|
|
118
|
+
const consumeRegistrationDecision = Effect.fn("DrizzleSqliteAuthStore.consumeRegistrationDecision")(function* (input) {
|
|
119
|
+
const now = yield* DateTime.now;
|
|
120
|
+
return (yield* Effect.suspend(() => db.update(registrationTable).set(updateValues([[registrationColumns.consumed, true]])).where(and(eq(registration.tokenDigest, input.tokenDigest), eq(registration.consumed, false), gt(registration.expiresAt, mapping.registration.encodeInstant(now)))).returning({ consumed: registration.consumed })).pipe(mapStoreWriteFailure)).length === 0 ? { _tag: "rejected" } : {
|
|
121
|
+
_tag: "accepted",
|
|
122
|
+
value: void 0
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
const consumeRegistration = Effect.fn("DrizzleSqliteAuthStore.consumeRegistration")(function* (input) {
|
|
126
|
+
yield* requireStandalone;
|
|
127
|
+
if ((yield* consumeRegistrationDecision(input))._tag === "rejected") return yield* InvalidRegistration.make();
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
authStore: AuthStore.of({
|
|
131
|
+
issueChallenge,
|
|
132
|
+
consumeChallenge,
|
|
133
|
+
issueRegistration,
|
|
134
|
+
inspectRegistration,
|
|
135
|
+
consumeRegistration
|
|
136
|
+
}),
|
|
137
|
+
decisions: {
|
|
138
|
+
consumeChallenge: consumeChallengeDecision,
|
|
139
|
+
consumeRegistration: consumeRegistrationDecision
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
const makeSqliteOAuthStateServices = (database, mapping, standaloneGuard) => {
|
|
144
|
+
const db = database;
|
|
145
|
+
const requireStandalone = standaloneGuard ?? Effect.suspend(() => db.$client === void 0 ? AuthStoreError.make({ message: "Use a root auth store or its decision transaction API" }) : requireStandaloneConsume({ $client: db.$client }));
|
|
146
|
+
const stateTable = mapping.oauthState.table;
|
|
147
|
+
const stateColumns = mapping.oauthState.columns;
|
|
148
|
+
const state = {
|
|
149
|
+
stateDigest: column(stateTable, stateColumns.stateDigest),
|
|
150
|
+
expiresAt: column(stateTable, stateColumns.expiresAt),
|
|
151
|
+
consumed: column(stateTable, stateColumns.consumed)
|
|
152
|
+
};
|
|
153
|
+
const issue = Effect.fn("DrizzleSqliteOAuthStateStore.issue")(function* (input) {
|
|
154
|
+
yield* Effect.suspend(() => db.insert(stateTable).values(mapping.oauthState.encodeInsert(input, false))).pipe(mapStoreWriteFailure);
|
|
155
|
+
});
|
|
156
|
+
const consumeDecision = Effect.fn("DrizzleSqliteOAuthStateStore.consumeDecision")(function* (digest) {
|
|
157
|
+
const now = yield* DateTime.now;
|
|
158
|
+
const rows = yield* Effect.suspend(() => db.update(stateTable).set(updateValues([[stateColumns.consumed, true]])).where(and(eq(state.stateDigest, digest), eq(state.consumed, false), gt(state.expiresAt, mapping.oauthState.encodeInstant(now)))).returning()).pipe(mapStoreWriteFailure);
|
|
159
|
+
if (rows[0] === void 0) return { _tag: "rejected" };
|
|
160
|
+
return {
|
|
161
|
+
_tag: "accepted",
|
|
162
|
+
value: (yield* Effect.suspend(() => mapping.oauthState.decode(selected(rows[0]))).pipe(mapStoreReadFailure)).state
|
|
163
|
+
};
|
|
164
|
+
});
|
|
165
|
+
const consume = Effect.fn("DrizzleSqliteOAuthStateStore.consume")(function* (digest) {
|
|
166
|
+
yield* requireStandalone;
|
|
167
|
+
const decision = yield* consumeDecision(digest);
|
|
168
|
+
return decision._tag === "accepted" ? decision.value : yield* InvalidOAuthState.make();
|
|
169
|
+
});
|
|
170
|
+
return {
|
|
171
|
+
oauthStateStore: OAuthStateStore.of({
|
|
172
|
+
issue,
|
|
173
|
+
consume
|
|
174
|
+
}),
|
|
175
|
+
decisions: { consumeOAuthState: consumeDecision }
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
const makeSqliteAuthServices = (database, mapping, standaloneGuard) => {
|
|
179
|
+
const auth = makeSqliteAuthStoreServices(database, mapping, standaloneGuard);
|
|
180
|
+
const oauth = makeSqliteOAuthStateServices(database, mapping, standaloneGuard);
|
|
181
|
+
return {
|
|
182
|
+
...auth,
|
|
183
|
+
...oauth,
|
|
184
|
+
decisions: {
|
|
185
|
+
...auth.decisions,
|
|
186
|
+
...oauth.decisions
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
};
|
|
190
|
+
function coordinateSqliteAuthStoreTransaction(acquire, options, body) {
|
|
191
|
+
return Effect.flatMap(acquire, (database) => database.transaction((transaction) => {
|
|
192
|
+
const decisions = makeSqliteAuthStoreServices(transaction, options.mapping).decisions;
|
|
193
|
+
const provided = Context.make(AuthStoreDecisions, decisions);
|
|
194
|
+
const work = Effect.provideContext(body, provided);
|
|
195
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
function coordinateSqliteOAuthStateTransaction(acquire, options, body) {
|
|
199
|
+
return Effect.flatMap(acquire, (database) => database.transaction((transaction) => {
|
|
200
|
+
const decisions = makeSqliteOAuthStateServices(transaction, options.mapping).decisions;
|
|
201
|
+
const provided = Context.make(OAuthStateDecisions, decisions);
|
|
202
|
+
const work = Effect.provideContext(body, provided);
|
|
203
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
204
|
+
}));
|
|
205
|
+
}
|
|
206
|
+
function coordinateSqliteAuthTransaction(acquire, options, body) {
|
|
207
|
+
return Effect.flatMap(acquire, (database) => database.transaction((transaction) => {
|
|
208
|
+
const decisions = makeSqliteAuthServices(transaction, options.mapping).decisions;
|
|
209
|
+
const provided = Context.make(AuthStoreDecisions, decisions).pipe(Context.add(OAuthStateDecisions, decisions));
|
|
210
|
+
const work = Effect.provideContext(body, provided);
|
|
211
|
+
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
//#endregion
|
|
215
|
+
export { coordinateSqliteAuthStoreTransaction, coordinateSqliteAuthTransaction, coordinateSqliteOAuthStateTransaction, makeSqliteAuthServices, makeSqliteAuthStoreServices, makeSqliteOAuthStateServices };
|
|
216
|
+
|
|
217
|
+
//# sourceMappingURL=sqlite.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.mjs","names":[],"sources":["../../src/drizzle/sqlite.ts"],"sourcesContent":["import { AuthStore, EmailOtpRejected } from \"@yielded/auth/AuthStore\";\nimport { AuthRateLimited, AuthStoreError, InvalidRegistration } from \"@yielded/auth/Errors\";\nimport {\n InvalidOAuthState,\n OAuthStateDecisions,\n OAuthStateStore,\n type OAuthState,\n} from \"@yielded/auth/OAuth\";\nimport { AuthStoreDecisions, reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport {\n VerifiedEmail,\n type ConsumeChallenge,\n type ConsumeRegistration,\n type NewChallenge,\n type NewRegistration,\n type TokenDigest,\n} from \"@yielded/auth/Schema\";\n/* oxlint-disable no-explicit-any -- Drizzle's generic query builders lose the concrete consumer table through a runtime column map. Assertions stay in this adapter. */\nimport {\n and,\n eq,\n gt,\n lt,\n lte,\n ne,\n or,\n sql,\n type AnyRelations,\n type InferSelectModel,\n} from \"drizzle-orm\";\nimport type { QueryEffectHKTBase } from \"drizzle-orm/effect-core\";\nimport type { SQLiteColumn, AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport type { SQLiteEffectDatabase } from \"drizzle-orm/sqlite-core/effect/db\";\nimport { Cause, Context, DateTime, Duration, Effect, Schema } from \"effect\";\nimport type { SqlError } from \"effect/unstable/sql/SqlError\";\n\nimport {\n column,\n requireStandaloneConsume,\n updateValues,\n type AuthTables,\n type AuthStoreTables,\n type ChallengeConsumeDecision,\n type ConsumeDecision,\n type OAuthStateTables,\n} from \"./model\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype AnyDatabase = SQLiteEffectDatabase<any, any, AnyRelations>;\ntype ClosedQueryEffectHKT = QueryEffectHKTBase & { readonly context: never };\ntype RuntimeDatabase<HKT extends ClosedQueryEffectHKT, RunResult> = SQLiteEffectDatabase<\n HKT,\n RunResult,\n AnyRelations\n> &\n Partial<Parameters<typeof requireStandaloneConsume>[0]>;\ntype TransactionOf<D extends AnyDatabase> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst storeReadError = () => AuthStoreError.make({ message: \"Auth store read failed\" });\nconst storeWriteError = () => AuthStoreError.make({ message: \"Auth store write failed\" });\nconst isStoreFailure = Schema.is(AuthStoreError);\n\nconst mapStoreFailure =\n (failure: () => AuthStoreError) =>\n <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, AuthStoreError, R> =>\n reportPersistenceFailure(effect, isStoreFailure).pipe(\n Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, failure))),\n );\n\nconst mapStoreReadFailure = mapStoreFailure(storeReadError);\nconst mapStoreWriteFailure = mapStoreFailure(storeWriteError);\n\nconst selected = <T extends AnySQLiteTable>(row: unknown): InferSelectModel<T> =>\n row as InferSelectModel<T>;\n\n/**\n * Shared SQLite semantics for libSQL, Node, Bun, WASM, Durable Objects and D1.\n * Every mutation here is one conditional statement, so D1 never reaches its\n * unsupported interactive transaction and Durable Objects never suspend in a\n * transactionSync callback.\n */\nexport const makeSqliteAuthStoreServices = <\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,\n RunResult = unknown,\n>(\n database: SQLiteEffectDatabase<HKT, RunResult, AnyRelations>,\n mapping: AuthStoreTables<C, R>,\n standaloneGuard?: Effect.Effect<void, AuthStoreError>,\n) => {\n const db = database as RuntimeDatabase<HKT, RunResult>;\n\n const requireStandalone =\n standaloneGuard ??\n Effect.suspend(() =>\n db.$client === undefined\n ? AuthStoreError.make({ message: \"Use a root auth store or its decision transaction API\" })\n : requireStandaloneConsume({ $client: db.$client }),\n );\n\n const challengeTable = mapping.challenge.table;\n const challengeColumns = mapping.challenge.columns;\n\n const challenge = {\n challengeId: column(challengeTable, challengeColumns.challengeId),\n tokenDigest: column(challengeTable, challengeColumns.tokenDigest),\n namespace: column(challengeTable, challengeColumns.namespace),\n value: column(challengeTable, challengeColumns.value),\n purpose: column(challengeTable, challengeColumns.purpose),\n otpKeyId: column(challengeTable, challengeColumns.otpKeyId),\n otpDigest: column(challengeTable, challengeColumns.otpDigest),\n issuedAt: column(challengeTable, challengeColumns.issuedAt),\n expiresAt: column(challengeTable, challengeColumns.expiresAt),\n attemptLimit: column(challengeTable, challengeColumns.attemptLimit),\n failedAttempts: column(challengeTable, challengeColumns.failedAttempts),\n consumed: column(challengeTable, challengeColumns.consumed),\n } as Record<string, SQLiteColumn>;\n\n const registrationTable = mapping.registration.table;\n const registrationColumns = mapping.registration.columns;\n\n const registration = {\n tokenDigest: column(registrationTable, registrationColumns.tokenDigest),\n expiresAt: column(registrationTable, registrationColumns.expiresAt),\n consumed: column(registrationTable, registrationColumns.consumed),\n } as Record<string, SQLiteColumn>;\n\n const issueChallenge = Effect.fn(\"DrizzleSqliteAuthStore.issueChallenge\")(function* (\n input: NewChallenge,\n ) {\n const now = yield* DateTime.now;\n\n const cooldownCutoff = DateTime.mapEpochMillis(\n now,\n (millis) => millis - Duration.toMillis(input.resendCooldown),\n );\n\n const rows = (yield* Effect.suspend(() => {\n const values = mapping.challenge.encodeInsert(input, {\n namespace: mapping.challenge.identifierNamespace,\n failedAttempts: 0,\n consumed: false,\n });\n\n const nativeNow = mapping.challenge.encodeInstant(now);\n const nativeCutoff = mapping.challenge.encodeInstant(cooldownCutoff);\n const nativeIssuedAt = mapping.challenge.encodeInstant(input.issuedAt);\n const preservedAttempts = sql`case when ${gt(challenge.expiresAt, nativeNow)} then ${challenge.failedAttempts} else 0 end`;\n\n const update = mapping.challenge.encodeUpdate(input, {\n namespace: mapping.challenge.identifierNamespace,\n failedAttempts: preservedAttempts as any,\n consumed: false,\n });\n\n return db\n .insert(challengeTable as any)\n .values(values as any)\n .onConflictDoUpdate({\n target: [challenge.namespace, challenge.value, challenge.purpose],\n set: update as any,\n setWhere: and(\n ne(challenge.challengeId, input.challengeId),\n lt(challenge.issuedAt, nativeIssuedAt),\n or(eq(challenge.consumed, true), lte(challenge.issuedAt, nativeCutoff)),\n ),\n })\n .returning();\n }).pipe(mapStoreWriteFailure)) as ReadonlyArray<unknown>;\n\n if (rows.length > 0) return;\n\n const existing = (yield* Effect.suspend(() =>\n db\n .select()\n .from(challengeTable as any)\n .where(\n and(\n eq(challenge.namespace, mapping.challenge.identifierNamespace),\n eq(challenge.value, input.email),\n eq(challenge.purpose, input.purpose),\n ),\n )\n .limit(1),\n ).pipe(mapStoreReadFailure)) as ReadonlyArray<unknown>;\n\n const decoded =\n existing[0] === undefined\n ? undefined\n : yield* Effect.suspend(() => mapping.challenge.decode(selected<C>(existing[0]))).pipe(\n mapStoreReadFailure,\n );\n\n const retryAfterSeconds =\n decoded === undefined\n ? Math.max(1, Math.ceil(Duration.toMillis(input.resendCooldown) / 1000))\n : Math.max(\n 1,\n Math.ceil(\n (DateTime.toEpochMillis(decoded.challenge.issuedAt) +\n Duration.toMillis(input.resendCooldown) -\n DateTime.toEpochMillis(now)) /\n 1000,\n ),\n );\n\n return yield* AuthRateLimited.make({ retryAfterSeconds });\n });\n\n const consumeChallengeDecision = Effect.fn(\"DrizzleSqliteAuthStore.consumeChallengeDecision\")(\n function* (\n input: ConsumeChallenge,\n ): Effect.fn.Return<ChallengeConsumeDecision, AuthStoreError> {\n const now = yield* DateTime.now;\n\n const alternatives = Object.entries(input.otpDigests).map(([keyId, digest]) =>\n and(eq(challenge.otpKeyId, keyId), eq(challenge.otpDigest, digest)),\n );\n\n const matches = alternatives.length === 0 ? sql<boolean>`false` : or(...alternatives)!;\n\n const rows = (yield* Effect.suspend(() =>\n db\n .update(challengeTable as any)\n .set(\n updateValues<C>([\n [\n challengeColumns.consumed,\n sql`case when ${matches} then true else ${challenge.consumed} end`,\n ],\n [\n challengeColumns.failedAttempts,\n sql`${challenge.failedAttempts} + case when ${matches} then 0 else 1 end`,\n ],\n ]) as any,\n )\n .where(\n and(\n eq(challenge.tokenDigest, input.tokenDigest),\n eq(challenge.consumed, false),\n gt(challenge.expiresAt, mapping.challenge.encodeInstant(now)),\n sql`${challenge.failedAttempts} < ${challenge.attemptLimit}`,\n ),\n )\n .returning(),\n ).pipe(mapStoreWriteFailure)) as ReadonlyArray<unknown>;\n\n if (rows[0] === undefined) {\n return { _tag: \"rejected\", reason: \"missing_challenge\" };\n }\n\n const decoded = yield* Effect.suspend(() =>\n mapping.challenge.decode(selected<C>(rows[0])),\n ).pipe(mapStoreReadFailure);\n\n if (!decoded.consumed) return { _tag: \"rejected\", reason: \"bad_code\" };\n\n return {\n _tag: \"accepted\",\n value: VerifiedEmail.make({\n email: decoded.challenge.email,\n purpose: decoded.challenge.purpose,\n }),\n };\n },\n );\n\n const consumeChallenge = Effect.fn(\"DrizzleSqliteAuthStore.consumeChallenge\")(function* (\n input: ConsumeChallenge,\n ) {\n yield* requireStandalone;\n const decision = yield* consumeChallengeDecision(input);\n\n return decision._tag === \"accepted\"\n ? decision.value\n : yield* EmailOtpRejected.make({ reason: decision.reason });\n });\n\n const issueRegistration = Effect.fn(\"DrizzleSqliteAuthStore.issueRegistration\")(function* (\n input: NewRegistration,\n ) {\n yield* Effect.suspend(() =>\n db\n .insert(registrationTable as any)\n .values(mapping.registration.encodeInsert(input, false) as any),\n ).pipe(mapStoreWriteFailure);\n });\n\n const inspectRegistration = Effect.fn(\"DrizzleSqliteAuthStore.inspectRegistration\")(function* (\n tokenDigest: TokenDigest,\n ) {\n const now = yield* DateTime.now;\n\n const rows = (yield* Effect.suspend(() =>\n db\n .select()\n .from(registrationTable as any)\n .where(\n and(\n eq(registration.tokenDigest, tokenDigest),\n eq(registration.consumed, false),\n gt(registration.expiresAt, mapping.registration.encodeInstant(now)),\n ),\n )\n .limit(1),\n ).pipe(mapStoreReadFailure)) as ReadonlyArray<unknown>;\n\n if (rows[0] === undefined) return yield* InvalidRegistration.make();\n\n const decoded = yield* Effect.suspend(() =>\n mapping.registration.decode(selected<R>(rows[0])),\n ).pipe(mapStoreReadFailure);\n\n return decoded.registration;\n });\n\n const consumeRegistrationDecision = Effect.fn(\n \"DrizzleSqliteAuthStore.consumeRegistrationDecision\",\n )(function* (\n input: ConsumeRegistration,\n ): Effect.fn.Return<ConsumeDecision<void>, AuthStoreError> {\n const now = yield* DateTime.now;\n\n const rows = (yield* Effect.suspend(() =>\n db\n .update(registrationTable as any)\n .set(updateValues<R>([[registrationColumns.consumed, true]]) as any)\n .where(\n and(\n eq(registration.tokenDigest, input.tokenDigest),\n eq(registration.consumed, false),\n gt(registration.expiresAt, mapping.registration.encodeInstant(now)),\n ),\n )\n .returning({ consumed: registration.consumed }),\n ).pipe(mapStoreWriteFailure)) as ReadonlyArray<unknown>;\n\n return rows.length === 0 ? { _tag: \"rejected\" } : { _tag: \"accepted\", value: undefined };\n });\n\n const consumeRegistration = Effect.fn(\"DrizzleSqliteAuthStore.consumeRegistration\")(function* (\n input: ConsumeRegistration,\n ) {\n yield* requireStandalone;\n const decision = yield* consumeRegistrationDecision(input);\n\n if (decision._tag === \"rejected\") return yield* InvalidRegistration.make();\n });\n\n return {\n authStore: AuthStore.of({\n issueChallenge,\n consumeChallenge,\n issueRegistration,\n inspectRegistration,\n consumeRegistration,\n }),\n decisions: {\n consumeChallenge: consumeChallengeDecision,\n consumeRegistration: consumeRegistrationDecision,\n },\n } as const;\n};\n\nexport const makeSqliteOAuthStateServices = <\n S extends AnySQLiteTable,\n HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,\n RunResult = unknown,\n>(\n database: SQLiteEffectDatabase<HKT, RunResult, AnyRelations>,\n mapping: OAuthStateTables<S>,\n standaloneGuard?: Effect.Effect<void, AuthStoreError>,\n) => {\n const db = database as RuntimeDatabase<HKT, RunResult>;\n\n const requireStandalone =\n standaloneGuard ??\n Effect.suspend(() =>\n db.$client === undefined\n ? AuthStoreError.make({ message: \"Use a root auth store or its decision transaction API\" })\n : requireStandaloneConsume({ $client: db.$client }),\n );\n\n const stateTable = mapping.oauthState.table;\n const stateColumns = mapping.oauthState.columns;\n\n const state = {\n stateDigest: column(stateTable, stateColumns.stateDigest),\n expiresAt: column(stateTable, stateColumns.expiresAt),\n consumed: column(stateTable, stateColumns.consumed),\n } as Record<string, SQLiteColumn>;\n\n const issue = Effect.fn(\"DrizzleSqliteOAuthStateStore.issue\")(function* (input: OAuthState) {\n yield* Effect.suspend(() =>\n db.insert(stateTable as any).values(mapping.oauthState.encodeInsert(input, false) as any),\n ).pipe(mapStoreWriteFailure);\n });\n\n const consumeDecision = Effect.fn(\"DrizzleSqliteOAuthStateStore.consumeDecision\")(function* (\n digest: TokenDigest,\n ): Effect.fn.Return<ConsumeDecision<OAuthState>, AuthStoreError> {\n const now = yield* DateTime.now;\n\n const rows = (yield* Effect.suspend(() =>\n db\n .update(stateTable as any)\n .set(updateValues<S>([[stateColumns.consumed, true]]) as any)\n .where(\n and(\n eq(state.stateDigest, digest),\n eq(state.consumed, false),\n gt(state.expiresAt, mapping.oauthState.encodeInstant(now)),\n ),\n )\n .returning(),\n ).pipe(mapStoreWriteFailure)) as ReadonlyArray<unknown>;\n\n if (rows[0] === undefined) return { _tag: \"rejected\" };\n\n const decoded = yield* Effect.suspend(() =>\n mapping.oauthState.decode(selected<S>(rows[0])),\n ).pipe(mapStoreReadFailure);\n\n return { _tag: \"accepted\", value: decoded.state };\n });\n\n const consume = Effect.fn(\"DrizzleSqliteOAuthStateStore.consume\")(function* (\n digest: TokenDigest,\n ) {\n yield* requireStandalone;\n const decision = yield* consumeDecision(digest);\n\n return decision._tag === \"accepted\" ? decision.value : yield* InvalidOAuthState.make();\n });\n\n return {\n oauthStateStore: OAuthStateStore.of({ issue, consume }),\n decisions: { consumeOAuthState: consumeDecision },\n } as const;\n};\n\nexport const makeSqliteAuthServices = <\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n S extends AnySQLiteTable,\n HKT extends ClosedQueryEffectHKT = ClosedQueryEffectHKT,\n RunResult = unknown,\n>(\n database: SQLiteEffectDatabase<HKT, RunResult, AnyRelations>,\n mapping: AuthTables<C, R, S>,\n standaloneGuard?: Effect.Effect<void, AuthStoreError>,\n) => {\n const auth = makeSqliteAuthStoreServices(database, mapping, standaloneGuard);\n const oauth = makeSqliteOAuthStateServices(database, mapping, standaloneGuard);\n\n return { ...auth, ...oauth, decisions: { ...auth.decisions, ...oauth.decisions } } as const;\n};\n\n/**\n * Owns the native outer commit for interactive SQLite targets. Keep rejection\n * as a decision value inside the owner; interruption before commit rolls back.\n */\nexport function coordinateSqliteAuthStoreTransaction<\n D extends AnyDatabase,\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: AuthStoreTables<C, R>; readonly transaction?: never },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions> | DatabaseRequirements\n>;\n\nexport function coordinateSqliteAuthStoreTransaction<\n D extends AnyDatabase,\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthStoreTables<C, R>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions | TxId> | DatabaseRequirements\n>;\n\nexport function coordinateSqliteAuthStoreTransaction<\n D extends AnyDatabase,\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthStoreTables<C, R>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n) {\n return Effect.flatMap(acquire, (database) =>\n database.transaction<A, E, Exclude<Requirements, AuthStoreDecisions>>((transaction) => {\n const decisions = makeSqliteAuthStoreServices(transaction, options.mapping).decisions;\n const provided = Context.make(AuthStoreDecisions, decisions);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(\n work,\n options.transaction,\n options.transaction.of(transaction as TransactionOf<D>),\n );\n }),\n );\n}\n\nexport function coordinateSqliteOAuthStateTransaction<\n D extends AnyDatabase,\n S extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthStateTables<S>; readonly transaction?: never },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, OAuthStateDecisions> | DatabaseRequirements\n>;\n\nexport function coordinateSqliteOAuthStateTransaction<\n D extends AnyDatabase,\n S extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthStateTables<S>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, OAuthStateDecisions | TxId> | DatabaseRequirements\n>;\n\nexport function coordinateSqliteOAuthStateTransaction<\n D extends AnyDatabase,\n S extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthStateTables<S>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n) {\n return Effect.flatMap(acquire, (database) =>\n database.transaction<A, E, Exclude<Requirements, OAuthStateDecisions>>((transaction) => {\n const decisions = makeSqliteOAuthStateServices(transaction, options.mapping).decisions;\n const provided = Context.make(OAuthStateDecisions, decisions);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(\n work,\n options.transaction,\n options.transaction.of(transaction as TransactionOf<D>),\n );\n }),\n );\n}\n\nexport function coordinateSqliteAuthTransaction<\n D extends AnyDatabase,\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n S extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: AuthTables<C, R, S>; readonly transaction?: never },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions> | DatabaseRequirements\n>;\n\nexport function coordinateSqliteAuthTransaction<\n D extends AnyDatabase,\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n S extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthTables<C, R, S>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n): Effect.Effect<\n A,\n E | DatabaseError | SqlError,\n Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions | TxId> | DatabaseRequirements\n>;\n\nexport function coordinateSqliteAuthTransaction<\n D extends AnyDatabase,\n C extends AnySQLiteTable,\n R extends AnySQLiteTable,\n S extends AnySQLiteTable,\n A,\n E,\n Requirements,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthTables<C, R, S>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, Requirements>,\n) {\n return Effect.flatMap(acquire, (database) =>\n database.transaction<A, E, Exclude<Requirements, AuthStoreDecisions | OAuthStateDecisions>>(\n (transaction) => {\n const decisions = makeSqliteAuthServices(transaction, options.mapping).decisions;\n\n const provided = Context.make(AuthStoreDecisions, decisions).pipe(\n Context.add(OAuthStateDecisions, decisions),\n );\n\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(\n work,\n options.transaction,\n options.transaction.of(transaction as TransactionOf<D>),\n );\n },\n ),\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { requireStandalone } from "@yielded/auth-persistence/Adapter";
|
|
2
|
+
import { Context, Effect, Predicate } from "effect";
|
|
3
|
+
//#region src/drizzle/standalone-guard.ts
|
|
4
|
+
const transactionService = (database) => {
|
|
5
|
+
if (!Predicate.hasProperty(database, "$client") || !Predicate.hasProperty(database.$client, "transactionService") || !Context.isKey(database.$client.transactionService)) return;
|
|
6
|
+
return database.$client.transactionService;
|
|
7
|
+
};
|
|
8
|
+
/** Bind the client-specific transaction marker at foreign adapter construction. */
|
|
9
|
+
const sqlClientStandaloneGuard = (database, unavailable) => {
|
|
10
|
+
const service = transactionService(database);
|
|
11
|
+
if (service === void 0) return Effect.suspend(() => Effect.fail(unavailable()));
|
|
12
|
+
return requireStandalone(unavailable, { transactionService: service });
|
|
13
|
+
};
|
|
14
|
+
//#endregion
|
|
15
|
+
export { sqlClientStandaloneGuard };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=standalone-guard.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-guard.mjs","names":[],"sources":["../../src/drizzle/standalone-guard.ts"],"sourcesContent":["import { requireStandalone } from \"@yielded/auth-persistence/Adapter\";\nimport { Context, Effect, Predicate } from \"effect\";\nimport type * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\ntype TransactionService = Context.Key<\n SqlClient.TransactionConnection,\n SqlClient.TransactionConnection.Service\n>;\n\nconst transactionService = (database: unknown): TransactionService | undefined => {\n if (\n !Predicate.hasProperty(database, \"$client\") ||\n !Predicate.hasProperty(database.$client, \"transactionService\") ||\n !Context.isKey(database.$client.transactionService)\n ) {\n return undefined;\n }\n\n return database.$client.transactionService;\n};\n\n/** Bind the client-specific transaction marker at foreign adapter construction. */\nexport const sqlClientStandaloneGuard = <Failure>(\n database: unknown,\n unavailable: () => Failure,\n): Effect.Effect<void, Failure> => {\n const service = transactionService(database);\n\n if (service === undefined) return Effect.suspend(() => Effect.fail(unavailable()));\n\n return requireStandalone(unavailable, { transactionService: service });\n};\n"],"mappings":";;;AASA,MAAM,sBAAsB,aAAsD;CAChF,IACE,CAAC,UAAU,YAAY,UAAU,SAAS,KAC1C,CAAC,UAAU,YAAY,SAAS,SAAS,oBAAoB,KAC7D,CAAC,QAAQ,MAAM,SAAS,QAAQ,kBAAkB,GAElD;CAGF,OAAO,SAAS,QAAQ;AAC1B;;AAGA,MAAa,4BACX,UACA,gBACiC;CACjC,MAAM,UAAU,mBAAmB,QAAQ;CAE3C,IAAI,YAAY,KAAA,GAAW,OAAO,OAAO,cAAc,OAAO,KAAK,YAAY,CAAC,CAAC;CAEjF,OAAO,kBAAkB,aAAa,EAAE,oBAAoB,QAAQ,CAAC;AACvE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DrizzleTableModel } from "./table-model.mjs";
|
|
2
|
+
import * as Shared from "@yielded/auth-persistence/Adapter";
|
|
3
|
+
import { RequiredSessionStepUpConstraints, requiredSessionStepUpConstraints } from "@yielded/auth-persistence/Adapter";
|
|
4
|
+
import { SQL, Table } from "drizzle-orm";
|
|
5
|
+
//#region src/drizzle/step-up-model.d.ts
|
|
6
|
+
/** Distinct from login-pending storage. Snapshot is TEXT encoded by the core's
|
|
7
|
+
* SessionStepUpIntent schema; it contains no Claims and needs no consumer decoder. */
|
|
8
|
+
export type SessionStepUpIntentTables<Intent extends Table, NativeSubjectId> = Shared.SessionStepUpIntentTables<DrizzleTableModel<Intent>, NativeSubjectId>;
|
|
9
|
+
/** Fixed source discriminator is checked against every stored intent. A minimal
|
|
10
|
+
* pure-signed installation does not provide dummy session or tombstone tables. */
|
|
11
|
+
export type SessionStepUpSourceTables<Claims, Session extends Table, Tombstone extends Table, NativeSubjectId, NativeSessionId> = Shared.SessionStepUpSourceTables<Claims, DrizzleTableModel<Session>, DrizzleTableModel<Tombstone>, NativeSubjectId, NativeSessionId>;
|
|
12
|
+
export type SessionStepUpMapping<Claims, Subject extends Table, Credential extends Table, Intent extends Table, Session extends Table, Tombstone extends Table, NativeSubjectId, NativeSessionId> = Shared.SessionStepUpMapping<Claims, DrizzleTableModel<Subject>, DrizzleTableModel<Credential>, DrizzleTableModel<Intent>, DrizzleTableModel<Session>, DrizzleTableModel<Tombstone>, NativeSubjectId, NativeSessionId>;
|
|
13
|
+
export type D1SessionStepUpMapping<Claims, Subject extends Table, Credential extends Table, Intent extends Table, Session extends Table, Tombstone extends Table, NativeSubjectId, NativeSessionId> = Shared.D1SessionStepUpMapping<Claims, DrizzleTableModel<Subject>, DrizzleTableModel<Credential>, DrizzleTableModel<Intent>, DrizzleTableModel<Session>, DrizzleTableModel<Tombstone>, NativeSubjectId, NativeSessionId, SQL>;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { type RequiredSessionStepUpConstraints, requiredSessionStepUpConstraints };
|
|
16
|
+
//# sourceMappingURL=step-up-model.d.mts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { InferInsertModel, InferSelectModel, Table } from "drizzle-orm";
|
|
2
|
+
//#region src/drizzle/table-model.d.ts
|
|
3
|
+
/** Preserve Drizzle's inferred rows and column keys at the shared mapping boundary. */
|
|
4
|
+
export interface DrizzleTableModel<T extends Table> {
|
|
5
|
+
readonly table: T;
|
|
6
|
+
readonly column: Extract<keyof T["_"]["columns"], string>;
|
|
7
|
+
readonly select: InferSelectModel<T>;
|
|
8
|
+
readonly insert: InferInsertModel<T>;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
//# sourceMappingURL=table-model.d.mts.map
|