| 470 | }; |
| 471 | |
| 472 | const validateExecutorDbTables = (required: FumaTables, actual: FumaTables): void => { |
| 473 | const missing = Object.keys(required) |
| 474 | .filter((tableName) => !actual[tableName]) |
| 475 | .sort(); |
| 476 | if (missing.length === 0) return; |
| 477 | |
| 478 | // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: synchronous startup validation before Executor services are built |
| 479 | throw new StorageError({ |
| 480 | message: `Executor database is missing required table definitions: ${missing.join(", ")}`, |
| 481 | cause: { |
| 482 | missing, |
| 483 | available: Object.keys(actual).sort(), |
| 484 | }, |
| 485 | }); |
| 486 | }; |
| 487 | |
| 488 | const storageFailureFromUnknown = (message: string, cause: unknown): StorageFailure => |
| 489 | isStorageFailure(cause) ? cause : new StorageError({ message, cause }); |