@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,13 +1,12 @@
|
|
|
1
|
+
import { SqlExpression, TableModel } from "../table-model.mjs";
|
|
1
2
|
import { PersistenceMappingError } from "../mapping-error.mjs";
|
|
2
|
-
import { SqlExpression, TableModel } from "../query-operations.mjs";
|
|
3
3
|
import "./common.mjs";
|
|
4
|
-
import { PasskeyColumn, PasskeyCredentialMapping, PasskeyFlowTable,
|
|
5
|
-
import { PasskeyRegistrationIntentReadTable } from "./passkey-registration-ceremony-model.mjs";
|
|
4
|
+
import { PasskeyColumn, PasskeyCredentialMapping, PasskeyFlowTable, PasskeyPersistenceMapping, PasskeyPersistenceServices } from "./passkey-model.mjs";
|
|
6
5
|
import { Effect, Schema } from "effect";
|
|
7
|
-
import { PasskeyActionAuthorization, PasskeyCeremony, PasskeyClaim, PasskeyCredential, PasskeyCredentialSummary, PasskeyIssueDecision, PasskeyManagementPersistence, PasskeyManagementPolicy, PasskeyMethodPolicy, PasskeyRegistrationResult, PasskeyRegistrationVerified, PasskeyRequirement, PasskeyRevision, PasskeyUnavailable, PreparePasskeyCommit } from "@yielded/auth/Passkey";
|
|
8
|
-
import { TokenDigest } from "@yielded/auth/Schema";
|
|
9
6
|
import { PreparedCommit } from "@yielded/auth/Hooks";
|
|
7
|
+
import { PasskeyAccess, PasskeyActionAuthorization, PasskeyCeremony, PasskeyCredential, PasskeyCredentialSummary, PasskeyIssueDecision, PasskeyManagementPersistence, PasskeyManagementPolicy, PasskeyRegistrationResult, PasskeyRegistrationVerified, PasskeyRequirement, PasskeyRevision, PasskeyUnavailable, PreparePasskeyCommit } from "@yielded/auth/Passkey";
|
|
10
8
|
import { SessionInvalidationWindow } from "@yielded/auth/Sessions";
|
|
9
|
+
import { TokenDigest } from "@yielded/auth/Schema";
|
|
11
10
|
//#region src/internal/models/passkey-write-model.d.ts
|
|
12
11
|
export interface PasskeyCredentialInsert<N> {
|
|
13
12
|
readonly subjectId: N;
|
|
@@ -15,7 +14,7 @@ export interface PasskeyCredentialInsert<N> {
|
|
|
15
14
|
readonly summary: PasskeyCredentialSummary;
|
|
16
15
|
readonly marker: string;
|
|
17
16
|
}
|
|
18
|
-
export interface PasskeyWriteTables<S extends TableModel, C extends TableModel, F extends TableModel,
|
|
17
|
+
export interface PasskeyWriteTables<S extends TableModel, C extends TableModel, F extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
|
|
19
18
|
readonly credential: {
|
|
20
19
|
readonly name: PasskeyColumn<C>;
|
|
21
20
|
readonly createdAt: PasskeyColumn<C>;
|
|
@@ -31,21 +30,7 @@ export interface PasskeyWriteTables<S extends TableModel, C extends TableModel,
|
|
|
31
30
|
readonly activeStatus: unknown;
|
|
32
31
|
readonly removedStatus: unknown;
|
|
33
32
|
};
|
|
34
|
-
|
|
35
|
-
readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => O["insert"];
|
|
36
|
-
readonly ownedState: unknown;
|
|
37
|
-
readonly removedState: unknown;
|
|
38
|
-
};
|
|
39
|
-
readonly handleOwnership: {
|
|
40
|
-
readonly encodeInsert: (input: {
|
|
41
|
-
readonly subjectId: N;
|
|
42
|
-
readonly rpId: string;
|
|
43
|
-
readonly userHandle: string;
|
|
44
|
-
readonly marker: string;
|
|
45
|
-
}) => H["insert"];
|
|
46
|
-
readonly ownedState: unknown;
|
|
47
|
-
};
|
|
48
|
-
/** All mutable policy dependencies must be subject columns or declared module guards. */
|
|
33
|
+
/** Mutable management policy dependencies belong to the locked subject row. */
|
|
49
34
|
readonly policy: {
|
|
50
35
|
readonly subjectColumns: ReadonlyArray<PasskeyColumn<S>>;
|
|
51
36
|
readonly management: (row: Readonly<Partial<S["select"]>>) => PasskeyManagementPolicy;
|
|
@@ -75,27 +60,8 @@ export declare const passkeyInvalidationMutation: <T extends TableModel, N, Expr
|
|
|
75
60
|
readonly values: (input: PasskeyInvalidationInput<N>) => Partial<T["insert"]>;
|
|
76
61
|
readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;
|
|
77
62
|
}) => PasskeyInvalidationMutation<N, Expression>;
|
|
78
|
-
export interface
|
|
79
|
-
readonly
|
|
80
|
-
readonly moduleId: PasskeyColumn<T>;
|
|
81
|
-
readonly commandId: PasskeyColumn<T>;
|
|
82
|
-
readonly subjectId: PasskeyColumn<T>;
|
|
83
|
-
readonly credentialId: PasskeyColumn<T>;
|
|
84
|
-
readonly intent: PasskeyColumn<T>;
|
|
85
|
-
readonly decision: PasskeyColumn<T>;
|
|
86
|
-
readonly retentionUntil: PasskeyColumn<T>;
|
|
87
|
-
readonly version: PasskeyColumn<T>;
|
|
88
|
-
readonly encodeInsert: (input: {
|
|
89
|
-
readonly moduleId: string;
|
|
90
|
-
readonly commandId: string;
|
|
91
|
-
readonly subjectId: N;
|
|
92
|
-
readonly credentialId: string;
|
|
93
|
-
}) => T["insert"];
|
|
94
|
-
}
|
|
95
|
-
export interface PasskeyManagementMapping<S extends TableModel, C extends TableModel, F extends TableModel, O extends TableModel, H extends TableModel, M extends TableModel, Flow extends TableModel, A extends TableModel, Charge extends TableModel, Command extends TableModel, N, Expression extends SqlExpression = SqlExpression> extends PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N, Expression>, M, Flow, A, Charge, N, Expression, C> {
|
|
96
|
-
readonly write: PasskeyWriteTables<S, C, F, O, H, N, Expression>;
|
|
97
|
-
readonly command: PasskeyCommandTable<Command, N>;
|
|
98
|
-
readonly managementConstraints: typeof requiredPasskeyManagementConstraints;
|
|
63
|
+
export interface PasskeyManagementMapping<S extends TableModel, C extends TableModel, F extends TableModel, Flow extends TableModel, N, Expression extends SqlExpression = SqlExpression> extends PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, N, Expression>, Flow, N, Expression, C> {
|
|
64
|
+
readonly write: PasskeyWriteTables<S, C, F, N, Expression>;
|
|
99
65
|
/** Removal must match the installed session strategy and change the subject revision; immediate sessions must consult that authority or be updated here. Enrollment preserves existing authentication. */
|
|
100
66
|
readonly invalidation: {
|
|
101
67
|
readonly window: SessionInvalidationWindow;
|
|
@@ -103,9 +69,6 @@ export interface PasskeyManagementMapping<S extends TableModel, C extends TableM
|
|
|
103
69
|
readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;
|
|
104
70
|
};
|
|
105
71
|
}
|
|
106
|
-
export declare const requiredPasskeyManagementConstraints: {
|
|
107
|
-
readonly command: readonly ["moduleId", "commandId"];
|
|
108
|
-
};
|
|
109
72
|
export interface PasskeyManagementServices extends PasskeyPersistenceServices {
|
|
110
73
|
readonly passkeyManagementPersistence: PasskeyManagementPersistence["Service"];
|
|
111
74
|
}
|
|
@@ -118,13 +81,12 @@ export interface PasskeyRegistrationWriter<R> {
|
|
|
118
81
|
}, PasskeyUnavailable>;
|
|
119
82
|
readonly issueRegistration: <A>(input: {
|
|
120
83
|
readonly ceremony: PasskeyCeremony;
|
|
121
|
-
readonly policy: PasskeyMethodPolicy;
|
|
122
84
|
readonly registration: R;
|
|
123
85
|
}, prepare: PreparePasskeyCommit<PasskeyIssueDecision, A>) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;
|
|
124
86
|
readonly completeRegistration: <A>(input: {
|
|
125
|
-
readonly
|
|
87
|
+
readonly access: PasskeyAccess;
|
|
88
|
+
readonly ceremony: PasskeyCeremony;
|
|
126
89
|
readonly verified: PasskeyRegistrationVerified;
|
|
127
|
-
readonly nowMillis: number;
|
|
128
90
|
}, prepare: PreparePasskeyCommit<PasskeyRegistrationResult | {
|
|
129
91
|
readonly _tag: "Rejected";
|
|
130
92
|
}, A>) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;
|
|
@@ -132,26 +94,11 @@ export interface PasskeyRegistrationWriter<R> {
|
|
|
132
94
|
export interface PasskeyRegistrationServices<R> extends PasskeyPersistenceServices {
|
|
133
95
|
readonly passkeyRegistrationAuthority: PasskeyRegistrationWriter<R>;
|
|
134
96
|
}
|
|
135
|
-
export interface PasskeyRegistrationMapping<S extends TableModel, C extends TableModel, F extends TableModel,
|
|
136
|
-
readonly write: PasskeyWriteTables<S, C, F,
|
|
97
|
+
export interface PasskeyRegistrationMapping<S extends TableModel, C extends TableModel, F extends TableModel, Flow extends TableModel, N, R, Expression extends SqlExpression = SqlExpression> extends PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, N, Expression>, Flow, N, Expression, C> {
|
|
98
|
+
readonly write: PasskeyWriteTables<S, C, F, N, Expression>;
|
|
137
99
|
readonly flow: PasskeyFlowTable<Flow>;
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
readonly encodeInsert: (input: {
|
|
141
|
-
readonly ceremony: PasskeyCeremony;
|
|
142
|
-
readonly reservationId: string;
|
|
143
|
-
}) => H["insert"];
|
|
144
|
-
};
|
|
145
|
-
readonly intent: PasskeyRegistrationIntentReadTable<Intent, Expression> & {
|
|
146
|
-
readonly pendingState: unknown;
|
|
147
|
-
readonly acceptedState: unknown;
|
|
148
|
-
readonly rejectedState: unknown;
|
|
149
|
-
readonly encodeInsert: (input: {
|
|
150
|
-
readonly ceremony: PasskeyCeremony;
|
|
151
|
-
readonly registration: R;
|
|
152
|
-
readonly reservationId: string;
|
|
153
|
-
}) => Intent["insert"];
|
|
154
|
-
};
|
|
100
|
+
/** Schema-encoded original registration payload on the same immutable flow row. */
|
|
101
|
+
readonly applicationSnapshot: PasskeyColumn<Flow>;
|
|
155
102
|
/** Consumer-owned data and identity, synchronously encoded inside the owner. A SQL-local registration creates no session and needs no email address. */
|
|
156
103
|
readonly registration: {
|
|
157
104
|
readonly schema: Schema.Codec<R, unknown, never, never>;
|
|
@@ -162,12 +109,13 @@ export interface PasskeyRegistrationMapping<S extends TableModel, C extends Tabl
|
|
|
162
109
|
readonly eligible: (registration: R) => Expression;
|
|
163
110
|
/** Commit-time application policy after provisioning. Unlike `eligible`, this
|
|
164
111
|
* must permit the newly created subject and retain every mutable prerequisite.
|
|
165
|
-
*
|
|
166
|
-
* owners serialize revocation through commit; this predicate alone is not a lock. */
|
|
112
|
+
* Subject-local prerequisites are checked under its lock. */
|
|
167
113
|
readonly finalEligibility: (input: {
|
|
168
114
|
readonly registration: R;
|
|
169
115
|
readonly subjectId: N;
|
|
170
116
|
}) => Expression;
|
|
117
|
+
/** D1 plans require explicit subject identity, status, and security revision
|
|
118
|
+
* values; they cannot read database defaults before the atomic batch runs. */
|
|
171
119
|
readonly subject: (input: {
|
|
172
120
|
readonly registration: R;
|
|
173
121
|
readonly ceremony: PasskeyCeremony;
|
|
@@ -178,12 +126,6 @@ export interface PasskeyRegistrationMapping<S extends TableModel, C extends Tabl
|
|
|
178
126
|
};
|
|
179
127
|
readonly activeStatus: unknown;
|
|
180
128
|
};
|
|
181
|
-
readonly registrationConstraints: typeof requiredPasskeyRegistrationWriteConstraints;
|
|
182
129
|
}
|
|
183
|
-
export declare const requiredPasskeyRegistrationWriteConstraints: {
|
|
184
|
-
readonly intentFlow: readonly ["moduleId", "flowId"];
|
|
185
|
-
readonly intentCommand: readonly ["moduleId", "commandId"];
|
|
186
|
-
readonly handle: readonly ["handleKey"];
|
|
187
|
-
};
|
|
188
130
|
//#endregion
|
|
189
131
|
//# sourceMappingURL=passkey-write-model.d.mts.map
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
//#region src/internal/models/passkey-write-model.ts
|
|
2
2
|
/** Same-owner updates for consumer session/pending tables. No external effects or callbacks after commit. */
|
|
3
3
|
const passkeyInvalidationMutation = (input) => input;
|
|
4
|
-
const requiredPasskeyManagementConstraints = { command: ["moduleId", "commandId"] };
|
|
5
|
-
const requiredPasskeyRegistrationWriteConstraints = {
|
|
6
|
-
intentFlow: ["moduleId", "flowId"],
|
|
7
|
-
intentCommand: ["moduleId", "commandId"],
|
|
8
|
-
handle: ["handleKey"]
|
|
9
|
-
};
|
|
10
4
|
//#endregion
|
|
11
|
-
export { passkeyInvalidationMutation
|
|
5
|
+
export { passkeyInvalidationMutation };
|
|
12
6
|
|
|
13
7
|
//# sourceMappingURL=passkey-write-model.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey-write-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-write-model.ts"],"sourcesContent":["import type { PreparedCommit } from \"@yielded/auth/Hooks\";\nimport type {\n PasskeyUnavailable,\n PasskeyActionAuthorization,\n PasskeyCeremony,\n PasskeyClaim,\n PasskeyCredential,\n PasskeyCredentialSummary,\n PasskeyIssueDecision,\n PasskeyRegistrationResult,\n PasskeyRegistrationVerified,\n PasskeyRequirement,\n PasskeyRevision,\n PasskeyManagementPersistence,\n PreparePasskeyCommit,\n PasskeyManagementPolicy,\n PasskeyMethodPolicy,\n} from \"@yielded/auth/Passkey\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { SessionInvalidationWindow } from \"@yielded/auth/Sessions\";\nimport type { Effect, Schema } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { PersistenceMappingError } from \"./common\";\nimport type {\n PasskeyColumn,\n PasskeyCredentialMapping,\n PasskeyFlowTable,\n PasskeyHandleReservationTable,\n PasskeyPersistenceMapping,\n PasskeyPersistenceServices,\n} from \"./passkey-model\";\nimport type { PasskeyRegistrationIntentReadTable } from \"./passkey-registration-ceremony-model\";\n\nexport interface PasskeyCredentialInsert<N> {\n readonly subjectId: N;\n readonly credential: PasskeyCredential;\n readonly summary: PasskeyCredentialSummary;\n readonly marker: string;\n}\n\nexport interface PasskeyWriteTables<\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly credential: {\n readonly name: PasskeyColumn<C>;\n readonly createdAt: PasskeyColumn<C>;\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => C[\"insert\"];\n readonly encodePrimarySignIn: (value: boolean) => unknown;\n readonly encodeEnrollmentUserVerified: (value: boolean) => unknown;\n readonly encodeBackupEligible: (value: boolean) => unknown;\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n readonly authority: {\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => F[\"insert\"];\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n readonly credentialOwnership: {\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => O[\"insert\"];\n readonly ownedState: unknown;\n readonly removedState: unknown;\n };\n readonly handleOwnership: {\n readonly encodeInsert: (input: {\n readonly subjectId: N;\n readonly rpId: string;\n readonly userHandle: string;\n readonly marker: string;\n }) => H[\"insert\"];\n readonly ownedState: unknown;\n };\n /** All mutable policy dependencies must be subject columns or declared module guards. */\n readonly policy: {\n readonly subjectColumns: ReadonlyArray<PasskeyColumn<S>>;\n readonly management: (row: Readonly<Partial<S[\"select\"]>>) => PasskeyManagementPolicy;\n readonly requirement: (\n row: Readonly<Partial<S[\"select\"]>>,\n action: PasskeyActionAuthorization[\"challenge\"][\"action\"],\n ) => Effect.Effect<typeof PasskeyRequirement.Type, PersistenceMappingError>;\n readonly metadata: (subjectId: N) => Expression;\n readonly action: (subjectId: N, authorization: PasskeyActionAuthorization) => Expression;\n /** Usable primary/recovery path AND required remaining factors. Evaluated with the target excluded, before and after removal. Connected grants/factor-only credentials are not primary paths. */\n readonly remainingSignIn: (\n subjectId: N,\n removedCredentialId: string,\n row: Readonly<Partial<S[\"select\"]>>,\n ) => Effect.Effect<Expression, PersistenceMappingError>;\n };\n}\n\nexport interface PasskeyInvalidationInput<N> {\n readonly subjectId: N;\n readonly previousRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly securityRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly invalidation: SessionInvalidationWindow;\n}\n\nexport interface PasskeyInvalidationMutation<N, Expression extends SqlExpression = SqlExpression> {\n readonly table: object;\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Readonly<Record<string, unknown>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}\n\n/** Same-owner updates for consumer session/pending tables. No external effects or callbacks after commit. */\nexport const passkeyInvalidationMutation = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(input: {\n readonly table: T[\"table\"];\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Partial<T[\"insert\"]>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}): PasskeyInvalidationMutation<N, Expression> => input;\n\nexport interface PasskeyCommandTable<T extends Table, N> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly commandId: PasskeyColumn<T>;\n readonly subjectId: PasskeyColumn<T>;\n readonly credentialId: PasskeyColumn<T>;\n readonly intent: PasskeyColumn<T>;\n readonly decision: PasskeyColumn<T>;\n readonly retentionUntil: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly subjectId: N;\n readonly credentialId: string;\n }) => T[\"insert\"];\n}\n\nexport interface PasskeyManagementMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n A extends Table,\n Charge extends Table,\n Command extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N, Expression>,\n M,\n Flow,\n A,\n Charge,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, O, H, N, Expression>;\n readonly command: PasskeyCommandTable<Command, N>;\n readonly managementConstraints: typeof requiredPasskeyManagementConstraints;\n /** Removal must match the installed session strategy and change the subject revision; immediate sessions must consult that authority or be updated here. Enrollment preserves existing authentication. */\n readonly invalidation: {\n readonly window: SessionInvalidationWindow;\n readonly mutations: ReadonlyArray<PasskeyInvalidationMutation<N, Expression>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n };\n}\n\nexport const requiredPasskeyManagementConstraints = { command: [\"moduleId\", \"commandId\"] } as const;\n\nexport interface PasskeyManagementServices extends PasskeyPersistenceServices {\n readonly passkeyManagementPersistence: PasskeyManagementPersistence[\"Service\"];\n}\n\nexport interface PasskeyRegistrationWriter<R> {\n readonly inspect: (registration: R) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n readonly name: string;\n readonly displayName: string;\n },\n PasskeyUnavailable\n >;\n readonly issueRegistration: <A>(\n input: {\n readonly ceremony: PasskeyCeremony;\n readonly policy: PasskeyMethodPolicy;\n readonly registration: R;\n },\n prepare: PreparePasskeyCommit<PasskeyIssueDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n readonly completeRegistration: <A>(\n input: {\n readonly claim: PasskeyClaim;\n readonly verified: PasskeyRegistrationVerified;\n readonly nowMillis: number;\n },\n prepare: PreparePasskeyCommit<\n | PasskeyRegistrationResult\n | {\n readonly _tag: \"Rejected\";\n },\n A\n >,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n}\n\nexport interface PasskeyRegistrationServices<R> extends PasskeyPersistenceServices {\n readonly passkeyRegistrationAuthority: PasskeyRegistrationWriter<R>;\n}\n\nexport interface PasskeyRegistrationMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n A extends Table,\n Charge extends Table,\n Intent extends Table,\n N,\n R,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N, Expression>,\n M,\n Flow,\n A,\n Charge,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, O, H, N, Expression>;\n readonly flow: PasskeyFlowTable<Flow>;\n readonly handle: PasskeyHandleReservationTable<H, Expression> & {\n readonly reservedState: unknown;\n readonly encodeInsert: (input: {\n readonly ceremony: PasskeyCeremony;\n readonly reservationId: string;\n }) => H[\"insert\"];\n };\n readonly intent: PasskeyRegistrationIntentReadTable<Intent, Expression> & {\n readonly pendingState: unknown;\n readonly acceptedState: unknown;\n readonly rejectedState: unknown;\n readonly encodeInsert: (input: {\n readonly ceremony: PasskeyCeremony;\n readonly registration: R;\n readonly reservationId: string;\n }) => Intent[\"insert\"];\n };\n /** Consumer-owned data and identity, synchronously encoded inside the owner. A SQL-local registration creates no session and needs no email address. */\n readonly registration: {\n readonly schema: Schema.Codec<R, unknown, never, never>;\n readonly describe: (registration: R) => {\n readonly name: string;\n readonly displayName: string;\n };\n readonly eligible: (registration: R) => Expression;\n /** Commit-time application policy after provisioning. Unlike `eligible`, this\n * must permit the newly created subject and retain every mutable prerequisite.\n * Declare mutable external policy rows in module.guards so native locking\n * owners serialize revocation through commit; this predicate alone is not a lock. */\n readonly finalEligibility: (input: {\n readonly registration: R;\n readonly subjectId: N;\n }) => Expression;\n readonly subject: (input: {\n readonly registration: R;\n readonly ceremony: PasskeyCeremony;\n readonly marker: string;\n }) => {\n readonly subjectId: N;\n readonly values: S[\"insert\"];\n };\n readonly activeStatus: unknown;\n };\n readonly registrationConstraints: typeof requiredPasskeyRegistrationWriteConstraints;\n}\n\nexport const requiredPasskeyRegistrationWriteConstraints = {\n intentFlow: [\"moduleId\", \"flowId\"],\n intentCommand: [\"moduleId\", \"commandId\"],\n handle: [\"handleKey\"],\n} as const;\n"],"mappings":";;AAiHA,MAAa,+BAIX,UAKgD;AAsDlD,MAAa,uCAAuC,EAAE,SAAS,CAAC,YAAY,WAAW,EAAE;AAoHzF,MAAa,8CAA8C;CACzD,YAAY,CAAC,YAAY,QAAQ;CACjC,eAAe,CAAC,YAAY,WAAW;CACvC,QAAQ,CAAC,WAAW;AACtB"}
|
|
1
|
+
{"version":3,"file":"passkey-write-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-write-model.ts"],"sourcesContent":["import type { PreparedCommit } from \"@yielded/auth/Hooks\";\nimport type {\n PasskeyUnavailable,\n PasskeyActionAuthorization,\n PasskeyCeremony,\n PasskeyAccess,\n PasskeyCredential,\n PasskeyCredentialSummary,\n PasskeyIssueDecision,\n PasskeyRegistrationResult,\n PasskeyRegistrationVerified,\n PasskeyRequirement,\n PasskeyRevision,\n PasskeyManagementPersistence,\n PreparePasskeyCommit,\n PasskeyManagementPolicy,\n} from \"@yielded/auth/Passkey\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { SessionInvalidationWindow } from \"@yielded/auth/Sessions\";\nimport type { Effect, Schema } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError } from \"./common\";\nimport type {\n PasskeyColumn,\n PasskeyCredentialMapping,\n PasskeyFlowTable,\n PasskeyPersistenceMapping,\n PasskeyPersistenceServices,\n} from \"./passkey-model\";\n\nexport interface PasskeyCredentialInsert<N> {\n readonly subjectId: N;\n readonly credential: PasskeyCredential;\n readonly summary: PasskeyCredentialSummary;\n readonly marker: string;\n}\n\nexport interface PasskeyWriteTables<\n S extends Table,\n C extends Table,\n F extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly credential: {\n readonly name: PasskeyColumn<C>;\n readonly createdAt: PasskeyColumn<C>;\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => C[\"insert\"];\n readonly encodePrimarySignIn: (value: boolean) => unknown;\n readonly encodeEnrollmentUserVerified: (value: boolean) => unknown;\n readonly encodeBackupEligible: (value: boolean) => unknown;\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n readonly authority: {\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => F[\"insert\"];\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n /** Mutable management policy dependencies belong to the locked subject row. */\n readonly policy: {\n readonly subjectColumns: ReadonlyArray<PasskeyColumn<S>>;\n readonly management: (row: Readonly<Partial<S[\"select\"]>>) => PasskeyManagementPolicy;\n readonly requirement: (\n row: Readonly<Partial<S[\"select\"]>>,\n action: PasskeyActionAuthorization[\"challenge\"][\"action\"],\n ) => Effect.Effect<typeof PasskeyRequirement.Type, PersistenceMappingError>;\n readonly metadata: (subjectId: N) => Expression;\n readonly action: (subjectId: N, authorization: PasskeyActionAuthorization) => Expression;\n /** Usable primary/recovery path AND required remaining factors. Evaluated with the target excluded, before and after removal. Connected grants/factor-only credentials are not primary paths. */\n readonly remainingSignIn: (\n subjectId: N,\n removedCredentialId: string,\n row: Readonly<Partial<S[\"select\"]>>,\n ) => Effect.Effect<Expression, PersistenceMappingError>;\n };\n}\n\nexport interface PasskeyInvalidationInput<N> {\n readonly subjectId: N;\n readonly previousRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly securityRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly invalidation: SessionInvalidationWindow;\n}\n\nexport interface PasskeyInvalidationMutation<N, Expression extends SqlExpression = SqlExpression> {\n readonly table: object;\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Readonly<Record<string, unknown>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}\n\n/** Same-owner updates for consumer session/pending tables. No external effects or callbacks after commit. */\nexport const passkeyInvalidationMutation = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(input: {\n readonly table: T[\"table\"];\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Partial<T[\"insert\"]>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}): PasskeyInvalidationMutation<N, Expression> => input;\n\nexport interface PasskeyManagementMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n Flow extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, N, Expression>,\n Flow,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, N, Expression>;\n /** Removal must match the installed session strategy and change the subject revision; immediate sessions must consult that authority or be updated here. Enrollment preserves existing authentication. */\n readonly invalidation: {\n readonly window: SessionInvalidationWindow;\n readonly mutations: ReadonlyArray<PasskeyInvalidationMutation<N, Expression>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n };\n}\n\nexport interface PasskeyManagementServices extends PasskeyPersistenceServices {\n readonly passkeyManagementPersistence: PasskeyManagementPersistence[\"Service\"];\n}\n\nexport interface PasskeyRegistrationWriter<R> {\n readonly inspect: (registration: R) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n readonly name: string;\n readonly displayName: string;\n },\n PasskeyUnavailable\n >;\n readonly issueRegistration: <A>(\n input: {\n readonly ceremony: PasskeyCeremony;\n readonly registration: R;\n },\n prepare: PreparePasskeyCommit<PasskeyIssueDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n readonly completeRegistration: <A>(\n input: {\n readonly access: PasskeyAccess;\n readonly ceremony: PasskeyCeremony;\n readonly verified: PasskeyRegistrationVerified;\n },\n prepare: PreparePasskeyCommit<\n | PasskeyRegistrationResult\n | {\n readonly _tag: \"Rejected\";\n },\n A\n >,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n}\n\nexport interface PasskeyRegistrationServices<R> extends PasskeyPersistenceServices {\n readonly passkeyRegistrationAuthority: PasskeyRegistrationWriter<R>;\n}\n\nexport interface PasskeyRegistrationMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n Flow extends Table,\n N,\n R,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, N, Expression>,\n Flow,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, N, Expression>;\n readonly flow: PasskeyFlowTable<Flow>;\n /** Schema-encoded original registration payload on the same immutable flow row. */\n readonly applicationSnapshot: PasskeyColumn<Flow>;\n /** Consumer-owned data and identity, synchronously encoded inside the owner. A SQL-local registration creates no session and needs no email address. */\n readonly registration: {\n readonly schema: Schema.Codec<R, unknown, never, never>;\n readonly describe: (registration: R) => {\n readonly name: string;\n readonly displayName: string;\n };\n readonly eligible: (registration: R) => Expression;\n /** Commit-time application policy after provisioning. Unlike `eligible`, this\n * must permit the newly created subject and retain every mutable prerequisite.\n * Subject-local prerequisites are checked under its lock. */\n readonly finalEligibility: (input: {\n readonly registration: R;\n readonly subjectId: N;\n }) => Expression;\n /** D1 plans require explicit subject identity, status, and security revision\n * values; they cannot read database defaults before the atomic batch runs. */\n readonly subject: (input: {\n readonly registration: R;\n readonly ceremony: PasskeyCeremony;\n readonly marker: string;\n }) => {\n readonly subjectId: N;\n readonly values: S[\"insert\"];\n };\n readonly activeStatus: unknown;\n };\n}\n"],"mappings":";;AA8FA,MAAa,+BAIX,UAKgD"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { AnyTableModel, SqlExpression, TableModel } from "../table-model.mjs";
|
|
1
2
|
import { PersistenceMappingError } from "../mapping-error.mjs";
|
|
2
|
-
import { AnyTableModel, SqlExpression, TableModel } from "../query-operations.mjs";
|
|
3
3
|
import { SubjectIdCodec } from "./common.mjs";
|
|
4
|
+
import { ProofClock } from "./proof-model.mjs";
|
|
4
5
|
import { Effect, Redacted } from "effect";
|
|
6
|
+
import { EncodedPasswordHash, PasswordAction, PasswordCredentialSnapshot, PasswordReplacement } from "@yielded/auth/Password";
|
|
5
7
|
import { AuthenticationRequirement, SecurityRevision } from "@yielded/auth/Sessions";
|
|
6
|
-
import {
|
|
7
|
-
import { LoginIdentifier, RecoveryReference } from "@yielded/auth/Identity";
|
|
8
|
+
import { LoginIdentifier } from "@yielded/auth/Identity";
|
|
8
9
|
//#region src/internal/models/password-model.d.ts
|
|
9
10
|
type ColumnKey<T extends TableModel> = T["column"];
|
|
10
11
|
export interface PasswordSubjectTable<Subject extends TableModel, _NativeSubjectId> {
|
|
@@ -82,48 +83,19 @@ export interface PasswordCredentialTable<Subject extends TableModel, Identifier
|
|
|
82
83
|
readonly credential: Credential["select"];
|
|
83
84
|
}) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;
|
|
84
85
|
}
|
|
85
|
-
export interface PasswordCommandTable<Command extends TableModel> {
|
|
86
|
-
readonly table: Command["table"];
|
|
87
|
-
readonly moduleId: ColumnKey<Command>;
|
|
88
|
-
readonly commandId: ColumnKey<Command>;
|
|
89
|
-
readonly action: ColumnKey<Command>;
|
|
90
|
-
readonly bindingDigest: ColumnKey<Command>;
|
|
91
|
-
readonly decision: ColumnKey<Command>;
|
|
92
|
-
readonly retentionUntil: ColumnKey<Command>;
|
|
93
|
-
readonly encodeInsert: (input: {
|
|
94
|
-
readonly moduleId: string;
|
|
95
|
-
readonly commandId: string;
|
|
96
|
-
readonly action: string;
|
|
97
|
-
readonly bindingDigest: string;
|
|
98
|
-
readonly decision: "changed";
|
|
99
|
-
readonly retentionUntilMillis: number;
|
|
100
|
-
}) => Command["insert"];
|
|
101
|
-
}
|
|
102
86
|
export interface RequiredPasswordConstraints {
|
|
103
87
|
readonly identifier: "unique(identifier.namespace,identifier.value)";
|
|
104
88
|
readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
|
|
105
89
|
readonly credentialSubject: "unique(credential.moduleId,credential.subjectId)";
|
|
106
90
|
readonly credentialId: "unique(credential.moduleId,credential.credentialId)";
|
|
107
|
-
readonly command: "unique(command.moduleId,command.commandId)";
|
|
108
91
|
}
|
|
109
92
|
export declare const requiredPasswordConstraints: RequiredPasswordConstraints;
|
|
110
|
-
export interface
|
|
111
|
-
/** Match only the mapped command uniqueness constraint. */
|
|
112
|
-
readonly isCommandConflict: (cause: unknown) => boolean;
|
|
113
|
-
}
|
|
114
|
-
export interface PasswordD1Clock<Expression extends SqlExpression = SqlExpression> {
|
|
115
|
-
readonly engineNow: Expression;
|
|
116
|
-
readonly engineNowMillis: Expression;
|
|
117
|
-
readonly engineInstantMinus: (millis: number) => Expression;
|
|
118
|
-
readonly engineInstantPlus: (millis: number) => Expression;
|
|
119
|
-
}
|
|
120
|
-
export interface PasswordPersistenceMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Command extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> extends PasswordConstraintClassifier {
|
|
93
|
+
export interface PasswordPersistenceMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> {
|
|
121
94
|
readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;
|
|
122
95
|
readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;
|
|
123
96
|
readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;
|
|
124
97
|
/** Every factor revision named by action evidence, including non-password factors. */
|
|
125
98
|
readonly authorityCredential: PasswordAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
|
|
126
|
-
readonly command: PasswordCommandTable<Command>;
|
|
127
99
|
readonly subjectId: SubjectIdCodec<NativeSubjectId>;
|
|
128
100
|
readonly constraints: RequiredPasswordConstraints;
|
|
129
101
|
readonly encodeInstant: (epochMillis: number) => unknown;
|
|
@@ -132,27 +104,14 @@ export interface PasswordPersistenceMapping<Subject extends TableModel, Identifi
|
|
|
132
104
|
readonly allocateCredentialIdSync?: () => string;
|
|
133
105
|
readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
|
|
134
106
|
readonly allocateRevisionSync?: () => SecurityRevision;
|
|
135
|
-
|
|
136
|
-
|
|
107
|
+
/** All semantic replacements still bump subject revision. This flag declares
|
|
108
|
+
* authoritative verification's invalidation latency; cookie exposure is separate. */
|
|
137
109
|
readonly sessionInvalidation: "same-authority-immediate" | "original-absolute-expiry";
|
|
138
|
-
readonly
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
readonly d1: PasswordD1Clock<Expression>;
|
|
142
|
-
readonly subject: PasswordSubjectTable<Subject, NativeSubjectId> & {
|
|
143
|
-
readonly d1ActiveStatusValue: unknown;
|
|
110
|
+
readonly clock: ProofClock<Expression>;
|
|
111
|
+
readonly d1?: {
|
|
112
|
+
readonly primary: true;
|
|
144
113
|
};
|
|
145
|
-
|
|
146
|
-
readonly d1CurrentCondition: (input: {
|
|
147
|
-
readonly identifier: LoginIdentifier;
|
|
148
|
-
readonly nativeSubjectId: NativeSubjectId;
|
|
149
|
-
}) => Expression;
|
|
150
|
-
};
|
|
151
|
-
readonly authorityCredential: PasswordAuthorityCredentialTable<AuthorityCredential, NativeSubjectId> & {
|
|
152
|
-
readonly d1ActiveStatusValue: unknown;
|
|
153
|
-
};
|
|
154
|
-
};
|
|
155
|
-
export type PasswordRegistrationState = "pending" | "created";
|
|
114
|
+
}
|
|
156
115
|
export interface PasswordRegistrationIntent<Registration> {
|
|
157
116
|
readonly moduleId: string;
|
|
158
117
|
readonly requestId: string;
|
|
@@ -160,23 +119,6 @@ export interface PasswordRegistrationIntent<Registration> {
|
|
|
160
119
|
readonly registration: Registration;
|
|
161
120
|
readonly replacement: PasswordReplacement;
|
|
162
121
|
}
|
|
163
|
-
export interface PasswordRegistrationTable<Registration, Request extends TableModel, NativeSubjectId> {
|
|
164
|
-
readonly table: Request["table"];
|
|
165
|
-
readonly moduleId: ColumnKey<Request>;
|
|
166
|
-
readonly requestId: ColumnKey<Request>;
|
|
167
|
-
readonly state: ColumnKey<Request>;
|
|
168
|
-
readonly subjectId: ColumnKey<Request>;
|
|
169
|
-
readonly recoveryReference: ColumnKey<Request>;
|
|
170
|
-
readonly encodeInsert: (input: PasswordRegistrationIntent<Registration>, state: {
|
|
171
|
-
readonly state: PasswordRegistrationState;
|
|
172
|
-
readonly nativeSubjectId?: NativeSubjectId;
|
|
173
|
-
readonly recoveryReference?: typeof RecoveryReference.Type;
|
|
174
|
-
}) => Request["insert"];
|
|
175
|
-
/** Replay projection must never expose a stored subject or decode protected intent. */
|
|
176
|
-
readonly decodeReplay: (row: Request["select"]) => Effect.Effect<Exclude<PasswordRegistrationDecision, {
|
|
177
|
-
readonly _tag: "Created";
|
|
178
|
-
}>, PersistenceMappingError>;
|
|
179
|
-
}
|
|
180
122
|
export interface PasswordRegistrationProvisioning<Registration, Subject extends TableModel, NativeSubjectId> {
|
|
181
123
|
readonly encodeSubjectInsert: (input: PasswordRegistrationIntent<Registration>, values: {
|
|
182
124
|
readonly nativeSubjectId: NativeSubjectId | undefined;
|
|
@@ -188,31 +130,27 @@ export interface PasswordRegistrationProvisioning<Registration, Subject extends
|
|
|
188
130
|
readonly decodeGeneratedId?: (rows: ReadonlyArray<unknown>) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;
|
|
189
131
|
}
|
|
190
132
|
export interface RequiredPasswordRegistrationConstraints {
|
|
191
|
-
readonly request: "unique(registration.moduleId,registration.requestId)";
|
|
192
|
-
readonly recoveryReference: "unique(registration.recoveryReference)";
|
|
193
133
|
readonly identifier: "unique(identifier.namespace,identifier.value)";
|
|
194
134
|
readonly credentialSubject: "unique(credential.moduleId,credential.subjectId)";
|
|
195
135
|
readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
|
|
196
136
|
}
|
|
197
137
|
export declare const requiredPasswordRegistrationConstraints: RequiredPasswordRegistrationConstraints;
|
|
198
138
|
export interface PasswordRegistrationConstraintClassifier {
|
|
199
|
-
readonly isRequestConflict: (cause: unknown) => boolean;
|
|
200
139
|
readonly isIdentifierConflict: (cause: unknown) => boolean;
|
|
201
140
|
readonly isCredentialConflict: (cause: unknown) => boolean;
|
|
202
141
|
}
|
|
203
|
-
export type PasswordRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel,
|
|
142
|
+
export type PasswordRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = PasswordRegistrationConstraintClassifier & {
|
|
204
143
|
readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;
|
|
205
144
|
readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;
|
|
206
145
|
readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;
|
|
207
146
|
readonly authorityCredential: PasswordAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
|
|
208
|
-
readonly registration: PasswordRegistrationTable<Registration, Request, NativeSubjectId>;
|
|
209
147
|
readonly subjectId: SubjectIdCodec<NativeSubjectId>;
|
|
210
148
|
readonly constraints: RequiredPasswordRegistrationConstraints;
|
|
211
149
|
readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;
|
|
212
150
|
readonly allocateCredentialIdSync?: () => string;
|
|
213
151
|
readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
|
|
214
152
|
readonly allocateRevisionSync?: () => SecurityRevision;
|
|
215
|
-
} &
|
|
153
|
+
} & {
|
|
216
154
|
readonly mode: "atomic";
|
|
217
155
|
readonly provisioning: PasswordRegistrationProvisioning<Registration, Subject, NativeSubjectId> & ({
|
|
218
156
|
readonly idMode: "allocated";
|
|
@@ -224,12 +162,8 @@ export type PasswordRegistrationMapping<Registration, Subject extends TableModel
|
|
|
224
162
|
readonly idMode: "generated";
|
|
225
163
|
readonly decodeGeneratedId: (rows: ReadonlyArray<unknown>) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;
|
|
226
164
|
});
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
readonly allocateRecoveryReferenceSync?: () => typeof RecoveryReference.Type;
|
|
231
|
-
});
|
|
232
|
-
export type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> = PasswordPersistenceMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
233
|
-
export type AnyPasswordRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = PasswordRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
165
|
+
};
|
|
166
|
+
export type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> = PasswordPersistenceMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
167
|
+
export type AnyPasswordRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = PasswordRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
234
168
|
//#endregion
|
|
235
169
|
//# sourceMappingURL=password-model.d.mts.map
|
|
@@ -4,12 +4,9 @@ const requiredPasswordConstraints = {
|
|
|
4
4
|
identifier: "unique(identifier.namespace,identifier.value)",
|
|
5
5
|
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
|
|
6
6
|
credentialSubject: "unique(credential.moduleId,credential.subjectId)",
|
|
7
|
-
credentialId: "unique(credential.moduleId,credential.credentialId)"
|
|
8
|
-
command: "unique(command.moduleId,command.commandId)"
|
|
7
|
+
credentialId: "unique(credential.moduleId,credential.credentialId)"
|
|
9
8
|
};
|
|
10
9
|
const requiredPasswordRegistrationConstraints = {
|
|
11
|
-
request: "unique(registration.moduleId,registration.requestId)",
|
|
12
|
-
recoveryReference: "unique(registration.recoveryReference)",
|
|
13
10
|
identifier: "unique(identifier.namespace,identifier.value)",
|
|
14
11
|
credentialSubject: "unique(credential.moduleId,credential.subjectId)",
|
|
15
12
|
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-model.mjs","names":[],"sources":["../../../src/internal/models/password-model.ts"],"sourcesContent":["import { type RecoveryReference, type LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type {\n PasswordAction,\n PasswordCredentialSnapshot,\n PasswordReplacement,\n PasswordRegistrationDecision,\n EncodedPasswordHash,\n} from \"@yielded/auth/Password\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect, Redacted } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\n\ntype ColumnKey<T extends Table> = T[\"column\"];\n\nexport interface PasswordSubjectTable<Subject extends Table, _NativeSubjectId> {\n readonly table: Subject[\"table\"];\n readonly id: ColumnKey<Subject>;\n readonly status: ColumnKey<Subject>;\n readonly securityRevision: ColumnKey<Subject>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly decodeRequirement: (\n row: Subject[\"select\"],\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n /** Current policy for this exact credential mutation, decoded under the subject lock. */\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: PasswordAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n /** Required only by D1 conditional statements. */\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface PasswordIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n /** Consumer-owned current login/recovery eligibility, including row status. */\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n /** Required by D1 so current ownership/eligibility is rechecked in the batch. */\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n readonly encodeInitialInsert: (\n identifier: LoginIdentifier,\n subjectId: NativeSubjectId,\n bindingRevision: SecurityRevision,\n ) => Identifier[\"insert\"];\n}\n\nexport interface PasswordAuthorityCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status?: ColumnKey<Credential>;\n readonly isActiveStatus?: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeRevision: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n}\n\nexport interface PasswordCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly verifierVersion: ColumnKey<Credential>;\n readonly verifier: ColumnKey<Credential>;\n readonly normalization: ColumnKey<Credential>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n readonly replacement: PasswordReplacement;\n }) => Credential[\"insert\"];\n readonly encodeVerifier: (\n verifier: Redacted.Redacted<EncodedPasswordHash>,\n verifierVersion: SecurityRevision,\n ) => Partial<Credential[\"insert\"]>;\n readonly encodeReplacement: (input: {\n readonly replacement: PasswordReplacement;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly decode: (input: {\n readonly moduleId: string;\n readonly subject: Subject[\"select\"];\n readonly identifier: Identifier[\"select\"];\n readonly credential: Credential[\"select\"];\n }) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;\n}\n\nexport interface PasswordCommandTable<Command extends Table> {\n readonly table: Command[\"table\"];\n readonly moduleId: ColumnKey<Command>;\n readonly commandId: ColumnKey<Command>;\n readonly action: ColumnKey<Command>;\n readonly bindingDigest: ColumnKey<Command>;\n readonly decision: ColumnKey<Command>;\n readonly retentionUntil: ColumnKey<Command>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly action: string;\n readonly bindingDigest: string;\n readonly decision: \"changed\";\n readonly retentionUntilMillis: number;\n }) => Command[\"insert\"];\n}\n\nexport interface RequiredPasswordConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly credentialId: \"unique(credential.moduleId,credential.credentialId)\";\n readonly command: \"unique(command.moduleId,command.commandId)\";\n}\n\nexport const requiredPasswordConstraints: RequiredPasswordConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n credentialId: \"unique(credential.moduleId,credential.credentialId)\",\n command: \"unique(command.moduleId,command.commandId)\",\n};\n\nexport interface PasswordConstraintClassifier {\n /** Match only the mapped command uniqueness constraint. */\n readonly isCommandConflict: (cause: unknown) => boolean;\n}\n\nexport interface PasswordD1Clock<Expression extends SqlExpression = SqlExpression> {\n readonly engineNow: Expression;\n readonly engineNowMillis: Expression;\n readonly engineInstantMinus: (millis: number) => Expression;\n readonly engineInstantPlus: (millis: number) => Expression;\n}\n\nexport interface PasswordPersistenceMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Command extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends PasswordConstraintClassifier {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n /** Every factor revision named by action evidence, including non-password factors. */\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly command: PasswordCommandTable<Command>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordConstraints;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly commandRetentionMillis: number;\n /** All semantic replacements still bump subject revision. This flag only declares bearer invalidation latency. */\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly d1?: PasswordD1Clock<Expression>;\n}\n\nexport type D1PasswordPersistenceMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Command extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordPersistenceMapping<\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n Command,\n NativeSubjectId,\n Expression\n> & {\n readonly d1: PasswordD1Clock<Expression>;\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId> & {\n readonly d1ActiveStatusValue: unknown;\n };\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression> & {\n readonly d1CurrentCondition: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n };\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n > & {\n readonly d1ActiveStatusValue: unknown;\n };\n};\n\nexport type PasswordRegistrationState = \"pending\" | \"created\";\n\nexport interface PasswordRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly replacement: PasswordReplacement;\n}\n\nexport interface PasswordRegistrationTable<Registration, Request extends Table, NativeSubjectId> {\n readonly table: Request[\"table\"];\n readonly moduleId: ColumnKey<Request>;\n readonly requestId: ColumnKey<Request>;\n readonly state: ColumnKey<Request>;\n readonly subjectId: ColumnKey<Request>;\n readonly recoveryReference: ColumnKey<Request>;\n readonly encodeInsert: (\n input: PasswordRegistrationIntent<Registration>,\n state: {\n readonly state: PasswordRegistrationState;\n readonly nativeSubjectId?: NativeSubjectId;\n readonly recoveryReference?: typeof RecoveryReference.Type;\n },\n ) => Request[\"insert\"];\n /** Replay projection must never expose a stored subject or decode protected intent. */\n readonly decodeReplay: (row: Request[\"select\"]) => Effect.Effect<\n Exclude<\n PasswordRegistrationDecision,\n {\n readonly _tag: \"Created\";\n }\n >,\n PersistenceMappingError\n >;\n}\n\nexport interface PasswordRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: PasswordRegistrationIntent<Registration>,\n values: {\n readonly nativeSubjectId: NativeSubjectId | undefined;\n readonly securityRevision: SecurityRevision;\n },\n ) => Subject[\"insert\"];\n readonly allocateSubjectId?: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n readonly allocateSubjectIdSync?: () => NativeSubjectId;\n /** Interactive targets use this for database-generated/autoincrement keys. */\n readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface RequiredPasswordRegistrationConstraints {\n readonly request: \"unique(registration.moduleId,registration.requestId)\";\n readonly recoveryReference: \"unique(registration.recoveryReference)\";\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredPasswordRegistrationConstraints: RequiredPasswordRegistrationConstraints = {\n request: \"unique(registration.moduleId,registration.requestId)\",\n recoveryReference: \"unique(registration.recoveryReference)\",\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\nexport interface PasswordRegistrationConstraintClassifier {\n readonly isRequestConflict: (cause: unknown) => boolean;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n}\n\nexport type PasswordRegistrationMapping<\n Registration,\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Request extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationConstraintClassifier & {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly registration: PasswordRegistrationTable<Registration, Request, NativeSubjectId>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n} & (\n | {\n readonly mode: \"atomic\";\n readonly provisioning: PasswordRegistrationProvisioning<\n Registration,\n Subject,\n NativeSubjectId\n > &\n (\n | {\n readonly idMode: \"allocated\";\n readonly allocateSubjectId: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n | {\n readonly idMode: \"synchronous\";\n readonly allocateSubjectIdSync: () => NativeSubjectId;\n }\n | {\n readonly idMode: \"generated\";\n readonly decodeGeneratedId: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n );\n }\n | {\n readonly mode: \"pending\";\n readonly allocateRecoveryReference?: Effect.Effect<\n typeof RecoveryReference.Type,\n PersistenceMappingError\n >;\n readonly allocateRecoveryReferenceSync?: () => typeof RecoveryReference.Type;\n }\n );\n\nexport type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> =\n PasswordPersistenceMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyPasswordRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";;AAgJA,MAAa,8BAA2D;CACtE,YAAY;CACZ,qBAAqB;CACrB,mBAAmB;CACnB,cAAc;CACd,SAAS;AACX;AAkJA,MAAa,0CAAmF;CAC9F,SAAS;CACT,mBAAmB;CACnB,YAAY;CACZ,mBAAmB;CACnB,qBAAqB;AACvB"}
|
|
1
|
+
{"version":3,"file":"password-model.mjs","names":[],"sources":["../../../src/internal/models/password-model.ts"],"sourcesContent":["import { type LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type {\n PasswordAction,\n PasswordCredentialSnapshot,\n PasswordReplacement,\n EncodedPasswordHash,\n} from \"@yielded/auth/Password\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect, Redacted } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\nimport type { ProofClock } from \"./proof-model\";\n\ntype ColumnKey<T extends Table> = T[\"column\"];\n\nexport interface PasswordSubjectTable<Subject extends Table, _NativeSubjectId> {\n readonly table: Subject[\"table\"];\n readonly id: ColumnKey<Subject>;\n readonly status: ColumnKey<Subject>;\n readonly securityRevision: ColumnKey<Subject>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly decodeRequirement: (\n row: Subject[\"select\"],\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n /** Current policy for this exact credential mutation, decoded under the subject lock. */\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: PasswordAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n /** Required only by D1 conditional statements. */\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface PasswordIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n /** Consumer-owned current login/recovery eligibility, including row status. */\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n /** Required by D1 so current ownership/eligibility is rechecked in the batch. */\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n readonly encodeInitialInsert: (\n identifier: LoginIdentifier,\n subjectId: NativeSubjectId,\n bindingRevision: SecurityRevision,\n ) => Identifier[\"insert\"];\n}\n\nexport interface PasswordAuthorityCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status?: ColumnKey<Credential>;\n readonly isActiveStatus?: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeRevision: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n}\n\nexport interface PasswordCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly verifierVersion: ColumnKey<Credential>;\n readonly verifier: ColumnKey<Credential>;\n readonly normalization: ColumnKey<Credential>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n readonly replacement: PasswordReplacement;\n }) => Credential[\"insert\"];\n readonly encodeVerifier: (\n verifier: Redacted.Redacted<EncodedPasswordHash>,\n verifierVersion: SecurityRevision,\n ) => Partial<Credential[\"insert\"]>;\n readonly encodeReplacement: (input: {\n readonly replacement: PasswordReplacement;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly decode: (input: {\n readonly moduleId: string;\n readonly subject: Subject[\"select\"];\n readonly identifier: Identifier[\"select\"];\n readonly credential: Credential[\"select\"];\n }) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;\n}\n\nexport interface RequiredPasswordConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly credentialId: \"unique(credential.moduleId,credential.credentialId)\";\n}\n\nexport const requiredPasswordConstraints: RequiredPasswordConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n credentialId: \"unique(credential.moduleId,credential.credentialId)\",\n};\n\nexport interface PasswordPersistenceMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n /** Every factor revision named by action evidence, including non-password factors. */\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordConstraints;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n /** All semantic replacements still bump subject revision. This flag declares\n * authoritative verification's invalidation latency; cookie exposure is separate. */\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly clock: ProofClock<Expression>;\n readonly d1?: { readonly primary: true };\n}\n\nexport interface PasswordRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly replacement: PasswordReplacement;\n}\n\nexport interface PasswordRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: PasswordRegistrationIntent<Registration>,\n values: {\n readonly nativeSubjectId: NativeSubjectId | undefined;\n readonly securityRevision: SecurityRevision;\n },\n ) => Subject[\"insert\"];\n readonly allocateSubjectId?: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n readonly allocateSubjectIdSync?: () => NativeSubjectId;\n /** Interactive targets use this for database-generated/autoincrement keys. */\n readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface RequiredPasswordRegistrationConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredPasswordRegistrationConstraints: RequiredPasswordRegistrationConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\nexport interface PasswordRegistrationConstraintClassifier {\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n}\n\nexport type PasswordRegistrationMapping<\n Registration,\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationConstraintClassifier & {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n} & {\n readonly mode: \"atomic\";\n readonly provisioning: PasswordRegistrationProvisioning<Registration, Subject, NativeSubjectId> &\n (\n | {\n readonly idMode: \"allocated\";\n readonly allocateSubjectId: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n | {\n readonly idMode: \"synchronous\";\n readonly allocateSubjectIdSync: () => NativeSubjectId;\n }\n | {\n readonly idMode: \"generated\";\n readonly decodeGeneratedId: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n );\n};\n\nexport type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> =\n PasswordPersistenceMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyPasswordRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";;AA6HA,MAAa,8BAA2D;CACtE,YAAY;CACZ,qBAAqB;CACrB,mBAAmB;CACnB,cAAc;AAChB;AAmEA,MAAa,0CAAmF;CAC9F,YAAY;CACZ,mBAAmB;CACnB,qBAAqB;AACvB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { AnyTableModel, SqlExpression, TableModel } from "../table-model.mjs";
|
|
2
|
+
import { PersistenceMappingError } from "../mapping-error.mjs";
|
|
3
|
+
import "./common.mjs";
|
|
4
|
+
import { ProofPersistenceMapping } from "./proof-model.mjs";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import { PhoneLifecyclePolicy, PhoneNumber } from "@yielded/auth/PhoneOtp";
|
|
7
|
+
import { AuthenticationRequirement } from "@yielded/auth/Sessions";
|
|
8
|
+
import { SubjectId } from "@yielded/auth/Schema";
|
|
9
|
+
//#region src/internal/models/phone-model.d.ts
|
|
10
|
+
type PhoneColumn<T extends TableModel> = T["column"];
|
|
11
|
+
export declare const requiredPhoneConstraints: {
|
|
12
|
+
readonly subject: "unique(id)";
|
|
13
|
+
readonly identifier: "unique(namespace,value)";
|
|
14
|
+
readonly credential: "unique(credentialId)";
|
|
15
|
+
};
|
|
16
|
+
/** Consumer-owned schema; encoders and allocators are synchronous and side-effect free.
|
|
17
|
+
* Identifiers store permanent number custody. Never delete retired rows to make a recycled number eligible. A consumer's
|
|
18
|
+
* explicit recovery workflow may resolve custody only after independent authentication.
|
|
19
|
+
* Subject defaults own account provisioning; no email/profile schema is prescribed. */
|
|
20
|
+
export interface PhoneMapping<S extends TableModel, I extends TableModel, C extends TableModel, P extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
|
|
21
|
+
readonly moduleId: string;
|
|
22
|
+
readonly policy: PhoneLifecyclePolicy;
|
|
23
|
+
readonly constraints: typeof requiredPhoneConstraints;
|
|
24
|
+
readonly proofs: ProofPersistenceMapping<P, S, N, Expression>;
|
|
25
|
+
readonly subjectIds: {
|
|
26
|
+
readonly toNative: (id: SubjectId) => N | Effect.Effect<N, PersistenceMappingError>;
|
|
27
|
+
readonly toSubject: (id: N) => SubjectId | Effect.Effect<SubjectId, PersistenceMappingError>;
|
|
28
|
+
readonly allocate?: () => N | Effect.Effect<N, PersistenceMappingError>;
|
|
29
|
+
};
|
|
30
|
+
readonly subject: {
|
|
31
|
+
readonly table: S["table"];
|
|
32
|
+
readonly id: PhoneColumn<S>;
|
|
33
|
+
readonly securityRevision: PhoneColumn<S>;
|
|
34
|
+
readonly activeCondition: Expression;
|
|
35
|
+
readonly decodeRequirement: (row: S["select"]) => AuthenticationRequirement | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
|
|
36
|
+
/** Current action policy, independently from primary sign-in assurance. */
|
|
37
|
+
readonly decodeActionRequirement?: (row: S["select"], action: "verify" | "change") => AuthenticationRequirement | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
|
|
38
|
+
readonly encodeInsert?: (input: {
|
|
39
|
+
readonly id: N;
|
|
40
|
+
readonly securityRevision: string;
|
|
41
|
+
readonly phoneNumber: PhoneNumber;
|
|
42
|
+
}) => S["insert"];
|
|
43
|
+
};
|
|
44
|
+
readonly identifier: {
|
|
45
|
+
readonly table: I["table"];
|
|
46
|
+
readonly moduleId: PhoneColumn<I>;
|
|
47
|
+
readonly credentialId: PhoneColumn<I>;
|
|
48
|
+
readonly namespace: PhoneColumn<I>;
|
|
49
|
+
readonly value: PhoneColumn<I>;
|
|
50
|
+
readonly subjectId: PhoneColumn<I>;
|
|
51
|
+
readonly revision: PhoneColumn<I>;
|
|
52
|
+
readonly verifiedAt: PhoneColumn<I>;
|
|
53
|
+
readonly status: PhoneColumn<I>;
|
|
54
|
+
readonly activeCondition: Expression;
|
|
55
|
+
readonly encodeStatus: (active: boolean) => unknown;
|
|
56
|
+
readonly encodeInsert: (input: {
|
|
57
|
+
readonly moduleId: string;
|
|
58
|
+
readonly credentialId: string;
|
|
59
|
+
readonly phoneNumber: PhoneNumber;
|
|
60
|
+
readonly subjectId: N;
|
|
61
|
+
readonly revision: string;
|
|
62
|
+
readonly verifiedAtMillis: number;
|
|
63
|
+
readonly active: boolean;
|
|
64
|
+
}) => I["insert"];
|
|
65
|
+
};
|
|
66
|
+
readonly credential: {
|
|
67
|
+
readonly table: C["table"];
|
|
68
|
+
readonly id: PhoneColumn<C>;
|
|
69
|
+
readonly subjectId: PhoneColumn<C>;
|
|
70
|
+
readonly revision: PhoneColumn<C>;
|
|
71
|
+
readonly status: PhoneColumn<C>;
|
|
72
|
+
readonly activeCondition: Expression;
|
|
73
|
+
readonly encodeStatus: (active: boolean) => unknown;
|
|
74
|
+
readonly encodeInsert: (input: {
|
|
75
|
+
readonly credentialId: string;
|
|
76
|
+
readonly subjectId: N;
|
|
77
|
+
readonly revision: string;
|
|
78
|
+
readonly active: boolean;
|
|
79
|
+
}) => C["insert"];
|
|
80
|
+
};
|
|
81
|
+
readonly encodeInstant: (millis: number) => unknown;
|
|
82
|
+
readonly engineNowMillis: Expression;
|
|
83
|
+
}
|
|
84
|
+
export type AnyPhoneMapping<Expression extends SqlExpression = SqlExpression> = PhoneMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
|
|
85
|
+
//#endregion
|
|
86
|
+
//# sourceMappingURL=phone-model.d.mts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/internal/models/phone-model.ts
|
|
2
|
+
const requiredPhoneConstraints = {
|
|
3
|
+
subject: "unique(id)",
|
|
4
|
+
identifier: "unique(namespace,value)",
|
|
5
|
+
credential: "unique(credentialId)"
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { requiredPhoneConstraints };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=phone-model.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone-model.mjs","names":[],"sources":["../../../src/internal/models/phone-model.ts"],"sourcesContent":["import type { PhoneLifecyclePolicy, PhoneNumber } from \"@yielded/auth/PhoneOtp\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement } from \"@yielded/auth/Sessions\";\nimport type { Effect } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError } from \"./common\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\n\ntype PhoneColumn<T extends Table> = T[\"column\"];\n\nexport const requiredPhoneConstraints = {\n subject: \"unique(id)\",\n identifier: \"unique(namespace,value)\",\n credential: \"unique(credentialId)\",\n} as const;\n\n/** Consumer-owned schema; encoders and allocators are synchronous and side-effect free.\n * Identifiers store permanent number custody. Never delete retired rows to make a recycled number eligible. A consumer's\n * explicit recovery workflow may resolve custody only after independent authentication.\n * Subject defaults own account provisioning; no email/profile schema is prescribed. */\nexport interface PhoneMapping<\n S extends Table,\n I extends Table,\n C extends Table,\n P extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly moduleId: string;\n readonly policy: PhoneLifecyclePolicy;\n readonly constraints: typeof requiredPhoneConstraints;\n readonly proofs: ProofPersistenceMapping<P, S, N, Expression>;\n readonly subjectIds: {\n readonly toNative: (id: SubjectId) => N | Effect.Effect<N, PersistenceMappingError>;\n readonly toSubject: (id: N) => SubjectId | Effect.Effect<SubjectId, PersistenceMappingError>;\n readonly allocate?: () => N | Effect.Effect<N, PersistenceMappingError>;\n };\n readonly subject: {\n readonly table: S[\"table\"];\n readonly id: PhoneColumn<S>;\n readonly securityRevision: PhoneColumn<S>;\n readonly activeCondition: Expression;\n readonly decodeRequirement: (\n row: S[\"select\"],\n ) =>\n | AuthenticationRequirement\n | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n /** Current action policy, independently from primary sign-in assurance. */\n readonly decodeActionRequirement?: (\n row: S[\"select\"],\n action: \"verify\" | \"change\",\n ) =>\n | AuthenticationRequirement\n | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly encodeInsert?: (input: {\n readonly id: N;\n readonly securityRevision: string;\n readonly phoneNumber: PhoneNumber;\n }) => S[\"insert\"];\n };\n readonly identifier: {\n readonly table: I[\"table\"];\n readonly moduleId: PhoneColumn<I>;\n readonly credentialId: PhoneColumn<I>;\n readonly namespace: PhoneColumn<I>;\n readonly value: PhoneColumn<I>;\n readonly subjectId: PhoneColumn<I>;\n readonly revision: PhoneColumn<I>;\n readonly verifiedAt: PhoneColumn<I>;\n readonly status: PhoneColumn<I>;\n readonly activeCondition: Expression;\n readonly encodeStatus: (active: boolean) => unknown;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly credentialId: string;\n readonly phoneNumber: PhoneNumber;\n readonly subjectId: N;\n readonly revision: string;\n readonly verifiedAtMillis: number;\n readonly active: boolean;\n }) => I[\"insert\"];\n };\n readonly credential: {\n readonly table: C[\"table\"];\n readonly id: PhoneColumn<C>;\n readonly subjectId: PhoneColumn<C>;\n readonly revision: PhoneColumn<C>;\n readonly status: PhoneColumn<C>;\n readonly activeCondition: Expression;\n readonly encodeStatus: (active: boolean) => unknown;\n readonly encodeInsert: (input: {\n readonly credentialId: string;\n readonly subjectId: N;\n readonly revision: string;\n readonly active: boolean;\n }) => C[\"insert\"];\n };\n readonly encodeInstant: (millis: number) => unknown;\n readonly engineNowMillis: Expression;\n}\n\nexport type AnyPhoneMapping<Expression extends SqlExpression = SqlExpression> = PhoneMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";AAWA,MAAa,2BAA2B;CACtC,SAAS;CACT,YAAY;CACZ,YAAY;AACd"}
|