@yielded/auth-persistence 0.1.0-beta.25 → 0.1.0-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -8
- package/dist/Adapter.d.mts +47 -33
- package/dist/Adapter.mjs +36 -23
- package/dist/OAuthPersistence.d.mts +35 -51
- package/dist/OAuthPersistence.mjs +60 -68
- package/dist/OAuthPersistence.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/internal/browser-login.d.mts +1 -1
- package/dist/internal/browser-login.mjs +29 -9
- package/dist/internal/browser-login.mjs.map +1 -1
- package/dist/internal/configuration.d.mts +13 -8
- package/dist/internal/configuration.mjs.map +1 -1
- package/dist/internal/crypto.d.mts +1 -0
- package/dist/internal/crypto.mjs +1 -1
- package/dist/internal/d1-planning.mjs +8 -0
- package/dist/internal/d1-planning.mjs.map +1 -0
- package/dist/internal/email-native-state.mjs +135 -0
- package/dist/internal/email-native-state.mjs.map +1 -0
- package/dist/internal/email-native.d.mts +17 -0
- package/dist/internal/email-native.mjs +245 -0
- package/dist/internal/email-native.mjs.map +1 -0
- package/dist/internal/email-policy.mjs +92 -0
- package/dist/internal/email-policy.mjs.map +1 -0
- package/dist/internal/email-registration-native.d.mts +38 -0
- package/dist/internal/email-registration-native.mjs +171 -0
- package/dist/internal/email-registration-native.mjs.map +1 -0
- package/dist/internal/models/email-model.d.mts +40 -104
- package/dist/internal/models/email-model.mjs +3 -5
- package/dist/internal/models/email-model.mjs.map +1 -1
- package/dist/internal/models/oauth-connected-model.d.mts +44 -213
- package/dist/internal/models/oauth-connected-model.mjs +6 -14
- package/dist/internal/models/oauth-connected-model.mjs.map +1 -1
- package/dist/internal/models/oauth-model.d.mts +95 -244
- package/dist/internal/models/oauth-model.mjs +28 -22
- package/dist/internal/models/oauth-model.mjs.map +1 -1
- package/dist/internal/models/passkey-model.d.mts +11 -147
- package/dist/internal/models/passkey-model.mjs +5 -24
- package/dist/internal/models/passkey-model.mjs.map +1 -1
- package/dist/internal/models/passkey-registration-ceremony-model.d.mts +5 -39
- package/dist/internal/models/passkey-write-model.d.mts +17 -75
- package/dist/internal/models/passkey-write-model.mjs +1 -7
- package/dist/internal/models/passkey-write-model.mjs.map +1 -1
- package/dist/internal/models/password-model.d.mts +14 -81
- package/dist/internal/models/password-model.mjs +1 -4
- package/dist/internal/models/password-model.mjs.map +1 -1
- package/dist/internal/models/phone-model.d.mts +86 -0
- package/dist/internal/models/phone-model.mjs +10 -0
- package/dist/internal/models/phone-model.mjs.map +1 -0
- package/dist/internal/models/proof-model.d.mts +43 -272
- package/dist/internal/models/proof-model.mjs +2 -10
- package/dist/internal/models/proof-model.mjs.map +1 -1
- package/dist/internal/models/session-model.d.mts +74 -93
- package/dist/internal/models/session-model.mjs +3 -11
- package/dist/internal/models/session-model.mjs.map +1 -1
- package/dist/internal/models/step-up-model.d.mts +12 -50
- package/dist/internal/models/step-up-model.mjs +2 -4
- package/dist/internal/models/step-up-model.mjs.map +1 -1
- package/dist/internal/models/totp-model.d.mts +76 -0
- package/dist/internal/models/totp-model.mjs +10 -0
- package/dist/internal/models/totp-model.mjs.map +1 -0
- package/dist/internal/native-sql-table.d.mts +21 -4
- package/dist/internal/native-sql-table.mjs +9 -5
- package/dist/internal/native-sql-table.mjs.map +1 -1
- package/dist/internal/oauth/native-accounts.d.mts +17 -0
- package/dist/internal/oauth/native-accounts.mjs +290 -0
- package/dist/internal/oauth/native-accounts.mjs.map +1 -0
- package/dist/internal/oauth/native-connected-state.d.mts +11 -0
- package/dist/internal/oauth/native-connected-state.mjs +146 -0
- package/dist/internal/oauth/native-connected-state.mjs.map +1 -0
- package/dist/internal/oauth/native-connected.d.mts +15 -0
- package/dist/internal/oauth/native-connected.mjs +462 -0
- package/dist/internal/oauth/native-connected.mjs.map +1 -0
- package/dist/internal/oauth/native-flow.mjs +138 -0
- package/dist/internal/oauth/native-flow.mjs.map +1 -0
- package/dist/internal/oauth/native-layers.d.mts +24 -0
- package/dist/internal/oauth/native-layers.mjs +13 -0
- package/dist/internal/oauth/native-layers.mjs.map +1 -0
- package/dist/internal/oauth/native-mutation.mjs +122 -0
- package/dist/internal/oauth/native-mutation.mjs.map +1 -0
- package/dist/internal/oauth/native-registration.d.mts +24 -0
- package/dist/internal/oauth/native-registration.mjs +328 -0
- package/dist/internal/oauth/native-registration.mjs.map +1 -0
- package/dist/internal/oauth/native-revocations.d.mts +17 -0
- package/dist/internal/oauth/native-revocations.mjs +106 -0
- package/dist/internal/oauth/native-revocations.mjs.map +1 -0
- package/dist/internal/oauth/native-sign-in.d.mts +17 -0
- package/dist/internal/oauth/native-sign-in.mjs +50 -0
- package/dist/internal/oauth/native-sign-in.mjs.map +1 -0
- package/dist/internal/oauth/native-state.d.mts +10 -0
- package/dist/internal/oauth/native-state.mjs +214 -0
- package/dist/internal/oauth/native-state.mjs.map +1 -0
- package/dist/internal/oauth/state.d.mts +10 -0
- package/dist/internal/oauth/state.mjs +3 -27
- package/dist/internal/oauth/state.mjs.map +1 -1
- package/dist/internal/passkey-actions.mjs +55 -0
- package/dist/internal/passkey-actions.mjs.map +1 -0
- package/dist/internal/passkey-inputs.mjs +73 -0
- package/dist/internal/passkey-inputs.mjs.map +1 -0
- package/dist/internal/passkey-managed.mjs +224 -0
- package/dist/internal/passkey-managed.mjs.map +1 -0
- package/dist/internal/passkey-native-ceremony.d.mts +35 -0
- package/dist/internal/passkey-native-ceremony.mjs +38 -0
- package/dist/internal/passkey-native-ceremony.mjs.map +1 -0
- package/dist/internal/passkey-native-flow.mjs +91 -0
- package/dist/internal/passkey-native-flow.mjs.map +1 -0
- package/dist/internal/passkey-native-registration.d.mts +10 -0
- package/dist/internal/passkey-native-registration.mjs +114 -0
- package/dist/internal/passkey-native-registration.mjs.map +1 -0
- package/dist/internal/passkey-native-state.d.mts +15 -0
- package/dist/internal/passkey-native-state.mjs +186 -0
- package/dist/internal/passkey-native-state.mjs.map +1 -0
- package/dist/internal/passkey-native-write.d.mts +82 -0
- package/dist/internal/passkey-native-write.mjs +330 -0
- package/dist/internal/passkey-native-write.mjs.map +1 -0
- package/dist/internal/passkey-native.d.mts +835 -0
- package/dist/internal/passkey-native.mjs +175 -0
- package/dist/internal/passkey-native.mjs.map +1 -0
- package/dist/internal/passkey-policy.mjs +115 -0
- package/dist/internal/passkey-policy.mjs.map +1 -0
- package/dist/internal/password-credentials.mjs +38 -9
- package/dist/internal/password-credentials.mjs.map +1 -1
- package/dist/internal/password-native.d.mts +14 -0
- package/dist/internal/password-native.mjs +292 -0
- package/dist/internal/password-native.mjs.map +1 -0
- package/dist/internal/password-policy.mjs +93 -0
- package/dist/internal/password-policy.mjs.map +1 -0
- package/dist/internal/password-registration-native.d.mts +22 -0
- package/dist/internal/password-registration-native.mjs +142 -0
- package/dist/internal/password-registration-native.mjs.map +1 -0
- package/dist/internal/persistence.d.mts +6 -19
- package/dist/internal/persistence.mjs +199 -166
- package/dist/internal/persistence.mjs.map +1 -1
- package/dist/internal/phone-composed.mjs +79 -0
- package/dist/internal/phone-composed.mjs.map +1 -0
- package/dist/internal/phone-native.d.mts +15 -0
- package/dist/internal/phone-native.mjs +354 -0
- package/dist/internal/phone-native.mjs.map +1 -0
- package/dist/internal/proof-native.d.mts +15 -0
- package/dist/internal/proof-native.mjs +289 -0
- package/dist/internal/proof-native.mjs.map +1 -0
- package/dist/internal/registration.mjs +50 -60
- package/dist/internal/registration.mjs.map +1 -1
- package/dist/internal/session-native-authority.d.mts +15 -0
- package/dist/internal/session-native-authority.mjs +91 -0
- package/dist/internal/session-native-authority.mjs.map +1 -0
- package/dist/internal/session-native-cleanup.d.mts +14 -0
- package/dist/internal/session-native-cleanup.mjs +48 -0
- package/dist/internal/session-native-cleanup.mjs.map +1 -0
- package/dist/internal/session-native-login.d.mts +15 -0
- package/dist/internal/session-native-login.mjs +87 -0
- package/dist/internal/session-native-login.mjs.map +1 -0
- package/dist/internal/session-native-pending-read.mjs +42 -0
- package/dist/internal/session-native-pending-read.mjs.map +1 -0
- package/dist/internal/session-native-pending.mjs +134 -0
- package/dist/internal/session-native-pending.mjs.map +1 -0
- package/dist/internal/session-native-record.mjs +79 -0
- package/dist/internal/session-native-record.mjs.map +1 -0
- package/dist/internal/session-native-state.mjs +130 -0
- package/dist/internal/session-native-state.mjs.map +1 -0
- package/dist/internal/session-native-stateful.d.mts +16 -0
- package/dist/internal/session-native-stateful.mjs +225 -0
- package/dist/internal/session-native-stateful.mjs.map +1 -0
- package/dist/internal/session-native-step-up.d.mts +15 -0
- package/dist/internal/session-native-step-up.mjs +212 -0
- package/dist/internal/session-native-step-up.mjs.map +1 -0
- package/dist/internal/session-native-validity.d.mts +15 -0
- package/dist/internal/session-native-validity.mjs +97 -0
- package/dist/internal/session-native-validity.mjs.map +1 -0
- package/dist/internal/session-policy.mjs +29 -0
- package/dist/internal/session-policy.mjs.map +1 -0
- package/dist/internal/sql-authority.d.mts +16 -0
- package/dist/internal/sql-authority.mjs +32 -0
- package/dist/internal/sql-authority.mjs.map +1 -0
- package/dist/internal/sql-change.mjs +21 -0
- package/dist/internal/sql-change.mjs.map +1 -0
- package/dist/internal/sql-cleanup.mjs +35 -0
- package/dist/internal/sql-cleanup.mjs.map +1 -0
- package/dist/internal/sql-commit.d.mts +72 -0
- package/dist/internal/sql-commit.mjs +176 -0
- package/dist/internal/sql-commit.mjs.map +1 -0
- package/dist/internal/sql-expression.d.mts +17 -0
- package/dist/internal/sql-expression.mjs +49 -0
- package/dist/internal/sql-expression.mjs.map +1 -0
- package/dist/internal/sql-oauth-connected-model.d.mts +7 -23
- package/dist/internal/sql-oauth-model.d.mts +27 -52
- package/dist/internal/sql-oauth-model.mjs +3 -4
- package/dist/internal/sql-oauth-model.mjs.map +1 -1
- package/dist/internal/sql-persistence.mjs +5 -9
- package/dist/internal/sql-persistence.mjs.map +1 -1
- package/dist/internal/sql-storage-validation.mjs +1 -2
- package/dist/internal/sql-storage-validation.mjs.map +1 -1
- package/dist/internal/sql-table.d.mts +3 -16
- package/dist/internal/sql-table.mjs +21 -42
- package/dist/internal/sql-table.mjs.map +1 -1
- package/dist/internal/standalone.mjs +2 -3
- package/dist/internal/standalone.mjs.map +1 -1
- package/dist/internal/step-up-state.mjs +5 -8
- package/dist/internal/step-up-state.mjs.map +1 -1
- package/dist/internal/storage-clock.mjs +44 -0
- package/dist/internal/storage-clock.mjs.map +1 -0
- package/dist/internal/storage-mapping.d.mts +11 -8
- package/dist/internal/storage-mapping.mjs +88 -302
- package/dist/internal/storage-mapping.mjs.map +1 -1
- package/dist/internal/storage-plans.mjs +15 -73
- package/dist/internal/storage-plans.mjs.map +1 -1
- package/dist/internal/storage-tables.d.mts +37 -520
- package/dist/internal/storage-tables.mjs +31 -211
- package/dist/internal/storage-tables.mjs.map +1 -1
- package/dist/internal/storage-validation.d.mts +1 -6
- package/dist/internal/storage-validation.mjs +1 -42
- package/dist/internal/storage-validation.mjs.map +1 -1
- package/dist/internal/table-model.d.mts +21 -0
- package/dist/internal/totp-native.d.mts +15 -0
- package/dist/internal/totp-native.mjs +401 -0
- package/dist/internal/totp-native.mjs.map +1 -0
- package/package.json +1 -1
- package/src/Adapter.ts +143 -199
- package/src/OAuthPersistence.ts +128 -271
- package/src/index.ts +1 -1
- package/src/internal/browser-login.ts +54 -24
- package/src/internal/configuration.ts +16 -31
- package/src/internal/d1-planning.ts +7 -0
- package/src/internal/email-native-state.ts +247 -0
- package/src/internal/email-native.ts +514 -0
- package/src/internal/email-policy.ts +235 -0
- package/src/internal/email-registration-native.ts +386 -0
- package/src/internal/models/email-model.ts +76 -214
- package/src/internal/models/oauth-connected-model.ts +50 -288
- package/src/internal/models/oauth-model.ts +147 -368
- package/src/internal/models/passkey-model.ts +11 -208
- package/src/internal/models/passkey-registration-ceremony-model.ts +6 -60
- package/src/internal/models/passkey-write-model.ts +14 -95
- package/src/internal/models/password-model.ts +26 -147
- package/src/internal/models/phone-model.ts +110 -0
- package/src/internal/models/proof-model.ts +48 -404
- package/src/internal/models/session-model.ts +102 -200
- package/src/internal/models/step-up-model.ts +17 -96
- package/src/internal/models/totp-model.ts +82 -0
- package/src/internal/native-sql-table.ts +32 -11
- package/src/internal/oauth/native-accounts.ts +576 -0
- package/src/internal/oauth/native-connected-state.ts +288 -0
- package/src/internal/oauth/native-connected.ts +888 -0
- package/src/internal/oauth/native-flow.ts +253 -0
- package/src/internal/oauth/native-layers.ts +83 -0
- package/src/internal/oauth/native-mutation.ts +222 -0
- package/src/internal/oauth/native-registration.ts +545 -0
- package/src/internal/oauth/native-revocations.ts +190 -0
- package/src/internal/oauth/native-sign-in.ts +111 -0
- package/src/internal/oauth/native-state.ts +346 -0
- package/src/internal/oauth/state.ts +2 -70
- package/src/internal/passkey-actions.ts +70 -0
- package/src/internal/passkey-inputs.ts +56 -0
- package/src/internal/passkey-managed.ts +360 -0
- package/src/internal/passkey-native-ceremony.ts +66 -0
- package/src/internal/passkey-native-flow.ts +140 -0
- package/src/internal/passkey-native-registration.ts +221 -0
- package/src/internal/passkey-native-state.ts +335 -0
- package/src/internal/passkey-native-write.ts +611 -0
- package/src/internal/passkey-native.ts +372 -0
- package/src/internal/passkey-policy.ts +246 -0
- package/src/internal/password-credentials.ts +52 -10
- package/src/internal/password-native.ts +571 -0
- package/src/internal/password-policy.ts +307 -0
- package/src/internal/password-registration-native.ts +322 -0
- package/src/internal/persistence.ts +336 -290
- package/src/internal/phone-composed.ts +86 -0
- package/src/internal/phone-native.ts +659 -0
- package/src/internal/proof-native.ts +448 -0
- package/src/internal/registration.ts +96 -143
- package/src/internal/session-native-authority.ts +247 -0
- package/src/internal/session-native-cleanup.ts +65 -0
- package/src/internal/session-native-login.ts +205 -0
- package/src/internal/session-native-pending-read.ts +68 -0
- package/src/internal/session-native-pending.ts +223 -0
- package/src/internal/session-native-record.ts +141 -0
- package/src/internal/session-native-state.ts +259 -0
- package/src/internal/session-native-stateful.ts +512 -0
- package/src/internal/session-native-step-up.ts +450 -0
- package/src/internal/session-native-validity.ts +208 -0
- package/src/internal/session-policy.ts +59 -0
- package/src/internal/sql-authority.ts +56 -0
- package/src/internal/sql-change.ts +38 -0
- package/src/internal/sql-cleanup.ts +56 -0
- package/src/internal/sql-commit.ts +435 -0
- package/src/internal/sql-expression.ts +94 -0
- package/src/internal/sql-metadata.ts +100 -0
- package/src/internal/sql-oauth-connected-model.ts +6 -95
- package/src/internal/sql-oauth-model.ts +31 -134
- package/src/internal/sql-persistence.ts +2 -6
- package/src/internal/sql-storage-validation.ts +1 -2
- package/src/internal/sql-table.ts +19 -52
- package/src/internal/standalone.ts +2 -11
- package/src/internal/step-up-state.ts +4 -17
- package/src/internal/storage-clock.ts +58 -0
- package/src/internal/storage-mapping.ts +125 -340
- package/src/internal/storage-plans.ts +14 -80
- package/src/internal/storage-tables.ts +28 -212
- package/src/internal/storage-validation.ts +0 -58
- package/src/internal/table-model.ts +24 -0
- package/src/internal/totp-native.ts +701 -0
- package/dist/internal/PasswordPreparedPostconditions.d.mts +0 -22
- package/dist/internal/PasswordPreparedPostconditions.mjs +0 -12
- package/dist/internal/PasswordPreparedPostconditions.mjs.map +0 -1
- package/dist/internal/authority-snapshot.mjs +0 -53
- package/dist/internal/authority-snapshot.mjs.map +0 -1
- package/dist/internal/email-kernel.d.mts +0 -276
- package/dist/internal/email-kernel.mjs +0 -497
- package/dist/internal/email-kernel.mjs.map +0 -1
- package/dist/internal/models/passkey-registration-ceremony-model.mjs +0 -18
- package/dist/internal/models/passkey-registration-ceremony-model.mjs.map +0 -1
- package/dist/internal/oauth/accounts.d.mts +0 -8
- package/dist/internal/oauth/accounts.mjs +0 -379
- package/dist/internal/oauth/accounts.mjs.map +0 -1
- package/dist/internal/oauth/connected-access.d.mts +0 -9
- package/dist/internal/oauth/connected-access.mjs +0 -229
- package/dist/internal/oauth/connected-access.mjs.map +0 -1
- package/dist/internal/oauth/connected-collection.d.mts +0 -7
- package/dist/internal/oauth/connected-collection.mjs +0 -214
- package/dist/internal/oauth/connected-collection.mjs.map +0 -1
- package/dist/internal/oauth/connected-custody.d.mts +0 -6
- package/dist/internal/oauth/connected-custody.mjs +0 -165
- package/dist/internal/oauth/connected-custody.mjs.map +0 -1
- package/dist/internal/oauth/connected-flow.d.mts +0 -7
- package/dist/internal/oauth/connected-flow.mjs +0 -324
- package/dist/internal/oauth/connected-flow.mjs.map +0 -1
- package/dist/internal/oauth/connected-input.mjs +0 -122
- package/dist/internal/oauth/connected-input.mjs.map +0 -1
- package/dist/internal/oauth/connected-keys.d.mts +0 -2
- package/dist/internal/oauth/connected-keys.mjs +0 -22
- package/dist/internal/oauth/connected-keys.mjs.map +0 -1
- package/dist/internal/oauth/connected-maintenance.d.mts +0 -9
- package/dist/internal/oauth/connected-maintenance.mjs +0 -226
- package/dist/internal/oauth/connected-maintenance.mjs.map +0 -1
- package/dist/internal/oauth/connected-management.d.mts +0 -9
- package/dist/internal/oauth/connected-management.mjs +0 -243
- package/dist/internal/oauth/connected-management.mjs.map +0 -1
- package/dist/internal/oauth/connected-reference.mjs +0 -63
- package/dist/internal/oauth/connected-reference.mjs.map +0 -1
- package/dist/internal/oauth/connected-settlement.d.mts +0 -8
- package/dist/internal/oauth/connected-settlement.mjs +0 -141
- package/dist/internal/oauth/connected-settlement.mjs.map +0 -1
- package/dist/internal/oauth/connected-sign-in.d.mts +0 -10
- package/dist/internal/oauth/connected-sign-in.mjs +0 -281
- package/dist/internal/oauth/connected-sign-in.mjs.map +0 -1
- package/dist/internal/oauth/connected-state.d.mts +0 -14
- package/dist/internal/oauth/connected-state.mjs +0 -469
- package/dist/internal/oauth/connected-state.mjs.map +0 -1
- package/dist/internal/oauth/connected-target.d.mts +0 -21
- package/dist/internal/oauth/connected-target.mjs +0 -117
- package/dist/internal/oauth/connected-target.mjs.map +0 -1
- package/dist/internal/oauth/flow.d.mts +0 -5
- package/dist/internal/oauth/flow.mjs +0 -279
- package/dist/internal/oauth/flow.mjs.map +0 -1
- package/dist/internal/oauth/input.mjs +0 -127
- package/dist/internal/oauth/input.mjs.map +0 -1
- package/dist/internal/oauth/owner.d.mts +0 -10
- package/dist/internal/oauth/owner.mjs +0 -10
- package/dist/internal/oauth/owner.mjs.map +0 -1
- package/dist/internal/oauth/query-compiler.d.mts +0 -7
- package/dist/internal/oauth/query-compiler.mjs +0 -9
- package/dist/internal/oauth/query-compiler.mjs.map +0 -1
- package/dist/internal/oauth/registration.d.mts +0 -7
- package/dist/internal/oauth/registration.mjs +0 -393
- package/dist/internal/oauth/registration.mjs.map +0 -1
- package/dist/internal/oauth/target.d.mts +0 -31
- package/dist/internal/oauth/target.mjs +0 -273
- package/dist/internal/oauth/target.mjs.map +0 -1
- package/dist/internal/oauth-kernel.d.mts +0 -1423
- package/dist/internal/oauth-kernel.mjs +0 -187
- package/dist/internal/oauth-kernel.mjs.map +0 -1
- package/dist/internal/passkey/admission.d.mts +0 -6
- package/dist/internal/passkey/admission.mjs +0 -220
- package/dist/internal/passkey/admission.mjs.map +0 -1
- package/dist/internal/passkey/credentials.d.mts +0 -14
- package/dist/internal/passkey/credentials.mjs +0 -249
- package/dist/internal/passkey/credentials.mjs.map +0 -1
- package/dist/internal/passkey/enrollment.mjs +0 -138
- package/dist/internal/passkey/enrollment.mjs.map +0 -1
- package/dist/internal/passkey/flow.d.mts +0 -21
- package/dist/internal/passkey/flow.mjs +0 -452
- package/dist/internal/passkey/flow.mjs.map +0 -1
- package/dist/internal/passkey/management.mjs +0 -231
- package/dist/internal/passkey/management.mjs.map +0 -1
- package/dist/internal/passkey/registration-ceremony.d.mts +0 -9
- package/dist/internal/passkey/registration-ceremony.mjs +0 -129
- package/dist/internal/passkey/registration-ceremony.mjs.map +0 -1
- package/dist/internal/passkey/registration-custody.d.mts +0 -2
- package/dist/internal/passkey/registration-custody.mjs +0 -52
- package/dist/internal/passkey/registration-custody.mjs.map +0 -1
- package/dist/internal/passkey/registration-write.mjs +0 -211
- package/dist/internal/passkey/registration-write.mjs.map +0 -1
- package/dist/internal/passkey/state.d.mts +0 -10
- package/dist/internal/passkey/state.mjs +0 -234
- package/dist/internal/passkey/state.mjs.map +0 -1
- package/dist/internal/passkey/target.d.mts +0 -20
- package/dist/internal/passkey/target.mjs +0 -200
- package/dist/internal/passkey/target.mjs.map +0 -1
- package/dist/internal/passkey/write-state.d.mts +0 -17
- package/dist/internal/passkey/write-state.mjs +0 -354
- package/dist/internal/passkey/write-state.mjs.map +0 -1
- package/dist/internal/passkey/write-target.mjs +0 -192
- package/dist/internal/passkey/write-target.mjs.map +0 -1
- package/dist/internal/passkey-kernel.d.mts +0 -6045
- package/dist/internal/passkey-kernel.mjs +0 -49
- package/dist/internal/passkey-kernel.mjs.map +0 -1
- package/dist/internal/passkeys.d.mts +0 -7
- package/dist/internal/passkeys.mjs +0 -387
- package/dist/internal/passkeys.mjs.map +0 -1
- package/dist/internal/password-credentials.d.mts +0 -11
- package/dist/internal/password-kernel.d.mts +0 -278
- package/dist/internal/password-kernel.mjs +0 -508
- package/dist/internal/password-kernel.mjs.map +0 -1
- package/dist/internal/phone-kernel.d.mts +0 -162
- package/dist/internal/phone-kernel.mjs +0 -437
- package/dist/internal/phone-kernel.mjs.map +0 -1
- package/dist/internal/proof-kernel.d.mts +0 -94
- package/dist/internal/proof-kernel.mjs +0 -624
- package/dist/internal/proof-kernel.mjs.map +0 -1
- package/dist/internal/query-operations.d.mts +0 -68
- package/dist/internal/session-kernel.d.mts +0 -62
- package/dist/internal/session-kernel.mjs +0 -820
- package/dist/internal/session-kernel.mjs.map +0 -1
- package/dist/internal/sql-oauth-connected-model.mjs +0 -7
- package/dist/internal/sql-oauth-connected-model.mjs.map +0 -1
- package/dist/internal/sql-query.d.mts +0 -12
- package/dist/internal/sql-query.mjs +0 -206
- package/dist/internal/sql-query.mjs.map +0 -1
- package/dist/internal/step-up-state.d.mts +0 -49
- package/dist/internal/transaction-execution-kernel.d.mts +0 -37
- package/dist/internal/transaction-execution-kernel.mjs +0 -120
- package/dist/internal/transaction-execution-kernel.mjs.map +0 -1
- package/dist/internal/transaction-kernel.d.mts +0 -81
- package/dist/internal/transaction-kernel.mjs +0 -264
- package/dist/internal/transaction-kernel.mjs.map +0 -1
- package/src/internal/PasswordPreparedPostconditions.ts +0 -30
- package/src/internal/authority-snapshot.ts +0 -91
- package/src/internal/email-kernel.ts +0 -1556
- package/src/internal/oauth/accounts.ts +0 -839
- package/src/internal/oauth/connected-access.ts +0 -388
- package/src/internal/oauth/connected-collection.ts +0 -345
- package/src/internal/oauth/connected-custody.ts +0 -308
- package/src/internal/oauth/connected-flow.ts +0 -562
- package/src/internal/oauth/connected-input.ts +0 -147
- package/src/internal/oauth/connected-keys.ts +0 -31
- package/src/internal/oauth/connected-maintenance.ts +0 -379
- package/src/internal/oauth/connected-management.ts +0 -391
- package/src/internal/oauth/connected-reference.ts +0 -135
- package/src/internal/oauth/connected-settlement.ts +0 -278
- package/src/internal/oauth/connected-sign-in.ts +0 -472
- package/src/internal/oauth/connected-state.ts +0 -924
- package/src/internal/oauth/connected-target.ts +0 -307
- package/src/internal/oauth/flow.ts +0 -505
- package/src/internal/oauth/input.ts +0 -201
- package/src/internal/oauth/owner.ts +0 -22
- package/src/internal/oauth/query-compiler.ts +0 -15
- package/src/internal/oauth/registration.ts +0 -676
- package/src/internal/oauth/target.ts +0 -803
- package/src/internal/oauth-kernel.ts +0 -294
- package/src/internal/passkey/admission.ts +0 -368
- package/src/internal/passkey/credentials.ts +0 -511
- package/src/internal/passkey/enrollment.ts +0 -326
- package/src/internal/passkey/flow.ts +0 -1062
- package/src/internal/passkey/management.ts +0 -426
- package/src/internal/passkey/registration-ceremony.ts +0 -283
- package/src/internal/passkey/registration-custody.ts +0 -91
- package/src/internal/passkey/registration-write.ts +0 -426
- package/src/internal/passkey/state.ts +0 -351
- package/src/internal/passkey/target.ts +0 -598
- package/src/internal/passkey/write-state.ts +0 -692
- package/src/internal/passkey/write-target.ts +0 -450
- package/src/internal/passkey-kernel.ts +0 -112
- package/src/internal/passkeys.ts +0 -652
- package/src/internal/password-kernel.ts +0 -1523
- package/src/internal/phone-kernel.ts +0 -872
- package/src/internal/proof-kernel.ts +0 -1992
- package/src/internal/query-operations.ts +0 -91
- package/src/internal/session-kernel.ts +0 -2406
- package/src/internal/sql-query.ts +0 -304
- package/src/internal/transaction-execution-kernel.ts +0 -335
- package/src/internal/transaction-kernel.ts +0 -603
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-policy.mjs","names":[],"sources":["../../src/internal/email-policy.ts"],"sourcesContent":["import {\n type EmailAddressMutation,\n type EmailAddressTarget,\n type EmailAction,\n EmailUnavailable,\n snapshotEmailCredential,\n snapshotEmailRequirement,\n snapshotEmailRevision,\n} from \"@yielded/auth/Email\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport {\n snapshotAuthenticationEvidence,\n type AuthenticationRevision,\n type AuthenticationRequirement,\n type SecurityRevision,\n} from \"@yielded/auth/Sessions\";\nimport { Effect } from \"effect\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport type { AnyEmailAddressMapping } from \"./models/email-model\";\nimport { passwordEvidenceSatisfiedAt } from \"./password-policy\";\n\nconst unavailable = () => EmailUnavailable.make({});\n\nconst sameIdentifier = (left: LoginIdentifier, right: LoginIdentifier) =>\n left.namespace === right.namespace && left.value === right.value;\n\nexport type EmailWorkflowPolicy = Pick<\n AnyEmailAddressMapping,\n | \"allocateCredentialId\"\n | \"allocateCredentialIdSync\"\n | \"allocateRevision\"\n | \"allocateRevisionSync\"\n | \"sessionInvalidation\"\n | \"isIdentifierConflict\"\n | \"isCredentialConflict\"\n> & {\n readonly subject: Pick<\n AnyEmailAddressMapping[\"subject\"],\n \"nextSecurityRevision\" | \"nextSecurityRevisionSync\"\n >;\n};\n\nexport const sameEmailRevision = (left: AuthenticationRevision, right: AuthenticationRevision) => {\n if (\n left.subjectId !== right.subjectId ||\n left.securityRevision !== right.securityRevision ||\n left.credentials.length !== right.credentials.length\n )\n return false;\n\n const expected = [...left.credentials].sort((a, b) =>\n a.credentialId.localeCompare(b.credentialId),\n );\n\n const actual = [...right.credentials].sort((a, b) =>\n a.credentialId.localeCompare(b.credentialId),\n );\n\n return expected.every(\n (item, index) =>\n item.credentialId === actual[index]!.credentialId &&\n item.revision === actual[index]!.revision,\n );\n};\n\nexport const emailActionModule = (moduleId: string, action: EmailAction) =>\n `${moduleId}/${action === \"verify-address\" ? \"verify-address\" : \"change-address\"}`;\n\nexport const emailActionPurpose = (action: EmailAction) =>\n action === \"verify-address\" ? \"email-address-verification\" : \"email-address-change\";\n\nexport const emailRedemptionMatches = (input: EmailAddressMutation, action: EmailAction) => {\n const completion = input.redemption.input;\n const binding = completion.binding;\n\n return (\n completion.moduleId === emailActionModule(input.moduleId, action) &&\n completion.purpose === emailActionPurpose(action) &&\n binding._tag === \"IdentifierChange\" &&\n sameIdentifier(binding.identifier, input.target) &&\n sameEmailRevision(binding.revision, input.captured.revision)\n );\n};\n\nexport const snapshotEmailMutation = Effect.fn(\"EmailAddressPersistence.snapshotMutation\")(\n function* (input: EmailAddressMutation) {\n const evidence = yield* snapshotAuthenticationEvidence(input.authorization.evidence).pipe(\n Effect.mapError(unavailable),\n );\n\n const requirement = yield* snapshotEmailRequirement(input.authorization.requirement);\n\n const source =\n input.captured.source === undefined\n ? undefined\n : yield* snapshotEmailCredential(input.captured.source);\n\n return Object.freeze({\n ...input,\n target: Object.freeze({ ...input.target }),\n ...(input.invalidation === undefined\n ? {}\n : { invalidation: Object.freeze({ ...input.invalidation }) }),\n captured: Object.freeze({\n eligible: input.captured.eligible,\n revision: snapshotEmailRevision(input.captured.revision),\n ...(input.captured.targetIdentifierRevision === undefined\n ? {}\n : { targetIdentifierRevision: input.captured.targetIdentifierRevision }),\n ...(source === undefined ? {} : { source }),\n }),\n authorization: Object.freeze({\n challenge: Object.freeze({\n ...input.authorization.challenge,\n target: Object.freeze({ ...input.authorization.challenge.target }),\n revision: snapshotEmailRevision(input.authorization.challenge.revision),\n }),\n evidence,\n requirement,\n }),\n });\n },\n);\n\nexport const validateEmailMutation = Effect.fn(\"EmailAddressPersistence.validateAuthority\")(\n function* (\n policy: EmailWorkflowPolicy,\n input: EmailAddressMutation,\n action: EmailAction,\n current: Pick<EmailMutationRead, \"target\" | \"requirement\"> | undefined,\n now: number,\n ) {\n const confirmsExisting =\n action === \"verify-address\" && input.captured.targetIdentifierRevision !== undefined;\n\n if (\n !input.captured.eligible ||\n !emailRedemptionMatches(input, action) ||\n input.authorization.challenge.moduleId !== input.moduleId ||\n input.authorization.challenge.action !== action ||\n input.authorization.challenge.commandId !== input.commandId ||\n !sameIdentifier(input.authorization.challenge.target, input.target) ||\n input.authorization.challenge.sourceCredentialId !== input.captured.source?.credentialId ||\n !sameEmailRevision(input.authorization.challenge.revision, input.captured.revision) ||\n input.authorization.challenge.targetIdentifierRevision !==\n input.captured.targetIdentifierRevision ||\n (input.authorization.evidence.flowId as string) !== (input.commandId as string) ||\n input.authorization.evidence.bindingDigest !== input.authorization.challenge.bindingDigest ||\n !sameEmailRevision(input.authorization.evidence.revision, input.captured.revision) ||\n (action === \"verify-address\" && input.captured.source !== undefined) ||\n (action === \"change-address\" && input.captured.source === undefined) ||\n confirmsExisting !== (input.invalidation === undefined) ||\n (input.invalidation?.existingSessions === \"immediate\" &&\n policy.sessionInvalidation !== \"same-authority-immediate\")\n )\n return false;\n\n if (\n current === undefined ||\n !current.target.eligible ||\n !sameEmailRevision(current.target.revision, input.captured.revision) ||\n current.target.targetIdentifierRevision !== input.captured.targetIdentifierRevision ||\n (input.captured.source !== undefined &&\n (current.target.source === undefined ||\n current.target.source.identifierRevision !== input.captured.source.identifierRevision ||\n current.target.source.credentialRevision !== input.captured.source.credentialRevision ||\n !sameIdentifier(current.target.source.identifier, input.captured.source.identifier)))\n )\n return false;\n\n const currentRequirement = yield* current.requirement;\n\n return (\n passwordEvidenceSatisfiedAt(\n input.authorization.evidence,\n input.authorization.requirement,\n now,\n ) && passwordEvidenceSatisfiedAt(input.authorization.evidence, currentRequirement, now)\n );\n },\n);\n\nexport const allocateEmailValue = <A>(\n mode: \"interactive\" | \"synchronous\",\n asynchronous: Effect.Effect<A, PersistenceMappingError> | undefined,\n synchronous: (() => A) | undefined,\n) => {\n if (mode === \"synchronous\")\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n if (asynchronous !== undefined) return asynchronous;\n\n return synchronous === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: synchronous,\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n};\n\nexport const allocateEmailSecurityRevision = (\n mapping: EmailWorkflowPolicy,\n mode: \"interactive\" | \"synchronous\",\n current: SecurityRevision,\n) => {\n if (mode === \"synchronous\")\n return mapping.subject.nextSecurityRevisionSync === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: () => mapping.subject.nextSecurityRevisionSync!(current),\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n if (mapping.subject.nextSecurityRevision !== undefined)\n return mapping.subject.nextSecurityRevision(current);\n if (mapping.subject.nextSecurityRevisionSync !== undefined)\n return Effect.try({\n try: () => mapping.subject.nextSecurityRevisionSync!(current),\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n\n return Effect.fail(unavailable());\n};\n\nexport interface EmailMutationRead {\n readonly target: EmailAddressTarget;\n readonly requirement: Effect.Effect<\n AuthenticationRequirement,\n EmailUnavailable | PersistenceMappingError\n >;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AnyProofPersistenceMapping } from "./models/proof-model.mjs";
|
|
2
|
+
import { AnyEmailRegistrationMapping } from "./models/email-model.mjs";
|
|
3
|
+
import { NativeSqlTables } from "./native-sql-table.mjs";
|
|
4
|
+
import { Crypto, Effect } from "effect";
|
|
5
|
+
import { EmailCommandId, EmailRegistrationDecision, EmailUnavailable, PrepareEmailCommit } from "@yielded/auth/Email";
|
|
6
|
+
import { LifecycleHooks, PreparedCommit } from "@yielded/auth/Hooks";
|
|
7
|
+
import { ProofRedemptionPlan } from "@yielded/auth/Proofs";
|
|
8
|
+
import { SqlClient } from "effect/sql/SqlClient";
|
|
9
|
+
import { LoginIdentifier } from "@yielded/auth/Identity";
|
|
10
|
+
import { TokenDigest } from "@yielded/auth/Schema";
|
|
11
|
+
//#region src/internal/email-registration-native.d.ts
|
|
12
|
+
export interface EmailRegistrationAuthority<Registration> {
|
|
13
|
+
readonly inspect: (input: {
|
|
14
|
+
readonly identifier: LoginIdentifier;
|
|
15
|
+
readonly registration: Registration;
|
|
16
|
+
}) => Effect.Effect<{
|
|
17
|
+
readonly fingerprint: TokenDigest;
|
|
18
|
+
readonly eligible: boolean;
|
|
19
|
+
}, EmailUnavailable>;
|
|
20
|
+
readonly registerWithProof: <A>(input: {
|
|
21
|
+
readonly moduleId: string;
|
|
22
|
+
readonly commandId: EmailCommandId;
|
|
23
|
+
readonly requestId: string;
|
|
24
|
+
readonly identifier: LoginIdentifier;
|
|
25
|
+
readonly registration: Registration;
|
|
26
|
+
readonly fingerprint: TokenDigest;
|
|
27
|
+
readonly redemption: ProofRedemptionPlan;
|
|
28
|
+
}, prepare: PrepareEmailCommit<EmailRegistrationDecision, A>) => Effect.Effect<PreparedCommit<A>, EmailUnavailable>;
|
|
29
|
+
}
|
|
30
|
+
/** Proof redemption, SQL provisioning, and verified ownership commit together. No registration receipt survives the proof. */
|
|
31
|
+
export declare const makeNativeEmailRegistrationServices: <Registration>(tables: NativeSqlTables, mapping: AnyEmailRegistrationMapping<Registration>, proofs: AnyProofPersistenceMapping, batch?: {
|
|
32
|
+
readonly client: SqlClient;
|
|
33
|
+
readonly execute: (statements: ReadonlyArray<import("effect/sql/Statement").Statement<unknown>>) => Effect.Effect<void, import("effect/sql/SqlError").SqlError>;
|
|
34
|
+
} | undefined) => Effect.Effect<{
|
|
35
|
+
readonly registrationAuthority: EmailRegistrationAuthority<Registration>;
|
|
36
|
+
}, never, Crypto.Crypto | LifecycleHooks | SqlClient>;
|
|
37
|
+
//#endregion
|
|
38
|
+
//# sourceMappingURL=email-registration-native.d.mts.map
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { PersistenceMappingError } from "./mapping-error.mjs";
|
|
2
|
+
import { sqlBatchAssertion } from "./d1-planning.mjs";
|
|
3
|
+
import { exactSqlText, executeSqlChange } from "./sql-change.mjs";
|
|
4
|
+
import { emailUnavailable, ensureEmail } from "./email-native-state.mjs";
|
|
5
|
+
import { allocateEmailValue } from "./email-policy.mjs";
|
|
6
|
+
import { SqlBatchCommit, appendSqlBatchStatement, makeSqlCommitExecutor, registerSqlBatchPostcondition, registerSqlCommitReceipt, registerSqlPostcondition } from "./sql-commit.mjs";
|
|
7
|
+
import { makeNativeProofStore } from "./proof-native.mjs";
|
|
8
|
+
import { Crypto, Effect, Schema } from "effect";
|
|
9
|
+
import "@yielded/auth/Email";
|
|
10
|
+
import { CurrentCommitJournal } from "@yielded/auth/Hooks";
|
|
11
|
+
import { ProofRedemptionInput } from "@yielded/auth/Proofs";
|
|
12
|
+
import { SecurityRevision } from "@yielded/auth/Sessions";
|
|
13
|
+
import { SqlClient } from "effect/sql/SqlClient";
|
|
14
|
+
//#region src/internal/email-registration-native.ts
|
|
15
|
+
/** Proof redemption, SQL provisioning, and verified ownership commit together. No registration receipt survives the proof. */
|
|
16
|
+
const makeNativeEmailRegistrationServices = Effect.fnUntraced(function* (tables, mapping, proofs, batch) {
|
|
17
|
+
const sql = (yield* SqlClient).withoutTransforms(), executor = yield* makeSqlCommitExecutor(emailUnavailable), crypto = yield* Crypto.Crypto;
|
|
18
|
+
const s = mapping.subject, i = mapping.identifier, c = mapping.credential, a = mapping.authorityCredential;
|
|
19
|
+
const subject = tables(s.table), identifier = tables(i.table), credential = tables(c.table), authority = tables(a.table);
|
|
20
|
+
const exact = (t, key, value) => exactSqlText(sql, t.column(key), t.value(key, value));
|
|
21
|
+
const id = (t, key, value) => sql`${t.column(key)} = ${t.value(key, value)}`;
|
|
22
|
+
const identifierKey = (value) => sql.and([exact(identifier, i.namespace, value.namespace), exact(identifier, i.value, value.value)]);
|
|
23
|
+
const lock = sql.onDialectOrElse({
|
|
24
|
+
sqlite: () => sql``,
|
|
25
|
+
orElse: () => sql`for update`
|
|
26
|
+
}), now = tables.expression(mapping.clock.engineNowMillis), mode = "interactive";
|
|
27
|
+
const run = (work) => batch === void 0 ? executor.run(work.pipe(Effect.provideService(Crypto.Crypto, crypto))) : executor.batch(work.pipe(Effect.provideService(Crypto.Crypto, crypto))).pipe(Effect.provideService(SqlBatchCommit, batch));
|
|
28
|
+
const stage = Effect.fnUntraced(function* (statement) {
|
|
29
|
+
if (batch === void 0) ensureEmail((yield* executeSqlChange(sql, statement)) === 1);
|
|
30
|
+
else {
|
|
31
|
+
yield* appendSqlBatchStatement(sql`${statement}`);
|
|
32
|
+
yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`changes() = 1`));
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
const prepare = (decision, project) => Effect.gen(function* () {
|
|
36
|
+
const receipt = project(decision, yield* CurrentCommitJournal);
|
|
37
|
+
yield* registerSqlCommitReceipt(receipt);
|
|
38
|
+
return receipt;
|
|
39
|
+
});
|
|
40
|
+
return { registrationAuthority: {
|
|
41
|
+
inspect: (input) => executor.read(mapping.inspect(input)),
|
|
42
|
+
registerWithProof: (original, project) => Effect.gen(function* () {
|
|
43
|
+
const registration = yield* mapping.snapshotRegistration(original.registration);
|
|
44
|
+
const inspection = yield* mapping.inspect({
|
|
45
|
+
identifier: original.identifier,
|
|
46
|
+
registration: yield* mapping.snapshotRegistration(registration)
|
|
47
|
+
});
|
|
48
|
+
const redemption = yield* Schema.decodeEffect(Schema.toCodecIso(ProofRedemptionInput))(yield* Schema.encodeEffect(Schema.toCodecIso(ProofRedemptionInput))(original.redemption.input));
|
|
49
|
+
const input = {
|
|
50
|
+
...original,
|
|
51
|
+
identifier: { ...original.identifier },
|
|
52
|
+
registration,
|
|
53
|
+
redemption
|
|
54
|
+
};
|
|
55
|
+
return yield* run(Effect.gen(function* () {
|
|
56
|
+
const binding = redemption.binding;
|
|
57
|
+
if (!inspection.eligible || inspection.fingerprint !== input.fingerprint || redemption.moduleId !== `${input.moduleId}/registration` || redemption.purpose !== "email-code-registration" || binding._tag !== "Identifier" || binding.identifier.namespace !== input.identifier.namespace || binding.identifier.value !== input.identifier.value || input.requestId !== `email-registration:${input.moduleId}:${redemption.proofId}`) return yield* prepare({ _tag: "Rejected" }, project);
|
|
58
|
+
const priorRows = yield* sql`select ${identifier.fields("email_registration_identifier_")} from ${identifier.name} where ${identifierKey(input.identifier)} limit 2`;
|
|
59
|
+
ensureEmail(priorRows.length <= 1);
|
|
60
|
+
const prior = priorRows[0] === void 0 ? void 0 : identifier.decode(priorRows[0], "email_registration_identifier_");
|
|
61
|
+
let previous;
|
|
62
|
+
if (prior !== void 0) {
|
|
63
|
+
ensureEmail(prior[i.namespace] === input.identifier.namespace && prior[i.value] === input.identifier.value);
|
|
64
|
+
if (prior[i.verifiedAt] !== null || !i.isMutableTarget(prior)) return yield* prepare({ _tag: "Rejected" }, project);
|
|
65
|
+
const previousSubject = yield* mapping.subjectId.toSubject(prior[i.subjectId]), native = yield* mapping.subjectId.toNative(previousSubject);
|
|
66
|
+
const rows = yield* sql`select ${subject.fields("email_registration_old_subject_")} from ${subject.name} where ${id(subject, s.id, native)} limit 2 ${batch === void 0 ? lock : sql``}`;
|
|
67
|
+
if (rows.length !== 1) return yield* prepare({ _tag: "Rejected" }, project);
|
|
68
|
+
const row = subject.decode(rows[0], "email_registration_old_subject_");
|
|
69
|
+
ensureEmail((yield* mapping.subjectId.toSubject(row[s.id])) === previousSubject);
|
|
70
|
+
const currentRows = yield* sql`select ${identifier.fields("email_registration_current_identifier_")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null limit 2`;
|
|
71
|
+
if (currentRows.length !== 1 || !i.isMutableTarget(identifier.decode(currentRows[0], "email_registration_current_identifier_"))) return yield* prepare({ _tag: "Rejected" }, project);
|
|
72
|
+
if (batch !== void 0) {
|
|
73
|
+
ensureEmail(i.d1MutableTargetCondition !== void 0);
|
|
74
|
+
yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null and ${tables.expression(i.d1MutableTargetCondition({
|
|
75
|
+
identifier: input.identifier,
|
|
76
|
+
nativeSubjectId: native
|
|
77
|
+
}))})`));
|
|
78
|
+
}
|
|
79
|
+
previous = {
|
|
80
|
+
native,
|
|
81
|
+
securityRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(row[s.securityRevision]),
|
|
82
|
+
bindingRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(prior[i.bindingRevision])
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const redeemed = yield* (yield* makeNativeProofStore(tables, proofs, batch !== void 0)).redeemLocked(redemption);
|
|
86
|
+
yield* registerSqlCommitReceipt(original.redemption.prepare(redeemed.decision, yield* CurrentCommitJournal, (value) => value));
|
|
87
|
+
if (redeemed.decision !== "redeemed") return yield* prepare({ _tag: "Rejected" }, project);
|
|
88
|
+
const allocate = () => allocateEmailValue(mode, mapping.allocateRevision, mapping.allocateRevisionSync);
|
|
89
|
+
const securityRevision = yield* allocate(), identifierRevision = yield* allocate(), credentialRevision = yield* allocate(), displacedRevision = previous === void 0 ? void 0 : yield* allocate(), credentialId = yield* allocateEmailValue(mode, mapping.allocateCredentialId, mapping.allocateCredentialIdSync);
|
|
90
|
+
const provisioning = mapping.provisioning;
|
|
91
|
+
if (batch !== void 0 && provisioning.idMode === "generated") return yield* emailUnavailable();
|
|
92
|
+
let native = provisioning.idMode === "generated" ? void 0 : yield* allocateEmailValue(mode, provisioning.allocateSubjectId, provisioning.allocateSubjectIdSync);
|
|
93
|
+
const insertion = sql`${subject.insert(provisioning.encodeSubjectInsert(input, {
|
|
94
|
+
nativeSubjectId: native,
|
|
95
|
+
securityRevision
|
|
96
|
+
}))}`;
|
|
97
|
+
if (provisioning.idMode === "generated") {
|
|
98
|
+
const rows = yield* sql.onDialectOrElse({
|
|
99
|
+
mysql: () => insertion.raw.pipe(Effect.flatMap(Schema.decodeUnknownEffect(Schema.Struct({ insertId: Schema.Union([Schema.Int, Schema.String]) }))), Effect.map((header) => [{ [s.id]: header.insertId }])),
|
|
100
|
+
orElse: () => sql`${insertion} returning ${subject.fields("email_registration_generated_")}`.pipe(Effect.map((rows) => rows.map((row) => subject.decode(row, "email_registration_generated_"))))
|
|
101
|
+
});
|
|
102
|
+
native = yield* provisioning.decodeGeneratedId(rows);
|
|
103
|
+
} else yield* stage(insertion);
|
|
104
|
+
ensureEmail(native !== void 0);
|
|
105
|
+
const subjectId = yield* mapping.subjectId.toSubject(native);
|
|
106
|
+
const clock = yield* sql`select ${now} as engine_now`;
|
|
107
|
+
const verifiedAt = Number(clock[0]?.engine_now);
|
|
108
|
+
ensureEmail(Number.isSafeInteger(verifiedAt));
|
|
109
|
+
const values = i.encodeVerifiedInsert({
|
|
110
|
+
identifier: input.identifier,
|
|
111
|
+
subjectId: native,
|
|
112
|
+
verifiedAtMillis: verifiedAt,
|
|
113
|
+
bindingRevision: identifierRevision
|
|
114
|
+
});
|
|
115
|
+
if (previous === void 0) yield* stage(identifier.insert(values));
|
|
116
|
+
else {
|
|
117
|
+
ensureEmail(displacedRevision !== previous.securityRevision);
|
|
118
|
+
yield* stage(sql`${identifier.update(values)} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, previous.native)} and ${exact(identifier, i.bindingRevision, previous.bindingRevision)} and ${identifier.column(i.verifiedAt)} is null`);
|
|
119
|
+
yield* stage(sql`${subject.update({ [s.securityRevision]: displacedRevision })} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, previous.securityRevision)}`);
|
|
120
|
+
}
|
|
121
|
+
yield* stage(credential.insert(c.encodeVerifiedInsert({
|
|
122
|
+
moduleId: input.moduleId,
|
|
123
|
+
subjectId: native,
|
|
124
|
+
credentialId,
|
|
125
|
+
identifier: input.identifier,
|
|
126
|
+
credentialRevision
|
|
127
|
+
})));
|
|
128
|
+
yield* stage(authority.insert(a.encodeInsert({
|
|
129
|
+
subjectId: native,
|
|
130
|
+
credentialId,
|
|
131
|
+
revision: credentialRevision
|
|
132
|
+
})));
|
|
133
|
+
const conditions = [
|
|
134
|
+
redeemed.validUntil,
|
|
135
|
+
sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${exact(subject, s.securityRevision, securityRevision)} and ${id(subject, s.status, s.activeStatusValue)})`,
|
|
136
|
+
sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, identifierRevision)} and ${id(identifier, i.verifiedAt, mapping.clock.encodeInstant(verifiedAt))})`,
|
|
137
|
+
sql`exists(select 1 from ${credential.name} where ${exact(credential, c.moduleId, input.moduleId)} and ${exact(credential, c.credentialId, credentialId)} and ${id(credential, c.subjectId, native)} and ${exact(credential, c.credentialRevision, credentialRevision)} and ${exact(credential, c.identifierNamespace, input.identifier.namespace)} and ${exact(credential, c.identifierValue, input.identifier.value)} and ${id(credential, c.status, c.activeStatusValue)})`,
|
|
138
|
+
sql`exists(select 1 from ${authority.name} where ${id(authority, a.subjectId, native)} and ${exact(authority, a.credentialId, credentialId)} and ${exact(authority, a.revision, credentialRevision)} and ${id(authority, a.status, a.activeStatusValue)})`
|
|
139
|
+
];
|
|
140
|
+
if (previous !== void 0) conditions.push(sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, displacedRevision)})`);
|
|
141
|
+
if (batch !== void 0) {
|
|
142
|
+
ensureEmail(i.d1CurrentCondition !== void 0);
|
|
143
|
+
conditions.push(sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${tables.expression(i.d1CurrentCondition({
|
|
144
|
+
identifier: input.identifier,
|
|
145
|
+
nativeSubjectId: native,
|
|
146
|
+
bindingRevision: identifierRevision
|
|
147
|
+
}))})`);
|
|
148
|
+
yield* registerSqlBatchPostcondition({
|
|
149
|
+
name: "email-registration-authority",
|
|
150
|
+
statement: sqlBatchAssertion(sql, sql.and(conditions))
|
|
151
|
+
});
|
|
152
|
+
} else yield* registerSqlPostcondition({
|
|
153
|
+
name: "email-registration-authority",
|
|
154
|
+
check: Effect.gen(function* () {
|
|
155
|
+
const rows = yield* sql`select ${identifier.fields("email_registration_final_")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${sql.and(conditions)} limit 2`;
|
|
156
|
+
ensureEmail(rows.length === 1 && i.isCurrent(identifier.decode(rows[0], "email_registration_final_")));
|
|
157
|
+
}).pipe(Effect.mapError((cause) => PersistenceMappingError.make({
|
|
158
|
+
operation: "decode",
|
|
159
|
+
cause
|
|
160
|
+
})))
|
|
161
|
+
});
|
|
162
|
+
ensureEmail((yield* mapping.subjectId.toSubject(native)) === subjectId);
|
|
163
|
+
return yield* prepare({ _tag: "Registered" }, project);
|
|
164
|
+
}));
|
|
165
|
+
}).pipe(Effect.mapError(emailUnavailable))
|
|
166
|
+
} };
|
|
167
|
+
});
|
|
168
|
+
//#endregion
|
|
169
|
+
export { makeNativeEmailRegistrationServices };
|
|
170
|
+
|
|
171
|
+
//# sourceMappingURL=email-registration-native.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-registration-native.mjs","names":["unavailable"],"sources":["../../src/internal/email-registration-native.ts"],"sourcesContent":["import {\n type EmailUnavailable,\n type EmailCommandId,\n type EmailRegistrationDecision,\n type PrepareEmailCommit,\n} from \"@yielded/auth/Email\";\nimport {\n CurrentCommitJournal,\n type LifecycleHooks,\n type PreparedCommit,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport { ProofRedemptionInput, type ProofRedemptionPlan } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport { SecurityRevision } from \"@yielded/auth/Sessions\";\nimport { Crypto, Effect, Schema } from \"effect\";\nimport { SqlClient } from \"effect/sql/SqlClient\";\nimport type { Fragment } from \"effect/sql/Statement\";\n\nimport { sqlBatchAssertion } from \"./d1-planning\";\nimport { ensureEmail as ensure, emailUnavailable as unavailable } from \"./email-native-state\";\nimport { allocateEmailValue } from \"./email-policy\";\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport type { AnyEmailRegistrationMapping } from \"./models/email-model\";\nimport type { AnyProofPersistenceMapping } from \"./models/proof-model\";\nimport type { NativeSqlTables, SqlTable } from \"./native-sql-table\";\nimport { makeNativeProofStore } from \"./proof-native\";\nimport { exactSqlText, executeSqlChange } from \"./sql-change\";\nimport {\n appendSqlBatchStatement,\n makeSqlCommitExecutor,\n registerSqlBatchPostcondition,\n registerSqlCommitReceipt,\n registerSqlPostcondition,\n SqlBatchCommit,\n} from \"./sql-commit\";\n\nexport interface EmailRegistrationAuthority<Registration> {\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly fingerprint: TokenDigest; readonly eligible: boolean },\n EmailUnavailable\n >;\n readonly registerWithProof: <A>(\n input: {\n readonly moduleId: string;\n readonly commandId: EmailCommandId;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly redemption: ProofRedemptionPlan;\n },\n prepare: PrepareEmailCommit<EmailRegistrationDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, EmailUnavailable>;\n}\n\n/** Proof redemption, SQL provisioning, and verified ownership commit together. No registration receipt survives the proof. */\nexport const makeNativeEmailRegistrationServices = Effect.fnUntraced(function* <Registration>(\n tables: NativeSqlTables,\n mapping: AnyEmailRegistrationMapping<Registration>,\n proofs: AnyProofPersistenceMapping,\n batch?: SqlBatchCommit[\"Service\"],\n): Effect.fn.Return<\n { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n never,\n SqlClient | LifecycleHooks | Crypto.Crypto\n> {\n const sql = (yield* SqlClient).withoutTransforms(),\n executor = yield* makeSqlCommitExecutor(unavailable),\n crypto = yield* Crypto.Crypto;\n\n const s = mapping.subject,\n i = mapping.identifier,\n c = mapping.credential,\n a = mapping.authorityCredential;\n\n const subject = tables(s.table),\n identifier = tables(i.table),\n credential = tables(c.table),\n authority = tables(a.table);\n\n const exact = (t: SqlTable, key: string, value: unknown) =>\n exactSqlText(sql, t.column(key), t.value(key, value));\n\n const id = (t: SqlTable, key: string, value: unknown) =>\n sql`${t.column(key)} = ${t.value(key, value)}`;\n\n const identifierKey = (value: LoginIdentifier) =>\n sql.and([\n exact(identifier, i.namespace, value.namespace),\n exact(identifier, i.value, value.value),\n ]);\n\n const lock = sql.onDialectOrElse({ sqlite: () => sql``, orElse: () => sql`for update` }),\n now = tables.expression(mapping.clock.engineNowMillis),\n mode = \"interactive\";\n\n const run = <A, E, R>(work: Effect.Effect<A, E, R>) =>\n batch === undefined\n ? executor.run(work.pipe(Effect.provideService(Crypto.Crypto, crypto)))\n : executor\n .batch(work.pipe(Effect.provideService(Crypto.Crypto, crypto)))\n .pipe(Effect.provideService(SqlBatchCommit, batch));\n\n const stage = Effect.fnUntraced(function* (statement: Fragment) {\n if (batch === undefined) ensure((yield* executeSqlChange(sql, statement)) === 1);\n else {\n yield* appendSqlBatchStatement(sql`${statement}`);\n yield* appendSqlBatchStatement(sqlBatchAssertion(sql, sql`changes() = 1`));\n }\n });\n\n const prepare = <A>(\n decision: EmailRegistrationDecision,\n project: PrepareEmailCommit<EmailRegistrationDecision, A>,\n ) =>\n Effect.gen(function* () {\n const receipt = project(decision, yield* CurrentCommitJournal);\n\n yield* registerSqlCommitReceipt(receipt);\n\n return receipt;\n });\n\n const registrationAuthority: EmailRegistrationAuthority<Registration> = {\n inspect: (input) => executor.read(mapping.inspect(input)),\n registerWithProof: (original, project) =>\n Effect.gen(function* () {\n const registration = yield* mapping.snapshotRegistration(original.registration);\n\n const inspection = yield* mapping.inspect({\n identifier: original.identifier,\n registration: yield* mapping.snapshotRegistration(registration),\n });\n\n const redemption = yield* Schema.decodeEffect(Schema.toCodecIso(ProofRedemptionInput))(\n yield* Schema.encodeEffect(Schema.toCodecIso(ProofRedemptionInput))(\n original.redemption.input,\n ),\n );\n\n const input = {\n ...original,\n identifier: { ...original.identifier },\n registration,\n redemption,\n };\n\n return yield* run(\n Effect.gen(function* () {\n const binding = redemption.binding;\n\n if (\n !inspection.eligible ||\n inspection.fingerprint !== input.fingerprint ||\n redemption.moduleId !== `${input.moduleId}/registration` ||\n redemption.purpose !== \"email-code-registration\" ||\n binding._tag !== \"Identifier\" ||\n binding.identifier.namespace !== input.identifier.namespace ||\n binding.identifier.value !== input.identifier.value ||\n input.requestId !== `email-registration:${input.moduleId}:${redemption.proofId}`\n )\n return yield* prepare({ _tag: \"Rejected\" }, project);\n\n const priorRows =\n yield* sql`select ${identifier.fields(\"email_registration_identifier_\")} from ${identifier.name} where ${identifierKey(input.identifier)} limit 2`;\n\n ensure(priorRows.length <= 1);\n\n const prior =\n priorRows[0] === undefined\n ? undefined\n : identifier.decode(priorRows[0], \"email_registration_identifier_\");\n\n let previous:\n | {\n readonly native: unknown;\n readonly securityRevision: SecurityRevision;\n readonly bindingRevision: SecurityRevision;\n }\n | undefined;\n\n if (prior !== undefined) {\n ensure(\n prior[i.namespace] === input.identifier.namespace &&\n prior[i.value] === input.identifier.value,\n );\n if (prior[i.verifiedAt] !== null || !i.isMutableTarget(prior))\n return yield* prepare({ _tag: \"Rejected\" }, project);\n\n const previousSubject = yield* mapping.subjectId.toSubject(prior[i.subjectId]),\n native = yield* mapping.subjectId.toNative(previousSubject);\n\n const rows =\n yield* sql`select ${subject.fields(\"email_registration_old_subject_\")} from ${subject.name} where ${id(subject, s.id, native)} limit 2 ${batch === undefined ? lock : sql``}`;\n\n if (rows.length !== 1) return yield* prepare({ _tag: \"Rejected\" }, project);\n const row = subject.decode(rows[0]!, \"email_registration_old_subject_\");\n\n ensure((yield* mapping.subjectId.toSubject(row[s.id])) === previousSubject);\n\n const currentRows =\n yield* sql`select ${identifier.fields(\"email_registration_current_identifier_\")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null limit 2`;\n\n if (\n currentRows.length !== 1 ||\n !i.isMutableTarget(\n identifier.decode(currentRows[0]!, \"email_registration_current_identifier_\"),\n )\n )\n return yield* prepare({ _tag: \"Rejected\" }, project);\n if (batch !== undefined) {\n ensure(i.d1MutableTargetCondition !== undefined);\n yield* appendSqlBatchStatement(\n sqlBatchAssertion(\n sql,\n sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, prior[i.bindingRevision])} and ${identifier.column(i.verifiedAt)} is null and ${tables.expression(i.d1MutableTargetCondition({ identifier: input.identifier, nativeSubjectId: native }))})`,\n ),\n );\n }\n previous = {\n native,\n securityRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(\n row[s.securityRevision],\n ),\n bindingRevision: yield* Schema.decodeUnknownEffect(SecurityRevision)(\n prior[i.bindingRevision],\n ),\n };\n }\n\n const proof = yield* makeNativeProofStore(tables, proofs, batch !== undefined),\n redeemed = yield* proof.redeemLocked(redemption);\n\n yield* registerSqlCommitReceipt(\n original.redemption.prepare(\n redeemed.decision,\n yield* CurrentCommitJournal,\n (value) => value,\n ),\n );\n if (redeemed.decision !== \"redeemed\")\n return yield* prepare({ _tag: \"Rejected\" }, project);\n\n const allocate = () =>\n allocateEmailValue(mode, mapping.allocateRevision, mapping.allocateRevisionSync);\n\n const securityRevision = yield* allocate(),\n identifierRevision = yield* allocate(),\n credentialRevision = yield* allocate(),\n displacedRevision = previous === undefined ? undefined : yield* allocate(),\n credentialId = yield* allocateEmailValue(\n mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n );\n\n const provisioning = mapping.provisioning;\n\n if (batch !== undefined && provisioning.idMode === \"generated\")\n return yield* unavailable();\n\n let native =\n provisioning.idMode === \"generated\"\n ? undefined\n : yield* allocateEmailValue(\n mode,\n provisioning.allocateSubjectId,\n provisioning.allocateSubjectIdSync,\n );\n\n const insertion = sql`${subject.insert(provisioning.encodeSubjectInsert(input, { nativeSubjectId: native, securityRevision }))}`;\n\n if (provisioning.idMode === \"generated\") {\n const rows = yield* sql.onDialectOrElse({\n mysql: () =>\n insertion.raw.pipe(\n Effect.flatMap(\n Schema.decodeUnknownEffect(\n Schema.Struct({ insertId: Schema.Union([Schema.Int, Schema.String]) }),\n ),\n ),\n Effect.map((header) => [{ [s.id]: header.insertId }]),\n ),\n orElse: () =>\n sql`${insertion} returning ${subject.fields(\"email_registration_generated_\")}`.pipe(\n Effect.map((rows) =>\n rows.map((row) => subject.decode(row, \"email_registration_generated_\")),\n ),\n ),\n });\n\n native = yield* provisioning.decodeGeneratedId(rows);\n } else yield* stage(insertion);\n ensure(native !== undefined);\n const subjectId = yield* mapping.subjectId.toSubject(native);\n const clock = yield* sql`select ${now} as engine_now`;\n const verifiedAt = Number(clock[0]?.engine_now);\n\n ensure(Number.isSafeInteger(verifiedAt));\n\n const values = i.encodeVerifiedInsert({\n identifier: input.identifier,\n subjectId: native,\n verifiedAtMillis: verifiedAt,\n bindingRevision: identifierRevision,\n });\n\n if (previous === undefined) yield* stage(identifier.insert(values));\n else {\n ensure(displacedRevision !== previous.securityRevision);\n yield* stage(\n sql`${identifier.update(values)} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, previous.native)} and ${exact(identifier, i.bindingRevision, previous.bindingRevision)} and ${identifier.column(i.verifiedAt)} is null`,\n );\n yield* stage(\n sql`${subject.update({ [s.securityRevision]: displacedRevision })} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, previous.securityRevision)}`,\n );\n }\n yield* stage(\n credential.insert(\n c.encodeVerifiedInsert({\n moduleId: input.moduleId,\n subjectId: native,\n credentialId,\n identifier: input.identifier,\n credentialRevision,\n }),\n ),\n );\n yield* stage(\n authority.insert(\n a.encodeInsert({ subjectId: native, credentialId, revision: credentialRevision }),\n ),\n );\n\n const conditions: Fragment[] = [\n redeemed.validUntil,\n sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, native)} and ${exact(subject, s.securityRevision, securityRevision)} and ${id(subject, s.status, s.activeStatusValue)})`,\n sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${exact(identifier, i.bindingRevision, identifierRevision)} and ${id(identifier, i.verifiedAt, mapping.clock.encodeInstant(verifiedAt))})`,\n sql`exists(select 1 from ${credential.name} where ${exact(credential, c.moduleId, input.moduleId)} and ${exact(credential, c.credentialId, credentialId)} and ${id(credential, c.subjectId, native)} and ${exact(credential, c.credentialRevision, credentialRevision)} and ${exact(credential, c.identifierNamespace, input.identifier.namespace)} and ${exact(credential, c.identifierValue, input.identifier.value)} and ${id(credential, c.status, c.activeStatusValue)})`,\n sql`exists(select 1 from ${authority.name} where ${id(authority, a.subjectId, native)} and ${exact(authority, a.credentialId, credentialId)} and ${exact(authority, a.revision, credentialRevision)} and ${id(authority, a.status, a.activeStatusValue)})`,\n ];\n\n if (previous !== undefined)\n conditions.push(\n sql`exists(select 1 from ${subject.name} where ${id(subject, s.id, previous.native)} and ${exact(subject, s.securityRevision, displacedRevision)})`,\n );\n if (batch !== undefined) {\n ensure(i.d1CurrentCondition !== undefined);\n conditions.push(\n sql`exists(select 1 from ${identifier.name} where ${identifierKey(input.identifier)} and ${id(identifier, i.subjectId, native)} and ${tables.expression(i.d1CurrentCondition({ identifier: input.identifier, nativeSubjectId: native, bindingRevision: identifierRevision }))})`,\n );\n yield* registerSqlBatchPostcondition({\n name: \"email-registration-authority\",\n statement: sqlBatchAssertion(sql, sql.and(conditions)),\n });\n } else\n yield* registerSqlPostcondition({\n name: \"email-registration-authority\",\n check: Effect.gen(function* () {\n const rows =\n yield* sql`select ${identifier.fields(\"email_registration_final_\")} from ${identifier.name} where ${identifierKey(input.identifier)} and ${sql.and(conditions)} limit 2`;\n\n ensure(\n rows.length === 1 &&\n i.isCurrent(identifier.decode(rows[0]!, \"email_registration_final_\")),\n );\n }).pipe(\n Effect.mapError((cause) =>\n PersistenceMappingError.make({ operation: \"decode\", cause }),\n ),\n ),\n });\n ensure((yield* mapping.subjectId.toSubject(native)) === subjectId);\n\n return yield* prepare({ _tag: \"Registered\" }, project);\n }),\n );\n }).pipe(Effect.mapError(unavailable)),\n };\n\n return { registrationAuthority };\n});\n"],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { AnyTableModel, SqlExpression, TableModel } from "../table-model.mjs";
|
|
1
2
|
import { PersistenceMappingError } from "../mapping-error.mjs";
|
|
2
|
-
import { AnyTableModel, SqlExpression, TableModel } from "../query-operations.mjs";
|
|
3
3
|
import { SubjectIdCodec } from "./common.mjs";
|
|
4
|
+
import { ProofClock } from "./proof-model.mjs";
|
|
4
5
|
import { Effect } from "effect";
|
|
5
|
-
import {
|
|
6
|
+
import { EmailAction } from "@yielded/auth/Email";
|
|
7
|
+
import { ProofRedemptionInput } from "@yielded/auth/Proofs";
|
|
6
8
|
import { AuthenticationRequirement, SecurityRevision } from "@yielded/auth/Sessions";
|
|
7
|
-
import { ProofBinding, ProofContinuationId, ProofPurpose } from "@yielded/auth/Proofs";
|
|
8
|
-
import { EmailAction, EmailRegistrationDecision } from "@yielded/auth/Email";
|
|
9
9
|
import { LoginIdentifier } from "@yielded/auth/Identity";
|
|
10
|
+
import { TokenDigest } from "@yielded/auth/Schema";
|
|
10
11
|
//#region src/internal/models/email-model.d.ts
|
|
11
12
|
type ColumnKey<T extends TableModel> = T["column"];
|
|
12
13
|
export interface EmailSubjectReadTable<Subject extends TableModel> {
|
|
@@ -15,13 +16,14 @@ export interface EmailSubjectReadTable<Subject extends TableModel> {
|
|
|
15
16
|
readonly status: ColumnKey<Subject>;
|
|
16
17
|
readonly securityRevision: ColumnKey<Subject>;
|
|
17
18
|
readonly isActiveStatus: (value: unknown) => boolean;
|
|
18
|
-
readonly
|
|
19
|
+
readonly activeStatusValue: unknown;
|
|
20
|
+
readonly decodeRequirement: (row: Subject["select"]) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
|
|
19
21
|
}
|
|
20
22
|
export interface EmailSubjectTable<Subject extends TableModel> extends EmailSubjectReadTable<Subject> {
|
|
21
23
|
readonly decodeActionRequirement: (row: Subject["select"], action: EmailAction) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
|
|
22
24
|
readonly nextSecurityRevision?: (current: SecurityRevision) => Effect.Effect<SecurityRevision, PersistenceMappingError>;
|
|
23
25
|
readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;
|
|
24
|
-
readonly
|
|
26
|
+
readonly activeStatusValue: unknown;
|
|
25
27
|
}
|
|
26
28
|
export interface EmailIdentifierReadTable<Identifier extends TableModel> {
|
|
27
29
|
readonly table: Identifier["table"];
|
|
@@ -70,12 +72,13 @@ export interface EmailCredentialReadTable<Subject extends TableModel, Identifier
|
|
|
70
72
|
readonly credentialRevision: ColumnKey<Credential>;
|
|
71
73
|
readonly status: ColumnKey<Credential>;
|
|
72
74
|
readonly isActiveStatus: (value: unknown) => boolean;
|
|
75
|
+
readonly activeStatusValue: unknown;
|
|
73
76
|
readonly decode: (input: {
|
|
74
77
|
readonly moduleId: string;
|
|
75
78
|
readonly subject: Subject["select"];
|
|
76
79
|
readonly identifier: Identifier["select"];
|
|
77
80
|
readonly credential: Credential["select"];
|
|
78
|
-
}) => Effect.Effect<import("@yielded/auth/Email").EmailCredentialSnapshot, PersistenceMappingError>;
|
|
81
|
+
}) => Effect.Effect<Omit<import("@yielded/auth/Email").EmailCredentialSnapshot, "requirement">, PersistenceMappingError>;
|
|
79
82
|
}
|
|
80
83
|
export interface EmailCredentialTable<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, NativeSubjectId> extends EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId> {
|
|
81
84
|
readonly encodeVerifiedInsert: (input: {
|
|
@@ -93,7 +96,7 @@ export interface EmailCredentialTable<Subject extends TableModel, Identifier ext
|
|
|
93
96
|
readonly source: LoginIdentifier;
|
|
94
97
|
readonly credentialRevision: SecurityRevision;
|
|
95
98
|
}) => Partial<Credential["insert"]>;
|
|
96
|
-
readonly
|
|
99
|
+
readonly activeStatusValue: unknown;
|
|
97
100
|
}
|
|
98
101
|
export interface EmailAuthorityCredentialTable<Credential extends TableModel, NativeSubjectId> {
|
|
99
102
|
readonly table: Credential["table"];
|
|
@@ -109,53 +112,33 @@ export interface EmailAuthorityCredentialTable<Credential extends TableModel, Na
|
|
|
109
112
|
}) => Credential["insert"];
|
|
110
113
|
readonly encodeActivation: (revision: SecurityRevision) => Partial<Credential["insert"]>;
|
|
111
114
|
readonly encodeRetirement: (revision: SecurityRevision) => Partial<Credential["insert"]>;
|
|
112
|
-
readonly
|
|
113
|
-
}
|
|
114
|
-
export interface EmailCommandTable<Command extends TableModel> {
|
|
115
|
-
readonly table: Command["table"];
|
|
116
|
-
readonly moduleId: ColumnKey<Command>;
|
|
117
|
-
readonly commandId: ColumnKey<Command>;
|
|
118
|
-
readonly action: ColumnKey<Command>;
|
|
119
|
-
readonly bindingDigest: ColumnKey<Command>;
|
|
120
|
-
readonly retentionUntil: ColumnKey<Command>;
|
|
121
|
-
readonly encodeInsert: (input: {
|
|
122
|
-
readonly moduleId: string;
|
|
123
|
-
readonly commandId: string;
|
|
124
|
-
readonly action: EmailAction;
|
|
125
|
-
readonly bindingDigest: TokenDigest;
|
|
126
|
-
readonly retentionUntilMillis: number;
|
|
127
|
-
}) => Command["insert"];
|
|
115
|
+
readonly activeStatusValue: unknown;
|
|
128
116
|
}
|
|
129
117
|
export interface RequiredEmailSignInConstraints {
|
|
118
|
+
readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
|
|
130
119
|
readonly identifier: "unique(identifier.namespace,identifier.value)";
|
|
131
120
|
readonly credentialId: "unique(emailCredential.moduleId,emailCredential.credentialId)";
|
|
132
121
|
readonly credentialIdentifier: "unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)";
|
|
133
122
|
}
|
|
134
123
|
export declare const requiredEmailSignInConstraints: RequiredEmailSignInConstraints;
|
|
135
|
-
export interface EmailSignInMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, NativeSubjectId> {
|
|
124
|
+
export interface EmailSignInMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId> {
|
|
136
125
|
readonly subject: EmailSubjectReadTable<Subject>;
|
|
137
126
|
readonly identifier: EmailIdentifierReadTable<Identifier>;
|
|
138
127
|
readonly credential: EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId>;
|
|
128
|
+
readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
|
|
139
129
|
readonly subjectId: SubjectIdCodec<NativeSubjectId>;
|
|
140
130
|
readonly constraints: RequiredEmailSignInConstraints;
|
|
141
131
|
readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;
|
|
142
132
|
}
|
|
143
133
|
export interface RequiredEmailAddressConstraints extends RequiredEmailSignInConstraints {
|
|
144
134
|
readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
|
|
145
|
-
readonly command: "unique(emailCommand.moduleId,emailCommand.commandId)";
|
|
146
135
|
}
|
|
147
136
|
export declare const requiredEmailAddressConstraints: RequiredEmailAddressConstraints;
|
|
148
|
-
export interface
|
|
149
|
-
readonly engineNow: Expression;
|
|
150
|
-
readonly engineNowMillis: Expression;
|
|
151
|
-
readonly engineInstantPlus: (millis: number) => Expression;
|
|
152
|
-
}
|
|
153
|
-
export interface EmailAddressMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Command extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> extends EmailSignInMapping<Subject, Identifier, Credential, NativeSubjectId> {
|
|
137
|
+
export interface EmailAddressMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> extends EmailSignInMapping<Subject, Identifier, Credential, AuthorityCredential, NativeSubjectId> {
|
|
154
138
|
readonly subject: EmailSubjectTable<Subject>;
|
|
155
139
|
readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression>;
|
|
156
140
|
readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;
|
|
157
141
|
readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
|
|
158
|
-
readonly command: EmailCommandTable<Command>;
|
|
159
142
|
readonly constraints: RequiredEmailAddressConstraints;
|
|
160
143
|
readonly addressCardinality: "single" | "multiple";
|
|
161
144
|
readonly changeDisposition: "retire-source";
|
|
@@ -164,61 +147,22 @@ export interface EmailAddressMapping<Subject extends TableModel, Identifier exte
|
|
|
164
147
|
readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
|
|
165
148
|
readonly allocateRevisionSync?: () => SecurityRevision;
|
|
166
149
|
readonly encodeInstant: (epochMillis: number) => unknown;
|
|
167
|
-
readonly commandRetentionMillis: number;
|
|
168
150
|
readonly sessionInvalidation: "same-authority-immediate" | "original-absolute-expiry";
|
|
169
|
-
readonly isCommandConflict: (cause: unknown) => boolean;
|
|
170
151
|
readonly isIdentifierConflict: (cause: unknown) => boolean;
|
|
171
152
|
readonly isCredentialConflict: (cause: unknown) => boolean;
|
|
172
|
-
readonly
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
readonly d1: EmailD1Clock<Expression>;
|
|
176
|
-
readonly subject: EmailSubjectTable<Subject> & {
|
|
177
|
-
readonly d1ActiveStatusValue: unknown;
|
|
178
|
-
};
|
|
179
|
-
readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression> & {
|
|
180
|
-
readonly d1CurrentCondition: NonNullable<EmailIdentifierTable<Identifier, NativeSubjectId, Expression>["d1CurrentCondition"]>;
|
|
181
|
-
readonly d1MutableTargetCondition: NonNullable<EmailIdentifierTable<Identifier, NativeSubjectId, Expression>["d1MutableTargetCondition"]>;
|
|
182
|
-
};
|
|
183
|
-
readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId> & {
|
|
184
|
-
readonly d1ActiveStatusValue: unknown;
|
|
153
|
+
readonly clock: ProofClock<Expression>;
|
|
154
|
+
readonly d1?: {
|
|
155
|
+
readonly primary: true;
|
|
185
156
|
};
|
|
186
|
-
|
|
187
|
-
readonly d1ActiveStatusValue: unknown;
|
|
188
|
-
};
|
|
189
|
-
};
|
|
190
|
-
export type EmailRegistrationState = "pending" | "registered";
|
|
157
|
+
}
|
|
191
158
|
export interface EmailRegistrationIntent<Registration> {
|
|
192
159
|
readonly moduleId: string;
|
|
193
160
|
readonly commandId: string;
|
|
194
161
|
readonly identifier: LoginIdentifier;
|
|
195
162
|
readonly registration: Registration;
|
|
163
|
+
readonly requestId: string;
|
|
196
164
|
readonly fingerprint: TokenDigest;
|
|
197
|
-
readonly
|
|
198
|
-
readonly moduleId: string;
|
|
199
|
-
readonly purpose: ProofPurpose;
|
|
200
|
-
readonly continuationId: ProofContinuationId;
|
|
201
|
-
readonly binding: ProofBinding;
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
export interface EmailRegistrationTable<Registration, Request extends TableModel, NativeSubjectId> {
|
|
205
|
-
readonly table: Request["table"];
|
|
206
|
-
readonly moduleId: ColumnKey<Request>;
|
|
207
|
-
readonly commandId: ColumnKey<Request>;
|
|
208
|
-
readonly fingerprint: ColumnKey<Request>;
|
|
209
|
-
readonly state: ColumnKey<Request>;
|
|
210
|
-
readonly subjectId: ColumnKey<Request>;
|
|
211
|
-
readonly pendingReference: ColumnKey<Request>;
|
|
212
|
-
readonly retentionUntil: ColumnKey<Request>;
|
|
213
|
-
readonly encodeInsert: (input: EmailRegistrationIntent<Registration>, state: {
|
|
214
|
-
readonly state: EmailRegistrationState;
|
|
215
|
-
readonly nativeSubjectId?: NativeSubjectId;
|
|
216
|
-
readonly pendingReference?: string;
|
|
217
|
-
readonly retentionUntilMillis: number;
|
|
218
|
-
}) => Request["insert"];
|
|
219
|
-
readonly decodeReplay: (row: Request["select"]) => Effect.Effect<Exclude<EmailRegistrationDecision, {
|
|
220
|
-
readonly _tag: "Registered";
|
|
221
|
-
}>, PersistenceMappingError>;
|
|
165
|
+
readonly redemption: ProofRedemptionInput;
|
|
222
166
|
}
|
|
223
167
|
export interface EmailRegistrationProvisioning<Registration, Subject extends TableModel, NativeSubjectId> {
|
|
224
168
|
readonly encodeSubjectInsert: (input: EmailRegistrationIntent<Registration>, values: {
|
|
@@ -241,6 +185,11 @@ export interface EmailRegistrationIdentifierTable<Identifier extends TableModel,
|
|
|
241
185
|
readonly verifiedAt: ColumnKey<Identifier>;
|
|
242
186
|
readonly bindingRevision: ColumnKey<Identifier>;
|
|
243
187
|
readonly isCurrent: (row: Identifier["select"]) => boolean;
|
|
188
|
+
readonly isMutableTarget: (row: Identifier["select"]) => boolean;
|
|
189
|
+
readonly d1MutableTargetCondition?: (input: {
|
|
190
|
+
readonly identifier: LoginIdentifier;
|
|
191
|
+
readonly nativeSubjectId: NativeSubjectId;
|
|
192
|
+
}) => Expression;
|
|
244
193
|
readonly d1CurrentCondition?: (input: {
|
|
245
194
|
readonly identifier: LoginIdentifier;
|
|
246
195
|
readonly nativeSubjectId: NativeSubjectId;
|
|
@@ -263,7 +212,7 @@ export interface EmailRegistrationCredentialTable<Credential extends TableModel,
|
|
|
263
212
|
readonly credentialRevision: ColumnKey<Credential>;
|
|
264
213
|
readonly status: ColumnKey<Credential>;
|
|
265
214
|
readonly isActiveStatus: (value: unknown) => boolean;
|
|
266
|
-
readonly
|
|
215
|
+
readonly activeStatusValue: unknown;
|
|
267
216
|
readonly encodeVerifiedInsert: (input: {
|
|
268
217
|
readonly moduleId: string;
|
|
269
218
|
readonly subjectId: NativeSubjectId;
|
|
@@ -279,7 +228,7 @@ export interface EmailRegistrationAuthorityCredentialTable<Credential extends Ta
|
|
|
279
228
|
readonly revision: ColumnKey<Credential>;
|
|
280
229
|
readonly status: ColumnKey<Credential>;
|
|
281
230
|
readonly isActiveStatus: (value: unknown) => boolean;
|
|
282
|
-
readonly
|
|
231
|
+
readonly activeStatusValue: unknown;
|
|
283
232
|
readonly encodeInsert: (input: {
|
|
284
233
|
readonly subjectId: NativeSubjectId;
|
|
285
234
|
readonly credentialId: string;
|
|
@@ -288,40 +237,32 @@ export interface EmailRegistrationAuthorityCredentialTable<Credential extends Ta
|
|
|
288
237
|
}
|
|
289
238
|
export interface RequiredEmailRegistrationConstraints extends RequiredEmailSignInConstraints {
|
|
290
239
|
readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
|
|
291
|
-
readonly request: "unique(emailRegistration.moduleId,emailRegistration.commandId)";
|
|
292
|
-
readonly pendingReference: "unique(emailRegistration.pendingReference)";
|
|
293
240
|
}
|
|
294
241
|
export declare const requiredEmailRegistrationConstraints: RequiredEmailRegistrationConstraints;
|
|
295
|
-
type EmailRegistrationBase<Registration
|
|
296
|
-
readonly registration: EmailRegistrationTable<Registration, Request, NativeSubjectId>;
|
|
297
|
-
readonly constraints: Pick<RequiredEmailRegistrationConstraints, "request" | "pendingReference">;
|
|
242
|
+
type EmailRegistrationBase<Registration> = {
|
|
298
243
|
readonly inspect: (input: {
|
|
299
244
|
readonly identifier: LoginIdentifier;
|
|
300
245
|
readonly registration: Registration;
|
|
301
246
|
}) => Effect.Effect<{
|
|
302
|
-
readonly fingerprint: TokenDigest;
|
|
303
247
|
readonly eligible: boolean;
|
|
248
|
+
readonly fingerprint: TokenDigest;
|
|
304
249
|
}, PersistenceMappingError>;
|
|
305
|
-
/** Projects one detached value of the factory-specific Registration Type. */
|
|
306
250
|
readonly snapshotRegistration: (registration: Registration) => Effect.Effect<Registration, PersistenceMappingError>;
|
|
307
|
-
/** Required by synchronous transaction-bound services. */
|
|
308
251
|
readonly snapshotRegistrationSync?: (registration: Registration) => Registration;
|
|
309
|
-
/** Required by synchronous Durable Object transaction-bound services. */
|
|
310
252
|
readonly inspectSync?: (input: {
|
|
311
253
|
readonly identifier: LoginIdentifier;
|
|
312
254
|
readonly registration: Registration;
|
|
313
255
|
}) => {
|
|
314
|
-
readonly fingerprint: TokenDigest;
|
|
315
256
|
readonly eligible: boolean;
|
|
257
|
+
readonly fingerprint: TokenDigest;
|
|
316
258
|
};
|
|
317
|
-
readonly allocatePendingReference?: Effect.Effect<string, PersistenceMappingError>;
|
|
318
|
-
readonly allocatePendingReferenceSync?: () => string;
|
|
319
|
-
readonly encodeInstant: (epochMillis: number) => unknown;
|
|
320
|
-
readonly retentionMillis: number;
|
|
321
|
-
readonly isRequestConflict: (cause: unknown) => boolean;
|
|
322
259
|
};
|
|
323
|
-
export type EmailRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel,
|
|
260
|
+
export type EmailRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = EmailRegistrationBase<Registration> & {
|
|
324
261
|
readonly mode: "atomic";
|
|
262
|
+
readonly clock: ProofClock<Expression>;
|
|
263
|
+
readonly d1?: {
|
|
264
|
+
readonly primary: true;
|
|
265
|
+
};
|
|
325
266
|
readonly subject: EmailSubjectReadTable<Subject>;
|
|
326
267
|
readonly identifier: EmailRegistrationIdentifierTable<Identifier, NativeSubjectId, Expression>;
|
|
327
268
|
readonly credential: EmailRegistrationCredentialTable<Credential, NativeSubjectId>;
|
|
@@ -344,14 +285,9 @@ export type EmailRegistrationMapping<Registration, Subject extends TableModel, I
|
|
|
344
285
|
readonly idMode: "generated";
|
|
345
286
|
readonly decodeGeneratedId: (rows: ReadonlyArray<unknown>) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;
|
|
346
287
|
});
|
|
347
|
-
} | {
|
|
348
|
-
readonly mode: "pending";
|
|
349
|
-
});
|
|
350
|
-
export type AnyEmailSignInMapping = EmailSignInMapping<AnyTableModel, AnyTableModel, AnyTableModel, unknown>;
|
|
351
|
-
export type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> = EmailAddressMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
352
|
-
export type AnyEmailRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = EmailRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
353
|
-
export type D1EmailRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Request extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = EmailRegistrationMapping<Registration, Subject, Identifier, Credential, AuthorityCredential, Request, NativeSubjectId, Expression> & {
|
|
354
|
-
readonly d1: EmailD1Clock<Expression>;
|
|
355
288
|
};
|
|
289
|
+
export type AnyEmailSignInMapping = EmailSignInMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown>;
|
|
290
|
+
export type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> = EmailAddressMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
291
|
+
export type AnyEmailRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = EmailRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
356
292
|
//#endregion
|
|
357
293
|
//# sourceMappingURL=email-model.d.mts.map
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
//#region src/internal/models/email-model.ts
|
|
2
2
|
const requiredEmailSignInConstraints = {
|
|
3
|
+
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
|
|
3
4
|
identifier: "unique(identifier.namespace,identifier.value)",
|
|
4
5
|
credentialId: "unique(emailCredential.moduleId,emailCredential.credentialId)",
|
|
5
6
|
credentialIdentifier: "unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)"
|
|
6
7
|
};
|
|
7
8
|
const requiredEmailAddressConstraints = {
|
|
8
9
|
...requiredEmailSignInConstraints,
|
|
9
|
-
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
|
|
10
|
-
command: "unique(emailCommand.moduleId,emailCommand.commandId)"
|
|
10
|
+
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
|
|
11
11
|
};
|
|
12
12
|
const requiredEmailRegistrationConstraints = {
|
|
13
13
|
...requiredEmailSignInConstraints,
|
|
14
|
-
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
|
|
15
|
-
request: "unique(emailRegistration.moduleId,emailRegistration.commandId)",
|
|
16
|
-
pendingReference: "unique(emailRegistration.pendingReference)"
|
|
14
|
+
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
|
|
17
15
|
};
|
|
18
16
|
//#endregion
|
|
19
17
|
export { requiredEmailAddressConstraints, requiredEmailRegistrationConstraints, requiredEmailSignInConstraints };
|