@yielded/auth-persistence 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 +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 +16 -82
- 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 +28 -148
- 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 -346
- 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 -1555
- package/src/internal/oauth/accounts.ts +0 -838
- 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 -678
- 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 -1522
- 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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-kernel.mjs","names":[],"sources":["../../src/internal/email-kernel.ts"],"sourcesContent":["import {\n EmailAddressPersistence,\n type EmailAddressMutation,\n type EmailAction,\n type EmailCredentialSnapshot,\n EmailSignInTargets,\n EmailUnavailable,\n snapshotEmailCredential,\n snapshotEmailRequirement,\n snapshotEmailRevision,\n} from \"@yielded/auth/Email\";\nimport {\n coordinateCommit,\n CurrentCommitJournal,\n hasCommitScope,\n type CommitJournal,\n type PreparedCommit,\n LifecycleHooks,\n HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport {\n ProofUnavailable,\n type ProofCompletionDecision,\n type ProofCompletionInput,\n} from \"@yielded/auth/Proofs\";\nimport {\n assessAuthentication,\n snapshotAuthenticationEvidence,\n type AuthenticationRevision,\n type SecurityRevision,\n} from \"@yielded/auth/Sessions\";\nimport { Cause, Context, DateTime, Effect, Option, Schema } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport { isMappedConstraintConflict, PersistenceMappingError } from \"./mapping-error\";\nimport {\n type AnyEmailAddressMapping,\n type AnyEmailSignInMapping,\n requiredEmailAddressConstraints,\n requiredEmailSignInConstraints,\n} from \"./models/email-model\";\nimport {\n CurrentProofSql,\n type makeProofKernel,\n type ProofSqlConfiguration,\n type ProofSqlDatabase,\n} from \"./proof-kernel\";\n/* oxlint-disable no-explicit-any -- the shared dialect kernel erases consumer Drizzle table types internally. */\nimport type { QueryFailure } from \"./query-operations\";\nimport type { QueryOperations, SqlFragment, SqlColumn } from \"./query-operations\";\nimport type { NativeDatabase } from \"./transaction-kernel\";\n\ntype AdapterFailure = QueryFailure | PersistenceMappingError | SqlError.SqlError;\ntype SignInMapping = AnyEmailSignInMapping;\n\nexport interface EmailSqlQuery<A = ReadonlyArray<any>> extends Effect.Effect<A, AdapterFailure> {\n readonly getSQL: () => ReturnType<QueryOperations[\"sql\"]>;\n readonly from: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly where: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly limit: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly orderBy: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly for: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly set: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly values: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly returning: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly innerJoin: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly onConflictDoNothing: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly onDuplicateKeyUpdate: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n readonly $returningId: (...args: ReadonlyArray<any>) => EmailSqlQuery<A>;\n}\n\nexport interface EmailSqlDatabase {\n readonly select: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly insert: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly update: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly delete: (...args: ReadonlyArray<any>) => EmailSqlQuery;\n readonly transaction: <A, E, R>(\n body: (transaction: EmailSqlDatabase) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport class CurrentEmailSql extends Context.Service<CurrentEmailSql, EmailSqlDatabase>()(\n \"effect-auth/CurrentEmailSql\",\n) {}\n\nexport interface EmailSqlConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, EmailUnavailable>;\n readonly coordinated?: boolean;\n readonly proof?: {\n readonly mapping: any;\n readonly configuration: ProofSqlConfiguration;\n };\n}\n\nexport interface CurrentAddress {\n readonly nativeSubjectId: unknown;\n readonly subject: any;\n readonly revision: AuthenticationRevision;\n readonly source?: {\n readonly credential: any;\n readonly identifier: any;\n readonly snapshot: EmailCredentialSnapshot;\n };\n readonly targetIdentifier?: any;\n readonly targetCredential?: any;\n readonly targetIdentifierRevision?: SecurityRevision;\n readonly eligible: boolean;\n}\n\nexport const makeEmailKernel = <\n Fragment extends SqlFragment = SqlFragment,\n Column extends SqlColumn = SqlColumn,\n>(\n operations: QueryOperations<Fragment, Column>,\n proofs: Pick<ReturnType<typeof makeProofKernel>, \"completeProofPlanIn\">,\n) => {\n type AddressMapping = AnyEmailAddressMapping<Fragment>;\n\n const { and, eq, inArray, lte, column, updateValues } = operations;\n const { completeProofPlanIn } = proofs;\n const unavailable = () => EmailUnavailable.make({});\n\n const translateFailure = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<A, EmailUnavailable, R> =>\n reportPersistenceFailure(\n effect,\n (error) =>\n Schema.is(EmailUnavailable)(error) ||\n Schema.is(ProofUnavailable)(error) ||\n Schema.is(HookConfigurationError)(error),\n ).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));\n\n const nowMillis = Effect.map(DateTime.now, DateTime.toEpochMillis);\n\n const selectRows = (query: EmailSqlQuery, locking: boolean) =>\n locking && typeof query.for === \"function\" ? query.for(\"update\") : query;\n\n const sameIdentifier = (left: LoginIdentifier, right: LoginIdentifier) =>\n left.namespace === right.namespace && left.value === right.value;\n\n const validEmailSignInConstraints = (mapping: SignInMapping) =>\n Object.entries(requiredEmailSignInConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredEmailSignInConstraints] === value,\n );\n\n const validAddressConstraints = (mapping: AddressMapping) =>\n Object.entries(requiredEmailAddressConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredEmailAddressConstraints] === value,\n );\n\n const subjectColumns = (mapping: SignInMapping) => ({\n id: column(mapping.subject.table, mapping.subject.id),\n status: column(mapping.subject.table, mapping.subject.status),\n securityRevision: column(mapping.subject.table, mapping.subject.securityRevision),\n });\n\n const identifierColumns = (mapping: SignInMapping) => ({\n namespace: column(mapping.identifier.table, mapping.identifier.namespace),\n value: column(mapping.identifier.table, mapping.identifier.value),\n subjectId: column(mapping.identifier.table, mapping.identifier.subjectId),\n verifiedAt: column(mapping.identifier.table, mapping.identifier.verifiedAt),\n bindingRevision: column(mapping.identifier.table, mapping.identifier.bindingRevision),\n });\n\n const credentialColumns = (mapping: SignInMapping) => ({\n moduleId: column(mapping.credential.table, mapping.credential.moduleId),\n subjectId: column(mapping.credential.table, mapping.credential.subjectId),\n credentialId: column(mapping.credential.table, mapping.credential.credentialId),\n identifierNamespace: column(mapping.credential.table, mapping.credential.identifierNamespace),\n identifierValue: column(mapping.credential.table, mapping.credential.identifierValue),\n credentialRevision: column(mapping.credential.table, mapping.credential.credentialRevision),\n status: column(mapping.credential.table, mapping.credential.status),\n });\n\n const authorityColumns = (mapping: AddressMapping) => ({\n subjectId: column(mapping.authorityCredential.table, mapping.authorityCredential.subjectId),\n credentialId: column(\n mapping.authorityCredential.table,\n mapping.authorityCredential.credentialId,\n ),\n revision: column(mapping.authorityCredential.table, mapping.authorityCredential.revision),\n status: column(mapping.authorityCredential.table, mapping.authorityCredential.status),\n });\n\n const commandColumns = (mapping: AddressMapping) => ({\n moduleId: column(mapping.command.table, mapping.command.moduleId),\n commandId: column(mapping.command.table, mapping.command.commandId),\n action: column(mapping.command.table, mapping.command.action),\n bindingDigest: column(mapping.command.table, mapping.command.bindingDigest),\n retentionUntil: column(mapping.command.table, mapping.command.retentionUntil),\n });\n\n const allocate = <A>(\n mode: EmailSqlConfiguration[\"mode\"],\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) => new PersistenceMappingError({ 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) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n };\n\n const nextSecurityRevision = (\n mapping: AddressMapping,\n mode: EmailSqlConfiguration[\"mode\"],\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) => new PersistenceMappingError({ 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) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n\n return Effect.fail(unavailable());\n };\n\n const safeRead = <A, E, R>(\n database: EmailSqlDatabase,\n configuration: EmailSqlConfiguration,\n body: Effect.Effect<A, E, R>,\n ) =>\n Effect.gen(function* () {\n if (configuration.coordinated !== true) {\n if (yield* hasCommitScope) return yield* unavailable();\n yield* configuration.standaloneGuard;\n }\n\n return yield* database.transaction((transaction) =>\n body.pipe(\n Effect.provideService(CurrentEmailSql, transaction),\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n );\n });\n\n const owned = <A, E, R>(\n database: EmailSqlDatabase,\n configuration: EmailSqlConfiguration,\n body: Effect.Effect<A, E, R>,\n ) => {\n const run = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n body.pipe(\n Effect.provideService(CurrentEmailSql, 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 return 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\n const emailLookupQuery = (\n mapping: SignInMapping,\n moduleId: string,\n identifier: LoginIdentifier,\n ) => {\n const subject = subjectColumns(mapping),\n binding = identifierColumns(mapping),\n credential = credentialColumns(mapping);\n\n return {\n fields: {\n subject: mapping.subject.table,\n identifier: mapping.identifier.table,\n credential: mapping.credential.table,\n },\n from: mapping.identifier.table,\n subjectTable: mapping.subject.table,\n subjectJoin: eq(subject.id, binding.subjectId),\n credentialTable: mapping.credential.table,\n credentialJoin: and(\n eq(credential.moduleId, moduleId),\n eq(credential.subjectId, binding.subjectId),\n eq(credential.identifierNamespace, binding.namespace),\n eq(credential.identifierValue, binding.value),\n ),\n predicate: and(\n eq(binding.namespace, identifier.namespace),\n eq(binding.value, identifier.value),\n ),\n limit: 1,\n };\n };\n\n const emailLookupRows = Effect.fn(\"Drizzle.emailLookupRows\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n identifier: LoginIdentifier,\n ) {\n const database = yield* CurrentEmailSql;\n const query = emailLookupQuery(mapping, moduleId, identifier);\n\n return yield* database\n .select(query.fields)\n .from(query.from)\n .innerJoin(query.subjectTable, query.subjectJoin)\n .innerJoin(query.credentialTable, query.credentialJoin)\n .where(query.predicate)\n .limit(query.limit);\n });\n\n const decodeEmailSnapshot = Effect.fn(\"DrizzleEmail.decodeSnapshot\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n requested: LoginIdentifier,\n row: any,\n ) {\n if (\n !mapping.subject.isActiveStatus(row.subject[mapping.subject.status]) ||\n !mapping.identifier.isCurrent(row.identifier) ||\n !mapping.credential.isActiveStatus(row.credential[mapping.credential.status])\n )\n return undefined;\n\n const snapshot = yield* mapping.credential\n .decode({\n moduleId,\n subject: row.subject,\n identifier: row.identifier,\n credential: row.credential,\n })\n .pipe(Effect.flatMap(snapshotEmailCredential));\n\n const subjectId = yield* mapping.subjectId.toSubject(row.subject[mapping.subject.id]);\n\n const verifiedAtMillis = yield* mapping.decodeInstant(\n row.identifier[mapping.identifier.verifiedAt],\n );\n\n if (\n snapshot.moduleId !== moduleId ||\n !sameIdentifier(snapshot.identifier, requested) ||\n snapshot.revision.subjectId !== subjectId ||\n snapshot.revision.securityRevision !== row.subject[mapping.subject.securityRevision] ||\n snapshot.identifierRevision !== row.identifier[mapping.identifier.bindingRevision] ||\n snapshot.verifiedAtMillis !== verifiedAtMillis ||\n snapshot.credentialId !== row.credential[mapping.credential.credentialId] ||\n snapshot.credentialRevision !== row.credential[mapping.credential.credentialRevision]\n )\n return undefined;\n\n return snapshot;\n });\n\n const makeSqlEmailSignInTargets = Effect.fn(\"makeSqlEmailSignInTargets\")(function* (\n mapping: SignInMapping,\n configuration: EmailSqlConfiguration,\n ): Effect.fn.Return<\n EmailSignInTargets[\"Service\"],\n EmailUnavailable,\n CurrentEmailSql | NativeDatabase\n > {\n const database = yield* CurrentEmailSql;\n\n if (!configuration.coordinated)\n yield* (\n operations.validateStorage?.({\n ...mapping,\n proof: configuration.proof?.mapping,\n }) ?? Effect.void\n ).pipe(Effect.mapError(unavailable));\n\n return EmailSignInTargets.of({\n lookup: (input) =>\n (validEmailSignInConstraints(mapping)\n ? safeRead(\n database,\n configuration,\n Effect.gen(function* () {\n const row = (yield* emailLookupRows(mapping, input.moduleId, input.identifier))[0];\n\n if (row === undefined) return Option.none();\n\n const snapshot = yield* decodeEmailSnapshot(\n mapping,\n input.moduleId,\n input.identifier,\n row,\n );\n\n return snapshot === undefined ? Option.none() : Option.some(snapshot);\n }),\n )\n : Effect.fail(unavailable())\n ).pipe(Effect.provideService(CurrentEmailSql, database), translateFailure),\n });\n });\n\n const readSubject = Effect.fn(\"DrizzleEmail.readSubject\")(function* (\n mapping: AddressMapping,\n subjectId: string,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const nativeSubjectId = yield* mapping.subjectId.toNative(subjectId as any);\n const s = subjectColumns(mapping);\n\n const subject = (yield* selectRows(\n database.select().from(mapping.subject.table).where(eq(s.id, nativeSubjectId)).limit(1),\n locking,\n ))[0];\n\n return { nativeSubjectId, subject };\n });\n\n const identifierRow = Effect.fn(\"Drizzle.identifierRow\")(function* (\n mapping: SignInMapping,\n identifier: LoginIdentifier,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const i = identifierColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.identifier.table)\n .where(and(eq(i.namespace, identifier.namespace), eq(i.value, identifier.value)))\n .limit(1),\n locking,\n );\n });\n\n const credentialById = Effect.fn(\"Drizzle.credentialById\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n credentialId: string,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const c = credentialColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(and(eq(c.moduleId, moduleId), eq(c.credentialId, credentialId)))\n .limit(1),\n locking,\n );\n });\n\n const credentialByIdentifier = Effect.fn(\"Drizzle.credentialByIdentifier\")(function* (\n mapping: SignInMapping,\n moduleId: string,\n identifier: LoginIdentifier,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const c = credentialColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(\n and(\n eq(c.moduleId, moduleId),\n eq(c.identifierNamespace, identifier.namespace),\n eq(c.identifierValue, identifier.value),\n ),\n )\n .limit(1),\n locking,\n );\n });\n\n const currentAddress = Effect.fn(\"DrizzleEmail.currentAddress\")(function* (\n mapping: AddressMapping,\n input: {\n readonly moduleId: string;\n readonly subjectId: string;\n readonly target: LoginIdentifier;\n readonly sourceCredentialId?: string;\n },\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const locked = yield* readSubject(mapping, input.subjectId, locking);\n\n if (\n locked.subject === undefined ||\n !mapping.subject.isActiveStatus(locked.subject[mapping.subject.status])\n )\n return undefined;\n\n const discoveredSource =\n input.sourceCredentialId === undefined\n ? undefined\n : (yield* credentialById(mapping, input.moduleId, input.sourceCredentialId, false))[0];\n\n const sourceIdentifier: LoginIdentifier | undefined =\n discoveredSource === undefined\n ? undefined\n : {\n namespace: discoveredSource[mapping.credential.identifierNamespace],\n value: discoveredSource[mapping.credential.identifierValue],\n };\n\n const identifiers = [\n input.target,\n ...(sourceIdentifier === undefined ? [] : [sourceIdentifier]),\n ]\n .filter(\n (value, index, values) =>\n values.findIndex((candidate) => sameIdentifier(candidate, value)) === index,\n )\n .sort((left, right) =>\n `${left.namespace}\\u0000${left.value}`.localeCompare(\n `${right.namespace}\\u0000${right.value}`,\n ),\n );\n\n const lockedIdentifiers = new Map<string, any>();\n\n for (const identifier of identifiers) {\n const row = (yield* identifierRow(mapping, identifier, locking))[0];\n\n if (row !== undefined)\n lockedIdentifiers.set(`${identifier.namespace}\\u0000${identifier.value}`, row);\n }\n\n const sourceCredential =\n input.sourceCredentialId === undefined\n ? undefined\n : (yield* credentialById(mapping, input.moduleId, input.sourceCredentialId, locking))[0];\n\n const targetCredential = (yield* credentialByIdentifier(\n mapping,\n input.moduleId,\n input.target,\n locking,\n ))[0];\n\n const a = authorityColumns(mapping);\n\n const authority = yield* selectRows(\n database\n .select()\n .from(mapping.authorityCredential.table)\n .where(eq(a.subjectId, locked.nativeSubjectId))\n .orderBy(a.credentialId),\n locking,\n );\n\n const activeAuthority = authority.filter((row: any) =>\n mapping.authorityCredential.isActiveStatus(row[mapping.authorityCredential.status]),\n );\n\n const subjectId = yield* mapping.subjectId.toSubject(locked.nativeSubjectId);\n\n const revision: AuthenticationRevision = Object.freeze({\n subjectId,\n securityRevision: locked.subject[mapping.subject.securityRevision],\n credentials: Object.freeze(\n activeAuthority.map((row: any) =>\n Object.freeze({\n credentialId: row[mapping.authorityCredential.credentialId],\n revision: row[mapping.authorityCredential.revision],\n }),\n ),\n ),\n });\n\n const targetIdentifier = lockedIdentifiers.get(\n `${input.target.namespace}\\u0000${input.target.value}`,\n );\n\n const targetOwned =\n targetIdentifier !== undefined &&\n mapping.subjectId.equals(\n targetIdentifier[mapping.identifier.subjectId],\n locked.nativeSubjectId,\n );\n\n const targetMutable =\n targetOwned &&\n mapping.identifier.isMutableTarget(targetIdentifier) &&\n (targetCredential === undefined ||\n (!mapping.credential.isActiveStatus(targetCredential[mapping.credential.status]) &&\n mapping.subjectId.equals(\n targetCredential[mapping.credential.subjectId],\n locked.nativeSubjectId,\n )));\n\n let source: CurrentAddress[\"source\"];\n\n if (input.sourceCredentialId !== undefined) {\n if (\n sourceCredential === undefined ||\n sourceIdentifier === undefined ||\n !mapping.subjectId.equals(\n sourceCredential[mapping.credential.subjectId],\n locked.nativeSubjectId,\n ) ||\n !mapping.credential.isActiveStatus(sourceCredential[mapping.credential.status])\n )\n return undefined;\n\n const sourceIdentifierRow = lockedIdentifiers.get(\n `${sourceIdentifier.namespace}\\u0000${sourceIdentifier.value}`,\n );\n\n if (\n sourceIdentifierRow === undefined ||\n !mapping.identifier.isCurrent(sourceIdentifierRow) ||\n !mapping.subjectId.equals(\n sourceIdentifierRow[mapping.identifier.subjectId],\n locked.nativeSubjectId,\n )\n )\n return undefined;\n\n const snapshot = yield* mapping.credential\n .decode({\n moduleId: input.moduleId,\n subject: locked.subject,\n identifier: sourceIdentifierRow,\n credential: sourceCredential,\n })\n .pipe(Effect.flatMap(snapshotEmailCredential));\n\n source = { credential: sourceCredential, identifier: sourceIdentifierRow, snapshot };\n }\n let eligible = targetIdentifier === undefined ? targetCredential === undefined : targetMutable;\n\n if (input.sourceCredentialId !== undefined && source === undefined) eligible = false;\n if (source !== undefined && sameIdentifier(source.snapshot.identifier, input.target))\n eligible = false;\n if (mapping.addressCardinality === \"single\" && input.sourceCredentialId === undefined) {\n const c = credentialColumns(mapping);\n\n const rows = yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(and(eq(c.moduleId, input.moduleId), eq(c.subjectId, locked.nativeSubjectId))),\n locking,\n );\n\n if (\n rows.some((row: any) => mapping.credential.isActiveStatus(row[mapping.credential.status]))\n )\n eligible = false;\n }\n\n return {\n nativeSubjectId: locked.nativeSubjectId,\n subject: locked.subject,\n revision,\n ...(source === undefined ? {} : { source }),\n ...(targetIdentifier === undefined ? {} : { targetIdentifier }),\n ...(targetCredential === undefined ? {} : { targetCredential }),\n ...(targetMutable\n ? { targetIdentifierRevision: targetIdentifier[mapping.identifier.bindingRevision] }\n : {}),\n eligible,\n };\n });\n\n 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\n const actionModule = (moduleId: string, action: EmailAction) =>\n `${moduleId}/${action === \"verify-address\" ? \"verify-address\" : \"change-address\"}`;\n\n const actionPurpose = (action: EmailAction) =>\n action === \"verify-address\" ? \"email-address-verification\" : \"email-address-change\";\n\n const completionMatches = (input: EmailAddressMutation, action: EmailAction) => {\n const completion = input.completion.input;\n const binding = completion.binding;\n\n return (\n completion.moduleId === actionModule(input.moduleId, action) &&\n completion.purpose === actionPurpose(action) &&\n binding._tag === \"IdentifierChange\" &&\n sameIdentifier(binding.identifier, input.target) &&\n sameEmailRevision(binding.revision, input.captured.revision)\n );\n };\n\n const snapshotEmailMutation = Effect.fn(\"DrizzleEmail.snapshotMutation\")(function* (\n input: EmailAddressMutation,\n ) {\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 const validateEmailAuthority = Effect.fn(\"DrizzleEmail.validateAuthority\")(function* (\n mapping: AddressMapping,\n configuration: EmailSqlConfiguration,\n input: EmailAddressMutation,\n action: EmailAction,\n ) {\n const confirmsExisting =\n action === \"verify-address\" && input.captured.targetIdentifierRevision !== undefined;\n\n if (\n !input.captured.eligible ||\n !completionMatches(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 mapping.sessionInvalidation !== \"same-authority-immediate\")\n )\n return undefined;\n\n const current = yield* currentAddress(\n mapping,\n {\n moduleId: input.moduleId,\n subjectId: input.captured.revision.subjectId,\n target: input.target,\n ...(input.captured.source === undefined\n ? {}\n : { sourceCredentialId: input.captured.source.credentialId }),\n },\n configuration.locking,\n );\n\n if (\n current === undefined ||\n !current.eligible ||\n !sameEmailRevision(current.revision, input.captured.revision) ||\n current.targetIdentifierRevision !== input.captured.targetIdentifierRevision ||\n (input.captured.source !== undefined &&\n (current.source === undefined ||\n current.source.snapshot.identifierRevision !== input.captured.source.identifierRevision ||\n current.source.snapshot.credentialRevision !== input.captured.source.credentialRevision ||\n !sameIdentifier(current.source.snapshot.identifier, input.captured.source.identifier)))\n )\n return undefined;\n\n const currentRequirement = yield* mapping.subject.decodeActionRequirement(\n current.subject,\n action,\n );\n\n const original = yield* assessAuthentication(\n input.authorization.evidence,\n input.authorization.requirement,\n ).pipe(Effect.mapError(unavailable));\n\n const configured = yield* assessAuthentication(\n input.authorization.evidence,\n currentRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n return original.satisfied && configured.satisfied ? current : undefined;\n });\n\n const commandExists = Effect.fn(\"Drizzle.commandExists\")(function* (\n mapping: AddressMapping,\n moduleId: string,\n commandId: string,\n locking: boolean,\n ) {\n const database = yield* CurrentEmailSql;\n\n const c = commandColumns(mapping);\n\n return yield* selectRows(\n database\n .select()\n .from(mapping.command.table)\n .where(and(eq(c.moduleId, moduleId), eq(c.commandId, commandId)))\n .limit(1),\n locking,\n );\n });\n\n const applyMutation = Effect.fn(\"DrizzleEmail.applyMutation\")(function* (\n mapping: AddressMapping,\n input: EmailAddressMutation,\n action: EmailAction,\n current: CurrentAddress,\n allocated: {\n readonly targetCredentialId: string;\n readonly targetIdentifierRevision: SecurityRevision;\n readonly targetCredentialRevision: SecurityRevision;\n readonly sourceIdentifierRevision: SecurityRevision;\n readonly sourceCredentialRevision: SecurityRevision;\n readonly nextSecurityRevision: SecurityRevision;\n },\n now: number,\n ) {\n const database = yield* CurrentEmailSql;\n\n const i = identifierColumns(mapping);\n const c = credentialColumns(mapping);\n const a = authorityColumns(mapping);\n const s = subjectColumns(mapping);\n\n const targetCredentialId =\n current.targetCredential?.[mapping.credential.credentialId] ?? allocated.targetCredentialId;\n\n if (action === \"change-address\") {\n const source = current.source!;\n\n yield* database\n .update(mapping.identifier.table)\n .set(\n mapping.identifier.encodeRetirement({\n source: source.snapshot.identifier,\n bindingRevision: allocated.sourceIdentifierRevision,\n }),\n )\n .where(\n and(\n eq(i.namespace, source.snapshot.identifier.namespace),\n eq(i.value, source.snapshot.identifier.value),\n eq(i.subjectId, current.nativeSubjectId),\n eq(i.bindingRevision, source.snapshot.identifierRevision),\n ),\n );\n yield* database\n .update(mapping.credential.table)\n .set(\n mapping.credential.encodeRetirement({\n source: source.snapshot.identifier,\n credentialRevision: allocated.sourceCredentialRevision,\n }),\n )\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n eq(c.credentialId, source.snapshot.credentialId),\n eq(c.subjectId, current.nativeSubjectId),\n eq(c.credentialRevision, source.snapshot.credentialRevision),\n ),\n );\n yield* database\n .update(mapping.authorityCredential.table)\n .set(mapping.authorityCredential.encodeRetirement(allocated.sourceCredentialRevision))\n .where(\n and(\n eq(a.subjectId, current.nativeSubjectId),\n eq(a.credentialId, source.snapshot.credentialId),\n eq(a.revision, source.snapshot.credentialRevision),\n ),\n );\n }\n if (current.targetIdentifier === undefined) {\n yield* database.insert(mapping.identifier.table).values(\n mapping.identifier.encodeVerifiedInsert({\n identifier: input.target,\n subjectId: current.nativeSubjectId,\n verifiedAtMillis: now,\n bindingRevision: allocated.targetIdentifierRevision,\n }),\n );\n } else {\n yield* database\n .update(mapping.identifier.table)\n .set(\n mapping.identifier.encodeVerification({\n verifiedAtMillis: now,\n bindingRevision: allocated.targetIdentifierRevision,\n }),\n )\n .where(\n and(\n eq(i.namespace, input.target.namespace),\n eq(i.value, input.target.value),\n eq(i.subjectId, current.nativeSubjectId),\n eq(i.bindingRevision, current.targetIdentifier![mapping.identifier.bindingRevision]),\n ),\n );\n }\n if (current.targetCredential === undefined) {\n yield* database.insert(mapping.credential.table).values(\n mapping.credential.encodeVerifiedInsert({\n moduleId: input.moduleId,\n subjectId: current.nativeSubjectId,\n credentialId: targetCredentialId,\n identifier: input.target,\n credentialRevision: allocated.targetCredentialRevision,\n }),\n );\n yield* database.insert(mapping.authorityCredential.table).values(\n mapping.authorityCredential.encodeInsert({\n subjectId: current.nativeSubjectId,\n credentialId: targetCredentialId,\n revision: allocated.targetCredentialRevision,\n }),\n );\n } else {\n const oldRevision = current.targetCredential[mapping.credential.credentialRevision];\n\n yield* database\n .update(mapping.credential.table)\n .set(\n mapping.credential.encodeActivation({\n identifier: input.target,\n credentialRevision: allocated.targetCredentialRevision,\n }),\n )\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n eq(c.credentialId, targetCredentialId),\n eq(c.subjectId, current.nativeSubjectId),\n eq(c.credentialRevision, oldRevision),\n ),\n );\n yield* database\n .update(mapping.authorityCredential.table)\n .set(mapping.authorityCredential.encodeActivation(allocated.targetCredentialRevision))\n .where(\n and(\n eq(a.subjectId, current.nativeSubjectId),\n eq(a.credentialId, targetCredentialId),\n eq(a.revision, oldRevision),\n ),\n );\n }\n yield* database\n .update(mapping.subject.table)\n .set(updateValues([[mapping.subject.securityRevision, allocated.nextSecurityRevision]]))\n .where(\n and(\n eq(s.id, current.nativeSubjectId),\n eq(s.securityRevision, input.captured.revision.securityRevision),\n ),\n );\n yield* database.insert(mapping.command.table).values(\n mapping.command.encodeInsert({\n moduleId: input.moduleId,\n commandId: input.commandId,\n action,\n bindingDigest: input.authorization.challenge.bindingDigest,\n retentionUntilMillis: now + mapping.commandRetentionMillis,\n }),\n );\n\n const sourceStillActive =\n action === \"verify-address\"\n ? []\n : yield* selectRows(\n database\n .select()\n .from(mapping.credential.table)\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n eq(c.credentialId, current.source!.snapshot.credentialId),\n eq(c.subjectId, current.nativeSubjectId),\n ),\n ),\n false,\n );\n\n const target = (yield* emailLookupRows(mapping, input.moduleId, input.target))[0];\n\n const targetAuthority = yield* selectRows(\n database\n .select()\n .from(mapping.authorityCredential.table)\n .where(\n and(eq(a.subjectId, current.nativeSubjectId), eq(a.credentialId, targetCredentialId)),\n )\n .limit(1),\n false,\n );\n\n const command = yield* selectRows(\n database\n .select()\n .from(mapping.command.table)\n .where(\n and(\n eq(commandColumns(mapping).moduleId, input.moduleId),\n eq(commandColumns(mapping).commandId, input.commandId),\n eq(commandColumns(mapping).action, action),\n eq(commandColumns(mapping).bindingDigest, input.authorization.challenge.bindingDigest),\n eq(\n commandColumns(mapping).retentionUntil,\n mapping.encodeInstant(now + mapping.commandRetentionMillis),\n ),\n ),\n )\n .limit(1),\n false,\n );\n\n const targetVerifiedAt =\n target === undefined\n ? undefined\n : yield* mapping.decodeInstant(target.identifier[mapping.identifier.verifiedAt]);\n\n const sourceIdentifier =\n action === \"verify-address\"\n ? []\n : yield* identifierRow(mapping, current.source!.snapshot.identifier, false);\n\n const sourceAuthority =\n action === \"verify-address\"\n ? []\n : yield* selectRows(\n database\n .select()\n .from(mapping.authorityCredential.table)\n .where(\n and(\n eq(a.subjectId, current.nativeSubjectId),\n eq(a.credentialId, current.source!.snapshot.credentialId),\n ),\n )\n .limit(1),\n false,\n );\n\n return (\n target !== undefined &&\n mapping.subjectId.equals(target.subject[mapping.subject.id], current.nativeSubjectId) &&\n mapping.subject.isActiveStatus(target.subject[mapping.subject.status]) &&\n target.subject[mapping.subject.securityRevision] === allocated.nextSecurityRevision &&\n target.identifier[mapping.identifier.bindingRevision] ===\n allocated.targetIdentifierRevision &&\n targetVerifiedAt === now &&\n target.credential[mapping.credential.credentialRevision] ===\n allocated.targetCredentialRevision &&\n target.credential[mapping.credential.credentialId] === targetCredentialId &&\n mapping.subjectId.equals(\n target.credential[mapping.credential.subjectId],\n current.nativeSubjectId,\n ) &&\n mapping.identifier.isCurrent(target.identifier) &&\n mapping.credential.isActiveStatus(target.credential[mapping.credential.status]) &&\n targetAuthority.length === 1 &&\n targetAuthority[0]![mapping.authorityCredential.revision] ===\n allocated.targetCredentialRevision &&\n mapping.authorityCredential.isActiveStatus(\n targetAuthority[0]![mapping.authorityCredential.status],\n ) &&\n command.length === 1 &&\n (action === \"verify-address\" ||\n (sourceStillActive.length === 1 &&\n sourceStillActive[0]![mapping.credential.credentialRevision] ===\n allocated.sourceCredentialRevision &&\n !mapping.credential.isActiveStatus(sourceStillActive[0]![mapping.credential.status]) &&\n sourceIdentifier.length === 1 &&\n mapping.subjectId.equals(\n sourceIdentifier[0]![mapping.identifier.subjectId],\n current.nativeSubjectId,\n ) &&\n sourceIdentifier[0]![mapping.identifier.bindingRevision] ===\n allocated.sourceIdentifierRevision &&\n !mapping.identifier.isCurrent(sourceIdentifier[0]!) &&\n sourceAuthority.length === 1 &&\n sourceAuthority[0]![mapping.authorityCredential.revision] ===\n allocated.sourceCredentialRevision &&\n !mapping.authorityCredential.isActiveStatus(\n sourceAuthority[0]![mapping.authorityCredential.status],\n )))\n );\n });\n\n const probeProofCompletion = Effect.fn(\"Drizzle.probeProofCompletion\")(function* (\n configuration: EmailSqlConfiguration,\n input: ProofCompletionInput,\n ) {\n const database = yield* CurrentEmailSql;\n\n if (configuration.proof === undefined) return yield* Effect.fail(unavailable());\n const validProbe = { _tag: \"EmailProofCompletionValid\" } as const;\n\n const plan = {\n input,\n prepare: <A>(\n decision: ProofCompletionDecision,\n journal: CommitJournal,\n project: (decision: ProofCompletionDecision) => A,\n ) => journal.prepare(project(decision)),\n };\n\n const probe = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n completeProofPlanIn(\n configuration.proof!.mapping,\n configuration.proof!.configuration,\n plan,\n Effect.fail(validProbe),\n () => false,\n ).pipe(\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n );\n\n return yield* probe.pipe(\n Effect.as(false),\n Effect.catchCause((cause) => {\n const reason = cause.reasons[0];\n\n return cause.reasons.length === 1 &&\n reason !== undefined &&\n Cause.isFailReason(reason) &&\n reason.error === validProbe\n ? Effect.succeed(true)\n : Effect.failCause(cause);\n }),\n );\n });\n\n const prepareRejected = Effect.fn(\"Drizzle.prepareRejected\")(function* <A>(\n configuration: EmailSqlConfiguration,\n prepare: (value: \"rejected\", journal: CommitJournal) => PreparedCommit<A>,\n ) {\n const database = yield* CurrentEmailSql;\n\n return yield* owned(\n database,\n configuration,\n Effect.gen(function* () {\n const journal = yield* CurrentCommitJournal;\n\n return yield* Effect.succeed(prepare(\"rejected\", journal));\n }),\n );\n });\n\n const makeSqlEmailAddressPersistence = Effect.fn(\"makeSqlEmailAddressPersistence\")(function* (\n mapping: AddressMapping,\n configuration: EmailSqlConfiguration,\n ): Effect.fn.Return<\n EmailAddressPersistence[\"Service\"],\n EmailUnavailable,\n LifecycleHooks | CurrentEmailSql | NativeDatabase\n > {\n const database = yield* CurrentEmailSql;\n\n if (!configuration.coordinated)\n yield* (\n operations.validateStorage?.({\n ...mapping,\n proof: configuration.proof?.mapping,\n }) ?? Effect.void\n ).pipe(Effect.mapError(unavailable));\n const hooks = yield* LifecycleHooks;\n\n return EmailAddressPersistence.of({\n target: (input) =>\n (validAddressConstraints(mapping)\n ? safeRead(\n database,\n configuration,\n Effect.gen(function* () {\n const current = yield* currentAddress(mapping, input, configuration.locking);\n\n if (current === undefined) return yield* unavailable();\n\n return Object.freeze({\n revision: snapshotEmailRevision(current.revision),\n eligible: current.eligible,\n ...(current.targetIdentifierRevision === undefined\n ? {}\n : { targetIdentifierRevision: current.targetIdentifierRevision }),\n ...(current.source === undefined\n ? {}\n : { source: yield* snapshotEmailCredential(current.source.snapshot) }),\n });\n }),\n )\n : Effect.fail(unavailable())\n ).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n checkCompletion: (input) => {\n if (configuration.proof === undefined || input.binding._tag !== \"IdentifierChange\")\n return Effect.succeed(false).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n );\n const binding = input.binding;\n\n return safeRead(\n database,\n configuration,\n Effect.gen(function* () {\n const action: EmailAction | undefined =\n input.moduleId.endsWith(\"/verify-address\") &&\n input.purpose === \"email-address-verification\"\n ? \"verify-address\"\n : input.moduleId.endsWith(\"/change-address\") &&\n input.purpose === \"email-address-change\"\n ? \"change-address\"\n : undefined;\n\n if (action === undefined) return false;\n const moduleId = input.moduleId.slice(0, -`/${action}`.length);\n\n const current = yield* currentAddress(\n mapping,\n {\n moduleId,\n subjectId: binding.revision.subjectId,\n target: binding.identifier,\n },\n false,\n );\n\n return current !== undefined && sameEmailRevision(current.revision, binding.revision);\n }),\n )\n .pipe(\n Effect.flatMap((current) =>\n current ? probeProofCompletion(configuration, input) : Effect.succeed(false),\n ),\n )\n .pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n );\n },\n verifyWithProof: (uncaptured, prepare) =>\n mutateAddress(mapping, configuration, uncaptured, \"verify-address\", prepare).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n changeWithProof: (uncaptured, prepare) =>\n mutateAddress(mapping, configuration, uncaptured, \"change-address\", prepare).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n cleanup: (input, prepare) =>\n owned(\n database,\n configuration,\n Effect.gen(function* () {\n const transaction = yield* CurrentEmailSql;\n const journal = yield* CurrentCommitJournal;\n\n const c = commandColumns(mapping);\n const now = yield* nowMillis;\n\n const rows = yield* selectRows(\n transaction\n .select({ commandId: c.commandId })\n .from(mapping.command.table)\n .where(\n and(\n eq(c.moduleId, input.moduleId),\n lte(c.retentionUntil, mapping.encodeInstant(now)),\n ),\n )\n .limit(input.limit + 1),\n configuration.locking,\n );\n\n const selected = rows.slice(0, input.limit);\n\n const receipt = prepare(\n { removed: selected.length, hasMore: rows.length > input.limit },\n journal,\n );\n\n if (selected.length > 0)\n yield* transaction.delete(mapping.command.table).where(\n and(\n eq(c.moduleId, input.moduleId),\n inArray(\n c.commandId,\n selected.map((row: any) => row.commandId),\n ),\n lte(c.retentionUntil, mapping.encodeInstant(now)),\n ),\n );\n\n return receipt;\n }),\n ).pipe(\n Effect.provideService(CurrentEmailSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n });\n });\n\n const mutateAddress = Effect.fn(\"Drizzle.mutateAddress\")(function* <A>(\n mapping: AddressMapping,\n configuration: EmailSqlConfiguration,\n uncaptured: EmailAddressMutation,\n action: EmailAction,\n prepare: (value: \"changed\" | \"rejected\", journal: CommitJournal) => PreparedCommit<A>,\n ) {\n const database = yield* CurrentEmailSql;\n\n if (!validAddressConstraints(mapping) || configuration.proof === undefined)\n return yield* unavailable();\n const input = yield* snapshotEmailMutation(uncaptured);\n\n const targetCredentialId = yield* allocate(\n configuration.mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n );\n\n const targetIdentifierRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const targetCredentialRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const sourceIdentifierRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const sourceCredentialRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const confirmsExisting =\n action === \"verify-address\" && input.captured.targetIdentifierRevision !== undefined;\n\n const nextRevision = confirmsExisting\n ? input.captured.revision.securityRevision\n : yield* nextSecurityRevision(\n mapping,\n configuration.mode,\n input.captured.revision.securityRevision,\n );\n\n if (\n (!confirmsExisting && nextRevision === input.captured.revision.securityRevision) ||\n [\n targetIdentifierRevision,\n targetCredentialRevision,\n sourceIdentifierRevision,\n sourceCredentialRevision,\n ].some((value) => input.captured.revision.credentials.some((item) => item.revision === value))\n )\n return yield* unavailable();\n\n const run = owned(\n database,\n configuration,\n Effect.gen(function* () {\n const journal = yield* CurrentCommitJournal;\n\n const current = yield* validateEmailAuthority(mapping, configuration, input, action);\n\n if (current === undefined) return prepare(\"rejected\", journal);\n if (\n (yield* commandExists(mapping, input.moduleId, input.commandId, configuration.locking))\n .length > 0\n )\n return prepare(\"rejected\", journal);\n let receipt: PreparedCommit<A> | undefined;\n\n yield* completeProofPlanIn(\n configuration.proof!.mapping,\n configuration.proof!.configuration,\n input.completion,\n Effect.gen(function* () {\n // The proof helper may wait on continuation/series locks. Read the\n // commit clock and reassess both policies only after those locks.\n const currentRequirement = yield* mapping.subject.decodeActionRequirement(\n current.subject,\n action,\n );\n\n const original = yield* assessAuthentication(\n input.authorization.evidence,\n input.authorization.requirement,\n ).pipe(Effect.mapError(unavailable));\n\n const configured = yield* assessAuthentication(\n input.authorization.evidence,\n currentRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n if (!original.satisfied || !configured.satisfied) return false;\n const now = yield* nowMillis;\n\n return yield* applyMutation(\n mapping,\n input,\n action,\n current,\n {\n targetCredentialId,\n targetIdentifierRevision,\n targetCredentialRevision,\n sourceIdentifierRevision,\n sourceCredentialRevision,\n nextSecurityRevision: nextRevision,\n },\n now,\n );\n }),\n (decision) => {\n receipt = prepare(decision === \"completed\" ? \"changed\" : \"rejected\", journal);\n\n return decision;\n },\n );\n\n return receipt ?? prepare(\"rejected\", journal);\n }),\n );\n\n return yield* run.pipe(\n Effect.catchCause((cause) =>\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCommandConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isIdentifierConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCredentialConflict, cause))\n ? prepareRejected(configuration, prepare)\n : Effect.failCause(cause),\n ),\n );\n });\n\n return {\n validEmailSignInConstraints,\n emailLookupQuery,\n decodeEmailSnapshot,\n makeSqlEmailSignInTargets,\n currentAddress,\n sameEmailRevision,\n snapshotEmailMutation,\n validateEmailAuthority,\n makeSqlEmailAddressPersistence,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
//#region src/internal/models/passkey-registration-ceremony-model.ts
|
|
2
|
-
const requiredPasskeyRegistrationCeremonyConstraints = {
|
|
3
|
-
flow: ["moduleId", "flowId"],
|
|
4
|
-
command: ["moduleId", "commandId"],
|
|
5
|
-
admission: ["authorityScope", "moduleId"],
|
|
6
|
-
charge: [
|
|
7
|
-
"moduleId",
|
|
8
|
-
"flowId",
|
|
9
|
-
"kind"
|
|
10
|
-
],
|
|
11
|
-
intentFlow: ["moduleId", "flowId"],
|
|
12
|
-
intentCommand: ["moduleId", "commandId"],
|
|
13
|
-
handle: ["handleKey"]
|
|
14
|
-
};
|
|
15
|
-
//#endregion
|
|
16
|
-
export { requiredPasskeyRegistrationCeremonyConstraints };
|
|
17
|
-
|
|
18
|
-
//# sourceMappingURL=passkey-registration-ceremony-model.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"passkey-registration-ceremony-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-registration-ceremony-model.ts"],"sourcesContent":["import type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type {\n PasskeyCeremonyMapping,\n PasskeyChargeTable,\n PasskeyColumn,\n PasskeyFlowTable,\n PasskeyHandleReservationTable,\n PasskeyPersistenceServices,\n} from \"./passkey-model\";\n\nexport interface PasskeyRegistrationCeremonyCapabilities {\n readonly purposes: readonly [\"registration\"];\n readonly issue: \"registration-authority\";\n readonly assertionSettlement: false;\n}\n\nexport interface PasskeyRegistrationCeremonyServices extends PasskeyPersistenceServices {\n readonly capabilities: PasskeyRegistrationCeremonyCapabilities;\n}\n\n/** Read-only custody supplied by a separate registration issuance authority.\n * No application payload codec, subject codec or provisioning callback runs here. */\nexport interface PasskeyRegistrationIntentReadTable<\n T extends Table,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly flowId: PasskeyColumn<T>;\n readonly commandId: PasskeyColumn<T>;\n readonly state: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly fingerprint: PasskeyColumn<T>;\n readonly handleKey: PasskeyColumn<T>;\n readonly reservationId: PasskeyColumn<T>;\n readonly ceremonySnapshot: PasskeyColumn<T>;\n /** Already validated by the issuing authority; compare opaque bytes only. */\n readonly applicationSnapshot: PasskeyColumn<T>;\n readonly pendingCondition: Expression;\n readonly isPendingState: (value: unknown) => boolean;\n /** Any unresolved initial intent or provisioning job; cleanup never releases it. */\n readonly custodyCondition: Expression;\n}\n\nexport const requiredPasskeyRegistrationCeremonyConstraints = {\n flow: [\"moduleId\", \"flowId\"],\n command: [\"moduleId\", \"commandId\"],\n admission: [\"authorityScope\", \"moduleId\"],\n charge: [\"moduleId\", \"flowId\", \"kind\"],\n intentFlow: [\"moduleId\", \"flowId\"],\n intentCommand: [\"moduleId\", \"commandId\"],\n handle: [\"handleKey\"],\n} as const;\n\nexport interface PasskeyRegistrationCeremonyMapping<\n Module extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n Handle extends Table,\n Expression extends SqlExpression = SqlExpression,\n> extends Omit<\n PasskeyCeremonyMapping<Module, Flow, Admission, Charge, Expression>,\n \"constraints\" | \"flow\" | \"charge\"\n> {\n readonly flow: Omit<PasskeyFlowTable<Flow>, \"encodeInsert\">;\n readonly charge: Omit<PasskeyChargeTable<Charge>, \"encodeInsert\">;\n readonly intent: PasskeyRegistrationIntentReadTable<Intent, Expression>;\n readonly handle: PasskeyHandleReservationTable<Handle, Expression>;\n readonly constraints: typeof requiredPasskeyRegistrationCeremonyConstraints;\n}\n"],"mappings":";AA4CA,MAAa,iDAAiD;CAC5D,MAAM,CAAC,YAAY,QAAQ;CAC3B,SAAS,CAAC,YAAY,WAAW;CACjC,WAAW,CAAC,kBAAkB,UAAU;CACxC,QAAQ;EAAC;EAAY;EAAU;CAAM;CACrC,YAAY,CAAC,YAAY,QAAQ;CACjC,eAAe,CAAC,YAAY,WAAW;CACvC,QAAQ,CAAC,WAAW;AACtB"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import "../mapping-error.mjs";
|
|
2
|
-
import "./owner.mjs";
|
|
3
|
-
import "./query-compiler.mjs";
|
|
4
|
-
import "./flow.mjs";
|
|
5
|
-
import "./registration.mjs";
|
|
6
|
-
import { Context, Effect, Layer } from "effect";
|
|
7
|
-
import { SecurityRevision } from "@yielded/auth/Sessions";
|
|
8
|
-
import { OAuthAccountRevision, OAuthLinkAccess } from "@yielded/auth/OAuth";
|
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
import { CurrentOAuthTransaction } from "./owner.mjs";
|
|
2
|
-
import { OAuthQueryCompiler } from "./query-compiler.mjs";
|
|
3
|
-
import { invariant, oauthIdentityKey, sameRevision, satisfies, storage, validAction } from "./state.mjs";
|
|
4
|
-
import { OAuthFlow } from "./flow.mjs";
|
|
5
|
-
import { OAuthRegistration } from "./registration.mjs";
|
|
6
|
-
import { Context, DateTime, Effect, Layer } from "effect";
|
|
7
|
-
import { AuthenticationRequirement, SecurityRevision, SessionInvalidationWindow } from "@yielded/auth/Sessions";
|
|
8
|
-
import { OAuthAccountRevision, OAuthActionAuthorization, OAuthCredentialSnapshot, OAuthLinkAccess, OAuthLinkClaim, OAuthLinkPendingFlow, OAuthLinkTransactionContext, OAuthUnlinked, snapshotOAuthSync } from "@yielded/auth/OAuth";
|
|
9
|
-
//#region src/internal/oauth/accounts.ts
|
|
10
|
-
const make$1 = Effect.gen(function* () {
|
|
11
|
-
const operations = yield* OAuthQueryCompiler;
|
|
12
|
-
const flow = yield* OAuthFlow;
|
|
13
|
-
const registration = yield* OAuthRegistration;
|
|
14
|
-
const { eq, sql } = operations;
|
|
15
|
-
const { claimFlow, credentialStorage, currentSubject, exactClaim, issueFlow, linkStorage, matchesAccess, readFlow, terminalFlow } = flow;
|
|
16
|
-
const { both, col, copiedRow, equal } = operations;
|
|
17
|
-
const { acquireTuple, readTuple } = registration;
|
|
18
|
-
const contextStorage = storage(OAuthLinkTransactionContext);
|
|
19
|
-
const unlinkedStorage = storage(OAuthUnlinked);
|
|
20
|
-
const accountCurrent = (mapping, subjectId) => Effect.gen(function* () {
|
|
21
|
-
const native = yield* mapping.subjectId.toNative(subjectId);
|
|
22
|
-
return yield* currentSubject(mapping, native);
|
|
23
|
-
});
|
|
24
|
-
const authorization = (mapping, current, auth, action, flowId, commandId, intent, maximumAge) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
25
|
-
const now = yield* owner.now(mapping.clock);
|
|
26
|
-
const currentRequirement = snapshotOAuthSync(AuthenticationRequirement, mapping.subject.decodeActionRequirement(copiedRow(current.row), action));
|
|
27
|
-
if (!(yield* validAction(auth, {
|
|
28
|
-
moduleId: auth.challenge.moduleId,
|
|
29
|
-
action,
|
|
30
|
-
flowId,
|
|
31
|
-
commandId,
|
|
32
|
-
revision: current.revision,
|
|
33
|
-
intent
|
|
34
|
-
}, currentRequirement, now, maximumAge))) return false;
|
|
35
|
-
const age = Math.min(maximumAge, auth.requirement.maximumAgeMillis, currentRequirement.maximumAgeMillis);
|
|
36
|
-
const fresh = auth.evidence.proofs.filter((proof) => now - DateTime.toEpochMillis(proof.verifiedAt) < age);
|
|
37
|
-
invariant(fresh.length > 0);
|
|
38
|
-
const deadline = Math.min(...fresh.map((proof) => DateTime.toEpochMillis(proof.verifiedAt) + age));
|
|
39
|
-
owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${now} and ${mapping.clock.engineNowMillis} < ${deadline}`);
|
|
40
|
-
return true;
|
|
41
|
-
}));
|
|
42
|
-
const currentLink = (mapping, flow) => Effect.gen(function* () {
|
|
43
|
-
const current = yield* accountCurrent(mapping, flow.context.revision.subjectId);
|
|
44
|
-
return current !== void 0 && sameRevision(current.revision, flow.context.revision) ? current : void 0;
|
|
45
|
-
});
|
|
46
|
-
const issueLink = (mapping, input) => Effect.gen(function* () {
|
|
47
|
-
const flow = snapshotOAuthSync(OAuthLinkPendingFlow, input.flow), c = flow.context;
|
|
48
|
-
const current = yield* currentLink(mapping, flow);
|
|
49
|
-
const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization);
|
|
50
|
-
if (current === void 0 || auth.challenge.moduleId !== c.moduleId || !(yield* authorization(mapping, current, auth, "link-begin", c.flowId, c.commandId, contextStorage.encode(c), c.maximumEvidenceAgeMillis))) return { _tag: "Rejected" };
|
|
51
|
-
return yield* issueFlow(mapping, flow, "link");
|
|
52
|
-
});
|
|
53
|
-
const preflightLink = (mapping, original) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
54
|
-
const input = snapshotOAuthSync(OAuthLinkAccess, original);
|
|
55
|
-
const current = yield* accountCurrent(mapping, input.subjectId);
|
|
56
|
-
const found = yield* readFlow(mapping, input, "link");
|
|
57
|
-
const now = yield* owner.now(mapping.clock);
|
|
58
|
-
if (current === void 0 || found.flow === void 0 || found.row?.[mapping.flow.state] !== "Pending" || !matchesAccess(found.flow, input)) return void 0;
|
|
59
|
-
const flow = snapshotOAuthSync(OAuthLinkPendingFlow, found.flow), c = flow.context;
|
|
60
|
-
if (c.revision.subjectId !== input.subjectId || !sameRevision(current.revision, c.revision) || now < c.issuedAtMillis || now >= c.expiresAtMillis) return void 0;
|
|
61
|
-
owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${c.issuedAtMillis} and ${mapping.clock.engineNowMillis} < ${c.expiresAtMillis}`);
|
|
62
|
-
return {
|
|
63
|
-
current,
|
|
64
|
-
flow,
|
|
65
|
-
row: found.row
|
|
66
|
-
};
|
|
67
|
-
}));
|
|
68
|
-
const claimLink = (mapping, input) => Effect.gen(function* () {
|
|
69
|
-
const found = yield* preflightLink(mapping, input.access);
|
|
70
|
-
const flow = snapshotOAuthSync(OAuthLinkPendingFlow, input.flow);
|
|
71
|
-
const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization), c = flow.context;
|
|
72
|
-
if (found === void 0 || linkStorage.encode(found.flow) !== linkStorage.encode(flow) || auth.challenge.moduleId !== c.moduleId || !(yield* authorization(mapping, found.current, auth, "link-complete", c.flowId, c.commandId, contextStorage.encode(c), c.maximumEvidenceAgeMillis))) return { _tag: "Rejected" };
|
|
73
|
-
const claim = yield* claimFlow(mapping, {
|
|
74
|
-
row: found.row,
|
|
75
|
-
flow
|
|
76
|
-
}, input.claimId);
|
|
77
|
-
return claim === void 0 ? { _tag: "Rejected" } : {
|
|
78
|
-
_tag: "Claimed",
|
|
79
|
-
claim
|
|
80
|
-
};
|
|
81
|
-
});
|
|
82
|
-
const checkInvalidation = (mapping, original) => {
|
|
83
|
-
const value = snapshotOAuthSync(SessionInvalidationWindow, original);
|
|
84
|
-
invariant(value.trigger === "credential-change" && value.oldAuthenticationEvidence === "rejected" && (mapping.sessionInvalidation === "same-authority-immediate" ? value.existingSessions === "immediate" && value.maximumExposureMillis === 0 : value.existingSessions === "original-absolute-expiry"));
|
|
85
|
-
return value;
|
|
86
|
-
};
|
|
87
|
-
const advance = (mapping, current, removed) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
88
|
-
const revision = mapping.subject.nextSecurityRevision(current.revision.securityRevision);
|
|
89
|
-
invariant(typeof revision === "string" && revision.length > 0 && revision.length <= 256 && revision !== current.revision.securityRevision);
|
|
90
|
-
const subject = mapping.subject;
|
|
91
|
-
yield* owner.update(subject.table, { [subject.id]: current.nativeId }, { [subject.securityRevision]: revision });
|
|
92
|
-
for (const cleanup of mapping.cleanup) {
|
|
93
|
-
const condition = both(eq(col(cleanup.table, cleanup.subjectId), current.nativeId), cleanup.condition({
|
|
94
|
-
subjectId: current.nativeId,
|
|
95
|
-
revision: snapshotOAuthSync(OAuthAccountRevision, current.revision),
|
|
96
|
-
...removed === void 0 ? {} : { removedCredentialId: removed }
|
|
97
|
-
}));
|
|
98
|
-
yield* owner.write(owner.database.delete(cleanup.table).where(condition));
|
|
99
|
-
owner.postconditions.push(sql`not exists(select 1 from ${cleanup.table} where ${condition})`);
|
|
100
|
-
}
|
|
101
|
-
return SecurityRevision.make(revision);
|
|
102
|
-
}));
|
|
103
|
-
const settleLink = (mapping, input, allocated) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
104
|
-
const claim = snapshotOAuthSync(OAuthLinkClaim, input.claim), flow = claim.flow, c = flow.context;
|
|
105
|
-
const current = yield* currentLink(mapping, flow);
|
|
106
|
-
const identity = input.outcome._tag === "Verified" ? input.outcome.identity.identity : void 0;
|
|
107
|
-
if (identity !== void 0) invariant(identity.provider === c.provider && identity.issuer === c.issuer);
|
|
108
|
-
const tuple = identity !== void 0 && current !== void 0 ? yield* readTuple(mapping.ownership, identity) : void 0;
|
|
109
|
-
if ((yield* exactClaim(mapping, claim, "link")) === void 0) return { _tag: "Rejected" };
|
|
110
|
-
let decision = { _tag: input.outcome._tag };
|
|
111
|
-
if (input.outcome._tag === "Verified") {
|
|
112
|
-
decision = { _tag: "Rejected" };
|
|
113
|
-
const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization);
|
|
114
|
-
if (current !== void 0 && tuple !== void 0 && auth.challenge.moduleId === c.moduleId && (yield* authorization(mapping, current, auth, "link-complete", c.flowId, c.commandId, contextStorage.encode(c), c.maximumEvidenceAgeMillis))) {
|
|
115
|
-
const t = mapping.ownership.tuple, cr = mapping.credential, a = mapping.authority;
|
|
116
|
-
const login = yield* owner.read(cr.table, eq(col(cr.table, cr.identityKey), tuple.key), { limit: 1 });
|
|
117
|
-
const previous = login.rows[0];
|
|
118
|
-
if (tuple.row[t.state] === "Reserved" || tuple.row[t.state] === "Owned" && !mapping.subjectId.equals(tuple.row[t.subjectId], current.nativeId) || previous !== void 0 && (previous[cr.moduleId] !== c.moduleId || !mapping.subjectId.equals(previous[cr.subjectId], current.nativeId) || !cr.isActiveStatus(previous[cr.status]))) decision = { _tag: "Conflict" };
|
|
119
|
-
else if (previous !== void 0) {
|
|
120
|
-
const shared = current.revision.credentials.find((item) => item.credentialId === previous[cr.credentialId]);
|
|
121
|
-
if (tuple.row[t.state] !== "Owned" || shared?.revision !== previous[cr.credentialRevision] || !(yield* owner.check(sql`exists(select 1 from ${cr.table} where ${both(eq(col(cr.table, cr.identityKey), tuple.key), cr.activeCondition)})`))) decision = { _tag: "Conflict" };
|
|
122
|
-
else decision = {
|
|
123
|
-
_tag: "Linked",
|
|
124
|
-
changed: false,
|
|
125
|
-
credential: snapshotOAuthSync(OAuthCredentialSnapshot, {
|
|
126
|
-
moduleId: c.moduleId,
|
|
127
|
-
identity,
|
|
128
|
-
credentialId: previous[cr.credentialId],
|
|
129
|
-
credentialRevision: previous[cr.credentialRevision],
|
|
130
|
-
revision: current.revision
|
|
131
|
-
})
|
|
132
|
-
};
|
|
133
|
-
} else {
|
|
134
|
-
checkInvalidation(mapping, input.invalidation);
|
|
135
|
-
const values = {
|
|
136
|
-
...cr.encodeInsert({
|
|
137
|
-
moduleId: c.moduleId,
|
|
138
|
-
subjectId: current.nativeId,
|
|
139
|
-
identityKey: tuple.key,
|
|
140
|
-
credentialId: allocated.credentialId,
|
|
141
|
-
credentialRevision: allocated.revision
|
|
142
|
-
}),
|
|
143
|
-
[cr.moduleId]: c.moduleId,
|
|
144
|
-
[cr.subjectId]: current.nativeId,
|
|
145
|
-
[cr.identityKey]: tuple.key,
|
|
146
|
-
[cr.credentialId]: allocated.credentialId,
|
|
147
|
-
[cr.credentialRevision]: allocated.revision
|
|
148
|
-
};
|
|
149
|
-
invariant(cr.isActiveStatus(values[cr.status]));
|
|
150
|
-
login.rows = (yield* owner.insert(cr.table, values, { [cr.credentialId]: allocated.credentialId })).rows;
|
|
151
|
-
const sharedValues = {
|
|
152
|
-
...a.encodeInsert({
|
|
153
|
-
subjectId: current.nativeId,
|
|
154
|
-
credentialId: allocated.credentialId,
|
|
155
|
-
revision: allocated.revision
|
|
156
|
-
}),
|
|
157
|
-
[a.subjectId]: current.nativeId,
|
|
158
|
-
[a.credentialId]: allocated.credentialId,
|
|
159
|
-
[a.revision]: allocated.revision
|
|
160
|
-
};
|
|
161
|
-
invariant(a.isActiveStatus(sharedValues[a.status]));
|
|
162
|
-
const shared = yield* owner.insert(a.table, sharedValues, {
|
|
163
|
-
[a.subjectId]: current.nativeId,
|
|
164
|
-
[a.credentialId]: allocated.credentialId
|
|
165
|
-
});
|
|
166
|
-
current.authorities.rows = [...current.authorities.rows, ...shared.rows];
|
|
167
|
-
owner.postconditions.push(sql`exists(select 1 from ${cr.table} where ${both(eq(col(cr.table, cr.credentialId), allocated.credentialId), cr.activeCondition)})`, sql`exists(select 1 from ${a.table} where ${both(eq(col(a.table, a.subjectId), current.nativeId), eq(col(a.table, a.credentialId), allocated.credentialId), a.activeCondition)})`);
|
|
168
|
-
if (tuple.row[t.state] === "Unowned") yield* acquireTuple(mapping.ownership, identity, tuple.key, current.nativeId);
|
|
169
|
-
const next = yield* advance(mapping, current);
|
|
170
|
-
const revision = snapshotOAuthSync(OAuthAccountRevision, {
|
|
171
|
-
...current.revision,
|
|
172
|
-
securityRevision: next,
|
|
173
|
-
credentials: [...current.revision.credentials, {
|
|
174
|
-
credentialId: allocated.credentialId,
|
|
175
|
-
revision: allocated.revision
|
|
176
|
-
}]
|
|
177
|
-
});
|
|
178
|
-
decision = {
|
|
179
|
-
_tag: "Linked",
|
|
180
|
-
changed: true,
|
|
181
|
-
credential: snapshotOAuthSync(OAuthCredentialSnapshot, {
|
|
182
|
-
moduleId: c.moduleId,
|
|
183
|
-
identity,
|
|
184
|
-
credentialId: allocated.credentialId,
|
|
185
|
-
credentialRevision: allocated.revision,
|
|
186
|
-
revision
|
|
187
|
-
})
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
yield* terminalFlow(mapping, flow, decision._tag);
|
|
193
|
-
return decision;
|
|
194
|
-
}));
|
|
195
|
-
const targetCredential = (mapping, moduleId, credentialId, current) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
196
|
-
const cr = mapping.credential;
|
|
197
|
-
const row = (yield* owner.read(cr.table, eq(col(cr.table, cr.credentialId), credentialId), { limit: 1 })).rows[0];
|
|
198
|
-
if (row === void 0 || row[cr.moduleId] !== moduleId || !mapping.subjectId.equals(row[cr.subjectId], current.nativeId) || !cr.isActiveStatus(row[cr.status])) return void 0;
|
|
199
|
-
const t = mapping.ownership.tuple;
|
|
200
|
-
const ownership = (yield* owner.read(t.table, eq(col(t.table, t.identityKey), row[cr.identityKey]), { limit: 1 })).rows[0];
|
|
201
|
-
if (ownership === void 0 || ownership[t.state] !== "Owned" || !mapping.subjectId.equals(ownership[t.subjectId], current.nativeId)) return void 0;
|
|
202
|
-
const identity = {
|
|
203
|
-
provider: ownership[t.provider],
|
|
204
|
-
issuer: ownership[t.issuer],
|
|
205
|
-
subject: ownership[t.externalSubject]
|
|
206
|
-
};
|
|
207
|
-
invariant((yield* oauthIdentityKey(identity)) === row[cr.identityKey]);
|
|
208
|
-
if (current.revision.credentials.find((item) => item.credentialId === credentialId)?.revision !== row[cr.credentialRevision] || !(yield* owner.check(sql`exists(select 1 from ${cr.table} where ${both(eq(col(cr.table, cr.credentialId), credentialId), cr.activeCondition)})`))) return void 0;
|
|
209
|
-
return snapshotOAuthSync(OAuthCredentialSnapshot, {
|
|
210
|
-
moduleId,
|
|
211
|
-
identity,
|
|
212
|
-
credentialId,
|
|
213
|
-
credentialRevision: row[cr.credentialRevision],
|
|
214
|
-
revision: current.revision
|
|
215
|
-
});
|
|
216
|
-
}));
|
|
217
|
-
const unlinkCommand = (mapping, moduleId, commandId) => Effect.flatMap(CurrentOAuthTransaction, (owner) => owner.read(mapping.command.table, equal(mapping.command.table, {
|
|
218
|
-
[mapping.command.moduleId]: moduleId,
|
|
219
|
-
[mapping.command.commandId]: commandId
|
|
220
|
-
}), { limit: 1 }));
|
|
221
|
-
const inspectUnlink = (mapping, input) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
222
|
-
const current = yield* accountCurrent(mapping, input.subjectId);
|
|
223
|
-
if (current === void 0) return { _tag: "Rejected" };
|
|
224
|
-
const command = yield* unlinkCommand(mapping, input.moduleId, input.commandId), r = mapping.command;
|
|
225
|
-
const old = command.rows[0];
|
|
226
|
-
if (old !== void 0) {
|
|
227
|
-
const intent = credentialStorage.decode(old[r.intentSnapshot]);
|
|
228
|
-
if (intent.moduleId !== input.moduleId || intent.revision.subjectId !== input.subjectId || intent.credentialId !== input.credentialId || !mapping.subjectId.equals(old[r.subjectId], current.nativeId) || old[r.credentialId] !== input.credentialId) return { _tag: "Conflict" };
|
|
229
|
-
const metadata = mapping.metadata.condition(current.nativeId);
|
|
230
|
-
if (!(yield* owner.check(metadata))) return { _tag: "Rejected" };
|
|
231
|
-
owner.postconditions.push(metadata);
|
|
232
|
-
return {
|
|
233
|
-
_tag: "Replay",
|
|
234
|
-
result: unlinkedStorage.decode(old[r.decision])
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
const credential = yield* targetCredential(mapping, input.moduleId, input.credentialId, current);
|
|
238
|
-
return credential === void 0 ? { _tag: "Rejected" } : {
|
|
239
|
-
_tag: "Target",
|
|
240
|
-
credential
|
|
241
|
-
};
|
|
242
|
-
}));
|
|
243
|
-
const remainingEligibility = (mapping, current, removed) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
244
|
-
invariant(mapping.eligibility.length > 0 && mapping.eligibility.length <= 32);
|
|
245
|
-
const facts = /* @__PURE__ */ new Map();
|
|
246
|
-
const revisions = new Map(current.revision.credentials.map((item) => [item.credentialId, item.revision]));
|
|
247
|
-
for (const descriptor of mapping.eligibility) {
|
|
248
|
-
const observed = yield* owner.read(descriptor.table, both(eq(col(descriptor.table, descriptor.subjectId), current.nativeId), descriptor.condition(current.nativeId)), { orderBy: col(descriptor.table, descriptor.credentialId) });
|
|
249
|
-
for (const row of observed.rows) {
|
|
250
|
-
const fact = descriptor.decode(copiedRow(row));
|
|
251
|
-
if (fact === void 0 || fact.credentialId === removed) continue;
|
|
252
|
-
invariant(fact.credentialId === row[descriptor.credentialId] && fact.revision === row[descriptor.revision] && revisions.get(fact.credentialId) === fact.revision && fact.factors.length <= 8 && fact.factors.every((factor) => [
|
|
253
|
-
"knowledge",
|
|
254
|
-
"possession",
|
|
255
|
-
"inherence"
|
|
256
|
-
].includes(factor)));
|
|
257
|
-
invariant(typeof fact.usablePrimary === "boolean" && typeof fact.userVerified === "boolean" && typeof fact.phishingResistant === "boolean");
|
|
258
|
-
const normalized = {
|
|
259
|
-
credentialId: fact.credentialId,
|
|
260
|
-
revision: fact.revision,
|
|
261
|
-
usablePrimary: fact.usablePrimary,
|
|
262
|
-
factors: [...new Set(fact.factors)].sort(),
|
|
263
|
-
userVerified: fact.userVerified,
|
|
264
|
-
phishingResistant: fact.phishingResistant
|
|
265
|
-
};
|
|
266
|
-
const prior = facts.get(fact.credentialId);
|
|
267
|
-
invariant(prior === void 0 || JSON.stringify(prior) === JSON.stringify(normalized));
|
|
268
|
-
facts.set(fact.credentialId, normalized);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
const available = [...facts.values()];
|
|
272
|
-
const requirement = snapshotOAuthSync(AuthenticationRequirement, mapping.subject.decodeAuthenticationRequirement(copiedRow(current.row)));
|
|
273
|
-
return available.some((fact) => fact.usablePrimary) && satisfies(available, requirement);
|
|
274
|
-
}));
|
|
275
|
-
const unlink = (mapping, input) => Effect.flatMap(CurrentOAuthTransaction, (owner) => Effect.gen(function* () {
|
|
276
|
-
const expected = snapshotOAuthSync(OAuthCredentialSnapshot, input.credential);
|
|
277
|
-
invariant(expected.moduleId === input.moduleId);
|
|
278
|
-
const current = yield* accountCurrent(mapping, expected.revision.subjectId);
|
|
279
|
-
if (current === void 0) return { _tag: "Rejected" };
|
|
280
|
-
const guards = mapping.connectedReferenceGuards ?? [];
|
|
281
|
-
invariant(guards.length <= 32);
|
|
282
|
-
let referencesGuarded = mapping.connectedReference !== void 0 && guards.length > 0;
|
|
283
|
-
if (mapping.connectedReference !== void 0) for (const guard of guards) {
|
|
284
|
-
const condition = guard.condition({
|
|
285
|
-
identity: snapshotOAuthSync(OAuthCredentialSnapshot.fields.identity, expected.identity),
|
|
286
|
-
identityKey: yield* oauthIdentityKey(expected.identity),
|
|
287
|
-
subjectId: copiedRow({ value: current.nativeId }).value
|
|
288
|
-
});
|
|
289
|
-
if ((yield* owner.read(guard.table, Effect.isEffect(condition) ? yield* condition : condition, { orderBy: col(guard.table, guard.orderBy) })).rows.length === 0) referencesGuarded = false;
|
|
290
|
-
}
|
|
291
|
-
const command = yield* unlinkCommand(mapping, input.moduleId, input.commandId), r = mapping.command;
|
|
292
|
-
const previous = command.rows[0];
|
|
293
|
-
if (previous !== void 0) {
|
|
294
|
-
if (previous[r.intentSnapshot] !== credentialStorage.encode(expected) || previous[r.credentialId] !== expected.credentialId || !mapping.subjectId.equals(previous[r.subjectId], current.nativeId)) return { _tag: "Conflict" };
|
|
295
|
-
const metadata = mapping.metadata.condition(current.nativeId);
|
|
296
|
-
if (!(yield* owner.check(metadata))) return { _tag: "Rejected" };
|
|
297
|
-
owner.postconditions.push(metadata);
|
|
298
|
-
return {
|
|
299
|
-
_tag: "Unlinked",
|
|
300
|
-
replayed: true,
|
|
301
|
-
result: unlinkedStorage.decode(previous[r.decision])
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
const actual = yield* targetCredential(mapping, input.moduleId, expected.credentialId, current);
|
|
305
|
-
if (actual === void 0 || credentialStorage.encode(actual) !== credentialStorage.encode(expected)) return { _tag: "Rejected" };
|
|
306
|
-
const auth = snapshotOAuthSync(OAuthActionAuthorization, input.authorization);
|
|
307
|
-
if (auth.challenge.moduleId !== input.moduleId || !(yield* authorization(mapping, current, auth, "unlink", input.commandId, input.commandId, credentialStorage.encode(expected), auth.requirement.maximumAgeMillis))) return { _tag: "Rejected" };
|
|
308
|
-
if (!(yield* remainingEligibility(mapping, current, expected.credentialId))) return { _tag: "LastSignInMethod" };
|
|
309
|
-
const invalidation = checkInvalidation(mapping, input.invalidation), cr = mapping.credential, a = mapping.authority;
|
|
310
|
-
const key = yield* oauthIdentityKey(expected.identity), t = mapping.ownership.tuple;
|
|
311
|
-
const connected = mapping.connectedReference?.({
|
|
312
|
-
identityKey: key,
|
|
313
|
-
subjectId: copiedRow({ value: current.nativeId }).value
|
|
314
|
-
});
|
|
315
|
-
const retain = connected !== void 0 && (!referencesGuarded || (yield* owner.check(connected)));
|
|
316
|
-
if (connected !== void 0 && referencesGuarded) owner.postconditions.push(retain ? connected : sql`not (${connected})`);
|
|
317
|
-
yield* owner.remove(cr.table, { [cr.credentialId]: expected.credentialId });
|
|
318
|
-
yield* owner.remove(a.table, {
|
|
319
|
-
[a.subjectId]: current.nativeId,
|
|
320
|
-
[a.credentialId]: expected.credentialId
|
|
321
|
-
});
|
|
322
|
-
if (!retain) {
|
|
323
|
-
yield* owner.update(t.table, { [t.identityKey]: key }, {
|
|
324
|
-
[t.state]: "Unowned",
|
|
325
|
-
[t.subjectId]: null,
|
|
326
|
-
[t.reservation]: null,
|
|
327
|
-
[t.version]: owner.marker
|
|
328
|
-
});
|
|
329
|
-
if (mapping.ownership.mode === "separate") yield* owner.remove(mapping.ownership.external.table, { [mapping.ownership.external.identityKey]: key });
|
|
330
|
-
}
|
|
331
|
-
yield* advance(mapping, current, expected.credentialId);
|
|
332
|
-
const result = snapshotOAuthSync(OAuthUnlinked, {
|
|
333
|
-
_tag: "Unlinked",
|
|
334
|
-
credentialId: expected.credentialId,
|
|
335
|
-
invalidation
|
|
336
|
-
});
|
|
337
|
-
const now = yield* owner.now(mapping.clock);
|
|
338
|
-
invariant(Number.isSafeInteger(input.retentionUntilMillis) && input.retentionUntilMillis > now && input.retentionUntilMillis >= input.nowMillis + 12e4);
|
|
339
|
-
const commandKey = {
|
|
340
|
-
[r.moduleId]: input.moduleId,
|
|
341
|
-
[r.commandId]: input.commandId
|
|
342
|
-
};
|
|
343
|
-
const values = {
|
|
344
|
-
...r.encodeInsert({
|
|
345
|
-
moduleId: input.moduleId,
|
|
346
|
-
commandId: input.commandId,
|
|
347
|
-
credential: snapshotOAuthSync(OAuthCredentialSnapshot, expected)
|
|
348
|
-
}),
|
|
349
|
-
...commandKey,
|
|
350
|
-
[r.subjectId]: current.nativeId,
|
|
351
|
-
[r.credentialId]: expected.credentialId,
|
|
352
|
-
[r.intentSnapshot]: credentialStorage.encode(expected),
|
|
353
|
-
[r.decision]: unlinkedStorage.encode(result),
|
|
354
|
-
[r.retentionUntil]: mapping.clock.encodeInstant(input.retentionUntilMillis)
|
|
355
|
-
};
|
|
356
|
-
command.rows = (yield* owner.insert(r.table, values, commandKey)).rows;
|
|
357
|
-
return {
|
|
358
|
-
_tag: "Unlinked",
|
|
359
|
-
result,
|
|
360
|
-
replayed: false
|
|
361
|
-
};
|
|
362
|
-
}));
|
|
363
|
-
return {
|
|
364
|
-
accountCurrent,
|
|
365
|
-
issueLink,
|
|
366
|
-
preflightLink,
|
|
367
|
-
claimLink,
|
|
368
|
-
settleLink,
|
|
369
|
-
inspectUnlink,
|
|
370
|
-
unlink
|
|
371
|
-
};
|
|
372
|
-
});
|
|
373
|
-
var OAuthAccounts = class OAuthAccounts extends Context.Service()("effect-auth/persistence/OAuthAccounts") {
|
|
374
|
-
static layer = Layer.effect(OAuthAccounts, make$1);
|
|
375
|
-
};
|
|
376
|
-
//#endregion
|
|
377
|
-
export { OAuthAccounts };
|
|
378
|
-
|
|
379
|
-
//# sourceMappingURL=accounts.mjs.map
|