@yielded/auth-persistence-drizzle 0.1.0-beta.0 → 0.1.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/D1.d.mts +155 -40
- package/dist/D1.mjs +10 -6
- package/dist/D1.mjs.map +1 -1
- package/dist/Libsql.d.mts +251 -129
- package/dist/Libsql.mjs +20 -21
- package/dist/Libsql.mjs.map +1 -1
- package/dist/Mysql2.d.mts +208 -56
- package/dist/Mysql2.mjs +13 -8
- package/dist/Mysql2.mjs.map +1 -1
- package/dist/Pglite.d.mts +209 -57
- package/dist/Pglite.mjs +13 -9
- package/dist/Pglite.mjs.map +1 -1
- package/dist/Postgres.d.mts +207 -55
- package/dist/Postgres.mjs +13 -9
- package/dist/Postgres.mjs.map +1 -1
- package/dist/SqliteBun.d.mts +249 -126
- package/dist/SqliteBun.mjs +20 -18
- package/dist/SqliteBun.mjs.map +1 -1
- package/dist/SqliteDo.d.mts +248 -158
- package/dist/SqliteDo.mjs +26 -44
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +247 -124
- package/dist/SqliteNode.mjs +20 -18
- package/dist/SqliteNode.mjs.map +1 -1
- package/dist/SqliteWasm.d.mts +251 -128
- package/dist/SqliteWasm.mjs +20 -18
- package/dist/SqliteWasm.mjs.map +1 -1
- package/dist/drizzle/D1BatchStatements.d.mts +1 -1
- package/dist/drizzle/D1BatchStatements.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-generated-statement.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 +41 -10
- package/dist/drizzle/d1-oauth.mjs +8 -5
- 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 +7 -6
- package/dist/drizzle/d1-passwords.mjs +5 -2
- 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 +5 -4
- package/dist/drizzle/d1-proofs.mjs +3 -1
- package/dist/drizzle/d1-proofs.mjs.map +1 -1
- package/dist/drizzle/d1-sessions.d.mts +14 -13
- 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.d.mts +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 +8 -7
- package/dist/drizzle/email-target.mjs +10 -10
- package/dist/drizzle/email-target.mjs.map +1 -1
- package/dist/drizzle/model.d.mts +2 -126
- package/dist/drizzle/model.mjs +2 -21
- package/dist/drizzle/model.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 +8 -7
- 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 +4 -3
- 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 +7 -5
- package/dist/drizzle/mysql-passwords.mjs +11 -7
- package/dist/drizzle/mysql-passwords.mjs.map +1 -1
- package/dist/drizzle/mysql-proofs.d.mts +4 -3
- package/dist/drizzle/mysql-proofs.mjs +8 -4
- package/dist/drizzle/mysql-proofs.mjs.map +1 -1
- package/dist/drizzle/mysql-sessions.d.mts +12 -11
- 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-accounts.mjs +1 -1
- package/dist/drizzle/oauth-connected-access.mjs +14 -12
- package/dist/drizzle/oauth-connected-access.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-custody.mjs +2 -2
- package/dist/drizzle/oauth-connected-drivers.mjs +11 -6
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-flow.mjs +2 -2
- package/dist/drizzle/oauth-connected-input.mjs +14 -1
- package/dist/drizzle/oauth-connected-input.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-maintenance.mjs +1 -1
- package/dist/drizzle/oauth-connected-management.mjs +2 -2
- package/dist/drizzle/oauth-connected-model.d.mts +17 -3
- package/dist/drizzle/oauth-connected-model.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-settlement.mjs +51 -41
- package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-sign-in.mjs +263 -0
- package/dist/drizzle/oauth-connected-sign-in.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-state.d.mts +110 -2
- package/dist/drizzle/oauth-connected-state.mjs +9 -4
- package/dist/drizzle/oauth-connected-state.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +142 -15
- package/dist/drizzle/oauth-connected-target.mjs +9 -6
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs +9 -7
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-flow.d.mts +1 -1
- package/dist/drizzle/oauth-flow.mjs +1 -1
- package/dist/drizzle/oauth-input.mjs +1 -1
- package/dist/drizzle/oauth-model.d.mts +1 -1
- package/dist/drizzle/oauth-owner.d.mts +1 -1
- package/dist/drizzle/oauth-registration.d.mts +2 -2
- package/dist/drizzle/oauth-registration.mjs +1 -1
- package/dist/drizzle/oauth-state.mjs +5 -4
- package/dist/drizzle/oauth-state.mjs.map +1 -1
- package/dist/drizzle/oauth-target.d.mts +14 -13
- package/dist/drizzle/oauth-target.mjs +14 -13
- 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-state.mjs +1 -1
- package/dist/drizzle/password-prepared-target.d.mts +4 -3
- 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 +6 -5
- 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 +8 -7
- package/dist/drizzle/pg-emails.mjs +12 -8
- package/dist/drizzle/pg-emails.mjs.map +1 -1
- package/dist/drizzle/pg-identity.mjs +92 -0
- package/dist/drizzle/pg-identity.mjs.map +1 -0
- package/dist/drizzle/pg-password-prepared.d.mts +4 -3
- 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 +7 -5
- package/dist/drizzle/pg-passwords.mjs +11 -7
- package/dist/drizzle/pg-passwords.mjs.map +1 -1
- package/dist/drizzle/pg-proofs.d.mts +4 -3
- package/dist/drizzle/pg-proofs.mjs +8 -4
- package/dist/drizzle/pg-proofs.mjs.map +1 -1
- package/dist/drizzle/pg-sessions.d.mts +12 -11
- package/dist/drizzle/pg-sessions.mjs +16 -12
- package/dist/drizzle/pg-sessions.mjs.map +1 -1
- package/dist/drizzle/phone-model.d.mts +1 -1
- package/dist/drizzle/phone-target.d.mts +5 -4
- package/dist/drizzle/phone-target.mjs +12 -11
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/proof-target.d.mts +4 -3
- 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 +11 -9
- 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-model.d.mts +1 -1
- package/dist/drizzle/totp-target.d.mts +5 -4
- package/dist/drizzle/totp-target.mjs +31 -28
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/dist/drizzle/transaction-mysql.mjs +1 -1
- package/dist/drizzle/transaction-mysql.mjs.map +1 -1
- package/dist/index.d.mts +2 -4
- package/dist/index.mjs +2 -4
- package/dist/internal/drizzle-postgres.mjs.map +1 -1
- package/dist/internal/drizzle-sqlite.mjs.map +1 -1
- package/package.json +1 -1
- package/src/D1.ts +37 -26
- package/src/Libsql.ts +45 -61
- package/src/Mysql2.ts +39 -35
- package/src/Pglite.ts +48 -30
- package/src/Postgres.ts +48 -30
- package/src/SqliteBun.ts +59 -68
- package/src/SqliteDo.ts +61 -274
- package/src/SqliteNode.ts +56 -66
- package/src/SqliteWasm.ts +56 -66
- package/src/drizzle/D1BatchStatements.ts +1 -1
- package/src/drizzle/d1-database.ts +10 -0
- package/src/drizzle/d1-emails.ts +86 -88
- package/src/drizzle/d1-generated-statement.ts +1 -1
- 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 +40 -42
- package/src/drizzle/d1-passwords.ts +76 -80
- package/src/drizzle/d1-phone.ts +5 -1
- package/src/drizzle/d1-proofs.ts +31 -34
- package/src/drizzle/d1-sessions.ts +53 -40
- package/src/drizzle/d1-totp.ts +5 -1
- package/src/drizzle/email-registration.ts +6 -2
- package/src/drizzle/email-target.ts +18 -20
- package/src/drizzle/model.ts +1 -208
- package/src/drizzle/mysql-database.ts +8 -0
- package/src/drizzle/mysql-emails.ts +29 -17
- package/src/drizzle/mysql-identity.ts +18 -21
- package/src/drizzle/mysql-password-prepared.ts +11 -9
- package/src/drizzle/mysql-passwords.ts +22 -10
- package/src/drizzle/mysql-proofs.ts +17 -6
- package/src/drizzle/mysql-sessions.ts +41 -18
- package/src/drizzle/native-database.ts +22 -0
- package/src/drizzle/oauth-connected-access.ts +8 -1
- package/src/drizzle/oauth-connected-drivers.ts +21 -6
- package/src/drizzle/oauth-connected-input.ts +13 -0
- package/src/drizzle/oauth-connected-model.ts +17 -0
- package/src/drizzle/oauth-connected-settlement.ts +65 -42
- package/src/drizzle/oauth-connected-sign-in.ts +438 -0
- package/src/drizzle/oauth-connected-state.ts +19 -7
- package/src/drizzle/oauth-connected-target.ts +26 -18
- package/src/drizzle/oauth-drivers.ts +26 -10
- package/src/drizzle/oauth-state.ts +5 -4
- package/src/drizzle/oauth-target.ts +31 -43
- 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 +10 -7
- package/src/drizzle/password-registration.ts +7 -8
- package/src/drizzle/password-target.ts +20 -19
- package/src/drizzle/pg-database.ts +10 -0
- package/src/drizzle/pg-emails.ts +29 -17
- package/src/drizzle/pg-identity.ts +297 -0
- package/src/drizzle/pg-password-prepared.ts +11 -9
- package/src/drizzle/pg-passwords.ts +22 -10
- package/src/drizzle/pg-proofs.ts +17 -6
- package/src/drizzle/pg-sessions.ts +41 -18
- package/src/drizzle/phone-target.ts +23 -18
- package/src/drizzle/proof-target.ts +10 -13
- package/src/drizzle/session-target.ts +33 -51
- package/src/drizzle/sqlite-emails.ts +31 -14
- package/src/drizzle/sqlite-identity.ts +22 -42
- package/src/drizzle/sqlite-password-prepared.ts +24 -10
- package/src/drizzle/sqlite-passwords.ts +30 -16
- package/src/drizzle/sqlite-proofs.ts +29 -6
- package/src/drizzle/sqlite-sessions.ts +50 -24
- package/src/drizzle/standalone-guard.ts +19 -7
- package/src/drizzle/totp-target.ts +62 -61
- package/src/drizzle/transaction-mysql.ts +1 -1
- package/src/index.ts +0 -24
- package/src/internal/drizzle-postgres.ts +1 -1
- package/src/internal/drizzle-sqlite.ts +1 -1
- package/dist/drizzle/d1-identity.d.mts +0 -30
- package/dist/drizzle/mysql-identity.d.mts +0 -21
- package/dist/drizzle/mysql.d.mts +0 -69
- package/dist/drizzle/mysql.mjs +0 -218
- package/dist/drizzle/mysql.mjs.map +0 -1
- package/dist/drizzle/pg.d.mts +0 -80
- package/dist/drizzle/pg.mjs +0 -289
- package/dist/drizzle/pg.mjs.map +0 -1
- package/dist/drizzle/sqlite.d.mts +0 -77
- package/dist/drizzle/sqlite.mjs +0 -217
- package/dist/drizzle/sqlite.mjs.map +0 -1
- package/src/drizzle/mysql.ts +0 -687
- package/src/drizzle/pg.ts +0 -984
- package/src/drizzle/sqlite.ts +0 -705
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1-identity.mjs","names":[],"sources":["../../src/drizzle/d1-identity.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport {\n ExternalIdentityMutation,\n type ExternalIdentity,\n IdentityConflict,\n IdentityUnavailable,\n SubjectProvisioned,\n SubjectProvisioner,\n type SubjectProvisioningInput,\n} from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\n/* oxlint-disable no-explicit-any -- D1 batch bridges Drizzle SQL objects to Effect SQL Statements at this adapter boundary. */\nimport {\n and,\n eq,\n getTableColumns,\n is,\n sql,\n SQL,\n type AnyRelations,\n type InferInsertModel,\n type Table,\n} from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable, SQLiteColumn } from \"drizzle-orm/sqlite-core\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport {\n column,\n isMappedConstraintConflict,\n provisioningFingerprint,\n type D1ExternalIdentityMapping,\n type D1GeneratedIdentityMapping,\n type D1SubjectProvisioningMapping,\n} from \"./model\";\n\ntype RuntimeDatabase = EffectSQLiteD1Database<any> & { readonly $client: D1Client };\nconst unavailable = () => IdentityUnavailable.make();\nconst isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));\n\nconst mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n reportPersistenceFailure(effect, isIdentityFailure).pipe(\n Effect.catchCause((cause) =>\n Effect.failCause(\n Cause.map(cause, (error) => (isIdentityFailure(error) ? error : unavailable())),\n ),\n ),\n );\n\nconst selectFields = <T extends Table>(\n table: T,\n values: InferInsertModel<T>,\n): Record<string, unknown> => {\n const columns = getTableColumns(table) as Record<string, SQLiteColumn>;\n\n const fields = Object.fromEntries(\n Object.entries(values)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [\n key,\n is(value, SQL) ? value : sql`${sql.param(value, columns[key] as SQLiteColumn)}`,\n ]),\n );\n\n for (const [key, mapped] of Object.entries(columns)) {\n if (\n fields[key] !== undefined ||\n (\n mapped as SQLiteColumn & { readonly shouldDisableInsert: () => boolean }\n ).shouldDisableInsert()\n )\n continue;\n if (mapped.default !== null && mapped.default !== undefined) continue;\n\n const value =\n mapped.defaultFn !== undefined\n ? mapped.defaultFn()\n : !mapped.default && mapped.onUpdateFn !== undefined\n ? mapped.onUpdateFn()\n : undefined;\n\n if (value !== undefined || mapped.defaultFn !== undefined || mapped.onUpdateFn !== undefined)\n fields[key] = is(value, SQL) ? value : sql`${sql.param(value, mapped)}`;\n }\n\n return fields;\n};\n\n/**\n * D1 provisioning is an ordered atomic batch. The receipt captures the\n * database-generated subject id from the first insert via last_insert_rowid;\n * the optional identifier then reads that stable id from the receipt.\n */\nexport const makeD1SubjectProvisioningServices = <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(\n database: EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client },\n mapping: D1SubjectProvisioningMapping<Subject, Identifier, Request, NativeId>,\n) => {\n const db = database as RuntimeDatabase;\n const requestTable = mapping.provisioningRequest.table;\n\n const requestIdColumn = column(\n requestTable,\n mapping.provisioningRequest.requestId,\n ) as SQLiteColumn;\n\n const requestFingerprintColumn = column(\n requestTable,\n mapping.provisioningRequest.fingerprint,\n ) as SQLiteColumn;\n\n const requestSubjectColumn = column(\n requestTable,\n mapping.provisioningRequest.subjectId,\n ) as SQLiteColumn;\n\n const findReceipt = Effect.fn(\"DrizzleD1Identity.findReceipt\")(function* (requestId: string) {\n const rows = yield* db\n .select({ fingerprint: requestFingerprintColumn, subjectId: requestSubjectColumn })\n .from(requestTable as any)\n .where(eq(requestIdColumn, requestId))\n .limit(1);\n\n return rows[0];\n });\n\n const provision = Effect.fn(\"DrizzleD1Identity.provision\")(function* (\n input: SubjectProvisioningInput,\n ) {\n const fingerprint = provisioningFingerprint(input);\n const existing = yield* findReceipt(input.requestId);\n\n if (existing !== undefined) {\n if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }\n\n const allocated =\n mapping.subject.allocateId === undefined\n ? mapping.subject.allocateIdSync?.()\n : yield* mapping.subject.allocateId;\n\n const subjectQuery = db\n .insert(mapping.subject.table as any)\n .values(mapping.subject.encodeInsert(input, allocated) as any)\n .toSQL();\n\n const statements = [db.$client.unsafe(subjectQuery.sql, subjectQuery.params)];\n\n if (allocated !== undefined) {\n const requestQuery = db\n .insert(requestTable as any)\n .values(\n mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, allocated) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n\n if (input.identifier !== undefined) {\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values(\n mapping.identifier.encodeInsert(input.identifier, allocated, input.verifiedAt) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n } else {\n if (mapping.d1.generatedRowIdAlias === undefined) return yield* unavailable();\n\n const mappedColumnNames = Object.values(getTableColumns(mapping.subject.table)).map((value) =>\n value.name.toLowerCase(),\n );\n\n if (mappedColumnNames.includes(mapping.d1.generatedRowIdAlias.toLowerCase()))\n return yield* unavailable();\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const rowId = sql.identifier(mapping.d1.generatedRowIdAlias);\n\n const requestQuery = db\n .insert(requestTable as any)\n .values({\n ...mapping.d1.requestInsertWithoutSubject(input.requestId, fingerprint),\n [mapping.provisioningRequest.subjectId]:\n sql`(select ${subjectIdColumn} from ${mapping.subject.table} where ${rowId} = last_insert_rowid())`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n }\n\n if (allocated === undefined && input.identifier !== undefined) {\n const requestIdParam = sql.param(input.requestId, requestIdColumn);\n\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values({\n ...mapping.d1.identifierInsertWithoutSubject(input.identifier, input.verifiedAt),\n [mapping.identifier.subjectId]:\n sql`(select ${requestSubjectColumn} from ${requestTable} where ${requestIdColumn} = ${requestIdParam})`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n const attempt = db.$client.batch(statements);\n\n yield* attempt.pipe(\n Effect.catchCause(\n (\n cause,\n ): Effect.Effect<\n void,\n | Effect.Error<typeof attempt>\n | Effect.Error<ReturnType<typeof findReceipt>>\n | IdentityConflict\n > => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return findReceipt(input.requestId).pipe(\n Effect.flatMap((receipt) =>\n receipt !== undefined && receipt.fingerprint === fingerprint\n ? Effect.void\n : IdentityConflict.make(),\n ),\n );\n },\n ),\n );\n const receipt = yield* findReceipt(input.requestId);\n\n if (receipt === undefined || receipt.fingerprint !== fingerprint)\n return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(receipt.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }, mapUnavailable);\n\n return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;\n};\n\nexport const makeD1ExternalIdentityServices = <\n Subject extends AnySQLiteTable,\n External extends AnySQLiteTable,\n NativeId,\n>(\n database: EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client },\n mapping: D1ExternalIdentityMapping<Subject, External, NativeId>,\n) => {\n const db = database as RuntimeDatabase;\n const externalTable = mapping.externalIdentity.table;\n\n const externalSubjectIdColumn = column(\n externalTable,\n mapping.externalIdentity.subjectId,\n ) as SQLiteColumn;\n\n const externalProviderColumn = column(\n externalTable,\n mapping.externalIdentity.provider,\n ) as SQLiteColumn;\n\n const externalIssuerColumn = column(\n externalTable,\n mapping.externalIdentity.issuer,\n ) as SQLiteColumn;\n\n const externalSubjectColumn = column(\n externalTable,\n mapping.externalIdentity.subject,\n ) as SQLiteColumn;\n\n const bind = Effect.fn(\"DrizzleD1Identity.bindExternalIdentity\")(function* (\n subjectId: SubjectId,\n identity: ExternalIdentity,\n ) {\n const nativeId = yield* mapping.subjectId.toNative(subjectId);\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status);\n const nativeIdParam = sql.param(nativeId, subjectIdColumn);\n const activeStatusParam = sql.param(mapping.d1.activeStatusValue, subjectStatusColumn);\n\n const selection = selectFields(\n externalTable,\n mapping.externalIdentity.encodeInsert(identity, nativeId),\n );\n\n selection[mapping.externalIdentity.subjectId] = subjectIdColumn;\n\n const inserted = yield* db\n .insert(externalTable as any)\n .select(\n db\n .select(selection as any)\n .from(mapping.subject.table as any)\n .where(\n and(eq(subjectIdColumn, nativeIdParam), eq(subjectStatusColumn, activeStatusParam)),\n ) as any,\n )\n .returning({ subjectId: externalSubjectIdColumn })\n .pipe(\n Effect.catchCause((cause) => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return db\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .innerJoin(\n mapping.subject.table as any,\n and(\n eq(externalSubjectIdColumn, subjectIdColumn),\n eq(subjectStatusColumn, mapping.d1.activeStatusValue),\n ),\n )\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n eq(externalSubjectIdColumn, nativeId),\n ),\n )\n .limit(1);\n }),\n );\n\n const row = inserted[0];\n\n if (row === undefined) return yield* IdentityConflict.make();\n const linked = row.subjectId as NativeId;\n\n if (!mapping.subjectId.equals(linked, nativeId)) return yield* IdentityConflict.make();\n }, mapUnavailable);\n\n return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n};\n\nexport const makeD1IdentityServices = <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n External extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(\n database: EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client },\n mapping: D1GeneratedIdentityMapping<Subject, Identifier, External, Request, NativeId>,\n) => ({\n ...makeD1SubjectProvisioningServices(database, mapping),\n ...makeD1ExternalIdentityServices(database, mapping),\n});\n"],"mappings":";;;;;;AAsCA,MAAM,oBAAoB,oBAAoB,KAAK;AACnD,MAAM,oBAAoB,OAAO,GAAG,OAAO,MAAM,CAAC,kBAAkB,mBAAmB,CAAC,CAAC;AAEzF,MAAM,kBAA2B,WAC/B,yBAAyB,QAAQ,iBAAiB,CAAC,CAAC,KAClD,OAAO,YAAY,UACjB,OAAO,UACL,MAAM,IAAI,QAAQ,UAAW,kBAAkB,KAAK,IAAI,QAAQ,YAAY,CAAE,CAChF,CACF,CACF;AAEF,MAAM,gBACJ,OACA,WAC4B;CAC5B,MAAM,UAAU,gBAAgB,KAAK;CAErC,MAAM,SAAS,OAAO,YACpB,OAAO,QAAQ,MAAM,CAAC,CACnB,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CAAC,CAC1C,KAAK,CAAC,KAAK,WAAW,CACrB,KACA,GAAG,OAAO,GAAG,IAAI,QAAQ,GAAG,GAAG,IAAI,MAAM,OAAO,QAAQ,IAAoB,GAC9E,CAAC,CACL;CAEA,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,OAAO,GAAG;EACnD,IACE,OAAO,SAAS,KAAA,KAEd,OACA,oBAAoB,GAEtB;EACF,IAAI,OAAO,YAAY,QAAQ,OAAO,YAAY,KAAA,GAAW;EAE7D,MAAM,QACJ,OAAO,cAAc,KAAA,IACjB,OAAO,UAAU,IACjB,CAAC,OAAO,WAAW,OAAO,eAAe,KAAA,IACvC,OAAO,WAAW,IAClB,KAAA;EAER,IAAI,UAAU,KAAA,KAAa,OAAO,cAAc,KAAA,KAAa,OAAO,eAAe,KAAA,GACjF,OAAO,OAAO,GAAG,OAAO,GAAG,IAAI,QAAQ,GAAG,GAAG,IAAI,MAAM,OAAO,MAAM;CACxE;CAEA,OAAO;AACT;;;;;;AAOA,MAAa,qCAMX,UACA,YACG;CACH,MAAM,KAAK;CACX,MAAM,eAAe,QAAQ,oBAAoB;CAEjD,MAAM,kBAAkB,OACtB,cACA,QAAQ,oBAAoB,SAC9B;CAEA,MAAM,2BAA2B,OAC/B,cACA,QAAQ,oBAAoB,WAC9B;CAEA,MAAM,uBAAuB,OAC3B,cACA,QAAQ,oBAAoB,SAC9B;CAEA,MAAM,cAAc,OAAO,GAAG,+BAA+B,CAAC,CAAC,WAAW,WAAmB;EAO3F,QAAO,OANa,GACjB,OAAO;GAAE,aAAa;GAA0B,WAAW;EAAqB,CAAC,CAAC,CAClF,KAAK,YAAmB,CAAC,CACzB,MAAM,GAAG,iBAAiB,SAAS,CAAC,CAAC,CACrC,MAAM,CAAC,EAAA,CAEE;CACd,CAAC;CAED,MAAM,YAAY,OAAO,GAAG,6BAA6B,CAAC,CAAC,WACzD,OACA;EACA,MAAM,cAAc,wBAAwB,KAAK;EACjD,MAAM,WAAW,OAAO,YAAY,MAAM,SAAS;EAEnD,IAAI,aAAa,KAAA,GAAW;GAC1B,IAAI,SAAS,gBAAgB,aAAa,OAAO,OAAO,iBAAiB,KAAK;GAC9E,MAAM,YAAY,OAAO,QAAQ,UAAU,UAAU,SAAS,SAAqB;GAEnF,OAAO,mBAAmB,KAAK,EAAE,UAAU,CAAC;EAC9C;EAEA,MAAM,YACJ,QAAQ,QAAQ,eAAe,KAAA,IAC3B,QAAQ,QAAQ,iBAAiB,IACjC,OAAO,QAAQ,QAAQ;EAE7B,MAAM,eAAe,GAClB,OAAO,QAAQ,QAAQ,KAAY,CAAC,CACpC,OAAO,QAAQ,QAAQ,aAAa,OAAO,SAAS,CAAQ,CAAC,CAC7D,MAAM;EAET,MAAM,aAAa,CAAC,GAAG,QAAQ,OAAO,aAAa,KAAK,aAAa,MAAM,CAAC;EAE5E,IAAI,cAAc,KAAA,GAAW;GAC3B,MAAM,eAAe,GAClB,OAAO,YAAmB,CAAC,CAC3B,OACC,QAAQ,oBAAoB,aAAa,MAAM,WAAW,aAAa,SAAS,CAClF,CAAC,CACA,MAAM;GAET,WAAW,KAAK,GAAG,QAAQ,OAAO,aAAa,KAAK,aAAa,MAAM,CAAC;GAExE,IAAI,MAAM,eAAe,KAAA,GAAW;IAClC,MAAM,kBAAkB,GACrB,OAAO,QAAQ,WAAW,KAAY,CAAC,CACvC,OACC,QAAQ,WAAW,aAAa,MAAM,YAAY,WAAW,MAAM,UAAU,CAC/E,CAAC,CACA,MAAM;IAET,WAAW,KAAK,GAAG,QAAQ,OAAO,gBAAgB,KAAK,gBAAgB,MAAM,CAAC;GAChF;EACF,OAAO;GACL,IAAI,QAAQ,GAAG,wBAAwB,KAAA,GAAW,OAAO,OAAO,YAAY;GAM5E,IAJ0B,OAAO,OAAO,gBAAgB,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,UACnF,MAAM,KAAK,YAAY,CAGL,CAAC,CAAC,SAAS,QAAQ,GAAG,oBAAoB,YAAY,CAAC,GACzE,OAAO,OAAO,YAAY;GAC5B,MAAM,kBAAkB,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,EAAE;GACxE,MAAM,QAAQ,IAAI,WAAW,QAAQ,GAAG,mBAAmB;GAE3D,MAAM,eAAe,GAClB,OAAO,YAAmB,CAAC,CAC3B,OAAO;IACN,GAAG,QAAQ,GAAG,4BAA4B,MAAM,WAAW,WAAW;KACrE,QAAQ,oBAAoB,YAC3B,GAAG,WAAW,gBAAgB,QAAQ,QAAQ,QAAQ,MAAM,SAAS,MAAM;GAC/E,CAAQ,CAAC,CACR,MAAM;GAET,WAAW,KAAK,GAAG,QAAQ,OAAO,aAAa,KAAK,aAAa,MAAM,CAAC;EAC1E;EAEA,IAAI,cAAc,KAAA,KAAa,MAAM,eAAe,KAAA,GAAW;GAC7D,MAAM,iBAAiB,IAAI,MAAM,MAAM,WAAW,eAAe;GAEjE,MAAM,kBAAkB,GACrB,OAAO,QAAQ,WAAW,KAAY,CAAC,CACvC,OAAO;IACN,GAAG,QAAQ,GAAG,+BAA+B,MAAM,YAAY,MAAM,UAAU;KAC9E,QAAQ,WAAW,YAClB,GAAG,WAAW,qBAAqB,QAAQ,aAAa,SAAS,gBAAgB,KAAK,eAAe;GACzG,CAAQ,CAAC,CACR,MAAM;GAET,WAAW,KAAK,GAAG,QAAQ,OAAO,gBAAgB,KAAK,gBAAgB,MAAM,CAAC;EAChF;EAGA,OAFgB,GAAG,QAAQ,MAAM,UAEpB,CAAC,CAAC,KACb,OAAO,YAEH,UAMG;GACH,IACE,MAAM,QAAQ,WAAW,KACzB,CAAC,MAAM,QAAQ,OACZ,WACC,MAAM,aAAa,MAAM,KACzB,2BAA2B,QAAQ,sBAAsB,OAAO,KAAK,CACzE,GAEA,OAAO,OAAO,UAAU,KAAK;GAE/B,OAAO,YAAY,MAAM,SAAS,CAAC,CAAC,KAClC,OAAO,SAAS,YACd,YAAY,KAAA,KAAa,QAAQ,gBAAgB,cAC7C,OAAO,OACP,iBAAiB,KAAK,CAC5B,CACF;EACF,CACF,CACF;EACA,MAAM,UAAU,OAAO,YAAY,MAAM,SAAS;EAElD,IAAI,YAAY,KAAA,KAAa,QAAQ,gBAAgB,aACnD,OAAO,OAAO,iBAAiB,KAAK;EACtC,MAAM,YAAY,OAAO,QAAQ,UAAU,UAAU,QAAQ,SAAqB;EAElF,OAAO,mBAAmB,KAAK,EAAE,UAAU,CAAC;CAC9C,GAAG,cAAc;CAEjB,OAAO,EAAE,oBAAoB,mBAAmB,GAAG,EAAE,UAAU,CAAC,EAAE;AACpE;AAEA,MAAa,kCAKX,UACA,YACG;CACH,MAAM,KAAK;CACX,MAAM,gBAAgB,QAAQ,iBAAiB;CAE/C,MAAM,0BAA0B,OAC9B,eACA,QAAQ,iBAAiB,SAC3B;CAEA,MAAM,yBAAyB,OAC7B,eACA,QAAQ,iBAAiB,QAC3B;CAEA,MAAM,uBAAuB,OAC3B,eACA,QAAQ,iBAAiB,MAC3B;CAEA,MAAM,wBAAwB,OAC5B,eACA,QAAQ,iBAAiB,OAC3B;CAEA,MAAM,OAAO,OAAO,GAAG,wCAAwC,CAAC,CAAC,WAC/D,WACA,UACA;EACA,MAAM,WAAW,OAAO,QAAQ,UAAU,SAAS,SAAS;EAC5D,MAAM,kBAAkB,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,EAAE;EACxE,MAAM,sBAAsB,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,MAAM;EAChF,MAAM,gBAAgB,IAAI,MAAM,UAAU,eAAe;EACzD,MAAM,oBAAoB,IAAI,MAAM,QAAQ,GAAG,mBAAmB,mBAAmB;EAErF,MAAM,YAAY,aAChB,eACA,QAAQ,iBAAiB,aAAa,UAAU,QAAQ,CAC1D;EAEA,UAAU,QAAQ,iBAAiB,aAAa;EA+ChD,MAAM,OAAM,OA7CY,GACrB,OAAO,aAAoB,CAAC,CAC5B,OACC,GACG,OAAO,SAAgB,CAAC,CACxB,KAAK,QAAQ,QAAQ,KAAY,CAAC,CAClC,MACC,IAAI,GAAG,iBAAiB,aAAa,GAAG,GAAG,qBAAqB,iBAAiB,CAAC,CACpF,CACJ,CAAC,CACA,UAAU,EAAE,WAAW,wBAAwB,CAAC,CAAC,CACjD,KACC,OAAO,YAAY,UAAU;GAC3B,IACE,MAAM,QAAQ,WAAW,KACzB,CAAC,MAAM,QAAQ,OACZ,WACC,MAAM,aAAa,MAAM,KACzB,2BAA2B,QAAQ,sBAAsB,OAAO,KAAK,CACzE,GAEA,OAAO,OAAO,UAAU,KAAK;GAE/B,OAAO,GACJ,OAAO,EAAE,WAAW,wBAAwB,CAAC,CAAC,CAC9C,KAAK,aAAoB,CAAC,CAC1B,UACC,QAAQ,QAAQ,OAChB,IACE,GAAG,yBAAyB,eAAe,GAC3C,GAAG,qBAAqB,QAAQ,GAAG,iBAAiB,CACtD,CACF,CAAC,CACA,MACC,IACE,GAAG,wBAAwB,SAAS,QAAQ,GAC5C,GAAG,sBAAsB,SAAS,MAAM,GACxC,GAAG,uBAAuB,SAAS,OAAO,GAC1C,GAAG,yBAAyB,QAAQ,CACtC,CACF,CAAC,CACA,MAAM,CAAC;EACZ,CAAC,CACH,EAAA,CAEmB;EAErB,IAAI,QAAQ,KAAA,GAAW,OAAO,OAAO,iBAAiB,KAAK;EAC3D,MAAM,SAAS,IAAI;EAEnB,IAAI,CAAC,QAAQ,UAAU,OAAO,QAAQ,QAAQ,GAAG,OAAO,OAAO,iBAAiB,KAAK;CACvF,GAAG,cAAc;CAEjB,OAAO,EAAE,0BAA0B,yBAAyB,GAAG,EAAE,KAAK,CAAC,EAAE;AAC3E;AAEA,MAAa,0BAOX,UACA,aACI;CACJ,GAAG,kCAAkC,UAAU,OAAO;CACtD,GAAG,+BAA+B,UAAU,OAAO;AACrD"}
|
|
1
|
+
{"version":3,"file":"d1-identity.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-identity.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport {\n ExternalIdentityMutation,\n type ExternalIdentity,\n IdentityConflict,\n IdentityUnavailable,\n SubjectProvisioned,\n SubjectProvisioner,\n type SubjectProvisioningInput,\n} from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\n/* oxlint-disable no-explicit-any -- D1 batch bridges Drizzle SQL objects to Effect SQL Statements at this adapter boundary. */\nimport {\n and,\n eq,\n getTableColumns,\n is,\n sql,\n SQL,\n type InferInsertModel,\n type Table,\n} from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable, SQLiteColumn } from \"drizzle-orm/sqlite-core\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport {\n column,\n isMappedConstraintConflict,\n provisioningFingerprint,\n type D1ExternalIdentityMapping,\n type D1GeneratedIdentityMapping,\n type D1SubjectProvisioningMapping,\n} from \"./model\";\n\ntype RuntimeDatabase = EffectSQLiteD1Database<any> & { readonly $client: D1Client };\nconst unavailable = () => IdentityUnavailable.make();\nconst isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));\n\nconst mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n reportPersistenceFailure(effect, isIdentityFailure).pipe(\n Effect.catchCause((cause) =>\n Effect.failCause(\n Cause.map(cause, (error) => (isIdentityFailure(error) ? error : unavailable())),\n ),\n ),\n );\n\nconst selectFields = <T extends Table>(\n table: T,\n values: InferInsertModel<T>,\n): Record<string, unknown> => {\n const columns = getTableColumns(table) as Record<string, SQLiteColumn>;\n\n const fields = Object.fromEntries(\n Object.entries(values)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [\n key,\n is(value, SQL) ? value : sql`${sql.param(value, columns[key] as SQLiteColumn)}`,\n ]),\n );\n\n for (const [key, mapped] of Object.entries(columns)) {\n if (\n fields[key] !== undefined ||\n (\n mapped as SQLiteColumn & { readonly shouldDisableInsert: () => boolean }\n ).shouldDisableInsert()\n )\n continue;\n if (mapped.default !== null && mapped.default !== undefined) continue;\n\n const value =\n mapped.defaultFn !== undefined\n ? mapped.defaultFn()\n : !mapped.default && mapped.onUpdateFn !== undefined\n ? mapped.onUpdateFn()\n : undefined;\n\n if (value !== undefined || mapped.defaultFn !== undefined || mapped.onUpdateFn !== undefined)\n fields[key] = is(value, SQL) ? value : sql`${sql.param(value, mapped)}`;\n }\n\n return fields;\n};\n\n/**\n * D1 provisioning is an ordered atomic batch. The receipt captures the\n * database-generated subject id from the first insert via last_insert_rowid;\n * the optional identifier then reads that stable id from the receipt.\n */\nexport const makeD1SubjectProvisioningServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(mapping: D1SubjectProvisioningMapping<Subject, Identifier, Request, NativeId>) {\n const database = yield* DatabaseService;\n\n const db = database as RuntimeDatabase;\n const requestTable = mapping.provisioningRequest.table;\n\n const requestIdColumn = column(\n requestTable,\n mapping.provisioningRequest.requestId,\n ) as SQLiteColumn;\n\n const requestFingerprintColumn = column(\n requestTable,\n mapping.provisioningRequest.fingerprint,\n ) as SQLiteColumn;\n\n const requestSubjectColumn = column(\n requestTable,\n mapping.provisioningRequest.subjectId,\n ) as SQLiteColumn;\n\n const findReceipt = Effect.fn(\"DrizzleD1Identity.findReceipt\")(function* (requestId: string) {\n const rows = yield* db\n .select({ fingerprint: requestFingerprintColumn, subjectId: requestSubjectColumn })\n .from(requestTable as any)\n .where(eq(requestIdColumn, requestId))\n .limit(1);\n\n return rows[0];\n });\n\n const provision = Effect.fn(\"DrizzleD1Identity.provision\")(function* (\n input: SubjectProvisioningInput,\n ) {\n const fingerprint = provisioningFingerprint(input);\n const existing = yield* findReceipt(input.requestId);\n\n if (existing !== undefined) {\n if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }\n\n const allocated =\n mapping.subject.allocateId === undefined\n ? mapping.subject.allocateIdSync?.()\n : yield* mapping.subject.allocateId;\n\n const subjectQuery = db\n .insert(mapping.subject.table as any)\n .values(mapping.subject.encodeInsert(input, allocated) as any)\n .toSQL();\n\n const statements = [db.$client.unsafe(subjectQuery.sql, subjectQuery.params)];\n\n if (allocated !== undefined) {\n const requestQuery = db\n .insert(requestTable as any)\n .values(\n mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, allocated) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n\n if (input.identifier !== undefined) {\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values(\n mapping.identifier.encodeInsert(input.identifier, allocated, input.verifiedAt) as any,\n )\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n } else {\n if (mapping.d1.generatedRowIdAlias === undefined) return yield* unavailable();\n\n const mappedColumnNames = Object.values(getTableColumns(mapping.subject.table)).map((value) =>\n value.name.toLowerCase(),\n );\n\n if (mappedColumnNames.includes(mapping.d1.generatedRowIdAlias.toLowerCase()))\n return yield* unavailable();\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const rowId = sql.identifier(mapping.d1.generatedRowIdAlias);\n\n const requestQuery = db\n .insert(requestTable as any)\n .values({\n ...mapping.d1.requestInsertWithoutSubject(input.requestId, fingerprint),\n [mapping.provisioningRequest.subjectId]:\n sql`(select ${subjectIdColumn} from ${mapping.subject.table} where ${rowId} = last_insert_rowid())`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n }\n\n if (allocated === undefined && input.identifier !== undefined) {\n const requestIdParam = sql.param(input.requestId, requestIdColumn);\n\n const identifierQuery = db\n .insert(mapping.identifier.table as any)\n .values({\n ...mapping.d1.identifierInsertWithoutSubject(input.identifier, input.verifiedAt),\n [mapping.identifier.subjectId]:\n sql`(select ${requestSubjectColumn} from ${requestTable} where ${requestIdColumn} = ${requestIdParam})`,\n } as any)\n .toSQL();\n\n statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n }\n const attempt = db.$client.batch(statements);\n\n yield* attempt.pipe(\n Effect.catchCause(\n (\n cause,\n ): Effect.Effect<\n void,\n | Effect.Error<typeof attempt>\n | Effect.Error<ReturnType<typeof findReceipt>>\n | IdentityConflict\n > => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return findReceipt(input.requestId).pipe(\n Effect.flatMap((receipt) =>\n receipt !== undefined && receipt.fingerprint === fingerprint\n ? Effect.void\n : IdentityConflict.make(),\n ),\n );\n },\n ),\n );\n const receipt = yield* findReceipt(input.requestId);\n\n if (receipt === undefined || receipt.fingerprint !== fingerprint)\n return yield* IdentityConflict.make();\n const subjectId = yield* mapping.subjectId.toSubject(receipt.subjectId as NativeId);\n\n return SubjectProvisioned.make({ subjectId });\n }, mapUnavailable);\n\n return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;\n});\n\nexport const makeD1ExternalIdentityServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n External extends AnySQLiteTable,\n NativeId,\n>(mapping: D1ExternalIdentityMapping<Subject, External, NativeId>) {\n const database = yield* DatabaseService;\n\n const db = database as RuntimeDatabase;\n const externalTable = mapping.externalIdentity.table;\n\n const externalSubjectIdColumn = column(\n externalTable,\n mapping.externalIdentity.subjectId,\n ) as SQLiteColumn;\n\n const externalProviderColumn = column(\n externalTable,\n mapping.externalIdentity.provider,\n ) as SQLiteColumn;\n\n const externalIssuerColumn = column(\n externalTable,\n mapping.externalIdentity.issuer,\n ) as SQLiteColumn;\n\n const externalSubjectColumn = column(\n externalTable,\n mapping.externalIdentity.subject,\n ) as SQLiteColumn;\n\n const bind = Effect.fn(\"DrizzleD1Identity.bindExternalIdentity\")(function* (\n subjectId: SubjectId,\n identity: ExternalIdentity,\n ) {\n const nativeId = yield* mapping.subjectId.toNative(subjectId);\n const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status);\n const nativeIdParam = sql.param(nativeId, subjectIdColumn);\n const activeStatusParam = sql.param(mapping.d1.activeStatusValue, subjectStatusColumn);\n\n const selection = selectFields(\n externalTable,\n mapping.externalIdentity.encodeInsert(identity, nativeId),\n );\n\n selection[mapping.externalIdentity.subjectId] = subjectIdColumn;\n\n const inserted = yield* db\n .insert(externalTable as any)\n .select(\n db\n .select(selection as any)\n .from(mapping.subject.table as any)\n .where(\n and(eq(subjectIdColumn, nativeIdParam), eq(subjectStatusColumn, activeStatusParam)),\n ) as any,\n )\n .returning({ subjectId: externalSubjectIdColumn })\n .pipe(\n Effect.catchCause((cause) => {\n if (\n cause.reasons.length === 0 ||\n !cause.reasons.every(\n (reason) =>\n Cause.isFailReason(reason) &&\n isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n )\n )\n return Effect.failCause(cause);\n\n return db\n .select({ subjectId: externalSubjectIdColumn })\n .from(externalTable as any)\n .innerJoin(\n mapping.subject.table as any,\n and(\n eq(externalSubjectIdColumn, subjectIdColumn),\n eq(subjectStatusColumn, mapping.d1.activeStatusValue),\n ),\n )\n .where(\n and(\n eq(externalProviderColumn, identity.provider),\n eq(externalIssuerColumn, identity.issuer),\n eq(externalSubjectColumn, identity.subject),\n eq(externalSubjectIdColumn, nativeId),\n ),\n )\n .limit(1);\n }),\n );\n\n const row = inserted[0];\n\n if (row === undefined) return yield* IdentityConflict.make();\n const linked = row.subjectId as NativeId;\n\n if (!mapping.subjectId.equals(linked, nativeId)) return yield* IdentityConflict.make();\n }, mapUnavailable);\n\n return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n});\n\nexport const makeD1IdentityServices = Effect.fnUntraced(function* <\n Subject extends AnySQLiteTable,\n Identifier extends AnySQLiteTable,\n External extends AnySQLiteTable,\n Request extends AnySQLiteTable,\n NativeId,\n>(mapping: D1GeneratedIdentityMapping<Subject, Identifier, External, Request, NativeId>) {\n return {\n ...(yield* makeD1SubjectProvisioningServices(mapping)),\n ...(yield* makeD1ExternalIdentityServices(mapping)),\n };\n});\n"],"mappings":"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"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { OAuthAccountsMapping, OAuthD1Mapping, OAuthRegistrationAuthority, OAuthRegistrationIntentMapping, OAuthRegistrationMapping, OAuthSignInMapping } from "./oauth-model.mjs";
|
|
2
2
|
import { OAuthCoordinatorError } from "./oauth-target.mjs";
|
|
3
|
+
import { Database as Database$1 } from "./d1-database.mjs";
|
|
3
4
|
import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
4
5
|
import { SuppliedService } from "./SuppliedService.mjs";
|
|
5
|
-
import { OAuthAccountsPersistence, OAuthRegistrationIntents, OAuthSignInPersistence, OAuthUnavailable } from "@yielded/auth/OAuth";
|
|
6
6
|
import { AnyRelations } from "drizzle-orm";
|
|
7
7
|
import { Effect } from "effect";
|
|
8
8
|
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
9
|
+
import { OAuthAccountsPersistence, OAuthRegistrationIntents, OAuthSignInPersistence, OAuthUnavailable } from "@yielded/auth/OAuth";
|
|
10
|
+
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
9
11
|
import { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
10
12
|
import { D1Client } from "@effect/sql-d1/D1Client";
|
|
11
|
-
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
12
13
|
//#region src/drizzle/d1-oauth.d.ts
|
|
13
14
|
type SQLiteTable = AnySQLiteTable<{
|
|
14
15
|
dialect: "sqlite";
|
|
@@ -16,7 +17,7 @@ type SQLiteTable = AnySQLiteTable<{
|
|
|
16
17
|
type Database = EffectSQLiteD1Database<AnyRelations> & {
|
|
17
18
|
readonly $client: D1Client;
|
|
18
19
|
};
|
|
19
|
-
export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, T extends SQLiteTable, U extends SQLiteTable, N>(
|
|
20
|
+
export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, T extends SQLiteTable, U extends SQLiteTable, N>(mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping) => Effect.Effect<{
|
|
20
21
|
oauthAccountsPersistence: {
|
|
21
22
|
readonly capture: (input: {
|
|
22
23
|
readonly moduleId: string & import("effect/Brand").Brand<"effect-auth/OAuthModuleId">;
|
|
@@ -40,6 +41,21 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
40
41
|
readonly generation: number;
|
|
41
42
|
readonly flowId: string & import("effect/Brand").Brand<"effect-auth/RequestBindingFlowId">;
|
|
42
43
|
readonly commandId: string & import("effect/Brand").Brand<"effect-auth/OAuthCommandId">;
|
|
44
|
+
readonly access?: {
|
|
45
|
+
readonly key: string & import("effect/Brand").Brand<"effect-auth/OAuthPermissionProfileKey">;
|
|
46
|
+
readonly generation: number;
|
|
47
|
+
readonly issuance: "active" | "retired";
|
|
48
|
+
readonly provider: string & import("effect/Brand").Brand<"effect-auth/OAuthProviderKey">;
|
|
49
|
+
readonly clientRegistrationId: string;
|
|
50
|
+
readonly scopes: readonly string[];
|
|
51
|
+
readonly resources: readonly string[];
|
|
52
|
+
readonly retention: "access-and-refresh" | "access-only";
|
|
53
|
+
readonly maximumAccessLifetimeMillis: number;
|
|
54
|
+
readonly maximumRefreshLifetimeMillis?: number | undefined;
|
|
55
|
+
readonly refreshAheadMillis: number;
|
|
56
|
+
readonly refresh: "confidential" | "rotating" | "unsupported";
|
|
57
|
+
readonly revocation: "cohort" | "unsupported";
|
|
58
|
+
} | undefined;
|
|
43
59
|
readonly returnTarget: string & import("effect/Brand").Brand<"effect-auth/OAuthReturnTarget">;
|
|
44
60
|
readonly stateDigest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
45
61
|
readonly requestBindingVerifier: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
@@ -93,6 +109,21 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
93
109
|
readonly generation: number;
|
|
94
110
|
readonly flowId: string & import("effect/Brand").Brand<"effect-auth/RequestBindingFlowId">;
|
|
95
111
|
readonly commandId: string & import("effect/Brand").Brand<"effect-auth/OAuthCommandId">;
|
|
112
|
+
readonly access?: {
|
|
113
|
+
readonly key: string & import("effect/Brand").Brand<"effect-auth/OAuthPermissionProfileKey">;
|
|
114
|
+
readonly generation: number;
|
|
115
|
+
readonly issuance: "active" | "retired";
|
|
116
|
+
readonly provider: string & import("effect/Brand").Brand<"effect-auth/OAuthProviderKey">;
|
|
117
|
+
readonly clientRegistrationId: string;
|
|
118
|
+
readonly scopes: readonly string[];
|
|
119
|
+
readonly resources: readonly string[];
|
|
120
|
+
readonly retention: "access-and-refresh" | "access-only";
|
|
121
|
+
readonly maximumAccessLifetimeMillis: number;
|
|
122
|
+
readonly maximumRefreshLifetimeMillis?: number | undefined;
|
|
123
|
+
readonly refreshAheadMillis: number;
|
|
124
|
+
readonly refresh: "confidential" | "rotating" | "unsupported";
|
|
125
|
+
readonly revocation: "cohort" | "unsupported";
|
|
126
|
+
} | undefined;
|
|
96
127
|
readonly returnTarget: string & import("effect/Brand").Brand<"effect-auth/OAuthReturnTarget">;
|
|
97
128
|
readonly stateDigest: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
98
129
|
readonly requestBindingVerifier: string & import("effect/Brand").Brand<"effect-auth/TokenDigest">;
|
|
@@ -236,8 +267,8 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
236
267
|
readonly hasMore: boolean;
|
|
237
268
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
238
269
|
};
|
|
239
|
-
}, never, LifecycleHooks>;
|
|
240
|
-
export declare const makeD1OAuthSignInServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, N>(
|
|
270
|
+
}, never, Database$1 | LifecycleHooks>;
|
|
271
|
+
export declare const makeD1OAuthSignInServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, N>(mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping) => Effect.Effect<{
|
|
241
272
|
oauthSignInPersistence: {
|
|
242
273
|
readonly issue: <A>(input: import("@yielded/auth/OAuth").OAuthPendingFlow, prepare: import("@yielded/auth/OAuth").PrepareOAuthCommit<import("@yielded/auth/OAuth").OAuthIssueDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
243
274
|
readonly claim: <A>(input: {
|
|
@@ -269,8 +300,8 @@ export declare const makeD1OAuthSignInServices: <S extends SQLiteTable, O extend
|
|
|
269
300
|
readonly hasMore: boolean;
|
|
270
301
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
271
302
|
};
|
|
272
|
-
}, never, LifecycleHooks>;
|
|
273
|
-
export declare const makeD1OAuthRegistrationIntentServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, N>(
|
|
303
|
+
}, never, Database$1 | LifecycleHooks>;
|
|
304
|
+
export declare const makeD1OAuthRegistrationIntentServices: <S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, N>(mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping) => Effect.Effect<{
|
|
274
305
|
oauthRegistrationIntents: {
|
|
275
306
|
readonly settle: <A>(input: {
|
|
276
307
|
readonly claim: import("@yielded/auth/OAuth").OAuthClaim;
|
|
@@ -279,10 +310,10 @@ export declare const makeD1OAuthRegistrationIntentServices: <S extends SQLiteTab
|
|
|
279
310
|
readonly nowMillis: number;
|
|
280
311
|
}, prepare: import("@yielded/auth/OAuth").PrepareOAuthCommit<import("@yielded/auth/OAuth").OAuthRegistrationSettlement, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
281
312
|
};
|
|
282
|
-
}, never, LifecycleHooks>;
|
|
283
|
-
export declare const makeD1OAuthRegistrationServices: <Registration, S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, R extends SQLiteTable, N>(
|
|
313
|
+
}, never, Database$1 | LifecycleHooks>;
|
|
314
|
+
export declare const makeD1OAuthRegistrationServices: <Registration, S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, T extends SQLiteTable, I extends SQLiteTable, R extends SQLiteTable, N>(mapping: OAuthRegistrationMapping<Registration, S, O, C, AC, T, I, R, N> & OAuthD1Mapping) => Effect.Effect<{
|
|
284
315
|
registrationAuthority: OAuthRegistrationAuthority<Registration>;
|
|
285
|
-
}, never, LifecycleHooks>;
|
|
316
|
+
}, never, Database$1 | LifecycleHooks>;
|
|
286
317
|
export declare function coordinateD1OAuthSignIn<S extends SQLiteTable, O extends SQLiteTable, C extends SQLiteTable, AC extends SQLiteTable, F extends SQLiteTable, N, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>, options: {
|
|
287
318
|
readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping;
|
|
288
319
|
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthSignInPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements>;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { coordinateTargetOAuthAccounts, coordinateTargetOAuthRegistration, coordinateTargetOAuthRegistrationIntents, coordinateTargetOAuthSignIn, makeTargetOAuthAccountsServices, makeTargetOAuthRegistrationIntentServices, makeTargetOAuthRegistrationServices, makeTargetOAuthSignInServices } from "./oauth-target.mjs";
|
|
2
|
+
import { Database } from "./d1-database.mjs";
|
|
2
3
|
import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
3
4
|
import { makeD1Owner } from "./d1-planning.mjs";
|
|
4
|
-
import {
|
|
5
|
+
import { nativeDatabase } from "./native-database.mjs";
|
|
6
|
+
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
5
7
|
import { Context, Effect } from "effect";
|
|
8
|
+
import { OAuthAccountsPersistence, OAuthRegistrationIntents, OAuthSignInPersistence, OAuthUnavailable } from "@yielded/auth/OAuth";
|
|
6
9
|
//#region src/drizzle/d1-oauth.ts
|
|
7
10
|
const unavailable = () => OAuthUnavailable.make({});
|
|
8
11
|
const configuration = {
|
|
@@ -11,10 +14,10 @@ const configuration = {
|
|
|
11
14
|
locking: false,
|
|
12
15
|
standaloneGuard: () => Effect.void
|
|
13
16
|
};
|
|
14
|
-
const makeD1OAuthAccountsServices = (
|
|
15
|
-
const makeD1OAuthSignInServices = (
|
|
16
|
-
const makeD1OAuthRegistrationIntentServices = (
|
|
17
|
-
const makeD1OAuthRegistrationServices = (
|
|
17
|
+
const makeD1OAuthAccountsServices = (mapping) => makeTargetOAuthAccountsServices(mapping, configuration).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
18
|
+
const makeD1OAuthSignInServices = (mapping) => makeTargetOAuthSignInServices(mapping, configuration).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
19
|
+
const makeD1OAuthRegistrationIntentServices = (mapping) => makeTargetOAuthRegistrationIntentServices(mapping, configuration).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
20
|
+
const makeD1OAuthRegistrationServices = (mapping) => makeTargetOAuthRegistrationServices(mapping, configuration).pipe(Effect.provideServiceEffect(NativeDatabase, nativeDatabase(Database)));
|
|
18
21
|
function coordinateD1OAuthSignIn(acquire, options, body) {
|
|
19
22
|
return Effect.flatMap(acquire, (database) => coordinateTargetOAuthSignIn(database, options.mapping, configuration, (_transaction, services, append) => Effect.gen(function* () {
|
|
20
23
|
const nativeCollector = D1BatchStatements.of({ append: (statement) => Effect.sync(() => append(statement)) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1-oauth.mjs","names":[],"sources":["../../src/drizzle/d1-oauth.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n OAuthAccountsPersistence,\n OAuthRegistrationIntents,\n OAuthSignInPersistence,\n OAuthUnavailable,\n} from \"@yielded/auth/OAuth\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\n\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport type {\n OAuthAccountsMapping,\n OAuthD1Mapping,\n OAuthRegistrationAuthority,\n OAuthRegistrationIntentMapping,\n OAuthRegistrationMapping,\n OAuthSignInMapping,\n} from \"./oauth-model\";\nimport {\n type OAuthCoordinatorError,\n coordinateTargetOAuthAccounts,\n coordinateTargetOAuthSignIn,\n coordinateTargetOAuthRegistrationIntents,\n coordinateTargetOAuthRegistration,\n makeTargetOAuthRegistrationIntentServices,\n makeTargetOAuthRegistrationServices,\n makeTargetOAuthSignInServices,\n makeTargetOAuthAccountsServices,\n} from \"./oauth-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype SQLiteTable = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\nconst unavailable = () => OAuthUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nexport const makeD1OAuthAccountsServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n>(\n database: Database,\n mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping,\n) => makeTargetOAuthAccountsServices(database, mapping, configuration);\n\nexport const makeD1OAuthSignInServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n>(\n database: Database,\n mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping,\n) => makeTargetOAuthSignInServices(database, mapping, configuration);\n\nexport const makeD1OAuthRegistrationIntentServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n>(\n database: Database,\n mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping,\n) => makeTargetOAuthRegistrationIntentServices(database, mapping, configuration);\n\nexport const makeD1OAuthRegistrationServices = <\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n R extends SQLiteTable,\n N,\n>(\n database: Database,\n mapping: OAuthRegistrationMapping<Registration, S, O, C, AC, T, I, R, N> & OAuthD1Mapping,\n) => makeTargetOAuthRegistrationServices<Registration>(database, mapping, configuration);\n\nexport function coordinateD1OAuthSignIn<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthSignInPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthSignIn<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthSignInPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.oauthSignInPersistence;\n\n const service: OAuthSignInPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthSignInPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinateD1OAuthRegistrationIntents<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthRegistrationIntents | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthRegistrationIntents<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthRegistrationIntents | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.oauthRegistrationIntents;\n\n const service: OAuthRegistrationIntents[\"Service\"] = {\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n };\n\n const provided = Context.make(OAuthRegistrationIntents, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinateD1OAuthAccounts<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthAccountsPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthAccounts<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthAccountsPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.oauthAccountsPersistence;\n\n const service: OAuthAccountsPersistence[\"Service\"] = {\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 settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n inspectUnlink: (input) => owner.run(original.inspectUnlink(input)),\n unlink: (input, prepare) => owner.run(original.unlink(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthAccountsPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinateD1OAuthRegistration<\n TargetId,\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n Rq extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, T, I, Rq, N> &\n OAuthD1Mapping;\n readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, TargetId | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthRegistration<\n Registration,\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, TargetId | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.registrationAuthority;\n\n const service: OAuthRegistrationAuthority<Registration> = {\n read: (input) => owner.run(original.read(input)),\n inspect: (input) => owner.run(original.inspect(input)),\n register: (input, prepare) => owner.run(original.register(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(options.target, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"d1-oauth.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-oauth.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n OAuthAccountsPersistence,\n OAuthRegistrationIntents,\n OAuthSignInPersistence,\n OAuthUnavailable,\n} from \"@yielded/auth/OAuth\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n OAuthAccountsMapping,\n OAuthD1Mapping,\n OAuthRegistrationAuthority,\n OAuthRegistrationIntentMapping,\n OAuthRegistrationMapping,\n OAuthSignInMapping,\n} from \"./oauth-model\";\nimport {\n type OAuthCoordinatorError,\n coordinateTargetOAuthAccounts,\n coordinateTargetOAuthSignIn,\n coordinateTargetOAuthRegistrationIntents,\n coordinateTargetOAuthRegistration,\n makeTargetOAuthRegistrationIntentServices,\n makeTargetOAuthRegistrationServices,\n makeTargetOAuthSignInServices,\n makeTargetOAuthAccountsServices,\n} from \"./oauth-target\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype SQLiteTable = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\nconst unavailable = () => OAuthUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nexport const makeD1OAuthAccountsServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n>(\n mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthAccountsServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthSignInServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n>(\n mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthSignInServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthRegistrationIntentServices = <\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n>(\n mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthRegistrationIntentServices(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport const makeD1OAuthRegistrationServices = <\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n R extends SQLiteTable,\n N,\n>(\n mapping: OAuthRegistrationMapping<Registration, S, O, C, AC, T, I, R, N> & OAuthD1Mapping,\n) =>\n makeTargetOAuthRegistrationServices<Registration>(mapping, configuration).pipe(\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateD1OAuthSignIn<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthSignInPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthSignIn<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthSignInPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.oauthSignInPersistence;\n\n const service: OAuthSignInPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthSignInPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinateD1OAuthRegistrationIntents<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationIntentMapping<S, O, C, AC, F, T, I, N> & OAuthD1Mapping;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthRegistrationIntents | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthRegistrationIntents<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthRegistrationIntents | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.oauthRegistrationIntents;\n\n const service: OAuthRegistrationIntents[\"Service\"] = {\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n };\n\n const provided = Context.make(OAuthRegistrationIntents, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinateD1OAuthAccounts<\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n F extends SQLiteTable,\n T extends SQLiteTable,\n U extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: { readonly mapping: OAuthAccountsMapping<S, O, C, AC, F, T, U, N> & OAuthD1Mapping },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, OAuthAccountsPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthAccounts<\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, OAuthAccountsPersistence | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.oauthAccountsPersistence;\n\n const service: OAuthAccountsPersistence[\"Service\"] = {\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 settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n inspectUnlink: (input) => owner.run(original.inspectUnlink(input)),\n unlink: (input, prepare) => owner.run(original.unlink(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(OAuthAccountsPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinateD1OAuthRegistration<\n TargetId,\n Registration,\n S extends SQLiteTable,\n O extends SQLiteTable,\n C extends SQLiteTable,\n AC extends SQLiteTable,\n T extends SQLiteTable,\n I extends SQLiteTable,\n Rq extends SQLiteTable,\n N,\n A,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: OAuthRegistrationMapping<NoInfer<Registration>, S, O, C, AC, T, I, Rq, N> &\n OAuthD1Mapping;\n readonly target: SuppliedService<TargetId, OAuthRegistrationAuthority<Registration>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n OAuthCoordinatorError<E> | DatabaseError,\n Exclude<R, TargetId | D1BatchStatements> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetOAuthRegistration<\n Registration,\n never,\n A,\n E | OAuthUnavailable,\n Exclude<R, TargetId | D1BatchStatements>\n >(database, options.mapping, configuration, (_transaction, services, append) =>\n Effect.gen(function* () {\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 original = services.registrationAuthority;\n\n const service: OAuthRegistrationAuthority<Registration> = {\n read: (input) => owner.run(original.read(input)),\n inspect: (input) => owner.run(original.inspect(input)),\n register: (input, prepare) => owner.run(original.register(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(options.target, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { D1PasskeyMapping, PasskeyCredentialMapping, PasskeyEnrollmentContextMapping, PasskeyMappingSource, PasskeyPersistenceMapping } from "./passkey-model.mjs";
|
|
2
2
|
import { PasskeyRegistrationCeremonyMapping } from "./passkey-registration-ceremony-model.mjs";
|
|
3
3
|
import { PasskeyManagementMapping, PasskeyRegistrationMapping, PasskeyRegistrationServices, PasskeyRegistrationWriter } from "./passkey-write-model.mjs";
|
|
4
|
+
import { Database as Database$1 } from "./d1-database.mjs";
|
|
4
5
|
import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
5
6
|
import { PasskeyCoordinatorError } from "./passkey-target.mjs";
|
|
6
7
|
import { AnyRelations } from "drizzle-orm";
|
|
7
8
|
import { Context, Effect } from "effect";
|
|
8
9
|
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
10
|
+
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
9
11
|
import { PasskeyManagementPersistence, PasskeyPersistence } from "@yielded/auth/Passkey";
|
|
10
12
|
import { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
11
13
|
import { D1Client } from "@effect/sql-d1/D1Client";
|
|
12
|
-
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
13
14
|
//#region src/drizzle/d1-passkey.d.ts
|
|
14
15
|
type Table$1 = AnySQLiteTable<{
|
|
15
16
|
dialect: "sqlite";
|
|
@@ -17,19 +18,7 @@ type Table$1 = AnySQLiteTable<{
|
|
|
17
18
|
type Database = EffectSQLiteD1Database<AnyRelations> & {
|
|
18
19
|
readonly $client: D1Client;
|
|
19
20
|
};
|
|
20
|
-
export declare const makePasskeyCredentialServices: <Database extends
|
|
21
|
-
readonly $client: D1Client;
|
|
22
|
-
}, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, N, RSetup = never>(database: Database, mapping: PasskeyMappingSource<PasskeyCredentialMapping<S, C, F, O, H, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyCredentialServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, RSetup>, makePasskeyEnrollmentContextServices: <Database extends EffectSQLiteD1Database<import("drizzle-orm").TablesRelationalConfig> & {
|
|
23
|
-
readonly $client: D1Client;
|
|
24
|
-
}, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, N, RSetup = never>(database: Database, mapping: PasskeyMappingSource<PasskeyEnrollmentContextMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyEnrollmentContextServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, RSetup>, makePasskeyPersistenceServices: <Database extends EffectSQLiteD1Database<import("drizzle-orm").TablesRelationalConfig> & {
|
|
25
|
-
readonly $client: D1Client;
|
|
26
|
-
}, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, N, RSetup = never>(database: Database, mapping: PasskeyMappingSource<PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, Flow, Admission, Charge, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyPersistenceServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, RSetup | LifecycleHooks>, makePasskeyRegistrationCeremonyServices: <Database extends EffectSQLiteD1Database<import("drizzle-orm").TablesRelationalConfig> & {
|
|
27
|
-
readonly $client: D1Client;
|
|
28
|
-
}, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, H extends Table$1, RSetup = never>(database: Database, mapping: PasskeyMappingSource<PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyRegistrationCeremonyServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, RSetup | LifecycleHooks>, makePasskeyManagementServices: <Database extends EffectSQLiteD1Database<import("drizzle-orm").TablesRelationalConfig> & {
|
|
29
|
-
readonly $client: D1Client;
|
|
30
|
-
}, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Command extends Table$1, N, RSetup = never>(database: Database, mapping: PasskeyMappingSource<PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyManagementServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, RSetup | LifecycleHooks>, makePasskeyRegistrationServices: <Database extends EffectSQLiteD1Database<import("drizzle-orm").TablesRelationalConfig> & {
|
|
31
|
-
readonly $client: D1Client;
|
|
32
|
-
}, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, N, Value, RSetup = never>(database: Database, mapping: PasskeyMappingSource<PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> & D1PasskeyMapping, RSetup>) => Effect.Effect<PasskeyRegistrationServices<Value>, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, RSetup | LifecycleHooks>;
|
|
21
|
+
export declare const makePasskeyCredentialServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyCredentialMapping<S, C, F, O, H, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyCredentialServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | Exclude<RSetup, import("@yielded/auth-persistence/Adapter").NativeDatabase>>, makePasskeyEnrollmentContextServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyEnrollmentContextMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyEnrollmentContextServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | Exclude<RSetup, import("@yielded/auth-persistence/Adapter").NativeDatabase>>, makePasskeyPersistenceServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, Flow, Admission, Charge, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyPersistenceServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, import("@yielded/auth-persistence/Adapter").NativeDatabase>>, makePasskeyRegistrationCeremonyServices: <M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, H extends Table$1, RSetup = never>(mapping: PasskeyMappingSource<PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyRegistrationCeremonyServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, import("@yielded/auth-persistence/Adapter").NativeDatabase>>, makePasskeyManagementServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Command extends Table$1, N, RSetup = never>(mapping: PasskeyMappingSource<PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> & D1PasskeyMapping, RSetup>) => Effect.Effect<import("@yielded/auth-persistence/Adapter").PasskeyManagementServices, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, import("@yielded/auth-persistence/Adapter").NativeDatabase>>, makePasskeyRegistrationServices: <S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, Intent extends Table$1, N, Value, RSetup = never>(mapping: PasskeyMappingSource<PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> & D1PasskeyMapping, RSetup>) => Effect.Effect<PasskeyRegistrationServices<Value>, import("@yielded/auth/Passkey").PasskeyConfigurationError | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, Database$1 | LifecycleHooks | Exclude<RSetup, import("@yielded/auth-persistence/Adapter").NativeDatabase>>;
|
|
33
22
|
export declare function coordinatePasskeyPersistence<D extends Database, S extends Table$1, C extends Table$1, F extends Table$1, O extends Table$1, H extends Table$1, M extends Table$1, Flow extends Table$1, Admission extends Table$1, Charge extends Table$1, N, A, E, R, RSetup = never, DatabaseError = never, DatabaseRequirements = never>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
34
23
|
readonly mapping: PasskeyMappingSource<PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N>, M, Flow, Admission, Charge, N> & D1PasskeyMapping, RSetup>;
|
|
35
24
|
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, PasskeyCoordinatorError<E> | DatabaseError, Exclude<R, PasskeyPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements | RSetup>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { coordinateTargetPasskeyManagement, coordinateTargetPasskeyRegistrationWriter } from "./passkey-write-target.mjs";
|
|
2
|
+
import { Database } from "./d1-database.mjs";
|
|
2
3
|
import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
3
4
|
import { makeD1Owner } from "./d1-planning.mjs";
|
|
4
5
|
import { coordinateTargetPasskey, coordinateTargetPasskeyRegistration } from "./passkey-target.mjs";
|
|
@@ -13,7 +14,7 @@ const configuration = {
|
|
|
13
14
|
locking: false,
|
|
14
15
|
standaloneGuard: () => Effect.void
|
|
15
16
|
};
|
|
16
|
-
const { makePasskeyCredentialServices, makePasskeyEnrollmentContextServices, makePasskeyPersistenceServices, makePasskeyRegistrationCeremonyServices, makePasskeyManagementServices, makePasskeyRegistrationServices } = makePasskeyTarget(configuration);
|
|
17
|
+
const { makePasskeyCredentialServices, makePasskeyEnrollmentContextServices, makePasskeyPersistenceServices, makePasskeyRegistrationCeremonyServices, makePasskeyManagementServices, makePasskeyRegistrationServices } = makePasskeyTarget(Database, configuration);
|
|
17
18
|
function coordinatePasskeyPersistence(acquire, options, body) {
|
|
18
19
|
return Effect.flatMap(acquire, (database) => coordinateTargetPasskey(database, options.mapping, configuration, (_, services, append) => Effect.gen(function* () {
|
|
19
20
|
const original = services.passkeyPersistence;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1-passkey.mjs","names":[],"sources":["../../src/drizzle/d1-passkey.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n PasskeyUnavailable,\n PasskeyPersistence,\n PasskeyManagementPersistence,\n} from \"@yielded/auth/Passkey\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\n\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { makePasskeyTarget } from \"./passkey-drivers\";\nimport type {\n D1PasskeyMapping,\n PasskeyCredentialMapping,\n PasskeyMappingSource,\n PasskeyPersistenceMapping,\n} from \"./passkey-model\";\nimport type { PasskeyRegistrationCeremonyMapping } from \"./passkey-registration-ceremony-model\";\nimport {\n type PasskeyCoordinatorError,\n coordinateTargetPasskey,\n coordinateTargetPasskeyRegistration,\n} from \"./passkey-target\";\n\ntype Table = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\n\nconst unavailable = () => PasskeyUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nconst target = makePasskeyTarget<Database, Table, D1PasskeyMapping>(configuration);\n\nexport const {\n makePasskeyCredentialServices,\n makePasskeyEnrollmentContextServices,\n makePasskeyPersistenceServices,\n makePasskeyRegistrationCeremonyServices,\n makePasskeyManagementServices,\n makePasskeyRegistrationServices,\n} = target;\n\nexport function coordinatePasskeyPersistence<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N>,\n M,\n Flow,\n Admission,\n Charge,\n N\n > &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskey(database, options.mapping, configuration, (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\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: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinatePasskeyRegistrationCeremony<\n D extends Database,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n H extends Table,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskeyRegistration(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\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: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nimport type {\n PasskeyManagementMapping,\n PasskeyRegistrationMapping,\n PasskeyRegistrationServices,\n PasskeyRegistrationWriter,\n} from \"./passkey-write-model\";\nimport {\n coordinateTargetPasskeyManagement,\n coordinateTargetPasskeyRegistrationWriter,\n} from \"./passkey-write-target\";\n\nexport function coordinatePasskeyManagement<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Command extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | PasskeyManagementPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskeyManagement(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyManagementPersistence;\n\n const service: PasskeyManagementPersistence[\"Service\"] = {\n list: (input) => owner.run(authority.list(input)),\n inspectRemove: (input) => owner.run(authority.inspectRemove(input)),\n issueEnrollment: (input, prepare) =>\n owner.run(authority.issueEnrollment(input, prepare)),\n completeEnrollment: (input, prepare) =>\n owner.run(authority.completeEnrollment(input, prepare)),\n rename: (input, prepare) => owner.run(authority.rename(input, prepare)),\n remove: (input, prepare) => owner.run(authority.remove(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(PasskeyManagementPersistence, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ),\n );\n}\n\nexport function coordinatePasskeyRegistration<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n N,\n Value,\n AuthorityId,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> &\n D1PasskeyMapping,\n RSetup\n >;\n readonly authority: Context.Key<AuthorityId, PasskeyRegistrationWriter<Value>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | AuthorityId | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskeyRegistrationWriter(\n database,\n options.mapping,\n configuration,\n (_, services: PasskeyRegistrationServices<Value>, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyRegistrationAuthority;\n\n const service: PasskeyRegistrationWriter<Value> = {\n inspect: (input) => owner.run(authority.inspect(input)),\n issueRegistration: (input, prepare) =>\n owner.run(authority.issueRegistration(input, prepare)),\n completeRegistration: (input, prepare) =>\n owner.run(authority.completeRegistration(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(options.authority, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ),\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"d1-passkey.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-passkey.ts"],"sourcesContent":["import type { D1Client } from \"@effect/sql-d1/D1Client\";\nimport type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport {\n PasskeyUnavailable,\n PasskeyPersistence,\n PasskeyManagementPersistence,\n} from \"@yielded/auth/Passkey\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport { Effect, Context } from \"effect\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport { makeD1Owner } from \"./d1-planning\";\nimport { D1BatchStatements } from \"./D1BatchStatements\";\nimport { makePasskeyTarget } from \"./passkey-drivers\";\nimport type {\n D1PasskeyMapping,\n PasskeyCredentialMapping,\n PasskeyMappingSource,\n PasskeyPersistenceMapping,\n} from \"./passkey-model\";\nimport type { PasskeyRegistrationCeremonyMapping } from \"./passkey-registration-ceremony-model\";\nimport {\n type PasskeyCoordinatorError,\n coordinateTargetPasskey,\n coordinateTargetPasskeyRegistration,\n} from \"./passkey-target\";\n\ntype Table = AnySQLiteTable<{ dialect: \"sqlite\" }>;\ntype Database = EffectSQLiteD1Database<AnyRelations> & { readonly $client: D1Client };\n\nconst unavailable = () => PasskeyUnavailable.make({});\n\nconst configuration = {\n mode: \"batch\" as const,\n dialect: \"sqlite\" as const,\n locking: false,\n standaloneGuard: () => Effect.void,\n};\n\nconst target = makePasskeyTarget<DatabaseService, Database, Table, D1PasskeyMapping>(\n DatabaseService,\n configuration,\n);\n\nexport const {\n makePasskeyCredentialServices,\n makePasskeyEnrollmentContextServices,\n makePasskeyPersistenceServices,\n makePasskeyRegistrationCeremonyServices,\n makePasskeyManagementServices,\n makePasskeyRegistrationServices,\n} = target;\n\nexport function coordinatePasskeyPersistence<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N>,\n M,\n Flow,\n Admission,\n Charge,\n N\n > &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskey(database, options.mapping, configuration, (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\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: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nexport function coordinatePasskeyRegistrationCeremony<\n D extends Database,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n H extends Table,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationCeremonyMapping<M, Flow, Admission, Charge, Intent, H> & D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskeyRegistration(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const original = services.passkeyPersistence;\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: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const provided = Context.make(PasskeyPersistence, service).pipe(\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, provided));\n }),\n ),\n );\n}\n\nimport type {\n PasskeyManagementMapping,\n PasskeyRegistrationMapping,\n PasskeyRegistrationServices,\n PasskeyRegistrationWriter,\n} from \"./passkey-write-model\";\nimport {\n coordinateTargetPasskeyManagement,\n coordinateTargetPasskeyRegistrationWriter,\n} from \"./passkey-write-target\";\n\nexport function coordinatePasskeyManagement<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Command extends Table,\n N,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyManagementMapping<S, C, F, O, H, M, Flow, Admission, Charge, Command, N> &\n D1PasskeyMapping,\n RSetup\n >;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | PasskeyManagementPersistence | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskeyManagement(\n database,\n options.mapping,\n configuration,\n (_, services, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyManagementPersistence;\n\n const service: PasskeyManagementPersistence[\"Service\"] = {\n list: (input) => owner.run(authority.list(input)),\n inspectRemove: (input) => owner.run(authority.inspectRemove(input)),\n issueEnrollment: (input, prepare) =>\n owner.run(authority.issueEnrollment(input, prepare)),\n completeEnrollment: (input, prepare) =>\n owner.run(authority.completeEnrollment(input, prepare)),\n rename: (input, prepare) => owner.run(authority.rename(input, prepare)),\n remove: (input, prepare) => owner.run(authority.remove(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(PasskeyManagementPersistence, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ),\n );\n}\n\nexport function coordinatePasskeyRegistration<\n D extends Database,\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n Admission extends Table,\n Charge extends Table,\n Intent extends Table,\n N,\n Value,\n AuthorityId,\n A,\n E,\n R,\n RSetup = never,\n DatabaseError = never,\n DatabaseRequirements = never,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasskeyMappingSource<\n PasskeyRegistrationMapping<S, C, F, O, H, M, Flow, Admission, Charge, Intent, N, Value> &\n D1PasskeyMapping,\n RSetup\n >;\n readonly authority: Context.Key<AuthorityId, PasskeyRegistrationWriter<Value>>;\n },\n body: Effect.Effect<A, E, R>,\n): Effect.Effect<\n A,\n PasskeyCoordinatorError<E> | DatabaseError,\n | Exclude<R, PasskeyPersistence | AuthorityId | D1BatchStatements>\n | LifecycleHooks\n | DatabaseRequirements\n | RSetup\n> {\n return Effect.flatMap(acquire, (database) =>\n coordinateTargetPasskeyRegistrationWriter(\n database,\n options.mapping,\n configuration,\n (_, services: PasskeyRegistrationServices<Value>, append) =>\n Effect.gen(function* () {\n const collector = D1BatchStatements.of({\n append: (statement) => Effect.sync(() => append(statement)),\n });\n\n const owner = yield* makeD1Owner(unavailable()).pipe(\n Effect.provideService(D1BatchStatements, collector),\n );\n\n const original = services.passkeyPersistence;\n\n const persistence: PasskeyPersistence[\"Service\"] = {\n issue: (input, prepare) => owner.run(original.issue(input, prepare)),\n context: (input) => owner.run(original.context(input)),\n claim: (input, prepare) => owner.run(original.claim(input, prepare)),\n settle: (input, prepare) => owner.run(original.settle(input, prepare)),\n cleanup: (input, prepare) => owner.run(original.cleanup(input, prepare)),\n };\n\n const authority = services.passkeyRegistrationAuthority;\n\n const service: PasskeyRegistrationWriter<Value> = {\n inspect: (input) => owner.run(authority.inspect(input)),\n issueRegistration: (input, prepare) =>\n owner.run(authority.issueRegistration(input, prepare)),\n completeRegistration: (input, prepare) =>\n owner.run(authority.completeRegistration(input, prepare)),\n };\n\n const context = Context.make(PasskeyPersistence, persistence).pipe(\n Context.add(options.authority, service),\n Context.add(D1BatchStatements, owner.collector),\n );\n\n return yield* owner.close(Effect.provideContext(body, context));\n }),\n ),\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { D1PasswordPreparedPersistenceMapping, D1PasswordPreparedProofMapping } from "./password-prepared-model.mjs";
|
|
2
|
+
import { Database as Database$1 } from "./d1-database.mjs";
|
|
2
3
|
import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
3
4
|
import { SuppliedService } from "./SuppliedService.mjs";
|
|
4
5
|
import { AnyRelations } from "drizzle-orm";
|
|
5
6
|
import { Effect } from "effect";
|
|
6
7
|
import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
|
|
7
8
|
import { PasswordPreparedPersistence, PasswordUnavailable } from "@yielded/auth/Password";
|
|
9
|
+
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
8
10
|
import { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
9
11
|
import { D1Client } from "@effect/sql-d1/D1Client";
|
|
10
|
-
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
11
12
|
//#region src/drizzle/d1-password-prepared.d.ts
|
|
12
13
|
type Database = EffectSQLiteD1Database<AnyRelations> & {
|
|
13
14
|
readonly $client: D1Client;
|
|
14
15
|
};
|
|
15
|
-
export declare const makeD1PasswordPreparedPersistenceServices: <S extends AnySQLiteTable, I extends AnySQLiteTable, C extends AnySQLiteTable, AC extends AnySQLiteTable, At extends AnySQLiteTable, RS extends AnySQLiteTable, CE extends AnySQLiteTable, M extends AnySQLiteTable, T extends AnySQLiteTable, B extends AnySQLiteTable, NativeId, PS extends AnySQLiteTable = AnySQLiteTable, PC extends AnySQLiteTable = AnySQLiteTable, PM extends AnySQLiteTable = AnySQLiteTable, PSub extends AnySQLiteTable = AnySQLiteTable, PI extends AnySQLiteTable = AnySQLiteTable, PCr extends AnySQLiteTable = AnySQLiteTable, PNativeId = unknown>(
|
|
16
|
+
export declare const makeD1PasswordPreparedPersistenceServices: <S extends AnySQLiteTable, I extends AnySQLiteTable, C extends AnySQLiteTable, AC extends AnySQLiteTable, At extends AnySQLiteTable, RS extends AnySQLiteTable, CE extends AnySQLiteTable, M extends AnySQLiteTable, T extends AnySQLiteTable, B extends AnySQLiteTable, NativeId, PS extends AnySQLiteTable = AnySQLiteTable, PC extends AnySQLiteTable = AnySQLiteTable, PM extends AnySQLiteTable = AnySQLiteTable, PSub extends AnySQLiteTable = AnySQLiteTable, PI extends AnySQLiteTable = AnySQLiteTable, PCr extends AnySQLiteTable = AnySQLiteTable, PNativeId = unknown>(mapping: D1PasswordPreparedPersistenceMapping<S, I, C, AC, At, RS, CE, M, T, B, NativeId>, proofMapping?: D1PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId> | undefined) => Effect.Effect<{
|
|
16
17
|
passwordPreparedPersistence: PasswordPreparedPersistence;
|
|
17
|
-
}, never, LifecycleHooks>;
|
|
18
|
+
}, never, Database$1 | LifecycleHooks>;
|
|
18
19
|
export declare function coordinateD1PasswordPreparedPersistence<TargetId, S extends AnySQLiteTable, I extends AnySQLiteTable, C extends AnySQLiteTable, AC extends AnySQLiteTable, At extends AnySQLiteTable, RS extends AnySQLiteTable, CE extends AnySQLiteTable, M extends AnySQLiteTable, T extends AnySQLiteTable, B extends AnySQLiteTable, NativeId, PS extends AnySQLiteTable, PC extends AnySQLiteTable, PM extends AnySQLiteTable, PSub extends AnySQLiteTable, PI extends AnySQLiteTable, PCr extends AnySQLiteTable, PNativeId, A, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<Database, DatabaseError, DatabaseRequirements>, options: {
|
|
19
20
|
readonly mapping: D1PasswordPreparedPersistenceMapping<S, I, C, AC, At, RS, CE, M, T, B, NativeId>;
|
|
20
21
|
readonly proofMapping?: D1PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId> | undefined;
|
|
@@ -3,6 +3,7 @@ import { balancedD1And, compactD1GeneratedStatement } from "./d1-generated-state
|
|
|
3
3
|
import { CurrentPasswordSql } from "./password-sql.mjs";
|
|
4
4
|
import { CompletionInput, ContextInput, encodeReservation, evidenceCurrent, identifierScope, reservationOf, sameRevision, snapshotMutation, snapshotReserve, unavailable } from "./password-prepared-state.mjs";
|
|
5
5
|
import { passwordPreparedSqlKernel } from "./password-prepared-sql.mjs";
|
|
6
|
+
import { Database } from "./d1-database.mjs";
|
|
6
7
|
import { D1BatchStatements } from "./D1BatchStatements.mjs";
|
|
7
8
|
import { CurrentD1PlanningDatabase, makeD1Owner } from "./d1-planning.mjs";
|
|
8
9
|
import { checkD1ProofCompletion, compileD1ProofCompletionPlan } from "./d1-proofs.mjs";
|
|
@@ -378,7 +379,8 @@ const makePreparedPlans = (mapping, proofMapping) => {
|
|
|
378
379
|
})
|
|
379
380
|
};
|
|
380
381
|
};
|
|
381
|
-
const makeD1PasswordPreparedPersistenceServices =
|
|
382
|
+
const makeD1PasswordPreparedPersistenceServices = Effect.fnUntraced(function* (mapping, proofMapping) {
|
|
383
|
+
const database = yield* Database;
|
|
382
384
|
const hooks = yield* LifecycleHooks;
|
|
383
385
|
const plans = makePreparedPlans(mapping, proofMapping);
|
|
384
386
|
const run = (plan) => Effect.gen(function* () {
|