@@ -19,6 +19,7 @@ import type { OAuthEndpointUrlPolicy } from "./oauth-helpers";
1919import { generateKeyBetween } from "fractional-indexing" ;
2020import {
2121 StorageError ,
22+ isStorageFailure ,
2223 makeFumaClient ,
2324 type FumaDb ,
2425 type FumaRow ,
@@ -400,13 +401,20 @@ export const collectTables = (plugins: readonly AnyPlugin[]): FumaTables => {
400401 }
401402 }
402403
403- for ( const tableDef of Object . values ( merged ) ) {
404- assertExecutorScopePolicyTable ( tableDef ) ;
405- }
404+ validateExecutorScopePolicyTables ( merged ) ;
406405
407406 return merged ;
408407} ;
409408
409+ const validateExecutorScopePolicyTables = ( tables : FumaTables ) : void => {
410+ for ( const tableDef of Object . values ( tables ) ) {
411+ assertExecutorScopePolicyTable ( tableDef ) ;
412+ }
413+ } ;
414+
415+ const storageFailureFromUnknown = ( message : string , cause : unknown ) : StorageFailure =>
416+ isStorageFailure ( cause ) ? cause : new StorageError ( { message, cause } ) ;
417+
410418const createDefaultMemoryDb = ( tables : FumaTables ) : ExecutorDb => {
411419 const version = "1.0.0" ;
412420 const latestSchema = fumaSchema < string , FumaTables , RelationsMap < FumaTables > > ( {
@@ -790,14 +798,22 @@ export const createExecutor = <const TPlugins extends readonly AnyPlugin[] = rea
790798 return empty as TPlugins ;
791799 } ;
792800 const { scopes, plugins = defaultPlugins ( ) } = config ;
801+ const tables = yield * Effect . try ( {
802+ try : ( ) => collectTables ( plugins ) ,
803+ catch : ( cause ) => storageFailureFromUnknown ( "Failed to collect executor tables" , cause ) ,
804+ } ) ;
793805 const dbInput = yield * Effect . suspend ( ( ) => {
794- if ( ! config . db ) return Effect . succeed ( createDefaultMemoryDb ( collectTables ( plugins ) ) ) ;
806+ if ( ! config . db ) return Effect . succeed ( createDefaultMemoryDb ( tables ) ) ;
795807 if ( typeof config . db !== "function" ) return Effect . succeed ( config . db ) ;
796- const out = config . db ( { tables : collectTables ( plugins ) } ) ;
808+ const out = config . db ( { tables } ) ;
797809 return Effect . isEffect ( out ) ? out : Effect . succeed ( out ) ;
798810 } ) ;
799811 const rootDbUntyped = "db" in dbInput ? dbInput . db : dbInput ;
800812 const closeDb = "db" in dbInput ? dbInput . close : undefined ;
813+ yield * Effect . try ( {
814+ try : ( ) => validateExecutorScopePolicyTables ( rootDbUntyped . internal . tables ) ,
815+ catch : ( cause ) => storageFailureFromUnknown ( "Failed to validate executor tables" , cause ) ,
816+ } ) ;
801817
802818 if ( scopes . length === 0 ) {
803819 return yield * new StorageError ( {
0 commit comments