@yielded/auth-persistence 0.1.0-beta.25 → 0.1.0-beta.27
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,9 +1,7 @@
|
|
|
1
1
|
import { PersistenceConfigurationError } from "./configuration.mjs";
|
|
2
2
|
import { Table } from "./sql-table.mjs";
|
|
3
3
|
import { makeNativeSqlTables } from "./native-sql-table.mjs";
|
|
4
|
-
import { makeComposedPasskeys } from "./passkeys.mjs";
|
|
5
4
|
import { createPersistence } from "./persistence.mjs";
|
|
6
|
-
import { makeSqlDatabase, sqlQueryOperations } from "./sql-query.mjs";
|
|
7
5
|
import { Effect } from "effect";
|
|
8
6
|
import { SqlClient } from "effect/sql";
|
|
9
7
|
//#region src/internal/sql-persistence.ts
|
|
@@ -17,17 +15,15 @@ const AuthPersistence = {
|
|
|
17
15
|
columns: Object.fromEntries(Object.entries(table.columns).map(([key, column]) => [key, column.options])),
|
|
18
16
|
unique: table.unique
|
|
19
17
|
}),
|
|
20
|
-
|
|
21
|
-
nativeTables: (client) => makeNativeSqlTables(client),
|
|
22
|
-
passkeys: makeComposedPasskeys(sqlQueryOperations),
|
|
18
|
+
nativeTables: makeNativeSqlTables,
|
|
23
19
|
acquire: Effect.gen(function* () {
|
|
24
|
-
const
|
|
20
|
+
const sql = yield* SqlClient.SqlClient;
|
|
21
|
+
if (sql.onDialectOrElse({
|
|
25
22
|
pg: () => "pg",
|
|
26
23
|
sqlite: () => "sqlite",
|
|
27
24
|
orElse: () => void 0
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
return yield* makeSqlDatabase(dialect);
|
|
25
|
+
}) === void 0) return yield* PersistenceConfigurationError.make({ reason: "Use an explicit adapter for this SQL dialect" });
|
|
26
|
+
return sql;
|
|
31
27
|
})
|
|
32
28
|
}),
|
|
33
29
|
table
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-persistence.mjs","names":[],"sources":["../../src/internal/sql-persistence.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { SqlClient } from \"effect/sql\";\n\nimport { PersistenceConfigurationError, type PersistenceApi } from \"./configuration\";\nimport { makeNativeSqlTables } from \"./native-sql-table\";\nimport {
|
|
1
|
+
{"version":3,"file":"sql-persistence.mjs","names":[],"sources":["../../src/internal/sql-persistence.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { SqlClient } from \"effect/sql\";\n\nimport { PersistenceConfigurationError, type PersistenceApi } from \"./configuration\";\nimport { makeNativeSqlTables } from \"./native-sql-table\";\nimport { createPersistence } from \"./persistence\";\nimport { Table } from \"./sql-table\";\nimport type { StorageTable } from \"./storage-tables\";\n\nconst table = (definition: StorageTable) =>\n new Table(definition.name, definition.columns, definition.unique, definition.schema);\n\nexport const AuthPersistence: PersistenceApi<Table> & { readonly table: typeof table } = {\n ...createPersistence({\n makeTable: table,\n describe: (table: Table): StorageTable => ({\n name: table.name,\n ...(table.schema === undefined ? {} : { schema: table.schema }),\n columns: Object.fromEntries(\n Object.entries(table.columns).map(([key, column]) => [key, column.options]),\n ),\n unique: table.unique,\n }),\n nativeTables: makeNativeSqlTables,\n acquire: Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const dialect = sql.onDialectOrElse({\n pg: () => \"pg\" as const,\n sqlite: () => \"sqlite\" as const,\n orElse: () => undefined,\n });\n\n if (dialect === undefined)\n return yield* PersistenceConfigurationError.make({\n reason: \"Use an explicit adapter for this SQL dialect\",\n });\n\n return sql;\n }),\n }),\n table,\n};\n"],"mappings":";;;;;;;AASA,MAAM,SAAS,eACb,IAAI,MAAM,WAAW,MAAM,WAAW,SAAS,WAAW,QAAQ,WAAW,MAAM;AAErF,MAAa,kBAA4E;CACvF,GAAG,kBAAkB;EACnB,WAAW;EACX,WAAW,WAAgC;GACzC,MAAM,MAAM;GACZ,GAAI,MAAM,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,MAAM,OAAO;GAC7D,SAAS,OAAO,YACd,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,KAAK,OAAO,OAAO,CAAC,CAC5E;GACA,QAAQ,MAAM;EAChB;EACA,cAAc;EACd,SAAS,OAAO,IAAI,aAAa;GAC/B,MAAM,MAAM,OAAO,UAAU;GAQ7B,IANgB,IAAI,gBAAgB;IAClC,UAAU;IACV,cAAc;IACd,cAAc,KAAA;GAChB,CAEU,MAAM,KAAA,GACd,OAAO,OAAO,8BAA8B,KAAK,EAC/C,QAAQ,+CACV,CAAC;GAEH,OAAO;EACT,CAAC;CACH,CAAC;CACD;AACF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { PersistenceMappingError } from "./mapping-error.mjs";
|
|
2
2
|
import { Table } from "./sql-table.mjs";
|
|
3
|
-
import { NativeDatabase } from "./transaction-kernel.mjs";
|
|
4
3
|
import { validateStorageBatch } from "./storage-validation.mjs";
|
|
5
4
|
import { storageKeyPlans } from "./storage-plans.mjs";
|
|
6
5
|
import { Effect } from "effect";
|
|
@@ -18,7 +17,7 @@ const validateSqlStorage = Effect.fnUntraced(function* (mapping) {
|
|
|
18
17
|
cause: "Invalid storage key mapping"
|
|
19
18
|
})
|
|
20
19
|
});
|
|
21
|
-
const
|
|
20
|
+
const client = yield* SqlClient.SqlClient;
|
|
22
21
|
const dialect = client.onDialectOrElse({
|
|
23
22
|
pg: () => "pg",
|
|
24
23
|
sqlite: () => "sqlite",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-storage-validation.mjs","names":[],"sources":["../../src/internal/sql-storage-validation.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { SqlClient } from \"effect/sql\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport { Table } from \"./sql-table\";\nimport { storageKeyPlans } from \"./storage-plans\";\nimport { validateStorageBatch, type StorageValidation } from \"./storage-validation\";\
|
|
1
|
+
{"version":3,"file":"sql-storage-validation.mjs","names":[],"sources":["../../src/internal/sql-storage-validation.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { SqlClient } from \"effect/sql\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport { Table } from \"./sql-table\";\nimport { storageKeyPlans } from \"./storage-plans\";\nimport { validateStorageBatch, type StorageValidation } from \"./storage-validation\";\n\n/** Check declared mappings against physical keys before acquiring OAuth services. */\nexport const validateSqlStorage = Effect.fnUntraced(function* (mapping: unknown) {\n const plans = yield* Effect.try({\n try: () =>\n storageKeyPlans(mapping, (table) => {\n if (!(table instanceof Table)) throw new Error(\"Expected a SQL table\");\n\n return table.columns;\n }),\n catch: () =>\n PersistenceMappingError.make({ operation: \"mapping\", cause: \"Invalid storage key mapping\" }),\n });\n\n const client = yield* SqlClient.SqlClient;\n\n const dialect = client.onDialectOrElse({\n pg: () => \"pg\" as const,\n sqlite: () => \"sqlite\" as const,\n orElse: () => undefined,\n });\n\n if (dialect === undefined)\n return yield* PersistenceMappingError.make({\n operation: \"mapping\",\n cause: \"OAuth persistence requires PostgreSQL or SQLite\",\n });\n const validations: StorageValidation[] = [];\n\n for (const plan of plans) {\n if (!(plan.table instanceof Table))\n return yield* PersistenceMappingError.make({\n operation: \"mapping\",\n cause: \"Expected a SQL table\",\n });\n validations.push({\n table: {\n name: plan.table.name,\n ...(plan.table.schema === undefined ? {} : { schema: plan.table.schema }),\n columns: Object.fromEntries(\n Object.entries(plan.table.columns).map(([key, column]) => [key, column.options]),\n ),\n },\n required: [plan.keys],\n });\n }\n yield* validateStorageBatch(dialect, validations).pipe(\n Effect.provideService(SqlClient.SqlClient, client),\n Effect.mapError(() =>\n PersistenceMappingError.make({\n operation: \"mapping\",\n cause: \"Required SQL storage key is unavailable\",\n }),\n ),\n );\n});\n"],"mappings":";;;;;;;;AASA,MAAa,qBAAqB,OAAO,WAAW,WAAW,SAAkB;CAC/E,MAAM,QAAQ,OAAO,OAAO,IAAI;EAC9B,WACE,gBAAgB,UAAU,UAAU;GAClC,IAAI,EAAE,iBAAiB,QAAQ,MAAM,IAAI,MAAM,sBAAsB;GAErE,OAAO,MAAM;EACf,CAAC;EACH,aACE,wBAAwB,KAAK;GAAE,WAAW;GAAW,OAAO;EAA8B,CAAC;CAC/F,CAAC;CAED,MAAM,SAAS,OAAO,UAAU;CAEhC,MAAM,UAAU,OAAO,gBAAgB;EACrC,UAAU;EACV,cAAc;EACd,cAAc,KAAA;CAChB,CAAC;CAED,IAAI,YAAY,KAAA,GACd,OAAO,OAAO,wBAAwB,KAAK;EACzC,WAAW;EACX,OAAO;CACT,CAAC;CACH,MAAM,cAAmC,CAAC;CAE1C,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,EAAE,KAAK,iBAAiB,QAC1B,OAAO,OAAO,wBAAwB,KAAK;GACzC,WAAW;GACX,OAAO;EACT,CAAC;EACH,YAAY,KAAK;GACf,OAAO;IACL,MAAM,KAAK,MAAM;IACjB,GAAI,KAAK,MAAM,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,OAAO;IACvE,SAAS,OAAO,YACd,OAAO,QAAQ,KAAK,MAAM,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,KAAK,OAAO,OAAO,CAAC,CACjF;GACF;GACA,UAAU,CAAC,KAAK,IAAI;EACtB,CAAC;CACH;CACA,OAAO,qBAAqB,SAAS,WAAW,CAAC,CAAC,KAChD,OAAO,eAAe,UAAU,WAAW,MAAM,GACjD,OAAO,eACL,wBAAwB,KAAK;EAC3B,WAAW;EACX,OAAO;CACT,CAAC,CACH,CACF;AACF,CAAC"}
|
|
@@ -1,31 +1,18 @@
|
|
|
1
1
|
//#region src/internal/sql-table.d.ts
|
|
2
|
-
export type Dialect = "pg" | "sqlite";
|
|
3
|
-
export interface Compiler {
|
|
4
|
-
readonly dialect: Dialect;
|
|
5
|
-
readonly parameters: unknown[];
|
|
6
|
-
}
|
|
7
|
-
export declare class Fragment {
|
|
8
|
-
readonly render: (compiler: Compiler) => string;
|
|
9
|
-
readonly decode: (value: unknown) => unknown;
|
|
10
|
-
constructor(render: (compiler: Compiler) => string, decode?: (value: unknown) => unknown);
|
|
11
|
-
mapWith(decode: (value: unknown) => unknown): Fragment;
|
|
12
|
-
as(_name: string): Fragment;
|
|
13
|
-
getSQL(): Fragment;
|
|
14
|
-
}
|
|
15
2
|
export interface ColumnOptions {
|
|
16
3
|
readonly name: string;
|
|
17
4
|
readonly type: "text" | "integer" | "boolean";
|
|
18
5
|
readonly nullable?: boolean;
|
|
19
6
|
}
|
|
20
|
-
export declare class Column
|
|
7
|
+
export declare class Column {
|
|
21
8
|
readonly tableName: string;
|
|
22
9
|
readonly options: ColumnOptions;
|
|
23
10
|
readonly schema?: string | undefined;
|
|
24
11
|
constructor(tableName: string, options: ColumnOptions, schema?: string | undefined);
|
|
25
|
-
|
|
12
|
+
decode(value: unknown): unknown;
|
|
26
13
|
}
|
|
27
14
|
/** Plain SQL identifiers and column representations, independent of an ORM. */
|
|
28
|
-
export declare class Table
|
|
15
|
+
export declare class Table {
|
|
29
16
|
readonly name: string;
|
|
30
17
|
readonly unique: ReadonlyArray<ReadonlyArray<string>>;
|
|
31
18
|
readonly schema?: string | undefined;
|
|
@@ -11,64 +11,43 @@ const SqlInteger = Schema.Union([
|
|
|
11
11
|
}));
|
|
12
12
|
const decodeInteger = Schema.decodeUnknownOption(SqlInteger);
|
|
13
13
|
const identifier = (name) => "\"" + name.replaceAll("\"", "\"\"") + "\"";
|
|
14
|
-
var
|
|
15
|
-
render;
|
|
16
|
-
decode;
|
|
17
|
-
constructor(render, decode = (value) => value) {
|
|
18
|
-
this.render = render;
|
|
19
|
-
this.decode = decode;
|
|
20
|
-
}
|
|
21
|
-
mapWith(decode) {
|
|
22
|
-
return new Fragment(this.render, decode);
|
|
23
|
-
}
|
|
24
|
-
as(_name) {
|
|
25
|
-
return this;
|
|
26
|
-
}
|
|
27
|
-
getSQL() {
|
|
28
|
-
return this;
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
var Column = class extends Fragment {
|
|
14
|
+
var Column = class {
|
|
32
15
|
tableName;
|
|
33
16
|
options;
|
|
34
17
|
schema;
|
|
35
18
|
constructor(tableName, options, schema) {
|
|
36
|
-
super(() => `${schema === void 0 ? "" : identifier(schema) + "."}${identifier(tableName)}.${identifier(options.name)}`, (value) => {
|
|
37
|
-
if (value === null) return value;
|
|
38
|
-
if (options.type === "boolean") {
|
|
39
|
-
if (value === true || value === 1) return true;
|
|
40
|
-
if (value === false || value === 0) return false;
|
|
41
|
-
throw PersistenceMappingError.make({
|
|
42
|
-
operation: "decode",
|
|
43
|
-
cause: "Invalid SQL boolean"
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
if (options.type === "integer") {
|
|
47
|
-
const number = decodeInteger(value);
|
|
48
|
-
if (Option.isSome(number)) return number.value;
|
|
49
|
-
throw PersistenceMappingError.make({
|
|
50
|
-
operation: "decode",
|
|
51
|
-
cause: "SQL integer is outside the safe range"
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
return value;
|
|
55
|
-
});
|
|
56
19
|
this.tableName = tableName;
|
|
57
20
|
this.options = options;
|
|
58
21
|
this.schema = schema;
|
|
59
22
|
}
|
|
60
|
-
|
|
23
|
+
decode(value) {
|
|
24
|
+
if (value === null) return value;
|
|
25
|
+
if (this.options.type === "boolean") {
|
|
26
|
+
if (value === true || value === 1) return true;
|
|
27
|
+
if (value === false || value === 0) return false;
|
|
28
|
+
throw PersistenceMappingError.make({
|
|
29
|
+
operation: "decode",
|
|
30
|
+
cause: "Invalid SQL boolean"
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (this.options.type === "integer") {
|
|
34
|
+
const number = decodeInteger(value);
|
|
35
|
+
if (Option.isSome(number)) return number.value;
|
|
36
|
+
throw PersistenceMappingError.make({
|
|
37
|
+
operation: "decode",
|
|
38
|
+
cause: "SQL integer is outside the safe range"
|
|
39
|
+
});
|
|
40
|
+
}
|
|
61
41
|
return value;
|
|
62
42
|
}
|
|
63
43
|
};
|
|
64
44
|
/** Plain SQL identifiers and column representations, independent of an ORM. */
|
|
65
|
-
var Table = class
|
|
45
|
+
var Table = class {
|
|
66
46
|
name;
|
|
67
47
|
unique;
|
|
68
48
|
schema;
|
|
69
49
|
columns;
|
|
70
50
|
constructor(name, columns, unique, schema) {
|
|
71
|
-
super(() => (schema === void 0 ? "" : identifier(schema) + ".") + identifier(name));
|
|
72
51
|
this.name = name;
|
|
73
52
|
this.unique = unique;
|
|
74
53
|
this.schema = schema;
|
|
@@ -76,6 +55,6 @@ var Table = class extends Fragment {
|
|
|
76
55
|
}
|
|
77
56
|
};
|
|
78
57
|
//#endregion
|
|
79
|
-
export { Column,
|
|
58
|
+
export { Column, Table, identifier };
|
|
80
59
|
|
|
81
60
|
//# sourceMappingURL=sql-table.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-table.mjs","names":[],"sources":["../../src/internal/sql-table.ts"],"sourcesContent":["import { Option, Schema, SchemaGetter } from \"effect\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\n\nconst SqlInteger = Schema.Union([\n Schema.Int,\n Schema.BigInt,\n Schema.String.check(Schema.isPattern(/^-?\\d+$/)),\n]).pipe(\n Schema.decodeTo(Schema.Int, {\n decode: SchemaGetter.transform(Number),\n encode: SchemaGetter.passthrough(),\n }),\n);\n\nconst decodeInteger = Schema.decodeUnknownOption(SqlInteger);\n\nexport type Dialect = \"pg\" | \"sqlite\";\nexport type Row = Readonly<Record<string, unknown>>;\n\nexport
|
|
1
|
+
{"version":3,"file":"sql-table.mjs","names":[],"sources":["../../src/internal/sql-table.ts"],"sourcesContent":["import { Option, Schema, SchemaGetter } from \"effect\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\n\nconst SqlInteger = Schema.Union([\n Schema.Int,\n Schema.BigInt,\n Schema.String.check(Schema.isPattern(/^-?\\d+$/)),\n]).pipe(\n Schema.decodeTo(Schema.Int, {\n decode: SchemaGetter.transform(Number),\n encode: SchemaGetter.passthrough(),\n }),\n);\n\nconst decodeInteger = Schema.decodeUnknownOption(SqlInteger);\n\nexport type Dialect = \"pg\" | \"sqlite\";\nexport type Row = Readonly<Record<string, unknown>>;\n\nexport const identifier = (name: string) => '\"' + name.replaceAll('\"', '\"\"') + '\"';\n\nexport interface ColumnOptions {\n readonly name: string;\n readonly type: \"text\" | \"integer\" | \"boolean\";\n readonly nullable?: boolean;\n}\n\nexport class Column {\n constructor(\n readonly tableName: string,\n readonly options: ColumnOptions,\n readonly schema?: string,\n ) {}\n\n decode(value: unknown): unknown {\n if (value === null) return value;\n if (this.options.type === \"boolean\") {\n if (value === true || value === 1) return true;\n if (value === false || value === 0) return false;\n throw PersistenceMappingError.make({ operation: \"decode\", cause: \"Invalid SQL boolean\" });\n }\n if (this.options.type === \"integer\") {\n const number = decodeInteger(value);\n\n if (Option.isSome(number)) return number.value;\n throw PersistenceMappingError.make({\n operation: \"decode\",\n cause: \"SQL integer is outside the safe range\",\n });\n }\n\n return value;\n }\n}\n\n/** Plain SQL identifiers and column representations, independent of an ORM. */\nexport class Table {\n readonly columns: Readonly<Record<string, Column>>;\n\n constructor(\n readonly name: string,\n columns: Readonly<Record<string, ColumnOptions>>,\n readonly unique: ReadonlyArray<ReadonlyArray<string>>,\n readonly schema?: string,\n ) {\n this.columns = Object.fromEntries(\n Object.entries(columns).map(([key, options]) => [key, new Column(name, options, schema)]),\n );\n }\n}\n"],"mappings":";;;AAIA,MAAM,aAAa,OAAO,MAAM;CAC9B,OAAO;CACP,OAAO;CACP,OAAO,OAAO,MAAM,OAAO,UAAU,SAAS,CAAC;AACjD,CAAC,CAAC,CAAC,KACD,OAAO,SAAS,OAAO,KAAK;CAC1B,QAAQ,aAAa,UAAU,MAAM;CACrC,QAAQ,aAAa,YAAY;AACnC,CAAC,CACH;AAEA,MAAM,gBAAgB,OAAO,oBAAoB,UAAU;AAK3D,MAAa,cAAc,SAAiB,OAAM,KAAK,WAAW,MAAK,MAAI,IAAI;AAQ/E,IAAa,SAAb,MAAoB;CAEP;CACA;CACA;CAHX,YACE,WACA,SACA,QACA;EAHS,KAAA,YAAA;EACA,KAAA,UAAA;EACA,KAAA,SAAA;CACR;CAEH,OAAO,OAAyB;EAC9B,IAAI,UAAU,MAAM,OAAO;EAC3B,IAAI,KAAK,QAAQ,SAAS,WAAW;GACnC,IAAI,UAAU,QAAQ,UAAU,GAAG,OAAO;GAC1C,IAAI,UAAU,SAAS,UAAU,GAAG,OAAO;GAC3C,MAAM,wBAAwB,KAAK;IAAE,WAAW;IAAU,OAAO;GAAsB,CAAC;EAC1F;EACA,IAAI,KAAK,QAAQ,SAAS,WAAW;GACnC,MAAM,SAAS,cAAc,KAAK;GAElC,IAAI,OAAO,OAAO,MAAM,GAAG,OAAO,OAAO;GACzC,MAAM,wBAAwB,KAAK;IACjC,WAAW;IACX,OAAO;GACT,CAAC;EACH;EAEA,OAAO;CACT;AACF;;AAGA,IAAa,QAAb,MAAmB;CAIN;CAEA;CACA;CANX;CAEA,YACE,MACA,SACA,QACA,QACA;EAJS,KAAA,OAAA;EAEA,KAAA,SAAA;EACA,KAAA,SAAA;EAET,KAAK,UAAU,OAAO,YACpB,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,KAAK,IAAI,OAAO,MAAM,SAAS,MAAM,CAAC,CAAC,CAC1F;CACF;AACF"}
|
|
@@ -2,9 +2,8 @@ import { Effect } from "effect";
|
|
|
2
2
|
//#region src/internal/standalone.ts
|
|
3
3
|
/** Standalone operations must observe their own durable commit. */
|
|
4
4
|
const requireStandalone = (unavailable, transactionService) => Effect.withFiber((fiber) => {
|
|
5
|
-
|
|
6
|
-
if (
|
|
7
|
-
for (const key of services.keys()) if (key.startsWith("@effect/sql-libsql/LibsqlClient/LibsqlTransaction/")) return Effect.fail(unavailable());
|
|
5
|
+
if (transactionService === void 0) return Effect.fail(unavailable());
|
|
6
|
+
if (fiber.context.mapUnsafe.has(transactionService.key)) return Effect.fail(unavailable());
|
|
8
7
|
return Effect.void;
|
|
9
8
|
});
|
|
10
9
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone.mjs","names":[],"sources":["../../src/internal/standalone.ts"],"sourcesContent":["import { type Context, Effect } from \"effect\";\nimport type * as SqlClient from \"effect/sql/SqlClient\";\n\n/** Standalone operations must observe their own durable commit. */\nexport const requireStandalone = <Failure>(\n unavailable: () => Failure,\n transactionService?: Context.Key<\n SqlClient.TransactionConnection,\n SqlClient.TransactionConnection.Service\n >,\n): Effect.Effect<void, Failure> =>\n Effect.withFiber((fiber) => {\n
|
|
1
|
+
{"version":3,"file":"standalone.mjs","names":[],"sources":["../../src/internal/standalone.ts"],"sourcesContent":["import { type Context, Effect } from \"effect\";\nimport type * as SqlClient from \"effect/sql/SqlClient\";\n\n/** Standalone operations must observe their own durable commit. */\nexport const requireStandalone = <Failure>(\n unavailable: () => Failure,\n transactionService?: Context.Key<\n SqlClient.TransactionConnection,\n SqlClient.TransactionConnection.Service\n >,\n): Effect.Effect<void, Failure> =>\n Effect.withFiber((fiber) => {\n if (transactionService === undefined) return Effect.fail(unavailable());\n const services = fiber.context.mapUnsafe;\n\n if (services.has(transactionService.key)) return Effect.fail(unavailable());\n\n return Effect.void;\n });\n"],"mappings":";;;AAIA,MAAa,qBACX,aACA,uBAKA,OAAO,WAAW,UAAU;CAC1B,IAAI,uBAAuB,KAAA,GAAW,OAAO,OAAO,KAAK,YAAY,CAAC;CAGtE,IAFiB,MAAM,QAAQ,UAElB,IAAI,mBAAmB,GAAG,GAAG,OAAO,OAAO,KAAK,YAAY,CAAC;CAE1E,OAAO,OAAO;AAChB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sameSessionRevision } from "./session-native-state.mjs";
|
|
1
2
|
import { DateTime, Effect, Schema } from "effect";
|
|
2
3
|
import { AuthenticationEvidence, SessionMetadata, SessionStepUpIntent, SessionStepUpInvalid, SessionStepUpRequirement, SessionUnavailable } from "@yielded/auth/Sessions";
|
|
3
4
|
//#region src/internal/step-up-state.ts
|
|
@@ -5,28 +6,24 @@ const stepUpIntentCodec = Schema.fromJsonString(SessionStepUpIntent);
|
|
|
5
6
|
const BoundedSnapshot = Schema.String.check(Schema.isMaxLength(131072));
|
|
6
7
|
const encodeStepUpIntent = (intent) => Schema.encodeEffect(stepUpIntentCodec)(intent).pipe(Effect.flatMap(Schema.decodeEffect(BoundedSnapshot)), Effect.mapError(() => SessionUnavailable.make({})));
|
|
7
8
|
const decodeStepUpIntent = (snapshot) => Schema.decodeEffect(BoundedSnapshot)(snapshot).pipe(Effect.flatMap(Schema.decodeEffect(stepUpIntentCodec)), Effect.mapError(() => SessionUnavailable.make({})));
|
|
8
|
-
const sameStepUpRevision = (left, right) => left.subjectId === right.subjectId && left.securityRevision === right.securityRevision && left.credentials.length === right.credentials.length && new Set(left.credentials.map((c) => c.credentialId)).size === left.credentials.length && left.credentials.every((item) => right.credentials.some((other) => item.credentialId === other.credentialId && item.revision === other.revision));
|
|
9
9
|
const stepUpIntentLive = (intent, kind, now) => {
|
|
10
10
|
const n = DateTime.toEpochMillis(now), authenticated = DateTime.toEpochMillis(intent.sourceAuthenticatedAt), idle = DateTime.toEpochMillis(intent.sourceExpiresAt), absolute = DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt), expires = DateTime.toEpochMillis(intent.expiresAt);
|
|
11
11
|
return intent.sourceKind === kind && authenticated <= n && n < expires && expires <= idle && idle <= absolute;
|
|
12
12
|
};
|
|
13
13
|
const evidenceEncoding = Schema.encodeSync(Schema.fromJsonString(AuthenticationEvidence));
|
|
14
14
|
const requirementEncoding = Schema.encodeSync(Schema.fromJsonString(SessionStepUpRequirement));
|
|
15
|
-
|
|
15
|
+
Schema.encodeSync(Schema.fromJsonString(SessionMetadata));
|
|
16
16
|
/** Validate core-owned plans before driver allocation/SQL expansion. No bearer or Claims decoding. */
|
|
17
17
|
const validateStepUpPlan = Effect.fn("DrizzleStepUp.validatePlan")(function* (plan) {
|
|
18
18
|
const { intent, source, replacement, evidence } = plan;
|
|
19
19
|
const original = source.inspection;
|
|
20
20
|
if (requirementEncoding(plan.profileRequirement) !== requirementEncoding(intent.requirement) || replacement.inspection.session.subjectId !== evidence.revision.subjectId || replacement.inspection.session.securityRevision !== evidence.revision.securityRevision || intent.revision.credentials.some((item) => !evidence.revision.credentials.some((actual) => actual.credentialId === item.credentialId && actual.revision === item.revision))) return yield* SessionStepUpInvalid.make({});
|
|
21
|
-
if (intent.sourceKind !== source.guard._tag || intent.sourceKind !== replacement._tag || intent.sourceSessionId !== original.session.sessionId || intent.sourceCredentialVersion !== original.credentialVersion || !
|
|
22
|
-
if (replacement._tag === "Stateful" && (source.guard._tag !== "Stateful" || source.guard.digest !== replacement.expectedDigest ||
|
|
21
|
+
if (intent.sourceKind !== source.guard._tag || intent.sourceKind !== replacement._tag || intent.sourceSessionId !== original.session.sessionId || intent.sourceCredentialVersion !== original.credentialVersion || !sameSessionRevision(intent.revision, original.provenance.evidence.revision) || intent.revision.subjectId !== evidence.revision.subjectId || intent.revision.securityRevision !== evidence.revision.securityRevision || intent.flowId !== evidence.flowId || intent.bindingDigest !== evidence.bindingDigest || DateTime.toEpochMillis(intent.sourceAuthenticatedAt) !== DateTime.toEpochMillis(original.session.assurance.authenticatedAt) || DateTime.toEpochMillis(intent.sourceExpiresAt) !== DateTime.toEpochMillis(original.session.expiresAt) || DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt) !== DateTime.toEpochMillis(original.session.absoluteExpiresAt) || DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt) !== DateTime.toEpochMillis(replacement.inspection.session.absoluteExpiresAt) || evidenceEncoding(replacement.inspection.provenance.evidence) !== evidenceEncoding(evidence)) return yield* SessionStepUpInvalid.make({});
|
|
22
|
+
if (replacement._tag === "Stateful" && (source.guard._tag !== "Stateful" || source.guard.digest !== replacement.expectedDigest || replacement.inspection.session.sessionId !== intent.sourceSessionId)) return yield* SessionStepUpInvalid.make({});
|
|
23
23
|
if (replacement._tag === "StateAssistedSigned" && (replacement.tombstoneSessionId !== intent.sourceSessionId || DateTime.toEpochMillis(replacement.tombstoneUntil) !== DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt))) return yield* SessionStepUpInvalid.make({});
|
|
24
24
|
if (replacement._tag !== "Stateful" && replacement.inspection.session.sessionId === intent.sourceSessionId) return yield* SessionStepUpInvalid.make({});
|
|
25
25
|
});
|
|
26
|
-
/** Compare a consumer-decoded encoded update/readback with the intended rotation.
|
|
27
|
-
* Claims are consumer-owned; their lossless round trip remains the codec contract. */
|
|
28
|
-
const stepUpRotationMatches = (plan, record) => plan.replacement._tag === "Stateful" && record.digest === plan.replacement.nextDigest && record.credentialVersion === plan.replacement.inspection.credentialVersion && metadataEncoding(record) === metadataEncoding(plan.replacement.inspection.session) && evidenceEncoding(record.provenance.evidence) === evidenceEncoding(plan.evidence);
|
|
29
26
|
//#endregion
|
|
30
|
-
export { decodeStepUpIntent, encodeStepUpIntent,
|
|
27
|
+
export { decodeStepUpIntent, encodeStepUpIntent, stepUpIntentCodec, stepUpIntentLive, validateStepUpPlan };
|
|
31
28
|
|
|
32
29
|
//# sourceMappingURL=step-up-state.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-up-state.mjs","names":[],"sources":["../../src/internal/step-up-state.ts"],"sourcesContent":["import {\n SessionStepUpInvalid,\n SessionUnavailable,\n AuthenticationEvidence,\n
|
|
1
|
+
{"version":3,"file":"step-up-state.mjs","names":[],"sources":["../../src/internal/step-up-state.ts"],"sourcesContent":["import {\n SessionStepUpInvalid,\n SessionUnavailable,\n AuthenticationEvidence,\n SessionMetadata,\n SessionStepUpIntent,\n SessionStepUpRequirement,\n type SessionStepUpCompletionPlan,\n type StatefulSessionRecord,\n} from \"@yielded/auth/Sessions\";\nimport { DateTime, Effect, Schema } from \"effect\";\n\nimport { sameSessionRevision } from \"./session-native-state\";\n\nexport const stepUpIntentCodec = Schema.fromJsonString(SessionStepUpIntent);\nconst BoundedSnapshot = Schema.String.check(Schema.isMaxLength(131072));\n\nexport const encodeStepUpIntent = (intent: SessionStepUpIntent) =>\n Schema.encodeEffect(stepUpIntentCodec)(intent).pipe(\n Effect.flatMap(Schema.decodeEffect(BoundedSnapshot)),\n Effect.mapError(() => SessionUnavailable.make({})),\n );\n\nexport const decodeStepUpIntent = (snapshot: string) =>\n Schema.decodeEffect(BoundedSnapshot)(snapshot).pipe(\n Effect.flatMap(Schema.decodeEffect(stepUpIntentCodec)),\n Effect.mapError(() => SessionUnavailable.make({})),\n );\n\nexport const stepUpIntentLive = (\n intent: Omit<SessionStepUpIntent, \"version\">,\n kind: SessionStepUpIntent[\"sourceKind\"],\n now: DateTime.Utc,\n) => {\n const n = DateTime.toEpochMillis(now),\n authenticated = DateTime.toEpochMillis(intent.sourceAuthenticatedAt),\n idle = DateTime.toEpochMillis(intent.sourceExpiresAt),\n absolute = DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt),\n expires = DateTime.toEpochMillis(intent.expiresAt);\n\n return (\n intent.sourceKind === kind &&\n authenticated <= n &&\n n < expires &&\n expires <= idle &&\n idle <= absolute\n );\n};\n\nconst evidenceEncoding = Schema.encodeSync(Schema.fromJsonString(AuthenticationEvidence));\nconst requirementEncoding = Schema.encodeSync(Schema.fromJsonString(SessionStepUpRequirement));\nconst metadataEncoding = Schema.encodeSync(Schema.fromJsonString(SessionMetadata));\n\n/** Validate core-owned plans before driver allocation/SQL expansion. No bearer or Claims decoding. */\nexport const validateStepUpPlan = Effect.fn(\"DrizzleStepUp.validatePlan\")(function* <Claims>(\n plan: SessionStepUpCompletionPlan<Claims>,\n) {\n const { intent, source, replacement, evidence } = plan;\n const original = source.inspection;\n\n if (\n requirementEncoding(plan.profileRequirement) !== requirementEncoding(intent.requirement) ||\n replacement.inspection.session.subjectId !== evidence.revision.subjectId ||\n replacement.inspection.session.securityRevision !== evidence.revision.securityRevision ||\n intent.revision.credentials.some(\n (item) =>\n !evidence.revision.credentials.some(\n (actual) =>\n actual.credentialId === item.credentialId && actual.revision === item.revision,\n ),\n )\n )\n return yield* SessionStepUpInvalid.make({});\n if (\n intent.sourceKind !== source.guard._tag ||\n intent.sourceKind !== replacement._tag ||\n intent.sourceSessionId !== original.session.sessionId ||\n intent.sourceCredentialVersion !== original.credentialVersion ||\n !sameSessionRevision(intent.revision, original.provenance.evidence.revision) ||\n intent.revision.subjectId !== evidence.revision.subjectId ||\n intent.revision.securityRevision !== evidence.revision.securityRevision ||\n intent.flowId !== evidence.flowId ||\n intent.bindingDigest !== evidence.bindingDigest ||\n DateTime.toEpochMillis(intent.sourceAuthenticatedAt) !==\n DateTime.toEpochMillis(original.session.assurance.authenticatedAt) ||\n DateTime.toEpochMillis(intent.sourceExpiresAt) !==\n DateTime.toEpochMillis(original.session.expiresAt) ||\n DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt) !==\n DateTime.toEpochMillis(original.session.absoluteExpiresAt) ||\n DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt) !==\n DateTime.toEpochMillis(replacement.inspection.session.absoluteExpiresAt) ||\n evidenceEncoding(replacement.inspection.provenance.evidence) !== evidenceEncoding(evidence)\n )\n return yield* SessionStepUpInvalid.make({});\n if (\n replacement._tag === \"Stateful\" &&\n (source.guard._tag !== \"Stateful\" ||\n source.guard.digest !== replacement.expectedDigest ||\n replacement.inspection.session.sessionId !== intent.sourceSessionId)\n )\n return yield* SessionStepUpInvalid.make({});\n if (\n replacement._tag === \"StateAssistedSigned\" &&\n (replacement.tombstoneSessionId !== intent.sourceSessionId ||\n DateTime.toEpochMillis(replacement.tombstoneUntil) !==\n DateTime.toEpochMillis(intent.sourceAbsoluteExpiresAt))\n )\n return yield* SessionStepUpInvalid.make({});\n if (\n replacement._tag !== \"Stateful\" &&\n replacement.inspection.session.sessionId === intent.sourceSessionId\n )\n return yield* SessionStepUpInvalid.make({});\n});\n\n/** Compare a consumer-decoded encoded update/readback with the intended rotation.\n * Claims are consumer-owned; their lossless round trip remains the codec contract. */\nexport const stepUpRotationMatches = <Claims>(\n plan: SessionStepUpCompletionPlan<Claims>,\n record: StatefulSessionRecord<Claims>,\n) =>\n plan.replacement._tag === \"Stateful\" &&\n record.digest === plan.replacement.nextDigest &&\n record.credentialVersion === plan.replacement.inspection.credentialVersion &&\n metadataEncoding(record) === metadataEncoding(plan.replacement.inspection.session) &&\n evidenceEncoding(record.provenance.evidence) === evidenceEncoding(plan.evidence);\n"],"mappings":";;;;AAcA,MAAa,oBAAoB,OAAO,eAAe,mBAAmB;AAC1E,MAAM,kBAAkB,OAAO,OAAO,MAAM,OAAO,YAAY,MAAM,CAAC;AAEtE,MAAa,sBAAsB,WACjC,OAAO,aAAa,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,KAC7C,OAAO,QAAQ,OAAO,aAAa,eAAe,CAAC,GACnD,OAAO,eAAe,mBAAmB,KAAK,CAAC,CAAC,CAAC,CACnD;AAEF,MAAa,sBAAsB,aACjC,OAAO,aAAa,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,KAC7C,OAAO,QAAQ,OAAO,aAAa,iBAAiB,CAAC,GACrD,OAAO,eAAe,mBAAmB,KAAK,CAAC,CAAC,CAAC,CACnD;AAEF,MAAa,oBACX,QACA,MACA,QACG;CACH,MAAM,IAAI,SAAS,cAAc,GAAG,GAClC,gBAAgB,SAAS,cAAc,OAAO,qBAAqB,GACnE,OAAO,SAAS,cAAc,OAAO,eAAe,GACpD,WAAW,SAAS,cAAc,OAAO,uBAAuB,GAChE,UAAU,SAAS,cAAc,OAAO,SAAS;CAEnD,OACE,OAAO,eAAe,QACtB,iBAAiB,KACjB,IAAI,WACJ,WAAW,QACX,QAAQ;AAEZ;AAEA,MAAM,mBAAmB,OAAO,WAAW,OAAO,eAAe,sBAAsB,CAAC;AACxF,MAAM,sBAAsB,OAAO,WAAW,OAAO,eAAe,wBAAwB,CAAC;AACpE,OAAO,WAAW,OAAO,eAAe,eAAe,CAAC;;AAGjF,MAAa,qBAAqB,OAAO,GAAG,4BAA4B,CAAC,CAAC,WACxE,MACA;CACA,MAAM,EAAE,QAAQ,QAAQ,aAAa,aAAa;CAClD,MAAM,WAAW,OAAO;CAExB,IACE,oBAAoB,KAAK,kBAAkB,MAAM,oBAAoB,OAAO,WAAW,KACvF,YAAY,WAAW,QAAQ,cAAc,SAAS,SAAS,aAC/D,YAAY,WAAW,QAAQ,qBAAqB,SAAS,SAAS,oBACtE,OAAO,SAAS,YAAY,MACzB,SACC,CAAC,SAAS,SAAS,YAAY,MAC5B,WACC,OAAO,iBAAiB,KAAK,gBAAgB,OAAO,aAAa,KAAK,QAC1E,CACJ,GAEA,OAAO,OAAO,qBAAqB,KAAK,CAAC,CAAC;CAC5C,IACE,OAAO,eAAe,OAAO,MAAM,QACnC,OAAO,eAAe,YAAY,QAClC,OAAO,oBAAoB,SAAS,QAAQ,aAC5C,OAAO,4BAA4B,SAAS,qBAC5C,CAAC,oBAAoB,OAAO,UAAU,SAAS,WAAW,SAAS,QAAQ,KAC3E,OAAO,SAAS,cAAc,SAAS,SAAS,aAChD,OAAO,SAAS,qBAAqB,SAAS,SAAS,oBACvD,OAAO,WAAW,SAAS,UAC3B,OAAO,kBAAkB,SAAS,iBAClC,SAAS,cAAc,OAAO,qBAAqB,MACjD,SAAS,cAAc,SAAS,QAAQ,UAAU,eAAe,KACnE,SAAS,cAAc,OAAO,eAAe,MAC3C,SAAS,cAAc,SAAS,QAAQ,SAAS,KACnD,SAAS,cAAc,OAAO,uBAAuB,MACnD,SAAS,cAAc,SAAS,QAAQ,iBAAiB,KAC3D,SAAS,cAAc,OAAO,uBAAuB,MACnD,SAAS,cAAc,YAAY,WAAW,QAAQ,iBAAiB,KACzE,iBAAiB,YAAY,WAAW,WAAW,QAAQ,MAAM,iBAAiB,QAAQ,GAE1F,OAAO,OAAO,qBAAqB,KAAK,CAAC,CAAC;CAC5C,IACE,YAAY,SAAS,eACpB,OAAO,MAAM,SAAS,cACrB,OAAO,MAAM,WAAW,YAAY,kBACpC,YAAY,WAAW,QAAQ,cAAc,OAAO,kBAEtD,OAAO,OAAO,qBAAqB,KAAK,CAAC,CAAC;CAC5C,IACE,YAAY,SAAS,0BACpB,YAAY,uBAAuB,OAAO,mBACzC,SAAS,cAAc,YAAY,cAAc,MAC/C,SAAS,cAAc,OAAO,uBAAuB,IAEzD,OAAO,OAAO,qBAAqB,KAAK,CAAC,CAAC;CAC5C,IACE,YAAY,SAAS,cACrB,YAAY,WAAW,QAAQ,cAAc,OAAO,iBAEpD,OAAO,OAAO,qBAAqB,KAAK,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { PersistenceMappingError } from "./mapping-error.mjs";
|
|
2
|
+
import { compileSqlExpression } from "./sql-expression.mjs";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import { SqlClient } from "effect/sql/SqlClient";
|
|
5
|
+
//#region src/internal/storage-clock.ts
|
|
6
|
+
/** Managed storage supports epoch milliseconds or canonical ISO text. */
|
|
7
|
+
const makeStorageClock = Effect.fnUntraced(function* (storage) {
|
|
8
|
+
const sql = (yield* SqlClient).withoutTransforms();
|
|
9
|
+
const encoded = storage.encodeInstant(0);
|
|
10
|
+
const numeric = typeof encoded === "number";
|
|
11
|
+
if (!numeric && encoded !== "1970-01-01T00:00:00.000Z") return yield* PersistenceMappingError.make({
|
|
12
|
+
operation: "mapping",
|
|
13
|
+
cause: "Unsupported managed timestamp representation"
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
encodeInstant: storage.encodeInstant,
|
|
17
|
+
decodeInstant: storage.decodeInstantSync,
|
|
18
|
+
engineNowMillis: sql.onDialectOrElse({
|
|
19
|
+
pg: () => sql`cast(extract(epoch from clock_timestamp()) * 1000 as bigint)`,
|
|
20
|
+
mysql: () => sql`cast(unix_timestamp(current_timestamp(3)) * 1000 as signed)`,
|
|
21
|
+
orElse: () => sql`cast(round((julianday('now') - 2440587.5) * 86400000) as integer)`
|
|
22
|
+
}),
|
|
23
|
+
toMillis: (expression) => {
|
|
24
|
+
const value = compileSqlExpression(sql, expression);
|
|
25
|
+
return numeric ? value : sql.onDialectOrElse({
|
|
26
|
+
pg: () => sql`cast(extract(epoch from cast(${value} as timestamptz)) * 1000 as bigint)`,
|
|
27
|
+
mysql: () => sql`cast(unix_timestamp(str_to_date(${value}, '%Y-%m-%dT%H:%i:%s.%fZ')) * 1000 as signed)`,
|
|
28
|
+
orElse: () => sql`cast(round((julianday(${value}) - 2440587.5) * 86400000) as integer)`
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
fromMillis: (expression) => {
|
|
32
|
+
const value = compileSqlExpression(sql, expression);
|
|
33
|
+
return numeric ? value : sql.onDialectOrElse({
|
|
34
|
+
pg: () => sql`to_char(to_timestamp((${value}) / 1000.0) at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`,
|
|
35
|
+
mysql: () => sql`concat(date_format(from_unixtime((${value}) / 1000.0), '%Y-%m-%dT%H:%i:%s.'), lpad(mod(${value}, 1000), 3, '0'), 'Z')`,
|
|
36
|
+
orElse: () => sql`strftime('%Y-%m-%dT%H:%M:%fZ', (${value}) / 1000.0, 'unixepoch')`
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
//#endregion
|
|
42
|
+
export { makeStorageClock };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=storage-clock.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-clock.mjs","names":[],"sources":["../../src/internal/storage-clock.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { SqlClient } from \"effect/sql/SqlClient\";\n\nimport type { MappingInput } from \"./configuration\";\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport type { ProofClock } from \"./models/proof-model\";\nimport { compileSqlExpression } from \"./sql-expression\";\nimport type { SqlExpression } from \"./table-model\";\n\n/** Managed storage supports epoch milliseconds or canonical ISO text. */\nexport const makeStorageClock = Effect.fnUntraced(function* (storage: MappingInput) {\n const sql = (yield* SqlClient).withoutTransforms();\n const encoded = storage.encodeInstant(0);\n const numeric = typeof encoded === \"number\";\n\n if (!numeric && encoded !== \"1970-01-01T00:00:00.000Z\")\n return yield* PersistenceMappingError.make({\n operation: \"mapping\",\n cause: \"Unsupported managed timestamp representation\",\n });\n\n const clock: ProofClock<SqlExpression> = {\n encodeInstant: storage.encodeInstant,\n decodeInstant: storage.decodeInstantSync,\n engineNowMillis: sql.onDialectOrElse({\n pg: () => sql`cast(extract(epoch from clock_timestamp()) * 1000 as bigint)`,\n mysql: () => sql`cast(unix_timestamp(current_timestamp(3)) * 1000 as signed)`,\n orElse: () => sql`cast(round((julianday('now') - 2440587.5) * 86400000) as integer)`,\n }),\n toMillis: (expression) => {\n const value = compileSqlExpression(sql, expression);\n\n return numeric\n ? value\n : sql.onDialectOrElse({\n pg: () => sql`cast(extract(epoch from cast(${value} as timestamptz)) * 1000 as bigint)`,\n mysql: () =>\n sql`cast(unix_timestamp(str_to_date(${value}, '%Y-%m-%dT%H:%i:%s.%fZ')) * 1000 as signed)`,\n orElse: () => sql`cast(round((julianday(${value}) - 2440587.5) * 86400000) as integer)`,\n });\n },\n fromMillis: (expression) => {\n const value = compileSqlExpression(sql, expression);\n\n return numeric\n ? value\n : sql.onDialectOrElse({\n pg: () =>\n sql`to_char(to_timestamp((${value}) / 1000.0) at time zone 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS.MS\"Z\"')`,\n mysql: () =>\n sql`concat(date_format(from_unixtime((${value}) / 1000.0), '%Y-%m-%dT%H:%i:%s.'), lpad(mod(${value}, 1000), 3, '0'), 'Z')`,\n orElse: () => sql`strftime('%Y-%m-%dT%H:%M:%fZ', (${value}) / 1000.0, 'unixepoch')`,\n });\n },\n };\n\n return clock;\n});\n"],"mappings":";;;;;;AAUA,MAAa,mBAAmB,OAAO,WAAW,WAAW,SAAuB;CAClF,MAAM,OAAO,OAAO,UAAA,CAAW,kBAAkB;CACjD,MAAM,UAAU,QAAQ,cAAc,CAAC;CACvC,MAAM,UAAU,OAAO,YAAY;CAEnC,IAAI,CAAC,WAAW,YAAY,4BAC1B,OAAO,OAAO,wBAAwB,KAAK;EACzC,WAAW;EACX,OAAO;CACT,CAAC;CAqCH,OAAO;EAlCL,eAAe,QAAQ;EACvB,eAAe,QAAQ;EACvB,iBAAiB,IAAI,gBAAgB;GACnC,UAAU,GAAG;GACb,aAAa,GAAG;GAChB,cAAc,GAAG;EACnB,CAAC;EACD,WAAW,eAAe;GACxB,MAAM,QAAQ,qBAAqB,KAAK,UAAU;GAElD,OAAO,UACH,QACA,IAAI,gBAAgB;IAClB,UAAU,GAAG,gCAAgC,MAAM;IACnD,aACE,GAAG,mCAAmC,MAAM;IAC9C,cAAc,GAAG,yBAAyB,MAAM;GAClD,CAAC;EACP;EACA,aAAa,eAAe;GAC1B,MAAM,QAAQ,qBAAqB,KAAK,UAAU;GAElD,OAAO,UACH,QACA,IAAI,gBAAgB;IAClB,UACE,GAAG,yBAAyB,MAAM;IACpC,aACE,GAAG,qCAAqC,MAAM,+CAA+C,MAAM;IACrG,cAAc,GAAG,mCAAmC,MAAM;GAC5D,CAAC;EACP;CAGS;AACb,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { SqlExpression, TableModel } from "./table-model.mjs";
|
|
1
2
|
import { PersistenceMappingError } from "./mapping-error.mjs";
|
|
2
|
-
import {
|
|
3
|
+
import { AnyProofPersistenceMapping } from "./models/proof-model.mjs";
|
|
3
4
|
import { AnyEmailAddressMapping } from "./models/email-model.mjs";
|
|
4
5
|
import { AnyPasswordPersistenceMapping } from "./models/password-model.mjs";
|
|
5
|
-
import {
|
|
6
|
-
import { StatefulSessionMapping } from "./models/session-model.mjs";
|
|
6
|
+
import { PendingAuthenticationMapping, StatefulSessionMapping } from "./models/session-model.mjs";
|
|
7
7
|
import { StorageRole } from "./storage-tables.mjs";
|
|
8
8
|
import { MappingInput } from "./configuration.mjs";
|
|
9
9
|
import { Crypto, Effect, Schema } from "effect";
|
|
@@ -31,6 +31,7 @@ export declare const makeMappings: (input: MappingInput) => Effect.Effect<{
|
|
|
31
31
|
securityRevision: string;
|
|
32
32
|
isActiveStatus: (value: unknown) => boolean;
|
|
33
33
|
d1ActiveStatusValue: unknown;
|
|
34
|
+
activeStatusValue: unknown;
|
|
34
35
|
decodeRequirement: (row: Readonly<Record<string, unknown>>) => Effect.Effect<import("@yielded/auth/Sessions").AuthenticationRequirement, PersistenceMappingError>;
|
|
35
36
|
decodeActionRequirement: (row: Readonly<Record<string, unknown>>, action: import("@yielded/auth/Password").PasswordAction | import("@yielded/auth/Email").EmailAction | import("@yielded/auth/Passkey").PasskeyActionChallenge["action"]) => Effect.Effect<import("@yielded/auth/Sessions").AuthenticationRequirement, PersistenceMappingError>;
|
|
36
37
|
nextSecurityRevision: () => Effect.Effect<string & import("effect/Brand").Brand<"effect-auth/SecurityRevision">, PersistenceMappingError, never>;
|
|
@@ -41,6 +42,7 @@ export declare const makeMappings: (input: MappingInput) => Effect.Effect<{
|
|
|
41
42
|
credentialId: string;
|
|
42
43
|
revision: string;
|
|
43
44
|
status: string;
|
|
45
|
+
activeStatusValue: boolean;
|
|
44
46
|
isActiveStatus: (value: unknown) => value is true;
|
|
45
47
|
encodeInsert: (row: object) => {
|
|
46
48
|
active: boolean;
|
|
@@ -50,11 +52,12 @@ export declare const makeMappings: (input: MappingInput) => Effect.Effect<{
|
|
|
50
52
|
};
|
|
51
53
|
};
|
|
52
54
|
};
|
|
53
|
-
proofs: () => AnyProofPersistenceMapping<
|
|
54
|
-
passwords: () => AnyPasswordPersistenceMapping<
|
|
55
|
-
emails: () => AnyEmailAddressMapping<
|
|
56
|
-
sessions: <C extends Schema.Codec<unknown, unknown, never, never>>(claims: C) => StatefulSessionMapping<C["Type"], TableModel, TableModel, TableModel, TableModel,
|
|
55
|
+
proofs: () => AnyProofPersistenceMapping<SqlExpression>;
|
|
56
|
+
passwords: () => AnyPasswordPersistenceMapping<SqlExpression>;
|
|
57
|
+
emails: () => AnyEmailAddressMapping<SqlExpression>;
|
|
58
|
+
sessions: <C extends Schema.Codec<unknown, unknown, never, never>>(claims: C, moduleId: string) => StatefulSessionMapping<C["Type"], TableModel, TableModel, TableModel, TableModel, unknown, unknown>;
|
|
59
|
+
pending: <C extends Schema.Codec<unknown, unknown, never, never>>(claims: C, moduleId: string) => PendingAuthenticationMapping<C["Type"], TableModel, TableModel, TableModel, unknown>;
|
|
57
60
|
string: typeof string;
|
|
58
|
-
},
|
|
61
|
+
}, PersistenceMappingError, Crypto.Crypto | import("effect/sql/SqlClient").SqlClient>;
|
|
59
62
|
//#endregion
|
|
60
63
|
//# sourceMappingURL=storage-mapping.d.mts.map
|