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