@yielded/auth-persistence-drizzle 0.1.0-beta.14 → 0.1.0-beta.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/D1.d.mts +123 -9
- package/dist/Libsql.d.mts +141 -27
- package/dist/Mysql2.d.mts +124 -10
- package/dist/Pglite.d.mts +124 -10
- package/dist/Postgres.d.mts +129 -15
- package/dist/SqliteBun.d.mts +135 -21
- package/dist/SqliteDo.d.mts +135 -21
- package/dist/SqliteNode.d.mts +135 -21
- package/dist/SqliteWasm.d.mts +135 -21
- package/dist/drizzle/d1-emails.d.mts +3 -3
- package/dist/drizzle/d1-emails.mjs +56 -11
- package/dist/drizzle/d1-emails.mjs.map +1 -1
- package/dist/drizzle/d1-identity.mjs +9 -2
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/d1-oauth.d.mts +6 -6
- package/dist/drizzle/d1-oauth.mjs +8 -8
- package/dist/drizzle/d1-oauth.mjs.map +1 -1
- package/dist/drizzle/d1-passkey.d.mts +2 -1
- package/dist/drizzle/d1-passkey.mjs +10 -8
- package/dist/drizzle/d1-passkey.mjs.map +1 -1
- package/dist/drizzle/d1-password-prepared.d.mts +1 -1
- package/dist/drizzle/d1-password-prepared.mjs +16 -5
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
- package/dist/drizzle/d1-passwords.d.mts +2 -2
- package/dist/drizzle/d1-passwords.mjs +19 -6
- package/dist/drizzle/d1-passwords.mjs.map +1 -1
- package/dist/drizzle/d1-phone.d.mts +2 -1
- package/dist/drizzle/d1-phone.mjs +4 -2
- package/dist/drizzle/d1-phone.mjs.map +1 -1
- package/dist/drizzle/d1-proofs.d.mts +1 -1
- package/dist/drizzle/d1-proofs.mjs +18 -7
- package/dist/drizzle/d1-proofs.mjs.map +1 -1
- package/dist/drizzle/d1-sessions.d.mts +6 -5
- package/dist/drizzle/d1-sessions.mjs +29 -19
- package/dist/drizzle/d1-sessions.mjs.map +1 -1
- package/dist/drizzle/d1-totp.d.mts +2 -1
- package/dist/drizzle/d1-totp.mjs +4 -2
- package/dist/drizzle/d1-totp.mjs.map +1 -1
- package/dist/drizzle/email-registration.d.mts +5 -1
- package/dist/drizzle/email-registration.mjs +48 -4
- package/dist/drizzle/email-registration.mjs.map +1 -1
- package/dist/drizzle/email-target.d.mts +1 -0
- package/dist/drizzle/email-target.mjs +9 -0
- package/dist/drizzle/email-target.mjs.map +1 -1
- package/dist/drizzle/mysql-emails.d.mts +4 -4
- package/dist/drizzle/mysql-emails.mjs +8 -7
- package/dist/drizzle/mysql-emails.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +11 -4
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/mysql-password-prepared.d.mts +2 -2
- package/dist/drizzle/mysql-password-prepared.mjs +4 -3
- package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
- package/dist/drizzle/mysql-passwords.d.mts +3 -3
- package/dist/drizzle/mysql-passwords.mjs +7 -6
- package/dist/drizzle/mysql-passwords.mjs.map +1 -1
- package/dist/drizzle/mysql-proofs.d.mts +2 -2
- package/dist/drizzle/mysql-proofs.mjs +4 -3
- package/dist/drizzle/mysql-proofs.mjs.map +1 -1
- package/dist/drizzle/mysql-sessions.d.mts +6 -6
- package/dist/drizzle/mysql-sessions.mjs +16 -15
- package/dist/drizzle/mysql-sessions.mjs.map +1 -1
- package/dist/drizzle/native-database.mjs +1 -1
- package/dist/drizzle/native-database.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-drivers.mjs +10 -8
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-flow.mjs +62 -13
- package/dist/drizzle/oauth-connected-flow.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-input.mjs +6 -0
- package/dist/drizzle/oauth-connected-input.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-maintenance.mjs +3 -3
- package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +116 -2
- package/dist/drizzle/oauth-connected-target.mjs +5 -3
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs +8 -8
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-target.d.mts +3 -3
- package/dist/drizzle/oauth-target.mjs +8 -6
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey-drivers.mjs +4 -4
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-drivers.mjs +4 -4
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-target.d.mts +1 -1
- package/dist/drizzle/password-prepared-sql.mjs +5 -0
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
- package/dist/drizzle/password-prepared-target.d.mts +2 -1
- package/dist/drizzle/password-prepared-target.mjs +5 -0
- package/dist/drizzle/password-prepared-target.mjs.map +1 -1
- package/dist/drizzle/password-registration.d.mts +1 -1
- package/dist/drizzle/password-registration.mjs +2 -0
- package/dist/drizzle/password-registration.mjs.map +1 -1
- package/dist/drizzle/password-target.d.mts +1 -0
- package/dist/drizzle/password-target.mjs +6 -0
- package/dist/drizzle/password-target.mjs.map +1 -1
- package/dist/drizzle/pg-emails.d.mts +4 -4
- package/dist/drizzle/pg-emails.mjs +8 -7
- package/dist/drizzle/pg-emails.mjs.map +1 -1
- package/dist/drizzle/pg-identity.mjs +12 -5
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/pg-password-prepared.d.mts +2 -2
- package/dist/drizzle/pg-password-prepared.mjs +4 -3
- package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
- package/dist/drizzle/pg-passwords.d.mts +3 -3
- package/dist/drizzle/pg-passwords.mjs +7 -6
- package/dist/drizzle/pg-passwords.mjs.map +1 -1
- package/dist/drizzle/pg-proofs.d.mts +2 -2
- package/dist/drizzle/pg-proofs.mjs +4 -3
- package/dist/drizzle/pg-proofs.mjs.map +1 -1
- package/dist/drizzle/pg-sessions.d.mts +6 -6
- package/dist/drizzle/pg-sessions.mjs +16 -15
- package/dist/drizzle/pg-sessions.mjs.map +1 -1
- package/dist/drizzle/phone-target.mjs +11 -2
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/proof-target.d.mts +1 -0
- package/dist/drizzle/proof-target.mjs +2 -0
- package/dist/drizzle/proof-target.mjs.map +1 -1
- package/dist/drizzle/query-operations.mjs +2 -0
- package/dist/drizzle/query-operations.mjs.map +1 -1
- package/dist/drizzle/session-target.d.mts +1 -0
- package/dist/drizzle/session-target.mjs +9 -6
- package/dist/drizzle/session-target.mjs.map +1 -1
- package/dist/drizzle/sqlite-emails.mjs +8 -7
- package/dist/drizzle/sqlite-emails.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +7 -2
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/sqlite-password-prepared.mjs +4 -3
- package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
- package/dist/drizzle/sqlite-passwords.mjs +7 -6
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
- package/dist/drizzle/sqlite-proofs.mjs +4 -3
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
- package/dist/drizzle/sqlite-sessions.mjs +16 -15
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
- package/dist/drizzle/storage-validation.mjs +234 -0
- package/dist/drizzle/storage-validation.mjs.map +1 -0
- package/dist/drizzle/totp-target.mjs +5 -2
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/dist/drizzle/transaction-mysql.mjs +1 -1
- package/package.json +1 -1
- package/src/drizzle/d1-emails.ts +158 -40
- package/src/drizzle/d1-identity.ts +13 -0
- package/src/drizzle/d1-oauth.ts +8 -8
- package/src/drizzle/d1-passkey.ts +10 -8
- package/src/drizzle/d1-password-prepared.ts +14 -2
- package/src/drizzle/d1-passwords.ts +22 -4
- package/src/drizzle/d1-phone.ts +4 -2
- package/src/drizzle/d1-proofs.ts +55 -3
- package/src/drizzle/d1-sessions.ts +67 -18
- package/src/drizzle/d1-totp.ts +4 -2
- package/src/drizzle/email-registration.ts +160 -12
- package/src/drizzle/email-target.ts +22 -4
- package/src/drizzle/mysql-emails.ts +17 -7
- package/src/drizzle/mysql-identity.ts +13 -0
- package/src/drizzle/mysql-password-prepared.ts +7 -3
- package/src/drizzle/mysql-passwords.ts +13 -6
- package/src/drizzle/mysql-proofs.ts +7 -3
- package/src/drizzle/mysql-sessions.ts +31 -15
- package/src/drizzle/native-database.ts +5 -4
- package/src/drizzle/oauth-connected-drivers.ts +10 -8
- package/src/drizzle/oauth-connected-flow.ts +98 -10
- package/src/drizzle/oauth-connected-input.ts +7 -0
- package/src/drizzle/oauth-connected-maintenance.ts +3 -2
- package/src/drizzle/oauth-connected-target.ts +4 -2
- package/src/drizzle/oauth-drivers.ts +8 -8
- package/src/drizzle/oauth-target.ts +13 -7
- package/src/drizzle/passkey-drivers.ts +4 -4
- package/src/drizzle/passkey-write-drivers.ts +8 -5
- package/src/drizzle/password-prepared-sql.ts +13 -1
- package/src/drizzle/password-prepared-target.ts +7 -1
- package/src/drizzle/password-registration.ts +10 -3
- package/src/drizzle/password-target.ts +22 -4
- package/src/drizzle/pg-emails.ts +17 -7
- package/src/drizzle/pg-identity.ts +13 -0
- package/src/drizzle/pg-password-prepared.ts +7 -3
- package/src/drizzle/pg-passwords.ts +13 -6
- package/src/drizzle/pg-proofs.ts +7 -3
- package/src/drizzle/pg-sessions.ts +31 -15
- package/src/drizzle/phone-target.ts +30 -5
- package/src/drizzle/proof-target.ts +10 -2
- package/src/drizzle/query-operations.ts +2 -0
- package/src/drizzle/session-target.ts +20 -3
- package/src/drizzle/sqlite-emails.ts +17 -7
- package/src/drizzle/sqlite-identity.ts +5 -0
- package/src/drizzle/sqlite-password-prepared.ts +7 -3
- package/src/drizzle/sqlite-passwords.ts +13 -6
- package/src/drizzle/sqlite-proofs.ts +7 -3
- package/src/drizzle/sqlite-sessions.ts +31 -15
- package/src/drizzle/storage-validation.ts +285 -0
- package/src/drizzle/totp-target.ts +16 -4
|
@@ -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 "./mysql-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/mysql-sessions.ts
|
|
@@ -11,45 +12,45 @@ const configuration = (service) => ({
|
|
|
11
12
|
locking: true,
|
|
12
13
|
standaloneGuard: sqlClientSessionStandaloneGuard(service)
|
|
13
14
|
});
|
|
14
|
-
const makeMysqlAuthenticationAuthorityServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetAuthenticationAuthorityServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
|
|
15
|
-
const makeMysqlPendingAuthenticationServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetPendingAuthenticationServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
|
|
16
|
-
const makeMysqlStatefulSessionServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetStatefulSessionServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
|
|
17
|
-
const makeMysqlSignedSessionValidityServices = (mapping) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetSignedSessionValidityServices(mapping, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
|
|
15
|
+
const makeMysqlAuthenticationAuthorityServices = (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 makeMysqlPendingAuthenticationServices = (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 makeMysqlStatefulSessionServices = (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 makeMysqlSignedSessionValidityServices = (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 coordinateMysqlAuthenticationAuthority(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 coordinateMysqlPendingAuthentication(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 coordinateMysqlStatefulSessions(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 coordinateMysqlSignedSessionValidity(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 makeMysqlSessionStepUpServices = (mapping, target) => Effect.flatMap(Effect.map(acquireTransactionService(Database), configuration), (configuration) => makeTargetSessionStepUpServices(mapping, target, configuration)).pipe(Effect.provideServiceEffect(CurrentSessionSql, nativeDatabase(Database)));
|
|
47
|
+
const makeMysqlSessionStepUpServices = (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 coordinateMysqlSessionStepUp(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 { coordinateMysqlAuthenticationAuthority, coordinateMysqlPendingAuthentication, coordinateMysqlSessionStepUp, coordinateMysqlSignedSessionValidity, coordinateMysqlStatefulSessions, makeMysqlAuthenticationAuthorityServices, makeMysqlPendingAuthenticationServices, makeMysqlSessionStepUpServices, makeMysqlSignedSessionValidityServices, makeMysqlStatefulSessionServices };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-sessions.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-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 { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-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 = EffectMysql2Database<AnyRelations>;\ntype Transaction = Parameters<Parameters<Database[\"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 makeMysqlAuthenticationAuthorityServices = <\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\n NativeId,\n>(\n mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>,\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 makeMysqlPendingAuthenticationServices = <\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\n NativeId,\n>(\n mapping: PendingAuthenticationMapping<Claims, S, C, P, F, NativeId>,\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 makeMysqlStatefulSessionServices = <\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\n NativeId,\n NativeSessionId,\n>(\n mapping: StatefulSessionMapping<Claims, S, C, Session, F, P, NativeId, NativeSessionId>,\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 makeMysqlSignedSessionValidityServices = <\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\n NativeId,\n NativeSessionId,\n>(\n mapping: SignedSessionValidityMapping<S, T, NativeId, 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 coordinateMysqlAuthenticationAuthority<\n D extends Database,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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 coordinateMysqlAuthenticationAuthority<\n D extends Database,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlAuthenticationAuthority<\n D extends Database,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 Transaction,\n A,\n E,\n Exclude<R, AuthenticationAuthority>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 coordinateMysqlPendingAuthentication<\n D extends Database,\n TargetId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\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 coordinateMysqlPendingAuthentication<\n D extends Database,\n TargetId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlPendingAuthentication<\n D extends Database,\n TargetId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\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<Transaction>, 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, Transaction, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 coordinateMysqlStatefulSessions<\n D extends Database,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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 coordinateMysqlStatefulSessions<\n D extends Database,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlStatefulSessions<\n D extends Database,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 Transaction,\n A,\n E,\n Exclude<R, PersistenceId | RepositoryId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 coordinateMysqlSignedSessionValidity<\n D extends Database,\n TargetId,\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\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 coordinateMysqlSignedSessionValidity<\n D extends Database,\n TargetId,\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlSignedSessionValidity<\n D extends Database,\n TargetId,\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<Transaction>, 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<Transaction, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 makeMysqlSessionStepUpServices = <\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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 coordinateMysqlSessionStepUp<\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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 coordinateMysqlSessionStepUp<\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<\n TxId,\n NoInfer<Parameters<Parameters<D[\"transaction\"]>[0]>[0]>,\n TxShape\n >;\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 coordinateMysqlSessionStepUp<\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<\n TxId,\n NoInfer<Parameters<Parameters<D[\"transaction\"]>[0]>[0]>,\n TxShape\n >;\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<\n Claims,\n Id,\n Parameters<Parameters<D[\"transaction\"]>[0]>[0],\n A,\n E,\n Exclude<R, Id>\n >(\n database,\n options.mapping,\n options.target,\n configuration(transactionService(database)),\n (\n transaction: Parameters<Parameters<D[\"transaction\"]>[0]>[0],\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":"mysql-sessions.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-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 { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-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 = EffectMysql2Database<AnyRelations>;\ntype Transaction = Parameters<Parameters<Database[\"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 makeMysqlAuthenticationAuthorityServices = <\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\n NativeId,\n>(\n mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>,\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 makeMysqlPendingAuthenticationServices = <\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\n NativeId,\n>(\n mapping: PendingAuthenticationMapping<Claims, S, C, P, F, NativeId>,\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 makeMysqlStatefulSessionServices = <\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\n NativeId,\n NativeSessionId,\n>(\n mapping: StatefulSessionMapping<Claims, S, C, Session, F, P, NativeId, NativeSessionId>,\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 makeMysqlSignedSessionValidityServices = <\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\n NativeId,\n NativeSessionId,\n>(\n mapping: SignedSessionValidityMapping<S, T, NativeId, 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 coordinateMysqlAuthenticationAuthority<\n D extends Database,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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 coordinateMysqlAuthenticationAuthority<\n D extends Database,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlAuthenticationAuthority<\n D extends Database,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 Transaction,\n A,\n E,\n Exclude<R, AuthenticationAuthority>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 coordinateMysqlPendingAuthentication<\n D extends Database,\n TargetId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\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 coordinateMysqlPendingAuthentication<\n D extends Database,\n TargetId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlPendingAuthentication<\n D extends Database,\n TargetId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n P extends AnyMySqlTable,\n F extends AnyMySqlTable,\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<Transaction>, 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, Transaction, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 coordinateMysqlStatefulSessions<\n D extends Database,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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 coordinateMysqlStatefulSessions<\n D extends Database,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlStatefulSessions<\n D extends Database,\n PersistenceId,\n RepositoryId,\n Claims,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n F extends AnyMySqlTable,\n P extends AnyMySqlTable,\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<Transaction>, 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 Transaction,\n A,\n E,\n Exclude<R, PersistenceId | RepositoryId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 coordinateMysqlSignedSessionValidity<\n D extends Database,\n TargetId,\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\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 coordinateMysqlSignedSessionValidity<\n D extends Database,\n TargetId,\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<Transaction>, 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 coordinateMysqlSignedSessionValidity<\n D extends Database,\n TargetId,\n S extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<Transaction>, 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<Transaction, A, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: Transaction,\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 makeMysqlSessionStepUpServices = <\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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 coordinateMysqlSessionStepUp<\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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 coordinateMysqlSessionStepUp<\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<\n TxId,\n NoInfer<Parameters<Parameters<D[\"transaction\"]>[0]>[0]>,\n TxShape\n >;\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 coordinateMysqlSessionStepUp<\n Claims,\n Id,\n S extends AnyMySqlTable,\n C extends AnyMySqlTable,\n I extends AnyMySqlTable,\n Session extends AnyMySqlTable,\n T extends AnyMySqlTable,\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<\n TxId,\n NoInfer<Parameters<Parameters<D[\"transaction\"]>[0]>[0]>,\n TxShape\n >;\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<\n Claims,\n Id,\n Parameters<Parameters<D[\"transaction\"]>[0]>[0],\n A,\n E,\n Exclude<R, Id>\n >(\n database,\n options.mapping,\n options.target,\n configuration(transactionService(database)),\n (\n transaction: Parameters<Parameters<D[\"transaction\"]>[0]>[0],\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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"}
|
|
@@ -3,7 +3,7 @@ import { Effect } from "effect";
|
|
|
3
3
|
/** Drizzle omits its captured $client from database class types, and only D1
|
|
4
4
|
* exposes batch. Its generic query builders implement the SQL kernel contracts
|
|
5
5
|
* through drizzleQueryOperations. The selected driver mode controls native calls. */
|
|
6
|
-
const nativeDatabase = (
|
|
6
|
+
const nativeDatabase = (acquire) => Effect.map(acquire, (database) => database);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { nativeDatabase };
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-database.mjs","names":[],"sources":["../../src/drizzle/native-database.ts"],"sourcesContent":["import type {\n TransactionNativeDatabase,\n SessionSqlDatabase,\n PasswordSqlDatabase,\n EmailSqlDatabase,\n ProofSqlDatabase,\n} from \"@yielded/auth-persistence/Adapter\";\nimport {
|
|
1
|
+
{"version":3,"file":"native-database.mjs","names":[],"sources":["../../src/drizzle/native-database.ts"],"sourcesContent":["import type {\n TransactionNativeDatabase,\n SessionSqlDatabase,\n PasswordSqlDatabase,\n EmailSqlDatabase,\n ProofSqlDatabase,\n} from \"@yielded/auth-persistence/Adapter\";\nimport { Effect } from \"effect\";\n\n/** Drizzle omits its captured $client from database class types, and only D1\n * exposes batch. Its generic query builders implement the SQL kernel contracts\n * through drizzleQueryOperations. The selected driver mode controls native calls. */\nexport const nativeDatabase = <Database, E, R>(acquire: Effect.Effect<Database, E, R>) =>\n Effect.map(\n acquire,\n (database) =>\n database as unknown as Database &\n TransactionNativeDatabase &\n SessionSqlDatabase &\n PasswordSqlDatabase &\n EmailSqlDatabase &\n ProofSqlDatabase,\n );\n"],"mappings":";;;;;AAYA,MAAa,kBAAkC,YAC7C,OAAO,IACL,UACC,aACC,QAMJ"}
|
|
@@ -9,18 +9,18 @@ import { OAuthConnectedPersistence, OAuthConnectedRevocations, OAuthUnavailable
|
|
|
9
9
|
const unavailable = () => OAuthUnavailable.make({});
|
|
10
10
|
const makeOAuthConnectedTarget = (databaseService, configuration) => {
|
|
11
11
|
function coordinateOAuthConnected(acquire, options, body) {
|
|
12
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetOAuthConnected(database, options.mapping, configuration, (transaction, services) => {
|
|
12
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetOAuthConnected(database, options.mapping, configuration, (transaction, services) => {
|
|
13
13
|
const provided = Context.make(OAuthConnectedPersistence, services.oauthConnectedPersistence);
|
|
14
14
|
const work = Effect.provideContext(body, provided);
|
|
15
15
|
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
16
|
-
}));
|
|
16
|
+
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
17
17
|
}
|
|
18
18
|
function coordinateOAuthConnectedRevocations(acquire, options, body) {
|
|
19
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetOAuthConnectedRevocations(database, options.mapping, configuration, (transaction, services) => {
|
|
19
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetOAuthConnectedRevocations(database, options.mapping, configuration, (transaction, services) => {
|
|
20
20
|
const provided = Context.make(OAuthConnectedRevocations, services.oauthConnectedRevocations);
|
|
21
21
|
const work = Effect.provideContext(body, provided);
|
|
22
22
|
return options.transaction === void 0 ? work : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
|
|
23
|
-
}));
|
|
23
|
+
}).pipe(Effect.provideService(NativeDatabase, database)));
|
|
24
24
|
}
|
|
25
25
|
return {
|
|
26
26
|
makeOAuthConnectedServices: (mapping) => makeTargetOAuthConnectedServices(mapping, configuration).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService))),
|
|
@@ -31,7 +31,7 @@ const makeOAuthConnectedTarget = (databaseService, configuration) => {
|
|
|
31
31
|
};
|
|
32
32
|
const makeD1OAuthConnectedTarget = (databaseService, configuration) => {
|
|
33
33
|
function coordinateOAuthConnected(acquire, options, body) {
|
|
34
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetOAuthConnected(database, options.mapping, configuration, (_tx, services, append) => Effect.gen(function* () {
|
|
34
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetOAuthConnected(database, options.mapping, configuration, (_tx, services, append) => Effect.gen(function* () {
|
|
35
35
|
const original = services.oauthConnectedPersistence;
|
|
36
36
|
const nativeCollector = D1BatchStatements.of({ append: (statement) => Effect.sync(() => append(statement)) });
|
|
37
37
|
const owner = yield* makeD1Owner(unavailable()).pipe(Effect.provideService(D1BatchStatements, nativeCollector));
|
|
@@ -41,6 +41,8 @@ const makeD1OAuthConnectedTarget = (databaseService, configuration) => {
|
|
|
41
41
|
settleSignIn: (input, prepare) => owner.run(original.settleSignIn(input, prepare)),
|
|
42
42
|
capture: (input) => owner.run(original.capture(input)),
|
|
43
43
|
issue: (input, prepare) => owner.run(original.issue(input, prepare)),
|
|
44
|
+
prepare: (input, prepare) => owner.run(original.prepare(input, prepare)),
|
|
45
|
+
inspectPrepared: (input) => owner.run(original.inspectPrepared(input)),
|
|
44
46
|
preflight: (input) => owner.run(original.preflight(input)),
|
|
45
47
|
claim: (input, prepare) => owner.run(original.claim(input, prepare)),
|
|
46
48
|
inspectGrant: (input) => owner.run(original.inspectGrant(input)),
|
|
@@ -55,10 +57,10 @@ const makeD1OAuthConnectedTarget = (databaseService, configuration) => {
|
|
|
55
57
|
cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare))
|
|
56
58
|
}).pipe(Context.add(D1BatchStatements, owner.collector));
|
|
57
59
|
return yield* owner.close(Effect.provideContext(body, provided));
|
|
58
|
-
})));
|
|
60
|
+
})).pipe(Effect.provideService(NativeDatabase, database)));
|
|
59
61
|
}
|
|
60
62
|
function coordinateOAuthConnectedRevocations(acquire, options, body) {
|
|
61
|
-
return Effect.flatMap(acquire, (database) => coordinateTargetOAuthConnectedRevocations(database, options.mapping, configuration, (_tx, services, append) => Effect.gen(function* () {
|
|
63
|
+
return Effect.flatMap(nativeDatabase(acquire), (database) => coordinateTargetOAuthConnectedRevocations(database, options.mapping, configuration, (_tx, services, append) => Effect.gen(function* () {
|
|
62
64
|
const original = services.oauthConnectedRevocations;
|
|
63
65
|
const nativeCollector = D1BatchStatements.of({ append: (statement) => Effect.sync(() => append(statement)) });
|
|
64
66
|
const owner = yield* makeD1Owner(unavailable()).pipe(Effect.provideService(D1BatchStatements, nativeCollector));
|
|
@@ -67,7 +69,7 @@ const makeD1OAuthConnectedTarget = (databaseService, configuration) => {
|
|
|
67
69
|
settle: (input, prepare) => owner.run(original.settle(input, prepare))
|
|
68
70
|
}).pipe(Context.add(D1BatchStatements, owner.collector));
|
|
69
71
|
return yield* owner.close(Effect.provideContext(body, provided));
|
|
70
|
-
})));
|
|
72
|
+
})).pipe(Effect.provideService(NativeDatabase, database)));
|
|
71
73
|
}
|
|
72
74
|
return {
|
|
73
75
|
...makeOAuthConnectedTarget(databaseService, configuration),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-connected-drivers.mjs","names":[],"sources":["../../src/drizzle/oauth-connected-drivers.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n OAuthConnectedPersistence,\n OAuthConnectedRevocations,\n OAuthUnavailable,\n} from \"@yielded/auth/OAuth\";\nimport type { Table } from \"drizzle-orm\";\nimport { Effect, Context } from \"effect\";\n\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n OAuthConnectedMapping,\n OAuthConnectedRevocationMapping,\n} from \"./oauth-connected-model\";\nimport {\n coordinateTargetOAuthConnected,\n coordinateTargetOAuthConnectedRevocations,\n makeTargetOAuthConnectedServices,\n makeTargetOAuthConnectedRevocationServices,\n} from \"./oauth-connected-target\";\nimport { type OAuthCoordinatorError, type OAuthTargetConfiguration } from \"./oauth-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\n// oxlint-disable-next-line no-explicit-any -- inspect the actual installed native transaction callback without erasing it.\ntype TransactionOf<D> = D extends { readonly transaction: (...args: any[]) => any }\n ? Parameters<Parameters<D[\"transaction\"]>[0]>[0]\n : never;\nconst unavailable = () => OAuthUnavailable.make({});\n\nexport const makeOAuthConnectedTarget = <\n DatabaseId,\n Database,\n Family extends Table,\n Extra = {},\n Synchronous extends boolean = false,\n>(\n databaseService: Context.Service<DatabaseId, Database>,\n configuration: OAuthTargetConfiguration,\n) => {\n function coordinateOAuthConnected<\n D extends Database,\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<OAuthConnectedPersistence> : R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedPersistence>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnected<\n D extends Database,\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\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: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<OAuthConnectedPersistence | TxId> : R\n >,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedPersistence | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnected<\n D extends Database,\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\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: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthConnectedPersistence> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthConnected<TransactionOf<D>, A, E, Exclude<R, OAuthConnectedPersistence>>(\n database,\n options.mapping,\n configuration,\n (\n transaction: TransactionOf<D>,\n services: { readonly oauthConnectedPersistence: OAuthConnectedPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(\n OAuthConnectedPersistence,\n services.oauthConnectedPersistence,\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 function coordinateOAuthConnectedRevocations<\n D extends Database,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<OAuthConnectedRevocations> : R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedRevocations>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnectedRevocations<\n D extends Database,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\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: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<OAuthConnectedRevocations | TxId> : R\n >,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedRevocations | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnectedRevocations<\n D extends Database,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\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: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthConnectedRevocations> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthConnectedRevocations<\n TransactionOf<D>,\n A,\n E,\n Exclude<R, OAuthConnectedRevocations>\n >(\n database,\n options.mapping,\n configuration,\n (\n transaction: TransactionOf<D>,\n services: { readonly oauthConnectedRevocations: OAuthConnectedRevocations[\"Service\"] },\n ) => {\n const provided = Context.make(\n OAuthConnectedRevocations,\n services.oauthConnectedRevocations,\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 makeOAuthConnectedServices: <\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family = never,\n >(\n mapping: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra,\n ) =>\n makeTargetOAuthConnectedServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n ),\n makeOAuthConnectedRevocationServices: <\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\n >(\n mapping: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra,\n ) =>\n makeTargetOAuthConnectedRevocationServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n ),\n coordinateOAuthConnected,\n coordinateOAuthConnectedRevocations,\n };\n};\n\nexport const makeD1OAuthConnectedTarget = <DatabaseId, Database, Family extends Table, Extra>(\n databaseService: Context.Service<DatabaseId, Database>,\n configuration: OAuthTargetConfiguration,\n) => {\n function coordinateOAuthConnected<\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | Exclude<R, OAuthConnectedPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthConnected<\n Database,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthConnectedPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_tx, services, append) =>\n Effect.gen(function* () {\n const original = services.oauthConnectedPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: OAuthConnectedPersistence[\"Service\"] = {\n claimSignIn: (input, prepare) => owner.run(original.claimSignIn(input, prepare)),\n inspectSignIn: (input) => owner.run(original.inspectSignIn(input)),\n settleSignIn: (input, prepare) => owner.run(original.settleSignIn(input, prepare)),\n capture: (input) => owner.run(original.capture(input)),\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n preflight: (input) => owner.run(original.preflight(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n inspectGrant: (input) => owner.run(original.inspectGrant(input)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n list: (input) => owner.run(original.list(input)),\n inspectDisconnect: (input) => owner.run(original.inspectDisconnect(input)),\n disconnect: (input, prepare) => owner.run(original.disconnect(input, prepare)),\n inspectAccess: (input) => owner.run(original.inspectAccess(input)),\n claimRefresh: (input, prepare) => owner.run(original.claimRefresh(input, prepare)),\n settleRefresh: (input, prepare) => owner.run(original.settleRefresh(input, prepare)),\n admitUse: (input, prepare) => owner.run(original.admitUse(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthConnectedPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n }\n function coordinateOAuthConnectedRevocations<\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | Exclude<R, OAuthConnectedRevocations | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n > {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthConnectedRevocations<\n Database,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthConnectedRevocations | D1BatchStatements>\n >(database, options.mapping, configuration, (_tx, services, append) =>\n Effect.gen(function* () {\n const original = services.oauthConnectedRevocations;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: OAuthConnectedRevocations[\"Service\"] = {\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n };\n\n const provided = Context.make(OAuthConnectedRevocations, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n }\n\n return {\n ...makeOAuthConnectedTarget<DatabaseId, Database, Family, Extra>(\n databaseService,\n configuration,\n ),\n coordinateOAuthConnected,\n coordinateOAuthConnectedRevocations,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oauth-connected-drivers.mjs","names":[],"sources":["../../src/drizzle/oauth-connected-drivers.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n OAuthConnectedPersistence,\n OAuthConnectedRevocations,\n OAuthUnavailable,\n} from \"@yielded/auth/OAuth\";\nimport type { Table } from \"drizzle-orm\";\nimport { Effect, Context } from \"effect\";\n\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n OAuthConnectedMapping,\n OAuthConnectedRevocationMapping,\n} from \"./oauth-connected-model\";\nimport {\n coordinateTargetOAuthConnected,\n coordinateTargetOAuthConnectedRevocations,\n makeTargetOAuthConnectedServices,\n makeTargetOAuthConnectedRevocationServices,\n} from \"./oauth-connected-target\";\nimport { type OAuthCoordinatorError, type OAuthTargetConfiguration } from \"./oauth-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\n// oxlint-disable-next-line no-explicit-any -- inspect the actual installed native transaction callback without erasing it.\ntype TransactionOf<D> = D extends { readonly transaction: (...args: any[]) => any }\n ? Parameters<Parameters<D[\"transaction\"]>[0]>[0]\n : never;\nconst unavailable = () => OAuthUnavailable.make({});\n\nexport const makeOAuthConnectedTarget = <\n DatabaseId,\n Database,\n Family extends Table,\n Extra = {},\n Synchronous extends boolean = false,\n>(\n databaseService: Context.Service<DatabaseId, Database>,\n configuration: OAuthTargetConfiguration,\n) => {\n function coordinateOAuthConnected<\n D extends Database,\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<OAuthConnectedPersistence> : R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedPersistence>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnected<\n D extends Database,\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\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: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<OAuthConnectedPersistence | TxId> : R\n >,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedPersistence | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnected<\n D extends Database,\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\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: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthConnectedPersistence> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthConnected<TransactionOf<D>, A, E, Exclude<R, OAuthConnectedPersistence>>(\n database,\n options.mapping,\n configuration,\n (\n transaction: TransactionOf<D>,\n services: { readonly oauthConnectedPersistence: OAuthConnectedPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(\n OAuthConnectedPersistence,\n services.oauthConnectedPersistence,\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 function coordinateOAuthConnectedRevocations<\n D extends Database,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra;\n readonly transaction?: never;\n },\n body: Effect.Effect<A, E, Synchronous extends true ? NoInfer<OAuthConnectedRevocations> : R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedRevocations>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnectedRevocations<\n D extends Database,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\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: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<\n A,\n E,\n Synchronous extends true ? NoInfer<OAuthConnectedRevocations | TxId> : R\n >,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | (Synchronous extends true ? never : Exclude<R, OAuthConnectedRevocations | TxId>)\n | LifecycleHooks\n | DatabaseRequirements\n >;\n function coordinateOAuthConnectedRevocations<\n D extends Database,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\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: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthConnectedRevocations> | LifecycleHooks | DatabaseRequirements\n > {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthConnectedRevocations<\n TransactionOf<D>,\n A,\n E,\n Exclude<R, OAuthConnectedRevocations>\n >(\n database,\n options.mapping,\n configuration,\n (\n transaction: TransactionOf<D>,\n services: { readonly oauthConnectedRevocations: OAuthConnectedRevocations[\"Service\"] },\n ) => {\n const provided = Context.make(\n OAuthConnectedRevocations,\n services.oauthConnectedRevocations,\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 makeOAuthConnectedServices: <\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family = never,\n >(\n mapping: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra,\n ) =>\n makeTargetOAuthConnectedServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n ),\n makeOAuthConnectedRevocationServices: <\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\n >(\n mapping: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra,\n ) =>\n makeTargetOAuthConnectedRevocationServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(databaseService)),\n ),\n coordinateOAuthConnected,\n coordinateOAuthConnectedRevocations,\n };\n};\n\nexport const makeD1OAuthConnectedTarget = <DatabaseId, Database, Family extends Table, Extra>(\n databaseService: Context.Service<DatabaseId, Database>,\n configuration: OAuthTargetConfiguration,\n) => {\n function coordinateOAuthConnected<\n S extends Family,\n AC extends Family,\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n UA extends Family,\n DC extends Family,\n N,\n J extends Family,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthConnectedMapping<S, AC, T, O, F, G, C, H, UA, DC, N, J> & Extra;\n },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | Exclude<R, OAuthConnectedPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n > {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthConnected<\n Database,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthConnectedPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_tx, services, append) =>\n Effect.gen(function* () {\n const original = services.oauthConnectedPersistence;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: OAuthConnectedPersistence[\"Service\"] = {\n claimSignIn: (input, prepare) => owner.run(original.claimSignIn(input, prepare)),\n inspectSignIn: (input) => owner.run(original.inspectSignIn(input)),\n settleSignIn: (input, prepare) => owner.run(original.settleSignIn(input, prepare)),\n capture: (input) => owner.run(original.capture(input)),\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n prepare: (input, prepare) => owner.run(original.prepare(input, prepare)),\n inspectPrepared: (input) => owner.run(original.inspectPrepared(input)),\n preflight: (input) => owner.run(original.preflight(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n inspectGrant: (input) => owner.run(original.inspectGrant(input)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n list: (input) => owner.run(original.list(input)),\n inspectDisconnect: (input) => owner.run(original.inspectDisconnect(input)),\n disconnect: (input, prepare) => owner.run(original.disconnect(input, prepare)),\n inspectAccess: (input) => owner.run(original.inspectAccess(input)),\n claimRefresh: (input, prepare) => owner.run(original.claimRefresh(input, prepare)),\n settleRefresh: (input, prepare) => owner.run(original.settleRefresh(input, prepare)),\n admitUse: (input, prepare) => owner.run(original.admitUse(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthConnectedPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n }\n function coordinateOAuthConnectedRevocations<\n T extends Family,\n O extends Family,\n F extends Family,\n G extends Family,\n C extends Family,\n H extends Family,\n J extends Family,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n >(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthConnectedRevocationMapping<T, O, F, G, C, H, J, N> & Extra },\n body: Effect.Effect<A, E, R>,\n ): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n | Exclude<R, OAuthConnectedRevocations | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n > {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetOAuthConnectedRevocations<\n Database,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthConnectedRevocations | D1BatchStatements>\n >(database, options.mapping, configuration, (_tx, services, append) =>\n Effect.gen(function* () {\n const original = services.oauthConnectedRevocations;\n\n const nativeCollector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, nativeCollector),\n );\n\n const service: OAuthConnectedRevocations[\"Service\"] = {\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n };\n\n const provided = Context.make(OAuthConnectedRevocations, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n }\n\n return {\n ...makeOAuthConnectedTarget<DatabaseId, Database, Family, Extra>(\n databaseService,\n configuration,\n ),\n coordinateOAuthConnected,\n coordinateOAuthConnectedRevocations,\n };\n};\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { digest, invariant, oauthIdentityKey, sameIdentity, sameRevision } from
|
|
|
2
2
|
import { both } from "./transaction-owner.mjs";
|
|
3
3
|
import { CurrentOAuthTransaction, copiedRow, equal } from "./oauth-owner.mjs";
|
|
4
4
|
import "./oauth-registration.mjs";
|
|
5
|
-
import { action, claimStorage, client, clientKey, cohort, configuration, contextStorage, current, flowStorage, grantStorage, nativeCopy, nativeOrder, nextOrder, orderNumber, readGrant, tokenContextStorage, touchScope } from "./oauth-connected-state.mjs";
|
|
5
|
+
import { action, claimStorage, client, clientKey, cohort, configuration, contextStorage, current, flowStorage, grantStorage, nativeCopy, nativeOrder, nextOrder, orderNumber, readGrant, tokenContextStorage, touchScope, useAuthority } from "./oauth-connected-state.mjs";
|
|
6
6
|
import { sql } from "drizzle-orm";
|
|
7
7
|
import { Effect } from "effect";
|
|
8
8
|
import * as M from "@yielded/auth/OAuth";
|
|
@@ -39,14 +39,17 @@ const expected = (flow) => ({
|
|
|
39
39
|
maximumAgeMillis: flow.context.maximumEvidenceAgeMillis,
|
|
40
40
|
configuration: configuration(flow)
|
|
41
41
|
});
|
|
42
|
-
const
|
|
42
|
+
const retain = Effect.fn("oauthConnected.retain")(function* (mapping, input) {
|
|
43
43
|
const owner = yield* CurrentOAuthTransaction;
|
|
44
44
|
const flow = snapshotOAuthSync(M.OAuthConnectedPendingFlow, input.flow), c = flow.context;
|
|
45
45
|
const found = yield* current(mapping, c.revision.subjectId);
|
|
46
|
-
if (found === void 0
|
|
46
|
+
if (found === void 0) return { _tag: "Rejected" };
|
|
47
|
+
if (input._tag === "Prepare") {
|
|
48
|
+
if (input.authorization.moduleId !== c.moduleId || !sameRevision(input.authorization.revision, c.revision) || !sameRevision(found.revision, c.revision) || (yield* useAuthority(mapping, input.authorization, "metadata")) === void 0) return { _tag: "Rejected" };
|
|
49
|
+
} else if (!(yield* action(mapping, found, input.authorization, "issue", expected(flow)))) return { _tag: "Rejected" };
|
|
47
50
|
if (c.profile.revocation === "cohort") invariant(mapping.revocation.mode === "cohort");
|
|
48
|
-
const client$
|
|
49
|
-
invariant(client$
|
|
51
|
+
const client$1 = yield* client(mapping, configuration(flow), true);
|
|
52
|
+
invariant(client$1 !== void 0);
|
|
50
53
|
const now = yield* owner.now(mapping.clock), f = mapping.flow;
|
|
51
54
|
if (!live(flow, now)) return { _tag: "Rejected" };
|
|
52
55
|
if (c.reconnect !== void 0) {
|
|
@@ -63,6 +66,28 @@ const issue = Effect.fn("oauthConnected.issue")(function* (mapping, input) {
|
|
|
63
66
|
[f.moduleId]: c.moduleId,
|
|
64
67
|
[f.commandId]: c.commandId
|
|
65
68
|
}), { limit: 1 });
|
|
69
|
+
owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${c.issuedAtMillis} and ${mapping.clock.engineNowMillis} < ${c.expiresAtMillis}`);
|
|
70
|
+
if (input._tag === "Issue") {
|
|
71
|
+
const row = prior.rows[0];
|
|
72
|
+
if (row === void 0 || command.rows[0] === void 0 || row[f.state] !== "Prepared" || row[f.snapshot] !== flowStorage.encode(flow) || command.rows[0][f.flowId] !== c.flowId) return { _tag: "Rejected" };
|
|
73
|
+
yield* owner.update(f.table, {
|
|
74
|
+
...key,
|
|
75
|
+
[f.state]: "Prepared",
|
|
76
|
+
[f.version]: row[f.version]
|
|
77
|
+
}, {
|
|
78
|
+
[f.state]: "Pending",
|
|
79
|
+
[f.version]: owner.marker
|
|
80
|
+
});
|
|
81
|
+
owner.postconditions.push(sql`exists(select 1 from ${f.table} where ${equal(f.table, {
|
|
82
|
+
...key,
|
|
83
|
+
[f.state]: "Pending",
|
|
84
|
+
[f.version]: owner.marker
|
|
85
|
+
})})`);
|
|
86
|
+
return {
|
|
87
|
+
_tag: "Issued",
|
|
88
|
+
flow
|
|
89
|
+
};
|
|
90
|
+
}
|
|
66
91
|
if (prior.rows.length || command.rows.length) return { _tag: "Rejected" };
|
|
67
92
|
const values = {
|
|
68
93
|
...f.encodeInsert({
|
|
@@ -72,9 +97,9 @@ const issue = Effect.fn("oauthConnected.issue")(function* (mapping, input) {
|
|
|
72
97
|
...key,
|
|
73
98
|
[f.commandId]: c.commandId,
|
|
74
99
|
[f.subjectId]: found.nativeId,
|
|
75
|
-
[f.clientKey]: client$
|
|
100
|
+
[f.clientKey]: client$1.id,
|
|
76
101
|
[f.cohortKey]: null,
|
|
77
|
-
[f.state]: "
|
|
102
|
+
[f.state]: "Prepared",
|
|
78
103
|
[f.version]: owner.marker,
|
|
79
104
|
[f.stateDigest]: c.stateDigest,
|
|
80
105
|
[f.snapshot]: flowStorage.encode(flow),
|
|
@@ -92,12 +117,36 @@ const issue = Effect.fn("oauthConnected.issue")(function* (mapping, input) {
|
|
|
92
117
|
prior.rows = inserted.rows;
|
|
93
118
|
command.rows = inserted.rows;
|
|
94
119
|
if (inserted.rows[0]?.[f.version] !== owner.marker) return { _tag: "Rejected" };
|
|
95
|
-
owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${c.issuedAtMillis} and ${mapping.clock.engineNowMillis} < ${c.expiresAtMillis}`);
|
|
96
120
|
return {
|
|
97
121
|
_tag: "Issued",
|
|
98
122
|
flow
|
|
99
123
|
};
|
|
100
124
|
});
|
|
125
|
+
const prepare = (mapping, input) => retain(mapping, {
|
|
126
|
+
_tag: "Prepare",
|
|
127
|
+
...input
|
|
128
|
+
});
|
|
129
|
+
const issue = (mapping, input) => retain(mapping, {
|
|
130
|
+
_tag: "Issue",
|
|
131
|
+
...input
|
|
132
|
+
});
|
|
133
|
+
const inspectPrepared = Effect.fn("oauthConnected.inspectPrepared")(function* (mapping, access) {
|
|
134
|
+
const owner = yield* CurrentOAuthTransaction;
|
|
135
|
+
const found = yield* current(mapping, access.subjectId);
|
|
136
|
+
if (found === void 0) return void 0;
|
|
137
|
+
const f = mapping.flow;
|
|
138
|
+
const row = (yield* owner.read(f.table, equal(f.table, {
|
|
139
|
+
[f.moduleId]: access.moduleId,
|
|
140
|
+
[f.flowId]: access.flowId,
|
|
141
|
+
[f.subjectId]: found.nativeId
|
|
142
|
+
}), { limit: 1 })).rows[0];
|
|
143
|
+
if (row === void 0 || row[f.state] !== "Prepared" || row[f.snapshot] === null) return void 0;
|
|
144
|
+
const flow = flowStorage.decode(row[f.snapshot]);
|
|
145
|
+
const c = flow.context;
|
|
146
|
+
invariant(row[f.moduleId] === c.moduleId && row[f.flowId] === c.flowId && row[f.commandId] === c.commandId && mapping.subjectId.equals(found.nativeId, row[f.subjectId]) && row[f.clientKey] === clientKey(configuration(flow)) && row[f.stateDigest] === c.stateDigest && mapping.clock.decodeInstant(row[f.expiresAt]) === c.expiresAtMillis && mapping.clock.decodeInstant(row[f.retentionUntil]) === flow.retentionUntilMillis);
|
|
147
|
+
const now = yield* owner.now(mapping.clock);
|
|
148
|
+
return c.moduleId === access.moduleId && c.generation === access.generation && c.flowId === access.flowId && c.commandId === access.commandId && c.revision.subjectId === access.subjectId && sameRevision(found.revision, c.revision) && c.requestBindingVerifier === access.requestBindingVerifier && c.requestBindingExpiresAtMillis === access.requestBindingExpiresAtMillis && live(flow, now) ? flow : void 0;
|
|
149
|
+
});
|
|
101
150
|
const sameTarget = (target, context) => target.grantId === context.grantId && target.grantVersion === context.grantVersion && target.tokenVersion === context.tokenVersion && target.cohortGeneration === context.cohortGeneration && sameIdentity(target.identity, context.identity) && tokenContextStorage.encode({
|
|
102
151
|
...context,
|
|
103
152
|
configuration: target.configuration
|
|
@@ -125,14 +174,14 @@ const claim = Effect.fn("oauthConnected.claim")(function* (mapping, input) {
|
|
|
125
174
|
const flow = snapshotOAuthSync(M.OAuthConnectedPendingFlow, input.flow), c = flow.context;
|
|
126
175
|
const found = yield* current(mapping, c.revision.subjectId);
|
|
127
176
|
if (found === void 0 || !(yield* action(mapping, found, input.authorization, "claim", expected(flow)))) return { _tag: "Rejected" };
|
|
128
|
-
const client$
|
|
129
|
-
if (client$
|
|
177
|
+
const client$2 = yield* client(mapping, configuration(flow), false);
|
|
178
|
+
if (client$2 === void 0) return { _tag: "Rejected" };
|
|
130
179
|
const read = yield* pending(mapping, input.access), now = yield* owner.now(mapping.clock), f = mapping.flow;
|
|
131
180
|
if (read === void 0 || read.row[f.state] !== "Pending" || flowStorage.encode(read.flow) !== flowStorage.encode(flow) || !live(flow, now)) return { _tag: "Rejected" };
|
|
132
181
|
const expires = now + c.claimLifetimeMillis;
|
|
133
182
|
invariant(Number.isSafeInteger(expires) && expires <= flow.retentionUntilMillis);
|
|
134
|
-
yield* touchScope(mapping, client$
|
|
135
|
-
const order = yield* nextOrder(mapping, client$
|
|
183
|
+
yield* touchScope(mapping, client$2.scope);
|
|
184
|
+
const order = yield* nextOrder(mapping, client$2);
|
|
136
185
|
const claimed = snapshotOAuthSync(M.OAuthConnectedClaim, {
|
|
137
186
|
flow,
|
|
138
187
|
claimId: input.claimId,
|
|
@@ -242,6 +291,6 @@ const inspectGrant = Effect.fn("oauthConnected.inspectGrant")(function* (mapping
|
|
|
242
291
|
};
|
|
243
292
|
});
|
|
244
293
|
//#endregion
|
|
245
|
-
export { capture, claim, exact, expected, inspectGrant, inspectTuple, issue, live, pending, preflight, sameTarget, terminal };
|
|
294
|
+
export { capture, claim, exact, expected, inspectGrant, inspectPrepared, inspectTuple, issue, live, pending, preflight, prepare, sameTarget, terminal };
|
|
246
295
|
|
|
247
296
|
//# sourceMappingURL=oauth-connected-flow.mjs.map
|