{"version":3,"file":"passkey-managed.mjs","names":[],"sources":["../../src/internal/passkey-managed.ts"],"sourcesContent":["import * as M from \"@yielded/auth/Passkey\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport * as Cause from \"effect/Cause\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\nimport * as SqlClient from \"effect/sql/SqlClient\";\nimport type * as Statement from \"effect/sql/Statement\";\n\nimport {\n  PersistenceConfigurationError,\n  type MappingInput,\n  type PasskeyFeature,\n} from \"./configuration\";\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport {\n  requiredPasskeyCredentialConstraints,\n  requiredPasskeyPersistenceConstraints,\n} from \"./models/passkey-model\";\nimport type { NativeSqlTables } from \"./native-sql-table\";\nimport { makeBatchPasskeyServices, makeNativePasskeyServices } from \"./passkey-native\";\nimport type { PasskeyNativeMapping, PasskeyNativeRead } from \"./passkey-native-state\";\nimport {\n  makePasskeyNativeManagement,\n  type NativePasskeyManagementMapping,\n} from \"./passkey-native-write\";\nimport { anySqlCondition } from \"./sql-change\";\nimport { SqlBatchCommit } from \"./sql-commit\";\nimport { storageTables, type StorageRole } from \"./storage-tables\";\n\nexport interface ComposedPasskeyInput {\n  readonly storage: MappingInput;\n  readonly namespace: string;\n  readonly dialect: \"pg\" | \"sqlite\";\n  readonly features: ReadonlyArray<PasskeyFeature>;\n  readonly passwordModules: ReadonlyArray<string>;\n}\n\nconst profileJson = Schema.fromJsonString(M.PasskeyProfile);\n\nconst credentialData = M.PasskeyCredential.mapFields(\n  ({ revision: _revision, active: _active, requirement: _requirement, ...fields }) => fields,\n);\n\nconst configurationError = (reason: string) => PersistenceConfigurationError.make({ reason });\n\nconst mappings = Effect.fnUntraced(function* (\n  storage: MappingInput,\n  tables: NativeSqlTables,\n  passwordModules: ReadonlyArray<string>,\n  signInProfiles: ReadonlyArray<M.PasskeyProfile>,\n) {\n  const sql = (yield* SqlClient.SqlClient).withoutTransforms();\n\n  const table = Effect.fnUntraced(function* (role: StorageRole) {\n    const value = storage.tables[role];\n\n    if (value === undefined) return yield* configurationError(`Missing ${role} mapping`);\n\n    return value;\n  });\n\n  const mapped = Effect.fnUntraced(function* <Role extends StorageRole>(role: Role) {\n    return {\n      table: yield* table(role),\n      // Managed storage validation owns these physical column keys.\n      ...(Object.fromEntries(Object.keys(storageTables[role].columns).map((key) => [key, key])) as {\n        readonly [Key in keyof (typeof storageTables)[Role][\"columns\"]]: Key;\n      }),\n    };\n  });\n\n  const t = Effect.fnUntraced(function* (role: StorageRole) {\n    return tables(yield* table(role));\n  });\n\n  const eq = Effect.fnUntraced(function* (role: StorageRole, key: string, value: unknown) {\n    const table = yield* t(role);\n\n    return sql`${table.column(key)} = ${table.value(key, value)}`;\n  });\n\n  const s = storage.subjects;\n  const subject = tables(s.table);\n  const active = (value: unknown) => value === true;\n\n  const read: PasskeyNativeRead = {\n    subject: {\n      table: s.table,\n      id: s.id,\n      status: s.status,\n      securityRevision: s.securityRevision,\n      decodeId: (row) => row[s.id],\n      decodeRequirement: s.requirements,\n      isActiveStatus: (value) => Object.is(value, s.activeValue),\n      activeCondition: sql`${subject.column(s.status)} = ${subject.value(s.status, s.activeValue)}`,\n    },\n    credential: {\n      ...(yield* mapped(\"passkeyCredentials\")),\n      status: \"active\",\n      decode: (row) =>\n        Schema.decodeUnknownSync(credentialData)({\n          ...row,\n          profile: Schema.decodeUnknownSync(profileJson)(row.profile),\n        }),\n      decodeSubjectId: (row) => row.subjectId,\n      isActiveStatus: active,\n      activeCondition: yield* eq(\"passkeyCredentials\", \"active\", true),\n    },\n    authority: {\n      ...(yield* mapped(\"credentials\")),\n      status: \"active\",\n      isActiveStatus: active,\n      activeCondition: yield* eq(\"credentials\", \"active\", true),\n    },\n    subjectIds: { toNative: s.toNativeSync, toSubject: s.toSubjectSync, equals: Object.is },\n    constraints: requiredPasskeyCredentialConstraints,\n  };\n\n  const base = Effect.fnUntraced(function* (\n    feature: PasskeyFeature,\n  ): Effect.fn.Return<PasskeyNativeMapping, PersistenceConfigurationError> {\n    return {\n      moduleId: feature.moduleId,\n      read,\n      flow: { ...(yield* mapped(\"passkeyFlows\")), encodeInsert: () => ({}) },\n      clock: {\n        encodeInstant: storage.encodeInstant,\n        decodeInstant: storage.decodeInstantSync,\n        engineNowMillis: sql.onDialectOrElse({\n          pg: () => sql`cast(extract(epoch from clock_timestamp()) * 1000 as bigint)`,\n          orElse: () => sql`cast(round((julianday('now') - 2440587.5) * 86400000) as integer)`,\n        }),\n        toMillis: (expression: Statement.Fragment) => expression,\n        fromMillis: (expression: Statement.Fragment) => expression,\n      },\n      telemetry: {\n        lastUsedAt: \"lastUsedAt\",\n        encodeBackupEligible: (value) => value,\n        encodeBackupState: (value) => value,\n      },\n      constraints: requiredPasskeyPersistenceConstraints,\n    };\n  });\n\n  const metadata = (nativeId: unknown) =>\n    sql`exists(select 1 from ${subject.name} where ${subject.column(s.id)} = ${subject.value(s.id, nativeId)} and ${subject.column(s.status)} = ${subject.value(s.status, s.activeValue)})`;\n\n  const management = Effect.fnUntraced(function* (\n    feature: PasskeyFeature,\n  ): Effect.fn.Return<NativePasskeyManagementMapping, PersistenceConfigurationError> {\n    const policy = feature.managementPolicy;\n\n    if (policy === undefined)\n      return yield* configurationError(`Missing passkey management policy for ${feature.moduleId}`);\n\n    const c = yield* t(\"passkeyCredentials\"),\n      f = yield* t(\"credentials\");\n\n    return {\n      ...(yield* base(feature)),\n      write: {\n        credential: {\n          name: \"name\",\n          createdAt: \"createdAt\",\n          encodeInsert: ({ credential, subjectId, summary, marker }) => ({\n            credentialId: credential.credentialId,\n            subjectId,\n            rpId: credential.rpId,\n            protocolCredentialId: credential.protocolCredentialId,\n            userHandle: credential.userHandle,\n            credentialKey: \"\",\n            publicKey: credential.publicKey,\n            algorithm: credential.algorithm,\n            profile: Schema.encodeSync(profileJson)(credential.profile),\n            credentialRevision: marker,\n            active: true,\n            primarySignIn: credential.primarySignIn,\n            enrollmentUserVerified: credential.enrollmentUserVerified,\n            backupEligible: credential.backupEligible,\n            backupState: credential.backupState,\n            counter: credential.counter,\n            name: summary.name,\n            createdAt: storage.encodeInstant(summary.createdAtMillis),\n          }),\n          encodePrimarySignIn: (value) => value,\n          encodeEnrollmentUserVerified: (value) => value,\n          encodeBackupEligible: (value) => value,\n          activeStatus: true,\n          removedStatus: false,\n        },\n        authority: {\n          encodeInsert: ({ subjectId, credential, marker }) => ({\n            subjectId,\n            credentialId: credential.credentialId,\n            revision: marker,\n            active: true,\n          }),\n          activeStatus: true,\n          removedStatus: false,\n        },\n        policy: {\n          subjectColumns: subject.keys,\n          management: () => policy,\n          requirement: s.actionRequirements,\n          metadata,\n          action: metadata,\n          remainingSignIn: Effect.fnUntraced(\n            function* (nativeId, excluded, row) {\n              const requirement = yield* Schema.decodeEffect(M.PasskeyRequirement)(\n                yield* s.requirements(row),\n              );\n\n              const alternatives: Statement.Fragment[] = [];\n\n              if (\n                requirement.alternatives.some(\n                  (alternative) =>\n                    alternative.minimumCredentials === 1 &&\n                    alternative.factors.every((factor) => factor === \"possession\"),\n                )\n              ) {\n                alternatives.push(sql`exists(select 1 from ${c.name} join ${f.name} on ${f.column(\"credentialId\")} = ${c.column(\"credentialId\")} and ${f.column(\"subjectId\")} = ${f.value(\"subjectId\", nativeId)} and ${f.column(\"revision\")} = ${c.column(\"credentialRevision\")} and ${yield* eq(\"credentials\", \"active\", true)}\n                where ${yield* eq(\"passkeyCredentials\", \"subjectId\", nativeId)} and ${c.column(\"credentialId\")} <> ${c.value(\"credentialId\", excluded)} and ${yield* eq(\"passkeyCredentials\", \"active\", true)} and ${yield* eq(\"passkeyCredentials\", \"primarySignIn\", true)} and ${yield* eq(\"passkeyCredentials\", \"enrollmentUserVerified\", true)} and ${anySqlCondition(\n                  yield* Effect.forEach(signInProfiles, (profile) =>\n                    eq(\"passkeyCredentials\", \"rpId\", profile.rpId),\n                  ),\n                )})`);\n              }\n              if (\n                passwordModules.length > 0 &&\n                requirement.alternatives.some(\n                  (alternative) =>\n                    alternative.minimumCredentials === 1 &&\n                    !alternative.userVerified &&\n                    !alternative.phishingResistant &&\n                    alternative.factors.every((factor) => factor === \"knowledge\"),\n                )\n              ) {\n                const p = yield* t(\"passwords\"),\n                  i = yield* t(\"identifiers\");\n\n                alternatives.push(sql`exists(select 1 from ${p.name} join ${f.name} on ${f.column(\"credentialId\")} = ${p.column(\"credentialId\")} and ${f.column(\"subjectId\")} = ${f.value(\"subjectId\", nativeId)} and ${f.column(\"revision\")} = ${p.column(\"credentialRevision\")} and ${yield* eq(\"credentials\", \"active\", true)}\n                join ${i.name} on ${yield* eq(\"identifiers\", \"subjectId\", nativeId)} and ${yield* eq(\"identifiers\", \"active\", true)} and ${yield* eq(\"identifiers\", \"namespace\", \"email\")}\n                where ${yield* eq(\"passwords\", \"subjectId\", nativeId)} and ${p.column(\"credentialId\")} <> ${p.value(\"credentialId\", excluded)} and ${anySqlCondition(\n                  yield* Effect.forEach(passwordModules, (module) =>\n                    eq(\"passwords\", \"moduleId\", module),\n                  ),\n                )})`);\n              }\n\n              return anySqlCondition(alternatives);\n            },\n            Effect.catchCause((cause) =>\n              Effect.failCause(\n                Cause.map(cause, (error) =>\n                  PersistenceMappingError.make({ operation: \"mapping\", cause: error }),\n                ),\n              ),\n            ),\n          ),\n        },\n      },\n      invalidation: {\n        window: {\n          trigger: \"credential-change\",\n          existingSessions: \"immediate\",\n          maximumExposureMillis: 0,\n          oldAuthenticationEvidence: \"rejected\",\n        },\n        mutations: [],\n        postcondition: ({ subjectId, securityRevision }) =>\n          sql`exists(select 1 from ${subject.name} where ${subject.column(s.id)} = ${subject.value(s.id, subjectId)} and ${subject.column(s.securityRevision)} = ${subject.value(s.securityRevision, securityRevision)})`,\n      },\n    };\n  });\n\n  return { base, management };\n});\n\n/** Managed and mapped tables feed the same native passkey statements. */\nexport const makeManagedPasskeys = Effect.fnUntraced(\n  function* (input: ComposedPasskeyInput, tables: NativeSqlTables) {\n    const batch = yield* SqlBatchCommit;\n\n    const policies = yield* Effect.forEach(input.features, (feature) =>\n      Effect.map(feature.policy, (policy) => ({ feature, policy })),\n    );\n\n    const mapping = yield* mappings(\n      input.storage,\n      tables,\n      input.passwordModules,\n      policies.flatMap(({ feature, policy }) => (feature.management ? [] : policy.profiles)),\n    );\n\n    const services = new Map<\n      string,\n      Effect.Success<ReturnType<typeof makeNativePasskeyServices>>\n    >();\n\n    const managers = new Map<string, M.PasskeyManagementPersistence[\"Service\"]>();\n\n    for (const feature of input.features) {\n      const selected = feature.management\n        ? yield* mapping.management(feature)\n        : yield* mapping.base(feature);\n\n      const base = yield* batch === undefined\n        ? makeNativePasskeyServices(tables, selected)\n        : makeBatchPasskeyServices(tables, selected);\n\n      services.set(feature.moduleId, base);\n      if (feature.management)\n        managers.set(\n          feature.moduleId,\n          makePasskeyNativeManagement(base, yield* mapping.management(feature))\n            .passkeyManagementPersistence,\n        );\n    }\n\n    const service = (moduleId: string) => {\n      const value = services.get(moduleId);\n\n      return value === undefined\n        ? Effect.fail(M.PasskeyUnavailable.make({}))\n        : Effect.succeed(value);\n    };\n\n    const manager = (moduleId: string) => {\n      const value = managers.get(moduleId);\n\n      return value === undefined\n        ? Effect.fail(M.PasskeyUnavailable.make({}))\n        : Effect.succeed(value);\n    };\n\n    const first = services.values().next().value;\n\n    if (first === undefined) return yield* configurationError(\"A passkey module is required\");\n\n    let context: Context.Context<never> = Context.make(M.PasskeyCredentials, {\n      lookup: (input) => first.passkeyCredentials.lookup(input),\n      listForSubject: (input) =>\n        Effect.flatMap(service(input.moduleId), (value) =>\n          value.passkeyCredentials.listForSubject(input),\n        ),\n    }).pipe(\n      Context.add(M.PasskeyPersistence, {\n        issue: (input, prepare) =>\n          Effect.flatMap(service(input.ceremony.moduleId), (value) =>\n            value.passkeyPersistence.issue(input, prepare),\n          ),\n        context: (input) =>\n          Effect.flatMap(service(input.moduleId), (value) =>\n            value.passkeyPersistence.context(input),\n          ),\n        consume: (input, prepare) =>\n          Effect.flatMap(service(input.access.moduleId), (value) =>\n            value.passkeyPersistence.consume(input, prepare),\n          ),\n        cleanup: (input, prepare) =>\n          Effect.flatMap(service(input.moduleId), (value) =>\n            value.passkeyPersistence.cleanup(input, prepare),\n          ),\n      }),\n    );\n\n    if (managers.size > 0)\n      context = context.pipe(\n        Context.add(M.PasskeyManagementPersistence, {\n          completeEnrollment: (input, prepare) =>\n            Effect.flatMap(manager(input.ceremony.moduleId), (value) =>\n              value.completeEnrollment(input, prepare),\n            ),\n          list: (input) => Effect.flatMap(manager(input.moduleId), (value) => value.list(input)),\n          inspectRemove: (input) =>\n            Effect.flatMap(manager(input.moduleId), (value) => value.inspectRemove(input)),\n          rename: (input, prepare) =>\n            Effect.flatMap(manager(input.moduleId), (value) => value.rename(input, prepare)),\n          remove: (input, prepare) =>\n            Effect.flatMap(manager(input.moduleId), (value) => value.remove(input, prepare)),\n        }),\n      );\n\n    return context;\n  },\n  (effect) => reportPersistenceFailure(effect, () => false, { markReported: true }),\n  Effect.catchCause((cause) =>\n    Effect.failCause(\n      Cause.map(cause, (error) =>\n        Schema.is(PersistenceConfigurationError)(error)\n          ? error\n          : configurationError(\"Unable to configure passkey persistence\"),\n      ),\n    ),\n  ),\n);\n"],"mappings":"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"}