@yielded/auth-persistence 0.1.0-beta.25 → 0.1.0-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -8
- package/dist/Adapter.d.mts +47 -33
- package/dist/Adapter.mjs +36 -23
- package/dist/OAuthPersistence.d.mts +35 -51
- package/dist/OAuthPersistence.mjs +60 -68
- package/dist/OAuthPersistence.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/internal/browser-login.d.mts +1 -1
- package/dist/internal/browser-login.mjs +29 -9
- package/dist/internal/browser-login.mjs.map +1 -1
- package/dist/internal/configuration.d.mts +13 -8
- package/dist/internal/configuration.mjs.map +1 -1
- package/dist/internal/crypto.d.mts +1 -0
- package/dist/internal/crypto.mjs +1 -1
- package/dist/internal/d1-planning.mjs +8 -0
- package/dist/internal/d1-planning.mjs.map +1 -0
- package/dist/internal/email-native-state.mjs +135 -0
- package/dist/internal/email-native-state.mjs.map +1 -0
- package/dist/internal/email-native.d.mts +17 -0
- package/dist/internal/email-native.mjs +245 -0
- package/dist/internal/email-native.mjs.map +1 -0
- package/dist/internal/email-policy.mjs +92 -0
- package/dist/internal/email-policy.mjs.map +1 -0
- package/dist/internal/email-registration-native.d.mts +38 -0
- package/dist/internal/email-registration-native.mjs +171 -0
- package/dist/internal/email-registration-native.mjs.map +1 -0
- package/dist/internal/models/email-model.d.mts +40 -104
- package/dist/internal/models/email-model.mjs +3 -5
- package/dist/internal/models/email-model.mjs.map +1 -1
- package/dist/internal/models/oauth-connected-model.d.mts +44 -213
- package/dist/internal/models/oauth-connected-model.mjs +6 -14
- package/dist/internal/models/oauth-connected-model.mjs.map +1 -1
- package/dist/internal/models/oauth-model.d.mts +95 -244
- package/dist/internal/models/oauth-model.mjs +28 -22
- package/dist/internal/models/oauth-model.mjs.map +1 -1
- package/dist/internal/models/passkey-model.d.mts +11 -147
- package/dist/internal/models/passkey-model.mjs +5 -24
- package/dist/internal/models/passkey-model.mjs.map +1 -1
- package/dist/internal/models/passkey-registration-ceremony-model.d.mts +5 -39
- package/dist/internal/models/passkey-write-model.d.mts +17 -75
- package/dist/internal/models/passkey-write-model.mjs +1 -7
- package/dist/internal/models/passkey-write-model.mjs.map +1 -1
- package/dist/internal/models/password-model.d.mts +14 -81
- package/dist/internal/models/password-model.mjs +1 -4
- package/dist/internal/models/password-model.mjs.map +1 -1
- package/dist/internal/models/phone-model.d.mts +86 -0
- package/dist/internal/models/phone-model.mjs +10 -0
- package/dist/internal/models/phone-model.mjs.map +1 -0
- package/dist/internal/models/proof-model.d.mts +43 -272
- package/dist/internal/models/proof-model.mjs +2 -10
- package/dist/internal/models/proof-model.mjs.map +1 -1
- package/dist/internal/models/session-model.d.mts +74 -93
- package/dist/internal/models/session-model.mjs +3 -11
- package/dist/internal/models/session-model.mjs.map +1 -1
- package/dist/internal/models/step-up-model.d.mts +12 -50
- package/dist/internal/models/step-up-model.mjs +2 -4
- package/dist/internal/models/step-up-model.mjs.map +1 -1
- package/dist/internal/models/totp-model.d.mts +76 -0
- package/dist/internal/models/totp-model.mjs +10 -0
- package/dist/internal/models/totp-model.mjs.map +1 -0
- package/dist/internal/native-sql-table.d.mts +21 -4
- package/dist/internal/native-sql-table.mjs +9 -5
- package/dist/internal/native-sql-table.mjs.map +1 -1
- package/dist/internal/oauth/native-accounts.d.mts +17 -0
- package/dist/internal/oauth/native-accounts.mjs +290 -0
- package/dist/internal/oauth/native-accounts.mjs.map +1 -0
- package/dist/internal/oauth/native-connected-state.d.mts +11 -0
- package/dist/internal/oauth/native-connected-state.mjs +146 -0
- package/dist/internal/oauth/native-connected-state.mjs.map +1 -0
- package/dist/internal/oauth/native-connected.d.mts +15 -0
- package/dist/internal/oauth/native-connected.mjs +462 -0
- package/dist/internal/oauth/native-connected.mjs.map +1 -0
- package/dist/internal/oauth/native-flow.mjs +138 -0
- package/dist/internal/oauth/native-flow.mjs.map +1 -0
- package/dist/internal/oauth/native-layers.d.mts +24 -0
- package/dist/internal/oauth/native-layers.mjs +13 -0
- package/dist/internal/oauth/native-layers.mjs.map +1 -0
- package/dist/internal/oauth/native-mutation.mjs +122 -0
- package/dist/internal/oauth/native-mutation.mjs.map +1 -0
- package/dist/internal/oauth/native-registration.d.mts +24 -0
- package/dist/internal/oauth/native-registration.mjs +328 -0
- package/dist/internal/oauth/native-registration.mjs.map +1 -0
- package/dist/internal/oauth/native-revocations.d.mts +17 -0
- package/dist/internal/oauth/native-revocations.mjs +106 -0
- package/dist/internal/oauth/native-revocations.mjs.map +1 -0
- package/dist/internal/oauth/native-sign-in.d.mts +17 -0
- package/dist/internal/oauth/native-sign-in.mjs +50 -0
- package/dist/internal/oauth/native-sign-in.mjs.map +1 -0
- package/dist/internal/oauth/native-state.d.mts +10 -0
- package/dist/internal/oauth/native-state.mjs +214 -0
- package/dist/internal/oauth/native-state.mjs.map +1 -0
- package/dist/internal/oauth/state.d.mts +10 -0
- package/dist/internal/oauth/state.mjs +3 -27
- package/dist/internal/oauth/state.mjs.map +1 -1
- package/dist/internal/passkey-actions.mjs +55 -0
- package/dist/internal/passkey-actions.mjs.map +1 -0
- package/dist/internal/passkey-inputs.mjs +73 -0
- package/dist/internal/passkey-inputs.mjs.map +1 -0
- package/dist/internal/passkey-managed.mjs +224 -0
- package/dist/internal/passkey-managed.mjs.map +1 -0
- package/dist/internal/passkey-native-ceremony.d.mts +35 -0
- package/dist/internal/passkey-native-ceremony.mjs +38 -0
- package/dist/internal/passkey-native-ceremony.mjs.map +1 -0
- package/dist/internal/passkey-native-flow.mjs +91 -0
- package/dist/internal/passkey-native-flow.mjs.map +1 -0
- package/dist/internal/passkey-native-registration.d.mts +10 -0
- package/dist/internal/passkey-native-registration.mjs +114 -0
- package/dist/internal/passkey-native-registration.mjs.map +1 -0
- package/dist/internal/passkey-native-state.d.mts +15 -0
- package/dist/internal/passkey-native-state.mjs +186 -0
- package/dist/internal/passkey-native-state.mjs.map +1 -0
- package/dist/internal/passkey-native-write.d.mts +82 -0
- package/dist/internal/passkey-native-write.mjs +330 -0
- package/dist/internal/passkey-native-write.mjs.map +1 -0
- package/dist/internal/passkey-native.d.mts +835 -0
- package/dist/internal/passkey-native.mjs +175 -0
- package/dist/internal/passkey-native.mjs.map +1 -0
- package/dist/internal/passkey-policy.mjs +115 -0
- package/dist/internal/passkey-policy.mjs.map +1 -0
- package/dist/internal/password-credentials.mjs +38 -9
- package/dist/internal/password-credentials.mjs.map +1 -1
- package/dist/internal/password-native.d.mts +14 -0
- package/dist/internal/password-native.mjs +292 -0
- package/dist/internal/password-native.mjs.map +1 -0
- package/dist/internal/password-policy.mjs +93 -0
- package/dist/internal/password-policy.mjs.map +1 -0
- package/dist/internal/password-registration-native.d.mts +22 -0
- package/dist/internal/password-registration-native.mjs +142 -0
- package/dist/internal/password-registration-native.mjs.map +1 -0
- package/dist/internal/persistence.d.mts +6 -19
- package/dist/internal/persistence.mjs +199 -166
- package/dist/internal/persistence.mjs.map +1 -1
- package/dist/internal/phone-composed.mjs +79 -0
- package/dist/internal/phone-composed.mjs.map +1 -0
- package/dist/internal/phone-native.d.mts +15 -0
- package/dist/internal/phone-native.mjs +354 -0
- package/dist/internal/phone-native.mjs.map +1 -0
- package/dist/internal/proof-native.d.mts +15 -0
- package/dist/internal/proof-native.mjs +289 -0
- package/dist/internal/proof-native.mjs.map +1 -0
- package/dist/internal/registration.mjs +50 -60
- package/dist/internal/registration.mjs.map +1 -1
- package/dist/internal/session-native-authority.d.mts +15 -0
- package/dist/internal/session-native-authority.mjs +91 -0
- package/dist/internal/session-native-authority.mjs.map +1 -0
- package/dist/internal/session-native-cleanup.d.mts +14 -0
- package/dist/internal/session-native-cleanup.mjs +48 -0
- package/dist/internal/session-native-cleanup.mjs.map +1 -0
- package/dist/internal/session-native-login.d.mts +15 -0
- package/dist/internal/session-native-login.mjs +87 -0
- package/dist/internal/session-native-login.mjs.map +1 -0
- package/dist/internal/session-native-pending-read.mjs +42 -0
- package/dist/internal/session-native-pending-read.mjs.map +1 -0
- package/dist/internal/session-native-pending.mjs +134 -0
- package/dist/internal/session-native-pending.mjs.map +1 -0
- package/dist/internal/session-native-record.mjs +79 -0
- package/dist/internal/session-native-record.mjs.map +1 -0
- package/dist/internal/session-native-state.mjs +130 -0
- package/dist/internal/session-native-state.mjs.map +1 -0
- package/dist/internal/session-native-stateful.d.mts +16 -0
- package/dist/internal/session-native-stateful.mjs +225 -0
- package/dist/internal/session-native-stateful.mjs.map +1 -0
- package/dist/internal/session-native-step-up.d.mts +15 -0
- package/dist/internal/session-native-step-up.mjs +212 -0
- package/dist/internal/session-native-step-up.mjs.map +1 -0
- package/dist/internal/session-native-validity.d.mts +15 -0
- package/dist/internal/session-native-validity.mjs +97 -0
- package/dist/internal/session-native-validity.mjs.map +1 -0
- package/dist/internal/session-policy.mjs +29 -0
- package/dist/internal/session-policy.mjs.map +1 -0
- package/dist/internal/sql-authority.d.mts +16 -0
- package/dist/internal/sql-authority.mjs +32 -0
- package/dist/internal/sql-authority.mjs.map +1 -0
- package/dist/internal/sql-change.mjs +21 -0
- package/dist/internal/sql-change.mjs.map +1 -0
- package/dist/internal/sql-cleanup.mjs +35 -0
- package/dist/internal/sql-cleanup.mjs.map +1 -0
- package/dist/internal/sql-commit.d.mts +72 -0
- package/dist/internal/sql-commit.mjs +176 -0
- package/dist/internal/sql-commit.mjs.map +1 -0
- package/dist/internal/sql-expression.d.mts +17 -0
- package/dist/internal/sql-expression.mjs +49 -0
- package/dist/internal/sql-expression.mjs.map +1 -0
- package/dist/internal/sql-oauth-connected-model.d.mts +7 -23
- package/dist/internal/sql-oauth-model.d.mts +27 -52
- package/dist/internal/sql-oauth-model.mjs +3 -4
- package/dist/internal/sql-oauth-model.mjs.map +1 -1
- package/dist/internal/sql-persistence.mjs +5 -9
- package/dist/internal/sql-persistence.mjs.map +1 -1
- package/dist/internal/sql-storage-validation.mjs +1 -2
- package/dist/internal/sql-storage-validation.mjs.map +1 -1
- package/dist/internal/sql-table.d.mts +3 -16
- package/dist/internal/sql-table.mjs +21 -42
- package/dist/internal/sql-table.mjs.map +1 -1
- package/dist/internal/standalone.mjs +2 -3
- package/dist/internal/standalone.mjs.map +1 -1
- package/dist/internal/step-up-state.mjs +5 -8
- package/dist/internal/step-up-state.mjs.map +1 -1
- package/dist/internal/storage-clock.mjs +44 -0
- package/dist/internal/storage-clock.mjs.map +1 -0
- package/dist/internal/storage-mapping.d.mts +11 -8
- package/dist/internal/storage-mapping.mjs +88 -302
- package/dist/internal/storage-mapping.mjs.map +1 -1
- package/dist/internal/storage-plans.mjs +15 -73
- package/dist/internal/storage-plans.mjs.map +1 -1
- package/dist/internal/storage-tables.d.mts +37 -520
- package/dist/internal/storage-tables.mjs +31 -211
- package/dist/internal/storage-tables.mjs.map +1 -1
- package/dist/internal/storage-validation.d.mts +1 -6
- package/dist/internal/storage-validation.mjs +1 -42
- package/dist/internal/storage-validation.mjs.map +1 -1
- package/dist/internal/table-model.d.mts +21 -0
- package/dist/internal/totp-native.d.mts +15 -0
- package/dist/internal/totp-native.mjs +401 -0
- package/dist/internal/totp-native.mjs.map +1 -0
- package/package.json +1 -1
- package/src/Adapter.ts +143 -199
- package/src/OAuthPersistence.ts +128 -271
- package/src/index.ts +1 -1
- package/src/internal/browser-login.ts +54 -24
- package/src/internal/configuration.ts +16 -31
- package/src/internal/d1-planning.ts +7 -0
- package/src/internal/email-native-state.ts +247 -0
- package/src/internal/email-native.ts +514 -0
- package/src/internal/email-policy.ts +235 -0
- package/src/internal/email-registration-native.ts +386 -0
- package/src/internal/models/email-model.ts +76 -214
- package/src/internal/models/oauth-connected-model.ts +50 -288
- package/src/internal/models/oauth-model.ts +147 -368
- package/src/internal/models/passkey-model.ts +11 -208
- package/src/internal/models/passkey-registration-ceremony-model.ts +6 -60
- package/src/internal/models/passkey-write-model.ts +14 -95
- package/src/internal/models/password-model.ts +26 -147
- package/src/internal/models/phone-model.ts +110 -0
- package/src/internal/models/proof-model.ts +48 -404
- package/src/internal/models/session-model.ts +102 -200
- package/src/internal/models/step-up-model.ts +17 -96
- package/src/internal/models/totp-model.ts +82 -0
- package/src/internal/native-sql-table.ts +32 -11
- package/src/internal/oauth/native-accounts.ts +576 -0
- package/src/internal/oauth/native-connected-state.ts +288 -0
- package/src/internal/oauth/native-connected.ts +888 -0
- package/src/internal/oauth/native-flow.ts +253 -0
- package/src/internal/oauth/native-layers.ts +83 -0
- package/src/internal/oauth/native-mutation.ts +222 -0
- package/src/internal/oauth/native-registration.ts +545 -0
- package/src/internal/oauth/native-revocations.ts +190 -0
- package/src/internal/oauth/native-sign-in.ts +111 -0
- package/src/internal/oauth/native-state.ts +346 -0
- package/src/internal/oauth/state.ts +2 -70
- package/src/internal/passkey-actions.ts +70 -0
- package/src/internal/passkey-inputs.ts +56 -0
- package/src/internal/passkey-managed.ts +360 -0
- package/src/internal/passkey-native-ceremony.ts +66 -0
- package/src/internal/passkey-native-flow.ts +140 -0
- package/src/internal/passkey-native-registration.ts +221 -0
- package/src/internal/passkey-native-state.ts +335 -0
- package/src/internal/passkey-native-write.ts +611 -0
- package/src/internal/passkey-native.ts +372 -0
- package/src/internal/passkey-policy.ts +246 -0
- package/src/internal/password-credentials.ts +52 -10
- package/src/internal/password-native.ts +571 -0
- package/src/internal/password-policy.ts +307 -0
- package/src/internal/password-registration-native.ts +322 -0
- package/src/internal/persistence.ts +336 -290
- package/src/internal/phone-composed.ts +86 -0
- package/src/internal/phone-native.ts +659 -0
- package/src/internal/proof-native.ts +448 -0
- package/src/internal/registration.ts +96 -143
- package/src/internal/session-native-authority.ts +247 -0
- package/src/internal/session-native-cleanup.ts +65 -0
- package/src/internal/session-native-login.ts +205 -0
- package/src/internal/session-native-pending-read.ts +68 -0
- package/src/internal/session-native-pending.ts +223 -0
- package/src/internal/session-native-record.ts +141 -0
- package/src/internal/session-native-state.ts +259 -0
- package/src/internal/session-native-stateful.ts +512 -0
- package/src/internal/session-native-step-up.ts +450 -0
- package/src/internal/session-native-validity.ts +208 -0
- package/src/internal/session-policy.ts +59 -0
- package/src/internal/sql-authority.ts +56 -0
- package/src/internal/sql-change.ts +38 -0
- package/src/internal/sql-cleanup.ts +56 -0
- package/src/internal/sql-commit.ts +435 -0
- package/src/internal/sql-expression.ts +94 -0
- package/src/internal/sql-metadata.ts +100 -0
- package/src/internal/sql-oauth-connected-model.ts +6 -95
- package/src/internal/sql-oauth-model.ts +31 -134
- package/src/internal/sql-persistence.ts +2 -6
- package/src/internal/sql-storage-validation.ts +1 -2
- package/src/internal/sql-table.ts +19 -52
- package/src/internal/standalone.ts +2 -11
- package/src/internal/step-up-state.ts +4 -17
- package/src/internal/storage-clock.ts +58 -0
- package/src/internal/storage-mapping.ts +125 -340
- package/src/internal/storage-plans.ts +14 -80
- package/src/internal/storage-tables.ts +28 -212
- package/src/internal/storage-validation.ts +0 -58
- package/src/internal/table-model.ts +24 -0
- package/src/internal/totp-native.ts +701 -0
- package/dist/internal/PasswordPreparedPostconditions.d.mts +0 -22
- package/dist/internal/PasswordPreparedPostconditions.mjs +0 -12
- package/dist/internal/PasswordPreparedPostconditions.mjs.map +0 -1
- package/dist/internal/authority-snapshot.mjs +0 -53
- package/dist/internal/authority-snapshot.mjs.map +0 -1
- package/dist/internal/email-kernel.d.mts +0 -276
- package/dist/internal/email-kernel.mjs +0 -497
- package/dist/internal/email-kernel.mjs.map +0 -1
- package/dist/internal/models/passkey-registration-ceremony-model.mjs +0 -18
- package/dist/internal/models/passkey-registration-ceremony-model.mjs.map +0 -1
- package/dist/internal/oauth/accounts.d.mts +0 -8
- package/dist/internal/oauth/accounts.mjs +0 -379
- package/dist/internal/oauth/accounts.mjs.map +0 -1
- package/dist/internal/oauth/connected-access.d.mts +0 -9
- package/dist/internal/oauth/connected-access.mjs +0 -229
- package/dist/internal/oauth/connected-access.mjs.map +0 -1
- package/dist/internal/oauth/connected-collection.d.mts +0 -7
- package/dist/internal/oauth/connected-collection.mjs +0 -214
- package/dist/internal/oauth/connected-collection.mjs.map +0 -1
- package/dist/internal/oauth/connected-custody.d.mts +0 -6
- package/dist/internal/oauth/connected-custody.mjs +0 -165
- package/dist/internal/oauth/connected-custody.mjs.map +0 -1
- package/dist/internal/oauth/connected-flow.d.mts +0 -7
- package/dist/internal/oauth/connected-flow.mjs +0 -324
- package/dist/internal/oauth/connected-flow.mjs.map +0 -1
- package/dist/internal/oauth/connected-input.mjs +0 -122
- package/dist/internal/oauth/connected-input.mjs.map +0 -1
- package/dist/internal/oauth/connected-keys.d.mts +0 -2
- package/dist/internal/oauth/connected-keys.mjs +0 -22
- package/dist/internal/oauth/connected-keys.mjs.map +0 -1
- package/dist/internal/oauth/connected-maintenance.d.mts +0 -9
- package/dist/internal/oauth/connected-maintenance.mjs +0 -226
- package/dist/internal/oauth/connected-maintenance.mjs.map +0 -1
- package/dist/internal/oauth/connected-management.d.mts +0 -9
- package/dist/internal/oauth/connected-management.mjs +0 -243
- package/dist/internal/oauth/connected-management.mjs.map +0 -1
- package/dist/internal/oauth/connected-reference.mjs +0 -63
- package/dist/internal/oauth/connected-reference.mjs.map +0 -1
- package/dist/internal/oauth/connected-settlement.d.mts +0 -8
- package/dist/internal/oauth/connected-settlement.mjs +0 -141
- package/dist/internal/oauth/connected-settlement.mjs.map +0 -1
- package/dist/internal/oauth/connected-sign-in.d.mts +0 -10
- package/dist/internal/oauth/connected-sign-in.mjs +0 -281
- package/dist/internal/oauth/connected-sign-in.mjs.map +0 -1
- package/dist/internal/oauth/connected-state.d.mts +0 -14
- package/dist/internal/oauth/connected-state.mjs +0 -469
- package/dist/internal/oauth/connected-state.mjs.map +0 -1
- package/dist/internal/oauth/connected-target.d.mts +0 -21
- package/dist/internal/oauth/connected-target.mjs +0 -117
- package/dist/internal/oauth/connected-target.mjs.map +0 -1
- package/dist/internal/oauth/flow.d.mts +0 -5
- package/dist/internal/oauth/flow.mjs +0 -279
- package/dist/internal/oauth/flow.mjs.map +0 -1
- package/dist/internal/oauth/input.mjs +0 -127
- package/dist/internal/oauth/input.mjs.map +0 -1
- package/dist/internal/oauth/owner.d.mts +0 -10
- package/dist/internal/oauth/owner.mjs +0 -10
- package/dist/internal/oauth/owner.mjs.map +0 -1
- package/dist/internal/oauth/query-compiler.d.mts +0 -7
- package/dist/internal/oauth/query-compiler.mjs +0 -9
- package/dist/internal/oauth/query-compiler.mjs.map +0 -1
- package/dist/internal/oauth/registration.d.mts +0 -7
- package/dist/internal/oauth/registration.mjs +0 -393
- package/dist/internal/oauth/registration.mjs.map +0 -1
- package/dist/internal/oauth/target.d.mts +0 -31
- package/dist/internal/oauth/target.mjs +0 -273
- package/dist/internal/oauth/target.mjs.map +0 -1
- package/dist/internal/oauth-kernel.d.mts +0 -1423
- package/dist/internal/oauth-kernel.mjs +0 -187
- package/dist/internal/oauth-kernel.mjs.map +0 -1
- package/dist/internal/passkey/admission.d.mts +0 -6
- package/dist/internal/passkey/admission.mjs +0 -220
- package/dist/internal/passkey/admission.mjs.map +0 -1
- package/dist/internal/passkey/credentials.d.mts +0 -14
- package/dist/internal/passkey/credentials.mjs +0 -249
- package/dist/internal/passkey/credentials.mjs.map +0 -1
- package/dist/internal/passkey/enrollment.mjs +0 -138
- package/dist/internal/passkey/enrollment.mjs.map +0 -1
- package/dist/internal/passkey/flow.d.mts +0 -21
- package/dist/internal/passkey/flow.mjs +0 -452
- package/dist/internal/passkey/flow.mjs.map +0 -1
- package/dist/internal/passkey/management.mjs +0 -231
- package/dist/internal/passkey/management.mjs.map +0 -1
- package/dist/internal/passkey/registration-ceremony.d.mts +0 -9
- package/dist/internal/passkey/registration-ceremony.mjs +0 -129
- package/dist/internal/passkey/registration-ceremony.mjs.map +0 -1
- package/dist/internal/passkey/registration-custody.d.mts +0 -2
- package/dist/internal/passkey/registration-custody.mjs +0 -52
- package/dist/internal/passkey/registration-custody.mjs.map +0 -1
- package/dist/internal/passkey/registration-write.mjs +0 -211
- package/dist/internal/passkey/registration-write.mjs.map +0 -1
- package/dist/internal/passkey/state.d.mts +0 -10
- package/dist/internal/passkey/state.mjs +0 -234
- package/dist/internal/passkey/state.mjs.map +0 -1
- package/dist/internal/passkey/target.d.mts +0 -20
- package/dist/internal/passkey/target.mjs +0 -200
- package/dist/internal/passkey/target.mjs.map +0 -1
- package/dist/internal/passkey/write-state.d.mts +0 -17
- package/dist/internal/passkey/write-state.mjs +0 -354
- package/dist/internal/passkey/write-state.mjs.map +0 -1
- package/dist/internal/passkey/write-target.mjs +0 -192
- package/dist/internal/passkey/write-target.mjs.map +0 -1
- package/dist/internal/passkey-kernel.d.mts +0 -6045
- package/dist/internal/passkey-kernel.mjs +0 -49
- package/dist/internal/passkey-kernel.mjs.map +0 -1
- package/dist/internal/passkeys.d.mts +0 -7
- package/dist/internal/passkeys.mjs +0 -387
- package/dist/internal/passkeys.mjs.map +0 -1
- package/dist/internal/password-credentials.d.mts +0 -11
- package/dist/internal/password-kernel.d.mts +0 -278
- package/dist/internal/password-kernel.mjs +0 -508
- package/dist/internal/password-kernel.mjs.map +0 -1
- package/dist/internal/phone-kernel.d.mts +0 -162
- package/dist/internal/phone-kernel.mjs +0 -437
- package/dist/internal/phone-kernel.mjs.map +0 -1
- package/dist/internal/proof-kernel.d.mts +0 -94
- package/dist/internal/proof-kernel.mjs +0 -624
- package/dist/internal/proof-kernel.mjs.map +0 -1
- package/dist/internal/query-operations.d.mts +0 -68
- package/dist/internal/session-kernel.d.mts +0 -62
- package/dist/internal/session-kernel.mjs +0 -820
- package/dist/internal/session-kernel.mjs.map +0 -1
- package/dist/internal/sql-oauth-connected-model.mjs +0 -7
- package/dist/internal/sql-oauth-connected-model.mjs.map +0 -1
- package/dist/internal/sql-query.d.mts +0 -12
- package/dist/internal/sql-query.mjs +0 -206
- package/dist/internal/sql-query.mjs.map +0 -1
- package/dist/internal/step-up-state.d.mts +0 -49
- package/dist/internal/transaction-execution-kernel.d.mts +0 -37
- package/dist/internal/transaction-execution-kernel.mjs +0 -120
- package/dist/internal/transaction-execution-kernel.mjs.map +0 -1
- package/dist/internal/transaction-kernel.d.mts +0 -81
- package/dist/internal/transaction-kernel.mjs +0 -264
- package/dist/internal/transaction-kernel.mjs.map +0 -1
- package/src/internal/PasswordPreparedPostconditions.ts +0 -30
- package/src/internal/authority-snapshot.ts +0 -91
- package/src/internal/email-kernel.ts +0 -1556
- package/src/internal/oauth/accounts.ts +0 -839
- package/src/internal/oauth/connected-access.ts +0 -388
- package/src/internal/oauth/connected-collection.ts +0 -345
- package/src/internal/oauth/connected-custody.ts +0 -308
- package/src/internal/oauth/connected-flow.ts +0 -562
- package/src/internal/oauth/connected-input.ts +0 -147
- package/src/internal/oauth/connected-keys.ts +0 -31
- package/src/internal/oauth/connected-maintenance.ts +0 -379
- package/src/internal/oauth/connected-management.ts +0 -391
- package/src/internal/oauth/connected-reference.ts +0 -135
- package/src/internal/oauth/connected-settlement.ts +0 -278
- package/src/internal/oauth/connected-sign-in.ts +0 -472
- package/src/internal/oauth/connected-state.ts +0 -924
- package/src/internal/oauth/connected-target.ts +0 -307
- package/src/internal/oauth/flow.ts +0 -505
- package/src/internal/oauth/input.ts +0 -201
- package/src/internal/oauth/owner.ts +0 -22
- package/src/internal/oauth/query-compiler.ts +0 -15
- package/src/internal/oauth/registration.ts +0 -676
- package/src/internal/oauth/target.ts +0 -803
- package/src/internal/oauth-kernel.ts +0 -294
- package/src/internal/passkey/admission.ts +0 -368
- package/src/internal/passkey/credentials.ts +0 -511
- package/src/internal/passkey/enrollment.ts +0 -326
- package/src/internal/passkey/flow.ts +0 -1062
- package/src/internal/passkey/management.ts +0 -426
- package/src/internal/passkey/registration-ceremony.ts +0 -283
- package/src/internal/passkey/registration-custody.ts +0 -91
- package/src/internal/passkey/registration-write.ts +0 -426
- package/src/internal/passkey/state.ts +0 -351
- package/src/internal/passkey/target.ts +0 -598
- package/src/internal/passkey/write-state.ts +0 -692
- package/src/internal/passkey/write-target.ts +0 -450
- package/src/internal/passkey-kernel.ts +0 -112
- package/src/internal/passkeys.ts +0 -652
- package/src/internal/password-kernel.ts +0 -1523
- package/src/internal/phone-kernel.ts +0 -872
- package/src/internal/proof-kernel.ts +0 -1992
- package/src/internal/query-operations.ts +0 -91
- package/src/internal/session-kernel.ts +0 -2406
- package/src/internal/sql-query.ts +0 -304
- package/src/internal/transaction-execution-kernel.ts +0 -335
- package/src/internal/transaction-kernel.ts +0 -603
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-model.mjs","names":[],"sources":["../../../src/internal/models/email-model.ts"],"sourcesContent":["import type { EmailAction, EmailRegistrationDecision } from \"@yielded/auth/Email\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type { ProofBinding, ProofContinuationId, ProofPurpose } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect } 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 EmailSubjectReadTable<Subject extends Table> {\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 d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailSubjectTable<Subject extends Table> extends EmailSubjectReadTable<Subject> {\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: EmailAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailIdentifierReadTable<Identifier extends Table> {\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 readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n}\n\nexport interface EmailIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends EmailIdentifierReadTable<Identifier> {\n /** True only for an active, unverified binding. Confirming it preserves existing sessions. */\n readonly isMutableTarget: (row: Identifier[\"select\"]) => boolean;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n readonly encodeVerification: (input: {\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n /** Must make the selected source unavailable to sign-in. */\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly d1MutableTargetCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n}\n\nexport interface EmailCredentialReadTable<\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 identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\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<\n import(\"@yielded/auth/Email\").EmailCredentialSnapshot,\n PersistenceMappingError\n >;\n}\n\nexport interface EmailCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> extends EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId> {\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (input: {\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailAuthorityCredentialTable<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 encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface EmailCommandTable<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 retentionUntil: ColumnKey<Command>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly action: EmailAction;\n readonly bindingDigest: TokenDigest;\n readonly retentionUntilMillis: number;\n }) => Command[\"insert\"];\n}\n\nexport interface RequiredEmailSignInConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\";\n readonly credentialIdentifier: \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\";\n}\n\nexport const requiredEmailSignInConstraints: RequiredEmailSignInConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\",\n credentialIdentifier:\n \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\",\n};\n\nexport interface EmailSignInMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailIdentifierReadTable<Identifier>;\n readonly credential: EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailSignInConstraints;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n}\n\nexport interface RequiredEmailAddressConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly command: \"unique(emailCommand.moduleId,emailCommand.commandId)\";\n}\n\nexport const requiredEmailAddressConstraints: RequiredEmailAddressConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n command: \"unique(emailCommand.moduleId,emailCommand.commandId)\",\n};\n\nexport interface EmailD1Clock<Expression extends SqlExpression = SqlExpression> {\n readonly engineNow: Expression;\n readonly engineNowMillis: Expression;\n readonly engineInstantPlus: (millis: number) => Expression;\n}\n\nexport interface EmailAddressMapping<\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 EmailSignInMapping<Subject, Identifier, Credential, NativeSubjectId> {\n readonly subject: EmailSubjectTable<Subject>;\n readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;\n readonly command: EmailCommandTable<Command>;\n readonly constraints: RequiredEmailAddressConstraints;\n readonly addressCardinality: \"single\" | \"multiple\";\n readonly changeDisposition: \"retire-source\";\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly commandRetentionMillis: number;\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly isCommandConflict: (cause: unknown) => boolean;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly d1?: EmailD1Clock<Expression>;\n}\n\nexport type D1EmailAddressMapping<\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> = EmailAddressMapping<\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n Command,\n NativeSubjectId,\n Expression\n> & {\n readonly d1: EmailD1Clock<Expression>;\n readonly subject: EmailSubjectTable<Subject> & {\n readonly d1ActiveStatusValue: unknown;\n };\n readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression> & {\n readonly d1CurrentCondition: NonNullable<\n EmailIdentifierTable<Identifier, NativeSubjectId, Expression>[\"d1CurrentCondition\"]\n >;\n readonly d1MutableTargetCondition: NonNullable<\n EmailIdentifierTable<Identifier, NativeSubjectId, Expression>[\"d1MutableTargetCondition\"]\n >;\n };\n readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId> & {\n readonly d1ActiveStatusValue: unknown;\n };\n readonly authorityCredential: EmailAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n > & {\n readonly d1ActiveStatusValue: unknown;\n };\n};\n\nexport type EmailRegistrationState = \"pending\" | \"registered\";\n\nexport interface EmailRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly commandId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly fingerprint: TokenDigest;\n readonly completion: {\n readonly moduleId: string;\n readonly purpose: ProofPurpose;\n readonly continuationId: ProofContinuationId;\n readonly binding: ProofBinding;\n };\n}\n\nexport interface EmailRegistrationTable<Registration, Request extends Table, NativeSubjectId> {\n readonly table: Request[\"table\"];\n readonly moduleId: ColumnKey<Request>;\n readonly commandId: ColumnKey<Request>;\n readonly fingerprint: ColumnKey<Request>;\n readonly state: ColumnKey<Request>;\n readonly subjectId: ColumnKey<Request>;\n readonly pendingReference: ColumnKey<Request>;\n readonly retentionUntil: ColumnKey<Request>;\n readonly encodeInsert: (\n input: EmailRegistrationIntent<Registration>,\n state: {\n readonly state: EmailRegistrationState;\n readonly nativeSubjectId?: NativeSubjectId;\n readonly pendingReference?: string;\n readonly retentionUntilMillis: number;\n },\n ) => Request[\"insert\"];\n readonly decodeReplay: (row: Request[\"select\"]) => Effect.Effect<\n Exclude<\n EmailRegistrationDecision,\n {\n readonly _tag: \"Registered\";\n }\n >,\n PersistenceMappingError\n >;\n}\n\nexport interface EmailRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: EmailRegistrationIntent<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 readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface EmailRegistrationIdentifierTable<\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 /** Atomic mailbox registration may reassign an unverified binding in place.\n * Only subjectId, verifiedAt and bindingRevision change; the supplied proof\n * authority must admit only absent or active-unverified registration targets.\n * Its prior subject's mapped securityRevision advances in the same commit. */\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n}\n\nexport interface EmailRegistrationCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n}\n\nexport interface EmailRegistrationAuthorityCredentialTable<\n Credential extends Table,\n NativeSubjectId,\n> {\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}\n\nexport interface RequiredEmailRegistrationConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly request: \"unique(emailRegistration.moduleId,emailRegistration.commandId)\";\n readonly pendingReference: \"unique(emailRegistration.pendingReference)\";\n}\n\nexport const requiredEmailRegistrationConstraints: RequiredEmailRegistrationConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n request: \"unique(emailRegistration.moduleId,emailRegistration.commandId)\",\n pendingReference: \"unique(emailRegistration.pendingReference)\",\n};\n\ntype EmailRegistrationBase<Registration, Request extends Table, NativeSubjectId> = {\n readonly registration: EmailRegistrationTable<Registration, Request, NativeSubjectId>;\n readonly constraints: Pick<RequiredEmailRegistrationConstraints, \"request\" | \"pendingReference\">;\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n },\n PersistenceMappingError\n >;\n /** Projects one detached value of the factory-specific Registration Type. */\n readonly snapshotRegistration: (\n registration: Registration,\n ) => Effect.Effect<Registration, PersistenceMappingError>;\n /** Required by synchronous transaction-bound services. */\n readonly snapshotRegistrationSync?: (registration: Registration) => Registration;\n /** Required by synchronous Durable Object transaction-bound services. */\n readonly inspectSync?: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n };\n readonly allocatePendingReference?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocatePendingReferenceSync?: () => string;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly retentionMillis: number;\n readonly isRequestConflict: (cause: unknown) => boolean;\n};\n\nexport type EmailRegistrationMapping<\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> = EmailRegistrationBase<Registration, Request, NativeSubjectId> &\n (\n | {\n readonly mode: \"atomic\";\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailRegistrationIdentifierTable<\n Identifier,\n NativeSubjectId,\n Expression\n >;\n readonly credential: EmailRegistrationCredentialTable<Credential, NativeSubjectId>;\n readonly authorityCredential: EmailRegistrationAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly provisioning: EmailRegistrationProvisioning<\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 }\n );\n\nexport type AnyEmailSignInMapping = EmailSignInMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown\n>;\n\nexport type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> =\n EmailAddressMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyEmailRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = EmailRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n\nexport type D1EmailRegistrationMapping<\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> = EmailRegistrationMapping<\n Registration,\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n Request,\n NativeSubjectId,\n Expression\n> & {\n readonly d1: EmailD1Clock<Expression>;\n};\n"],"mappings":";AAqKA,MAAa,iCAAiE;CAC5E,YAAY;CACZ,cAAc;CACd,sBACE;AACJ;AAqBA,MAAa,kCAAmE;CAC9E,GAAG;CACH,qBAAqB;CACrB,SAAS;AACX;AAuNA,MAAa,uCAA6E;CACxF,GAAG;CACH,qBAAqB;CACrB,SAAS;CACT,kBAAkB;AACpB"}
|
|
1
|
+
{"version":3,"file":"email-model.mjs","names":[],"sources":["../../../src/internal/models/email-model.ts"],"sourcesContent":["import type { EmailAction } from \"@yielded/auth/Email\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type { ProofRedemptionInput } from \"@yielded/auth/Proofs\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect } 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 EmailSubjectReadTable<Subject extends Table> {\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 activeStatusValue: unknown;\n readonly decodeRequirement: (\n row: Subject[\"select\"],\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n}\n\nexport interface EmailSubjectTable<Subject extends Table> extends EmailSubjectReadTable<Subject> {\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: EmailAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n readonly activeStatusValue: unknown;\n}\n\nexport interface EmailIdentifierReadTable<Identifier extends Table> {\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 readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n}\n\nexport interface EmailIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends EmailIdentifierReadTable<Identifier> {\n /** True only for an active, unverified binding. Confirming it preserves existing sessions. */\n readonly isMutableTarget: (row: Identifier[\"select\"]) => boolean;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n readonly encodeVerification: (input: {\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n /** Must make the selected source unavailable to sign-in. */\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly bindingRevision: SecurityRevision;\n }) => Partial<Identifier[\"insert\"]>;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly d1MutableTargetCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n}\n\nexport interface EmailCredentialReadTable<\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 identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeStatusValue: unknown;\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<\n Omit<import(\"@yielded/auth/Email\").EmailCredentialSnapshot, \"requirement\">,\n PersistenceMappingError\n >;\n}\n\nexport interface EmailCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> extends EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId> {\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (input: {\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (input: {\n readonly source: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly activeStatusValue: unknown;\n}\n\nexport interface EmailAuthorityCredentialTable<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 encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeActivation: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly encodeRetirement: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n readonly activeStatusValue: unknown;\n}\n\nexport interface RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\";\n readonly credentialIdentifier: \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\";\n}\n\nexport const requiredEmailSignInConstraints: RequiredEmailSignInConstraints = {\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialId: \"unique(emailCredential.moduleId,emailCredential.credentialId)\",\n credentialIdentifier:\n \"unique(emailCredential.moduleId,emailCredential.identifierNamespace,emailCredential.identifierValue)\",\n};\n\nexport interface EmailSignInMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n> {\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailIdentifierReadTable<Identifier>;\n readonly credential: EmailCredentialReadTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailSignInConstraints;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n}\n\nexport interface RequiredEmailAddressConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredEmailAddressConstraints: RequiredEmailAddressConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\nexport interface EmailAddressMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends EmailSignInMapping<\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n NativeSubjectId\n> {\n readonly subject: EmailSubjectTable<Subject>;\n readonly identifier: EmailIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: EmailCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: EmailAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;\n readonly constraints: RequiredEmailAddressConstraints;\n readonly addressCardinality: \"single\" | \"multiple\";\n readonly changeDisposition: \"retire-source\";\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly clock: ProofClock<Expression>;\n readonly d1?: { readonly primary: true };\n}\n\nexport interface EmailRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly commandId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly requestId: string;\n readonly fingerprint: TokenDigest;\n readonly redemption: ProofRedemptionInput;\n}\n\nexport interface EmailRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: EmailRegistrationIntent<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 readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface EmailRegistrationIdentifierTable<\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 /** Atomic mailbox registration may reassign an unverified binding in place.\n * Only subjectId, verifiedAt and bindingRevision change; the supplied proof\n * authority must admit only absent or active-unverified registration targets.\n * Its prior subject's mapped securityRevision advances in the same commit. */\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n readonly isMutableTarget: (row: Identifier[\"select\"]) => boolean;\n readonly d1MutableTargetCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n readonly bindingRevision: SecurityRevision;\n }) => Expression;\n readonly encodeVerifiedInsert: (input: {\n readonly identifier: LoginIdentifier;\n readonly subjectId: NativeSubjectId;\n readonly verifiedAtMillis: number;\n readonly bindingRevision: SecurityRevision;\n }) => Identifier[\"insert\"];\n}\n\nexport interface EmailRegistrationCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly identifierNamespace: ColumnKey<Credential>;\n readonly identifierValue: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly status: ColumnKey<Credential>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly activeStatusValue: unknown;\n readonly encodeVerifiedInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly identifier: LoginIdentifier;\n readonly credentialRevision: SecurityRevision;\n }) => Credential[\"insert\"];\n}\n\nexport interface EmailRegistrationAuthorityCredentialTable<\n Credential extends Table,\n NativeSubjectId,\n> {\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 activeStatusValue: unknown;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n}\n\nexport interface RequiredEmailRegistrationConstraints extends RequiredEmailSignInConstraints {\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredEmailRegistrationConstraints: RequiredEmailRegistrationConstraints = {\n ...requiredEmailSignInConstraints,\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\ntype EmailRegistrationBase<Registration> = {\n readonly inspect: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => Effect.Effect<\n { readonly eligible: boolean; readonly fingerprint: TokenDigest },\n PersistenceMappingError\n >;\n readonly snapshotRegistration: (\n registration: Registration,\n ) => Effect.Effect<Registration, PersistenceMappingError>;\n readonly snapshotRegistrationSync?: (registration: Registration) => Registration;\n readonly inspectSync?: (input: {\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n }) => { readonly eligible: boolean; readonly fingerprint: TokenDigest };\n};\n\nexport type EmailRegistrationMapping<\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> = EmailRegistrationBase<Registration> & {\n readonly mode: \"atomic\";\n readonly clock: ProofClock<Expression>;\n readonly d1?: { readonly primary: true };\n readonly subject: EmailSubjectReadTable<Subject>;\n readonly identifier: EmailRegistrationIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: EmailRegistrationCredentialTable<Credential, NativeSubjectId>;\n readonly authorityCredential: EmailRegistrationAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredEmailRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n readonly provisioning: EmailRegistrationProvisioning<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 AnyEmailSignInMapping = EmailSignInMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown\n>;\n\nexport type AnyEmailAddressMapping<Expression extends SqlExpression = SqlExpression> =\n EmailAddressMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyEmailRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = EmailRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";AA2JA,MAAa,iCAAiE;CAC5E,qBAAqB;CACrB,YAAY;CACZ,cAAc;CACd,sBACE;AACJ;AAsBA,MAAa,kCAAmE;CAC9E,GAAG;CACH,qBAAqB;AACvB;AA4IA,MAAa,uCAA6E;CACxF,GAAG;CACH,qBAAqB;AACvB"}
|
|
@@ -1,166 +1,50 @@
|
|
|
1
|
-
import { SqlExpression, TableModel } from "../
|
|
1
|
+
import { SqlExpression, TableModel } from "../table-model.mjs";
|
|
2
2
|
import { SubjectIdCodec } from "./common.mjs";
|
|
3
|
-
import { OAuthAuthorityReadTable, OAuthClock, OAuthCredentialReadTable, OAuthFlowTable,
|
|
4
|
-
import { AuthenticationRequirement } from "@yielded/auth/Sessions";
|
|
3
|
+
import { OAuthAuthorityReadTable, OAuthClock, OAuthCredentialReadTable, OAuthFlowTable, OAuthOwnershipReadTable, OAuthOwnershipTable, OAuthSubjectReadTable } from "./oauth-model.mjs";
|
|
5
4
|
import * as M from "@yielded/auth/OAuth";
|
|
6
|
-
import { OAuthAccountRevision } from "@yielded/auth/OAuth";
|
|
7
5
|
declare namespace oauth_connected_model_d_exports {
|
|
8
|
-
export { OAuthConnectedAction,
|
|
6
|
+
export { OAuthConnectedAction, OAuthConnectedGrantTable, OAuthConnectedMapping, OAuthConnectedPolicyInput, OAuthConnectedRevocationJobTable, OAuthConnectedRevocationMapping, OAuthConnectedSqlPolicy, requiredOAuthConnectedConstraints, requiredOAuthConnectedRevocationConstraints };
|
|
9
7
|
}
|
|
10
8
|
type Column<T extends TableModel> = T["column"];
|
|
11
9
|
export type OAuthConnectedAction = M.OAuthConnectedActionChallenge["action"];
|
|
12
|
-
|
|
13
|
-
readonly decodeActionRequirement: (row: S["select"], action: OAuthConnectedAction) => AuthenticationRequirement;
|
|
14
|
-
}
|
|
15
|
-
/** All mapped order columns use exact SQL integer comparison through 2^53-1.
|
|
16
|
-
* These codecs bridge driver representations, not alternative ordering rules. */
|
|
17
|
-
export interface OAuthConnectedOrderCodec {
|
|
18
|
-
readonly encode: (order: number) => unknown;
|
|
19
|
-
readonly decode: (value: unknown) => number;
|
|
20
|
-
}
|
|
21
|
-
export interface OAuthConnectedFlowTable<F extends TableModel, N> {
|
|
22
|
-
readonly table: F["table"];
|
|
23
|
-
readonly moduleId: Column<F>;
|
|
24
|
-
readonly flowId: Column<F>;
|
|
25
|
-
readonly commandId: Column<F>;
|
|
26
|
-
readonly subjectId: Column<F>;
|
|
27
|
-
readonly clientKey: Column<F>;
|
|
28
|
-
readonly cohortKey: Column<F>;
|
|
29
|
-
readonly state: Column<F>;
|
|
30
|
-
readonly version: Column<F>;
|
|
31
|
-
readonly stateDigest: Column<F>;
|
|
32
|
-
readonly snapshot: Column<F>;
|
|
33
|
-
readonly claimId: Column<F>;
|
|
34
|
-
readonly claimDigest: Column<F>;
|
|
35
|
-
readonly claimOrder: Column<F>;
|
|
36
|
-
readonly claimedAt: Column<F>;
|
|
37
|
-
readonly claimExpiresAt: Column<F>;
|
|
38
|
-
readonly expiresAt: Column<F>;
|
|
39
|
-
readonly retentionUntil: Column<F>;
|
|
40
|
-
/** None before claim, Unresolved after claim, Resolved only after definite
|
|
41
|
-
* cancellation or atomic transfer to a grant/job. Never reset by cleanup. */
|
|
42
|
-
readonly work: Column<F>;
|
|
43
|
-
/** Exact sealed quarantine when no correctly sealed revocation job is available. */
|
|
44
|
-
readonly custody: Column<F>;
|
|
45
|
-
/** Required when retaining grants during sign-in. subjectId is NULL until
|
|
46
|
-
* identity resolution; custom required columns are supplied by this encoder. */
|
|
47
|
-
readonly encodeSignIn?: (reservation: M.OAuthSignInAccessClaim) => F["insert"];
|
|
48
|
-
readonly encodeInsert: (input: {
|
|
49
|
-
readonly flow: M.OAuthConnectedPendingFlow;
|
|
50
|
-
readonly subjectId: N;
|
|
51
|
-
}) => F["insert"];
|
|
52
|
-
}
|
|
10
|
+
/** Immutable sealed data plus the exact refresh compare-and-set fields. */
|
|
53
11
|
export interface OAuthConnectedGrantTable<G extends TableModel, N> {
|
|
54
12
|
readonly table: G["table"];
|
|
55
13
|
readonly moduleId: Column<G>;
|
|
56
14
|
readonly grantId: Column<G>;
|
|
57
15
|
readonly subjectId: Column<G>;
|
|
58
16
|
readonly identityKey: Column<G>;
|
|
59
|
-
/** Nullable unique active slot; historical/disconnected records use null. */
|
|
60
|
-
readonly activeIdentityKey: Column<G>;
|
|
61
|
-
readonly clientKey: Column<G>;
|
|
62
|
-
readonly cohortKey: Column<G>;
|
|
63
17
|
readonly profileKey: Column<G>;
|
|
64
18
|
readonly grantVersion: Column<G>;
|
|
65
19
|
readonly tokenVersion: Column<G>;
|
|
66
|
-
readonly cohortGeneration: Column<G>;
|
|
67
20
|
readonly state: Column<G>;
|
|
68
|
-
readonly
|
|
69
|
-
|
|
70
|
-
readonly sealed: Column<G>;
|
|
71
|
-
/** Canonical OAuthConnectedSummary only: list never loads token envelopes. */
|
|
21
|
+
readonly snapshot: Column<G>;
|
|
22
|
+
/** Listing selects this bounded projection, never encrypted token material. */
|
|
72
23
|
readonly summary: Column<G>;
|
|
73
|
-
readonly
|
|
74
|
-
readonly
|
|
75
|
-
readonly
|
|
24
|
+
readonly refreshClaimId: Column<G>;
|
|
25
|
+
readonly refreshNextTokenVersion: Column<G>;
|
|
26
|
+
readonly refreshClaimedAt: Column<G>;
|
|
76
27
|
readonly refreshClaimExpiresAt: Column<G>;
|
|
77
|
-
readonly
|
|
28
|
+
readonly expiresAt: Column<G>;
|
|
78
29
|
readonly encodeInsert: (input: {
|
|
79
30
|
readonly grant: M.OAuthConnectedStoredGrant;
|
|
80
31
|
readonly subjectId: N;
|
|
81
32
|
}) => G["insert"];
|
|
82
33
|
}
|
|
83
|
-
/**
|
|
84
|
-
*
|
|
85
|
-
* actual profile registrations are nonempty. Scope counter stays zero. */
|
|
86
|
-
export interface OAuthConnectedClientRegistrationTable<C extends TableModel> {
|
|
87
|
-
readonly table: C["table"];
|
|
88
|
-
readonly clientKey: Column<C>;
|
|
89
|
-
readonly provider: Column<C>;
|
|
90
|
-
readonly issuer: Column<C>;
|
|
91
|
-
readonly clientRegistrationId: Column<C>;
|
|
92
|
-
readonly counter: Column<C>;
|
|
93
|
-
readonly version: Column<C>;
|
|
94
|
-
readonly encodeInsert: (configuration: M.OAuthConnectedConfiguration) => C["insert"];
|
|
95
|
-
}
|
|
96
|
-
/** Remote authority: no local-subject column or subject-scoped key. Retain this
|
|
97
|
-
* anchor/cutoff when a legitimately released tuple gains a different local owner. */
|
|
98
|
-
export interface OAuthConnectedCohortTable<C extends TableModel> {
|
|
99
|
-
readonly table: C["table"];
|
|
100
|
-
readonly cohortKey: Column<C>;
|
|
101
|
-
readonly clientKey: Column<C>;
|
|
102
|
-
readonly identityKey: Column<C>;
|
|
103
|
-
readonly generation: Column<C>;
|
|
104
|
-
readonly cutoff: Column<C>;
|
|
105
|
-
readonly state: Column<C>;
|
|
106
|
-
readonly version: Column<C>;
|
|
107
|
-
readonly encodeInsert: (input: {
|
|
108
|
-
readonly clientKey: string;
|
|
109
|
-
readonly identityKey: string;
|
|
110
|
-
}) => C["insert"];
|
|
111
|
-
}
|
|
112
|
-
export interface OAuthConnectedAdmissionTable<A extends TableModel, N> {
|
|
113
|
-
readonly table: A["table"];
|
|
114
|
-
readonly admissionId: Column<A>;
|
|
115
|
-
readonly moduleId: Column<A>;
|
|
116
|
-
readonly grantId: Column<A>;
|
|
117
|
-
readonly subjectId: Column<A>;
|
|
118
|
-
readonly identityKey: Column<A>;
|
|
119
|
-
readonly clientKey: Column<A>;
|
|
120
|
-
readonly cohortKey: Column<A>;
|
|
121
|
-
readonly snapshot: Column<A>;
|
|
122
|
-
readonly admittedAt: Column<A>;
|
|
123
|
-
readonly expiresAt: Column<A>;
|
|
124
|
-
readonly version: Column<A>;
|
|
125
|
-
readonly encodeInsert: (input: {
|
|
126
|
-
readonly admissionId: string;
|
|
127
|
-
readonly grant: M.OAuthConnectedStoredGrant;
|
|
128
|
-
readonly authorization: M.OAuthConnectedUseAuthorization;
|
|
129
|
-
readonly subjectId: N;
|
|
130
|
-
}) => A["insert"];
|
|
131
|
-
}
|
|
132
|
-
export interface OAuthConnectedCommandTable<C extends TableModel, N> {
|
|
133
|
-
readonly table: C["table"];
|
|
134
|
-
readonly moduleId: Column<C>;
|
|
135
|
-
readonly commandId: Column<C>;
|
|
136
|
-
readonly subjectId: Column<C>;
|
|
137
|
-
readonly grantId: Column<C>;
|
|
138
|
-
readonly intent: Column<C>;
|
|
139
|
-
readonly decision: Column<C>;
|
|
140
|
-
readonly retentionUntil: Column<C>;
|
|
141
|
-
readonly version: Column<C>;
|
|
142
|
-
readonly encodeInsert: (input: {
|
|
143
|
-
readonly commandId: string;
|
|
144
|
-
readonly grant: M.OAuthConnectedDisconnectGrant;
|
|
145
|
-
readonly subjectId: N;
|
|
146
|
-
}) => C["insert"];
|
|
147
|
-
}
|
|
34
|
+
/** Optional provider revocation retains the exact removed grant ciphertext. A
|
|
35
|
+
* possibly spent claim is never reset to Pending or reclaimed after timeout. */
|
|
148
36
|
export interface OAuthConnectedRevocationJobTable<J extends TableModel, N> {
|
|
149
37
|
readonly table: J["table"];
|
|
150
38
|
readonly jobId: Column<J>;
|
|
151
39
|
readonly moduleId: Column<J>;
|
|
152
40
|
readonly subjectId: Column<J>;
|
|
153
41
|
readonly identityKey: Column<J>;
|
|
154
|
-
readonly clientKey: Column<J>;
|
|
155
|
-
readonly cohortKey: Column<J>;
|
|
156
|
-
readonly grantId: Column<J>;
|
|
157
42
|
readonly snapshot: Column<J>;
|
|
158
43
|
readonly state: Column<J>;
|
|
159
44
|
readonly claimId: Column<J>;
|
|
160
45
|
readonly claimedAt: Column<J>;
|
|
161
46
|
readonly claimExpiresAt: Column<J>;
|
|
162
47
|
readonly retentionUntil: Column<J>;
|
|
163
|
-
readonly version: Column<J>;
|
|
164
48
|
readonly encodeInsert: (input: {
|
|
165
49
|
readonly job: M.OAuthConnectedRevocationJob;
|
|
166
50
|
readonly subjectId: N;
|
|
@@ -168,125 +52,72 @@ export interface OAuthConnectedRevocationJobTable<J extends TableModel, N> {
|
|
|
168
52
|
}
|
|
169
53
|
export type OAuthConnectedPolicyInput<N> = {
|
|
170
54
|
readonly subjectId: N;
|
|
171
|
-
readonly revision: OAuthAccountRevision;
|
|
55
|
+
readonly revision: M.OAuthAccountRevision;
|
|
172
56
|
} & ({
|
|
173
57
|
readonly kind: "action";
|
|
174
|
-
readonly operation: "
|
|
58
|
+
readonly operation: "settle" | "disconnect";
|
|
175
59
|
readonly authorization: M.OAuthConnectedActionAuthorization;
|
|
176
|
-
readonly configuration: M.OAuthConnectedConfiguration;
|
|
177
60
|
readonly grant?: M.OAuthConnectedTokenContext;
|
|
178
61
|
} | {
|
|
179
62
|
readonly kind: "sign-in";
|
|
180
63
|
readonly credential: M.OAuthCredentialSnapshot;
|
|
181
|
-
readonly
|
|
182
|
-
readonly grant?: M.OAuthConnectedTokenContext;
|
|
64
|
+
readonly grant: M.OAuthConnectedTokenContext;
|
|
183
65
|
} | {
|
|
184
66
|
readonly kind: "metadata" | "use";
|
|
185
67
|
readonly authorization: M.OAuthConnectedUseAuthorization;
|
|
186
68
|
readonly grant?: M.OAuthConnectedTokenContext;
|
|
187
69
|
});
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;
|
|
192
|
-
}
|
|
193
|
-
export interface OAuthConnectedPolicyGuard<N, Expression extends SqlExpression = SqlExpression, Descriptor extends object = object> {
|
|
194
|
-
readonly table: Descriptor;
|
|
195
|
-
readonly orderBy: string;
|
|
196
|
-
readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;
|
|
197
|
-
}
|
|
198
|
-
export declare const oauthConnectedPolicyGuard: <T extends TableModel, N, Expression extends SqlExpression = SqlExpression>(input: OAuthConnectedPolicyGuardTable<T, N, Expression>) => OAuthConnectedPolicyGuard<N, Expression, T["table"]>;
|
|
199
|
-
export interface OAuthConnectedSqlPolicy<N, Expression extends SqlExpression = SqlExpression, Descriptor extends object = object> {
|
|
200
|
-
/** Up to 32 scopes, each selecting 1..64 stable rows in global lock order.
|
|
201
|
-
* Omit only when subject/shared authority locks already serialize every mutable
|
|
202
|
-
* policy dependency or policy is immutable. All writers follow that order. */
|
|
203
|
-
readonly guards?: ReadonlyArray<OAuthConnectedPolicyGuard<N, Expression, Descriptor>>;
|
|
204
|
-
/** Recheck exact policy revision, purpose, optional grant/profile restrictions
|
|
205
|
-
* and current profile/permissions; joins and absence assumptions are authority.
|
|
206
|
-
* The engine checks this before and after every owner/application write. */
|
|
70
|
+
/** Changes to mutable policy advance the same subject security revision. This
|
|
71
|
+
* predicate participates in the guarded write and final application postcondition. */
|
|
72
|
+
export interface OAuthConnectedSqlPolicy<N, Expression extends SqlExpression = SqlExpression> {
|
|
207
73
|
readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;
|
|
208
74
|
}
|
|
209
75
|
export declare const requiredOAuthConnectedConstraints: {
|
|
210
|
-
readonly flow: "unique(
|
|
211
|
-
readonly
|
|
212
|
-
readonly
|
|
213
|
-
readonly client: "unique(connectedClient.clientKey)";
|
|
214
|
-
readonly cohort: "unique(connectedCohort.cohortKey)";
|
|
76
|
+
readonly flow: "unique(flow.moduleId,flow.flowId)";
|
|
77
|
+
readonly stateDigest: "unique(flow.stateDigest)";
|
|
78
|
+
readonly ownership: "unique(ownership.identityKey)";
|
|
215
79
|
readonly grant: "unique(connectedGrant.moduleId,connectedGrant.grantId)";
|
|
216
|
-
readonly
|
|
217
|
-
readonly
|
|
218
|
-
readonly command: "unique(connectedCommand.moduleId,connectedCommand.commandId)";
|
|
80
|
+
readonly activeIdentity: "unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.identityKey)";
|
|
81
|
+
readonly authorityCredential: "unique(authority.subjectId,authority.credentialId)";
|
|
219
82
|
};
|
|
220
83
|
export declare const requiredOAuthConnectedRevocationConstraints: {
|
|
221
84
|
readonly job: "unique(connectedRevocation.jobId)";
|
|
222
85
|
};
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
readonly
|
|
226
|
-
readonly
|
|
227
|
-
} | {
|
|
228
|
-
readonly mode: "separate";
|
|
229
|
-
readonly tuple: Omit<OAuthOwnershipMutation<T, O, N, Expression>["tuple"], "encodeInsert">;
|
|
230
|
-
readonly external: Omit<Extract<OAuthOwnershipMutation<T, O, N, Expression>, {
|
|
231
|
-
readonly mode: "separate";
|
|
232
|
-
}>["external"], "encodeInsert">;
|
|
233
|
-
};
|
|
234
|
-
export interface OAuthConnectedAuthorityMapping<T extends TableModel, O extends TableModel, F extends TableModel, G extends TableModel, C extends TableModel, H extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
|
|
235
|
-
readonly ownership: OAuthConnectedOwnershipRead<T, O, N, Expression>;
|
|
86
|
+
export interface OAuthConnectedMapping<S extends TableModel, AC extends TableModel, O extends TableModel, F extends TableModel, G extends TableModel, N, J extends TableModel = TableModel, Expression extends SqlExpression = SqlExpression, SignIn extends TableModel = TableModel> {
|
|
87
|
+
readonly ownership: OAuthOwnershipTable<O, N>;
|
|
88
|
+
readonly subject: OAuthSubjectReadTable<S, Expression>;
|
|
89
|
+
readonly authority: OAuthAuthorityReadTable<AC, Expression>;
|
|
236
90
|
readonly subjectId: SubjectIdCodec<N>;
|
|
237
|
-
readonly flow:
|
|
238
|
-
readonly grant: Omit<OAuthConnectedGrantTable<G, N>, "encodeInsert">;
|
|
239
|
-
readonly client: Omit<OAuthConnectedClientRegistrationTable<C>, "encodeInsert">;
|
|
240
|
-
readonly cohort: Omit<OAuthConnectedCohortTable<H>, "encodeInsert">;
|
|
241
|
-
readonly clock: OAuthClock<Expression>;
|
|
242
|
-
readonly order: OAuthConnectedOrderCodec;
|
|
243
|
-
readonly tupleConstraints: typeof requiredOAuthTupleConstraints;
|
|
244
|
-
/** Safe metadata retention, never an expiry/quiescence proof for unresolved work. */
|
|
245
|
-
readonly retentionMillis: number;
|
|
246
|
-
}
|
|
247
|
-
export interface OAuthConnectedMapping<S extends TableModel, AC extends TableModel, T extends TableModel, O extends TableModel, F extends TableModel, G extends TableModel, C extends TableModel, H extends TableModel, A extends TableModel, D extends TableModel, N, J extends TableModel = never, Expression extends SqlExpression = SqlExpression, Descriptor extends object = object, SignIn extends TableModel = TableModel> extends OAuthConnectedAuthorityMapping<T, O, F, G, C, H, N, Expression> {
|
|
248
|
-
readonly ownership: OAuthOwnershipMutation<T, O, N, Expression>;
|
|
249
|
-
readonly flow: OAuthConnectedFlowTable<F, N>;
|
|
91
|
+
readonly flow: OAuthFlowTable<F>;
|
|
250
92
|
readonly grant: OAuthConnectedGrantTable<G, N>;
|
|
251
|
-
readonly
|
|
252
|
-
readonly
|
|
253
|
-
readonly
|
|
254
|
-
readonly authority: OAuthAuthorityReadTable<AC, Expression>;
|
|
255
|
-
readonly admission: OAuthConnectedAdmissionTable<A, N>;
|
|
256
|
-
/** Same shared sign-in tables used by OAuthSignInPersistence. Enable only
|
|
257
|
-
* alongside a nullable connected-flow subjectId and flow.encodeSignIn. */
|
|
258
|
-
readonly signIn?: {
|
|
259
|
-
readonly credential: OAuthCredentialReadTable<SignIn, Expression>;
|
|
260
|
-
readonly flow: OAuthFlowTable<SignIn>;
|
|
261
|
-
};
|
|
262
|
-
readonly command: OAuthConnectedCommandTable<D, N>;
|
|
263
|
-
readonly policy: OAuthConnectedSqlPolicy<N, Expression, Descriptor>;
|
|
93
|
+
readonly credential?: OAuthCredentialReadTable<SignIn, Expression>;
|
|
94
|
+
readonly clock: OAuthClock<Expression>;
|
|
95
|
+
readonly policy: OAuthConnectedSqlPolicy<N, Expression>;
|
|
264
96
|
readonly constraints: typeof requiredOAuthConnectedConstraints;
|
|
265
97
|
readonly revocation: {
|
|
266
98
|
readonly mode: "unsupported";
|
|
267
99
|
} | {
|
|
268
|
-
readonly mode: "
|
|
100
|
+
readonly mode: "provider";
|
|
269
101
|
readonly job: OAuthConnectedRevocationJobTable<J, N>;
|
|
102
|
+
readonly retentionMillis: number;
|
|
270
103
|
readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;
|
|
271
104
|
};
|
|
272
|
-
/**
|
|
273
|
-
|
|
274
|
-
* work. This pure SQL constructor supports both bound values and correlated
|
|
275
|
-
* column expressions with identical semantics; it performs no I/O.
|
|
276
|
-
* Compare through the reference table's typed columns (for example, eq) so
|
|
277
|
-
* native values use their encoders. Back the same-owner lookup with an index:
|
|
278
|
-
* discovery applies this predicate before its candidate limit.
|
|
279
|
-
* Connected references are checked separately. */
|
|
280
|
-
readonly externalReference?: (input: {
|
|
105
|
+
/** Indexed same-owner predicate for installed references beyond these grants/jobs. */
|
|
106
|
+
readonly otherReferences: (input: {
|
|
281
107
|
readonly identityKey: string;
|
|
282
108
|
readonly subjectId: N;
|
|
283
|
-
} | {
|
|
284
|
-
readonly identityKey: Expression;
|
|
285
|
-
readonly subjectId: Expression;
|
|
286
109
|
}) => Expression;
|
|
287
110
|
}
|
|
288
|
-
export interface OAuthConnectedRevocationMapping<
|
|
111
|
+
export interface OAuthConnectedRevocationMapping<O extends TableModel, G extends TableModel, J extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
|
|
112
|
+
readonly ownership: OAuthOwnershipReadTable<O, N>;
|
|
113
|
+
readonly subjectId: SubjectIdCodec<N>;
|
|
114
|
+
readonly grant: Omit<OAuthConnectedGrantTable<G, N>, "encodeInsert">;
|
|
289
115
|
readonly job: Omit<OAuthConnectedRevocationJobTable<J, N>, "encodeInsert">;
|
|
116
|
+
readonly clock: OAuthClock<Expression>;
|
|
117
|
+
readonly otherReferences: (input: {
|
|
118
|
+
readonly identityKey: string;
|
|
119
|
+
readonly subjectId: N;
|
|
120
|
+
}) => Expression;
|
|
290
121
|
readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;
|
|
291
122
|
}
|
|
292
123
|
//#endregion
|
|
@@ -1,22 +1,14 @@
|
|
|
1
1
|
//#region src/internal/models/oauth-connected-model.ts
|
|
2
|
-
const oauthConnectedPolicyGuard = (input) => Object.freeze({
|
|
3
|
-
table: input.table,
|
|
4
|
-
orderBy: input.orderBy,
|
|
5
|
-
condition: input.condition
|
|
6
|
-
});
|
|
7
2
|
const requiredOAuthConnectedConstraints = {
|
|
8
|
-
flow: "unique(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
client: "unique(connectedClient.clientKey)",
|
|
12
|
-
cohort: "unique(connectedCohort.cohortKey)",
|
|
3
|
+
flow: "unique(flow.moduleId,flow.flowId)",
|
|
4
|
+
stateDigest: "unique(flow.stateDigest)",
|
|
5
|
+
ownership: "unique(ownership.identityKey)",
|
|
13
6
|
grant: "unique(connectedGrant.moduleId,connectedGrant.grantId)",
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
command: "unique(connectedCommand.moduleId,connectedCommand.commandId)"
|
|
7
|
+
activeIdentity: "unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.identityKey)",
|
|
8
|
+
authorityCredential: "unique(authority.subjectId,authority.credentialId)"
|
|
17
9
|
};
|
|
18
10
|
const requiredOAuthConnectedRevocationConstraints = { job: "unique(connectedRevocation.jobId)" };
|
|
19
11
|
//#endregion
|
|
20
|
-
export {
|
|
12
|
+
export { requiredOAuthConnectedConstraints, requiredOAuthConnectedRevocationConstraints };
|
|
21
13
|
|
|
22
14
|
//# sourceMappingURL=oauth-connected-model.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-connected-model.mjs","names":[],"sources":["../../../src/internal/models/oauth-connected-model.ts"],"sourcesContent":["import type { OAuthAccountRevision } from \"@yielded/auth/OAuth\";\nimport type * as M from \"@yielded/auth/OAuth\";\nimport type { AuthenticationRequirement } from \"@yielded/auth/Sessions\";\n\nimport type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { SubjectIdCodec } from \"./common\";\nimport type {\n OAuthAuthorityReadTable,\n OAuthClock,\n OAuthCredentialReadTable,\n OAuthFlowTable,\n OAuthOwnershipMutation,\n OAuthSubjectReadTable,\n requiredOAuthTupleConstraints,\n} from \"./oauth-model\";\n\ntype Column<T extends Table> = T[\"column\"];\nexport type OAuthConnectedAction = M.OAuthConnectedActionChallenge[\"action\"];\n\nexport interface OAuthConnectedSubjectTable<\n S extends Table,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthSubjectReadTable<S, Expression> {\n readonly decodeActionRequirement: (\n row: S[\"select\"],\n action: OAuthConnectedAction,\n ) => AuthenticationRequirement;\n}\n\n/** All mapped order columns use exact SQL integer comparison through 2^53-1.\n * These codecs bridge driver representations, not alternative ordering rules. */\nexport interface OAuthConnectedOrderCodec {\n readonly encode: (order: number) => unknown;\n readonly decode: (value: unknown) => number;\n}\n\nexport interface OAuthConnectedFlowTable<F extends Table, N> {\n readonly table: F[\"table\"];\n readonly moduleId: Column<F>;\n readonly flowId: Column<F>;\n readonly commandId: Column<F>;\n readonly subjectId: Column<F>;\n readonly clientKey: Column<F>;\n readonly cohortKey: Column<F>;\n readonly state: Column<F>;\n readonly version: Column<F>;\n readonly stateDigest: Column<F>;\n readonly snapshot: Column<F>;\n readonly claimId: Column<F>;\n readonly claimDigest: Column<F>;\n readonly claimOrder: Column<F>;\n readonly claimedAt: Column<F>;\n readonly claimExpiresAt: Column<F>;\n readonly expiresAt: Column<F>;\n readonly retentionUntil: Column<F>;\n /** None before claim, Unresolved after claim, Resolved only after definite\n * cancellation or atomic transfer to a grant/job. Never reset by cleanup. */\n readonly work: Column<F>;\n /** Exact sealed quarantine when no correctly sealed revocation job is available. */\n readonly custody: Column<F>;\n /** Required when retaining grants during sign-in. subjectId is NULL until\n * identity resolution; custom required columns are supplied by this encoder. */\n readonly encodeSignIn?: (reservation: M.OAuthSignInAccessClaim) => F[\"insert\"];\n readonly encodeInsert: (input: {\n readonly flow: M.OAuthConnectedPendingFlow;\n readonly subjectId: N;\n }) => F[\"insert\"];\n}\n\nexport interface OAuthConnectedGrantTable<G extends Table, N> {\n readonly table: G[\"table\"];\n readonly moduleId: Column<G>;\n readonly grantId: Column<G>;\n readonly subjectId: Column<G>;\n readonly identityKey: Column<G>;\n /** Nullable unique active slot; historical/disconnected records use null. */\n readonly activeIdentityKey: Column<G>;\n readonly clientKey: Column<G>;\n readonly cohortKey: Column<G>;\n readonly profileKey: Column<G>;\n readonly grantVersion: Column<G>;\n readonly tokenVersion: Column<G>;\n readonly cohortGeneration: Column<G>;\n readonly state: Column<G>;\n readonly version: Column<G>;\n readonly context: Column<G>;\n readonly sealed: Column<G>;\n /** Canonical OAuthConnectedSummary only: list never loads token envelopes. */\n readonly summary: Column<G>;\n readonly revocationJobId: Column<G>;\n readonly refreshWork: Column<G>;\n readonly refreshClaim: Column<G>;\n readonly refreshClaimExpiresAt: Column<G>;\n readonly retentionUntil: Column<G>;\n readonly encodeInsert: (input: {\n readonly grant: M.OAuthConnectedStoredGrant;\n readonly subjectId: N;\n }) => G[\"insert\"];\n}\n\n/** Also stores a permanent provider/issuer scope anchor. clientKey must fit 52\n * ASCII characters. Empty clientRegistrationId is reserved for that anchor;\n * actual profile registrations are nonempty. Scope counter stays zero. */\nexport interface OAuthConnectedClientRegistrationTable<C extends Table> {\n readonly table: C[\"table\"];\n readonly clientKey: Column<C>;\n readonly provider: Column<C>;\n readonly issuer: Column<C>;\n readonly clientRegistrationId: Column<C>;\n readonly counter: Column<C>;\n readonly version: Column<C>;\n readonly encodeInsert: (configuration: M.OAuthConnectedConfiguration) => C[\"insert\"];\n}\n\n/** Remote authority: no local-subject column or subject-scoped key. Retain this\n * anchor/cutoff when a legitimately released tuple gains a different local owner. */\nexport interface OAuthConnectedCohortTable<C extends Table> {\n readonly table: C[\"table\"];\n readonly cohortKey: Column<C>;\n readonly clientKey: Column<C>;\n readonly identityKey: Column<C>;\n readonly generation: Column<C>;\n readonly cutoff: Column<C>;\n readonly state: Column<C>;\n readonly version: Column<C>;\n readonly encodeInsert: (input: {\n readonly clientKey: string;\n readonly identityKey: string;\n }) => C[\"insert\"];\n}\n\nexport interface OAuthConnectedAdmissionTable<A extends Table, N> {\n readonly table: A[\"table\"];\n readonly admissionId: Column<A>;\n readonly moduleId: Column<A>;\n readonly grantId: Column<A>;\n readonly subjectId: Column<A>;\n readonly identityKey: Column<A>;\n readonly clientKey: Column<A>;\n readonly cohortKey: Column<A>;\n readonly snapshot: Column<A>;\n readonly admittedAt: Column<A>;\n readonly expiresAt: Column<A>;\n readonly version: Column<A>;\n readonly encodeInsert: (input: {\n readonly admissionId: string;\n readonly grant: M.OAuthConnectedStoredGrant;\n readonly authorization: M.OAuthConnectedUseAuthorization;\n readonly subjectId: N;\n }) => A[\"insert\"];\n}\n\nexport interface OAuthConnectedCommandTable<C extends Table, N> {\n readonly table: C[\"table\"];\n readonly moduleId: Column<C>;\n readonly commandId: Column<C>;\n readonly subjectId: Column<C>;\n readonly grantId: Column<C>;\n readonly intent: Column<C>;\n readonly decision: Column<C>;\n readonly retentionUntil: Column<C>;\n readonly version: Column<C>;\n readonly encodeInsert: (input: {\n readonly commandId: string;\n readonly grant: M.OAuthConnectedDisconnectGrant;\n readonly subjectId: N;\n }) => C[\"insert\"];\n}\n\nexport interface OAuthConnectedRevocationJobTable<J extends Table, N> {\n readonly table: J[\"table\"];\n readonly jobId: Column<J>;\n readonly moduleId: Column<J>;\n readonly subjectId: Column<J>;\n readonly identityKey: Column<J>;\n readonly clientKey: Column<J>;\n readonly cohortKey: Column<J>;\n readonly grantId: Column<J>;\n readonly snapshot: Column<J>;\n readonly state: Column<J>;\n readonly claimId: Column<J>;\n readonly claimedAt: Column<J>;\n readonly claimExpiresAt: Column<J>;\n readonly retentionUntil: Column<J>;\n readonly version: Column<J>;\n readonly encodeInsert: (input: {\n readonly job: M.OAuthConnectedRevocationJob;\n readonly subjectId: N;\n }) => J[\"insert\"];\n}\n\nexport type OAuthConnectedPolicyInput<N> = {\n readonly subjectId: N;\n readonly revision: OAuthAccountRevision;\n} & (\n | {\n readonly kind: \"action\";\n readonly operation: \"issue\" | \"claim\" | \"settle\" | \"disconnect\";\n readonly authorization: M.OAuthConnectedActionAuthorization;\n readonly configuration: M.OAuthConnectedConfiguration;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"sign-in\";\n readonly credential: M.OAuthCredentialSnapshot;\n readonly configuration: M.OAuthConnectedConfiguration;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"metadata\" | \"use\";\n readonly authorization: M.OAuthConnectedUseAuthorization;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n);\n\nexport interface OAuthConnectedPolicyGuardTable<\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: T[\"table\"];\n readonly orderBy: Column<T>;\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport interface OAuthConnectedPolicyGuard<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n readonly table: Descriptor;\n readonly orderBy: string;\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport const oauthConnectedPolicyGuard = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(\n input: OAuthConnectedPolicyGuardTable<T, N, Expression>,\n): OAuthConnectedPolicyGuard<N, Expression, T[\"table\"]> =>\n Object.freeze({\n table: input.table,\n orderBy: input.orderBy,\n condition: input.condition,\n });\n\nexport interface OAuthConnectedSqlPolicy<\n N,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n> {\n /** Up to 32 scopes, each selecting 1..64 stable rows in global lock order.\n * Omit only when subject/shared authority locks already serialize every mutable\n * policy dependency or policy is immutable. All writers follow that order. */\n readonly guards?: ReadonlyArray<OAuthConnectedPolicyGuard<N, Expression, Descriptor>>;\n /** Recheck exact policy revision, purpose, optional grant/profile restrictions\n * and current profile/permissions; joins and absence assumptions are authority.\n * The engine checks this before and after every owner/application write. */\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport const requiredOAuthConnectedConstraints = {\n flow: \"unique(connectedFlow.moduleId,connectedFlow.flowId)\",\n flowCommand: \"unique(connectedFlow.moduleId,connectedFlow.commandId)\",\n stateDigest: \"unique(connectedFlow.stateDigest)\",\n client: \"unique(connectedClient.clientKey)\",\n cohort: \"unique(connectedCohort.cohortKey)\",\n grant: \"unique(connectedGrant.moduleId,connectedGrant.grantId)\",\n grantIdentity:\n \"unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.activeIdentityKey)\",\n admission: \"unique(connectedAdmission.admissionId)\",\n command: \"unique(connectedCommand.moduleId,connectedCommand.commandId)\",\n} as const;\n\nexport const requiredOAuthConnectedRevocationConstraints = {\n job: \"unique(connectedRevocation.jobId)\",\n} as const;\n\n/** Existing ownership only; workers never allocate or acquire a tuple. */\nexport type OAuthConnectedOwnershipRead<\n T extends Table,\n O extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> =\n | {\n readonly mode: \"integrated\";\n readonly tuple: Omit<OAuthOwnershipMutation<T, O, N, Expression>[\"tuple\"], \"encodeInsert\">;\n }\n | {\n readonly mode: \"separate\";\n readonly tuple: Omit<OAuthOwnershipMutation<T, O, N, Expression>[\"tuple\"], \"encodeInsert\">;\n readonly external: Omit<\n Extract<\n OAuthOwnershipMutation<T, O, N, Expression>,\n { readonly mode: \"separate\" }\n >[\"external\"],\n \"encodeInsert\"\n >;\n };\n\nexport interface OAuthConnectedAuthorityMapping<\n T extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n C extends Table,\n H extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly ownership: OAuthConnectedOwnershipRead<T, O, N, Expression>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly flow: Omit<OAuthConnectedFlowTable<F, N>, \"encodeInsert\">;\n readonly grant: Omit<OAuthConnectedGrantTable<G, N>, \"encodeInsert\">;\n readonly client: Omit<OAuthConnectedClientRegistrationTable<C>, \"encodeInsert\">;\n readonly cohort: Omit<OAuthConnectedCohortTable<H>, \"encodeInsert\">;\n readonly clock: OAuthClock<Expression>;\n readonly order: OAuthConnectedOrderCodec;\n readonly tupleConstraints: typeof requiredOAuthTupleConstraints;\n /** Safe metadata retention, never an expiry/quiescence proof for unresolved work. */\n readonly retentionMillis: number;\n}\n\nexport interface OAuthConnectedMapping<\n S extends Table,\n AC extends Table,\n T extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n C extends Table,\n H extends Table,\n A extends Table,\n D extends Table,\n N,\n J extends Table = never,\n Expression extends SqlExpression = SqlExpression,\n Descriptor extends object = object,\n SignIn extends Table = Table,\n> extends OAuthConnectedAuthorityMapping<T, O, F, G, C, H, N, Expression> {\n readonly ownership: OAuthOwnershipMutation<T, O, N, Expression>;\n readonly flow: OAuthConnectedFlowTable<F, N>;\n readonly grant: OAuthConnectedGrantTable<G, N>;\n readonly client: OAuthConnectedClientRegistrationTable<C>;\n readonly cohort: OAuthConnectedCohortTable<H>;\n readonly subject: OAuthConnectedSubjectTable<S, Expression>;\n readonly authority: OAuthAuthorityReadTable<AC, Expression>;\n readonly admission: OAuthConnectedAdmissionTable<A, N>;\n /** Same shared sign-in tables used by OAuthSignInPersistence. Enable only\n * alongside a nullable connected-flow subjectId and flow.encodeSignIn. */\n readonly signIn?: {\n readonly credential: OAuthCredentialReadTable<SignIn, Expression>;\n readonly flow: OAuthFlowTable<SignIn>;\n };\n readonly command: OAuthConnectedCommandTable<D, N>;\n readonly policy: OAuthConnectedSqlPolicy<N, Expression, Descriptor>;\n readonly constraints: typeof requiredOAuthConnectedConstraints;\n readonly revocation:\n | { readonly mode: \"unsupported\" }\n | {\n readonly mode: \"cohort\";\n readonly job: OAuthConnectedRevocationJobTable<J, N>;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n };\n /** Without an authoritative same-owner predicate, conservatively retain Owned.\n * Include login/other installed references; never filter away former-subject\n * work. This pure SQL constructor supports both bound values and correlated\n * column expressions with identical semantics; it performs no I/O.\n * Compare through the reference table's typed columns (for example, eq) so\n * native values use their encoders. Back the same-owner lookup with an index:\n * discovery applies this predicate before its candidate limit.\n * Connected references are checked separately. */\n readonly externalReference?: (\n input:\n | { readonly identityKey: string; readonly subjectId: N }\n | { readonly identityKey: Expression; readonly subjectId: Expression },\n ) => Expression;\n}\n\nexport interface OAuthConnectedRevocationMapping<\n T extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n C extends Table,\n H extends Table,\n J extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends OAuthConnectedAuthorityMapping<T, O, F, G, C, H, N, Expression> {\n readonly job: Omit<OAuthConnectedRevocationJobTable<J, N>, \"encodeInsert\">;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n}\n"],"mappings":";AA2OA,MAAa,6BAKX,UAEA,OAAO,OAAO;CACZ,OAAO,MAAM;CACb,SAAS,MAAM;CACf,WAAW,MAAM;AACnB,CAAC;AAiBH,MAAa,oCAAoC;CAC/C,MAAM;CACN,aAAa;CACb,aAAa;CACb,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,eACE;CACF,WAAW;CACX,SAAS;AACX;AAEA,MAAa,8CAA8C,EACzD,KAAK,oCACP"}
|
|
1
|
+
{"version":3,"file":"oauth-connected-model.mjs","names":[],"sources":["../../../src/internal/models/oauth-connected-model.ts"],"sourcesContent":["import type * as M from \"@yielded/auth/OAuth\";\n\nimport type { TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { SubjectIdCodec } from \"./common\";\nimport type {\n OAuthAuthorityReadTable,\n OAuthClock,\n OAuthCredentialReadTable,\n OAuthFlowTable,\n OAuthOwnershipTable,\n OAuthOwnershipReadTable,\n OAuthSubjectReadTable,\n} from \"./oauth-model\";\n\ntype Column<T extends Table> = T[\"column\"];\nexport type OAuthConnectedAction = M.OAuthConnectedActionChallenge[\"action\"];\n\n/** Immutable sealed data plus the exact refresh compare-and-set fields. */\nexport interface OAuthConnectedGrantTable<G extends Table, N> {\n readonly table: G[\"table\"];\n readonly moduleId: Column<G>;\n readonly grantId: Column<G>;\n readonly subjectId: Column<G>;\n readonly identityKey: Column<G>;\n readonly profileKey: Column<G>;\n readonly grantVersion: Column<G>;\n readonly tokenVersion: Column<G>;\n readonly state: Column<G>;\n readonly snapshot: Column<G>;\n /** Listing selects this bounded projection, never encrypted token material. */\n readonly summary: Column<G>;\n readonly refreshClaimId: Column<G>;\n readonly refreshNextTokenVersion: Column<G>;\n readonly refreshClaimedAt: Column<G>;\n readonly refreshClaimExpiresAt: Column<G>;\n readonly expiresAt: Column<G>;\n readonly encodeInsert: (input: {\n readonly grant: M.OAuthConnectedStoredGrant;\n readonly subjectId: N;\n }) => G[\"insert\"];\n}\n\n/** Optional provider revocation retains the exact removed grant ciphertext. A\n * possibly spent claim is never reset to Pending or reclaimed after timeout. */\nexport interface OAuthConnectedRevocationJobTable<J extends Table, N> {\n readonly table: J[\"table\"];\n readonly jobId: Column<J>;\n readonly moduleId: Column<J>;\n readonly subjectId: Column<J>;\n readonly identityKey: Column<J>;\n readonly snapshot: Column<J>;\n readonly state: Column<J>;\n readonly claimId: Column<J>;\n readonly claimedAt: Column<J>;\n readonly claimExpiresAt: Column<J>;\n readonly retentionUntil: Column<J>;\n readonly encodeInsert: (input: {\n readonly job: M.OAuthConnectedRevocationJob;\n readonly subjectId: N;\n }) => J[\"insert\"];\n}\n\nexport type OAuthConnectedPolicyInput<N> = {\n readonly subjectId: N;\n readonly revision: M.OAuthAccountRevision;\n} & (\n | {\n readonly kind: \"action\";\n readonly operation: \"settle\" | \"disconnect\";\n readonly authorization: M.OAuthConnectedActionAuthorization;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"sign-in\";\n readonly credential: M.OAuthCredentialSnapshot;\n readonly grant: M.OAuthConnectedTokenContext;\n }\n | {\n readonly kind: \"metadata\" | \"use\";\n readonly authorization: M.OAuthConnectedUseAuthorization;\n readonly grant?: M.OAuthConnectedTokenContext;\n }\n);\n\n/** Changes to mutable policy advance the same subject security revision. This\n * predicate participates in the guarded write and final application postcondition. */\nexport interface OAuthConnectedSqlPolicy<N, Expression extends SqlExpression = SqlExpression> {\n readonly condition: (input: OAuthConnectedPolicyInput<N>) => Expression;\n}\n\nexport const requiredOAuthConnectedConstraints = {\n flow: \"unique(flow.moduleId,flow.flowId)\",\n stateDigest: \"unique(flow.stateDigest)\",\n ownership: \"unique(ownership.identityKey)\",\n grant: \"unique(connectedGrant.moduleId,connectedGrant.grantId)\",\n activeIdentity:\n \"unique(connectedGrant.moduleId,connectedGrant.subjectId,connectedGrant.profileKey,connectedGrant.identityKey)\",\n authorityCredential: \"unique(authority.subjectId,authority.credentialId)\",\n} as const;\n\nexport const requiredOAuthConnectedRevocationConstraints = {\n job: \"unique(connectedRevocation.jobId)\",\n} as const;\n\nexport interface OAuthConnectedMapping<\n S extends Table,\n AC extends Table,\n O extends Table,\n F extends Table,\n G extends Table,\n N,\n J extends Table = Table,\n Expression extends SqlExpression = SqlExpression,\n SignIn extends Table = Table,\n> {\n readonly ownership: OAuthOwnershipTable<O, N>;\n readonly subject: OAuthSubjectReadTable<S, Expression>;\n readonly authority: OAuthAuthorityReadTable<AC, Expression>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly flow: OAuthFlowTable<F>;\n readonly grant: OAuthConnectedGrantTable<G, N>;\n readonly credential?: OAuthCredentialReadTable<SignIn, Expression>;\n readonly clock: OAuthClock<Expression>;\n readonly policy: OAuthConnectedSqlPolicy<N, Expression>;\n readonly constraints: typeof requiredOAuthConnectedConstraints;\n readonly revocation:\n | { readonly mode: \"unsupported\" }\n | {\n readonly mode: \"provider\";\n readonly job: OAuthConnectedRevocationJobTable<J, N>;\n readonly retentionMillis: number;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n };\n /** Indexed same-owner predicate for installed references beyond these grants/jobs. */\n readonly otherReferences: (input: {\n readonly identityKey: string;\n readonly subjectId: N;\n }) => Expression;\n}\n\nexport interface OAuthConnectedRevocationMapping<\n O extends Table,\n G extends Table,\n J extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly ownership: OAuthOwnershipReadTable<O, N>;\n readonly subjectId: SubjectIdCodec<N>;\n readonly grant: Omit<OAuthConnectedGrantTable<G, N>, \"encodeInsert\">;\n readonly job: Omit<OAuthConnectedRevocationJobTable<J, N>, \"encodeInsert\">;\n readonly clock: OAuthClock<Expression>;\n readonly otherReferences: (input: {\n readonly identityKey: string;\n readonly subjectId: N;\n }) => Expression;\n readonly constraints: typeof requiredOAuthConnectedRevocationConstraints;\n}\n"],"mappings":";AA0FA,MAAa,oCAAoC;CAC/C,MAAM;CACN,aAAa;CACb,WAAW;CACX,OAAO;CACP,gBACE;CACF,qBAAqB;AACvB;AAEA,MAAa,8CAA8C,EACzD,KAAK,oCACP"}
|