| 1294 | * unexercised. `withContext` re-wraps so context-bound handles stay |
| 1295 | * faulted. */ |
| 1296 | const withFaultedReads = ( |
| 1297 | db: FumaDb, |
| 1298 | fault: (key: string) => Promise<never> | undefined, |
| 1299 | ): FumaDb => { |
| 1300 | const wrap = (inner: FumaDb): FumaDb => |
| 1301 | new Proxy(inner, { |
| 1302 | get(target, prop) { |
| 1303 | if (prop === "withContext") { |
| 1304 | return (context: unknown) => |
| 1305 | wrap((target.withContext as (c: unknown) => FumaDb)(context)); |
| 1306 | } |
| 1307 | if (prop === "findFirst" || prop === "findMany") { |
| 1308 | return (table: unknown, query: unknown) => |
| 1309 | fault(`${String(table)}.${prop}`) ?? |
| 1310 | new Promise<void>((resolve) => { |
| 1311 | setImmediate(resolve); |
| 1312 | }).then(() => |
| 1313 | (Reflect.get(target, prop) as (t: unknown, q: unknown) => Promise<unknown>).call( |
| 1314 | target, |
| 1315 | table, |
| 1316 | query, |
| 1317 | ), |
| 1318 | ); |
| 1319 | } |
| 1320 | return Reflect.get(target, prop); |
| 1321 | }, |
| 1322 | }); |
| 1323 | return wrap(db); |
| 1324 | }; |
| 1325 | |
| 1326 | /** A credential provider that works during setup and can be armed to fail |
| 1327 | * every later read — the site-2 "credential resolution fails" input. The |