@yielded/auth-persistence-drizzle 0.1.0-beta.14 → 0.1.0-beta.15

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 (190) hide show
  1. package/dist/D1.d.mts +123 -9
  2. package/dist/Libsql.d.mts +143 -29
  3. package/dist/Mysql2.d.mts +130 -16
  4. package/dist/Pglite.d.mts +130 -16
  5. package/dist/Postgres.d.mts +131 -17
  6. package/dist/SqliteBun.d.mts +141 -27
  7. package/dist/SqliteDo.d.mts +145 -31
  8. package/dist/SqliteNode.d.mts +135 -21
  9. package/dist/SqliteWasm.d.mts +145 -31
  10. package/dist/drizzle/d1-emails.d.mts +3 -3
  11. package/dist/drizzle/d1-emails.mjs +56 -11
  12. package/dist/drizzle/d1-emails.mjs.map +1 -1
  13. package/dist/drizzle/d1-identity.mjs +9 -2
  14. package/dist/drizzle/d1-identity.mjs.map +1 -1
  15. package/dist/drizzle/d1-oauth.d.mts +8 -8
  16. package/dist/drizzle/d1-oauth.mjs +8 -8
  17. package/dist/drizzle/d1-oauth.mjs.map +1 -1
  18. package/dist/drizzle/d1-passkey.d.mts +2 -1
  19. package/dist/drizzle/d1-passkey.mjs +10 -8
  20. package/dist/drizzle/d1-passkey.mjs.map +1 -1
  21. package/dist/drizzle/d1-password-prepared.d.mts +1 -1
  22. package/dist/drizzle/d1-password-prepared.mjs +16 -5
  23. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  24. package/dist/drizzle/d1-passwords.d.mts +2 -2
  25. package/dist/drizzle/d1-passwords.mjs +19 -6
  26. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  27. package/dist/drizzle/d1-phone.d.mts +2 -1
  28. package/dist/drizzle/d1-phone.mjs +4 -2
  29. package/dist/drizzle/d1-phone.mjs.map +1 -1
  30. package/dist/drizzle/d1-proofs.d.mts +1 -1
  31. package/dist/drizzle/d1-proofs.mjs +18 -7
  32. package/dist/drizzle/d1-proofs.mjs.map +1 -1
  33. package/dist/drizzle/d1-sessions.d.mts +6 -5
  34. package/dist/drizzle/d1-sessions.mjs +29 -19
  35. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  36. package/dist/drizzle/d1-totp.d.mts +2 -1
  37. package/dist/drizzle/d1-totp.mjs +4 -2
  38. package/dist/drizzle/d1-totp.mjs.map +1 -1
  39. package/dist/drizzle/email-registration.d.mts +5 -1
  40. package/dist/drizzle/email-registration.mjs +48 -4
  41. package/dist/drizzle/email-registration.mjs.map +1 -1
  42. package/dist/drizzle/email-target.d.mts +1 -0
  43. package/dist/drizzle/email-target.mjs +9 -0
  44. package/dist/drizzle/email-target.mjs.map +1 -1
  45. package/dist/drizzle/mysql-emails.d.mts +4 -4
  46. package/dist/drizzle/mysql-emails.mjs +8 -7
  47. package/dist/drizzle/mysql-emails.mjs.map +1 -1
  48. package/dist/drizzle/mysql-identity.mjs +11 -4
  49. package/dist/drizzle/mysql-identity.mjs.map +1 -1
  50. package/dist/drizzle/mysql-password-prepared.d.mts +2 -2
  51. package/dist/drizzle/mysql-password-prepared.mjs +4 -3
  52. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  53. package/dist/drizzle/mysql-passwords.d.mts +3 -3
  54. package/dist/drizzle/mysql-passwords.mjs +7 -6
  55. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  56. package/dist/drizzle/mysql-proofs.d.mts +2 -2
  57. package/dist/drizzle/mysql-proofs.mjs +4 -3
  58. package/dist/drizzle/mysql-proofs.mjs.map +1 -1
  59. package/dist/drizzle/mysql-sessions.d.mts +6 -6
  60. package/dist/drizzle/mysql-sessions.mjs +16 -15
  61. package/dist/drizzle/mysql-sessions.mjs.map +1 -1
  62. package/dist/drizzle/native-database.mjs +1 -1
  63. package/dist/drizzle/native-database.mjs.map +1 -1
  64. package/dist/drizzle/oauth-connected-drivers.mjs +10 -8
  65. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
  66. package/dist/drizzle/oauth-connected-flow.mjs +62 -13
  67. package/dist/drizzle/oauth-connected-flow.mjs.map +1 -1
  68. package/dist/drizzle/oauth-connected-input.mjs +6 -0
  69. package/dist/drizzle/oauth-connected-input.mjs.map +1 -1
  70. package/dist/drizzle/oauth-connected-maintenance.mjs +3 -3
  71. package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -1
  72. package/dist/drizzle/oauth-connected-target.d.mts +116 -2
  73. package/dist/drizzle/oauth-connected-target.mjs +5 -3
  74. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  75. package/dist/drizzle/oauth-drivers.mjs +8 -8
  76. package/dist/drizzle/oauth-drivers.mjs.map +1 -1
  77. package/dist/drizzle/oauth-target.d.mts +3 -3
  78. package/dist/drizzle/oauth-target.mjs +8 -6
  79. package/dist/drizzle/oauth-target.mjs.map +1 -1
  80. package/dist/drizzle/passkey-drivers.mjs +4 -4
  81. package/dist/drizzle/passkey-drivers.mjs.map +1 -1
  82. package/dist/drizzle/passkey-write-drivers.mjs +4 -4
  83. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
  84. package/dist/drizzle/passkey-write-target.d.mts +1 -1
  85. package/dist/drizzle/password-prepared-sql.mjs +5 -0
  86. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  87. package/dist/drizzle/password-prepared-target.d.mts +2 -1
  88. package/dist/drizzle/password-prepared-target.mjs +5 -0
  89. package/dist/drizzle/password-prepared-target.mjs.map +1 -1
  90. package/dist/drizzle/password-registration.d.mts +1 -1
  91. package/dist/drizzle/password-registration.mjs +2 -0
  92. package/dist/drizzle/password-registration.mjs.map +1 -1
  93. package/dist/drizzle/password-target.d.mts +1 -0
  94. package/dist/drizzle/password-target.mjs +6 -0
  95. package/dist/drizzle/password-target.mjs.map +1 -1
  96. package/dist/drizzle/pg-emails.d.mts +4 -4
  97. package/dist/drizzle/pg-emails.mjs +8 -7
  98. package/dist/drizzle/pg-emails.mjs.map +1 -1
  99. package/dist/drizzle/pg-identity.mjs +12 -5
  100. package/dist/drizzle/pg-identity.mjs.map +1 -1
  101. package/dist/drizzle/pg-password-prepared.d.mts +2 -2
  102. package/dist/drizzle/pg-password-prepared.mjs +4 -3
  103. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  104. package/dist/drizzle/pg-passwords.d.mts +3 -3
  105. package/dist/drizzle/pg-passwords.mjs +7 -6
  106. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  107. package/dist/drizzle/pg-proofs.d.mts +2 -2
  108. package/dist/drizzle/pg-proofs.mjs +4 -3
  109. package/dist/drizzle/pg-proofs.mjs.map +1 -1
  110. package/dist/drizzle/pg-sessions.d.mts +6 -6
  111. package/dist/drizzle/pg-sessions.mjs +16 -15
  112. package/dist/drizzle/pg-sessions.mjs.map +1 -1
  113. package/dist/drizzle/phone-target.mjs +11 -2
  114. package/dist/drizzle/phone-target.mjs.map +1 -1
  115. package/dist/drizzle/proof-target.d.mts +1 -0
  116. package/dist/drizzle/proof-target.mjs +2 -0
  117. package/dist/drizzle/proof-target.mjs.map +1 -1
  118. package/dist/drizzle/query-operations.mjs +2 -0
  119. package/dist/drizzle/query-operations.mjs.map +1 -1
  120. package/dist/drizzle/session-target.d.mts +1 -0
  121. package/dist/drizzle/session-target.mjs +9 -6
  122. package/dist/drizzle/session-target.mjs.map +1 -1
  123. package/dist/drizzle/sqlite-emails.mjs +8 -7
  124. package/dist/drizzle/sqlite-emails.mjs.map +1 -1
  125. package/dist/drizzle/sqlite-identity.mjs +7 -2
  126. package/dist/drizzle/sqlite-identity.mjs.map +1 -1
  127. package/dist/drizzle/sqlite-password-prepared.mjs +4 -3
  128. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  129. package/dist/drizzle/sqlite-passwords.mjs +7 -6
  130. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  131. package/dist/drizzle/sqlite-proofs.mjs +4 -3
  132. package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
  133. package/dist/drizzle/sqlite-sessions.mjs +16 -15
  134. package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
  135. package/dist/drizzle/storage-validation.mjs +234 -0
  136. package/dist/drizzle/storage-validation.mjs.map +1 -0
  137. package/dist/drizzle/totp-target.mjs +5 -2
  138. package/dist/drizzle/totp-target.mjs.map +1 -1
  139. package/dist/drizzle/transaction-mysql.mjs +1 -1
  140. package/package.json +1 -1
  141. package/src/drizzle/d1-emails.ts +158 -40
  142. package/src/drizzle/d1-identity.ts +13 -0
  143. package/src/drizzle/d1-oauth.ts +8 -8
  144. package/src/drizzle/d1-passkey.ts +10 -8
  145. package/src/drizzle/d1-password-prepared.ts +14 -2
  146. package/src/drizzle/d1-passwords.ts +22 -4
  147. package/src/drizzle/d1-phone.ts +4 -2
  148. package/src/drizzle/d1-proofs.ts +55 -3
  149. package/src/drizzle/d1-sessions.ts +67 -18
  150. package/src/drizzle/d1-totp.ts +4 -2
  151. package/src/drizzle/email-registration.ts +160 -12
  152. package/src/drizzle/email-target.ts +22 -4
  153. package/src/drizzle/mysql-emails.ts +17 -7
  154. package/src/drizzle/mysql-identity.ts +13 -0
  155. package/src/drizzle/mysql-password-prepared.ts +7 -3
  156. package/src/drizzle/mysql-passwords.ts +13 -6
  157. package/src/drizzle/mysql-proofs.ts +7 -3
  158. package/src/drizzle/mysql-sessions.ts +31 -15
  159. package/src/drizzle/native-database.ts +5 -4
  160. package/src/drizzle/oauth-connected-drivers.ts +10 -8
  161. package/src/drizzle/oauth-connected-flow.ts +98 -10
  162. package/src/drizzle/oauth-connected-input.ts +7 -0
  163. package/src/drizzle/oauth-connected-maintenance.ts +3 -2
  164. package/src/drizzle/oauth-connected-target.ts +4 -2
  165. package/src/drizzle/oauth-drivers.ts +8 -8
  166. package/src/drizzle/oauth-target.ts +13 -7
  167. package/src/drizzle/passkey-drivers.ts +4 -4
  168. package/src/drizzle/passkey-write-drivers.ts +8 -5
  169. package/src/drizzle/password-prepared-sql.ts +13 -1
  170. package/src/drizzle/password-prepared-target.ts +7 -1
  171. package/src/drizzle/password-registration.ts +10 -3
  172. package/src/drizzle/password-target.ts +22 -4
  173. package/src/drizzle/pg-emails.ts +17 -7
  174. package/src/drizzle/pg-identity.ts +13 -0
  175. package/src/drizzle/pg-password-prepared.ts +7 -3
  176. package/src/drizzle/pg-passwords.ts +13 -6
  177. package/src/drizzle/pg-proofs.ts +7 -3
  178. package/src/drizzle/pg-sessions.ts +31 -15
  179. package/src/drizzle/phone-target.ts +30 -5
  180. package/src/drizzle/proof-target.ts +10 -2
  181. package/src/drizzle/query-operations.ts +2 -0
  182. package/src/drizzle/session-target.ts +20 -3
  183. package/src/drizzle/sqlite-emails.ts +17 -7
  184. package/src/drizzle/sqlite-identity.ts +5 -0
  185. package/src/drizzle/sqlite-password-prepared.ts +7 -3
  186. package/src/drizzle/sqlite-passwords.ts +13 -6
  187. package/src/drizzle/sqlite-proofs.ts +7 -3
  188. package/src/drizzle/sqlite-sessions.ts +31 -15
  189. package/src/drizzle/storage-validation.ts +285 -0
  190. package/src/drizzle/totp-target.ts +16 -4
@@ -6,8 +6,8 @@ import { AnyRelations } from "drizzle-orm";
6
6
  import { Context, Effect } from "effect";
7
7
  import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
8
8
  import { AuthenticationAuthority, PendingAuthentication, SessionRepository, SessionStepUpPersistence, SessionUnavailable, SignedSessionValidity, StatefulSessionPersistence } from "@yielded/auth/Sessions";
9
- import { EffectPgDatabase } from "drizzle-orm/effect-pglite";
10
9
  import { AnyPgTable } from "drizzle-orm/pg-core";
10
+ import { EffectPgDatabase } from "drizzle-orm/effect-pglite";
11
11
  import { EffectPgDatabase as EffectPgDatabase$1 } from "drizzle-orm/effect-postgres";
12
12
  import { SqlError } from "effect/sql/SqlError";
13
13
  //#region src/drizzle/pg-sessions.d.ts
@@ -25,17 +25,17 @@ export declare const makePgAuthenticationAuthorityServices: <Claims, Subject ext
25
25
  readonly pending?: import("@yielded/auth/Sessions").PendingConsumption;
26
26
  }, prepare: import("@yielded/auth/Sessions").PrepareSessionCommit<void, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, import("@yielded/auth/Sessions").StaleAuthentication | import("@yielded/auth/Sessions").PendingAuthenticationInvalid | SessionUnavailable>;
27
27
  };
28
- }, never, Database$1 | LifecycleHooks>;
28
+ }, SessionUnavailable, Database$1 | LifecycleHooks>;
29
29
  export declare const makePgPendingAuthenticationServices: <Claims, Subject extends AnyPgTable, Credential extends AnyPgTable, Pending extends AnyPgTable, Flow extends AnyPgTable, NativeSubjectId>(mapping: PendingAuthenticationMapping<Claims, Subject, Credential, Pending, Flow, NativeSubjectId>) => Effect.Effect<{
30
30
  pendingAuthentication: PendingAuthentication<Claims>;
31
- }, never, Database$1 | LifecycleHooks>;
31
+ }, SessionUnavailable, Database$1 | LifecycleHooks>;
32
32
  export declare const makePgStatefulSessionServices: <Claims, Subject extends AnyPgTable, Credential extends AnyPgTable, Session extends AnyPgTable, Flow extends AnyPgTable, Pending extends AnyPgTable, NativeSubjectId, NativeSessionId>(mapping: StatefulSessionMapping<Claims, Subject, Credential, Session, Flow, Pending, NativeSubjectId, NativeSessionId>) => Effect.Effect<{
33
33
  readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;
34
34
  readonly sessionRepository: SessionRepository;
35
- }, never, Database$1 | LifecycleHooks>;
35
+ }, SessionUnavailable, Database$1 | LifecycleHooks>;
36
36
  export declare const makePgSignedSessionValidityServices: <Subject extends AnyPgTable, Tombstone extends AnyPgTable, NativeSubjectId, NativeSessionId>(mapping: SignedSessionValidityMapping<Subject, Tombstone, NativeSubjectId, NativeSessionId>) => Effect.Effect<{
37
37
  signedSessionValidity: SignedSessionValidity;
38
- }, never, Database$1 | LifecycleHooks>;
38
+ }, SessionUnavailable, Database$1 | LifecycleHooks>;
39
39
  export declare function coordinatePgAuthenticationAuthority<Claims, D extends Database, S extends AnyPgTable, C extends AnyPgTable, F extends AnyPgTable, P extends AnyPgTable, NativeId, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
40
40
  readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;
41
41
  readonly transaction?: never;
@@ -78,7 +78,7 @@ export declare function coordinatePgSignedSessionValidity<TargetId, D extends Da
78
78
  }, body: Effect.Effect<A, E, R>): Effect.Effect<A, E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements>;
79
79
  export declare const makePgSessionStepUpServices: <Claims, Id, S extends AnyPgTable, C extends AnyPgTable, I extends AnyPgTable, Session extends AnyPgTable, T extends AnyPgTable, NativeId, NativeSessionId>(mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>, target: Context.Service<Id, SessionStepUpPersistence<Claims>>) => Effect.Effect<{
80
80
  sessionStepUpPersistence: SessionStepUpPersistence<Claims>;
81
- }, never, Database$1 | LifecycleHooks>;
81
+ }, SessionUnavailable, Database$1 | LifecycleHooks>;
82
82
  export declare function coordinatePgSessionStepUp<Claims, Id, S extends AnyPgTable, C extends AnyPgTable, I extends AnyPgTable, Session extends AnyPgTable, T extends AnyPgTable, NativeId, NativeSessionId, D extends Database, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
83
83
  readonly mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>;
84
84
  readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;
@@ -3,6 +3,7 @@ import { acquireTransactionService, transactionService } from "./standalone-guar
3
3
  import { coordinateTargetAuthenticationAuthority, coordinateTargetPendingAuthentication, coordinateTargetSessionStepUp, coordinateTargetSignedSessionValidity, coordinateTargetStatefulSessions, makeTargetAuthenticationAuthorityServices, makeTargetPendingAuthenticationServices, makeTargetSessionStepUpServices, makeTargetSignedSessionValidityServices, makeTargetStatefulSessionServices, sqlClientSessionStandaloneGuard } from "./session-target.mjs";
4
4
  import { nativeDatabase } from "./native-database.mjs";
5
5
  import { Database } from "./pg-database.mjs";
6
+ import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
6
7
  import { Context, Effect } from "effect";
7
8
  import { AuthenticationAuthority } from "@yielded/auth/Sessions";
8
9
  //#region src/drizzle/pg-sessions.ts
@@ -11,45 +12,45 @@ const configuration = (service) => ({
11
12
  locking: true,
12
13
  standaloneGuard: sqlClientSessionStandaloneGuard(service)
13
14
  });
14
- const makePgAuthenticationAuthorityServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetAuthenticationAuthorityServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
15
- const makePgPendingAuthenticationServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPendingAuthenticationServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
16
- const makePgStatefulSessionServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetStatefulSessionServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
17
- const makePgSignedSessionValidityServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetSignedSessionValidityServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
15
+ const makePgAuthenticationAuthorityServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetAuthenticationAuthorityServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
16
+ const makePgPendingAuthenticationServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPendingAuthenticationServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
17
+ const makePgStatefulSessionServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetStatefulSessionServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
18
+ const makePgSignedSessionValidityServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetSignedSessionValidityServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
18
19
  function coordinatePgAuthenticationAuthority(acquire, options, body) {
19
- return Effect.flatMap(acquire, (database) => coordinateTargetAuthenticationAuthority(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
20
+ return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetAuthenticationAuthority(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
20
21
  const provided = Context.make(AuthenticationAuthority, services.authenticationAuthority);
21
22
  const work = Effect.provideContext(body, provided);
22
23
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
23
- }));
24
+ }).pipe(Effect.provideService(NativeDatabase, database)));
24
25
  }
25
26
  function coordinatePgPendingAuthentication(acquire, options, body) {
26
- return Effect.flatMap(acquire, (database) => coordinateTargetPendingAuthentication(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
27
+ return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetPendingAuthentication(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
27
28
  const provided = Context.make(options.target, services.pendingAuthentication);
28
29
  const work = Effect.provideContext(body, provided);
29
30
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
30
- }));
31
+ }).pipe(Effect.provideService(NativeDatabase, database)));
31
32
  }
32
33
  function coordinatePgStatefulSessions(acquire, options, body) {
33
- return Effect.flatMap(acquire, (database) => coordinateTargetStatefulSessions(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
34
+ return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetStatefulSessions(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
34
35
  const provided = Context.make(options.persistence, services.statefulSessionPersistence).pipe(Context.add(options.repository, services.sessionRepository));
35
36
  const work = Effect.provideContext(body, provided);
36
37
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
37
- }));
38
+ }).pipe(Effect.provideService(NativeDatabase, database)));
38
39
  }
39
40
  function coordinatePgSignedSessionValidity(acquire, options, body) {
40
- return Effect.flatMap(acquire, (database) => coordinateTargetSignedSessionValidity(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
41
+ return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetSignedSessionValidity(database, options.mapping, configuration(transactionService(database)), (transaction, services) => {
41
42
  const provided = Context.make(options.target, services.signedSessionValidity);
42
43
  const work = Effect.provideContext(body, provided);
43
44
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
44
- }));
45
+ }).pipe(Effect.provideService(NativeDatabase, database)));
45
46
  }
46
- const makePgSessionStepUpServices = (mapping, target) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetSessionStepUpServices(mapping, target, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
47
+ const makePgSessionStepUpServices = (mapping, target) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetSessionStepUpServices(mapping, target, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)), Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
47
48
  function coordinatePgSessionStepUp(acquire, options, body) {
48
- return Effect.flatMap(acquire, (database) => coordinateTargetSessionStepUp(database, options.mapping, options.target, configuration(transactionService(database)), (transaction, services) => {
49
+ return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetSessionStepUp(database, options.mapping, options.target, configuration(transactionService(database)), (transaction, services) => {
49
50
  const provided = Context.make(options.target, services.sessionStepUpPersistence);
50
51
  const work = Effect.provideContext(body, provided);
51
52
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
52
- }));
53
+ }).pipe(Effect.provideService(NativeDatabase, database)));
53
54
  }
54
55
  //#endregion
55
56
  export { coordinatePgAuthenticationAuthority, coordinatePgPendingAuthentication, coordinatePgSessionStepUp, coordinatePgSignedSessionValidity, coordinatePgStatefulSessions, makePgAuthenticationAuthorityServices, makePgPendingAuthenticationServices, makePgSessionStepUpServices, makePgSignedSessionValidityServices, makePgStatefulSessionServices };
@@ -1 +1 @@
1
- {"version":3,"file":"pg-sessions.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/pg-sessions.ts"],"sourcesContent":["import type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport {\n AuthenticationAuthority,\n type SessionUnavailable,\n type PendingAuthentication,\n type SessionRepository,\n type SignedSessionValidity,\n type StatefulSessionPersistence,\n type SessionStepUpPersistence,\n} from \"@yielded/auth/Sessions\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectPgDatabase as PgliteDatabase } from \"drizzle-orm/effect-pglite\";\nimport type { EffectPgDatabase as PostgresDatabase } from \"drizzle-orm/effect-postgres\";\nimport type { AnyPgTable } from \"drizzle-orm/pg-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { nativeDatabase } from \"./native-database\";\nimport { Database as DatabaseService } from \"./pg-database\";\nimport type {\n AuthenticationAuthorityMapping,\n PendingAuthenticationMapping,\n SignedSessionValidityMapping,\n StatefulSessionMapping,\n} from \"./session-model\";\nimport { CurrentSessionSql } from \"./session-sql\";\nimport {\n coordinateTargetAuthenticationAuthority,\n coordinateTargetPendingAuthentication,\n coordinateTargetSignedSessionValidity,\n coordinateTargetStatefulSessions,\n makeTargetAuthenticationAuthorityServices,\n makeTargetPendingAuthenticationServices,\n makeTargetSignedSessionValidityServices,\n makeTargetStatefulSessionServices,\n sqlClientSessionStandaloneGuard,\n makeTargetSessionStepUpServices,\n coordinateTargetSessionStepUp,\n} from \"./session-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientSessionStandaloneGuard(service),\n});\n\nexport const makePgAuthenticationAuthorityServices = <\n Claims,\n Subject extends AnyPgTable,\n Credential extends AnyPgTable,\n Flow extends AnyPgTable,\n Pending extends AnyPgTable,\n NativeSubjectId,\n>(\n mapping: AuthenticationAuthorityMapping<\n Claims,\n Subject,\n Credential,\n Flow,\n Pending,\n NativeSubjectId\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetAuthenticationAuthorityServices<Claims>(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));\n\nexport const makePgPendingAuthenticationServices = <\n Claims,\n Subject extends AnyPgTable,\n Credential extends AnyPgTable,\n Pending extends AnyPgTable,\n Flow extends AnyPgTable,\n NativeSubjectId,\n>(\n mapping: PendingAuthenticationMapping<\n Claims,\n Subject,\n Credential,\n Pending,\n Flow,\n NativeSubjectId\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPendingAuthenticationServices<Claims>(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));\n\nexport const makePgStatefulSessionServices = <\n Claims,\n Subject extends AnyPgTable,\n Credential extends AnyPgTable,\n Session extends AnyPgTable,\n Flow extends AnyPgTable,\n Pending extends AnyPgTable,\n NativeSubjectId,\n NativeSessionId,\n>(\n mapping: StatefulSessionMapping<\n Claims,\n Subject,\n Credential,\n Session,\n Flow,\n Pending,\n NativeSubjectId,\n NativeSessionId\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetStatefulSessionServices<Claims>(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));\n\nexport const makePgSignedSessionValidityServices = <\n Subject extends AnyPgTable,\n Tombstone extends AnyPgTable,\n NativeSubjectId,\n NativeSessionId,\n>(\n mapping: SignedSessionValidityMapping<Subject, Tombstone, NativeSubjectId, NativeSessionId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetSignedSessionValidityServices(mapping, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));\n\nexport function coordinatePgAuthenticationAuthority<\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, AuthenticationAuthority> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthenticationAuthority<\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, AuthenticationAuthority | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthenticationAuthority<\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, AuthenticationAuthority> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetAuthenticationAuthority<\n Claims,\n TransactionOf<D>,\n A,\n E,\n Exclude<R, AuthenticationAuthority>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly authenticationAuthority: AuthenticationAuthority[\"Service\"] },\n ) => {\n const provided = Context.make(AuthenticationAuthority, services.authenticationAuthority);\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\nexport function coordinatePgPendingAuthentication<\n TargetId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n P extends AnyPgTable,\n F extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgPendingAuthentication<\n TargetId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n P extends AnyPgTable,\n F extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgPendingAuthentication<\n TargetId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n P extends AnyPgTable,\n F extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPendingAuthentication<Claims, TransactionOf<D>, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly pendingAuthentication: PendingAuthentication<Claims> },\n ) => {\n const provided = Context.make(options.target, services.pendingAuthentication);\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\nexport function coordinatePgStatefulSessions<\n PersistenceId,\n RepositoryId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n Session extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PersistenceId | RepositoryId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgStatefulSessions<\n PersistenceId,\n RepositoryId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n Session extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PersistenceId | RepositoryId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgStatefulSessions<\n PersistenceId,\n RepositoryId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n Session extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PersistenceId | RepositoryId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetStatefulSessions<\n Claims,\n TransactionOf<D>,\n A,\n E,\n Exclude<R, PersistenceId | RepositoryId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n ) => {\n const provided = Context.make(\n options.persistence,\n services.statefulSessionPersistence,\n ).pipe(Context.add(options.repository, services.sessionRepository));\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\nexport function coordinatePgSignedSessionValidity<\n TargetId,\n D extends Database,\n S extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSignedSessionValidity<\n TargetId,\n D extends Database,\n S extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSignedSessionValidity<\n TargetId,\n D extends Database,\n S extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetSignedSessionValidity<TransactionOf<D>, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly signedSessionValidity: SignedSessionValidity },\n ) => {\n const provided = Context.make(options.target, services.signedSessionValidity);\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\nimport type { SessionStepUpMapping } from \"./step-up-model\";\n\nexport const makePgSessionStepUpServices = <\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n>(\n mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetSessionStepUpServices(mapping, target, configuration),\n ).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)));\n\nexport function coordinatePgSessionStepUp<\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n D extends Database,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, Id> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSessionStepUp<\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n D extends Database,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, Id | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSessionStepUp<\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n D extends Database,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, Id> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetSessionStepUp<Claims, Id, TransactionOf<D>, A, E, Exclude<R, Id>>(\n database,\n options.mapping,\n options.target,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },\n ) => {\n const provided = Context.make(options.target, services.sessionStepUpPersistence);\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"],"mappings":"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"}
1
+ {"version":3,"file":"pg-sessions.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/pg-sessions.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport {\n AuthenticationAuthority,\n type SessionUnavailable,\n type PendingAuthentication,\n type SessionRepository,\n type SignedSessionValidity,\n type StatefulSessionPersistence,\n type SessionStepUpPersistence,\n} from \"@yielded/auth/Sessions\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectPgDatabase as PgliteDatabase } from \"drizzle-orm/effect-pglite\";\nimport type { EffectPgDatabase as PostgresDatabase } from \"drizzle-orm/effect-postgres\";\nimport type { AnyPgTable } from \"drizzle-orm/pg-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { nativeDatabase } from \"./native-database\";\nimport { Database as DatabaseService } from \"./pg-database\";\nimport type {\n AuthenticationAuthorityMapping,\n PendingAuthenticationMapping,\n SignedSessionValidityMapping,\n StatefulSessionMapping,\n} from \"./session-model\";\nimport { CurrentSessionSql } from \"./session-sql\";\nimport {\n coordinateTargetAuthenticationAuthority,\n coordinateTargetPendingAuthentication,\n coordinateTargetSignedSessionValidity,\n coordinateTargetStatefulSessions,\n makeTargetAuthenticationAuthorityServices,\n makeTargetPendingAuthenticationServices,\n makeTargetSignedSessionValidityServices,\n makeTargetStatefulSessionServices,\n sqlClientSessionStandaloneGuard,\n makeTargetSessionStepUpServices,\n coordinateTargetSessionStepUp,\n} from \"./session-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = PostgresDatabase<AnyRelations> | PgliteDatabase<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientSessionStandaloneGuard(service),\n});\n\nexport const makePgAuthenticationAuthorityServices = <\n Claims,\n Subject extends AnyPgTable,\n Credential extends AnyPgTable,\n Flow extends AnyPgTable,\n Pending extends AnyPgTable,\n NativeSubjectId,\n>(\n mapping: AuthenticationAuthorityMapping<\n Claims,\n Subject,\n Credential,\n Flow,\n Pending,\n NativeSubjectId\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetAuthenticationAuthorityServices<Claims>(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makePgPendingAuthenticationServices = <\n Claims,\n Subject extends AnyPgTable,\n Credential extends AnyPgTable,\n Pending extends AnyPgTable,\n Flow extends AnyPgTable,\n NativeSubjectId,\n>(\n mapping: PendingAuthenticationMapping<\n Claims,\n Subject,\n Credential,\n Pending,\n Flow,\n NativeSubjectId\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPendingAuthenticationServices<Claims>(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makePgStatefulSessionServices = <\n Claims,\n Subject extends AnyPgTable,\n Credential extends AnyPgTable,\n Session extends AnyPgTable,\n Flow extends AnyPgTable,\n Pending extends AnyPgTable,\n NativeSubjectId,\n NativeSessionId,\n>(\n mapping: StatefulSessionMapping<\n Claims,\n Subject,\n Credential,\n Session,\n Flow,\n Pending,\n NativeSubjectId,\n NativeSessionId\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetStatefulSessionServices<Claims>(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makePgSignedSessionValidityServices = <\n Subject extends AnyPgTable,\n Tombstone extends AnyPgTable,\n NativeSubjectId,\n NativeSessionId,\n>(\n mapping: SignedSessionValidityMapping<Subject, Tombstone, NativeSubjectId, NativeSessionId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetSignedSessionValidityServices(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinatePgAuthenticationAuthority<\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, AuthenticationAuthority> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthenticationAuthority<\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, AuthenticationAuthority | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgAuthenticationAuthority<\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, AuthenticationAuthority> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetAuthenticationAuthority<\n Claims,\n TransactionOf<D>,\n A,\n E,\n Exclude<R, AuthenticationAuthority>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly authenticationAuthority: AuthenticationAuthority[\"Service\"] },\n ) => {\n const provided = Context.make(AuthenticationAuthority, services.authenticationAuthority);\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 ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinatePgPendingAuthentication<\n TargetId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n P extends AnyPgTable,\n F extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgPendingAuthentication<\n TargetId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n P extends AnyPgTable,\n F extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgPendingAuthentication<\n TargetId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n P extends AnyPgTable,\n F extends AnyPgTable,\n NativeId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PendingAuthenticationMapping<NoInfer<Claims>, S, C, P, F, NativeId>;\n readonly target: SuppliedService<TargetId, PendingAuthentication<Claims>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPendingAuthentication<Claims, TransactionOf<D>, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly pendingAuthentication: PendingAuthentication<Claims> },\n ) => {\n const provided = Context.make(options.target, services.pendingAuthentication);\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 ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinatePgStatefulSessions<\n PersistenceId,\n RepositoryId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n Session extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PersistenceId | RepositoryId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgStatefulSessions<\n PersistenceId,\n RepositoryId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n Session extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PersistenceId | RepositoryId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgStatefulSessions<\n PersistenceId,\n RepositoryId,\n Claims,\n D extends Database,\n S extends AnyPgTable,\n C extends AnyPgTable,\n Session extends AnyPgTable,\n F extends AnyPgTable,\n P extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: StatefulSessionMapping<\n NoInfer<Claims>,\n S,\n C,\n Session,\n F,\n P,\n NativeId,\n NativeSessionId\n >;\n readonly persistence: SuppliedService<PersistenceId, StatefulSessionPersistence<Claims>>;\n readonly repository: SuppliedService<RepositoryId, SessionRepository>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PersistenceId | RepositoryId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetStatefulSessions<\n Claims,\n TransactionOf<D>,\n A,\n E,\n Exclude<R, PersistenceId | RepositoryId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: {\n readonly statefulSessionPersistence: StatefulSessionPersistence<Claims>;\n readonly sessionRepository: SessionRepository;\n },\n ) => {\n const provided = Context.make(\n options.persistence,\n services.statefulSessionPersistence,\n ).pipe(Context.add(options.repository, services.sessionRepository));\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 ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport function coordinatePgSignedSessionValidity<\n TargetId,\n D extends Database,\n S extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSignedSessionValidity<\n TargetId,\n D extends Database,\n S extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSignedSessionValidity<\n TargetId,\n D extends Database,\n S extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SignedSessionValidityMapping<S, T, NativeId, NativeSessionId>;\n readonly target: SuppliedService<TargetId, SignedSessionValidity>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetSignedSessionValidity<TransactionOf<D>, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly signedSessionValidity: SignedSessionValidity },\n ) => {\n const provided = Context.make(options.target, services.signedSessionValidity);\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 ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nimport type { SessionStepUpMapping } from \"./step-up-model\";\n\nexport const makePgSessionStepUpServices = <\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n>(\n mapping: SessionStepUpMapping<NoInfer<Claims>, S, C, I, Session, T, NativeId, NativeSessionId>,\n target: Context.Service<Id, SessionStepUpPersistence<Claims>>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetSessionStepUpServices(mapping, target, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinatePgSessionStepUp<\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n D extends Database,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, Id> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSessionStepUp<\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n D extends Database,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, Id | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinatePgSessionStepUp<\n Claims,\n Id,\n S extends AnyPgTable,\n C extends AnyPgTable,\n I extends AnyPgTable,\n Session extends AnyPgTable,\n T extends AnyPgTable,\n NativeId,\n NativeSessionId,\n D extends Database,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: SessionStepUpMapping<\n NoInfer<Claims>,\n S,\n C,\n I,\n Session,\n T,\n NativeId,\n NativeSessionId\n >;\n readonly target: SuppliedService<Id, SessionStepUpPersistence<Claims>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n E | SessionUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, Id> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetSessionStepUp<Claims, Id, TransactionOf<D>, A, E, Exclude<R, Id>>(\n database,\n options.mapping,\n options.target,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly sessionStepUpPersistence: SessionStepUpPersistence<Claims> },\n ) => {\n const provided = Context.make(options.target, services.sessionStepUpPersistence);\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 ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { requiredProofConstraints } from "./proof-model.mjs";
2
+ import { validateDrizzleStorage } from "./storage-validation.mjs";
2
3
  import { CurrentProofSql, completeProofPlanIn } from "./proof-sql.mjs";
3
4
  import { coordinateTransactionOwner, makeTransactionExecution, sqlClientTransactionStandaloneGuard } from "./transaction-execution.mjs";
4
5
  import { phoneProofs, requiredPhoneConstraints } from "./phone-model.mjs";
@@ -138,6 +139,10 @@ const makeTargetPhonePersistence = (source, configuration) => Effect.gen(functio
138
139
  try: () => validateMapping(original, configuration),
139
140
  catch: () => PhoneConfigurationError.make({})
140
141
  });
142
+ yield* validateDrizzleStorage({
143
+ ...mapping,
144
+ proofs: phoneProofs(mapping.proofs)
145
+ }).pipe(Effect.mapError(() => PhoneConfigurationError.make({})));
141
146
  const execution = yield* makeTransactionExecution(CurrentPhoneTransaction, configuration, unavailable, randomId);
142
147
  return yield* services(mapping, execution, configuration);
143
148
  });
@@ -147,16 +152,20 @@ const coordinateTargetPhone = (database, source, configuration, body) => Effect.
147
152
  try: () => validateMapping(original, configuration),
148
153
  catch: () => PhoneConfigurationError.make({})
149
154
  });
155
+ yield* validateDrizzleStorage({
156
+ ...mapping,
157
+ proofs: phoneProofs(mapping.proofs)
158
+ }).pipe(Effect.mapError(() => PhoneConfigurationError.make({})));
150
159
  return yield* coordinateTransactionOwner(database, CurrentPhoneTransaction, configuration, Effect.void, unavailable, randomId, (execution) => services(mapping, execution, configuration), (transaction, acquireServices, append) => Effect.flatMap(acquireServices, (boundServices) => body(transaction, boundServices, append)));
151
160
  });
152
161
  /** Concrete driver wrappers select transaction mode; cryptography always precedes these owners. */
153
162
  const makePhoneTarget = (databaseService, configuration) => {
154
163
  function coordinatePhonePersistence(acquire, options, body) {
155
- return Effect.flatMap(acquire, (database) => coordinateTargetPhone(database, options.mapping, configuration, (transaction, services) => {
164
+ return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetPhone(database, options.mapping, configuration, (transaction, services) => {
156
165
  const provided = Context.make(PhonePersistence, services.phonePersistence).pipe(Context.add(PhoneAdmission, services.phoneAdmission), Context.add(PhoneSignInTargets, services.phoneSignInTargets));
157
166
  const work = Effect.provideContext(body, provided);
158
167
  return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
159
- }));
168
+ }).pipe(Effect.provideService(NativeDatabase, database)));
160
169
  }
161
170
  return {
162
171
  makePhonePersistenceServices: (mapping) => makeTargetPhonePersistence(mapping, configuration).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),
@@ -1 +1 @@
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
+ {"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 type PhoneProofCompletionMapping,\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 { validateDrizzleStorage } from \"./storage-validation\";\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 yield* validateDrizzleStorage({\n ...mapping,\n proofs: phoneProofs(mapping.proofs),\n }).pipe(Effect.mapError(() => PhoneConfigurationError.make({})));\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 = <\n M extends { readonly proofs: PhoneProofCompletionMapping },\n A,\n E,\n R,\n RSetup = never,\n>(\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 | NativeDatabase> =>\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 yield* validateDrizzleStorage({\n ...mapping,\n proofs: phoneProofs(mapping.proofs),\n }).pipe(Effect.mapError(() => PhoneConfigurationError.make({})));\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(nativeDatabase(acquire), (database) =>\n coordinateTargetPhone(\n database as any,\n options.mapping,\n configuration,\n (\n transaction: TransactionOf<Database>,\n services,\n ): Effect.Effect<\n A,\n E,\n Exclude<R, PhonePersistence | PhoneAdmission | PhoneSignInTargets>\n > => {\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 ).pipe(Effect.provideService(NativeDatabase, database)),\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,5 +1,6 @@
1
1
  import "./standalone-guard.mjs";
2
2
  import "./proof-sql.mjs";
3
+ import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
3
4
  import { Effect, Layer } from "effect";
4
5
  import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
5
6
  import { ProofPersistence, ProofUnavailable } from "@yielded/auth/Proofs";
@@ -1,3 +1,4 @@
1
+ import { validateDrizzleStorage } from "./storage-validation.mjs";
1
2
  import { sqlClientStandaloneGuard } from "./standalone-guard.mjs";
2
3
  import { CurrentProofSql, makeSqlProofPersistence } from "./proof-sql.mjs";
3
4
  import { Effect, Layer } from "effect";
@@ -25,6 +26,7 @@ const coordinateTargetProofPersistence = (database, mapping, configuration, owne
25
26
  const hooks = yield* LifecycleHooks;
26
27
  if (yield* hasCommitScope) return yield* ProofUnavailable.make({});
27
28
  yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
29
+ yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(() => ProofUnavailable.make({})));
28
30
  return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
29
31
  return yield* owner(transaction, { proofPersistence: yield* makeSqlProofPersistence(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentProofSql, transaction)) });
30
32
  })), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
@@ -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 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"}
1
+ {"version":3,"file":"proof-target.mjs","names":[],"sources":["../../src/drizzle/proof-target.ts"],"sourcesContent":["import type { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport {\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\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\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 | NativeDatabase> =>\n Effect.gen(function* (): Effect.fn.Return<\n A,\n ProofCoordinatorError<E>,\n R | LifecycleHooks | NativeDatabase\n > {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* ProofUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(() => ProofUnavailable.make({})));\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":";;;;;;;AA8CA,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,aAIT;CACA,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,iBAAiB,KAAK,CAAC,CAAC;CACjE,OAAO,cAAc,oBAAoB,cAAc;CAEvD,OAAO,uBAAuB,OAAO,CAAC,CAAC,KAAK,OAAO,eAAe,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC;CAmB5F,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"}
@@ -1,9 +1,11 @@
1
1
  import { column, updateValues } from "./model.mjs";
2
2
  import { balancedD1And, compactD1GeneratedStatement } from "./d1-generated-statement.mjs";
3
+ import { validateDrizzleStorage } from "./storage-validation.mjs";
3
4
  import { and, asc, eq, getTableColumns, gt, gte, inArray, isNull, lte, notExists, or, sql } from "drizzle-orm";
4
5
  /** The shared kernel only passes tables and expressions from this compiler.
5
6
  * Erasure stops at query shapes; row codecs and Effect errors remain explicit. */
6
7
  const drizzleQueryOperations = {
8
+ validateStorage: validateDrizzleStorage,
7
9
  and,
8
10
  asc,
9
11
  or,
@@ -1 +1 @@
1
- {"version":3,"file":"query-operations.mjs","names":[],"sources":["../../src/drizzle/query-operations.ts"],"sourcesContent":["import type { QueryOperations } from \"@yielded/auth-persistence/Adapter\";\nimport {\n type SQL,\n type AnyColumn,\n and,\n asc,\n or,\n eq,\n gt,\n gte,\n lte,\n inArray,\n isNull,\n notExists,\n sql,\n getTableColumns,\n} from \"drizzle-orm\";\n\nimport { balancedD1And, compactD1GeneratedStatement } from \"./d1-generated-statement\";\nimport { column, updateValues } from \"./model\";\n\nconst operations = {\n and,\n asc,\n or,\n eq,\n gt,\n gte,\n lte,\n inArray,\n isNull,\n notExists,\n sql,\n getTableColumns,\n column,\n updateValues,\n balancedD1And,\n compactD1GeneratedStatement,\n};\n\n/** The shared kernel only passes tables and expressions from this compiler.\n * Erasure stops at query shapes; row codecs and Effect errors remain explicit. */\nexport const drizzleQueryOperations = operations as unknown as QueryOperations<SQL, AnyColumn>;\n"],"mappings":";;;;;AA0CA,MAAa,yBAAyB;CApBpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAKoC"}
1
+ {"version":3,"file":"query-operations.mjs","names":[],"sources":["../../src/drizzle/query-operations.ts"],"sourcesContent":["import type { QueryOperations } from \"@yielded/auth-persistence/Adapter\";\nimport {\n type SQL,\n type AnyColumn,\n and,\n asc,\n or,\n eq,\n gt,\n gte,\n lte,\n inArray,\n isNull,\n notExists,\n sql,\n getTableColumns,\n} from \"drizzle-orm\";\n\nimport { balancedD1And, compactD1GeneratedStatement } from \"./d1-generated-statement\";\nimport { column, updateValues } from \"./model\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\n\nconst operations = {\n validateStorage: validateDrizzleStorage,\n and,\n asc,\n or,\n eq,\n gt,\n gte,\n lte,\n inArray,\n isNull,\n notExists,\n sql,\n getTableColumns,\n column,\n updateValues,\n balancedD1And,\n compactD1GeneratedStatement,\n};\n\n/** The shared kernel only passes tables and expressions from this compiler.\n * Erasure stops at query shapes; row codecs and Effect errors remain explicit. */\nexport const drizzleQueryOperations = operations as unknown as QueryOperations<SQL, AnyColumn>;\n"],"mappings":";;;;;;AA4CA,MAAa,yBAAyB;CArBpC,iBAAiB;CACjB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAKoC"}
@@ -1,5 +1,6 @@
1
1
  import "./session-sql.mjs";
2
2
  import "./standalone-guard.mjs";
3
+ import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
3
4
  import { Context, Effect, Layer } from "effect";
4
5
  import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
5
6
  import { AuthenticationAuthority, PendingAuthentication, SessionRepository, SessionStepUpPersistence, SessionUnavailable, SignedSessionValidity, StatefulSessionPersistence } from "@yielded/auth/Sessions";
@@ -1,3 +1,4 @@
1
+ import { validateDrizzleStorage } from "./storage-validation.mjs";
1
2
  import { CurrentSessionSql, makeSqlAuthenticationAuthority, makeSqlPendingAuthentication, makeSqlSessionStepUp, makeSqlSignedValidity, makeSqlStatefulSessions } from "./session-sql.mjs";
2
3
  import { sqlClientStandaloneGuard } from "./standalone-guard.mjs";
3
4
  import { Effect, Layer } from "effect";
@@ -6,6 +7,7 @@ import { AuthenticationAuthority, SessionUnavailable } from "@yielded/auth/Sessi
6
7
  //#region src/drizzle/session-target.ts
7
8
  const sqlClientSessionStandaloneGuard = (service) => sqlClientStandaloneGuard(service, () => SessionUnavailable.make({}));
8
9
  const options = (configuration, transactionBound = false) => ({
10
+ coordinated: transactionBound,
9
11
  mode: configuration.mode,
10
12
  locking: configuration.locking,
11
13
  standaloneGuard: transactionBound ? Effect.void : configuration.standaloneGuard
@@ -23,23 +25,24 @@ const makeTargetSignedSessionValidityServices = (mapping, configuration) => Effe
23
25
  * native `SqlError` when transaction acquisition fails. Captured service
24
26
  * operations normalize their own driver failures to `SessionUnavailable`.
25
27
  */
26
- const coordinate = (database, configuration, make, owner) => Effect.gen(function* () {
28
+ const coordinate = (database, configuration, mapping, make, owner) => Effect.gen(function* () {
27
29
  if (yield* hasCommitScope) return yield* SessionUnavailable.make({});
28
30
  yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
31
+ yield* validateDrizzleStorage(mapping).pipe(Effect.mapError(() => SessionUnavailable.make({})));
29
32
  return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
30
33
  return yield* owner(transaction, yield* make(transaction));
31
34
  }).pipe(Effect.provideService(CurrentSessionSql, transaction))), { mode: configuration.mode })).value;
32
35
  });
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);
36
+ const coordinateTargetAuthenticationAuthority = (database, mapping, configuration, owner) => coordinate(database, configuration, mapping, (transaction) => Effect.map(makeSqlAuthenticationAuthority(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (authenticationAuthority) => ({ authenticationAuthority })), owner);
37
+ const coordinateTargetPendingAuthentication = (database, mapping, configuration, owner) => coordinate(database, configuration, mapping, (transaction) => Effect.map(makeSqlPendingAuthentication(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (pendingAuthentication) => ({ pendingAuthentication })), owner);
38
+ const coordinateTargetStatefulSessions = (database, mapping, configuration, owner) => coordinate(database, configuration, mapping, (transaction) => makeSqlStatefulSessions(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), owner);
39
+ const coordinateTargetSignedSessionValidity = (database, mapping, configuration, owner) => coordinate(database, configuration, mapping, (transaction) => Effect.map(makeSqlSignedValidity(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (signedSessionValidity) => ({ signedSessionValidity })), owner);
37
40
  const authenticationAuthorityLayer = (services) => Layer.effect(AuthenticationAuthority, Effect.map(services, (value) => value.authenticationAuthority));
38
41
  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
42
  const pendingAuthenticationLayer = (module, services) => Layer.effect(module.PendingAuthentication, Effect.map(services, (value) => value.pendingAuthentication));
40
43
  const signedSessionValidityLayer = (module, services) => Layer.effect(module.SignedSessionValidity, Effect.map(services, (value) => value.signedSessionValidity));
41
44
  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);
45
+ const coordinateTargetSessionStepUp = (database, mapping, target, configuration, owner) => coordinate(database, configuration, mapping, (transaction) => Effect.map(makeSqlSessionStepUp(mapping, options(configuration, true)).pipe(Effect.provideService(CurrentSessionSql, transaction)), (sessionStepUpPersistence) => ({ sessionStepUpPersistence: target.of(sessionStepUpPersistence) })), owner);
43
46
  //#endregion
44
47
  export { authenticationAuthorityLayer, coordinateTargetAuthenticationAuthority, coordinateTargetPendingAuthentication, coordinateTargetSessionStepUp, coordinateTargetSignedSessionValidity, coordinateTargetStatefulSessions, makeTargetAuthenticationAuthorityServices, makeTargetPendingAuthenticationServices, makeTargetSessionStepUpServices, makeTargetSignedSessionValidityServices, makeTargetStatefulSessionServices, pendingAuthenticationLayer, signedSessionValidityLayer, sqlClientSessionStandaloneGuard, statefulSessionLayers };
45
48