@yielded/auth-persistence-drizzle 0.1.0-beta.1 → 0.1.0-beta.12

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 (222) hide show
  1. package/dist/D1.d.mts +27 -22
  2. package/dist/D1.mjs +10 -4
  3. package/dist/D1.mjs.map +1 -1
  4. package/dist/Libsql.d.mts +66 -61
  5. package/dist/Libsql.mjs +20 -15
  6. package/dist/Libsql.mjs.map +1 -1
  7. package/dist/Mysql2.d.mts +58 -46
  8. package/dist/Mysql2.mjs +13 -6
  9. package/dist/Mysql2.mjs.map +1 -1
  10. package/dist/Pglite.d.mts +43 -32
  11. package/dist/Pglite.mjs +12 -7
  12. package/dist/Pglite.mjs.map +1 -1
  13. package/dist/Postgres.d.mts +59 -48
  14. package/dist/Postgres.mjs +12 -7
  15. package/dist/Postgres.mjs.map +1 -1
  16. package/dist/SqliteBun.d.mts +58 -53
  17. package/dist/SqliteBun.mjs +20 -14
  18. package/dist/SqliteBun.mjs.map +1 -1
  19. package/dist/SqliteDo.d.mts +66 -60
  20. package/dist/SqliteDo.mjs +26 -14
  21. package/dist/SqliteDo.mjs.map +1 -1
  22. package/dist/SqliteNode.d.mts +58 -53
  23. package/dist/SqliteNode.mjs +20 -14
  24. package/dist/SqliteNode.mjs.map +1 -1
  25. package/dist/SqliteWasm.d.mts +66 -61
  26. package/dist/SqliteWasm.mjs +20 -14
  27. package/dist/SqliteWasm.mjs.map +1 -1
  28. package/dist/drizzle/d1-database.d.mts +11 -0
  29. package/dist/drizzle/d1-database.mjs +8 -0
  30. package/dist/drizzle/d1-database.mjs.map +1 -0
  31. package/dist/drizzle/d1-emails.d.mts +8 -7
  32. package/dist/drizzle/d1-emails.mjs +7 -4
  33. package/dist/drizzle/d1-emails.mjs.map +1 -1
  34. package/dist/drizzle/d1-identity.mjs +12 -9
  35. package/dist/drizzle/d1-identity.mjs.map +1 -1
  36. package/dist/drizzle/d1-oauth.d.mts +14 -13
  37. package/dist/drizzle/d1-oauth.mjs +7 -4
  38. package/dist/drizzle/d1-oauth.mjs.map +1 -1
  39. package/dist/drizzle/d1-passkey.d.mts +3 -14
  40. package/dist/drizzle/d1-passkey.mjs +2 -1
  41. package/dist/drizzle/d1-passkey.mjs.map +1 -1
  42. package/dist/drizzle/d1-password-prepared.d.mts +4 -3
  43. package/dist/drizzle/d1-password-prepared.mjs +3 -1
  44. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  45. package/dist/drizzle/d1-passwords.d.mts +6 -5
  46. package/dist/drizzle/d1-passwords.mjs +5 -2
  47. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  48. package/dist/drizzle/d1-phone.d.mts +3 -4
  49. package/dist/drizzle/d1-phone.mjs +2 -1
  50. package/dist/drizzle/d1-phone.mjs.map +1 -1
  51. package/dist/drizzle/d1-planning.d.mts +1 -1
  52. package/dist/drizzle/d1-proofs.d.mts +4 -3
  53. package/dist/drizzle/d1-proofs.mjs +3 -1
  54. package/dist/drizzle/d1-proofs.mjs.map +1 -1
  55. package/dist/drizzle/d1-sessions.d.mts +11 -10
  56. package/dist/drizzle/d1-sessions.mjs +15 -9
  57. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  58. package/dist/drizzle/d1-totp.d.mts +3 -4
  59. package/dist/drizzle/d1-totp.mjs +2 -1
  60. package/dist/drizzle/d1-totp.mjs.map +1 -1
  61. package/dist/drizzle/email-registration.mjs +2 -1
  62. package/dist/drizzle/email-registration.mjs.map +1 -1
  63. package/dist/drizzle/email-target.d.mts +7 -6
  64. package/dist/drizzle/email-target.mjs +10 -10
  65. package/dist/drizzle/email-target.mjs.map +1 -1
  66. package/dist/drizzle/mysql-database.d.mts +8 -0
  67. package/dist/drizzle/mysql-database.mjs +8 -0
  68. package/dist/drizzle/mysql-database.mjs.map +1 -0
  69. package/dist/drizzle/mysql-emails.d.mts +7 -6
  70. package/dist/drizzle/mysql-emails.mjs +12 -8
  71. package/dist/drizzle/mysql-emails.mjs.map +1 -1
  72. package/dist/drizzle/mysql-identity.mjs +12 -9
  73. package/dist/drizzle/mysql-identity.mjs.map +1 -1
  74. package/dist/drizzle/mysql-password-prepared.d.mts +3 -2
  75. package/dist/drizzle/mysql-password-prepared.mjs +6 -2
  76. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  77. package/dist/drizzle/mysql-passwords.d.mts +6 -4
  78. package/dist/drizzle/mysql-passwords.mjs +11 -7
  79. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  80. package/dist/drizzle/mysql-proofs.d.mts +3 -2
  81. package/dist/drizzle/mysql-proofs.mjs +8 -4
  82. package/dist/drizzle/mysql-proofs.mjs.map +1 -1
  83. package/dist/drizzle/mysql-sessions.d.mts +11 -10
  84. package/dist/drizzle/mysql-sessions.mjs +16 -12
  85. package/dist/drizzle/mysql-sessions.mjs.map +1 -1
  86. package/dist/drizzle/native-database.mjs +10 -0
  87. package/dist/drizzle/native-database.mjs.map +1 -0
  88. package/dist/drizzle/oauth-connected-drivers.mjs +7 -5
  89. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
  90. package/dist/drizzle/oauth-connected-target.d.mts +6 -7
  91. package/dist/drizzle/oauth-connected-target.mjs +4 -5
  92. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  93. package/dist/drizzle/oauth-drivers.mjs +8 -6
  94. package/dist/drizzle/oauth-drivers.mjs.map +1 -1
  95. package/dist/drizzle/oauth-target.d.mts +12 -11
  96. package/dist/drizzle/oauth-target.mjs +13 -12
  97. package/dist/drizzle/oauth-target.mjs.map +1 -1
  98. package/dist/drizzle/passkey-drivers.mjs +8 -6
  99. package/dist/drizzle/passkey-drivers.mjs.map +1 -1
  100. package/dist/drizzle/passkey-write-drivers.mjs +5 -3
  101. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
  102. package/dist/drizzle/passkey-write-target.d.mts +1 -1
  103. package/dist/drizzle/password-prepared-sql.mjs +2 -1
  104. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  105. package/dist/drizzle/password-prepared-target.d.mts +3 -2
  106. package/dist/drizzle/password-prepared-target.mjs +4 -3
  107. package/dist/drizzle/password-prepared-target.mjs.map +1 -1
  108. package/dist/drizzle/password-registration.mjs +2 -1
  109. package/dist/drizzle/password-registration.mjs.map +1 -1
  110. package/dist/drizzle/password-target.d.mts +5 -4
  111. package/dist/drizzle/password-target.mjs +8 -8
  112. package/dist/drizzle/password-target.mjs.map +1 -1
  113. package/dist/drizzle/pg-database.d.mts +9 -0
  114. package/dist/drizzle/pg-database.mjs +8 -0
  115. package/dist/drizzle/pg-database.mjs.map +1 -0
  116. package/dist/drizzle/pg-emails.d.mts +7 -6
  117. package/dist/drizzle/pg-emails.mjs +12 -8
  118. package/dist/drizzle/pg-emails.mjs.map +1 -1
  119. package/dist/drizzle/pg-identity.mjs +12 -9
  120. package/dist/drizzle/pg-identity.mjs.map +1 -1
  121. package/dist/drizzle/pg-password-prepared.d.mts +3 -2
  122. package/dist/drizzle/pg-password-prepared.mjs +6 -2
  123. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  124. package/dist/drizzle/pg-passwords.d.mts +6 -4
  125. package/dist/drizzle/pg-passwords.mjs +11 -7
  126. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  127. package/dist/drizzle/pg-proofs.d.mts +3 -2
  128. package/dist/drizzle/pg-proofs.mjs +8 -4
  129. package/dist/drizzle/pg-proofs.mjs.map +1 -1
  130. package/dist/drizzle/pg-sessions.d.mts +11 -10
  131. package/dist/drizzle/pg-sessions.mjs +16 -12
  132. package/dist/drizzle/pg-sessions.mjs.map +1 -1
  133. package/dist/drizzle/phone-target.d.mts +4 -3
  134. package/dist/drizzle/phone-target.mjs +12 -11
  135. package/dist/drizzle/phone-target.mjs.map +1 -1
  136. package/dist/drizzle/proof-target.d.mts +3 -2
  137. package/dist/drizzle/proof-target.mjs +5 -5
  138. package/dist/drizzle/proof-target.mjs.map +1 -1
  139. package/dist/drizzle/session-sql.d.mts +1 -0
  140. package/dist/drizzle/session-target.d.mts +10 -8
  141. package/dist/drizzle/session-target.mjs +11 -11
  142. package/dist/drizzle/session-target.mjs.map +1 -1
  143. package/dist/drizzle/sqlite-emails.mjs +9 -5
  144. package/dist/drizzle/sqlite-emails.mjs.map +1 -1
  145. package/dist/drizzle/sqlite-identity.mjs +14 -11
  146. package/dist/drizzle/sqlite-identity.mjs.map +1 -1
  147. package/dist/drizzle/sqlite-password-prepared.mjs +7 -3
  148. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  149. package/dist/drizzle/sqlite-passwords.mjs +10 -6
  150. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  151. package/dist/drizzle/sqlite-proofs.mjs +7 -3
  152. package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
  153. package/dist/drizzle/sqlite-sessions.mjs +16 -12
  154. package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
  155. package/dist/drizzle/standalone-guard.d.mts +2 -0
  156. package/dist/drizzle/standalone-guard.mjs +8 -4
  157. package/dist/drizzle/standalone-guard.mjs.map +1 -1
  158. package/dist/drizzle/totp-target.d.mts +4 -3
  159. package/dist/drizzle/totp-target.mjs +31 -28
  160. package/dist/drizzle/totp-target.mjs.map +1 -1
  161. package/package.json +1 -1
  162. package/src/D1.ts +37 -10
  163. package/src/Libsql.ts +45 -17
  164. package/src/Mysql2.ts +39 -13
  165. package/src/Pglite.ts +47 -13
  166. package/src/Postgres.ts +47 -13
  167. package/src/SqliteBun.ts +58 -30
  168. package/src/SqliteDo.ts +61 -19
  169. package/src/SqliteNode.ts +55 -28
  170. package/src/SqliteWasm.ts +55 -28
  171. package/src/drizzle/d1-database.ts +10 -0
  172. package/src/drizzle/d1-emails.ts +84 -84
  173. package/src/drizzle/d1-identity.ts +17 -20
  174. package/src/drizzle/d1-oauth.ts +19 -8
  175. package/src/drizzle/d1-passkey.ts +5 -1
  176. package/src/drizzle/d1-password-prepared.ts +38 -37
  177. package/src/drizzle/d1-passwords.ts +74 -76
  178. package/src/drizzle/d1-phone.ts +5 -1
  179. package/src/drizzle/d1-proofs.ts +29 -30
  180. package/src/drizzle/d1-sessions.ts +51 -38
  181. package/src/drizzle/d1-totp.ts +5 -1
  182. package/src/drizzle/email-registration.ts +6 -2
  183. package/src/drizzle/email-target.ts +17 -19
  184. package/src/drizzle/mysql-database.ts +8 -0
  185. package/src/drizzle/mysql-emails.ts +28 -16
  186. package/src/drizzle/mysql-identity.ts +18 -21
  187. package/src/drizzle/mysql-password-prepared.ts +10 -8
  188. package/src/drizzle/mysql-passwords.ts +21 -9
  189. package/src/drizzle/mysql-proofs.ts +16 -5
  190. package/src/drizzle/mysql-sessions.ts +40 -17
  191. package/src/drizzle/native-database.ts +22 -0
  192. package/src/drizzle/oauth-connected-drivers.ts +18 -6
  193. package/src/drizzle/oauth-connected-target.ts +16 -17
  194. package/src/drizzle/oauth-drivers.ts +26 -10
  195. package/src/drizzle/oauth-target.ts +30 -42
  196. package/src/drizzle/passkey-drivers.ts +21 -13
  197. package/src/drizzle/passkey-write-drivers.ts +11 -6
  198. package/src/drizzle/password-prepared-sql.ts +2 -4
  199. package/src/drizzle/password-prepared-target.ts +9 -6
  200. package/src/drizzle/password-registration.ts +7 -8
  201. package/src/drizzle/password-target.ts +19 -18
  202. package/src/drizzle/pg-database.ts +10 -0
  203. package/src/drizzle/pg-emails.ts +28 -16
  204. package/src/drizzle/pg-identity.ts +18 -22
  205. package/src/drizzle/pg-password-prepared.ts +10 -8
  206. package/src/drizzle/pg-passwords.ts +21 -9
  207. package/src/drizzle/pg-proofs.ts +16 -5
  208. package/src/drizzle/pg-sessions.ts +40 -17
  209. package/src/drizzle/phone-target.ts +22 -17
  210. package/src/drizzle/proof-target.ts +9 -12
  211. package/src/drizzle/session-target.ts +32 -50
  212. package/src/drizzle/sqlite-emails.ts +30 -13
  213. package/src/drizzle/sqlite-identity.ts +22 -42
  214. package/src/drizzle/sqlite-password-prepared.ts +23 -9
  215. package/src/drizzle/sqlite-passwords.ts +29 -15
  216. package/src/drizzle/sqlite-proofs.ts +28 -5
  217. package/src/drizzle/sqlite-sessions.ts +49 -23
  218. package/src/drizzle/standalone-guard.ts +18 -6
  219. package/src/drizzle/totp-target.ts +61 -60
  220. package/dist/drizzle/d1-identity.d.mts +0 -30
  221. package/dist/drizzle/mysql-identity.d.mts +0 -21
  222. package/dist/drizzle/pg-identity.d.mts +0 -22
@@ -1 +1 @@
1
- {"version":3,"file":"phone-target.mjs","names":[],"sources":["../../src/drizzle/phone-target.ts"],"sourcesContent":["import { randomId } from \"@yielded/auth-crypto\";\nimport { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n PhoneConfigurationError,\n PhoneLifecyclePolicy,\n PhoneAdmissionPolicy,\n PhoneLifecycleTarget,\n PhoneActionAuthorization,\n PhoneAdmission,\n type PhoneMutation,\n PhonePersistence,\n PhoneSignInTargets,\n type PhoneOtpUnavailable as PhoneUnavailable,\n} from \"@yielded/auth/PhoneOtp\";\nimport { ProofBinding } from \"@yielded/auth/Proofs\";\nimport { sql, type Table } from \"drizzle-orm\";\n/* oxlint-disable no-explicit-any -- shared native implementation; driver entrypoints retain exact database and table types. */\nimport { Context, Effect, Schema } from \"effect\";\nimport type { Statement } from \"effect/sql/Statement\";\n\nimport { CurrentD1PlanningDatabase } from \"./d1-planning\";\nimport { compileD1ProofCompletionPlan } from \"./d1-proofs\";\nimport type { PersistenceMappingError } from \"./model\";\nimport {\n phoneProofs,\n type PhoneMapping,\n type PhoneMappingSource,\n type PhonePersistenceServices,\n requiredPhoneConstraints,\n} from \"./phone-model\";\nimport {\n capturePhone,\n lookupPhone,\n admitPhone,\n cleanupPhoneAdmission,\n CurrentPhoneTransaction,\n invariant,\n equal,\n preparePhoneMutation,\n unavailable,\n} from \"./phone-state\";\nimport { requiredProofConstraints } from \"./proof-model\";\nimport { completeProofPlanIn, CurrentProofSql } from \"./proof-sql\";\nimport type { SuppliedService } from \"./SuppliedService\";\nimport {\n coordinateTransactionOwner,\n makeTransactionExecution,\n sqlClientTransactionStandaloneGuard,\n type TransactionExecution,\n type TransactionTargetConfiguration,\n type TransactionCoordinatorError,\n} from \"./transaction-execution\";\nimport type { TransactionNativeDatabase } from \"./transaction-owner\";\nexport type PhoneTargetConfiguration = TransactionTargetConfiguration<PhoneUnavailable>;\n\nexport type PhoneCoordinatorError<E> =\n | TransactionCoordinatorError<E, PhoneUnavailable>\n | PhoneConfigurationError\n | PersistenceMappingError;\n\nexport const sqlClientPhoneStandaloneGuard = (\n database: Parameters<typeof sqlClientTransactionStandaloneGuard>[1],\n) => sqlClientTransactionStandaloneGuard(unavailable, database);\n\nconst validateMapping = <M>(original: M, configuration: PhoneTargetConfiguration): M => {\n const mapping = original as any;\n\n invariant(mapping.moduleId.length > 0);\n Schema.decodeSync(PhoneLifecyclePolicy)(mapping.policy);\n Schema.decodeSync(PhoneAdmissionPolicy)(mapping.admission);\n invariant(mapping.admission.requestRetentionMillis >= mapping.admission.windowMillis);\n const proofs = phoneProofs(mapping.proofs);\n\n invariant(proofs !== undefined);\n for (const [key, value] of Object.entries(requiredProofConstraints))\n invariant((proofs.constraints as any)?.[key] === value);\n if (configuration.mode === \"synchronous\") invariant(proofs.allocateVersionSync !== undefined);\n if (configuration.mode === \"batch\")\n invariant(\n proofs.d1 !== undefined && proofs.authority.identifier.d1CurrentCondition !== undefined,\n );\n for (const [key, value] of Object.entries(requiredPhoneConstraints))\n invariant(mapping.constraints?.[key] === value);\n if (configuration.mode === \"batch\") invariant(mapping.d1?.primary === true);\n\n return Object.freeze({\n ...mapping,\n policy: Object.freeze({ ...mapping.policy }),\n subject: Object.freeze({ ...mapping.subject }),\n state: Object.freeze({ ...mapping.state }),\n identifier: Object.freeze({ ...mapping.identifier }),\n admission: Object.freeze({ ...mapping.admission }),\n credential: Object.freeze({ ...mapping.credential }),\n subjectIds: Object.freeze({ ...mapping.subjectIds }),\n });\n};\n\nconst services = (\n mapping: any,\n execution: TransactionExecution<PhoneUnavailable, CurrentPhoneTransaction>,\n hooks: LifecycleHooks[\"Service\"],\n configuration: PhoneTargetConfiguration,\n): PhonePersistenceServices => {\n const run = <A, E, R>(effect: Effect.Effect<A, E, R>, mutation = true) =>\n execution.admit.pipe(\n Effect.andThen(execution.run(effect, mutation)),\n Effect.provideService(LifecycleHooks, hooks),\n );\n\n return {\n phoneAdmission: PhoneAdmission.of({\n admit: (input) => run(admitPhone(mapping, { ...input })),\n cleanup: (input) => run(cleanupPhoneAdmission(mapping, { ...input })),\n }),\n phoneSignInTargets: PhoneSignInTargets.of({\n lookup: (input) => run(lookupPhone(mapping, { ...input }), false),\n }),\n phonePersistence: PhonePersistence.of({\n target: (input) =>\n run(\n Effect.gen(function* () {\n invariant(input.moduleId === mapping.moduleId);\n\n return (yield* capturePhone(mapping, { ...input })).target;\n }),\n false,\n ),\n mutate: (original, prepare) =>\n Effect.suspend(() => {\n const input: PhoneMutation = {\n ...original,\n target: Schema.decodeSync(Schema.toCodecIso(PhoneLifecycleTarget))(\n Schema.encodeSync(Schema.toCodecIso(PhoneLifecycleTarget))(original.target),\n ),\n policy: { ...original.policy },\n ...(original.authorization === undefined\n ? {}\n : {\n authorization: Schema.decodeSync(Schema.toCodecIso(PhoneActionAuthorization))(\n Schema.encodeSync(Schema.toCodecIso(PhoneActionAuthorization))(\n original.authorization,\n ),\n ),\n }),\n completion: {\n input: {\n ...original.completion.input,\n binding: Schema.decodeSync(Schema.toCodecIso(ProofBinding))(\n Schema.encodeSync(Schema.toCodecIso(ProofBinding))(\n original.completion.input.binding,\n ),\n ),\n },\n prepare: original.completion.prepare,\n },\n };\n\n return run(\n Effect.gen(function* () {\n const owner = yield* CurrentPhoneTransaction,\n candidate = yield* preparePhoneMutation(mapping, input);\n\n if (candidate.mutate === undefined) {\n const receipt = prepare(candidate.decision, owner.journal);\n\n owner.guards.push(receipt as any);\n\n return receipt;\n }\n const cn = phoneProofs(mapping.proofs).continuation;\n\n const observed = yield* owner.read(\n cn.table,\n equal(cn.table, {\n [cn.moduleId]: input.completion.input.moduleId,\n [cn.continuationId]: input.completion.input.continuationId,\n }),\n { limit: 1 },\n );\n\n let completed = false;\n\n const plan = {\n ...input.completion,\n prepare: (decision: any, journal: any) => {\n completed = decision === \"completed\";\n const proofReceipt = input.completion.prepare(decision, journal, () => undefined);\n\n owner.guards.push(proofReceipt);\n\n return prepare(\n decision === \"completed\" ? candidate.decision : { _tag: \"Rejected\" },\n journal,\n );\n },\n };\n\n let receipt;\n\n if (owner.batch) {\n const offset = owner.statements.length;\n\n yield* candidate.mutate;\n const statements = owner.statements.splice(offset);\n\n const compiled = yield* compileD1ProofCompletionPlan(\n phoneProofs(mapping.proofs) as any,\n plan as any,\n { statements, appliedCondition: candidate.appliedCondition! },\n (x) => x,\n ).pipe(Effect.provideService(CurrentD1PlanningDatabase, owner.database));\n\n // Mutation observations describe an accepted plan. A stale proof aborts this owner.\n invariant(compiled.statements.length !== 0);\n owner.statements.push(...compiled.statements, ...(compiled.postconditions ?? []));\n receipt = compiled.receipt;\n } else {\n receipt = yield* completeProofPlanIn(\n phoneProofs(mapping.proofs),\n {\n mode: configuration.mode === \"synchronous\" ? \"synchronous\" : \"interactive\",\n locking: configuration.locking,\n standaloneGuard: Effect.void,\n coordinated: true,\n insertIfAbsent: (query: any, key, value) =>\n configuration.dialect === \"mysql\"\n ? query.onDuplicateKeyUpdate({ set: { [key]: value } })\n : query.onConflictDoNothing(),\n },\n plan as any,\n candidate.mutate,\n (x) => x,\n ).pipe(Effect.provideService(CurrentProofSql, owner.database));\n }\n if (completed) {\n invariant(observed.rows.length === 1);\n const record = yield* cn.decode(observed.rows[0]!);\n\n observed.rows = observed.rows.map((row) => ({ ...row, [cn.consumed]: true }));\n const command = phoneProofs(mapping.proofs).command;\n\n owner.postconditions.push(\n sql`${mapping.engineNowMillis} < ${record.expiresAtMillis}`,\n sql`exists(select 1 from ${command.table} where ${equal(command.table, { [command.moduleId]: input.completion.input.moduleId, [command.commandId]: input.completion.input.continuationDigest, [command.kind]: \"complete\", [command.decision]: \"completed\", [command.retentionUntil]: phoneProofs(mapping.proofs).encodeInstant(record.expiresAtMillis) })})`,\n );\n }\n invariant(receipt?._tag === \"PreparedCommit\");\n owner.guards.push(receipt as any);\n\n return receipt as ReturnType<typeof prepare>;\n }),\n );\n }).pipe(Effect.catchDefect(() => Effect.fail(unavailable()))),\n }),\n };\n};\n\nexport const makeTargetPhonePersistence = <\n S extends Table,\n I extends Table,\n F extends Table,\n C extends Table,\n N,\n RSetup = never,\n>(\n database: TransactionNativeDatabase,\n source: PhoneMappingSource<PhoneMapping<S, I, C, F, N>, RSetup>,\n configuration: PhoneTargetConfiguration,\n) =>\n Effect.gen(function* () {\n const hooks = yield* LifecycleHooks;\n const original = yield* Effect.isEffect(source) ? source : Effect.succeed(source);\n\n const mapping = yield* Effect.try({\n try: () => validateMapping(original, configuration),\n catch: () => PhoneConfigurationError.make({}),\n });\n\n const execution = makeTransactionExecution(\n CurrentPhoneTransaction,\n database,\n configuration,\n unavailable,\n randomId,\n );\n\n return services(mapping, execution, hooks, configuration);\n });\n\nexport const coordinateTargetPhone = <M, A, E, R, RSetup = never>(\n database: TransactionNativeDatabase,\n source: PhoneMappingSource<M, RSetup>,\n configuration: PhoneTargetConfiguration,\n body: (\n transaction: any,\n services: PhonePersistenceServices,\n append: (statement: Statement<any>) => void,\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, PhoneCoordinatorError<E>, R | RSetup | LifecycleHooks> =>\n Effect.gen(function* () {\n const hooks = yield* LifecycleHooks;\n const original = yield* Effect.isEffect(source) ? source : Effect.succeed(source);\n\n const mapping = yield* Effect.try({\n try: () => validateMapping(original, configuration),\n catch: () => PhoneConfigurationError.make({}),\n });\n\n return yield* coordinateTransactionOwner(\n database,\n CurrentPhoneTransaction,\n configuration,\n Effect.void,\n unavailable,\n randomId,\n (execution) => services(mapping, execution, hooks, configuration),\n body,\n );\n });\n\ntype TransactionOf<D> = D extends { readonly transaction: (...args: any[]) => any }\n ? Parameters<Parameters<D[\"transaction\"]>[0]>[0]\n : never;\n\n/** Concrete driver wrappers select transaction mode; cryptography always precedes these owners. */\nexport const makePhoneTarget = <\n D extends { readonly transaction: any },\n T extends Table,\n Extra = unknown,\n Synchronous extends boolean = false,\n>(\n configuration: PhoneTargetConfiguration,\n) => {\n function coordinatePhonePersistence<\n Database extends D,\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>;\n readonly transaction?: never;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<PhonePersistence | PhoneAdmission | PhoneSignInTargets> : R\n >,\n ): Effect.Effect<\n A,\n PhoneCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true\n ? never\n : Exclude<R, PhonePersistence | PhoneAdmission | PhoneSignInTargets>)\n | LifecycleHooks\n | RSetup\n | DatabaseRequirements\n >;\n function coordinatePhonePersistence<\n Database extends D,\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n A,\n E,\n R,\n TxId,\n TxShape,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true\n ? NoInfer<PhonePersistence | PhoneAdmission | PhoneSignInTargets | TxId>\n : R\n >,\n ): Effect.Effect<\n A,\n PhoneCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true\n ? never\n : Exclude<R, PhonePersistence | PhoneAdmission | PhoneSignInTargets | TxId>)\n | LifecycleHooks\n | RSetup\n | DatabaseRequirements\n >;\n function coordinatePhonePersistence<\n Database extends D,\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n A,\n E,\n R,\n TxId,\n TxShape,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n PhoneCoordinatorError<E> | DatabaseError,\n | Exclude<R, PhonePersistence | PhoneAdmission | PhoneSignInTargets>\n | LifecycleHooks\n | RSetup\n | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPhone(\n database as any,\n options.mapping,\n configuration,\n (transaction: TransactionOf<Database>, services) => {\n const provided = Context.make(PhonePersistence, services.phonePersistence).pipe(\n Context.add(PhoneAdmission, services.phoneAdmission),\n Context.add(PhoneSignInTargets, services.phoneSignInTargets),\n );\n\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n\n return {\n makePhonePersistenceServices: <\n Database extends D,\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n RSetup = never,\n >(\n database: Database,\n mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>,\n ) => makeTargetPhonePersistence(database as any, mapping, configuration),\n coordinatePhonePersistence,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"phone-target.mjs","names":[],"sources":["../../src/drizzle/phone-target.ts"],"sourcesContent":["import { randomId } from \"@yielded/auth-crypto\";\nimport { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n PhoneConfigurationError,\n PhoneLifecyclePolicy,\n PhoneAdmissionPolicy,\n PhoneLifecycleTarget,\n PhoneActionAuthorization,\n PhoneAdmission,\n type PhoneMutation,\n PhonePersistence,\n PhoneSignInTargets,\n type PhoneOtpUnavailable as PhoneUnavailable,\n} from \"@yielded/auth/PhoneOtp\";\nimport { ProofBinding } from \"@yielded/auth/Proofs\";\nimport { sql, type Table } from \"drizzle-orm\";\n/* oxlint-disable no-explicit-any -- shared native implementation; driver entrypoints retain exact database and table types. */\nimport { Context, Effect, Schema } from \"effect\";\nimport type { Statement } from \"effect/sql/Statement\";\n\nimport { CurrentD1PlanningDatabase } from \"./d1-planning\";\nimport { compileD1ProofCompletionPlan } from \"./d1-proofs\";\nimport type { PersistenceMappingError } from \"./model\";\nimport { nativeDatabase } from \"./native-database\";\nimport {\n phoneProofs,\n type PhoneMapping,\n type PhoneMappingSource,\n type PhonePersistenceServices,\n requiredPhoneConstraints,\n} from \"./phone-model\";\nimport {\n capturePhone,\n lookupPhone,\n admitPhone,\n cleanupPhoneAdmission,\n CurrentPhoneTransaction,\n invariant,\n equal,\n preparePhoneMutation,\n unavailable,\n} from \"./phone-state\";\nimport { requiredProofConstraints } from \"./proof-model\";\nimport { completeProofPlanIn, CurrentProofSql } from \"./proof-sql\";\nimport type { SuppliedService } from \"./SuppliedService\";\nimport {\n coordinateTransactionOwner,\n makeTransactionExecution,\n sqlClientTransactionStandaloneGuard,\n type TransactionExecution,\n type TransactionTargetConfiguration,\n type TransactionCoordinatorError,\n} from \"./transaction-execution\";\nimport type { TransactionNativeDatabase } from \"./transaction-owner\";\nexport type PhoneTargetConfiguration = TransactionTargetConfiguration<PhoneUnavailable>;\n\nexport type PhoneCoordinatorError<E> =\n | TransactionCoordinatorError<E, PhoneUnavailable>\n | PhoneConfigurationError\n | PersistenceMappingError;\n\nexport const sqlClientPhoneStandaloneGuard = (\n service: Parameters<typeof sqlClientTransactionStandaloneGuard>[1],\n) => sqlClientTransactionStandaloneGuard(unavailable, service);\n\nconst validateMapping = <M>(original: M, configuration: PhoneTargetConfiguration): M => {\n const mapping = original as any;\n\n invariant(mapping.moduleId.length > 0);\n Schema.decodeSync(PhoneLifecyclePolicy)(mapping.policy);\n Schema.decodeSync(PhoneAdmissionPolicy)(mapping.admission);\n invariant(mapping.admission.requestRetentionMillis >= mapping.admission.windowMillis);\n const proofs = phoneProofs(mapping.proofs);\n\n invariant(proofs !== undefined);\n for (const [key, value] of Object.entries(requiredProofConstraints))\n invariant((proofs.constraints as any)?.[key] === value);\n if (configuration.mode === \"synchronous\") invariant(proofs.allocateVersionSync !== undefined);\n if (configuration.mode === \"batch\")\n invariant(\n proofs.d1 !== undefined && proofs.authority.identifier.d1CurrentCondition !== undefined,\n );\n for (const [key, value] of Object.entries(requiredPhoneConstraints))\n invariant(mapping.constraints?.[key] === value);\n if (configuration.mode === \"batch\") invariant(mapping.d1?.primary === true);\n\n return Object.freeze({\n ...mapping,\n policy: Object.freeze({ ...mapping.policy }),\n subject: Object.freeze({ ...mapping.subject }),\n state: Object.freeze({ ...mapping.state }),\n identifier: Object.freeze({ ...mapping.identifier }),\n admission: Object.freeze({ ...mapping.admission }),\n credential: Object.freeze({ ...mapping.credential }),\n subjectIds: Object.freeze({ ...mapping.subjectIds }),\n });\n};\n\nconst services = Effect.fnUntraced(function* (\n mapping: any,\n execution: TransactionExecution<PhoneUnavailable, CurrentPhoneTransaction>,\n configuration: PhoneTargetConfiguration,\n): Effect.fn.Return<PhonePersistenceServices, never, LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n const run = <A, E, R>(effect: Effect.Effect<A, E, R>, mutation = true) =>\n execution.admit.pipe(\n Effect.andThen(execution.run(effect, mutation)),\n Effect.provideService(LifecycleHooks, hooks),\n );\n\n return {\n phoneAdmission: PhoneAdmission.of({\n admit: (input) => run(admitPhone(mapping, { ...input })),\n cleanup: (input) => run(cleanupPhoneAdmission(mapping, { ...input })),\n }),\n phoneSignInTargets: PhoneSignInTargets.of({\n lookup: (input) => run(lookupPhone(mapping, { ...input }), false),\n }),\n phonePersistence: PhonePersistence.of({\n target: (input) =>\n run(\n Effect.gen(function* () {\n invariant(input.moduleId === mapping.moduleId);\n\n return (yield* capturePhone(mapping, { ...input })).target;\n }),\n false,\n ),\n mutate: (original, prepare) =>\n Effect.suspend(() => {\n const input: PhoneMutation = {\n ...original,\n target: Schema.decodeSync(Schema.toCodecIso(PhoneLifecycleTarget))(\n Schema.encodeSync(Schema.toCodecIso(PhoneLifecycleTarget))(original.target),\n ),\n policy: { ...original.policy },\n ...(original.authorization === undefined\n ? {}\n : {\n authorization: Schema.decodeSync(Schema.toCodecIso(PhoneActionAuthorization))(\n Schema.encodeSync(Schema.toCodecIso(PhoneActionAuthorization))(\n original.authorization,\n ),\n ),\n }),\n completion: {\n input: {\n ...original.completion.input,\n binding: Schema.decodeSync(Schema.toCodecIso(ProofBinding))(\n Schema.encodeSync(Schema.toCodecIso(ProofBinding))(\n original.completion.input.binding,\n ),\n ),\n },\n prepare: original.completion.prepare,\n },\n };\n\n return run(\n Effect.gen(function* () {\n const owner = yield* CurrentPhoneTransaction,\n candidate = yield* preparePhoneMutation(mapping, input);\n\n if (candidate.mutate === undefined) {\n const receipt = prepare(candidate.decision, owner.journal);\n\n owner.guards.push(receipt as any);\n\n return receipt;\n }\n const cn = phoneProofs(mapping.proofs).continuation;\n\n const observed = yield* owner.read(\n cn.table,\n equal(cn.table, {\n [cn.moduleId]: input.completion.input.moduleId,\n [cn.continuationId]: input.completion.input.continuationId,\n }),\n { limit: 1 },\n );\n\n let completed = false;\n\n const plan = {\n ...input.completion,\n prepare: (decision: any, journal: any) => {\n completed = decision === \"completed\";\n const proofReceipt = input.completion.prepare(decision, journal, () => undefined);\n\n owner.guards.push(proofReceipt);\n\n return prepare(\n decision === \"completed\" ? candidate.decision : { _tag: \"Rejected\" },\n journal,\n );\n },\n };\n\n let receipt;\n\n if (owner.batch) {\n const offset = owner.statements.length;\n\n yield* candidate.mutate;\n const statements = owner.statements.splice(offset);\n\n const compiled = yield* compileD1ProofCompletionPlan(\n phoneProofs(mapping.proofs) as any,\n plan as any,\n { statements, appliedCondition: candidate.appliedCondition! },\n (x) => x,\n ).pipe(Effect.provideService(CurrentD1PlanningDatabase, owner.database));\n\n // Mutation observations describe an accepted plan. A stale proof aborts this owner.\n invariant(compiled.statements.length !== 0);\n owner.statements.push(...compiled.statements, ...(compiled.postconditions ?? []));\n receipt = compiled.receipt;\n } else {\n receipt = yield* completeProofPlanIn(\n phoneProofs(mapping.proofs),\n {\n mode: configuration.mode === \"synchronous\" ? \"synchronous\" : \"interactive\",\n locking: configuration.locking,\n standaloneGuard: Effect.void,\n coordinated: true,\n insertIfAbsent: (query: any, key, value) =>\n configuration.dialect === \"mysql\"\n ? query.onDuplicateKeyUpdate({ set: { [key]: value } })\n : query.onConflictDoNothing(),\n },\n plan as any,\n candidate.mutate,\n (x) => x,\n ).pipe(Effect.provideService(CurrentProofSql, owner.database));\n }\n if (completed) {\n invariant(observed.rows.length === 1);\n const record = yield* cn.decode(observed.rows[0]!);\n\n observed.rows = observed.rows.map((row) => ({ ...row, [cn.consumed]: true }));\n const command = phoneProofs(mapping.proofs).command;\n\n owner.postconditions.push(\n sql`${mapping.engineNowMillis} < ${record.expiresAtMillis}`,\n sql`exists(select 1 from ${command.table} where ${equal(command.table, { [command.moduleId]: input.completion.input.moduleId, [command.commandId]: input.completion.input.continuationDigest, [command.kind]: \"complete\", [command.decision]: \"completed\", [command.retentionUntil]: phoneProofs(mapping.proofs).encodeInstant(record.expiresAtMillis) })})`,\n );\n }\n invariant(receipt?._tag === \"PreparedCommit\");\n owner.guards.push(receipt as any);\n\n return receipt as ReturnType<typeof prepare>;\n }),\n );\n }).pipe(Effect.catchDefect(() => Effect.fail(unavailable()))),\n }),\n };\n});\n\nexport const makeTargetPhonePersistence = <\n S extends Table,\n I extends Table,\n F extends Table,\n C extends Table,\n N,\n RSetup = never,\n>(\n source: PhoneMappingSource<PhoneMapping<S, I, C, F, N>, RSetup>,\n configuration: PhoneTargetConfiguration,\n) =>\n Effect.gen(function* () {\n const original = yield* Effect.isEffect(source) ? source : Effect.succeed(source);\n\n const mapping = yield* Effect.try({\n try: () => validateMapping(original, configuration),\n catch: () => PhoneConfigurationError.make({}),\n });\n\n const execution = yield* makeTransactionExecution(\n CurrentPhoneTransaction,\n configuration,\n unavailable,\n randomId,\n );\n\n return yield* services(mapping, execution, configuration);\n });\n\nexport const coordinateTargetPhone = <M, A, E, R, RSetup = never>(\n database: TransactionNativeDatabase,\n source: PhoneMappingSource<M, RSetup>,\n configuration: PhoneTargetConfiguration,\n body: (\n transaction: any,\n services: PhonePersistenceServices,\n append: (statement: Statement<any>) => void,\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, PhoneCoordinatorError<E>, R | RSetup | LifecycleHooks> =>\n Effect.gen(function* () {\n const original = yield* Effect.isEffect(source) ? source : Effect.succeed(source);\n\n const mapping = yield* Effect.try({\n try: () => validateMapping(original, configuration),\n catch: () => PhoneConfigurationError.make({}),\n });\n\n return yield* coordinateTransactionOwner(\n database,\n CurrentPhoneTransaction,\n configuration,\n Effect.void,\n unavailable,\n randomId,\n (execution) => services(mapping, execution, configuration),\n (transaction, acquireServices, append) =>\n Effect.flatMap(acquireServices, (boundServices) =>\n body(transaction, boundServices, append),\n ),\n );\n });\n\ntype TransactionOf<D> = D extends { readonly transaction: (...args: any[]) => any }\n ? Parameters<Parameters<D[\"transaction\"]>[0]>[0]\n : never;\n\n/** Concrete driver wrappers select transaction mode; cryptography always precedes these owners. */\nexport const makePhoneTarget = <\n DatabaseId,\n D extends { readonly transaction: any },\n T extends Table,\n Extra = unknown,\n Synchronous extends boolean = false,\n>(\n databaseService: Context.Service<DatabaseId, D>,\n configuration: PhoneTargetConfiguration,\n) => {\n function coordinatePhonePersistence<\n Database extends D,\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>;\n readonly transaction?: never;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<PhonePersistence | PhoneAdmission | PhoneSignInTargets> : R\n >,\n ): Effect.Effect<\n A,\n PhoneCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true\n ? never\n : Exclude<R, PhonePersistence | PhoneAdmission | PhoneSignInTargets>)\n | LifecycleHooks\n | RSetup\n | DatabaseRequirements\n >;\n function coordinatePhonePersistence<\n Database extends D,\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n A,\n E,\n R,\n TxId,\n TxShape,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true\n ? NoInfer<PhonePersistence | PhoneAdmission | PhoneSignInTargets | TxId>\n : R\n >,\n ): Effect.Effect<\n A,\n PhoneCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true\n ? never\n : Exclude<R, PhonePersistence | PhoneAdmission | PhoneSignInTargets | TxId>)\n | LifecycleHooks\n | RSetup\n | DatabaseRequirements\n >;\n function coordinatePhonePersistence<\n Database extends D,\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n A,\n E,\n R,\n TxId,\n TxShape,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n PhoneCoordinatorError<E> | DatabaseError,\n | Exclude<R, PhonePersistence | PhoneAdmission | PhoneSignInTargets>\n | LifecycleHooks\n | RSetup\n | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPhone(\n database as any,\n options.mapping,\n configuration,\n (transaction: TransactionOf<Database>, services) => {\n const provided = Context.make(PhonePersistence, services.phonePersistence).pipe(\n Context.add(PhoneAdmission, services.phoneAdmission),\n Context.add(PhoneSignInTargets, services.phoneSignInTargets),\n );\n\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n\n return {\n makePhonePersistenceServices: <\n S extends T,\n I extends T,\n F extends T,\n C extends T,\n N,\n RSetup = never,\n >(\n mapping: PhoneMappingSource<PhoneMapping<S, I, C, F, N> & Extra, RSetup>,\n ) =>\n makeTargetPhonePersistence(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n ),\n coordinatePhonePersistence,\n };\n};\n"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
+ import "./standalone-guard.mjs";
1
2
  import "./proof-sql.mjs";
2
3
  import { Effect, Layer } from "effect";
3
4
  import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
4
5
  import { ProofPersistence, ProofUnavailable } from "@yielded/auth/Proofs";
5
6
  import "effect/sql/SqlError";
6
7
  //#region src/drizzle/proof-target.d.ts
7
- export declare const proofPersistenceLayer: (services: Effect.Effect<{
8
+ export declare const proofPersistenceLayer: <E, R>(services: Effect.Effect<{
8
9
  readonly proofPersistence: ProofPersistence["Service"];
9
- }, never, LifecycleHooks>) => Layer.Layer<ProofPersistence, never, LifecycleHooks>;
10
+ }, E, R>) => Layer.Layer<ProofPersistence, E, Exclude<R, import("effect/Scope").Scope>>;
10
11
  //#endregion
11
12
  //# sourceMappingURL=proof-target.d.mts.map
@@ -1,10 +1,10 @@
1
1
  import { sqlClientStandaloneGuard } from "./standalone-guard.mjs";
2
- import { makeSqlProofPersistence } from "./proof-sql.mjs";
2
+ import { CurrentProofSql, makeSqlProofPersistence } from "./proof-sql.mjs";
3
3
  import { Effect, Layer } from "effect";
4
4
  import { LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
5
5
  import { ProofPersistence, ProofUnavailable } from "@yielded/auth/Proofs";
6
6
  //#region src/drizzle/proof-target.ts
7
- const sqlClientProofStandaloneGuard = (database) => sqlClientStandaloneGuard(database, () => ProofUnavailable.make({}));
7
+ const sqlClientProofStandaloneGuard = (service) => sqlClientStandaloneGuard(service, () => ProofUnavailable.make({}));
8
8
  const options = (configuration, coordinated = false) => ({
9
9
  mode: configuration.mode,
10
10
  locking: configuration.locking,
@@ -12,8 +12,8 @@ const options = (configuration, coordinated = false) => ({
12
12
  insertIfAbsent: configuration.insertIfAbsent,
13
13
  coordinated
14
14
  });
15
- const makeTargetProofPersistenceServices = (database, mapping, configuration) => Effect.gen(function* () {
16
- return { proofPersistence: yield* makeSqlProofPersistence(database, mapping, options(configuration)) };
15
+ const makeTargetProofPersistenceServices = (mapping, configuration) => Effect.gen(function* () {
16
+ return { proofPersistence: yield* makeSqlProofPersistence(mapping, options(configuration)) };
17
17
  });
18
18
  /**
19
19
  * The native transaction is the root commit owner. Interruption or owner failure
@@ -26,7 +26,7 @@ const coordinateTargetProofPersistence = (database, mapping, configuration, owne
26
26
  if (yield* hasCommitScope) return yield* ProofUnavailable.make({});
27
27
  yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
28
28
  return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
29
- return yield* owner(transaction, { proofPersistence: yield* makeSqlProofPersistence(transaction, mapping, options(configuration, true)) });
29
+ return yield* owner(transaction, { proofPersistence: yield* makeSqlProofPersistence(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentProofSql, transaction)) });
30
30
  })), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
31
31
  });
32
32
  const proofPersistenceLayer = (services) => Layer.effect(ProofPersistence, Effect.map(services, (value) => value.proofPersistence));
@@ -1 +1 @@
1
- {"version":3,"file":"proof-target.mjs","names":[],"sources":["../../src/drizzle/proof-target.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport { ProofUnavailable, ProofPersistence } from \"@yielded/auth/Proofs\";\n/* oxlint-disable no-explicit-any -- public driver entrypoints restore concrete Drizzle types. */\nimport { Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport {\n makeSqlProofPersistence,\n type ProofSqlConfiguration,\n type ProofSqlDatabase,\n type ProofSqlQuery,\n} from \"./proof-sql\";\nimport { sqlClientStandaloneGuard } from \"./standalone-guard\";\n\nexport interface ProofTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, ProofUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, ProofUnavailable>;\n readonly insertIfAbsent: (\n query: ProofSqlQuery,\n selfKey: string,\n selfValue: unknown,\n ) => ProofSqlQuery;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport type ProofCoordinatorError<E> =\n | E\n | ProofUnavailable\n | HookConfigurationError\n | SqlError.SqlError;\n\nexport const sqlClientProofStandaloneGuard = (\n database: unknown,\n): Effect.Effect<void, ProofUnavailable> =>\n sqlClientStandaloneGuard(database, () => ProofUnavailable.make({}));\n\nconst options = (\n configuration: ProofTargetConfiguration,\n coordinated = false,\n): ProofSqlConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n insertIfAbsent: configuration.insertIfAbsent,\n coordinated,\n});\n\nexport const makeTargetProofPersistenceServices = (\n database: any,\n mapping: any,\n configuration: ProofTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n proofPersistence: yield* makeSqlProofPersistence(database, mapping, options(configuration)),\n };\n });\n\n/**\n * The native transaction is the root commit owner. Interruption or owner failure\n * rolls it back and discards the journal. No owner effect is retried. Native\n * transaction-acquisition `SqlError`s are exposed; caller errors, including\n * Drizzle query wrappers, propagate unchanged.\n */\nexport const coordinateTargetProofPersistence = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: ProofTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly proofPersistence: ProofPersistence[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, ProofCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, ProofCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* ProofUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n proofPersistence: yield* makeSqlProofPersistence(\n transaction as unknown as ProofSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const proofPersistenceLayer = (\n services: Effect.Effect<\n { readonly proofPersistence: ProofPersistence[\"Service\"] },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n ProofPersistence,\n Effect.map(services, (value) => value.proofPersistence),\n );\n"],"mappings":";;;;;;AA2CA,MAAa,iCACX,aAEA,yBAAyB,gBAAgB,iBAAiB,KAAK,CAAC,CAAC,CAAC;AAEpE,MAAM,WACJ,eACA,cAAc,WACa;CAC3B,MAAM,cAAc;CACpB,SAAS,cAAc;CAEvB,iBAAiB,CAAC,cAAc,cAAc,kBAAkB,OAAO;CACvE,gBAAgB,cAAc;CAC9B;AACF;AAEA,MAAa,sCACX,UACA,SACA,kBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,kBAAkB,OAAO,wBAAwB,UAAU,SAAS,QAAQ,aAAa,CAAC,EAC5F;AACF,CAAC;;;;;;;AAQH,MAAa,oCACX,UACA,SACA,eACA,UAKA,OAAO,IAAI,aAAgF;CACzF,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,iBAAiB,KAAK,CAAC,CAAC;CACjE,OAAO,cAAc,oBAAoB,cAAc;CAkBvD,QAAO,OAhBe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,OAAO,OAAO,MAAM,aAAa,EAC/B,kBAAkB,OAAO,wBACvB,aACA,SACA,QAAQ,eAAe,IAAI,CAC7B,EACF,CAAC;CACH,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,yBACX,aAMA,MAAM,OACJ,kBACA,OAAO,IAAI,WAAW,UAAU,MAAM,gBAAgB,CACxD"}
1
+ {"version":3,"file":"proof-target.mjs","names":[],"sources":["../../src/drizzle/proof-target.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport { ProofUnavailable, ProofPersistence } from \"@yielded/auth/Proofs\";\n/* oxlint-disable no-explicit-any -- public driver entrypoints restore concrete Drizzle types. */\nimport { Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport {\n CurrentProofSql,\n makeSqlProofPersistence,\n type ProofSqlConfiguration,\n type ProofSqlDatabase,\n type ProofSqlQuery,\n} from \"./proof-sql\";\nimport { sqlClientStandaloneGuard, type TransactionService } from \"./standalone-guard\";\n\nexport interface ProofTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, ProofUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, ProofUnavailable>;\n readonly insertIfAbsent: (\n query: ProofSqlQuery,\n selfKey: string,\n selfValue: unknown,\n ) => ProofSqlQuery;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport type ProofCoordinatorError<E> =\n | E\n | ProofUnavailable\n | HookConfigurationError\n | SqlError.SqlError;\n\nexport const sqlClientProofStandaloneGuard = (\n service: TransactionService | undefined,\n): Effect.Effect<void, ProofUnavailable> =>\n sqlClientStandaloneGuard(service, () => ProofUnavailable.make({}));\n\nconst options = (\n configuration: ProofTargetConfiguration,\n coordinated = false,\n): ProofSqlConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n insertIfAbsent: configuration.insertIfAbsent,\n coordinated,\n});\n\nexport const makeTargetProofPersistenceServices = (\n mapping: any,\n configuration: ProofTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n proofPersistence: yield* makeSqlProofPersistence(mapping, options(configuration)),\n };\n });\n\n/**\n * The native transaction is the root commit owner. Interruption or owner failure\n * rolls it back and discards the journal. No owner effect is retried. Native\n * transaction-acquisition `SqlError`s are exposed; caller errors, including\n * Drizzle query wrappers, propagate unchanged.\n */\nexport const coordinateTargetProofPersistence = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: ProofTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly proofPersistence: ProofPersistence[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, ProofCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, ProofCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* ProofUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n proofPersistence: yield* makeSqlProofPersistence(\n mapping,\n options(configuration, true),\n ).pipe(\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const proofPersistenceLayer = <E, R>(\n services: Effect.Effect<{ readonly proofPersistence: ProofPersistence[\"Service\"] }, E, R>,\n) =>\n Layer.effect(\n ProofPersistence,\n Effect.map(services, (value) => value.proofPersistence),\n );\n"],"mappings":";;;;;;AA4CA,MAAa,iCACX,YAEA,yBAAyB,eAAe,iBAAiB,KAAK,CAAC,CAAC,CAAC;AAEnE,MAAM,WACJ,eACA,cAAc,WACa;CAC3B,MAAM,cAAc;CACpB,SAAS,cAAc;CAEvB,iBAAiB,CAAC,cAAc,cAAc,kBAAkB,OAAO;CACvE,gBAAgB,cAAc;CAC9B;AACF;AAEA,MAAa,sCACX,SACA,kBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,kBAAkB,OAAO,wBAAwB,SAAS,QAAQ,aAAa,CAAC,EAClF;AACF,CAAC;;;;;;;AAQH,MAAa,oCACX,UACA,SACA,eACA,UAKA,OAAO,IAAI,aAAgF;CACzF,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,iBAAiB,KAAK,CAAC,CAAC;CACjE,OAAO,cAAc,oBAAoB,cAAc;CAmBvD,QAAO,OAjBe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,OAAO,OAAO,MAAM,aAAa,EAC/B,kBAAkB,OAAO,wBACvB,SACA,QAAQ,eAAe,IAAI,CAC7B,CAAC,CAAC,KACA,OAAO,eAAe,iBAAiB,WAA0C,CACnF,EACF,CAAC;CACH,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,yBACX,aAEA,MAAM,OACJ,kBACA,OAAO,IAAI,WAAW,UAAU,MAAM,gBAAgB,CACxD"}
@@ -0,0 +1 @@
1
+ import "@yielded/auth-persistence/Adapter";
@@ -1,27 +1,29 @@
1
+ import "./session-sql.mjs";
2
+ import "./standalone-guard.mjs";
1
3
  import { Context, Effect, Layer } from "effect";
2
4
  import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
3
5
  import { AuthenticationAuthority, PendingAuthentication, SessionRepository, SessionStepUpPersistence, SessionUnavailable, SignedSessionValidity, StatefulSessionPersistence } from "@yielded/auth/Sessions";
4
6
  import "effect/sql/SqlError";
5
7
  //#region src/drizzle/session-target.d.ts
6
- export declare const authenticationAuthorityLayer: (services: Effect.Effect<{
8
+ export declare const authenticationAuthorityLayer: <E, R>(services: Effect.Effect<{
7
9
  readonly authenticationAuthority: AuthenticationAuthority["Service"];
8
- }, never, LifecycleHooks>) => Layer.Layer<AuthenticationAuthority, never, LifecycleHooks>;
9
- export declare const statefulSessionLayers: <Claims>(module: {
10
+ }, E, R>) => Layer.Layer<AuthenticationAuthority, E, Exclude<R, import("effect/Scope").Scope>>;
11
+ export declare const statefulSessionLayers: <Claims, E, R>(module: {
10
12
  readonly StatefulSessionPersistence: any;
11
13
  readonly SessionRepository: any;
12
14
  }, services: Effect.Effect<{
13
15
  readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;
14
16
  readonly sessionRepository: SessionRepository;
15
- }, never, LifecycleHooks>) => Layer.Layer<unknown, never, LifecycleHooks>;
16
- export declare const pendingAuthenticationLayer: <Claims>(module: {
17
+ }, E, R>) => Layer.Layer<unknown, E, Exclude<R, import("effect/Scope").Scope>>;
18
+ export declare const pendingAuthenticationLayer: <Claims, E, R>(module: {
17
19
  readonly PendingAuthentication: any;
18
20
  }, services: Effect.Effect<{
19
21
  readonly pendingAuthentication: PendingAuthentication<Claims>;
20
- }, never, LifecycleHooks>) => Layer.Layer<unknown, never, LifecycleHooks>;
21
- export declare const signedSessionValidityLayer: (module: {
22
+ }, E, R>) => Layer.Layer<unknown, E, Exclude<R, import("effect/Scope").Scope>>;
23
+ export declare const signedSessionValidityLayer: <E, R>(module: {
22
24
  readonly SignedSessionValidity: any;
23
25
  }, services: Effect.Effect<{
24
26
  readonly signedSessionValidity: SignedSessionValidity;
25
- }, never, LifecycleHooks>) => Layer.Layer<unknown, never, LifecycleHooks>;
27
+ }, E, R>) => Layer.Layer<unknown, E, Exclude<R, import("effect/Scope").Scope>>;
26
28
  //#endregion
27
29
  //# sourceMappingURL=session-target.d.mts.map
@@ -4,16 +4,16 @@ import { Effect, Layer } from "effect";
4
4
  import { coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
5
5
  import { AuthenticationAuthority, SessionUnavailable } from "@yielded/auth/Sessions";
6
6
  //#region src/drizzle/session-target.ts
7
- const sqlClientSessionStandaloneGuard = (database) => sqlClientStandaloneGuard(database, () => SessionUnavailable.make({}));
7
+ const sqlClientSessionStandaloneGuard = (service) => sqlClientStandaloneGuard(service, () => SessionUnavailable.make({}));
8
8
  const options = (configuration, transactionBound = false) => ({
9
9
  mode: configuration.mode,
10
10
  locking: configuration.locking,
11
11
  standaloneGuard: transactionBound ? Effect.void : configuration.standaloneGuard
12
12
  });
13
- const makeTargetAuthenticationAuthorityServices = (database, mapping, configuration) => Effect.map(makeSqlAuthenticationAuthority(database, mapping, options(configuration)), (authenticationAuthority) => ({ authenticationAuthority }));
14
- const makeTargetPendingAuthenticationServices = (database, mapping, configuration) => Effect.map(makeSqlPendingAuthentication(database, mapping, options(configuration)), (pendingAuthentication) => ({ pendingAuthentication }));
15
- const makeTargetStatefulSessionServices = (database, mapping, configuration) => makeSqlStatefulSessions(database, mapping, options(configuration));
16
- const makeTargetSignedSessionValidityServices = (database, mapping, configuration) => Effect.map(makeSqlSignedValidity(database, mapping, options(configuration)), (signedSessionValidity) => ({ signedSessionValidity }));
13
+ const makeTargetAuthenticationAuthorityServices = (mapping, configuration) => Effect.map(makeSqlAuthenticationAuthority(mapping, options(configuration)), (authenticationAuthority) => ({ authenticationAuthority }));
14
+ const makeTargetPendingAuthenticationServices = (mapping, configuration) => Effect.map(makeSqlPendingAuthentication(mapping, options(configuration)), (pendingAuthentication) => ({ pendingAuthentication }));
15
+ const makeTargetStatefulSessionServices = (mapping, configuration) => makeSqlStatefulSessions(mapping, options(configuration));
16
+ const makeTargetSignedSessionValidityServices = (mapping, configuration) => Effect.map(makeSqlSignedValidity(mapping, options(configuration)), (signedSessionValidity) => ({ signedSessionValidity }));
17
17
  /**
18
18
  * The native transaction is the root commit owner. Interruption or owner
19
19
  * failure rolls it back and discards the child journal; this adapter performs
@@ -30,16 +30,16 @@ const coordinate = (database, configuration, make, owner) => Effect.gen(function
30
30
  return yield* owner(transaction, yield* make(transaction));
31
31
  }).pipe(Effect.provideService(CurrentSessionSql, transaction))), { mode: configuration.mode })).value;
32
32
  });
33
- const coordinateTargetAuthenticationAuthority = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlAuthenticationAuthority(transaction, mapping, options(configuration, true)), (authenticationAuthority) => ({ authenticationAuthority })), owner);
34
- const coordinateTargetPendingAuthentication = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlPendingAuthentication(transaction, mapping, options(configuration, true)), (pendingAuthentication) => ({ pendingAuthentication })), owner);
35
- const coordinateTargetStatefulSessions = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => makeSqlStatefulSessions(transaction, mapping, options(configuration, true)), owner);
36
- const coordinateTargetSignedSessionValidity = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlSignedValidity(transaction, mapping, options(configuration, true)), (signedSessionValidity) => ({ signedSessionValidity })), owner);
33
+ const coordinateTargetAuthenticationAuthority = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlAuthenticationAuthority(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (authenticationAuthority) => ({ authenticationAuthority })), owner);
34
+ const coordinateTargetPendingAuthentication = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlPendingAuthentication(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (pendingAuthentication) => ({ pendingAuthentication })), owner);
35
+ const coordinateTargetStatefulSessions = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => makeSqlStatefulSessions(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), owner);
36
+ const coordinateTargetSignedSessionValidity = (database, mapping, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlSignedValidity(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (signedSessionValidity) => ({ signedSessionValidity })), owner);
37
37
  const authenticationAuthorityLayer = (services) => Layer.effect(AuthenticationAuthority, Effect.map(services, (value) => value.authenticationAuthority));
38
38
  const statefulSessionLayers = (module, services) => Layer.merge(Layer.effect(module.StatefulSessionPersistence, Effect.map(services, (value) => value.statefulSessionPersistence)), Layer.effect(module.SessionRepository, Effect.map(services, (value) => value.sessionRepository)));
39
39
  const pendingAuthenticationLayer = (module, services) => Layer.effect(module.PendingAuthentication, Effect.map(services, (value) => value.pendingAuthentication));
40
40
  const signedSessionValidityLayer = (module, services) => Layer.effect(module.SignedSessionValidity, Effect.map(services, (value) => value.signedSessionValidity));
41
- const makeTargetSessionStepUpServices = (database, mapping, target, configuration) => Effect.map(makeSqlSessionStepUp(database, mapping, options(configuration)), (sessionStepUpPersistence) => ({ sessionStepUpPersistence: target.of(sessionStepUpPersistence) }));
42
- const coordinateTargetSessionStepUp = (database, mapping, target, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlSessionStepUp(transaction, mapping, options(configuration, true)), (sessionStepUpPersistence) => ({ sessionStepUpPersistence: target.of(sessionStepUpPersistence) })), owner);
41
+ const makeTargetSessionStepUpServices = (mapping, target, configuration) => Effect.map(makeSqlSessionStepUp(mapping, options(configuration)), (sessionStepUpPersistence) => ({ sessionStepUpPersistence: target.of(sessionStepUpPersistence) }));
42
+ const coordinateTargetSessionStepUp = (database, mapping, target, configuration, owner) => coordinate(database, configuration, (transaction) => Effect.map(makeSqlSessionStepUp(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (sessionStepUpPersistence) => ({ sessionStepUpPersistence: target.of(sessionStepUpPersistence) })), owner);
43
43
  //#endregion
44
44
  export { authenticationAuthorityLayer, coordinateTargetAuthenticationAuthority, coordinateTargetPendingAuthentication, coordinateTargetSessionStepUp, coordinateTargetSignedSessionValidity, coordinateTargetStatefulSessions, makeTargetAuthenticationAuthorityServices, makeTargetPendingAuthenticationServices, makeTargetSessionStepUpServices, makeTargetSignedSessionValidityServices, makeTargetStatefulSessionServices, pendingAuthenticationLayer, signedSessionValidityLayer, sqlClientSessionStandaloneGuard, statefulSessionLayers };
45
45
 
@@ -1 +1 @@
1
- {"version":3,"file":"session-target.mjs","names":[],"sources":["../../src/drizzle/session-target.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n type LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport {\n AuthenticationAuthority,\n SessionUnavailable,\n type PendingAuthentication,\n type SessionRepository,\n type SignedSessionValidity,\n type StatefulSessionPersistence,\n type SessionStepUpPersistence,\n} from \"@yielded/auth/Sessions\";\n/* oxlint-disable no-explicit-any -- target entrypoints restore each concrete Drizzle database/table type. */\nimport { type Context, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport {\n makeSqlAuthenticationAuthority,\n makeSqlPendingAuthentication,\n makeSqlSignedValidity,\n makeSqlStatefulSessions,\n makeSqlSessionStepUp,\n CurrentSessionSql,\n type SessionSqlDatabase,\n type SessionSqlOptions,\n} from \"./session-sql\";\nimport { sqlClientStandaloneGuard } from \"./standalone-guard\";\n\nexport interface SessionTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, SessionUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, SessionUnavailable>;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\ntype CoordinatorError<E> = E | SessionUnavailable | HookConfigurationError | SqlError.SqlError;\n\nexport const sqlClientSessionStandaloneGuard = (\n database: unknown,\n): Effect.Effect<void, SessionUnavailable> =>\n sqlClientStandaloneGuard(database, () => SessionUnavailable.make({}));\n\nconst options = (\n configuration: SessionTargetConfiguration,\n transactionBound = false,\n): SessionSqlOptions => ({\n mode: configuration.mode,\n locking: configuration.locking,\n standaloneGuard: transactionBound ? Effect.void : configuration.standaloneGuard,\n});\n\nexport const makeTargetAuthenticationAuthorityServices = <Claims>(\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlAuthenticationAuthority<Claims>(database, mapping, options(configuration)),\n (authenticationAuthority) => ({ authenticationAuthority }),\n );\n\nexport const makeTargetPendingAuthenticationServices = <Claims>(\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlPendingAuthentication<Claims>(database, mapping, options(configuration)),\n (pendingAuthentication) => ({ pendingAuthentication }),\n );\n\nexport const makeTargetStatefulSessionServices = <Claims>(\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) => makeSqlStatefulSessions<Claims>(database, mapping, options(configuration));\n\nexport const makeTargetSignedSessionValidityServices = (\n database: any,\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlSignedValidity(database, mapping, options(configuration)),\n (signedSessionValidity) => ({\n signedSessionValidity,\n }),\n );\n\n/**\n * The native transaction is the root commit owner. Interruption or owner\n * failure rolls it back and discards the child journal; this adapter performs\n * no hidden retry. A caller that can safely retry must rerun the complete owner\n * operation and prepare fresh bearer material. The low-level coordinator keeps\n * caller failures intact, including Drizzle query wrappers, and exposes a\n * native `SqlError` when transaction acquisition fails. Captured service\n * operations normalize their own driver failures to `SessionUnavailable`.\n */\nconst coordinate = <Transaction, Services, A, E, R>(\n database: TransactionOwner<Transaction>,\n configuration: SessionTargetConfiguration,\n make: (transaction: Transaction) => Effect.Effect<Services, never, LifecycleHooks>,\n owner: (transaction: Transaction, services: Services) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, CoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, CoordinatorError<E>, R | LifecycleHooks> {\n if (yield* hasCommitScope) return yield* SessionUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n const services = yield* make(transaction);\n\n return yield* owner(transaction, services);\n }).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n );\n\n return result.value;\n });\n\nexport const coordinateTargetAuthenticationAuthority = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly authenticationAuthority: AuthenticationAuthority[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlAuthenticationAuthority<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (authenticationAuthority) => ({ authenticationAuthority }),\n ),\n owner,\n );\n\nexport const coordinateTargetPendingAuthentication = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly pendingAuthentication: PendingAuthentication<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlPendingAuthentication<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (pendingAuthentication) => ({ pendingAuthentication }),\n ),\n owner,\n );\n\nexport const coordinateTargetStatefulSessions = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n makeSqlStatefulSessions<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n owner,\n );\n\nexport const coordinateTargetSignedSessionValidity = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly signedSessionValidity: SignedSessionValidity },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlSignedValidity(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (signedSessionValidity) => ({ signedSessionValidity }),\n ),\n owner,\n );\n\nexport const authenticationAuthorityLayer = (\n services: Effect.Effect<\n {\n readonly authenticationAuthority: AuthenticationAuthority[\"Service\"];\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n AuthenticationAuthority,\n Effect.map(services, (value) => value.authenticationAuthority),\n );\n\nexport const statefulSessionLayers = <Claims>(\n module: {\n readonly StatefulSessionPersistence: any;\n readonly SessionRepository: any;\n },\n services: Effect.Effect<\n {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.merge(\n Layer.effect(\n module.StatefulSessionPersistence,\n Effect.map(services, (value) => value.statefulSessionPersistence),\n ),\n Layer.effect(\n module.SessionRepository,\n Effect.map(services, (value) => value.sessionRepository),\n ),\n );\n\nexport const pendingAuthenticationLayer = <Claims>(\n module: { readonly PendingAuthentication: any },\n services: Effect.Effect<\n {\n readonly pendingAuthentication: PendingAuthentication<Claims>;\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n module.PendingAuthentication,\n Effect.map(services, (value) => value.pendingAuthentication),\n );\n\nexport const signedSessionValidityLayer = (\n module: { readonly SignedSessionValidity: any },\n services: Effect.Effect<\n {\n readonly signedSessionValidity: SignedSessionValidity;\n },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n module.SignedSessionValidity,\n Effect.map(services, (value) => value.signedSessionValidity),\n );\n\nexport const makeTargetSessionStepUpServices = <Claims, Id>(\n database: any,\n mapping: any,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlSessionStepUp<Claims>(database, mapping, options(configuration)),\n (sessionStepUpPersistence) => ({\n sessionStepUpPersistence: target.of(sessionStepUpPersistence),\n }),\n );\n\nexport const coordinateTargetSessionStepUp = <Claims, Id, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlSessionStepUp<Claims>(\n transaction as unknown as SessionSqlDatabase,\n mapping,\n options(configuration, true),\n ),\n (sessionStepUpPersistence) => ({\n sessionStepUpPersistence: target.of(sessionStepUpPersistence),\n }),\n ),\n owner,\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"session-target.mjs","names":[],"sources":["../../src/drizzle/session-target.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n type LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport {\n AuthenticationAuthority,\n SessionUnavailable,\n type PendingAuthentication,\n type SessionRepository,\n type SignedSessionValidity,\n type StatefulSessionPersistence,\n type SessionStepUpPersistence,\n} from \"@yielded/auth/Sessions\";\n/* oxlint-disable no-explicit-any -- target entrypoints restore each concrete Drizzle database/table type. */\nimport { type Context, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/sql/SqlError\";\n\nimport {\n makeSqlAuthenticationAuthority,\n makeSqlPendingAuthentication,\n makeSqlSignedValidity,\n makeSqlStatefulSessions,\n makeSqlSessionStepUp,\n CurrentSessionSql,\n type SessionSqlDatabase,\n type SessionSqlOptions,\n} from \"./session-sql\";\nimport { sqlClientStandaloneGuard, type TransactionService } from \"./standalone-guard\";\n\nexport interface SessionTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, SessionUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, SessionUnavailable>;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\ntype CoordinatorError<E> = E | SessionUnavailable | HookConfigurationError | SqlError.SqlError;\n\nexport const sqlClientSessionStandaloneGuard = (\n service: TransactionService | undefined,\n): Effect.Effect<void, SessionUnavailable> =>\n sqlClientStandaloneGuard(service, () => SessionUnavailable.make({}));\n\nconst options = (\n configuration: SessionTargetConfiguration,\n transactionBound = false,\n): SessionSqlOptions => ({\n mode: configuration.mode,\n locking: configuration.locking,\n standaloneGuard: transactionBound ? Effect.void : configuration.standaloneGuard,\n});\n\nexport const makeTargetAuthenticationAuthorityServices = <Claims>(\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlAuthenticationAuthority<Claims>(mapping, options(configuration)),\n (authenticationAuthority) => ({ authenticationAuthority }),\n );\n\nexport const makeTargetPendingAuthenticationServices = <Claims>(\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlPendingAuthentication<Claims>(mapping, options(configuration)),\n (pendingAuthentication) => ({ pendingAuthentication }),\n );\n\nexport const makeTargetStatefulSessionServices = <Claims>(\n mapping: any,\n configuration: SessionTargetConfiguration,\n) => makeSqlStatefulSessions<Claims>(mapping, options(configuration));\n\nexport const makeTargetSignedSessionValidityServices = (\n mapping: any,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(makeSqlSignedValidity(mapping, options(configuration)), (signedSessionValidity) => ({\n signedSessionValidity,\n }));\n\n/**\n * The native transaction is the root commit owner. Interruption or owner\n * failure rolls it back and discards the child journal; this adapter performs\n * no hidden retry. A caller that can safely retry must rerun the complete owner\n * operation and prepare fresh bearer material. The low-level coordinator keeps\n * caller failures intact, including Drizzle query wrappers, and exposes a\n * native `SqlError` when transaction acquisition fails. Captured service\n * operations normalize their own driver failures to `SessionUnavailable`.\n */\nconst coordinate = <Transaction, Services, A, E, R>(\n database: TransactionOwner<Transaction>,\n configuration: SessionTargetConfiguration,\n make: (transaction: Transaction) => Effect.Effect<Services, never, LifecycleHooks>,\n owner: (transaction: Transaction, services: Services) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, CoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, CoordinatorError<E>, R | LifecycleHooks> {\n if (yield* hasCommitScope) return yield* SessionUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n const services = yield* make(transaction);\n\n return yield* owner(transaction, services);\n }).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n );\n\n return result.value;\n });\n\nexport const coordinateTargetAuthenticationAuthority = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly authenticationAuthority: AuthenticationAuthority[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlAuthenticationAuthority<Claims>(mapping, options(configuration, true)).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n (authenticationAuthority) => ({ authenticationAuthority }),\n ),\n owner,\n );\n\nexport const coordinateTargetPendingAuthentication = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly pendingAuthentication: PendingAuthentication<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlPendingAuthentication<Claims>(mapping, options(configuration, true)).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n (pendingAuthentication) => ({ pendingAuthentication }),\n ),\n owner,\n );\n\nexport const coordinateTargetStatefulSessions = <Claims, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n makeSqlStatefulSessions<Claims>(mapping, options(configuration, true)).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n owner,\n );\n\nexport const coordinateTargetSignedSessionValidity = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly signedSessionValidity: SignedSessionValidity },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlSignedValidity(mapping, options(configuration, true)).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n (signedSessionValidity) => ({ signedSessionValidity }),\n ),\n owner,\n );\n\nexport const authenticationAuthorityLayer = <E, R>(\n services: Effect.Effect<\n {\n readonly authenticationAuthority: AuthenticationAuthority[\"Service\"];\n },\n E,\n R\n >,\n) =>\n Layer.effect(\n AuthenticationAuthority,\n Effect.map(services, (value) => value.authenticationAuthority),\n );\n\nexport const statefulSessionLayers = <Claims, E, R>(\n module: {\n readonly StatefulSessionPersistence: any;\n readonly SessionRepository: any;\n },\n services: Effect.Effect<\n {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n E,\n R\n >,\n) =>\n Layer.merge(\n Layer.effect(\n module.StatefulSessionPersistence,\n Effect.map(services, (value) => value.statefulSessionPersistence),\n ),\n Layer.effect(\n module.SessionRepository,\n Effect.map(services, (value) => value.sessionRepository),\n ),\n );\n\nexport const pendingAuthenticationLayer = <Claims, E, R>(\n module: { readonly PendingAuthentication: any },\n services: Effect.Effect<\n {\n readonly pendingAuthentication: PendingAuthentication<Claims>;\n },\n E,\n R\n >,\n) =>\n Layer.effect(\n module.PendingAuthentication,\n Effect.map(services, (value) => value.pendingAuthentication),\n );\n\nexport const signedSessionValidityLayer = <E, R>(\n module: { readonly SignedSessionValidity: any },\n services: Effect.Effect<\n {\n readonly signedSessionValidity: SignedSessionValidity;\n },\n E,\n R\n >,\n) =>\n Layer.effect(\n module.SignedSessionValidity,\n Effect.map(services, (value) => value.signedSessionValidity),\n );\n\nexport const makeTargetSessionStepUpServices = <Claims, Id>(\n mapping: any,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n) =>\n Effect.map(\n makeSqlSessionStepUp<Claims>(mapping, options(configuration)),\n (sessionStepUpPersistence) => ({\n sessionStepUpPersistence: target.of(sessionStepUpPersistence),\n }),\n );\n\nexport const coordinateTargetSessionStepUp = <Claims, Id, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n configuration: SessionTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },\n ) => Effect.Effect<A, E, R>,\n) =>\n coordinate(\n database,\n configuration,\n (transaction) =>\n Effect.map(\n makeSqlSessionStepUp<Claims>(mapping, options(configuration, true)).pipe(\n Effect.provideService(CurrentSessionSql, transaction as unknown as SessionSqlDatabase),\n ),\n (sessionStepUpPersistence) => ({\n sessionStepUpPersistence: target.of(sessionStepUpPersistence),\n }),\n ),\n owner,\n );\n"],"mappings":"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"}
@@ -1,4 +1,7 @@
1
+ import { acquireTransactionService, transactionService } from "./standalone-guard.mjs";
2
+ import { CurrentEmailSql } from "./email-sql.mjs";
1
3
  import { coordinateTargetEmailAddress, coordinateTargetEmailRegistration, makeTargetEmailAddressServices, makeTargetEmailRegistrationServices, makeTargetEmailSignInServices } from "./email-target.mjs";
4
+ import { nativeDatabase } from "./native-database.mjs";
2
5
  import { Context, Effect } from "effect";
3
6
  import { EmailAddressPersistence } from "@yielded/auth/Email";
4
7
  //#region src/drizzle/sqlite-emails.ts
@@ -15,8 +18,9 @@ const sqliteEmailConfiguration = (mode, standaloneGuard, proofStandaloneGuard, c
15
18
  insertIfAbsent: (query) => query.onConflictDoNothing()
16
19
  }
17
20
  });
18
- const makeSqliteEmailTarget = (configuration) => {
19
- const configurationFor = (database) => typeof configuration === "function" ? configuration(database) : configuration;
21
+ const makeSqliteEmailTarget = (databaseService, configuration) => {
22
+ const configurationFor = (database) => typeof configuration === "function" ? configuration(transactionService(database)) : configuration;
23
+ const standaloneConfiguration = typeof configuration === "function" ? Effect.map(acquireTransactionService(databaseService), configuration) : Effect.succeed(configuration);
20
24
  function coordinateEmailAddress(acquire, options, body) {
21
25
  return Effect.flatMap(acquire, (database) => coordinateTargetEmailAddress(database, options.mapping, options.proofMapping, configurationFor(database), (transaction, services) => {
22
26
  const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);
@@ -32,10 +36,10 @@ const makeSqliteEmailTarget = (configuration) => {
32
36
  }));
33
37
  }
34
38
  return {
35
- makeEmailSignInServices: (database, mapping) => makeTargetEmailSignInServices(database, mapping, configurationFor(database)),
36
- makeEmailAddressServices: (database, mapping, proofMapping) => makeTargetEmailAddressServices(database, mapping, proofMapping, configurationFor(database)),
39
+ makeEmailSignInServices: (mapping) => Effect.flatMap(standaloneConfiguration, (configuration) => makeTargetEmailSignInServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),
40
+ makeEmailAddressServices: (mapping, proofMapping) => Effect.flatMap(standaloneConfiguration, (configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),
37
41
  coordinateEmailAddress,
38
- makeEmailRegistrationServices: (database, mapping, proofMapping) => makeTargetEmailRegistrationServices(database, mapping, proofMapping, configurationFor(database)),
42
+ makeEmailRegistrationServices: (mapping, proofMapping) => Effect.flatMap(standaloneConfiguration, (configuration) => makeTargetEmailRegistrationServices(mapping, proofMapping, configuration)).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),
39
43
  coordinateEmailRegistration
40
44
  };
41
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-emails.mjs","names":[],"sources":["../../src/drizzle/sqlite-emails.ts"],"sourcesContent":["import { EmailAddressPersistence, type EmailUnavailable } from \"@yielded/auth/Email\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectLibsqlDatabase } from \"drizzle-orm/effect-libsql\";\nimport type { EffectSQLiteBunDatabase } from \"drizzle-orm/effect-sqlite-bun\";\nimport type { EffectSQLiteDoDatabase as DODatabase } from \"drizzle-orm/effect-sqlite-do\";\nimport type { EffectSQLiteNodeDatabase as NodeDatabase } from \"drizzle-orm/effect-sqlite-node\";\nimport type { EffectSQLiteWasmDatabase as WasmDatabase } from \"drizzle-orm/effect-sqlite-wasm\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport type {\n EmailAddressMapping,\n EmailRegistrationMapping,\n EmailSignInMapping,\n} from \"./email-model\";\nimport type { EmailRegistrationAuthority } from \"./email-registration\";\nimport type { EmailSqlQuery } from \"./email-sql\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailRegistrationServices,\n makeTargetEmailSignInServices,\n type EmailTargetConfiguration,\n} from \"./email-target\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\nexport type SqliteEmailDatabase =\n | NodeDatabase<AnyRelations>\n | EffectSQLiteBunDatabase<AnyRelations>\n | EffectLibsqlDatabase<AnyRelations>\n | WasmDatabase<AnyRelations>\n | DODatabase<AnyRelations>;\n\ntype TransactionOf<D extends SqliteEmailDatabase> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\ntype ProofMapping = ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nexport const sqliteEmailConfiguration = (\n mode: \"interactive\" | \"synchronous\",\n standaloneGuard: EmailTargetConfiguration[\"standaloneGuard\"],\n proofStandaloneGuard: EmailTargetConfiguration[\"proof\"][\"standaloneGuard\"],\n coordinatorGuard?: EmailTargetConfiguration[\"coordinatorGuard\"],\n): EmailTargetConfiguration => ({\n mode,\n locking: false,\n standaloneGuard,\n ...(coordinatorGuard === undefined ? {} : { coordinatorGuard }),\n generatedSubjectRows: (query: EmailSqlQuery) => query.returning(),\n proof: {\n mode,\n locking: false,\n standaloneGuard: proofStandaloneGuard,\n insertIfAbsent: (query: ProofSqlQuery) => query.onConflictDoNothing(),\n },\n});\n\nexport const makeSqliteEmailTarget = <\n D extends SqliteEmailDatabase,\n Synchronous extends boolean = false,\n>(\n configuration: EmailTargetConfiguration | ((database: D) => EmailTargetConfiguration),\n) => {\n const configurationFor = (database: D) =>\n typeof configuration === \"function\" ? configuration(database) : configuration;\n\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<EmailAddressPersistence> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, EmailAddressPersistence>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<\n Out,\n E,\n Synchronous extends true ? NoInfer<EmailAddressPersistence | TxId> : R\n >,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, EmailAddressPersistence | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailAddress<\n TransactionOf<Database>,\n Out,\n E,\n Exclude<R, EmailAddressPersistence>\n >(\n database,\n options.mapping,\n options.proofMapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId | TxId> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailRegistration<\n Registration,\n TransactionOf<Database>,\n Out,\n E,\n Exclude<R, TargetId>\n >(\n database,\n options.mapping,\n options.proofMapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n\n return {\n makeEmailSignInServices: <\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: EmailSignInMapping<S, I, C, NativeId>,\n ) => makeTargetEmailSignInServices(database, mapping, configurationFor(database)),\n makeEmailAddressServices: <\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,\n proofMapping: ProofMapping,\n ) =>\n makeTargetEmailAddressServices(database, mapping, proofMapping, configurationFor(database)),\n coordinateEmailAddress,\n makeEmailRegistrationServices: <\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n >(\n database: D,\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n proofMapping: ProofMapping,\n ) =>\n makeTargetEmailRegistrationServices<Registration>(\n database,\n mapping,\n proofMapping,\n configurationFor(database),\n ),\n coordinateEmailRegistration,\n };\n};\n"],"mappings":";;;;AAuDA,MAAa,4BACX,MACA,iBACA,sBACA,sBAC8B;CAC9B;CACA,SAAS;CACT;CACA,GAAI,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB;CAC7D,uBAAuB,UAAyB,MAAM,UAAU;CAChE,OAAO;EACL;EACA,SAAS;EACT,iBAAiB;EACjB,iBAAiB,UAAyB,MAAM,oBAAoB;CACtE;AACF;AAEA,MAAa,yBAIX,kBACG;CACH,MAAM,oBAAoB,aACxB,OAAO,kBAAkB,aAAa,cAAc,QAAQ,IAAI;CAgElE,SAAS,uBAgBP,SACA,SAKA,MAKA;EACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,6BAME,UACA,QAAQ,SACR,QAAQ,cACR,iBAAiB,QAAQ,IAEvB,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,yBAAyB,SAAS,uBAAuB;GACvF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CACF;CACF;CAiEA,SAAS,4BAkBP,SACA,SAMA,MAKA;EACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,kCAOE,UACA,QAAQ,SACR,QAAQ,cACR,iBAAiB,QAAQ,IAEvB,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;GAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CACF;CACF;CAEA,OAAO;EACL,0BAME,UACA,YACG,8BAA8B,UAAU,SAAS,iBAAiB,QAAQ,CAAC;EAChF,2BAQE,UACA,SACA,iBAEA,+BAA+B,UAAU,SAAS,cAAc,iBAAiB,QAAQ,CAAC;EAC5F;EACA,gCASE,UACA,SACA,iBAEA,oCACE,UACA,SACA,cACA,iBAAiB,QAAQ,CAC3B;EACF;CACF;AACF"}
1
+ {"version":3,"file":"sqlite-emails.mjs","names":[],"sources":["../../src/drizzle/sqlite-emails.ts"],"sourcesContent":["import { EmailAddressPersistence, type EmailUnavailable } from \"@yielded/auth/Email\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectLibsqlDatabase } from \"drizzle-orm/effect-libsql\";\nimport type { EffectSQLiteBunDatabase } from \"drizzle-orm/effect-sqlite-bun\";\nimport type { EffectSQLiteDoDatabase as DODatabase } from \"drizzle-orm/effect-sqlite-do\";\nimport type { EffectSQLiteNodeDatabase as NodeDatabase } from \"drizzle-orm/effect-sqlite-node\";\nimport type { EffectSQLiteWasmDatabase as WasmDatabase } from \"drizzle-orm/effect-sqlite-wasm\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport type {\n EmailAddressMapping,\n EmailRegistrationMapping,\n EmailSignInMapping,\n} from \"./email-model\";\nimport type { EmailRegistrationAuthority } from \"./email-registration\";\nimport { CurrentEmailSql } from \"./email-sql\";\nimport type { EmailSqlQuery } from \"./email-sql\";\nimport {\n coordinateTargetEmailAddress,\n coordinateTargetEmailRegistration,\n makeTargetEmailAddressServices,\n makeTargetEmailRegistrationServices,\n makeTargetEmailSignInServices,\n type EmailTargetConfiguration,\n} from \"./email-target\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\nexport type SqliteEmailDatabase =\n | NodeDatabase<AnyRelations>\n | EffectSQLiteBunDatabase<AnyRelations>\n | EffectLibsqlDatabase<AnyRelations>\n | WasmDatabase<AnyRelations>\n | DODatabase<AnyRelations>;\n\ntype TransactionOf<D extends SqliteEmailDatabase> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\ntype ProofMapping = ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nexport const sqliteEmailConfiguration = (\n mode: \"interactive\" | \"synchronous\",\n standaloneGuard: EmailTargetConfiguration[\"standaloneGuard\"],\n proofStandaloneGuard: EmailTargetConfiguration[\"proof\"][\"standaloneGuard\"],\n coordinatorGuard?: EmailTargetConfiguration[\"coordinatorGuard\"],\n): EmailTargetConfiguration => ({\n mode,\n locking: false,\n standaloneGuard,\n ...(coordinatorGuard === undefined ? {} : { coordinatorGuard }),\n generatedSubjectRows: (query: EmailSqlQuery) => query.returning(),\n proof: {\n mode,\n locking: false,\n standaloneGuard: proofStandaloneGuard,\n insertIfAbsent: (query: ProofSqlQuery) => query.onConflictDoNothing(),\n },\n});\n\nexport const makeSqliteEmailTarget = <\n DatabaseId,\n D extends SqliteEmailDatabase,\n Synchronous extends boolean = false,\n>(\n databaseService: Context.Service<DatabaseId, D>,\n configuration:\n | EmailTargetConfiguration\n | ((service: TransactionService | undefined) => EmailTargetConfiguration),\n) => {\n const configurationFor = (database: D) =>\n typeof configuration === \"function\"\n ? configuration(transactionService(database))\n : configuration;\n\n const standaloneConfiguration =\n typeof configuration === \"function\"\n ? Effect.map(acquireTransactionService(databaseService), configuration)\n : Effect.succeed(configuration);\n\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<EmailAddressPersistence> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, EmailAddressPersistence>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<\n Out,\n E,\n Synchronous extends true ? NoInfer<EmailAddressPersistence | TxId> : R\n >,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, EmailAddressPersistence | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailAddress<\n Database extends D,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailAddress<\n TransactionOf<Database>,\n Out,\n E,\n Exclude<R, EmailAddressPersistence>\n >(\n database,\n options.mapping,\n options.proofMapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly emailAddressPersistence: EmailAddressPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, Synchronous extends true ? NoInfer<TargetId | TxId> : R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, TargetId | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateEmailRegistration<\n Database extends D,\n TargetId,\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly proofMapping: ProofMapping;\n readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<Database>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n ): Effect.Effect<\n Out,\n E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetEmailRegistration<\n Registration,\n TransactionOf<Database>,\n Out,\n E,\n Exclude<R, TargetId>\n >(\n database,\n options.mapping,\n options.proofMapping,\n configurationFor(database),\n (\n transaction: TransactionOf<Database>,\n services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ),\n );\n }\n\n return {\n makeEmailSignInServices: <\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n NativeId,\n >(\n mapping: EmailSignInMapping<S, I, C, NativeId>,\n ) =>\n Effect.flatMap(standaloneConfiguration, (configuration) =>\n makeTargetEmailSignInServices(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),\n makeEmailAddressServices: <\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n M extends AnySQLiteTable,\n NativeId,\n >(\n mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,\n proofMapping: ProofMapping,\n ) =>\n Effect.flatMap(standaloneConfiguration, (configuration) =>\n makeTargetEmailAddressServices(mapping, proofMapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),\n coordinateEmailAddress,\n makeEmailRegistrationServices: <\n Registration,\n S extends AnySQLiteTable,\n I extends AnySQLiteTable,\n C extends AnySQLiteTable,\n AC extends AnySQLiteTable,\n Rq extends AnySQLiteTable,\n NativeId,\n >(\n mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n proofMapping: ProofMapping,\n ) =>\n Effect.flatMap(standaloneConfiguration, (configuration) =>\n makeTargetEmailRegistrationServices<Registration>(mapping, proofMapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(databaseService))),\n coordinateEmailRegistration,\n };\n};\n"],"mappings":";;;;;;;AA8DA,MAAa,4BACX,MACA,iBACA,sBACA,sBAC8B;CAC9B;CACA,SAAS;CACT;CACA,GAAI,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB;CAC7D,uBAAuB,UAAyB,MAAM,UAAU;CAChE,OAAO;EACL;EACA,SAAS;EACT,iBAAiB;EACjB,iBAAiB,UAAyB,MAAM,oBAAoB;CACtE;AACF;AAEA,MAAa,yBAKX,iBACA,kBAGG;CACH,MAAM,oBAAoB,aACxB,OAAO,kBAAkB,aACrB,cAAc,mBAAmB,QAAQ,CAAC,IAC1C;CAEN,MAAM,0BACJ,OAAO,kBAAkB,aACrB,OAAO,IAAI,0BAA0B,eAAe,GAAG,aAAa,IACpE,OAAO,QAAQ,aAAa;CAgElC,SAAS,uBAgBP,SACA,SAKA,MAKA;EACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,6BAME,UACA,QAAQ,SACR,QAAQ,cACR,iBAAiB,QAAQ,IAEvB,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,yBAAyB,SAAS,uBAAuB;GACvF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CACF;CACF;CAiEA,SAAS,4BAkBP,SACA,SAMA,MAKA;EACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,kCAOE,UACA,QAAQ,SACR,QAAQ,cACR,iBAAiB,QAAQ,IAEvB,aACA,aACG;GACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;GAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;GAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;EAC1F,CACF,CACF;CACF;CAEA,OAAO;EACL,0BAME,YAEA,OAAO,QAAQ,0BAA0B,kBACvC,8BAA8B,SAAS,aAAa,CACtD,CAAC,CAAC,KAAK,OAAO,qBAAqB,iBAAiB,eAAe,eAAe,CAAC,CAAC;EACtF,2BAQE,SACA,iBAEA,OAAO,QAAQ,0BAA0B,kBACvC,+BAA+B,SAAS,cAAc,aAAa,CACrE,CAAC,CAAC,KAAK,OAAO,qBAAqB,iBAAiB,eAAe,eAAe,CAAC,CAAC;EACtF;EACA,gCASE,SACA,iBAEA,OAAO,QAAQ,0BAA0B,kBACvC,oCAAkD,SAAS,cAAc,aAAa,CACxF,CAAC,CAAC,KAAK,OAAO,qBAAqB,iBAAiB,eAAe,eAAe,CAAC,CAAC;EACtF;CACF;AACF"}
@@ -1,4 +1,5 @@
1
- import { PersistenceMappingError, column, isMappedConstraintConflict, provisioningFingerprint } from "./model.mjs";
1
+ import { PersistenceMappingError as PersistenceMappingError$1, column, isMappedConstraintConflict, provisioningFingerprint } from "./model.mjs";
2
+ import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
2
3
  import { ExternalIdentityMutation, IdentityConflict, IdentityUnavailable, SubjectProvisioned, SubjectProvisioner } from "@yielded/auth/Identity";
3
4
  import { and, eq } from "drizzle-orm";
4
5
  import { Cause, Effect, Schema } from "effect";
@@ -7,8 +8,8 @@ import { reportPersistenceFailure } from "@yielded/auth/Persistence";
7
8
  const unavailable = () => IdentityUnavailable.make();
8
9
  const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
9
10
  const mapUnavailable = (effect) => reportPersistenceFailure(effect, isIdentityFailure).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, (error) => isIdentityFailure(error) ? error : unavailable()))));
10
- const makeSqliteSubjectProvisioningServices = (database, mapping, mode) => {
11
- const db = database;
11
+ const makeSqliteSubjectProvisioningServices = Effect.fnUntraced(function* (mapping, mode) {
12
+ const db = yield* NativeDatabase;
12
13
  const requestTable = mapping.provisioningRequest.table;
13
14
  const requestIdColumn = column(requestTable, mapping.provisioningRequest.requestId);
14
15
  const requestFingerprintColumn = column(requestTable, mapping.provisioningRequest.fingerprint);
@@ -35,7 +36,7 @@ const makeSqliteSubjectProvisioningServices = (database, mapping, mode) => {
35
36
  const nativeId = yield* db.transaction((tx) => Effect.gen(function* () {
36
37
  const allocated = mode === "synchronous" ? mapping.subject.allocateIdSync?.() : mapping.subject.allocateId === void 0 ? mapping.subject.allocateIdSync?.() : yield* mapping.subject.allocateId;
37
38
  const nativeId = (yield* tx.insert(mapping.subject.table).values(mapping.subject.encodeInsert(input, allocated)).returning({ id: subjectIdColumn }))[0]?.id ?? allocated;
38
- if (nativeId === void 0) return yield* PersistenceMappingError.make({
39
+ if (nativeId === void 0) return yield* PersistenceMappingError$1.make({
39
40
  operation: "provisionSubject.generatedId",
40
41
  cause: /* @__PURE__ */ new Error("subject insert did not return its native id")
41
42
  });
@@ -54,9 +55,9 @@ const makeSqliteSubjectProvisioningServices = (database, mapping, mode) => {
54
55
  return SubjectProvisioned.make({ subjectId });
55
56
  }, mapUnavailable);
56
57
  return { subjectProvisioner: SubjectProvisioner.of({ provision }) };
57
- };
58
- const makeSqliteExternalIdentityServices = (database, mapping) => {
59
- const db = database;
58
+ });
59
+ const makeSqliteExternalIdentityServices = Effect.fnUntraced(function* (mapping) {
60
+ const db = yield* NativeDatabase;
60
61
  const externalTable = mapping.externalIdentity.table;
61
62
  const externalProviderColumn = column(externalTable, mapping.externalIdentity.provider);
62
63
  const externalIssuerColumn = column(externalTable, mapping.externalIdentity.issuer);
@@ -79,10 +80,12 @@ const makeSqliteExternalIdentityServices = (database, mapping) => {
79
80
  })))._tag === "conflict") return yield* IdentityConflict.make();
80
81
  }, mapUnavailable);
81
82
  return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) };
82
- };
83
- const makeSqliteIdentityServices = (database, mapping, mode) => ({
84
- ...makeSqliteSubjectProvisioningServices(database, mapping, mode),
85
- ...makeSqliteExternalIdentityServices(database, mapping)
83
+ });
84
+ const makeSqliteIdentityServices = Effect.fnUntraced(function* (mapping, mode) {
85
+ return {
86
+ ...yield* makeSqliteSubjectProvisioningServices(mapping, mode),
87
+ ...yield* makeSqliteExternalIdentityServices(mapping)
88
+ };
86
89
  });
87
90
  //#endregion
88
91
  export { makeSqliteExternalIdentityServices, makeSqliteIdentityServices, makeSqliteSubjectProvisioningServices };