@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.
Files changed (481) hide show
  1. package/README.md +6 -8
  2. package/dist/Adapter.d.mts +47 -33
  3. package/dist/Adapter.mjs +36 -23
  4. package/dist/OAuthPersistence.d.mts +35 -51
  5. package/dist/OAuthPersistence.mjs +60 -68
  6. package/dist/OAuthPersistence.mjs.map +1 -1
  7. package/dist/index.d.mts +2 -2
  8. package/dist/index.mjs +2 -2
  9. package/dist/internal/browser-login.d.mts +1 -1
  10. package/dist/internal/browser-login.mjs +29 -9
  11. package/dist/internal/browser-login.mjs.map +1 -1
  12. package/dist/internal/configuration.d.mts +13 -8
  13. package/dist/internal/configuration.mjs.map +1 -1
  14. package/dist/internal/crypto.d.mts +1 -0
  15. package/dist/internal/crypto.mjs +1 -1
  16. package/dist/internal/d1-planning.mjs +8 -0
  17. package/dist/internal/d1-planning.mjs.map +1 -0
  18. package/dist/internal/email-native-state.mjs +135 -0
  19. package/dist/internal/email-native-state.mjs.map +1 -0
  20. package/dist/internal/email-native.d.mts +17 -0
  21. package/dist/internal/email-native.mjs +245 -0
  22. package/dist/internal/email-native.mjs.map +1 -0
  23. package/dist/internal/email-policy.mjs +92 -0
  24. package/dist/internal/email-policy.mjs.map +1 -0
  25. package/dist/internal/email-registration-native.d.mts +38 -0
  26. package/dist/internal/email-registration-native.mjs +171 -0
  27. package/dist/internal/email-registration-native.mjs.map +1 -0
  28. package/dist/internal/models/email-model.d.mts +40 -104
  29. package/dist/internal/models/email-model.mjs +3 -5
  30. package/dist/internal/models/email-model.mjs.map +1 -1
  31. package/dist/internal/models/oauth-connected-model.d.mts +44 -213
  32. package/dist/internal/models/oauth-connected-model.mjs +6 -14
  33. package/dist/internal/models/oauth-connected-model.mjs.map +1 -1
  34. package/dist/internal/models/oauth-model.d.mts +95 -244
  35. package/dist/internal/models/oauth-model.mjs +28 -22
  36. package/dist/internal/models/oauth-model.mjs.map +1 -1
  37. package/dist/internal/models/passkey-model.d.mts +11 -147
  38. package/dist/internal/models/passkey-model.mjs +5 -24
  39. package/dist/internal/models/passkey-model.mjs.map +1 -1
  40. package/dist/internal/models/passkey-registration-ceremony-model.d.mts +5 -39
  41. package/dist/internal/models/passkey-write-model.d.mts +17 -75
  42. package/dist/internal/models/passkey-write-model.mjs +1 -7
  43. package/dist/internal/models/passkey-write-model.mjs.map +1 -1
  44. package/dist/internal/models/password-model.d.mts +14 -81
  45. package/dist/internal/models/password-model.mjs +1 -4
  46. package/dist/internal/models/password-model.mjs.map +1 -1
  47. package/dist/internal/models/phone-model.d.mts +86 -0
  48. package/dist/internal/models/phone-model.mjs +10 -0
  49. package/dist/internal/models/phone-model.mjs.map +1 -0
  50. package/dist/internal/models/proof-model.d.mts +43 -272
  51. package/dist/internal/models/proof-model.mjs +2 -10
  52. package/dist/internal/models/proof-model.mjs.map +1 -1
  53. package/dist/internal/models/session-model.d.mts +74 -93
  54. package/dist/internal/models/session-model.mjs +3 -11
  55. package/dist/internal/models/session-model.mjs.map +1 -1
  56. package/dist/internal/models/step-up-model.d.mts +12 -50
  57. package/dist/internal/models/step-up-model.mjs +2 -4
  58. package/dist/internal/models/step-up-model.mjs.map +1 -1
  59. package/dist/internal/models/totp-model.d.mts +76 -0
  60. package/dist/internal/models/totp-model.mjs +10 -0
  61. package/dist/internal/models/totp-model.mjs.map +1 -0
  62. package/dist/internal/native-sql-table.d.mts +21 -4
  63. package/dist/internal/native-sql-table.mjs +9 -5
  64. package/dist/internal/native-sql-table.mjs.map +1 -1
  65. package/dist/internal/oauth/native-accounts.d.mts +17 -0
  66. package/dist/internal/oauth/native-accounts.mjs +290 -0
  67. package/dist/internal/oauth/native-accounts.mjs.map +1 -0
  68. package/dist/internal/oauth/native-connected-state.d.mts +11 -0
  69. package/dist/internal/oauth/native-connected-state.mjs +146 -0
  70. package/dist/internal/oauth/native-connected-state.mjs.map +1 -0
  71. package/dist/internal/oauth/native-connected.d.mts +15 -0
  72. package/dist/internal/oauth/native-connected.mjs +462 -0
  73. package/dist/internal/oauth/native-connected.mjs.map +1 -0
  74. package/dist/internal/oauth/native-flow.mjs +138 -0
  75. package/dist/internal/oauth/native-flow.mjs.map +1 -0
  76. package/dist/internal/oauth/native-layers.d.mts +24 -0
  77. package/dist/internal/oauth/native-layers.mjs +13 -0
  78. package/dist/internal/oauth/native-layers.mjs.map +1 -0
  79. package/dist/internal/oauth/native-mutation.mjs +122 -0
  80. package/dist/internal/oauth/native-mutation.mjs.map +1 -0
  81. package/dist/internal/oauth/native-registration.d.mts +24 -0
  82. package/dist/internal/oauth/native-registration.mjs +328 -0
  83. package/dist/internal/oauth/native-registration.mjs.map +1 -0
  84. package/dist/internal/oauth/native-revocations.d.mts +17 -0
  85. package/dist/internal/oauth/native-revocations.mjs +106 -0
  86. package/dist/internal/oauth/native-revocations.mjs.map +1 -0
  87. package/dist/internal/oauth/native-sign-in.d.mts +17 -0
  88. package/dist/internal/oauth/native-sign-in.mjs +50 -0
  89. package/dist/internal/oauth/native-sign-in.mjs.map +1 -0
  90. package/dist/internal/oauth/native-state.d.mts +10 -0
  91. package/dist/internal/oauth/native-state.mjs +214 -0
  92. package/dist/internal/oauth/native-state.mjs.map +1 -0
  93. package/dist/internal/oauth/state.d.mts +10 -0
  94. package/dist/internal/oauth/state.mjs +3 -27
  95. package/dist/internal/oauth/state.mjs.map +1 -1
  96. package/dist/internal/passkey-actions.mjs +55 -0
  97. package/dist/internal/passkey-actions.mjs.map +1 -0
  98. package/dist/internal/passkey-inputs.mjs +73 -0
  99. package/dist/internal/passkey-inputs.mjs.map +1 -0
  100. package/dist/internal/passkey-managed.mjs +224 -0
  101. package/dist/internal/passkey-managed.mjs.map +1 -0
  102. package/dist/internal/passkey-native-ceremony.d.mts +35 -0
  103. package/dist/internal/passkey-native-ceremony.mjs +38 -0
  104. package/dist/internal/passkey-native-ceremony.mjs.map +1 -0
  105. package/dist/internal/passkey-native-flow.mjs +91 -0
  106. package/dist/internal/passkey-native-flow.mjs.map +1 -0
  107. package/dist/internal/passkey-native-registration.d.mts +10 -0
  108. package/dist/internal/passkey-native-registration.mjs +114 -0
  109. package/dist/internal/passkey-native-registration.mjs.map +1 -0
  110. package/dist/internal/passkey-native-state.d.mts +15 -0
  111. package/dist/internal/passkey-native-state.mjs +186 -0
  112. package/dist/internal/passkey-native-state.mjs.map +1 -0
  113. package/dist/internal/passkey-native-write.d.mts +82 -0
  114. package/dist/internal/passkey-native-write.mjs +330 -0
  115. package/dist/internal/passkey-native-write.mjs.map +1 -0
  116. package/dist/internal/passkey-native.d.mts +835 -0
  117. package/dist/internal/passkey-native.mjs +175 -0
  118. package/dist/internal/passkey-native.mjs.map +1 -0
  119. package/dist/internal/passkey-policy.mjs +115 -0
  120. package/dist/internal/passkey-policy.mjs.map +1 -0
  121. package/dist/internal/password-credentials.mjs +38 -9
  122. package/dist/internal/password-credentials.mjs.map +1 -1
  123. package/dist/internal/password-native.d.mts +14 -0
  124. package/dist/internal/password-native.mjs +292 -0
  125. package/dist/internal/password-native.mjs.map +1 -0
  126. package/dist/internal/password-policy.mjs +93 -0
  127. package/dist/internal/password-policy.mjs.map +1 -0
  128. package/dist/internal/password-registration-native.d.mts +22 -0
  129. package/dist/internal/password-registration-native.mjs +142 -0
  130. package/dist/internal/password-registration-native.mjs.map +1 -0
  131. package/dist/internal/persistence.d.mts +6 -19
  132. package/dist/internal/persistence.mjs +199 -166
  133. package/dist/internal/persistence.mjs.map +1 -1
  134. package/dist/internal/phone-composed.mjs +79 -0
  135. package/dist/internal/phone-composed.mjs.map +1 -0
  136. package/dist/internal/phone-native.d.mts +15 -0
  137. package/dist/internal/phone-native.mjs +354 -0
  138. package/dist/internal/phone-native.mjs.map +1 -0
  139. package/dist/internal/proof-native.d.mts +15 -0
  140. package/dist/internal/proof-native.mjs +289 -0
  141. package/dist/internal/proof-native.mjs.map +1 -0
  142. package/dist/internal/registration.mjs +50 -60
  143. package/dist/internal/registration.mjs.map +1 -1
  144. package/dist/internal/session-native-authority.d.mts +15 -0
  145. package/dist/internal/session-native-authority.mjs +91 -0
  146. package/dist/internal/session-native-authority.mjs.map +1 -0
  147. package/dist/internal/session-native-cleanup.d.mts +14 -0
  148. package/dist/internal/session-native-cleanup.mjs +48 -0
  149. package/dist/internal/session-native-cleanup.mjs.map +1 -0
  150. package/dist/internal/session-native-login.d.mts +15 -0
  151. package/dist/internal/session-native-login.mjs +87 -0
  152. package/dist/internal/session-native-login.mjs.map +1 -0
  153. package/dist/internal/session-native-pending-read.mjs +42 -0
  154. package/dist/internal/session-native-pending-read.mjs.map +1 -0
  155. package/dist/internal/session-native-pending.mjs +134 -0
  156. package/dist/internal/session-native-pending.mjs.map +1 -0
  157. package/dist/internal/session-native-record.mjs +79 -0
  158. package/dist/internal/session-native-record.mjs.map +1 -0
  159. package/dist/internal/session-native-state.mjs +130 -0
  160. package/dist/internal/session-native-state.mjs.map +1 -0
  161. package/dist/internal/session-native-stateful.d.mts +16 -0
  162. package/dist/internal/session-native-stateful.mjs +225 -0
  163. package/dist/internal/session-native-stateful.mjs.map +1 -0
  164. package/dist/internal/session-native-step-up.d.mts +15 -0
  165. package/dist/internal/session-native-step-up.mjs +212 -0
  166. package/dist/internal/session-native-step-up.mjs.map +1 -0
  167. package/dist/internal/session-native-validity.d.mts +15 -0
  168. package/dist/internal/session-native-validity.mjs +97 -0
  169. package/dist/internal/session-native-validity.mjs.map +1 -0
  170. package/dist/internal/session-policy.mjs +29 -0
  171. package/dist/internal/session-policy.mjs.map +1 -0
  172. package/dist/internal/sql-authority.d.mts +16 -0
  173. package/dist/internal/sql-authority.mjs +32 -0
  174. package/dist/internal/sql-authority.mjs.map +1 -0
  175. package/dist/internal/sql-change.mjs +21 -0
  176. package/dist/internal/sql-change.mjs.map +1 -0
  177. package/dist/internal/sql-cleanup.mjs +35 -0
  178. package/dist/internal/sql-cleanup.mjs.map +1 -0
  179. package/dist/internal/sql-commit.d.mts +72 -0
  180. package/dist/internal/sql-commit.mjs +176 -0
  181. package/dist/internal/sql-commit.mjs.map +1 -0
  182. package/dist/internal/sql-expression.d.mts +17 -0
  183. package/dist/internal/sql-expression.mjs +49 -0
  184. package/dist/internal/sql-expression.mjs.map +1 -0
  185. package/dist/internal/sql-oauth-connected-model.d.mts +7 -23
  186. package/dist/internal/sql-oauth-model.d.mts +27 -52
  187. package/dist/internal/sql-oauth-model.mjs +3 -4
  188. package/dist/internal/sql-oauth-model.mjs.map +1 -1
  189. package/dist/internal/sql-persistence.mjs +5 -9
  190. package/dist/internal/sql-persistence.mjs.map +1 -1
  191. package/dist/internal/sql-storage-validation.mjs +1 -2
  192. package/dist/internal/sql-storage-validation.mjs.map +1 -1
  193. package/dist/internal/sql-table.d.mts +3 -16
  194. package/dist/internal/sql-table.mjs +21 -42
  195. package/dist/internal/sql-table.mjs.map +1 -1
  196. package/dist/internal/standalone.mjs +2 -3
  197. package/dist/internal/standalone.mjs.map +1 -1
  198. package/dist/internal/step-up-state.mjs +5 -8
  199. package/dist/internal/step-up-state.mjs.map +1 -1
  200. package/dist/internal/storage-clock.mjs +44 -0
  201. package/dist/internal/storage-clock.mjs.map +1 -0
  202. package/dist/internal/storage-mapping.d.mts +11 -8
  203. package/dist/internal/storage-mapping.mjs +88 -302
  204. package/dist/internal/storage-mapping.mjs.map +1 -1
  205. package/dist/internal/storage-plans.mjs +15 -73
  206. package/dist/internal/storage-plans.mjs.map +1 -1
  207. package/dist/internal/storage-tables.d.mts +37 -520
  208. package/dist/internal/storage-tables.mjs +31 -211
  209. package/dist/internal/storage-tables.mjs.map +1 -1
  210. package/dist/internal/storage-validation.d.mts +1 -6
  211. package/dist/internal/storage-validation.mjs +1 -42
  212. package/dist/internal/storage-validation.mjs.map +1 -1
  213. package/dist/internal/table-model.d.mts +21 -0
  214. package/dist/internal/totp-native.d.mts +15 -0
  215. package/dist/internal/totp-native.mjs +401 -0
  216. package/dist/internal/totp-native.mjs.map +1 -0
  217. package/package.json +1 -1
  218. package/src/Adapter.ts +143 -199
  219. package/src/OAuthPersistence.ts +128 -271
  220. package/src/index.ts +1 -1
  221. package/src/internal/browser-login.ts +54 -24
  222. package/src/internal/configuration.ts +16 -31
  223. package/src/internal/d1-planning.ts +7 -0
  224. package/src/internal/email-native-state.ts +247 -0
  225. package/src/internal/email-native.ts +514 -0
  226. package/src/internal/email-policy.ts +235 -0
  227. package/src/internal/email-registration-native.ts +386 -0
  228. package/src/internal/models/email-model.ts +76 -214
  229. package/src/internal/models/oauth-connected-model.ts +50 -288
  230. package/src/internal/models/oauth-model.ts +147 -368
  231. package/src/internal/models/passkey-model.ts +11 -208
  232. package/src/internal/models/passkey-registration-ceremony-model.ts +6 -60
  233. package/src/internal/models/passkey-write-model.ts +14 -95
  234. package/src/internal/models/password-model.ts +26 -147
  235. package/src/internal/models/phone-model.ts +110 -0
  236. package/src/internal/models/proof-model.ts +48 -404
  237. package/src/internal/models/session-model.ts +102 -200
  238. package/src/internal/models/step-up-model.ts +17 -96
  239. package/src/internal/models/totp-model.ts +82 -0
  240. package/src/internal/native-sql-table.ts +32 -11
  241. package/src/internal/oauth/native-accounts.ts +576 -0
  242. package/src/internal/oauth/native-connected-state.ts +288 -0
  243. package/src/internal/oauth/native-connected.ts +888 -0
  244. package/src/internal/oauth/native-flow.ts +253 -0
  245. package/src/internal/oauth/native-layers.ts +83 -0
  246. package/src/internal/oauth/native-mutation.ts +222 -0
  247. package/src/internal/oauth/native-registration.ts +545 -0
  248. package/src/internal/oauth/native-revocations.ts +190 -0
  249. package/src/internal/oauth/native-sign-in.ts +111 -0
  250. package/src/internal/oauth/native-state.ts +346 -0
  251. package/src/internal/oauth/state.ts +2 -70
  252. package/src/internal/passkey-actions.ts +70 -0
  253. package/src/internal/passkey-inputs.ts +56 -0
  254. package/src/internal/passkey-managed.ts +360 -0
  255. package/src/internal/passkey-native-ceremony.ts +66 -0
  256. package/src/internal/passkey-native-flow.ts +140 -0
  257. package/src/internal/passkey-native-registration.ts +221 -0
  258. package/src/internal/passkey-native-state.ts +335 -0
  259. package/src/internal/passkey-native-write.ts +611 -0
  260. package/src/internal/passkey-native.ts +372 -0
  261. package/src/internal/passkey-policy.ts +246 -0
  262. package/src/internal/password-credentials.ts +52 -10
  263. package/src/internal/password-native.ts +571 -0
  264. package/src/internal/password-policy.ts +307 -0
  265. package/src/internal/password-registration-native.ts +322 -0
  266. package/src/internal/persistence.ts +336 -290
  267. package/src/internal/phone-composed.ts +86 -0
  268. package/src/internal/phone-native.ts +659 -0
  269. package/src/internal/proof-native.ts +448 -0
  270. package/src/internal/registration.ts +96 -143
  271. package/src/internal/session-native-authority.ts +247 -0
  272. package/src/internal/session-native-cleanup.ts +65 -0
  273. package/src/internal/session-native-login.ts +205 -0
  274. package/src/internal/session-native-pending-read.ts +68 -0
  275. package/src/internal/session-native-pending.ts +223 -0
  276. package/src/internal/session-native-record.ts +141 -0
  277. package/src/internal/session-native-state.ts +259 -0
  278. package/src/internal/session-native-stateful.ts +512 -0
  279. package/src/internal/session-native-step-up.ts +450 -0
  280. package/src/internal/session-native-validity.ts +208 -0
  281. package/src/internal/session-policy.ts +59 -0
  282. package/src/internal/sql-authority.ts +56 -0
  283. package/src/internal/sql-change.ts +38 -0
  284. package/src/internal/sql-cleanup.ts +56 -0
  285. package/src/internal/sql-commit.ts +435 -0
  286. package/src/internal/sql-expression.ts +94 -0
  287. package/src/internal/sql-metadata.ts +100 -0
  288. package/src/internal/sql-oauth-connected-model.ts +6 -95
  289. package/src/internal/sql-oauth-model.ts +31 -134
  290. package/src/internal/sql-persistence.ts +2 -6
  291. package/src/internal/sql-storage-validation.ts +1 -2
  292. package/src/internal/sql-table.ts +19 -52
  293. package/src/internal/standalone.ts +2 -11
  294. package/src/internal/step-up-state.ts +4 -17
  295. package/src/internal/storage-clock.ts +58 -0
  296. package/src/internal/storage-mapping.ts +125 -340
  297. package/src/internal/storage-plans.ts +14 -80
  298. package/src/internal/storage-tables.ts +28 -212
  299. package/src/internal/storage-validation.ts +0 -58
  300. package/src/internal/table-model.ts +24 -0
  301. package/src/internal/totp-native.ts +701 -0
  302. package/dist/internal/PasswordPreparedPostconditions.d.mts +0 -22
  303. package/dist/internal/PasswordPreparedPostconditions.mjs +0 -12
  304. package/dist/internal/PasswordPreparedPostconditions.mjs.map +0 -1
  305. package/dist/internal/authority-snapshot.mjs +0 -53
  306. package/dist/internal/authority-snapshot.mjs.map +0 -1
  307. package/dist/internal/email-kernel.d.mts +0 -276
  308. package/dist/internal/email-kernel.mjs +0 -497
  309. package/dist/internal/email-kernel.mjs.map +0 -1
  310. package/dist/internal/models/passkey-registration-ceremony-model.mjs +0 -18
  311. package/dist/internal/models/passkey-registration-ceremony-model.mjs.map +0 -1
  312. package/dist/internal/oauth/accounts.d.mts +0 -8
  313. package/dist/internal/oauth/accounts.mjs +0 -379
  314. package/dist/internal/oauth/accounts.mjs.map +0 -1
  315. package/dist/internal/oauth/connected-access.d.mts +0 -9
  316. package/dist/internal/oauth/connected-access.mjs +0 -229
  317. package/dist/internal/oauth/connected-access.mjs.map +0 -1
  318. package/dist/internal/oauth/connected-collection.d.mts +0 -7
  319. package/dist/internal/oauth/connected-collection.mjs +0 -214
  320. package/dist/internal/oauth/connected-collection.mjs.map +0 -1
  321. package/dist/internal/oauth/connected-custody.d.mts +0 -6
  322. package/dist/internal/oauth/connected-custody.mjs +0 -165
  323. package/dist/internal/oauth/connected-custody.mjs.map +0 -1
  324. package/dist/internal/oauth/connected-flow.d.mts +0 -7
  325. package/dist/internal/oauth/connected-flow.mjs +0 -324
  326. package/dist/internal/oauth/connected-flow.mjs.map +0 -1
  327. package/dist/internal/oauth/connected-input.mjs +0 -122
  328. package/dist/internal/oauth/connected-input.mjs.map +0 -1
  329. package/dist/internal/oauth/connected-keys.d.mts +0 -2
  330. package/dist/internal/oauth/connected-keys.mjs +0 -22
  331. package/dist/internal/oauth/connected-keys.mjs.map +0 -1
  332. package/dist/internal/oauth/connected-maintenance.d.mts +0 -9
  333. package/dist/internal/oauth/connected-maintenance.mjs +0 -226
  334. package/dist/internal/oauth/connected-maintenance.mjs.map +0 -1
  335. package/dist/internal/oauth/connected-management.d.mts +0 -9
  336. package/dist/internal/oauth/connected-management.mjs +0 -243
  337. package/dist/internal/oauth/connected-management.mjs.map +0 -1
  338. package/dist/internal/oauth/connected-reference.mjs +0 -63
  339. package/dist/internal/oauth/connected-reference.mjs.map +0 -1
  340. package/dist/internal/oauth/connected-settlement.d.mts +0 -8
  341. package/dist/internal/oauth/connected-settlement.mjs +0 -141
  342. package/dist/internal/oauth/connected-settlement.mjs.map +0 -1
  343. package/dist/internal/oauth/connected-sign-in.d.mts +0 -10
  344. package/dist/internal/oauth/connected-sign-in.mjs +0 -281
  345. package/dist/internal/oauth/connected-sign-in.mjs.map +0 -1
  346. package/dist/internal/oauth/connected-state.d.mts +0 -14
  347. package/dist/internal/oauth/connected-state.mjs +0 -469
  348. package/dist/internal/oauth/connected-state.mjs.map +0 -1
  349. package/dist/internal/oauth/connected-target.d.mts +0 -21
  350. package/dist/internal/oauth/connected-target.mjs +0 -117
  351. package/dist/internal/oauth/connected-target.mjs.map +0 -1
  352. package/dist/internal/oauth/flow.d.mts +0 -5
  353. package/dist/internal/oauth/flow.mjs +0 -279
  354. package/dist/internal/oauth/flow.mjs.map +0 -1
  355. package/dist/internal/oauth/input.mjs +0 -127
  356. package/dist/internal/oauth/input.mjs.map +0 -1
  357. package/dist/internal/oauth/owner.d.mts +0 -10
  358. package/dist/internal/oauth/owner.mjs +0 -10
  359. package/dist/internal/oauth/owner.mjs.map +0 -1
  360. package/dist/internal/oauth/query-compiler.d.mts +0 -7
  361. package/dist/internal/oauth/query-compiler.mjs +0 -9
  362. package/dist/internal/oauth/query-compiler.mjs.map +0 -1
  363. package/dist/internal/oauth/registration.d.mts +0 -7
  364. package/dist/internal/oauth/registration.mjs +0 -393
  365. package/dist/internal/oauth/registration.mjs.map +0 -1
  366. package/dist/internal/oauth/target.d.mts +0 -31
  367. package/dist/internal/oauth/target.mjs +0 -273
  368. package/dist/internal/oauth/target.mjs.map +0 -1
  369. package/dist/internal/oauth-kernel.d.mts +0 -1423
  370. package/dist/internal/oauth-kernel.mjs +0 -187
  371. package/dist/internal/oauth-kernel.mjs.map +0 -1
  372. package/dist/internal/passkey/admission.d.mts +0 -6
  373. package/dist/internal/passkey/admission.mjs +0 -220
  374. package/dist/internal/passkey/admission.mjs.map +0 -1
  375. package/dist/internal/passkey/credentials.d.mts +0 -14
  376. package/dist/internal/passkey/credentials.mjs +0 -249
  377. package/dist/internal/passkey/credentials.mjs.map +0 -1
  378. package/dist/internal/passkey/enrollment.mjs +0 -138
  379. package/dist/internal/passkey/enrollment.mjs.map +0 -1
  380. package/dist/internal/passkey/flow.d.mts +0 -21
  381. package/dist/internal/passkey/flow.mjs +0 -452
  382. package/dist/internal/passkey/flow.mjs.map +0 -1
  383. package/dist/internal/passkey/management.mjs +0 -231
  384. package/dist/internal/passkey/management.mjs.map +0 -1
  385. package/dist/internal/passkey/registration-ceremony.d.mts +0 -9
  386. package/dist/internal/passkey/registration-ceremony.mjs +0 -129
  387. package/dist/internal/passkey/registration-ceremony.mjs.map +0 -1
  388. package/dist/internal/passkey/registration-custody.d.mts +0 -2
  389. package/dist/internal/passkey/registration-custody.mjs +0 -52
  390. package/dist/internal/passkey/registration-custody.mjs.map +0 -1
  391. package/dist/internal/passkey/registration-write.mjs +0 -211
  392. package/dist/internal/passkey/registration-write.mjs.map +0 -1
  393. package/dist/internal/passkey/state.d.mts +0 -10
  394. package/dist/internal/passkey/state.mjs +0 -234
  395. package/dist/internal/passkey/state.mjs.map +0 -1
  396. package/dist/internal/passkey/target.d.mts +0 -20
  397. package/dist/internal/passkey/target.mjs +0 -200
  398. package/dist/internal/passkey/target.mjs.map +0 -1
  399. package/dist/internal/passkey/write-state.d.mts +0 -17
  400. package/dist/internal/passkey/write-state.mjs +0 -354
  401. package/dist/internal/passkey/write-state.mjs.map +0 -1
  402. package/dist/internal/passkey/write-target.mjs +0 -192
  403. package/dist/internal/passkey/write-target.mjs.map +0 -1
  404. package/dist/internal/passkey-kernel.d.mts +0 -6045
  405. package/dist/internal/passkey-kernel.mjs +0 -49
  406. package/dist/internal/passkey-kernel.mjs.map +0 -1
  407. package/dist/internal/passkeys.d.mts +0 -7
  408. package/dist/internal/passkeys.mjs +0 -387
  409. package/dist/internal/passkeys.mjs.map +0 -1
  410. package/dist/internal/password-credentials.d.mts +0 -11
  411. package/dist/internal/password-kernel.d.mts +0 -278
  412. package/dist/internal/password-kernel.mjs +0 -508
  413. package/dist/internal/password-kernel.mjs.map +0 -1
  414. package/dist/internal/phone-kernel.d.mts +0 -162
  415. package/dist/internal/phone-kernel.mjs +0 -437
  416. package/dist/internal/phone-kernel.mjs.map +0 -1
  417. package/dist/internal/proof-kernel.d.mts +0 -94
  418. package/dist/internal/proof-kernel.mjs +0 -624
  419. package/dist/internal/proof-kernel.mjs.map +0 -1
  420. package/dist/internal/query-operations.d.mts +0 -68
  421. package/dist/internal/session-kernel.d.mts +0 -62
  422. package/dist/internal/session-kernel.mjs +0 -820
  423. package/dist/internal/session-kernel.mjs.map +0 -1
  424. package/dist/internal/sql-oauth-connected-model.mjs +0 -7
  425. package/dist/internal/sql-oauth-connected-model.mjs.map +0 -1
  426. package/dist/internal/sql-query.d.mts +0 -12
  427. package/dist/internal/sql-query.mjs +0 -206
  428. package/dist/internal/sql-query.mjs.map +0 -1
  429. package/dist/internal/step-up-state.d.mts +0 -49
  430. package/dist/internal/transaction-execution-kernel.d.mts +0 -37
  431. package/dist/internal/transaction-execution-kernel.mjs +0 -120
  432. package/dist/internal/transaction-execution-kernel.mjs.map +0 -1
  433. package/dist/internal/transaction-kernel.d.mts +0 -81
  434. package/dist/internal/transaction-kernel.mjs +0 -264
  435. package/dist/internal/transaction-kernel.mjs.map +0 -1
  436. package/src/internal/PasswordPreparedPostconditions.ts +0 -30
  437. package/src/internal/authority-snapshot.ts +0 -91
  438. package/src/internal/email-kernel.ts +0 -1556
  439. package/src/internal/oauth/accounts.ts +0 -839
  440. package/src/internal/oauth/connected-access.ts +0 -388
  441. package/src/internal/oauth/connected-collection.ts +0 -345
  442. package/src/internal/oauth/connected-custody.ts +0 -308
  443. package/src/internal/oauth/connected-flow.ts +0 -562
  444. package/src/internal/oauth/connected-input.ts +0 -147
  445. package/src/internal/oauth/connected-keys.ts +0 -31
  446. package/src/internal/oauth/connected-maintenance.ts +0 -379
  447. package/src/internal/oauth/connected-management.ts +0 -391
  448. package/src/internal/oauth/connected-reference.ts +0 -135
  449. package/src/internal/oauth/connected-settlement.ts +0 -278
  450. package/src/internal/oauth/connected-sign-in.ts +0 -472
  451. package/src/internal/oauth/connected-state.ts +0 -924
  452. package/src/internal/oauth/connected-target.ts +0 -307
  453. package/src/internal/oauth/flow.ts +0 -505
  454. package/src/internal/oauth/input.ts +0 -201
  455. package/src/internal/oauth/owner.ts +0 -22
  456. package/src/internal/oauth/query-compiler.ts +0 -15
  457. package/src/internal/oauth/registration.ts +0 -676
  458. package/src/internal/oauth/target.ts +0 -803
  459. package/src/internal/oauth-kernel.ts +0 -294
  460. package/src/internal/passkey/admission.ts +0 -368
  461. package/src/internal/passkey/credentials.ts +0 -511
  462. package/src/internal/passkey/enrollment.ts +0 -326
  463. package/src/internal/passkey/flow.ts +0 -1062
  464. package/src/internal/passkey/management.ts +0 -426
  465. package/src/internal/passkey/registration-ceremony.ts +0 -283
  466. package/src/internal/passkey/registration-custody.ts +0 -91
  467. package/src/internal/passkey/registration-write.ts +0 -426
  468. package/src/internal/passkey/state.ts +0 -351
  469. package/src/internal/passkey/target.ts +0 -598
  470. package/src/internal/passkey/write-state.ts +0 -692
  471. package/src/internal/passkey/write-target.ts +0 -450
  472. package/src/internal/passkey-kernel.ts +0 -112
  473. package/src/internal/passkeys.ts +0 -652
  474. package/src/internal/password-kernel.ts +0 -1523
  475. package/src/internal/phone-kernel.ts +0 -872
  476. package/src/internal/proof-kernel.ts +0 -1992
  477. package/src/internal/query-operations.ts +0 -91
  478. package/src/internal/session-kernel.ts +0 -2406
  479. package/src/internal/sql-query.ts +0 -304
  480. package/src/internal/transaction-execution-kernel.ts +0 -335
  481. package/src/internal/transaction-kernel.ts +0 -603
@@ -1,603 +0,0 @@
1
- import { type CommitJournal, type PreparedCommit } from "@yielded/auth/Hooks";
2
- import { reportAuthFailure } from "@yielded/auth/Persistence";
3
- /* oxlint-disable no-explicit-any -- existing storage kernels erase foreign table shapes; domain errors remain typed. */
4
- import { Cause, Context, Effect } from "effect";
5
- import type * as SqlClient from "effect/sql/SqlClient";
6
- import type { SqlError } from "effect/sql/SqlError";
7
- import type { Statement } from "effect/sql/Statement";
8
-
9
- import type {
10
- SqlExpression as SQL,
11
- QueryFailure,
12
- QueryOperations,
13
- SqlFragment,
14
- SqlColumn,
15
- } from "./query-operations";
16
-
17
- type Table = object;
18
-
19
- export type Row = Record<string, any>;
20
-
21
- /** Only query-builder/table shapes are erased here. Installed native
22
- * queries have captured clients, and their error channel remains explicit. */
23
- type NativeQuery<A> = Effect.Effect<A, QueryFailure | SqlError>;
24
-
25
- export interface TransactionNativeDatabase {
26
- readonly $client: SqlClient.SqlClient & {
27
- readonly batch: (statements: ReadonlyArray<Statement<any>>) => Effect.Effect<any, SqlError>;
28
- };
29
- readonly transaction: <A, E, R>(
30
- body: (transaction: any) => Effect.Effect<A, E, R>,
31
- ) => Effect.Effect<A, E | SqlError, R>;
32
- }
33
-
34
- /** Captured root database for service construction and pre-transaction catalog checks.
35
- * Active transactions remain owned by their coordinator and journal. */
36
- export class NativeDatabase extends Context.Service<NativeDatabase, TransactionNativeDatabase>()(
37
- "effect-auth/persistence/NativeDatabase",
38
- ) {}
39
-
40
- export interface Observation {
41
- readonly table: Table;
42
- readonly where: SQL;
43
- rows: ReadonlyArray<Row>;
44
- }
45
-
46
- /** Expressions deliberately do not replace observed values. Read only semantic
47
- * columns when telemetry changes atomically, and state the physical result. */
48
- export interface GuardedUpdate {
49
- readonly rows: number;
50
- readonly postcondition: SQL;
51
- }
52
-
53
- export interface TransactionOwner<Failure> {
54
- readonly database: any;
55
- readonly journal: CommitJournal;
56
- readonly marker: string;
57
- readonly batch: boolean;
58
- readonly observations: Observation[];
59
- readonly postconditions: Array<SQL | (() => SQL)>;
60
- readonly statements: Statement<any>[];
61
- readonly guards: PreparedCommit<void>[];
62
- exact(table: Table, row: Row): SQL;
63
- read(
64
- table: Table,
65
- where: SQL,
66
- options?: {
67
- readonly lock?: boolean;
68
- readonly limit?: number;
69
- readonly observe?: boolean;
70
- readonly admissionOnly?: boolean;
71
- readonly takeOnly?: boolean;
72
- readonly orderBy?: any;
73
- readonly columns?: ReadonlyArray<string>;
74
- },
75
- ): Effect.Effect<Observation, Failure>;
76
- write(query: any): Effect.Effect<void, Failure>;
77
- insert(
78
- table: Table,
79
- values: Row,
80
- key: Row,
81
- absent?: boolean,
82
- ): Effect.Effect<Observation, Failure>;
83
- update(table: Table, key: Row, values: Row): Effect.Effect<void, Failure>;
84
- updateGuarded(
85
- table: Table,
86
- where: SQL,
87
- values: Row,
88
- guard: GuardedUpdate,
89
- ): Effect.Effect<void, Failure>;
90
- /** Internal SQL only, run once after application work and before final guards. */
91
- finalUpdate(
92
- table: Table,
93
- where: SQL,
94
- values: Row,
95
- guard: GuardedUpdate,
96
- ): Effect.Effect<void, Failure>;
97
- remove(table: Table, key: Row): Effect.Effect<void, Failure>;
98
- check(condition: SQL): Effect.Effect<boolean, Failure>;
99
- now(clock: { readonly engineNowMillis: SQL }): Effect.Effect<number, Failure>;
100
- finish(): Effect.Effect<void, Failure>;
101
- }
102
-
103
- export const makeTransactionKernel = <
104
- Fragment extends SqlFragment = SqlFragment,
105
- Column extends SqlColumn = SqlColumn,
106
- >(
107
- operations: QueryOperations<Fragment, Column>,
108
- ) => {
109
- const { eq, getTableColumns, isNull, sql, balancedD1And, compactD1GeneratedStatement } =
110
- operations;
111
-
112
- const isUnavailableCause = <Failure>(cause: Cause.Cause<unknown>, unavailable: () => Failure) => {
113
- const expected = unavailable();
114
-
115
- const tag =
116
- typeof expected === "object" && expected !== null && "_tag" in expected
117
- ? expected._tag
118
- : undefined;
119
-
120
- return (
121
- tag !== undefined &&
122
- cause.reasons.length > 0 &&
123
- cause.reasons.every(
124
- (reason) =>
125
- Cause.isFailReason(reason) &&
126
- typeof reason.error === "object" &&
127
- reason.error !== null &&
128
- "_tag" in reason.error &&
129
- reason.error._tag === tag,
130
- )
131
- );
132
- };
133
-
134
- /** Report once, before an adapter replaces the raw cause with its public
135
- * unavailable error. Already translated failures stay quiet at outer owners. */
136
- const reportTransactionFailure = <A, E, R, Failure>(
137
- effect: Effect.Effect<A, E, R>,
138
- unavailable: () => Failure,
139
- ): Effect.Effect<A, E, R> =>
140
- Effect.catchCause(effect, (cause) =>
141
- isUnavailableCause(cause, unavailable)
142
- ? Effect.failCause(cause)
143
- : reportAuthFailure("auth-persistence", cause).pipe(
144
- Effect.andThen(Effect.failCause(cause)),
145
- ),
146
- );
147
-
148
- const both = (...parts: ReadonlyArray<SQL | undefined>) => balancedD1And(...parts) ?? sql`1 = 1`;
149
-
150
- const makeTransactionRows = <Failure>(unavailable: () => Failure) => {
151
- const invariant: (value: unknown) => asserts value = (value) => {
152
- if (!value) throw unavailable();
153
- };
154
-
155
- const col = (table: Table, key: string) => {
156
- const value = getTableColumns(table)[key];
157
-
158
- invariant(value !== undefined);
159
-
160
- return value;
161
- };
162
-
163
- const equal = (table: Table, values: Row) =>
164
- both(
165
- ...Object.entries(values).map(([key, value]) =>
166
- value === null ? isNull(col(table, key)) : eq(col(table, key), value),
167
- ),
168
- );
169
-
170
- /** Mapped driver values use plain data, Dates and binary views. Application
171
- * identity classes are reconstructed by the mapped codecs, never cloned here. */
172
- const copiedRow = (row: Row) => {
173
- const seen = new WeakSet<object>();
174
-
175
- const supported = (value: unknown): void => {
176
- if (value === null || typeof value !== "object" || seen.has(value)) return;
177
- seen.add(value);
178
- if (value instanceof Date || value instanceof ArrayBuffer || ArrayBuffer.isView(value))
179
- return;
180
- invariant(
181
- Array.isArray(value) ||
182
- Object.getPrototypeOf(value) === Object.prototype ||
183
- Object.getPrototypeOf(value) === null,
184
- );
185
- for (const item of Object.values(value)) supported(item);
186
- };
187
-
188
- supported(row);
189
-
190
- return structuredClone(row);
191
- };
192
-
193
- const nativeKey = (value: unknown): string => {
194
- const packed = (tag: string, text: string) => tag + text.length + ":" + text;
195
-
196
- if (value instanceof Date) return packed("date", value.toISOString());
197
- if (typeof value === "bigint") return packed("bigint", value.toString());
198
-
199
- const bytes =
200
- value instanceof ArrayBuffer
201
- ? new Uint8Array(value)
202
- : ArrayBuffer.isView(value)
203
- ? new Uint8Array(value.buffer, value.byteOffset, value.byteLength)
204
- : undefined;
205
-
206
- if (bytes !== undefined) return packed("bytes", Array.from(bytes).join(","));
207
- if (value === null || typeof value !== "object") return packed(typeof value, String(value));
208
- if (Array.isArray(value)) return packed("array", value.map(nativeKey).join(""));
209
- invariant(
210
- Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null,
211
- );
212
-
213
- return packed(
214
- "object",
215
- Object.entries(value)
216
- .sort(([a], [b]) => a.localeCompare(b))
217
- .map(([name, item]) => nativeKey(name) + nativeKey(item))
218
- .join(""),
219
- );
220
- };
221
-
222
- const matchesNativeRow = (table: Table, row: Row, key: Row) =>
223
- Object.entries(key).every(([name, value]) => {
224
- if (value === null || row[name] === null) return value === row[name];
225
- const column = col(table, name);
226
-
227
- return (
228
- nativeKey(column.mapToDriverValue(row[name])) ===
229
- nativeKey(column.mapToDriverValue(value))
230
- );
231
- });
232
-
233
- return { col, equal, copiedRow, matchesNativeRow };
234
- };
235
-
236
- const makeTransactionOwner = <Failure>(
237
- database: any,
238
- journal: CommitJournal,
239
- marker: string,
240
- unavailable: () => Failure,
241
- configuration: {
242
- readonly client?: any;
243
- readonly batch: boolean;
244
- readonly locking: boolean;
245
- readonly mysql: boolean;
246
- readonly dialect: "pg" | "mysql" | "sqlite";
247
- },
248
- ): TransactionOwner<Failure> => {
249
- const invariant: (value: unknown) => asserts value = (value) => {
250
- if (!value) throw unavailable();
251
- };
252
-
253
- const { col, equal, matchesNativeRow } = makeTransactionRows(unavailable);
254
- let phase: "open" | "finishing" | "finished" = "open";
255
- let poisoned = false;
256
- const open = () => invariant(phase === "open" && !poisoned);
257
-
258
- const result = <A, E>(effect: Effect.Effect<A, E>) =>
259
- effect.pipe(
260
- (operation) => reportTransactionFailure(operation, unavailable),
261
- Effect.mapError(unavailable),
262
- Effect.catchDefect(() => Effect.fail(unavailable())),
263
- Effect.onExit((exit) =>
264
- Effect.sync(() => {
265
- if (exit._tag === "Failure") poisoned = true;
266
- }),
267
- ),
268
- );
269
-
270
- const observations: Observation[] = [];
271
- const statements: Statement<any>[] = [];
272
- const postconditions: Array<SQL | (() => SQL)> = [];
273
- const guards: PreparedCommit<void>[] = [];
274
- const finalUpdates: Array<{ readonly query: any; readonly guard: GuardedUpdate }> = [];
275
-
276
- const exactRow = (table: Table, row: Row) =>
277
- both(
278
- ...Object.entries(row).map(([key, value]) => {
279
- if (typeof value !== "string") return equal(table, { [key]: value });
280
-
281
- const column = col(table, key),
282
- bound = sql.param(value, column);
283
-
284
- return configuration.dialect === "mysql"
285
- ? sql`binary ${column} = binary ${bound}`
286
- : configuration.dialect === "pg"
287
- ? sql`convert_to(cast(${column} as text), 'UTF8') = convert_to(cast(${bound} as text), 'UTF8')`
288
- : sql`cast(${column} as blob) = cast(${bound} as blob)`;
289
- }),
290
- );
291
-
292
- const toStatement = (query: any): Statement<any> => {
293
- const rendered = query.toSQL();
294
- const client = configuration.client ?? database.$client;
295
-
296
- return compactD1GeneratedStatement(
297
- client,
298
- client.unsafe(rendered.sql, rendered.params),
299
- unavailable,
300
- );
301
- };
302
-
303
- const assertion = (condition: SQL) =>
304
- database
305
- .select({
306
- value: sql`case when ${condition} then 1 else json_extract('[]', ${"$[oauth-owner-" + marker + "]"}) end`,
307
- })
308
- .from(sql`(select 1) as oauth_assertion`);
309
-
310
- const observedConditions = (table: Table, where: SQL, rows: ReadonlyArray<Row>) => [
311
- sql`(select count(*) from ${table} where ${where}) = ${rows.length}`,
312
- ...rows.map(
313
- (row) => sql`exists(select 1 from ${table} where ${both(where, exactRow(table, row))})`,
314
- ),
315
- ];
316
-
317
- // All chunks remain inside the same native owner or atomic D1 batch. A single
318
- // wide row is compacted; separate observations cannot accumulate unbounded
319
- // bind parameters or expression depth in one final SELECT.
320
- const chunks = (conditions: ReadonlyArray<SQL>) => {
321
- const output: SQL[] = [];
322
- let pending: SQL[] = [];
323
-
324
- for (const condition of conditions) {
325
- const candidate = [...pending, condition];
326
- const rendered = assertion(both(...candidate)).toSQL();
327
-
328
- if (
329
- pending.length > 0 &&
330
- (rendered.params.length > 96 || new TextEncoder().encode(rendered.sql).length > 48_000)
331
- ) {
332
- output.push(both(...pending));
333
- pending = [condition];
334
- } else pending = candidate;
335
- }
336
- if (pending.length > 0) output.push(both(...pending));
337
-
338
- return output;
339
- };
340
-
341
- const appendAssertions = (conditions: ReadonlyArray<SQL>) => {
342
- for (const condition of chunks(conditions))
343
- statements.push(toStatement(assertion(condition)));
344
- };
345
-
346
- const observed = (table: Table, where: SQL, rows: ReadonlyArray<Row>) => {
347
- const observation = { table, where, rows };
348
-
349
- observations.push(observation);
350
-
351
- return observation;
352
- };
353
-
354
- const queryCondition = (condition: SQL) =>
355
- database
356
- .select({
357
- value: sql`case when ${condition} then 1 else 0 end`.mapWith(Number).as("value"),
358
- })
359
- .from(sql`(select 1) as oauth_guard`);
360
-
361
- const conditionHolds = (condition: SQL) =>
362
- Effect.gen(function* () {
363
- const query = queryCondition(condition);
364
-
365
- const rows: ReadonlyArray<Row> = yield* configuration.dialect === "sqlite"
366
- ? toStatement(query)
367
- : (query as NativeQuery<Row[]>);
368
-
369
- const row = rows[0];
370
-
371
- invariant(rows.length === 1 && row !== undefined);
372
-
373
- // SQLite executes the raw statement, before logical field decoding.
374
- // This query projects one value; its alias belongs to the adapter compiler.
375
- return Object.values(row)[0] === 1;
376
- });
377
-
378
- const guardedQuery = (table: Table, where: SQL, values: Row, guard: GuardedUpdate) => {
379
- invariant(Number.isSafeInteger(guard.rows) && guard.rows > 0 && guard.rows <= 128);
380
-
381
- return { query: database.update(table).set(values).where(where), guard: { ...guard } };
382
- };
383
-
384
- const applyGuarded = (entry: { readonly query: any; readonly guard: GuardedUpdate }) =>
385
- Effect.gen(function* () {
386
- if (configuration.batch) {
387
- statements.push(toStatement(entry.query));
388
- statements.push(toStatement(assertion(sql`changes() = ${entry.guard.rows}`)));
389
- appendAssertions([entry.guard.postcondition]);
390
- } else {
391
- if (configuration.mysql) {
392
- // mysql2 reports matched rows (FOUND_ROWS), including a telemetry no-op.
393
- const changed = yield* entry.query as NativeQuery<{ readonly affectedRows: number }>;
394
-
395
- invariant(changed.affectedRows === entry.guard.rows);
396
- } else {
397
- const changed = yield* entry.query.returning({ value: sql`1` }) as NativeQuery<
398
- ReadonlyArray<Row>
399
- >;
400
-
401
- invariant(changed.length === entry.guard.rows);
402
- }
403
- invariant(yield* conditionHolds(entry.guard.postcondition));
404
- }
405
- });
406
-
407
- const owner: TransactionOwner<Failure> = {
408
- database,
409
- journal,
410
- marker,
411
- batch: configuration.batch,
412
- observations,
413
- statements,
414
- postconditions,
415
- guards,
416
- exact: exactRow,
417
- read: (table, where, options = {}) =>
418
- result(
419
- Effect.gen(function* () {
420
- open();
421
- const limit = options.limit ?? 64;
422
-
423
- let query = database
424
- .select(
425
- options.columns === undefined
426
- ? undefined
427
- : Object.fromEntries(options.columns.map((key) => [key, col(table, key)])),
428
- )
429
- .from(table)
430
- .where(where)
431
- .limit(options.takeOnly ? limit : limit + 1);
432
-
433
- if (options.orderBy !== undefined) query = query.orderBy(options.orderBy);
434
- if (options.lock !== false && configuration.locking) query = query.for("update");
435
- const rows: Row[] = yield* query as NativeQuery<Row[]>;
436
-
437
- invariant(rows.length <= limit);
438
- if (configuration.batch && (options.observe !== false || options.admissionOnly))
439
- appendAssertions(observedConditions(table, where, rows));
440
-
441
- return options.observe === false || options.admissionOnly
442
- ? { table, where, rows }
443
- : observed(table, where, rows);
444
- }),
445
- ),
446
- write: (query) =>
447
- result(
448
- Effect.gen(function* () {
449
- open();
450
- if (configuration.batch) statements.push(toStatement(query));
451
- else yield* query as NativeQuery<unknown>;
452
- }),
453
- ),
454
- insert: (table, values, key, absent = false) =>
455
- result(
456
- Effect.gen(function* () {
457
- open();
458
- let query = database.insert(table).values(values);
459
-
460
- if (absent)
461
- query = configuration.mysql
462
- ? query.onDuplicateKeyUpdate({
463
- set: { [Object.keys(key)[0]!]: col(table, Object.keys(key)[0]!) },
464
- })
465
- : query.onConflictDoNothing();
466
- yield* owner.write(query);
467
- const where = equal(table, key);
468
-
469
- if (configuration.batch) return observed(table, where, [values]);
470
- const found = yield* owner.read(table, where, { limit: 1 });
471
- const markerColumn = Object.keys(values).find((key) => values[key] === marker);
472
-
473
- if (!absent || (markerColumn !== undefined && found.rows[0]?.[markerColumn] === marker))
474
- invariant(
475
- yield* owner.check(
476
- sql`exists(select 1 from ${table} where ${both(where, exactRow(table, values))})`,
477
- ),
478
- );
479
-
480
- return found;
481
- }),
482
- ),
483
- update: (table, key, values) =>
484
- result(
485
- Effect.gen(function* () {
486
- open();
487
- yield* owner.write(database.update(table).set(values).where(equal(table, key)));
488
- for (const observation of observations)
489
- if (observation.table === table)
490
- observation.rows = observation.rows.map((row) =>
491
- matchesNativeRow(table, row, key) ? { ...row, ...values } : row,
492
- );
493
- }),
494
- ),
495
- updateGuarded: (table, where, values, guard) =>
496
- result(
497
- Effect.gen(function* () {
498
- open();
499
- const entry = guardedQuery(table, where, values, guard);
500
-
501
- yield* applyGuarded(entry);
502
- postconditions.push(entry.guard.postcondition);
503
- }),
504
- ),
505
- finalUpdate: (table, where, values, guard) =>
506
- result(
507
- Effect.sync(() => {
508
- open();
509
- invariant(finalUpdates.length < 128);
510
- finalUpdates.push(guardedQuery(table, where, values, guard));
511
- }),
512
- ),
513
- remove: (table, key) =>
514
- result(
515
- Effect.gen(function* () {
516
- open();
517
- yield* owner.write(database.delete(table).where(equal(table, key)));
518
- for (const observation of observations)
519
- if (observation.table === table)
520
- observation.rows = observation.rows.filter(
521
- (row) => !matchesNativeRow(table, row, key),
522
- );
523
- }),
524
- ),
525
- check: (condition) =>
526
- result(
527
- Effect.gen(function* () {
528
- open();
529
- const holds = yield* conditionHolds(condition);
530
-
531
- if (configuration.batch)
532
- statements.push(toStatement(assertion(holds ? condition : sql`not (${condition})`)));
533
-
534
- return holds;
535
- }),
536
- ),
537
- now: (clock) =>
538
- result(
539
- Effect.gen(function* () {
540
- open();
541
-
542
- const rows: Row[] = yield* database
543
- .select({
544
- value: sql`${clock.engineNowMillis}`.mapWith(Number),
545
- })
546
- .from(sql`(select 1) as oauth_clock`) as NativeQuery<Row[]>;
547
-
548
- const value = rows[0]?.value;
549
-
550
- invariant(Number.isSafeInteger(value) && value >= 0);
551
-
552
- return value as number;
553
- }),
554
- ),
555
- finish: () =>
556
- result(
557
- Effect.gen(function* () {
558
- open();
559
- phase = "finishing";
560
- Object.freeze(observations);
561
- Object.freeze(postconditions);
562
- Object.freeze(guards);
563
- Object.freeze(finalUpdates);
564
-
565
- // Close registration before any late-bound SQL predicate is materialized.
566
- // No callback is invoked after the first final write.
567
- const conditions: SQL[] = observations.flatMap((observation) =>
568
- observedConditions(observation.table, observation.where, observation.rows),
569
- );
570
-
571
- conditions.push(
572
- ...postconditions.map((condition) =>
573
- typeof condition === "function" ? condition() : condition,
574
- ),
575
- );
576
- conditions.push(...finalUpdates.map((entry) => entry.guard.postcondition));
577
- for (const guard of guards) {
578
- const status = yield* Effect.result(guard.read);
579
-
580
- invariant(status._tag === "Failure" && status.failure._tag === "CommitPending");
581
- }
582
- invariant(!poisoned);
583
- for (const entry of finalUpdates) yield* applyGuarded(entry);
584
- if (configuration.batch) appendAssertions(conditions);
585
- else
586
- for (const condition of chunks(conditions))
587
- invariant(yield* conditionHolds(condition));
588
- invariant(!poisoned);
589
- }).pipe(
590
- Effect.ensuring(
591
- Effect.sync(() => {
592
- phase = "finished";
593
- }),
594
- ),
595
- ),
596
- ),
597
- };
598
-
599
- return owner;
600
- };
601
-
602
- return { reportTransactionFailure, both, makeTransactionRows, makeTransactionOwner };
603
- };