| 1184 | * unexercised. `withContext` re-wraps so context-bound handles stay |
| 1185 | * faulted. */ |
| 1186 | const withFaultedReads = ( |
| 1187 | db: FumaDb, |
| 1188 | fault: (key: string) => Promise<never> | undefined, |
| 1189 | ): FumaDb => { |
| 1190 | const wrap = (inner: FumaDb): FumaDb => |
| 1191 | new Proxy(inner, { |
| 1192 | get(target, prop) { |
| 1193 | if (prop === "withContext") { |
| 1194 | return (context: unknown) => |
| 1195 | wrap((target.withContext as (c: unknown) => FumaDb)(context)); |
| 1196 | } |
| 1197 | if (prop === "findFirst" || prop === "findMany") { |
| 1198 | return (table: unknown, query: unknown) => |
| 1199 | fault(`${String(table)}.${prop}`) ?? |
| 1200 | new Promise<void>((resolve) => { |
| 1201 | setImmediate(resolve); |
| 1202 | }).then(() => |
| 1203 | (Reflect.get(target, prop) as (t: unknown, q: unknown) => Promise<unknown>).call( |
| 1204 | target, |
| 1205 | table, |
| 1206 | query, |
| 1207 | ), |
| 1208 | ); |
| 1209 | } |
| 1210 | return Reflect.get(target, prop); |
| 1211 | }, |
| 1212 | }); |
| 1213 | return wrap(db); |
| 1214 | }; |
| 1215 | |
| 1216 | /** A credential provider that works during setup and can be armed to fail |
| 1217 | * every later read — the site-2 "credential resolution fails" input. The |