@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,49 +0,0 @@
|
|
|
1
|
-
import { DateTime, Effect, Schema } from "effect";
|
|
2
|
-
import { AuthenticationRevision, SessionStepUpCompletionPlan, SessionStepUpIntent, SessionStepUpInvalid, SessionUnavailable, StatefulSessionRecord } from "@yielded/auth/Sessions";
|
|
3
|
-
//#region src/internal/step-up-state.d.ts
|
|
4
|
-
export declare const encodeStepUpIntent: (intent: SessionStepUpIntent) => Effect.Effect<string, SessionUnavailable, never>;
|
|
5
|
-
export declare const decodeStepUpIntent: (snapshot: string) => Effect.Effect<{
|
|
6
|
-
readonly _tag: "SessionStepUpIntent";
|
|
7
|
-
readonly digest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
8
|
-
readonly version: string & import("effect/Brand").Brand<"effect-auth/SecurityRevision">;
|
|
9
|
-
readonly flowId: string & import("effect/Brand").Brand<"effect-auth/AuthenticationFlowId">;
|
|
10
|
-
readonly bindingDigest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
11
|
-
readonly revision: {
|
|
12
|
-
readonly subjectId: string & import("effect/Brand").Brand<"effect-auth/SubjectId">;
|
|
13
|
-
readonly securityRevision: string & import("effect/Brand").Brand<"effect-auth/SecurityRevision">;
|
|
14
|
-
readonly credentials: readonly {
|
|
15
|
-
readonly credentialId: string;
|
|
16
|
-
readonly revision: string & import("effect/Brand").Brand<"effect-auth/SecurityRevision">;
|
|
17
|
-
}[];
|
|
18
|
-
};
|
|
19
|
-
readonly sourceKind: "StateAssistedSigned" | "Stateful" | "StatelessSigned";
|
|
20
|
-
readonly sourceSessionId: string & import("effect/Brand").Brand<"effect-auth/SessionId">;
|
|
21
|
-
readonly sourceCredentialVersion: string & import("effect/Brand").Brand<"effect-auth/SessionCredentialVersion">;
|
|
22
|
-
readonly sourceAuthenticatedAt: DateTime.Utc;
|
|
23
|
-
readonly sourceExpiresAt: DateTime.Utc;
|
|
24
|
-
readonly sourceAbsoluteExpiresAt: DateTime.Utc;
|
|
25
|
-
readonly profileId: string & import("effect/Brand").Brand<"effect-auth/SessionStepUpProfileId">;
|
|
26
|
-
readonly profileGeneration: number;
|
|
27
|
-
readonly profileDigest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
28
|
-
readonly requirement: {
|
|
29
|
-
readonly maximumAgeMillis: number;
|
|
30
|
-
readonly alternatives: readonly [{
|
|
31
|
-
readonly userVerified: boolean;
|
|
32
|
-
readonly phishingResistant: boolean;
|
|
33
|
-
readonly factors: readonly ("inherence" | "knowledge" | "possession")[];
|
|
34
|
-
readonly minimumCredentials: number;
|
|
35
|
-
}, ...{
|
|
36
|
-
readonly userVerified: boolean;
|
|
37
|
-
readonly phishingResistant: boolean;
|
|
38
|
-
readonly factors: readonly ("inherence" | "knowledge" | "possession")[];
|
|
39
|
-
readonly minimumCredentials: number;
|
|
40
|
-
}[]];
|
|
41
|
-
};
|
|
42
|
-
readonly expiresAt: DateTime.Utc;
|
|
43
|
-
readonly attemptLimit: number;
|
|
44
|
-
}, SessionUnavailable, never>;
|
|
45
|
-
export declare const stepUpIntentLive: (intent: SessionStepUpIntent, kind: SessionStepUpIntent["sourceKind"], now: DateTime.Utc) => boolean;
|
|
46
|
-
/** Validate core-owned plans before driver allocation/SQL expansion. No bearer or Claims decoding. */
|
|
47
|
-
export declare const validateStepUpPlan: <Claims>(plan: SessionStepUpCompletionPlan<Claims>) => Effect.Effect<undefined, SessionStepUpInvalid, never>;
|
|
48
|
-
//#endregion
|
|
49
|
-
//# sourceMappingURL=step-up-state.d.mts.map
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { NativeDatabase, TransactionNativeDatabase, TransactionOwner, makeTransactionKernel } from "./transaction-kernel.mjs";
|
|
2
|
-
import { Context, Crypto, Effect, PlatformError } from "effect";
|
|
3
|
-
import { Statement } from "effect/sql/Statement";
|
|
4
|
-
import { CurrentCommitJournal, HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
5
|
-
import * as SqlClient$1 from "effect/sql/SqlClient";
|
|
6
|
-
import * as SqlError$1 from "effect/sql/SqlError";
|
|
7
|
-
//#region src/internal/transaction-execution-kernel.d.ts
|
|
8
|
-
export interface TransactionTargetConfiguration<Failure> {
|
|
9
|
-
readonly mode: "interactive" | "synchronous" | "batch";
|
|
10
|
-
readonly dialect: "pg" | "mysql" | "sqlite";
|
|
11
|
-
readonly locking: boolean;
|
|
12
|
-
/** The captured database's transaction marker; batch drivers may omit it. */
|
|
13
|
-
readonly standaloneGuard: (transactionService: SqlClient$1.SqlClient["transactionService"] | undefined) => Effect.Effect<void, Failure>;
|
|
14
|
-
readonly transaction?: <A, E, R>(database: any, body: (transaction: any) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | SqlError$1.SqlError | Failure, R>;
|
|
15
|
-
}
|
|
16
|
-
export type TransactionCoordinatorError<E, Failure> = E | Failure | HookConfigurationError | SqlError$1.SqlError;
|
|
17
|
-
export interface TransactionBound<Failure> {
|
|
18
|
-
readonly owner: TransactionOwner<Failure>;
|
|
19
|
-
used: boolean;
|
|
20
|
-
poisoned: boolean;
|
|
21
|
-
active: boolean;
|
|
22
|
-
inFlight: number;
|
|
23
|
-
}
|
|
24
|
-
export interface TransactionExecution<Failure, OwnerId, Requirements = LifecycleHooks> {
|
|
25
|
-
readonly bound: boolean;
|
|
26
|
-
readonly active: () => boolean;
|
|
27
|
-
readonly admit: Effect.Effect<void, Failure>;
|
|
28
|
-
readonly poison: () => void;
|
|
29
|
-
readonly run: <A, E, R>(body: Effect.Effect<A, E, R>, mutation?: boolean) => Effect.Effect<A, Failure, Exclude<Exclude<R, OwnerId | CurrentCommitJournal>, Crypto.Crypto> | Requirements>;
|
|
30
|
-
}
|
|
31
|
-
export declare const makeTransactionExecutionKernel: (transactions: Pick<ReturnType<typeof makeTransactionKernel>, "makeTransactionOwner" | "reportTransactionFailure">) => {
|
|
32
|
-
sqlClientTransactionStandaloneGuard: <Failure>(unavailable: () => Failure, transactionService: SqlClient$1.SqlClient["transactionService"] | undefined) => Effect.Effect<void, Failure, never>;
|
|
33
|
-
makeTransactionExecution: <Failure, OwnerId>(ownerTag: Context.Key<OwnerId, TransactionOwner<Failure>>, configuration: TransactionTargetConfiguration<Failure>, unavailable: () => Failure, nonce: Effect.Effect<string, PlatformError.PlatformError, Crypto.Crypto>, bound?: TransactionBound<Failure> | undefined) => Effect.Effect<TransactionExecution<Failure, OwnerId, LifecycleHooks>, never, Crypto.Crypto | NativeDatabase>;
|
|
34
|
-
coordinateTransactionOwner: <Failure, OwnerId, Resources, AllocationError, AllocationRequirements, Services, Transaction, A, E, R>(database: TransactionNativeDatabase, ownerTag: Context.Key<OwnerId, TransactionOwner<Failure>>, configuration: TransactionTargetConfiguration<Failure>, allocate: Effect.Effect<Resources, AllocationError, AllocationRequirements>, unavailable: () => Failure, nonce: Effect.Effect<string, PlatformError.PlatformError, Crypto.Crypto>, services: (execution: TransactionExecution<Failure, OwnerId>, resources: Resources) => Services, owner: (transaction: Transaction, services: Services, append: (statement: Statement<any>) => void) => Effect.Effect<A, E, R>) => Effect.Effect<A, TransactionCoordinatorError<E, Failure>, Exclude<R, CurrentCommitJournal> | LifecycleHooks | AllocationRequirements | Crypto.Crypto>;
|
|
35
|
-
};
|
|
36
|
-
//#endregion
|
|
37
|
-
//# sourceMappingURL=transaction-execution-kernel.d.mts.map
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { requireStandalone } from "./standalone.mjs";
|
|
2
|
-
import { NativeDatabase } from "./transaction-kernel.mjs";
|
|
3
|
-
import { Context, Crypto, Effect } from "effect";
|
|
4
|
-
import { CurrentCommitJournal, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
|
|
5
|
-
//#region src/internal/transaction-execution-kernel.ts
|
|
6
|
-
const makeTransactionExecutionKernel = (transactions) => {
|
|
7
|
-
const { makeTransactionOwner, reportTransactionFailure } = transactions;
|
|
8
|
-
const sqlClientTransactionStandaloneGuard = (unavailable, transactionService) => requireStandalone(unavailable, transactionService);
|
|
9
|
-
const makeTransactionExecution = Effect.fnUntraced(function* (ownerTag, configuration, unavailable, nonce, bound) {
|
|
10
|
-
const database = yield* NativeDatabase;
|
|
11
|
-
const crypto = yield* Crypto.Crypto;
|
|
12
|
-
const invariant = (value) => {
|
|
13
|
-
if (!value) throw unavailable();
|
|
14
|
-
};
|
|
15
|
-
return {
|
|
16
|
-
bound: bound !== void 0,
|
|
17
|
-
active: () => bound === void 0 || bound.active,
|
|
18
|
-
admit: bound !== void 0 ? Effect.suspend(() => bound.active ? Effect.void : Effect.fail(unavailable())) : Effect.gen(function* () {
|
|
19
|
-
if (yield* hasCommitScope) return yield* Effect.fail(unavailable());
|
|
20
|
-
yield* configuration.standaloneGuard(database.$client.transactionService);
|
|
21
|
-
}),
|
|
22
|
-
poison: () => {
|
|
23
|
-
if (bound !== void 0) bound.poisoned = true;
|
|
24
|
-
},
|
|
25
|
-
run: (body, mutation = true) => {
|
|
26
|
-
return Effect.suspend(() => {
|
|
27
|
-
let entered = false;
|
|
28
|
-
return (bound !== void 0 ? Effect.gen(function* () {
|
|
29
|
-
if (!bound.active) return yield* Effect.fail(unavailable());
|
|
30
|
-
entered = true;
|
|
31
|
-
bound.inFlight++;
|
|
32
|
-
if (!mutation) return yield* Effect.provideContext(body, Context.make(ownerTag, bound.owner).pipe(Context.add(CurrentCommitJournal, bound.owner.journal)));
|
|
33
|
-
invariant(!bound.used && !bound.poisoned);
|
|
34
|
-
bound.used = true;
|
|
35
|
-
return (yield* coordinateCommit((journal) => Effect.gen(function* () {
|
|
36
|
-
bound.owner.guards.push(journal.prepare(void 0));
|
|
37
|
-
return yield* Effect.provideContext(body, Context.make(ownerTag, {
|
|
38
|
-
...bound.owner,
|
|
39
|
-
journal
|
|
40
|
-
}).pipe(Context.add(CurrentCommitJournal, journal)));
|
|
41
|
-
}), { mode: configuration.mode })).value;
|
|
42
|
-
}).pipe(Effect.onExit((exit) => Effect.sync(() => {
|
|
43
|
-
if (entered) bound.inFlight--;
|
|
44
|
-
if (exit._tag === "Failure") bound.poisoned = true;
|
|
45
|
-
}))) : Effect.gen(function* () {
|
|
46
|
-
if (yield* hasCommitScope) return yield* Effect.fail(unavailable());
|
|
47
|
-
yield* configuration.standaloneGuard(database.$client.transactionService);
|
|
48
|
-
const marker = yield* nonce;
|
|
49
|
-
return (yield* coordinateCommit((journal) => {
|
|
50
|
-
const run = (tx) => Effect.gen(function* () {
|
|
51
|
-
const owner = makeTransactionOwner(tx, journal, marker, unavailable, {
|
|
52
|
-
client: database.$client,
|
|
53
|
-
batch: configuration.mode === "batch",
|
|
54
|
-
locking: configuration.locking,
|
|
55
|
-
mysql: configuration.dialect === "mysql",
|
|
56
|
-
dialect: configuration.dialect
|
|
57
|
-
});
|
|
58
|
-
const value = yield* Effect.provideContext(body, Context.make(ownerTag, owner).pipe(Context.add(CurrentCommitJournal, journal)));
|
|
59
|
-
yield* owner.finish();
|
|
60
|
-
if (configuration.mode === "batch") yield* tx.$client.batch(owner.statements);
|
|
61
|
-
return value;
|
|
62
|
-
});
|
|
63
|
-
return configuration.mode === "batch" ? run(database) : configuration.transaction !== void 0 ? configuration.transaction(database, run) : database.transaction(run);
|
|
64
|
-
}, { mode: configuration.mode })).value;
|
|
65
|
-
})).pipe(Effect.provideService(Crypto.Crypto, crypto), (operation) => reportTransactionFailure(operation, unavailable), Effect.mapError(unavailable), Effect.catchDefect(() => Effect.fail(unavailable())));
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
const coordinateTransactionOwner = (database, ownerTag, configuration, allocate, unavailable, nonce, services, owner) => {
|
|
71
|
-
return Effect.gen(function* () {
|
|
72
|
-
if (yield* hasCommitScope) return yield* Effect.fail(unavailable());
|
|
73
|
-
yield* configuration.standaloneGuard(database.$client.transactionService);
|
|
74
|
-
const crypto = yield* Crypto.Crypto;
|
|
75
|
-
const resources = yield* allocate.pipe((operation) => reportTransactionFailure(operation, unavailable), Effect.mapError(unavailable), Effect.catchDefect(() => Effect.fail(unavailable())));
|
|
76
|
-
const marker = yield* nonce.pipe(Effect.mapError(unavailable));
|
|
77
|
-
return (yield* coordinateCommit((journal) => {
|
|
78
|
-
const run = (tx) => Effect.gen(function* () {
|
|
79
|
-
const state = makeTransactionOwner(tx, journal, marker, unavailable, {
|
|
80
|
-
client: database.$client,
|
|
81
|
-
batch: configuration.mode === "batch",
|
|
82
|
-
dialect: configuration.dialect,
|
|
83
|
-
mysql: configuration.dialect === "mysql",
|
|
84
|
-
locking: configuration.locking
|
|
85
|
-
});
|
|
86
|
-
const bound = {
|
|
87
|
-
owner: state,
|
|
88
|
-
used: false,
|
|
89
|
-
poisoned: false,
|
|
90
|
-
active: true,
|
|
91
|
-
inFlight: 0
|
|
92
|
-
};
|
|
93
|
-
return yield* Effect.gen(function* () {
|
|
94
|
-
const value = yield* owner(tx, services(yield* makeTransactionExecution(ownerTag, configuration, unavailable, nonce, bound).pipe(Effect.provideService(NativeDatabase, tx)), resources), (statement) => {
|
|
95
|
-
if (!bound.active) throw unavailable();
|
|
96
|
-
state.statements.push(statement);
|
|
97
|
-
});
|
|
98
|
-
bound.active = false;
|
|
99
|
-
if (bound.poisoned || bound.inFlight !== 0) return yield* Effect.fail(unavailable());
|
|
100
|
-
yield* state.finish();
|
|
101
|
-
if (configuration.mode === "batch") yield* tx.$client.batch(state.statements);
|
|
102
|
-
return value;
|
|
103
|
-
}).pipe(Effect.ensuring(Effect.sync(() => {
|
|
104
|
-
bound.active = false;
|
|
105
|
-
})));
|
|
106
|
-
}).pipe(Effect.provideService(Crypto.Crypto, crypto));
|
|
107
|
-
return configuration.mode === "batch" ? run(database) : configuration.transaction !== void 0 ? configuration.transaction(database, run) : database.transaction(run);
|
|
108
|
-
}, { mode: configuration.mode })).value;
|
|
109
|
-
});
|
|
110
|
-
};
|
|
111
|
-
return {
|
|
112
|
-
sqlClientTransactionStandaloneGuard,
|
|
113
|
-
makeTransactionExecution,
|
|
114
|
-
coordinateTransactionOwner
|
|
115
|
-
};
|
|
116
|
-
};
|
|
117
|
-
//#endregion
|
|
118
|
-
export { makeTransactionExecutionKernel };
|
|
119
|
-
|
|
120
|
-
//# sourceMappingURL=transaction-execution-kernel.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-execution-kernel.mjs","names":[],"sources":["../../src/internal/transaction-execution-kernel.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n CurrentCommitJournal,\n type LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- existing storage kernels erase foreign table shapes; domain errors remain typed. */\n/* oxlint-disable no-explicit-any -- private execution bridge retains exact public driver wrappers. */\nimport { Context, Crypto, Effect, type PlatformError } from \"effect\";\nimport type * as SqlClient from \"effect/sql/SqlClient\";\nimport type * as SqlError from \"effect/sql/SqlError\";\nimport type { Statement } from \"effect/sql/Statement\";\n\nimport { requireStandalone } from \"./standalone\";\nimport {\n NativeDatabase,\n type TransactionNativeDatabase,\n type TransactionOwner,\n type makeTransactionKernel,\n} from \"./transaction-kernel\";\n\nexport interface TransactionTargetConfiguration<Failure> {\n readonly mode: \"interactive\" | \"synchronous\" | \"batch\";\n readonly dialect: \"pg\" | \"mysql\" | \"sqlite\";\n readonly locking: boolean;\n /** The captured database's transaction marker; batch drivers may omit it. */\n readonly standaloneGuard: (\n transactionService: SqlClient.SqlClient[\"transactionService\"] | undefined,\n ) => Effect.Effect<void, Failure>;\n readonly transaction?: <A, E, R>(\n database: any,\n body: (transaction: any) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError | Failure, R>;\n}\n\nexport type TransactionCoordinatorError<E, Failure> =\n | E\n | Failure\n | HookConfigurationError\n | SqlError.SqlError;\n\nexport interface TransactionBound<Failure> {\n readonly owner: TransactionOwner<Failure>;\n used: boolean;\n poisoned: boolean;\n active: boolean;\n inFlight: number;\n}\n\nexport interface TransactionExecution<Failure, OwnerId, Requirements = LifecycleHooks> {\n readonly bound: boolean;\n readonly active: () => boolean;\n readonly admit: Effect.Effect<void, Failure>;\n readonly poison: () => void;\n readonly run: <A, E, R>(\n body: Effect.Effect<A, E, R>,\n mutation?: boolean,\n ) => Effect.Effect<\n A,\n Failure,\n Exclude<Exclude<R, OwnerId | CurrentCommitJournal>, Crypto.Crypto> | Requirements\n >;\n}\n\nexport const makeTransactionExecutionKernel = (\n transactions: Pick<\n ReturnType<typeof makeTransactionKernel>,\n \"makeTransactionOwner\" | \"reportTransactionFailure\"\n >,\n) => {\n const { makeTransactionOwner, reportTransactionFailure } = transactions;\n\n const sqlClientTransactionStandaloneGuard = <Failure>(\n unavailable: () => Failure,\n transactionService: SqlClient.SqlClient[\"transactionService\"] | undefined,\n ) => requireStandalone(unavailable, transactionService);\n\n const makeTransactionExecution = Effect.fnUntraced(function* <Failure, OwnerId>(\n ownerTag: Context.Key<OwnerId, TransactionOwner<Failure>>,\n configuration: TransactionTargetConfiguration<Failure>,\n unavailable: () => Failure,\n nonce: Effect.Effect<string, PlatformError.PlatformError, Crypto.Crypto>,\n bound?: TransactionBound<Failure>,\n ): Effect.fn.Return<\n TransactionExecution<Failure, OwnerId>,\n never,\n NativeDatabase | Crypto.Crypto\n > {\n const database = yield* NativeDatabase;\n const crypto = yield* Crypto.Crypto;\n\n const invariant: (value: unknown) => asserts value = (value) => {\n if (!value) throw unavailable();\n };\n\n return {\n bound: bound !== undefined,\n active: () => bound === undefined || bound.active,\n admit:\n bound !== undefined\n ? Effect.suspend(() => (bound.active ? Effect.void : Effect.fail(unavailable())))\n : Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* Effect.fail(unavailable());\n yield* configuration.standaloneGuard(database.$client.transactionService);\n }),\n poison: () => {\n if (bound !== undefined) bound.poisoned = true;\n },\n run: <A, E, R>(\n body: Effect.Effect<A, E, R>,\n mutation = true,\n ): Effect.Effect<\n A,\n Failure,\n Exclude<Exclude<R, OwnerId | CurrentCommitJournal>, Crypto.Crypto> | LifecycleHooks\n > => {\n return Effect.suspend(() => {\n let entered = false;\n\n const work: Effect.Effect<\n A,\n E | Failure | HookConfigurationError | SqlError.SqlError | PlatformError.PlatformError,\n Exclude<R, OwnerId | CurrentCommitJournal> | LifecycleHooks | Crypto.Crypto\n > =\n bound !== undefined\n ? Effect.gen(function* () {\n if (!bound.active) return yield* Effect.fail(unavailable());\n entered = true;\n bound.inFlight++;\n if (!mutation)\n return yield* Effect.provideContext(\n body,\n Context.make(ownerTag, bound.owner).pipe(\n Context.add(CurrentCommitJournal, bound.owner.journal),\n ),\n );\n invariant(!bound.used && !bound.poisoned);\n bound.used = true;\n\n const result = yield* coordinateCommit(\n (journal) =>\n Effect.gen(function* () {\n bound.owner.guards.push(journal.prepare(undefined));\n\n return yield* Effect.provideContext(\n body,\n Context.make(ownerTag, { ...bound.owner, journal }).pipe(\n Context.add(CurrentCommitJournal, journal),\n ),\n );\n }),\n { mode: configuration.mode },\n );\n\n return result.value;\n }).pipe(\n Effect.onExit((exit) =>\n Effect.sync(() => {\n if (entered) bound.inFlight--;\n if (exit._tag === \"Failure\") bound.poisoned = true;\n }),\n ),\n )\n : Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* Effect.fail(unavailable());\n yield* configuration.standaloneGuard(database.$client.transactionService);\n const marker = yield* nonce;\n\n const result = yield* coordinateCommit(\n (journal) => {\n const run = (tx: TransactionNativeDatabase) =>\n Effect.gen(function* () {\n const owner = makeTransactionOwner(tx, journal, marker, unavailable, {\n client: database.$client,\n batch: configuration.mode === \"batch\",\n locking: configuration.locking,\n mysql: configuration.dialect === \"mysql\",\n dialect: configuration.dialect,\n });\n\n const value = yield* Effect.provideContext(\n body,\n Context.make(ownerTag, owner).pipe(\n Context.add(CurrentCommitJournal, journal),\n ),\n );\n\n yield* owner.finish();\n if (configuration.mode === \"batch\")\n yield* tx.$client.batch(owner.statements);\n\n return value;\n });\n\n return configuration.mode === \"batch\"\n ? run(database)\n : configuration.transaction !== undefined\n ? configuration.transaction(database, run)\n : database.transaction(run);\n },\n { mode: configuration.mode },\n );\n\n return result.value;\n });\n\n return work.pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n (operation) => reportTransactionFailure(operation, unavailable),\n Effect.mapError(unavailable),\n Effect.catchDefect(() => Effect.fail(unavailable())),\n );\n });\n },\n };\n });\n\n const coordinateTransactionOwner = <\n Failure,\n OwnerId,\n Resources,\n AllocationError,\n AllocationRequirements,\n Services,\n Transaction,\n A,\n E,\n R,\n >(\n database: TransactionNativeDatabase,\n ownerTag: Context.Key<OwnerId, TransactionOwner<Failure>>,\n configuration: TransactionTargetConfiguration<Failure>,\n allocate: Effect.Effect<Resources, AllocationError, AllocationRequirements>,\n unavailable: () => Failure,\n nonce: Effect.Effect<string, PlatformError.PlatformError, Crypto.Crypto>,\n services: (execution: TransactionExecution<Failure, OwnerId>, resources: Resources) => Services,\n owner: (\n transaction: Transaction,\n services: Services,\n append: (statement: Statement<any>) => void,\n ) => Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n TransactionCoordinatorError<E, Failure>,\n Exclude<R, CurrentCommitJournal> | LifecycleHooks | AllocationRequirements | Crypto.Crypto\n > => {\n return Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* Effect.fail(unavailable());\n yield* configuration.standaloneGuard(database.$client.transactionService);\n const crypto = yield* Crypto.Crypto;\n\n // Allocation is independent of registration data and always precedes the physical owner.\n const resources = yield* allocate.pipe(\n (operation) => reportTransactionFailure(operation, unavailable),\n Effect.mapError(unavailable),\n Effect.catchDefect(() => Effect.fail(unavailable())),\n );\n\n const marker = yield* nonce.pipe(Effect.mapError(unavailable));\n\n const result = yield* coordinateCommit(\n (journal) => {\n const run = (tx: TransactionNativeDatabase) =>\n Effect.gen(function* () {\n const state = makeTransactionOwner(tx, journal, marker, unavailable, {\n client: database.$client,\n batch: configuration.mode === \"batch\",\n dialect: configuration.dialect,\n mysql: configuration.dialect === \"mysql\",\n locking: configuration.locking,\n });\n\n const bound: TransactionBound<Failure> = {\n owner: state,\n used: false,\n poisoned: false,\n active: true,\n inFlight: 0,\n };\n\n return yield* Effect.gen(function* () {\n const value = yield* owner(\n tx as Transaction,\n services(\n yield* makeTransactionExecution(\n ownerTag,\n configuration,\n unavailable,\n nonce,\n bound,\n ).pipe(Effect.provideService(NativeDatabase, tx)),\n resources,\n ),\n (statement) => {\n if (!bound.active) throw unavailable();\n state.statements.push(statement);\n },\n );\n\n bound.active = false;\n if (bound.poisoned || bound.inFlight !== 0)\n return yield* Effect.fail(unavailable());\n yield* state.finish();\n if (configuration.mode === \"batch\") yield* tx.$client.batch(state.statements);\n\n return value;\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n bound.active = false;\n }),\n ),\n );\n }).pipe(Effect.provideService(Crypto.Crypto, crypto));\n\n return configuration.mode === \"batch\"\n ? run(database)\n : configuration.transaction !== undefined\n ? configuration.transaction(database, run)\n : database.transaction(run);\n },\n { mode: configuration.mode },\n );\n\n return result.value as A;\n });\n };\n\n return {\n sqlClientTransactionStandaloneGuard,\n makeTransactionExecution,\n coordinateTransactionOwner,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { QueryOperations, SqlColumn, SqlExpression, SqlFragment } from "./query-operations.mjs";
|
|
2
|
-
import { Context, Effect } from "effect";
|
|
3
|
-
import { Statement } from "effect/sql/Statement";
|
|
4
|
-
import { CommitJournal, PreparedCommit } from "@yielded/auth/Hooks";
|
|
5
|
-
import * as SqlClient$1 from "effect/sql/SqlClient";
|
|
6
|
-
import { SqlError } from "effect/sql/SqlError";
|
|
7
|
-
//#region src/internal/transaction-kernel.d.ts
|
|
8
|
-
type Table = object;
|
|
9
|
-
export type Row = Record<string, any>;
|
|
10
|
-
export interface TransactionNativeDatabase {
|
|
11
|
-
readonly $client: SqlClient$1.SqlClient & {
|
|
12
|
-
readonly batch: (statements: ReadonlyArray<Statement<any>>) => Effect.Effect<any, SqlError>;
|
|
13
|
-
};
|
|
14
|
-
readonly transaction: <A, E, R>(body: (transaction: any) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | SqlError, R>;
|
|
15
|
-
}
|
|
16
|
-
declare const NativeDatabase_base: Context.ServiceClass<NativeDatabase, "effect-auth/persistence/NativeDatabase", TransactionNativeDatabase>;
|
|
17
|
-
/** Captured root database for service construction and pre-transaction catalog checks.
|
|
18
|
-
* Active transactions remain owned by their coordinator and journal. */
|
|
19
|
-
export declare class NativeDatabase extends NativeDatabase_base {}
|
|
20
|
-
export interface Observation {
|
|
21
|
-
readonly table: Table;
|
|
22
|
-
readonly where: SqlExpression;
|
|
23
|
-
rows: ReadonlyArray<Row>;
|
|
24
|
-
}
|
|
25
|
-
/** Expressions deliberately do not replace observed values. Read only semantic
|
|
26
|
-
* columns when telemetry changes atomically, and state the physical result. */
|
|
27
|
-
export interface GuardedUpdate {
|
|
28
|
-
readonly rows: number;
|
|
29
|
-
readonly postcondition: SqlExpression;
|
|
30
|
-
}
|
|
31
|
-
export interface TransactionOwner<Failure> {
|
|
32
|
-
readonly database: any;
|
|
33
|
-
readonly journal: CommitJournal;
|
|
34
|
-
readonly marker: string;
|
|
35
|
-
readonly batch: boolean;
|
|
36
|
-
readonly observations: Observation[];
|
|
37
|
-
readonly postconditions: Array<SqlExpression | (() => SqlExpression)>;
|
|
38
|
-
readonly statements: Statement<any>[];
|
|
39
|
-
readonly guards: PreparedCommit<void>[];
|
|
40
|
-
exact(table: Table, row: Row): SqlExpression;
|
|
41
|
-
read(table: Table, where: SqlExpression, options?: {
|
|
42
|
-
readonly lock?: boolean;
|
|
43
|
-
readonly limit?: number;
|
|
44
|
-
readonly observe?: boolean;
|
|
45
|
-
readonly admissionOnly?: boolean;
|
|
46
|
-
readonly takeOnly?: boolean;
|
|
47
|
-
readonly orderBy?: any;
|
|
48
|
-
readonly columns?: ReadonlyArray<string>;
|
|
49
|
-
}): Effect.Effect<Observation, Failure>;
|
|
50
|
-
write(query: any): Effect.Effect<void, Failure>;
|
|
51
|
-
insert(table: Table, values: Row, key: Row, absent?: boolean): Effect.Effect<Observation, Failure>;
|
|
52
|
-
update(table: Table, key: Row, values: Row): Effect.Effect<void, Failure>;
|
|
53
|
-
updateGuarded(table: Table, where: SqlExpression, values: Row, guard: GuardedUpdate): Effect.Effect<void, Failure>;
|
|
54
|
-
/** Internal SQL only, run once after application work and before final guards. */
|
|
55
|
-
finalUpdate(table: Table, where: SqlExpression, values: Row, guard: GuardedUpdate): Effect.Effect<void, Failure>;
|
|
56
|
-
remove(table: Table, key: Row): Effect.Effect<void, Failure>;
|
|
57
|
-
check(condition: SqlExpression): Effect.Effect<boolean, Failure>;
|
|
58
|
-
now(clock: {
|
|
59
|
-
readonly engineNowMillis: SqlExpression;
|
|
60
|
-
}): Effect.Effect<number, Failure>;
|
|
61
|
-
finish(): Effect.Effect<void, Failure>;
|
|
62
|
-
}
|
|
63
|
-
export declare const makeTransactionKernel: <Fragment extends SqlFragment = SqlFragment, Column extends SqlColumn = SqlColumn>(operations: QueryOperations<Fragment, Column>) => {
|
|
64
|
-
reportTransactionFailure: <A, E, R, Failure>(effect: Effect.Effect<A, E, R>, unavailable: () => Failure) => Effect.Effect<A, E, R>;
|
|
65
|
-
both: (...parts: ReadonlyArray<SqlExpression | undefined>) => Fragment;
|
|
66
|
-
makeTransactionRows: <Failure>(unavailable: () => Failure) => {
|
|
67
|
-
col: (table: Table, key: string) => Column;
|
|
68
|
-
equal: (table: Table, values: Row) => Fragment;
|
|
69
|
-
copiedRow: (row: Row) => Row;
|
|
70
|
-
matchesNativeRow: (table: Table, row: Row, key: Row) => boolean;
|
|
71
|
-
};
|
|
72
|
-
makeTransactionOwner: <Failure>(database: any, journal: CommitJournal, marker: string, unavailable: () => Failure, configuration: {
|
|
73
|
-
readonly client?: any;
|
|
74
|
-
readonly batch: boolean;
|
|
75
|
-
readonly locking: boolean;
|
|
76
|
-
readonly mysql: boolean;
|
|
77
|
-
readonly dialect: "pg" | "mysql" | "sqlite";
|
|
78
|
-
}) => TransactionOwner<Failure>;
|
|
79
|
-
};
|
|
80
|
-
//#endregion
|
|
81
|
-
//# sourceMappingURL=transaction-kernel.d.mts.map
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { Cause, Context, Effect } from "effect";
|
|
2
|
-
import "@yielded/auth/Hooks";
|
|
3
|
-
import { reportAuthFailure } from "@yielded/auth/Persistence";
|
|
4
|
-
//#region src/internal/transaction-kernel.ts
|
|
5
|
-
/** Captured root database for service construction and pre-transaction catalog checks.
|
|
6
|
-
* Active transactions remain owned by their coordinator and journal. */
|
|
7
|
-
var NativeDatabase = class extends Context.Service()("effect-auth/persistence/NativeDatabase") {};
|
|
8
|
-
const makeTransactionKernel = (operations) => {
|
|
9
|
-
const { eq, getTableColumns, isNull, sql, balancedD1And, compactD1GeneratedStatement } = operations;
|
|
10
|
-
const isUnavailableCause = (cause, unavailable) => {
|
|
11
|
-
const expected = unavailable();
|
|
12
|
-
const tag = typeof expected === "object" && expected !== null && "_tag" in expected ? expected._tag : void 0;
|
|
13
|
-
return tag !== void 0 && cause.reasons.length > 0 && cause.reasons.every((reason) => Cause.isFailReason(reason) && typeof reason.error === "object" && reason.error !== null && "_tag" in reason.error && reason.error._tag === tag);
|
|
14
|
-
};
|
|
15
|
-
/** Report once, before an adapter replaces the raw cause with its public
|
|
16
|
-
* unavailable error. Already translated failures stay quiet at outer owners. */
|
|
17
|
-
const reportTransactionFailure = (effect, unavailable) => Effect.catchCause(effect, (cause) => isUnavailableCause(cause, unavailable) ? Effect.failCause(cause) : reportAuthFailure("auth-persistence", cause).pipe(Effect.andThen(Effect.failCause(cause))));
|
|
18
|
-
const both = (...parts) => balancedD1And(...parts) ?? sql`1 = 1`;
|
|
19
|
-
const makeTransactionRows = (unavailable) => {
|
|
20
|
-
const invariant = (value) => {
|
|
21
|
-
if (!value) throw unavailable();
|
|
22
|
-
};
|
|
23
|
-
const col = (table, key) => {
|
|
24
|
-
const value = getTableColumns(table)[key];
|
|
25
|
-
invariant(value !== void 0);
|
|
26
|
-
return value;
|
|
27
|
-
};
|
|
28
|
-
const equal = (table, values) => both(...Object.entries(values).map(([key, value]) => value === null ? isNull(col(table, key)) : eq(col(table, key), value)));
|
|
29
|
-
/** Mapped driver values use plain data, Dates and binary views. Application
|
|
30
|
-
* identity classes are reconstructed by the mapped codecs, never cloned here. */
|
|
31
|
-
const copiedRow = (row) => {
|
|
32
|
-
const seen = /* @__PURE__ */ new WeakSet();
|
|
33
|
-
const supported = (value) => {
|
|
34
|
-
if (value === null || typeof value !== "object" || seen.has(value)) return;
|
|
35
|
-
seen.add(value);
|
|
36
|
-
if (value instanceof Date || value instanceof ArrayBuffer || ArrayBuffer.isView(value)) return;
|
|
37
|
-
invariant(Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
|
|
38
|
-
for (const item of Object.values(value)) supported(item);
|
|
39
|
-
};
|
|
40
|
-
supported(row);
|
|
41
|
-
return structuredClone(row);
|
|
42
|
-
};
|
|
43
|
-
const nativeKey = (value) => {
|
|
44
|
-
const packed = (tag, text) => tag + text.length + ":" + text;
|
|
45
|
-
if (value instanceof Date) return packed("date", value.toISOString());
|
|
46
|
-
if (typeof value === "bigint") return packed("bigint", value.toString());
|
|
47
|
-
const bytes = value instanceof ArrayBuffer ? new Uint8Array(value) : ArrayBuffer.isView(value) ? new Uint8Array(value.buffer, value.byteOffset, value.byteLength) : void 0;
|
|
48
|
-
if (bytes !== void 0) return packed("bytes", Array.from(bytes).join(","));
|
|
49
|
-
if (value === null || typeof value !== "object") return packed(typeof value, String(value));
|
|
50
|
-
if (Array.isArray(value)) return packed("array", value.map(nativeKey).join(""));
|
|
51
|
-
invariant(Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
|
|
52
|
-
return packed("object", Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([name, item]) => nativeKey(name) + nativeKey(item)).join(""));
|
|
53
|
-
};
|
|
54
|
-
const matchesNativeRow = (table, row, key) => Object.entries(key).every(([name, value]) => {
|
|
55
|
-
if (value === null || row[name] === null) return value === row[name];
|
|
56
|
-
const column = col(table, name);
|
|
57
|
-
return nativeKey(column.mapToDriverValue(row[name])) === nativeKey(column.mapToDriverValue(value));
|
|
58
|
-
});
|
|
59
|
-
return {
|
|
60
|
-
col,
|
|
61
|
-
equal,
|
|
62
|
-
copiedRow,
|
|
63
|
-
matchesNativeRow
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
const makeTransactionOwner = (database, journal, marker, unavailable, configuration) => {
|
|
67
|
-
const invariant = (value) => {
|
|
68
|
-
if (!value) throw unavailable();
|
|
69
|
-
};
|
|
70
|
-
const { col, equal, matchesNativeRow } = makeTransactionRows(unavailable);
|
|
71
|
-
let phase = "open";
|
|
72
|
-
let poisoned = false;
|
|
73
|
-
const open = () => invariant(phase === "open" && !poisoned);
|
|
74
|
-
const result = (effect) => effect.pipe((operation) => reportTransactionFailure(operation, unavailable), Effect.mapError(unavailable), Effect.catchDefect(() => Effect.fail(unavailable())), Effect.onExit((exit) => Effect.sync(() => {
|
|
75
|
-
if (exit._tag === "Failure") poisoned = true;
|
|
76
|
-
})));
|
|
77
|
-
const observations = [];
|
|
78
|
-
const statements = [];
|
|
79
|
-
const postconditions = [];
|
|
80
|
-
const guards = [];
|
|
81
|
-
const finalUpdates = [];
|
|
82
|
-
const exactRow = (table, row) => both(...Object.entries(row).map(([key, value]) => {
|
|
83
|
-
if (typeof value !== "string") return equal(table, { [key]: value });
|
|
84
|
-
const column = col(table, key), bound = sql.param(value, column);
|
|
85
|
-
return configuration.dialect === "mysql" ? sql`binary ${column} = binary ${bound}` : configuration.dialect === "pg" ? sql`convert_to(cast(${column} as text), 'UTF8') = convert_to(cast(${bound} as text), 'UTF8')` : sql`cast(${column} as blob) = cast(${bound} as blob)`;
|
|
86
|
-
}));
|
|
87
|
-
const toStatement = (query) => {
|
|
88
|
-
const rendered = query.toSQL();
|
|
89
|
-
const client = configuration.client ?? database.$client;
|
|
90
|
-
return compactD1GeneratedStatement(client, client.unsafe(rendered.sql, rendered.params), unavailable);
|
|
91
|
-
};
|
|
92
|
-
const assertion = (condition) => database.select({ value: sql`case when ${condition} then 1 else json_extract('[]', ${"$[oauth-owner-" + marker + "]"}) end` }).from(sql`(select 1) as oauth_assertion`);
|
|
93
|
-
const observedConditions = (table, where, rows) => [sql`(select count(*) from ${table} where ${where}) = ${rows.length}`, ...rows.map((row) => sql`exists(select 1 from ${table} where ${both(where, exactRow(table, row))})`)];
|
|
94
|
-
const chunks = (conditions) => {
|
|
95
|
-
const output = [];
|
|
96
|
-
let pending = [];
|
|
97
|
-
for (const condition of conditions) {
|
|
98
|
-
const candidate = [...pending, condition];
|
|
99
|
-
const rendered = assertion(both(...candidate)).toSQL();
|
|
100
|
-
if (pending.length > 0 && (rendered.params.length > 96 || new TextEncoder().encode(rendered.sql).length > 48e3)) {
|
|
101
|
-
output.push(both(...pending));
|
|
102
|
-
pending = [condition];
|
|
103
|
-
} else pending = candidate;
|
|
104
|
-
}
|
|
105
|
-
if (pending.length > 0) output.push(both(...pending));
|
|
106
|
-
return output;
|
|
107
|
-
};
|
|
108
|
-
const appendAssertions = (conditions) => {
|
|
109
|
-
for (const condition of chunks(conditions)) statements.push(toStatement(assertion(condition)));
|
|
110
|
-
};
|
|
111
|
-
const observed = (table, where, rows) => {
|
|
112
|
-
const observation = {
|
|
113
|
-
table,
|
|
114
|
-
where,
|
|
115
|
-
rows
|
|
116
|
-
};
|
|
117
|
-
observations.push(observation);
|
|
118
|
-
return observation;
|
|
119
|
-
};
|
|
120
|
-
const queryCondition = (condition) => database.select({ value: sql`case when ${condition} then 1 else 0 end`.mapWith(Number).as("value") }).from(sql`(select 1) as oauth_guard`);
|
|
121
|
-
const conditionHolds = (condition) => Effect.gen(function* () {
|
|
122
|
-
const query = queryCondition(condition);
|
|
123
|
-
const rows = yield* configuration.dialect === "sqlite" ? toStatement(query) : query;
|
|
124
|
-
const row = rows[0];
|
|
125
|
-
invariant(rows.length === 1 && row !== void 0);
|
|
126
|
-
return Object.values(row)[0] === 1;
|
|
127
|
-
});
|
|
128
|
-
const guardedQuery = (table, where, values, guard) => {
|
|
129
|
-
invariant(Number.isSafeInteger(guard.rows) && guard.rows > 0 && guard.rows <= 128);
|
|
130
|
-
return {
|
|
131
|
-
query: database.update(table).set(values).where(where),
|
|
132
|
-
guard: { ...guard }
|
|
133
|
-
};
|
|
134
|
-
};
|
|
135
|
-
const applyGuarded = (entry) => Effect.gen(function* () {
|
|
136
|
-
if (configuration.batch) {
|
|
137
|
-
statements.push(toStatement(entry.query));
|
|
138
|
-
statements.push(toStatement(assertion(sql`changes() = ${entry.guard.rows}`)));
|
|
139
|
-
appendAssertions([entry.guard.postcondition]);
|
|
140
|
-
} else {
|
|
141
|
-
if (configuration.mysql) {
|
|
142
|
-
const changed = yield* entry.query;
|
|
143
|
-
invariant(changed.affectedRows === entry.guard.rows);
|
|
144
|
-
} else {
|
|
145
|
-
const changed = yield* entry.query.returning({ value: sql`1` });
|
|
146
|
-
invariant(changed.length === entry.guard.rows);
|
|
147
|
-
}
|
|
148
|
-
invariant(yield* conditionHolds(entry.guard.postcondition));
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
const owner = {
|
|
152
|
-
database,
|
|
153
|
-
journal,
|
|
154
|
-
marker,
|
|
155
|
-
batch: configuration.batch,
|
|
156
|
-
observations,
|
|
157
|
-
statements,
|
|
158
|
-
postconditions,
|
|
159
|
-
guards,
|
|
160
|
-
exact: exactRow,
|
|
161
|
-
read: (table, where, options = {}) => result(Effect.gen(function* () {
|
|
162
|
-
open();
|
|
163
|
-
const limit = options.limit ?? 64;
|
|
164
|
-
let query = database.select(options.columns === void 0 ? void 0 : Object.fromEntries(options.columns.map((key) => [key, col(table, key)]))).from(table).where(where).limit(options.takeOnly ? limit : limit + 1);
|
|
165
|
-
if (options.orderBy !== void 0) query = query.orderBy(options.orderBy);
|
|
166
|
-
if (options.lock !== false && configuration.locking) query = query.for("update");
|
|
167
|
-
const rows = yield* query;
|
|
168
|
-
invariant(rows.length <= limit);
|
|
169
|
-
if (configuration.batch && (options.observe !== false || options.admissionOnly)) appendAssertions(observedConditions(table, where, rows));
|
|
170
|
-
return options.observe === false || options.admissionOnly ? {
|
|
171
|
-
table,
|
|
172
|
-
where,
|
|
173
|
-
rows
|
|
174
|
-
} : observed(table, where, rows);
|
|
175
|
-
})),
|
|
176
|
-
write: (query) => result(Effect.gen(function* () {
|
|
177
|
-
open();
|
|
178
|
-
if (configuration.batch) statements.push(toStatement(query));
|
|
179
|
-
else yield* query;
|
|
180
|
-
})),
|
|
181
|
-
insert: (table, values, key, absent = false) => result(Effect.gen(function* () {
|
|
182
|
-
open();
|
|
183
|
-
let query = database.insert(table).values(values);
|
|
184
|
-
if (absent) query = configuration.mysql ? query.onDuplicateKeyUpdate({ set: { [Object.keys(key)[0]]: col(table, Object.keys(key)[0]) } }) : query.onConflictDoNothing();
|
|
185
|
-
yield* owner.write(query);
|
|
186
|
-
const where = equal(table, key);
|
|
187
|
-
if (configuration.batch) return observed(table, where, [values]);
|
|
188
|
-
const found = yield* owner.read(table, where, { limit: 1 });
|
|
189
|
-
const markerColumn = Object.keys(values).find((key) => values[key] === marker);
|
|
190
|
-
if (!absent || markerColumn !== void 0 && found.rows[0]?.[markerColumn] === marker) invariant(yield* owner.check(sql`exists(select 1 from ${table} where ${both(where, exactRow(table, values))})`));
|
|
191
|
-
return found;
|
|
192
|
-
})),
|
|
193
|
-
update: (table, key, values) => result(Effect.gen(function* () {
|
|
194
|
-
open();
|
|
195
|
-
yield* owner.write(database.update(table).set(values).where(equal(table, key)));
|
|
196
|
-
for (const observation of observations) if (observation.table === table) observation.rows = observation.rows.map((row) => matchesNativeRow(table, row, key) ? {
|
|
197
|
-
...row,
|
|
198
|
-
...values
|
|
199
|
-
} : row);
|
|
200
|
-
})),
|
|
201
|
-
updateGuarded: (table, where, values, guard) => result(Effect.gen(function* () {
|
|
202
|
-
open();
|
|
203
|
-
const entry = guardedQuery(table, where, values, guard);
|
|
204
|
-
yield* applyGuarded(entry);
|
|
205
|
-
postconditions.push(entry.guard.postcondition);
|
|
206
|
-
})),
|
|
207
|
-
finalUpdate: (table, where, values, guard) => result(Effect.sync(() => {
|
|
208
|
-
open();
|
|
209
|
-
invariant(finalUpdates.length < 128);
|
|
210
|
-
finalUpdates.push(guardedQuery(table, where, values, guard));
|
|
211
|
-
})),
|
|
212
|
-
remove: (table, key) => result(Effect.gen(function* () {
|
|
213
|
-
open();
|
|
214
|
-
yield* owner.write(database.delete(table).where(equal(table, key)));
|
|
215
|
-
for (const observation of observations) if (observation.table === table) observation.rows = observation.rows.filter((row) => !matchesNativeRow(table, row, key));
|
|
216
|
-
})),
|
|
217
|
-
check: (condition) => result(Effect.gen(function* () {
|
|
218
|
-
open();
|
|
219
|
-
const holds = yield* conditionHolds(condition);
|
|
220
|
-
if (configuration.batch) statements.push(toStatement(assertion(holds ? condition : sql`not (${condition})`)));
|
|
221
|
-
return holds;
|
|
222
|
-
})),
|
|
223
|
-
now: (clock) => result(Effect.gen(function* () {
|
|
224
|
-
open();
|
|
225
|
-
const value = (yield* database.select({ value: sql`${clock.engineNowMillis}`.mapWith(Number) }).from(sql`(select 1) as oauth_clock`))[0]?.value;
|
|
226
|
-
invariant(Number.isSafeInteger(value) && value >= 0);
|
|
227
|
-
return value;
|
|
228
|
-
})),
|
|
229
|
-
finish: () => result(Effect.gen(function* () {
|
|
230
|
-
open();
|
|
231
|
-
phase = "finishing";
|
|
232
|
-
Object.freeze(observations);
|
|
233
|
-
Object.freeze(postconditions);
|
|
234
|
-
Object.freeze(guards);
|
|
235
|
-
Object.freeze(finalUpdates);
|
|
236
|
-
const conditions = observations.flatMap((observation) => observedConditions(observation.table, observation.where, observation.rows));
|
|
237
|
-
conditions.push(...postconditions.map((condition) => typeof condition === "function" ? condition() : condition));
|
|
238
|
-
conditions.push(...finalUpdates.map((entry) => entry.guard.postcondition));
|
|
239
|
-
for (const guard of guards) {
|
|
240
|
-
const status = yield* Effect.result(guard.read);
|
|
241
|
-
invariant(status._tag === "Failure" && status.failure._tag === "CommitPending");
|
|
242
|
-
}
|
|
243
|
-
invariant(!poisoned);
|
|
244
|
-
for (const entry of finalUpdates) yield* applyGuarded(entry);
|
|
245
|
-
if (configuration.batch) appendAssertions(conditions);
|
|
246
|
-
else for (const condition of chunks(conditions)) invariant(yield* conditionHolds(condition));
|
|
247
|
-
invariant(!poisoned);
|
|
248
|
-
}).pipe(Effect.ensuring(Effect.sync(() => {
|
|
249
|
-
phase = "finished";
|
|
250
|
-
}))))
|
|
251
|
-
};
|
|
252
|
-
return owner;
|
|
253
|
-
};
|
|
254
|
-
return {
|
|
255
|
-
reportTransactionFailure,
|
|
256
|
-
both,
|
|
257
|
-
makeTransactionRows,
|
|
258
|
-
makeTransactionOwner
|
|
259
|
-
};
|
|
260
|
-
};
|
|
261
|
-
//#endregion
|
|
262
|
-
export { NativeDatabase, makeTransactionKernel };
|
|
263
|
-
|
|
264
|
-
//# sourceMappingURL=transaction-kernel.mjs.map
|