@yielded/auth-persistence-drizzle 0.1.0-beta.24 → 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 -1265
- package/src/drizzle/d1-passwords.ts +0 -2060
- 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 -1201
- 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,104 +0,0 @@
|
|
|
1
|
-
import { passwordSqlKernel } from "./password-sql.mjs";
|
|
2
|
-
import { DateTime, Effect, Redacted, Schema } from "effect";
|
|
3
|
-
import { AuthenticationProof, AuthenticationRequirement, SessionInvalidationWindow } from "@yielded/auth/Sessions";
|
|
4
|
-
import { ProofBinding, ProofContinuationId, ProofPurpose } from "@yielded/auth/Proofs";
|
|
5
|
-
import { PasswordAction, PasswordCommandId, PasswordCredentialSnapshot, PasswordPreparedConfiguration, PasswordPreparedIntentId, PasswordPreparedRequirement, PasswordPreparedReservation, PasswordPreparedReset, PasswordUnavailable, encodePasswordPreparedReady, snapshotPasswordPreparedReady, snapshotPasswordPreparedReservation } from "@yielded/auth/Password";
|
|
6
|
-
import { SubjectId, TokenDigest } from "@yielded/auth/Schema";
|
|
7
|
-
//#region src/drizzle/password-prepared-state.ts
|
|
8
|
-
const unavailable = () => PasswordUnavailable.make({});
|
|
9
|
-
const Instant = Schema.Int.check(Schema.isBetween({
|
|
10
|
-
minimum: 0,
|
|
11
|
-
maximum: 864e13
|
|
12
|
-
}));
|
|
13
|
-
const Label = Schema.NonEmptyString.check(Schema.isMaxLength(256));
|
|
14
|
-
const CompletionInput = Schema.Struct({
|
|
15
|
-
moduleId: Label,
|
|
16
|
-
purpose: ProofPurpose,
|
|
17
|
-
continuationId: ProofContinuationId,
|
|
18
|
-
continuationDigest: TokenDigest.check(Schema.isMaxLength(256)),
|
|
19
|
-
binding: ProofBinding,
|
|
20
|
-
nowMillis: Instant
|
|
21
|
-
});
|
|
22
|
-
const ContextInput = Schema.Struct({
|
|
23
|
-
moduleId: Label,
|
|
24
|
-
generation: PasswordPreparedConfiguration.fields.generation,
|
|
25
|
-
digest: TokenDigest.check(Schema.isMaxLength(256)),
|
|
26
|
-
nowMillis: Instant
|
|
27
|
-
});
|
|
28
|
-
const ReserveInput = Schema.Struct({
|
|
29
|
-
moduleId: Label,
|
|
30
|
-
generation: PasswordPreparedConfiguration.fields.generation,
|
|
31
|
-
intentId: PasswordPreparedIntentId,
|
|
32
|
-
commandId: PasswordCommandId,
|
|
33
|
-
action: PasswordAction,
|
|
34
|
-
subjectId: SubjectId.check(Schema.isMaxLength(256)),
|
|
35
|
-
nowMillis: Instant,
|
|
36
|
-
policy: PasswordPreparedConfiguration,
|
|
37
|
-
invalidation: SessionInvalidationWindow,
|
|
38
|
-
reset: Schema.optionalKey(PasswordPreparedReset),
|
|
39
|
-
completion: Schema.optionalKey(CompletionInput)
|
|
40
|
-
});
|
|
41
|
-
const reserveCodec = Schema.fromJsonString(ReserveInput);
|
|
42
|
-
const snapshotReserve = (input) => Schema.encodeEffect(reserveCodec)(input).pipe(Effect.flatMap(Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(131072)))), Effect.flatMap(Schema.decodeEffect(reserveCodec)), Effect.mapError(unavailable));
|
|
43
|
-
const reservationCodec = Schema.fromJsonString(PasswordPreparedReservation);
|
|
44
|
-
const encodeReservation = (input) => snapshotPasswordPreparedReservation(input).pipe(Effect.flatMap(Schema.encodeEffect(reservationCodec)), Effect.mapError(unavailable));
|
|
45
|
-
const reservationOf = (ready) => {
|
|
46
|
-
const { replacement: _replacement, challenge: _challenge, baseEvidence: _evidence, digest: _digest, issuedAtMillis: _issued, expiresAtMillis: _expires, ...reservation } = ready;
|
|
47
|
-
return {
|
|
48
|
-
...reservation,
|
|
49
|
-
_tag: "Preparing"
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
const sameRevision = (a, b) => a.subjectId === b.subjectId && a.securityRevision === b.securityRevision && a.credentials.length === b.credentials.length && a.credentials.every((c) => b.credentials.some((d) => c.credentialId === d.credentialId && c.revision === d.revision));
|
|
53
|
-
const scopeJson = Schema.encodeSync(Schema.fromJsonString(Schema.Array(Schema.String)));
|
|
54
|
-
const invalidationJson = Schema.encodeSync(Schema.fromJsonString(SessionInvalidationWindow));
|
|
55
|
-
const proofJson = Schema.encodeSync(Schema.fromJsonString(AuthenticationProof));
|
|
56
|
-
const identifierScope = (record) => record.credential === void 0 ? scopeJson(["prepared-subject", record.revision.subjectId]) : scopeJson([
|
|
57
|
-
"prepared-identifier",
|
|
58
|
-
record.credential.identifier.namespace,
|
|
59
|
-
record.credential.identifier.value
|
|
60
|
-
]);
|
|
61
|
-
const credentialCodec = Schema.fromJsonString(PasswordCredentialSnapshot);
|
|
62
|
-
const sameCredential = Effect.fn("DrizzlePasswordPrepared.sameCredential")(function* (a, b) {
|
|
63
|
-
if (a === void 0 || b === void 0) return a === b;
|
|
64
|
-
return (yield* Schema.encodeEffect(credentialCodec)(a).pipe(Effect.mapError(unavailable))) === (yield* Schema.encodeEffect(credentialCodec)(b).pipe(Effect.mapError(unavailable)));
|
|
65
|
-
});
|
|
66
|
-
const requirementJson = Schema.encodeSync(Schema.fromJsonString(AuthenticationRequirement.fields.alternatives));
|
|
67
|
-
const requirementShape = (value) => requirementJson(value.alternatives);
|
|
68
|
-
const snapshotMutation = Effect.fn("DrizzlePasswordPrepared.snapshotMutation")(function* (input) {
|
|
69
|
-
const intent = yield* snapshotPasswordPreparedReady(input.intent);
|
|
70
|
-
const mutation = yield* passwordSqlKernel.snapshotMutationInput(input.mutation);
|
|
71
|
-
const capturedRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(input.capturedRequirement).pipe(Effect.mapError(unavailable));
|
|
72
|
-
const currentRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(input.currentRequirement).pipe(Effect.mapError(unavailable));
|
|
73
|
-
const original = intent.challenge, actual = mutation.authorization.challenge;
|
|
74
|
-
if (mutation.moduleId !== intent.moduleId || mutation.commandId !== intent.commandId || !sameRevision(mutation.expectedRevision, intent.revision) || !(yield* sameCredential(mutation.credential, intent.credential)) || Redacted.value(mutation.replacement.verifier) !== Redacted.value(intent.replacement.verifier) || mutation.replacement.normalization !== intent.replacement.normalization || actual.moduleId !== original.moduleId || actual.action !== original.action || actual.commandId !== original.commandId || actual.bindingDigest !== original.bindingDigest || actual.targetCredentialId !== original.targetCredentialId || !sameRevision(actual.revision, original.revision) || invalidationJson(mutation.invalidation) !== invalidationJson(intent.invalidation) || requirementShape(capturedRequirement) !== requirementShape(intent.capturedRequirement) || capturedRequirement.maximumAgeMillis > intent.capturedRequirement.maximumAgeMillis) return yield* unavailable();
|
|
75
|
-
return {
|
|
76
|
-
intent,
|
|
77
|
-
mutation,
|
|
78
|
-
capturedRequirement,
|
|
79
|
-
currentRequirement,
|
|
80
|
-
nowMillis: input.nowMillis
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
const evidenceCurrent = (input, current, now) => {
|
|
84
|
-
const requirements = [
|
|
85
|
-
input.mutation.authorization.requirement,
|
|
86
|
-
input.intent.capturedRequirement,
|
|
87
|
-
input.capturedRequirement,
|
|
88
|
-
current,
|
|
89
|
-
input.currentRequirement
|
|
90
|
-
];
|
|
91
|
-
if (requirementShape(input.currentRequirement) !== requirementShape(current) || input.currentRequirement.maximumAgeMillis > current.maximumAgeMillis || now < input.intent.issuedAtMillis || now >= input.intent.expiresAtMillis || !requirements.every((requirement) => passwordSqlKernel.evidenceSatisfiedAt(input.mutation.authorization.evidence, requirement, now))) return false;
|
|
92
|
-
const age = Math.min(...requirements.map((requirement) => requirement.maximumAgeMillis));
|
|
93
|
-
return (input.intent.baseEvidence?.proofs ?? []).every((proof) => {
|
|
94
|
-
const verified = DateTime.toEpochMillis(proof.verifiedAt);
|
|
95
|
-
return verified <= now && now - verified < age && input.mutation.authorization.evidence.proofs.some((actual) => proofJson(actual) === proofJson(proof));
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
Effect.fn("DrizzlePasswordPrepared.sameReady")(function* (a, b) {
|
|
99
|
-
return (yield* encodePasswordPreparedReady(a)) === (yield* encodePasswordPreparedReady(b));
|
|
100
|
-
});
|
|
101
|
-
//#endregion
|
|
102
|
-
export { CompletionInput, ContextInput, encodeReservation, evidenceCurrent, identifierScope, reservationOf, sameRevision, snapshotMutation, snapshotReserve, unavailable };
|
|
103
|
-
|
|
104
|
-
//# sourceMappingURL=password-prepared-state.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password-prepared-state.mjs","names":[],"sources":["../../src/drizzle/password-prepared-state.ts"],"sourcesContent":["import {\n PasswordUnavailable,\n PasswordAction,\n PasswordCommandId,\n PasswordCredentialSnapshot,\n PasswordPreparedConfiguration,\n PasswordPreparedIntentId,\n PasswordPreparedReservation,\n PasswordPreparedReset,\n PasswordPreparedRequirement,\n snapshotPasswordPreparedReservation,\n snapshotPasswordPreparedReady,\n encodePasswordPreparedReady,\n type PasswordPreparedReady,\n type PasswordPreparedMutation,\n type PasswordPreparedPersistence,\n} from \"@yielded/auth/Password\";\nimport { ProofBinding, ProofContinuationId, ProofPurpose } from \"@yielded/auth/Proofs\";\nimport { SubjectId, TokenDigest } from \"@yielded/auth/Schema\";\nimport {\n SessionInvalidationWindow,\n AuthenticationProof,\n AuthenticationRequirement,\n type AuthenticationRevision,\n} from \"@yielded/auth/Sessions\";\nimport { DateTime, Effect, Redacted, Schema } from \"effect\";\n\nimport { passwordSqlKernel } from \"./password-sql\";\n\nexport const unavailable = () => PasswordUnavailable.make({});\nconst Instant = Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 8640000000000000 }));\nconst Label = Schema.NonEmptyString.check(Schema.isMaxLength(256));\n\nexport const CompletionInput = Schema.Struct({\n moduleId: Label,\n purpose: ProofPurpose,\n continuationId: ProofContinuationId,\n continuationDigest: TokenDigest.check(Schema.isMaxLength(256)),\n binding: ProofBinding,\n nowMillis: Instant,\n});\n\nexport const ContextInput = Schema.Struct({\n moduleId: Label,\n generation: PasswordPreparedConfiguration.fields.generation,\n digest: TokenDigest.check(Schema.isMaxLength(256)),\n nowMillis: Instant,\n});\n\nconst ReserveInput = Schema.Struct({\n moduleId: Label,\n generation: PasswordPreparedConfiguration.fields.generation,\n intentId: PasswordPreparedIntentId,\n commandId: PasswordCommandId,\n action: PasswordAction,\n subjectId: SubjectId.check(Schema.isMaxLength(256)),\n nowMillis: Instant,\n policy: PasswordPreparedConfiguration,\n invalidation: SessionInvalidationWindow,\n reset: Schema.optionalKey(PasswordPreparedReset),\n completion: Schema.optionalKey(CompletionInput),\n});\n\nconst reserveCodec = Schema.fromJsonString(ReserveInput);\n\nexport const snapshotReserve = (input: Parameters<PasswordPreparedPersistence[\"reserve\"]>[0]) =>\n Schema.encodeEffect(reserveCodec)(input).pipe(\n Effect.flatMap(Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(131072)))),\n Effect.flatMap(Schema.decodeEffect(reserveCodec)),\n Effect.mapError(unavailable),\n );\n\nconst reservationCodec = Schema.fromJsonString(PasswordPreparedReservation);\n\nexport const encodeReservation = (input: PasswordPreparedReservation) =>\n snapshotPasswordPreparedReservation(input).pipe(\n Effect.flatMap(Schema.encodeEffect(reservationCodec)),\n Effect.mapError(unavailable),\n );\n\nexport const decodeReservation = (input: string) =>\n Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(131072)))(input).pipe(\n Effect.flatMap(Schema.decodeEffect(reservationCodec)),\n Effect.flatMap(snapshotPasswordPreparedReservation),\n Effect.mapError(unavailable),\n );\n\nexport const reservationOf = (ready: PasswordPreparedReady): PasswordPreparedReservation => {\n const {\n replacement: _replacement,\n challenge: _challenge,\n baseEvidence: _evidence,\n digest: _digest,\n issuedAtMillis: _issued,\n expiresAtMillis: _expires,\n ...reservation\n } = ready;\n\n return { ...reservation, _tag: \"Preparing\" };\n};\n\nexport const sameRevision = (a: AuthenticationRevision, b: AuthenticationRevision) =>\n a.subjectId === b.subjectId &&\n a.securityRevision === b.securityRevision &&\n a.credentials.length === b.credentials.length &&\n a.credentials.every((c) =>\n b.credentials.some((d) => c.credentialId === d.credentialId && c.revision === d.revision),\n );\n\nconst scopeJson = Schema.encodeSync(Schema.fromJsonString(Schema.Array(Schema.String)));\nconst invalidationJson = Schema.encodeSync(Schema.fromJsonString(SessionInvalidationWindow));\nconst proofJson = Schema.encodeSync(Schema.fromJsonString(AuthenticationProof));\n\nexport const identifierScope = (\n record: Pick<PasswordPreparedReservation, \"credential\" | \"revision\">,\n) =>\n record.credential === undefined\n ? scopeJson([\"prepared-subject\", record.revision.subjectId])\n : scopeJson([\n \"prepared-identifier\",\n record.credential.identifier.namespace,\n record.credential.identifier.value,\n ]);\n\nconst credentialCodec = Schema.fromJsonString(PasswordCredentialSnapshot);\n\nconst sameCredential = Effect.fn(\"DrizzlePasswordPrepared.sameCredential\")(function* (\n a: PasswordPreparedReservation[\"credential\"],\n b: PasswordPreparedReservation[\"credential\"],\n) {\n if (a === undefined || b === undefined) return a === b;\n\n return (\n (yield* Schema.encodeEffect(credentialCodec)(a).pipe(Effect.mapError(unavailable))) ===\n (yield* Schema.encodeEffect(credentialCodec)(b).pipe(Effect.mapError(unavailable)))\n );\n});\n\nconst requirementJson = Schema.encodeSync(\n Schema.fromJsonString(AuthenticationRequirement.fields.alternatives),\n);\n\nconst requirementShape = (value: AuthenticationRequirement) => requirementJson(value.alternatives);\n\nexport const snapshotMutation = Effect.fn(\"DrizzlePasswordPrepared.snapshotMutation\")(function* (\n input: PasswordPreparedMutation,\n) {\n const intent = yield* snapshotPasswordPreparedReady(input.intent);\n const mutation = yield* passwordSqlKernel.snapshotMutationInput(input.mutation);\n\n const capturedRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(\n input.capturedRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n const currentRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(\n input.currentRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n const original = intent.challenge,\n actual = mutation.authorization.challenge;\n\n if (\n mutation.moduleId !== intent.moduleId ||\n mutation.commandId !== intent.commandId ||\n !sameRevision(mutation.expectedRevision, intent.revision) ||\n !(yield* sameCredential(mutation.credential, intent.credential)) ||\n Redacted.value(mutation.replacement.verifier) !== Redacted.value(intent.replacement.verifier) ||\n mutation.replacement.normalization !== intent.replacement.normalization ||\n actual.moduleId !== original.moduleId ||\n actual.action !== original.action ||\n actual.commandId !== original.commandId ||\n actual.bindingDigest !== original.bindingDigest ||\n actual.targetCredentialId !== original.targetCredentialId ||\n !sameRevision(actual.revision, original.revision) ||\n invalidationJson(mutation.invalidation) !== invalidationJson(intent.invalidation) ||\n requirementShape(capturedRequirement) !== requirementShape(intent.capturedRequirement) ||\n capturedRequirement.maximumAgeMillis > intent.capturedRequirement.maximumAgeMillis\n )\n return yield* unavailable();\n\n return { intent, mutation, capturedRequirement, currentRequirement, nowMillis: input.nowMillis };\n});\n\nexport const evidenceCurrent = (\n input: PasswordPreparedMutation,\n current: AuthenticationRequirement,\n now: number,\n) => {\n const requirements = [\n input.mutation.authorization.requirement,\n input.intent.capturedRequirement,\n input.capturedRequirement,\n current,\n input.currentRequirement,\n ];\n\n if (\n requirementShape(input.currentRequirement) !== requirementShape(current) ||\n input.currentRequirement.maximumAgeMillis > current.maximumAgeMillis ||\n now < input.intent.issuedAtMillis ||\n now >= input.intent.expiresAtMillis ||\n !requirements.every((requirement) =>\n passwordSqlKernel.evidenceSatisfiedAt(\n input.mutation.authorization.evidence,\n requirement,\n now,\n ),\n )\n )\n return false;\n const age = Math.min(...requirements.map((requirement) => requirement.maximumAgeMillis));\n\n return (input.intent.baseEvidence?.proofs ?? []).every((proof) => {\n const verified = DateTime.toEpochMillis(proof.verifiedAt);\n\n return (\n verified <= now &&\n now - verified < age &&\n input.mutation.authorization.evidence.proofs.some(\n (actual) => proofJson(actual) === proofJson(proof),\n )\n );\n });\n};\n\nexport const sameReady = Effect.fn(\"DrizzlePasswordPrepared.sameReady\")(function* (\n a: PasswordPreparedReady,\n b: PasswordPreparedReady,\n) {\n return (yield* encodePasswordPreparedReady(a)) === (yield* encodePasswordPreparedReady(b));\n});\n"],"mappings":";;;;;;;AA6BA,MAAa,oBAAoB,oBAAoB,KAAK,CAAC,CAAC;AAC5D,MAAM,UAAU,OAAO,IAAI,MAAM,OAAO,UAAU;CAAE,SAAS;CAAG,SAAS;AAAiB,CAAC,CAAC;AAC5F,MAAM,QAAQ,OAAO,eAAe,MAAM,OAAO,YAAY,GAAG,CAAC;AAEjE,MAAa,kBAAkB,OAAO,OAAO;CAC3C,UAAU;CACV,SAAS;CACT,gBAAgB;CAChB,oBAAoB,YAAY,MAAM,OAAO,YAAY,GAAG,CAAC;CAC7D,SAAS;CACT,WAAW;AACb,CAAC;AAED,MAAa,eAAe,OAAO,OAAO;CACxC,UAAU;CACV,YAAY,8BAA8B,OAAO;CACjD,QAAQ,YAAY,MAAM,OAAO,YAAY,GAAG,CAAC;CACjD,WAAW;AACb,CAAC;AAED,MAAM,eAAe,OAAO,OAAO;CACjC,UAAU;CACV,YAAY,8BAA8B,OAAO;CACjD,UAAU;CACV,WAAW;CACX,QAAQ;CACR,WAAW,UAAU,MAAM,OAAO,YAAY,GAAG,CAAC;CAClD,WAAW;CACX,QAAQ;CACR,cAAc;CACd,OAAO,OAAO,YAAY,qBAAqB;CAC/C,YAAY,OAAO,YAAY,eAAe;AAChD,CAAC;AAED,MAAM,eAAe,OAAO,eAAe,YAAY;AAEvD,MAAa,mBAAmB,UAC9B,OAAO,aAAa,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KACvC,OAAO,QAAQ,OAAO,aAAa,OAAO,OAAO,MAAM,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,GACnF,OAAO,QAAQ,OAAO,aAAa,YAAY,CAAC,GAChD,OAAO,SAAS,WAAW,CAC7B;AAEF,MAAM,mBAAmB,OAAO,eAAe,2BAA2B;AAE1E,MAAa,qBAAqB,UAChC,oCAAoC,KAAK,CAAC,CAAC,KACzC,OAAO,QAAQ,OAAO,aAAa,gBAAgB,CAAC,GACpD,OAAO,SAAS,WAAW,CAC7B;AASF,MAAa,iBAAiB,UAA8D;CAC1F,MAAM,EACJ,aAAa,cACb,WAAW,YACX,cAAc,WACd,QAAQ,SACR,gBAAgB,SAChB,iBAAiB,UACjB,GAAG,gBACD;CAEJ,OAAO;EAAE,GAAG;EAAa,MAAM;CAAY;AAC7C;AAEA,MAAa,gBAAgB,GAA2B,MACtD,EAAE,cAAc,EAAE,aAClB,EAAE,qBAAqB,EAAE,oBACzB,EAAE,YAAY,WAAW,EAAE,YAAY,UACvC,EAAE,YAAY,OAAO,MACnB,EAAE,YAAY,MAAM,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,CAC1F;AAEF,MAAM,YAAY,OAAO,WAAW,OAAO,eAAe,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC;AACtF,MAAM,mBAAmB,OAAO,WAAW,OAAO,eAAe,yBAAyB,CAAC;AAC3F,MAAM,YAAY,OAAO,WAAW,OAAO,eAAe,mBAAmB,CAAC;AAE9E,MAAa,mBACX,WAEA,OAAO,eAAe,KAAA,IAClB,UAAU,CAAC,oBAAoB,OAAO,SAAS,SAAS,CAAC,IACzD,UAAU;CACR;CACA,OAAO,WAAW,WAAW;CAC7B,OAAO,WAAW,WAAW;AAC/B,CAAC;AAEP,MAAM,kBAAkB,OAAO,eAAe,0BAA0B;AAExE,MAAM,iBAAiB,OAAO,GAAG,wCAAwC,CAAC,CAAC,WACzE,GACA,GACA;CACA,IAAI,MAAM,KAAA,KAAa,MAAM,KAAA,GAAW,OAAO,MAAM;CAErD,QACG,OAAO,OAAO,aAAa,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,SAAS,WAAW,CAAC,QAChF,OAAO,OAAO,aAAa,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,SAAS,WAAW,CAAC;AAErF,CAAC;AAED,MAAM,kBAAkB,OAAO,WAC7B,OAAO,eAAe,0BAA0B,OAAO,YAAY,CACrE;AAEA,MAAM,oBAAoB,UAAqC,gBAAgB,MAAM,YAAY;AAEjG,MAAa,mBAAmB,OAAO,GAAG,0CAA0C,CAAC,CAAC,WACpF,OACA;CACA,MAAM,SAAS,OAAO,8BAA8B,MAAM,MAAM;CAChE,MAAM,WAAW,OAAO,kBAAkB,sBAAsB,MAAM,QAAQ;CAE9E,MAAM,sBAAsB,OAAO,OAAO,aAAa,2BAA2B,CAAC,CACjF,MAAM,mBACR,CAAC,CAAC,KAAK,OAAO,SAAS,WAAW,CAAC;CAEnC,MAAM,qBAAqB,OAAO,OAAO,aAAa,2BAA2B,CAAC,CAChF,MAAM,kBACR,CAAC,CAAC,KAAK,OAAO,SAAS,WAAW,CAAC;CAEnC,MAAM,WAAW,OAAO,WACtB,SAAS,SAAS,cAAc;CAElC,IACE,SAAS,aAAa,OAAO,YAC7B,SAAS,cAAc,OAAO,aAC9B,CAAC,aAAa,SAAS,kBAAkB,OAAO,QAAQ,KACxD,EAAE,OAAO,eAAe,SAAS,YAAY,OAAO,UAAU,MAC9D,SAAS,MAAM,SAAS,YAAY,QAAQ,MAAM,SAAS,MAAM,OAAO,YAAY,QAAQ,KAC5F,SAAS,YAAY,kBAAkB,OAAO,YAAY,iBAC1D,OAAO,aAAa,SAAS,YAC7B,OAAO,WAAW,SAAS,UAC3B,OAAO,cAAc,SAAS,aAC9B,OAAO,kBAAkB,SAAS,iBAClC,OAAO,uBAAuB,SAAS,sBACvC,CAAC,aAAa,OAAO,UAAU,SAAS,QAAQ,KAChD,iBAAiB,SAAS,YAAY,MAAM,iBAAiB,OAAO,YAAY,KAChF,iBAAiB,mBAAmB,MAAM,iBAAiB,OAAO,mBAAmB,KACrF,oBAAoB,mBAAmB,OAAO,oBAAoB,kBAElE,OAAO,OAAO,YAAY;CAE5B,OAAO;EAAE;EAAQ;EAAU;EAAqB;EAAoB,WAAW,MAAM;CAAU;AACjG,CAAC;AAED,MAAa,mBACX,OACA,SACA,QACG;CACH,MAAM,eAAe;EACnB,MAAM,SAAS,cAAc;EAC7B,MAAM,OAAO;EACb,MAAM;EACN;EACA,MAAM;CACR;CAEA,IACE,iBAAiB,MAAM,kBAAkB,MAAM,iBAAiB,OAAO,KACvE,MAAM,mBAAmB,mBAAmB,QAAQ,oBACpD,MAAM,MAAM,OAAO,kBACnB,OAAO,MAAM,OAAO,mBACpB,CAAC,aAAa,OAAO,gBACnB,kBAAkB,oBAChB,MAAM,SAAS,cAAc,UAC7B,aACA,GACF,CACF,GAEA,OAAO;CACT,MAAM,MAAM,KAAK,IAAI,GAAG,aAAa,KAAK,gBAAgB,YAAY,gBAAgB,CAAC;CAEvF,QAAQ,MAAM,OAAO,cAAc,UAAU,CAAC,EAAA,CAAG,OAAO,UAAU;EAChE,MAAM,WAAW,SAAS,cAAc,MAAM,UAAU;EAExD,OACE,YAAY,OACZ,MAAM,WAAW,OACjB,MAAM,SAAS,cAAc,SAAS,OAAO,MAC1C,WAAW,UAAU,MAAM,MAAM,UAAU,KAAK,CACnD;CAEJ,CAAC;AACH;AAEyB,OAAO,GAAG,mCAAmC,CAAC,CAAC,WACtE,GACA,GACA;CACA,QAAQ,OAAO,4BAA4B,CAAC,QAAQ,OAAO,4BAA4B,CAAC;AAC1F,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import "./password-sql.mjs";
|
|
2
|
-
import "./password-target.mjs";
|
|
3
|
-
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
4
|
-
import { Context, Effect, Layer } from "effect";
|
|
5
|
-
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
6
|
-
import { PasswordPreparedPersistence, PasswordUnavailable } from "@yielded/auth/Password";
|
|
7
|
-
import "effect/sql/SqlError";
|
|
8
|
-
//#region src/drizzle/password-prepared-target.d.ts
|
|
9
|
-
export declare const passwordPreparedPersistenceLayer: <Id, E, R>(tag: Context.Key<Id, PasswordPreparedPersistence>, services: Effect.Effect<{
|
|
10
|
-
readonly passwordPreparedPersistence: PasswordPreparedPersistence;
|
|
11
|
-
}, E, R>) => Layer.Layer<Id, E, Exclude<R, import("effect/Scope").Scope>>;
|
|
12
|
-
//#endregion
|
|
13
|
-
//# sourceMappingURL=password-prepared-target.d.mts.map
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { validateDrizzleStorage } from "./storage-validation.mjs";
|
|
2
|
-
import { CurrentPasswordSql } from "./password-sql.mjs";
|
|
3
|
-
import { passwordOptions } from "./password-target.mjs";
|
|
4
|
-
import { makeSqlPasswordPreparedPersistence } from "./password-prepared-sql.mjs";
|
|
5
|
-
import { CurrentPasswordPreparedTransaction, PasswordPreparedJournalGuards, PasswordPreparedPostconditions } from "@yielded/auth-persistence/Adapter";
|
|
6
|
-
import { Cause, Effect, Layer } from "effect";
|
|
7
|
-
import { LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
|
|
8
|
-
import { PasswordUnavailable } from "@yielded/auth/Password";
|
|
9
|
-
//#region src/drizzle/password-prepared-target.ts
|
|
10
|
-
const makeTargetPasswordPreparedPersistenceServices = (mapping, configuration, proofMapping) => Effect.gen(function* () {
|
|
11
|
-
return { passwordPreparedPersistence: yield* makeSqlPasswordPreparedPersistence(mapping, passwordOptions(configuration, proofMapping)) };
|
|
12
|
-
});
|
|
13
|
-
const coordinateTargetPasswordPreparedPersistence = (database, mapping, configuration, proofMapping, owner) => Effect.gen(function* () {
|
|
14
|
-
const hooks = yield* LifecycleHooks;
|
|
15
|
-
if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});
|
|
16
|
-
yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
|
|
17
|
-
yield* validateDrizzleStorage({
|
|
18
|
-
...mapping,
|
|
19
|
-
proof: proofMapping
|
|
20
|
-
}).pipe(Effect.mapError(() => PasswordUnavailable.make({})));
|
|
21
|
-
return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
|
|
22
|
-
const guards = [];
|
|
23
|
-
const postconditions = [];
|
|
24
|
-
let poisoned = false;
|
|
25
|
-
let acceptingPostconditions = true;
|
|
26
|
-
const services = yield* makeSqlPasswordPreparedPersistence(mapping, passwordOptions(configuration, proofMapping, true)).pipe(Effect.provideService(CurrentPasswordSql, transaction));
|
|
27
|
-
const protect = (effect) => effect.pipe(Effect.onError(() => Effect.sync(() => {
|
|
28
|
-
poisoned = true;
|
|
29
|
-
})));
|
|
30
|
-
const value = yield* owner(transaction, { passwordPreparedPersistence: {
|
|
31
|
-
reserve: (input, prepare) => protect(services.reserve(input, prepare)),
|
|
32
|
-
publishReady: (input, prepare) => protect(services.publishReady(input, prepare)),
|
|
33
|
-
context: (input) => protect(services.context(input)),
|
|
34
|
-
complete: (input, prepare) => protect(services.complete(input, prepare)),
|
|
35
|
-
resetWithProof: (input, prepare) => protect(services.resetWithProof(input, prepare)),
|
|
36
|
-
cancel: (input, prepare) => protect(services.cancel(input, prepare)),
|
|
37
|
-
cleanup: (input, prepare) => protect(services.cleanup(input, prepare))
|
|
38
|
-
} }).pipe(Effect.provideService(PasswordPreparedJournalGuards, { register: (guard) => {
|
|
39
|
-
if (!acceptingPostconditions) return false;
|
|
40
|
-
guards.push(guard);
|
|
41
|
-
return true;
|
|
42
|
-
} }), Effect.provideService(PasswordPreparedPostconditions, { register: (check) => {
|
|
43
|
-
if (!acceptingPostconditions) return false;
|
|
44
|
-
postconditions.push(check);
|
|
45
|
-
return true;
|
|
46
|
-
} }), Effect.ensuring(Effect.sync(() => {
|
|
47
|
-
acceptingPostconditions = false;
|
|
48
|
-
})));
|
|
49
|
-
if (poisoned) return yield* PasswordUnavailable.make({});
|
|
50
|
-
for (const guard of guards) {
|
|
51
|
-
const status = yield* Effect.result(guard.read);
|
|
52
|
-
if (status._tag === "Success" || status.failure._tag !== "CommitPending") return yield* PasswordUnavailable.make({});
|
|
53
|
-
}
|
|
54
|
-
for (const check of postconditions) yield* check.pipe(Effect.provideService(CurrentPasswordPreparedTransaction, transaction), Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => PasswordUnavailable.make({})))));
|
|
55
|
-
return value;
|
|
56
|
-
})), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
|
|
57
|
-
});
|
|
58
|
-
const passwordPreparedPersistenceLayer = (tag, services) => Layer.effect(tag, Effect.map(services, (value) => value.passwordPreparedPersistence));
|
|
59
|
-
//#endregion
|
|
60
|
-
export { coordinateTargetPasswordPreparedPersistence, makeTargetPasswordPreparedPersistenceServices, passwordPreparedPersistenceLayer };
|
|
61
|
-
|
|
62
|
-
//# sourceMappingURL=password-prepared-target.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password-prepared-target.mjs","names":[],"sources":["../../src/drizzle/password-prepared-target.ts"],"sourcesContent":["import {\n type NativeDatabase,\n CurrentPasswordPreparedTransaction,\n PasswordPreparedPostconditions,\n PasswordPreparedJournalGuards,\n type PasswordPreparedPostcondition,\n} from \"@yielded/auth-persistence/Adapter\";\nimport {\n coordinateCommit,\n hasCommitScope,\n type PreparedCommit,\n LifecycleHooks,\n} from \"@yielded/auth/Hooks\";\nimport { PasswordUnavailable, type PasswordPreparedPersistence } from \"@yielded/auth/Password\";\n/* oxlint-disable no-explicit-any -- concrete driver modules restore native table/database types. */\nimport { type Context, Cause, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport { makeSqlPasswordPreparedPersistence } from \"./password-prepared-sql\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport type { PasswordSqlDatabase } from \"./password-sql\";\nimport {\n passwordOptions,\n type PasswordTargetConfiguration,\n type PasswordCoordinatorError,\n} from \"./password-target\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\n\nexport const makeTargetPasswordPreparedPersistenceServices = (\n mapping: any,\n configuration: PasswordTargetConfiguration,\n proofMapping?: any,\n) =>\n Effect.gen(function* () {\n return {\n passwordPreparedPersistence: yield* makeSqlPasswordPreparedPersistence(\n mapping,\n passwordOptions(configuration, proofMapping),\n ),\n };\n });\n\nexport const coordinateTargetPasswordPreparedPersistence = <Transaction, A, E, R>(\n database: {\n readonly transaction: <Out, Err, Env>(\n body: (transaction: Transaction) => Effect.Effect<Out, Err, Env>,\n ) => Effect.Effect<Out, Err | SqlError.SqlError, Env>;\n },\n mapping: any,\n configuration: PasswordTargetConfiguration,\n proofMapping: any | undefined,\n owner: (\n transaction: Transaction,\n services: { readonly passwordPreparedPersistence: PasswordPreparedPersistence },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, PasswordCoordinatorError<E>, R | LifecycleHooks | NativeDatabase> =>\n Effect.gen(function* () {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n yield* validateDrizzleStorage({ ...mapping, proof: proofMapping }).pipe(\n Effect.mapError(() => PasswordUnavailable.make({})),\n );\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n const guards: Array<PreparedCommit<void>> = [];\n const postconditions: Array<PasswordPreparedPostcondition> = [];\n let poisoned = false;\n let acceptingPostconditions = true;\n\n const services = yield* makeSqlPasswordPreparedPersistence(\n mapping,\n passwordOptions(configuration, proofMapping, true),\n ).pipe(\n Effect.provideService(\n CurrentPasswordSql,\n transaction as unknown as PasswordSqlDatabase,\n ),\n );\n\n const protect = <Out, Err, Env>(effect: Effect.Effect<Out, Err, Env>) =>\n effect.pipe(\n Effect.onError(() =>\n Effect.sync(() => {\n poisoned = true;\n }),\n ),\n );\n\n const value = yield* owner(transaction, {\n passwordPreparedPersistence: {\n reserve: (input, prepare) => protect(services.reserve(input, prepare)),\n publishReady: (input, prepare) => protect(services.publishReady(input, prepare)),\n context: (input) => protect(services.context(input)),\n complete: (input, prepare) => protect(services.complete(input, prepare)),\n resetWithProof: (input, prepare) =>\n protect(services.resetWithProof(input, prepare)),\n cancel: (input, prepare) => protect(services.cancel(input, prepare)),\n cleanup: (input, prepare) => protect(services.cleanup(input, prepare)),\n },\n }).pipe(\n Effect.provideService(PasswordPreparedJournalGuards, {\n register: (guard) => {\n if (!acceptingPostconditions) return false;\n guards.push(guard);\n\n return true;\n },\n }),\n Effect.provideService(PasswordPreparedPostconditions, {\n register: (check) => {\n if (!acceptingPostconditions) return false;\n postconditions.push(check);\n\n return true;\n },\n }),\n Effect.ensuring(\n Effect.sync(() => {\n acceptingPostconditions = false;\n }),\n ),\n );\n\n if (poisoned) return yield* PasswordUnavailable.make({});\n for (const guard of guards) {\n const status = yield* Effect.result(guard.read);\n\n if (status._tag === \"Success\" || status.failure._tag !== \"CommitPending\")\n return yield* PasswordUnavailable.make({});\n }\n\n for (const check of postconditions)\n yield* check.pipe(\n Effect.provideService(\n CurrentPasswordPreparedTransaction,\n transaction as unknown as PasswordSqlDatabase,\n ),\n Effect.catchCause((cause) =>\n Effect.failCause(Cause.map(cause, () => PasswordUnavailable.make({}))),\n ),\n );\n\n return value;\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const passwordPreparedPersistenceLayer = <Id, E, R>(\n tag: Context.Key<Id, PasswordPreparedPersistence>,\n services: Effect.Effect<\n { readonly passwordPreparedPersistence: PasswordPreparedPersistence },\n E,\n R\n >,\n) =>\n Layer.effect(\n tag,\n Effect.map(services, (value) => value.passwordPreparedPersistence),\n );\n"],"mappings":";;;;;;;;;AA4BA,MAAa,iDACX,SACA,eACA,iBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,6BAA6B,OAAO,mCAClC,SACA,gBAAgB,eAAe,YAAY,CAC7C,EACF;AACF,CAAC;AAEH,MAAa,+CACX,UAKA,SACA,eACA,cACA,UAKA,OAAO,IAAI,aAAa;CACtB,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;CACpE,OAAO,cAAc,oBAAoB,cAAc;CAEvD,OAAO,uBAAuB;EAAE,GAAG;EAAS,OAAO;CAAa,CAAC,CAAC,CAAC,KACjE,OAAO,eAAe,oBAAoB,KAAK,CAAC,CAAC,CAAC,CACpD;CA0FA,QAAO,OAxFe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,MAAM,SAAsC,CAAC;EAC7C,MAAM,iBAAuD,CAAC;EAC9D,IAAI,WAAW;EACf,IAAI,0BAA0B;EAE9B,MAAM,WAAW,OAAO,mCACtB,SACA,gBAAgB,eAAe,cAAc,IAAI,CACnD,CAAC,CAAC,KACA,OAAO,eACL,oBACA,WACF,CACF;EAEA,MAAM,WAA0B,WAC9B,OAAO,KACL,OAAO,cACL,OAAO,WAAW;GAChB,WAAW;EACb,CAAC,CACH,CACF;EAEF,MAAM,QAAQ,OAAO,MAAM,aAAa,EACtC,6BAA6B;GAC3B,UAAU,OAAO,YAAY,QAAQ,SAAS,QAAQ,OAAO,OAAO,CAAC;GACrE,eAAe,OAAO,YAAY,QAAQ,SAAS,aAAa,OAAO,OAAO,CAAC;GAC/E,UAAU,UAAU,QAAQ,SAAS,QAAQ,KAAK,CAAC;GACnD,WAAW,OAAO,YAAY,QAAQ,SAAS,SAAS,OAAO,OAAO,CAAC;GACvE,iBAAiB,OAAO,YACtB,QAAQ,SAAS,eAAe,OAAO,OAAO,CAAC;GACjD,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,OAAO,OAAO,CAAC;GACnE,UAAU,OAAO,YAAY,QAAQ,SAAS,QAAQ,OAAO,OAAO,CAAC;EACvE,EACF,CAAC,CAAC,CAAC,KACD,OAAO,eAAe,+BAA+B,EACnD,WAAW,UAAU;GACnB,IAAI,CAAC,yBAAyB,OAAO;GACrC,OAAO,KAAK,KAAK;GAEjB,OAAO;EACT,EACF,CAAC,GACD,OAAO,eAAe,gCAAgC,EACpD,WAAW,UAAU;GACnB,IAAI,CAAC,yBAAyB,OAAO;GACrC,eAAe,KAAK,KAAK;GAEzB,OAAO;EACT,EACF,CAAC,GACD,OAAO,SACL,OAAO,WAAW;GAChB,0BAA0B;EAC5B,CAAC,CACH,CACF;EAEA,IAAI,UAAU,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;EACvD,KAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,SAAS,OAAO,OAAO,OAAO,MAAM,IAAI;GAE9C,IAAI,OAAO,SAAS,aAAa,OAAO,QAAQ,SAAS,iBACvD,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;EAC7C;EAEA,KAAK,MAAM,SAAS,gBAClB,OAAO,MAAM,KACX,OAAO,eACL,oCACA,WACF,GACA,OAAO,YAAY,UACjB,OAAO,UAAU,MAAM,IAAI,aAAa,oBAAoB,KAAK,CAAC,CAAC,CAAC,CAAC,CACvE,CACF;EAEF,OAAO;CACT,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,oCACX,KACA,aAMA,MAAM,OACJ,KACA,OAAO,IAAI,WAAW,UAAU,MAAM,2BAA2B,CACnE"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import "./password-model.mjs";
|
|
2
|
-
import "./password-sql.mjs";
|
|
3
|
-
import { NativeDatabase, PasswordRegistrationAuthority } from "@yielded/auth-persistence/Adapter";
|
|
4
|
-
import { Effect } from "effect";
|
|
5
|
-
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
6
|
-
import { PasswordUnavailable } from "@yielded/auth/Password";
|
|
7
|
-
export type { PasswordRegistrationAuthority };
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { requiredPasswordRegistrationConstraints } from "./password-model.mjs";
|
|
2
|
-
import { PersistenceMappingError, column, isMappedConstraintConflict } from "./model.mjs";
|
|
3
|
-
import { validateDrizzleStorage } from "./storage-validation.mjs";
|
|
4
|
-
import { CurrentProofSql } from "./proof-sql.mjs";
|
|
5
|
-
import { CurrentPasswordSql } from "./password-sql.mjs";
|
|
6
|
-
import { and, eq } from "drizzle-orm";
|
|
7
|
-
import { Cause, Effect, Schema } from "effect";
|
|
8
|
-
import { CurrentCommitJournal, HookConfigurationError, LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
|
|
9
|
-
import { reportPersistenceFailure } from "@yielded/auth/Persistence";
|
|
10
|
-
import { ProofUnavailable } from "@yielded/auth/Proofs";
|
|
11
|
-
import { PasswordUnavailable } from "@yielded/auth/Password";
|
|
12
|
-
//#region src/drizzle/password-registration.ts
|
|
13
|
-
const unavailable = () => PasswordUnavailable.make({});
|
|
14
|
-
const translateFailure = (effect) => reportPersistenceFailure(effect, (error) => Schema.is(PasswordUnavailable)(error) || Schema.is(ProofUnavailable)(error) || Schema.is(HookConfigurationError)(error)).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));
|
|
15
|
-
const validConstraints = (mapping) => Object.entries(requiredPasswordRegistrationConstraints).every(([key, value]) => mapping.constraints[key] === value);
|
|
16
|
-
const selectRows = (query, locking) => locking && typeof query.for === "function" ? query.for("update") : query;
|
|
17
|
-
const allocate = (mode, asyncValue, syncValue) => {
|
|
18
|
-
if (mode === "synchronous") return syncValue === void 0 ? Effect.fail(unavailable()) : Effect.try({
|
|
19
|
-
try: syncValue,
|
|
20
|
-
catch: (cause) => new PersistenceMappingError({
|
|
21
|
-
operation: "mapping",
|
|
22
|
-
cause
|
|
23
|
-
})
|
|
24
|
-
});
|
|
25
|
-
if (asyncValue !== void 0) return asyncValue;
|
|
26
|
-
return syncValue === void 0 ? Effect.fail(unavailable()) : Effect.try({
|
|
27
|
-
try: syncValue,
|
|
28
|
-
catch: (cause) => new PersistenceMappingError({
|
|
29
|
-
operation: "mapping",
|
|
30
|
-
cause
|
|
31
|
-
})
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
const registrationRows = Effect.fn("Drizzle.registrationRows")(function* (mapping, moduleId, requestId, locking) {
|
|
35
|
-
const database = yield* CurrentPasswordSql;
|
|
36
|
-
const module = column(mapping.registration.table, mapping.registration.moduleId);
|
|
37
|
-
const request = column(mapping.registration.table, mapping.registration.requestId);
|
|
38
|
-
const query = database.select().from(mapping.registration.table).where(and(eq(module, moduleId), eq(request, requestId))).limit(1);
|
|
39
|
-
return yield* selectRows(query, locking);
|
|
40
|
-
});
|
|
41
|
-
const registerIn = Effect.fn("DrizzlePasswordRegistration.registerIn")(function* (mapping, configuration, input, allocated, prepare) {
|
|
42
|
-
const database = yield* CurrentPasswordSql;
|
|
43
|
-
const journal = yield* CurrentCommitJournal;
|
|
44
|
-
const existing = (yield* registrationRows(mapping, input.moduleId, input.requestId, configuration.locking))[0];
|
|
45
|
-
if (existing !== void 0) return prepare(yield* mapping.registration.decodeReplay(existing), journal);
|
|
46
|
-
const intent = {
|
|
47
|
-
moduleId: input.moduleId,
|
|
48
|
-
requestId: input.requestId,
|
|
49
|
-
identifier: input.identifier,
|
|
50
|
-
registration: input.registration,
|
|
51
|
-
replacement: input.replacement
|
|
52
|
-
};
|
|
53
|
-
if (mapping.mode === "pending") {
|
|
54
|
-
if (allocated.recoveryReference === void 0) return yield* unavailable();
|
|
55
|
-
const receipt = prepare({
|
|
56
|
-
_tag: "Pending",
|
|
57
|
-
reference: allocated.recoveryReference
|
|
58
|
-
}, journal);
|
|
59
|
-
yield* database.insert(mapping.registration.table).values(mapping.registration.encodeInsert(intent, {
|
|
60
|
-
state: "pending",
|
|
61
|
-
recoveryReference: allocated.recoveryReference
|
|
62
|
-
}));
|
|
63
|
-
return receipt;
|
|
64
|
-
}
|
|
65
|
-
let nativeSubjectId = allocated.nativeSubjectId;
|
|
66
|
-
const subjectInsert = database.insert(mapping.subject.table).values(mapping.provisioning.encodeSubjectInsert(intent, {
|
|
67
|
-
nativeSubjectId,
|
|
68
|
-
securityRevision: allocated.securityRevision
|
|
69
|
-
}));
|
|
70
|
-
if (mapping.provisioning.idMode === "generated") {
|
|
71
|
-
const rows = yield* configuration.generatedSubjectRows(subjectInsert);
|
|
72
|
-
nativeSubjectId = yield* mapping.provisioning.decodeGeneratedId(rows);
|
|
73
|
-
} else yield* subjectInsert;
|
|
74
|
-
if (nativeSubjectId === void 0) return yield* unavailable();
|
|
75
|
-
const receipt = prepare({
|
|
76
|
-
_tag: "Created",
|
|
77
|
-
subjectId: yield* mapping.subjectId.toSubject(nativeSubjectId)
|
|
78
|
-
}, journal);
|
|
79
|
-
yield* database.insert(mapping.identifier.table).values(mapping.identifier.encodeInitialInsert(input.identifier, nativeSubjectId, allocated.identifierRevision));
|
|
80
|
-
yield* database.insert(mapping.credential.table).values(mapping.credential.encodeInsert({
|
|
81
|
-
moduleId: input.moduleId,
|
|
82
|
-
subjectId: nativeSubjectId,
|
|
83
|
-
credentialId: allocated.credentialId,
|
|
84
|
-
credentialRevision: allocated.credentialRevision,
|
|
85
|
-
verifierVersion: allocated.verifierVersion,
|
|
86
|
-
replacement: input.replacement
|
|
87
|
-
}));
|
|
88
|
-
yield* database.insert(mapping.authorityCredential.table).values(mapping.authorityCredential.encodeInsert({
|
|
89
|
-
subjectId: nativeSubjectId,
|
|
90
|
-
credentialId: allocated.credentialId,
|
|
91
|
-
revision: allocated.credentialRevision
|
|
92
|
-
}));
|
|
93
|
-
yield* database.insert(mapping.registration.table).values(mapping.registration.encodeInsert(intent, {
|
|
94
|
-
state: "created",
|
|
95
|
-
nativeSubjectId
|
|
96
|
-
}));
|
|
97
|
-
return receipt;
|
|
98
|
-
});
|
|
99
|
-
const makeSqlPasswordRegistrationAuthority = Effect.fn("makeSqlPasswordRegistrationAuthority")(function* (mapping, configuration) {
|
|
100
|
-
const database = yield* CurrentPasswordSql;
|
|
101
|
-
if (!configuration.coordinated) yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(unavailable));
|
|
102
|
-
const hooks = yield* LifecycleHooks;
|
|
103
|
-
return { register: (input, prepare) => Effect.gen(function* () {
|
|
104
|
-
if (!validConstraints(mapping)) return yield* unavailable();
|
|
105
|
-
const credentialId = yield* allocate(configuration.mode, mapping.allocateCredentialId, mapping.allocateCredentialIdSync);
|
|
106
|
-
const securityRevision = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
|
|
107
|
-
const credentialRevision = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
|
|
108
|
-
const identifierRevision = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
|
|
109
|
-
const verifierVersion = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
|
|
110
|
-
const nativeSubjectId = mapping.mode !== "atomic" || mapping.provisioning.idMode === "generated" ? void 0 : yield* allocate(configuration.mode, mapping.provisioning.allocateSubjectId, mapping.provisioning.allocateSubjectIdSync);
|
|
111
|
-
const recoveryReference = mapping.mode === "pending" ? yield* allocate(configuration.mode, mapping.allocateRecoveryReference, mapping.allocateRecoveryReferenceSync) : void 0;
|
|
112
|
-
const run = coordinateCommit(() => database.transaction((transaction) => registerIn(mapping, configuration, input, {
|
|
113
|
-
credentialId,
|
|
114
|
-
securityRevision,
|
|
115
|
-
identifierRevision,
|
|
116
|
-
credentialRevision,
|
|
117
|
-
verifierVersion,
|
|
118
|
-
...nativeSubjectId === void 0 ? {} : { nativeSubjectId },
|
|
119
|
-
...recoveryReference === void 0 ? {} : { recoveryReference }
|
|
120
|
-
}, prepare).pipe(Effect.provideService(CurrentPasswordSql, transaction), Effect.provideService(CurrentProofSql, transaction))), { mode: configuration.mode }).pipe(Effect.map((result) => result.value));
|
|
121
|
-
return yield* (configuration.coordinated !== true ? Effect.gen(function* () {
|
|
122
|
-
if (yield* hasCommitScope) return yield* unavailable();
|
|
123
|
-
yield* configuration.standaloneGuard;
|
|
124
|
-
return yield* run;
|
|
125
|
-
}) : run).pipe(Effect.catchCause((cause) => {
|
|
126
|
-
if (cause.reasons.every(Cause.isFailReason) && isMappedConstraintConflict(mapping.isRequestConflict, cause) || cause.reasons.every(Cause.isFailReason) && isMappedConstraintConflict(mapping.isIdentifierConflict, cause) || cause.reasons.every(Cause.isFailReason) && isMappedConstraintConflict(mapping.isCredentialConflict, cause)) return coordinateCommit((journal) => database.transaction((transaction) => Effect.gen(function* () {
|
|
127
|
-
const row = (yield* registrationRows(mapping, input.moduleId, input.requestId, configuration.locking))[0];
|
|
128
|
-
return prepare(row === void 0 ? { _tag: "Suppressed" } : yield* mapping.registration.decodeReplay(row), journal);
|
|
129
|
-
}).pipe(Effect.provideService(CurrentPasswordSql, transaction), Effect.provideService(CurrentProofSql, transaction))), { mode: configuration.mode }).pipe(Effect.map((result) => result.value));
|
|
130
|
-
return Effect.failCause(cause);
|
|
131
|
-
}));
|
|
132
|
-
}).pipe(Effect.provideService(CurrentPasswordSql, database), Effect.provideService(LifecycleHooks, hooks), translateFailure) };
|
|
133
|
-
});
|
|
134
|
-
//#endregion
|
|
135
|
-
export { makeSqlPasswordRegistrationAuthority };
|
|
136
|
-
|
|
137
|
-
//# sourceMappingURL=password-registration.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password-registration.mjs","names":[],"sources":["../../src/drizzle/password-registration.ts"],"sourcesContent":["import type {\n NativeDatabase,\n PasswordRegistrationAuthority,\n} from \"@yielded/auth-persistence/Adapter\";\nimport {\n coordinateCommit,\n CurrentCommitJournal,\n hasCommitScope,\n LifecycleHooks,\n HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport {\n PasswordUnavailable,\n type PasswordReplacement,\n type PasswordRegistrationDecision,\n type PreparePasswordCommit,\n} from \"@yielded/auth/Password\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport { ProofUnavailable } from \"@yielded/auth/Proofs\";\n/* oxlint-disable no-explicit-any -- registration plans bridge consumer-owned Drizzle rows. */\nimport { and, eq } from \"drizzle-orm\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport { column, isMappedConstraintConflict, PersistenceMappingError } from \"./model\";\nimport {\n type AnyPasswordRegistrationMapping,\n requiredPasswordRegistrationConstraints,\n} from \"./password-model\";\nimport { CurrentPasswordSql, type PasswordSqlQuery } from \"./password-sql\";\nimport { CurrentProofSql, type ProofSqlDatabase } from \"./proof-sql\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\n\ntype Mapping<Registration> = AnyPasswordRegistrationMapping<Registration>;\nconst unavailable = () => PasswordUnavailable.make({});\n\nconst translateFailure = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n): Effect.Effect<A, PasswordUnavailable, R> =>\n reportPersistenceFailure(\n effect,\n (error) =>\n Schema.is(PasswordUnavailable)(error) ||\n Schema.is(ProofUnavailable)(error) ||\n Schema.is(HookConfigurationError)(error),\n ).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));\n\nexport type { PasswordRegistrationAuthority } from \"@yielded/auth-persistence/Adapter\";\n\nexport interface PasswordRegistrationConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, PasswordUnavailable>;\n readonly coordinated?: boolean;\n readonly generatedSubjectRows: (query: PasswordSqlQuery) => PasswordSqlQuery;\n}\n\nconst validConstraints = <Registration>(mapping: Mapping<Registration>) =>\n Object.entries(requiredPasswordRegistrationConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredPasswordRegistrationConstraints] === value,\n );\n\nconst selectRows = (query: PasswordSqlQuery, locking: boolean) =>\n locking && typeof query.for === \"function\" ? query.for(\"update\") : query;\n\nconst allocate = <A>(\n mode: PasswordRegistrationConfiguration[\"mode\"],\n asyncValue: Effect.Effect<A, PersistenceMappingError> | undefined,\n syncValue: (() => A) | undefined,\n) => {\n if (mode === \"synchronous\")\n return syncValue === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: syncValue,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n if (asyncValue !== undefined) return asyncValue;\n\n return syncValue === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: syncValue,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n};\n\nconst registrationRows = Effect.fn(\"Drizzle.registrationRows\")(function* <Registration>(\n mapping: Mapping<Registration>,\n moduleId: string,\n requestId: string,\n locking: boolean,\n) {\n const database = yield* CurrentPasswordSql;\n\n const module = column(mapping.registration.table, mapping.registration.moduleId);\n const request = column(mapping.registration.table, mapping.registration.requestId);\n\n const query = database\n .select()\n .from(mapping.registration.table)\n .where(and(eq(module, moduleId), eq(request, requestId)))\n .limit(1);\n\n return yield* selectRows(query, locking);\n});\n\nconst registerIn = Effect.fn(\"DrizzlePasswordRegistration.registerIn\")(function* <Registration, A>(\n mapping: Mapping<Registration>,\n configuration: PasswordRegistrationConfiguration,\n input: {\n readonly moduleId: string;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly replacement: PasswordReplacement;\n },\n allocated: {\n readonly credentialId: string;\n readonly securityRevision: any;\n readonly identifierRevision: any;\n readonly credentialRevision: any;\n readonly verifierVersion: any;\n readonly nativeSubjectId?: unknown;\n readonly recoveryReference?: any;\n },\n prepare: PreparePasswordCommit<PasswordRegistrationDecision, A>,\n) {\n const database = yield* CurrentPasswordSql;\n const journal = yield* CurrentCommitJournal;\n\n const existing = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.requestId,\n configuration.locking,\n ))[0];\n\n if (existing !== undefined)\n return prepare(yield* mapping.registration.decodeReplay(existing), journal);\n\n const intent = {\n moduleId: input.moduleId,\n requestId: input.requestId,\n identifier: input.identifier,\n registration: input.registration,\n replacement: input.replacement,\n };\n\n if (mapping.mode === \"pending\") {\n if (allocated.recoveryReference === undefined) return yield* unavailable();\n const receipt = prepare({ _tag: \"Pending\", reference: allocated.recoveryReference }, journal);\n\n yield* database.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"pending\",\n recoveryReference: allocated.recoveryReference,\n }),\n );\n\n return receipt;\n }\n let nativeSubjectId = allocated.nativeSubjectId;\n\n const subjectInsert = database.insert(mapping.subject.table).values(\n mapping.provisioning.encodeSubjectInsert(intent, {\n nativeSubjectId,\n securityRevision: allocated.securityRevision,\n }),\n );\n\n if (mapping.provisioning.idMode === \"generated\") {\n const rows = yield* configuration.generatedSubjectRows(subjectInsert);\n\n nativeSubjectId = yield* mapping.provisioning.decodeGeneratedId(rows);\n } else yield* subjectInsert;\n if (nativeSubjectId === undefined) return yield* unavailable();\n const subjectId = yield* mapping.subjectId.toSubject(nativeSubjectId);\n const receipt = prepare({ _tag: \"Created\", subjectId }, journal);\n\n yield* database\n .insert(mapping.identifier.table)\n .values(\n mapping.identifier.encodeInitialInsert(\n input.identifier,\n nativeSubjectId,\n allocated.identifierRevision,\n ),\n );\n yield* database.insert(mapping.credential.table).values(\n mapping.credential.encodeInsert({\n moduleId: input.moduleId,\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n credentialRevision: allocated.credentialRevision,\n verifierVersion: allocated.verifierVersion,\n replacement: input.replacement,\n }),\n );\n yield* database.insert(mapping.authorityCredential.table).values(\n mapping.authorityCredential.encodeInsert({\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n revision: allocated.credentialRevision,\n }),\n );\n yield* database.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"created\",\n nativeSubjectId,\n }),\n );\n\n return receipt;\n});\n\nexport const makeSqlPasswordRegistrationAuthority = Effect.fn(\n \"makeSqlPasswordRegistrationAuthority\",\n)(function* <Registration>(\n mapping: Mapping<Registration>,\n configuration: PasswordRegistrationConfiguration,\n): Effect.fn.Return<\n PasswordRegistrationAuthority<Registration>,\n PasswordUnavailable,\n LifecycleHooks | CurrentPasswordSql | NativeDatabase\n> {\n const database = yield* CurrentPasswordSql;\n\n if (!configuration.coordinated)\n yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(unavailable));\n const hooks = yield* LifecycleHooks;\n\n return {\n register: (input, prepare) =>\n Effect.gen(function* () {\n if (!validConstraints(mapping)) return yield* unavailable();\n\n const credentialId = yield* allocate(\n configuration.mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n );\n\n const securityRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const credentialRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const identifierRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const verifierVersion = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const nativeSubjectId =\n mapping.mode !== \"atomic\" || mapping.provisioning.idMode === \"generated\"\n ? undefined\n : yield* allocate(\n configuration.mode,\n mapping.provisioning.allocateSubjectId,\n mapping.provisioning.allocateSubjectIdSync,\n );\n\n const recoveryReference =\n mapping.mode === \"pending\"\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRecoveryReference,\n mapping.allocateRecoveryReferenceSync,\n )\n : undefined;\n\n const run = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n registerIn(\n mapping,\n configuration,\n input,\n {\n credentialId,\n securityRevision,\n identifierRevision,\n credentialRevision,\n verifierVersion,\n ...(nativeSubjectId === undefined ? {} : { nativeSubjectId }),\n ...(recoveryReference === undefined ? {} : { recoveryReference }),\n },\n prepare,\n ).pipe(\n Effect.provideService(CurrentPasswordSql, transaction),\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.map((result) => result.value));\n\n const guarded =\n configuration.coordinated !== true\n ? Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* unavailable();\n yield* configuration.standaloneGuard;\n\n return yield* run;\n })\n : run;\n\n return yield* guarded.pipe(\n Effect.catchCause((cause) => {\n if (\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isRequestConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isIdentifierConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCredentialConflict, cause))\n )\n return coordinateCommit(\n (journal) =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n const row = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.requestId,\n configuration.locking,\n ))[0];\n\n const decision =\n row === undefined\n ? ({ _tag: \"Suppressed\" } as const)\n : yield* mapping.registration.decodeReplay(row);\n\n return prepare(decision, journal);\n }).pipe(\n Effect.provideService(CurrentPasswordSql, transaction),\n Effect.provideService(\n CurrentProofSql,\n transaction as unknown as ProofSqlDatabase,\n ),\n ),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.map((result) => result.value));\n\n return Effect.failCause(cause);\n }),\n );\n }).pipe(\n Effect.provideService(CurrentPasswordSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n };\n});\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "@yielded/auth-persistence/Adapter";
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { makeDrizzleSqlTables } from "./native-sql-table.mjs";
|
|
2
|
-
import { drizzleQueryOperations } from "./query-operations.mjs";
|
|
3
|
-
import { completeProofPlanIn } from "./proof-sql.mjs";
|
|
4
|
-
import { CurrentPasswordSql, makePasswordKernel } from "@yielded/auth-persistence/Adapter";
|
|
5
|
-
//#region src/drizzle/password-sql.ts
|
|
6
|
-
const { makeSqlPasswordPersistence, passwordSqlKernel } = makePasswordKernel(drizzleQueryOperations, { completeProofPlanIn }, makeDrizzleSqlTables);
|
|
7
|
-
//#endregion
|
|
8
|
-
export { CurrentPasswordSql, makeSqlPasswordPersistence, passwordSqlKernel };
|
|
9
|
-
|
|
10
|
-
//# sourceMappingURL=password-sql.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password-sql.mjs","names":[],"sources":["../../src/drizzle/password-sql.ts"],"sourcesContent":["import { makePasswordKernel } from \"@yielded/auth-persistence/Adapter\";\n\nimport { makeDrizzleSqlTables } from \"./native-sql-table\";\nimport { completeProofPlanIn } from \"./proof-sql\";\nimport { drizzleQueryOperations } from \"./query-operations\";\nexport type { PasswordSqlQuery } from \"@yielded/auth-persistence/Adapter\";\nexport type { PasswordSqlDatabase } from \"@yielded/auth-persistence/Adapter\";\nexport { CurrentPasswordSql } from \"@yielded/auth-persistence/Adapter\";\n\nexport type { PasswordSqlConfiguration } from \"@yielded/auth-persistence/Adapter\";\n\nexport const { makeSqlPasswordPersistence, passwordSqlKernel } = makePasswordKernel(\n drizzleQueryOperations,\n { completeProofPlanIn },\n makeDrizzleSqlTables,\n);\n"],"mappings":";;;;;AAWA,MAAa,EAAE,4BAA4B,sBAAsB,mBAC/D,wBACA,EAAE,oBAAoB,GACtB,oBACF"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { EmailAddressMapping, EmailRegistrationMapping, EmailSignInMapping } from "./email-model.mjs";
|
|
2
|
-
import { ProofPersistenceMapping } from "./proof-model.mjs";
|
|
3
|
-
import { EmailRegistrationAuthority } from "./email-registration.mjs";
|
|
4
|
-
import { SuppliedService } from "./SuppliedService.mjs";
|
|
5
|
-
import { Database as Database$1 } from "./pg-database.mjs";
|
|
6
|
-
import { AnyRelations } from "drizzle-orm";
|
|
7
|
-
import { Effect } from "effect";
|
|
8
|
-
import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
9
|
-
import { AnyPgTable } from "drizzle-orm/pg-core";
|
|
10
|
-
import { EmailAddressPersistence, EmailUnavailable } from "@yielded/auth/Email";
|
|
11
|
-
import { EffectPgDatabase } from "drizzle-orm/effect-pglite";
|
|
12
|
-
import { EffectPgDatabase as EffectPgDatabase$1 } from "drizzle-orm/effect-postgres";
|
|
13
|
-
import { SqlError } from "effect/sql/SqlError";
|
|
14
|
-
//#region src/drizzle/pg-emails.d.ts
|
|
15
|
-
type Database = EffectPgDatabase$1<AnyRelations> | EffectPgDatabase<AnyRelations>;
|
|
16
|
-
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
17
|
-
type ProofMapping = ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>;
|
|
18
|
-
export declare const makePgEmailSignInServices: <S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, NativeId>(mapping: EmailSignInMapping<S, I, C, NativeId>) => Effect.Effect<{
|
|
19
|
-
emailSignInTargets: {
|
|
20
|
-
readonly lookup: (input: {
|
|
21
|
-
readonly moduleId: string;
|
|
22
|
-
readonly identifier: import("@yielded/auth/Identity").LoginIdentifier;
|
|
23
|
-
}) => Effect.Effect<import("effect/Option").Option<import("@yielded/auth/Email").EmailCredentialSnapshot>, EmailUnavailable>;
|
|
24
|
-
};
|
|
25
|
-
}, EmailUnavailable, Database$1>;
|
|
26
|
-
export declare const makePgEmailAddressServices: <S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, M extends AnyPgTable, NativeId>(mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
|
|
27
|
-
emailAddressPersistence: {
|
|
28
|
-
readonly target: (input: {
|
|
29
|
-
readonly moduleId: string;
|
|
30
|
-
readonly subjectId: import("@yielded/auth/Schema").SubjectId;
|
|
31
|
-
readonly target: import("@yielded/auth/Identity").LoginIdentifier;
|
|
32
|
-
readonly sourceCredentialId?: string;
|
|
33
|
-
}) => Effect.Effect<import("@yielded/auth/Email").EmailAddressTarget, EmailUnavailable>;
|
|
34
|
-
readonly checkCompletion: (input: import("@yielded/auth/Proofs").ProofCompletionInput) => Effect.Effect<boolean, EmailUnavailable>;
|
|
35
|
-
readonly verifyWithProof: <A>(input: import("@yielded/auth/Email").EmailAddressMutation, prepare: import("@yielded/auth/Email").PrepareEmailCommit<import("@yielded/auth/Email").EmailAddressDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, EmailUnavailable>;
|
|
36
|
-
readonly changeWithProof: <A>(input: import("@yielded/auth/Email").EmailAddressMutation, prepare: import("@yielded/auth/Email").PrepareEmailCommit<import("@yielded/auth/Email").EmailAddressDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, EmailUnavailable>;
|
|
37
|
-
readonly cleanup: <A>(input: {
|
|
38
|
-
readonly moduleId: string;
|
|
39
|
-
readonly limit: number;
|
|
40
|
-
}, prepare: import("@yielded/auth/Email").PrepareEmailCommit<{
|
|
41
|
-
readonly removed: number;
|
|
42
|
-
readonly hasMore: boolean;
|
|
43
|
-
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, EmailUnavailable>;
|
|
44
|
-
};
|
|
45
|
-
}, EmailUnavailable, Database$1 | LifecycleHooks>;
|
|
46
|
-
export declare function coordinatePgEmailAddress<D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, M extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
47
|
-
readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
|
|
48
|
-
readonly proofMapping: ProofMapping;
|
|
49
|
-
readonly transaction?: never;
|
|
50
|
-
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements>;
|
|
51
|
-
export declare function coordinatePgEmailAddress<D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, M extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
52
|
-
readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
|
|
53
|
-
readonly proofMapping: ProofMapping;
|
|
54
|
-
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
|
|
55
|
-
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, EmailAddressPersistence | TxId> | LifecycleHooks | DatabaseRequirements>;
|
|
56
|
-
export declare const makePgEmailRegistrationServices: <Registration, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, Rq extends AnyPgTable, NativeId>(mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
|
|
57
|
-
registrationAuthority: EmailRegistrationAuthority<Registration>;
|
|
58
|
-
}, EmailUnavailable, Database$1 | LifecycleHooks>;
|
|
59
|
-
export declare function coordinatePgEmailRegistration<TargetId, Registration, D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, Rq extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
60
|
-
readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
|
|
61
|
-
readonly proofMapping: ProofMapping;
|
|
62
|
-
readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;
|
|
63
|
-
readonly transaction?: never;
|
|
64
|
-
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements>;
|
|
65
|
-
export declare function coordinatePgEmailRegistration<TargetId, Registration, D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, Rq extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
66
|
-
readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
|
|
67
|
-
readonly proofMapping: ProofMapping;
|
|
68
|
-
readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;
|
|
69
|
-
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
|
|
70
|
-
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements>;
|
|
71
|
-
//#endregion
|
|
72
|
-
//# sourceMappingURL=pg-emails.d.mts.map
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { acquireTransactionService, transactionService } from "./standalone-guard.mjs";
|
|
2
|
-
import { CurrentEmailSql } from "./email-sql.mjs";
|
|
3
|
-
import { coordinateTargetEmailAddress, coordinateTargetEmailRegistration, makeTargetEmailAddressServices, makeTargetEmailRegistrationServices, makeTargetEmailSignInServices, sqlClientEmailStandaloneGuard } from "./email-target.mjs";
|
|
4
|
-
import { sqlClientProofStandaloneGuard } from "./proof-target.mjs";
|
|
5
|
-
import { nativeDatabase } from "./native-database.mjs";
|
|
6
|
-
import { Database } from "./pg-database.mjs";
|
|
7
|
-
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
8
|
-
import { Context, Effect } from "effect";
|
|
9
|
-
import { EmailAddressPersistence } from "@yielded/auth/Email";
|
|
10
|
-
//#region src/drizzle/pg-emails.ts
|
|
11
|
-
const configuration = (service) => ({
|
|
12
|
-
mode: "interactive",
|
|
13
|
-
locking: true,
|
|
14
|
-
standaloneGuard: sqlClientEmailStandaloneGuard(service),
|
|
15
|
-
generatedSubjectRows: (query) => query.returning(),
|
|
16
|
-
proof: {
|
|
17
|
-
mode: "interactive",
|
|
18
|
-
locking: true,
|
|
19
|
-
standaloneGuard: sqlClientProofStandaloneGuard(service),
|
|
20
|
-
insertIfAbsent: (query) => query.onConflictDoNothing()
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
const makePgEmailSignInServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetEmailSignInServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
24
|
-
const makePgEmailAddressServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
25
|
-
function coordinatePgEmailAddress(acquire, options, body) {
|
|
26
|
-
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetEmailAddress(database, options.mapping, options.proofMapping, configuration(transactionService(database)), (transaction, services) => {
|
|
27
|
-
const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);
|
|
28
|
-
const work = Effect.provideContext(body, provided);
|
|
29
|
-
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
30
|
-
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
31
|
-
}
|
|
32
|
-
const makePgEmailRegistrationServices = (mapping, proofMapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetEmailRegistrationServices(mapping, proofMapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
33
|
-
function coordinatePgEmailRegistration(acquire, options, body) {
|
|
34
|
-
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetEmailRegistration(database, options.mapping, options.proofMapping, configuration(transactionService(database)), (transaction, services) => {
|
|
35
|
-
const provided = Context.make(options.target, services.registrationAuthority);
|
|
36
|
-
const work = Effect.provideContext(body, provided);
|
|
37
|
-
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
38
|
-
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
39
|
-
}
|
|
40
|
-
//#endregion
|
|
41
|
-
export { coordinatePgEmailAddress, coordinatePgEmailRegistration, makePgEmailAddressServices, makePgEmailRegistrationServices, makePgEmailSignInServices };
|
|
42
|
-
|
|
43
|
-
//# sourceMappingURL=pg-emails.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pg-emails.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/pg-emails.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport { EmailAddressPersistence, type EmailUnavailable } from \"@yielded/auth/Email\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectPgDatabase as PgliteDatabase } from \"drizzle-orm/effect-pglite\";\nimport type { EffectPgDatabase as PostgresDatabase } from \"drizzle-orm/effect-postgres\";\nimport type { AnyPgTable } from \"drizzle-orm/pg-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport type {\n EmailAddressMapping,\n EmailRegistrationMapping,\n EmailSignInMapping,\n} from \"./email-model\";\nimport type { EmailRegistrationAuthority } from \"./email-registration\";\nimport { CurrentEmailSql } from \"./email-sql\";\nimport type { EmailSqlQuery } from \"./email-sql\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailRegistrationServices,\n makeTargetEmailSignInServices,\n sqlClientEmailStandaloneGuard,\n} from \"./email-target\";\nimport { nativeDatabase } from \"./native-database\";\nimport { Database as DatabaseService } from \"./pg-database\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\ntype ProofMapping = ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientEmailStandaloneGuard(service),\n generatedSubjectRows: (query: EmailSqlQuery) => query.returning(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery) => query.onConflictDoNothing(),\n },\n});\n\nexport const makePgEmailSignInServices = <\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n NativeId,\n>(\n mapping: EmailSignInMapping<S, I, C, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetEmailSignInServices(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makePgEmailAddressServices = <\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n M extends AnyPgTable,\n NativeId,\n>(\n mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,\n proofMapping: ProofMapping,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinatePgEmailAddress<\n D extends Database,\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n M extends AnyPgTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgEmailAddress<\n D extends Database,\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n M extends AnyPgTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgEmailAddress<\n D extends Database,\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n M extends AnyPgTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetEmailAddress<TransactionOf<D>, Out, E, Exclude<R, EmailAddressPersistence>>(\n database,\n options.mapping,\n options.proofMapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);\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 ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport const makePgEmailRegistrationServices = <\n Registration,\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n Rq extends AnyPgTable,\n NativeId,\n>(\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n proofMapping: ProofMapping,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) =>\n makeTargetEmailRegistrationServices<Registration>(mapping, proofMapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinatePgEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n Rq extends AnyPgTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n Rq extends AnyPgTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgEmailRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyPgTable,\n I extends AnyPgTable,\n C extends AnyPgTable,\n AC extends AnyPgTable,\n Rq extends AnyPgTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetEmailRegistration<Registration, TransactionOf<D>, Out, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n options.proofMapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\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 ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":";;;;;;;;;;AAwDA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,8BAA8B,OAAO;CACtD,uBAAuB,UAAyB,MAAM,UAAU;CAChE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,OAAO;EACtD,iBAAiB,UAAyB,MAAM,oBAAoB;CACtE;AACF;AAEA,MAAa,6BAMX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,8BAA8B,SAAS,aAAa,CACzE,CAAC,CAAC,KACA,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,GAC5E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAEF,MAAa,8BAQX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,+BAA+B,SAAS,cAAc,aAAa,CACxF,CAAC,CAAC,KACA,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,GAC5E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AA0DF,SAAgB,yBAgBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,6BACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,yBAAyB,SAAS,uBAAuB;EACvF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF;AAEA,MAAa,mCASX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBACC,oCAAkD,SAAS,cAAc,aAAa,CAC1F,CAAC,CAAC,KACA,OAAO,qBAAqB,iBAAiB,eAAeA,QAAe,CAAC,GAC5E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAgEF,SAAgB,8BAkBd,SACA,SAMA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,kCACE,UACA,QAAQ,SACR,QAAQ,cACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;EAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|