| 733 | }; |
| 734 | |
| 735 | const validateExecutorDbTables = (required: FumaTables, actual: FumaTables): void => { |
| 736 | const missing = Object.keys(required) |
| 737 | .filter((tableName) => !actual[tableName]) |
| 738 | .sort(); |
| 739 | if (missing.length === 0) return; |
| 740 | |
| 741 | // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: synchronous startup validation before Executor services are built |
| 742 | throw new StorageError({ |
| 743 | message: `Executor database is missing required table definitions: ${missing.join(", ")}`, |
| 744 | cause: { |
| 745 | missing, |
| 746 | available: Object.keys(actual).sort(), |
| 747 | }, |
| 748 | }); |
| 749 | }; |
| 750 | |
| 751 | const storageFailureFromUnknown = (message: string, cause: unknown): StorageFailure => |
| 752 | isStorageFailure(cause) ? cause : new StorageError({ message, cause }); |