| 695 | }; |
| 696 | |
| 697 | const validateExecutorDbTables = (required: FumaTables, actual: FumaTables): void => { |
| 698 | const missing = Object.keys(required) |
| 699 | .filter((tableName) => !actual[tableName]) |
| 700 | .sort(); |
| 701 | if (missing.length === 0) return; |
| 702 | |
| 703 | // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: synchronous startup validation before Executor services are built |
| 704 | throw new StorageError({ |
| 705 | message: `Executor database is missing required table definitions: ${missing.join(", ")}`, |
| 706 | cause: { |
| 707 | missing, |
| 708 | available: Object.keys(actual).sort(), |
| 709 | }, |
| 710 | }); |
| 711 | }; |
| 712 | |
| 713 | const storageFailureFromUnknown = (message: string, cause: unknown): StorageFailure => |
| 714 | isStorageFailure(cause) ? cause : new StorageError({ message, cause }); |