@cadenza.io/service 1.21.16 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Cadenza.ts","../src/graph/definition/DeputyTask.ts","../src/graph/definition/DatabaseTask.ts","../src/utils/environment.ts","../src/registry/ServiceRegistry.ts","../src/graph/definition/SignalTransmissionTask.ts","../src/network/RestController.ts","../src/network/SocketController.ts","../src/utils/tools.ts","../src/signals/SignalController.ts","../src/graph/controllers/GraphMetadataController.ts","../src/types/database.ts","../src/database/DatabaseController.ts","../src/utils/promise.ts","../src/graph/controllers/GraphSyncController.ts"],"sourcesContent":["import CadenzaService, {\n NetworkMode,\n SecurityProfile,\n ServerOptions,\n} from \"./Cadenza\";\nimport {\n DebounceTask,\n EphemeralTask,\n GraphRoutine,\n Task,\n} from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n DebounceOptions,\n EphemeralTaskOptions,\n TaskFunction,\n TaskOptions,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport GraphMetadataController from \"./graph/controllers/GraphMetadataController\";\nimport DatabaseTask from \"./graph/definition/DatabaseTask\";\nimport DeputyTask from \"./graph/definition/DeputyTask\";\nimport SignalTransmissionTask from \"./graph/definition/SignalTransmissionTask\";\nimport RestController from \"./network/RestController\";\nimport SocketController from \"./network/SocketController\";\nimport ServiceRegistry, {\n DeputyDescriptor,\n ServiceInstanceDescriptor,\n} from \"./registry/ServiceRegistry\";\nimport SignalController from \"./signals/SignalController\";\nimport {\n DbOperationType,\n DbOperationPayload,\n JoinDefinition,\n OpEffect,\n SortDirection,\n SubOperation,\n SubOperationType,\n ValueOrSubOp,\n} from \"./types/queryData\";\n\nexport default CadenzaService;\nexport type {\n ServiceInstanceDescriptor,\n DeputyDescriptor,\n DbOperationType,\n SortDirection,\n JoinDefinition,\n SubOperationType,\n SubOperation,\n OpEffect,\n ValueOrSubOp,\n DbOperationPayload,\n SecurityProfile,\n NetworkMode,\n ServerOptions,\n AnyObject,\n TaskOptions,\n ThrottleTagGetter,\n TaskFunction,\n DebounceOptions,\n EphemeralTaskOptions,\n};\nexport {\n GraphMetadataController,\n DeputyTask,\n DatabaseTask,\n SignalTransmissionTask,\n RestController,\n SocketController,\n ServiceRegistry,\n SignalController,\n Task,\n DebounceTask,\n EphemeralTask,\n GraphRoutine,\n};\n","import Cadenza, {\n CadenzaMode,\n DebounceOptions,\n DebounceTask,\n EphemeralTask,\n EphemeralTaskOptions,\n GraphRegistry,\n GraphRoutine,\n GraphRunner,\n SignalBroker,\n Task,\n TaskFunction,\n TaskOptions,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport DeputyTask from \"./graph/definition/DeputyTask\";\nimport DatabaseTask from \"./graph/definition/DatabaseTask\";\nimport ServiceRegistry from \"./registry/ServiceRegistry\";\nimport SignalTransmissionTask from \"./graph/definition/SignalTransmissionTask\";\nimport RestController from \"./network/RestController\";\nimport SocketController from \"./network/SocketController\";\nimport SignalController from \"./signals/SignalController\";\nimport { DbOperationPayload, DbOperationType } from \"./types/queryData\";\nimport GraphMetadataController from \"./graph/controllers/GraphMetadataController\";\nimport { SchemaDefinition } from \"./types/database\";\nimport { snakeCase } from \"lodash-es\";\nimport DatabaseController from \"./database/DatabaseController\";\nimport { v4 as uuid } from \"uuid\";\nimport GraphSyncController from \"./graph/controllers/GraphSyncController\";\nimport { isBrowser } from \"./utils/environment\";\n\nexport type SecurityProfile = \"low\" | \"medium\" | \"high\";\nexport type NetworkMode =\n | \"internal\"\n | \"exposed\"\n | \"exposed-high-sec\"\n | \"auto\"\n | \"dev\";\n\nexport type ServerOptions = {\n customServiceId?: string; // TODO\n loadBalance?: boolean;\n useSocket?: boolean;\n log?: boolean;\n displayName?: string;\n isMeta?: boolean;\n port?: number; // for internal network\n securityProfile?: SecurityProfile;\n networkMode?: NetworkMode;\n retryCount?: number;\n cadenzaDB?: { connect?: boolean; address?: string; port?: number };\n relatedServices?: string[][];\n isDatabase?: boolean;\n isFrontend?: boolean;\n};\n\nexport interface DatabaseOptions {\n databaseType?: \"postgres\";\n databaseName?: string;\n poolSize?: number;\n}\n\nexport default class CadenzaService {\n public static broker: SignalBroker;\n public static runner: GraphRunner;\n public static metaRunner: GraphRunner;\n public static registry: GraphRegistry;\n public static serviceRegistry: ServiceRegistry;\n protected static isBootstrapped = false;\n protected static serviceCreated = false;\n\n static bootstrap(): void {\n if (this.isBootstrapped) return;\n this.isBootstrapped = true;\n\n Cadenza.bootstrap();\n this.broker = Cadenza.broker;\n this.runner = Cadenza.runner;\n this.metaRunner = Cadenza.metaRunner;\n this.registry = Cadenza.registry;\n this.serviceRegistry = ServiceRegistry.instance;\n SignalController.instance;\n RestController.instance;\n SocketController.instance;\n console.log(\"BOOTSTRAPPED\");\n }\n\n protected static validateServiceName(serviceName: string) {\n if (serviceName.length > 100) {\n throw new Error(\"Service name must be less than 100 characters\");\n }\n\n if (serviceName.includes(\" \")) {\n throw new Error(\"Service name must not contain spaces\");\n }\n\n if (serviceName.includes(\".\")) {\n throw new Error(\"Service name must not contain dots\");\n }\n\n if (serviceName.includes(\"\\\\\")) {\n throw new Error(\"Service name must not contain backslashes\");\n }\n\n if (\n serviceName.charAt(0) !== serviceName.charAt(0).toUpperCase() &&\n serviceName.charAt(0) === serviceName.charAt(0).toLowerCase()\n ) {\n throw new Error(\"Service name must start with a capital letter\");\n }\n }\n\n protected static validateName(name: string): void {\n Cadenza.validateName(name);\n }\n\n public static get runStrategy() {\n return Cadenza.runStrategy;\n }\n\n public static setMode(mode: CadenzaMode) {\n Cadenza.setMode(mode);\n }\n\n static createDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ): DeputyTask {\n this.bootstrap();\n this.validateName(routineName);\n const name = `Deputy task for: ${routineName}`;\n\n options = {\n concurrency: 0,\n timeout: 0,\n register: true,\n isUnique: false,\n isMeta: false,\n isSubMeta: false,\n isHidden: false,\n getTagCallback: undefined,\n inputSchema: undefined,\n validateInputContext: false,\n outputSchema: undefined,\n validateOutputContext: false,\n retryCount: 0,\n retryDelay: 0,\n retryDelayMax: 0,\n retryDelayFactor: 1,\n ...options,\n };\n\n return new DeputyTask(\n name,\n routineName,\n serviceName,\n `Referencing routine in service: ${routineName} on service: ${serviceName}.`,\n options.concurrency,\n options.timeout,\n options.register,\n options.isUnique,\n options.isMeta,\n options.isSubMeta,\n options.isHidden,\n options.getTagCallback,\n options.inputSchema,\n options.validateInputContext,\n options.outputSchema,\n options.validateOutputContext,\n options.retryCount,\n options.retryDelay,\n options.retryDelayMax,\n options.retryDelayFactor,\n );\n }\n\n static createMetaDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ): DeputyTask {\n options.isMeta = true;\n return this.createDeputyTask(routineName, serviceName, options);\n }\n\n static createUniqueDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ) {\n options.isUnique = true;\n return this.createDeputyTask(routineName, serviceName, options);\n }\n\n static createUniqueMetaDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createUniqueDeputyTask(routineName, serviceName, options);\n }\n\n static createThrottledDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\n options: TaskOptions = {},\n ) {\n options.concurrency = 1;\n options.getTagCallback = throttledIdGetter;\n return this.createDeputyTask(routineName, serviceName, options);\n }\n\n static createMetaThrottledDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createThrottledDeputyTask(\n routineName,\n serviceName,\n throttledIdGetter,\n options,\n );\n }\n\n static createSignalTransmissionTask(\n signalName: string,\n serviceName: string,\n options: TaskOptions = {},\n ): SignalTransmissionTask {\n this.bootstrap();\n Cadenza.validateName(signalName);\n Cadenza.validateName(serviceName);\n\n options = {\n concurrency: 0,\n timeout: 0,\n register: true,\n isUnique: false,\n isMeta: true,\n isSubMeta: false,\n isHidden: false,\n getTagCallback: undefined,\n inputSchema: undefined,\n validateInputContext: false,\n outputSchema: undefined,\n validateOutputContext: false,\n retryCount: 1,\n retryDelay: 0,\n retryDelayMax: 0,\n retryDelayFactor: 1,\n ...options,\n };\n\n options.isMeta = true;\n\n const name = `Transmission of signal: ${signalName}`;\n return new SignalTransmissionTask(\n name,\n signalName,\n serviceName,\n `Transmits signal ${signalName} to ${serviceName} service.`,\n options.concurrency,\n options.timeout,\n options.register,\n options.isUnique,\n options.isMeta,\n options.isSubMeta,\n options.isHidden,\n options.getTagCallback,\n options.inputSchema,\n options.validateInputContext,\n options.outputSchema,\n options.validateOutputContext,\n options.retryCount,\n options.retryDelay,\n options.retryDelayMax,\n options.retryDelayFactor,\n );\n }\n\n static createDatabaseTask(\n tableName: string,\n operation: DbOperationType,\n databaseServiceName: string | undefined = undefined,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n this.bootstrap();\n Cadenza.validateName(tableName);\n Cadenza.validateName(operation);\n const tableNameFormatted = tableName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n const name = `${operation} ${tableName} in ${databaseServiceName ?? \"default database service\"}`;\n const description = `Executes a ${operation} on table ${tableName} in ${databaseServiceName ?? \"default database service\"}`;\n const taskName = `db${operation.charAt(0).toUpperCase() + operation.slice(1)}${tableNameFormatted}`;\n\n options = {\n concurrency: 0,\n timeout: 0,\n register: true,\n isUnique: false,\n isMeta: false,\n isSubMeta: false,\n isHidden: false,\n getTagCallback: undefined,\n inputSchema: undefined,\n validateInputContext: false,\n outputSchema: undefined,\n validateOutputContext: false,\n retryCount: 3,\n retryDelay: 100,\n retryDelayMax: 0,\n retryDelayFactor: 1,\n ...options,\n };\n\n return new DatabaseTask(\n name,\n taskName,\n databaseServiceName,\n description,\n queryData,\n options.concurrency,\n options.timeout,\n options.register,\n options.isUnique,\n options.isMeta,\n options.isSubMeta,\n options.isHidden,\n options.getTagCallback,\n options.inputSchema,\n options.validateInputContext,\n options.outputSchema,\n options.validateOutputContext,\n options.retryCount,\n options.retryDelay,\n options.retryDelayMax,\n options.retryDelayFactor,\n );\n }\n\n static createDatabaseInsertTask(\n tableName: string,\n databaseServiceName: string | undefined = undefined,\n queryData: DbOperationPayload = {},\n options: TaskOptions = {},\n ) {\n return this.createDatabaseTask(\n tableName,\n \"insert\",\n databaseServiceName,\n queryData,\n options,\n );\n }\n\n static createDatabaseQueryTask(\n tableName: string,\n databaseServiceName: string | undefined = undefined,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n return this.createDatabaseTask(\n tableName,\n \"query\",\n databaseServiceName,\n queryData,\n options,\n );\n }\n\n static createCadenzaDBTask(\n tableName: string,\n operation: DbOperationType,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createDatabaseTask(\n tableName,\n operation,\n \"CadenzaDB\",\n queryData,\n options,\n );\n }\n\n static createCadenzaDBInsertTask(\n tableName: string,\n queryData: DbOperationPayload = {},\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createDatabaseInsertTask(\n tableName,\n \"CadenzaDB\",\n queryData,\n options,\n );\n }\n\n static createCadenzaDBQueryTask(\n tableName: string,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createDatabaseQueryTask(\n tableName,\n \"CadenzaDB\",\n queryData,\n options,\n );\n }\n\n /**\n * Creates a MetaTask (for meta-layer graphs) and registers it.\n * MetaTasks suppress further meta-signal emissions to prevent loops.\n * @param serviceName Unique identifier for the meta-task.\n * @param description Optional description.\n * @param options Optional service options. A service can either be connected to a database service and/or a list of related services.\n * Example RELATED_SERVICES=serviceId123,service1,http://address:port | serviceId124,service2,http://address:port\n * @returns The created MetaTask instance.\n * @throws Error if name invalid or duplicate.\n */\n static createCadenzaService(\n serviceName: string,\n description: string = \"\",\n options: ServerOptions = {},\n ) {\n if (this.serviceCreated) return;\n this.bootstrap();\n Cadenza.validateName(serviceName);\n this.validateServiceName(serviceName);\n\n const serviceId = options.customServiceId ?? uuid();\n this.serviceRegistry.serviceName = serviceName;\n this.serviceRegistry.serviceInstanceId = serviceId;\n\n options = {\n loadBalance: true,\n useSocket: true,\n displayName: undefined,\n isMeta: false,\n port: parseInt(process.env.HTTP_PORT ?? \"3000\"),\n securityProfile:\n (process.env.SECURITY_PROFILE as SecurityProfile) ?? \"medium\",\n networkMode: (process.env.NETWORK_MODE as NetworkMode) ?? \"dev\",\n retryCount: 3,\n cadenzaDB: {\n connect: true,\n address: process.env.CADENZA_DB_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.CADENZA_DB_PORT ?? \"5000\"),\n },\n relatedServices: process.env.RELATED_SERVICES\n ? process.env.RELATED_SERVICES.split(\"|\").map((s) =>\n s.trim().split(\",\"),\n )\n : [],\n isFrontend: isBrowser,\n ...options,\n };\n\n if (options.cadenzaDB?.connect) {\n Cadenza.broker.emit(\"meta.initializing_service\", {\n // Seed the CadenzaDB\n serviceInstance: {\n uuid: \"cadenza-db\",\n serviceName: \"CadenzaDB\",\n address: options.cadenzaDB?.address,\n port: options.cadenzaDB?.port,\n exposed: options.networkMode !== \"dev\",\n numberOfRunningGraphs: 0,\n isActive: true, // Assume it is deployed\n isNonResponsive: false,\n isBlocked: false,\n health: {},\n },\n });\n }\n\n options.relatedServices?.forEach((service) => {\n Cadenza.broker.emit(\"meta.initializing_service\", {\n serviceInstance: {\n uuid: service[0],\n serviceName: service[1],\n address: service[2].split(\":\")[0],\n port: service[2].split(\":\")[1] ?? 3000,\n exposed: options.networkMode !== \"dev\",\n numberOfRunningGraphs: 0,\n isActive: true, // Assume it is deployed\n isNonResponsive: false,\n isBlocked: false,\n health: {},\n },\n });\n });\n\n console.log(\"Creating service...\");\n\n const initContext = {\n data: {\n name: serviceName,\n description: description,\n displayName: options.displayName ?? \"\",\n isMeta: options.isMeta,\n },\n __serviceName: serviceName,\n __serviceInstanceId: serviceId,\n __port: options.port,\n __loadBalance: options.loadBalance,\n __useSocket: options.useSocket,\n __securityProfile: options.securityProfile,\n __networkMode: options.networkMode,\n __retryCount: options.retryCount,\n __cadenzaDBConnect: options.cadenzaDB?.connect,\n __isDatabase: options.isDatabase,\n };\n\n if (options.cadenzaDB?.connect) {\n Cadenza.createEphemeralMetaTask(\"Create service\", async (_, emit) => {\n emit(\"meta.create_service_requested\", initContext);\n }).doOn(\"meta.fetch.handshake_complete\");\n } else {\n Cadenza.broker.emit(\"meta.create_service_requested\", initContext);\n }\n\n this.createEphemeralMetaTask(\"Handle service setup completion\", () => {\n GraphMetadataController.instance;\n GraphSyncController.instance;\n setTimeout(() => {\n // delayed sync\n this.broker.emit(\"meta.sync_requested\", {});\n }, 2000);\n\n if (options.cadenzaDB?.connect) {\n setInterval(() => {\n this.broker.emit(\"meta.sync_requested\", {});\n }, 300000);\n }\n\n return true;\n }).doOn(\"meta.service_registry.instance_inserted\");\n\n this.serviceCreated = true;\n }\n\n static createCadenzaMetaService(\n serviceName: string,\n description: string,\n options: ServerOptions = {},\n ) {\n options.isMeta = true;\n this.createCadenzaService(serviceName, description, options);\n }\n\n static createDatabaseService(\n name: string,\n schema: SchemaDefinition,\n description: string = \"\",\n options: ServerOptions & DatabaseOptions = {},\n ) {\n if (isBrowser) {\n console.warn(\n \"Database service creation is not supported in the browser. Use the CadenzaDB service instead.\",\n );\n return;\n }\n if (this.serviceCreated) return;\n this.bootstrap();\n this.serviceRegistry.serviceName = name;\n DatabaseController.instance; // Ensure DB controller is created\n\n options = {\n loadBalance: true,\n useSocket: true,\n displayName: undefined,\n isMeta: false,\n port: parseInt(process.env.HTTP_PORT ?? \"3000\"),\n securityProfile:\n (process.env.SECURITY_PROFILE as SecurityProfile) ?? \"medium\",\n networkMode: (process.env.NETWORK_MODE as NetworkMode) ?? \"dev\",\n retryCount: 3,\n cadenzaDB: {\n connect: true,\n address: process.env.CADENZA_DB_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.CADENZA_DB_PORT ?? \"5000\"),\n },\n databaseType: \"postgres\",\n databaseName: snakeCase(name),\n poolSize: parseInt(process.env.DATABASE_POOL_SIZE ?? \"10\"),\n isDatabase: true,\n ...options,\n };\n\n Cadenza.broker.emit(\"meta.database_init_requested\", {\n schema,\n databaseName: options.databaseName,\n options,\n });\n\n Cadenza.createEphemeralMetaTask(\"Set database connection\", () => {\n console.log(\"Database service created\");\n if (options.cadenzaDB?.connect) {\n Cadenza.createEphemeralMetaTask(\n \"Insert database service\",\n (_, emit) => {\n emit(\"meta.created_database_service\", {\n data: {\n service_name: name,\n description,\n schema,\n is_meta: options.isMeta,\n },\n });\n },\n ).doOn(\"meta.service_registry.service_inserted\");\n } else {\n Cadenza.broker.emit(\"meta.created_database_service\", {\n data: {\n service_name: name,\n description,\n schema,\n is_meta: options.isMeta,\n },\n });\n }\n\n this.createCadenzaService(name, description, options);\n }).doOn(\"meta.database.setup_done\");\n }\n\n static createMetaDatabaseService(\n name: string,\n schema: SchemaDefinition,\n description: string = \"\",\n options: ServerOptions & DatabaseOptions = {},\n ) {\n this.bootstrap();\n options.isMeta = true;\n this.createDatabaseService(name, schema, description, options);\n }\n\n /**\n * Creates a standard Task and registers it in the GraphRegistry.\n * @param name Unique identifier for the task.\n * @param func The function or async generator to execute.\n * @param description Optional human-readable description for introspection.\n * @param options Optional task options.\n * @returns The created Task instance.\n * @throws Error if name is invalid or duplicate in registry.\n */\n static createTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createTask(name, func, description, options);\n }\n\n /**\n * Creates a MetaTask (for meta-layer graphs) and registers it.\n * MetaTasks suppress further meta-signal emissions to prevent loops.\n * @param name Unique identifier for the meta-task.\n * @param func The function or async generator to execute.\n * @param description Optional description.\n * @param options Optional task options.\n * @returns The created MetaTask instance.\n * @throws Error if name invalid or duplicate.\n */\n static createMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createMetaTask(name, func, description, options);\n }\n\n /**\n * Creates a UniqueTask (executes once per execution ID, merging parents) and registers it.\n * Use for fan-in/joins after parallel branches.\n * @param name Unique identifier.\n * @param func Function receiving joinedContexts.\n * @param description Optional description.\n * @param options Optional task options.\n * @returns The created UniqueTask.\n * @throws Error if invalid.\n */\n static createUniqueTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createUniqueTask(name, func, description, options);\n }\n\n /**\n * Creates a UniqueMetaTask for meta-layer joins.\n * @param name Unique identifier.\n * @param func Function.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created UniqueMetaTask.\n */\n static createUniqueMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createUniqueMetaTask(name, func, description, options);\n }\n\n /**\n * Creates a ThrottledTask (rate-limited by concurrency or custom groups) and registers it.\n * @param name Unique identifier.\n * @param func Function.\n * @param throttledIdGetter Optional getter for dynamic grouping (e.g., per-user).\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created ThrottledTask.\n * @edge If no getter, throttles per task ID; use for resource protection.\n */\n static createThrottledTask(\n name: string,\n func: TaskFunction,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createThrottledTask(\n name,\n func,\n throttledIdGetter,\n description,\n options,\n );\n }\n\n /**\n * Creates a ThrottledMetaTask for meta-layer throttling.\n * @param name Identifier.\n * @param func Function.\n * @param throttledIdGetter Optional getter.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created ThrottledMetaTask.\n */\n static createThrottledMetaTask(\n name: string,\n func: TaskFunction,\n throttledIdGetter: ThrottleTagGetter,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createThrottledMetaTask(\n name,\n func,\n throttledIdGetter,\n description,\n options,\n );\n }\n\n /**\n * Creates a DebounceTask (delays exec until quiet period) and registers it.\n * @param name Identifier.\n * @param func Function.\n * @param description Optional.\n * @param debounceTime Delay in ms (default 1000).\n * @param options Optional task options plus optional debounce config (e.g., leading/trailing).\n * @returns The created DebounceTask.\n * @edge Multiple triggers within time collapse to one exec.\n */\n static createDebounceTask(\n name: string,\n func: TaskFunction,\n description?: string,\n debounceTime: number = 1000,\n options: TaskOptions & DebounceOptions = {},\n ): DebounceTask {\n this.bootstrap();\n return Cadenza.createDebounceTask(\n name,\n func,\n description,\n debounceTime,\n options,\n );\n }\n\n /**\n * Creates a DebouncedMetaTask for meta-layer debouncing.\n * @param name Identifier.\n * @param func Function.\n * @param description Optional.\n * @param debounceTime Delay in ms.\n * @param options Optional task options plus optional debounce config (e.g., leading/trailing).\n * @returns The created DebouncedMetaTask.\n */\n static createDebounceMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n debounceTime: number = 1000,\n options: TaskOptions & DebounceOptions = {},\n ): DebounceTask {\n this.bootstrap();\n return Cadenza.createDebounceMetaTask(\n name,\n func,\n description,\n debounceTime,\n options,\n );\n }\n\n /**\n * Creates an EphemeralTask (self-destructs after exec or condition) without default registration.\n * Useful for transients; optionally register if needed.\n * @param name Identifier (may not be unique if not registered).\n * @param func Function.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created EphemeralTask.\n * @edge Destruction triggered post-exec via Node/Builder; emits meta-signal for cleanup.\n */\n static createEphemeralTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions & EphemeralTaskOptions = {},\n ): EphemeralTask {\n this.bootstrap();\n return Cadenza.createEphemeralTask(name, func, description, options);\n }\n\n /**\n * Creates an EphemeralMetaTask for meta-layer transients.\n * @param name Identifier.\n * @param func Function.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created EphemeralMetaTask.\n */\n static createEphemeralMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions & EphemeralTaskOptions = {},\n ): EphemeralTask {\n this.bootstrap();\n return Cadenza.createEphemeralMetaTask(name, func, description, options);\n }\n\n /**\n * Creates a GraphRoutine (named entry to starting tasks) and registers it.\n * @param name Unique identifier.\n * @param tasks Starting tasks (can be empty, but warns as no-op).\n * @param description Optional.\n * @returns The created GraphRoutine.\n * @edge If tasks empty, routine is valid but inert.\n */\n static createRoutine(\n name: string,\n tasks: Task[],\n description: string = \"\",\n ): GraphRoutine {\n this.bootstrap();\n return Cadenza.createRoutine(name, tasks, description);\n }\n\n /**\n * Creates a MetaRoutine for meta-layer entry points.\n * @param name Identifier.\n * @param tasks Starting tasks.\n * @param description Optional.\n * @returns The created MetaRoutine.\n */\n static createMetaRoutine(\n name: string,\n tasks: Task[],\n description: string = \"\",\n ): GraphRoutine {\n this.bootstrap();\n return Cadenza.createMetaRoutine(name, tasks, description);\n }\n\n static reset() {\n Cadenza.reset();\n this.serviceRegistry.reset();\n }\n}\n","import { v4 as uuid } from \"uuid\";\nimport { GraphContext, Task } from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n SchemaDefinition,\n TaskResult,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport Cadenza from \"../../Cadenza\";\n\nexport default class DeputyTask extends Task {\n readonly isDeputy: boolean = true;\n\n protected readonly remoteRoutineName: string;\n protected serviceName: string | undefined;\n\n /**\n * Constructs a DeputyTask as a proxy for triggering a remote flow.\n * @param name - The local name of the DeputyTask.\n * @param remoteRoutineName - The name of the remote routine or task to trigger.\n * @param serviceName - The target service name (optional, defaults to local service if undefined).\n * @param description - A description of the task's purpose (default: '').\n * @param concurrency - The maximum number of concurrent executions (default: 0, unlimited).\n * @param timeout - Timeout in milliseconds (default: 0, handled by engine).\n * @param register - Whether to register the task in the registry (default: true).\n * @param isUnique - Whether to create a unique task (default: false). A unique task will only be executed once per execution ID, merging parents.\n * @param isMeta - Whether to create a meta task (default: false). A meta task is separate from the user logic and is only used for monitoring, optimization, and feature extensions.\n * @param isSubMeta\n * @param isHidden\n * @param getTagCallback - Callback for dynamic tagging, e.g., 'return \"default\"'.\n * @param inputSchema - Input schema definition.\n * @param validateInputContext - Whether to validate the input context (default: false).\n * @param outputSchema - Output schema definition.\n * @param validateOutputContext - Whether to validate the output context (default: false).\n * @param retryCount\n * @param retryDelay\n * @param retryDelayMax\n * @param retryDelayFactor\n * @emits {meta.deputy.delegation_requested} - Emitted on construction with task and service details.\n * @note Fallbacks should be handled externally via `.doOnFail`; timeouts are managed by the engine.\n */\n constructor(\n name: string,\n remoteRoutineName: string,\n serviceName: string | undefined = undefined,\n description: string = \"\",\n concurrency: number = 0,\n timeout: number = 0,\n register: boolean = true,\n isUnique: boolean = false,\n isMeta: boolean = false,\n isSubMeta: boolean = false,\n isHidden: boolean = false,\n getTagCallback: ThrottleTagGetter | undefined = undefined,\n inputSchema: SchemaDefinition | undefined = undefined,\n validateInputContext: boolean = false,\n outputSchema: SchemaDefinition | undefined = undefined,\n validateOutputContext: boolean = false,\n retryCount: number = 0,\n retryDelay: number = 0,\n retryDelayMax: number = 0,\n retryDelayFactor: number = 1,\n ) {\n const taskFunction = (\n context: AnyObject,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n ): Promise<TaskResult> => {\n return new Promise((resolve, reject) => {\n if (context.__metadata.__blockRemoteExecution) {\n reject(new Error(\"Blocked remote execution\"));\n return;\n }\n\n if (context.__metadata.__skipRemoteExecution) {\n resolve(true);\n return;\n }\n\n const processId = uuid();\n\n context.__metadata.__deputyExecId = processId;\n emit(\"meta.deputy.delegation_requested\", {\n ...context,\n });\n\n // Ephemeral meta-task for progress\n Cadenza.createEphemeralMetaTask(\n `On progress deputy ${this.remoteRoutineName}`,\n (ctx) => {\n if (ctx.progress) progressCallback(ctx.progress * ctx.weight);\n },\n `Ephemeral task for deputy process ${processId}`,\n {\n once: false,\n destroyCondition: (ctx: AnyObject) =>\n ctx.progress === 1 || ctx.progress === undefined,\n register: false,\n },\n ).doOn(\n `meta.socket_client.delegation_progress:${processId}`,\n `meta.socket_client.delegated:${processId}`,\n `meta.fetch.delegated:${processId}`,\n `meta.service_registry.load_balance_failed:${processId}`,\n );\n\n // Ephemeral meta-task for resolution\n Cadenza.createEphemeralMetaTask(\n `Resolve deputy ${this.remoteRoutineName}`,\n (responseCtx) => {\n console.log(\"resolve deputy\", responseCtx);\n if (responseCtx?.errored) {\n reject(new Error(responseCtx.__error));\n } else {\n // TODO clean up metadata\n delete responseCtx.__isDeputy;\n resolve(responseCtx);\n }\n },\n `Ephemeral resolver for deputy process ${processId}`,\n { register: false },\n ).doOn(\n `meta.socket_client.delegated:${processId}`,\n `meta.fetch.delegated:${processId}`,\n `meta.service_registry.load_balance_failed:${processId}`,\n );\n });\n };\n\n super(\n name,\n taskFunction,\n description,\n concurrency,\n timeout,\n register,\n isUnique,\n isMeta,\n isSubMeta,\n isHidden,\n getTagCallback,\n inputSchema,\n validateInputContext,\n outputSchema,\n validateOutputContext,\n retryCount,\n retryDelay,\n retryDelayMax,\n retryDelayFactor,\n );\n\n this.remoteRoutineName = remoteRoutineName;\n this.serviceName = serviceName;\n\n this.emit(\"meta.deputy.created\", {\n localTaskName: this.name,\n localTaskVersion: this.version,\n remoteRoutineName: this.remoteRoutineName,\n serviceName: this.serviceName,\n communicationType: \"delegation\",\n });\n }\n\n /**\n * Triggers the delegation flow via a signal to the meta-layer.\n * @param context - The GraphContext containing execution data.\n * @param emit\n * @param progressCallback - Callback to update progress (invoked by meta-layer).\n * @param nodeData\n * @returns A Promise resolving with the task result or rejecting on error.\n * @emits {meta.deputy.executed} - Emitted with context to initiate delegation.\n * @edge Engine handles timeout and error, triggering `.doOnFail` if chained.\n * @note The resolution and progress are managed by ephemeral meta-tasks.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n nodeData: { nodeId: string; routineExecId: string },\n ): TaskResult {\n const ctx = context.getContext();\n const metadata = context.getMetadata();\n\n const deputyContext = {\n __localTaskName: this.name,\n __localTaskVersion: this.version,\n __localServiceName: Cadenza.serviceRegistry.serviceName,\n __previousTaskExecutionId: nodeData.nodeId,\n __remoteRoutineName: this.remoteRoutineName,\n __serviceName: this.serviceName,\n __localRoutineExecId:\n metadata.__routineExecId ?? metadata.__metadata?.__routineExecId,\n __executionTraceId: metadata.__executionTraceId ?? null,\n __metadata: {\n ...metadata,\n __deputyTaskName: this.name,\n },\n ...ctx,\n };\n\n console.log(\"DEPUTY CONTEXT\", deputyContext);\n\n return this.taskFunction(deputyContext, emit, progressCallback);\n }\n}\n","import DeputyTask from \"./DeputyTask\";\nimport { GraphContext } from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n SchemaDefinition,\n TaskResult,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport { DbOperationPayload } from \"../../types/queryData\";\nimport Cadenza from \"../../Cadenza\";\n\nexport default class DatabaseTask extends DeputyTask {\n private readonly queryData: DbOperationPayload;\n\n /**\n * Constructs a DatabaseTask to execute a database operation on a remote service.\n * @param name - The local name of the DatabaseTask.\n * @param taskName - The name of the database operation task to trigger (e.g., 'dbQueryTaskExecution').\n * @param serviceName - The target database service name (optional, defaults to 'DatabaseService').\n * @param description - A description of the task's purpose (default: '').\n * @param queryData - The query data object containing operation details (e.g., { __operation: 'query', __table: 'users' }).\n * @param concurrency - The maximum number of concurrent executions (default: 0, unlimited).\n * @param timeout - Timeout in milliseconds (default: 0, handled by engine).\n * @param register - Whether to register the task in the registry (default: true).\n * @param isUnique\n * @param isMeta\n * @param isSubMeta\n * @param isHidden\n * @param getTagCallback - Callback for dynamic tagging, e.g., 'return \"default\"'.\n * @param inputSchema - Input schema definition.\n * @param validateInputContext - Whether to validate the input context (default: false).\n * @param outputSchema - Output schema definition.\n * @param validateOutputContext - Whether to validate the output context (default: false).\n * @param retryCount\n * @param retryDelay\n * @param retryDelayMax\n * @param retryDelayFactor\n * @emits {meta.deputy.created} - Emitted on construction with task and service details.\n * @note Fallbacks via `.doOnFail` externally; timeouts managed by the engine.\n */\n constructor(\n name: string,\n taskName: string,\n serviceName: string | undefined = undefined,\n description: string = \"\",\n queryData: DbOperationPayload,\n concurrency: number = 0,\n timeout: number = 0,\n register: boolean = true,\n isUnique: boolean = false,\n isMeta: boolean = false,\n isSubMeta: boolean = false,\n isHidden: boolean = false,\n getTagCallback: ThrottleTagGetter | undefined = undefined,\n inputSchema: SchemaDefinition | undefined = undefined,\n validateInputContext: boolean = false,\n outputSchema: SchemaDefinition | undefined = undefined,\n validateOutputContext: boolean = false,\n retryCount: number = 0,\n retryDelay: number = 0,\n retryDelayMax: number = 0,\n retryDelayFactor: number = 1,\n ) {\n super(\n name,\n taskName,\n serviceName,\n description,\n concurrency,\n timeout,\n register,\n isUnique,\n isMeta,\n isSubMeta,\n isHidden,\n getTagCallback,\n inputSchema,\n validateInputContext,\n outputSchema,\n validateOutputContext,\n retryCount,\n retryDelay,\n retryDelayMax,\n retryDelayFactor,\n );\n this.queryData = queryData;\n }\n\n /**\n * Triggers the database operation delegation flow via a signal to the meta-layer.\n * @param context - The GraphContext containing execution data.\n * @param emit\n * @param progressCallback - Callback to update progress (invoked by meta-layer).\n * @param nodeData\n * @returns A Promise resolving with the task result or rejecting on error.\n * @emits {meta.deputy.executed} - Emitted with context including queryData to initiate delegation.\n * @edge Engine handles timeout and error, triggering `.doOnFail` if chained.\n * @note The resolution and progress are managed by ephemeral meta-tasks.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n nodeData: { nodeId: string; routineExecId: string },\n ): TaskResult {\n const ctx = context.getContext();\n const metadata = context.getMetadata();\n const dynamicQueryData = ctx.queryData ?? {};\n delete ctx.queryData;\n\n const deputyContext = {\n __localTaskName: this.name,\n __localTaskVersion: this.version,\n __localServiceName: Cadenza.serviceRegistry.serviceName,\n __previousTaskExecutionId: nodeData.nodeId,\n __remoteRoutineName: this.remoteRoutineName,\n __serviceName: this.serviceName,\n __executionTraceId: metadata.__executionTraceId ?? null,\n __localRoutineExecId:\n metadata.__routineExecId ?? metadata.__metadata?.__routineExecId,\n __metadata: {\n ...metadata,\n __deputyTaskName: this.name,\n },\n queryData: {\n ...this.queryData,\n data: {\n ...ctx.data,\n },\n ...dynamicQueryData,\n },\n };\n\n return this.taskFunction(deputyContext, emit, progressCallback);\n }\n}\n","export const isNode =\n typeof process !== \"undefined\" && process.versions?.node != null;\n\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n","import { Task } from \"@cadenza.io/core\";\nimport type { AnyObject } from \"@cadenza.io/core\";\nimport Cadenza from \"../Cadenza\";\nimport { isBrowser } from \"../utils/environment\";\n\nexport interface ServiceInstanceDescriptor {\n uuid: string;\n address: string;\n port: number;\n serviceName: string;\n numberOfRunningGraphs?: number;\n isPrimary: boolean;\n isActive: boolean;\n isNonResponsive: boolean;\n isBlocked: boolean;\n health: AnyObject;\n exposed: boolean;\n clientCreated?: boolean;\n isFrontend: boolean;\n}\n\nexport interface DeputyDescriptor {\n serviceName: string;\n remoteRoutineName?: string;\n signalName?: string;\n localTaskName: string;\n communicationType: string;\n}\n\nexport interface RemoteSignalDescriptor {\n __listenerServiceName: string;\n __emitterSignalName: string;\n __remoteServiceName: string;\n}\n\nexport default class ServiceRegistry {\n private static _instance: ServiceRegistry;\n public static get instance(): ServiceRegistry {\n if (!this._instance) this._instance = new ServiceRegistry();\n return this._instance;\n }\n\n private instances: Map<string, ServiceInstanceDescriptor[]> = new Map();\n private deputies: Map<string, DeputyDescriptor[]> = new Map();\n private remoteSignals: Map<string, RemoteSignalDescriptor[]> = new Map();\n serviceName: string | null = null;\n serviceInstanceId: string | null = null;\n numberOfRunningGraphs: number = 0;\n useSocket: boolean = false;\n retryCount: number = 3;\n\n handleInstanceUpdateTask: Task;\n handleRemoteSignalRegistrationTask: Task;\n getRemoteSignalsTask: Task;\n handleSocketStatusUpdateTask: Task;\n fullSyncTask: Task;\n getAllInstances: Task;\n doForEachInstance: Task;\n deleteInstance: Task;\n getBalancedInstance: Task;\n getInstanceById: Task;\n getInstancesByServiceName: Task;\n handleDeputyRegistrationTask: Task;\n getStatusTask: Task;\n insertServiceTask: Task;\n insertServiceInstanceTask: Task;\n handleServiceNotRespondingTask: Task;\n handleServiceHandshakeTask: Task;\n\n private constructor() {\n this.handleInstanceUpdateTask = Cadenza.createMetaTask(\n \"Handle Instance Update\",\n (ctx, emit) => {\n const { serviceInstance } = ctx;\n const { uuid, serviceName, address, port, exposed, isFrontend } =\n serviceInstance;\n if (uuid === this.serviceInstanceId) return;\n\n if (!this.instances.has(serviceName))\n this.instances.set(serviceName, []);\n const instances = this.instances.get(serviceName)!;\n const existing = instances.find((i) => i.uuid === uuid);\n\n if (existing) {\n Object.assign(existing, serviceInstance); // Update\n } else {\n if (\n (!isFrontend && this.deputies.has(serviceName)) ||\n this.remoteSignals.has(serviceName) ||\n (this.remoteSignals.has(\"*\") && this.serviceName !== serviceName)\n ) {\n const clientCreated = instances?.some(\n (i) =>\n i.address === address &&\n i.port === port &&\n i.clientCreated &&\n i.isActive,\n );\n\n if (!clientCreated) {\n try {\n const communicationTypes = Array.from(\n new Set(\n this.deputies\n .get(serviceName)\n ?.map((d) => d.communicationType) ?? [],\n ),\n );\n\n if (\n !communicationTypes.includes(\"signal\") &&\n (this.remoteSignals.has(serviceName) ||\n this.remoteSignals.has(\"*\"))\n ) {\n communicationTypes.push(\"signal\");\n }\n\n emit(\"meta.service_registry.dependee_registered\", {\n serviceName: serviceName,\n serviceInstanceId: uuid,\n serviceAddress: address,\n servicePort: port,\n protocol: exposed ? \"https\" : \"http\",\n communicationTypes,\n });\n\n for (const instance of this.instances.get(serviceName)!) {\n if (instance.clientCreated) continue;\n instance.clientCreated = true;\n emit(\"meta.service_registry.dependee_registered\", {\n serviceName: serviceName,\n serviceInstanceId: uuid,\n serviceAddress: address,\n servicePort: port,\n protocol: exposed ? \"https\" : \"http\",\n communicationTypes,\n });\n }\n } catch (e) {\n console.error(\"Error in dependee registration\", e);\n }\n }\n }\n\n serviceInstance.clientCreated = true;\n instances.push(serviceInstance); // Insert\n }\n\n return true;\n },\n \"Handles instance updates to service instances\",\n )\n .emits(\"meta.service_registry.service_discovered\")\n .doOn(\n \"meta.initializing_service\",\n \"CadenzaDB.meta.service_instance.inserted\",\n \"CadenzaDB.meta.service_instance.updated\",\n \"meta.service_instance.inserted\",\n \"meta.service_instance.updated\",\n \"meta.socket_client.status_received\",\n );\n\n this.handleRemoteSignalRegistrationTask = Cadenza.createMetaTask(\n \"Handle Remote Signal Registration\",\n (ctx) => {\n const {\n __remoteServiceName,\n __emitterSignalName,\n __listenerServiceName,\n } = ctx;\n let remoteSignals = this.remoteSignals.get(__remoteServiceName);\n if (!remoteSignals) {\n this.remoteSignals.set(__remoteServiceName, []);\n remoteSignals = this.remoteSignals.get(__remoteServiceName);\n }\n\n if (\n remoteSignals &&\n remoteSignals.findIndex(\n (s) => s.__emitterSignalName === __emitterSignalName,\n ) === -1\n ) {\n remoteSignals.push({\n __listenerServiceName,\n __emitterSignalName,\n __remoteServiceName,\n });\n return true;\n }\n\n return false;\n },\n \"Handles registration of remote signals\",\n );\n\n this.getRemoteSignalsTask = Cadenza.createMetaTask(\n \"Get remote signals\",\n (ctx) => {\n const { serviceName } = ctx;\n let remoteSignals = this.remoteSignals.get(serviceName) ?? [];\n remoteSignals = remoteSignals.concat(this.remoteSignals.get(\"*\") ?? []);\n\n return {\n remoteSignals: remoteSignals,\n ...ctx,\n };\n },\n \"Gets remote signals\",\n ).doOn(\n \"meta.register_remote_signals_requested\",\n \"meta.fetch.handshake_complete\",\n );\n\n this.handleServiceNotRespondingTask = Cadenza.createMetaTask(\n \"Handle service not responding\",\n (ctx, emit) => {\n const { serviceName, serviceAddress, servicePort } = ctx;\n const serviceInstances = this.instances.get(serviceName);\n const instances = serviceInstances?.filter(\n (i) => i.address === serviceAddress && i.port === servicePort,\n );\n console.log(\n \"Service not responding\",\n serviceAddress,\n servicePort,\n instances,\n );\n\n for (const instance of instances ?? []) {\n instance.isActive = false;\n instance.isNonResponsive = true;\n instance.clientCreated = false;\n emit(\"meta.service_registry.service_not_responding\", {\n data: {\n isActive: false,\n isNonResponsive: true,\n },\n filter: {\n uuid: instance.uuid,\n },\n });\n }\n return true;\n },\n \"Handles service not responding\",\n ).doOn(\"meta.fetch.handshake_failed\", \"meta.socket_client.disconnected.*\");\n\n this.handleServiceHandshakeTask = Cadenza.createMetaTask(\n \"Handle service handshake\",\n (ctx, emit) => {\n const { serviceName, serviceAddress, servicePort, serviceInstanceId } =\n ctx;\n console.log(\n \"SERVICE HANDSHAKE\",\n serviceName,\n serviceAddress,\n servicePort,\n serviceInstanceId,\n this.instances.get(serviceName),\n );\n const serviceInstances = this.instances.get(serviceName);\n const instances = serviceInstances?.filter(\n (i) => i.address === serviceAddress && i.port === servicePort,\n );\n for (const instance of instances ?? []) {\n // instance.isActive = serviceInstanceId === instance.uuid; // TODO cadenza-db will be deactivated by this.\n // instance.isNonResponsive = serviceInstanceId !== instance.uuid;\n emit(\"meta.service_registry.service_handshake\", {\n data: {\n isActive: instance.isActive,\n isNonResponsive: instance.isNonResponsive,\n },\n filter: {\n uuid: instance.uuid,\n },\n });\n }\n return true;\n },\n \"Handles service handshake\",\n ).doOn(\"meta.fetch.handshake_complete\");\n\n this.handleSocketStatusUpdateTask = Cadenza.createMetaTask(\n \"Handle Socket Status Update\",\n (ctx) => {\n const instanceId = ctx.__serviceInstanceId;\n const serviceName = ctx.__serviceName;\n const instances = this.instances.get(serviceName);\n const instance = instances?.find((i) => i.uuid === instanceId);\n if (instance) {\n instance.health = ctx.health;\n instance.numberOfRunningGraphs = ctx.numberOfRunningGraphs;\n }\n return true;\n },\n \"Handles status update from socket broadcast\",\n ).doOn(\"meta.socket_client.status_received\");\n\n this.fullSyncTask = Cadenza.createCadenzaDBQueryTask(\"service_instance\", {\n filter: {\n deleted: false,\n is_active: true,\n is_non_responsive: false,\n is_blocked: false,\n },\n fields: [\n \"uuid\",\n \"address\",\n \"port\",\n \"service_name\",\n \"is_active\",\n \"is_non_responsive\",\n \"is_blocked\",\n \"health\",\n \"exposed\",\n \"created\",\n \"is_frontend\",\n ],\n })\n .doOn(\"meta.sync_requested\")\n .emits(\"meta.service_registry.synced_instances\")\n .then(\n Cadenza.createMetaTask(\n \"Split service instances\",\n function* (ctx: AnyObject) {\n const { serviceInstances } = ctx;\n if (!serviceInstances) return;\n for (const serviceInstance of serviceInstances) {\n yield { serviceInstance };\n }\n },\n ).then(this.handleInstanceUpdateTask),\n );\n\n this.getInstanceById = Cadenza.createMetaTask(\n \"Get instance by id\",\n (context) => {\n const { __id } = context;\n let instance;\n for (const instances of this.instances.values()) {\n instance = instances.find((i) => i.uuid === __id);\n if (instance) break;\n }\n return { ...context, __instance: instance };\n },\n \"Gets instance by id.\",\n );\n\n this.getInstancesByServiceName = Cadenza.createMetaTask(\n \"Get instances by name\",\n (context) => {\n const { __serviceName } = context;\n const instances = this.instances.get(__serviceName);\n if (!instances) {\n return false;\n }\n\n return { ...context, __instances: instances };\n },\n \"Gets instances by name.\",\n );\n\n this.handleDeputyRegistrationTask = Cadenza.createMetaTask(\n \"Handle Deputy Registration\",\n (ctx, emit) => {\n const { serviceName } = ctx;\n\n if (!this.deputies.has(serviceName)) this.deputies.set(serviceName, []);\n\n this.deputies.get(serviceName)!.push({\n serviceName,\n remoteRoutineName: ctx.remoteRoutineName,\n signalName: ctx.signalName,\n localTaskName: ctx.localTaskName,\n communicationType: ctx.communicationType,\n });\n\n emit(\"meta.service_registry.deputy_registered\", ctx);\n },\n ).doOn(\"meta.deputy.created\");\n\n this.getAllInstances = Cadenza.createMetaTask(\n \"Get all instances\",\n (context) => ({\n ...context,\n __instances: Array.from(this.instances.values()).flat(),\n }),\n \"Gets all instances.\",\n );\n\n this.doForEachInstance = Cadenza.createMetaTask(\n \"Do for each instance\",\n function* (context: AnyObject) {\n // @ts-ignore\n for (const instances of this.instances.values()) {\n for (const instance of instances) {\n yield { ...context, __instance: instance };\n }\n }\n }.bind(this),\n \"Yields each instance for branching.\",\n );\n\n this.deleteInstance = Cadenza.createMetaTask(\n \"Delete instance\",\n (context) => {\n const { __id } = context;\n this.instances.delete(__id);\n return context;\n },\n \"Deletes instance.\",\n ).doOn(\"CadenzaDB.meta.service_instance.deleted\");\n\n this.getBalancedInstance = Cadenza.createMetaTask(\n \"Get balanced instance\",\n (context, emit) => {\n const { __serviceName, __triedInstances, __retries } = context;\n let retries = __retries ?? 0;\n let triedInstances = __triedInstances ?? [];\n\n const instances = this.instances\n .get(__serviceName)\n ?.filter((i) => i.isActive && !i.isNonResponsive && !i.isBlocked)\n .sort((a, b) => a.numberOfRunningGraphs! - b.numberOfRunningGraphs!);\n\n if (!instances || instances.length === 0 || retries > this.retryCount) {\n context.errored = true;\n context.__error = \"No active instances\";\n emit(\n `meta.service_registry.load_balance_failed:${context.__metadata.__deputyExecId}`,\n context,\n );\n return context;\n }\n\n // TODO: A way to specify if you want to send to all instances\n\n if (instances[0].isFrontend) {\n for (const instance of instances) {\n emit(\n `meta.service_registry.selected_instance_for_socket:${instance.address}`,\n context,\n );\n }\n\n return context;\n }\n\n let instancesToTry = instances.filter(\n (i) => !__triedInstances?.includes(i.uuid),\n );\n\n if (instancesToTry.length === 0) {\n if (this.useSocket) {\n emit(\n `meta.service_registry.socket_failed:${context.__fetchId}`,\n context,\n );\n }\n retries++;\n instancesToTry = instances;\n triedInstances = [];\n }\n\n let selected = instancesToTry[0];\n if (retries > 0) {\n selected =\n instancesToTry[Math.floor(Math.random() * instancesToTry.length)];\n }\n\n context.__instance = selected.uuid;\n context.__fetchId = `${selected.address}_${selected.port}`;\n context.__triedInstances = triedInstances;\n context.__triedInstances.push(selected.uuid);\n context.__retries = retries;\n\n if (this.useSocket) {\n emit(\n `meta.service_registry.selected_instance_for_socket:${context.__fetchId}`,\n context,\n );\n } else {\n emit(\n `meta.service_registry.selected_instance_for_fetch:${context.__fetchId}`,\n context,\n );\n }\n\n return context;\n },\n \"Gets a balanced instance for load balancing\",\n ).doOn(\n \"meta.deputy.delegation_requested\",\n \"meta.signal_transmission.requested\",\n \"meta.socket_client.delegate_failed\",\n \"meta.fetch.delegate_failed\",\n \"meta.socket_client.signal_transmission_failed\",\n );\n\n this.getStatusTask = Cadenza.createMetaTask(\"Get status\", (ctx) => {\n if (!this.serviceName) {\n return {\n __status: \"error\",\n __error: \"No service name defined\",\n errored: true,\n };\n }\n\n if (!this.serviceInstanceId) {\n return {\n __status: \"error\",\n __error: \"No service instance id defined\",\n errored: true,\n };\n }\n\n const self = this.instances\n .get(this.serviceName)\n ?.find((i) => i.uuid === this.serviceInstanceId);\n\n return {\n ...ctx,\n __status: \"ok\",\n __numberOfRunningGraphs: self?.numberOfRunningGraphs ?? 0,\n __health: self?.health ?? {},\n __active: self?.isActive ?? false,\n };\n }).doOn(\"meta.socket.status_check_requested\");\n\n this.insertServiceTask = Cadenza.createCadenzaDBInsertTask(\n \"service\",\n {\n onConflict: {\n target: [\"name\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n {\n // validateInputContext: true,\n inputSchema: {\n type: \"object\",\n properties: {\n data: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n },\n description: {\n type: \"string\",\n },\n display_name: {\n type: \"string\",\n },\n is_meta: {\n type: \"boolean\",\n },\n },\n required: [\"name\"],\n },\n },\n required: [\"data\"],\n },\n outputSchema: {\n type: \"object\",\n properties: {\n __serviceName: {\n type: \"string\",\n },\n },\n required: [\"__serviceName\"],\n },\n retryCount: 100,\n retryDelay: 10000,\n retryDelayMax: 60000,\n retryDelayFactor: 1.3,\n },\n )\n .then(\n Cadenza.createMetaTask(\n \"Set service name\",\n ({ __serviceName }) => {\n this.serviceName = __serviceName;\n return true;\n },\n \"Sets service name after insertion\",\n ),\n )\n .emits(\"meta.service_registry.service_inserted\")\n .emitsOnFail(\"meta.service_registry.service_insertion_failed\");\n\n this.insertServiceInstanceTask = Cadenza.createCadenzaDBInsertTask(\n \"serviceInstance\",\n {\n onConflict: {\n target: [\"address\", \"port\", \"process_pid\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n {\n inputSchema: {\n type: \"object\",\n properties: {\n uuid: {\n type: \"string\",\n },\n address: {\n type: \"string\",\n },\n port: {\n type: \"number\",\n },\n process_pid: {\n type: \"number\",\n },\n is_primary: {\n type: \"boolean\",\n },\n service_name: {\n type: \"string\",\n },\n is_active: {\n type: \"boolean\",\n },\n is_non_responsive: {\n type: \"boolean\",\n },\n is_blocked: {\n type: \"boolean\",\n },\n exposed: {\n type: \"boolean\",\n },\n },\n required: [\n \"id\",\n \"address\",\n \"port\",\n \"process_pid\",\n \"service_name\",\n \"exposed\",\n ],\n },\n // validateInputContext: true,\n outputSchema: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n },\n },\n required: [\"id\"],\n },\n // validateOutputContext: true,\n retryCount: 5,\n retryDelay: 1000,\n },\n )\n .doOn(\"meta.rest.network_configured\", \"meta.rest.browser_detected\")\n .then(\n Cadenza.createMetaTask(\n \"Setup service\",\n (ctx) => {\n const { serviceInstance, data, __useSocket, __retryCount } = ctx;\n this.serviceInstanceId = serviceInstance?.uuid ?? data?.uuid;\n this.instances.set(\n data?.service_name ?? serviceInstance?.service_name,\n [{ ...(serviceInstance ?? data) }],\n );\n this.useSocket = __useSocket;\n this.retryCount = __retryCount;\n console.log(\"SETUP SERVICE\", this.serviceInstanceId);\n return true;\n },\n \"Sets service instance id after insertion\",\n ).emits(\"meta.service_registry.instance_inserted\"),\n );\n\n Cadenza.createMetaTask(\n \"Handle service creation\",\n (ctx) => {\n if (!ctx.__cadenzaDBConnect) {\n ctx.__skipRemoteExecution = true;\n }\n\n console.log(\"service creation\", ctx);\n\n if (isBrowser) {\n Cadenza.createMetaTask(\"Prepare for signal sync\", () => {\n return {};\n })\n .doAfter(this.fullSyncTask)\n .then(\n Cadenza.createCadenzaDBQueryTask(\"signal_registry\", {\n fields: [\"name\", \"service_name\"],\n filter: {\n source_service_name: [ctx.__serviceName, \"*\"],\n },\n }).then(\n Cadenza.createMetaTask(\n \"Create signal transmission tasks\",\n (ctx, emit) => {\n const signalRegistry = ctx.signalRegistry;\n for (const signal of signalRegistry) {\n emit(\"meta.service_registry.foreign_signal_registered\", {\n __emitterSignalName: signal.name,\n __listenerServiceName: signal.serviceName,\n });\n }\n\n return true;\n },\n ).then(\n Cadenza.createMetaTask(\"Connect to services\", (ctx, emit) => {\n const services: string[] = Array.from(\n new Set(\n ctx.signalRegistry.map((s: any) => s.serviceName),\n ),\n );\n for (const service of services) {\n const instances = this.instances\n .get(service)!\n .filter((i) => i.isActive);\n for (const instance of instances) {\n if (instance.clientCreated) continue;\n const address = instance.address;\n const port = instance.port;\n\n const clientCreated = instances?.some(\n (i) =>\n i.address === address &&\n i.port === port &&\n i.clientCreated &&\n i.isActive,\n );\n\n if (!clientCreated) {\n emit(\"meta.service_registry.dependee_registered\", {\n serviceName: service,\n serviceInstanceId: instance.uuid,\n serviceAddress: address,\n servicePort: port,\n protocol: instance.exposed ? \"https\" : \"http\",\n communicationTypes: [\"signal\"],\n });\n }\n\n instance.clientCreated = true;\n instances.forEach((i) => {\n if (i.address === address && i.port === port) {\n i.clientCreated = true;\n }\n });\n }\n }\n return {};\n }),\n ),\n ),\n );\n }\n\n return ctx;\n },\n \"Handles the request to create a service instance\",\n )\n .doOn(\"meta.create_service_requested\")\n .then(this.insertServiceTask);\n }\n\n reset() {\n this.instances.clear();\n }\n}\n","import { GraphContext, Task } from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n SchemaDefinition,\n TaskResult,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport { v4 as uuid } from \"uuid\";\nimport Cadenza from \"../../Cadenza\";\n\nexport default class SignalTransmissionTask extends Task {\n readonly isDeputy: boolean = true;\n\n protected readonly signalName: string;\n protected readonly serviceName: string;\n\n /**\n * Constructs a DatabaseTask to execute a database operation on a remote service.\n * @param name - The local name of the Task.\n * @param signalName - The name of the signal to transmit to the service.\n * @param serviceName - The target database service name (optional, defaults to 'DatabaseService').\n * @param description - A description of the task's purpose (default: '').\n * @param concurrency - The maximum number of concurrent executions (default: 0, unlimited).\n * @param timeout - Timeout in milliseconds (default: 0, handled by engine).\n * @param register - Whether to register the task in the registry (default: true).\n * @param isUnique\n * @param isMeta\n * @param isSubMeta\n * @param isHidden\n * @param getTagCallback - Callback for dynamic tagging, e.g., 'return \"default\"'.\n * @param inputSchema - Input schema definition.\n * @param validateInputContext - Whether to validate the input context (default: false).\n * @param outputSchema - Output schema definition.\n * @param validateOutputContext - Whether to validate the output context (default: false).\n * @param retryCount\n * @param retryDelay\n * @param retryDelayMax\n * @param retryDelayFactor\n * @emits {meta.deputy.created} - Emitted on construction with task and service details.\n * @note Fallbacks via `.doOnFail` externally; timeouts managed by the engine.\n */\n constructor(\n name: string,\n signalName: string,\n serviceName: string,\n description: string = \"\",\n concurrency: number = 0,\n timeout: number = 0,\n register: boolean = true,\n isUnique: boolean = false,\n isMeta: boolean = false,\n isSubMeta: boolean = false,\n isHidden: boolean = false,\n getTagCallback: ThrottleTagGetter | undefined = undefined,\n inputSchema: SchemaDefinition | undefined = undefined,\n validateInputContext: boolean = false,\n outputSchema: SchemaDefinition | undefined = undefined,\n validateOutputContext: boolean = false,\n retryCount: number = 0,\n retryDelay: number = 0,\n retryDelayMax: number = 0,\n retryDelayFactor: number = 1,\n ) {\n const taskFunction = (\n context: AnyObject,\n emit: (signal: string, ctx: AnyObject) => void,\n ): Promise<TaskResult> => {\n return new Promise((resolve, reject) => {\n const processId = uuid();\n\n context.__routineExecId = processId;\n emit(\"meta.signal_transmission.requested\", context);\n\n // Ephemeral meta-task for resolution\n Cadenza.createEphemeralMetaTask(\n `Resolve signal transmission for ${this.signalName}`,\n (responseCtx) => {\n if (responseCtx?.errored) {\n reject(new Error(responseCtx.__error));\n } else {\n resolve(responseCtx);\n }\n },\n `Ephemeral resolver for signal transmission ${processId}`,\n {\n isSubMeta: true,\n register: false,\n },\n ).doOn(\n `meta.socket_client.transmitted:${processId}`,\n `meta.fetch.transmitted:${processId}`,\n );\n });\n };\n\n super(\n name,\n taskFunction,\n description,\n concurrency,\n timeout,\n register,\n isUnique,\n isMeta,\n isSubMeta,\n isHidden,\n getTagCallback,\n inputSchema,\n validateInputContext,\n outputSchema,\n validateOutputContext,\n retryCount,\n retryDelay,\n retryDelayMax,\n retryDelayFactor,\n );\n\n this.serviceName = serviceName;\n this.signalName = signalName;\n\n this.emit(\"meta.deputy.created\", {\n localTaskName: this.name,\n localTaskVersion: this.version,\n serviceName: this.serviceName,\n communicationType: \"signal\",\n signalName: this.signalName,\n });\n }\n\n /**\n * Triggers the database operation delegation flow via a signal to the meta-layer.\n * @param context - The GraphContext containing execution data.\n * @param emit\n * @param progressCallback - Callback to update progress (invoked by meta-layer).\n * @returns A Promise resolving with the task result or rejecting on error.\n * @emits {meta.deputy.executed} - Emitted with context including queryData to initiate delegation.\n * @edge Engine handles timeout and error, triggering `.doOnFail` if chained.\n * @note The resolution and progress are managed by ephemeral meta-tasks.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n ): TaskResult {\n const ctx = context.getContext();\n const metadata = context.getMetadata();\n\n const deputyContext = {\n __localTaskName: this.name,\n __serviceName: this.serviceName,\n __executionTraceId: metadata.__executionTraceId ?? null,\n __localRoutineExecId:\n metadata.__routineExecId ?? metadata.__metadata?.__routineExecId,\n __metadata: {\n ...metadata,\n __deputyTaskName: this.name,\n },\n __signalName: this.signalName,\n ...ctx,\n };\n\n return this.taskFunction(deputyContext, emit, progressCallback);\n }\n}\n","import Cadenza from \"../Cadenza\";\nimport express, { Request, Response } from \"express\";\nimport bodyParser from \"body-parser\";\nimport helmet from \"helmet\";\nimport cors from \"cors\";\nimport { RateLimiterMemory } from \"rate-limiter-flexible\";\nimport http from \"node:http\";\nimport fs from \"node:fs\";\nimport https from \"node:https\";\nimport fetch from \"node-fetch\";\nimport { isBrowser } from \"../utils/environment\";\n\nexport default class RestController {\n private static _instance: RestController;\n public static get instance(): RestController {\n if (!this._instance) this._instance = new RestController();\n return this._instance;\n }\n\n fetchDataWithTimeout = async function (\n url: string,\n requestInit: any,\n timeoutMs: number,\n ): Promise<any> {\n const signal = AbortSignal.timeout(timeoutMs); // Create a signal that aborts after timeoutMs\n\n try {\n const response = await fetch(url, { ...requestInit, signal }); // Send the request with the signal\n // Process the response\n return await response.json();\n } catch (error: any) {\n if (error?.name === \"AbortError\") {\n console.error(\"Fetch request timed out:\", error);\n // Handle timeout specifically\n } else {\n console.error(\"Fetch error:\", error);\n // Handle other errors\n }\n throw error; // Re-throw to propagate the error\n }\n };\n\n constructor() {\n Cadenza.registry.getTaskByName.doOn(\n \"meta.rest.delegation_requested\",\n \"meta.socket.delegation_requested\",\n );\n Cadenza.registry.getRoutineByName.doOn(\n \"meta.rest.delegation_requested\",\n \"meta.socket.delegation_requested\",\n );\n\n Cadenza.createMetaRoutine(\n \"RestServer\",\n [\n Cadenza.createMetaTask(\n \"Setup Express app security\",\n (ctx, emit) => {\n if (isBrowser) {\n emit(\"meta.rest.browser_detected\", {\n data: {\n uuid: ctx.__serviceInstanceId,\n address: `browser:${ctx.__serviceInstanceId}`,\n port: 0,\n exposed: false,\n process_pid: 1,\n service_name: ctx.__serviceName,\n is_frontend: true,\n is_active: true,\n is_non_responsive: false,\n is_blocked: false,\n health: {},\n },\n ...ctx,\n });\n return;\n }\n const app = express();\n app.use(bodyParser.json());\n\n switch (ctx.__securityProfile) {\n case \"low\":\n app.use(helmet());\n app.use(cors({ origin: \"*\" })); // Allow all origins (insecure for prod)\n break;\n\n case \"medium\":\n app.use(helmet());\n app.use(\n cors({\n origin: process.env.CORS_ORIGIN ?? \"*\",\n methods: [\"GET\", \"POST\"],\n }),\n );\n\n // Rate limiting (1000 req/5min per IP)\n app.use((req: any, res: any, next: any) => {\n new RateLimiterMemory({\n points: 10000,\n duration: 10,\n })\n .consume(req.ip)\n .then(() => next())\n .catch(() =>\n res.status(429).json({ error: \"Too many requests\" }),\n );\n });\n break;\n\n case \"high\":\n app.use(\n helmet({\n contentSecurityPolicy: {\n directives: { defaultSrc: [\"'self'\"] },\n }, // Strict CSP\n referrerPolicy: { policy: \"no-referrer\" },\n }),\n );\n\n if (!process.env.CORS_ORIGIN) {\n throw new Error(\n \"CORS_ORIGIN must be set for high security profile\",\n );\n }\n\n app.use(\n cors({\n origin: process.env.CORS_ORIGIN ?? \"*\",\n methods: [\"GET\", \"POST\"],\n credentials: true,\n }),\n );\n\n // Rate limiting (50 req/1min per IP, block on exceed)\n app.use((req: any, res: any, next: any) => {\n new RateLimiterMemory({\n points: 1000,\n duration: 60,\n blockDuration: 300,\n })\n .consume(req.ip)\n .then(() => next())\n .catch((rej) => {\n if (rej.msBeforeNext > 0) {\n res.status(429).json({\n error: \"Too many requests\",\n retryAfter: rej.msBeforeNext / 1000,\n });\n } else {\n res\n .status(429)\n .json({ error: \"Rate limit exceeded, blocked\" });\n }\n });\n });\n break;\n }\n\n return { ...ctx, __app: app };\n },\n \"Sets up the Express server according to the security profile\",\n ).then(\n Cadenza.createMetaTask(\n \"Define RestServer\",\n (ctx) => {\n const app = ctx.__app;\n\n // TODO: add body validation based on profile\n\n app.post(\"/handshake\", (req: Request, res: Response) => {\n try {\n console.log(\"REST HANDSHAKE\", req.body);\n Cadenza.broker.emit(\"meta.rest.handshake\", req.body);\n res.send({\n __status: \"success\",\n __serviceInstanceId:\n Cadenza.serviceRegistry.serviceInstanceId,\n });\n } catch (e) {\n console.error(\"Error in handshake\", e);\n res.send({ __status: \"error\" });\n }\n });\n\n app.post(\"/delegation\", (req: Request, res: Response) => {\n let deputyExecId;\n let ctx;\n try {\n ctx = req.body;\n deputyExecId = ctx.__metadata.__deputyExecId;\n console.log(\"delegation\", deputyExecId, ctx);\n } catch (e) {\n console.error(\"Error in delegation\", e);\n res.send({\n __status: \"error\",\n __error: e,\n errored: true,\n ...ctx,\n });\n return;\n }\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n (endCtx) => {\n console.log(\"Resolve delegation\", endCtx);\n const metadata = endCtx.__metadata;\n delete endCtx.__metadata;\n res.json({\n ...endCtx,\n ...metadata,\n __status: \"success\",\n });\n },\n \"Resolves a delegation request\",\n { register: false },\n )\n .doOn(`meta.node.graph_completed:${deputyExecId}`)\n .emits(`meta.rest.delegation_resolved:${deputyExecId}`);\n\n // Cadenza.createEphemeralMetaTask(\n // \"Delegation progress update\",\n // (progressCtx) => {\n // if (progressCtx.__progress !== undefined) {\n // // TODO: Progress updates via polling or long-polling for REST, but omit broadcasting as per instruction\n // }\n // },\n // \"Updates delegation progress (polling-based for REST)\",\n // {\n // once: false,\n // destroyCondition: (progressCtx: AnyObject) =>\n // progressCtx.__progress === 1 ||\n // progressCtx.__graphComplete,\n // },\n // ).doOn(\n // `meta.node.routine_execution_progress:${routineExecId}`,\n // `meta.node.ended_routine_execution:${routineExecId}`,\n // );\n\n Cadenza.broker.emit(\"meta.rest.delegation_requested\", {\n ...ctx,\n __name: ctx.__remoteRoutineName,\n });\n });\n\n app.post(\"/signal\", (req: Request, res: Response) => {\n let ctx;\n try {\n ctx = req.body;\n console.log(\"SIGNAL RECEIVED\", ctx);\n if (\n !Cadenza.broker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n res.send({\n ...ctx,\n __status: \"error\",\n __error: `No such signal: ${ctx.__signalName}`,\n errored: true,\n });\n return;\n }\n res.send({\n __status: \"success\",\n __signalName: ctx.__signalName,\n });\n } catch (e) {\n console.error(\"Error in signal\", e);\n res.send({\n __status: \"error\",\n __error: e,\n });\n return;\n }\n\n Cadenza.broker.emit(ctx.__signalName, ctx);\n });\n\n app.get(\"/status\", (req: Request, res: Response) => {\n Cadenza.createEphemeralMetaTask(\n \"Resolve status check\",\n (statusCtx) => res.json(statusCtx),\n \"Resolves a status check request\",\n { register: false },\n ).doAfter(Cadenza.serviceRegistry.getStatusTask);\n\n Cadenza.broker.emit(\n \"meta.rest.status_check_requested\",\n req.body.query,\n );\n });\n\n return true;\n },\n \"Starts REST server and initiates meta-handling\",\n )\n .then(\n Cadenza.createMetaTask(\n \"Configure network\",\n async (ctx) => {\n let address: string = \"localhost\";\n let port: number = ctx.__port;\n let exposed: boolean = false;\n\n const createHttpServer = async (ctx: any) => {\n await new Promise((resolve, reject) => {\n const server = http.createServer(ctx.__app);\n ctx.__httpServer = server;\n server.listen(ctx.__port, () => {\n if (typeof server?.address() === \"string\") {\n address = server.address() as string;\n // @ts-ignore\n } else if (server?.address()?.address === \"::\") {\n if (process.env.NODE_ENV === \"development\") {\n address = \"localhost\";\n } else if (process.env.IS_DOCKER === \"true\") {\n address =\n process.env.CADENZA_SERVER_URL || \"localhost\";\n }\n } else {\n // @ts-ignore\n address = server?.address()?.address || \"\";\n }\n\n console.log(`Server is running on ${address}:${port}`);\n resolve(address);\n });\n\n Cadenza.createMetaTask(\n \"Shutdown HTTP Server\",\n () => server.close(),\n \"Shuts down the HTTP server\",\n )\n .doOn(\"meta.server_shutdown_requested\")\n .emits(\"meta.rest.shutdown:http\");\n });\n };\n\n const createHttpsServer = async (ctx: any) => {\n if (\n !process.env.SSL_KEY_PATH ||\n !process.env.SSL_CERT_PATH\n ) {\n throw new Error(\n \"SSL_KEY_PATH and SSL_CERT_PATH must be set\",\n );\n }\n\n const options = {\n key: fs.readFileSync(process.env.SSL_KEY_PATH),\n cert: fs.readFileSync(process.env.SSL_CERT_PATH),\n };\n\n await new Promise((resolve, reject) => {\n const httpsServer = https.createServer(\n options,\n ctx.__app,\n );\n ctx.__httpsServer = httpsServer;\n ctx.__port = 443;\n port = 443;\n httpsServer.listen(443, () => {\n if (typeof httpsServer?.address() === \"string\") {\n address = httpsServer.address() as string;\n // @ts-ignore\n } else if (httpsServer?.address()?.address === \"::\") {\n if (process.env.IS_DOCKER === \"true\") {\n address =\n process.env.CADENZA_SERVER_URL || \"localhost\";\n }\n } else {\n // @ts-ignore\n address = httpsServer?.address()?.address || \"\";\n }\n\n exposed = true;\n\n console.log(\n `HTTPS Server is running on ${address}:443`,\n );\n resolve(address);\n });\n\n Cadenza.createMetaTask(\n \"Shutdown HTTPS Server\",\n () => httpsServer.close(),\n \"Shuts down the HTTPS server\",\n )\n .doOn(\"meta.server_shutdown_requested\")\n .emits(\"meta.rest.shutdown:https\");\n });\n };\n\n if (\n ctx.__networkMode === \"internal\" ||\n ctx.__networkMode === \"dev\"\n ) {\n await createHttpServer(ctx);\n } else if (ctx.__networkMode === \"exposed\") {\n await createHttpServer(ctx);\n await createHttpsServer(ctx);\n } else if (ctx.__networkMode === \"exposed-high-sec\") {\n await createHttpsServer(ctx);\n } else if (ctx.__networkMode === \"auto\") {\n // TODO: auto-detect based on trusted network or dev mode etc.\n await createHttpServer(ctx);\n // createHttpsServer(ctx);\n }\n\n ctx.data = {\n uuid: ctx.__serviceInstanceId,\n address: address,\n port: port,\n exposed: exposed,\n process_pid: process.pid,\n service_name: ctx.__serviceName,\n is_active: true,\n is_database: ctx.__isDatabase,\n is_non_responsive: false,\n is_blocked: false,\n health: {},\n };\n\n return ctx;\n },\n \"Configures network mode\",\n )\n .emits(\"meta.rest.network_configured\")\n .emitsOnFail(\"meta.rest.network_configuration_failed\"),\n )\n .emitsOnFail(\"meta.rest.failed\"),\n ),\n ],\n \"Bootstraps the REST server as socket fallback\",\n ).doOn(\"meta.service_registry.service_inserted\");\n\n Cadenza.createMetaTask(\n \"Setup fetch client\",\n (ctx, emit) => {\n const { serviceName, serviceAddress, servicePort, protocol } = ctx;\n\n const port = protocol === \"https\" ? 443 : servicePort;\n const URL = `${protocol}://${serviceAddress}:${port}`;\n const fetchId = `${serviceAddress}_${port}`;\n\n console.log(\"Fetch connecting to\", URL);\n\n const handshakeTask = Cadenza.createMetaTask(\n `Send Handshake to ${URL}`,\n async (ctx, emit) => {\n console.log(\"Sending handshake\", ctx);\n try {\n const response = await this.fetchDataWithTimeout(\n `${URL}/handshake`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify(ctx.handshakeData),\n },\n 1000,\n );\n console.log(\"Handshake result\", response);\n if (response.__status !== \"success\") {\n const error =\n response.__error ??\n `Failed to connect to service ${serviceName} ${ctx.serviceInstanceId}`;\n console.error(error);\n emit(`meta.fetch.handshake_failed:${fetchId}`, response);\n return { ...ctx, __error: error, errored: true };\n }\n\n ctx.serviceInstanceId = response.__serviceInstanceId;\n\n console.log(\n `Connected to service ${serviceName} ${URL}`,\n response,\n );\n\n for (const communicationType of ctx.communicationTypes) {\n // TODO: Should be done in other situations as well\n emit(\"meta.fetch.service_communication_established\", {\n data: {\n serviceInstanceId: ctx.serviceInstanceId,\n serviceInstanceClientId:\n Cadenza.serviceRegistry.serviceInstanceId,\n communicationType,\n },\n });\n }\n } catch (e) {\n console.error(\"Error in handshake\", e);\n return { ...ctx, __error: e, errored: true };\n }\n\n return ctx;\n },\n \"Sends handshake request\",\n { retryCount: 5, retryDelay: 1000, retryDelayFactor: 1.5 },\n )\n .doOn(`meta.fetch.handshake_requested:${fetchId}`)\n .emits(\"meta.fetch.handshake_complete\");\n\n const delegateTask = Cadenza.createMetaTask(\n `Delegate flow to REST server ${URL}`,\n async (ctx, emit) => {\n if (ctx.__remoteRoutineName === undefined) {\n return;\n }\n\n console.log(\"Delegating\", ctx);\n\n let resultContext;\n try {\n const response = await fetch(`${URL}/delegation`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify(ctx),\n });\n resultContext = await response.json();\n } catch (e) {\n // TODO: Retry on too many requests\n resultContext = {\n __error: `Error: ${e}`,\n errored: true,\n ...ctx,\n ...ctx.__metadata,\n };\n } finally {\n emit(\n `meta.fetch.delegated:${ctx.__metadata.__deputyExecId}`,\n resultContext,\n );\n }\n\n return resultContext;\n },\n \"Sends delegation request\",\n )\n .doOn(\n `meta.service_registry.selected_instance_for_fetch:${fetchId}`,\n `meta.service_registry.socket_failed:${fetchId}`,\n )\n .emitsOnFail(\"meta.fetch.delegate_failed\");\n\n const transmitTask = Cadenza.createMetaTask(\n `Transmit signal to server ${URL}`,\n async (ctx, emit) => {\n if (ctx.__signalName === undefined) {\n return;\n }\n\n let response;\n try {\n response = await this.fetchDataWithTimeout(\n `${URL}/signal`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify(ctx),\n },\n 1000,\n );\n\n console.log(\"SIGNAL TRANSMITTED\", response);\n\n if (ctx.__routineExecId) {\n emit(`meta.fetch.transmitted:${ctx.__routineExecId}`, response);\n }\n } catch (e) {\n // TODO: Retry on too many requests\n\n response = {\n __error: `Error: ${e}`,\n errored: true,\n ...ctx,\n };\n }\n\n return response;\n },\n \"Sends signal request\",\n )\n .doOn(\n `meta.service_registry.selected_instance_for_fetch:${fetchId}`,\n `meta.signal_controller.remote_signal_registered:${serviceName}`,\n \"meta.signal_controller.wildcard_signal_registered\",\n )\n .emitsOnFail(\"meta.fetch.signal_transmission_failed\");\n\n const statusTask = Cadenza.createMetaTask(\n `Request status from ${URL}`,\n async (ctx) => {\n let status;\n try {\n status = await this.fetchDataWithTimeout(\n `${URL}/status`,\n {\n method: \"GET\",\n },\n 1000,\n );\n } catch (e) {\n // TODO: Retry on too many requests\n\n status = {\n __error: `Error: ${e}`,\n errored: true,\n ...ctx,\n };\n }\n\n return status;\n },\n \"Requests status\",\n )\n .doOn(\"meta.fetch.status_check_requested\")\n .emits(\"meta.fetch.status_checked\")\n .emitsOnFail(\"meta.fetch.status_check_failed\");\n\n Cadenza.createEphemeralMetaTask(\"Destroy fetch client\", (ctx, emit) => {\n console.log(\"Destroying fetch client\");\n handshakeTask.destroy();\n delegateTask.destroy();\n transmitTask.destroy();\n statusTask.destroy();\n })\n .doOn(\n \"meta.fetch.destroy_requested\",\n `meta.socket_client.disconnected:${fetchId}`,\n `meta.fetch.handshake_failed:${fetchId}`,\n )\n .emits(\"meta.fetch.destroyed\");\n\n return true;\n },\n \"Manages REST client requests as fallback\",\n )\n .then(\n Cadenza.createMetaTask(\n \"Prepare handshake\",\n (ctx, emit) => {\n const {\n serviceName,\n serviceInstanceId,\n communicationTypes,\n serviceAddress,\n servicePort,\n protocol,\n } = ctx;\n\n const fetchId = `${serviceAddress}_${servicePort}`;\n\n emit(`meta.fetch.handshake_requested:${fetchId}`, {\n serviceInstanceId,\n serviceName,\n communicationTypes,\n serviceAddress,\n servicePort,\n protocol,\n handshakeData: {\n instanceId: Cadenza.serviceRegistry.serviceInstanceId,\n serviceName: Cadenza.serviceRegistry.serviceName,\n // JWT token...\n },\n });\n },\n \"Prepares handshake\",\n ),\n )\n .doOn(\"meta.service_registry.dependee_registered\")\n .emitsOnFail(\"meta.fetch.connect_failed\");\n }\n}\n","import Cadenza from \"../Cadenza\";\nimport { Server } from \"socket.io\";\nimport { IRateLimiterOptions, RateLimiterMemory } from \"rate-limiter-flexible\";\nimport xss from \"xss\";\nimport type { AnyObject } from \"@cadenza.io/core\";\nimport { io } from \"socket.io-client\";\nimport { isBrowser } from \"../utils/environment\";\n\nexport default class SocketController {\n private static _instance: SocketController;\n public static get instance(): SocketController {\n if (!this._instance) this._instance = new SocketController();\n return this._instance;\n }\n\n constructor() {\n Cadenza.createMetaRoutine(\n \"SocketServer\",\n [\n Cadenza.createMetaTask(\"Setup SocketServer\", (ctx) => {\n if (!ctx.__useSocket) {\n return;\n }\n\n console.log(\"SocketServer: Setting up\");\n const server = new Server(ctx.__httpsServer ?? ctx.__httpServer, {\n maxHttpBufferSize: 1e7, // 10MB large payloads\n });\n\n const profile = ctx.__securityProfile ?? \"medium\";\n\n server.use((socket, next) => {\n console.log(\"Middleware running for socket:\", socket.id);\n // Origin check (CORS-like)\n const origin = socket?.handshake?.headers?.origin;\n const allowedOrigins = [\"*\"]; // TODO From firewall_rule\n const networkType = ctx.__networkType ?? \"internal\"; // From meta-config\n let effectiveOrigin = origin || \"unknown\";\n if (networkType === \"internal\") effectiveOrigin = \"internal\"; // Assume trusted internal\n\n if (\n profile !== \"low\" &&\n !allowedOrigins.includes(effectiveOrigin) &&\n !allowedOrigins.includes(\"*\")\n ) {\n return next(new Error(\"Unauthorized origin\"));\n }\n\n // Rate limiting per socket/IP\n const limiterOptions: { [key: string]: IRateLimiterOptions } = {\n low: { points: Infinity, duration: 1 },\n medium: { points: 10000, duration: 10 },\n high: { points: 1000, duration: 60, blockDuration: 300 },\n };\n const limiter = new RateLimiterMemory(limiterOptions[profile]);\n const clientKey = socket?.handshake?.address || \"unknown\";\n socket.use((packet, packetNext) => {\n console.log(\n \"Incoming packet:\",\n packet[0],\n \"from socket:\",\n socket.id,\n clientKey,\n );\n limiter\n .consume(clientKey)\n .then(() => packetNext())\n .catch((rej) => {\n if (rej.msBeforeNext > 0) {\n console.log(\n \"SocketServer: Rate limit exceeded\",\n rej.msBeforeNext / 1000,\n );\n socket.emit(\"error\", {\n message: \"Rate limit exceeded\",\n retryAfter: rej.msBeforeNext / 1000,\n });\n packetNext(new Error(\"Rate limit exceeded\"));\n } else {\n console.log(\"SocketServer: Rate limit exceeded, blocked\");\n socket.disconnect(true);\n packetNext(new Error(\"Blocked\"));\n }\n });\n });\n\n // Sanitization for payloads needed?\n // socket.use((packet, next) => {\n // if (profile !== \"low\") {\n // const sanitize = (data: any) => {\n // if (typeof data === \"string\") return xss(data);\n // if (typeof data === \"object\") {\n // for (const key in data) {\n // data[key] = sanitize(data[key]);\n // }\n // }\n // return data;\n // };\n // try {\n // packet[1] = sanitize(packet[1]); // Sanitize event payload\n // } catch (e) {\n // console.error(\"SocketServer: Sanitization error\", e);\n // }\n // }\n // next();\n // });\n next();\n });\n console.log(\"SocketServer: Setup complete\");\n\n if (!server) {\n console.error(\"Socket setup error: No server\");\n return { ...ctx, __error: \"No server\", errored: true };\n }\n\n const handshakeMap: { [key: string]: boolean } = {};\n\n server.on(\"connection\", (ws: any) => {\n console.log(\"SocketServer: New connection\", ws.id);\n\n try {\n ws.on(\n \"handshake\",\n (ctx: AnyObject, callback: (result: any) => void) => {\n if (handshakeMap[ctx.serviceInstanceId]) {\n callback({\n status: \"error\",\n error: \"Duplicate handshake\",\n });\n return;\n }\n\n handshakeMap[ctx.serviceInstanceId] = true;\n console.log(\"Socket HANDSHAKE\", ctx);\n callback({\n status: \"success\",\n serviceName: Cadenza.serviceRegistry.serviceName,\n });\n if (ctx.isFrontend) {\n const fetchId = `browser:${ctx.serviceInstanceId}`;\n Cadenza.createMetaTask(\n `Transmit signal to ${fetchId}`,\n (ctx, emit) => {\n if (ctx.__signalName === undefined) {\n return;\n }\n\n ws.emit(\"signal\", ctx);\n\n if (ctx.__routineExecId) {\n emit(\n `meta.socket_client.transmitted:${ctx.__routineExecId}`,\n {},\n );\n }\n },\n ).doOn(\n `meta.service_registry.selected_instance_for_socket:${fetchId}`,\n );\n }\n Cadenza.broker.emit(\"meta.socket.handshake\", ctx);\n },\n );\n\n ws.on(\n \"delegation\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n console.log(\"Received socket delegation request\", ctx);\n const deputyExecId = ctx.__metadata.__deputyExecId;\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n callback,\n \"Resolves a delegation request using the provided callback from the client (.emitWithAck())\",\n { register: false },\n )\n .doOn(`meta.node.graph_completed:${deputyExecId}`)\n .emits(`meta.socket.delegation_resolved:${deputyExecId}`);\n\n Cadenza.createEphemeralMetaTask(\n \"Delegation progress update\",\n (ctx) => {\n if (ctx.__progress !== undefined)\n ws.emit(\"delegation_progress\", ctx);\n },\n \"Updates delegation progress\",\n {\n once: false,\n destroyCondition: (ctx: AnyObject) =>\n ctx.data.progress === 1.0 ||\n ctx.data?.progress === undefined,\n register: false,\n },\n )\n .doOn(\n `meta.node.routine_execution_progress:${deputyExecId}`,\n `meta.node.graph_completed:${deputyExecId}`,\n )\n .emitsOnFail(`meta.socket.progress_failed:${deputyExecId}`);\n\n Cadenza.broker.emit(\"meta.socket.delegation_requested\", {\n ...ctx,\n __name: ctx.__remoteRoutineName,\n });\n },\n );\n\n ws.on(\n \"signal\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n if (\n Cadenza.broker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n callback({\n __status: \"success\",\n __signalName: ctx.__signalName,\n });\n Cadenza.broker.emit(ctx.__signalName, ctx);\n } else {\n callback({\n ...ctx,\n __status: \"error\",\n __error: `No such signal: ${ctx.__signalName}`,\n errored: true,\n });\n }\n },\n );\n\n ws.on(\n \"status_check\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n Cadenza.createEphemeralMetaTask(\n \"Resolve status check\",\n callback,\n \"Resolves a status check request\",\n { register: false },\n ).doAfter(Cadenza.serviceRegistry.getStatusTask);\n\n Cadenza.broker.emit(\n \"meta.socket.status_check_requested\",\n ctx,\n );\n },\n );\n\n ws.on(\"disconnect\", () => {\n console.log(\"SocketServer: Disconnected\");\n Cadenza.broker.emit(\"meta.socket.disconnected\", {\n __wsId: ws.id,\n });\n });\n\n ws.onAny((event: any) => {\n console.log(\"SocketServer: Any\", event);\n });\n } catch (e) {\n console.error(\"SocketServer: Error in socket event\", e);\n }\n\n Cadenza.broker.emit(\"meta.socket.connected\", { __wsId: ws.id });\n });\n\n Cadenza.createMetaTask(\n \"Broadcast status\",\n (ctx) => server.emit(\"status_update\", ctx),\n \"Broadcasts the status of the server to all clients\",\n ).doOn(\"meta.service.updated\");\n\n Cadenza.createMetaTask(\n \"Shutdown SocketServer\",\n () => server.close(),\n \"Shuts down the socket server\",\n )\n .doOn(\"meta.socket_server_shutdown_requested\")\n .emits(\"meta.socket.shutdown\");\n\n console.log(\"SocketServer: Startup complete\");\n\n return ctx;\n }),\n ],\n \"Bootstraps the socket server\",\n ).doOn(\"meta.rest.network_configured\");\n\n Cadenza.createMetaTask(\n \"Connect to socket server\",\n (ctx) => {\n const { serviceName, serviceAddress, servicePort, protocol } = ctx;\n\n const socketProtocol = protocol === \"https\" ? \"wss\" : \"ws\";\n const port = protocol === \"https\" ? 443 : servicePort;\n const URL = `${socketProtocol}://${serviceAddress}:${port}`;\n const fetchId = `${serviceAddress}_${port}`;\n let handshake = false;\n\n console.log(\"SocketClient: Connecting to\", serviceName, URL);\n\n const socket = io(URL, {\n reconnection: true,\n reconnectionAttempts: 20,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 10000,\n randomizationFactor: 0.5,\n retries: 5,\n transports: [\"websocket\"],\n });\n\n const originalEmit = socket.emit;\n let emitId = 0;\n\n socket.emit = function (event: string, ...args: any[]) {\n emitId++;\n console.log(`[SOCKET EMIT #${emitId}] \"${event}\"`, {\n args: args[0],\n stack: new Error().stack?.split(\"\\n\").slice(1, 4).join(\"\\n\"),\n });\n return originalEmit.apply(this, [event, ...args]);\n };\n\n socket.on(\"connect\", () => {\n console.log(\"SocketClient: CONNECTED\", socket.id);\n if (handshake) return;\n\n Cadenza.broker.emit(`meta.socket_client.connected:${fetchId}`, ctx);\n });\n\n socket.on(\"connect_error\", (err) => {\n console.error(\"Connect error:\", err.message);\n });\n\n socket.on(\"delegation_progress\", (ctx) => {\n Cadenza.broker.emit(\n `meta.socket_client.delegation_progress:${ctx.__metadata.__deputyExecId}`,\n ctx,\n );\n });\n\n socket.on(\"signal\", (ctx) => {\n if (Cadenza.broker.listObservedSignals().includes(ctx.__signalName)) {\n Cadenza.broker.emit(ctx.__signalName, ctx);\n }\n });\n\n socket.on(\"status_update\", (status) => {\n Cadenza.broker.emit(\"meta.socket_client.status_received\", status);\n });\n\n socket.on(\"connect_error\", (err) => {\n console.error(\"SocketClient: connect_error\", err);\n Cadenza.broker.emit(\"meta.socket_client.connect_error\", err);\n });\n\n socket.on(\"timeout\", (event) => {\n console.error(event, \"timed out — server didn’t respond\");\n });\n\n socket.on(\"reconnect_attempt\", (attempt) => {\n console.log(\"Reconnect attempt:\", attempt);\n });\n\n socket.on(\"reconnect\", (attempt) => {\n console.log(\"Reconnected after\", attempt, \"tries\");\n });\n\n socket.on(\"reconnect_error\", (err) => {\n console.error(\"Reconnect failed:\", err.message);\n });\n\n socket.on(\"error\", (err) => {\n // TODO: Retry on rate limit error\n\n console.error(\"SocketClient: error\", err);\n Cadenza.broker.emit(\"meta.socket_client.error\", err);\n });\n\n socket.onAny((event) => {\n console.log(\"SocketClient: Any\", event);\n });\n\n socket.onAnyOutgoing((event) => {\n console.log(\"Outgoing packet\", event);\n });\n\n socket.on(\"disconnect\", () => {\n console.log(\"SocketClient: Disconnected\", URL);\n Cadenza.broker.emit(`meta.socket_client.disconnected:${fetchId}`, {\n serviceName,\n serviceAddress,\n servicePort,\n });\n });\n\n Cadenza.createEphemeralMetaTask(\n `Handshake with ${URL}`,\n (ctx) => {\n console.log(\"SocketClient: HANDSHAKING\", URL);\n handshake = true;\n\n socket.emit(\n \"handshake\",\n {\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n serviceName: Cadenza.serviceRegistry.serviceName,\n isFrontend: isBrowser,\n __status: \"success\",\n },\n (result: any) => {\n console.log(\"handshake result\", result);\n },\n );\n },\n \"Handshakes with socket server\",\n ).doOn(`meta.socket_client.connected:${fetchId}`);\n\n const delegateTask = Cadenza.createMetaTask(\n `Delegate flow to ${URL}`,\n async (ctx, emit) => {\n if (ctx.__remoteRoutineName === undefined) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n delete ctx.__isSubMeta;\n console.log(\"Socket Delegate:\", socket.connected, ctx);\n try {\n socket.emit(\"delegation\", ctx, (resultContext: AnyObject) => {\n // if (err) {\n // console.log(\"socket error:\", err);\n // resultContext = {\n // __error: `Timeout error: ${err}`,\n // errored: true,\n // ...ctx,\n // ...ctx.__metadata,\n // };\n // emit(\n // `meta.socket_client.delegate_failed`,\n // resultContext,\n // );\n // resolve(resultContext);\n // return;\n // }\n\n console.log(\"Resolved socket delegate\", resultContext);\n\n const metadata = resultContext.__metadata;\n delete resultContext.__metadata;\n emit(\n `meta.socket_client.delegated:${ctx.__metadata.__deputyExecId}`,\n {\n ...resultContext,\n ...metadata,\n },\n );\n resolve(resultContext);\n });\n } catch (e) {\n console.log(\"Socket Delegate Error:\", e);\n reject(e);\n }\n });\n },\n `Delegate flow to service ${serviceName} with address ${URL}`,\n ).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`);\n\n const transmitTask = Cadenza.createMetaTask(\n `Transmit signal to ${URL}`,\n async (ctx, emit) => {\n if (ctx.__signalName === undefined) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n socket\n .timeout(ctx.__timeout ?? 10000)\n .emit(\"signal\", ctx, (err: any, response: AnyObject) => {\n if (err) {\n console.log(\"socket error:\", err);\n response = {\n __error: `Timeout error: ${err}`,\n errored: true,\n ...ctx,\n ...ctx.__metadata,\n };\n emit(\n `meta.socket_client.signal_transmission_failed`,\n response,\n );\n resolve(response);\n return;\n }\n\n if (ctx.__routineExecId) {\n emit(\n `meta.socket_client.transmitted:${ctx.__routineExecId}`,\n response,\n );\n }\n resolve(response);\n });\n });\n },\n `Transmits signal to service ${serviceName} with address ${URL}`,\n ).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`);\n\n Cadenza.createEphemeralMetaTask(\n `Shutdown SocketClient ${URL}`,\n () => {\n socket?.close();\n delegateTask.destroy();\n transmitTask.destroy();\n },\n \"Shuts down the socket client\",\n )\n .doOn(\n `meta.socket_shutdown_requested:${fetchId}`,\n `meta.socket_client.disconnected:${fetchId}`,\n `meta.fetch.handshake_failed:${fetchId}`,\n )\n .emits(\"meta.socket_client_shutdown_complete\");\n\n return true;\n },\n \"Connects to a specified socket server\",\n )\n .doOn(\"meta.fetch.handshake_complete\")\n .emitsOnFail(\"meta.socket_client.connect_failed\");\n }\n}\n","export function formatTimestamp(timestamp: number) {\n return new Date(timestamp).toISOString();\n}\n\nexport function decomposeSignalName(signalName: string) {\n const parts = signalName.split(\".\");\n const firstChar = signalName.charAt(0);\n let isMeta = false;\n let sourceServiceName = null;\n let domain = parts.length === 2 ? parts[0] : \"\";\n if (parts[0] === \"meta\") {\n isMeta = true;\n if (parts.length === 3) {\n domain = parts[1];\n } else {\n domain = \"\";\n }\n } else if (firstChar === \"*\" || firstChar === firstChar.toUpperCase()) {\n sourceServiceName = parts[0];\n\n if (parts[1] === \"meta\") {\n isMeta = true;\n if (parts.length === 4) {\n domain = parts[2];\n } else {\n domain = \"\";\n }\n } else {\n domain = parts[1];\n }\n }\n const action = parts[parts.length - 1];\n\n return {\n isMeta,\n sourceServiceName,\n domain,\n action,\n };\n}\n","import Cadenza from \"../Cadenza\";\nimport { decomposeSignalName } from \"../utils/tools\";\n\nexport default class SignalController {\n private static _instance: SignalController;\n public static get instance(): SignalController {\n if (!this._instance) this._instance = new SignalController();\n return this._instance;\n }\n\n constructor() {\n Cadenza.createMetaTask(\n \"Handle Signal Registration\",\n (ctx, emit) => {\n const { __signalName } = ctx;\n const { isMeta, sourceServiceName, domain, action } =\n decomposeSignalName(__signalName);\n\n emit(\"meta.signal_controller.signal_added\", {\n data: {\n name: __signalName,\n sourceServiceName,\n domain,\n action,\n isMeta,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n });\n\n return ctx;\n },\n \"Handles signal registration from a service instance\",\n )\n .doOn(\"meta.signal_broker.added\")\n .then(\n Cadenza.createMetaTask(\n \"Handle foreign signal registration\",\n (ctx, emit) => {\n const { __signalName } = ctx;\n const firstChar = __signalName.charAt(0);\n\n if (\n (firstChar === firstChar.toUpperCase() &&\n firstChar !== firstChar.toLowerCase()) ||\n firstChar === \"*\"\n ) {\n const serviceName = __signalName.split(\".\")[0];\n\n if (Cadenza.serviceRegistry.serviceName === serviceName) {\n return false;\n }\n\n ctx.__listenerServiceName = Cadenza.serviceRegistry.serviceName;\n ctx.__emitterSignalName = __signalName;\n ctx.__signalName =\n \"meta.signal_controller.foreign_signal_registered\";\n ctx.__remoteServiceName = serviceName;\n\n console.log(\"REMOTE SIGNAL DETECTED\", ctx);\n\n if (serviceName === \"*\") {\n emit(\"meta.signal_controller.wildcard_signal_registered\", ctx);\n } else {\n emit(\n `meta.signal_controller.remote_signal_registered:${serviceName}`,\n ctx,\n );\n }\n\n return ctx;\n }\n },\n ).then(Cadenza.serviceRegistry.handleRemoteSignalRegistrationTask),\n );\n\n Cadenza.createMetaTask(\n \"Forward signal observations to remote service\",\n (ctx, emit) => {\n const { remoteSignals, serviceName } = ctx;\n\n for (const remoteSignal of remoteSignals) {\n remoteSignal.__signalName =\n \"meta.signal_controller.foreign_signal_registered\";\n\n emit(\n `meta.signal_controller.remote_signal_registered:${serviceName}`,\n remoteSignal,\n );\n }\n\n return true;\n },\n \"Forwards signal observations to remote service\",\n ).doAfter(Cadenza.serviceRegistry.getRemoteSignalsTask);\n\n Cadenza.createMetaTask(\"Handle foreign signal registration\", (ctx) => {\n const { __emitterSignalName, __listenerServiceName } = ctx;\n\n console.log(\n \"CREATING SIGNAL TRANSMISSION\",\n __emitterSignalName,\n __listenerServiceName,\n );\n\n Cadenza.createSignalTransmissionTask(\n __emitterSignalName,\n __listenerServiceName,\n ).doOn(__emitterSignalName.split(\".\").slice(1).join(\".\"));\n\n return true;\n }).doOn(\n \"meta.signal_controller.foreign_signal_registered\",\n \"meta.service_registry.foreign_signal_registered\",\n );\n\n // TODO: Cleanup transmission tasks?\n\n Cadenza.createMetaTask(\n \"Add data to signal emission\",\n (ctx) => {\n const signalEmission = ctx.__signalEmission;\n\n if (!signalEmission) {\n return false;\n }\n\n return {\n data: {\n signal_name: signalEmission.signalName,\n task_name: signalEmission.taskName,\n task_version: signalEmission.taskVersion,\n task_execution_id: signalEmission.taskExecutionId,\n is_meta: signalEmission.isMeta,\n is_metric: signalEmission.isMetric ?? false,\n data: ctx,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n },\n \"\",\n { isSubMeta: true, concurrency: 100 },\n )\n .doOn(\".*\")\n .emits(\"sub_meta.signal_controller.signal_emitted\");\n\n Cadenza.createMetaTask(\n \"Add metadata to signal consumption\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n },\n \"\",\n { isSubMeta: true, concurrency: 100 },\n )\n .doOn(\"meta.node.consumed_signal\")\n .emits(\"sub_meta.signal_controller.signal_consumed\");\n }\n}\n","import Cadenza from \"../../Cadenza\";\nimport { formatTimestamp } from \"../../utils/tools\";\n\nexport default class GraphMetadataController {\n private static _instance: GraphMetadataController;\n public static get instance(): GraphMetadataController {\n if (!this._instance) this._instance = new GraphMetadataController();\n return this._instance;\n }\n\n constructor() {\n Cadenza.createMetaTask(\"Handle task creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n // input_context_schema_id: ctx.data.inputContextSchema ? { // TODO\n //\n // } : null,\n // output_context_schema_id: ctx.data.outputContextSchema ? {\n //\n // } : null,\n },\n };\n })\n .doOn(\"meta.task.created\")\n .emits(\"meta.graph_metadata.task_created\");\n\n Cadenza.createMetaTask(\"Handle task update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.layer_index_changed\", \"meta.task.destroyed\")\n .emits(\"meta.graph_metadata.task_updated\");\n\n Cadenza.createMetaTask(\"Handle task relationship creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.relationship_added\")\n .emits(\"meta.graph_metadata.task_relationship_created\");\n\n Cadenza.createMetaTask(\n \"Handle task deputy relationship creation\",\n (ctx) => {\n if (ctx.signalName) return;\n return {\n data: {\n triggered_task_name: ctx.remoteRoutineName,\n triggered_task_version: 1, // TODO\n triggered_service_name: ctx.serviceName,\n deputy_task_name: ctx.localTaskName,\n deputy_task_version: 1, // TODO\n deputy_service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n )\n .doOn(\"meta.service_registry.deputy_registered\")\n .emits(\"meta.graph_metadata.deputy_relationship_created\");\n\n Cadenza.createMetaTask(\"Handle task signal observation\", (ctx) => {\n const firstChar = ctx.data.signalName.charAt(0);\n let _signal = ctx.data.signalName;\n let signalServiceName;\n if (\n firstChar === firstChar.toUpperCase() &&\n firstChar !== firstChar.toLowerCase()\n ) {\n // TODO handle wildcards\n signalServiceName = ctx.data.signalName.split(\".\")[0];\n _signal = ctx.data.signalName.split(\".\").slice(1).join(\".\");\n }\n return {\n data: {\n ...ctx.data,\n signalName: _signal,\n taskServiceName: Cadenza.serviceRegistry.serviceName,\n signalServiceName:\n signalServiceName ?? Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.observed_signal\")\n .emits(\"meta.graph_metadata.task_signal_observed\");\n\n Cadenza.createMetaTask(\"Handle task signal attachment\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.attached_signal\")\n .emits(\"meta.graph_metadata.task_attached_signal\");\n\n Cadenza.createMetaTask(\"Handle task unsubscribing signal\", (ctx) => {\n // const firstChar = ctx.data.signalName.charAt(0);\n // let signalServiceName;\n // if (\n // firstChar === firstChar.toUpperCase() &&\n // firstChar !== firstChar.toLowerCase()\n // ) {\n // signalServiceName = ctx.data.signalName.split(\".\")[0];\n // }\n return {\n data: {\n deleted: true,\n },\n filter: {\n ...ctx.filter,\n task_service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.unsubscribed_signal\")\n .emits(\"meta.graph_metadata.task_unsubscribed_signal\");\n\n Cadenza.createMetaTask(\"Handle task detaching signal\", (ctx) => {\n return {\n data: {\n deleted: true,\n },\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.detached_signal\")\n .emits(\"meta.graph_metadata.task_detached_signal\");\n\n Cadenza.createMetaTask(\"Handle routine creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doAfter(Cadenza.registry.registerRoutine)\n .emits(\"meta.graph_metadata.routine_created\");\n\n Cadenza.createMetaTask(\"Handle routine update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.destroyed\")\n .emits(\"meta.graph_metadata.routine_updated\");\n\n Cadenza.createMetaTask(\"Handle adding task to routine\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.task_added\")\n .emits(\"meta.graph_metadata.task_added_to_routine\");\n\n Cadenza.createMetaTask(\"Handle new trace\", (ctx) => {\n const context = ctx.data.context;\n delete ctx.data.context;\n\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n context_id: {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n };\n })\n .doOn(\"meta.runner.new_trace\")\n .emits(\"meta.graph_metadata.execution_trace_created\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution creation\",\n (ctx) => {\n const context = ctx.data.context;\n delete ctx.data.context;\n return {\n queryData: {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n },\n };\n },\n \"Handles routine execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.runner.added_tasks\")\n .emits(\"meta.graph_metadata.routine_execution_created\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution started\",\n () => {\n return true;\n },\n \"Handles routine execution started\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.started_routine_execution\")\n .emits(\"meta.graph_metadata.routine_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution ended\",\n (ctx) => {\n const context = ctx.data.resultContext;\n delete ctx.data.resultContext;\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n result_context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n filter: {\n ...ctx.filter,\n },\n };\n },\n \"Handles routine execution ended\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.ended_routine_execution\")\n .emits(\"meta.graph_metadata.routine_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution creation\",\n (ctx) => {\n const context = ctx.data.context;\n delete ctx.data.context;\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n };\n },\n \"Handles task execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.scheduled\")\n .emits(\"meta.graph_metadata.task_execution_created\");\n\n Cadenza.createMetaTask(\n \"Handle task execution mapped\",\n () => {\n return true;\n },\n \"Handles task execution mapping\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.mapped\")\n .emits(\"meta.graph_metadata.task_execution_mapped\");\n\n Cadenza.createMetaTask(\n \"Handle task execution started\",\n () => {\n return true;\n },\n \"Handles task execution started\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.started\")\n .emits(\"meta.graph_metadata.task_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle task execution ended\",\n (ctx) => {\n const context = ctx.data.resultContext;\n delete ctx.data.resultContext;\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n result_context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta ?? false,\n },\n return: \"uuid\",\n },\n },\n filter: {\n ...ctx.filter,\n },\n };\n },\n \"Handles task execution ended\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.ended\")\n .emits(\"meta.graph_metadata.task_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution relationship creation\",\n (ctx) => {\n return {\n data: {\n execution_count: \"increment\",\n last_executed: formatTimestamp(Date.now()),\n },\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n \"Handles task execution relationship creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.mapped\")\n .emits(\"meta.graph_metadata.relationship_executed\");\n\n Cadenza.createMetaTask(\n \"Handle explicit task execution relationship creation\",\n (ctx) => {\n return {\n data: {\n deputy_task_execution_id: ctx.data.previousTaskExecutionId,\n task_execution_id: ctx.data.taskExecutionId,\n },\n };\n },\n )\n .doOn(\"meta.node.detected_previous_task_execution\")\n .emits(\"meta.graph_metadata.explicit_relationship_created\");\n\n Cadenza.createMetaTask(\n \"Handle explicit task execution relationship execution\",\n (ctx) => {\n if (!ctx.__localTaskName) return;\n return {\n data: {\n execution_count: \"increment\",\n last_executed: formatTimestamp(Date.now()),\n },\n filter: {\n deputy_task_name: ctx.__localTaskName,\n deputy_task_version: ctx.__localTaskVersion,\n deputy_service_name: ctx.__localServiceName,\n triggered_task_name: ctx.filter.taskName,\n triggered_task_version: ctx.filter.taskVersion,\n triggered_service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n )\n .doOn(\"meta.node.detected_previous_task_execution\")\n .emits(\"meta.graph_metadata.explicit_relationship_executed\");\n }\n}\n","import type { AnyObject } from \"@cadenza.io/core\";\n\nexport type SchemaType =\n | \"varchar\"\n | \"text\"\n | \"int\"\n | \"bigint\" // Added for BIGINT\n | \"decimal\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"jsonb\"\n | \"uuid\"\n | \"timestamp\"\n | \"date\"\n | \"geo_point\"\n | \"bytea\"\n | \"any\";\n\nexport const SCHEMA_TYPES = [\n \"varchar\",\n \"text\",\n \"int\",\n \"bigint\",\n \"decimal\",\n \"boolean\",\n \"array\",\n \"object\",\n \"jsonb\",\n \"uuid\",\n \"timestamp\",\n \"date\",\n \"geo_point\",\n \"bytea\",\n \"any\",\n] as SchemaType[];\n\nexport type SchemaConstraints = {\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n enum?: any[];\n multipleOf?: number;\n format?: \"email\" | \"url\" | \"date-time\" | \"uuid\" | \"custom\";\n oneOf?: any[];\n appendOnly?: boolean;\n check?: string;\n precision?: number; // Added for decimal/bigint\n scale?: number; // Added for decimal\n};\n\nexport interface FieldDefinition {\n type: SchemaType;\n primary?: boolean;\n index?: boolean;\n unique?: boolean;\n default?: any;\n required?: boolean;\n nullable?: boolean;\n encrypted?: boolean;\n constraints?: SchemaConstraints;\n references?: string;\n items?: FieldDefinition;\n description?: string;\n generated?: \"uuid\" | \"timestamp\" | \"now\" | \"autoIncrement\"; // Added autoIncrement\n onDelete?: \"cascade\" | \"set null\" | \"no action\" | \"set default\" | \"restrict\";\n onUpdate?: \"cascade\" | \"set null\" | \"no action\" | \"set default\"; // Added for constraint cascade\n}\n\nexport type DbOperationType = \"query\" | \"insert\" | \"update\" | \"delete\";\n\nexport interface TableDefinition {\n fields: Record<string, FieldDefinition>;\n meta?: {\n description?: string;\n tags?: string[];\n shardKey?: string;\n partitionHint?: string;\n appendOnly?: boolean;\n encryptedFields?: string[];\n };\n indexes?: string[][];\n uniqueConstraints?: string[][];\n primaryKey?: string[];\n fullTextIndexes?: string[][];\n foreignKeys?: {\n tableName: string;\n fields: string[];\n referenceFields: string[];\n onDelete?: \"cascade\" | \"set null\" | \"no action\";\n }[];\n triggers?: Record<\n string,\n {\n when: \"before\" | \"after\";\n event: \"insert\" | \"update\" | \"delete\";\n function: string;\n }\n >;\n customSignals?: {\n triggers?: {\n [key in DbOperationType]?: (\n | string\n | { signal: string; condition?: (ctx: AnyObject) => boolean }\n )[];\n }; // Signals to observe before action\n emissions?: {\n [key in DbOperationType]?: (\n | string\n | { signal: string; condition?: (ctx: AnyObject) => boolean }\n )[];\n }; // Signals to emit after action\n };\n initialData?: { fields: string[]; data: any[][] };\n}\n\nexport interface SchemaDefinition {\n version?: number;\n tables: Record<string, TableDefinition>;\n relations?: Record<\n string,\n {\n on: string;\n type?: \"one-to-one\" | \"one-to-many\" | \"many-to-one\" | \"many-to-many\";\n }\n >;\n meta?: {\n defaultEncoding?: \"utf8\" | \"base64\";\n autoIndex?: boolean;\n relationsVersion?: number;\n dropExisting?: boolean;\n };\n}\n","import {\n DbOperationType,\n SchemaDefinition,\n SCHEMA_TYPES,\n FieldDefinition,\n TableDefinition,\n} from \"../types/database\";\nimport Cadenza, { DatabaseOptions, ServerOptions } from \"../Cadenza\";\nimport { Pool, PoolClient } from \"pg\";\nimport { camelCase, snakeCase } from \"lodash-es\";\nimport type { AnyObject } from \"@cadenza.io/core\";\nimport {\n DbOperationPayload,\n JoinDefinition,\n SubOperation,\n} from \"../types/queryData\";\nimport { sleep } from \"../utils/promise\";\n\nexport default class DatabaseController {\n private static _instance: DatabaseController;\n public static get instance(): DatabaseController {\n if (!this._instance) this._instance = new DatabaseController();\n return this._instance;\n }\n\n dbClient = new Pool({\n user: process.env.DATABASE_USER ?? \"postgres\",\n host: process.env.DATABASE_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.DATABASE_PORT ?? \"5432\"),\n database: \"postgres\",\n password: process.env.DATABASE_PASSWORD ?? \"03gibnEF\",\n });\n\n reset() {\n this.dbClient.end();\n }\n\n constructor() {\n Cadenza.createMetaRoutine(\n \"DatabaseServiceInit\",\n [\n // Database health check\n // Create database role\n // Create schema version table\n Cadenza.createMetaTask(\n \"Create database\",\n async (ctx) => {\n const { databaseName } = ctx;\n try {\n if (\n !databaseName.split(\"\").every((c: string) => /[a-z_]/.test(c))\n ) {\n throw new Error(\n `Invalid database name ${databaseName}. Names must only contain lowercase alphanumeric characters and underscores`,\n );\n }\n await this.dbClient.query(`CREATE DATABASE ${databaseName}`);\n console.log(`Database ${databaseName} created`);\n // Update dbClient to use the new database\n this.dbClient = new Pool({\n user: process.env.DATABASE_USER ?? \"postgres\",\n host: process.env.DATABASE_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.DATABASE_PORT ?? \"5432\"),\n database: databaseName,\n password: process.env.DATABASE_PASSWORD ?? \"03gibnEF\",\n });\n return true;\n } catch (error: any) {\n if (error.code === \"42P04\") {\n console.log(\"Database already exists\");\n // Database already exists\n return true;\n }\n throw new Error(`Failed to create database: ${error.message}`);\n }\n },\n \"Creates the target database if it doesn't exist\",\n ).then(\n Cadenza.createMetaTask(\n \"Validate schema\",\n (ctx) => {\n const { schema } = ctx as {\n schema: SchemaDefinition;\n options: ServerOptions & DatabaseOptions;\n };\n if (!schema?.tables || typeof schema.tables !== \"object\") {\n throw new Error(\"Invalid schema: missing or invalid tables\");\n }\n for (const [tableName, table] of Object.entries(schema.tables)) {\n if (!table.fields || typeof table.fields !== \"object\") {\n console.log(tableName, \"missing fields\");\n throw new Error(`Invalid table ${tableName}: missing fields`);\n }\n\n // Validate FieldDefinition constraints and customSignals\n for (const [fieldName, field] of Object.entries(table.fields)) {\n if (!fieldName.split(\"\").every((c) => /[a-z_]/.test(c))) {\n console.log(tableName, \"field not lowercase\", fieldName);\n throw new Error(\n `Invalid field name ${fieldName} for ${tableName}. Field names must only contain lowercase alphanumeric characters and underscores`,\n );\n }\n if (!Object.values(SCHEMA_TYPES).includes(field.type)) {\n console.log(\n tableName,\n \"field invalid type\",\n fieldName,\n field.type,\n );\n throw new Error(\n `Invalid type ${field.type} for ${tableName}.${fieldName}`,\n );\n }\n if (\n field.references &&\n !field.references.match(/^[\\w]+[(\\w)]+$/)\n ) {\n console.log(\n tableName,\n \"invalid reference\",\n fieldName,\n field.references,\n );\n throw new Error(\n `Invalid reference ${field.references} for ${tableName}.${fieldName}`,\n );\n }\n if (table.customSignals) {\n for (const op of [\"query\", \"insert\", \"update\", \"delete\"]) {\n const triggers =\n table.customSignals.triggers?.[op as DbOperationType];\n const emissions =\n table.customSignals.emissions?.[op as DbOperationType];\n if (\n triggers &&\n !Array.isArray(triggers) &&\n typeof triggers !== \"object\"\n ) {\n console.log(\n tableName,\n \"invalid triggers\",\n op,\n triggers,\n );\n throw new Error(\n `Invalid triggers for ${tableName}.${op}`,\n );\n }\n if (\n emissions &&\n !Array.isArray(emissions) &&\n typeof emissions !== \"object\"\n ) {\n console.log(\n tableName,\n \"invalid emissions\",\n op,\n emissions,\n );\n throw new Error(\n `Invalid emissions for ${tableName}.${op}`,\n );\n }\n }\n }\n }\n }\n console.log(\"SCHEMA VALIDATED\");\n return true;\n },\n \"Validates database schema structure and content\",\n ).then(\n Cadenza.createMetaTask(\n \"Sort tables by dependencies\",\n this.sortTablesByReferences.bind(this),\n \"Sorts tables by dependencies\",\n ).then(\n Cadenza.createMetaTask(\n \"Split schema into tables\",\n this.splitTables.bind(this),\n \"Generates DDL for database schema\",\n ).then(\n Cadenza.createMetaTask(\n \"Generate DDL from table\",\n async (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n const fieldDefs = Object.entries(table.fields)\n .map((value) => {\n const [fieldName, field] = value as [\n string,\n FieldDefinition,\n ];\n let def = `${fieldName} ${field.type.toUpperCase()}`;\n if (field.type === \"varchar\")\n def += `(${field.constraints?.maxLength ?? 255})`;\n if (field.type === \"decimal\")\n def += `(${field.constraints?.precision ?? 10},${field.constraints?.scale ?? 2})`;\n if (field.primary) def += \" PRIMARY KEY\";\n if (field.unique) def += \" UNIQUE\";\n if (field.default !== undefined)\n def += ` DEFAULT ${field.default === \"\" ? \"''\" : String(field.default)}`;\n if (field.required && !field.nullable)\n def += \" NOT NULL\";\n if (field.nullable) def += \" NULL\";\n if (field.generated)\n def += ` GENERATED ALWAYS AS ${field.generated.toUpperCase()} STORED`;\n if (field.references)\n def += ` REFERENCES ${field.references} ON DELETE ${field.onDelete || \"DO NOTHING\"}`;\n if (field.encrypted) def += \" ENCRYPTED\"; // Pseudo, handle via app-side\n\n if (field.constraints?.check) {\n def += ` CHECK (${field.constraints.check})`;\n }\n return def;\n })\n .join(\", \");\n\n if (schema.meta?.dropExisting) {\n const result = await this.dbClient.query(\n `DELETE FROM ${tableName};`,\n );\n console.log(\"DROP TABLE\", tableName, result);\n }\n\n const sql = `CREATE TABLE IF NOT EXISTS ${tableName} (${fieldDefs})`;\n // if (table.meta?.appendOnly) { // TODO Add prevent_context_modification() function\n // sql += `;\\nCREATE TRIGGER prevent_modification BEFORE UPDATE OR DELETE ON ${tableName} FOR EACH STATEMENT EXECUTE FUNCTION prevent_context_modification();`;\n // }\n\n ddl.push(sql);\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\"Generate index DDL\", (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.indexes) {\n table.indexes.forEach((fields: string[]) => {\n ddl.push(\n `CREATE INDEX IF NOT EXISTS idx_${tableName}_${fields.join(\"_\")} ON ${tableName} (${fields.join(\", \")});`,\n );\n });\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n }).then(\n Cadenza.createMetaTask(\n \"Generate primary key ddl\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.primaryKey) {\n ddl.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS unique_${tableName}_${table.primaryKey.join(\"_\")};`, // TODO: should be cascade?\n `ALTER TABLE ${tableName} ADD CONSTRAINT unique_${tableName}_${table.primaryKey.join(\"_\")} PRIMARY KEY (${table.primaryKey.join(\", \")});`,\n );\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate unique index DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.uniqueConstraints) {\n table.uniqueConstraints.forEach(\n (fields: string[]) => {\n ddl.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS unique_${tableName}_${fields.join(\"_\")};`, // TODO: should be cascade?\n `ALTER TABLE ${tableName} ADD CONSTRAINT unique_${tableName}_${fields.join(\"_\")} UNIQUE (${fields.join(\", \")});`,\n );\n },\n );\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate foreign key DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.foreignKeys) {\n for (const foreignKey of table.foreignKeys as {\n tableName: string;\n fields: string[];\n referenceFields: string[];\n }[]) {\n const foreignKeyName = `fk_${tableName}_${foreignKey.fields.join(\"_\")}`;\n ddl.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${foreignKeyName};`, // TODO: should be cascade?\n `ALTER TABLE ${tableName} ADD CONSTRAINT ${foreignKeyName} FOREIGN KEY (${foreignKey.fields.join(\n \", \",\n )}) REFERENCES ${foreignKey.tableName} (${foreignKey.referenceFields.join(\n \", \",\n )});`,\n );\n }\n }\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate trigger DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.triggers) {\n for (const [\n triggerName,\n trigger,\n ] of Object.entries(table.triggers) as [\n string,\n any,\n ][]) {\n ddl.push(\n `CREATE TRIGGER ${triggerName} ${trigger.when} ${trigger.event} ON ${tableName} FOR EACH STATEMENT EXECUTE FUNCTION ${trigger.function};`,\n );\n }\n }\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate initial data DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.initialData) {\n ddl.push(\n `INSERT INTO ${tableName} (${table.initialData.fields.join(\", \")}) VALUES ${table.initialData.data\n .map(\n (row: any[]) =>\n `(${row\n .map((value) =>\n value === undefined\n ? \"NULL\"\n : value.charAt(0) === \"'\"\n ? value\n : `'${value}'`,\n )\n .join(\", \")})`, // TODO: handle non string data\n )\n .join(\", \")} ON CONFLICT DO NOTHING;`,\n );\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createUniqueMetaTask(\n \"Join DDL\",\n (ctx) => {\n const { joinedContexts } = ctx;\n const ddl: string[] = [];\n for (const joinedContext of joinedContexts) {\n ddl.push(...joinedContext.ddl);\n }\n ddl.flat();\n return {\n ddl,\n schema: joinedContexts[0].schema,\n options: joinedContexts[0].options,\n table: joinedContexts[0].table,\n tableName: joinedContexts[0].tableName,\n sortedTables:\n joinedContexts[0].sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Apply Database Changes\",\n async (ctx) => {\n const { ddl } = ctx;\n if (ddl && ddl.length > 0) {\n for (const sql of ddl) {\n try {\n console.log(\"Applying SQL\", sql);\n await this.dbClient.query(sql);\n } catch (error: any) {\n console.error(\n \"Error applying DDL\",\n error,\n );\n }\n }\n }\n console.log(\"DDL applied\");\n return true;\n },\n \"Applies generated DDL to the database\",\n ).then(\n Cadenza.createMetaTask(\n \"Split schema into tables for task creation\",\n this.splitTables.bind(this),\n \"Splits schema into tables for task creation\",\n ).then(\n Cadenza.createMetaTask(\n \"Generate tasks\",\n (ctx) => {\n const { table, tableName, options } =\n ctx;\n\n this.createDatabaseTask(\n \"query\",\n tableName,\n table,\n this.queryFunction.bind(this),\n options,\n );\n\n this.createDatabaseTask(\n \"insert\",\n tableName,\n table,\n this.insertFunction.bind(this),\n options,\n );\n\n this.createDatabaseTask(\n \"update\",\n tableName,\n table,\n this.updateFunction.bind(this),\n options,\n );\n\n this.createDatabaseTask(\n \"delete\",\n tableName,\n table,\n this.deleteFunction.bind(this),\n options,\n );\n\n return true;\n },\n \"Generates auto-tasks for database schema\",\n ).then(\n Cadenza.createUniqueMetaTask(\n \"Join table tasks\",\n (ctx, emit) => {\n console.log(\"JOINING TABLE TASKS\");\n\n emit(\"meta.database.setup_done\", {});\n return true;\n },\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ],\n \"Initializes the database service with schema parsing and task/signal generation\",\n ).doOn(\"meta.database_init_requested\");\n }\n\n private async getClient(): Promise<PoolClient> {\n const client = (await this.dbClient.connect()) as unknown as any;\n const query = client.query;\n const release = client.release;\n // set a timeout of 5 seconds, after which we will log this client's last query\n const timeout = setTimeout(() => {\n console.error(\"A client has been checked out for more than 5 seconds!\");\n console.error(\n `The last executed query on this client was: ${client.lastQuery}`,\n );\n }, 5000);\n // monkey patch the query method to keep track of the last query executed\n client.query = (...args: any[]) => {\n client.lastQuery = args;\n return query.apply(client, args);\n };\n client.release = () => {\n // clear our timeout\n clearTimeout(timeout);\n // set the methods back to their old un-monkey-patched version\n client.query = query;\n client.release = release;\n return release.apply(client);\n };\n return client;\n }\n\n private async waitForDatabase(\n transaction: (\n client: any,\n context: AnyObject,\n ) => Promise<AnyObject | boolean>,\n client: any,\n context: AnyObject,\n ) {\n for (let i = 0; i < 10; i++) {\n try {\n return await transaction(client, context);\n } catch (err: unknown) {\n if (err && (err as Error).message.includes(\"does not exist\")) {\n console.log(`Waiting for database to be ready...`);\n await new Promise((res) => setTimeout(res, 1000));\n } else {\n console.error(\"Database query errored: \", err, context);\n return { rows: [] };\n }\n }\n }\n throw new Error(`Timeout waiting for database to be ready`);\n }\n\n sortTablesByReferences(ctx: AnyObject): AnyObject {\n // Build dependency graph: map of table -> set of dependent tables\n const schema: SchemaDefinition = ctx.schema;\n const graph: Map<string, Set<string>> = new Map();\n const allTables = Object.keys(schema.tables);\n\n // Initialize graph with all tables\n allTables.forEach((table) => graph.set(table, new Set()));\n\n // Populate dependencies, skipping self-references for cycle detection\n for (const [tableName, table] of Object.entries(schema.tables)) {\n for (const field of Object.values(table.fields)) {\n if (field.references) {\n const [refTable] = field.references.split(\"(\"); // Extract referenced table\n if (refTable !== tableName && allTables.includes(refTable)) {\n graph.get(refTable)?.add(tableName); // refTable depends on tableName\n }\n }\n }\n\n if (table.foreignKeys) {\n for (const foreignKey of table.foreignKeys) {\n const refTable = foreignKey.tableName;\n if (refTable !== tableName && allTables.includes(refTable)) {\n graph.get(refTable)?.add(tableName); // refTable depends on tableName\n }\n }\n }\n }\n\n // Topological sort using DFS with cycle detection\n const visited: Set<string> = new Set();\n const tempMark: Set<string> = new Set(); // For cycle detection\n const sorted: string[] = [];\n let hasCycles = false;\n\n function visit(table: string) {\n if (tempMark.has(table)) {\n hasCycles = true; // Mark cycle but continue\n return;\n }\n if (visited.has(table)) return;\n\n tempMark.add(table);\n for (const dep of graph.get(table) || []) {\n visit(dep);\n }\n tempMark.delete(table);\n visited.add(table);\n sorted.push(table);\n }\n\n // Visit each unvisited table\n for (const table of allTables) {\n if (!visited.has(table)) {\n visit(table);\n }\n }\n\n // Handle unvisited tables (e.g., no dependencies)\n for (const table of allTables) {\n if (!visited.has(table)) {\n sorted.push(table);\n }\n }\n\n sorted.reverse();\n\n console.log(\"sorted tables\", sorted, \"has cycles\", hasCycles);\n\n return { ...ctx, sortedTables: sorted, hasCycles };\n }\n\n async *splitTables(ctx: any) {\n const { sortedTables, schema, options = {} } = ctx;\n for (const tableName of sortedTables) {\n const table = schema.tables[tableName];\n yield { ddl: [], table, tableName, schema, options, sortedTables };\n }\n }\n\n toCamelCase(rows: any[]) {\n return rows.map((row: any) => {\n const camelCasedRow: any = {};\n for (const [key, value] of Object.entries(row)) {\n camelCasedRow[camelCase(key)] = value;\n }\n return camelCasedRow;\n });\n }\n\n async queryFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const {\n filter = {},\n fields = [],\n joins = {},\n sort = {},\n limit,\n offset,\n } = context;\n\n // Build base query\n let sql = `SELECT ${fields.length ? fields.join(\", \") : \"*\"} FROM ${tableName}`;\n const params: any[] = [];\n\n // Handle filter\n if (Object.keys(filter).length > 0) {\n sql += \" \" + this.buildWhereClause(filter, params);\n }\n\n // Handle joins\n if (Object.keys(joins).length > 0) {\n sql += \" \" + this.buildJoinClause(joins);\n }\n\n // Handle sort\n if (Object.keys(sort).length > 0) {\n sql +=\n \" ORDER BY \" +\n Object.entries(sort)\n .map(([field, direction]) => `${field} ${direction}`)\n .join(\", \");\n }\n\n // Handle limit and offset\n if (limit !== undefined) {\n sql += ` LIMIT $${params.length + 1}`;\n params.push(limit);\n }\n if (offset !== undefined) {\n sql += ` OFFSET $${params.length + 1}`;\n params.push(offset);\n }\n\n try {\n const result = await this.dbClient.query(sql, params);\n\n const rows = this.toCamelCase(result.rows);\n\n return {\n [`${camelCase(tableName)}s`]: rows,\n rowCount: result.rowCount,\n __success: true,\n ...context,\n };\n } catch (error: any) {\n return {\n ...context,\n errored: true,\n __error: `Query failed: ${error.message}`,\n };\n }\n }\n\n async insertFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const {\n data,\n transaction = true,\n fields = [],\n onConflict,\n awaitExists,\n } = context;\n\n if (!data || (Array.isArray(data) && data.length === 0)) {\n return { errored: true, __error: \"No data provided for insert\" };\n }\n\n const client = transaction ? await this.getClient() : this.dbClient;\n try {\n if (awaitExists) {\n for (const fk of Object.keys(awaitExists)) {\n const value = (data as any)[fk];\n\n if (value === undefined || value === null) continue;\n\n const { table, column } = awaitExists[fk];\n let exists = false;\n let retries = 0;\n const maxRetries = 20;\n while (!exists && retries < maxRetries) {\n const result = await client.query(\n `SELECT EXISTS(SELECT 1 from ${table} WHERE ${column} = ${typeof value === \"string\" ? `'${value}'` : value}) AS \"exists\"`,\n );\n exists = result.rows[0].exists;\n if (exists) break;\n retries++;\n await sleep(100);\n }\n }\n }\n if (transaction) await client.query(\"BEGIN\");\n\n const resolvedData = await this.resolveNestedData(data, tableName);\n const isBatch = Array.isArray(resolvedData);\n const rows = isBatch ? resolvedData : [resolvedData];\n\n const sql = `INSERT INTO ${tableName} (${Object.keys(rows[0]).map(snakeCase).join(\", \")}) VALUES `;\n const values = rows\n .map(\n (row) =>\n `(${Object.values(row)\n .map((value: any, i) => {\n if (typeof value === \"object\" && value?.__effect) {\n if (value.__effect === \"increment\") {\n return `${Object.keys(row)[i]} + 1`;\n }\n if (value.__effect === \"decrement\") {\n return `${Object.keys(row)[i]} - 1`;\n }\n if (value.__effect === \"set\") {\n return `${Object.keys(row)[i]} = ${value.__value}`; // TODO: placeholder, not working\n }\n }\n return `$${i + 1}`;\n })\n .join(\", \")})`,\n )\n .join(\", \");\n const params = rows.flatMap((row) => Object.values(row));\n\n let onConflictSql = \"\";\n if (onConflict) {\n const { target, action } = onConflict;\n onConflictSql += ` ON CONFLICT (${target.join(\", \")})`;\n if (action.do === \"update\") {\n if (!action.set || Object.keys(action.set).length === 0) {\n throw new Error(\"Update action requires 'set' fields\");\n }\n const setClauses = Object.entries(action.set)\n .map(\n ([field, value]) =>\n `${field} = ${value === \"excluded\" ? \"excluded.\" + field : `$${params.length + 1}`}`,\n )\n .join(\", \");\n params.push(\n ...Object.values(action.set).filter(\n (v) => typeof v !== \"string\" || !v.startsWith(\"excluded.\"),\n ),\n );\n onConflictSql += ` DO UPDATE SET ${setClauses}`;\n if (action.where) onConflictSql += ` WHERE ${action.where}`;\n } else {\n onConflictSql += ` DO NOTHING`;\n }\n }\n\n const result = await client.query(\n `${sql} ${values}${onConflictSql} RETURNING ${fields.length ? fields.join(\", \") : \"*\"}`,\n params,\n );\n if (transaction) await client.query(\"COMMIT\");\n const resultRows = this.toCamelCase(result.rows);\n\n return {\n [`${camelCase(tableName)}${isBatch ? \"s\" : \"\"}`]: isBatch\n ? resultRows\n : resultRows[0],\n rowCount: result.rowCount,\n __inserted: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n return {\n ...context,\n errored: true,\n __error: `Insert failed: ${error.message}`,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n }\n\n async updateFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const { data, filter = {}, transaction = true } = context;\n\n if (!data || Object.keys(data).length === 0) {\n return { errored: true, __error: \"No data provided for update\" };\n }\n\n const client = transaction ? await this.getClient() : this.dbClient;\n try {\n if (transaction) await client.query(\"BEGIN\");\n\n const resolvedData = await this.resolveNestedData(data, tableName);\n const params = Object.values(resolvedData);\n\n let offset = 0;\n const setClause = Object.entries(Object.keys(resolvedData))\n .map(([i, key]) => {\n const value = resolvedData[key];\n const offsetIndex = parseInt(i) - offset;\n if (value.__effect === \"increment\") {\n params.splice(offsetIndex, 1);\n offset++;\n return `${snakeCase(key)} = ${snakeCase(key)} + 1`;\n }\n if (value.__effect === \"decrement\") {\n params.splice(offsetIndex, 1);\n offset++;\n return `${snakeCase(key)} = ${snakeCase(key)} - 1`;\n }\n if (value.__effect === \"set\") {\n params.splice(offsetIndex, 1);\n offset++;\n return `${snakeCase(key)} = ${value.__value}`; // TODO: placeholder, not working\n }\n return `${snakeCase(key)} = $${offsetIndex + 1}`;\n })\n .join(\", \");\n\n const whereClause = this.buildWhereClause(filter, params);\n\n const sql = `UPDATE ${tableName} SET ${setClause} ${whereClause} RETURNING *;`;\n const result = await client.query(sql, params);\n if (transaction) await client.query(\"COMMIT\");\n const rows = this.toCamelCase(result.rows);\n\n if (rows.length === 0) {\n return {\n sql,\n params,\n __updated: false,\n };\n }\n\n return {\n [`${camelCase(tableName)}`]: rows[0],\n __updated: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n return {\n ...context,\n errored: true,\n __error: `Update failed: ${error.message}`,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n }\n\n async deleteFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const { filter = {}, transaction = true } = context;\n\n if (Object.keys(filter).length === 0) {\n return { errored: true, __error: \"No filter provided for delete\" };\n }\n\n const client = transaction ? await this.getClient() : this.dbClient;\n try {\n if (transaction) await client.query(\"BEGIN\");\n\n const params: any[] = [];\n const whereClause = this.buildWhereClause(filter, params);\n const sql = `DELETE FROM ${tableName} ${whereClause} RETURNING *`;\n const result = await client.query(sql, params);\n if (transaction) await client.query(\"COMMIT\");\n const rows = this.toCamelCase(result.rows);\n return {\n [`${camelCase(tableName)}`]: rows[0],\n __deleted: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n return {\n errored: true,\n __error: `Delete failed: ${error.message}`,\n __errors: { delete: error.message },\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n }\n\n buildWhereClause(filter: AnyObject, params: any[]): string {\n const conditions = [];\n for (const [key, value] of Object.entries(filter)) {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n conditions.push(\n `${snakeCase(key)} IN (${value\n .map((v) => {\n const val = `$${params.length + 1}`;\n params.push(v);\n return val;\n })\n .join(\", \")})`,\n );\n } else {\n conditions.push(`${snakeCase(key)} = $${params.length + 1}`);\n params.push(value);\n }\n }\n }\n return conditions.length ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n }\n\n buildJoinClause(joins: Record<string, JoinDefinition>): string {\n let joinSql = \"\";\n for (const [table, join] of Object.entries(joins)) {\n joinSql += ` LEFT JOIN ${snakeCase(table)} ${join.alias} ON ${join.on}`;\n if (join.joins) joinSql += \" \" + this.buildJoinClause(join.joins);\n }\n return joinSql;\n }\n\n async resolveNestedData(data: any, tableName: string): Promise<any> {\n if (Array.isArray(data))\n return Promise.all(data.map((d) => this.resolveNestedData(d, tableName)));\n if (typeof data !== \"object\" || data === null) return data;\n\n const resolved = { ...data };\n for (const [key, value] of Object.entries(data)) {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"subOperation\" in value\n ) {\n const subOp = value as SubOperation;\n const subResult = await this.executeSubOperation(subOp);\n resolved[key] = subResult[subOp.return || \"full\"] ?? subResult;\n } else if (\n typeof value === \"string\" &&\n [\"increment\", \"decrement\", \"set\"].includes(value)\n ) {\n resolved[key] = { __effect: value }; // Placeholder for effect handling (DB-side or app-side)\n } else if (typeof value === \"object\") {\n resolved[key] = await this.resolveNestedData(value, tableName);\n }\n }\n return resolved;\n }\n\n async executeSubOperation(op: SubOperation): Promise<any> {\n const client = await this.getClient();\n try {\n await client.query(\"BEGIN\");\n let result;\n if (op.subOperation === \"insert\") {\n const resolvedData = await this.resolveNestedData(op.data, op.table);\n const sql = `INSERT INTO ${op.table} (${Object.keys(resolvedData).join(\", \")}) VALUES (${Object.values(\n resolvedData,\n )\n .map((_, i) => `$${i + 1}`)\n .join(\n \", \",\n )}) ON CONFLICT DO NOTHING RETURNING ${op.return === \"uuid\" ? \"uuid\" : \"*\"}`;\n result = await client.query(sql, Object.values(resolvedData));\n result = result.rows[0];\n if (!result && op.return === \"uuid\") {\n result = resolvedData.uuid ? { uuid: resolvedData.uuid } : undefined;\n }\n } else if (op.subOperation === \"query\") {\n const params: any[] = [];\n const whereClause = this.buildWhereClause(op.filter || {}, params);\n const sql = `SELECT ${op.fields?.join(\", \") || \"*\"} FROM ${op.table} ${whereClause} LIMIT 1`;\n result = (await client.query(sql, params)).rows[0];\n }\n await client.query(\"COMMIT\");\n return result || {};\n } catch (error) {\n await client.query(\"ROLLBACK\");\n throw error;\n } finally {\n client.release();\n }\n }\n\n createDatabaseTask(\n op: DbOperationType,\n tableName: string,\n table: TableDefinition,\n queryFunction: (tableName: string, context: AnyObject) => Promise<any>,\n options: ServerOptions,\n ) {\n const opAction =\n op === \"query\"\n ? \"queried\"\n : op === \"insert\"\n ? \"inserted\"\n : op === \"update\"\n ? \"updated\"\n : op === \"delete\"\n ? \"deleted\"\n : \"\";\n\n const defaultSignal = `${options.isMeta ? \"meta.\" : \"\"}${tableName}.${opAction}`;\n\n const tableNameFormatted = tableName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n\n const taskName = `db${op.charAt(0).toUpperCase() + op.slice(1)}${tableNameFormatted}`;\n\n Cadenza.createThrottledTask(\n taskName,\n async (context: AnyObject, emit: any) => {\n const triggerConditions: any | undefined =\n table.customSignals?.triggers?.query?.filter(\n (trigger: any) => trigger.condition,\n );\n for (const triggerCondition of triggerConditions ?? []) {\n if (\n triggerCondition.condition &&\n !triggerCondition.condition(context)\n ) {\n return {\n failed: true,\n error: `Condition for signal trigger failed: ${triggerCondition.signal}`,\n };\n }\n }\n\n try {\n context = await queryFunction(\n tableName,\n context.queryData ?? context,\n );\n } catch (e) {\n console.error(\"Database task:\", taskName, \"errored.\", e);\n throw e;\n }\n\n if (!context.errored) {\n for (const signal of table.customSignals?.emissions?.[op] ??\n ([] as any[])) {\n if (signal.condition && !signal.condition(context)) {\n continue;\n }\n emit(signal.signal ?? signal, context);\n }\n }\n\n console.log(\n \"EXECUTED\",\n taskName,\n context.errored\n ? JSON.stringify({\n data: context.data,\n queryData: context.queryData,\n filter: context.filter,\n fields: context.fields,\n joins: context.joins,\n sort: context.sort,\n limit: context.limit,\n offset: context.offset,\n })\n : context[camelCase(tableName)]\n ? JSON.stringify(context[camelCase(tableName)]).slice(0, 140)\n : JSON.stringify(context).slice(0, 140),\n context.__error,\n );\n\n delete context.queryData;\n delete context.data;\n delete context.filter;\n delete context.fields;\n delete context.joins;\n delete context.sort;\n delete context.limit;\n delete context.offset;\n\n return context;\n },\n (context?: AnyObject) =>\n context?.__metadata?.__executionTraceId ??\n context?.__executionTraceId ??\n \"default\",\n `Auto-generated ${op} task for ${tableName}`,\n {\n isMeta: options.isMeta,\n isSubMeta: options.isMeta,\n validateInputContext: false, // TODO\n inputSchema: {\n // TODO\n type: \"object\",\n properties: {\n filter: {\n type: \"object\",\n },\n },\n },\n },\n )\n .doOn(\n ...(table.customSignals?.triggers?.[op]?.map((signal: any) => {\n return typeof signal === \"string\" ? signal : signal.signal;\n }) ?? []),\n )\n .emits(defaultSignal);\n }\n}\n","export function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import Cadenza from \"../../Cadenza\";\nimport { Task } from \"@cadenza.io/core\";\nimport { decomposeSignalName } from \"../../utils/tools\";\n\nexport default class GraphSyncController {\n private static _instance: GraphSyncController;\n public static get instance(): GraphSyncController {\n if (!this._instance) this._instance = new GraphSyncController();\n return this._instance;\n }\n constructor() {\n // Cadenza.broker.clearSignalsTask?.doOn(\"meta.sync_requested\");\n\n Cadenza.createDebounceMetaTask(\n \"Debounce syncing of resources\",\n () => true,\n \"\",\n 500,\n )\n .doAfter(Cadenza.serviceRegistry.handleInstanceUpdateTask)\n .then(\n Cadenza.broker.getSignalsTask!.then(\n Cadenza.registry.getAllTasks.then(Cadenza.registry.getAllRoutines),\n ),\n );\n\n Cadenza.createMetaTask(\"Split routines for registration\", (ctx, emit) => {\n const { __routines } = ctx;\n if (!__routines) return;\n for (const routine of __routines) {\n if (routine.registered) continue;\n routine.registered = true;\n emit(\"meta.sync_controller.routine_added\", {\n data: {\n name: routine.name,\n version: routine.version,\n description: routine.description,\n serviceName: Cadenza.serviceRegistry.serviceName,\n isMeta: routine.isMeta,\n },\n });\n\n for (const task of routine.tasks) {\n const tasks = task.getIterator();\n\n while (tasks.hasNext()) {\n const nextTask = tasks.next();\n emit(\"meta.sync_controller.task_to_routine_map\", {\n data: {\n taskName: nextTask.name,\n taskVersion: nextTask.version,\n routineName: routine.name,\n routineVersion: routine.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n });\n }\n }\n }\n }).doAfter(Cadenza.registry.getAllRoutines);\n\n Cadenza.createMetaTask(\"Split signals for registration\", (ctx, emit) => {\n const { __signals } = ctx;\n if (!__signals) return;\n\n const filteredSignals = __signals\n .filter(\n (signal: { signal: string; data: any }) => !signal.data.registered,\n )\n .map((signal: { signal: string; data: any }) => signal.signal);\n\n for (const signal of filteredSignals) {\n const { isMeta, sourceServiceName, domain, action } =\n decomposeSignalName(signal);\n\n emit(\"meta.sync_controller.signal_added\", {\n data: {\n name: signal,\n sourceServiceName,\n domain,\n action,\n isMeta,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n });\n emit(\"meta.signal.registered\", {\n __signalName: signal,\n });\n }\n }).doAfter(Cadenza.broker.getSignalsTask!);\n\n Cadenza.createMetaTask(\"Split tasks for registration\", (ctx, emit) => {\n const { __tasks } = ctx;\n if (!__tasks) return;\n\n for (const task of __tasks) {\n if (task.registered) continue;\n task.registered = true;\n console.log(\"REGISTERING TASK\", task.name);\n const { __functionString, __getTagCallback } = task.export();\n emit(\"meta.sync_controller.task_added\", {\n data: {\n name: task.name,\n version: task.version,\n description: task.description,\n functionString: __functionString,\n tagIdGetter: __getTagCallback,\n layerIndex: task.layerIndex,\n concurrency: task.concurrency,\n timeout: task.timeout,\n isUnique: task.isUnique,\n isSignal: task.isSignal,\n isThrottled: task.isThrottled,\n isDebounce: task.isDebounce,\n isEphemeral: task.isEphemeral,\n isMeta: task.isMeta,\n isSubMeta: task.isSubMeta,\n isHidden: task.isHidden,\n // inputSchema: task.inputSchema,\n validateInputContext: task.validateInputContext,\n // outputSchema: task.outputSchema,\n validateOutputContext: task.validateOutputContext,\n retryCount: task.retryCount,\n retryDelay: task.retryDelay,\n retryDelayMax: task.retryDelayMax,\n retryDelayFactor: task.retryDelayFactor,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n });\n\n task.mapObservedSignals((signal: string) => {\n const firstChar = signal.charAt(0);\n let _signal = signal;\n let signalServiceName;\n if (\n firstChar === firstChar.toUpperCase() &&\n firstChar !== firstChar.toLowerCase()\n ) {\n // TODO handle wildcards\n signalServiceName = signal.split(\".\")[0];\n _signal = signal.split(\".\").slice(1).join(\".\");\n }\n\n emit(\"meta.sync_controller.signal_to_task_map\", {\n data: {\n signalName: _signal,\n taskName: task.name,\n taskVersion: task.version,\n taskServiceName: Cadenza.serviceRegistry.serviceName,\n signalServiceName:\n signalServiceName ?? Cadenza.serviceRegistry.serviceName,\n },\n });\n });\n\n task.mapSignals((signal: string) => {\n emit(\"meta.sync_controller.task_to_signal_map\", {\n data: {\n signalName: signal,\n taskName: task.name,\n taskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n });\n });\n\n task.mapOnFailSignals((signal: string) => {\n emit(\"meta.sync_controller.task_to_signal_map\", {\n // TODO: handle signals that are not observed.\n data: {\n signalName: signal,\n taskName: task.name,\n taskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n isOnFail: true,\n },\n });\n });\n }\n\n for (const task of __tasks) {\n if (task.hidden || !task.register) continue;\n task.mapNext((t: Task) =>\n emit(\"meta.sync_controller.task_map\", {\n data: {\n taskName: t.name,\n taskVersion: t.version,\n predecessorTaskName: task.name,\n predecessorTaskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n }),\n );\n\n if (task.isDeputy && !task.signalName) {\n emit(\"meta.sync_controller.deputy_relationship_created\", {\n data: {\n triggered_task_name: task.remoteRoutineName,\n triggered_task_version: 1,\n triggered_service_name: task.serviceName,\n deputy_task_name: task.name,\n deputy_task_version: task.version,\n deputy_service_name: Cadenza.serviceRegistry.serviceName,\n },\n });\n }\n }\n\n return true;\n }).doAfter(Cadenza.registry.getAllTasks);\n }\n}\n"],"mappings":"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","names":["import_core","uuid","uuid","ctx","import_core","import_uuid","uuid","fetch","express","bodyParser","helmet","cors","ctx","http","fs","https","emit","import_rate_limiter_flexible","import_socket","ctx","import_lodash_es","result","import_uuid","Cadenza","uuid","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Cadenza.ts","../src/graph/definition/DeputyTask.ts","../src/graph/definition/DatabaseTask.ts","../src/utils/environment.ts","../src/registry/ServiceRegistry.ts","../src/graph/definition/SignalTransmissionTask.ts","../src/network/RestController.ts","../src/network/SocketController.ts","../src/utils/tools.ts","../src/signals/SignalController.ts","../src/graph/controllers/GraphMetadataController.ts","../src/types/database.ts","../src/database/DatabaseController.ts","../src/utils/promise.ts","../src/graph/controllers/GraphSyncController.ts"],"sourcesContent":["import CadenzaService, {\n NetworkMode,\n SecurityProfile,\n ServerOptions,\n} from \"./Cadenza\";\nimport {\n DebounceTask,\n EphemeralTask,\n GraphRoutine,\n Task,\n} from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n DebounceOptions,\n EphemeralTaskOptions,\n TaskFunction,\n TaskOptions,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport GraphMetadataController from \"./graph/controllers/GraphMetadataController\";\nimport DatabaseTask from \"./graph/definition/DatabaseTask\";\nimport DeputyTask from \"./graph/definition/DeputyTask\";\nimport SignalTransmissionTask from \"./graph/definition/SignalTransmissionTask\";\nimport RestController from \"./network/RestController\";\nimport SocketController from \"./network/SocketController\";\nimport ServiceRegistry, {\n DeputyDescriptor,\n ServiceInstanceDescriptor,\n} from \"./registry/ServiceRegistry\";\nimport SignalController from \"./signals/SignalController\";\nimport {\n DbOperationType,\n DbOperationPayload,\n JoinDefinition,\n OpEffect,\n SortDirection,\n SubOperation,\n SubOperationType,\n ValueOrSubOp,\n} from \"./types/queryData\";\n\nexport default CadenzaService;\nexport type {\n ServiceInstanceDescriptor,\n DeputyDescriptor,\n DbOperationType,\n SortDirection,\n JoinDefinition,\n SubOperationType,\n SubOperation,\n OpEffect,\n ValueOrSubOp,\n DbOperationPayload,\n SecurityProfile,\n NetworkMode,\n ServerOptions,\n AnyObject,\n TaskOptions,\n ThrottleTagGetter,\n TaskFunction,\n DebounceOptions,\n EphemeralTaskOptions,\n};\nexport {\n GraphMetadataController,\n DeputyTask,\n DatabaseTask,\n SignalTransmissionTask,\n RestController,\n SocketController,\n ServiceRegistry,\n SignalController,\n Task,\n DebounceTask,\n EphemeralTask,\n GraphRoutine,\n};\n","import Cadenza, {\n CadenzaMode,\n DebounceOptions,\n DebounceTask,\n EphemeralTask,\n EphemeralTaskOptions,\n GraphRegistry,\n GraphRoutine,\n GraphRunner,\n SignalBroker,\n Task,\n TaskFunction,\n TaskOptions,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport DeputyTask from \"./graph/definition/DeputyTask\";\nimport DatabaseTask from \"./graph/definition/DatabaseTask\";\nimport ServiceRegistry from \"./registry/ServiceRegistry\";\nimport SignalTransmissionTask from \"./graph/definition/SignalTransmissionTask\";\nimport RestController from \"./network/RestController\";\nimport SocketController from \"./network/SocketController\";\nimport SignalController from \"./signals/SignalController\";\nimport { DbOperationPayload, DbOperationType } from \"./types/queryData\";\nimport GraphMetadataController from \"./graph/controllers/GraphMetadataController\";\nimport { SchemaDefinition } from \"./types/database\";\nimport { snakeCase } from \"lodash-es\";\nimport DatabaseController from \"./database/DatabaseController\";\nimport { v4 as uuid } from \"uuid\";\nimport GraphSyncController from \"./graph/controllers/GraphSyncController\";\nimport { isBrowser } from \"./utils/environment\";\n\nexport type SecurityProfile = \"low\" | \"medium\" | \"high\";\nexport type NetworkMode =\n | \"internal\"\n | \"exposed\"\n | \"exposed-high-sec\"\n | \"auto\"\n | \"dev\";\n\nexport type ServerOptions = {\n customServiceId?: string; // TODO\n loadBalance?: boolean;\n useSocket?: boolean;\n log?: boolean;\n displayName?: string;\n isMeta?: boolean;\n port?: number; // for internal network\n securityProfile?: SecurityProfile;\n networkMode?: NetworkMode;\n retryCount?: number;\n cadenzaDB?: { connect?: boolean; address?: string; port?: number };\n relatedServices?: string[][];\n isDatabase?: boolean;\n isFrontend?: boolean;\n};\n\nexport interface DatabaseOptions {\n databaseType?: \"postgres\";\n databaseName?: string;\n poolSize?: number;\n}\n\nexport default class CadenzaService {\n public static broker: SignalBroker;\n public static runner: GraphRunner;\n public static metaRunner: GraphRunner;\n public static registry: GraphRegistry;\n public static serviceRegistry: ServiceRegistry;\n protected static isBootstrapped = false;\n protected static serviceCreated = false;\n\n static bootstrap(): void {\n if (this.isBootstrapped) return;\n this.isBootstrapped = true;\n\n Cadenza.bootstrap();\n this.broker = Cadenza.broker;\n this.runner = Cadenza.runner;\n this.metaRunner = Cadenza.metaRunner;\n this.registry = Cadenza.registry;\n this.serviceRegistry = ServiceRegistry.instance;\n SignalController.instance;\n RestController.instance;\n SocketController.instance;\n console.log(\"BOOTSTRAPPED\");\n }\n\n protected static validateServiceName(serviceName: string) {\n if (serviceName.length > 100) {\n throw new Error(\"Service name must be less than 100 characters\");\n }\n\n if (serviceName.includes(\" \")) {\n throw new Error(\"Service name must not contain spaces\");\n }\n\n if (serviceName.includes(\".\")) {\n throw new Error(\"Service name must not contain dots\");\n }\n\n if (serviceName.includes(\"\\\\\")) {\n throw new Error(\"Service name must not contain backslashes\");\n }\n\n if (\n serviceName.charAt(0) !== serviceName.charAt(0).toUpperCase() &&\n serviceName.charAt(0) === serviceName.charAt(0).toLowerCase()\n ) {\n throw new Error(\"Service name must start with a capital letter\");\n }\n }\n\n protected static validateName(name: string): void {\n Cadenza.validateName(name);\n }\n\n public static get runStrategy() {\n return Cadenza.runStrategy;\n }\n\n public static setMode(mode: CadenzaMode) {\n Cadenza.setMode(mode);\n }\n\n static createDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ): DeputyTask {\n this.bootstrap();\n this.validateName(routineName);\n const name = `Deputy task for: ${routineName}`;\n\n options = {\n concurrency: 0,\n timeout: 0,\n register: true,\n isUnique: false,\n isMeta: false,\n isSubMeta: false,\n isHidden: false,\n getTagCallback: undefined,\n inputSchema: undefined,\n validateInputContext: false,\n outputSchema: undefined,\n validateOutputContext: false,\n retryCount: 0,\n retryDelay: 0,\n retryDelayMax: 0,\n retryDelayFactor: 1,\n ...options,\n };\n\n return new DeputyTask(\n name,\n routineName,\n serviceName,\n `Referencing routine in service: ${routineName} on service: ${serviceName}.`,\n options.concurrency,\n options.timeout,\n options.register,\n options.isUnique,\n options.isMeta,\n options.isSubMeta,\n options.isHidden,\n options.getTagCallback,\n options.inputSchema,\n options.validateInputContext,\n options.outputSchema,\n options.validateOutputContext,\n options.retryCount,\n options.retryDelay,\n options.retryDelayMax,\n options.retryDelayFactor,\n );\n }\n\n static createMetaDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ): DeputyTask {\n options.isMeta = true;\n return this.createDeputyTask(routineName, serviceName, options);\n }\n\n static createUniqueDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ) {\n options.isUnique = true;\n return this.createDeputyTask(routineName, serviceName, options);\n }\n\n static createUniqueMetaDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createUniqueDeputyTask(routineName, serviceName, options);\n }\n\n static createThrottledDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\n options: TaskOptions = {},\n ) {\n options.concurrency = 1;\n options.getTagCallback = throttledIdGetter;\n return this.createDeputyTask(routineName, serviceName, options);\n }\n\n static createMetaThrottledDeputyTask(\n routineName: string,\n serviceName: string | undefined = undefined,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createThrottledDeputyTask(\n routineName,\n serviceName,\n throttledIdGetter,\n options,\n );\n }\n\n static createSignalTransmissionTask(\n signalName: string,\n serviceName: string,\n options: TaskOptions = {},\n ): SignalTransmissionTask {\n this.bootstrap();\n Cadenza.validateName(signalName);\n Cadenza.validateName(serviceName);\n\n options = {\n concurrency: 0,\n timeout: 0,\n register: true,\n isUnique: false,\n isMeta: true,\n isSubMeta: false,\n isHidden: false,\n getTagCallback: undefined,\n inputSchema: undefined,\n validateInputContext: false,\n outputSchema: undefined,\n validateOutputContext: false,\n retryCount: 1,\n retryDelay: 0,\n retryDelayMax: 0,\n retryDelayFactor: 1,\n ...options,\n };\n\n options.isMeta = true;\n\n const name = `Transmission of signal: ${signalName}`;\n return new SignalTransmissionTask(\n name,\n signalName,\n serviceName,\n `Transmits signal ${signalName} to ${serviceName} service.`,\n options.concurrency,\n options.timeout,\n options.register,\n options.isUnique,\n options.isMeta,\n options.isSubMeta,\n options.isHidden,\n options.getTagCallback,\n options.inputSchema,\n options.validateInputContext,\n options.outputSchema,\n options.validateOutputContext,\n options.retryCount,\n options.retryDelay,\n options.retryDelayMax,\n options.retryDelayFactor,\n );\n }\n\n static createDatabaseTask(\n tableName: string,\n operation: DbOperationType,\n databaseServiceName: string | undefined = undefined,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n this.bootstrap();\n Cadenza.validateName(tableName);\n Cadenza.validateName(operation);\n const tableNameFormatted = tableName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n const name = `${operation} ${tableName} in ${databaseServiceName ?? \"default database service\"}`;\n const description = `Executes a ${operation} on table ${tableName} in ${databaseServiceName ?? \"default database service\"}`;\n const taskName = `db${operation.charAt(0).toUpperCase() + operation.slice(1)}${tableNameFormatted}`;\n\n options = {\n concurrency: 0,\n timeout: 0,\n register: true,\n isUnique: false,\n isMeta: false,\n isSubMeta: false,\n isHidden: false,\n getTagCallback: undefined,\n inputSchema: undefined,\n validateInputContext: false,\n outputSchema: undefined,\n validateOutputContext: false,\n retryCount: 3,\n retryDelay: 100,\n retryDelayMax: 0,\n retryDelayFactor: 1,\n ...options,\n };\n\n return new DatabaseTask(\n name,\n taskName,\n databaseServiceName,\n description,\n queryData,\n options.concurrency,\n options.timeout,\n options.register,\n options.isUnique,\n options.isMeta,\n options.isSubMeta,\n options.isHidden,\n options.getTagCallback,\n options.inputSchema,\n options.validateInputContext,\n options.outputSchema,\n options.validateOutputContext,\n options.retryCount,\n options.retryDelay,\n options.retryDelayMax,\n options.retryDelayFactor,\n );\n }\n\n static createDatabaseInsertTask(\n tableName: string,\n databaseServiceName: string | undefined = undefined,\n queryData: DbOperationPayload = {},\n options: TaskOptions = {},\n ) {\n return this.createDatabaseTask(\n tableName,\n \"insert\",\n databaseServiceName,\n queryData,\n options,\n );\n }\n\n static createDatabaseQueryTask(\n tableName: string,\n databaseServiceName: string | undefined = undefined,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n return this.createDatabaseTask(\n tableName,\n \"query\",\n databaseServiceName,\n queryData,\n options,\n );\n }\n\n static createCadenzaDBTask(\n tableName: string,\n operation: DbOperationType,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createDatabaseTask(\n tableName,\n operation,\n \"CadenzaDB\",\n queryData,\n options,\n );\n }\n\n static createCadenzaDBInsertTask(\n tableName: string,\n queryData: DbOperationPayload = {},\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createDatabaseInsertTask(\n tableName,\n \"CadenzaDB\",\n queryData,\n options,\n );\n }\n\n static createCadenzaDBQueryTask(\n tableName: string,\n queryData: DbOperationPayload,\n options: TaskOptions = {},\n ) {\n options.isMeta = true;\n return this.createDatabaseQueryTask(\n tableName,\n \"CadenzaDB\",\n queryData,\n options,\n );\n }\n\n /**\n * Creates a MetaTask (for meta-layer graphs) and registers it.\n * MetaTasks suppress further meta-signal emissions to prevent loops.\n * @param serviceName Unique identifier for the meta-task.\n * @param description Optional description.\n * @param options Optional service options. A service can either be connected to a database service and/or a list of related services.\n * Example RELATED_SERVICES=serviceId123,service1,http://address:port | serviceId124,service2,http://address:port\n * @returns The created MetaTask instance.\n * @throws Error if name invalid or duplicate.\n */\n static createCadenzaService(\n serviceName: string,\n description: string = \"\",\n options: ServerOptions = {},\n ) {\n if (this.serviceCreated) return;\n this.bootstrap();\n Cadenza.validateName(serviceName);\n this.validateServiceName(serviceName);\n\n const serviceId = options.customServiceId ?? uuid();\n this.serviceRegistry.serviceName = serviceName;\n this.serviceRegistry.serviceInstanceId = serviceId;\n\n options = {\n loadBalance: true,\n useSocket: true,\n displayName: undefined,\n isMeta: false,\n port: parseInt(process.env.HTTP_PORT ?? \"3000\"),\n securityProfile:\n (process.env.SECURITY_PROFILE as SecurityProfile) ?? \"medium\",\n networkMode: (process.env.NETWORK_MODE as NetworkMode) ?? \"dev\",\n retryCount: 3,\n cadenzaDB: {\n connect: true,\n address: process.env.CADENZA_DB_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.CADENZA_DB_PORT ?? \"5000\"),\n },\n relatedServices: process.env.RELATED_SERVICES\n ? process.env.RELATED_SERVICES.split(\"|\").map((s) =>\n s.trim().split(\",\"),\n )\n : [],\n isFrontend: isBrowser,\n ...options,\n };\n\n if (options.cadenzaDB?.connect) {\n Cadenza.broker.emit(\"meta.initializing_service\", {\n // Seed the CadenzaDB\n serviceInstance: {\n uuid: \"cadenza-db\",\n serviceName: \"CadenzaDB\",\n address: options.cadenzaDB?.address,\n port: options.cadenzaDB?.port,\n exposed: options.networkMode !== \"dev\",\n numberOfRunningGraphs: 0,\n isActive: true, // Assume it is deployed\n isNonResponsive: false,\n isBlocked: false,\n health: {},\n },\n });\n }\n\n options.relatedServices?.forEach((service) => {\n Cadenza.broker.emit(\"meta.initializing_service\", {\n serviceInstance: {\n uuid: service[0],\n serviceName: service[1],\n address: service[2].split(\":\")[0],\n port: service[2].split(\":\")[1] ?? 3000,\n exposed: options.networkMode !== \"dev\",\n numberOfRunningGraphs: 0,\n isActive: true, // Assume it is deployed\n isNonResponsive: false,\n isBlocked: false,\n health: {},\n },\n });\n });\n\n console.log(\"Creating service...\");\n\n const initContext = {\n data: {\n name: serviceName,\n description: description,\n displayName: options.displayName ?? \"\",\n isMeta: options.isMeta,\n },\n __serviceName: serviceName,\n __serviceInstanceId: serviceId,\n __port: options.port,\n __loadBalance: options.loadBalance,\n __useSocket: options.useSocket,\n __securityProfile: options.securityProfile,\n __networkMode: options.networkMode,\n __retryCount: options.retryCount,\n __cadenzaDBConnect: options.cadenzaDB?.connect,\n __isDatabase: options.isDatabase,\n };\n\n if (options.cadenzaDB?.connect) {\n Cadenza.createEphemeralMetaTask(\"Create service\", async (_, emit) => {\n emit(\"meta.create_service_requested\", initContext);\n }).doOn(\"meta.fetch.handshake_complete\");\n } else {\n Cadenza.broker.emit(\"meta.create_service_requested\", initContext);\n }\n\n this.createEphemeralMetaTask(\"Handle service setup completion\", () => {\n GraphMetadataController.instance;\n GraphSyncController.instance;\n setTimeout(() => {\n // delayed sync\n this.broker.emit(\"meta.sync_requested\", {});\n }, 2000);\n\n if (options.cadenzaDB?.connect) {\n setInterval(() => {\n this.broker.emit(\"meta.sync_requested\", {});\n }, 300000);\n }\n\n return true;\n }).doOn(\"meta.service_registry.instance_inserted\");\n\n this.serviceCreated = true;\n }\n\n static createCadenzaMetaService(\n serviceName: string,\n description: string,\n options: ServerOptions = {},\n ) {\n options.isMeta = true;\n this.createCadenzaService(serviceName, description, options);\n }\n\n static createDatabaseService(\n name: string,\n schema: SchemaDefinition,\n description: string = \"\",\n options: ServerOptions & DatabaseOptions = {},\n ) {\n if (isBrowser) {\n console.warn(\n \"Database service creation is not supported in the browser. Use the CadenzaDB service instead.\",\n );\n return;\n }\n if (this.serviceCreated) return;\n this.bootstrap();\n this.serviceRegistry.serviceName = name;\n DatabaseController.instance; // Ensure DB controller is created\n\n options = {\n loadBalance: true,\n useSocket: true,\n displayName: undefined,\n isMeta: false,\n port: parseInt(process.env.HTTP_PORT ?? \"3000\"),\n securityProfile:\n (process.env.SECURITY_PROFILE as SecurityProfile) ?? \"medium\",\n networkMode: (process.env.NETWORK_MODE as NetworkMode) ?? \"dev\",\n retryCount: 3,\n cadenzaDB: {\n connect: true,\n address: process.env.CADENZA_DB_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.CADENZA_DB_PORT ?? \"5000\"),\n },\n databaseType: \"postgres\",\n databaseName: snakeCase(name),\n poolSize: parseInt(process.env.DATABASE_POOL_SIZE ?? \"10\"),\n isDatabase: true,\n ...options,\n };\n\n Cadenza.broker.emit(\"meta.database_init_requested\", {\n schema,\n databaseName: options.databaseName,\n options,\n });\n\n Cadenza.createEphemeralMetaTask(\"Set database connection\", () => {\n console.log(\"Database service created\");\n if (options.cadenzaDB?.connect) {\n Cadenza.createEphemeralMetaTask(\n \"Insert database service\",\n (_, emit) => {\n emit(\"meta.created_database_service\", {\n data: {\n service_name: name,\n description,\n schema,\n is_meta: options.isMeta,\n },\n });\n },\n ).doOn(\"meta.service_registry.service_inserted\");\n } else {\n Cadenza.broker.emit(\"meta.created_database_service\", {\n data: {\n service_name: name,\n description,\n schema,\n is_meta: options.isMeta,\n },\n });\n }\n\n this.createCadenzaService(name, description, options);\n }).doOn(\"meta.database.setup_done\");\n }\n\n static createMetaDatabaseService(\n name: string,\n schema: SchemaDefinition,\n description: string = \"\",\n options: ServerOptions & DatabaseOptions = {},\n ) {\n this.bootstrap();\n options.isMeta = true;\n this.createDatabaseService(name, schema, description, options);\n }\n\n /**\n * Creates a standard Task and registers it in the GraphRegistry.\n * @param name Unique identifier for the task.\n * @param func The function or async generator to execute.\n * @param description Optional human-readable description for introspection.\n * @param options Optional task options.\n * @returns The created Task instance.\n * @throws Error if name is invalid or duplicate in registry.\n */\n static createTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createTask(name, func, description, options);\n }\n\n /**\n * Creates a MetaTask (for meta-layer graphs) and registers it.\n * MetaTasks suppress further meta-signal emissions to prevent loops.\n * @param name Unique identifier for the meta-task.\n * @param func The function or async generator to execute.\n * @param description Optional description.\n * @param options Optional task options.\n * @returns The created MetaTask instance.\n * @throws Error if name invalid or duplicate.\n */\n static createMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createMetaTask(name, func, description, options);\n }\n\n /**\n * Creates a UniqueTask (executes once per execution ID, merging parents) and registers it.\n * Use for fan-in/joins after parallel branches.\n * @param name Unique identifier.\n * @param func Function receiving joinedContexts.\n * @param description Optional description.\n * @param options Optional task options.\n * @returns The created UniqueTask.\n * @throws Error if invalid.\n */\n static createUniqueTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createUniqueTask(name, func, description, options);\n }\n\n /**\n * Creates a UniqueMetaTask for meta-layer joins.\n * @param name Unique identifier.\n * @param func Function.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created UniqueMetaTask.\n */\n static createUniqueMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createUniqueMetaTask(name, func, description, options);\n }\n\n /**\n * Creates a ThrottledTask (rate-limited by concurrency or custom groups) and registers it.\n * @param name Unique identifier.\n * @param func Function.\n * @param throttledIdGetter Optional getter for dynamic grouping (e.g., per-user).\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created ThrottledTask.\n * @edge If no getter, throttles per task ID; use for resource protection.\n */\n static createThrottledTask(\n name: string,\n func: TaskFunction,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createThrottledTask(\n name,\n func,\n throttledIdGetter,\n description,\n options,\n );\n }\n\n /**\n * Creates a ThrottledMetaTask for meta-layer throttling.\n * @param name Identifier.\n * @param func Function.\n * @param throttledIdGetter Optional getter.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created ThrottledMetaTask.\n */\n static createThrottledMetaTask(\n name: string,\n func: TaskFunction,\n throttledIdGetter: ThrottleTagGetter,\n description?: string,\n options: TaskOptions = {},\n ): Task {\n this.bootstrap();\n return Cadenza.createThrottledMetaTask(\n name,\n func,\n throttledIdGetter,\n description,\n options,\n );\n }\n\n /**\n * Creates a DebounceTask (delays exec until quiet period) and registers it.\n * @param name Identifier.\n * @param func Function.\n * @param description Optional.\n * @param debounceTime Delay in ms (default 1000).\n * @param options Optional task options plus optional debounce config (e.g., leading/trailing).\n * @returns The created DebounceTask.\n * @edge Multiple triggers within time collapse to one exec.\n */\n static createDebounceTask(\n name: string,\n func: TaskFunction,\n description?: string,\n debounceTime: number = 1000,\n options: TaskOptions & DebounceOptions = {},\n ): DebounceTask {\n this.bootstrap();\n return Cadenza.createDebounceTask(\n name,\n func,\n description,\n debounceTime,\n options,\n );\n }\n\n /**\n * Creates a DebouncedMetaTask for meta-layer debouncing.\n * @param name Identifier.\n * @param func Function.\n * @param description Optional.\n * @param debounceTime Delay in ms.\n * @param options Optional task options plus optional debounce config (e.g., leading/trailing).\n * @returns The created DebouncedMetaTask.\n */\n static createDebounceMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n debounceTime: number = 1000,\n options: TaskOptions & DebounceOptions = {},\n ): DebounceTask {\n this.bootstrap();\n return Cadenza.createDebounceMetaTask(\n name,\n func,\n description,\n debounceTime,\n options,\n );\n }\n\n /**\n * Creates an EphemeralTask (self-destructs after exec or condition) without default registration.\n * Useful for transients; optionally register if needed.\n * @param name Identifier (may not be unique if not registered).\n * @param func Function.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created EphemeralTask.\n * @edge Destruction triggered post-exec via Node/Builder; emits meta-signal for cleanup.\n */\n static createEphemeralTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions & EphemeralTaskOptions = {},\n ): EphemeralTask {\n this.bootstrap();\n return Cadenza.createEphemeralTask(name, func, description, options);\n }\n\n /**\n * Creates an EphemeralMetaTask for meta-layer transients.\n * @param name Identifier.\n * @param func Function.\n * @param description Optional.\n * @param options Optional task options.\n * @returns The created EphemeralMetaTask.\n */\n static createEphemeralMetaTask(\n name: string,\n func: TaskFunction,\n description?: string,\n options: TaskOptions & EphemeralTaskOptions = {},\n ): EphemeralTask {\n this.bootstrap();\n return Cadenza.createEphemeralMetaTask(name, func, description, options);\n }\n\n /**\n * Creates a GraphRoutine (named entry to starting tasks) and registers it.\n * @param name Unique identifier.\n * @param tasks Starting tasks (can be empty, but warns as no-op).\n * @param description Optional.\n * @returns The created GraphRoutine.\n * @edge If tasks empty, routine is valid but inert.\n */\n static createRoutine(\n name: string,\n tasks: Task[],\n description: string = \"\",\n ): GraphRoutine {\n this.bootstrap();\n return Cadenza.createRoutine(name, tasks, description);\n }\n\n /**\n * Creates a MetaRoutine for meta-layer entry points.\n * @param name Identifier.\n * @param tasks Starting tasks.\n * @param description Optional.\n * @returns The created MetaRoutine.\n */\n static createMetaRoutine(\n name: string,\n tasks: Task[],\n description: string = \"\",\n ): GraphRoutine {\n this.bootstrap();\n return Cadenza.createMetaRoutine(name, tasks, description);\n }\n\n static reset() {\n Cadenza.reset();\n this.serviceRegistry.reset();\n }\n}\n","import { v4 as uuid } from \"uuid\";\nimport { GraphContext, Task } from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n SchemaDefinition,\n TaskResult,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport Cadenza from \"../../Cadenza\";\n\nexport default class DeputyTask extends Task {\n readonly isDeputy: boolean = true;\n\n protected readonly remoteRoutineName: string;\n protected serviceName: string | undefined;\n\n /**\n * Constructs a DeputyTask as a proxy for triggering a remote flow.\n * @param name - The local name of the DeputyTask.\n * @param remoteRoutineName - The name of the remote routine or task to trigger.\n * @param serviceName - The target service name (optional, defaults to local service if undefined).\n * @param description - A description of the task's purpose (default: '').\n * @param concurrency - The maximum number of concurrent executions (default: 0, unlimited).\n * @param timeout - Timeout in milliseconds (default: 0, handled by engine).\n * @param register - Whether to register the task in the registry (default: true).\n * @param isUnique - Whether to create a unique task (default: false). A unique task will only be executed once per execution ID, merging parents.\n * @param isMeta - Whether to create a meta task (default: false). A meta task is separate from the user logic and is only used for monitoring, optimization, and feature extensions.\n * @param isSubMeta\n * @param isHidden\n * @param getTagCallback - Callback for dynamic tagging, e.g., 'return \"default\"'.\n * @param inputSchema - Input schema definition.\n * @param validateInputContext - Whether to validate the input context (default: false).\n * @param outputSchema - Output schema definition.\n * @param validateOutputContext - Whether to validate the output context (default: false).\n * @param retryCount\n * @param retryDelay\n * @param retryDelayMax\n * @param retryDelayFactor\n * @emits {meta.deputy.delegation_requested} - Emitted on construction with task and service details.\n * @note Fallbacks should be handled externally via `.doOnFail`; timeouts are managed by the engine.\n */\n constructor(\n name: string,\n remoteRoutineName: string,\n serviceName: string | undefined = undefined,\n description: string = \"\",\n concurrency: number = 0,\n timeout: number = 0,\n register: boolean = true,\n isUnique: boolean = false,\n isMeta: boolean = false,\n isSubMeta: boolean = false,\n isHidden: boolean = false,\n getTagCallback: ThrottleTagGetter | undefined = undefined,\n inputSchema: SchemaDefinition | undefined = undefined,\n validateInputContext: boolean = false,\n outputSchema: SchemaDefinition | undefined = undefined,\n validateOutputContext: boolean = false,\n retryCount: number = 0,\n retryDelay: number = 0,\n retryDelayMax: number = 0,\n retryDelayFactor: number = 1,\n ) {\n const taskFunction = (\n context: AnyObject,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n ): Promise<TaskResult> => {\n return new Promise((resolve, reject) => {\n if (context.__metadata.__blockRemoteExecution) {\n reject(new Error(\"Blocked remote execution\"));\n return;\n }\n\n if (context.__metadata.__skipRemoteExecution) {\n resolve(true);\n return;\n }\n\n const processId = uuid();\n\n context.__metadata.__deputyExecId = processId;\n emit(\"meta.deputy.delegation_requested\", {\n ...context,\n });\n\n // Ephemeral meta-task for progress\n Cadenza.createEphemeralMetaTask(\n `On progress deputy ${this.remoteRoutineName}`,\n (ctx) => {\n if (ctx.progress) progressCallback(ctx.progress * ctx.weight);\n },\n `Ephemeral task for deputy process ${processId}`,\n {\n once: false,\n destroyCondition: (ctx: AnyObject) =>\n ctx.progress === 1 || ctx.progress === undefined,\n register: false,\n },\n ).doOn(\n `meta.socket_client.delegation_progress:${processId}`,\n `meta.socket_client.delegated:${processId}`,\n `meta.fetch.delegated:${processId}`,\n `meta.service_registry.load_balance_failed:${processId}`,\n );\n\n // Ephemeral meta-task for resolution\n Cadenza.createEphemeralMetaTask(\n `Resolve deputy ${this.remoteRoutineName}`,\n (responseCtx) => {\n console.log(\"resolve deputy\", responseCtx);\n if (responseCtx?.errored) {\n reject(new Error(responseCtx.__error));\n } else {\n // TODO clean up metadata\n delete responseCtx.__isDeputy;\n resolve(responseCtx);\n }\n },\n `Ephemeral resolver for deputy process ${processId}`,\n { register: false },\n ).doOn(\n `meta.socket_client.delegated:${processId}`,\n `meta.fetch.delegated:${processId}`,\n `meta.service_registry.load_balance_failed:${processId}`,\n );\n });\n };\n\n super(\n name,\n taskFunction,\n description,\n concurrency,\n timeout,\n register,\n isUnique,\n isMeta,\n isSubMeta,\n isHidden,\n getTagCallback,\n inputSchema,\n validateInputContext,\n outputSchema,\n validateOutputContext,\n retryCount,\n retryDelay,\n retryDelayMax,\n retryDelayFactor,\n );\n\n this.remoteRoutineName = remoteRoutineName;\n this.serviceName = serviceName;\n\n this.emit(\"meta.deputy.created\", {\n localTaskName: this.name,\n localTaskVersion: this.version,\n remoteRoutineName: this.remoteRoutineName,\n serviceName: this.serviceName,\n communicationType: \"delegation\",\n });\n }\n\n /**\n * Triggers the delegation flow via a signal to the meta-layer.\n * @param context - The GraphContext containing execution data.\n * @param emit\n * @param progressCallback - Callback to update progress (invoked by meta-layer).\n * @param nodeData\n * @returns A Promise resolving with the task result or rejecting on error.\n * @emits {meta.deputy.executed} - Emitted with context to initiate delegation.\n * @edge Engine handles timeout and error, triggering `.doOnFail` if chained.\n * @note The resolution and progress are managed by ephemeral meta-tasks.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n nodeData: { nodeId: string; routineExecId: string },\n ): TaskResult {\n const ctx = context.getContext();\n const metadata = context.getMetadata();\n\n const deputyContext = {\n __localTaskName: this.name,\n __localTaskVersion: this.version,\n __localServiceName: Cadenza.serviceRegistry.serviceName,\n __previousTaskExecutionId: nodeData.nodeId,\n __remoteRoutineName: this.remoteRoutineName,\n __serviceName: this.serviceName,\n __localRoutineExecId:\n metadata.__routineExecId ?? metadata.__metadata?.__routineExecId,\n __executionTraceId: metadata.__executionTraceId ?? null,\n __metadata: {\n ...metadata,\n __deputyTaskName: this.name,\n },\n ...ctx,\n };\n\n return this.taskFunction(deputyContext, emit, progressCallback);\n }\n}\n","import DeputyTask from \"./DeputyTask\";\nimport { GraphContext } from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n SchemaDefinition,\n TaskResult,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport { DbOperationPayload } from \"../../types/queryData\";\nimport Cadenza from \"../../Cadenza\";\n\nexport default class DatabaseTask extends DeputyTask {\n private readonly queryData: DbOperationPayload;\n\n /**\n * Constructs a DatabaseTask to execute a database operation on a remote service.\n * @param name - The local name of the DatabaseTask.\n * @param taskName - The name of the database operation task to trigger (e.g., 'dbQueryTaskExecution').\n * @param serviceName - The target database service name (optional, defaults to 'DatabaseService').\n * @param description - A description of the task's purpose (default: '').\n * @param queryData - The query data object containing operation details (e.g., { __operation: 'query', __table: 'users' }).\n * @param concurrency - The maximum number of concurrent executions (default: 0, unlimited).\n * @param timeout - Timeout in milliseconds (default: 0, handled by engine).\n * @param register - Whether to register the task in the registry (default: true).\n * @param isUnique\n * @param isMeta\n * @param isSubMeta\n * @param isHidden\n * @param getTagCallback - Callback for dynamic tagging, e.g., 'return \"default\"'.\n * @param inputSchema - Input schema definition.\n * @param validateInputContext - Whether to validate the input context (default: false).\n * @param outputSchema - Output schema definition.\n * @param validateOutputContext - Whether to validate the output context (default: false).\n * @param retryCount\n * @param retryDelay\n * @param retryDelayMax\n * @param retryDelayFactor\n * @emits {meta.deputy.created} - Emitted on construction with task and service details.\n * @note Fallbacks via `.doOnFail` externally; timeouts managed by the engine.\n */\n constructor(\n name: string,\n taskName: string,\n serviceName: string | undefined = undefined,\n description: string = \"\",\n queryData: DbOperationPayload,\n concurrency: number = 0,\n timeout: number = 0,\n register: boolean = true,\n isUnique: boolean = false,\n isMeta: boolean = false,\n isSubMeta: boolean = false,\n isHidden: boolean = false,\n getTagCallback: ThrottleTagGetter | undefined = undefined,\n inputSchema: SchemaDefinition | undefined = undefined,\n validateInputContext: boolean = false,\n outputSchema: SchemaDefinition | undefined = undefined,\n validateOutputContext: boolean = false,\n retryCount: number = 0,\n retryDelay: number = 0,\n retryDelayMax: number = 0,\n retryDelayFactor: number = 1,\n ) {\n super(\n name,\n taskName,\n serviceName,\n description,\n concurrency,\n timeout,\n register,\n isUnique,\n isMeta,\n isSubMeta,\n isHidden,\n getTagCallback,\n inputSchema,\n validateInputContext,\n outputSchema,\n validateOutputContext,\n retryCount,\n retryDelay,\n retryDelayMax,\n retryDelayFactor,\n );\n this.queryData = queryData;\n }\n\n /**\n * Triggers the database operation delegation flow via a signal to the meta-layer.\n * @param context - The GraphContext containing execution data.\n * @param emit\n * @param progressCallback - Callback to update progress (invoked by meta-layer).\n * @param nodeData\n * @returns A Promise resolving with the task result or rejecting on error.\n * @emits {meta.deputy.executed} - Emitted with context including queryData to initiate delegation.\n * @edge Engine handles timeout and error, triggering `.doOnFail` if chained.\n * @note The resolution and progress are managed by ephemeral meta-tasks.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n nodeData: { nodeId: string; routineExecId: string },\n ): TaskResult {\n const ctx = context.getContext();\n const metadata = context.getMetadata();\n const dynamicQueryData = ctx.queryData ?? {};\n delete ctx.queryData;\n\n const deputyContext = {\n __localTaskName: this.name,\n __localTaskVersion: this.version,\n __localServiceName: Cadenza.serviceRegistry.serviceName,\n __previousTaskExecutionId: nodeData.nodeId,\n __remoteRoutineName: this.remoteRoutineName,\n __serviceName: this.serviceName,\n __executionTraceId: metadata.__executionTraceId ?? null,\n __localRoutineExecId:\n metadata.__routineExecId ?? metadata.__metadata?.__routineExecId,\n __metadata: {\n ...metadata,\n __deputyTaskName: this.name,\n },\n queryData: {\n ...this.queryData,\n data: {\n ...ctx.data,\n },\n ...dynamicQueryData,\n },\n };\n\n return this.taskFunction(deputyContext, emit, progressCallback);\n }\n}\n","export const isNode =\n typeof process !== \"undefined\" && process.versions?.node != null;\n\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n","import { Task } from \"@cadenza.io/core\";\nimport type { AnyObject } from \"@cadenza.io/core\";\nimport Cadenza from \"../Cadenza\";\nimport { isBrowser } from \"../utils/environment\";\n\nexport interface ServiceInstanceDescriptor {\n uuid: string;\n address: string;\n port: number;\n serviceName: string;\n numberOfRunningGraphs?: number;\n isPrimary: boolean;\n isActive: boolean;\n isNonResponsive: boolean;\n isBlocked: boolean;\n health: AnyObject;\n exposed: boolean;\n clientCreated?: boolean;\n isFrontend: boolean;\n}\n\nexport interface DeputyDescriptor {\n serviceName: string;\n remoteRoutineName?: string;\n signalName?: string;\n localTaskName: string;\n communicationType: string;\n}\n\nexport interface RemoteSignalDescriptor {\n __listenerServiceName: string;\n __emitterSignalName: string;\n __remoteServiceName: string;\n}\n\nexport default class ServiceRegistry {\n private static _instance: ServiceRegistry;\n public static get instance(): ServiceRegistry {\n if (!this._instance) this._instance = new ServiceRegistry();\n return this._instance;\n }\n\n private instances: Map<string, ServiceInstanceDescriptor[]> = new Map();\n private deputies: Map<string, DeputyDescriptor[]> = new Map();\n private remoteSignals: Map<string, RemoteSignalDescriptor[]> = new Map();\n serviceName: string | null = null;\n serviceInstanceId: string | null = null;\n numberOfRunningGraphs: number = 0;\n useSocket: boolean = false;\n retryCount: number = 3;\n\n handleInstanceUpdateTask: Task;\n handleRemoteSignalRegistrationTask: Task;\n getRemoteSignalsTask: Task;\n handleSocketStatusUpdateTask: Task;\n fullSyncTask: Task;\n getAllInstances: Task;\n doForEachInstance: Task;\n deleteInstance: Task;\n getBalancedInstance: Task;\n getInstanceById: Task;\n getInstancesByServiceName: Task;\n handleDeputyRegistrationTask: Task;\n getStatusTask: Task;\n insertServiceTask: Task;\n insertServiceInstanceTask: Task;\n handleServiceNotRespondingTask: Task;\n handleServiceHandshakeTask: Task;\n\n private constructor() {\n this.handleInstanceUpdateTask = Cadenza.createMetaTask(\n \"Handle Instance Update\",\n (ctx, emit) => {\n const { serviceInstance } = ctx;\n const { uuid, serviceName, address, port, exposed, isFrontend } =\n serviceInstance;\n if (uuid === this.serviceInstanceId) return;\n\n if (!this.instances.has(serviceName))\n this.instances.set(serviceName, []);\n const instances = this.instances.get(serviceName)!;\n const existing = instances.find((i) => i.uuid === uuid);\n\n if (existing) {\n Object.assign(existing, serviceInstance); // Update\n } else {\n if (\n (!isFrontend && this.deputies.has(serviceName)) ||\n this.remoteSignals.has(serviceName) ||\n (this.remoteSignals.has(\"*\") && this.serviceName !== serviceName)\n ) {\n const clientCreated = instances?.some(\n (i) =>\n i.address === address &&\n i.port === port &&\n i.clientCreated &&\n i.isActive,\n );\n\n if (!clientCreated) {\n try {\n const communicationTypes = Array.from(\n new Set(\n this.deputies\n .get(serviceName)\n ?.map((d) => d.communicationType) ?? [],\n ),\n );\n\n if (\n !communicationTypes.includes(\"signal\") &&\n (this.remoteSignals.has(serviceName) ||\n this.remoteSignals.has(\"*\"))\n ) {\n communicationTypes.push(\"signal\");\n }\n\n emit(\"meta.service_registry.dependee_registered\", {\n serviceName: serviceName,\n serviceInstanceId: uuid,\n serviceAddress: address,\n servicePort: port,\n protocol: exposed ? \"https\" : \"http\",\n communicationTypes,\n });\n\n for (const instance of this.instances.get(serviceName)!) {\n if (instance.clientCreated) continue;\n instance.clientCreated = true;\n emit(\"meta.service_registry.dependee_registered\", {\n serviceName: serviceName,\n serviceInstanceId: uuid,\n serviceAddress: address,\n servicePort: port,\n protocol: exposed ? \"https\" : \"http\",\n communicationTypes,\n });\n }\n } catch (e) {\n console.error(\"Error in dependee registration\", e);\n }\n }\n }\n\n serviceInstance.clientCreated = true;\n instances.push(serviceInstance); // Insert\n }\n\n return true;\n },\n \"Handles instance updates to service instances\",\n )\n .emits(\"meta.service_registry.service_discovered\")\n .doOn(\n \"meta.initializing_service\",\n \"CadenzaDB.meta.service_instance.inserted\",\n \"CadenzaDB.meta.service_instance.updated\",\n \"meta.service_instance.inserted\",\n \"meta.service_instance.updated\",\n \"meta.socket_client.status_received\",\n );\n\n this.handleRemoteSignalRegistrationTask = Cadenza.createMetaTask(\n \"Handle Remote Signal Registration\",\n (ctx) => {\n const {\n __remoteServiceName,\n __emitterSignalName,\n __listenerServiceName,\n } = ctx;\n let remoteSignals = this.remoteSignals.get(__remoteServiceName);\n if (!remoteSignals) {\n this.remoteSignals.set(__remoteServiceName, []);\n remoteSignals = this.remoteSignals.get(__remoteServiceName);\n }\n\n if (\n remoteSignals &&\n remoteSignals.findIndex(\n (s) => s.__emitterSignalName === __emitterSignalName,\n ) === -1\n ) {\n remoteSignals.push({\n __listenerServiceName,\n __emitterSignalName,\n __remoteServiceName,\n });\n return true;\n }\n\n return false;\n },\n \"Handles registration of remote signals\",\n );\n\n this.getRemoteSignalsTask = Cadenza.createMetaTask(\n \"Get remote signals\",\n (ctx) => {\n const { serviceName } = ctx;\n let remoteSignals = this.remoteSignals.get(serviceName) ?? [];\n remoteSignals = remoteSignals.concat(this.remoteSignals.get(\"*\") ?? []);\n\n return {\n remoteSignals: remoteSignals,\n ...ctx,\n };\n },\n \"Gets remote signals\",\n ).doOn(\n \"meta.register_remote_signals_requested\",\n \"meta.fetch.handshake_complete\",\n );\n\n this.handleServiceNotRespondingTask = Cadenza.createMetaTask(\n \"Handle service not responding\",\n (ctx, emit) => {\n const { serviceName, serviceAddress, servicePort } = ctx;\n const serviceInstances = this.instances.get(serviceName);\n const instances = serviceInstances?.filter(\n (i) => i.address === serviceAddress && i.port === servicePort,\n );\n console.log(\n \"Service not responding\",\n serviceAddress,\n servicePort,\n instances,\n );\n\n for (const instance of instances ?? []) {\n instance.isActive = false;\n instance.isNonResponsive = true;\n instance.clientCreated = false;\n emit(\"meta.service_registry.service_not_responding\", {\n data: {\n isActive: false,\n isNonResponsive: true,\n },\n filter: {\n uuid: instance.uuid,\n },\n });\n }\n return true;\n },\n \"Handles service not responding\",\n ).doOn(\"meta.fetch.handshake_failed\", \"meta.socket_client.disconnected.*\");\n\n this.handleServiceHandshakeTask = Cadenza.createMetaTask(\n \"Handle service handshake\",\n (ctx, emit) => {\n const { serviceName, serviceAddress, servicePort, serviceInstanceId } =\n ctx;\n console.log(\n \"SERVICE HANDSHAKE\",\n serviceName,\n serviceAddress,\n servicePort,\n serviceInstanceId,\n this.instances.get(serviceName),\n );\n const serviceInstances = this.instances.get(serviceName);\n const instances = serviceInstances?.filter(\n (i) => i.address === serviceAddress && i.port === servicePort,\n );\n for (const instance of instances ?? []) {\n // instance.isActive = serviceInstanceId === instance.uuid; // TODO cadenza-db will be deactivated by this.\n // instance.isNonResponsive = serviceInstanceId !== instance.uuid;\n emit(\"meta.service_registry.service_handshake\", {\n data: {\n isActive: instance.isActive,\n isNonResponsive: instance.isNonResponsive,\n },\n filter: {\n uuid: instance.uuid,\n },\n });\n }\n return true;\n },\n \"Handles service handshake\",\n ).doOn(\"meta.fetch.handshake_complete\");\n\n this.handleSocketStatusUpdateTask = Cadenza.createMetaTask(\n \"Handle Socket Status Update\",\n (ctx) => {\n const instanceId = ctx.__serviceInstanceId;\n const serviceName = ctx.__serviceName;\n const instances = this.instances.get(serviceName);\n const instance = instances?.find((i) => i.uuid === instanceId);\n if (instance) {\n instance.health = ctx.health;\n instance.numberOfRunningGraphs = ctx.numberOfRunningGraphs;\n }\n return true;\n },\n \"Handles status update from socket broadcast\",\n ).doOn(\"meta.socket_client.status_received\");\n\n this.fullSyncTask = Cadenza.createCadenzaDBQueryTask(\"service_instance\", {\n filter: {\n deleted: false,\n is_active: true,\n is_non_responsive: false,\n is_blocked: false,\n },\n fields: [\n \"uuid\",\n \"address\",\n \"port\",\n \"service_name\",\n \"is_active\",\n \"is_non_responsive\",\n \"is_blocked\",\n \"health\",\n \"exposed\",\n \"created\",\n \"is_frontend\",\n ],\n })\n .doOn(\"meta.sync_requested\")\n .emits(\"meta.service_registry.synced_instances\")\n .then(\n Cadenza.createMetaTask(\n \"Split service instances\",\n function* (ctx: AnyObject) {\n const { serviceInstances } = ctx;\n if (!serviceInstances) return;\n for (const serviceInstance of serviceInstances) {\n yield { serviceInstance };\n }\n },\n ).then(this.handleInstanceUpdateTask),\n );\n\n this.getInstanceById = Cadenza.createMetaTask(\n \"Get instance by id\",\n (context) => {\n const { __id } = context;\n let instance;\n for (const instances of this.instances.values()) {\n instance = instances.find((i) => i.uuid === __id);\n if (instance) break;\n }\n return { ...context, __instance: instance };\n },\n \"Gets instance by id.\",\n );\n\n this.getInstancesByServiceName = Cadenza.createMetaTask(\n \"Get instances by name\",\n (context) => {\n const { __serviceName } = context;\n const instances = this.instances.get(__serviceName);\n if (!instances) {\n return false;\n }\n\n return { ...context, __instances: instances };\n },\n \"Gets instances by name.\",\n );\n\n this.handleDeputyRegistrationTask = Cadenza.createMetaTask(\n \"Handle Deputy Registration\",\n (ctx, emit) => {\n const { serviceName } = ctx;\n\n if (!this.deputies.has(serviceName)) this.deputies.set(serviceName, []);\n\n this.deputies.get(serviceName)!.push({\n serviceName,\n remoteRoutineName: ctx.remoteRoutineName,\n signalName: ctx.signalName,\n localTaskName: ctx.localTaskName,\n communicationType: ctx.communicationType,\n });\n\n emit(\"meta.service_registry.deputy_registered\", ctx);\n },\n ).doOn(\"meta.deputy.created\");\n\n this.getAllInstances = Cadenza.createMetaTask(\n \"Get all instances\",\n (context) => ({\n ...context,\n __instances: Array.from(this.instances.values()).flat(),\n }),\n \"Gets all instances.\",\n );\n\n this.doForEachInstance = Cadenza.createMetaTask(\n \"Do for each instance\",\n function* (context: AnyObject) {\n // @ts-ignore\n for (const instances of this.instances.values()) {\n for (const instance of instances) {\n yield { ...context, __instance: instance };\n }\n }\n }.bind(this),\n \"Yields each instance for branching.\",\n );\n\n this.deleteInstance = Cadenza.createMetaTask(\n \"Delete instance\",\n (context) => {\n const { __id } = context;\n this.instances.delete(__id);\n return context;\n },\n \"Deletes instance.\",\n ).doOn(\"CadenzaDB.meta.service_instance.deleted\");\n\n this.getBalancedInstance = Cadenza.createMetaTask(\n \"Get balanced instance\",\n (context, emit) => {\n const { __serviceName, __triedInstances, __retries } = context;\n let retries = __retries ?? 0;\n let triedInstances = __triedInstances ?? [];\n\n const instances = this.instances\n .get(__serviceName)\n ?.filter((i) => i.isActive && !i.isNonResponsive && !i.isBlocked)\n .sort((a, b) => a.numberOfRunningGraphs! - b.numberOfRunningGraphs!);\n\n if (!instances || instances.length === 0 || retries > this.retryCount) {\n context.errored = true;\n context.__error = \"No active instances\";\n emit(\n `meta.service_registry.load_balance_failed:${context.__metadata.__deputyExecId}`,\n context,\n );\n return context;\n }\n\n // TODO: A way to specify if you want to send to all instances\n\n if (instances[0].isFrontend) {\n for (const instance of instances) {\n emit(\n `meta.service_registry.selected_instance_for_socket:${instance.address}`,\n context,\n );\n }\n\n return context;\n }\n\n let instancesToTry = instances.filter(\n (i) => !__triedInstances?.includes(i.uuid),\n );\n\n if (instancesToTry.length === 0) {\n if (this.useSocket) {\n emit(\n `meta.service_registry.socket_failed:${context.__fetchId}`,\n context,\n );\n }\n retries++;\n instancesToTry = instances;\n triedInstances = [];\n }\n\n let selected = instancesToTry[0];\n if (retries > 0) {\n selected =\n instancesToTry[Math.floor(Math.random() * instancesToTry.length)];\n }\n\n context.__instance = selected.uuid;\n context.__fetchId = `${selected.address}_${selected.port}`;\n context.__triedInstances = triedInstances;\n context.__triedInstances.push(selected.uuid);\n context.__retries = retries;\n\n if (this.useSocket) {\n emit(\n `meta.service_registry.selected_instance_for_socket:${context.__fetchId}`,\n context,\n );\n } else {\n emit(\n `meta.service_registry.selected_instance_for_fetch:${context.__fetchId}`,\n context,\n );\n }\n\n return context;\n },\n \"Gets a balanced instance for load balancing\",\n ).doOn(\n \"meta.deputy.delegation_requested\",\n \"meta.signal_transmission.requested\",\n \"meta.socket_client.delegate_failed\",\n \"meta.fetch.delegate_failed\",\n \"meta.socket_client.signal_transmission_failed\",\n );\n\n this.getStatusTask = Cadenza.createMetaTask(\"Get status\", (ctx) => {\n if (!this.serviceName) {\n return {\n __status: \"error\",\n __error: \"No service name defined\",\n errored: true,\n };\n }\n\n if (!this.serviceInstanceId) {\n return {\n __status: \"error\",\n __error: \"No service instance id defined\",\n errored: true,\n };\n }\n\n const self = this.instances\n .get(this.serviceName)\n ?.find((i) => i.uuid === this.serviceInstanceId);\n\n return {\n ...ctx,\n __status: \"ok\",\n __numberOfRunningGraphs: self?.numberOfRunningGraphs ?? 0,\n __health: self?.health ?? {},\n __active: self?.isActive ?? false,\n };\n }).doOn(\"meta.socket.status_check_requested\");\n\n this.insertServiceTask = Cadenza.createCadenzaDBInsertTask(\n \"service\",\n {\n onConflict: {\n target: [\"name\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n {\n // validateInputContext: true,\n inputSchema: {\n type: \"object\",\n properties: {\n data: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n },\n description: {\n type: \"string\",\n },\n display_name: {\n type: \"string\",\n },\n is_meta: {\n type: \"boolean\",\n },\n },\n required: [\"name\"],\n },\n },\n required: [\"data\"],\n },\n outputSchema: {\n type: \"object\",\n properties: {\n __serviceName: {\n type: \"string\",\n },\n },\n required: [\"__serviceName\"],\n },\n retryCount: 100,\n retryDelay: 10000,\n retryDelayMax: 60000,\n retryDelayFactor: 1.3,\n },\n )\n .then(\n Cadenza.createMetaTask(\n \"Set service name\",\n ({ __serviceName }) => {\n this.serviceName = __serviceName;\n return true;\n },\n \"Sets service name after insertion\",\n ),\n )\n .emits(\"meta.service_registry.service_inserted\")\n .emitsOnFail(\"meta.service_registry.service_insertion_failed\");\n\n this.insertServiceInstanceTask = Cadenza.createCadenzaDBInsertTask(\n \"serviceInstance\",\n {\n onConflict: {\n target: [\"address\", \"port\", \"process_pid\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n {\n inputSchema: {\n type: \"object\",\n properties: {\n uuid: {\n type: \"string\",\n },\n address: {\n type: \"string\",\n },\n port: {\n type: \"number\",\n },\n process_pid: {\n type: \"number\",\n },\n is_primary: {\n type: \"boolean\",\n },\n service_name: {\n type: \"string\",\n },\n is_active: {\n type: \"boolean\",\n },\n is_non_responsive: {\n type: \"boolean\",\n },\n is_blocked: {\n type: \"boolean\",\n },\n exposed: {\n type: \"boolean\",\n },\n },\n required: [\n \"id\",\n \"address\",\n \"port\",\n \"process_pid\",\n \"service_name\",\n \"exposed\",\n ],\n },\n // validateInputContext: true,\n outputSchema: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n },\n },\n required: [\"id\"],\n },\n // validateOutputContext: true,\n retryCount: 5,\n retryDelay: 1000,\n },\n )\n .doOn(\"meta.rest.network_configured\", \"meta.rest.browser_detected\")\n .then(\n Cadenza.createMetaTask(\n \"Setup service\",\n (ctx) => {\n const { serviceInstance, data, __useSocket, __retryCount } = ctx;\n this.serviceInstanceId = serviceInstance?.uuid ?? data?.uuid;\n this.instances.set(\n data?.service_name ?? serviceInstance?.service_name,\n [{ ...(serviceInstance ?? data) }],\n );\n this.useSocket = __useSocket;\n this.retryCount = __retryCount;\n console.log(\"SETUP SERVICE\", this.serviceInstanceId);\n return true;\n },\n \"Sets service instance id after insertion\",\n ).emits(\"meta.service_registry.instance_inserted\"),\n );\n\n Cadenza.createMetaTask(\n \"Handle service creation\",\n (ctx) => {\n if (!ctx.__cadenzaDBConnect) {\n ctx.__skipRemoteExecution = true;\n }\n\n console.log(\"service creation\", ctx);\n\n if (isBrowser) {\n Cadenza.createMetaTask(\"Prepare for signal sync\", () => {\n return {};\n })\n .doAfter(this.fullSyncTask)\n .then(\n Cadenza.createCadenzaDBQueryTask(\"signal_registry\", {\n fields: [\"name\", \"service_name\"],\n filter: {\n source_service_name: [ctx.__serviceName, \"*\"],\n },\n }).then(\n Cadenza.createMetaTask(\n \"Create signal transmission tasks\",\n (ctx, emit) => {\n const signalRegistry = ctx.signalRegistry;\n for (const signal of signalRegistry) {\n emit(\"meta.service_registry.foreign_signal_registered\", {\n __emitterSignalName: signal.name,\n __listenerServiceName: signal.serviceName,\n });\n }\n\n return true;\n },\n ).then(\n Cadenza.createMetaTask(\"Connect to services\", (ctx, emit) => {\n const services: string[] = Array.from(\n new Set(\n ctx.signalRegistry.map((s: any) => s.serviceName),\n ),\n );\n for (const service of services) {\n const instances = this.instances\n .get(service)!\n .filter((i) => i.isActive);\n for (const instance of instances) {\n if (instance.clientCreated) continue;\n const address = instance.address;\n const port = instance.port;\n\n const clientCreated = instances?.some(\n (i) =>\n i.address === address &&\n i.port === port &&\n i.clientCreated &&\n i.isActive,\n );\n\n if (!clientCreated) {\n emit(\"meta.service_registry.dependee_registered\", {\n serviceName: service,\n serviceInstanceId: instance.uuid,\n serviceAddress: address,\n servicePort: port,\n protocol: instance.exposed ? \"https\" : \"http\",\n communicationTypes: [\"signal\"],\n });\n }\n\n instance.clientCreated = true;\n instances.forEach((i) => {\n if (i.address === address && i.port === port) {\n i.clientCreated = true;\n }\n });\n }\n }\n return {};\n }),\n ),\n ),\n );\n }\n\n return ctx;\n },\n \"Handles the request to create a service instance\",\n )\n .doOn(\"meta.create_service_requested\")\n .then(this.insertServiceTask);\n }\n\n reset() {\n this.instances.clear();\n }\n}\n","import { GraphContext, Task } from \"@cadenza.io/core\";\nimport type {\n AnyObject,\n SchemaDefinition,\n TaskResult,\n ThrottleTagGetter,\n} from \"@cadenza.io/core\";\nimport { v4 as uuid } from \"uuid\";\nimport Cadenza from \"../../Cadenza\";\n\nexport default class SignalTransmissionTask extends Task {\n readonly isDeputy: boolean = true;\n\n protected readonly signalName: string;\n protected readonly serviceName: string;\n\n /**\n * Constructs a DatabaseTask to execute a database operation on a remote service.\n * @param name - The local name of the Task.\n * @param signalName - The name of the signal to transmit to the service.\n * @param serviceName - The target database service name (optional, defaults to 'DatabaseService').\n * @param description - A description of the task's purpose (default: '').\n * @param concurrency - The maximum number of concurrent executions (default: 0, unlimited).\n * @param timeout - Timeout in milliseconds (default: 0, handled by engine).\n * @param register - Whether to register the task in the registry (default: true).\n * @param isUnique\n * @param isMeta\n * @param isSubMeta\n * @param isHidden\n * @param getTagCallback - Callback for dynamic tagging, e.g., 'return \"default\"'.\n * @param inputSchema - Input schema definition.\n * @param validateInputContext - Whether to validate the input context (default: false).\n * @param outputSchema - Output schema definition.\n * @param validateOutputContext - Whether to validate the output context (default: false).\n * @param retryCount\n * @param retryDelay\n * @param retryDelayMax\n * @param retryDelayFactor\n * @emits {meta.deputy.created} - Emitted on construction with task and service details.\n * @note Fallbacks via `.doOnFail` externally; timeouts managed by the engine.\n */\n constructor(\n name: string,\n signalName: string,\n serviceName: string,\n description: string = \"\",\n concurrency: number = 0,\n timeout: number = 0,\n register: boolean = true,\n isUnique: boolean = false,\n isMeta: boolean = false,\n isSubMeta: boolean = false,\n isHidden: boolean = false,\n getTagCallback: ThrottleTagGetter | undefined = undefined,\n inputSchema: SchemaDefinition | undefined = undefined,\n validateInputContext: boolean = false,\n outputSchema: SchemaDefinition | undefined = undefined,\n validateOutputContext: boolean = false,\n retryCount: number = 0,\n retryDelay: number = 0,\n retryDelayMax: number = 0,\n retryDelayFactor: number = 1,\n ) {\n const taskFunction = (\n context: AnyObject,\n emit: (signal: string, ctx: AnyObject) => void,\n ): Promise<TaskResult> => {\n return new Promise((resolve, reject) => {\n const processId = uuid();\n\n context.__routineExecId = processId;\n emit(\"meta.signal_transmission.requested\", context);\n\n // Ephemeral meta-task for resolution\n Cadenza.createEphemeralMetaTask(\n `Resolve signal transmission for ${this.signalName}`,\n (responseCtx) => {\n if (responseCtx?.errored) {\n reject(new Error(responseCtx.__error));\n } else {\n resolve(responseCtx);\n }\n },\n `Ephemeral resolver for signal transmission ${processId}`,\n {\n isSubMeta: true,\n register: false,\n },\n ).doOn(\n `meta.socket_client.transmitted:${processId}`,\n `meta.fetch.transmitted:${processId}`,\n );\n });\n };\n\n super(\n name,\n taskFunction,\n description,\n concurrency,\n timeout,\n register,\n isUnique,\n isMeta,\n isSubMeta,\n isHidden,\n getTagCallback,\n inputSchema,\n validateInputContext,\n outputSchema,\n validateOutputContext,\n retryCount,\n retryDelay,\n retryDelayMax,\n retryDelayFactor,\n );\n\n this.serviceName = serviceName;\n this.signalName = signalName;\n\n this.emit(\"meta.deputy.created\", {\n localTaskName: this.name,\n localTaskVersion: this.version,\n serviceName: this.serviceName,\n communicationType: \"signal\",\n signalName: this.signalName,\n });\n }\n\n /**\n * Triggers the database operation delegation flow via a signal to the meta-layer.\n * @param context - The GraphContext containing execution data.\n * @param emit\n * @param progressCallback - Callback to update progress (invoked by meta-layer).\n * @returns A Promise resolving with the task result or rejecting on error.\n * @emits {meta.deputy.executed} - Emitted with context including queryData to initiate delegation.\n * @edge Engine handles timeout and error, triggering `.doOnFail` if chained.\n * @note The resolution and progress are managed by ephemeral meta-tasks.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n progressCallback: (progress: number) => void,\n ): TaskResult {\n const ctx = context.getContext();\n const metadata = context.getMetadata();\n\n const deputyContext = {\n __localTaskName: this.name,\n __serviceName: this.serviceName,\n __executionTraceId: metadata.__executionTraceId ?? null,\n __localRoutineExecId:\n metadata.__routineExecId ?? metadata.__metadata?.__routineExecId,\n __metadata: {\n ...metadata,\n __deputyTaskName: this.name,\n },\n __signalName: this.signalName,\n ...ctx,\n };\n\n return this.taskFunction(deputyContext, emit, progressCallback);\n }\n}\n","import Cadenza from \"../Cadenza\";\nimport express, { Request, Response } from \"express\";\nimport bodyParser from \"body-parser\";\nimport helmet from \"helmet\";\nimport cors from \"cors\";\nimport { RateLimiterMemory } from \"rate-limiter-flexible\";\nimport http from \"node:http\";\nimport fs from \"node:fs\";\nimport https from \"node:https\";\nimport fetch from \"node-fetch\";\nimport { isBrowser } from \"../utils/environment\";\n\nexport default class RestController {\n private static _instance: RestController;\n public static get instance(): RestController {\n if (!this._instance) this._instance = new RestController();\n return this._instance;\n }\n\n fetchDataWithTimeout = async function (\n url: string,\n requestInit: any,\n timeoutMs: number,\n ): Promise<any> {\n const signal = AbortSignal.timeout(timeoutMs); // Create a signal that aborts after timeoutMs\n\n try {\n const response = await fetch(url, { ...requestInit, signal }); // Send the request with the signal\n // Process the response\n return await response.json();\n } catch (error: any) {\n if (error?.name === \"AbortError\") {\n console.error(\"Fetch request timed out:\", error);\n // Handle timeout specifically\n } else {\n console.error(\"Fetch error:\", error);\n // Handle other errors\n }\n throw error; // Re-throw to propagate the error\n }\n };\n\n constructor() {\n Cadenza.registry.getTaskByName.doOn(\n \"meta.rest.delegation_requested\",\n \"meta.socket.delegation_requested\",\n );\n Cadenza.registry.getRoutineByName.doOn(\n \"meta.rest.delegation_requested\",\n \"meta.socket.delegation_requested\",\n );\n\n Cadenza.createMetaRoutine(\n \"RestServer\",\n [\n Cadenza.createMetaTask(\n \"Setup Express app security\",\n (ctx, emit) => {\n if (isBrowser) {\n emit(\"meta.rest.browser_detected\", {\n data: {\n uuid: ctx.__serviceInstanceId,\n address: `browser:${ctx.__serviceInstanceId}`,\n port: 0,\n exposed: false,\n process_pid: 1,\n service_name: ctx.__serviceName,\n is_frontend: true,\n is_active: true,\n is_non_responsive: false,\n is_blocked: false,\n health: {},\n },\n ...ctx,\n });\n return;\n }\n const app = express();\n app.use(bodyParser.json());\n\n switch (ctx.__securityProfile) {\n case \"low\":\n app.use(helmet());\n app.use(cors({ origin: \"*\" })); // Allow all origins (insecure for prod)\n break;\n\n case \"medium\":\n app.use(helmet());\n app.use(\n cors({\n origin: process.env.CORS_ORIGIN ?? \"*\",\n methods: [\"GET\", \"POST\"],\n }),\n );\n\n // Rate limiting (1000 req/5min per IP)\n app.use((req: any, res: any, next: any) => {\n new RateLimiterMemory({\n points: 10000,\n duration: 10,\n })\n .consume(req.ip)\n .then(() => next())\n .catch(() =>\n res.status(429).json({ error: \"Too many requests\" }),\n );\n });\n break;\n\n case \"high\":\n app.use(\n helmet({\n contentSecurityPolicy: {\n directives: { defaultSrc: [\"'self'\"] },\n }, // Strict CSP\n referrerPolicy: { policy: \"no-referrer\" },\n }),\n );\n\n if (!process.env.CORS_ORIGIN) {\n throw new Error(\n \"CORS_ORIGIN must be set for high security profile\",\n );\n }\n\n app.use(\n cors({\n origin: process.env.CORS_ORIGIN ?? \"*\",\n methods: [\"GET\", \"POST\"],\n credentials: true,\n }),\n );\n\n // Rate limiting (50 req/1min per IP, block on exceed)\n app.use((req: any, res: any, next: any) => {\n new RateLimiterMemory({\n points: 1000,\n duration: 60,\n blockDuration: 300,\n })\n .consume(req.ip)\n .then(() => next())\n .catch((rej) => {\n if (rej.msBeforeNext > 0) {\n res.status(429).json({\n error: \"Too many requests\",\n retryAfter: rej.msBeforeNext / 1000,\n });\n } else {\n res\n .status(429)\n .json({ error: \"Rate limit exceeded, blocked\" });\n }\n });\n });\n break;\n }\n\n return { ...ctx, __app: app };\n },\n \"Sets up the Express server according to the security profile\",\n ).then(\n Cadenza.createMetaTask(\n \"Define RestServer\",\n (ctx) => {\n const app = ctx.__app;\n\n // TODO: add body validation based on profile\n\n app.post(\"/handshake\", (req: Request, res: Response) => {\n try {\n console.log(\"REST HANDSHAKE\", req.body);\n Cadenza.broker.emit(\"meta.rest.handshake\", req.body);\n res.send({\n __status: \"success\",\n __serviceInstanceId:\n Cadenza.serviceRegistry.serviceInstanceId,\n });\n } catch (e) {\n console.error(\"Error in handshake\", e);\n res.send({ __status: \"error\" });\n }\n });\n\n app.post(\"/delegation\", (req: Request, res: Response) => {\n let deputyExecId;\n let ctx;\n try {\n ctx = req.body;\n deputyExecId = ctx.__metadata.__deputyExecId;\n console.log(\"Rest delegation\", deputyExecId, ctx);\n } catch (e) {\n console.error(\"Error in delegation\", e);\n res.send({\n __status: \"error\",\n __error: e,\n errored: true,\n ...ctx,\n });\n return;\n }\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n (endCtx) => {\n console.log(\"Resolve Rest delegation\", endCtx);\n const metadata = endCtx.__metadata;\n delete endCtx.__metadata;\n res.json({\n ...endCtx,\n ...metadata,\n __status: \"success\",\n });\n },\n \"Resolves a delegation request\",\n { register: false },\n )\n .doOn(`meta.node.graph_completed:${deputyExecId}`)\n .emits(`meta.rest.delegation_resolved:${deputyExecId}`);\n\n // Cadenza.createEphemeralMetaTask(\n // \"Delegation progress update\",\n // (progressCtx) => {\n // if (progressCtx.__progress !== undefined) {\n // // TODO: Progress updates via polling or long-polling for REST, but omit broadcasting as per instruction\n // }\n // },\n // \"Updates delegation progress (polling-based for REST)\",\n // {\n // once: false,\n // destroyCondition: (progressCtx: AnyObject) =>\n // progressCtx.__progress === 1 ||\n // progressCtx.__graphComplete,\n // },\n // ).doOn(\n // `meta.node.routine_execution_progress:${routineExecId}`,\n // `meta.node.ended_routine_execution:${routineExecId}`,\n // );\n\n Cadenza.broker.emit(\"meta.rest.delegation_requested\", {\n ...ctx,\n __name: ctx.__remoteRoutineName,\n });\n });\n\n app.post(\"/signal\", (req: Request, res: Response) => {\n let ctx;\n try {\n ctx = req.body;\n console.log(\"SIGNAL RECEIVED\", ctx.__signalName);\n if (\n !Cadenza.broker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n res.send({\n ...ctx,\n __status: \"error\",\n __error: `No such signal: ${ctx.__signalName}`,\n errored: true,\n });\n return;\n }\n res.send({\n __status: \"success\",\n __signalName: ctx.__signalName,\n });\n } catch (e) {\n console.error(\"Error in signal\", e);\n res.send({\n __status: \"error\",\n __error: e,\n });\n return;\n }\n\n Cadenza.broker.emit(ctx.__signalName, ctx);\n });\n\n app.get(\"/status\", (req: Request, res: Response) => {\n Cadenza.createEphemeralMetaTask(\n \"Resolve status check\",\n (statusCtx) => res.json(statusCtx),\n \"Resolves a status check request\",\n { register: false },\n ).doAfter(Cadenza.serviceRegistry.getStatusTask);\n\n Cadenza.broker.emit(\n \"meta.rest.status_check_requested\",\n req.body.query,\n );\n });\n\n return true;\n },\n \"Starts REST server and initiates meta-handling\",\n )\n .then(\n Cadenza.createMetaTask(\n \"Configure network\",\n async (ctx) => {\n let address: string = \"localhost\";\n let port: number = ctx.__port;\n let exposed: boolean = false;\n\n const createHttpServer = async (ctx: any) => {\n await new Promise((resolve, reject) => {\n const server = http.createServer(ctx.__app);\n ctx.__httpServer = server;\n server.listen(ctx.__port, () => {\n if (typeof server?.address() === \"string\") {\n address = server.address() as string;\n // @ts-ignore\n } else if (server?.address()?.address === \"::\") {\n if (process.env.NODE_ENV === \"development\") {\n address = \"localhost\";\n } else if (process.env.IS_DOCKER === \"true\") {\n address =\n process.env.CADENZA_SERVER_URL || \"localhost\";\n }\n } else {\n // @ts-ignore\n address = server?.address()?.address || \"\";\n }\n\n console.log(`Server is running on ${address}:${port}`);\n resolve(address);\n });\n\n Cadenza.createMetaTask(\n \"Shutdown HTTP Server\",\n () => server.close(),\n \"Shuts down the HTTP server\",\n )\n .doOn(\"meta.server_shutdown_requested\")\n .emits(\"meta.rest.shutdown:http\");\n });\n };\n\n const createHttpsServer = async (ctx: any) => {\n if (\n !process.env.SSL_KEY_PATH ||\n !process.env.SSL_CERT_PATH\n ) {\n throw new Error(\n \"SSL_KEY_PATH and SSL_CERT_PATH must be set\",\n );\n }\n\n const options = {\n key: fs.readFileSync(process.env.SSL_KEY_PATH),\n cert: fs.readFileSync(process.env.SSL_CERT_PATH),\n };\n\n await new Promise((resolve, reject) => {\n const httpsServer = https.createServer(\n options,\n ctx.__app,\n );\n ctx.__httpsServer = httpsServer;\n ctx.__port = 443;\n port = 443;\n httpsServer.listen(443, () => {\n if (typeof httpsServer?.address() === \"string\") {\n address = httpsServer.address() as string;\n // @ts-ignore\n } else if (httpsServer?.address()?.address === \"::\") {\n if (process.env.IS_DOCKER === \"true\") {\n address =\n process.env.CADENZA_SERVER_URL || \"localhost\";\n }\n } else {\n // @ts-ignore\n address = httpsServer?.address()?.address || \"\";\n }\n\n exposed = true;\n\n console.log(\n `HTTPS Server is running on ${address}:443`,\n );\n resolve(address);\n });\n\n Cadenza.createMetaTask(\n \"Shutdown HTTPS Server\",\n () => httpsServer.close(),\n \"Shuts down the HTTPS server\",\n )\n .doOn(\"meta.server_shutdown_requested\")\n .emits(\"meta.rest.shutdown:https\");\n });\n };\n\n if (\n ctx.__networkMode === \"internal\" ||\n ctx.__networkMode === \"dev\"\n ) {\n await createHttpServer(ctx);\n } else if (ctx.__networkMode === \"exposed\") {\n await createHttpServer(ctx);\n await createHttpsServer(ctx);\n } else if (ctx.__networkMode === \"exposed-high-sec\") {\n await createHttpsServer(ctx);\n } else if (ctx.__networkMode === \"auto\") {\n // TODO: auto-detect based on trusted network or dev mode etc.\n await createHttpServer(ctx);\n // createHttpsServer(ctx);\n }\n\n ctx.data = {\n uuid: ctx.__serviceInstanceId,\n address: address,\n port: port,\n exposed: exposed,\n process_pid: process.pid,\n service_name: ctx.__serviceName,\n is_active: true,\n is_database: ctx.__isDatabase,\n is_non_responsive: false,\n is_blocked: false,\n health: {},\n };\n\n return ctx;\n },\n \"Configures network mode\",\n )\n .emits(\"meta.rest.network_configured\")\n .emitsOnFail(\"meta.rest.network_configuration_failed\"),\n )\n .emitsOnFail(\"meta.rest.failed\"),\n ),\n ],\n \"Bootstraps the REST server as socket fallback\",\n ).doOn(\"meta.service_registry.service_inserted\");\n\n Cadenza.createMetaTask(\n \"Setup fetch client\",\n (ctx, emit) => {\n const { serviceName, serviceAddress, servicePort, protocol } = ctx;\n\n const port = protocol === \"https\" ? 443 : servicePort;\n const URL = `${protocol}://${serviceAddress}:${port}`;\n const fetchId = `${serviceAddress}_${port}`;\n\n console.log(\"Fetch connecting to\", URL);\n\n const handshakeTask = Cadenza.createMetaTask(\n `Send Handshake to ${URL}`,\n async (ctx, emit) => {\n console.log(\"Sending Rest handshake\", ctx);\n try {\n const response = await this.fetchDataWithTimeout(\n `${URL}/handshake`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify(ctx.handshakeData),\n },\n 1000,\n );\n console.log(\"Rest Handshake result\", response);\n if (response.__status !== \"success\") {\n const error =\n response.__error ??\n `Failed to connect to service ${serviceName} ${ctx.serviceInstanceId}`;\n console.error(error);\n emit(`meta.fetch.handshake_failed:${fetchId}`, response);\n return { ...ctx, __error: error, errored: true };\n }\n\n ctx.serviceInstanceId = response.__serviceInstanceId;\n\n console.log(\n `Connected to service ${serviceName} ${URL}`,\n response,\n );\n\n for (const communicationType of ctx.communicationTypes) {\n // TODO: Should be done in other situations as well\n emit(\"meta.fetch.service_communication_established\", {\n data: {\n serviceInstanceId: ctx.serviceInstanceId,\n serviceInstanceClientId:\n Cadenza.serviceRegistry.serviceInstanceId,\n communicationType,\n },\n });\n }\n } catch (e) {\n console.error(\"Error in handshake\", e);\n return { ...ctx, __error: e, errored: true };\n }\n\n return ctx;\n },\n \"Sends handshake request\",\n { retryCount: 5, retryDelay: 1000, retryDelayFactor: 1.5 },\n )\n .doOn(`meta.fetch.handshake_requested:${fetchId}`)\n .emits(\"meta.fetch.handshake_complete\");\n\n const delegateTask = Cadenza.createMetaTask(\n `Delegate flow to REST server ${URL}`,\n async (ctx, emit) => {\n if (ctx.__remoteRoutineName === undefined) {\n return;\n }\n\n console.log(\"Delegating via REST\", ctx);\n\n let resultContext;\n try {\n const response = await fetch(`${URL}/delegation`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify(ctx),\n });\n resultContext = await response.json();\n } catch (e) {\n // TODO: Retry on too many requests\n resultContext = {\n __error: `Error: ${e}`,\n errored: true,\n ...ctx,\n ...ctx.__metadata,\n };\n } finally {\n emit(\n `meta.fetch.delegated:${ctx.__metadata.__deputyExecId}`,\n resultContext,\n );\n }\n\n return resultContext;\n },\n \"Sends delegation request\",\n )\n .doOn(\n `meta.service_registry.selected_instance_for_fetch:${fetchId}`,\n `meta.service_registry.socket_failed:${fetchId}`,\n )\n .emitsOnFail(\"meta.fetch.delegate_failed\");\n\n const transmitTask = Cadenza.createMetaTask(\n `Transmit signal to server ${URL}`,\n async (ctx, emit) => {\n if (ctx.__signalName === undefined) {\n return;\n }\n\n let response;\n try {\n response = await this.fetchDataWithTimeout(\n `${URL}/signal`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify(ctx),\n },\n 1000,\n );\n\n console.log(\"SIGNAL TRANSMITTED\", response);\n\n if (ctx.__routineExecId) {\n emit(`meta.fetch.transmitted:${ctx.__routineExecId}`, response);\n }\n } catch (e) {\n // TODO: Retry on too many requests\n\n response = {\n __error: `Error: ${e}`,\n errored: true,\n ...ctx,\n };\n }\n\n return response;\n },\n \"Sends signal request\",\n )\n .doOn(\n `meta.service_registry.selected_instance_for_fetch:${fetchId}`,\n `meta.signal_controller.remote_signal_registered:${serviceName}`,\n \"meta.signal_controller.wildcard_signal_registered\",\n )\n .emitsOnFail(\"meta.fetch.signal_transmission_failed\");\n\n const statusTask = Cadenza.createMetaTask(\n `Request status from ${URL}`,\n async (ctx) => {\n let status;\n try {\n status = await this.fetchDataWithTimeout(\n `${URL}/status`,\n {\n method: \"GET\",\n },\n 1000,\n );\n } catch (e) {\n // TODO: Retry on too many requests\n\n status = {\n __error: `Error: ${e}`,\n errored: true,\n ...ctx,\n };\n }\n\n return status;\n },\n \"Requests status\",\n )\n .doOn(\"meta.fetch.status_check_requested\")\n .emits(\"meta.fetch.status_checked\")\n .emitsOnFail(\"meta.fetch.status_check_failed\");\n\n Cadenza.createEphemeralMetaTask(\"Destroy fetch client\", (ctx, emit) => {\n console.log(\"Destroying fetch client\");\n handshakeTask.destroy();\n delegateTask.destroy();\n transmitTask.destroy();\n statusTask.destroy();\n })\n .doOn(\n \"meta.fetch.destroy_requested\",\n `meta.socket_client.disconnected:${fetchId}`,\n `meta.fetch.handshake_failed:${fetchId}`,\n )\n .emits(\"meta.fetch.destroyed\");\n\n return true;\n },\n \"Manages REST client requests as fallback\",\n )\n .then(\n Cadenza.createMetaTask(\n \"Prepare handshake\",\n (ctx, emit) => {\n const {\n serviceName,\n serviceInstanceId,\n communicationTypes,\n serviceAddress,\n servicePort,\n protocol,\n } = ctx;\n\n const fetchId = `${serviceAddress}_${servicePort}`;\n\n emit(`meta.fetch.handshake_requested:${fetchId}`, {\n serviceInstanceId,\n serviceName,\n communicationTypes,\n serviceAddress,\n servicePort,\n protocol,\n handshakeData: {\n instanceId: Cadenza.serviceRegistry.serviceInstanceId,\n serviceName: Cadenza.serviceRegistry.serviceName,\n // JWT token...\n },\n });\n },\n \"Prepares handshake\",\n ),\n )\n .doOn(\"meta.service_registry.dependee_registered\")\n .emitsOnFail(\"meta.fetch.connect_failed\");\n }\n}\n","import Cadenza from \"../Cadenza\";\nimport { Server } from \"socket.io\";\nimport { IRateLimiterOptions, RateLimiterMemory } from \"rate-limiter-flexible\";\nimport xss from \"xss\";\nimport type { AnyObject } from \"@cadenza.io/core\";\nimport { io } from \"socket.io-client\";\nimport { isBrowser } from \"../utils/environment\";\n\nexport default class SocketController {\n private static _instance: SocketController;\n public static get instance(): SocketController {\n if (!this._instance) this._instance = new SocketController();\n return this._instance;\n }\n\n constructor() {\n Cadenza.createMetaRoutine(\n \"SocketServer\",\n [\n Cadenza.createMetaTask(\"Setup SocketServer\", (ctx) => {\n if (!ctx.__useSocket) {\n return;\n }\n\n console.log(\"SocketServer: Setting up\");\n const server = new Server(ctx.__httpsServer ?? ctx.__httpServer, {\n pingInterval: 30_000,\n pingTimeout: 20_000,\n maxHttpBufferSize: 1e7, // 10MB large payloads\n connectionStateRecovery: {\n maxDisconnectionDuration: 2 * 60 * 1000, // 2min\n skipMiddlewares: true, // Optional: bypass rate limiter on recover\n },\n });\n\n const profile = ctx.__securityProfile ?? \"medium\";\n\n server.use((socket, next) => {\n // Origin check (CORS-like)\n const origin = socket?.handshake?.headers?.origin;\n const allowedOrigins = [\"*\"]; // TODO From firewall_rule\n const networkType = ctx.__networkType ?? \"internal\"; // From meta-config\n let effectiveOrigin = origin || \"unknown\";\n if (networkType === \"internal\") effectiveOrigin = \"internal\"; // Assume trusted internal\n\n if (\n profile !== \"low\" &&\n !allowedOrigins.includes(effectiveOrigin) &&\n !allowedOrigins.includes(\"*\")\n ) {\n return next(new Error(\"Unauthorized origin\"));\n }\n\n // Rate limiting per socket/IP\n const limiterOptions: { [key: string]: IRateLimiterOptions } = {\n low: { points: Infinity, duration: 1 },\n medium: { points: 10000, duration: 10 },\n high: { points: 1000, duration: 60, blockDuration: 300 },\n };\n const limiter = new RateLimiterMemory(limiterOptions[profile]);\n const clientKey = socket?.handshake?.address || \"unknown\";\n socket.use((packet, packetNext) => {\n limiter\n .consume(clientKey)\n .then(() => packetNext())\n .catch((rej) => {\n if (rej.msBeforeNext > 0) {\n console.log(\n \"SocketServer: Rate limit exceeded\",\n rej.msBeforeNext / 1000,\n );\n socket.emit(\"error\", {\n message: \"Rate limit exceeded\",\n retryAfter: rej.msBeforeNext / 1000,\n });\n packetNext(new Error(\"Rate limit exceeded\"));\n } else {\n console.log(\"SocketServer: Rate limit exceeded, blocked\");\n socket.disconnect(true);\n packetNext(new Error(\"Blocked\"));\n }\n });\n });\n\n // Sanitization for payloads needed?\n // socket.use((packet, next) => {\n // if (profile !== \"low\") {\n // const sanitize = (data: any) => {\n // if (typeof data === \"string\") return xss(data);\n // if (typeof data === \"object\") {\n // for (const key in data) {\n // data[key] = sanitize(data[key]);\n // }\n // }\n // return data;\n // };\n // try {\n // packet[1] = sanitize(packet[1]); // Sanitize event payload\n // } catch (e) {\n // console.error(\"SocketServer: Sanitization error\", e);\n // }\n // }\n // next();\n // });\n next();\n });\n console.log(\"SocketServer: Setup complete\");\n\n if (!server) {\n console.error(\"Socket setup error: No server\");\n return { ...ctx, __error: \"No server\", errored: true };\n }\n\n const handshakeMap: { [key: string]: boolean } = {};\n\n server.on(\"connection\", (ws: any) => {\n console.log(\"SocketServer: New connection\", ws.id);\n\n try {\n ws.on(\n \"handshake\",\n (ctx: AnyObject, callback: (result: any) => void) => {\n if (handshakeMap[ctx.serviceInstanceId]) {\n callback({\n status: \"error\",\n error: \"Duplicate handshake\",\n });\n return;\n }\n\n handshakeMap[ctx.serviceInstanceId] = true;\n console.log(\"Socket HANDSHAKE\", ctx);\n callback({\n status: \"success\",\n serviceName: Cadenza.serviceRegistry.serviceName,\n });\n if (ctx.isFrontend) {\n const fetchId = `browser:${ctx.serviceInstanceId}`;\n Cadenza.createMetaTask(\n `Transmit signal to ${fetchId}`,\n (ctx, emit) => {\n if (ctx.__signalName === undefined) {\n return;\n }\n\n ws.emit(\"signal\", ctx);\n\n if (ctx.__routineExecId) {\n emit(\n `meta.socket_client.transmitted:${ctx.__routineExecId}`,\n {},\n );\n }\n },\n ).doOn(\n `meta.service_registry.selected_instance_for_socket:${fetchId}`,\n );\n }\n Cadenza.broker.emit(\"meta.socket.handshake\", ctx);\n },\n );\n\n ws.on(\n \"delegation\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n console.log(\"Received socket delegation request\", ctx);\n const deputyExecId = ctx.__metadata.__deputyExecId;\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n callback,\n \"Resolves a delegation request using the provided callback from the client (.emitWithAck())\",\n { register: false },\n )\n .doOn(`meta.node.graph_completed:${deputyExecId}`)\n .emits(`meta.socket.delegation_resolved:${deputyExecId}`);\n\n Cadenza.createEphemeralMetaTask(\n \"Delegation progress update\",\n (ctx) => {\n if (ctx.__progress !== undefined)\n ws.emit(\"delegation_progress\", ctx);\n },\n \"Updates delegation progress\",\n {\n once: false,\n destroyCondition: (ctx: AnyObject) =>\n ctx.data.progress === 1.0 ||\n ctx.data?.progress === undefined,\n register: false,\n },\n )\n .doOn(\n `meta.node.routine_execution_progress:${deputyExecId}`,\n `meta.node.graph_completed:${deputyExecId}`,\n )\n .emitsOnFail(`meta.socket.progress_failed:${deputyExecId}`);\n\n Cadenza.broker.emit(\"meta.socket.delegation_requested\", {\n ...ctx,\n __name: ctx.__remoteRoutineName,\n });\n },\n );\n\n ws.on(\n \"signal\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n if (\n Cadenza.broker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n callback({\n __status: \"success\",\n __signalName: ctx.__signalName,\n });\n Cadenza.broker.emit(ctx.__signalName, ctx);\n } else {\n callback({\n ...ctx,\n __status: \"error\",\n __error: `No such signal: ${ctx.__signalName}`,\n errored: true,\n });\n }\n },\n );\n\n ws.on(\n \"status_check\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n Cadenza.createEphemeralMetaTask(\n \"Resolve status check\",\n callback,\n \"Resolves a status check request\",\n { register: false },\n ).doAfter(Cadenza.serviceRegistry.getStatusTask);\n\n Cadenza.broker.emit(\n \"meta.socket.status_check_requested\",\n ctx,\n );\n },\n );\n\n ws.on(\"disconnect\", () => {\n console.log(\"SocketServer: Disconnected\");\n Cadenza.broker.emit(\"meta.socket.disconnected\", {\n __wsId: ws.id,\n });\n });\n } catch (e) {\n console.error(\"SocketServer: Error in socket event\", e);\n }\n\n Cadenza.broker.emit(\"meta.socket.connected\", { __wsId: ws.id });\n });\n\n Cadenza.createMetaTask(\n \"Broadcast status\",\n (ctx) => server.emit(\"status_update\", ctx),\n \"Broadcasts the status of the server to all clients\",\n ).doOn(\"meta.service.updated\");\n\n Cadenza.createMetaTask(\n \"Shutdown SocketServer\",\n () => server.close(),\n \"Shuts down the socket server\",\n )\n .doOn(\"meta.socket_server_shutdown_requested\")\n .emits(\"meta.socket.shutdown\");\n\n console.log(\"SocketServer: Startup complete\");\n\n return ctx;\n }),\n ],\n \"Bootstraps the socket server\",\n ).doOn(\"meta.rest.network_configured\");\n\n Cadenza.createMetaTask(\n \"Connect to socket server\",\n (ctx) => {\n const { serviceName, serviceAddress, servicePort, protocol } = ctx;\n\n const socketProtocol = protocol === \"https\" ? \"wss\" : \"ws\";\n const port = protocol === \"https\" ? 443 : servicePort;\n const URL = `${socketProtocol}://${serviceAddress}:${port}`;\n const fetchId = `${serviceAddress}_${port}`;\n let handshake = false;\n\n console.log(\"SocketClient: Connecting to\", serviceName, URL);\n\n const socket = io(URL, {\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 2000,\n reconnectionDelayMax: 10000,\n randomizationFactor: 0.5,\n transports: [\"websocket\"],\n autoConnect: false,\n });\n\n const emitWhenReady = <T>(\n event: string,\n data: any,\n timeoutMs: number = 20_000,\n ack?: (response: T) => void,\n ): Promise<T> => {\n return new Promise((resolve, reject) => {\n const tryEmit = () => {\n if (!socket.connected) {\n // should never happen because we await connect below, but safety net\n socket.once(\"connect\", tryEmit);\n return;\n }\n\n let timer: any;\n if (timeoutMs !== 0) {\n timer = setTimeout(() => {\n console.error(`${event} timed out`);\n reject(new Error(`${event} timed out`));\n }, timeoutMs);\n }\n\n socket\n .timeout(timeoutMs)\n .emit(event, data, (err: any, response: T) => {\n if (err) {\n console.log(\"Timeout error:\", err);\n response = {\n __error: `Timeout error: ${err}`,\n errored: true,\n ...ctx,\n ...ctx.__metadata,\n };\n resolve(response);\n return;\n }\n if (timer) clearTimeout(timer);\n if (ack) ack(response);\n resolve(response);\n });\n };\n\n if (socket.connected) {\n tryEmit();\n } else {\n socket.once(\"connect\", tryEmit);\n }\n });\n };\n\n socket.on(\"connect\", () => {\n console.log(\"SocketClient: CONNECTED\", socket.id);\n if (handshake) return;\n\n Cadenza.broker.emit(`meta.socket_client.connected:${fetchId}`, ctx);\n });\n\n socket.on(\"connect_error\", (err) => {\n console.error(\"Connect error:\", err.message);\n });\n\n socket.on(\"delegation_progress\", (ctx) => {\n Cadenza.broker.emit(\n `meta.socket_client.delegation_progress:${ctx.__metadata.__deputyExecId}`,\n ctx,\n );\n });\n\n socket.on(\"signal\", (ctx) => {\n if (Cadenza.broker.listObservedSignals().includes(ctx.__signalName)) {\n Cadenza.broker.emit(ctx.__signalName, ctx);\n }\n });\n\n socket.on(\"status_update\", (status) => {\n Cadenza.broker.emit(\"meta.socket_client.status_received\", status);\n });\n\n socket.on(\"connect_error\", (err) => {\n console.error(\"SocketClient: connect_error\", err);\n Cadenza.broker.emit(\"meta.socket_client.connect_error\", err);\n });\n\n socket.on(\"timeout\", (event) => {\n console.error(event, \"timed out — server didn’t respond\");\n });\n\n socket.on(\"reconnect_attempt\", (attempt) => {\n console.log(\"Reconnect attempt:\", attempt);\n });\n\n socket.on(\"reconnect\", (attempt) => {\n console.log(\"Reconnected after\", attempt, \"tries\");\n });\n\n socket.on(\"reconnect_error\", (err) => {\n console.error(\"Reconnect failed:\", err.message);\n });\n\n socket.on(\"error\", (err) => {\n // TODO: Retry on rate limit error\n\n console.error(\"SocketClient: error\", err);\n Cadenza.broker.emit(\"meta.socket_client.error\", err);\n });\n\n socket.on(\"disconnect\", () => {\n console.log(\"SocketClient: Disconnected\", URL);\n Cadenza.broker.emit(`meta.socket_client.disconnected:${fetchId}`, {\n serviceName,\n serviceAddress,\n servicePort,\n });\n handshake = false;\n });\n\n socket.connect();\n\n Cadenza.createEphemeralMetaTask(\n `Handshake with ${URL}`,\n async () => {\n console.log(\"SocketClient: HANDSHAKING\", URL);\n handshake = true;\n\n await emitWhenReady(\n \"handshake\",\n {\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n serviceName: Cadenza.serviceRegistry.serviceName,\n isFrontend: isBrowser,\n __status: \"success\",\n },\n 10_000,\n (result: any) => {\n console.log(\"Socket handshake result\", result);\n },\n );\n },\n \"Handshakes with socket server\",\n ).doOn(`meta.socket_client.connected:${fetchId}`);\n\n const delegateTask = Cadenza.createMetaTask(\n `Delegate flow to ${URL}`,\n async (ctx, emit) => {\n if (ctx.__remoteRoutineName === undefined) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n delete ctx.__isSubMeta;\n console.log(\"Socket Delegate:\", socket.connected, ctx);\n emitWhenReady(\n \"delegation\",\n ctx,\n 20_000,\n (resultContext: AnyObject) => {\n console.log(\"Resolved socket delegate\", resultContext);\n\n const metadata = resultContext.__metadata;\n delete resultContext.__metadata;\n emit(\n `meta.socket_client.delegated:${ctx.__metadata.__deputyExecId}`,\n {\n ...resultContext,\n ...metadata,\n },\n );\n resolve(resultContext);\n },\n );\n });\n },\n `Delegate flow to service ${serviceName} with address ${URL}`,\n ).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`);\n\n const transmitTask = Cadenza.createMetaTask(\n `Transmit signal to ${URL}`,\n async (ctx, emit) => {\n if (ctx.__signalName === undefined) {\n return;\n }\n\n return new Promise((resolve) => {\n emitWhenReady(\"signal\", ctx, 10_000, (response: AnyObject) => {\n if (ctx.__routineExecId) {\n emit(\n `meta.socket_client.transmitted:${ctx.__routineExecId}`,\n response,\n );\n }\n resolve(response);\n });\n });\n },\n `Transmits signal to service ${serviceName} with address ${URL}`,\n ).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`);\n\n Cadenza.createEphemeralMetaTask(\n `Shutdown SocketClient ${URL}`,\n () => {\n socket?.close();\n delegateTask.destroy();\n transmitTask.destroy();\n },\n \"Shuts down the socket client\",\n )\n .doOn(\n `meta.socket_shutdown_requested:${fetchId}`,\n `meta.socket_client.disconnected:${fetchId}`,\n `meta.fetch.handshake_failed:${fetchId}`,\n )\n .emits(\"meta.socket_client_shutdown_complete\");\n\n return true;\n },\n \"Connects to a specified socket server\",\n )\n .doOn(\"meta.fetch.handshake_complete\")\n .emitsOnFail(\"meta.socket_client.connect_failed\");\n }\n}\n","export function formatTimestamp(timestamp: number) {\n return new Date(timestamp).toISOString();\n}\n\nexport function decomposeSignalName(signalName: string) {\n const parts = signalName.split(\".\");\n const firstChar = signalName.charAt(0);\n let isMeta = false;\n let sourceServiceName = null;\n let domain = parts.length === 2 ? parts[0] : \"\";\n if (parts[0] === \"meta\") {\n isMeta = true;\n if (parts.length === 3) {\n domain = parts[1];\n } else {\n domain = \"\";\n }\n } else if (firstChar === \"*\" || firstChar === firstChar.toUpperCase()) {\n sourceServiceName = parts[0];\n\n if (parts[1] === \"meta\") {\n isMeta = true;\n if (parts.length === 4) {\n domain = parts[2];\n } else {\n domain = \"\";\n }\n } else {\n domain = parts[1];\n }\n }\n const action = parts[parts.length - 1];\n\n return {\n isMeta,\n sourceServiceName,\n domain,\n action,\n };\n}\n","import Cadenza from \"../Cadenza\";\nimport { decomposeSignalName } from \"../utils/tools\";\n\nexport default class SignalController {\n private static _instance: SignalController;\n public static get instance(): SignalController {\n if (!this._instance) this._instance = new SignalController();\n return this._instance;\n }\n\n constructor() {\n Cadenza.createMetaTask(\n \"Handle Signal Registration\",\n (ctx, emit) => {\n const { __signalName } = ctx;\n const { isMeta, sourceServiceName, domain, action } =\n decomposeSignalName(__signalName);\n\n emit(\"meta.signal_controller.signal_added\", {\n data: {\n name: __signalName,\n sourceServiceName,\n domain,\n action,\n isMeta,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n });\n\n return ctx;\n },\n \"Handles signal registration from a service instance\",\n )\n .doOn(\"meta.signal_broker.added\")\n .then(\n Cadenza.createMetaTask(\n \"Handle foreign signal registration\",\n (ctx, emit) => {\n const { __signalName } = ctx;\n const firstChar = __signalName.charAt(0);\n\n if (\n (firstChar === firstChar.toUpperCase() &&\n firstChar !== firstChar.toLowerCase()) ||\n firstChar === \"*\"\n ) {\n const serviceName = __signalName.split(\".\")[0];\n\n if (Cadenza.serviceRegistry.serviceName === serviceName) {\n return false;\n }\n\n ctx.__listenerServiceName = Cadenza.serviceRegistry.serviceName;\n ctx.__emitterSignalName = __signalName;\n ctx.__signalName =\n \"meta.signal_controller.foreign_signal_registered\";\n ctx.__remoteServiceName = serviceName;\n\n if (serviceName === \"*\") {\n emit(\"meta.signal_controller.wildcard_signal_registered\", ctx);\n } else {\n emit(\n `meta.signal_controller.remote_signal_registered:${serviceName}`,\n ctx,\n );\n }\n\n return ctx;\n }\n },\n ).then(Cadenza.serviceRegistry.handleRemoteSignalRegistrationTask),\n );\n\n Cadenza.createMetaTask(\n \"Forward signal observations to remote service\",\n (ctx, emit) => {\n const { remoteSignals, serviceName } = ctx;\n\n for (const remoteSignal of remoteSignals) {\n remoteSignal.__signalName =\n \"meta.signal_controller.foreign_signal_registered\";\n\n emit(\n `meta.signal_controller.remote_signal_registered:${serviceName}`,\n remoteSignal,\n );\n }\n\n return true;\n },\n \"Forwards signal observations to remote service\",\n ).doAfter(Cadenza.serviceRegistry.getRemoteSignalsTask);\n\n Cadenza.createMetaTask(\"Handle foreign signal registration\", (ctx) => {\n const { __emitterSignalName, __listenerServiceName } = ctx;\n\n Cadenza.createSignalTransmissionTask(\n __emitterSignalName,\n __listenerServiceName,\n ).doOn(__emitterSignalName.split(\".\").slice(1).join(\".\"));\n\n return true;\n }).doOn(\n \"meta.signal_controller.foreign_signal_registered\",\n \"meta.service_registry.foreign_signal_registered\",\n );\n\n // TODO: Cleanup transmission tasks?\n\n Cadenza.createMetaTask(\n \"Add data to signal emission\",\n (ctx) => {\n const signalEmission = ctx.__signalEmission;\n\n if (!signalEmission) {\n return false;\n }\n\n return {\n data: {\n signal_name: signalEmission.signalName,\n task_name: signalEmission.taskName,\n task_version: signalEmission.taskVersion,\n task_execution_id: signalEmission.taskExecutionId,\n is_meta: signalEmission.isMeta,\n is_metric: signalEmission.isMetric ?? false,\n data: ctx,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n },\n \"\",\n { isSubMeta: true, concurrency: 100 },\n )\n .doOn(\".*\")\n .emits(\"sub_meta.signal_controller.signal_emitted\");\n\n Cadenza.createMetaTask(\n \"Add metadata to signal consumption\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n },\n \"\",\n { isSubMeta: true, concurrency: 100 },\n )\n .doOn(\"meta.node.consumed_signal\")\n .emits(\"sub_meta.signal_controller.signal_consumed\");\n }\n}\n","import Cadenza from \"../../Cadenza\";\nimport { formatTimestamp } from \"../../utils/tools\";\n\nexport default class GraphMetadataController {\n private static _instance: GraphMetadataController;\n public static get instance(): GraphMetadataController {\n if (!this._instance) this._instance = new GraphMetadataController();\n return this._instance;\n }\n\n constructor() {\n Cadenza.createMetaTask(\"Handle task creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n // input_context_schema_id: ctx.data.inputContextSchema ? { // TODO\n //\n // } : null,\n // output_context_schema_id: ctx.data.outputContextSchema ? {\n //\n // } : null,\n },\n };\n })\n .doOn(\"meta.task.created\")\n .emits(\"meta.graph_metadata.task_created\");\n\n Cadenza.createMetaTask(\"Handle task update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.layer_index_changed\", \"meta.task.destroyed\")\n .emits(\"meta.graph_metadata.task_updated\");\n\n Cadenza.createMetaTask(\"Handle task relationship creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.relationship_added\")\n .emits(\"meta.graph_metadata.task_relationship_created\");\n\n Cadenza.createMetaTask(\n \"Handle task deputy relationship creation\",\n (ctx) => {\n if (ctx.signalName) return;\n return {\n data: {\n triggered_task_name: ctx.remoteRoutineName,\n triggered_task_version: 1, // TODO\n triggered_service_name: ctx.serviceName,\n deputy_task_name: ctx.localTaskName,\n deputy_task_version: 1, // TODO\n deputy_service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n )\n .doOn(\"meta.service_registry.deputy_registered\")\n .emits(\"meta.graph_metadata.deputy_relationship_created\");\n\n Cadenza.createMetaTask(\"Handle task signal observation\", (ctx) => {\n const firstChar = ctx.data.signalName.charAt(0);\n let _signal = ctx.data.signalName;\n let signalServiceName;\n if (\n firstChar === firstChar.toUpperCase() &&\n firstChar !== firstChar.toLowerCase()\n ) {\n // TODO handle wildcards\n signalServiceName = ctx.data.signalName.split(\".\")[0];\n _signal = ctx.data.signalName.split(\".\").slice(1).join(\".\");\n }\n return {\n data: {\n ...ctx.data,\n signalName: _signal,\n taskServiceName: Cadenza.serviceRegistry.serviceName,\n signalServiceName:\n signalServiceName ?? Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.observed_signal\")\n .emits(\"meta.graph_metadata.task_signal_observed\");\n\n Cadenza.createMetaTask(\"Handle task signal attachment\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.attached_signal\")\n .emits(\"meta.graph_metadata.task_attached_signal\");\n\n Cadenza.createMetaTask(\"Handle task unsubscribing signal\", (ctx) => {\n // const firstChar = ctx.data.signalName.charAt(0);\n // let signalServiceName;\n // if (\n // firstChar === firstChar.toUpperCase() &&\n // firstChar !== firstChar.toLowerCase()\n // ) {\n // signalServiceName = ctx.data.signalName.split(\".\")[0];\n // }\n return {\n data: {\n deleted: true,\n },\n filter: {\n ...ctx.filter,\n task_service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.unsubscribed_signal\")\n .emits(\"meta.graph_metadata.task_unsubscribed_signal\");\n\n Cadenza.createMetaTask(\"Handle task detaching signal\", (ctx) => {\n return {\n data: {\n deleted: true,\n },\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.detached_signal\")\n .emits(\"meta.graph_metadata.task_detached_signal\");\n\n Cadenza.createMetaTask(\"Handle routine creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doAfter(Cadenza.registry.registerRoutine)\n .emits(\"meta.graph_metadata.routine_created\");\n\n Cadenza.createMetaTask(\"Handle routine update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.destroyed\")\n .emits(\"meta.graph_metadata.routine_updated\");\n\n Cadenza.createMetaTask(\"Handle adding task to routine\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.task_added\")\n .emits(\"meta.graph_metadata.task_added_to_routine\");\n\n Cadenza.createMetaTask(\"Handle new trace\", (ctx) => {\n const context = ctx.data.context;\n delete ctx.data.context;\n\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n context_id: {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n };\n })\n .doOn(\"meta.runner.new_trace\")\n .emits(\"meta.graph_metadata.execution_trace_created\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution creation\",\n (ctx) => {\n const context = ctx.data.context;\n delete ctx.data.context;\n return {\n queryData: {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n },\n };\n },\n \"Handles routine execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.runner.added_tasks\")\n .emits(\"meta.graph_metadata.routine_execution_created\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution started\",\n () => {\n return true;\n },\n \"Handles routine execution started\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.started_routine_execution\")\n .emits(\"meta.graph_metadata.routine_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution ended\",\n (ctx) => {\n const context = ctx.data.resultContext;\n delete ctx.data.resultContext;\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n result_context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n filter: {\n ...ctx.filter,\n },\n };\n },\n \"Handles routine execution ended\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.ended_routine_execution\")\n .emits(\"meta.graph_metadata.routine_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution creation\",\n (ctx) => {\n const context = ctx.data.context;\n delete ctx.data.context;\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta,\n },\n return: \"uuid\",\n },\n },\n };\n },\n \"Handles task execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.scheduled\")\n .emits(\"meta.graph_metadata.task_execution_created\");\n\n Cadenza.createMetaTask(\n \"Handle task execution mapped\",\n () => {\n return true;\n },\n \"Handles task execution mapping\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.mapped\")\n .emits(\"meta.graph_metadata.task_execution_mapped\");\n\n Cadenza.createMetaTask(\n \"Handle task execution started\",\n () => {\n return true;\n },\n \"Handles task execution started\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.started\")\n .emits(\"meta.graph_metadata.task_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle task execution ended\",\n (ctx) => {\n const context = ctx.data.resultContext;\n delete ctx.data.resultContext;\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n result_context_id:\n typeof context === \"string\"\n ? context\n : {\n subOperation: \"insert\",\n table: \"context\",\n data: {\n uuid: context.id,\n context: context.context,\n is_meta: ctx.data.isMeta ?? false,\n },\n return: \"uuid\",\n },\n },\n filter: {\n ...ctx.filter,\n },\n };\n },\n \"Handles task execution ended\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.ended\")\n .emits(\"meta.graph_metadata.task_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution relationship creation\",\n (ctx) => {\n return {\n data: {\n execution_count: \"increment\",\n last_executed: formatTimestamp(Date.now()),\n },\n filter: {\n ...ctx.filter,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n \"Handles task execution relationship creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.mapped\")\n .emits(\"meta.graph_metadata.relationship_executed\");\n\n Cadenza.createMetaTask(\n \"Handle explicit task execution relationship creation\",\n (ctx) => {\n return {\n data: {\n deputy_task_execution_id: ctx.data.previousTaskExecutionId,\n task_execution_id: ctx.data.taskExecutionId,\n },\n };\n },\n )\n .doOn(\"meta.node.detected_previous_task_execution\")\n .emits(\"meta.graph_metadata.explicit_relationship_created\");\n\n Cadenza.createMetaTask(\n \"Handle explicit task execution relationship execution\",\n (ctx) => {\n if (!ctx.__localTaskName) return;\n return {\n data: {\n execution_count: \"increment\",\n last_executed: formatTimestamp(Date.now()),\n },\n filter: {\n deputy_task_name: ctx.__localTaskName,\n deputy_task_version: ctx.__localTaskVersion,\n deputy_service_name: ctx.__localServiceName,\n triggered_task_name: ctx.filter.taskName,\n triggered_task_version: ctx.filter.taskVersion,\n triggered_service_name: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n )\n .doOn(\"meta.node.detected_previous_task_execution\")\n .emits(\"meta.graph_metadata.explicit_relationship_executed\");\n }\n}\n","import type { AnyObject } from \"@cadenza.io/core\";\n\nexport type SchemaType =\n | \"varchar\"\n | \"text\"\n | \"int\"\n | \"bigint\" // Added for BIGINT\n | \"decimal\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"jsonb\"\n | \"uuid\"\n | \"timestamp\"\n | \"date\"\n | \"geo_point\"\n | \"bytea\"\n | \"any\";\n\nexport const SCHEMA_TYPES = [\n \"varchar\",\n \"text\",\n \"int\",\n \"bigint\",\n \"decimal\",\n \"boolean\",\n \"array\",\n \"object\",\n \"jsonb\",\n \"uuid\",\n \"timestamp\",\n \"date\",\n \"geo_point\",\n \"bytea\",\n \"any\",\n] as SchemaType[];\n\nexport type SchemaConstraints = {\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n enum?: any[];\n multipleOf?: number;\n format?: \"email\" | \"url\" | \"date-time\" | \"uuid\" | \"custom\";\n oneOf?: any[];\n appendOnly?: boolean;\n check?: string;\n precision?: number; // Added for decimal/bigint\n scale?: number; // Added for decimal\n};\n\nexport interface FieldDefinition {\n type: SchemaType;\n primary?: boolean;\n index?: boolean;\n unique?: boolean;\n default?: any;\n required?: boolean;\n nullable?: boolean;\n encrypted?: boolean;\n constraints?: SchemaConstraints;\n references?: string;\n items?: FieldDefinition;\n description?: string;\n generated?: \"uuid\" | \"timestamp\" | \"now\" | \"autoIncrement\"; // Added autoIncrement\n onDelete?: \"cascade\" | \"set null\" | \"no action\" | \"set default\" | \"restrict\";\n onUpdate?: \"cascade\" | \"set null\" | \"no action\" | \"set default\"; // Added for constraint cascade\n}\n\nexport type DbOperationType = \"query\" | \"insert\" | \"update\" | \"delete\";\n\nexport interface TableDefinition {\n fields: Record<string, FieldDefinition>;\n meta?: {\n description?: string;\n tags?: string[];\n shardKey?: string;\n partitionHint?: string;\n appendOnly?: boolean;\n encryptedFields?: string[];\n };\n indexes?: string[][];\n uniqueConstraints?: string[][];\n primaryKey?: string[];\n fullTextIndexes?: string[][];\n foreignKeys?: {\n tableName: string;\n fields: string[];\n referenceFields: string[];\n onDelete?: \"cascade\" | \"set null\" | \"no action\";\n }[];\n triggers?: Record<\n string,\n {\n when: \"before\" | \"after\";\n event: \"insert\" | \"update\" | \"delete\";\n function: string;\n }\n >;\n customSignals?: {\n triggers?: {\n [key in DbOperationType]?: (\n | string\n | { signal: string; condition?: (ctx: AnyObject) => boolean }\n )[];\n }; // Signals to observe before action\n emissions?: {\n [key in DbOperationType]?: (\n | string\n | { signal: string; condition?: (ctx: AnyObject) => boolean }\n )[];\n }; // Signals to emit after action\n };\n initialData?: { fields: string[]; data: any[][] };\n}\n\nexport interface SchemaDefinition {\n version?: number;\n tables: Record<string, TableDefinition>;\n relations?: Record<\n string,\n {\n on: string;\n type?: \"one-to-one\" | \"one-to-many\" | \"many-to-one\" | \"many-to-many\";\n }\n >;\n meta?: {\n defaultEncoding?: \"utf8\" | \"base64\";\n autoIndex?: boolean;\n relationsVersion?: number;\n dropExisting?: boolean;\n };\n}\n","import {\n DbOperationType,\n SchemaDefinition,\n SCHEMA_TYPES,\n FieldDefinition,\n TableDefinition,\n} from \"../types/database\";\nimport Cadenza, { DatabaseOptions, ServerOptions } from \"../Cadenza\";\nimport { Pool, PoolClient } from \"pg\";\nimport { camelCase, snakeCase } from \"lodash-es\";\nimport type { AnyObject } from \"@cadenza.io/core\";\nimport {\n DbOperationPayload,\n JoinDefinition,\n SubOperation,\n} from \"../types/queryData\";\nimport { sleep } from \"../utils/promise\";\n\nexport default class DatabaseController {\n private static _instance: DatabaseController;\n public static get instance(): DatabaseController {\n if (!this._instance) this._instance = new DatabaseController();\n return this._instance;\n }\n\n dbClient = new Pool({\n user: process.env.DATABASE_USER ?? \"postgres\",\n host: process.env.DATABASE_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.DATABASE_PORT ?? \"5432\"),\n database: \"postgres\",\n password: process.env.DATABASE_PASSWORD ?? \"03gibnEF\",\n });\n\n reset() {\n this.dbClient.end();\n }\n\n constructor() {\n Cadenza.createMetaRoutine(\n \"DatabaseServiceInit\",\n [\n // Database health check\n // Create database role\n // Create schema version table\n Cadenza.createMetaTask(\n \"Create database\",\n async (ctx) => {\n const { databaseName } = ctx;\n try {\n if (\n !databaseName.split(\"\").every((c: string) => /[a-z_]/.test(c))\n ) {\n throw new Error(\n `Invalid database name ${databaseName}. Names must only contain lowercase alphanumeric characters and underscores`,\n );\n }\n await this.dbClient.query(`CREATE DATABASE ${databaseName}`);\n console.log(`Database ${databaseName} created`);\n // Update dbClient to use the new database\n this.dbClient = new Pool({\n user: process.env.DATABASE_USER ?? \"postgres\",\n host: process.env.DATABASE_ADDRESS ?? \"localhost\",\n port: parseInt(process.env.DATABASE_PORT ?? \"5432\"),\n database: databaseName,\n password: process.env.DATABASE_PASSWORD ?? \"03gibnEF\",\n });\n return true;\n } catch (error: any) {\n if (error.code === \"42P04\") {\n console.log(\"Database already exists\");\n // Database already exists\n return true;\n }\n throw new Error(`Failed to create database: ${error.message}`);\n }\n },\n \"Creates the target database if it doesn't exist\",\n ).then(\n Cadenza.createMetaTask(\n \"Validate schema\",\n (ctx) => {\n const { schema } = ctx as {\n schema: SchemaDefinition;\n options: ServerOptions & DatabaseOptions;\n };\n if (!schema?.tables || typeof schema.tables !== \"object\") {\n throw new Error(\"Invalid schema: missing or invalid tables\");\n }\n for (const [tableName, table] of Object.entries(schema.tables)) {\n if (!table.fields || typeof table.fields !== \"object\") {\n console.log(tableName, \"missing fields\");\n throw new Error(`Invalid table ${tableName}: missing fields`);\n }\n\n // Validate FieldDefinition constraints and customSignals\n for (const [fieldName, field] of Object.entries(table.fields)) {\n if (!fieldName.split(\"\").every((c) => /[a-z_]/.test(c))) {\n console.log(tableName, \"field not lowercase\", fieldName);\n throw new Error(\n `Invalid field name ${fieldName} for ${tableName}. Field names must only contain lowercase alphanumeric characters and underscores`,\n );\n }\n if (!Object.values(SCHEMA_TYPES).includes(field.type)) {\n console.log(\n tableName,\n \"field invalid type\",\n fieldName,\n field.type,\n );\n throw new Error(\n `Invalid type ${field.type} for ${tableName}.${fieldName}`,\n );\n }\n if (\n field.references &&\n !field.references.match(/^[\\w]+[(\\w)]+$/)\n ) {\n console.log(\n tableName,\n \"invalid reference\",\n fieldName,\n field.references,\n );\n throw new Error(\n `Invalid reference ${field.references} for ${tableName}.${fieldName}`,\n );\n }\n if (table.customSignals) {\n for (const op of [\"query\", \"insert\", \"update\", \"delete\"]) {\n const triggers =\n table.customSignals.triggers?.[op as DbOperationType];\n const emissions =\n table.customSignals.emissions?.[op as DbOperationType];\n if (\n triggers &&\n !Array.isArray(triggers) &&\n typeof triggers !== \"object\"\n ) {\n console.log(\n tableName,\n \"invalid triggers\",\n op,\n triggers,\n );\n throw new Error(\n `Invalid triggers for ${tableName}.${op}`,\n );\n }\n if (\n emissions &&\n !Array.isArray(emissions) &&\n typeof emissions !== \"object\"\n ) {\n console.log(\n tableName,\n \"invalid emissions\",\n op,\n emissions,\n );\n throw new Error(\n `Invalid emissions for ${tableName}.${op}`,\n );\n }\n }\n }\n }\n }\n console.log(\"SCHEMA VALIDATED\");\n return true;\n },\n \"Validates database schema structure and content\",\n ).then(\n Cadenza.createMetaTask(\n \"Sort tables by dependencies\",\n this.sortTablesByReferences.bind(this),\n \"Sorts tables by dependencies\",\n ).then(\n Cadenza.createMetaTask(\n \"Split schema into tables\",\n this.splitTables.bind(this),\n \"Generates DDL for database schema\",\n ).then(\n Cadenza.createMetaTask(\n \"Generate DDL from table\",\n async (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n const fieldDefs = Object.entries(table.fields)\n .map((value) => {\n const [fieldName, field] = value as [\n string,\n FieldDefinition,\n ];\n let def = `${fieldName} ${field.type.toUpperCase()}`;\n if (field.type === \"varchar\")\n def += `(${field.constraints?.maxLength ?? 255})`;\n if (field.type === \"decimal\")\n def += `(${field.constraints?.precision ?? 10},${field.constraints?.scale ?? 2})`;\n if (field.primary) def += \" PRIMARY KEY\";\n if (field.unique) def += \" UNIQUE\";\n if (field.default !== undefined)\n def += ` DEFAULT ${field.default === \"\" ? \"''\" : String(field.default)}`;\n if (field.required && !field.nullable)\n def += \" NOT NULL\";\n if (field.nullable) def += \" NULL\";\n if (field.generated)\n def += ` GENERATED ALWAYS AS ${field.generated.toUpperCase()} STORED`;\n if (field.references)\n def += ` REFERENCES ${field.references} ON DELETE ${field.onDelete || \"DO NOTHING\"}`;\n if (field.encrypted) def += \" ENCRYPTED\"; // Pseudo, handle via app-side\n\n if (field.constraints?.check) {\n def += ` CHECK (${field.constraints.check})`;\n }\n return def;\n })\n .join(\", \");\n\n if (schema.meta?.dropExisting) {\n const result = await this.dbClient.query(\n `DELETE FROM ${tableName};`,\n );\n console.log(\"DROP TABLE\", tableName, result);\n }\n\n const sql = `CREATE TABLE IF NOT EXISTS ${tableName} (${fieldDefs})`;\n // if (table.meta?.appendOnly) { // TODO Add prevent_context_modification() function\n // sql += `;\\nCREATE TRIGGER prevent_modification BEFORE UPDATE OR DELETE ON ${tableName} FOR EACH STATEMENT EXECUTE FUNCTION prevent_context_modification();`;\n // }\n\n ddl.push(sql);\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\"Generate index DDL\", (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.indexes) {\n table.indexes.forEach((fields: string[]) => {\n ddl.push(\n `CREATE INDEX IF NOT EXISTS idx_${tableName}_${fields.join(\"_\")} ON ${tableName} (${fields.join(\", \")});`,\n );\n });\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n }).then(\n Cadenza.createMetaTask(\n \"Generate primary key ddl\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.primaryKey) {\n ddl.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS unique_${tableName}_${table.primaryKey.join(\"_\")};`, // TODO: should be cascade?\n `ALTER TABLE ${tableName} ADD CONSTRAINT unique_${tableName}_${table.primaryKey.join(\"_\")} PRIMARY KEY (${table.primaryKey.join(\", \")});`,\n );\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate unique index DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.uniqueConstraints) {\n table.uniqueConstraints.forEach(\n (fields: string[]) => {\n ddl.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS unique_${tableName}_${fields.join(\"_\")};`, // TODO: should be cascade?\n `ALTER TABLE ${tableName} ADD CONSTRAINT unique_${tableName}_${fields.join(\"_\")} UNIQUE (${fields.join(\", \")});`,\n );\n },\n );\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate foreign key DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.foreignKeys) {\n for (const foreignKey of table.foreignKeys as {\n tableName: string;\n fields: string[];\n referenceFields: string[];\n }[]) {\n const foreignKeyName = `fk_${tableName}_${foreignKey.fields.join(\"_\")}`;\n ddl.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS ${foreignKeyName};`, // TODO: should be cascade?\n `ALTER TABLE ${tableName} ADD CONSTRAINT ${foreignKeyName} FOREIGN KEY (${foreignKey.fields.join(\n \", \",\n )}) REFERENCES ${foreignKey.tableName} (${foreignKey.referenceFields.join(\n \", \",\n )});`,\n );\n }\n }\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate trigger DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.triggers) {\n for (const [\n triggerName,\n trigger,\n ] of Object.entries(table.triggers) as [\n string,\n any,\n ][]) {\n ddl.push(\n `CREATE TRIGGER ${triggerName} ${trigger.when} ${trigger.event} ON ${tableName} FOR EACH STATEMENT EXECUTE FUNCTION ${trigger.function};`,\n );\n }\n }\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Generate initial data DDL\",\n (ctx) => {\n const {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n } = ctx;\n if (table.initialData) {\n ddl.push(\n `INSERT INTO ${tableName} (${table.initialData.fields.join(\", \")}) VALUES ${table.initialData.data\n .map(\n (row: any[]) =>\n `(${row\n .map((value) =>\n value === undefined\n ? \"NULL\"\n : value.charAt(0) === \"'\"\n ? value\n : `'${value}'`,\n )\n .join(\", \")})`, // TODO: handle non string data\n )\n .join(\", \")} ON CONFLICT DO NOTHING;`,\n );\n }\n\n return {\n ddl,\n table,\n tableName,\n schema,\n options,\n sortedTables,\n };\n },\n ).then(\n Cadenza.createUniqueMetaTask(\n \"Join DDL\",\n (ctx) => {\n const { joinedContexts } = ctx;\n const ddl: string[] = [];\n for (const joinedContext of joinedContexts) {\n ddl.push(...joinedContext.ddl);\n }\n ddl.flat();\n return {\n ddl,\n schema: joinedContexts[0].schema,\n options: joinedContexts[0].options,\n table: joinedContexts[0].table,\n tableName: joinedContexts[0].tableName,\n sortedTables:\n joinedContexts[0].sortedTables,\n };\n },\n ).then(\n Cadenza.createMetaTask(\n \"Apply Database Changes\",\n async (ctx) => {\n const { ddl } = ctx;\n if (ddl && ddl.length > 0) {\n for (const sql of ddl) {\n try {\n console.log(\"Applying SQL\", sql);\n await this.dbClient.query(sql);\n } catch (error: any) {\n console.error(\n \"Error applying DDL\",\n error,\n );\n }\n }\n }\n return true;\n },\n \"Applies generated DDL to the database\",\n ).then(\n Cadenza.createMetaTask(\n \"Split schema into tables for task creation\",\n this.splitTables.bind(this),\n \"Splits schema into tables for task creation\",\n ).then(\n Cadenza.createMetaTask(\n \"Generate tasks\",\n (ctx) => {\n const { table, tableName, options } =\n ctx;\n\n this.createDatabaseTask(\n \"query\",\n tableName,\n table,\n this.queryFunction.bind(this),\n options,\n );\n\n this.createDatabaseTask(\n \"insert\",\n tableName,\n table,\n this.insertFunction.bind(this),\n options,\n );\n\n this.createDatabaseTask(\n \"update\",\n tableName,\n table,\n this.updateFunction.bind(this),\n options,\n );\n\n this.createDatabaseTask(\n \"delete\",\n tableName,\n table,\n this.deleteFunction.bind(this),\n options,\n );\n\n return true;\n },\n \"Generates auto-tasks for database schema\",\n ).then(\n Cadenza.createUniqueMetaTask(\n \"Join table tasks\",\n (ctx, emit) => {\n console.log(\"JOINING TABLE TASKS\");\n\n emit(\"meta.database.setup_done\", {});\n return true;\n },\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ],\n \"Initializes the database service with schema parsing and task/signal generation\",\n ).doOn(\"meta.database_init_requested\");\n }\n\n private async getClient(): Promise<PoolClient> {\n const client = (await this.dbClient.connect()) as unknown as any;\n const query = client.query;\n const release = client.release;\n // set a timeout of 5 seconds, after which we will log this client's last query\n const timeout = setTimeout(() => {\n console.error(\"A client has been checked out for more than 5 seconds!\");\n console.error(\n `The last executed query on this client was: ${client.lastQuery}`,\n );\n }, 5000);\n // monkey patch the query method to keep track of the last query executed\n client.query = (...args: any[]) => {\n client.lastQuery = args;\n return query.apply(client, args);\n };\n client.release = () => {\n // clear our timeout\n clearTimeout(timeout);\n // set the methods back to their old un-monkey-patched version\n client.query = query;\n client.release = release;\n return release.apply(client);\n };\n return client;\n }\n\n private async waitForDatabase(\n transaction: (\n client: any,\n context: AnyObject,\n ) => Promise<AnyObject | boolean>,\n client: any,\n context: AnyObject,\n ) {\n for (let i = 0; i < 10; i++) {\n try {\n return await transaction(client, context);\n } catch (err: unknown) {\n if (err && (err as Error).message.includes(\"does not exist\")) {\n console.log(`Waiting for database to be ready...`);\n await new Promise((res) => setTimeout(res, 1000));\n } else {\n console.error(\"Database query errored: \", err, context);\n return { rows: [] };\n }\n }\n }\n throw new Error(`Timeout waiting for database to be ready`);\n }\n\n sortTablesByReferences(ctx: AnyObject): AnyObject {\n // Build dependency graph: map of table -> set of dependent tables\n const schema: SchemaDefinition = ctx.schema;\n const graph: Map<string, Set<string>> = new Map();\n const allTables = Object.keys(schema.tables);\n\n // Initialize graph with all tables\n allTables.forEach((table) => graph.set(table, new Set()));\n\n // Populate dependencies, skipping self-references for cycle detection\n for (const [tableName, table] of Object.entries(schema.tables)) {\n for (const field of Object.values(table.fields)) {\n if (field.references) {\n const [refTable] = field.references.split(\"(\"); // Extract referenced table\n if (refTable !== tableName && allTables.includes(refTable)) {\n graph.get(refTable)?.add(tableName); // refTable depends on tableName\n }\n }\n }\n\n if (table.foreignKeys) {\n for (const foreignKey of table.foreignKeys) {\n const refTable = foreignKey.tableName;\n if (refTable !== tableName && allTables.includes(refTable)) {\n graph.get(refTable)?.add(tableName); // refTable depends on tableName\n }\n }\n }\n }\n\n // Topological sort using DFS with cycle detection\n const visited: Set<string> = new Set();\n const tempMark: Set<string> = new Set(); // For cycle detection\n const sorted: string[] = [];\n let hasCycles = false;\n\n function visit(table: string) {\n if (tempMark.has(table)) {\n hasCycles = true; // Mark cycle but continue\n return;\n }\n if (visited.has(table)) return;\n\n tempMark.add(table);\n for (const dep of graph.get(table) || []) {\n visit(dep);\n }\n tempMark.delete(table);\n visited.add(table);\n sorted.push(table);\n }\n\n // Visit each unvisited table\n for (const table of allTables) {\n if (!visited.has(table)) {\n visit(table);\n }\n }\n\n // Handle unvisited tables (e.g., no dependencies)\n for (const table of allTables) {\n if (!visited.has(table)) {\n sorted.push(table);\n }\n }\n\n sorted.reverse();\n\n console.log(\"sorted tables\", sorted, \"has cycles\", hasCycles);\n\n return { ...ctx, sortedTables: sorted, hasCycles };\n }\n\n async *splitTables(ctx: any) {\n const { sortedTables, schema, options = {} } = ctx;\n for (const tableName of sortedTables) {\n const table = schema.tables[tableName];\n yield { ddl: [], table, tableName, schema, options, sortedTables };\n }\n }\n\n toCamelCase(rows: any[]) {\n return rows.map((row: any) => {\n const camelCasedRow: any = {};\n for (const [key, value] of Object.entries(row)) {\n camelCasedRow[camelCase(key)] = value;\n }\n return camelCasedRow;\n });\n }\n\n async queryFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const {\n filter = {},\n fields = [],\n joins = {},\n sort = {},\n limit,\n offset,\n } = context;\n\n // Build base query\n let sql = `SELECT ${fields.length ? fields.join(\", \") : \"*\"} FROM ${tableName}`;\n const params: any[] = [];\n\n // Handle filter\n if (Object.keys(filter).length > 0) {\n sql += \" \" + this.buildWhereClause(filter, params);\n }\n\n // Handle joins\n if (Object.keys(joins).length > 0) {\n sql += \" \" + this.buildJoinClause(joins);\n }\n\n // Handle sort\n if (Object.keys(sort).length > 0) {\n sql +=\n \" ORDER BY \" +\n Object.entries(sort)\n .map(([field, direction]) => `${field} ${direction}`)\n .join(\", \");\n }\n\n // Handle limit and offset\n if (limit !== undefined) {\n sql += ` LIMIT $${params.length + 1}`;\n params.push(limit);\n }\n if (offset !== undefined) {\n sql += ` OFFSET $${params.length + 1}`;\n params.push(offset);\n }\n\n try {\n const result = await this.dbClient.query(sql, params);\n\n const rows = this.toCamelCase(result.rows);\n\n return {\n [`${camelCase(tableName)}s`]: rows,\n rowCount: result.rowCount,\n __success: true,\n ...context,\n };\n } catch (error: any) {\n return {\n ...context,\n errored: true,\n __error: `Query failed: ${error.message}`,\n };\n }\n }\n\n async insertFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const {\n data,\n transaction = true,\n fields = [],\n onConflict,\n awaitExists,\n } = context;\n\n if (!data || (Array.isArray(data) && data.length === 0)) {\n return { errored: true, __error: \"No data provided for insert\" };\n }\n\n const client = transaction ? await this.getClient() : this.dbClient;\n try {\n if (awaitExists) {\n for (const fk of Object.keys(awaitExists)) {\n const value = (data as any)[fk];\n\n if (value === undefined || value === null) continue;\n\n const { table, column } = awaitExists[fk];\n let exists = false;\n let retries = 0;\n const maxRetries = 20;\n while (!exists && retries < maxRetries) {\n const result = await client.query(\n `SELECT EXISTS(SELECT 1 from ${table} WHERE ${column} = ${typeof value === \"string\" ? `'${value}'` : value}) AS \"exists\"`,\n );\n exists = result.rows[0].exists;\n if (exists) break;\n retries++;\n await sleep(100);\n }\n }\n }\n if (transaction) await client.query(\"BEGIN\");\n\n const resolvedData = await this.resolveNestedData(data, tableName);\n const isBatch = Array.isArray(resolvedData);\n const rows = isBatch ? resolvedData : [resolvedData];\n\n const sql = `INSERT INTO ${tableName} (${Object.keys(rows[0]).map(snakeCase).join(\", \")}) VALUES `;\n const values = rows\n .map(\n (row) =>\n `(${Object.values(row)\n .map((value: any, i) => {\n if (typeof value === \"object\" && value?.__effect) {\n if (value.__effect === \"increment\") {\n return `${Object.keys(row)[i]} + 1`;\n }\n if (value.__effect === \"decrement\") {\n return `${Object.keys(row)[i]} - 1`;\n }\n if (value.__effect === \"set\") {\n return `${Object.keys(row)[i]} = ${value.__value}`; // TODO: placeholder, not working\n }\n }\n return `$${i + 1}`;\n })\n .join(\", \")})`,\n )\n .join(\", \");\n const params = rows.flatMap((row) => Object.values(row));\n\n let onConflictSql = \"\";\n if (onConflict) {\n const { target, action } = onConflict;\n onConflictSql += ` ON CONFLICT (${target.join(\", \")})`;\n if (action.do === \"update\") {\n if (!action.set || Object.keys(action.set).length === 0) {\n throw new Error(\"Update action requires 'set' fields\");\n }\n const setClauses = Object.entries(action.set)\n .map(\n ([field, value]) =>\n `${field} = ${value === \"excluded\" ? \"excluded.\" + field : `$${params.length + 1}`}`,\n )\n .join(\", \");\n params.push(\n ...Object.values(action.set).filter(\n (v) => typeof v !== \"string\" || !v.startsWith(\"excluded.\"),\n ),\n );\n onConflictSql += ` DO UPDATE SET ${setClauses}`;\n if (action.where) onConflictSql += ` WHERE ${action.where}`;\n } else {\n onConflictSql += ` DO NOTHING`;\n }\n }\n\n const result = await client.query(\n `${sql} ${values}${onConflictSql} RETURNING ${fields.length ? fields.join(\", \") : \"*\"}`,\n params,\n );\n if (transaction) await client.query(\"COMMIT\");\n const resultRows = this.toCamelCase(result.rows);\n\n return {\n [`${camelCase(tableName)}${isBatch ? \"s\" : \"\"}`]: isBatch\n ? resultRows\n : resultRows[0],\n rowCount: result.rowCount,\n __inserted: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n return {\n ...context,\n errored: true,\n __error: `Insert failed: ${error.message}`,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n }\n\n async updateFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const { data, filter = {}, transaction = true } = context;\n\n if (!data || Object.keys(data).length === 0) {\n return { errored: true, __error: \"No data provided for update\" };\n }\n\n const client = transaction ? await this.getClient() : this.dbClient;\n try {\n if (transaction) await client.query(\"BEGIN\");\n\n const resolvedData = await this.resolveNestedData(data, tableName);\n const params = Object.values(resolvedData);\n\n let offset = 0;\n const setClause = Object.entries(Object.keys(resolvedData))\n .map(([i, key]) => {\n const value = resolvedData[key];\n const offsetIndex = parseInt(i) - offset;\n if (value.__effect === \"increment\") {\n params.splice(offsetIndex, 1);\n offset++;\n return `${snakeCase(key)} = ${snakeCase(key)} + 1`;\n }\n if (value.__effect === \"decrement\") {\n params.splice(offsetIndex, 1);\n offset++;\n return `${snakeCase(key)} = ${snakeCase(key)} - 1`;\n }\n if (value.__effect === \"set\") {\n params.splice(offsetIndex, 1);\n offset++;\n return `${snakeCase(key)} = ${value.__value}`; // TODO: placeholder, not working\n }\n return `${snakeCase(key)} = $${offsetIndex + 1}`;\n })\n .join(\", \");\n\n const whereClause = this.buildWhereClause(filter, params);\n\n const sql = `UPDATE ${tableName} SET ${setClause} ${whereClause} RETURNING *;`;\n const result = await client.query(sql, params);\n if (transaction) await client.query(\"COMMIT\");\n const rows = this.toCamelCase(result.rows);\n\n if (rows.length === 0) {\n return {\n sql,\n params,\n __updated: false,\n };\n }\n\n return {\n [`${camelCase(tableName)}`]: rows[0],\n __updated: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n return {\n ...context,\n errored: true,\n __error: `Update failed: ${error.message}`,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n }\n\n async deleteFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const { filter = {}, transaction = true } = context;\n\n if (Object.keys(filter).length === 0) {\n return { errored: true, __error: \"No filter provided for delete\" };\n }\n\n const client = transaction ? await this.getClient() : this.dbClient;\n try {\n if (transaction) await client.query(\"BEGIN\");\n\n const params: any[] = [];\n const whereClause = this.buildWhereClause(filter, params);\n const sql = `DELETE FROM ${tableName} ${whereClause} RETURNING *`;\n const result = await client.query(sql, params);\n if (transaction) await client.query(\"COMMIT\");\n const rows = this.toCamelCase(result.rows);\n return {\n [`${camelCase(tableName)}`]: rows[0],\n __deleted: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n return {\n errored: true,\n __error: `Delete failed: ${error.message}`,\n __errors: { delete: error.message },\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n }\n\n buildWhereClause(filter: AnyObject, params: any[]): string {\n const conditions = [];\n for (const [key, value] of Object.entries(filter)) {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n conditions.push(\n `${snakeCase(key)} IN (${value\n .map((v) => {\n const val = `$${params.length + 1}`;\n params.push(v);\n return val;\n })\n .join(\", \")})`,\n );\n } else {\n conditions.push(`${snakeCase(key)} = $${params.length + 1}`);\n params.push(value);\n }\n }\n }\n return conditions.length ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n }\n\n buildJoinClause(joins: Record<string, JoinDefinition>): string {\n let joinSql = \"\";\n for (const [table, join] of Object.entries(joins)) {\n joinSql += ` LEFT JOIN ${snakeCase(table)} ${join.alias} ON ${join.on}`;\n if (join.joins) joinSql += \" \" + this.buildJoinClause(join.joins);\n }\n return joinSql;\n }\n\n async resolveNestedData(data: any, tableName: string): Promise<any> {\n if (Array.isArray(data))\n return Promise.all(data.map((d) => this.resolveNestedData(d, tableName)));\n if (typeof data !== \"object\" || data === null) return data;\n\n const resolved = { ...data };\n for (const [key, value] of Object.entries(data)) {\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"subOperation\" in value\n ) {\n const subOp = value as SubOperation;\n const subResult = await this.executeSubOperation(subOp);\n resolved[key] = subResult[subOp.return || \"full\"] ?? subResult;\n } else if (\n typeof value === \"string\" &&\n [\"increment\", \"decrement\", \"set\"].includes(value)\n ) {\n resolved[key] = { __effect: value }; // Placeholder for effect handling (DB-side or app-side)\n } else if (typeof value === \"object\") {\n resolved[key] = await this.resolveNestedData(value, tableName);\n }\n }\n return resolved;\n }\n\n async executeSubOperation(op: SubOperation): Promise<any> {\n const client = await this.getClient();\n try {\n await client.query(\"BEGIN\");\n let result;\n if (op.subOperation === \"insert\") {\n const resolvedData = await this.resolveNestedData(op.data, op.table);\n const sql = `INSERT INTO ${op.table} (${Object.keys(resolvedData).join(\", \")}) VALUES (${Object.values(\n resolvedData,\n )\n .map((_, i) => `$${i + 1}`)\n .join(\n \", \",\n )}) ON CONFLICT DO NOTHING RETURNING ${op.return === \"uuid\" ? \"uuid\" : \"*\"}`;\n result = await client.query(sql, Object.values(resolvedData));\n result = result.rows[0];\n if (!result && op.return === \"uuid\") {\n result = resolvedData.uuid ? { uuid: resolvedData.uuid } : undefined;\n }\n } else if (op.subOperation === \"query\") {\n const params: any[] = [];\n const whereClause = this.buildWhereClause(op.filter || {}, params);\n const sql = `SELECT ${op.fields?.join(\", \") || \"*\"} FROM ${op.table} ${whereClause} LIMIT 1`;\n result = (await client.query(sql, params)).rows[0];\n }\n await client.query(\"COMMIT\");\n return result || {};\n } catch (error) {\n await client.query(\"ROLLBACK\");\n throw error;\n } finally {\n client.release();\n }\n }\n\n createDatabaseTask(\n op: DbOperationType,\n tableName: string,\n table: TableDefinition,\n queryFunction: (tableName: string, context: AnyObject) => Promise<any>,\n options: ServerOptions,\n ) {\n const opAction =\n op === \"query\"\n ? \"queried\"\n : op === \"insert\"\n ? \"inserted\"\n : op === \"update\"\n ? \"updated\"\n : op === \"delete\"\n ? \"deleted\"\n : \"\";\n\n const defaultSignal = `${options.isMeta ? \"meta.\" : \"\"}${tableName}.${opAction}`;\n\n const tableNameFormatted = tableName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n\n const taskName = `db${op.charAt(0).toUpperCase() + op.slice(1)}${tableNameFormatted}`;\n\n Cadenza.createThrottledTask(\n taskName,\n async (context: AnyObject, emit: any) => {\n const triggerConditions: any | undefined =\n table.customSignals?.triggers?.query?.filter(\n (trigger: any) => trigger.condition,\n );\n for (const triggerCondition of triggerConditions ?? []) {\n if (\n triggerCondition.condition &&\n !triggerCondition.condition(context)\n ) {\n return {\n failed: true,\n error: `Condition for signal trigger failed: ${triggerCondition.signal}`,\n };\n }\n }\n\n try {\n context = await queryFunction(\n tableName,\n context.queryData ?? context,\n );\n } catch (e) {\n console.error(\"Database task:\", taskName, \"errored.\", e);\n throw e;\n }\n\n if (!context.errored) {\n for (const signal of table.customSignals?.emissions?.[op] ??\n ([] as any[])) {\n if (signal.condition && !signal.condition(context)) {\n continue;\n }\n emit(signal.signal ?? signal, context);\n }\n }\n\n console.log(\n \"EXECUTED\",\n taskName,\n context.errored\n ? JSON.stringify({\n data: context.data,\n queryData: context.queryData,\n filter: context.filter,\n fields: context.fields,\n joins: context.joins,\n sort: context.sort,\n limit: context.limit,\n offset: context.offset,\n })\n : context[camelCase(tableName)]\n ? JSON.stringify(context[camelCase(tableName)]).slice(0, 140)\n : JSON.stringify(context).slice(0, 140),\n context.__error,\n );\n\n delete context.queryData;\n delete context.data;\n delete context.filter;\n delete context.fields;\n delete context.joins;\n delete context.sort;\n delete context.limit;\n delete context.offset;\n\n return context;\n },\n (context?: AnyObject) =>\n context?.__metadata?.__executionTraceId ??\n context?.__executionTraceId ??\n \"default\",\n `Auto-generated ${op} task for ${tableName}`,\n {\n isMeta: options.isMeta,\n isSubMeta: options.isMeta,\n validateInputContext: false, // TODO\n inputSchema: {\n // TODO\n type: \"object\",\n properties: {\n filter: {\n type: \"object\",\n },\n },\n },\n },\n )\n .doOn(\n ...(table.customSignals?.triggers?.[op]?.map((signal: any) => {\n return typeof signal === \"string\" ? signal : signal.signal;\n }) ?? []),\n )\n .emits(defaultSignal);\n }\n}\n","export function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import Cadenza from \"../../Cadenza\";\nimport { Task } from \"@cadenza.io/core\";\nimport { decomposeSignalName } from \"../../utils/tools\";\n\nexport default class GraphSyncController {\n private static _instance: GraphSyncController;\n public static get instance(): GraphSyncController {\n if (!this._instance) this._instance = new GraphSyncController();\n return this._instance;\n }\n constructor() {\n // Cadenza.broker.clearSignalsTask?.doOn(\"meta.sync_requested\");\n\n Cadenza.createDebounceMetaTask(\n \"Debounce syncing of resources\",\n () => true,\n \"\",\n 500,\n )\n .doAfter(Cadenza.serviceRegistry.handleInstanceUpdateTask)\n .then(\n Cadenza.broker.getSignalsTask!.then(\n Cadenza.registry.getAllTasks.then(Cadenza.registry.getAllRoutines),\n ),\n );\n\n Cadenza.createMetaTask(\"Split routines for registration\", (ctx, emit) => {\n const { __routines } = ctx;\n if (!__routines) return;\n for (const routine of __routines) {\n if (routine.registered) continue;\n routine.registered = true;\n emit(\"meta.sync_controller.routine_added\", {\n data: {\n name: routine.name,\n version: routine.version,\n description: routine.description,\n serviceName: Cadenza.serviceRegistry.serviceName,\n isMeta: routine.isMeta,\n },\n });\n\n for (const task of routine.tasks) {\n const tasks = task.getIterator();\n\n while (tasks.hasNext()) {\n const nextTask = tasks.next();\n emit(\"meta.sync_controller.task_to_routine_map\", {\n data: {\n taskName: nextTask.name,\n taskVersion: nextTask.version,\n routineName: routine.name,\n routineVersion: routine.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n });\n }\n }\n }\n }).doAfter(Cadenza.registry.getAllRoutines);\n\n Cadenza.createMetaTask(\"Split signals for registration\", (ctx, emit) => {\n const { __signals } = ctx;\n if (!__signals) return;\n\n const filteredSignals = __signals\n .filter(\n (signal: { signal: string; data: any }) => !signal.data.registered,\n )\n .map((signal: { signal: string; data: any }) => signal.signal);\n\n for (const signal of filteredSignals) {\n const { isMeta, sourceServiceName, domain, action } =\n decomposeSignalName(signal);\n\n emit(\"meta.sync_controller.signal_added\", {\n data: {\n name: signal,\n sourceServiceName,\n domain,\n action,\n isMeta,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n });\n emit(\"meta.signal.registered\", {\n __signalName: signal,\n });\n }\n }).doAfter(Cadenza.broker.getSignalsTask!);\n\n Cadenza.createMetaTask(\"Split tasks for registration\", (ctx, emit) => {\n const { __tasks } = ctx;\n if (!__tasks) return;\n\n for (const task of __tasks) {\n if (task.registered) continue;\n task.registered = true;\n const { __functionString, __getTagCallback } = task.export();\n emit(\"meta.sync_controller.task_added\", {\n data: {\n name: task.name,\n version: task.version,\n description: task.description,\n functionString: __functionString,\n tagIdGetter: __getTagCallback,\n layerIndex: task.layerIndex,\n concurrency: task.concurrency,\n timeout: task.timeout,\n isUnique: task.isUnique,\n isSignal: task.isSignal,\n isThrottled: task.isThrottled,\n isDebounce: task.isDebounce,\n isEphemeral: task.isEphemeral,\n isMeta: task.isMeta,\n isSubMeta: task.isSubMeta,\n isHidden: task.isHidden,\n // inputSchema: task.inputSchema,\n validateInputContext: task.validateInputContext,\n // outputSchema: task.outputSchema,\n validateOutputContext: task.validateOutputContext,\n retryCount: task.retryCount,\n retryDelay: task.retryDelay,\n retryDelayMax: task.retryDelayMax,\n retryDelayFactor: task.retryDelayFactor,\n service_name: Cadenza.serviceRegistry.serviceName,\n },\n });\n\n task.mapObservedSignals((signal: string) => {\n const firstChar = signal.charAt(0);\n let _signal = signal;\n let signalServiceName;\n if (\n firstChar === firstChar.toUpperCase() &&\n firstChar !== firstChar.toLowerCase()\n ) {\n // TODO handle wildcards\n signalServiceName = signal.split(\".\")[0];\n _signal = signal.split(\".\").slice(1).join(\".\");\n }\n\n emit(\"meta.sync_controller.signal_to_task_map\", {\n data: {\n signalName: _signal,\n taskName: task.name,\n taskVersion: task.version,\n taskServiceName: Cadenza.serviceRegistry.serviceName,\n signalServiceName:\n signalServiceName ?? Cadenza.serviceRegistry.serviceName,\n },\n });\n });\n\n task.mapSignals((signal: string) => {\n emit(\"meta.sync_controller.task_to_signal_map\", {\n data: {\n signalName: signal,\n taskName: task.name,\n taskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n });\n });\n\n task.mapOnFailSignals((signal: string) => {\n emit(\"meta.sync_controller.task_to_signal_map\", {\n // TODO: handle signals that are not observed.\n data: {\n signalName: signal,\n taskName: task.name,\n taskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n isOnFail: true,\n },\n });\n });\n }\n\n for (const task of __tasks) {\n if (task.hidden || !task.register) continue;\n task.mapNext((t: Task) =>\n emit(\"meta.sync_controller.task_map\", {\n data: {\n taskName: t.name,\n taskVersion: t.version,\n predecessorTaskName: task.name,\n predecessorTaskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n }),\n );\n\n if (task.isDeputy && !task.signalName) {\n emit(\"meta.sync_controller.deputy_relationship_created\", {\n data: {\n triggered_task_name: task.remoteRoutineName,\n triggered_task_version: 1,\n triggered_service_name: task.serviceName,\n deputy_task_name: task.name,\n deputy_task_version: task.version,\n deputy_service_name: Cadenza.serviceRegistry.serviceName,\n },\n });\n }\n }\n\n return true;\n }).doAfter(Cadenza.registry.getAllTasks);\n }\n}\n"],"mappings":"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","names":["import_core","uuid","uuid","ctx","import_core","import_uuid","uuid","fetch","express","bodyParser","helmet","cors","ctx","http","fs","https","emit","import_rate_limiter_flexible","import_socket","ctx","import_lodash_es","result","import_uuid","Cadenza","uuid","import_core"]}