@yielded/auth-persistence-drizzle 0.1.0-beta.1 → 0.1.0-beta.13
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 +23 -18
- package/dist/D1.mjs +10 -4
- package/dist/D1.mjs.map +1 -1
- package/dist/Libsql.d.mts +58 -53
- package/dist/Libsql.mjs +20 -15
- package/dist/Libsql.mjs.map +1 -1
- package/dist/Mysql2.d.mts +58 -46
- package/dist/Mysql2.mjs +13 -6
- package/dist/Mysql2.mjs.map +1 -1
- package/dist/Pglite.d.mts +52 -41
- package/dist/Pglite.mjs +12 -7
- package/dist/Pglite.mjs.map +1 -1
- package/dist/Postgres.d.mts +59 -48
- package/dist/Postgres.mjs +12 -7
- package/dist/Postgres.mjs.map +1 -1
- package/dist/SqliteBun.d.mts +67 -62
- package/dist/SqliteBun.mjs +20 -14
- package/dist/SqliteBun.mjs.map +1 -1
- package/dist/SqliteDo.d.mts +58 -52
- package/dist/SqliteDo.mjs +26 -14
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +58 -53
- package/dist/SqliteNode.mjs +20 -14
- package/dist/SqliteNode.mjs.map +1 -1
- package/dist/SqliteWasm.d.mts +58 -53
- package/dist/SqliteWasm.mjs +20 -14
- package/dist/SqliteWasm.mjs.map +1 -1
- package/dist/drizzle/d1-database.d.mts +11 -0
- package/dist/drizzle/d1-database.mjs +8 -0
- package/dist/drizzle/d1-database.mjs.map +1 -0
- package/dist/drizzle/d1-emails.d.mts +8 -7
- package/dist/drizzle/d1-emails.mjs +7 -4
- package/dist/drizzle/d1-emails.mjs.map +1 -1
- package/dist/drizzle/d1-identity.mjs +12 -9
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/d1-oauth.d.mts +10 -9
- package/dist/drizzle/d1-oauth.mjs +7 -4
- package/dist/drizzle/d1-oauth.mjs.map +1 -1
- package/dist/drizzle/d1-passkey.d.mts +3 -14
- package/dist/drizzle/d1-passkey.mjs +2 -1
- package/dist/drizzle/d1-passkey.mjs.map +1 -1
- package/dist/drizzle/d1-password-prepared.d.mts +4 -3
- package/dist/drizzle/d1-password-prepared.mjs +3 -1
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
- package/dist/drizzle/d1-passwords.d.mts +6 -5
- package/dist/drizzle/d1-passwords.mjs +11 -7
- package/dist/drizzle/d1-passwords.mjs.map +1 -1
- package/dist/drizzle/d1-phone.d.mts +3 -4
- package/dist/drizzle/d1-phone.mjs +2 -1
- package/dist/drizzle/d1-phone.mjs.map +1 -1
- package/dist/drizzle/d1-planning.d.mts +1 -1
- package/dist/drizzle/d1-proofs.d.mts +4 -3
- package/dist/drizzle/d1-proofs.mjs +3 -1
- package/dist/drizzle/d1-proofs.mjs.map +1 -1
- package/dist/drizzle/d1-sessions.d.mts +11 -10
- package/dist/drizzle/d1-sessions.mjs +15 -9
- package/dist/drizzle/d1-sessions.mjs.map +1 -1
- package/dist/drizzle/d1-totp.d.mts +3 -4
- package/dist/drizzle/d1-totp.mjs +2 -1
- package/dist/drizzle/d1-totp.mjs.map +1 -1
- package/dist/drizzle/email-registration.mjs +2 -1
- package/dist/drizzle/email-registration.mjs.map +1 -1
- package/dist/drizzle/email-target.d.mts +7 -6
- package/dist/drizzle/email-target.mjs +10 -10
- package/dist/drizzle/email-target.mjs.map +1 -1
- package/dist/drizzle/mysql-database.d.mts +8 -0
- package/dist/drizzle/mysql-database.mjs +8 -0
- package/dist/drizzle/mysql-database.mjs.map +1 -0
- package/dist/drizzle/mysql-emails.d.mts +7 -6
- package/dist/drizzle/mysql-emails.mjs +12 -8
- package/dist/drizzle/mysql-emails.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +12 -9
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/mysql-password-prepared.d.mts +3 -2
- package/dist/drizzle/mysql-password-prepared.mjs +6 -2
- package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
- package/dist/drizzle/mysql-passwords.d.mts +6 -4
- package/dist/drizzle/mysql-passwords.mjs +11 -7
- package/dist/drizzle/mysql-passwords.mjs.map +1 -1
- package/dist/drizzle/mysql-proofs.d.mts +3 -2
- package/dist/drizzle/mysql-proofs.mjs +8 -4
- package/dist/drizzle/mysql-proofs.mjs.map +1 -1
- package/dist/drizzle/mysql-sessions.d.mts +11 -10
- package/dist/drizzle/mysql-sessions.mjs +16 -12
- package/dist/drizzle/mysql-sessions.mjs.map +1 -1
- package/dist/drizzle/native-database.mjs +10 -0
- package/dist/drizzle/native-database.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-drivers.mjs +7 -5
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-settlement.mjs +3 -2
- package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-sign-in.mjs +4 -3
- package/dist/drizzle/oauth-connected-sign-in.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +6 -7
- package/dist/drizzle/oauth-connected-target.mjs +4 -5
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs +8 -6
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-target.d.mts +12 -11
- package/dist/drizzle/oauth-target.mjs +13 -12
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey-drivers.mjs +8 -6
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-drivers.mjs +5 -3
- 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 +2 -1
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
- package/dist/drizzle/password-prepared-target.d.mts +3 -2
- package/dist/drizzle/password-prepared-target.mjs +4 -3
- package/dist/drizzle/password-prepared-target.mjs.map +1 -1
- package/dist/drizzle/password-registration.mjs +2 -1
- package/dist/drizzle/password-registration.mjs.map +1 -1
- package/dist/drizzle/password-target.d.mts +5 -4
- package/dist/drizzle/password-target.mjs +8 -8
- package/dist/drizzle/password-target.mjs.map +1 -1
- package/dist/drizzle/pg-database.d.mts +9 -0
- package/dist/drizzle/pg-database.mjs +8 -0
- package/dist/drizzle/pg-database.mjs.map +1 -0
- package/dist/drizzle/pg-emails.d.mts +7 -6
- package/dist/drizzle/pg-emails.mjs +12 -8
- package/dist/drizzle/pg-emails.mjs.map +1 -1
- package/dist/drizzle/pg-identity.mjs +12 -9
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/pg-password-prepared.d.mts +3 -2
- package/dist/drizzle/pg-password-prepared.mjs +6 -2
- package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
- package/dist/drizzle/pg-passwords.d.mts +6 -4
- package/dist/drizzle/pg-passwords.mjs +11 -7
- package/dist/drizzle/pg-passwords.mjs.map +1 -1
- package/dist/drizzle/pg-proofs.d.mts +3 -2
- package/dist/drizzle/pg-proofs.mjs +8 -4
- package/dist/drizzle/pg-proofs.mjs.map +1 -1
- package/dist/drizzle/pg-sessions.d.mts +11 -10
- package/dist/drizzle/pg-sessions.mjs +16 -12
- package/dist/drizzle/pg-sessions.mjs.map +1 -1
- package/dist/drizzle/phone-target.d.mts +4 -3
- package/dist/drizzle/phone-target.mjs +12 -11
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/proof-target.d.mts +3 -2
- package/dist/drizzle/proof-target.mjs +5 -5
- package/dist/drizzle/proof-target.mjs.map +1 -1
- package/dist/drizzle/session-sql.d.mts +1 -0
- package/dist/drizzle/session-target.d.mts +10 -8
- package/dist/drizzle/session-target.mjs +11 -11
- package/dist/drizzle/session-target.mjs.map +1 -1
- package/dist/drizzle/sqlite-emails.mjs +9 -5
- package/dist/drizzle/sqlite-emails.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +14 -11
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/sqlite-password-prepared.mjs +7 -3
- package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
- package/dist/drizzle/sqlite-passwords.mjs +10 -6
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
- package/dist/drizzle/sqlite-proofs.mjs +7 -3
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
- package/dist/drizzle/sqlite-sessions.mjs +16 -12
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
- package/dist/drizzle/standalone-guard.d.mts +2 -0
- package/dist/drizzle/standalone-guard.mjs +8 -4
- package/dist/drizzle/standalone-guard.mjs.map +1 -1
- package/dist/drizzle/totp-target.d.mts +4 -3
- package/dist/drizzle/totp-target.mjs +31 -28
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/package.json +1 -1
- package/src/D1.ts +37 -10
- package/src/Libsql.ts +45 -17
- package/src/Mysql2.ts +39 -13
- package/src/Pglite.ts +47 -13
- package/src/Postgres.ts +47 -13
- package/src/SqliteBun.ts +58 -30
- package/src/SqliteDo.ts +61 -19
- package/src/SqliteNode.ts +55 -28
- package/src/SqliteWasm.ts +55 -28
- package/src/drizzle/d1-database.ts +10 -0
- package/src/drizzle/d1-emails.ts +84 -84
- package/src/drizzle/d1-identity.ts +17 -20
- package/src/drizzle/d1-oauth.ts +19 -8
- package/src/drizzle/d1-passkey.ts +5 -1
- package/src/drizzle/d1-password-prepared.ts +38 -37
- package/src/drizzle/d1-passwords.ts +118 -108
- package/src/drizzle/d1-phone.ts +5 -1
- package/src/drizzle/d1-proofs.ts +29 -30
- package/src/drizzle/d1-sessions.ts +51 -38
- package/src/drizzle/d1-totp.ts +5 -1
- package/src/drizzle/email-registration.ts +6 -2
- package/src/drizzle/email-target.ts +17 -19
- package/src/drizzle/mysql-database.ts +8 -0
- package/src/drizzle/mysql-emails.ts +28 -16
- package/src/drizzle/mysql-identity.ts +18 -21
- package/src/drizzle/mysql-password-prepared.ts +10 -8
- package/src/drizzle/mysql-passwords.ts +21 -9
- package/src/drizzle/mysql-proofs.ts +16 -5
- package/src/drizzle/mysql-sessions.ts +40 -17
- package/src/drizzle/native-database.ts +22 -0
- package/src/drizzle/oauth-connected-drivers.ts +18 -6
- package/src/drizzle/oauth-connected-settlement.ts +5 -3
- package/src/drizzle/oauth-connected-sign-in.ts +7 -3
- package/src/drizzle/oauth-connected-target.ts +16 -17
- package/src/drizzle/oauth-drivers.ts +26 -10
- package/src/drizzle/oauth-target.ts +30 -42
- package/src/drizzle/passkey-drivers.ts +21 -13
- package/src/drizzle/passkey-write-drivers.ts +11 -6
- package/src/drizzle/password-prepared-sql.ts +2 -4
- package/src/drizzle/password-prepared-target.ts +9 -6
- package/src/drizzle/password-registration.ts +7 -8
- package/src/drizzle/password-target.ts +19 -18
- package/src/drizzle/pg-database.ts +10 -0
- package/src/drizzle/pg-emails.ts +28 -16
- package/src/drizzle/pg-identity.ts +18 -22
- package/src/drizzle/pg-password-prepared.ts +10 -8
- package/src/drizzle/pg-passwords.ts +21 -9
- package/src/drizzle/pg-proofs.ts +16 -5
- package/src/drizzle/pg-sessions.ts +40 -17
- package/src/drizzle/phone-target.ts +22 -17
- package/src/drizzle/proof-target.ts +9 -12
- package/src/drizzle/session-target.ts +32 -50
- package/src/drizzle/sqlite-emails.ts +30 -13
- package/src/drizzle/sqlite-identity.ts +22 -42
- package/src/drizzle/sqlite-password-prepared.ts +23 -9
- package/src/drizzle/sqlite-passwords.ts +29 -15
- package/src/drizzle/sqlite-proofs.ts +28 -5
- package/src/drizzle/sqlite-sessions.ts +49 -23
- package/src/drizzle/standalone-guard.ts +18 -6
- package/src/drizzle/totp-target.ts +61 -60
- package/dist/drizzle/d1-identity.d.mts +0 -30
- package/dist/drizzle/mysql-identity.d.mts +0 -21
- package/dist/drizzle/pg-identity.d.mts +0 -22
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
type EmailRegistrationConfiguration,
|
|
16
16
|
} from "./email-registration";
|
|
17
17
|
import {
|
|
18
|
+
CurrentEmailSql,
|
|
18
19
|
makeSqlEmailAddressPersistence,
|
|
19
20
|
makeSqlEmailSignInTargets,
|
|
20
21
|
type EmailSqlConfiguration,
|
|
@@ -22,7 +23,7 @@ import {
|
|
|
22
23
|
type EmailSqlQuery,
|
|
23
24
|
} from "./email-sql";
|
|
24
25
|
import type { ProofTargetConfiguration } from "./proof-target";
|
|
25
|
-
import { sqlClientStandaloneGuard } from "./standalone-guard";
|
|
26
|
+
import { sqlClientStandaloneGuard, type TransactionService } from "./standalone-guard";
|
|
26
27
|
|
|
27
28
|
export interface EmailTargetConfiguration {
|
|
28
29
|
readonly mode: "interactive" | "synchronous";
|
|
@@ -46,9 +47,9 @@ export type EmailCoordinatorError<E> =
|
|
|
46
47
|
| SqlError.SqlError;
|
|
47
48
|
|
|
48
49
|
export const sqlClientEmailStandaloneGuard = (
|
|
49
|
-
|
|
50
|
+
service: TransactionService | undefined,
|
|
50
51
|
): Effect.Effect<void, EmailUnavailable> =>
|
|
51
|
-
sqlClientStandaloneGuard(
|
|
52
|
+
sqlClientStandaloneGuard(service, () => EmailUnavailable.make({}));
|
|
52
53
|
|
|
53
54
|
const proofConfiguration = (configuration: EmailTargetConfiguration, coordinated = false) => ({
|
|
54
55
|
mode: configuration.proof.mode,
|
|
@@ -93,13 +94,12 @@ const registrationOptions = (
|
|
|
93
94
|
});
|
|
94
95
|
|
|
95
96
|
export const makeTargetEmailSignInServices = (
|
|
96
|
-
database: any,
|
|
97
97
|
mapping: any,
|
|
98
98
|
configuration: EmailTargetConfiguration,
|
|
99
99
|
) =>
|
|
100
100
|
Effect.gen(function* () {
|
|
101
101
|
return {
|
|
102
|
-
emailSignInTargets: yield* makeSqlEmailSignInTargets(
|
|
102
|
+
emailSignInTargets: yield* makeSqlEmailSignInTargets(mapping, {
|
|
103
103
|
mode: configuration.mode,
|
|
104
104
|
locking: false,
|
|
105
105
|
standaloneGuard: configuration.standaloneGuard,
|
|
@@ -108,7 +108,6 @@ export const makeTargetEmailSignInServices = (
|
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
export const makeTargetEmailAddressServices = (
|
|
111
|
-
database: any,
|
|
112
111
|
mapping: any,
|
|
113
112
|
proofMapping: any,
|
|
114
113
|
configuration: EmailTargetConfiguration,
|
|
@@ -116,7 +115,6 @@ export const makeTargetEmailAddressServices = (
|
|
|
116
115
|
Effect.gen(function* () {
|
|
117
116
|
return {
|
|
118
117
|
emailAddressPersistence: yield* makeSqlEmailAddressPersistence(
|
|
119
|
-
database,
|
|
120
118
|
mapping,
|
|
121
119
|
addressOptions(configuration, proofMapping),
|
|
122
120
|
),
|
|
@@ -124,7 +122,6 @@ export const makeTargetEmailAddressServices = (
|
|
|
124
122
|
});
|
|
125
123
|
|
|
126
124
|
export const makeTargetEmailRegistrationServices = <Registration>(
|
|
127
|
-
database: any,
|
|
128
125
|
mapping: any,
|
|
129
126
|
proofMapping: any,
|
|
130
127
|
configuration: EmailTargetConfiguration,
|
|
@@ -132,7 +129,6 @@ export const makeTargetEmailRegistrationServices = <Registration>(
|
|
|
132
129
|
Effect.gen(function* () {
|
|
133
130
|
return {
|
|
134
131
|
registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(
|
|
135
|
-
database,
|
|
136
132
|
mapping,
|
|
137
133
|
registrationOptions(configuration, proofMapping),
|
|
138
134
|
),
|
|
@@ -161,9 +157,10 @@ export const coordinateTargetEmailAddress = <Transaction, A, E, R>(
|
|
|
161
157
|
Effect.gen(function* () {
|
|
162
158
|
return yield* owner(transaction, {
|
|
163
159
|
emailAddressPersistence: yield* makeSqlEmailAddressPersistence(
|
|
164
|
-
transaction as unknown as EmailSqlDatabase,
|
|
165
160
|
mapping,
|
|
166
161
|
addressOptions(configuration, proofMapping, true),
|
|
162
|
+
).pipe(
|
|
163
|
+
Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),
|
|
167
164
|
),
|
|
168
165
|
});
|
|
169
166
|
}),
|
|
@@ -196,9 +193,10 @@ export const coordinateTargetEmailRegistration = <Registration, Transaction, A,
|
|
|
196
193
|
Effect.gen(function* () {
|
|
197
194
|
return yield* owner(transaction, {
|
|
198
195
|
registrationAuthority: yield* makeSqlEmailRegistrationAuthority<Registration>(
|
|
199
|
-
transaction as unknown as EmailSqlDatabase,
|
|
200
196
|
mapping,
|
|
201
197
|
registrationOptions(configuration, proofMapping, true),
|
|
198
|
+
).pipe(
|
|
199
|
+
Effect.provideService(CurrentEmailSql, transaction as unknown as EmailSqlDatabase),
|
|
202
200
|
),
|
|
203
201
|
});
|
|
204
202
|
}),
|
|
@@ -209,19 +207,19 @@ export const coordinateTargetEmailRegistration = <Registration, Transaction, A,
|
|
|
209
207
|
return result.value;
|
|
210
208
|
});
|
|
211
209
|
|
|
212
|
-
export const emailSignInTargetsLayer = (
|
|
213
|
-
services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets["Service"] }>,
|
|
210
|
+
export const emailSignInTargetsLayer = <E, R>(
|
|
211
|
+
services: Effect.Effect<{ readonly emailSignInTargets: EmailSignInTargets["Service"] }, E, R>,
|
|
214
212
|
) =>
|
|
215
213
|
Layer.effect(
|
|
216
214
|
EmailSignInTargets,
|
|
217
215
|
Effect.map(services, (value) => value.emailSignInTargets),
|
|
218
216
|
);
|
|
219
217
|
|
|
220
|
-
export const emailAddressPersistenceLayer = (
|
|
218
|
+
export const emailAddressPersistenceLayer = <E, R>(
|
|
221
219
|
services: Effect.Effect<
|
|
222
220
|
{ readonly emailAddressPersistence: EmailAddressPersistence["Service"] },
|
|
223
|
-
|
|
224
|
-
|
|
221
|
+
E,
|
|
222
|
+
R
|
|
225
223
|
>,
|
|
226
224
|
) =>
|
|
227
225
|
Layer.effect(
|
|
@@ -229,12 +227,12 @@ export const emailAddressPersistenceLayer = (
|
|
|
229
227
|
Effect.map(services, (value) => value.emailAddressPersistence),
|
|
230
228
|
);
|
|
231
229
|
|
|
232
|
-
export const emailRegistrationLayer = <Id, Registration>(
|
|
230
|
+
export const emailRegistrationLayer = <Id, Registration, E, R>(
|
|
233
231
|
tag: Context.Key<Id, EmailRegistrationAuthority<Registration>>,
|
|
234
232
|
services: Effect.Effect<
|
|
235
233
|
{ readonly registrationAuthority: EmailRegistrationAuthority<Registration> },
|
|
236
|
-
|
|
237
|
-
|
|
234
|
+
E,
|
|
235
|
+
R
|
|
238
236
|
>,
|
|
239
237
|
) =>
|
|
240
238
|
Layer.effect(
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AnyRelations } from "drizzle-orm";
|
|
2
|
+
import type { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
|
|
3
|
+
import { Context } from "effect";
|
|
4
|
+
|
|
5
|
+
/** Application-owned MySQL database used to construct persistence services. */
|
|
6
|
+
export class Database extends Context.Service<Database, EffectMysql2Database<AnyRelations>>()(
|
|
7
|
+
"effect-auth/persistence-drizzle/Mysql2/Database",
|
|
8
|
+
) {}
|
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
EmailSignInMapping,
|
|
14
14
|
} from "./email-model";
|
|
15
15
|
import type { EmailRegistrationAuthority } from "./email-registration";
|
|
16
|
+
import { CurrentEmailSql } from "./email-sql";
|
|
16
17
|
import type { EmailSqlQuery } from "./email-sql";
|
|
17
18
|
import {
|
|
18
19
|
coordinateTargetEmailAddress,
|
|
@@ -22,9 +23,16 @@ import {
|
|
|
22
23
|
makeTargetEmailSignInServices,
|
|
23
24
|
sqlClientEmailStandaloneGuard,
|
|
24
25
|
} from "./email-target";
|
|
26
|
+
import { Database as DatabaseService } from "./mysql-database";
|
|
27
|
+
import { nativeDatabase } from "./native-database";
|
|
25
28
|
import type { ProofPersistenceMapping } from "./proof-model";
|
|
26
29
|
import type { ProofSqlQuery } from "./proof-sql";
|
|
27
30
|
import { sqlClientProofStandaloneGuard } from "./proof-target";
|
|
31
|
+
import {
|
|
32
|
+
type TransactionService,
|
|
33
|
+
acquireTransactionService,
|
|
34
|
+
transactionService,
|
|
35
|
+
} from "./standalone-guard";
|
|
28
36
|
import type { SuppliedService } from "./SuppliedService";
|
|
29
37
|
|
|
30
38
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
@@ -44,15 +52,15 @@ type ProofMapping = ProofPersistenceMapping<
|
|
|
44
52
|
any
|
|
45
53
|
>;
|
|
46
54
|
|
|
47
|
-
const configuration = (
|
|
55
|
+
const configuration = (service: TransactionService | undefined) => ({
|
|
48
56
|
mode: "interactive" as const,
|
|
49
57
|
locking: true,
|
|
50
|
-
standaloneGuard: sqlClientEmailStandaloneGuard(
|
|
58
|
+
standaloneGuard: sqlClientEmailStandaloneGuard(service),
|
|
51
59
|
generatedSubjectRows: (query: EmailSqlQuery) => query.$returningId(),
|
|
52
60
|
proof: {
|
|
53
61
|
mode: "interactive" as const,
|
|
54
62
|
locking: true,
|
|
55
|
-
standaloneGuard: sqlClientProofStandaloneGuard(
|
|
63
|
+
standaloneGuard: sqlClientProofStandaloneGuard(service),
|
|
56
64
|
insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>
|
|
57
65
|
query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),
|
|
58
66
|
},
|
|
@@ -64,9 +72,12 @@ export const makeMysqlEmailSignInServices = <
|
|
|
64
72
|
C extends AnyMySqlTable,
|
|
65
73
|
NativeId,
|
|
66
74
|
>(
|
|
67
|
-
database: Database,
|
|
68
75
|
mapping: EmailSignInMapping<S, I, C, NativeId>,
|
|
69
|
-
) =>
|
|
76
|
+
) =>
|
|
77
|
+
Effect.flatMap(
|
|
78
|
+
Effect.map(acquireTransactionService(DatabaseService), configuration),
|
|
79
|
+
(configuration) => makeTargetEmailSignInServices(mapping, configuration),
|
|
80
|
+
).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));
|
|
70
81
|
|
|
71
82
|
export const makeMysqlEmailAddressServices = <
|
|
72
83
|
S extends AnyMySqlTable,
|
|
@@ -76,10 +87,13 @@ export const makeMysqlEmailAddressServices = <
|
|
|
76
87
|
M extends AnyMySqlTable,
|
|
77
88
|
NativeId,
|
|
78
89
|
>(
|
|
79
|
-
database: Database,
|
|
80
90
|
mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,
|
|
81
91
|
proofMapping: ProofMapping,
|
|
82
|
-
) =>
|
|
92
|
+
) =>
|
|
93
|
+
Effect.flatMap(
|
|
94
|
+
Effect.map(acquireTransactionService(DatabaseService), configuration),
|
|
95
|
+
(configuration) => makeTargetEmailAddressServices(mapping, proofMapping, configuration),
|
|
96
|
+
).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));
|
|
83
97
|
|
|
84
98
|
export function coordinateMysqlEmailAddress<
|
|
85
99
|
D extends Database,
|
|
@@ -170,7 +184,7 @@ export function coordinateMysqlEmailAddress<
|
|
|
170
184
|
database,
|
|
171
185
|
options.mapping,
|
|
172
186
|
options.proofMapping,
|
|
173
|
-
configuration(database),
|
|
187
|
+
configuration(transactionService(database)),
|
|
174
188
|
(
|
|
175
189
|
transaction: TransactionOf<D>,
|
|
176
190
|
services: { readonly emailAddressPersistence: EmailAddressPersistence["Service"] },
|
|
@@ -195,16 +209,14 @@ export const makeMysqlEmailRegistrationServices = <
|
|
|
195
209
|
Rq extends AnyMySqlTable,
|
|
196
210
|
NativeId,
|
|
197
211
|
>(
|
|
198
|
-
database: Database,
|
|
199
212
|
mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
|
|
200
213
|
proofMapping: ProofMapping,
|
|
201
214
|
) =>
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
);
|
|
215
|
+
Effect.flatMap(
|
|
216
|
+
Effect.map(acquireTransactionService(DatabaseService), configuration),
|
|
217
|
+
(configuration) =>
|
|
218
|
+
makeTargetEmailRegistrationServices<Registration>(mapping, proofMapping, configuration),
|
|
219
|
+
).pipe(Effect.provideServiceEffect(CurrentEmailSql, nativeDatabase(DatabaseService)));
|
|
208
220
|
|
|
209
221
|
export function coordinateMysqlEmailRegistration<
|
|
210
222
|
TargetId,
|
|
@@ -304,7 +316,7 @@ export function coordinateMysqlEmailRegistration<
|
|
|
304
316
|
database,
|
|
305
317
|
options.mapping,
|
|
306
318
|
options.proofMapping,
|
|
307
|
-
configuration(database),
|
|
319
|
+
configuration(transactionService(database)),
|
|
308
320
|
(
|
|
309
321
|
transaction: TransactionOf<D>,
|
|
310
322
|
services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import { reportPersistenceFailure } from "@yielded/auth/Persistence";
|
|
11
11
|
import type { SubjectId } from "@yielded/auth/Schema";
|
|
12
12
|
/* oxlint-disable no-explicit-any -- Drizzle generic query types are narrowed at this technology boundary. */
|
|
13
|
-
import { and, eq
|
|
13
|
+
import { and, eq } from "drizzle-orm";
|
|
14
14
|
import type { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
|
|
15
15
|
import type { AnyMySqlTable, MySqlColumn } from "drizzle-orm/mysql-core";
|
|
16
16
|
import { Cause, Effect, Schema } from "effect";
|
|
@@ -24,8 +24,8 @@ import {
|
|
|
24
24
|
type IdentityTables,
|
|
25
25
|
type SubjectProvisioningTables,
|
|
26
26
|
} from "./model";
|
|
27
|
+
import { Database as DatabaseService } from "./mysql-database";
|
|
27
28
|
|
|
28
|
-
type Database = EffectMysql2Database<AnyRelations>;
|
|
29
29
|
type RuntimeDatabase = EffectMysql2Database<any>;
|
|
30
30
|
const unavailable = () => IdentityUnavailable.make();
|
|
31
31
|
const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
|
|
@@ -39,15 +39,14 @@ const mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
|
39
39
|
),
|
|
40
40
|
);
|
|
41
41
|
|
|
42
|
-
export const makeMysqlSubjectProvisioningServices = <
|
|
42
|
+
export const makeMysqlSubjectProvisioningServices = Effect.fnUntraced(function* <
|
|
43
43
|
Subject extends AnyMySqlTable,
|
|
44
44
|
Identifier extends AnyMySqlTable,
|
|
45
45
|
Request extends AnyMySqlTable,
|
|
46
46
|
NativeId,
|
|
47
|
-
>(
|
|
48
|
-
database
|
|
49
|
-
|
|
50
|
-
) => {
|
|
47
|
+
>(mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>) {
|
|
48
|
+
const database = yield* DatabaseService;
|
|
49
|
+
|
|
51
50
|
const db = database as RuntimeDatabase;
|
|
52
51
|
const requestTable = mapping.provisioningRequest.table;
|
|
53
52
|
|
|
@@ -190,16 +189,15 @@ export const makeMysqlSubjectProvisioningServices = <
|
|
|
190
189
|
}, mapUnavailable);
|
|
191
190
|
|
|
192
191
|
return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;
|
|
193
|
-
};
|
|
192
|
+
});
|
|
194
193
|
|
|
195
|
-
export const makeMysqlExternalIdentityServices = <
|
|
194
|
+
export const makeMysqlExternalIdentityServices = Effect.fnUntraced(function* <
|
|
196
195
|
Subject extends AnyMySqlTable,
|
|
197
196
|
External extends AnyMySqlTable,
|
|
198
197
|
NativeId,
|
|
199
|
-
>(
|
|
200
|
-
database
|
|
201
|
-
|
|
202
|
-
) => {
|
|
198
|
+
>(mapping: ExternalIdentityTables<Subject, External, NativeId>) {
|
|
199
|
+
const database = yield* DatabaseService;
|
|
200
|
+
|
|
203
201
|
const db = database as RuntimeDatabase;
|
|
204
202
|
const externalTable = mapping.externalIdentity.table;
|
|
205
203
|
|
|
@@ -307,18 +305,17 @@ export const makeMysqlExternalIdentityServices = <
|
|
|
307
305
|
}, mapUnavailable);
|
|
308
306
|
|
|
309
307
|
return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;
|
|
310
|
-
};
|
|
308
|
+
});
|
|
311
309
|
|
|
312
|
-
export const makeMysqlIdentityServices = <
|
|
310
|
+
export const makeMysqlIdentityServices = Effect.fnUntraced(function* <
|
|
313
311
|
Subject extends AnyMySqlTable,
|
|
314
312
|
Identifier extends AnyMySqlTable,
|
|
315
313
|
External extends AnyMySqlTable,
|
|
316
314
|
Request extends AnyMySqlTable,
|
|
317
315
|
NativeId,
|
|
318
|
-
>(
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
...makeMysqlExternalIdentityServices(database, mapping),
|
|
316
|
+
>(mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>) {
|
|
317
|
+
return {
|
|
318
|
+
...(yield* makeMysqlSubjectProvisioningServices(mapping)),
|
|
319
|
+
...(yield* makeMysqlExternalIdentityServices(mapping)),
|
|
320
|
+
};
|
|
324
321
|
});
|
|
@@ -6,7 +6,9 @@ import type { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
|
6
6
|
import { Effect, Context } from "effect";
|
|
7
7
|
import type { SqlError } from "effect/sql/SqlError";
|
|
8
8
|
|
|
9
|
+
import { Database as DatabaseService } from "./mysql-database";
|
|
9
10
|
import { mysqlPasswordConfiguration as configuration } from "./mysql-passwords";
|
|
11
|
+
import { nativeDatabase } from "./native-database";
|
|
10
12
|
import type {
|
|
11
13
|
PasswordPreparedPersistenceMapping,
|
|
12
14
|
PasswordPreparedProofMapping,
|
|
@@ -15,6 +17,8 @@ import {
|
|
|
15
17
|
makeTargetPasswordPreparedPersistenceServices,
|
|
16
18
|
coordinateTargetPasswordPreparedPersistence,
|
|
17
19
|
} from "./password-prepared-target";
|
|
20
|
+
import { CurrentPasswordSql } from "./password-sql";
|
|
21
|
+
import { acquireTransactionService, transactionService } from "./standalone-guard";
|
|
18
22
|
import type { SuppliedService } from "./SuppliedService";
|
|
19
23
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
20
24
|
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
@@ -39,16 +43,14 @@ export const makeMySqlPasswordPreparedPersistenceServices = <
|
|
|
39
43
|
PCr extends AnyMySqlTable = AnyMySqlTable,
|
|
40
44
|
PNativeId = unknown,
|
|
41
45
|
>(
|
|
42
|
-
database: Database,
|
|
43
46
|
mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, A, RS, CE, M, T, B, NativeId>,
|
|
44
47
|
proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,
|
|
45
48
|
) =>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
);
|
|
49
|
+
Effect.flatMap(
|
|
50
|
+
Effect.map(acquireTransactionService(DatabaseService), configuration),
|
|
51
|
+
(configuration) =>
|
|
52
|
+
makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping),
|
|
53
|
+
).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
|
|
52
54
|
|
|
53
55
|
export function coordinateMySqlPasswordPreparedPersistence<
|
|
54
56
|
TargetId,
|
|
@@ -186,7 +188,7 @@ export function coordinateMySqlPasswordPreparedPersistence<
|
|
|
186
188
|
coordinateTargetPasswordPreparedPersistence<TransactionOf<D>, Out, E, Exclude<R, TargetId>>(
|
|
187
189
|
database,
|
|
188
190
|
options.mapping,
|
|
189
|
-
configuration(database),
|
|
191
|
+
configuration(transactionService(database)),
|
|
190
192
|
options.proofMapping,
|
|
191
193
|
(
|
|
192
194
|
transaction: TransactionOf<D>,
|
|
@@ -7,8 +7,11 @@ import type { AnyMySqlTable } from "drizzle-orm/mysql-core";
|
|
|
7
7
|
import { Effect, Context } from "effect";
|
|
8
8
|
import type { SqlError } from "effect/sql/SqlError";
|
|
9
9
|
|
|
10
|
+
import { Database as DatabaseService } from "./mysql-database";
|
|
11
|
+
import { nativeDatabase } from "./native-database";
|
|
10
12
|
import type { PasswordPersistenceMapping, PasswordRegistrationMapping } from "./password-model";
|
|
11
13
|
import type { PasswordRegistrationAuthority } from "./password-registration";
|
|
14
|
+
import { CurrentPasswordSql } from "./password-sql";
|
|
12
15
|
import type { PasswordSqlQuery } from "./password-sql";
|
|
13
16
|
import {
|
|
14
17
|
coordinateTargetPasswordPersistence,
|
|
@@ -20,22 +23,27 @@ import {
|
|
|
20
23
|
import type { ProofPersistenceMapping } from "./proof-model";
|
|
21
24
|
import type { ProofSqlQuery } from "./proof-sql";
|
|
22
25
|
import { sqlClientProofStandaloneGuard } from "./proof-target";
|
|
26
|
+
import {
|
|
27
|
+
type TransactionService,
|
|
28
|
+
acquireTransactionService,
|
|
29
|
+
transactionService,
|
|
30
|
+
} from "./standalone-guard";
|
|
23
31
|
import type { SuppliedService } from "./SuppliedService";
|
|
24
32
|
|
|
25
33
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
26
34
|
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
27
35
|
|
|
28
|
-
const configuration = (
|
|
36
|
+
const configuration = (service: TransactionService | undefined) => ({
|
|
29
37
|
mode: "interactive" as const,
|
|
30
38
|
locking: true,
|
|
31
|
-
standaloneGuard: sqlClientPasswordStandaloneGuard(
|
|
39
|
+
standaloneGuard: sqlClientPasswordStandaloneGuard(service),
|
|
32
40
|
insertIfAbsent: (query: PasswordSqlQuery, selfKey: string, selfValue: unknown) =>
|
|
33
41
|
query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),
|
|
34
42
|
generatedSubjectRows: (query: PasswordSqlQuery) => query.$returningId(),
|
|
35
43
|
proof: {
|
|
36
44
|
mode: "interactive" as const,
|
|
37
45
|
locking: true,
|
|
38
|
-
standaloneGuard: sqlClientProofStandaloneGuard(
|
|
46
|
+
standaloneGuard: sqlClientProofStandaloneGuard(service),
|
|
39
47
|
insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>
|
|
40
48
|
query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),
|
|
41
49
|
},
|
|
@@ -64,7 +72,6 @@ export const makeMysqlPasswordPersistenceServices = <
|
|
|
64
72
|
M extends AnyMySqlTable,
|
|
65
73
|
NativeId,
|
|
66
74
|
>(
|
|
67
|
-
database: Database,
|
|
68
75
|
mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>,
|
|
69
76
|
proofMapping?: ProofPersistenceMapping<
|
|
70
77
|
any,
|
|
@@ -81,7 +88,10 @@ export const makeMysqlPasswordPersistenceServices = <
|
|
|
81
88
|
any
|
|
82
89
|
>,
|
|
83
90
|
) =>
|
|
84
|
-
|
|
91
|
+
Effect.flatMap(
|
|
92
|
+
Effect.map(acquireTransactionService(DatabaseService), configuration),
|
|
93
|
+
(configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping),
|
|
94
|
+
).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
|
|
85
95
|
|
|
86
96
|
export function coordinateMysqlPasswordPersistence<
|
|
87
97
|
D extends Database,
|
|
@@ -189,7 +199,7 @@ export function coordinateMysqlPasswordPersistence<
|
|
|
189
199
|
coordinateTargetPasswordPersistence<TransactionOf<D>, Out, E, Exclude<R, PasswordPersistence>>(
|
|
190
200
|
database,
|
|
191
201
|
options.mapping,
|
|
192
|
-
configuration(database),
|
|
202
|
+
configuration(transactionService(database)),
|
|
193
203
|
options.proofMapping,
|
|
194
204
|
(
|
|
195
205
|
transaction: TransactionOf<D>,
|
|
@@ -215,10 +225,12 @@ export const makeMysqlPasswordRegistrationServices = <
|
|
|
215
225
|
Rq extends AnyMySqlTable,
|
|
216
226
|
NativeId,
|
|
217
227
|
>(
|
|
218
|
-
database: Database,
|
|
219
228
|
mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
|
|
220
229
|
) =>
|
|
221
|
-
|
|
230
|
+
Effect.flatMap(
|
|
231
|
+
Effect.map(acquireTransactionService(DatabaseService), configuration),
|
|
232
|
+
(configuration) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration),
|
|
233
|
+
).pipe(Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)));
|
|
222
234
|
|
|
223
235
|
export function coordinateMysqlPasswordRegistration<
|
|
224
236
|
TargetId,
|
|
@@ -320,7 +332,7 @@ export function coordinateMysqlPasswordRegistration<
|
|
|
320
332
|
>(
|
|
321
333
|
database,
|
|
322
334
|
options.mapping,
|
|
323
|
-
configuration(database),
|
|
335
|
+
configuration(transactionService(database)),
|
|
324
336
|
(
|
|
325
337
|
transaction: TransactionOf<D>,
|
|
326
338
|
services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },
|
|
@@ -7,13 +7,21 @@ import { Effect, Context } from "effect";
|
|
|
7
7
|
import type { SqlError } from "effect/sql/SqlError";
|
|
8
8
|
|
|
9
9
|
import { updateValues } from "./model";
|
|
10
|
+
import { Database as DatabaseService } from "./mysql-database";
|
|
11
|
+
import { nativeDatabase } from "./native-database";
|
|
10
12
|
import type { ProofPersistenceMapping } from "./proof-model";
|
|
13
|
+
import { CurrentProofSql } from "./proof-sql";
|
|
11
14
|
import type { ProofSqlQuery } from "./proof-sql";
|
|
12
15
|
import {
|
|
13
16
|
coordinateTargetProofPersistence,
|
|
14
17
|
makeTargetProofPersistenceServices,
|
|
15
18
|
sqlClientProofStandaloneGuard,
|
|
16
19
|
} from "./proof-target";
|
|
20
|
+
import {
|
|
21
|
+
type TransactionService,
|
|
22
|
+
acquireTransactionService,
|
|
23
|
+
transactionService,
|
|
24
|
+
} from "./standalone-guard";
|
|
17
25
|
import type { SuppliedService } from "./SuppliedService";
|
|
18
26
|
|
|
19
27
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
@@ -33,10 +41,10 @@ type Mapping<
|
|
|
33
41
|
NativeId,
|
|
34
42
|
> = ProofPersistenceMapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>;
|
|
35
43
|
|
|
36
|
-
const configuration = (
|
|
44
|
+
const configuration = (service: TransactionService | undefined) => ({
|
|
37
45
|
mode: "interactive" as const,
|
|
38
46
|
locking: true,
|
|
39
|
-
standaloneGuard: sqlClientProofStandaloneGuard(
|
|
47
|
+
standaloneGuard: sqlClientProofStandaloneGuard(service),
|
|
40
48
|
insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>
|
|
41
49
|
query.onDuplicateKeyUpdate({
|
|
42
50
|
set: updateValues([[selfKey, selfValue]]),
|
|
@@ -57,9 +65,12 @@ export const makeMysqlProofPersistenceServices = <
|
|
|
57
65
|
Cr extends AnyMySqlTable,
|
|
58
66
|
NativeId,
|
|
59
67
|
>(
|
|
60
|
-
database: Database,
|
|
61
68
|
mapping: Mapping<Rq, S, G, Cn, Rs, A, F, C, Sub, I, Cr, NativeId>,
|
|
62
|
-
) =>
|
|
69
|
+
) =>
|
|
70
|
+
Effect.flatMap(
|
|
71
|
+
Effect.map(acquireTransactionService(DatabaseService), configuration),
|
|
72
|
+
(configuration) => makeTargetProofPersistenceServices(mapping, configuration),
|
|
73
|
+
).pipe(Effect.provideServiceEffect(CurrentProofSql, nativeDatabase(DatabaseService)));
|
|
63
74
|
|
|
64
75
|
export function coordinateMysqlProofPersistence<
|
|
65
76
|
D extends Database,
|
|
@@ -164,7 +175,7 @@ export function coordinateMysqlProofPersistence<
|
|
|
164
175
|
coordinateTargetProofPersistence<Transaction, A, E, Exclude<R, ProofPersistence>>(
|
|
165
176
|
database,
|
|
166
177
|
options.mapping,
|
|
167
|
-
configuration(database),
|
|
178
|
+
configuration(transactionService(database)),
|
|
168
179
|
(
|
|
169
180
|
transaction: Transaction,
|
|
170
181
|
services: { readonly proofPersistence: ProofPersistence["Service"] },
|