@yielded/auth-persistence-drizzle 0.1.0-beta.25 → 0.1.0-beta.26
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 +4 -2
- package/dist/D1.d.mts +495 -1151
- package/dist/D1.mjs +41 -19
- package/dist/D1.mjs.map +1 -1
- package/dist/Libsql.d.mts +385 -1996
- package/dist/Libsql.mjs +43 -47
- package/dist/Libsql.mjs.map +1 -1
- package/dist/Mysql2.d.mts +397 -1743
- package/dist/Mysql2.mjs +35 -41
- package/dist/Mysql2.mjs.map +1 -1
- package/dist/Pglite.d.mts +397 -1743
- package/dist/Pglite.mjs +42 -31
- package/dist/Pglite.mjs.map +1 -1
- package/dist/Postgres.d.mts +397 -1743
- package/dist/Postgres.mjs +42 -31
- package/dist/Postgres.mjs.map +1 -1
- package/dist/SqliteBun.d.mts +385 -1992
- package/dist/SqliteBun.mjs +43 -43
- package/dist/SqliteBun.mjs.map +1 -1
- package/dist/SqliteDo.d.mts +385 -1991
- package/dist/SqliteDo.mjs +42 -41
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +385 -1992
- package/dist/SqliteNode.mjs +43 -43
- package/dist/SqliteNode.mjs.map +1 -1
- package/dist/SqliteWasm.d.mts +385 -1992
- package/dist/SqliteWasm.mjs +43 -43
- package/dist/SqliteWasm.mjs.map +1 -1
- package/dist/drizzle/d1-identity.mjs +2 -2
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/driver-types.d.mts +15 -0
- package/dist/drizzle/email-drivers.mjs +32 -0
- package/dist/drizzle/email-drivers.mjs.map +1 -0
- package/dist/drizzle/email-model.d.mts +9 -13
- package/dist/drizzle/email-target.d.mts +10 -11
- package/dist/drizzle/email-target.mjs +33 -70
- package/dist/drizzle/email-target.mjs.map +1 -1
- package/dist/drizzle/model.d.mts +1 -10
- package/dist/drizzle/model.mjs +1 -2
- package/dist/drizzle/model.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +3 -6
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/native-clock.d.mts +9 -0
- package/dist/drizzle/native-clock.mjs +18 -0
- package/dist/drizzle/native-clock.mjs.map +1 -0
- package/dist/drizzle/native-database.d.mts +46 -0
- package/dist/drizzle/native-database.mjs +6 -5
- package/dist/drizzle/native-database.mjs.map +1 -1
- package/dist/drizzle/native-sql-table.mjs +13 -5
- package/dist/drizzle/native-sql-table.mjs.map +1 -1
- package/dist/drizzle/native-target.d.mts +6 -0
- package/dist/drizzle/native-target.mjs +44 -0
- package/dist/drizzle/native-target.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-drivers.mjs +4 -56
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-model.d.mts +5 -22
- package/dist/drizzle/oauth-connected-model.mjs +1 -7
- package/dist/drizzle/oauth-connected-reference.d.mts +5 -7
- package/dist/drizzle/oauth-connected-reference.mjs +11 -3
- package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs +1 -2
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-model.d.mts +11 -37
- package/dist/drizzle/oauth-model.mjs +3 -4
- package/dist/drizzle/oauth-model.mjs.map +1 -1
- package/dist/drizzle/oauth-proxy.d.mts +1 -1
- package/dist/drizzle/oauth-proxy.mjs +1 -1
- package/dist/drizzle/oauth-target.d.mts +9 -6
- package/dist/drizzle/oauth-target.mjs +47 -15
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey/target.d.mts +14 -0
- package/dist/drizzle/passkey/target.mjs +52 -0
- package/dist/drizzle/passkey/target.mjs.map +1 -0
- package/dist/drizzle/passkey/write-target.d.mts +11 -0
- package/dist/drizzle/passkey/write-target.mjs +28 -0
- package/dist/drizzle/passkey/write-target.mjs.map +1 -0
- package/dist/drizzle/passkey-drivers.mjs +2 -4
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-model.d.mts +5 -26
- package/dist/drizzle/passkey-model.mjs +2 -8
- package/dist/drizzle/passkey-registration-ceremony-model.d.mts +3 -6
- package/dist/drizzle/passkey-write-drivers.mjs +2 -3
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-model.d.mts +7 -9
- package/dist/drizzle/passkey-write-model.mjs +1 -3
- package/dist/drizzle/passkey-write-model.mjs.map +1 -1
- package/dist/drizzle/password-drivers.mjs +31 -0
- package/dist/drizzle/password-drivers.mjs.map +1 -0
- package/dist/drizzle/password-model.d.mts +7 -10
- package/dist/drizzle/password-target.d.mts +7 -8
- package/dist/drizzle/password-target.mjs +23 -68
- package/dist/drizzle/password-target.mjs.map +1 -1
- package/dist/drizzle/pg-identity.mjs +3 -6
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/phone-drivers.mjs +24 -0
- package/dist/drizzle/phone-drivers.mjs.map +1 -0
- package/dist/drizzle/phone-model.d.mts +13 -104
- package/dist/drizzle/phone-model.mjs +5 -33
- package/dist/drizzle/phone-model.mjs.map +1 -1
- package/dist/drizzle/phone-target.mjs +22 -171
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/proof-drivers.mjs +24 -0
- package/dist/drizzle/proof-drivers.mjs.map +1 -0
- package/dist/drizzle/proof-model.d.mts +7 -15
- package/dist/drizzle/proof-target.d.mts +5 -5
- package/dist/drizzle/proof-target.mjs +14 -28
- package/dist/drizzle/proof-target.mjs.map +1 -1
- package/dist/drizzle/session-drivers.mjs +97 -0
- package/dist/drizzle/session-drivers.mjs.map +1 -0
- package/dist/drizzle/session-model.d.mts +11 -22
- package/dist/drizzle/sqlite-do-database.d.mts +3 -3
- package/dist/drizzle/sqlite-do-database.mjs +6 -1
- package/dist/drizzle/sqlite-do-database.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +3 -5
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/step-up-model.d.mts +2 -5
- package/dist/drizzle/storage-validation.mjs +2 -1
- package/dist/drizzle/storage-validation.mjs.map +1 -1
- package/dist/drizzle/totp-model.d.mts +7 -74
- package/dist/drizzle/totp-model.mjs +1 -5
- package/dist/drizzle/totp-model.mjs.map +1 -1
- package/dist/drizzle/totp-target.mjs +39 -75
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/dist/drizzle/transaction-handle.mjs +13 -0
- package/dist/drizzle/transaction-handle.mjs.map +1 -0
- package/dist/drizzle/transaction-mysql.mjs +43 -12
- package/dist/drizzle/transaction-mysql.mjs.map +1 -1
- package/dist/index.d.mts +17 -22
- package/dist/index.mjs +10 -16
- package/dist/internal/drizzle-postgres.mjs +4 -6
- package/dist/internal/drizzle-postgres.mjs.map +1 -1
- package/dist/internal/drizzle-sqlite.mjs +4 -6
- package/dist/internal/drizzle-sqlite.mjs.map +1 -1
- package/package.json +1 -1
- package/src/D1.ts +77 -74
- package/src/Libsql.ts +65 -105
- package/src/Mysql2.ts +52 -87
- package/src/Pglite.ts +74 -81
- package/src/Postgres.ts +74 -81
- package/src/SqliteBun.ts +65 -113
- package/src/SqliteDo.ts +58 -106
- package/src/SqliteNode.ts +65 -113
- package/src/SqliteWasm.ts +65 -113
- package/src/drizzle/d1-identity.ts +2 -2
- package/src/drizzle/driver-types.ts +26 -0
- package/src/drizzle/email-drivers.ts +320 -0
- package/src/drizzle/email-model.ts +24 -78
- package/src/drizzle/email-target.ts +118 -211
- package/src/drizzle/model.ts +0 -2
- package/src/drizzle/mysql-identity.ts +4 -24
- package/src/drizzle/native-clock.ts +21 -0
- package/src/drizzle/native-database.ts +59 -18
- package/src/drizzle/native-sql-table.ts +104 -87
- package/src/drizzle/native-target.ts +120 -0
- package/src/drizzle/oauth-connected-drivers.ts +24 -233
- package/src/drizzle/oauth-connected-model.ts +3 -93
- package/src/drizzle/oauth-connected-reference.ts +16 -25
- package/src/drizzle/oauth-drivers.ts +58 -99
- package/src/drizzle/oauth-model.ts +27 -132
- package/src/drizzle/oauth-target.ts +250 -33
- package/src/drizzle/passkey/target.ts +205 -0
- package/src/drizzle/passkey/write-target.ts +91 -0
- package/src/drizzle/passkey-drivers.ts +35 -133
- package/src/drizzle/passkey-model.ts +3 -81
- package/src/drizzle/passkey-registration-ceremony-model.ts +5 -25
- package/src/drizzle/passkey-write-drivers.ts +32 -102
- package/src/drizzle/passkey-write-model.ts +10 -44
- package/src/drizzle/password-drivers.ts +286 -0
- package/src/drizzle/password-model.ts +10 -44
- package/src/drizzle/password-target.ts +85 -239
- package/src/drizzle/pg-identity.ts +4 -19
- package/src/drizzle/phone-drivers.ts +142 -0
- package/src/drizzle/phone-model.ts +22 -162
- package/src/drizzle/phone-target.ts +51 -493
- package/src/drizzle/proof-drivers.ts +123 -0
- package/src/drizzle/proof-model.ts +12 -123
- package/src/drizzle/proof-target.ts +38 -102
- package/src/drizzle/session-drivers.ts +696 -0
- package/src/drizzle/session-model.ts +54 -118
- package/src/drizzle/sqlite-do-database.ts +8 -0
- package/src/drizzle/sqlite-identity.ts +4 -22
- package/src/drizzle/step-up-model.ts +13 -37
- package/src/drizzle/storage-validation.ts +2 -1
- package/src/drizzle/totp-model.ts +20 -77
- package/src/drizzle/totp-target.ts +121 -261
- package/src/drizzle/transaction-handle.ts +41 -0
- package/src/drizzle/transaction-mysql.ts +90 -25
- package/src/index.ts +7 -122
- package/src/internal/drizzle-postgres.ts +4 -7
- package/src/internal/drizzle-sqlite.ts +4 -7
- package/dist/drizzle/crypto.mjs +0 -11
- package/dist/drizzle/crypto.mjs.map +0 -1
- package/dist/drizzle/d1-emails.d.mts +0 -62
- package/dist/drizzle/d1-emails.mjs +0 -626
- package/dist/drizzle/d1-emails.mjs.map +0 -1
- package/dist/drizzle/d1-generated-statement.mjs +0 -79
- package/dist/drizzle/d1-generated-statement.mjs.map +0 -1
- package/dist/drizzle/d1-oauth.d.mts +0 -331
- package/dist/drizzle/d1-oauth.mjs +0 -79
- package/dist/drizzle/d1-oauth.mjs.map +0 -1
- package/dist/drizzle/d1-passkey.d.mts +0 -37
- package/dist/drizzle/d1-passkey.mjs +0 -98
- package/dist/drizzle/d1-passkey.mjs.map +0 -1
- package/dist/drizzle/d1-password-prepared.d.mts +0 -25
- package/dist/drizzle/d1-password-prepared.mjs +0 -473
- package/dist/drizzle/d1-password-prepared.mjs.map +0 -1
- package/dist/drizzle/d1-passwords.d.mts +0 -70
- package/dist/drizzle/d1-passwords.mjs +0 -808
- package/dist/drizzle/d1-passwords.mjs.map +0 -1
- package/dist/drizzle/d1-phone.d.mts +0 -23
- package/dist/drizzle/d1-phone.mjs +0 -33
- package/dist/drizzle/d1-phone.mjs.map +0 -1
- package/dist/drizzle/d1-planning.d.mts +0 -11
- package/dist/drizzle/d1-planning.mjs +0 -43
- package/dist/drizzle/d1-planning.mjs.map +0 -1
- package/dist/drizzle/d1-proofs.d.mts +0 -80
- package/dist/drizzle/d1-proofs.mjs +0 -842
- package/dist/drizzle/d1-proofs.mjs.map +0 -1
- package/dist/drizzle/d1-sessions.d.mts +0 -68
- package/dist/drizzle/d1-sessions.mjs +0 -987
- package/dist/drizzle/d1-sessions.mjs.map +0 -1
- package/dist/drizzle/d1-totp.d.mts +0 -23
- package/dist/drizzle/d1-totp.mjs +0 -30
- package/dist/drizzle/d1-totp.mjs.map +0 -1
- package/dist/drizzle/email-registration.d.mts +0 -33
- package/dist/drizzle/email-registration.mjs +0 -281
- package/dist/drizzle/email-registration.mjs.map +0 -1
- package/dist/drizzle/email-sql.d.mts +0 -1
- package/dist/drizzle/email-sql.mjs +0 -9
- package/dist/drizzle/email-sql.mjs.map +0 -1
- package/dist/drizzle/mysql-emails.d.mts +0 -71
- package/dist/drizzle/mysql-emails.mjs +0 -43
- package/dist/drizzle/mysql-emails.mjs.map +0 -1
- package/dist/drizzle/mysql-password-prepared.d.mts +0 -30
- package/dist/drizzle/mysql-password-prepared.mjs +0 -21
- package/dist/drizzle/mysql-password-prepared.mjs.map +0 -1
- package/dist/drizzle/mysql-passwords.d.mts +0 -71
- package/dist/drizzle/mysql-passwords.mjs +0 -43
- package/dist/drizzle/mysql-passwords.mjs.map +0 -1
- package/dist/drizzle/mysql-proofs.d.mts +0 -75
- package/dist/drizzle/mysql-proofs.mjs +0 -28
- package/dist/drizzle/mysql-proofs.mjs.map +0 -1
- package/dist/drizzle/mysql-sessions.d.mts +0 -92
- package/dist/drizzle/mysql-sessions.mjs +0 -58
- package/dist/drizzle/mysql-sessions.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-model.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-target.d.mts +0 -6
- package/dist/drizzle/oauth-connected-target.mjs +0 -12
- package/dist/drizzle/oauth-connected-target.mjs.map +0 -1
- package/dist/drizzle/oauth-kernel.mjs +0 -11
- package/dist/drizzle/oauth-kernel.mjs.map +0 -1
- package/dist/drizzle/oauth-mysql.mjs +0 -8
- package/dist/drizzle/oauth-mysql.mjs.map +0 -1
- package/dist/drizzle/passkey-kernel.mjs +0 -8
- package/dist/drizzle/passkey-kernel.mjs.map +0 -1
- package/dist/drizzle/passkey-model.mjs.map +0 -1
- package/dist/drizzle/passkey-registration-ceremony-model.mjs +0 -2
- package/dist/drizzle/passkey-state.mjs +0 -7
- package/dist/drizzle/passkey-state.mjs.map +0 -1
- package/dist/drizzle/passkey-target.d.mts +0 -2
- package/dist/drizzle/passkey-target.mjs +0 -7
- package/dist/drizzle/passkey-target.mjs.map +0 -1
- package/dist/drizzle/passkey-write-target.d.mts +0 -5
- package/dist/drizzle/passkey-write-target.mjs +0 -7
- package/dist/drizzle/passkey-write-target.mjs.map +0 -1
- package/dist/drizzle/password-prepared-model.d.mts +0 -92
- package/dist/drizzle/password-prepared-model.mjs +0 -11
- package/dist/drizzle/password-prepared-model.mjs.map +0 -1
- package/dist/drizzle/password-prepared-sql.mjs +0 -395
- package/dist/drizzle/password-prepared-sql.mjs.map +0 -1
- package/dist/drizzle/password-prepared-state.mjs +0 -104
- package/dist/drizzle/password-prepared-state.mjs.map +0 -1
- package/dist/drizzle/password-prepared-target.d.mts +0 -13
- package/dist/drizzle/password-prepared-target.mjs +0 -62
- package/dist/drizzle/password-prepared-target.mjs.map +0 -1
- package/dist/drizzle/password-registration.d.mts +0 -7
- package/dist/drizzle/password-registration.mjs +0 -137
- package/dist/drizzle/password-registration.mjs.map +0 -1
- package/dist/drizzle/password-sql.d.mts +0 -1
- package/dist/drizzle/password-sql.mjs +0 -10
- package/dist/drizzle/password-sql.mjs.map +0 -1
- package/dist/drizzle/pg-emails.d.mts +0 -72
- package/dist/drizzle/pg-emails.mjs +0 -43
- package/dist/drizzle/pg-emails.mjs.map +0 -1
- package/dist/drizzle/pg-password-prepared.d.mts +0 -31
- package/dist/drizzle/pg-password-prepared.mjs +0 -21
- package/dist/drizzle/pg-password-prepared.mjs.map +0 -1
- package/dist/drizzle/pg-passwords.d.mts +0 -72
- package/dist/drizzle/pg-passwords.mjs +0 -43
- package/dist/drizzle/pg-passwords.mjs.map +0 -1
- package/dist/drizzle/pg-proofs.d.mts +0 -76
- package/dist/drizzle/pg-proofs.mjs +0 -27
- package/dist/drizzle/pg-proofs.mjs.map +0 -1
- package/dist/drizzle/pg-sessions.d.mts +0 -93
- package/dist/drizzle/pg-sessions.mjs +0 -58
- package/dist/drizzle/pg-sessions.mjs.map +0 -1
- package/dist/drizzle/phone-state.mjs +0 -14
- package/dist/drizzle/phone-state.mjs.map +0 -1
- package/dist/drizzle/phone-target.d.mts +0 -15
- package/dist/drizzle/proof-sql.d.mts +0 -1
- package/dist/drizzle/proof-sql.mjs +0 -8
- package/dist/drizzle/proof-sql.mjs.map +0 -1
- package/dist/drizzle/query-operations.mjs +0 -31
- package/dist/drizzle/query-operations.mjs.map +0 -1
- package/dist/drizzle/session-sql.d.mts +0 -1
- package/dist/drizzle/session-sql.mjs +0 -9
- package/dist/drizzle/session-sql.mjs.map +0 -1
- package/dist/drizzle/session-target.d.mts +0 -30
- package/dist/drizzle/session-target.mjs +0 -49
- package/dist/drizzle/session-target.mjs.map +0 -1
- package/dist/drizzle/sqlite-emails.mjs +0 -50
- package/dist/drizzle/sqlite-emails.mjs.map +0 -1
- package/dist/drizzle/sqlite-password-prepared.mjs +0 -26
- package/dist/drizzle/sqlite-password-prepared.mjs.map +0 -1
- package/dist/drizzle/sqlite-passwords.mjs +0 -54
- package/dist/drizzle/sqlite-passwords.mjs.map +0 -1
- package/dist/drizzle/sqlite-proofs.mjs +0 -34
- package/dist/drizzle/sqlite-proofs.mjs.map +0 -1
- package/dist/drizzle/sqlite-sessions.mjs +0 -79
- package/dist/drizzle/sqlite-sessions.mjs.map +0 -1
- package/dist/drizzle/standalone-guard.d.mts +0 -2
- package/dist/drizzle/standalone-guard.mjs +0 -21
- package/dist/drizzle/standalone-guard.mjs.map +0 -1
- package/dist/drizzle/totp-state.d.mts +0 -37
- package/dist/drizzle/totp-state.mjs +0 -287
- package/dist/drizzle/totp-state.mjs.map +0 -1
- package/dist/drizzle/totp-target.d.mts +0 -15
- package/dist/drizzle/transaction-execution.d.mts +0 -2
- package/dist/drizzle/transaction-execution.mjs +0 -11
- package/dist/drizzle/transaction-execution.mjs.map +0 -1
- package/dist/drizzle/transaction-owner.d.mts +0 -1
- package/dist/drizzle/transaction-owner.mjs +0 -8
- package/dist/drizzle/transaction-owner.mjs.map +0 -1
- package/src/drizzle/crypto.ts +0 -14
- package/src/drizzle/d1-emails.ts +0 -1945
- package/src/drizzle/d1-generated-statement.ts +0 -129
- package/src/drizzle/d1-oauth.ts +0 -360
- package/src/drizzle/d1-passkey.ts +0 -383
- package/src/drizzle/d1-password-prepared.ts +0 -1266
- package/src/drizzle/d1-passwords.ts +0 -2061
- package/src/drizzle/d1-phone.ts +0 -103
- package/src/drizzle/d1-planning.ts +0 -104
- package/src/drizzle/d1-proofs.ts +0 -2354
- package/src/drizzle/d1-sessions.ts +0 -2940
- package/src/drizzle/d1-totp.ts +0 -88
- package/src/drizzle/email-registration.ts +0 -850
- package/src/drizzle/email-sql.ts +0 -25
- package/src/drizzle/mysql-emails.ts +0 -343
- package/src/drizzle/mysql-password-prepared.ts +0 -198
- package/src/drizzle/mysql-passwords.ts +0 -343
- package/src/drizzle/mysql-proofs.ts +0 -196
- package/src/drizzle/mysql-sessions.ts +0 -780
- package/src/drizzle/oauth-connected-target.ts +0 -21
- package/src/drizzle/oauth-kernel.ts +0 -10
- package/src/drizzle/oauth-mysql.ts +0 -10
- package/src/drizzle/passkey-kernel.ts +0 -4
- package/src/drizzle/passkey-state.ts +0 -3
- package/src/drizzle/passkey-target.ts +0 -23
- package/src/drizzle/passkey-write-target.ts +0 -9
- package/src/drizzle/password-prepared-model.ts +0 -241
- package/src/drizzle/password-prepared-sql.ts +0 -1202
- package/src/drizzle/password-prepared-state.ts +0 -231
- package/src/drizzle/password-prepared-target.ts +0 -169
- package/src/drizzle/password-registration.ts +0 -369
- package/src/drizzle/password-sql.ts +0 -16
- package/src/drizzle/pg-emails.ts +0 -343
- package/src/drizzle/pg-password-prepared.ts +0 -199
- package/src/drizzle/pg-passwords.ts +0 -342
- package/src/drizzle/pg-proofs.ts +0 -206
- package/src/drizzle/pg-sessions.ts +0 -789
- package/src/drizzle/phone-state.ts +0 -21
- package/src/drizzle/proof-sql.ts +0 -10
- package/src/drizzle/query-operations.ts +0 -49
- package/src/drizzle/session-sql.ts +0 -15
- package/src/drizzle/session-target.ts +0 -337
- package/src/drizzle/sqlite-emails.ts +0 -393
- package/src/drizzle/sqlite-password-prepared.ts +0 -230
- package/src/drizzle/sqlite-passwords.ts +0 -497
- package/src/drizzle/sqlite-proofs.ts +0 -229
- package/src/drizzle/sqlite-sessions.ts +0 -1013
- package/src/drizzle/totp-state.ts +0 -525
- package/src/drizzle/transaction-execution.ts +0 -13
- package/src/drizzle/transaction-owner.ts +0 -11
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type * as Shared from "@yielded/auth-persistence/Adapter";
|
|
2
2
|
import type { SQL, Table } from "drizzle-orm";
|
|
3
3
|
|
|
4
|
+
import type { ClockMapping } from "./native-clock";
|
|
4
5
|
import type { DrizzleTableModel } from "./table-model";
|
|
5
6
|
|
|
6
7
|
export {
|
|
7
8
|
type RequiredPasswordConstraints,
|
|
8
9
|
requiredPasswordConstraints,
|
|
9
|
-
type PasswordConstraintClassifier,
|
|
10
|
-
type PasswordRegistrationState,
|
|
11
10
|
type PasswordRegistrationIntent,
|
|
12
11
|
type RequiredPasswordRegistrationConstraints,
|
|
13
12
|
requiredPasswordRegistrationConstraints,
|
|
@@ -41,52 +40,23 @@ export type PasswordCredentialTable<
|
|
|
41
40
|
NativeSubjectId
|
|
42
41
|
>;
|
|
43
42
|
|
|
44
|
-
export type PasswordCommandTable<Command extends Table> = Shared.PasswordCommandTable<
|
|
45
|
-
DrizzleTableModel<Command>
|
|
46
|
-
>;
|
|
47
|
-
|
|
48
|
-
export type PasswordD1Clock = Shared.PasswordD1Clock<SQL>;
|
|
49
|
-
|
|
50
43
|
export type PasswordPersistenceMapping<
|
|
51
44
|
Subject extends Table,
|
|
52
45
|
Identifier extends Table,
|
|
53
46
|
Credential extends Table,
|
|
54
47
|
AuthorityCredential extends Table,
|
|
55
|
-
Command extends Table,
|
|
56
|
-
NativeSubjectId,
|
|
57
|
-
> = Shared.PasswordPersistenceMapping<
|
|
58
|
-
DrizzleTableModel<Subject>,
|
|
59
|
-
DrizzleTableModel<Identifier>,
|
|
60
|
-
DrizzleTableModel<Credential>,
|
|
61
|
-
DrizzleTableModel<AuthorityCredential>,
|
|
62
|
-
DrizzleTableModel<Command>,
|
|
63
48
|
NativeSubjectId,
|
|
64
|
-
|
|
49
|
+
> = ClockMapping<
|
|
50
|
+
Shared.PasswordPersistenceMapping<
|
|
51
|
+
DrizzleTableModel<Subject>,
|
|
52
|
+
DrizzleTableModel<Identifier>,
|
|
53
|
+
DrizzleTableModel<Credential>,
|
|
54
|
+
DrizzleTableModel<AuthorityCredential>,
|
|
55
|
+
NativeSubjectId,
|
|
56
|
+
SQL
|
|
57
|
+
>
|
|
65
58
|
>;
|
|
66
59
|
|
|
67
|
-
export type D1PasswordPersistenceMapping<
|
|
68
|
-
Subject extends Table,
|
|
69
|
-
Identifier extends Table,
|
|
70
|
-
Credential extends Table,
|
|
71
|
-
AuthorityCredential extends Table,
|
|
72
|
-
Command extends Table,
|
|
73
|
-
NativeSubjectId,
|
|
74
|
-
> = Shared.D1PasswordPersistenceMapping<
|
|
75
|
-
DrizzleTableModel<Subject>,
|
|
76
|
-
DrizzleTableModel<Identifier>,
|
|
77
|
-
DrizzleTableModel<Credential>,
|
|
78
|
-
DrizzleTableModel<AuthorityCredential>,
|
|
79
|
-
DrizzleTableModel<Command>,
|
|
80
|
-
NativeSubjectId,
|
|
81
|
-
SQL
|
|
82
|
-
>;
|
|
83
|
-
|
|
84
|
-
export type PasswordRegistrationTable<
|
|
85
|
-
Registration,
|
|
86
|
-
Request extends Table,
|
|
87
|
-
NativeSubjectId,
|
|
88
|
-
> = Shared.PasswordRegistrationTable<Registration, DrizzleTableModel<Request>, NativeSubjectId>;
|
|
89
|
-
|
|
90
60
|
export type PasswordRegistrationProvisioning<
|
|
91
61
|
Registration,
|
|
92
62
|
Subject extends Table,
|
|
@@ -103,7 +73,6 @@ export type PasswordRegistrationMapping<
|
|
|
103
73
|
Identifier extends Table,
|
|
104
74
|
Credential extends Table,
|
|
105
75
|
AuthorityCredential extends Table,
|
|
106
|
-
Request extends Table,
|
|
107
76
|
NativeSubjectId,
|
|
108
77
|
> = Shared.PasswordRegistrationMapping<
|
|
109
78
|
Registration,
|
|
@@ -111,7 +80,6 @@ export type PasswordRegistrationMapping<
|
|
|
111
80
|
DrizzleTableModel<Identifier>,
|
|
112
81
|
DrizzleTableModel<Credential>,
|
|
113
82
|
DrizzleTableModel<AuthorityCredential>,
|
|
114
|
-
DrizzleTableModel<Request>,
|
|
115
83
|
NativeSubjectId,
|
|
116
84
|
SQL
|
|
117
85
|
>;
|
|
@@ -121,7 +89,6 @@ export type AnyPasswordPersistenceMapping = PasswordPersistenceMapping<
|
|
|
121
89
|
Table,
|
|
122
90
|
Table,
|
|
123
91
|
Table,
|
|
124
|
-
Table,
|
|
125
92
|
unknown
|
|
126
93
|
>;
|
|
127
94
|
|
|
@@ -131,6 +98,5 @@ export type AnyPasswordRegistrationMapping<Registration = unknown> = PasswordReg
|
|
|
131
98
|
Table,
|
|
132
99
|
Table,
|
|
133
100
|
Table,
|
|
134
|
-
Table,
|
|
135
101
|
unknown
|
|
136
102
|
>;
|
|
@@ -1,262 +1,108 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
makeNativePasswordServices,
|
|
3
|
+
makeNativePasswordRegistrationServices,
|
|
4
|
+
requireStandalone,
|
|
5
|
+
type AnyPasswordPersistenceMapping as SharedPasswordMapping,
|
|
6
|
+
type PasswordRegistrationAuthority,
|
|
6
7
|
} from "@yielded/auth-persistence/Adapter";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
hasCommitScope,
|
|
10
|
-
LifecycleHooks,
|
|
11
|
-
type HookConfigurationError,
|
|
12
|
-
} from "@yielded/auth/Hooks";
|
|
13
|
-
import { PasswordUnavailable, PasswordPersistence } from "@yielded/auth/Password";
|
|
14
|
-
/* oxlint-disable no-explicit-any -- public driver wrappers restore concrete Drizzle generics. */
|
|
15
|
-
import { Cause, type Context, Effect, Layer } from "effect";
|
|
16
|
-
import type * as SqlError from "effect/sql/SqlError";
|
|
8
|
+
import { PasswordPersistence, PasswordUnavailable } from "@yielded/auth/Password";
|
|
9
|
+
import { type Context, Effect, Layer } from "effect";
|
|
17
10
|
|
|
11
|
+
import { nativeClock } from "./native-clock";
|
|
12
|
+
import type { NativeDatabaseHandle } from "./native-database";
|
|
18
13
|
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
type
|
|
22
|
-
} from "./
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
} from "./password-sql";
|
|
30
|
-
import type { ProofTargetConfiguration } from "./proof-target";
|
|
31
|
-
import { sqlClientStandaloneGuard, type TransactionService } from "./standalone-guard";
|
|
14
|
+
nativeTarget,
|
|
15
|
+
coordinateNativeTarget,
|
|
16
|
+
type NativeTargetConfiguration,
|
|
17
|
+
} from "./native-target";
|
|
18
|
+
import type {
|
|
19
|
+
AnyPasswordPersistenceMapping,
|
|
20
|
+
AnyPasswordRegistrationMapping,
|
|
21
|
+
} from "./password-model";
|
|
22
|
+
import type { AnyProofPersistenceMapping } from "./proof-model";
|
|
23
|
+
import { nativeProofMapping } from "./proof-target";
|
|
32
24
|
import { validateDrizzleStorage } from "./storage-validation";
|
|
33
25
|
|
|
34
|
-
|
|
35
|
-
readonly mode: "interactive" | "synchronous";
|
|
36
|
-
readonly locking: boolean;
|
|
37
|
-
readonly standaloneGuard: Effect.Effect<void, PasswordUnavailable>;
|
|
38
|
-
readonly coordinatorGuard?: Effect.Effect<void, PasswordUnavailable>;
|
|
39
|
-
readonly insertIfAbsent: (
|
|
40
|
-
query: PasswordSqlQuery,
|
|
41
|
-
selfKey: string,
|
|
42
|
-
selfValue: unknown,
|
|
43
|
-
) => PasswordSqlQuery;
|
|
44
|
-
readonly generatedSubjectRows: (query: PasswordSqlQuery) => PasswordSqlQuery;
|
|
45
|
-
readonly proof: ProofTargetConfiguration;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
interface TransactionOwner<Transaction> {
|
|
49
|
-
readonly transaction: <A, E, R>(
|
|
50
|
-
body: (transaction: Transaction) => Effect.Effect<A, E, R>,
|
|
51
|
-
) => Effect.Effect<A, E | SqlError.SqlError, R>;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export type PasswordCoordinatorError<E> =
|
|
55
|
-
| E
|
|
56
|
-
| PasswordUnavailable
|
|
57
|
-
| HookConfigurationError
|
|
58
|
-
| SqlError.SqlError;
|
|
59
|
-
|
|
60
|
-
export const sqlClientPasswordStandaloneGuard = (
|
|
61
|
-
service: TransactionService | undefined,
|
|
62
|
-
): Effect.Effect<void, PasswordUnavailable> =>
|
|
63
|
-
sqlClientStandaloneGuard(service, () => PasswordUnavailable.make({}));
|
|
64
|
-
|
|
65
|
-
export const passwordOptions = (
|
|
66
|
-
configuration: PasswordTargetConfiguration,
|
|
67
|
-
proofMapping?: any,
|
|
68
|
-
coordinated = false,
|
|
69
|
-
): PasswordSqlConfiguration => ({
|
|
70
|
-
mode: configuration.mode,
|
|
71
|
-
locking: configuration.locking,
|
|
26
|
+
const unavailable = () => PasswordUnavailable.make({});
|
|
72
27
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
coordinated,
|
|
76
|
-
...(proofMapping === undefined
|
|
77
|
-
? {}
|
|
78
|
-
: {
|
|
79
|
-
proof: {
|
|
80
|
-
mapping: proofMapping,
|
|
81
|
-
configuration: {
|
|
82
|
-
mode: configuration.proof.mode,
|
|
83
|
-
locking: configuration.proof.locking,
|
|
28
|
+
export const sqlClientPasswordStandaloneGuard = (marker: Parameters<typeof requireStandalone>[1]) =>
|
|
29
|
+
requireStandalone(unavailable, marker);
|
|
84
30
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
insertIfAbsent: configuration.proof.insertIfAbsent,
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
}),
|
|
31
|
+
const mapped = (value: AnyPasswordPersistenceMapping): SharedPasswordMapping => ({
|
|
32
|
+
...value,
|
|
33
|
+
clock: nativeClock(value.clock),
|
|
92
34
|
});
|
|
93
35
|
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
36
|
+
export const makeTargetPasswordPersistenceServices = Effect.fnUntraced(function* (
|
|
37
|
+
mapping: AnyPasswordPersistenceMapping,
|
|
38
|
+
configuration: NativeTargetConfiguration,
|
|
39
|
+
proofs?: AnyProofPersistenceMapping,
|
|
40
|
+
) {
|
|
41
|
+
yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(unavailable));
|
|
42
|
+
if (proofs !== undefined)
|
|
43
|
+
yield* validateDrizzleStorage(proofs).pipe(Effect.mapError(unavailable));
|
|
44
|
+
if (
|
|
45
|
+
configuration.mode === "batch" &&
|
|
46
|
+
(mapping.d1?.primary !== true || (proofs !== undefined && proofs.d1?.primary !== true))
|
|
47
|
+
)
|
|
48
|
+
return yield* unavailable();
|
|
49
|
+
const target = yield* nativeTarget(configuration);
|
|
50
|
+
|
|
51
|
+
return yield* target.provide(
|
|
52
|
+
makeNativePasswordServices(
|
|
53
|
+
target.tables,
|
|
54
|
+
mapped(mapping),
|
|
55
|
+
proofs === undefined ? undefined : nativeProofMapping(proofs),
|
|
56
|
+
),
|
|
57
|
+
);
|
|
104
58
|
});
|
|
105
59
|
|
|
106
|
-
export const
|
|
107
|
-
mapping:
|
|
108
|
-
configuration:
|
|
109
|
-
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
passwordPersistence: yield* makeSqlPasswordPersistence(
|
|
114
|
-
mapping,
|
|
115
|
-
passwordOptions(configuration, proofMapping),
|
|
116
|
-
),
|
|
117
|
-
};
|
|
118
|
-
});
|
|
60
|
+
export const makeTargetPasswordRegistrationServices = Effect.fnUntraced(function* <Registration>(
|
|
61
|
+
mapping: AnyPasswordRegistrationMapping<Registration>,
|
|
62
|
+
configuration: NativeTargetConfiguration,
|
|
63
|
+
) {
|
|
64
|
+
yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(unavailable));
|
|
65
|
+
const target = yield* nativeTarget(configuration);
|
|
119
66
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
)
|
|
124
|
-
Effect.gen(function* () {
|
|
125
|
-
return {
|
|
126
|
-
registrationAuthority: yield* makeSqlPasswordRegistrationAuthority<Registration>(
|
|
127
|
-
mapping,
|
|
128
|
-
registrationOptions(configuration),
|
|
129
|
-
),
|
|
130
|
-
};
|
|
131
|
-
});
|
|
67
|
+
return yield* target.provide(
|
|
68
|
+
makeNativePasswordRegistrationServices(target.tables, mapping, target.batch),
|
|
69
|
+
);
|
|
70
|
+
});
|
|
132
71
|
|
|
133
|
-
/** Native transaction acquisition exposes SqlError; caller errors propagate unchanged. */
|
|
134
72
|
export const coordinateTargetPasswordPersistence = <Transaction, A, E, R>(
|
|
135
|
-
database:
|
|
136
|
-
mapping:
|
|
137
|
-
configuration:
|
|
138
|
-
|
|
139
|
-
owner: (
|
|
73
|
+
database: NativeDatabaseHandle,
|
|
74
|
+
mapping: AnyPasswordPersistenceMapping,
|
|
75
|
+
configuration: NativeTargetConfiguration,
|
|
76
|
+
body: (
|
|
140
77
|
transaction: Transaction,
|
|
141
78
|
services: { readonly passwordPersistence: PasswordPersistence["Service"] },
|
|
142
79
|
) => Effect.Effect<A, E, R>,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
|
|
153
|
-
|
|
154
|
-
yield* validateDrizzleStorage({ ...mapping, proof: proofMapping }).pipe(
|
|
155
|
-
Effect.mapError(() => PasswordUnavailable.make({})),
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
const result = yield* coordinateCommit(
|
|
159
|
-
() =>
|
|
160
|
-
database.transaction((transaction) =>
|
|
161
|
-
Effect.gen(function* () {
|
|
162
|
-
const postconditions: Array<PasswordPreparedPostcondition> = [];
|
|
163
|
-
let acceptingPostconditions = true;
|
|
164
|
-
|
|
165
|
-
const value = yield* owner(transaction, {
|
|
166
|
-
passwordPersistence: yield* makeSqlPasswordPersistence(
|
|
167
|
-
mapping,
|
|
168
|
-
passwordOptions(configuration, proofMapping, true),
|
|
169
|
-
).pipe(
|
|
170
|
-
Effect.provideService(
|
|
171
|
-
CurrentPasswordSql,
|
|
172
|
-
transaction as unknown as PasswordSqlDatabase,
|
|
173
|
-
),
|
|
174
|
-
),
|
|
175
|
-
}).pipe(
|
|
176
|
-
Effect.provideService(PasswordPreparedPostconditions, {
|
|
177
|
-
register: (check) => {
|
|
178
|
-
if (!acceptingPostconditions) return false;
|
|
179
|
-
postconditions.push(check);
|
|
180
|
-
|
|
181
|
-
return true;
|
|
182
|
-
},
|
|
183
|
-
}),
|
|
184
|
-
Effect.ensuring(
|
|
185
|
-
Effect.sync(() => {
|
|
186
|
-
acceptingPostconditions = false;
|
|
187
|
-
}),
|
|
188
|
-
),
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
// Application work in this transaction must not change what the
|
|
192
|
-
// password mutations committed to; a failure here rolls back both.
|
|
193
|
-
for (const check of postconditions)
|
|
194
|
-
yield* check.pipe(
|
|
195
|
-
Effect.provideService(
|
|
196
|
-
CurrentPasswordPreparedTransaction,
|
|
197
|
-
transaction as unknown as PasswordSqlDatabase,
|
|
198
|
-
),
|
|
199
|
-
Effect.catchCause((cause) =>
|
|
200
|
-
Effect.failCause(Cause.map(cause, () => PasswordUnavailable.make({}))),
|
|
201
|
-
),
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
return value;
|
|
205
|
-
}),
|
|
206
|
-
),
|
|
207
|
-
{ mode: configuration.mode },
|
|
208
|
-
).pipe(Effect.provideService(LifecycleHooks, hooks));
|
|
209
|
-
|
|
210
|
-
return result.value;
|
|
211
|
-
});
|
|
80
|
+
proofs?: AnyProofPersistenceMapping,
|
|
81
|
+
) =>
|
|
82
|
+
coordinateNativeTarget(
|
|
83
|
+
unavailable,
|
|
84
|
+
database,
|
|
85
|
+
configuration,
|
|
86
|
+
makeTargetPasswordPersistenceServices(mapping, configuration, proofs),
|
|
87
|
+
body,
|
|
88
|
+
);
|
|
212
89
|
|
|
213
90
|
export const coordinateTargetPasswordRegistration = <Registration, Transaction, A, E, R>(
|
|
214
|
-
database:
|
|
215
|
-
mapping:
|
|
216
|
-
configuration:
|
|
217
|
-
|
|
91
|
+
database: NativeDatabaseHandle,
|
|
92
|
+
mapping: AnyPasswordRegistrationMapping<Registration>,
|
|
93
|
+
configuration: NativeTargetConfiguration,
|
|
94
|
+
body: (
|
|
218
95
|
transaction: Transaction,
|
|
219
|
-
services: {
|
|
220
|
-
readonly registrationAuthority: PasswordRegistrationAuthority<Registration>;
|
|
221
|
-
},
|
|
96
|
+
services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },
|
|
222
97
|
) => Effect.Effect<A, E, R>,
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});
|
|
232
|
-
yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
|
|
233
|
-
|
|
234
|
-
yield* validateDrizzleStorage(mapping).pipe(
|
|
235
|
-
Effect.mapError(() => PasswordUnavailable.make({})),
|
|
236
|
-
);
|
|
237
|
-
|
|
238
|
-
const result = yield* coordinateCommit(
|
|
239
|
-
() =>
|
|
240
|
-
database.transaction((transaction) =>
|
|
241
|
-
Effect.gen(function* () {
|
|
242
|
-
return yield* owner(transaction, {
|
|
243
|
-
registrationAuthority: yield* makeSqlPasswordRegistrationAuthority<Registration>(
|
|
244
|
-
mapping,
|
|
245
|
-
registrationOptions(configuration, true),
|
|
246
|
-
).pipe(
|
|
247
|
-
Effect.provideService(
|
|
248
|
-
CurrentPasswordSql,
|
|
249
|
-
transaction as unknown as PasswordSqlDatabase,
|
|
250
|
-
),
|
|
251
|
-
),
|
|
252
|
-
});
|
|
253
|
-
}),
|
|
254
|
-
),
|
|
255
|
-
{ mode: configuration.mode },
|
|
256
|
-
).pipe(Effect.provideService(LifecycleHooks, hooks));
|
|
257
|
-
|
|
258
|
-
return result.value;
|
|
259
|
-
});
|
|
98
|
+
) =>
|
|
99
|
+
coordinateNativeTarget(
|
|
100
|
+
unavailable,
|
|
101
|
+
database,
|
|
102
|
+
configuration,
|
|
103
|
+
makeTargetPasswordRegistrationServices(mapping, configuration),
|
|
104
|
+
body,
|
|
105
|
+
);
|
|
260
106
|
|
|
261
107
|
export const passwordPersistenceLayer = <E, R>(
|
|
262
108
|
services: Effect.Effect<{ readonly passwordPersistence: PasswordPersistence["Service"] }, E, R>,
|
|
@@ -267,7 +113,7 @@ export const passwordPersistenceLayer = <E, R>(
|
|
|
267
113
|
);
|
|
268
114
|
|
|
269
115
|
export const passwordRegistrationLayer = <Id, Registration, E, R>(
|
|
270
|
-
|
|
116
|
+
target: Context.Key<Id, PasswordRegistrationAuthority<Registration>>,
|
|
271
117
|
services: Effect.Effect<
|
|
272
118
|
{ readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },
|
|
273
119
|
E,
|
|
@@ -275,6 +121,6 @@ export const passwordRegistrationLayer = <Id, Registration, E, R>(
|
|
|
275
121
|
>,
|
|
276
122
|
) =>
|
|
277
123
|
Layer.effect(
|
|
278
|
-
|
|
124
|
+
target,
|
|
279
125
|
Effect.map(services, (value) => value.registrationAuthority),
|
|
280
126
|
);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { withStorageValidation
|
|
1
|
+
import { withStorageValidation } from "@yielded/auth-persistence/Adapter";
|
|
2
2
|
import {
|
|
3
3
|
ExternalIdentityMutation,
|
|
4
4
|
IdentityConflict,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
type IdentityTables,
|
|
26
26
|
type SubjectProvisioningTables,
|
|
27
27
|
} from "./model";
|
|
28
|
-
import { nativeDatabase } from "./native-database";
|
|
28
|
+
import { NativeDatabase, nativeDatabase } from "./native-database";
|
|
29
29
|
import { Database as DatabaseService } from "./pg-database";
|
|
30
30
|
import { validateDrizzleStorage } from "./storage-validation";
|
|
31
31
|
|
|
@@ -62,8 +62,6 @@ export const makePgSubjectProvisioningServices = Effect.fnUntraced(function* <
|
|
|
62
62
|
const requestFingerprintColumn = column(requestTable, mapping.provisioningRequest.fingerprint);
|
|
63
63
|
const requestSubjectColumn = column(requestTable, mapping.provisioningRequest.subjectId);
|
|
64
64
|
const identifierTable = mapping.identifier.table;
|
|
65
|
-
const identifierNamespaceColumn = column(identifierTable, mapping.identifier.namespace);
|
|
66
|
-
const identifierValueColumn = column(identifierTable, mapping.identifier.value);
|
|
67
65
|
|
|
68
66
|
const findReceipt = Effect.fn("DrizzlePgIdentity.findReceipt")(function* (requestId: string) {
|
|
69
67
|
const rows = yield* db
|
|
@@ -151,21 +149,8 @@ export const makePgSubjectProvisioningServices = Effect.fnUntraced(function* <
|
|
|
151
149
|
if (receipt !== undefined && receipt.fingerprint === fingerprint) {
|
|
152
150
|
return Effect.succeed(receipt.subjectId as NativeId);
|
|
153
151
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return db
|
|
157
|
-
.select({
|
|
158
|
-
subjectId: column(identifierTable, mapping.identifier.subjectId) as PgColumn,
|
|
159
|
-
})
|
|
160
|
-
.from(identifierTable as any)
|
|
161
|
-
.where(
|
|
162
|
-
and(
|
|
163
|
-
eq(identifierNamespaceColumn, input.identifier.namespace),
|
|
164
|
-
eq(identifierValueColumn, input.identifier.value),
|
|
165
|
-
),
|
|
166
|
-
)
|
|
167
|
-
.limit(1)
|
|
168
|
-
.pipe(Effect.flatMap(() => IdentityConflict.make()));
|
|
152
|
+
|
|
153
|
+
return IdentityConflict.make();
|
|
169
154
|
}),
|
|
170
155
|
);
|
|
171
156
|
},
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
2
|
+
import {
|
|
3
|
+
PhonePersistence,
|
|
4
|
+
PhoneSignInTargets,
|
|
5
|
+
type PhoneConfigurationError,
|
|
6
|
+
type PhoneOtpUnavailable,
|
|
7
|
+
} from "@yielded/auth/PhoneOtp";
|
|
8
|
+
import type { Table } from "drizzle-orm";
|
|
9
|
+
import { type Context, Effect, type Crypto } from "effect";
|
|
10
|
+
|
|
11
|
+
import type { NativeDriverDatabase, NativeDriverTransaction } from "./driver-types";
|
|
12
|
+
import { NativeDatabase, nativeDatabase } from "./native-database";
|
|
13
|
+
import type { NativeTargetConfiguration } from "./native-target";
|
|
14
|
+
import type { AnyPhoneMapping, PhoneMapping } from "./phone-model";
|
|
15
|
+
import {
|
|
16
|
+
coordinateTargetPhonePersistence,
|
|
17
|
+
makeTargetPhonePersistenceServices,
|
|
18
|
+
} from "./phone-target";
|
|
19
|
+
import type { SuppliedService } from "./SuppliedService";
|
|
20
|
+
|
|
21
|
+
/** Physical driver selection; the phone workflow has one implementation.
|
|
22
|
+
* Erase only foreign table/ID callback variance at the validated mapping boundary;
|
|
23
|
+
* decoded phone and subject values still pass through their owning codecs. */
|
|
24
|
+
export const makePhoneTarget = <DatabaseId, D extends NativeDriverDatabase>(
|
|
25
|
+
databaseService: Context.Service<DatabaseId, D>,
|
|
26
|
+
configuration: NativeTargetConfiguration,
|
|
27
|
+
) => {
|
|
28
|
+
function coordinatePhonePersistence<
|
|
29
|
+
Database extends D,
|
|
30
|
+
Subject extends Table,
|
|
31
|
+
Identifier extends Table,
|
|
32
|
+
Credential extends Table,
|
|
33
|
+
Proof extends Table,
|
|
34
|
+
NativeId,
|
|
35
|
+
A,
|
|
36
|
+
E,
|
|
37
|
+
R,
|
|
38
|
+
DE,
|
|
39
|
+
DR,
|
|
40
|
+
>(
|
|
41
|
+
acquire: Effect.Effect<Database, DE, DR>,
|
|
42
|
+
options: {
|
|
43
|
+
readonly mapping: PhoneMapping<Subject, Identifier, Credential, Proof, NativeId>;
|
|
44
|
+
readonly transaction?: never;
|
|
45
|
+
},
|
|
46
|
+
body: Effect.Effect<A, E, R>,
|
|
47
|
+
): Effect.Effect<
|
|
48
|
+
A,
|
|
49
|
+
E | DE | PhoneOtpUnavailable | PhoneConfigurationError,
|
|
50
|
+
Exclude<R, PhonePersistence | PhoneSignInTargets> | DR | LifecycleHooks | Crypto.Crypto
|
|
51
|
+
>;
|
|
52
|
+
function coordinatePhonePersistence<
|
|
53
|
+
Database extends D,
|
|
54
|
+
Subject extends Table,
|
|
55
|
+
Identifier extends Table,
|
|
56
|
+
Credential extends Table,
|
|
57
|
+
Proof extends Table,
|
|
58
|
+
NativeId,
|
|
59
|
+
A,
|
|
60
|
+
E,
|
|
61
|
+
R,
|
|
62
|
+
DE,
|
|
63
|
+
DR,
|
|
64
|
+
TxId,
|
|
65
|
+
TxShape,
|
|
66
|
+
>(
|
|
67
|
+
acquire: Effect.Effect<Database, DE, DR>,
|
|
68
|
+
options: {
|
|
69
|
+
readonly mapping: PhoneMapping<Subject, Identifier, Credential, Proof, NativeId>;
|
|
70
|
+
readonly transaction: SuppliedService<
|
|
71
|
+
TxId,
|
|
72
|
+
NoInfer<NativeDriverTransaction<Database>>,
|
|
73
|
+
TxShape
|
|
74
|
+
>;
|
|
75
|
+
},
|
|
76
|
+
body: Effect.Effect<A, E, R>,
|
|
77
|
+
): Effect.Effect<
|
|
78
|
+
A,
|
|
79
|
+
E | DE | PhoneOtpUnavailable | PhoneConfigurationError,
|
|
80
|
+
Exclude<R, PhonePersistence | PhoneSignInTargets | TxId> | DR | LifecycleHooks | Crypto.Crypto
|
|
81
|
+
>;
|
|
82
|
+
function coordinatePhonePersistence<
|
|
83
|
+
Database extends D,
|
|
84
|
+
Subject extends Table,
|
|
85
|
+
Identifier extends Table,
|
|
86
|
+
Credential extends Table,
|
|
87
|
+
Proof extends Table,
|
|
88
|
+
NativeId,
|
|
89
|
+
A,
|
|
90
|
+
E,
|
|
91
|
+
R,
|
|
92
|
+
DE,
|
|
93
|
+
DR,
|
|
94
|
+
TxId,
|
|
95
|
+
TxShape,
|
|
96
|
+
>(
|
|
97
|
+
acquire: Effect.Effect<Database, DE, DR>,
|
|
98
|
+
options: {
|
|
99
|
+
readonly mapping: PhoneMapping<Subject, Identifier, Credential, Proof, NativeId>;
|
|
100
|
+
readonly transaction?: SuppliedService<
|
|
101
|
+
TxId,
|
|
102
|
+
NoInfer<NativeDriverTransaction<Database>>,
|
|
103
|
+
TxShape
|
|
104
|
+
>;
|
|
105
|
+
},
|
|
106
|
+
body: Effect.Effect<A, E, R>,
|
|
107
|
+
) {
|
|
108
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) =>
|
|
109
|
+
coordinateTargetPhonePersistence(
|
|
110
|
+
database,
|
|
111
|
+
options.mapping as unknown as AnyPhoneMapping,
|
|
112
|
+
configuration,
|
|
113
|
+
(transaction: NativeDriverTransaction<Database>, services) => {
|
|
114
|
+
const work = body.pipe(
|
|
115
|
+
Effect.provideService(PhonePersistence, services.phonePersistence),
|
|
116
|
+
Effect.provideService(PhoneSignInTargets, services.phoneSignInTargets),
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
return options.transaction === undefined
|
|
120
|
+
? work
|
|
121
|
+
: Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
122
|
+
},
|
|
123
|
+
),
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
makePhonePersistenceServices: <
|
|
129
|
+
Subject extends Table,
|
|
130
|
+
Identifier extends Table,
|
|
131
|
+
Credential extends Table,
|
|
132
|
+
Proof extends Table,
|
|
133
|
+
NativeId,
|
|
134
|
+
>(
|
|
135
|
+
mapping: PhoneMapping<Subject, Identifier, Credential, Proof, NativeId>,
|
|
136
|
+
) =>
|
|
137
|
+
makeTargetPhonePersistenceServices(mapping as unknown as AnyPhoneMapping, configuration).pipe(
|
|
138
|
+
Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),
|
|
139
|
+
),
|
|
140
|
+
coordinatePhonePersistence,
|
|
141
|
+
};
|
|
142
|
+
};
|