@yielded/auth-persistence-drizzle 0.1.0-beta.1 → 0.1.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/D1.d.mts +27 -22
- package/dist/D1.mjs +10 -4
- package/dist/D1.mjs.map +1 -1
- package/dist/Libsql.d.mts +66 -61
- package/dist/Libsql.mjs +20 -15
- package/dist/Libsql.mjs.map +1 -1
- package/dist/Mysql2.d.mts +58 -46
- package/dist/Mysql2.mjs +13 -6
- package/dist/Mysql2.mjs.map +1 -1
- package/dist/Pglite.d.mts +43 -32
- package/dist/Pglite.mjs +12 -7
- package/dist/Pglite.mjs.map +1 -1
- package/dist/Postgres.d.mts +59 -48
- package/dist/Postgres.mjs +12 -7
- package/dist/Postgres.mjs.map +1 -1
- package/dist/SqliteBun.d.mts +58 -53
- package/dist/SqliteBun.mjs +20 -14
- package/dist/SqliteBun.mjs.map +1 -1
- package/dist/SqliteDo.d.mts +66 -60
- package/dist/SqliteDo.mjs +26 -14
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +58 -53
- package/dist/SqliteNode.mjs +20 -14
- package/dist/SqliteNode.mjs.map +1 -1
- package/dist/SqliteWasm.d.mts +66 -61
- package/dist/SqliteWasm.mjs +20 -14
- package/dist/SqliteWasm.mjs.map +1 -1
- package/dist/drizzle/d1-database.d.mts +11 -0
- package/dist/drizzle/d1-database.mjs +8 -0
- package/dist/drizzle/d1-database.mjs.map +1 -0
- package/dist/drizzle/d1-emails.d.mts +8 -7
- package/dist/drizzle/d1-emails.mjs +7 -4
- package/dist/drizzle/d1-emails.mjs.map +1 -1
- package/dist/drizzle/d1-identity.mjs +12 -9
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/d1-oauth.d.mts +14 -13
- package/dist/drizzle/d1-oauth.mjs +7 -4
- package/dist/drizzle/d1-oauth.mjs.map +1 -1
- package/dist/drizzle/d1-passkey.d.mts +3 -14
- package/dist/drizzle/d1-passkey.mjs +2 -1
- package/dist/drizzle/d1-passkey.mjs.map +1 -1
- package/dist/drizzle/d1-password-prepared.d.mts +4 -3
- package/dist/drizzle/d1-password-prepared.mjs +3 -1
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
- package/dist/drizzle/d1-passwords.d.mts +6 -5
- package/dist/drizzle/d1-passwords.mjs +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 +4 -3
- package/dist/drizzle/d1-proofs.mjs +3 -1
- package/dist/drizzle/d1-proofs.mjs.map +1 -1
- package/dist/drizzle/d1-sessions.d.mts +11 -10
- package/dist/drizzle/d1-sessions.mjs +15 -9
- package/dist/drizzle/d1-sessions.mjs.map +1 -1
- package/dist/drizzle/d1-totp.d.mts +3 -4
- package/dist/drizzle/d1-totp.mjs +2 -1
- package/dist/drizzle/d1-totp.mjs.map +1 -1
- package/dist/drizzle/email-registration.mjs +2 -1
- package/dist/drizzle/email-registration.mjs.map +1 -1
- package/dist/drizzle/email-target.d.mts +7 -6
- package/dist/drizzle/email-target.mjs +10 -10
- package/dist/drizzle/email-target.mjs.map +1 -1
- package/dist/drizzle/mysql-database.d.mts +8 -0
- package/dist/drizzle/mysql-database.mjs +8 -0
- package/dist/drizzle/mysql-database.mjs.map +1 -0
- package/dist/drizzle/mysql-emails.d.mts +7 -6
- package/dist/drizzle/mysql-emails.mjs +12 -8
- package/dist/drizzle/mysql-emails.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +12 -9
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/mysql-password-prepared.d.mts +3 -2
- package/dist/drizzle/mysql-password-prepared.mjs +6 -2
- package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
- package/dist/drizzle/mysql-passwords.d.mts +6 -4
- package/dist/drizzle/mysql-passwords.mjs +11 -7
- package/dist/drizzle/mysql-passwords.mjs.map +1 -1
- package/dist/drizzle/mysql-proofs.d.mts +3 -2
- package/dist/drizzle/mysql-proofs.mjs +8 -4
- package/dist/drizzle/mysql-proofs.mjs.map +1 -1
- package/dist/drizzle/mysql-sessions.d.mts +11 -10
- package/dist/drizzle/mysql-sessions.mjs +16 -12
- package/dist/drizzle/mysql-sessions.mjs.map +1 -1
- package/dist/drizzle/native-database.mjs +10 -0
- package/dist/drizzle/native-database.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-drivers.mjs +7 -5
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +6 -7
- package/dist/drizzle/oauth-connected-target.mjs +4 -5
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs +8 -6
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-target.d.mts +12 -11
- package/dist/drizzle/oauth-target.mjs +13 -12
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey-drivers.mjs +8 -6
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-drivers.mjs +5 -3
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-target.d.mts +1 -1
- package/dist/drizzle/password-prepared-sql.mjs +2 -1
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
- package/dist/drizzle/password-prepared-target.d.mts +3 -2
- package/dist/drizzle/password-prepared-target.mjs +4 -3
- package/dist/drizzle/password-prepared-target.mjs.map +1 -1
- package/dist/drizzle/password-registration.mjs +2 -1
- package/dist/drizzle/password-registration.mjs.map +1 -1
- package/dist/drizzle/password-target.d.mts +5 -4
- package/dist/drizzle/password-target.mjs +8 -8
- package/dist/drizzle/password-target.mjs.map +1 -1
- package/dist/drizzle/pg-database.d.mts +9 -0
- package/dist/drizzle/pg-database.mjs +8 -0
- package/dist/drizzle/pg-database.mjs.map +1 -0
- package/dist/drizzle/pg-emails.d.mts +7 -6
- package/dist/drizzle/pg-emails.mjs +12 -8
- package/dist/drizzle/pg-emails.mjs.map +1 -1
- package/dist/drizzle/pg-identity.mjs +12 -9
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/pg-password-prepared.d.mts +3 -2
- package/dist/drizzle/pg-password-prepared.mjs +6 -2
- package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
- package/dist/drizzle/pg-passwords.d.mts +6 -4
- package/dist/drizzle/pg-passwords.mjs +11 -7
- package/dist/drizzle/pg-passwords.mjs.map +1 -1
- package/dist/drizzle/pg-proofs.d.mts +3 -2
- package/dist/drizzle/pg-proofs.mjs +8 -4
- package/dist/drizzle/pg-proofs.mjs.map +1 -1
- package/dist/drizzle/pg-sessions.d.mts +11 -10
- package/dist/drizzle/pg-sessions.mjs +16 -12
- package/dist/drizzle/pg-sessions.mjs.map +1 -1
- package/dist/drizzle/phone-target.d.mts +4 -3
- package/dist/drizzle/phone-target.mjs +12 -11
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/proof-target.d.mts +3 -2
- package/dist/drizzle/proof-target.mjs +5 -5
- package/dist/drizzle/proof-target.mjs.map +1 -1
- package/dist/drizzle/session-sql.d.mts +1 -0
- package/dist/drizzle/session-target.d.mts +10 -8
- package/dist/drizzle/session-target.mjs +11 -11
- package/dist/drizzle/session-target.mjs.map +1 -1
- package/dist/drizzle/sqlite-emails.mjs +9 -5
- package/dist/drizzle/sqlite-emails.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +14 -11
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/sqlite-password-prepared.mjs +7 -3
- package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
- package/dist/drizzle/sqlite-passwords.mjs +10 -6
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
- package/dist/drizzle/sqlite-proofs.mjs +7 -3
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
- package/dist/drizzle/sqlite-sessions.mjs +16 -12
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
- package/dist/drizzle/standalone-guard.d.mts +2 -0
- package/dist/drizzle/standalone-guard.mjs +8 -4
- package/dist/drizzle/standalone-guard.mjs.map +1 -1
- package/dist/drizzle/totp-target.d.mts +4 -3
- package/dist/drizzle/totp-target.mjs +31 -28
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/package.json +1 -1
- package/src/D1.ts +37 -10
- package/src/Libsql.ts +45 -17
- package/src/Mysql2.ts +39 -13
- package/src/Pglite.ts +47 -13
- package/src/Postgres.ts +47 -13
- package/src/SqliteBun.ts +58 -30
- package/src/SqliteDo.ts +61 -19
- package/src/SqliteNode.ts +55 -28
- package/src/SqliteWasm.ts +55 -28
- package/src/drizzle/d1-database.ts +10 -0
- package/src/drizzle/d1-emails.ts +84 -84
- package/src/drizzle/d1-identity.ts +17 -20
- package/src/drizzle/d1-oauth.ts +19 -8
- package/src/drizzle/d1-passkey.ts +5 -1
- package/src/drizzle/d1-password-prepared.ts +38 -37
- package/src/drizzle/d1-passwords.ts +74 -76
- package/src/drizzle/d1-phone.ts +5 -1
- package/src/drizzle/d1-proofs.ts +29 -30
- package/src/drizzle/d1-sessions.ts +51 -38
- package/src/drizzle/d1-totp.ts +5 -1
- package/src/drizzle/email-registration.ts +6 -2
- package/src/drizzle/email-target.ts +17 -19
- package/src/drizzle/mysql-database.ts +8 -0
- package/src/drizzle/mysql-emails.ts +28 -16
- package/src/drizzle/mysql-identity.ts +18 -21
- package/src/drizzle/mysql-password-prepared.ts +10 -8
- package/src/drizzle/mysql-passwords.ts +21 -9
- package/src/drizzle/mysql-proofs.ts +16 -5
- package/src/drizzle/mysql-sessions.ts +40 -17
- package/src/drizzle/native-database.ts +22 -0
- package/src/drizzle/oauth-connected-drivers.ts +18 -6
- package/src/drizzle/oauth-connected-target.ts +16 -17
- package/src/drizzle/oauth-drivers.ts +26 -10
- package/src/drizzle/oauth-target.ts +30 -42
- package/src/drizzle/passkey-drivers.ts +21 -13
- package/src/drizzle/passkey-write-drivers.ts +11 -6
- package/src/drizzle/password-prepared-sql.ts +2 -4
- package/src/drizzle/password-prepared-target.ts +9 -6
- package/src/drizzle/password-registration.ts +7 -8
- package/src/drizzle/password-target.ts +19 -18
- package/src/drizzle/pg-database.ts +10 -0
- package/src/drizzle/pg-emails.ts +28 -16
- package/src/drizzle/pg-identity.ts +18 -22
- package/src/drizzle/pg-password-prepared.ts +10 -8
- package/src/drizzle/pg-passwords.ts +21 -9
- package/src/drizzle/pg-proofs.ts +16 -5
- package/src/drizzle/pg-sessions.ts +40 -17
- package/src/drizzle/phone-target.ts +22 -17
- package/src/drizzle/proof-target.ts +9 -12
- package/src/drizzle/session-target.ts +32 -50
- package/src/drizzle/sqlite-emails.ts +30 -13
- package/src/drizzle/sqlite-identity.ts +22 -42
- package/src/drizzle/sqlite-password-prepared.ts +23 -9
- package/src/drizzle/sqlite-passwords.ts +29 -15
- package/src/drizzle/sqlite-proofs.ts +28 -5
- package/src/drizzle/sqlite-sessions.ts +49 -23
- package/src/drizzle/standalone-guard.ts +18 -6
- package/src/drizzle/totp-target.ts +61 -60
- package/dist/drizzle/d1-identity.d.mts +0 -30
- package/dist/drizzle/mysql-identity.d.mts +0 -21
- package/dist/drizzle/pg-identity.d.mts +0 -22
|
@@ -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":"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"}
|
|
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
6
|
import { AnyRelations } from "drizzle-orm";
|
|
6
7
|
import { Effect } from "effect";
|
|
7
8
|
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
8
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">;
|
|
@@ -26,8 +27,6 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
26
27
|
readonly flow: import("@yielded/auth/OAuth").OAuthLinkPendingFlow;
|
|
27
28
|
readonly authorization: import("@yielded/auth/OAuth").OAuthActionAuthorization;
|
|
28
29
|
}, prepare: import("@yielded/auth/OAuth").PrepareOAuthCommit<{
|
|
29
|
-
readonly _tag: "Rejected";
|
|
30
|
-
} | {
|
|
31
30
|
readonly _tag: "Issued";
|
|
32
31
|
readonly flow: {
|
|
33
32
|
readonly context: {
|
|
@@ -83,6 +82,8 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
83
82
|
};
|
|
84
83
|
readonly retentionUntilMillis: number;
|
|
85
84
|
};
|
|
85
|
+
} | {
|
|
86
|
+
readonly _tag: "Rejected";
|
|
86
87
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
87
88
|
readonly preflight: (input: import("@yielded/auth/OAuth").OAuthLinkAccess) => Effect.Effect<import("@yielded/auth/OAuth").OAuthLinkPendingFlow | undefined, OAuthUnavailable>;
|
|
88
89
|
readonly claim: <A>(input: {
|
|
@@ -166,8 +167,6 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
166
167
|
readonly _tag: "Cancelled";
|
|
167
168
|
} | {
|
|
168
169
|
readonly _tag: "Ambiguous";
|
|
169
|
-
} | {
|
|
170
|
-
readonly _tag: "Conflict";
|
|
171
170
|
} | {
|
|
172
171
|
readonly _tag: "Linked";
|
|
173
172
|
readonly credential: {
|
|
@@ -189,6 +188,8 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
189
188
|
};
|
|
190
189
|
};
|
|
191
190
|
readonly changed: boolean;
|
|
191
|
+
} | {
|
|
192
|
+
readonly _tag: "Conflict";
|
|
192
193
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
193
194
|
readonly inspectUnlink: (input: {
|
|
194
195
|
readonly moduleId: string & import("effect/Brand").Brand<"effect-auth/OAuthModuleId">;
|
|
@@ -266,8 +267,8 @@ export declare const makeD1OAuthAccountsServices: <S extends SQLiteTable, O exte
|
|
|
266
267
|
readonly hasMore: boolean;
|
|
267
268
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
268
269
|
};
|
|
269
|
-
}, never, LifecycleHooks>;
|
|
270
|
-
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<{
|
|
271
272
|
oauthSignInPersistence: {
|
|
272
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>;
|
|
273
274
|
readonly claim: <A>(input: {
|
|
@@ -299,8 +300,8 @@ export declare const makeD1OAuthSignInServices: <S extends SQLiteTable, O extend
|
|
|
299
300
|
readonly hasMore: boolean;
|
|
300
301
|
}, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
301
302
|
};
|
|
302
|
-
}, never, LifecycleHooks>;
|
|
303
|
-
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<{
|
|
304
305
|
oauthRegistrationIntents: {
|
|
305
306
|
readonly settle: <A>(input: {
|
|
306
307
|
readonly claim: import("@yielded/auth/OAuth").OAuthClaim;
|
|
@@ -309,10 +310,10 @@ export declare const makeD1OAuthRegistrationIntentServices: <S extends SQLiteTab
|
|
|
309
310
|
readonly nowMillis: number;
|
|
310
311
|
}, prepare: import("@yielded/auth/OAuth").PrepareOAuthCommit<import("@yielded/auth/OAuth").OAuthRegistrationSettlement, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, OAuthUnavailable>;
|
|
311
312
|
};
|
|
312
|
-
}, never, LifecycleHooks>;
|
|
313
|
-
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<{
|
|
314
315
|
registrationAuthority: OAuthRegistrationAuthority<Registration>;
|
|
315
|
-
}, never, LifecycleHooks>;
|
|
316
|
+
}, never, Database$1 | LifecycleHooks>;
|
|
316
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: {
|
|
317
318
|
readonly mapping: OAuthSignInMapping<S, O, C, AC, F, N> & OAuthD1Mapping;
|
|
318
319
|
}, body: Effect.Effect<A, E, R>): Effect.Effect<A, OAuthCoordinatorError<E> | DatabaseError, Exclude<R, OAuthSignInPersistence | D1BatchStatements> | LifecycleHooks | DatabaseRequirements>;
|
|
@@ -1,6 +1,9 @@
|
|
|
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";
|
|
5
|
+
import { nativeDatabase } from "./native-database.mjs";
|
|
6
|
+
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
4
7
|
import { Context, Effect } from "effect";
|
|
5
8
|
import { OAuthAccountsPersistence, OAuthRegistrationIntents, OAuthSignInPersistence, OAuthUnavailable } from "@yielded/auth/OAuth";
|
|
6
9
|
//#region src/drizzle/d1-oauth.ts
|
|
@@ -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":";;;;;;AAqCA,MAAM,oBAAoB,iBAAiB,KAAK,CAAC,CAAC;AAElD,MAAM,gBAAgB;CACpB,MAAM;CACN,SAAS;CACT,SAAS;CACT,uBAAuB,OAAO;AAChC;AAEA,MAAa,+BAUX,UACA,YACG,gCAAgC,UAAU,SAAS,aAAa;AAErE,MAAa,6BAQX,UACA,YACG,8BAA8B,UAAU,SAAS,aAAa;AAEnE,MAAa,yCAUX,UACA,YACG,0CAA0C,UAAU,SAAS,aAAa;AAE/E,MAAa,mCAWX,UACA,YACG,oCAAkD,UAAU,SAAS,aAAa;AAEvF,SAAgB,wBAad,SACA,SACA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,4BAKE,UAAU,QAAQ,SAAS,gBAAgB,cAAc,UAAU,WACnE,OAAO,IAAI,aAAa;EACtB,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,eAAe,CAC1D;EAEA,MAAM,WAAW,SAAS;EAS1B,MAAM,WAAW,QAAQ,KAAK,wBAAwB;GANpD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;GACrE,UAAU,OAAO,YAAY,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO,CAAC;EAGb,CAAC,CAAC,CAAC,KAC7D,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;CACjE,CAAC,CACH,CACF;AACF;AAEA,SAAgB,qCAed,SACA,SAGA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,yCAKE,UAAU,QAAQ,SAAS,gBAAgB,cAAc,UAAU,WACnE,OAAO,IAAI,aAAa;EACtB,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,eAAe,CAC1D;EAEA,MAAM,WAAW,SAAS;EAM1B,MAAM,WAAW,QAAQ,KAAK,0BAA0B,EAHtD,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC,EAGT,CAAC,CAAC,CAAC,KAC/D,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;CACjE,CAAC,CACH,CACF;AACF;AAEA,SAAgB,0BAed,SACA,SACA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,8BAKE,UAAU,QAAQ,SAAS,gBAAgB,cAAc,UAAU,WACnE,OAAO,IAAI,aAAa;EACtB,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,eAAe,CAC1D;EAEA,MAAM,WAAW,SAAS;EAa1B,MAAM,WAAW,QAAQ,KAAK,0BAA0B;GAVtD,UAAU,UAAU,MAAM,IAAI,SAAS,QAAQ,KAAK,CAAC;GACrD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,YAAY,UAAU,MAAM,IAAI,SAAS,UAAU,KAAK,CAAC;GACzD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;GACrE,gBAAgB,UAAU,MAAM,IAAI,SAAS,cAAc,KAAK,CAAC;GACjE,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;GACrE,UAAU,OAAO,YAAY,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO,CAAC;EAGX,CAAC,CAAC,CAAC,KAC/D,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;CACjE,CAAC,CACH,CACF;AACF;AAEA,SAAgB,8BAiBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,kCAME,UAAU,QAAQ,SAAS,gBAAgB,cAAc,UAAU,WACnE,OAAO,IAAI,aAAa;EACtB,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,eAAe,CAC1D;EAEA,MAAM,WAAW,SAAS;EAS1B,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ;GAN5C,OAAO,UAAU,MAAM,IAAI,SAAS,KAAK,KAAK,CAAC;GAC/C,UAAU,UAAU,MAAM,IAAI,SAAS,QAAQ,KAAK,CAAC;GACrD,WAAW,OAAO,YAAY,MAAM,IAAI,SAAS,SAAS,OAAO,OAAO,CAAC;GACzE,UAAU,OAAO,YAAY,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO,CAAC;EAGrB,CAAC,CAAC,CAAC,KACrD,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;CACjE,CAAC,CACH,CACF;AACF"}
|
|
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":";;;;;;;;AA+BA,MAAM,oBAAoB,mBAAmB,KAAK,CAAC,CAAC;AAEpD,MAAM,gBAAgB;CACpB,MAAM;CACN,SAAS;CACT,SAAS;CACT,uBAAuB,OAAO;AAChC;AAIA,MAAa,EACX,+BACA,sCACA,gCACA,yCACA,+BACA,oCARa,kBAAqD,aAShE;AAEJ,SAAgB,6BAmBd,SACA,SAcA,MAQA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,wBAAwB,UAAU,QAAQ,SAAS,gBAAgB,GAAG,UAAU,WAC9E,OAAO,IAAI,aAAa;EACtB,MAAM,WAAW,SAAS;EAE1B,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,eAAe,CAC1D;EAUA,MAAM,WAAW,QAAQ,KAAK,oBAAoB;GAPhD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,UAAU,UAAU,MAAM,IAAI,SAAS,QAAQ,KAAK,CAAC;GACrD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;GACrE,UAAU,OAAO,YAAY,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO,CAAC;EAGjB,CAAC,CAAC,CAAC,KACzD,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;CACjE,CAAC,CACH,CACF;AACF;AAEA,SAAgB,sCAed,SACA,SAMA,MAQA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,oCACE,UACA,QAAQ,SACR,gBACC,GAAG,UAAU,WACZ,OAAO,IAAI,aAAa;EACtB,MAAM,WAAW,SAAS;EAE1B,MAAM,kBAAkB,kBAAkB,GAAG,EAC3C,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,eAAe,CAC1D;EAUA,MAAM,WAAW,QAAQ,KAAK,oBAAoB;GAPhD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,UAAU,UAAU,MAAM,IAAI,SAAS,QAAQ,KAAK,CAAC;GACrD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;GACrE,UAAU,OAAO,YAAY,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO,CAAC;EAGjB,CAAC,CAAC,CAAC,KACzD,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,QAAQ,CAAC;CACjE,CAAC,CACL,CACF;AACF;AAaA,SAAgB,4BAoBd,SACA,SAOA,MAQA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,kCACE,UACA,QAAQ,SACR,gBACC,GAAG,UAAU,WACZ,OAAO,IAAI,aAAa;EACtB,MAAM,YAAY,kBAAkB,GAAG,EACrC,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,SAAS,CACpD;EAEA,MAAM,WAAW,SAAS;EAE1B,MAAM,cAA6C;GACjD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,UAAU,UAAU,MAAM,IAAI,SAAS,QAAQ,KAAK,CAAC;GACrD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;GACrE,UAAU,OAAO,YAAY,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO,CAAC;EACzE;EAEA,MAAM,YAAY,SAAS;EAa3B,MAAM,UAAU,QAAQ,KAAK,oBAAoB,WAAW,CAAC,CAAC,KAC5D,QAAQ,IAAI,8BAA8B;GAX1C,OAAO,UAAU,MAAM,IAAI,UAAU,KAAK,KAAK,CAAC;GAChD,gBAAgB,UAAU,MAAM,IAAI,UAAU,cAAc,KAAK,CAAC;GAClE,kBAAkB,OAAO,YACvB,MAAM,IAAI,UAAU,gBAAgB,OAAO,OAAO,CAAC;GACrD,qBAAqB,OAAO,YAC1B,MAAM,IAAI,UAAU,mBAAmB,OAAO,OAAO,CAAC;GACxD,SAAS,OAAO,YAAY,MAAM,IAAI,UAAU,OAAO,OAAO,OAAO,CAAC;GACtE,SAAS,OAAO,YAAY,MAAM,IAAI,UAAU,OAAO,OAAO,OAAO,CAAC;EAItB,CAAC,GACjD,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,OAAO,CAAC;CAChE,CAAC,CACL,CACF;AACF;AAEA,SAAgB,8BAsBd,SACA,SAQA,MAQA;CACA,OAAO,OAAO,QAAQ,UAAU,aAC9B,0CACE,UACA,QAAQ,SACR,gBACC,GAAG,UAA8C,WAChD,OAAO,IAAI,aAAa;EACtB,MAAM,YAAY,kBAAkB,GAAG,EACrC,SAAS,cAAc,OAAO,WAAW,OAAO,SAAS,CAAC,EAC5D,CAAC;EAED,MAAM,QAAQ,OAAO,YAAY,YAAY,CAAC,CAAC,CAAC,KAC9C,OAAO,eAAe,mBAAmB,SAAS,CACpD;EAEA,MAAM,WAAW,SAAS;EAE1B,MAAM,cAA6C;GACjD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,UAAU,UAAU,MAAM,IAAI,SAAS,QAAQ,KAAK,CAAC;GACrD,QAAQ,OAAO,YAAY,MAAM,IAAI,SAAS,MAAM,OAAO,OAAO,CAAC;GACnE,SAAS,OAAO,YAAY,MAAM,IAAI,SAAS,OAAO,OAAO,OAAO,CAAC;GACrE,UAAU,OAAO,YAAY,MAAM,IAAI,SAAS,QAAQ,OAAO,OAAO,CAAC;EACzE;EAEA,MAAM,YAAY,SAAS;EAU3B,MAAM,UAAU,QAAQ,KAAK,oBAAoB,WAAW,CAAC,CAAC,KAC5D,QAAQ,IAAI,QAAQ,WAAW;GAR/B,UAAU,UAAU,MAAM,IAAI,UAAU,QAAQ,KAAK,CAAC;GACtD,oBAAoB,OAAO,YACzB,MAAM,IAAI,UAAU,kBAAkB,OAAO,OAAO,CAAC;GACvD,uBAAuB,OAAO,YAC5B,MAAM,IAAI,UAAU,qBAAqB,OAAO,OAAO,CAAC;EAIrB,CAAC,GACtC,QAAQ,IAAI,mBAAmB,MAAM,SAAS,CAChD;EAEA,OAAO,OAAO,MAAM,MAAM,OAAO,eAAe,MAAM,OAAO,CAAC;CAChE,CAAC,CACL,CACF;AACF"}
|
|
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* () {
|