@cadenza.io/service 2.2.4 → 2.3.1
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 +51 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +51 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
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/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 AnyObject,\n CadenzaMode,\n DebounceOptions,\n DebounceTask,\n EmitOptions,\n EphemeralTask,\n EphemeralTaskOptions,\n GraphRegistry,\n GraphRoutine,\n GraphRunner,\n InquiryBroker,\n InquiryOptions,\n Intent,\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\";\nimport { formatTimestamp } from \"./utils/tools\";\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\n/**\n * The CadenzaService class serves as a central service layer providing various utility methods for managing tasks, signals, logging, and service interactions.\n * This class handles the initialization (`bootstrap`) and validation of services, as well as the creation of tasks associated with services and signals.\n */\nexport default class CadenzaService {\n public static signalBroker: SignalBroker;\n public static inquiryBroker: InquiryBroker;\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 /**\n * Initializes the application by setting up necessary components and configurations.\n * This method ensures the initialization process is only executed once throughout the application lifecycle.\n *\n * @return {void} This method does not return any value.\n */\n static bootstrap(): void {\n if (this.isBootstrapped) return;\n this.isBootstrapped = true;\n\n Cadenza.bootstrap();\n this.signalBroker = Cadenza.signalBroker;\n this.inquiryBroker = Cadenza.inquiryBroker;\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 /**\n * Validates the provided service name based on specific rules.\n *\n * @param {string} serviceName - The service name to validate. Must be less than 100 characters,\n * must not contain spaces, dots, or backslashes, and must start with a capital letter.\n * @return {void} Throws an error if the service name does not meet the validation criteria.\n * @throws {Error} If the service name exceeds 100 characters.\n * @throws {Error} If the service name contains spaces.\n * @throws {Error} If the service name contains dots.\n * @throws {Error} If the service name contains backslashes.\n * @throws {Error} If the service name does not start with a capital letter.\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 /**\n * Validates the provided name to ensure it meets the required criteria.\n *\n * @param {string} name - The name to be validated.\n * @return {void} Does not return any value.\n */\n protected static validateName(name: string): void {\n Cadenza.validateName(name);\n }\n\n /**\n * Gets the current run strategy from the Cadenza configuration.\n *\n * @return {Function} The run strategy function defined in the Cadenza configuration.\n */\n public static get runStrategy() {\n return Cadenza.runStrategy;\n }\n\n /**\n * Sets the mode for the Cadenza application.\n *\n * @param {CadenzaMode} mode - The mode to be set for the application.\n * @return {void} This method does not return a value.\n */\n public static setMode(mode: CadenzaMode) {\n Cadenza.setMode(mode);\n }\n\n /**\n * Emits a signal with the specified data using the associated broker.\n *\n * @param {string} signal - The name of the event or signal to emit.\n * @param {AnyObject} [data={}] - The data to be emitted along with the signal.\n * @param options\n * @return {void} No return value.\n *\n * @example\n * This is meant to be used as a global event emitter.\n * If you want to emit an event from within a task, you can use the `emit` method provided to the task function. See {@link TaskFunction}.\n * ```ts\n * Cadenza.emit('main.my_event', { foo: 'bar' });\n * ```\n */\n static emit(signal: string, data: AnyObject = {}, options: EmitOptions = {}) {\n Cadenza.emit(signal, data, options);\n }\n\n static debounce(signal: string, context: any = {}, delayMs: number = 500) {\n Cadenza.debounce(signal, context, delayMs);\n }\n\n public static schedule(\n signal: string,\n context: AnyObject,\n timeoutMs: number,\n exactDateTime?: Date,\n ) {\n Cadenza.schedule(signal, context, timeoutMs, exactDateTime);\n }\n\n public static interval(\n signal: string,\n context: AnyObject,\n intervalMs: number,\n leading = false,\n startDateTime?: Date,\n ) {\n Cadenza.interval(signal, context, intervalMs, leading, startDateTime);\n }\n\n public static defineIntent(intent: Intent): Intent {\n this.inquiryBroker?.intents.set(intent.name, intent);\n return intent;\n }\n\n public static async inquire(\n inquiry: string,\n context: AnyObject,\n options?: InquiryOptions,\n ): Promise<AnyObject> {\n return this.inquiryBroker?.inquire(inquiry, context, options);\n }\n\n /**\n * Executes the given task or graph routine within the provided context using the configured runner.\n *\n * @param {Task | GraphRoutine} task - The task or graph routine to be executed.\n * @param {AnyObject} context - The context within which the task will be executed.\n * @return {void}\n *\n * @example\n * ```ts\n * const task = Cadenza.createTask('My task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * });\n *\n * Cadenza.run(task, { foo: 'bar' });\n *\n * const routine = Cadenza.createRoutine('My routine', [task], 'My routine description');\n *\n * Cadenza.run(routine, { foo: 'bar' });\n * ```\n */\n static run(task: Task | GraphRoutine, context: AnyObject) {\n this.runner?.run(task, context);\n }\n /**\n * Logs a message with a specified log level and additional contextual data.\n * Records in the CadenzaDB when available.\n *\n * @param {string} message - The main message to be logged.\n * @param {any} [data={}] - Additional data or metadata to include with the log.\n * @param {\"info\"|\"warning\"|\"error\"|\"critical\"} [level=\"info\"] - The severity level of the log message.\n * @param {string|null} [subjectServiceName=null] - The name of the subject service related to the log.\n * @param {string|null} [subjectServiceInstanceId=null] - The instance ID of the subject service related to the log.\n * @return {void} No return value.\n */\n static log(\n message: string,\n data: any = {},\n level: \"info\" | \"warning\" | \"error\" | \"critical\" = \"info\",\n subjectServiceName: string | null = null,\n subjectServiceInstanceId: string | null = null,\n ) {\n if (level === \"critical\") {\n console.error(\"CRITICAL:\", message, data);\n } else if (level === \"error\") {\n console.error(message, data);\n } else if (level === \"warning\") {\n console.warn(message, data);\n } else {\n console.log(message, data);\n }\n\n this.emit(\"global.meta.system_log.log\", {\n data: {\n data,\n level,\n message,\n serviceName: this.serviceRegistry?.serviceName,\n serviceInstanceId: this.serviceRegistry?.serviceInstanceId,\n subjectServiceName,\n subjectServiceInstanceId,\n created: formatTimestamp(Date.now()),\n },\n });\n }\n\n public static get(taskName: string): Task | undefined {\n return Cadenza.get(taskName);\n }\n\n public static getRoutine(routineName: string): GraphRoutine | undefined {\n return Cadenza.getRoutine(routineName);\n }\n\n /**\n * Creates a new DeputyTask instance based on the provided routine name, service name, and options.\n * This method ensures proper task initialization, including setting a unique name,\n * validation of the routine name, and applying default option values.\n *\n * @param {string} routineName - The name of the routine the task references. This is mandatory and should be a valid string.\n * @param {string|undefined} [serviceName] - The name of the service that the routine belongs to. This is optional and defaults to undefined.\n * @param {TaskOptions} [options={}] - A configuration object for the task, allowing various properties such as concurrency, timeout, and retry settings to be customized.\n * @return {DeputyTask} - A new DeputyTask instance initialized with the specified parameters.\n *\n * @example\n * Let's say we are writing the code for a Service called \"Service1\".\n * We also have an additional service called \"Service2\" with a routine called \"My Routine\".\n * A flow on Service1 depends on the result of \"My Routine\" on Service2.\n * We can create a deputy task for the routine using the following code:\n * ```ts\n * Cadenza.createDeputyTask(\"My Routine\", \"Service2\").then(\n * Cadenza.createTask(\"Handle result\", (ctx) => {\n * console.log(\"'Handle result' executed with context:\", ctx);\n * }),\n * );\n * ```\n * Internally, this will send a request to an available \"Service2\" instance to execute the \"My Routine\" routine.\n * The deputy task will wait for the response and then execute the next task(s) in the chain.\n *\n * You can visualize the execution of the deputy task as follows:\n * ```\n * Service1 flow = [Deputy tasks for \"My Routine\"] -> [\"Handle result\"]\n * || A\n * V ||\n * Service2 flow = [[My Routine]]\n * ```\n *\n * Deputy tasks are useful for delegating flows to other services, allowing for parallel execution and load balancing.\n * But it creates tight coupling between the services, which may not be desirable in some cases.\n * In cases where an event on one service should simply trigger a flow on another service, without the need for a result,\n * it is recommended to use signals instead. Like this:\n *\n * Service1\n * ```ts\n * Cadenza.createTask(\"Generate event\", (ctx, emit) => {\n * // Do something\n * emit(\"some.event\");\n * });\n * ```\n *\n * Service2\n * ```ts\n * Cadenza.createTask(\"Handle event\", (ctx) => {\n * console.log(\"Handle event executed with context:\", ctx);\n * }).doOn(\"Service1.some.event\");\n * ```\n *\n * Every time the \"Generate event\" task is executed, it will emit a signal \"Service1.some.event\" to one Service2 instance and trigger the \"Handle event\" task.\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 = `${routineName} (Proxy)`;\n\n options = {\n concurrency: 100,\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 /**\n * Creates a meta deputy task by setting the `isMeta` property in the options to true,\n * and delegating task creation to the `createDeputyTask` method.\n * See {@link createDeputyTask} and {@link createMetaTask} for more information.\n *\n * @param {string} routineName - The name of the routine associated with the task.\n * @param {string | undefined} [serviceName] - The optional name of the service associated with the task.\n * @param {TaskOptions} [options={}] - Additional options for the task. Defaults to an empty object if not provided.\n * @return {DeputyTask} - The created meta deputy task.\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 /**\n * Creates a throttled deputy task with the specified parameters.\n * See {@link createThrottledTask} and {@link createDeputyTask} for more information.\n *\n * @param {string} routineName - The name of the routine to be executed.\n * @param {string | undefined} [serviceName=undefined] - The name of the service, if applicable.\n * @param {ThrottleTagGetter} [throttledIdGetter=() => \"default\"] - A function to get the throttled tag for the task.\n * @param {TaskOptions} [options={}] - The options for task configuration, including concurrency and callbacks.\n * @return {DeputyTask} The created throttled deputy task.\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 /**\n * Creates a throttled deputy task with meta-task settings enabled.\n * See {@link createThrottledTask},{@link createDeputyTask} and {@link createMetaTask} for more information.\n *\n * @param {string} routineName - The name of the routine for which the task is being created.\n * @param {string|undefined} [serviceName=undefined] - The name of the service associated with the task, or undefined if not applicable.\n * @param {ThrottleTagGetter} [throttledIdGetter=() => \"default\"] - A function to compute or return the throttling identifier.\n * @param {TaskOptions} [options={}] - Additional options for the task configuration.\n * @return {any} Returns the created throttled deputy task instance.\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 /**\n * Creates and configures a signal transmission task that handles the transmission\n * of a specified signal to a target service with a set of customizable options.\n * This is only used for internal purposes and is not exposed to the business logic layer.\n *\n * @param {string} signalName - The name of the signal to be transmitted.\n * @param {string} serviceName - The name of the target service to transmit the signal to.\n * @param {TaskOptions} [options={}] - A set of optional parameters to further configure the task.\n * @return {SignalTransmissionTask} A new instance of SignalTransmissionTask configured with the given parameters.\n */\n static createSignalTransmissionTask(\n signalName: string,\n serviceName: string,\n options: TaskOptions = {},\n ): SignalTransmissionTask | undefined {\n this.bootstrap();\n this.validateName(signalName);\n this.validateName(serviceName);\n\n options = {\n concurrency: 100,\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 = `Transmit signal: ${signalName} to ${serviceName}`;\n if (this.get(name)) {\n return;\n }\n\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 /**\n * Creates and configures a database task that performs an operation on a specified table.\n *\n * @param {string} tableName - The name of the database table on which the operation will be performed.\n * @param {DbOperationType} operation - The type of database operation to execute (e.g., insert, update, delete).\n * @param {string|undefined} [databaseServiceName=undefined] - The name of the database service; defaults to \"default database service\" if not provided.\n * @param {DbOperationPayload} queryData - The data payload required for executing the specified database operation.\n * @param {TaskOptions} [options={}] - Optional configuration for the task, including concurrency, timeout, and retry policies.\n * @return {DatabaseTask} A configured database task instance ready for execution.\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 this.validateName(tableName);\n this.validateName(operation);\n const tableNameFormatted = tableName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n const name = `${operation.charAt(0).toUpperCase() + operation.slice(1)} ${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: 100,\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 /**\n * Creates a task for performing a database insert operation.\n *\n * @param {string} tableName - The name of the table where the insert operation will be performed.\n * @param {string | undefined} [databaseServiceName=undefined] - The name of the database service to use. Optional parameter, defaults to undefined.\n * @param {DbOperationPayload} [queryData={}] - The data payload for the insert operation. Defaults to an empty object.\n * @param {TaskOptions} [options={}] - Additional task options to configure the insert operation. Defaults to an empty object.\n * @return {object} A task configuration object for the database insert operation.\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 /**\n * Creates a database query task for the specified table and configuration.\n *\n * @param {string} tableName - The name of the database table to execute the query on.\n * @param {string | undefined} [databaseServiceName=undefined] - The name of the database service to use. If undefined, the default service will be used.\n * @param {DbOperationPayload} queryData - The payload containing the query data to be executed.\n * @param {TaskOptions} [options={}] - Optional parameters to configure the task execution.\n * @return {Task} The created database query task.\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 /**\n * Creates a database task for the CadenzaDB with the specified parameters.\n *\n * @param {string} tableName - The name of the database table on which the operation will be performed.\n * @param {DbOperationType} operation - The type of database operation to execute (e.g., INSERT, UPDATE, DELETE).\n * @param {DbOperationPayload} queryData - The payload or data required to perform the database operation.\n * @param {TaskOptions} [options={}] - Additional options for the task, such as configuration settings.\n * @return {any} The result of creating the database task.\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 /**\n * Creates a database insert task specifically for the CadenzaDB database.\n *\n * @param {string} tableName - The name of the table into which the data will be inserted.\n * @param {DbOperationPayload} [queryData={}] - An object representing the data to be inserted.\n * @param {TaskOptions} [options={}] - Additional options to customize the task. The `isMeta` property is set to true by default.\n * @return {Task} A task object configured to perform an insert operation in the CadenzaDB database.\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 /**\n * Creates a database query task specifically for the CadenzaDB.\n *\n * @param {string} tableName - The name of the database table to execute the query on.\n * @param {DbOperationPayload} queryData - The payload containing data and parameters for the database operation.\n * @param {TaskOptions} [options={}] - Additional options for the task configuration.\n * @return {any} The created task for executing a database query.\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 new Cadenza service with the specified configuration.\n *\n * @param {string} serviceName - The unique name of the service to create.\n * @param {string} [description] - An optional description of the service.\n * @param {ServerOptions} [options] - An optional object containing configuration options for the service.\n * @return {boolean} Returns true when the service is successfully created.\n */\n static createCadenzaService(\n serviceName: string,\n description: string = \"\",\n options: ServerOptions = {},\n ) {\n if (this.serviceCreated) return;\n this.bootstrap();\n this.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 this.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 this.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 this.createEphemeralMetaTask(\"Create service\", async (context, emit) => {\n emit(\"meta.create_service_requested\", initContext);\n }).doOn(\"meta.fetch.handshake_complete\");\n } else {\n this.emit(\"meta.create_service_requested\", initContext);\n this.createMetaTask(\"Create signal transmission for sync\", (ctx) => {\n this.createSignalTransmissionTask(\n \"global.meta.cadenza_db.gathered_sync_data\",\n ctx.serviceName,\n );\n }).doOn(\"meta.rest.handshake\");\n }\n\n this.createMetaTask(\"Handle service setup completion\", () => {\n GraphMetadataController.instance;\n GraphSyncController.instance.isCadenzaDBReady =\n !!options.cadenzaDB?.connect;\n GraphSyncController.instance.init();\n\n this.log(\"Service created.\");\n\n return true;\n }).doOn(\"meta.service_registry.instance_inserted\");\n\n this.serviceCreated = true;\n }\n\n /**\n * Creates a Cadenza metadata service with the specified name, description, and options.\n *\n * @param {string} serviceName - The name of the metadata service to be created.\n * @param {string} description - A brief description of the metadata service.\n * @param {ServerOptions} [options={}] - Optional configuration for the metadata service. Defaults to an empty object.\n * @return {void} Does not return a value.\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 /**\n * Creates and initializes a database service with the provided name, schema, and configuration options.\n * This method is not supported in a browser environment and will log a warning if called in such an environment.\n *\n * @param {string} name - The name of the database service to be created.\n * @param {SchemaDefinition} schema - The schema definition for the database service.\n * @param {string} [description=\"\"] - An optional description of the database service.\n * @param {ServerOptions & DatabaseOptions} [options={}] - Optional configuration settings for the database and server.\n * @return {void} This method does not return a value.\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 console.log(\"Creating database service\", options);\n\n this.emit(\"meta.database_init_requested\", {\n schema,\n databaseName: options.databaseName,\n options,\n });\n\n this.createMetaTask(\"Set database connection\", () => {\n this.createMetaTask(\"Insert database service\", (_, emit) => {\n emit(\"global.meta.created_database_service\", {\n data: {\n service_name: name,\n description,\n schema,\n is_meta: options.isMeta,\n },\n });\n this.log(\"Database service created\", {\n name,\n isMeta: options.isMeta,\n });\n }).doOn(\"meta.service_registry.service_inserted\");\n\n this.createCadenzaService(name, description, options);\n }).doOn(\"meta.database.setup_done\");\n }\n\n /**\n * Creates a meta database service with the specified configuration.\n *\n * @param {string} name - The name of the database service to be created.\n * @param {SchemaDefinition} schema - The schema definition for the database.\n * @param {string} [description=\"\"] - An optional description of the database service.\n * @param {ServerOptions & DatabaseOptions} [options={}] - Optional server and database configuration options. The `isMeta` flag will be automatically set to true.\n * @return {void} - This method does not return a value.\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 and registers a new task with the provided name, function, and optional details.\n *\n * @param {string} name - The name of the task to be created.\n * @param {TaskFunction} func - The function that contains the task execution logic.\n * @param {string} [description] - An optional description of what the task does.\n * @param {TaskOptions} [options={}] - An optional configuration object specifying additional task options.\n * @return {Task} - The created task instance.\n *\n * @example\n * You can use arrow functions to create tasks.\n * ```ts\n * const task = Cadenza.createTask('My task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * }, 'My task description');\n * ```\n *\n * You can also use named functions to create tasks.\n * This is the preferred way to create tasks since it allows for code inspection in the CadenzaUI.\n * ```ts\n * function myTask(ctx) {\n * console.log('My task executed with context:', ctx);\n * }\n *\n * const task = Cadenza.createTask('My task', myTask);\n * ```\n *\n * ** Use the TaskOptions object to configure the task. **\n *\n * With concurrency limit, timeout limit and retry settings.\n * ```ts\n * Cadenza.createTask('My task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * }, 'My task description', {\n * concurrency: 10,\n * timeout: 10000,\n * retryCount: 3,\n * retryDelay: 1000,\n * retryDelayFactor: 1.5,\n * });\n * ```\n *\n * You can specify the input and output context schemas for the task.\n * ```ts\n * Cadenza.createTask('My task', (ctx) => {\n * return { bar: 'foo' + ctx.foo };\n * }, 'My task description', {\n * inputContextSchema: {\n * type: 'object',\n * properties: {\n * foo: {\n * type: 'string',\n * },\n * },\n * required: ['foo'],\n * },\n * validateInputContext: true, // default is false\n * outputContextSchema: {\n * type: 'object',\n * properties: {\n * bar: {\n * type: 'string',\n * },\n * },\n * required: ['bar'],\n * },\n * validateOutputContext: true, // default is false\n * });\n * ```\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 meta task with the specified name, functionality, description, and options.\n * This is used for creating tasks that lives on the meta layer.\n * The meta layer is a special layer that is executed separately from the business logic layer and is used for extending Cadenzas core functionality.\n * See {@link Task} or {@link createTask} for more information.\n *\n * @param {string} name - The name of the meta task.\n * @param {TaskFunction} func - The function to be executed by the meta task.\n * @param {string} [description] - An optional description of the meta task.\n * @param {TaskOptions} [options={}] - Additional optional task configuration. Automatically sets `isMeta` to true.\n * @return {Task} A task instance configured as a meta task.\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 unique task by wrapping the provided task function with a uniqueness constraint.\n * Unique tasks are designed to execute once per execution ID, merging parents. This is useful for\n * tasks that require fan-in/joins after parallel branches.\n * See {@link Task} for more information.\n * @param {string} name Unique identifier.\n * @param {TaskFunction} func Function receiving joinedContexts as a list (context.joinedContexts).\n * @param {string} [description] Optional description.\n * @param {TaskOptions} [options={}] Optional task options.\n * @returns {Task} The created UniqueTask.\n *\n * @example\n * ```ts\n * const splitTask = Cadenza.createTask('Split foos', function* (ctx) {\n * for (const foo of ctx.foos) {\n * yield { foo };\n * }\n * }, 'Splits a list of foos into multiple sub-branches');\n *\n * const processTask = Cadenza.createTask('Process foo', (ctx) => {\n * return { bar: 'foo' + ctx.foo };\n * }, 'Process a foo');\n *\n * const uniqueTask = Cadenza.createUniqueTask('Gather processed foos', (ctx) => {\n * // A unique task will always be provided with a list of contexts (ctx.joinedContexts) from its predecessors.\n * const processedFoos = ctx.joinedContexts.map((c) => c.bar);\n * return { foos: processedFoos };\n * }, 'Gathers together the processed foos.');\n *\n * splitTask.then(\n * processTask.then(\n * uniqueTask,\n * ),\n * );\n *\n * // Give the flow a name using a routine\n * Cadenza.createRoutine(\n * 'Process foos',\n * [splitTask],\n * 'Processes a list of foos'\n * ).doOn('main.received_foos'); // Subscribe to a signal\n *\n * // Trigger the flow from anywhere\n * Cadenza.emit('main.received_foos', { foos: ['foo1', 'foo2', 'foo3'] });\n * ```\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 unique meta task with the specified name, function, description, and options.\n * See {@link createUniqueTask} and {@link createMetaTask} for more information.\n *\n * @param {string} name - The name of the task to create.\n * @param {TaskFunction} func - The function to execute when the task is run.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions} [options={}] - Optional settings for the task. Defaults to an empty object. Automatically sets `isMeta` and `isUnique` to true.\n * @return {Task} The created unique meta task.\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 throttled task with a concurrency limit of 1, ensuring that only one instance of the task can run at a time for a specific throttle tag.\n * This is useful for ensuring execution order and preventing race conditions.\n * See {@link Task} for more information.\n *\n * @param {string} name - The name of the task.\n * @param {TaskFunction} func - The function to be executed when the task runs.\n * @param {ThrottleTagGetter} [throttledIdGetter=() => \"default\"] - A function that generates a throttle tag identifier to group tasks for throttling.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions} [options={}] - Additional options to customize the task behavior.\n * @return {Task} The created throttled task.\n *\n * @example\n * ```ts\n * const task = Cadenza.createThrottledTask(\n * 'My task',\n * async (ctx) => {\n * await new Promise((resolve) => setTimeout(resolve, 1000));\n * console.log('My task executed with context:', ctx);\n * },\n * // Will throttle by the value of ctx.foo to make sure tasks with the same value are executed sequentially\n * (ctx) => ctx.foo,\n * );\n *\n * Cadenza.run(task, { foo: 'bar' }); // (First execution)\n * Cadenza.run(task, { foo: 'bar' }); // This will be executed after the first execution is finished\n * Cadenza.run(task, { foo: 'baz' }); // This will be executed in parallel with the first execution\n * ```\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 throttled meta task with the specified configuration.\n * See {@link createThrottledTask} and {@link createMetaTask} for more information.\n *\n * @param {string} name - The name of the throttled meta task.\n * @param {TaskFunction} func - The task function to be executed.\n * @param {ThrottleTagGetter} throttledIdGetter - A function to retrieve the throttling identifier.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions} [options={}] - Additional options for configuring the task.\n * @return {Task} The created throttled meta task.\n */\n static createThrottledMetaTask(\n name: string,\n func: TaskFunction,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\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 and returns a new debounced task with the specified parameters.\n * This is useful to prevent rapid execution of tasks that may be triggered by multiple events within a certain time frame.\n * See {@link DebounceTask} for more information.\n *\n * @param {string} name - The unique name of the task to be created.\n * @param {TaskFunction} func - The function to be executed by the task.\n * @param {string} [description] - An optional description of the task.\n * @param {number} [debounceTime=1000] - The debounce time in milliseconds to delay the execution of the task.\n * @param {TaskOptions & DebounceOptions} [options={}] - Additional configuration options for the task, including debounce behavior and other task properties.\n * @return {DebounceTask} A new instance of the DebounceTask with the specified configuration.\n *\n * @example\n * ```ts\n * const task = Cadenza.createDebounceTask(\n * 'My debounced task',\n * (ctx) => {\n * console.log('My task executed with context:', ctx);\n * },\n * 'My debounced task description',\n * 100, // Debounce time in milliseconds. Default is 1000\n * {\n * leading: false, // Should the first execution of a burst be executed immediately? Default is false\n * trailing: true, // Should the last execution of a burst be executed? Default is true\n * maxWait: 1000, // Maximum time in milliseconds to wait for the next execution. Default is 0\n * },\n * );\n *\n * Cadenza.run(task, { foo: 'bar' }); // This will not be executed\n * Cadenza.run(task, { foo: 'bar' }); // This will not be executed\n * Cadenza.run(task, { foo: 'baz' }); // This execution will be delayed by 100ms\n * ```\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 debounced meta task with the specified parameters.\n * See {@link createDebounceTask} and {@link createMetaTask} for more information.\n *\n * @param {string} name - The name of the task.\n * @param {TaskFunction} func - The function to be executed by the task.\n * @param {string} [description] - Optional description of the task.\n * @param {number} [debounceTime=1000] - The debounce delay in milliseconds.\n * @param {TaskOptions & DebounceOptions} [options={}] - Additional configuration options for the task.\n * @return {DebounceTask} Returns an instance of the debounced meta task.\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 ephemeral task with the specified configuration.\n * Ephemeral tasks are designed to self-destruct after execution or a certain condition is met.\n * This is useful for transient tasks such as resolving promises or performing cleanup operations.\n * They are not registered by default.\n * See {@link EphemeralTask} for more information.\n *\n * @param {string} name - The name of the task to be created.\n * @param {TaskFunction} func - The function that defines the logic of the task.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions & EphemeralTaskOptions} [options={}] - The configuration options for the task, including concurrency, timeouts, and retry policies.\n * @return {EphemeralTask} The created ephemeral task instance.\n *\n * @example\n * By default, ephemeral tasks are executed once and destroyed after execution.\n * ```ts\n * const task = Cadenza.createEphemeralTask('My ephemeral task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * });\n *\n * Cadenza.run(task); // Executes the task once and destroys it after execution\n * Cadenza.run(task); // Does nothing, since the task is destroyed\n * ```\n *\n * Use destroy condition to conditionally destroy the task\n * ```ts\n * const task = Cadenza.createEphemeralTask(\n * 'My ephemeral task',\n * (ctx) => {\n * console.log('My task executed with context:', ctx);\n * },\n * 'My ephemeral task description',\n * {\n * once: false, // Should the task be executed only once? Default is true\n * destroyCondition: (ctx) => ctx.foo > 10, // Should the task be destroyed after execution? Default is undefined\n * },\n * );\n *\n * Cadenza.run(task, { foo: 5 }); // The task will not be destroyed and can still be executed\n * Cadenza.run(task, { foo: 10 }); // The task will not be destroyed and can still be executed\n * Cadenza.run(task, { foo: 20 }); // The task will be destroyed after execution and cannot be executed anymore\n * Cadenza.run(task, { foo: 30 }); // This will not be executed\n * ```\n *\n * A practical use case for ephemeral tasks is to resolve a promise upon some external event.\n * ```ts\n * const task = Cadenza.createTask('Confirm something', (ctx, emit) => {\n * return new Promise((resolve) => {\n * ctx.foo = uuid();\n *\n * Cadenza.createEphemeralTask(`Resolve promise of ${ctx.foo}`, (c) => {\n * console.log('My task executed with context:', ctx);\n * resolve(c);\n * }).doOn(`socket.confirmation_received:${ctx.foo}`);\n *\n * emit('this_domain.confirmation_requested', ctx);\n * });\n * });\n * ```\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 ephemeral meta task with the specified name, function, description, and options.\n * See {@link createEphemeralTask} and {@link createMetaTask} for more details.\n *\n * @param {string} name - The name of the task to be created.\n * @param {TaskFunction} func - The function to be executed as part of the task.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions & EphemeralTaskOptions} [options={}] - Additional options for configuring the task.\n * @return {EphemeralTask} The created ephemeral meta task.\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 new routine with the specified name, tasks, and an optional description.\n * Routines are named entry points to starting tasks and are registered in the GraphRegistry.\n * They are used to group tasks together and provide a high-level structure for organizing and managing the execution of a set of tasks.\n * See {@link GraphRoutine} for more information.\n *\n * @param {string} name - The name of the routine to create.\n * @param {Task[]} tasks - A list of tasks to include in the routine.\n * @param {string} [description=\"\"] - An optional description for the routine.\n * @return {GraphRoutine} A new instance of the GraphRoutine containing the specified tasks and description.\n *\n * @example\n * ```ts\n * const task1 = Cadenza.createTask(\"Task 1\", () => {});\n * const task2 = Cadenza.createTask(\"Task 2\", () => {});\n *\n * task1.then(task2);\n *\n * const routine = Cadenza.createRoutine(\"Some routine\", [task1]);\n *\n * Cadenza.run(routine);\n *\n * // Or, routines can be triggered by signals\n * routine.doOn(\"some.signal\");\n *\n * Cadenza.emit(\"some.signal\", {});\n * ```\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 meta routine with a given name, tasks, and optional description.\n * Routines are named entry points to starting tasks and are registered in the GraphRegistry.\n * They are used to group tasks together and provide a high-level structure for organizing and managing the execution of a set of tasks.\n * See {@link GraphRoutine} and {@link createRoutine} for more information.\n *\n * @param {string} name - The name of the routine to be created.\n * @param {Task[]} tasks - An array of tasks that the routine will consist of.\n * @param {string} [description=\"\"] - An optional description for the routine.\n * @return {GraphRoutine} A new instance of the `GraphRoutine` representing the created routine.\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, InquiryOptions, 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\n/**\n * Represents a task that delegates execution of a routine to a remote system or service.\n * The `DeputyTask` serves as a proxy to perform and track the progress of a remote workflow.\n * It extends the `Task` class with additional delegation capabilities.\n *\n * Emits various meta-signals for monitoring delegation progress and resolution.\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 registeredDeputyMap: boolean = false;\n\n /**\n * Constructs a new instance of the class with the specified parameters.\n *\n * @param {string} name - The name of the task.\n * @param {string} remoteRoutineName - The name of the remote routine to delegate tasks to.\n * @param {string | undefined} [serviceName=undefined] - The name of the service associated with the task.\n * @param {string} [description=\"\"] - A brief description of the task.\n * @param {number} [concurrency=0] - The concurrency level of the task.\n * @param {number} [timeout=0] - The timeout duration for the task.\n * @param {boolean} [register=true] - Whether the task should be registered in the system.\n * @param {boolean} [isUnique=false] - Whether the task is unique.\n * @param {boolean} [isMeta=false] - Whether the task is a meta task.\n * @param {boolean} [isSubMeta=false] - Whether the task is a sub-meta task.\n * @param {boolean} [isHidden=false] - Whether the task is hidden from the system.\n * @param {ThrottleTagGetter | undefined} [getTagCallback=undefined] - A callback function to retrieve throttle tags.\n * @param {SchemaDefinition | undefined} [inputSchema=undefined] - The input schema definition for the task.\n * @param {boolean} [validateInputContext=false] - Whether to validate the input context against the input schema.\n * @param {SchemaDefinition | undefined} [outputSchema=undefined] - The output schema definition for the task.\n * @param {boolean} [validateOutputContext=false] - Whether to validate the output context against the output schema.\n * @param {number} [retryCount=0] - The number of retries allowed for task execution.\n * @param {number} [retryDelay=0] - The initial delay between retries in milliseconds.\n * @param {number} [retryDelayMax=0] - The maximum retry delay in milliseconds.\n * @param {number} [retryDelayFactor=1] - The factor by which to increase the retry delay for subsequent retries.\n * @return {void} This constructor does not return a value.\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 inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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 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.attachSignal(\"meta.deputy.delegation_requested\");\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 * Executes the specified task function within the provided execution context.\n *\n * @param {GraphContext} context - The execution context containing methods and metadata for task execution.\n * @param {function(string, AnyObject): void} emit - A function for emitting signals with associated data during execution.\n * @param inquire\n * @param {function(number): void} progressCallback - A callback function to report progress updates during task processing.\n * @param {{ nodeId: string, routineExecId: string }} nodeData - Object containing identifiers for the node and routine execution.\n * @return {TaskResult} Returns the result of the task function execution.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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, inquire, progressCallback);\n }\n}\n","import DeputyTask from \"./DeputyTask\";\nimport { GraphContext, InquiryOptions } 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\n/**\n * Represents a specialized task for delegating database operations. Extends `DeputyTask`.\n * This class is designed to abstract database operation requests, delegating execution to a meta-layer system.\n */\nexport default class DatabaseTask extends DeputyTask {\n private readonly queryData: DbOperationPayload;\n\n /**\n * Constructs an instance of the class with the provided parameters, defining\n * various configuration options and behaviors for the task.\n *\n * @param {string} name - The unique name of the task.\n * @param {string} taskName - The specific name of the task.\n * @param {string | undefined} serviceName - The associated service name. Defaults to undefined.\n * @param {string} description - A brief description of the task. Defaults to an empty string.\n * @param {DbOperationPayload} queryData - The data payload for database operations.\n * @param {number} concurrency - The level of concurrency allowed. Defaults to 0.\n * @param {number} timeout - The timeout duration in milliseconds. Defaults to 0.\n * @param {boolean} register - A flag indicating whether to register the task. Defaults to true.\n * @param {boolean} isUnique - Indicates if the task instance is unique. Defaults to false.\n * @param {boolean} isMeta - Indicates if the task is meta. Defaults to false.\n * @param {boolean} isSubMeta - Indicates if the task is a sub-meta task. Defaults to false.\n * @param {boolean} isHidden - Indicates if the task is hidden. Defaults to false.\n * @param {ThrottleTagGetter | undefined} getTagCallback - A callback used for throttling. Defaults to undefined.\n * @param {SchemaDefinition | undefined} inputSchema - The schema definition for input validation. Defaults to undefined.\n * @param {boolean} validateInputContext - Whether to validate the input context. Defaults to false.\n * @param {SchemaDefinition | undefined} outputSchema - The schema definition for output validation. Defaults to undefined.\n * @param {boolean} validateOutputContext - Whether to validate the output context. Defaults to false.\n * @param {number} retryCount - The maximum number of retry attempts. Defaults to 0.\n * @param {number} retryDelay - The delay between retries in milliseconds. Defaults to 0.\n * @param {number} retryDelayMax - The maximum delay between retries in milliseconds. Defaults to 0.\n * @param {number} retryDelayFactor - The factor for exponential backoff. Defaults to 1.\n * @return {void}\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 * Executes the specified task within the given context.\n *\n * @param {GraphContext} context - The execution context for the current task, which includes data and metadata required for processing.\n * @param {(signal: string, ctx: AnyObject) => void} emit - A function used to send signals or events during task execution.\n * @param inquire\n * @param {(progress: number) => void} progressCallback - A function to report execution progress as a percentage (0-100).\n * @param {{ nodeId: string; routineExecId: string }} nodeData - An object containing identifiers for the current node and routine execution.\n * @return {TaskResult} The result of the task execution.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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, inquire, progressCallback);\n }\n}\n","/**\n * A boolean variable indicating whether the current runtime environment is Node.js.\n *\n * This variable checks for the presence of the `process` object, which is specific to Node.js,\n * and verifies if the `process.versions.node` property is defined to confirm the environment.\n *\n * If the runtime is Node.js, `isNode` will be `true`; otherwise, it will be `false`.\n */\nexport const isNode =\n typeof process !== \"undefined\" && process.versions?.node != null;\n\n/**\n * A boolean variable that indicates whether the current runtime environment\n * is a browser. It checks for the presence of the `window` object and the\n * `document` property within it to determine if the code is running in a\n * browser context.\n *\n * - Returns `true` if the `window` object and its `document` property are\n * both defined, which typically indicates a browser environment.\n * - Returns `false` if the `window` object or `document` property is\n * undefined, which typically signifies a non-browser environment such\n * as a Node.js environment.\n */\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n","import { GraphRoutine, 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\n/**\n * The ServiceRegistry class is a singleton that manages the registration and lifecycle of\n * service instances, deputies, and remote signals in a distributed service architecture.\n * It handles various tasks such as instance updates, remote signal registration,\n * service status synchronization, and error/event broadcasting.\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, Set<string>> = 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 handleGlobalSignalRegistrationTask: Task;\n handleSocketStatusUpdateTask: Task;\n fullSyncTask: GraphRoutine;\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 /**\n * Initializes a private constructor for managing service instances, remote signals,\n * service health, and handling updates or synchronization tasks. The constructor\n * creates a variety of meta tasks that process different lifecycle events and\n * service-related updates in a distributed service registry model.\n *\n * @return {Object} An instance of the constructed class with initialized tasks\n * and state management necessary to process service-related events.\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 instances.push(serviceInstance);\n }\n\n if (this.serviceName === serviceName) {\n return false;\n }\n\n if (\n (!isFrontend && this.deputies.has(serviceName)) ||\n this.remoteSignals.has(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 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 ) {\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 instances\n ?.filter(\n (i: any) =>\n i.address === address &&\n i.port === port &&\n i.clientCreated &&\n i.isActive,\n )\n .forEach((i: any) => {\n i.clientCreated = true;\n });\n }\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 \"global.meta.service_instance.inserted\",\n \"global.meta.service_instance.updated\",\n \"meta.service_instance.inserted\",\n \"meta.service_instance.updated\",\n \"meta.socket_client.status_received\",\n )\n .attachSignal(\"meta.service_registry.dependee_registered\");\n\n Cadenza.createMetaTask(\"Split service instances\", function* (ctx: any) {\n if (!ctx.serviceInstances) {\n return;\n }\n\n for (const serviceInstance of ctx.serviceInstances) {\n yield { serviceInstance };\n }\n })\n .doOn(\"meta.service_registry.registered_global_signals\")\n .then(this.handleInstanceUpdateTask);\n\n this.handleGlobalSignalRegistrationTask = Cadenza.createMetaTask(\n \"Handle global Signal Registration\",\n (ctx) => {\n const { signalToTaskMaps } = ctx;\n const sortedSignalToTaskMap = signalToTaskMaps.sort(\n (a: any, b: any) => {\n if (a.deleted && !b.deleted) return -1;\n if (!a.deleted && b.deleted) return 1;\n return 0;\n },\n );\n\n const locallyEmittedSignals = Cadenza.signalBroker\n .listEmittedSignals()\n .filter((s: any) => s.startsWith(\"global.\"));\n\n for (const map of sortedSignalToTaskMap) {\n if (map.deleted) {\n this.remoteSignals.get(map.serviceName)?.delete(map.signalName);\n\n if (!this.remoteSignals.get(map.serviceName)?.size) {\n this.remoteSignals.delete(map.serviceName);\n }\n\n Cadenza.get(\n `Transmit signal: ${map.signalName} to ${map.serviceName}`,\n )?.destroy();\n continue;\n }\n\n if (locallyEmittedSignals.includes(map.signalName)) {\n if (!this.remoteSignals.get(map.serviceName)) {\n this.remoteSignals.set(map.serviceName, new Set());\n }\n\n if (!this.remoteSignals.get(map.serviceName)?.has(map.signalName)) {\n Cadenza.createSignalTransmissionTask(\n map.signalName,\n map.serviceName,\n );\n }\n\n this.remoteSignals.get(map.serviceName)?.add(map.signalName);\n }\n }\n\n return true;\n },\n \"Handles registration of remote signals\",\n )\n .emits(\"meta.service_registry.registered_global_signals\")\n .doOn(\"global.meta.cadenza_db.gathered_sync_data\");\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\n Cadenza.log(\n \"Service not responding.\",\n {\n serviceName,\n serviceAddress,\n servicePort,\n instances,\n },\n \"warning\",\n serviceName,\n );\n\n for (const instance of instances ?? []) {\n instance.isActive = false;\n instance.isNonResponsive = true;\n emit(\"global.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\n return true;\n },\n \"Handles service not responding\",\n )\n .doOn(\"meta.fetch.handshake_failed\", \"meta.socket_client.disconnected\")\n .attachSignal(\"global.meta.service_registry.service_not_responding\");\n\n this.handleServiceHandshakeTask = Cadenza.createMetaTask(\n \"Handle service handshake\",\n (ctx, emit) => {\n const { serviceName, serviceInstanceId } = ctx;\n const serviceInstances = this.instances.get(serviceName);\n const instance = serviceInstances?.find(\n (i) => i.uuid === serviceInstanceId,\n );\n\n if (!instance) {\n return false;\n }\n\n instance.isActive = true;\n instance.isNonResponsive = false;\n emit(\"global.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 )\n .doOn(\"meta.fetch.handshake_complete\")\n .attachSignal(\"global.meta.service_registry.service_handshake\");\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 const mergeSyncDataTask = Cadenza.createUniqueMetaTask(\n \"Merge sync data\",\n (ctx) => {\n let joinedContext: any = {};\n ctx.joinedContexts.forEach((ctx: any) => {\n joinedContext = { ...joinedContext, ...ctx };\n });\n return joinedContext;\n },\n ).then(this.handleGlobalSignalRegistrationTask);\n\n this.fullSyncTask = Cadenza.createMetaRoutine(\"Full sync\", [\n Cadenza.createCadenzaDBQueryTask(\"signal_to_task_map\", {\n filter: {\n isGlobal: true,\n },\n fields: [\"signal_name\", \"service_name\", \"deleted\"],\n }).then(mergeSyncDataTask),\n 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 }).then(mergeSyncDataTask),\n ]).doOn(\"meta.sync_requested\");\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) => {\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 ).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(\"global.meta.service_instance.deleted\");\n\n this.getBalancedInstance = Cadenza.createMetaTask(\n \"Get balanced instance\",\n (context, emit) => {\n const { __serviceName, __triedInstances, __retries, __broadcast } =\n 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 for ${__serviceName}. Retries: ${retries}. ${this.instances.get(\n __serviceName,\n )}`;\n emit(\n `meta.service_registry.load_balance_failed:${context.__metadata.__deputyExecId}`,\n context,\n );\n return context;\n }\n\n if (__broadcast || 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 )\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 .attachSignal(\n \"meta.service_registry.load_balance_failed\",\n \"meta.service_registry.selected_instance_for_socket\",\n \"meta.service_registry.selected_instance_for_fetch\",\n \"meta.service_registry.socket_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 .emits(\"meta.service_registry.service_inserted\")\n .emitsOnFail(\"meta.service_registry.service_insertion_failed\");\n\n this.insertServiceInstanceTask = Cadenza.createCadenzaDBInsertTask(\n \"serviceInstance\",\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(\"global.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 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\"],\n filter: {\n global: true,\n },\n }).then(\n Cadenza.createMetaTask(\n // TODO this is outdated. Fix it.\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, InquiryOptions, 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\n/**\n * Represents a task responsible for transmitting signals to a remote service\n * through the meta-layer for operations delegation.\n *\n * @class\n * @extends Task\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 new instance of the class and initializes it with the provided parameters.\n *\n * @param {string} name - The name of the task being created.\n * @param {string} signalName - The name of the signal associated with this task.\n * @param {string} serviceName - The name of the service associated with this task.\n * @param {string} [description=\"\"] - An optional description of the task.\n * @param {number} [concurrency=0] - The maximum allowed concurrency for this task.\n * @param {number} [timeout=0] - The maximum execution time for this task, in milliseconds.\n * @param {boolean} [register=true] - Whether the task should be registered upon creation.\n * @param {boolean} [isUnique=false] - Indicates if the task should enforce uniqueness.\n * @param {boolean} [isMeta=false] - Specifies if the task is a meta-task.\n * @param {boolean} [isSubMeta=false] - Specifies if the task is a sub-meta-task.\n * @param {boolean} [isHidden=false] - Indicates if the task is hidden from visibility.\n * @param {ThrottleTagGetter|undefined} [getTagCallback=undefined] - A callback for tag throttling logic.\n * @param {SchemaDefinition|undefined} [inputSchema=undefined] - An optional schema for validating input data.\n * @param {boolean} [validateInputContext=false] - Whether to validate the input context against the input schema.\n * @param {SchemaDefinition|undefined} [outputSchema=undefined] - An optional schema for validating output data.\n * @param {boolean} [validateOutputContext=false] - Whether to validate the output context against the output schema.\n * @param {number} [retryCount=0] - The number of retry attempts allowed in case of task failure.\n * @param {number} [retryDelay=0] - The initial delay before retrying a failed task, in milliseconds.\n * @param {number} [retryDelayMax=0] - The maximum delay between retry attempts, in milliseconds.\n * @param {number} [retryDelayFactor=1] - A multiplier applied to retry delay for exponential backoff.\n * @return {void} Does not return a value.\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 = true,\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 = (context: AnyObject): TaskResult => {\n context.__routineExecId = uuid();\n return context;\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.doOn(signalName);\n this.then(Cadenza.serviceRegistry.getBalancedInstance);\n }\n\n /**\n * Executes the given task function within the provided execution context.\n *\n * @param {GraphContext} context - The context object providing the graph execution environment and metadata.\n * @param {Function} emit - A function to emit signals with the provided name and context.\n * @param inquire\n * @param {Function} progressCallback - A callback function to report the progress of the task execution as a number between 0 and 1.\n * @return {TaskResult} The result of the executed task function.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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 __localServiceName: Cadenza.serviceRegistry.serviceName,\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 __signalEmissionId: metadata.__signalEmission?.uuid,\n ...ctx,\n };\n\n return this.taskFunction(deputyContext, emit, inquire, 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\n/**\n * RestController class is responsible for managing RESTful interactions, including defining\n * server configurations and handling client requests. It serves as a singleton, accessible via\n * the `instance` property.\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 /**\n * Fetches data from the given URL with a specified timeout. This function performs\n * a fetch request with the ability to cancel the request if it exceeds the provided timeout duration.\n *\n * @param {string} url - The URL to make the request to.\n * @param {any} requestInit - The initialization object for the fetch request, which may include method, headers, and body.\n * @param {number} timeoutMs - The maximum duration in milliseconds to wait for the fetch request to complete before aborting.\n * @returns {Promise<any>} A promise that resolves to the parsed response data if the request is successful.\n * @throws {Error} Throws an error if the request fails due to issues such as timeout or other unexpected errors.\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 Cadenza.log(\n \"Fetch request timed out.\",\n { error, URL: url, requestInit },\n \"warning\",\n );\n // Handle timeout specifically\n } else {\n Cadenza.log(\n \"Fetch request error.\",\n { error, URL: url, requestInit },\n \"error\",\n );\n // Handle other errors\n }\n throw error; // Re-throw to propagate the error\n }\n };\n\n /**\n * Constructor for initializing the REST server and related configurations.\n *\n * This method configures and sets up the REST server tasks using Cadenza's meta-task system, defining certain endpoints\n * like `/handshake`, `/delegation`, `/signal`, and `/status`. It also integrates security settings, CORS policies,\n * and rate-limiting profiles (low, medium, high) based on the provided context. Furthermore, it starts the server and\n * establishes necessary meta-handlings to enable delegated operations and signal processing.\n *\n * It initializes and configures the REST server tasks.\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 )\n .attachSignal(\"meta.rest.browser_detected\")\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 Cadenza.log(\"New fetch connection.\", req.body);\n Cadenza.emit(\"meta.rest.handshake\", req.body);\n res.send({\n __status: \"success\",\n __serviceInstanceId:\n Cadenza.serviceRegistry.serviceInstanceId,\n });\n } catch (e) {\n Cadenza.log(\n \"Error in fetch handshake\",\n { error: e, body: req.body },\n \"error\",\n );\n res.send({ __status: \"error\" });\n }\n });\n\n app.post(\"/delegation\", (req: Request, res: Response) => {\n let deputyExecId;\n let ctx;\n ctx = req.body;\n deputyExecId = ctx.__metadata.__deputyExecId;\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n (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.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 if (\n !Cadenza.signalBroker\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 Cadenza.log(\n \"Error in REST signal consumption\",\n { error: e, ...ctx },\n \"error\",\n );\n res.send({\n __status: \"error\",\n __error: e,\n });\n return;\n }\n\n Cadenza.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.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) => {\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(\n `Server is running on ${address}:${port}`,\n );\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 delete ctx.__app;\n\n return ctx;\n },\n \"Configures network mode\",\n )\n .emits(\"global.meta.rest.network_configured\")\n .emitsOnFail(\"meta.rest.network_configuration_failed\")\n .then(\n Cadenza.createMetaTask(\n \"Connect delegation to runner\",\n () => {\n Cadenza.createMetaTask(\n \"Start run\",\n (context, emit: any) => {\n if (context.task || context.routine) {\n const routine = context.task ?? context.routine;\n delete context.task;\n delete context.routine;\n context.__routineExecId =\n context.__metadata?.__deputyExecId ?? null;\n context.__isDeputy = true;\n Cadenza.runner.run(routine, context);\n return true;\n } else {\n context.errored = true;\n context.__error = \"No routine or task defined.\";\n emit(\"meta.runner.failed\", context);\n return false;\n }\n },\n \"Forward delegations to runner\",\n )\n .attachSignal(\"meta.runner.failed\")\n .doAfter(\n Cadenza.registry.getTaskByName,\n Cadenza.registry.getRoutineByName,\n );\n },\n ),\n ),\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) => {\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 if (Cadenza.get(`Send Handshake to ${URL}`)) {\n console.error(\"Fetch client already exists\", URL);\n return;\n }\n\n const handshakeTask = Cadenza.createMetaTask(\n `Send Handshake to ${URL}`,\n async (ctx, emit) => {\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 if (response.__status !== \"success\") {\n const error =\n response.__error ??\n `Failed to connect to service ${serviceName} ${ctx.serviceInstanceId}`;\n Cadenza.log(\n \"Fetch handshake failed.\",\n { error, serviceName, URL },\n \"warning\",\n );\n emit(`meta.fetch.handshake_failed:${fetchId}`, response);\n return { ...ctx, __error: error, errored: true };\n }\n\n ctx.serviceInstanceId = response.__serviceInstanceId;\n\n Cadenza.log(\"Fetch client connected.\", {\n response,\n serviceName,\n URL,\n });\n\n for (const communicationType of ctx.communicationTypes) {\n // TODO: Should be done in other situations as well\n emit(\"global.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 Cadenza.log(\n \"Error in fetch handshake\",\n { error: e, serviceName, URL, ctx },\n \"error\",\n );\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 .attachSignal(\n \"meta.fetch.handshake_failed\",\n \"global.meta.fetch.service_communication_established\",\n );\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 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 .attachSignal(\"meta.fetch.delegated\");\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 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 .attachSignal(\"meta.fetch.transmitted\");\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\", () => {\n Cadenza.log(\"Destroying fetch client\", { URL, serviceName });\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 ).attachSignal(\"meta.fetch.handshake_requested\"),\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\n/**\n * The `SocketController` class handles the setup and management of a WebSocket server,\n * ensuring secure connections, message handling, and rate-limiting.\n * This class is designed to function as a singleton, providing a unified interface\n * for WebSocket interactions in the application by standardizing the server setup\n * and integrating task-based processing through the `Cadenza` framework.\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 /**\n * Constructs the `SocketServer`, setting up a WebSocket server with specific configurations,\n * including connection state recovery, rate limiting, CORS handling, and custom event handling.\n * This class sets up the communication infrastructure for scalable, resilient, and secure WebSocket-based interactions\n * using metadata-driven task execution with `Cadenza`.\n *\n * It provides support for:\n * - Origin-based access control for connections.\n * - Optional payload sanitization.\n * - Configurable rate limiting and behavior on limit breaches (soft/hard disconnects).\n * - Event handlers for connection, handshake, delegation, signaling, status checks, and disconnection.\n *\n * The server can handle both internal and external interactions depending on the provided configurations,\n * and integrates directly with Cadenza's task workflow engine.\n *\n * Initializes the `SocketServer` to be ready for WebSocket communication.\n */\n constructor() {\n Cadenza.createMetaRoutine(\n \"SocketServer\",\n [\n Cadenza.createMetaTask(\"Setup SocketServer\", (ctx) => {\n if (!ctx.__useSocket) {\n return;\n }\n\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 Cadenza.log(\n \"SocketServer: Rate limit exceeded\",\n {\n retryAfter: rej.msBeforeNext / 1000,\n clientKey,\n socketId: socket.id,\n },\n \"warning\",\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 Cadenza.log(\n \"SocketServer: Rate limit exceeded, blocked\",\n {\n clientKey,\n socketId: socket.id,\n },\n \"critical\",\n );\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\n if (!server) {\n Cadenza.log(\"Socket setup error: No server\", {}, \"error\");\n return { ...ctx, __error: \"No server\", errored: true };\n }\n\n const handshakeMap: { [key: string]: boolean } = {};\n\n server.on(\"connection\", (ws: any) => {\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 Cadenza.log(\"SocketServer: New connection\", {\n ...ctx,\n socketId: ws.id,\n });\n\n callback({\n status: \"success\",\n serviceName: Cadenza.serviceRegistry.serviceName,\n });\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 )\n .doOn(\n `meta.service_registry.selected_instance_for_socket:${fetchId}`,\n )\n .attachSignal(\"meta.socket_client.transmitted\");\n }\n\n Cadenza.emit(\"meta.socket.handshake\", ctx);\n },\n );\n\n ws.on(\n \"delegation\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n const deputyExecId = ctx.__metadata.__deputyExecId;\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n (ctx: AnyObject) => {\n callback(ctx);\n },\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.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.signalBroker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n callback({\n __status: \"success\",\n __signalName: ctx.__signalName,\n });\n\n Cadenza.emit(ctx.__signalName, ctx);\n } else {\n Cadenza.log(\n `No such signal ${ctx.__signalName} on ${ctx.__serviceName}`,\n \"warning\",\n );\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.emit(\"meta.socket.status_check_requested\", ctx);\n },\n );\n\n ws.on(\"disconnect\", () => {\n Cadenza.log(\n \"Socket client disconnected\",\n { socketId: ws.id },\n \"warning\",\n );\n Cadenza.emit(\"meta.socket.disconnected\", {\n __wsId: ws.id,\n });\n });\n } catch (e) {\n Cadenza.log(\n \"SocketServer: Error in socket event\",\n { error: e },\n \"error\",\n );\n }\n\n Cadenza.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 return ctx;\n }),\n ],\n \"Bootstraps the socket server\",\n ).doOn(\"global.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 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) => {\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 Cadenza.log(\n `Socket event '${event}' timed out`,\n { ...data, socketId: socket.id, serviceName, URL },\n \"error\",\n );\n resolve({\n ...data,\n errored: true,\n __error: `Socket event '${event}' timed out`,\n error: `Socket event '${event}' timed out`,\n socketId: socket.id,\n serviceName,\n URL,\n });\n }, timeoutMs);\n }\n\n socket\n .timeout(timeoutMs)\n .emit(event, data, (err: any, response: T) => {\n if (err) {\n Cadenza.log(\n \"Socket timeout.\",\n { error: err, socketId: socket.id, serviceName },\n \"warning\",\n );\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 if (handshake) return;\n Cadenza.emit(`meta.socket_client.connected:${fetchId}`, ctx);\n });\n\n socket.on(\"delegation_progress\", (ctx) => {\n Cadenza.emit(\n `meta.socket_client.delegation_progress:${ctx.__metadata.__deputyExecId}`,\n ctx,\n );\n });\n\n socket.on(\"signal\", (ctx) => {\n if (\n Cadenza.signalBroker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n Cadenza.emit(ctx.__signalName, ctx);\n }\n });\n\n socket.on(\"status_update\", (status) => {\n Cadenza.emit(\"meta.socket_client.status_received\", status);\n });\n\n socket.on(\"connect_error\", (err) => {\n Cadenza.log(\n \"Socket connect error\",\n { error: err.message, serviceName, socketId: socket.id, URL },\n \"error\",\n );\n Cadenza.emit(\"meta.socket_client.connect_error\", err);\n });\n\n socket.on(\"reconnect_attempt\", (attempt) => {\n Cadenza.log(`Reconnect attempt: ${attempt}`);\n });\n\n socket.on(\"reconnect\", (attempt) => {\n Cadenza.log(`Socket reconnected after ${attempt} tries`, {\n socketId: socket.id,\n URL,\n serviceName,\n });\n });\n\n socket.on(\"reconnect_error\", (err) => {\n Cadenza.log(\n \"Socket reconnect failed.\",\n { error: err.message, serviceName, URL, socketId: socket.id },\n \"warning\",\n );\n });\n\n socket.on(\"error\", (err) => {\n // TODO: Retry on rate limit error\n\n Cadenza.log(\n \"Socket error\",\n { error: err, socketId: socket.id, URL, serviceName },\n \"error\",\n );\n Cadenza.emit(\"meta.socket_client.error\", err);\n });\n\n socket.on(\"disconnect\", () => {\n Cadenza.log(\n \"Socket disconnected.\",\n { URL, serviceName, socketId: socket.id },\n \"warning\",\n );\n Cadenza.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 if (handshake) return;\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 if (result.status === \"success\") {\n Cadenza.log(\"Socket connected\", {\n result,\n serviceName,\n socketId: socket.id,\n URL,\n });\n } else {\n Cadenza.log(\n \"Socket handshake failed\",\n { result, serviceName, socketId: socket.id, URL },\n \"warning\",\n );\n }\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) => {\n delete ctx.__isSubMeta;\n delete ctx.__broadcast;\n const requestSentAt = Date.now();\n emitWhenReady(\n \"delegation\",\n ctx,\n 20_000,\n (resultContext: AnyObject) => {\n const requestDuration = Date.now() - requestSentAt;\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 __requestDuration: requestDuration,\n },\n );\n resolve(resultContext);\n },\n );\n });\n },\n `Delegate flow to service ${serviceName} with address ${URL}`,\n )\n .doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`)\n .attachSignal(\"meta.socket_client.delegated\");\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 delete ctx.__broadcast;\n\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 )\n .doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`)\n .attachSignal(\"meta.socket_client.transmitted\");\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","/**\n * Formats a given timestamp into an ISO 8601 date string.\n *\n * @param {number} timestamp - The timestamp to format, represented as the number of milliseconds since the UNIX epoch.\n * @return {string} The formatted ISO 8601 string representing the date and time corresponding to the provided timestamp.\n */\nexport function formatTimestamp(timestamp: number) {\n return new Date(timestamp).toISOString();\n}\n\n/**\n * Decomposes a signal name into its constituent parts such as metadata indicator, source service name, domain, and action.\n *\n * @param {string} signalName - The signal name string to be decomposed. Typically a dot-separated string.\n * @return {Object} An object containing the decomposed parts:\n * - `isMeta` {boolean} - Indicates whether the signal is a metadata signal.\n * - `sourceServiceName` {string|null} - The name of the source service, or null if not applicable.\n * - `domain` {string} - The domain extracted from the signal name.\n * - `action` {string} - The action or last component of the signal name.\n */\nexport function decomposeSignalName(signalName: string) {\n const parts = signalName.split(\".\");\n let isMeta =\n parts[0] === \"meta\" ||\n parts[0] === \"sub_meta\" ||\n parts[1] === \"meta\" ||\n parts[1] === \"sub_meta\";\n let isGlobal = parts[0] === \"global\";\n let domain = isGlobal\n ? isMeta\n ? parts.length === 4\n ? parts[2]\n : \"\"\n : parts.length === 3\n ? parts[1]\n : \"\"\n : isMeta\n ? parts.length === 3\n ? parts[1]\n : \"\"\n : parts.length === 2\n ? parts[0]\n : \"\";\n const action = parts[parts.length - 1];\n\n return {\n isMeta,\n isGlobal,\n domain,\n action,\n };\n}\n","import Cadenza from \"../Cadenza\";\nimport { decomposeSignalName } from \"../utils/tools\";\n\n/**\n * SignalController is a singleton class that manages signal registration, transmission,\n * and metadata handling within a service instance.\n *\n * This class utilizes the Cadenza framework to handle various tasks related to signals,\n * such as registering signals, transmitting signals to remote services, adding metadata,\n * and maintaining clean-forwarding and processing of signals.\n *\n * Features:\n * - Ensures signals are properly registered and metadata is propagated.\n * - Handles foreign signal registration for cross-service communication.\n * - Forwards signal observations and manages their metadata.\n * - Adds metadata during signal emission and consumption.\n * - Implements a meta-task-based system for handling complex workflows.\n *\n * Constructor initializes the necessary meta-tasks and tasks required for signal management.\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 /**\n * Constructor method for initializing the signal registration and data transmission process.\n * This method defines multiple meta tasks to manage signals, forwarding, and adding metadata\n * for service instances in a distributed system.\n *\n * Some key functionalities include:\n * - Registering signals from a service instance.\n * - Handling foreign signal registration from remote services.\n * - Forwarding signal observations between services.\n * - Adding metadata to signal emissions for better traceability.\n * - Adding metadata to signal consumption events.\n *\n * It serves as an initializer for signals and tasks.\n */\n constructor() {\n Cadenza.createMetaTask(\n \"Handle Signal Registration\",\n (ctx, emit) => {\n const { signalName } = ctx;\n const { isMeta, isGlobal, domain, action } =\n decomposeSignalName(signalName);\n\n emit(\"global.meta.signal_controller.signal_added\", {\n data: {\n name: signalName,\n isGlobal,\n domain,\n action,\n isMeta,\n },\n });\n\n return ctx;\n },\n \"Handles signal registration from a service instance\",\n )\n .doOn(\"meta.signal_broker.added\")\n .attachSignal(\"global.meta.signal_controller.signal_added\");\n\n Cadenza.createMetaTask(\n \"Add data to signal emission\",\n (ctx) => {\n const signalEmission = ctx.__signalEmission;\n delete ctx.__signalEmission;\n\n if (!signalEmission) {\n return false;\n }\n\n return {\n data: {\n uuid: signalEmission.uuid,\n signal_name: signalEmission.signalName,\n signal_tag: signalEmission.signalTag,\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 routine_execution_id: signalEmission.routineExecutionId,\n execution_trace_id: signalEmission.executionTraceId,\n context: ctx,\n metadata: signalEmission,\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(\"sub_meta.signal_broker.emitting_signal\")\n .emits(\"global.sub_meta.signal_controller.signal_emitted\");\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 serviceName: 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(\"global.meta.graph_metadata.task_created\");\n\n Cadenza.createMetaTask(\"Handle task update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.layer_index_changed\", \"meta.task.destroyed\")\n .emits(\"global.meta.graph_metadata.task_updated\");\n\n Cadenza.createMetaTask(\"Handle task relationship creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n predecessorServiceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.relationship_added\")\n .emits(\"global.meta.graph_metadata.task_relationship_created\");\n\n Cadenza.createMetaTask(\"Handle task error\", (ctx) => {\n Cadenza.log(`Error in task ${ctx.data.taskName}`, ctx.data, \"error\");\n }).doOn(\"meta.node.errored\");\n\n Cadenza.createMetaTask(\"Handle task signal observation\", (ctx) => {\n const isGlobal = ctx.signalName.startsWith(\"global.\");\n return {\n data: {\n ...ctx.data,\n isGlobal,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.observed_signal\")\n .emits(\"global.meta.graph_metadata.task_signal_observed\");\n\n Cadenza.createMetaTask(\"Handle task signal attachment\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n },\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.attached_signal\")\n .emits(\"global.meta.graph_metadata.task_attached_signal\");\n\n Cadenza.createMetaTask(\"Handle task unsubscribing signal\", (ctx) => {\n return {\n data: {\n deleted: true,\n },\n filter: {\n ...ctx.filter,\n serviceName: 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 serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.detached_signal\")\n .emits(\"global.meta.graph_metadata.task_detached_signal\");\n\n Cadenza.createMetaTask(\"Handle routine creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doAfter(Cadenza.registry.registerRoutine)\n .emits(\"global.meta.graph_metadata.routine_created\");\n\n Cadenza.createMetaTask(\"Handle routine update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.destroyed\")\n .emits(\"global.meta.graph_metadata.routine_updated\");\n\n Cadenza.createMetaTask(\"Handle adding task to routine\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.task_added\")\n .emits(\"global.meta.graph_metadata.task_added_to_routine\");\n\n Cadenza.createMetaTask(\"Handle new trace\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n })\n .doOn(\"meta.runner.new_trace\", \"sub_meta.signal_broker.new_trace\")\n .emits(\"global.meta.graph_metadata.execution_trace_created\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution creation\",\n (ctx) => {\n return {\n queryData: {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n },\n },\n };\n },\n \"Handles routine execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.runner.added_tasks\")\n .emits(\"global.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(\"global.meta.graph_metadata.routine_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution ended\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstance_id: Cadenza.serviceRegistry.serviceInstanceId,\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(\"global.meta.graph_metadata.routine_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution creation\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n },\n \"Handles task execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.scheduled\")\n .emits(\"global.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\", \"meta.node.detected_previous_task_execution\")\n .emits(\"global.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(\"global.meta.graph_metadata.task_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle task execution ended\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\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(\"global.meta.graph_metadata.task_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution relationship creation\",\n (ctx) => {\n return {\n data: {\n executionCount: \"increment\",\n lastExecuted: formatTimestamp(Date.now()),\n },\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n \"Handles task execution relationship creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.mapped\", \"meta.node.detected_previous_task_execution\")\n .emits(\"global.meta.graph_metadata.relationship_executed\");\n\n Cadenza.createMetaTask(\"Handle Intent Creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n },\n };\n })\n .doOn(\"meta.inquiry_broker.added\")\n .emits(\"global.meta.graph_metadata.intent_created\");\n }\n}\n","import type { AnyObject } from \"@cadenza.io/core\";\nimport { DbOperationPayload } from \"./queryData\";\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[]; // TODO\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 | {\n signal: string;\n condition?: (ctx: AnyObject) => boolean;\n queryData?: DbOperationPayload;\n }\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 FieldDefinition,\n SCHEMA_TYPES,\n SchemaDefinition,\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\";\n\n/**\n * DatabaseController is a singleton class that manages database connections,\n * schema validation, and database initialization tasks. It provides mechanisms\n * to create new databases, validate schemas, and manage the database lifecycle.\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 databaseName: string = \"\";\n\n dbClient = new Pool({\n connectionString: process.env.DATABASE_ADDRESS ?? \"\",\n database: \"postgres\",\n ssl: {\n rejectUnauthorized: false, // ← This bypasses the chain validation error\n },\n });\n\n reset() {\n this.dbClient.end();\n }\n\n /**\n * Constructor for initializing the `DatabaseService` class.\n *\n * This constructor method initializes a sequence of meta tasks to perform the following database-related operations:\n *\n * 1. **Database Creation**: Creates a new database with the specified name if it doesn't already exist.\n * Validates the database name to ensure it conforms to the required format.\n * 2. **Database Schema Validation**: Validates the structure and constraints of the schema definition provided.\n * 3. **Table Dependency Management**: Sorts tables within the schema by their dependencies to ensure proper creation order.\n * 4. **Schema Definition Processing**:\n * - Converts schema definitions into Data Definition Language (DDL) based on table and field specifications.\n * - Handles constraints, relationships, and field attributes such as uniqueness, primary keys, nullable fields, etc.\n * 5. **Index and Primary Key Definition**: Generates SQL for indices and primary keys based on the schema configuration.\n *\n * These tasks are encapsulated within a meta routine to provide a structured and procedural approach to database initialization and schema management.\n */\n constructor() {\n Cadenza.createMetaRoutine(\n \"DatabaseServiceInit\",\n [\n // TODO: Database health check\n // TODO: Create database role\n // TODO: 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 console.log(`Creating database ${databaseName}`, {\n connectionString: process.env.DATABASE_ADDRESS ?? \"\",\n database: \"postgres\",\n password: process.env.DATABASE_PASSWORD ?? \"03gibnEF\",\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 connectionString: process.env.DATABASE_ADDRESS ?? \"\",\n database: databaseName,\n ssl: {\n rejectUnauthorized: false, // ← This bypasses the chain validation error\n },\n });\n\n this.databaseName = databaseName;\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 console.error(\"Failed to create database\", error);\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 || \"CASCADE\"}`;\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(\"Executing DDL\", sql);\n await this.dbClient.query(sql);\n } catch (error: any) {\n console.error(\n \"Error applying DDL\",\n sql,\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 () => {\n return true;\n },\n ).emits(\"meta.database.setup_done\"),\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 /**\n * Asynchronously retrieves a database client from the connection pool with additional logging and timeout capabilities.\n * The method modifies the client instance by adding timeout tracking and logging functionality to ensure\n * the client is not held for an extended period and track the last executed query for debugging purposes.\n *\n * @return {Promise<PoolClient>} A promise resolving to a database client from the pool with enhanced behavior for query tracking and timeout handling.\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 Cadenza.log(\n \"CRITICAL: A database client has been checked out for more than 5 seconds!\",\n {\n clientId: client.uuid,\n query: client.lastQuery,\n databaseName: this.databaseName,\n },\n \"critical\",\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 Cadenza.log(\"Waiting for database to be ready...\");\n await new Promise((res) => setTimeout(res, 1000));\n } else {\n Cadenza.log(\n \"Database query errored\",\n { error: err, context },\n \"warning\",\n );\n return { rows: [] };\n }\n }\n }\n throw new Error(`Timeout waiting for database to be ready`);\n }\n\n /**\n * Sorts database tables based on their reference dependencies using a topological sort.\n *\n * Tables are reordered such that dependent tables appear later in the list\n * to ensure a dependency hierarchy. If cycles are detected in the dependency graph,\n * they will be noted but the process will not stop. Unreferenced tables are included at the end.\n *\n * @param {Object} ctx - The context object containing the database schema definition and table metadata.\n * ctx.schema {Object} - The schema definition object.\n * ctx.schema.tables {Object} - A mapping of table names to table definitions.\n * Each table definition may contain `fields` (with `references` info)\n * and `foreignKeys` indicating cross-table relationships.\n *\n * @return {Object} - The modified context object with an additional property:\n * sortedTables {string[]} - An array of table names sorted in dependency order.\n * hasCycles {boolean} - Indicates if the dependency graph contains cycles.\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 return { ...ctx, sortedTables: sorted, hasCycles };\n }\n\n /**\n * Asynchronously creates an iterator that splits the provided tables from the schema.\n *\n * @param {Object} ctx - The context object containing the necessary data.\n * @param {string[]} ctx.sortedTables - An array of table names sorted in a specific order.\n * @param {Object} ctx.schema - The schema object that includes table definitions.\n * @param {Object} [ctx.options={}] - Optional configuration options for processing tables.\n *\n * @return {AsyncGenerator} An asynchronous generator that yields objects containing the table definition, metadata, and other context details.\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 /**\n * Converts the keys of objects in an array to camelCase format.\n *\n * @param {Array<any>} rows - An array of objects whose keys should be converted to camelCase.\n * @return {Array<any>} A new array of objects with their keys converted to camelCase.\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 /**\n * Executes a query against a specified database table with given parameters.\n *\n * @param {string} tableName - The name of the database table to query.\n * @param {DbOperationPayload} context - An object containing query parameters such as filters, fields, joins, sort, limit, and offset.\n * @return {Promise<any>} A promise that resolves with the query result, including rows, row count, and metadata, or an error object if the query fails.\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 __success: false,\n };\n }\n }\n\n /**\n * Inserts data into the specified database table with optional conflict handling.\n *\n * @param {string} tableName - The name of the target database table.\n * @param {DbOperationPayload} context - The context containing data to insert, transaction settings, field mappings, conflict resolution options, and other configurations.\n * - `data` (object | array): The data to be inserted into the database.\n * - `transaction` (boolean): Specifies whether the operation should use a transaction. Defaults to true.\n * - `fields` (array): The fields to return in the result after insertion.\n * - `onConflict` (object): Options for handling conflicts on insert.\n * - `target` (array): Columns to determine conflicts.\n * - `action` (object): Specifies the action to take on conflict, such as updating specified fields.\n * - `awaitExists` (object): Specifies foreign key references to wait for to ensure existence before insertion.\n *\n * @return {Promise<any>} A promise resolving to the result of the database insert operation, including the inserted rows, the row count, and metadata indicating success or error.\n */\n async insertFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const { data, transaction = true, fields = [], onConflict } = context;\n\n if (!data || (Array.isArray(data) && data.length === 0)) {\n return { errored: true, __error: \"No data provided for insert\" };\n }\n\n let resultContext = {};\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 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 resultContext = {\n [`${camelCase(tableName)}${isBatch ? \"s\" : \"\"}`]: isBatch\n ? resultRows\n : resultRows[0],\n rowCount: result.rowCount,\n __success: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n\n if (error.message.includes(\"violates unique constraint\")) {\n resultContext = {\n [`${camelCase(tableName)}`]: null,\n __success: false,\n };\n } else {\n resultContext = {\n ...context,\n errored: true,\n __error: `Insert failed: ${error.message}`,\n __success: false,\n };\n }\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n\n return resultContext;\n }\n\n /**\n * Updates a database table with the provided data and filter conditions.\n *\n * @param {string} tableName - The name of the database table to update.\n * @param {DbOperationPayload} context - The payload for the update operation, which includes:\n * - data: The data to update in the table.\n * - filter: The conditions to identify the rows to update (default is an empty object).\n * - transaction: Whether the operation should run within a database transaction (default is true).\n * @return {Promise<any>} Returns a Promise resolving to an object that includes:\n * - The updated data if the update is successful.\n * - In case of error:\n * - Error details.\n * - The SQL query and parameters if applicable.\n * - A flag indicating if the update succeeded or failed.\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 {\n errored: true,\n __error: `No data provided for update of ${tableName}`,\n };\n }\n\n let resultContext = {};\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 resultContext = {\n sql,\n params,\n __success: false,\n };\n } else {\n resultContext = {\n [`${camelCase(tableName)}`]: rows[0],\n __success: true,\n };\n }\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n resultContext = {\n ...context,\n errored: true,\n __error: `Update failed: ${error.message}`,\n __success: false,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n\n return resultContext;\n }\n\n /**\n * Deletes a record from the specified database table based on the given filter criteria.\n *\n * @param {string} tableName - The name of the database table from which records should be deleted.\n * @param {DbOperationPayload} context - The context for the operation, including filter conditions and transaction settings.\n * @param {Object} context.filter - The filter criteria to identify the records to delete.\n * @param {boolean} [context.transaction=true] - Indicates if the operation should be executed within a transaction.\n * @return {Promise<any>} A promise that resolves to an object containing information about the deleted record\n * or an error object if the delete operation fails.\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 let resultContext = {};\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 resultContext = {\n [`${camelCase(tableName)}`]: rows[0],\n __success: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n resultContext = {\n errored: true,\n __error: `Delete failed: ${error.message}`,\n __errors: { delete: error.message },\n __success: false,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n\n return resultContext;\n }\n\n /**\n * Constructs a SQL WHERE clause based on the provided filter object.\n * Builds parameterized queries to prevent SQL injection, appending parameters\n * to the provided params array and utilizing placeholders.\n *\n * @param {Object} filter - An object representing the filtering conditions with\n * keys as column names and values as their corresponding\n * desired values. Values can also be arrays for `IN` queries.\n * @param {any[]} params - An array for storing parameterized values, which will be\n * populated with the filter values for the constructed SQL clause.\n * @return {string} The constructed SQL WHERE clause as a string. If no conditions\n * are provided, an empty string is returned.\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 /**\n * Constructs a SQL join clause from a given set of join definitions.\n *\n * @param {Record<string, JoinDefinition>} joins - An object where keys are table names\n * and values are definitions of join conditions.\n * @return {string} The constructed SQL join clause as a string.\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 /**\n * Recursively resolves nested data structure by processing special operations and transforming the data accordingly.\n * Handles specific object structures with sub-operations, strings with specific commands, and other nested objects.\n *\n * @param {any} data The initial data to be resolved, which can be an object, array, or primitive value.\n * @param {string} tableName The name of the table associated with the data, used contextually for operation resolution.\n * @return {Promise<any>} A promise that resolves to the fully processed data structure with all nested elements resolved.\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 resolved[key] = await this.executeSubOperation(subOp);\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 /**\n * Executes a sub-operation against the database, such as an insert or query operation.\n *\n * @param {SubOperation} op - The operation to be executed. Contains details such as the type of sub-operation\n * (e.g., \"insert\" or \"query\"), the target table, data to be inserted, filters for querying, fields to be retrieved, etc.\n * @return {Promise<any>} A promise that resolves with the result of the operation.\n * For \"insert\", the result will include the inserted row or a partial response for uuid conflicts.\n * For \"query\", the result will include the first row that matches the query condition. If no result is found,\n * resolves with an empty object.\n * @throws Throws an error if the operation fails. Rolls back the transaction in case of an error.\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)\n .map((k) => snakeCase(k))\n .join(\", \")}) VALUES (${Object.values(resolvedData)\n .map((_, i) => `$${i + 1}`)\n .join(\", \")}) ON CONFLICT DO NOTHING RETURNING ${op.return ?? \"*\"}`;\n result = await client.query(sql, Object.values(resolvedData));\n result = result.rows[0]?.[op.return ?? \"uuid\"];\n if (!result) {\n result =\n op.return && op.return in resolvedData\n ? resolvedData[op.return]\n : resolvedData[\"uuid\"];\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 op.return ?? \"uuid\"\n ];\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 /**\n * Creates a database task configured for specific operations such as query, insert, update, or delete on a given table.\n *\n * @param {DbOperationType} op - The type of database operation to perform (e.g., \"query\", \"insert\", \"update\", \"delete\").\n * @param {string} tableName - The name of the table on which the operation will be performed.\n * @param {TableDefinition} table - The table definition that includes configurations such as custom signal triggers and emissions.\n * @param {function(string, AnyObject): Promise<any>} queryFunction - The function to execute the database operation. It takes the table name and a context object as arguments and returns a promise.\n * @param {ServerOptions} options - The options for configuring the server context and metadata behavior.\n * @return {void} This function does not return a value, but it registers a database task for the specified operation.\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 = `global.${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 for (const action of Object.keys(table.customSignals?.triggers ?? {})) {\n const triggerConditions: any | undefined = // @ts-ignore\n table.customSignals?.triggers?.[action].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 const triggerQueryData: any | undefined = // @ts-ignore\n table.customSignals?.triggers?.[action].filter(\n (trigger: any) => trigger.queryData,\n );\n for (const queryData of triggerQueryData ?? []) {\n if (context.queryData) {\n context.queryData = {\n ...context.queryData,\n ...queryData,\n };\n } else {\n context = {\n ...context,\n ...queryData,\n };\n }\n }\n }\n\n try {\n const result = await queryFunction(\n tableName,\n context.queryData ?? context,\n );\n\n context = {\n ...context,\n ...result,\n };\n } catch (e) {\n Cadenza.log(\n \"Database task errored.\",\n { taskName, error: e },\n \"error\",\n );\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 if (tableName !== \"system_log\" && context.errored) {\n Cadenza.log(\n `ERROR in ${taskName}`,\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 error: context.__error,\n }),\n \"error\",\n );\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 .attachSignal(\n ...(table.customSignals?.emissions?.[op]?.map((signal: any) => {\n return typeof signal === \"string\" ? signal : signal.signal;\n }) ?? []),\n );\n }\n}\n","import Cadenza from \"../../Cadenza\";\nimport { Task } from \"@cadenza.io/core\";\nimport { decomposeSignalName, formatTimestamp } from \"../../utils/tools\";\nimport { DeputyTask } from \"../../index\";\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\n splitSignalsTask: Task | undefined;\n splitTasksForRegistration: Task | undefined;\n registerSignalToTaskMapTask: Task | undefined;\n registerTaskMapTask: Task | undefined;\n registerDeputyRelationshipTask: Task | undefined;\n splitRoutinesTask: Task | undefined;\n splitTasksInRoutines: Task | undefined;\n\n isCadenzaDBReady: boolean = false;\n\n init() {\n this.splitRoutinesTask = Cadenza.createMetaTask(\n \"Split routines for registration\",\n async function* (ctx, emit) {\n const { routines } = ctx;\n if (!routines) return;\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n for (const routine of routines) {\n if (routine.registered) continue;\n yield {\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 __routineName: routine.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"routine\",\n {\n onConflict: {\n target: [\"name\", \"version\", \"service_name\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertRoutine\")\n )?.then(\n Cadenza.createMetaTask(\"Register routine\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n Cadenza.getRoutine(ctx.__routineName)!.registered = true;\n\n return true;\n }).then(\n Cadenza.createUniqueMetaTask(\n \"Gather routine registration\",\n () => true,\n ).emits(\"meta.sync_controller.synced_routines\"),\n ),\n ),\n );\n\n this.splitTasksInRoutines = Cadenza.createMetaTask(\n \"Split tasks in routines\",\n function* (ctx) {\n const { routines } = ctx;\n if (!routines) return;\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n for (const routine of routines) {\n for (const task of routine.tasks) {\n if (!task) {\n console.log(\"task is null\", routine, task);\n continue;\n }\n\n if (routine.registeredTasks.has(task.name)) continue;\n\n const tasks = task.getIterator();\n\n while (tasks.hasNext()) {\n const nextTask = tasks.next();\n yield {\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 __routineName: routine.name,\n __taskName: nextTask.name,\n };\n }\n }\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"task_to_routine_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"routine_name\",\n \"task_version\",\n \"routine_version\",\n \"service_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertTaskToRoutineMap\")\n )?.then(\n Cadenza.createMetaTask(\"Register routine task\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n Cadenza.getRoutine(ctx.__routineName)!.registeredTasks.add(\n ctx.__taskName,\n );\n }),\n ),\n );\n\n this.splitSignalsTask = Cadenza.createMetaTask(\n \"Split signals for registration\",\n function* (ctx) {\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\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, isGlobal, domain, action } =\n decomposeSignalName(signal);\n\n yield {\n data: {\n name: signal,\n isGlobal,\n domain,\n action,\n isMeta,\n },\n __signal: signal,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"signal_registry\",\n {\n onConflict: {\n target: [\"name\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertSignalRegistry\")\n )?.then(\n Cadenza.createMetaTask(\"Process signal registration\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n return { signalName: ctx.__signal };\n }).then(\n Cadenza.signalBroker.registerSignalTask!,\n Cadenza.createUniqueMetaTask(\n \"Gather signal registration\",\n () => true,\n ).emits(\"meta.sync_controller.synced_signals\"),\n ),\n ),\n );\n\n this.splitTasksForRegistration = Cadenza.createMetaTask(\n \"Split tasks for registration\",\n function* (ctx) {\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n const tasks = ctx.tasks;\n for (const task of tasks) {\n if (task.registered) continue;\n const { __functionString, __getTagCallback } = task.export();\n\n yield {\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 signals: {\n emits: Array.from(task.emitsSignals),\n signalsToEmitAfter: Array.from(task.signalsToEmitAfter),\n signalsToEmitOnFail: Array.from(task.signalsToEmitOnFail),\n observed: Array.from(task.observedSignals),\n },\n },\n __taskName: task.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"task\",\n {\n onConflict: {\n target: [\"name\", \"service_name\", \"version\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertTask\")\n )?.then(\n Cadenza.createMetaTask(\"Record registration\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n Cadenza.get(ctx.__taskName)!.registered = true;\n\n return true;\n }).then(\n Cadenza.createUniqueMetaTask(\n \"Gather task registration\",\n () => true,\n ).emits(\"meta.sync_controller.synced_tasks\"),\n ),\n ),\n );\n\n const registerSignalTask = Cadenza.createMetaTask(\n \"Record signal registration\",\n (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n Cadenza.get(ctx.__taskName)?.registeredSignals.add(ctx.__signal);\n },\n );\n\n this.registerSignalToTaskMapTask = Cadenza.createMetaTask(\n \"Split observed signals of task\",\n function* (ctx) {\n const task = ctx.task;\n if (task.hidden || !task.register) return;\n\n for (const signal of task.observedSignals) {\n const _signal = signal.split(\":\")[0];\n if (task.registeredSignals.has(signal)) continue;\n\n const { isGlobal } = decomposeSignalName(_signal);\n\n yield {\n data: {\n signalName: _signal,\n isGlobal,\n taskName: task.name,\n taskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n __taskName: task.name,\n __signal: signal,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"signal_to_task_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"task_version\",\n \"service_name\",\n \"signal_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertSignalToTaskMap\")\n )?.then(registerSignalTask),\n );\n\n this.registerTaskMapTask = Cadenza.createMetaTask(\n \"Register task map to DB\",\n function* (ctx) {\n const task = ctx.task;\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n if (task.hidden || !task.register) return;\n\n for (const t of task.nextTasks) {\n if (task.taskMapRegistration.has(t.name) || t.hidden || !t.register) {\n continue;\n }\n\n yield {\n data: {\n taskName: t.name,\n taskVersion: t.version,\n predecessorTaskName: task.name,\n predecessorTaskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n predecessorServiceName: Cadenza.serviceRegistry.serviceName,\n },\n __taskName: task.name,\n __nextTaskName: t.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"directional_task_graph_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"predecessor_task_name\",\n \"task_version\",\n \"predecessor_task_version\",\n \"service_name\",\n \"predecessor_service_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertDirectionalTaskGraphMap\")\n )?.then(\n Cadenza.createMetaTask(\"Record task map registration\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n Cadenza.get(ctx.__taskName)?.taskMapRegistration.add(\n ctx.__nextTaskName,\n );\n }),\n ),\n );\n\n this.registerDeputyRelationshipTask = Cadenza.createMetaTask(\n \"Register deputy relationship\",\n (ctx) => {\n const task = ctx.task;\n if (task.hidden || !task.register) return;\n\n if (task.isDeputy && !task.signalName) {\n if (task.registeredDeputyMap) return;\n\n return {\n data: {\n task_name: task.remoteRoutineName,\n task_version: 1,\n service_name: task.serviceName,\n predecessor_task_name: task.name,\n predecessor_task_version: task.version,\n predecessor_service_name: Cadenza.serviceRegistry.serviceName,\n },\n __taskName: task.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"directional_task_graph_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"predecessor_task_name\",\n \"task_version\",\n \"predecessor_task_version\",\n \"service_name\",\n \"predecessor_service_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertDirectionalTaskGraphMap\")\n )?.then(\n Cadenza.createMetaTask(\n \"Record deputy relationship registration\",\n (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n (Cadenza.get(ctx.__taskName) as DeputyTask).registeredDeputyMap =\n true;\n },\n ),\n ),\n );\n\n Cadenza.signalBroker\n .getSignalsTask!.clone()\n .doOn(\"meta.sync_controller.sync_tick\", \"meta.sync_requested\")\n .then(this.splitSignalsTask);\n\n Cadenza.registry\n .getAllTasks!.clone()\n .doOn(\"meta.sync_controller.synced_signals\")\n .then(this.splitTasksForRegistration);\n\n Cadenza.registry\n .getAllRoutines!.clone()\n .doOn(\"meta.sync_controller.synced_tasks\")\n .then(this.splitRoutinesTask);\n\n Cadenza.registry\n .doForEachTask!.clone()\n .doOn(\"meta.sync_controller.synced_tasks\")\n .then(\n this.registerTaskMapTask,\n this.registerSignalToTaskMapTask,\n this.registerDeputyRelationshipTask,\n );\n\n Cadenza.registry\n .getAllRoutines!.clone()\n .doOn(\"meta.sync_controller.synced_routines\")\n .then(this.splitTasksInRoutines);\n\n Cadenza.createMetaTask(\"Finish sync\", (ctx, emit) => {\n emit(\"global.meta.sync_controller.synced\", {\n data: {\n is_active: true,\n is_non_responsive: false,\n is_blocked: false,\n last_active: formatTimestamp(Date.now()),\n },\n filter: {\n uuid: Cadenza.serviceRegistry.serviceInstanceId,\n },\n });\n\n Cadenza.log(\"Synced resources...\");\n })\n .attachSignal(\"global.meta.sync_controller.synced\")\n .doOn(\"meta.sync_controller.synced_resource\");\n\n if (!this.isCadenzaDBReady) {\n Cadenza.interval(\n \"meta.sync_controller.sync_tick\",\n { __syncing: true },\n 300000,\n true,\n );\n } else {\n Cadenza.interval(\n \"meta.sync_controller.sync_tick\",\n { __syncing: true },\n 180000,\n );\n Cadenza.schedule(\"meta.sync_requested\", { __syncing: true }, 2000);\n }\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","import_rate_limiter_flexible","import_socket","ctx","import_lodash_es","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/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 AnyObject,\n CadenzaMode,\n DebounceOptions,\n DebounceTask,\n EmitOptions,\n EphemeralTask,\n EphemeralTaskOptions,\n GraphRegistry,\n GraphRoutine,\n GraphRunner,\n InquiryBroker,\n InquiryOptions,\n Intent,\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\";\nimport { formatTimestamp } from \"./utils/tools\";\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\n/**\n * The CadenzaService class serves as a central service layer providing various utility methods for managing tasks, signals, logging, and service interactions.\n * This class handles the initialization (`bootstrap`) and validation of services, as well as the creation of tasks associated with services and signals.\n */\nexport default class CadenzaService {\n public static signalBroker: SignalBroker;\n public static inquiryBroker: InquiryBroker;\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 /**\n * Initializes the application by setting up necessary components and configurations.\n * This method ensures the initialization process is only executed once throughout the application lifecycle.\n *\n * @return {void} This method does not return any value.\n */\n static bootstrap(): void {\n if (this.isBootstrapped) return;\n this.isBootstrapped = true;\n\n Cadenza.bootstrap();\n this.signalBroker = Cadenza.signalBroker;\n this.inquiryBroker = Cadenza.inquiryBroker;\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 /**\n * Validates the provided service name based on specific rules.\n *\n * @param {string} serviceName - The service name to validate. Must be less than 100 characters,\n * must not contain spaces, dots, or backslashes, and must start with a capital letter.\n * @return {void} Throws an error if the service name does not meet the validation criteria.\n * @throws {Error} If the service name exceeds 100 characters.\n * @throws {Error} If the service name contains spaces.\n * @throws {Error} If the service name contains dots.\n * @throws {Error} If the service name contains backslashes.\n * @throws {Error} If the service name does not start with a capital letter.\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 /**\n * Validates the provided name to ensure it meets the required criteria.\n *\n * @param {string} name - The name to be validated.\n * @return {void} Does not return any value.\n */\n protected static validateName(name: string): void {\n Cadenza.validateName(name);\n }\n\n /**\n * Gets the current run strategy from the Cadenza configuration.\n *\n * @return {Function} The run strategy function defined in the Cadenza configuration.\n */\n public static get runStrategy() {\n return Cadenza.runStrategy;\n }\n\n /**\n * Sets the mode for the Cadenza application.\n *\n * @param {CadenzaMode} mode - The mode to be set for the application.\n * @return {void} This method does not return a value.\n */\n public static setMode(mode: CadenzaMode) {\n Cadenza.setMode(mode);\n }\n\n /**\n * Emits a signal with the specified data using the associated broker.\n *\n * @param {string} signal - The name of the event or signal to emit.\n * @param {AnyObject} [data={}] - The data to be emitted along with the signal.\n * @param options\n * @return {void} No return value.\n *\n * @example\n * This is meant to be used as a global event emitter.\n * If you want to emit an event from within a task, you can use the `emit` method provided to the task function. See {@link TaskFunction}.\n * ```ts\n * Cadenza.emit('main.my_event', { foo: 'bar' });\n * ```\n */\n static emit(signal: string, data: AnyObject = {}, options: EmitOptions = {}) {\n Cadenza.emit(signal, data, options);\n }\n\n static debounce(signal: string, context: any = {}, delayMs: number = 500) {\n Cadenza.debounce(signal, context, delayMs);\n }\n\n public static schedule(\n signal: string,\n context: AnyObject,\n timeoutMs: number,\n exactDateTime?: Date,\n ) {\n Cadenza.schedule(signal, context, timeoutMs, exactDateTime);\n }\n\n public static interval(\n signal: string,\n context: AnyObject,\n intervalMs: number,\n leading = false,\n startDateTime?: Date,\n ) {\n Cadenza.interval(signal, context, intervalMs, leading, startDateTime);\n }\n\n public static defineIntent(intent: Intent): Intent {\n this.inquiryBroker?.intents.set(intent.name, intent);\n return intent;\n }\n\n public static async inquire(\n inquiry: string,\n context: AnyObject,\n options?: InquiryOptions,\n ): Promise<AnyObject> {\n return this.inquiryBroker?.inquire(inquiry, context, options);\n }\n\n /**\n * Executes the given task or graph routine within the provided context using the configured runner.\n *\n * @param {Task | GraphRoutine} task - The task or graph routine to be executed.\n * @param {AnyObject} context - The context within which the task will be executed.\n * @return {void}\n *\n * @example\n * ```ts\n * const task = Cadenza.createTask('My task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * });\n *\n * Cadenza.run(task, { foo: 'bar' });\n *\n * const routine = Cadenza.createRoutine('My routine', [task], 'My routine description');\n *\n * Cadenza.run(routine, { foo: 'bar' });\n * ```\n */\n static run(task: Task | GraphRoutine, context: AnyObject) {\n this.runner?.run(task, context);\n }\n /**\n * Logs a message with a specified log level and additional contextual data.\n * Records in the CadenzaDB when available.\n *\n * @param {string} message - The main message to be logged.\n * @param {any} [data={}] - Additional data or metadata to include with the log.\n * @param {\"info\"|\"warning\"|\"error\"|\"critical\"} [level=\"info\"] - The severity level of the log message.\n * @param {string|null} [subjectServiceName=null] - The name of the subject service related to the log.\n * @param {string|null} [subjectServiceInstanceId=null] - The instance ID of the subject service related to the log.\n * @return {void} No return value.\n */\n static log(\n message: string,\n data: any = {},\n level: \"info\" | \"warning\" | \"error\" | \"critical\" = \"info\",\n subjectServiceName: string | null = null,\n subjectServiceInstanceId: string | null = null,\n ) {\n if (level === \"critical\") {\n console.error(\"CRITICAL:\", message, data);\n } else if (level === \"error\") {\n console.error(message, data);\n } else if (level === \"warning\") {\n console.warn(message, data);\n } else {\n console.log(message, data);\n }\n\n this.emit(\"global.meta.system_log.log\", {\n data: {\n data,\n level,\n message,\n serviceName: this.serviceRegistry?.serviceName,\n serviceInstanceId: this.serviceRegistry?.serviceInstanceId,\n subjectServiceName,\n subjectServiceInstanceId,\n created: formatTimestamp(Date.now()),\n },\n });\n }\n\n public static get(taskName: string): Task | undefined {\n return Cadenza.get(taskName);\n }\n\n public static getRoutine(routineName: string): GraphRoutine | undefined {\n return Cadenza.getRoutine(routineName);\n }\n\n /**\n * Creates a new DeputyTask instance based on the provided routine name, service name, and options.\n * This method ensures proper task initialization, including setting a unique name,\n * validation of the routine name, and applying default option values.\n *\n * @param {string} routineName - The name of the routine the task references. This is mandatory and should be a valid string.\n * @param {string|undefined} [serviceName] - The name of the service that the routine belongs to. This is optional and defaults to undefined.\n * @param {TaskOptions} [options={}] - A configuration object for the task, allowing various properties such as concurrency, timeout, and retry settings to be customized.\n * @return {DeputyTask} - A new DeputyTask instance initialized with the specified parameters.\n *\n * @example\n * Let's say we are writing the code for a Service called \"Service1\".\n * We also have an additional service called \"Service2\" with a routine called \"My Routine\".\n * A flow on Service1 depends on the result of \"My Routine\" on Service2.\n * We can create a deputy task for the routine using the following code:\n * ```ts\n * Cadenza.createDeputyTask(\"My Routine\", \"Service2\").then(\n * Cadenza.createTask(\"Handle result\", (ctx) => {\n * console.log(\"'Handle result' executed with context:\", ctx);\n * }),\n * );\n * ```\n * Internally, this will send a request to an available \"Service2\" instance to execute the \"My Routine\" routine.\n * The deputy task will wait for the response and then execute the next task(s) in the chain.\n *\n * You can visualize the execution of the deputy task as follows:\n * ```\n * Service1 flow = [Deputy tasks for \"My Routine\"] -> [\"Handle result\"]\n * || A\n * V ||\n * Service2 flow = [[My Routine]]\n * ```\n *\n * Deputy tasks are useful for delegating flows to other services, allowing for parallel execution and load balancing.\n * But it creates tight coupling between the services, which may not be desirable in some cases.\n * In cases where an event on one service should simply trigger a flow on another service, without the need for a result,\n * it is recommended to use signals instead. Like this:\n *\n * Service1\n * ```ts\n * Cadenza.createTask(\"Generate event\", (ctx, emit) => {\n * // Do something\n * emit(\"some.event\");\n * });\n * ```\n *\n * Service2\n * ```ts\n * Cadenza.createTask(\"Handle event\", (ctx) => {\n * console.log(\"Handle event executed with context:\", ctx);\n * }).doOn(\"Service1.some.event\");\n * ```\n *\n * Every time the \"Generate event\" task is executed, it will emit a signal \"Service1.some.event\" to one Service2 instance and trigger the \"Handle event\" task.\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 = `${routineName} (Proxy)`;\n\n options = {\n concurrency: 100,\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 /**\n * Creates a meta deputy task by setting the `isMeta` property in the options to true,\n * and delegating task creation to the `createDeputyTask` method.\n * See {@link createDeputyTask} and {@link createMetaTask} for more information.\n *\n * @param {string} routineName - The name of the routine associated with the task.\n * @param {string | undefined} [serviceName] - The optional name of the service associated with the task.\n * @param {TaskOptions} [options={}] - Additional options for the task. Defaults to an empty object if not provided.\n * @return {DeputyTask} - The created meta deputy task.\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 /**\n * Creates a throttled deputy task with the specified parameters.\n * See {@link createThrottledTask} and {@link createDeputyTask} for more information.\n *\n * @param {string} routineName - The name of the routine to be executed.\n * @param {string | undefined} [serviceName=undefined] - The name of the service, if applicable.\n * @param {ThrottleTagGetter} [throttledIdGetter=() => \"default\"] - A function to get the throttled tag for the task.\n * @param {TaskOptions} [options={}] - The options for task configuration, including concurrency and callbacks.\n * @return {DeputyTask} The created throttled deputy task.\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 /**\n * Creates a throttled deputy task with meta-task settings enabled.\n * See {@link createThrottledTask},{@link createDeputyTask} and {@link createMetaTask} for more information.\n *\n * @param {string} routineName - The name of the routine for which the task is being created.\n * @param {string|undefined} [serviceName=undefined] - The name of the service associated with the task, or undefined if not applicable.\n * @param {ThrottleTagGetter} [throttledIdGetter=() => \"default\"] - A function to compute or return the throttling identifier.\n * @param {TaskOptions} [options={}] - Additional options for the task configuration.\n * @return {any} Returns the created throttled deputy task instance.\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 /**\n * Creates and configures a signal transmission task that handles the transmission\n * of a specified signal to a target service with a set of customizable options.\n * This is only used for internal purposes and is not exposed to the business logic layer.\n *\n * @param {string} signalName - The name of the signal to be transmitted.\n * @param {string} serviceName - The name of the target service to transmit the signal to.\n * @param {TaskOptions} [options={}] - A set of optional parameters to further configure the task.\n * @return {SignalTransmissionTask} A new instance of SignalTransmissionTask configured with the given parameters.\n */\n static createSignalTransmissionTask(\n signalName: string,\n serviceName: string,\n options: TaskOptions = {},\n ): SignalTransmissionTask | undefined {\n this.bootstrap();\n this.validateName(signalName);\n this.validateName(serviceName);\n\n options = {\n concurrency: 100,\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 = `Transmit signal: ${signalName} to ${serviceName}`;\n if (this.get(name)) {\n return;\n }\n\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 /**\n * Creates and configures a database task that performs an operation on a specified table.\n *\n * @param {string} tableName - The name of the database table on which the operation will be performed.\n * @param {DbOperationType} operation - The type of database operation to execute (e.g., insert, update, delete).\n * @param {string|undefined} [databaseServiceName=undefined] - The name of the database service; defaults to \"default database service\" if not provided.\n * @param {DbOperationPayload} queryData - The data payload required for executing the specified database operation.\n * @param {TaskOptions} [options={}] - Optional configuration for the task, including concurrency, timeout, and retry policies.\n * @return {DatabaseTask} A configured database task instance ready for execution.\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 this.validateName(tableName);\n this.validateName(operation);\n const tableNameFormatted = tableName\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n const name = `${operation.charAt(0).toUpperCase() + operation.slice(1)} ${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: 100,\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 /**\n * Creates a task for performing a database insert operation.\n *\n * @param {string} tableName - The name of the table where the insert operation will be performed.\n * @param {string | undefined} [databaseServiceName=undefined] - The name of the database service to use. Optional parameter, defaults to undefined.\n * @param {DbOperationPayload} [queryData={}] - The data payload for the insert operation. Defaults to an empty object.\n * @param {TaskOptions} [options={}] - Additional task options to configure the insert operation. Defaults to an empty object.\n * @return {object} A task configuration object for the database insert operation.\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 /**\n * Creates a database query task for the specified table and configuration.\n *\n * @param {string} tableName - The name of the database table to execute the query on.\n * @param {string | undefined} [databaseServiceName=undefined] - The name of the database service to use. If undefined, the default service will be used.\n * @param {DbOperationPayload} queryData - The payload containing the query data to be executed.\n * @param {TaskOptions} [options={}] - Optional parameters to configure the task execution.\n * @return {Task} The created database query task.\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 /**\n * Creates a database task for the CadenzaDB with the specified parameters.\n *\n * @param {string} tableName - The name of the database table on which the operation will be performed.\n * @param {DbOperationType} operation - The type of database operation to execute (e.g., INSERT, UPDATE, DELETE).\n * @param {DbOperationPayload} queryData - The payload or data required to perform the database operation.\n * @param {TaskOptions} [options={}] - Additional options for the task, such as configuration settings.\n * @return {any} The result of creating the database task.\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 /**\n * Creates a database insert task specifically for the CadenzaDB database.\n *\n * @param {string} tableName - The name of the table into which the data will be inserted.\n * @param {DbOperationPayload} [queryData={}] - An object representing the data to be inserted.\n * @param {TaskOptions} [options={}] - Additional options to customize the task. The `isMeta` property is set to true by default.\n * @return {Task} A task object configured to perform an insert operation in the CadenzaDB database.\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 /**\n * Creates a database query task specifically for the CadenzaDB.\n *\n * @param {string} tableName - The name of the database table to execute the query on.\n * @param {DbOperationPayload} queryData - The payload containing data and parameters for the database operation.\n * @param {TaskOptions} [options={}] - Additional options for the task configuration.\n * @return {any} The created task for executing a database query.\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 new Cadenza service with the specified configuration.\n *\n * @param {string} serviceName - The unique name of the service to create.\n * @param {string} [description] - An optional description of the service.\n * @param {ServerOptions} [options] - An optional object containing configuration options for the service.\n * @return {boolean} Returns true when the service is successfully created.\n */\n static createCadenzaService(\n serviceName: string,\n description: string = \"\",\n options: ServerOptions = {},\n ) {\n if (this.serviceCreated) return;\n this.bootstrap();\n this.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 this.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 this.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 this.createEphemeralMetaTask(\"Create service\", async (context, emit) => {\n emit(\"meta.create_service_requested\", initContext);\n }).doOn(\"meta.fetch.handshake_complete\");\n } else {\n this.emit(\"meta.create_service_requested\", initContext);\n this.createMetaTask(\"Create signal transmission for sync\", (ctx) => {\n this.createSignalTransmissionTask(\n \"global.meta.cadenza_db.gathered_sync_data\",\n ctx.serviceName,\n );\n }).doOn(\"meta.rest.handshake\");\n }\n\n this.createMetaTask(\"Handle service setup completion\", () => {\n GraphMetadataController.instance;\n GraphSyncController.instance.isCadenzaDBReady =\n !!options.cadenzaDB?.connect;\n GraphSyncController.instance.init();\n\n this.log(\"Service created.\");\n\n return true;\n }).doOn(\"meta.service_registry.instance_inserted\");\n\n this.serviceCreated = true;\n }\n\n /**\n * Creates a Cadenza metadata service with the specified name, description, and options.\n *\n * @param {string} serviceName - The name of the metadata service to be created.\n * @param {string} description - A brief description of the metadata service.\n * @param {ServerOptions} [options={}] - Optional configuration for the metadata service. Defaults to an empty object.\n * @return {void} Does not return a value.\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 /**\n * Creates and initializes a database service with the provided name, schema, and configuration options.\n * This method is not supported in a browser environment and will log a warning if called in such an environment.\n *\n * @param {string} name - The name of the database service to be created.\n * @param {SchemaDefinition} schema - The schema definition for the database service.\n * @param {string} [description=\"\"] - An optional description of the database service.\n * @param {ServerOptions & DatabaseOptions} [options={}] - Optional configuration settings for the database and server.\n * @return {void} This method does not return a value.\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 console.log(\"Creating database service\", options);\n\n this.emit(\"meta.database_init_requested\", {\n schema,\n databaseName: options.databaseName,\n options,\n });\n\n this.createMetaTask(\"Set database connection\", () => {\n this.createMetaTask(\"Insert database service\", (_, emit) => {\n emit(\"global.meta.created_database_service\", {\n data: {\n service_name: name,\n description,\n schema,\n is_meta: options.isMeta,\n },\n });\n this.log(\"Database service created\", {\n name,\n isMeta: options.isMeta,\n });\n }).doOn(\"meta.service_registry.service_inserted\");\n\n this.createCadenzaService(name, description, options);\n }).doOn(\"meta.database.setup_done\");\n }\n\n /**\n * Creates a meta database service with the specified configuration.\n *\n * @param {string} name - The name of the database service to be created.\n * @param {SchemaDefinition} schema - The schema definition for the database.\n * @param {string} [description=\"\"] - An optional description of the database service.\n * @param {ServerOptions & DatabaseOptions} [options={}] - Optional server and database configuration options. The `isMeta` flag will be automatically set to true.\n * @return {void} - This method does not return a value.\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 and registers a new task with the provided name, function, and optional details.\n *\n * @param {string} name - The name of the task to be created.\n * @param {TaskFunction} func - The function that contains the task execution logic.\n * @param {string} [description] - An optional description of what the task does.\n * @param {TaskOptions} [options={}] - An optional configuration object specifying additional task options.\n * @return {Task} - The created task instance.\n *\n * @example\n * You can use arrow functions to create tasks.\n * ```ts\n * const task = Cadenza.createTask('My task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * }, 'My task description');\n * ```\n *\n * You can also use named functions to create tasks.\n * This is the preferred way to create tasks since it allows for code inspection in the CadenzaUI.\n * ```ts\n * function myTask(ctx) {\n * console.log('My task executed with context:', ctx);\n * }\n *\n * const task = Cadenza.createTask('My task', myTask);\n * ```\n *\n * ** Use the TaskOptions object to configure the task. **\n *\n * With concurrency limit, timeout limit and retry settings.\n * ```ts\n * Cadenza.createTask('My task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * }, 'My task description', {\n * concurrency: 10,\n * timeout: 10000,\n * retryCount: 3,\n * retryDelay: 1000,\n * retryDelayFactor: 1.5,\n * });\n * ```\n *\n * You can specify the input and output context schemas for the task.\n * ```ts\n * Cadenza.createTask('My task', (ctx) => {\n * return { bar: 'foo' + ctx.foo };\n * }, 'My task description', {\n * inputContextSchema: {\n * type: 'object',\n * properties: {\n * foo: {\n * type: 'string',\n * },\n * },\n * required: ['foo'],\n * },\n * validateInputContext: true, // default is false\n * outputContextSchema: {\n * type: 'object',\n * properties: {\n * bar: {\n * type: 'string',\n * },\n * },\n * required: ['bar'],\n * },\n * validateOutputContext: true, // default is false\n * });\n * ```\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 meta task with the specified name, functionality, description, and options.\n * This is used for creating tasks that lives on the meta layer.\n * The meta layer is a special layer that is executed separately from the business logic layer and is used for extending Cadenzas core functionality.\n * See {@link Task} or {@link createTask} for more information.\n *\n * @param {string} name - The name of the meta task.\n * @param {TaskFunction} func - The function to be executed by the meta task.\n * @param {string} [description] - An optional description of the meta task.\n * @param {TaskOptions} [options={}] - Additional optional task configuration. Automatically sets `isMeta` to true.\n * @return {Task} A task instance configured as a meta task.\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 unique task by wrapping the provided task function with a uniqueness constraint.\n * Unique tasks are designed to execute once per execution ID, merging parents. This is useful for\n * tasks that require fan-in/joins after parallel branches.\n * See {@link Task} for more information.\n * @param {string} name Unique identifier.\n * @param {TaskFunction} func Function receiving joinedContexts as a list (context.joinedContexts).\n * @param {string} [description] Optional description.\n * @param {TaskOptions} [options={}] Optional task options.\n * @returns {Task} The created UniqueTask.\n *\n * @example\n * ```ts\n * const splitTask = Cadenza.createTask('Split foos', function* (ctx) {\n * for (const foo of ctx.foos) {\n * yield { foo };\n * }\n * }, 'Splits a list of foos into multiple sub-branches');\n *\n * const processTask = Cadenza.createTask('Process foo', (ctx) => {\n * return { bar: 'foo' + ctx.foo };\n * }, 'Process a foo');\n *\n * const uniqueTask = Cadenza.createUniqueTask('Gather processed foos', (ctx) => {\n * // A unique task will always be provided with a list of contexts (ctx.joinedContexts) from its predecessors.\n * const processedFoos = ctx.joinedContexts.map((c) => c.bar);\n * return { foos: processedFoos };\n * }, 'Gathers together the processed foos.');\n *\n * splitTask.then(\n * processTask.then(\n * uniqueTask,\n * ),\n * );\n *\n * // Give the flow a name using a routine\n * Cadenza.createRoutine(\n * 'Process foos',\n * [splitTask],\n * 'Processes a list of foos'\n * ).doOn('main.received_foos'); // Subscribe to a signal\n *\n * // Trigger the flow from anywhere\n * Cadenza.emit('main.received_foos', { foos: ['foo1', 'foo2', 'foo3'] });\n * ```\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 unique meta task with the specified name, function, description, and options.\n * See {@link createUniqueTask} and {@link createMetaTask} for more information.\n *\n * @param {string} name - The name of the task to create.\n * @param {TaskFunction} func - The function to execute when the task is run.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions} [options={}] - Optional settings for the task. Defaults to an empty object. Automatically sets `isMeta` and `isUnique` to true.\n * @return {Task} The created unique meta task.\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 throttled task with a concurrency limit of 1, ensuring that only one instance of the task can run at a time for a specific throttle tag.\n * This is useful for ensuring execution order and preventing race conditions.\n * See {@link Task} for more information.\n *\n * @param {string} name - The name of the task.\n * @param {TaskFunction} func - The function to be executed when the task runs.\n * @param {ThrottleTagGetter} [throttledIdGetter=() => \"default\"] - A function that generates a throttle tag identifier to group tasks for throttling.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions} [options={}] - Additional options to customize the task behavior.\n * @return {Task} The created throttled task.\n *\n * @example\n * ```ts\n * const task = Cadenza.createThrottledTask(\n * 'My task',\n * async (ctx) => {\n * await new Promise((resolve) => setTimeout(resolve, 1000));\n * console.log('My task executed with context:', ctx);\n * },\n * // Will throttle by the value of ctx.foo to make sure tasks with the same value are executed sequentially\n * (ctx) => ctx.foo,\n * );\n *\n * Cadenza.run(task, { foo: 'bar' }); // (First execution)\n * Cadenza.run(task, { foo: 'bar' }); // This will be executed after the first execution is finished\n * Cadenza.run(task, { foo: 'baz' }); // This will be executed in parallel with the first execution\n * ```\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 throttled meta task with the specified configuration.\n * See {@link createThrottledTask} and {@link createMetaTask} for more information.\n *\n * @param {string} name - The name of the throttled meta task.\n * @param {TaskFunction} func - The task function to be executed.\n * @param {ThrottleTagGetter} throttledIdGetter - A function to retrieve the throttling identifier.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions} [options={}] - Additional options for configuring the task.\n * @return {Task} The created throttled meta task.\n */\n static createThrottledMetaTask(\n name: string,\n func: TaskFunction,\n throttledIdGetter: ThrottleTagGetter = () => \"default\",\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 and returns a new debounced task with the specified parameters.\n * This is useful to prevent rapid execution of tasks that may be triggered by multiple events within a certain time frame.\n * See {@link DebounceTask} for more information.\n *\n * @param {string} name - The unique name of the task to be created.\n * @param {TaskFunction} func - The function to be executed by the task.\n * @param {string} [description] - An optional description of the task.\n * @param {number} [debounceTime=1000] - The debounce time in milliseconds to delay the execution of the task.\n * @param {TaskOptions & DebounceOptions} [options={}] - Additional configuration options for the task, including debounce behavior and other task properties.\n * @return {DebounceTask} A new instance of the DebounceTask with the specified configuration.\n *\n * @example\n * ```ts\n * const task = Cadenza.createDebounceTask(\n * 'My debounced task',\n * (ctx) => {\n * console.log('My task executed with context:', ctx);\n * },\n * 'My debounced task description',\n * 100, // Debounce time in milliseconds. Default is 1000\n * {\n * leading: false, // Should the first execution of a burst be executed immediately? Default is false\n * trailing: true, // Should the last execution of a burst be executed? Default is true\n * maxWait: 1000, // Maximum time in milliseconds to wait for the next execution. Default is 0\n * },\n * );\n *\n * Cadenza.run(task, { foo: 'bar' }); // This will not be executed\n * Cadenza.run(task, { foo: 'bar' }); // This will not be executed\n * Cadenza.run(task, { foo: 'baz' }); // This execution will be delayed by 100ms\n * ```\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 debounced meta task with the specified parameters.\n * See {@link createDebounceTask} and {@link createMetaTask} for more information.\n *\n * @param {string} name - The name of the task.\n * @param {TaskFunction} func - The function to be executed by the task.\n * @param {string} [description] - Optional description of the task.\n * @param {number} [debounceTime=1000] - The debounce delay in milliseconds.\n * @param {TaskOptions & DebounceOptions} [options={}] - Additional configuration options for the task.\n * @return {DebounceTask} Returns an instance of the debounced meta task.\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 ephemeral task with the specified configuration.\n * Ephemeral tasks are designed to self-destruct after execution or a certain condition is met.\n * This is useful for transient tasks such as resolving promises or performing cleanup operations.\n * They are not registered by default.\n * See {@link EphemeralTask} for more information.\n *\n * @param {string} name - The name of the task to be created.\n * @param {TaskFunction} func - The function that defines the logic of the task.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions & EphemeralTaskOptions} [options={}] - The configuration options for the task, including concurrency, timeouts, and retry policies.\n * @return {EphemeralTask} The created ephemeral task instance.\n *\n * @example\n * By default, ephemeral tasks are executed once and destroyed after execution.\n * ```ts\n * const task = Cadenza.createEphemeralTask('My ephemeral task', (ctx) => {\n * console.log('My task executed with context:', ctx);\n * });\n *\n * Cadenza.run(task); // Executes the task once and destroys it after execution\n * Cadenza.run(task); // Does nothing, since the task is destroyed\n * ```\n *\n * Use destroy condition to conditionally destroy the task\n * ```ts\n * const task = Cadenza.createEphemeralTask(\n * 'My ephemeral task',\n * (ctx) => {\n * console.log('My task executed with context:', ctx);\n * },\n * 'My ephemeral task description',\n * {\n * once: false, // Should the task be executed only once? Default is true\n * destroyCondition: (ctx) => ctx.foo > 10, // Should the task be destroyed after execution? Default is undefined\n * },\n * );\n *\n * Cadenza.run(task, { foo: 5 }); // The task will not be destroyed and can still be executed\n * Cadenza.run(task, { foo: 10 }); // The task will not be destroyed and can still be executed\n * Cadenza.run(task, { foo: 20 }); // The task will be destroyed after execution and cannot be executed anymore\n * Cadenza.run(task, { foo: 30 }); // This will not be executed\n * ```\n *\n * A practical use case for ephemeral tasks is to resolve a promise upon some external event.\n * ```ts\n * const task = Cadenza.createTask('Confirm something', (ctx, emit) => {\n * return new Promise((resolve) => {\n * ctx.foo = uuid();\n *\n * Cadenza.createEphemeralTask(`Resolve promise of ${ctx.foo}`, (c) => {\n * console.log('My task executed with context:', ctx);\n * resolve(c);\n * }).doOn(`socket.confirmation_received:${ctx.foo}`);\n *\n * emit('this_domain.confirmation_requested', ctx);\n * });\n * });\n * ```\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 ephemeral meta task with the specified name, function, description, and options.\n * See {@link createEphemeralTask} and {@link createMetaTask} for more details.\n *\n * @param {string} name - The name of the task to be created.\n * @param {TaskFunction} func - The function to be executed as part of the task.\n * @param {string} [description] - An optional description of the task.\n * @param {TaskOptions & EphemeralTaskOptions} [options={}] - Additional options for configuring the task.\n * @return {EphemeralTask} The created ephemeral meta task.\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 new routine with the specified name, tasks, and an optional description.\n * Routines are named entry points to starting tasks and are registered in the GraphRegistry.\n * They are used to group tasks together and provide a high-level structure for organizing and managing the execution of a set of tasks.\n * See {@link GraphRoutine} for more information.\n *\n * @param {string} name - The name of the routine to create.\n * @param {Task[]} tasks - A list of tasks to include in the routine.\n * @param {string} [description=\"\"] - An optional description for the routine.\n * @return {GraphRoutine} A new instance of the GraphRoutine containing the specified tasks and description.\n *\n * @example\n * ```ts\n * const task1 = Cadenza.createTask(\"Task 1\", () => {});\n * const task2 = Cadenza.createTask(\"Task 2\", () => {});\n *\n * task1.then(task2);\n *\n * const routine = Cadenza.createRoutine(\"Some routine\", [task1]);\n *\n * Cadenza.run(routine);\n *\n * // Or, routines can be triggered by signals\n * routine.doOn(\"some.signal\");\n *\n * Cadenza.emit(\"some.signal\", {});\n * ```\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 meta routine with a given name, tasks, and optional description.\n * Routines are named entry points to starting tasks and are registered in the GraphRegistry.\n * They are used to group tasks together and provide a high-level structure for organizing and managing the execution of a set of tasks.\n * See {@link GraphRoutine} and {@link createRoutine} for more information.\n *\n * @param {string} name - The name of the routine to be created.\n * @param {Task[]} tasks - An array of tasks that the routine will consist of.\n * @param {string} [description=\"\"] - An optional description for the routine.\n * @return {GraphRoutine} A new instance of the `GraphRoutine` representing the created routine.\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, InquiryOptions, 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\n/**\n * Represents a task that delegates execution of a routine to a remote system or service.\n * The `DeputyTask` serves as a proxy to perform and track the progress of a remote workflow.\n * It extends the `Task` class with additional delegation capabilities.\n *\n * Emits various meta-signals for monitoring delegation progress and resolution.\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 registeredDeputyMap: boolean = false;\n\n /**\n * Constructs a new instance of the class with the specified parameters.\n *\n * @param {string} name - The name of the task.\n * @param {string} remoteRoutineName - The name of the remote routine to delegate tasks to.\n * @param {string | undefined} [serviceName=undefined] - The name of the service associated with the task.\n * @param {string} [description=\"\"] - A brief description of the task.\n * @param {number} [concurrency=0] - The concurrency level of the task.\n * @param {number} [timeout=0] - The timeout duration for the task.\n * @param {boolean} [register=true] - Whether the task should be registered in the system.\n * @param {boolean} [isUnique=false] - Whether the task is unique.\n * @param {boolean} [isMeta=false] - Whether the task is a meta task.\n * @param {boolean} [isSubMeta=false] - Whether the task is a sub-meta task.\n * @param {boolean} [isHidden=false] - Whether the task is hidden from the system.\n * @param {ThrottleTagGetter | undefined} [getTagCallback=undefined] - A callback function to retrieve throttle tags.\n * @param {SchemaDefinition | undefined} [inputSchema=undefined] - The input schema definition for the task.\n * @param {boolean} [validateInputContext=false] - Whether to validate the input context against the input schema.\n * @param {SchemaDefinition | undefined} [outputSchema=undefined] - The output schema definition for the task.\n * @param {boolean} [validateOutputContext=false] - Whether to validate the output context against the output schema.\n * @param {number} [retryCount=0] - The number of retries allowed for task execution.\n * @param {number} [retryDelay=0] - The initial delay between retries in milliseconds.\n * @param {number} [retryDelayMax=0] - The maximum retry delay in milliseconds.\n * @param {number} [retryDelayFactor=1] - The factor by which to increase the retry delay for subsequent retries.\n * @return {void} This constructor does not return a value.\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 inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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 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.attachSignal(\"meta.deputy.delegation_requested\");\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 * Executes the specified task function within the provided execution context.\n *\n * @param {GraphContext} context - The execution context containing methods and metadata for task execution.\n * @param {function(string, AnyObject): void} emit - A function for emitting signals with associated data during execution.\n * @param inquire\n * @param {function(number): void} progressCallback - A callback function to report progress updates during task processing.\n * @param {{ nodeId: string, routineExecId: string }} nodeData - Object containing identifiers for the node and routine execution.\n * @return {TaskResult} Returns the result of the task function execution.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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, inquire, progressCallback);\n }\n}\n","import DeputyTask from \"./DeputyTask\";\nimport { GraphContext, InquiryOptions } 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\n/**\n * Represents a specialized task for delegating database operations. Extends `DeputyTask`.\n * This class is designed to abstract database operation requests, delegating execution to a meta-layer system.\n */\nexport default class DatabaseTask extends DeputyTask {\n private readonly queryData: DbOperationPayload;\n\n /**\n * Constructs an instance of the class with the provided parameters, defining\n * various configuration options and behaviors for the task.\n *\n * @param {string} name - The unique name of the task.\n * @param {string} taskName - The specific name of the task.\n * @param {string | undefined} serviceName - The associated service name. Defaults to undefined.\n * @param {string} description - A brief description of the task. Defaults to an empty string.\n * @param {DbOperationPayload} queryData - The data payload for database operations.\n * @param {number} concurrency - The level of concurrency allowed. Defaults to 0.\n * @param {number} timeout - The timeout duration in milliseconds. Defaults to 0.\n * @param {boolean} register - A flag indicating whether to register the task. Defaults to true.\n * @param {boolean} isUnique - Indicates if the task instance is unique. Defaults to false.\n * @param {boolean} isMeta - Indicates if the task is meta. Defaults to false.\n * @param {boolean} isSubMeta - Indicates if the task is a sub-meta task. Defaults to false.\n * @param {boolean} isHidden - Indicates if the task is hidden. Defaults to false.\n * @param {ThrottleTagGetter | undefined} getTagCallback - A callback used for throttling. Defaults to undefined.\n * @param {SchemaDefinition | undefined} inputSchema - The schema definition for input validation. Defaults to undefined.\n * @param {boolean} validateInputContext - Whether to validate the input context. Defaults to false.\n * @param {SchemaDefinition | undefined} outputSchema - The schema definition for output validation. Defaults to undefined.\n * @param {boolean} validateOutputContext - Whether to validate the output context. Defaults to false.\n * @param {number} retryCount - The maximum number of retry attempts. Defaults to 0.\n * @param {number} retryDelay - The delay between retries in milliseconds. Defaults to 0.\n * @param {number} retryDelayMax - The maximum delay between retries in milliseconds. Defaults to 0.\n * @param {number} retryDelayFactor - The factor for exponential backoff. Defaults to 1.\n * @return {void}\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 * Executes the specified task within the given context.\n *\n * @param {GraphContext} context - The execution context for the current task, which includes data and metadata required for processing.\n * @param {(signal: string, ctx: AnyObject) => void} emit - A function used to send signals or events during task execution.\n * @param inquire\n * @param {(progress: number) => void} progressCallback - A function to report execution progress as a percentage (0-100).\n * @param {{ nodeId: string; routineExecId: string }} nodeData - An object containing identifiers for the current node and routine execution.\n * @return {TaskResult} The result of the task execution.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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, inquire, progressCallback);\n }\n}\n","/**\n * A boolean variable indicating whether the current runtime environment is Node.js.\n *\n * This variable checks for the presence of the `process` object, which is specific to Node.js,\n * and verifies if the `process.versions.node` property is defined to confirm the environment.\n *\n * If the runtime is Node.js, `isNode` will be `true`; otherwise, it will be `false`.\n */\nexport const isNode =\n typeof process !== \"undefined\" && process.versions?.node != null;\n\n/**\n * A boolean variable that indicates whether the current runtime environment\n * is a browser. It checks for the presence of the `window` object and the\n * `document` property within it to determine if the code is running in a\n * browser context.\n *\n * - Returns `true` if the `window` object and its `document` property are\n * both defined, which typically indicates a browser environment.\n * - Returns `false` if the `window` object or `document` property is\n * undefined, which typically signifies a non-browser environment such\n * as a Node.js environment.\n */\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n","import { GraphRoutine, 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\n/**\n * The ServiceRegistry class is a singleton that manages the registration and lifecycle of\n * service instances, deputies, and remote signals in a distributed service architecture.\n * It handles various tasks such as instance updates, remote signal registration,\n * service status synchronization, and error/event broadcasting.\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, Set<string>> = 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 handleGlobalSignalRegistrationTask: Task;\n handleSocketStatusUpdateTask: Task;\n fullSyncTask: GraphRoutine;\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 /**\n * Initializes a private constructor for managing service instances, remote signals,\n * service health, and handling updates or synchronization tasks. The constructor\n * creates a variety of meta tasks that process different lifecycle events and\n * service-related updates in a distributed service registry model.\n *\n * @return {Object} An instance of the constructed class with initialized tasks\n * and state management necessary to process service-related events.\n */\n private constructor() {\n this.handleInstanceUpdateTask = Cadenza.createMetaTask(\n \"Handle Instance Update\",\n (ctx, emit) => {\n const { serviceInstance } = ctx;\n const {\n uuid,\n serviceName,\n address,\n port,\n exposed,\n isFrontend,\n deleted,\n } = serviceInstance;\n if (uuid === this.serviceInstanceId) return;\n\n if (deleted) {\n this.instances\n .get(serviceName)\n ?.splice(\n this.instances\n .get(serviceName)\n ?.findIndex((i) => i.uuid === uuid) ?? -1,\n 1,\n );\n\n if (this.instances.get(serviceName)?.length === 0) {\n this.instances.delete(serviceName);\n } else if (\n this.instances\n .get(serviceName)\n ?.filter((i) => i.address === address && i.port === port)\n .length === 0\n ) {\n emit(`meta.socket_shutdown_requested:${address}_${port}`, {});\n emit(`meta.fetch.destroy_requested:${address}_${port}`, {});\n }\n\n return;\n }\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 instances.push(serviceInstance);\n }\n\n if (this.serviceName === serviceName) {\n return false;\n }\n\n if (\n (!isFrontend && this.deputies.has(serviceName)) ||\n this.remoteSignals.has(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 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 ) {\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 instances\n ?.filter(\n (i: any) =>\n i.address === address &&\n i.port === port &&\n i.clientCreated &&\n i.isActive,\n )\n .forEach((i: any) => {\n i.clientCreated = true;\n });\n }\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 \"global.meta.service_instance.inserted\",\n \"global.meta.service_instance.updated\",\n \"meta.service_instance.inserted\",\n \"meta.service_instance.updated\",\n \"meta.socket_client.status_received\",\n )\n .attachSignal(\n \"meta.service_registry.dependee_registered\",\n \"meta.socket_shutdown_requested\",\n \"meta.fetch.destroy_requested\",\n );\n\n Cadenza.createMetaTask(\"Split service instances\", function* (ctx: any) {\n if (!ctx.serviceInstances) {\n return;\n }\n\n for (const serviceInstance of ctx.serviceInstances) {\n yield { serviceInstance };\n }\n })\n .doOn(\"meta.service_registry.registered_global_signals\")\n .then(this.handleInstanceUpdateTask);\n\n this.handleGlobalSignalRegistrationTask = Cadenza.createMetaTask(\n \"Handle global Signal Registration\",\n (ctx) => {\n const { signalToTaskMaps } = ctx;\n const sortedSignalToTaskMap = signalToTaskMaps.sort(\n (a: any, b: any) => {\n if (a.deleted && !b.deleted) return -1;\n if (!a.deleted && b.deleted) return 1;\n return 0;\n },\n );\n\n const locallyEmittedSignals = Cadenza.signalBroker\n .listEmittedSignals()\n .filter((s: any) => s.startsWith(\"global.\"));\n\n for (const map of sortedSignalToTaskMap) {\n if (map.deleted) {\n this.remoteSignals.get(map.serviceName)?.delete(map.signalName);\n\n if (!this.remoteSignals.get(map.serviceName)?.size) {\n this.remoteSignals.delete(map.serviceName);\n }\n\n Cadenza.get(\n `Transmit signal: ${map.signalName} to ${map.serviceName}`,\n )?.destroy();\n continue;\n }\n\n if (locallyEmittedSignals.includes(map.signalName)) {\n if (!this.remoteSignals.get(map.serviceName)) {\n this.remoteSignals.set(map.serviceName, new Set());\n }\n\n if (!this.remoteSignals.get(map.serviceName)?.has(map.signalName)) {\n Cadenza.createSignalTransmissionTask(\n map.signalName,\n map.serviceName,\n );\n }\n\n this.remoteSignals.get(map.serviceName)?.add(map.signalName);\n }\n }\n\n return true;\n },\n \"Handles registration of remote signals\",\n )\n .emits(\"meta.service_registry.registered_global_signals\")\n .doOn(\"global.meta.cadenza_db.gathered_sync_data\");\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\n Cadenza.log(\n \"Service not responding.\",\n {\n serviceName,\n serviceAddress,\n servicePort,\n instances,\n },\n \"warning\",\n serviceName,\n );\n\n for (const instance of instances ?? []) {\n instance.isActive = false;\n instance.isNonResponsive = true;\n emit(\"global.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\n return true;\n },\n \"Handles service not responding\",\n )\n .doOn(\"meta.fetch.handshake_failed\", \"meta.socket_client.disconnected\")\n .attachSignal(\"global.meta.service_registry.service_not_responding\");\n\n this.handleServiceHandshakeTask = Cadenza.createMetaTask(\n \"Handle service handshake\",\n (ctx, emit) => {\n const { serviceName, serviceInstanceId, serviceAddress, servicePort } =\n ctx;\n const serviceInstances = this.instances.get(serviceName);\n const instance = serviceInstances?.find(\n (i) => i.uuid === serviceInstanceId,\n );\n\n if (!instance) {\n return false;\n }\n\n instance.isActive = true;\n instance.isNonResponsive = false;\n emit(\"global.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 const instancesToDelete = serviceInstances?.filter(\n (i) =>\n i.uuid !== serviceInstanceId &&\n i.address === serviceAddress &&\n i.port === servicePort,\n );\n\n for (const i of instancesToDelete ?? []) {\n this.instances\n .get(serviceName)\n ?.splice(this.instances.get(serviceName)?.indexOf(i) ?? -1, 1);\n emit(\"global.meta.service_registry.deleted\", {\n data: {\n isActive: false,\n isNonResponsive: false,\n deleted: true,\n },\n filter: {\n uuid: i.uuid,\n },\n });\n }\n\n return true;\n },\n \"Handles service handshake\",\n )\n .doOn(\"meta.fetch.handshake_complete\")\n .attachSignal(\n \"global.meta.service_registry.service_handshake\",\n \"global.meta.service_registry.deleted\",\n );\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 const mergeSyncDataTask = Cadenza.createUniqueMetaTask(\n \"Merge sync data\",\n (ctx) => {\n let joinedContext: any = {};\n ctx.joinedContexts.forEach((ctx: any) => {\n joinedContext = { ...joinedContext, ...ctx };\n });\n return joinedContext;\n },\n ).then(this.handleGlobalSignalRegistrationTask);\n\n this.fullSyncTask = Cadenza.createMetaRoutine(\"Full sync\", [\n Cadenza.createCadenzaDBQueryTask(\"signal_to_task_map\", {\n filter: {\n isGlobal: true,\n },\n fields: [\"signal_name\", \"service_name\", \"deleted\"],\n }).then(mergeSyncDataTask),\n 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 }).then(mergeSyncDataTask),\n ]).doOn(\"meta.sync_requested\");\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) => {\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 ).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(\"global.meta.service_instance.deleted\");\n\n this.getBalancedInstance = Cadenza.createMetaTask(\n \"Get balanced instance\",\n (context, emit) => {\n const { __serviceName, __triedInstances, __retries, __broadcast } =\n 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 for ${__serviceName}. Retries: ${retries}. ${this.instances.get(\n __serviceName,\n )}`;\n emit(\n `meta.service_registry.load_balance_failed:${context.__metadata.__deputyExecId}`,\n context,\n );\n return context;\n }\n\n if (__broadcast || 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 )\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 .attachSignal(\n \"meta.service_registry.load_balance_failed\",\n \"meta.service_registry.selected_instance_for_socket\",\n \"meta.service_registry.selected_instance_for_fetch\",\n \"meta.service_registry.socket_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 .emits(\"meta.service_registry.service_inserted\")\n .emitsOnFail(\"meta.service_registry.service_insertion_failed\");\n\n this.insertServiceInstanceTask = Cadenza.createCadenzaDBInsertTask(\n \"serviceInstance\",\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(\"global.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 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\"],\n filter: {\n global: true,\n },\n }).then(\n Cadenza.createMetaTask(\n // TODO this is outdated. Fix it.\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, InquiryOptions, 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\n/**\n * Represents a task responsible for transmitting signals to a remote service\n * through the meta-layer for operations delegation.\n *\n * @class\n * @extends Task\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 new instance of the class and initializes it with the provided parameters.\n *\n * @param {string} name - The name of the task being created.\n * @param {string} signalName - The name of the signal associated with this task.\n * @param {string} serviceName - The name of the service associated with this task.\n * @param {string} [description=\"\"] - An optional description of the task.\n * @param {number} [concurrency=0] - The maximum allowed concurrency for this task.\n * @param {number} [timeout=0] - The maximum execution time for this task, in milliseconds.\n * @param {boolean} [register=true] - Whether the task should be registered upon creation.\n * @param {boolean} [isUnique=false] - Indicates if the task should enforce uniqueness.\n * @param {boolean} [isMeta=false] - Specifies if the task is a meta-task.\n * @param {boolean} [isSubMeta=false] - Specifies if the task is a sub-meta-task.\n * @param {boolean} [isHidden=false] - Indicates if the task is hidden from visibility.\n * @param {ThrottleTagGetter|undefined} [getTagCallback=undefined] - A callback for tag throttling logic.\n * @param {SchemaDefinition|undefined} [inputSchema=undefined] - An optional schema for validating input data.\n * @param {boolean} [validateInputContext=false] - Whether to validate the input context against the input schema.\n * @param {SchemaDefinition|undefined} [outputSchema=undefined] - An optional schema for validating output data.\n * @param {boolean} [validateOutputContext=false] - Whether to validate the output context against the output schema.\n * @param {number} [retryCount=0] - The number of retry attempts allowed in case of task failure.\n * @param {number} [retryDelay=0] - The initial delay before retrying a failed task, in milliseconds.\n * @param {number} [retryDelayMax=0] - The maximum delay between retry attempts, in milliseconds.\n * @param {number} [retryDelayFactor=1] - A multiplier applied to retry delay for exponential backoff.\n * @return {void} Does not return a value.\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 = true,\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 = (context: AnyObject): TaskResult => {\n context.__routineExecId = uuid();\n return context;\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.doOn(signalName);\n this.then(Cadenza.serviceRegistry.getBalancedInstance);\n }\n\n /**\n * Executes the given task function within the provided execution context.\n *\n * @param {GraphContext} context - The context object providing the graph execution environment and metadata.\n * @param {Function} emit - A function to emit signals with the provided name and context.\n * @param inquire\n * @param {Function} progressCallback - A callback function to report the progress of the task execution as a number between 0 and 1.\n * @return {TaskResult} The result of the executed task function.\n */\n execute(\n context: GraphContext,\n emit: (signal: string, ctx: AnyObject) => void,\n inquire: (\n inquiry: string,\n context: AnyObject,\n options: InquiryOptions,\n ) => Promise<AnyObject>,\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 __localServiceName: Cadenza.serviceRegistry.serviceName,\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 __signalEmissionId: metadata.__signalEmission?.uuid,\n ...ctx,\n };\n\n return this.taskFunction(deputyContext, emit, inquire, 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\n/**\n * RestController class is responsible for managing RESTful interactions, including defining\n * server configurations and handling client requests. It serves as a singleton, accessible via\n * the `instance` property.\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 /**\n * Fetches data from the given URL with a specified timeout. This function performs\n * a fetch request with the ability to cancel the request if it exceeds the provided timeout duration.\n *\n * @param {string} url - The URL to make the request to.\n * @param {any} requestInit - The initialization object for the fetch request, which may include method, headers, and body.\n * @param {number} timeoutMs - The maximum duration in milliseconds to wait for the fetch request to complete before aborting.\n * @returns {Promise<any>} A promise that resolves to the parsed response data if the request is successful.\n * @throws {Error} Throws an error if the request fails due to issues such as timeout or other unexpected errors.\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 Cadenza.log(\n \"Fetch request timed out.\",\n { error, URL: url, requestInit },\n \"warning\",\n );\n // Handle timeout specifically\n } else {\n Cadenza.log(\n \"Fetch request error.\",\n { error, URL: url, requestInit },\n \"error\",\n );\n // Handle other errors\n }\n throw error; // Re-throw to propagate the error\n }\n };\n\n /**\n * Constructor for initializing the REST server and related configurations.\n *\n * This method configures and sets up the REST server tasks using Cadenza's meta-task system, defining certain endpoints\n * like `/handshake`, `/delegation`, `/signal`, and `/status`. It also integrates security settings, CORS policies,\n * and rate-limiting profiles (low, medium, high) based on the provided context. Furthermore, it starts the server and\n * establishes necessary meta-handlings to enable delegated operations and signal processing.\n *\n * It initializes and configures the REST server tasks.\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 )\n .attachSignal(\"meta.rest.browser_detected\")\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 Cadenza.log(\"New fetch connection.\", req.body);\n Cadenza.emit(\"meta.rest.handshake\", req.body);\n res.send({\n __status: \"success\",\n __serviceInstanceId:\n Cadenza.serviceRegistry.serviceInstanceId,\n });\n } catch (e) {\n Cadenza.log(\n \"Error in fetch handshake\",\n { error: e, body: req.body },\n \"error\",\n );\n res.send({ __status: \"error\" });\n }\n });\n\n app.post(\"/delegation\", (req: Request, res: Response) => {\n let deputyExecId;\n let ctx;\n ctx = req.body;\n deputyExecId = ctx.__metadata.__deputyExecId;\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n (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.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 if (\n !Cadenza.signalBroker\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 Cadenza.log(\n \"Error in REST signal consumption\",\n { error: e, ...ctx },\n \"error\",\n );\n res.send({\n __status: \"error\",\n __error: e,\n });\n return;\n }\n\n Cadenza.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.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 = \"undefined\";\n let port: number = ctx.__port;\n let exposed: boolean = false;\n\n const createHttpServer = async (ctx: any) => {\n await new Promise((resolve) => {\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 || \"undefined\";\n }\n\n console.log(\n `Server is running on ${address}:${port}`,\n );\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 delete ctx.__app;\n\n return ctx;\n },\n \"Configures network mode\",\n )\n .emits(\"global.meta.rest.network_configured\")\n .emitsOnFail(\"meta.rest.network_configuration_failed\")\n .then(\n Cadenza.createMetaTask(\n \"Connect delegation to runner\",\n () => {\n Cadenza.createMetaTask(\n \"Start run\",\n (context, emit: any) => {\n if (context.task || context.routine) {\n const routine = context.task ?? context.routine;\n delete context.task;\n delete context.routine;\n context.__routineExecId =\n context.__metadata?.__deputyExecId ?? null;\n context.__isDeputy = true;\n Cadenza.runner.run(routine, context);\n return true;\n } else {\n context.errored = true;\n context.__error = \"No routine or task defined.\";\n emit(\"meta.runner.failed\", context);\n return false;\n }\n },\n \"Forward delegations to runner\",\n )\n .attachSignal(\"meta.runner.failed\")\n .doAfter(\n Cadenza.registry.getTaskByName,\n Cadenza.registry.getRoutineByName,\n );\n },\n ),\n ),\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) => {\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 if (Cadenza.get(`Send Handshake to ${URL}`)) {\n console.error(\"Fetch client already exists\", URL);\n return;\n }\n\n const handshakeTask = Cadenza.createMetaTask(\n `Send Handshake to ${URL}`,\n async (ctx, emit) => {\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 if (response.__status !== \"success\") {\n const error =\n response.__error ??\n `Failed to connect to service ${serviceName} ${ctx.serviceInstanceId}`;\n Cadenza.log(\n \"Fetch handshake failed.\",\n { error, serviceName, URL },\n \"warning\",\n );\n emit(`meta.fetch.handshake_failed:${fetchId}`, response);\n return { ...ctx, __error: error, errored: true };\n }\n\n ctx.serviceInstanceId = response.__serviceInstanceId;\n\n Cadenza.log(\"Fetch client connected.\", {\n response,\n serviceName,\n URL,\n });\n\n for (const communicationType of ctx.communicationTypes) {\n // TODO: Should be done in other situations as well\n emit(\"global.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 Cadenza.log(\n \"Error in fetch handshake\",\n { error: e, serviceName, URL, ctx },\n \"error\",\n );\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 .attachSignal(\n \"meta.fetch.handshake_failed\",\n \"global.meta.fetch.service_communication_established\",\n );\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 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 .attachSignal(\"meta.fetch.delegated\");\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 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 .attachSignal(\"meta.fetch.transmitted\");\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\", () => {\n Cadenza.log(\"Destroying fetch client\", { URL, serviceName });\n handshakeTask.destroy();\n delegateTask.destroy();\n transmitTask.destroy();\n statusTask.destroy();\n })\n .doOn(\n `meta.fetch.destroy_requested:${fetchId}`,\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 ).attachSignal(\"meta.fetch.handshake_requested\"),\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\n/**\n * The `SocketController` class handles the setup and management of a WebSocket server,\n * ensuring secure connections, message handling, and rate-limiting.\n * This class is designed to function as a singleton, providing a unified interface\n * for WebSocket interactions in the application by standardizing the server setup\n * and integrating task-based processing through the `Cadenza` framework.\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 /**\n * Constructs the `SocketServer`, setting up a WebSocket server with specific configurations,\n * including connection state recovery, rate limiting, CORS handling, and custom event handling.\n * This class sets up the communication infrastructure for scalable, resilient, and secure WebSocket-based interactions\n * using metadata-driven task execution with `Cadenza`.\n *\n * It provides support for:\n * - Origin-based access control for connections.\n * - Optional payload sanitization.\n * - Configurable rate limiting and behavior on limit breaches (soft/hard disconnects).\n * - Event handlers for connection, handshake, delegation, signaling, status checks, and disconnection.\n *\n * The server can handle both internal and external interactions depending on the provided configurations,\n * and integrates directly with Cadenza's task workflow engine.\n *\n * Initializes the `SocketServer` to be ready for WebSocket communication.\n */\n constructor() {\n Cadenza.createMetaRoutine(\n \"SocketServer\",\n [\n Cadenza.createMetaTask(\"Setup SocketServer\", (ctx) => {\n if (!ctx.__useSocket) {\n return;\n }\n\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 Cadenza.log(\n \"SocketServer: Rate limit exceeded\",\n {\n retryAfter: rej.msBeforeNext / 1000,\n clientKey,\n socketId: socket.id,\n },\n \"warning\",\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 Cadenza.log(\n \"SocketServer: Rate limit exceeded, blocked\",\n {\n clientKey,\n socketId: socket.id,\n },\n \"critical\",\n );\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\n if (!server) {\n Cadenza.log(\"Socket setup error: No server\", {}, \"error\");\n return { ...ctx, __error: \"No server\", errored: true };\n }\n\n const handshakeMap: { [key: string]: boolean } = {};\n\n server.on(\"connection\", (ws: any) => {\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 Cadenza.log(\"SocketServer: New connection\", {\n ...ctx,\n socketId: ws.id,\n });\n\n callback({\n status: \"success\",\n serviceName: Cadenza.serviceRegistry.serviceName,\n });\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 )\n .doOn(\n `meta.service_registry.selected_instance_for_socket:${fetchId}`,\n )\n .attachSignal(\"meta.socket_client.transmitted\");\n }\n\n Cadenza.emit(\"meta.socket.handshake\", ctx);\n },\n );\n\n ws.on(\n \"delegation\",\n (ctx: AnyObject, callback: (ctx: AnyObject) => any) => {\n const deputyExecId = ctx.__metadata.__deputyExecId;\n\n Cadenza.createEphemeralMetaTask(\n \"Resolve delegation\",\n (ctx: AnyObject) => {\n callback(ctx);\n },\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.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.signalBroker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n callback({\n __status: \"success\",\n __signalName: ctx.__signalName,\n });\n\n Cadenza.emit(ctx.__signalName, ctx);\n } else {\n Cadenza.log(\n `No such signal ${ctx.__signalName} on ${ctx.__serviceName}`,\n \"warning\",\n );\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.emit(\"meta.socket.status_check_requested\", ctx);\n },\n );\n\n ws.on(\"disconnect\", () => {\n Cadenza.log(\n \"Socket client disconnected\",\n { socketId: ws.id },\n \"warning\",\n );\n Cadenza.emit(\"meta.socket.disconnected\", {\n __wsId: ws.id,\n });\n });\n } catch (e) {\n Cadenza.log(\n \"SocketServer: Error in socket event\",\n { error: e },\n \"error\",\n );\n }\n\n Cadenza.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 return ctx;\n }),\n ],\n \"Bootstraps the socket server\",\n ).doOn(\"global.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 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) => {\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 Cadenza.log(\n `Socket event '${event}' timed out`,\n { ...data, socketId: socket.id, serviceName, URL },\n \"error\",\n );\n resolve({\n ...data,\n errored: true,\n __error: `Socket event '${event}' timed out`,\n error: `Socket event '${event}' timed out`,\n socketId: socket.id,\n serviceName,\n URL,\n });\n }, timeoutMs);\n }\n\n socket\n .timeout(timeoutMs)\n .emit(event, data, (err: any, response: T) => {\n if (err) {\n Cadenza.log(\n \"Socket timeout.\",\n { error: err, socketId: socket.id, serviceName },\n \"warning\",\n );\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 if (handshake) return;\n Cadenza.emit(`meta.socket_client.connected:${fetchId}`, ctx);\n });\n\n socket.on(\"delegation_progress\", (ctx) => {\n Cadenza.emit(\n `meta.socket_client.delegation_progress:${ctx.__metadata.__deputyExecId}`,\n ctx,\n );\n });\n\n socket.on(\"signal\", (ctx) => {\n if (\n Cadenza.signalBroker\n .listObservedSignals()\n .includes(ctx.__signalName)\n ) {\n Cadenza.emit(ctx.__signalName, ctx);\n }\n });\n\n socket.on(\"status_update\", (status) => {\n Cadenza.emit(\"meta.socket_client.status_received\", status);\n });\n\n socket.on(\"connect_error\", (err) => {\n Cadenza.log(\n \"Socket connect error\",\n { error: err.message, serviceName, socketId: socket.id, URL },\n \"error\",\n );\n Cadenza.emit(\"meta.socket_client.connect_error\", err);\n });\n\n socket.on(\"reconnect_attempt\", (attempt) => {\n Cadenza.log(`Reconnect attempt: ${attempt}`);\n });\n\n socket.on(\"reconnect\", (attempt) => {\n Cadenza.log(`Socket reconnected after ${attempt} tries`, {\n socketId: socket.id,\n URL,\n serviceName,\n });\n });\n\n socket.on(\"reconnect_error\", (err) => {\n Cadenza.log(\n \"Socket reconnect failed.\",\n { error: err.message, serviceName, URL, socketId: socket.id },\n \"warning\",\n );\n });\n\n socket.on(\"error\", (err) => {\n // TODO: Retry on rate limit error\n\n Cadenza.log(\n \"Socket error\",\n { error: err, socketId: socket.id, URL, serviceName },\n \"error\",\n );\n Cadenza.emit(\"meta.socket_client.error\", err);\n });\n\n socket.on(\"disconnect\", () => {\n Cadenza.log(\n \"Socket disconnected.\",\n { URL, serviceName, socketId: socket.id },\n \"warning\",\n );\n Cadenza.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 if (handshake) return;\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 if (result.status === \"success\") {\n Cadenza.log(\"Socket connected\", {\n result,\n serviceName,\n socketId: socket.id,\n URL,\n });\n } else {\n Cadenza.log(\n \"Socket handshake failed\",\n { result, serviceName, socketId: socket.id, URL },\n \"warning\",\n );\n }\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) => {\n delete ctx.__isSubMeta;\n delete ctx.__broadcast;\n const requestSentAt = Date.now();\n emitWhenReady(\n \"delegation\",\n ctx,\n 20_000,\n (resultContext: AnyObject) => {\n const requestDuration = Date.now() - requestSentAt;\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 __requestDuration: requestDuration,\n },\n );\n resolve(resultContext);\n },\n );\n });\n },\n `Delegate flow to service ${serviceName} with address ${URL}`,\n )\n .doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`)\n .attachSignal(\"meta.socket_client.delegated\");\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 delete ctx.__broadcast;\n\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 )\n .doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`)\n .attachSignal(\"meta.socket_client.transmitted\");\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","/**\n * Formats a given timestamp into an ISO 8601 date string.\n *\n * @param {number} timestamp - The timestamp to format, represented as the number of milliseconds since the UNIX epoch.\n * @return {string} The formatted ISO 8601 string representing the date and time corresponding to the provided timestamp.\n */\nexport function formatTimestamp(timestamp: number) {\n return new Date(timestamp).toISOString();\n}\n\n/**\n * Decomposes a signal name into its constituent parts such as metadata indicator, source service name, domain, and action.\n *\n * @param {string} signalName - The signal name string to be decomposed. Typically a dot-separated string.\n * @return {Object} An object containing the decomposed parts:\n * - `isMeta` {boolean} - Indicates whether the signal is a metadata signal.\n * - `sourceServiceName` {string|null} - The name of the source service, or null if not applicable.\n * - `domain` {string} - The domain extracted from the signal name.\n * - `action` {string} - The action or last component of the signal name.\n */\nexport function decomposeSignalName(signalName: string) {\n const parts = signalName.split(\".\");\n let isMeta =\n parts[0] === \"meta\" ||\n parts[0] === \"sub_meta\" ||\n parts[1] === \"meta\" ||\n parts[1] === \"sub_meta\";\n let isGlobal = parts[0] === \"global\";\n let domain = isGlobal\n ? isMeta\n ? parts.length === 4\n ? parts[2]\n : \"\"\n : parts.length === 3\n ? parts[1]\n : \"\"\n : isMeta\n ? parts.length === 3\n ? parts[1]\n : \"\"\n : parts.length === 2\n ? parts[0]\n : \"\";\n const action = parts[parts.length - 1];\n\n return {\n isMeta,\n isGlobal,\n domain,\n action,\n };\n}\n","import Cadenza from \"../Cadenza\";\nimport { decomposeSignalName } from \"../utils/tools\";\n\n/**\n * SignalController is a singleton class that manages signal registration, transmission,\n * and metadata handling within a service instance.\n *\n * This class utilizes the Cadenza framework to handle various tasks related to signals,\n * such as registering signals, transmitting signals to remote services, adding metadata,\n * and maintaining clean-forwarding and processing of signals.\n *\n * Features:\n * - Ensures signals are properly registered and metadata is propagated.\n * - Handles foreign signal registration for cross-service communication.\n * - Forwards signal observations and manages their metadata.\n * - Adds metadata during signal emission and consumption.\n * - Implements a meta-task-based system for handling complex workflows.\n *\n * Constructor initializes the necessary meta-tasks and tasks required for signal management.\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 /**\n * Constructor method for initializing the signal registration and data transmission process.\n * This method defines multiple meta tasks to manage signals, forwarding, and adding metadata\n * for service instances in a distributed system.\n *\n * Some key functionalities include:\n * - Registering signals from a service instance.\n * - Handling foreign signal registration from remote services.\n * - Forwarding signal observations between services.\n * - Adding metadata to signal emissions for better traceability.\n * - Adding metadata to signal consumption events.\n *\n * It serves as an initializer for signals and tasks.\n */\n constructor() {\n Cadenza.createMetaTask(\n \"Handle Signal Registration\",\n (ctx, emit) => {\n const { signalName } = ctx;\n const { isMeta, isGlobal, domain, action } =\n decomposeSignalName(signalName);\n\n emit(\"global.meta.signal_controller.signal_added\", {\n data: {\n name: signalName,\n isGlobal,\n domain,\n action,\n isMeta,\n },\n });\n\n return ctx;\n },\n \"Handles signal registration from a service instance\",\n )\n .doOn(\"meta.signal_broker.added\")\n .attachSignal(\"global.meta.signal_controller.signal_added\");\n\n Cadenza.createMetaTask(\n \"Add data to signal emission\",\n (ctx) => {\n const signalEmission = ctx.__signalEmission;\n delete ctx.__signalEmission;\n\n if (!signalEmission) {\n return false;\n }\n\n return {\n data: {\n uuid: signalEmission.uuid,\n signal_name: signalEmission.signalName,\n signal_tag: signalEmission.signalTag,\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 routine_execution_id: signalEmission.routineExecutionId,\n execution_trace_id: signalEmission.executionTraceId,\n context: ctx,\n metadata: signalEmission,\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(\"sub_meta.signal_broker.emitting_signal\")\n .emits(\"global.sub_meta.signal_controller.signal_emitted\");\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 serviceName: 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(\"global.meta.graph_metadata.task_created\");\n\n Cadenza.createMetaTask(\"Handle task update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.layer_index_changed\", \"meta.task.destroyed\")\n .emits(\"global.meta.graph_metadata.task_updated\");\n\n Cadenza.createMetaTask(\"Handle task relationship creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n predecessorServiceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.relationship_added\")\n .emits(\"global.meta.graph_metadata.task_relationship_created\");\n\n Cadenza.createMetaTask(\"Handle task error\", (ctx) => {\n Cadenza.log(`Error in task ${ctx.data.taskName}`, ctx.data, \"error\");\n }).doOn(\"meta.node.errored\");\n\n Cadenza.createMetaTask(\"Handle task signal observation\", (ctx) => {\n const isGlobal = ctx.signalName.startsWith(\"global.\");\n return {\n data: {\n ...ctx.data,\n isGlobal,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.observed_signal\")\n .emits(\"global.meta.graph_metadata.task_signal_observed\");\n\n Cadenza.createMetaTask(\"Handle task signal attachment\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n },\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.attached_signal\")\n .emits(\"global.meta.graph_metadata.task_attached_signal\");\n\n Cadenza.createMetaTask(\"Handle task unsubscribing signal\", (ctx) => {\n return {\n data: {\n deleted: true,\n },\n filter: {\n ...ctx.filter,\n serviceName: 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 serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.task.detached_signal\")\n .emits(\"global.meta.graph_metadata.task_detached_signal\");\n\n Cadenza.createMetaTask(\"Handle routine creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doAfter(Cadenza.registry.registerRoutine)\n .emits(\"global.meta.graph_metadata.routine_created\");\n\n Cadenza.createMetaTask(\"Handle routine update\", (ctx) => {\n return {\n ...ctx,\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.destroyed\")\n .emits(\"global.meta.graph_metadata.routine_updated\");\n\n Cadenza.createMetaTask(\"Handle adding task to routine\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n })\n .doOn(\"meta.routine.task_added\")\n .emits(\"global.meta.graph_metadata.task_added_to_routine\");\n\n Cadenza.createMetaTask(\"Handle new trace\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n service_name: Cadenza.serviceRegistry.serviceName,\n service_instance_id: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n })\n .doOn(\"meta.runner.new_trace\", \"sub_meta.signal_broker.new_trace\")\n .emits(\"global.meta.graph_metadata.execution_trace_created\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution creation\",\n (ctx) => {\n return {\n queryData: {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n },\n },\n };\n },\n \"Handles routine execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.runner.added_tasks\")\n .emits(\"global.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(\"global.meta.graph_metadata.routine_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle routine execution ended\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstance_id: Cadenza.serviceRegistry.serviceInstanceId,\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(\"global.meta.graph_metadata.routine_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution creation\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\n },\n };\n },\n \"Handles task execution creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.scheduled\")\n .emits(\"global.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\", \"meta.node.detected_previous_task_execution\")\n .emits(\"global.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(\"global.meta.graph_metadata.task_execution_started\");\n\n Cadenza.createMetaTask(\n \"Handle task execution ended\",\n (ctx) => {\n return {\n data: {\n ...ctx.data,\n serviceName: Cadenza.serviceRegistry.serviceName,\n serviceInstanceId: Cadenza.serviceRegistry.serviceInstanceId,\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(\"global.meta.graph_metadata.task_execution_ended\");\n\n Cadenza.createMetaTask(\n \"Handle task execution relationship creation\",\n (ctx) => {\n return {\n data: {\n executionCount: \"increment\",\n lastExecuted: formatTimestamp(Date.now()),\n },\n filter: {\n ...ctx.filter,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n };\n },\n \"Handles task execution relationship creation\",\n { concurrency: 100, isSubMeta: true },\n )\n .doOn(\"meta.node.mapped\", \"meta.node.detected_previous_task_execution\")\n .emits(\"global.meta.graph_metadata.relationship_executed\");\n\n Cadenza.createMetaTask(\"Handle Intent Creation\", (ctx) => {\n return {\n data: {\n ...ctx.data,\n },\n };\n })\n .doOn(\"meta.inquiry_broker.added\")\n .emits(\"global.meta.graph_metadata.intent_created\");\n }\n}\n","import type { AnyObject } from \"@cadenza.io/core\";\nimport { DbOperationPayload } from \"./queryData\";\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[]; // TODO\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 | {\n signal: string;\n condition?: (ctx: AnyObject) => boolean;\n queryData?: DbOperationPayload;\n }\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 FieldDefinition,\n SCHEMA_TYPES,\n SchemaDefinition,\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\";\n\n/**\n * DatabaseController is a singleton class that manages database connections,\n * schema validation, and database initialization tasks. It provides mechanisms\n * to create new databases, validate schemas, and manage the database lifecycle.\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 databaseName: string = \"\";\n\n dbClient = new Pool({\n connectionString: process.env.DATABASE_ADDRESS ?? \"\",\n database: \"postgres\",\n ssl: {\n rejectUnauthorized: false, // ← This bypasses the chain validation error\n },\n });\n\n reset() {\n this.dbClient.end();\n }\n\n /**\n * Constructor for initializing the `DatabaseService` class.\n *\n * This constructor method initializes a sequence of meta tasks to perform the following database-related operations:\n *\n * 1. **Database Creation**: Creates a new database with the specified name if it doesn't already exist.\n * Validates the database name to ensure it conforms to the required format.\n * 2. **Database Schema Validation**: Validates the structure and constraints of the schema definition provided.\n * 3. **Table Dependency Management**: Sorts tables within the schema by their dependencies to ensure proper creation order.\n * 4. **Schema Definition Processing**:\n * - Converts schema definitions into Data Definition Language (DDL) based on table and field specifications.\n * - Handles constraints, relationships, and field attributes such as uniqueness, primary keys, nullable fields, etc.\n * 5. **Index and Primary Key Definition**: Generates SQL for indices and primary keys based on the schema configuration.\n *\n * These tasks are encapsulated within a meta routine to provide a structured and procedural approach to database initialization and schema management.\n */\n constructor() {\n Cadenza.createMetaRoutine(\n \"DatabaseServiceInit\",\n [\n // TODO: Database health check\n // TODO: Create database role\n // TODO: 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 console.log(`Creating database ${databaseName}`, {\n connectionString: process.env.DATABASE_ADDRESS ?? \"\",\n database: \"postgres\",\n password: process.env.DATABASE_PASSWORD ?? \"03gibnEF\",\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 connectionString: process.env.DATABASE_ADDRESS ?? \"\",\n database: databaseName,\n ssl: {\n rejectUnauthorized: false, // ← This bypasses the chain validation error\n },\n });\n\n this.databaseName = databaseName;\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 console.error(\"Failed to create database\", error);\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 || \"CASCADE\"}`;\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(\"Executing DDL\", sql);\n await this.dbClient.query(sql);\n } catch (error: any) {\n console.error(\n \"Error applying DDL\",\n sql,\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 () => {\n return true;\n },\n ).emits(\"meta.database.setup_done\"),\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 /**\n * Asynchronously retrieves a database client from the connection pool with additional logging and timeout capabilities.\n * The method modifies the client instance by adding timeout tracking and logging functionality to ensure\n * the client is not held for an extended period and track the last executed query for debugging purposes.\n *\n * @return {Promise<PoolClient>} A promise resolving to a database client from the pool with enhanced behavior for query tracking and timeout handling.\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 Cadenza.log(\n \"CRITICAL: A database client has been checked out for more than 5 seconds!\",\n {\n clientId: client.uuid,\n query: client.lastQuery,\n databaseName: this.databaseName,\n },\n \"critical\",\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 Cadenza.log(\"Waiting for database to be ready...\");\n await new Promise((res) => setTimeout(res, 1000));\n } else {\n Cadenza.log(\n \"Database query errored\",\n { error: err, context },\n \"warning\",\n );\n return { rows: [] };\n }\n }\n }\n throw new Error(`Timeout waiting for database to be ready`);\n }\n\n /**\n * Sorts database tables based on their reference dependencies using a topological sort.\n *\n * Tables are reordered such that dependent tables appear later in the list\n * to ensure a dependency hierarchy. If cycles are detected in the dependency graph,\n * they will be noted but the process will not stop. Unreferenced tables are included at the end.\n *\n * @param {Object} ctx - The context object containing the database schema definition and table metadata.\n * ctx.schema {Object} - The schema definition object.\n * ctx.schema.tables {Object} - A mapping of table names to table definitions.\n * Each table definition may contain `fields` (with `references` info)\n * and `foreignKeys` indicating cross-table relationships.\n *\n * @return {Object} - The modified context object with an additional property:\n * sortedTables {string[]} - An array of table names sorted in dependency order.\n * hasCycles {boolean} - Indicates if the dependency graph contains cycles.\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 return { ...ctx, sortedTables: sorted, hasCycles };\n }\n\n /**\n * Asynchronously creates an iterator that splits the provided tables from the schema.\n *\n * @param {Object} ctx - The context object containing the necessary data.\n * @param {string[]} ctx.sortedTables - An array of table names sorted in a specific order.\n * @param {Object} ctx.schema - The schema object that includes table definitions.\n * @param {Object} [ctx.options={}] - Optional configuration options for processing tables.\n *\n * @return {AsyncGenerator} An asynchronous generator that yields objects containing the table definition, metadata, and other context details.\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 /**\n * Converts the keys of objects in an array to camelCase format.\n *\n * @param {Array<any>} rows - An array of objects whose keys should be converted to camelCase.\n * @return {Array<any>} A new array of objects with their keys converted to camelCase.\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 /**\n * Executes a query against a specified database table with given parameters.\n *\n * @param {string} tableName - The name of the database table to query.\n * @param {DbOperationPayload} context - An object containing query parameters such as filters, fields, joins, sort, limit, and offset.\n * @return {Promise<any>} A promise that resolves with the query result, including rows, row count, and metadata, or an error object if the query fails.\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 __success: false,\n };\n }\n }\n\n /**\n * Inserts data into the specified database table with optional conflict handling.\n *\n * @param {string} tableName - The name of the target database table.\n * @param {DbOperationPayload} context - The context containing data to insert, transaction settings, field mappings, conflict resolution options, and other configurations.\n * - `data` (object | array): The data to be inserted into the database.\n * - `transaction` (boolean): Specifies whether the operation should use a transaction. Defaults to true.\n * - `fields` (array): The fields to return in the result after insertion.\n * - `onConflict` (object): Options for handling conflicts on insert.\n * - `target` (array): Columns to determine conflicts.\n * - `action` (object): Specifies the action to take on conflict, such as updating specified fields.\n * - `awaitExists` (object): Specifies foreign key references to wait for to ensure existence before insertion.\n *\n * @return {Promise<any>} A promise resolving to the result of the database insert operation, including the inserted rows, the row count, and metadata indicating success or error.\n */\n async insertFunction(\n tableName: string,\n context: DbOperationPayload,\n ): Promise<any> {\n const { data, transaction = true, fields = [], onConflict } = context;\n\n if (!data || (Array.isArray(data) && data.length === 0)) {\n return { errored: true, __error: \"No data provided for insert\" };\n }\n\n let resultContext = {};\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 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 resultContext = {\n [`${camelCase(tableName)}${isBatch ? \"s\" : \"\"}`]: isBatch\n ? resultRows\n : resultRows[0],\n rowCount: result.rowCount,\n __success: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n\n if (error.message.includes(\"violates unique constraint\")) {\n resultContext = {\n [`${camelCase(tableName)}`]: null,\n __success: false,\n };\n } else {\n resultContext = {\n ...context,\n errored: true,\n __error: `Insert failed: ${error.message}`,\n __success: false,\n };\n }\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n\n return resultContext;\n }\n\n /**\n * Updates a database table with the provided data and filter conditions.\n *\n * @param {string} tableName - The name of the database table to update.\n * @param {DbOperationPayload} context - The payload for the update operation, which includes:\n * - data: The data to update in the table.\n * - filter: The conditions to identify the rows to update (default is an empty object).\n * - transaction: Whether the operation should run within a database transaction (default is true).\n * @return {Promise<any>} Returns a Promise resolving to an object that includes:\n * - The updated data if the update is successful.\n * - In case of error:\n * - Error details.\n * - The SQL query and parameters if applicable.\n * - A flag indicating if the update succeeded or failed.\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 {\n errored: true,\n __error: `No data provided for update of ${tableName}`,\n };\n }\n\n let resultContext = {};\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 resultContext = {\n sql,\n params,\n __success: false,\n };\n } else {\n resultContext = {\n [`${camelCase(tableName)}`]: rows[0],\n __success: true,\n };\n }\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n resultContext = {\n ...context,\n errored: true,\n __error: `Update failed: ${error.message}`,\n __success: false,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n\n return resultContext;\n }\n\n /**\n * Deletes a record from the specified database table based on the given filter criteria.\n *\n * @param {string} tableName - The name of the database table from which records should be deleted.\n * @param {DbOperationPayload} context - The context for the operation, including filter conditions and transaction settings.\n * @param {Object} context.filter - The filter criteria to identify the records to delete.\n * @param {boolean} [context.transaction=true] - Indicates if the operation should be executed within a transaction.\n * @return {Promise<any>} A promise that resolves to an object containing information about the deleted record\n * or an error object if the delete operation fails.\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 let resultContext = {};\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 resultContext = {\n [`${camelCase(tableName)}`]: rows[0],\n __success: true,\n };\n } catch (error: any) {\n if (transaction) await client.query(\"ROLLBACK\");\n resultContext = {\n errored: true,\n __error: `Delete failed: ${error.message}`,\n __errors: { delete: error.message },\n __success: false,\n };\n } finally {\n if (transaction && client) {\n // @ts-ignore\n client.release();\n }\n }\n\n return resultContext;\n }\n\n /**\n * Constructs a SQL WHERE clause based on the provided filter object.\n * Builds parameterized queries to prevent SQL injection, appending parameters\n * to the provided params array and utilizing placeholders.\n *\n * @param {Object} filter - An object representing the filtering conditions with\n * keys as column names and values as their corresponding\n * desired values. Values can also be arrays for `IN` queries.\n * @param {any[]} params - An array for storing parameterized values, which will be\n * populated with the filter values for the constructed SQL clause.\n * @return {string} The constructed SQL WHERE clause as a string. If no conditions\n * are provided, an empty string is returned.\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 /**\n * Constructs a SQL join clause from a given set of join definitions.\n *\n * @param {Record<string, JoinDefinition>} joins - An object where keys are table names\n * and values are definitions of join conditions.\n * @return {string} The constructed SQL join clause as a string.\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 /**\n * Recursively resolves nested data structure by processing special operations and transforming the data accordingly.\n * Handles specific object structures with sub-operations, strings with specific commands, and other nested objects.\n *\n * @param {any} data The initial data to be resolved, which can be an object, array, or primitive value.\n * @param {string} tableName The name of the table associated with the data, used contextually for operation resolution.\n * @return {Promise<any>} A promise that resolves to the fully processed data structure with all nested elements resolved.\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 resolved[key] = await this.executeSubOperation(subOp);\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 /**\n * Executes a sub-operation against the database, such as an insert or query operation.\n *\n * @param {SubOperation} op - The operation to be executed. Contains details such as the type of sub-operation\n * (e.g., \"insert\" or \"query\"), the target table, data to be inserted, filters for querying, fields to be retrieved, etc.\n * @return {Promise<any>} A promise that resolves with the result of the operation.\n * For \"insert\", the result will include the inserted row or a partial response for uuid conflicts.\n * For \"query\", the result will include the first row that matches the query condition. If no result is found,\n * resolves with an empty object.\n * @throws Throws an error if the operation fails. Rolls back the transaction in case of an error.\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)\n .map((k) => snakeCase(k))\n .join(\", \")}) VALUES (${Object.values(resolvedData)\n .map((_, i) => `$${i + 1}`)\n .join(\", \")}) ON CONFLICT DO NOTHING RETURNING ${op.return ?? \"*\"}`;\n result = await client.query(sql, Object.values(resolvedData));\n result = result.rows[0]?.[op.return ?? \"uuid\"];\n if (!result) {\n result =\n op.return && op.return in resolvedData\n ? resolvedData[op.return]\n : resolvedData[\"uuid\"];\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 op.return ?? \"uuid\"\n ];\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 /**\n * Creates a database task configured for specific operations such as query, insert, update, or delete on a given table.\n *\n * @param {DbOperationType} op - The type of database operation to perform (e.g., \"query\", \"insert\", \"update\", \"delete\").\n * @param {string} tableName - The name of the table on which the operation will be performed.\n * @param {TableDefinition} table - The table definition that includes configurations such as custom signal triggers and emissions.\n * @param {function(string, AnyObject): Promise<any>} queryFunction - The function to execute the database operation. It takes the table name and a context object as arguments and returns a promise.\n * @param {ServerOptions} options - The options for configuring the server context and metadata behavior.\n * @return {void} This function does not return a value, but it registers a database task for the specified operation.\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 = `global.${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 for (const action of Object.keys(table.customSignals?.triggers ?? {})) {\n const triggerConditions: any | undefined = // @ts-ignore\n table.customSignals?.triggers?.[action].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 const triggerQueryData: any | undefined = // @ts-ignore\n table.customSignals?.triggers?.[action].filter(\n (trigger: any) => trigger.queryData,\n );\n for (const queryData of triggerQueryData ?? []) {\n if (context.queryData) {\n context.queryData = {\n ...context.queryData,\n ...queryData,\n };\n } else {\n context = {\n ...context,\n ...queryData,\n };\n }\n }\n }\n\n try {\n const result = await queryFunction(\n tableName,\n context.queryData ?? context,\n );\n\n context = {\n ...context,\n ...result,\n };\n } catch (e) {\n Cadenza.log(\n \"Database task errored.\",\n { taskName, error: e },\n \"error\",\n );\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 if (tableName !== \"system_log\" && context.errored) {\n Cadenza.log(\n `ERROR in ${taskName}`,\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 error: context.__error,\n }),\n \"error\",\n );\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 .attachSignal(\n ...(table.customSignals?.emissions?.[op]?.map((signal: any) => {\n return typeof signal === \"string\" ? signal : signal.signal;\n }) ?? []),\n );\n }\n}\n","import Cadenza from \"../../Cadenza\";\nimport { Task } from \"@cadenza.io/core\";\nimport { decomposeSignalName, formatTimestamp } from \"../../utils/tools\";\nimport { DeputyTask } from \"../../index\";\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\n splitSignalsTask: Task | undefined;\n splitTasksForRegistration: Task | undefined;\n registerSignalToTaskMapTask: Task | undefined;\n registerTaskMapTask: Task | undefined;\n registerDeputyRelationshipTask: Task | undefined;\n splitRoutinesTask: Task | undefined;\n splitTasksInRoutines: Task | undefined;\n\n isCadenzaDBReady: boolean = false;\n\n init() {\n this.splitRoutinesTask = Cadenza.createMetaTask(\n \"Split routines for registration\",\n async function* (ctx, emit) {\n const { routines } = ctx;\n if (!routines) return;\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n for (const routine of routines) {\n if (routine.registered) continue;\n yield {\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 __routineName: routine.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"routine\",\n {\n onConflict: {\n target: [\"name\", \"version\", \"service_name\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertRoutine\")\n )?.then(\n Cadenza.createMetaTask(\"Register routine\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n Cadenza.getRoutine(ctx.__routineName)!.registered = true;\n\n return true;\n }).then(\n Cadenza.createUniqueMetaTask(\n \"Gather routine registration\",\n () => true,\n ).emits(\"meta.sync_controller.synced_routines\"),\n ),\n ),\n );\n\n this.splitTasksInRoutines = Cadenza.createMetaTask(\n \"Split tasks in routines\",\n function* (ctx) {\n const { routines } = ctx;\n if (!routines) return;\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n for (const routine of routines) {\n for (const task of routine.tasks) {\n if (!task) {\n console.log(\"task is null\", routine, task);\n continue;\n }\n\n if (routine.registeredTasks.has(task.name)) continue;\n\n const tasks = task.getIterator();\n\n while (tasks.hasNext()) {\n const nextTask = tasks.next();\n yield {\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 __routineName: routine.name,\n __taskName: nextTask.name,\n };\n }\n }\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"task_to_routine_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"routine_name\",\n \"task_version\",\n \"routine_version\",\n \"service_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertTaskToRoutineMap\")\n )?.then(\n Cadenza.createMetaTask(\"Register routine task\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n Cadenza.getRoutine(ctx.__routineName)!.registeredTasks.add(\n ctx.__taskName,\n );\n }),\n ),\n );\n\n this.splitSignalsTask = Cadenza.createMetaTask(\n \"Split signals for registration\",\n function* (ctx) {\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\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, isGlobal, domain, action } =\n decomposeSignalName(signal);\n\n yield {\n data: {\n name: signal,\n isGlobal,\n domain,\n action,\n isMeta,\n },\n __signal: signal,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"signal_registry\",\n {\n onConflict: {\n target: [\"name\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertSignalRegistry\")\n )?.then(\n Cadenza.createMetaTask(\"Process signal registration\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n return { signalName: ctx.__signal };\n }).then(\n Cadenza.signalBroker.registerSignalTask!,\n Cadenza.createUniqueMetaTask(\n \"Gather signal registration\",\n () => true,\n ).emits(\"meta.sync_controller.synced_signals\"),\n ),\n ),\n );\n\n this.splitTasksForRegistration = Cadenza.createMetaTask(\n \"Split tasks for registration\",\n function* (ctx) {\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n const tasks = ctx.tasks;\n for (const task of tasks) {\n if (task.registered) continue;\n const { __functionString, __getTagCallback } = task.export();\n\n yield {\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 signals: {\n emits: Array.from(task.emitsSignals),\n signalsToEmitAfter: Array.from(task.signalsToEmitAfter),\n signalsToEmitOnFail: Array.from(task.signalsToEmitOnFail),\n observed: Array.from(task.observedSignals),\n },\n },\n __taskName: task.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"task\",\n {\n onConflict: {\n target: [\"name\", \"service_name\", \"version\"],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertTask\")\n )?.then(\n Cadenza.createMetaTask(\"Record registration\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n Cadenza.get(ctx.__taskName)!.registered = true;\n\n return true;\n }).then(\n Cadenza.createUniqueMetaTask(\n \"Gather task registration\",\n () => true,\n ).emits(\"meta.sync_controller.synced_tasks\"),\n ),\n ),\n );\n\n const registerSignalTask = Cadenza.createMetaTask(\n \"Record signal registration\",\n (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n Cadenza.get(ctx.__taskName)?.registeredSignals.add(ctx.__signal);\n },\n );\n\n this.registerSignalToTaskMapTask = Cadenza.createMetaTask(\n \"Split observed signals of task\",\n function* (ctx) {\n const task = ctx.task;\n if (task.hidden || !task.register) return;\n\n for (const signal of task.observedSignals) {\n const _signal = signal.split(\":\")[0];\n if (task.registeredSignals.has(signal)) continue;\n\n const { isGlobal } = decomposeSignalName(_signal);\n\n yield {\n data: {\n signalName: _signal,\n isGlobal,\n taskName: task.name,\n taskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n },\n __taskName: task.name,\n __signal: signal,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"signal_to_task_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"task_version\",\n \"service_name\",\n \"signal_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertSignalToTaskMap\")\n )?.then(registerSignalTask),\n );\n\n this.registerTaskMapTask = Cadenza.createMetaTask(\n \"Register task map to DB\",\n function* (ctx) {\n const task = ctx.task;\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n if (task.hidden || !task.register) return;\n\n for (const t of task.nextTasks) {\n if (task.taskMapRegistration.has(t.name) || t.hidden || !t.register) {\n continue;\n }\n\n yield {\n data: {\n taskName: t.name,\n taskVersion: t.version,\n predecessorTaskName: task.name,\n predecessorTaskVersion: task.version,\n serviceName: Cadenza.serviceRegistry.serviceName,\n predecessorServiceName: Cadenza.serviceRegistry.serviceName,\n },\n __taskName: task.name,\n __nextTaskName: t.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"directional_task_graph_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"predecessor_task_name\",\n \"task_version\",\n \"predecessor_task_version\",\n \"service_name\",\n \"predecessor_service_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertDirectionalTaskGraphMap\")\n )?.then(\n Cadenza.createMetaTask(\"Record task map registration\", (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n Cadenza.get(ctx.__taskName)?.taskMapRegistration.add(\n ctx.__nextTaskName,\n );\n }),\n ),\n );\n\n this.registerDeputyRelationshipTask = Cadenza.createMetaTask(\n \"Register deputy relationship\",\n (ctx) => {\n const task = ctx.task;\n if (task.hidden || !task.register) return;\n\n if (task.isDeputy && !task.signalName) {\n if (task.registeredDeputyMap) return;\n\n return {\n data: {\n task_name: task.remoteRoutineName,\n task_version: 1,\n service_name: task.serviceName,\n predecessor_task_name: task.name,\n predecessor_task_version: task.version,\n predecessor_service_name: Cadenza.serviceRegistry.serviceName,\n },\n __taskName: task.name,\n };\n }\n },\n ).then(\n (this.isCadenzaDBReady\n ? Cadenza.createCadenzaDBInsertTask(\n \"directional_task_graph_map\",\n {\n onConflict: {\n target: [\n \"task_name\",\n \"predecessor_task_name\",\n \"task_version\",\n \"predecessor_task_version\",\n \"service_name\",\n \"predecessor_service_name\",\n ],\n action: {\n do: \"nothing\",\n },\n },\n },\n { concurrency: 50 },\n )\n : Cadenza.get(\"dbInsertDirectionalTaskGraphMap\")\n )?.then(\n Cadenza.createMetaTask(\n \"Record deputy relationship registration\",\n (ctx) => {\n if (!ctx.__syncing) {\n return;\n }\n\n Cadenza.debounce(\"meta.sync_controller.synced_resource\", {\n delayMs: 2000,\n });\n\n (Cadenza.get(ctx.__taskName) as DeputyTask).registeredDeputyMap =\n true;\n },\n ),\n ),\n );\n\n Cadenza.signalBroker\n .getSignalsTask!.clone()\n .doOn(\"meta.sync_controller.sync_tick\", \"meta.sync_requested\")\n .then(this.splitSignalsTask);\n\n Cadenza.registry\n .getAllTasks!.clone()\n .doOn(\"meta.sync_controller.synced_signals\")\n .then(this.splitTasksForRegistration);\n\n Cadenza.registry\n .getAllRoutines!.clone()\n .doOn(\"meta.sync_controller.synced_tasks\")\n .then(this.splitRoutinesTask);\n\n Cadenza.registry\n .doForEachTask!.clone()\n .doOn(\"meta.sync_controller.synced_tasks\")\n .then(\n this.registerTaskMapTask,\n this.registerSignalToTaskMapTask,\n this.registerDeputyRelationshipTask,\n );\n\n Cadenza.registry\n .getAllRoutines!.clone()\n .doOn(\"meta.sync_controller.synced_routines\")\n .then(this.splitTasksInRoutines);\n\n Cadenza.createMetaTask(\"Finish sync\", (ctx, emit) => {\n emit(\"global.meta.sync_controller.synced\", {\n data: {\n is_active: true,\n is_non_responsive: false,\n is_blocked: false,\n last_active: formatTimestamp(Date.now()),\n },\n filter: {\n uuid: Cadenza.serviceRegistry.serviceInstanceId,\n },\n });\n\n Cadenza.log(\"Synced resources...\");\n })\n .attachSignal(\"global.meta.sync_controller.synced\")\n .doOn(\"meta.sync_controller.synced_resource\");\n\n if (!this.isCadenzaDBReady) {\n Cadenza.interval(\n \"meta.sync_controller.sync_tick\",\n { __syncing: true },\n 300000,\n true,\n );\n } else {\n Cadenza.interval(\n \"meta.sync_controller.sync_tick\",\n { __syncing: true },\n 180000,\n );\n Cadenza.schedule(\"meta.sync_requested\", { __syncing: true }, 2000);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,eAmBO;;;ACnBP,kBAA2B;AAC3B,kBAAmD;AAgBnD,IAAqB,aAArB,cAAwC,iBAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiC3C,YACE,MACA,mBACA,cAAkC,QAClC,cAAsB,IACtB,cAAsB,GACtB,UAAkB,GAClB,WAAoB,MACpB,WAAoB,OACpB,SAAkB,OAClB,YAAqB,OACrB,WAAoB,OACpB,iBAAgD,QAChD,cAA4C,QAC5C,uBAAgC,OAChC,eAA6C,QAC7C,wBAAiC,OACjC,aAAqB,GACrB,aAAqB,GACrB,gBAAwB,GACxB,mBAA2B,GAC3B;AACA,UAAM,eAAe,CACnB,SACA,MACA,SAKA,qBACwB;AACxB,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAI,QAAQ,WAAW,wBAAwB;AAC7C,iBAAO,IAAI,MAAM,0BAA0B,CAAC;AAC5C;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,uBAAuB;AAC5C,kBAAQ,IAAI;AACZ;AAAA,QACF;AAEA,cAAM,gBAAY,YAAAC,IAAK;AAEvB,gBAAQ,WAAW,iBAAiB;AACpC,aAAK,oCAAoC;AAAA,UACvC,GAAG;AAAA,QACL,CAAC;AAGD,uBAAQ;AAAA,UACN,sBAAsB,KAAK,iBAAiB;AAAA,UAC5C,CAAC,QAAQ;AACP,gBAAI,IAAI,SAAU,kBAAiB,IAAI,WAAW,IAAI,MAAM;AAAA,UAC9D;AAAA,UACA,qCAAqC,SAAS;AAAA,UAC9C;AAAA,YACE,MAAM;AAAA,YACN,kBAAkB,CAAC,QACjB,IAAI,aAAa,KAAK,IAAI,aAAa;AAAA,YACzC,UAAU;AAAA,UACZ;AAAA,QACF,EAAE;AAAA,UACA,0CAA0C,SAAS;AAAA,UACnD,gCAAgC,SAAS;AAAA,UACzC,wBAAwB,SAAS;AAAA,UACjC,6CAA6C,SAAS;AAAA,QACxD;AAGA,uBAAQ;AAAA,UACN,kBAAkB,KAAK,iBAAiB;AAAA,UACxC,CAAC,gBAAgB;AACf,gBAAI,aAAa,SAAS;AACxB,qBAAO,IAAI,MAAM,YAAY,OAAO,CAAC;AAAA,YACvC,OAAO;AAEL,qBAAO,YAAY;AACnB,sBAAQ,WAAW;AAAA,YACrB;AAAA,UACF;AAAA,UACA,yCAAyC,SAAS;AAAA,UAClD,EAAE,UAAU,MAAM;AAAA,QACpB,EAAE;AAAA,UACA,gCAAgC,SAAS;AAAA,UACzC,wBAAwB,SAAS;AAAA,UACjC,6CAA6C,SAAS;AAAA,QACxD;AAAA,MACF,CAAC;AAAA,IACH;AAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAhJF,SAAS,WAAoB;AAK7B,+BAA+B;AA6I7B,SAAK,oBAAoB;AACzB,SAAK,cAAc;AAEnB,SAAK,aAAa,kCAAkC;AAEpD,SAAK,KAAK,uBAAuB;AAAA,MAC/B,eAAe,KAAK;AAAA,MACpB,kBAAkB,KAAK;AAAA,MACvB,mBAAmB,KAAK;AAAA,MACxB,aAAa,KAAK;AAAA,MAClB,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QACE,SACA,MACA,SAKA,kBACA,UACY;AACZ,UAAM,MAAM,QAAQ,WAAW;AAC/B,UAAM,WAAW,QAAQ,YAAY;AAErC,UAAM,gBAAgB;AAAA,MACpB,iBAAiB,KAAK;AAAA,MACtB,oBAAoB,KAAK;AAAA,MACzB,oBAAoB,eAAQ,gBAAgB;AAAA,MAC5C,2BAA2B,SAAS;AAAA,MACpC,qBAAqB,KAAK;AAAA,MAC1B,eAAe,KAAK;AAAA,MACpB,sBACE,SAAS,mBAAmB,SAAS,YAAY;AAAA,MACnD,oBAAoB,SAAS,sBAAsB;AAAA,MACnD,YAAY;AAAA,QACV,GAAG;AAAA,QACH,kBAAkB,KAAK;AAAA,MACzB;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,KAAK,aAAa,eAAe,MAAM,SAAS,gBAAgB;AAAA,EACzE;AACF;;;AC9MA,IAAqB,eAArB,cAA0C,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BnD,YACE,MACA,UACA,cAAkC,QAClC,cAAsB,IACtB,WACA,cAAsB,GACtB,UAAkB,GAClB,WAAoB,MACpB,WAAoB,OACpB,SAAkB,OAClB,YAAqB,OACrB,WAAoB,OACpB,iBAAgD,QAChD,cAA4C,QAC5C,uBAAgC,OAChC,eAA6C,QAC7C,wBAAiC,OACjC,aAAqB,GACrB,aAAqB,GACrB,gBAAwB,GACxB,mBAA2B,GAC3B;AACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QACE,SACA,MACA,SAKA,kBACA,UACY;AACZ,UAAM,MAAM,QAAQ,WAAW;AAC/B,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,mBAAmB,IAAI,aAAa,CAAC;AAC3C,WAAO,IAAI;AAEX,UAAM,gBAAgB;AAAA,MACpB,iBAAiB,KAAK;AAAA,MACtB,oBAAoB,KAAK;AAAA,MACzB,oBAAoB,eAAQ,gBAAgB;AAAA,MAC5C,2BAA2B,SAAS;AAAA,MACpC,qBAAqB,KAAK;AAAA,MAC1B,eAAe,KAAK;AAAA,MACpB,oBAAoB,SAAS,sBAAsB;AAAA,MACnD,sBACE,SAAS,mBAAmB,SAAS,YAAY;AAAA,MACnD,YAAY;AAAA,QACV,GAAG;AAAA,QACH,kBAAkB,KAAK;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,QACT,GAAG,KAAK;AAAA,QACR,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,QACT;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF;AAEA,WAAO,KAAK,aAAa,eAAe,MAAM,SAAS,gBAAgB;AAAA,EACzE;AACF;;;ACxIO,IAAM,SACX,OAAO,YAAY,eAAe,QAAQ,UAAU,QAAQ;AAcvD,IAAM,YACX,OAAO,WAAW,eAAe,OAAO,OAAO,aAAa;;;ACW9D,IAAqB,kBAArB,MAAqB,iBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0C3B,cAAc;AAnCtB,SAAQ,YAAsD,oBAAI,IAAI;AACtE,SAAQ,WAA4C,oBAAI,IAAI;AAC5D,SAAQ,gBAA0C,oBAAI,IAAI;AAC1D,uBAA6B;AAC7B,6BAAmC;AACnC,iCAAgC;AAChC,qBAAqB;AACrB,sBAAqB;AA6BnB,SAAK,2BAA2B,eAAQ;AAAA,MACtC;AAAA,MACA,CAAC,KAAK,SAAS;AACb,cAAM,EAAE,gBAAgB,IAAI;AAC5B,cAAM;AAAA,UACJ,MAAAC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,IAAI;AACJ,YAAIA,UAAS,KAAK,kBAAmB;AAErC,YAAI,SAAS;AACX,eAAK,UACF,IAAI,WAAW,GACd;AAAA,YACA,KAAK,UACF,IAAI,WAAW,GACd,UAAU,CAAC,MAAM,EAAE,SAASA,KAAI,KAAK;AAAA,YACzC;AAAA,UACF;AAEF,cAAI,KAAK,UAAU,IAAI,WAAW,GAAG,WAAW,GAAG;AACjD,iBAAK,UAAU,OAAO,WAAW;AAAA,UACnC,WACE,KAAK,UACF,IAAI,WAAW,GACd,OAAO,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,SAAS,IAAI,EACvD,WAAW,GACd;AACA,iBAAK,kCAAkC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC;AAC5D,iBAAK,gCAAgC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,UAC5D;AAEA;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,UAAU,IAAI,WAAW;AACjC,eAAK,UAAU,IAAI,aAAa,CAAC,CAAC;AACpC,cAAM,YAAY,KAAK,UAAU,IAAI,WAAW;AAChD,cAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,SAASA,KAAI;AAEtD,YAAI,UAAU;AACZ,iBAAO,OAAO,UAAU,eAAe;AAAA,QACzC,OAAO;AACL,oBAAU,KAAK,eAAe;AAAA,QAChC;AAEA,YAAI,KAAK,gBAAgB,aAAa;AACpC,iBAAO;AAAA,QACT;AAEA,YACG,CAAC,cAAc,KAAK,SAAS,IAAI,WAAW,KAC7C,KAAK,cAAc,IAAI,WAAW,GAClC;AACA,gBAAM,gBAAgB,WAAW;AAAA,YAC/B,CAAC,MACC,EAAE,YAAY,WACd,EAAE,SAAS,QACX,EAAE,iBACF,EAAE;AAAA,UACN;AAEA,cAAI,CAAC,eAAe;AAClB,kBAAM,qBAAqB,MAAM;AAAA,cAC/B,IAAI;AAAA,gBACF,KAAK,SACF,IAAI,WAAW,GACd,IAAI,CAAC,MAAM,EAAE,iBAAiB,KAAK,CAAC;AAAA,cAC1C;AAAA,YACF;AAEA,gBACE,CAAC,mBAAmB,SAAS,QAAQ,KACrC,KAAK,cAAc,IAAI,WAAW,GAClC;AACA,iCAAmB,KAAK,QAAQ;AAAA,YAClC;AAEA,iBAAK,6CAA6C;AAAA,cAChD;AAAA,cACA,mBAAmBA;AAAA,cACnB,gBAAgB;AAAA,cAChB,aAAa;AAAA,cACb,UAAU,UAAU,UAAU;AAAA,cAC9B;AAAA,YACF,CAAC;AAED,uBACI;AAAA,cACA,CAAC,MACC,EAAE,YAAY,WACd,EAAE,SAAS,QACX,EAAE,iBACF,EAAE;AAAA,YACN,EACC,QAAQ,CAAC,MAAW;AACnB,gBAAE,gBAAgB;AAAA,YACpB,CAAC;AAAA,UACL;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG,MAAM,0CAA0C,EAChD;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEF,mBAAQ,eAAe,2BAA2B,WAAW,KAAU;AACrE,UAAI,CAAC,IAAI,kBAAkB;AACzB;AAAA,MACF;AAEA,iBAAW,mBAAmB,IAAI,kBAAkB;AAClD,cAAM,EAAE,gBAAgB;AAAA,MAC1B;AAAA,IACF,CAAC,EACE,KAAK,iDAAiD,EACtD,KAAK,KAAK,wBAAwB;AAErC,SAAK,qCAAqC,eAAQ;AAAA,MAChD;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,EAAE,iBAAiB,IAAI;AAC7B,cAAM,wBAAwB,iBAAiB;AAAA,UAC7C,CAAC,GAAQ,MAAW;AAClB,gBAAI,EAAE,WAAW,CAAC,EAAE,QAAS,QAAO;AACpC,gBAAI,CAAC,EAAE,WAAW,EAAE,QAAS,QAAO;AACpC,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,cAAM,wBAAwB,eAAQ,aACnC,mBAAmB,EACnB,OAAO,CAAC,MAAW,EAAE,WAAW,SAAS,CAAC;AAE7C,mBAAW,OAAO,uBAAuB;AACvC,cAAI,IAAI,SAAS;AACf,iBAAK,cAAc,IAAI,IAAI,WAAW,GAAG,OAAO,IAAI,UAAU;AAE9D,gBAAI,CAAC,KAAK,cAAc,IAAI,IAAI,WAAW,GAAG,MAAM;AAClD,mBAAK,cAAc,OAAO,IAAI,WAAW;AAAA,YAC3C;AAEA,2BAAQ;AAAA,cACN,oBAAoB,IAAI,UAAU,OAAO,IAAI,WAAW;AAAA,YAC1D,GAAG,QAAQ;AACX;AAAA,UACF;AAEA,cAAI,sBAAsB,SAAS,IAAI,UAAU,GAAG;AAClD,gBAAI,CAAC,KAAK,cAAc,IAAI,IAAI,WAAW,GAAG;AAC5C,mBAAK,cAAc,IAAI,IAAI,aAAa,oBAAI,IAAI,CAAC;AAAA,YACnD;AAEA,gBAAI,CAAC,KAAK,cAAc,IAAI,IAAI,WAAW,GAAG,IAAI,IAAI,UAAU,GAAG;AACjE,6BAAQ;AAAA,gBACN,IAAI;AAAA,gBACJ,IAAI;AAAA,cACN;AAAA,YACF;AAEA,iBAAK,cAAc,IAAI,IAAI,WAAW,GAAG,IAAI,IAAI,UAAU;AAAA,UAC7D;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG,MAAM,iDAAiD,EACvD,KAAK,2CAA2C;AAEnD,SAAK,iCAAiC,eAAQ;AAAA,MAC5C;AAAA,MACA,CAAC,KAAK,SAAS;AACb,cAAM,EAAE,aAAa,gBAAgB,YAAY,IAAI;AACrD,cAAM,mBAAmB,KAAK,UAAU,IAAI,WAAW;AACvD,cAAM,YAAY,kBAAkB;AAAA,UAClC,CAAC,MAAM,EAAE,YAAY,kBAAkB,EAAE,SAAS;AAAA,QACpD;AAEA,uBAAQ;AAAA,UACN;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,mBAAW,YAAY,aAAa,CAAC,GAAG;AACtC,mBAAS,WAAW;AACpB,mBAAS,kBAAkB;AAC3B,eAAK,uDAAuD;AAAA,YAC1D,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,iBAAiB;AAAA,YACnB;AAAA,YACA,QAAQ;AAAA,cACN,MAAM,SAAS;AAAA,YACjB;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG,KAAK,+BAA+B,iCAAiC,EACrE,aAAa,qDAAqD;AAErE,SAAK,6BAA6B,eAAQ;AAAA,MACxC;AAAA,MACA,CAAC,KAAK,SAAS;AACb,cAAM,EAAE,aAAa,mBAAmB,gBAAgB,YAAY,IAClE;AACF,cAAM,mBAAmB,KAAK,UAAU,IAAI,WAAW;AACvD,cAAM,WAAW,kBAAkB;AAAA,UACjC,CAAC,MAAM,EAAE,SAAS;AAAA,QACpB;AAEA,YAAI,CAAC,UAAU;AACb,iBAAO;AAAA,QACT;AAEA,iBAAS,WAAW;AACpB,iBAAS,kBAAkB;AAC3B,aAAK,kDAAkD;AAAA,UACrD,MAAM;AAAA,YACJ,UAAU,SAAS;AAAA,YACnB,iBAAiB,SAAS;AAAA,UAC5B;AAAA,UACA,QAAQ;AAAA,YACN,MAAM,SAAS;AAAA,UACjB;AAAA,QACF,CAAC;AAED,cAAM,oBAAoB,kBAAkB;AAAA,UAC1C,CAAC,MACC,EAAE,SAAS,qBACX,EAAE,YAAY,kBACd,EAAE,SAAS;AAAA,QACf;AAEA,mBAAW,KAAK,qBAAqB,CAAC,GAAG;AACvC,eAAK,UACF,IAAI,WAAW,GACd,OAAO,KAAK,UAAU,IAAI,WAAW,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC/D,eAAK,wCAAwC;AAAA,YAC3C,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,iBAAiB;AAAA,cACjB,SAAS;AAAA,YACX;AAAA,YACA,QAAQ;AAAA,cACN,MAAM,EAAE;AAAA,YACV;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG,KAAK,+BAA+B,EACpC;AAAA,MACC;AAAA,MACA;AAAA,IACF;AAEF,SAAK,+BAA+B,eAAQ;AAAA,MAC1C;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,aAAa,IAAI;AACvB,cAAM,cAAc,IAAI;AACxB,cAAM,YAAY,KAAK,UAAU,IAAI,WAAW;AAChD,cAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAC7D,YAAI,UAAU;AACZ,mBAAS,SAAS,IAAI;AACtB,mBAAS,wBAAwB,IAAI;AAAA,QACvC;AACA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EAAE,KAAK,oCAAoC;AAE3C,UAAM,oBAAoB,eAAQ;AAAA,MAChC;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,gBAAqB,CAAC;AAC1B,YAAI,eAAe,QAAQ,CAACC,SAAa;AACvC,0BAAgB,EAAE,GAAG,eAAe,GAAGA,KAAI;AAAA,QAC7C,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF,EAAE,KAAK,KAAK,kCAAkC;AAE9C,SAAK,eAAe,eAAQ,kBAAkB,aAAa;AAAA,MACzD,eAAQ,yBAAyB,sBAAsB;AAAA,QACrD,QAAQ;AAAA,UACN,UAAU;AAAA,QACZ;AAAA,QACA,QAAQ,CAAC,eAAe,gBAAgB,SAAS;AAAA,MACnD,CAAC,EAAE,KAAK,iBAAiB;AAAA,MACzB,eAAQ,yBAAyB,oBAAoB;AAAA,QACnD,QAAQ;AAAA,UACN,SAAS;AAAA,UACT,WAAW;AAAA,UACX,mBAAmB;AAAA,UACnB,YAAY;AAAA,QACd;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC,EAAE,KAAK,iBAAiB;AAAA,IAC3B,CAAC,EAAE,KAAK,qBAAqB;AAE7B,SAAK,kBAAkB,eAAQ;AAAA,MAC7B;AAAA,MACA,CAAC,YAAY;AACX,cAAM,EAAE,KAAK,IAAI;AACjB,YAAI;AACJ,mBAAW,aAAa,KAAK,UAAU,OAAO,GAAG;AAC/C,qBAAW,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAChD,cAAI,SAAU;AAAA,QAChB;AACA,eAAO,EAAE,GAAG,SAAS,YAAY,SAAS;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AAEA,SAAK,4BAA4B,eAAQ;AAAA,MACvC;AAAA,MACA,CAAC,YAAY;AACX,cAAM,EAAE,cAAc,IAAI;AAC1B,cAAM,YAAY,KAAK,UAAU,IAAI,aAAa;AAClD,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,QACT;AAEA,eAAO,EAAE,GAAG,SAAS,aAAa,UAAU;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAEA,SAAK,+BAA+B,eAAQ;AAAA,MAC1C;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,EAAE,YAAY,IAAI;AAExB,YAAI,CAAC,KAAK,SAAS,IAAI,WAAW,EAAG,MAAK,SAAS,IAAI,aAAa,CAAC,CAAC;AAEtE,aAAK,SAAS,IAAI,WAAW,EAAG,KAAK;AAAA,UACnC;AAAA,UACA,mBAAmB,IAAI;AAAA,UACvB,YAAY,IAAI;AAAA,UAChB,eAAe,IAAI;AAAA,UACnB,mBAAmB,IAAI;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF,EAAE,KAAK,qBAAqB;AAE5B,SAAK,kBAAkB,eAAQ;AAAA,MAC7B;AAAA,MACA,CAAC,aAAa;AAAA,QACZ,GAAG;AAAA,QACH,aAAa,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,MACxD;AAAA,MACA;AAAA,IACF;AAEA,SAAK,oBAAoB,eAAQ;AAAA,MAC/B;AAAA,MACA,WAAW,SAAoB;AAE7B,mBAAW,aAAa,KAAK,UAAU,OAAO,GAAG;AAC/C,qBAAW,YAAY,WAAW;AAChC,kBAAM,EAAE,GAAG,SAAS,YAAY,SAAS;AAAA,UAC3C;AAAA,QACF;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,MACX;AAAA,IACF;AAEA,SAAK,iBAAiB,eAAQ;AAAA,MAC5B;AAAA,MACA,CAAC,YAAY;AACX,cAAM,EAAE,KAAK,IAAI;AACjB,aAAK,UAAU,OAAO,IAAI;AAC1B,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EAAE,KAAK,sCAAsC;AAE7C,SAAK,sBAAsB,eAAQ;AAAA,MACjC;AAAA,MACA,CAAC,SAAS,SAAS;AACjB,cAAM,EAAE,eAAe,kBAAkB,WAAW,YAAY,IAC9D;AACF,YAAI,UAAU,aAAa;AAC3B,YAAI,iBAAiB,oBAAoB,CAAC;AAE1C,cAAM,YAAY,KAAK,UACpB,IAAI,aAAa,GAChB,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,mBAAmB,CAAC,EAAE,SAAS,EAC/D,KAAK,CAAC,GAAG,MAAM,EAAE,wBAAyB,EAAE,qBAAsB;AAErE,YAAI,CAAC,aAAa,UAAU,WAAW,KAAK,UAAU,KAAK,YAAY;AACrE,kBAAQ,UAAU;AAClB,kBAAQ,UAAU,2BAA2B,aAAa,cAAc,OAAO,KAAK,KAAK,UAAU;AAAA,YACjG;AAAA,UACF,CAAC;AACD;AAAA,YACE,6CAA6C,QAAQ,WAAW,cAAc;AAAA,YAC9E;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,eAAe,UAAU,CAAC,EAAE,YAAY;AAC1C,qBAAW,YAAY,WAAW;AAChC;AAAA,cACE,sDAAsD,SAAS,OAAO;AAAA,cACtE;AAAA,YACF;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAEA,YAAI,iBAAiB,UAAU;AAAA,UAC7B,CAAC,MAAM,CAAC,kBAAkB,SAAS,EAAE,IAAI;AAAA,QAC3C;AAEA,YAAI,eAAe,WAAW,GAAG;AAC/B,cAAI,KAAK,WAAW;AAClB;AAAA,cACE,uCAAuC,QAAQ,SAAS;AAAA,cACxD;AAAA,YACF;AAAA,UACF;AACA;AACA,2BAAiB;AACjB,2BAAiB,CAAC;AAAA,QACpB;AAEA,YAAI,WAAW,eAAe,CAAC;AAC/B,YAAI,UAAU,GAAG;AACf,qBACE,eAAe,KAAK,MAAM,KAAK,OAAO,IAAI,eAAe,MAAM,CAAC;AAAA,QACpE;AAEA,gBAAQ,aAAa,SAAS;AAC9B,gBAAQ,YAAY,GAAG,SAAS,OAAO,IAAI,SAAS,IAAI;AACxD,gBAAQ,mBAAmB;AAC3B,gBAAQ,iBAAiB,KAAK,SAAS,IAAI;AAC3C,gBAAQ,YAAY;AAEpB,YAAI,KAAK,WAAW;AAClB;AAAA,YACE,sDAAsD,QAAQ,SAAS;AAAA,YACvE;AAAA,UACF;AAAA,QACF,OAAO;AACL;AAAA,YACE,qDAAqD,QAAQ,SAAS;AAAA,YACtE;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEF,SAAK,gBAAgB,eAAQ,eAAe,cAAc,CAAC,QAAQ;AACjE,UAAI,CAAC,KAAK,aAAa;AACrB,eAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,mBAAmB;AAC3B,eAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,UACf,IAAI,KAAK,WAAW,GACnB,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,iBAAiB;AAEjD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,yBAAyB,MAAM,yBAAyB;AAAA,QACxD,UAAU,MAAM,UAAU,CAAC;AAAA,QAC3B,UAAU,MAAM,YAAY;AAAA,MAC9B;AAAA,IACF,CAAC,EAAE,KAAK,oCAAoC;AAE5C,SAAK,oBAAoB,eAAQ;AAAA,MAC/B;AAAA,MACA;AAAA,QACE,YAAY;AAAA,UACV,QAAQ,CAAC,MAAM;AAAA,UACf,QAAQ;AAAA,YACN,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA;AAAA,QAEE,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,MAAM;AAAA,kBACJ,MAAM;AAAA,gBACR;AAAA,gBACA,aAAa;AAAA,kBACX,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,MAAM;AAAA,gBACR;AAAA,gBACA,SAAS;AAAA,kBACP,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,cACA,UAAU,CAAC,MAAM;AAAA,YACnB;AAAA,UACF;AAAA,UACA,UAAU,CAAC,MAAM;AAAA,QACnB;AAAA,QACA,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,YAAY;AAAA,YACV,eAAe;AAAA,cACb,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU,CAAC,eAAe;AAAA,QAC5B;AAAA,QACA,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,kBAAkB;AAAA,MACpB;AAAA,IACF,EACG,MAAM,wCAAwC,EAC9C,YAAY,gDAAgD;AAE/D,SAAK,4BAA4B,eAAQ;AAAA,MACvC;AAAA,MACA,CAAC;AAAA,MACD;AAAA,QACE,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,MAAM;AAAA,cACJ,MAAM;AAAA,YACR;AAAA,YACA,SAAS;AAAA,cACP,MAAM;AAAA,YACR;AAAA,YACA,MAAM;AAAA,cACJ,MAAM;AAAA,YACR;AAAA,YACA,aAAa;AAAA,cACX,MAAM;AAAA,YACR;AAAA,YACA,YAAY;AAAA,cACV,MAAM;AAAA,YACR;AAAA,YACA,cAAc;AAAA,cACZ,MAAM;AAAA,YACR;AAAA,YACA,WAAW;AAAA,cACT,MAAM;AAAA,YACR;AAAA,YACA,mBAAmB;AAAA,cACjB,MAAM;AAAA,YACR;AAAA,YACA,YAAY;AAAA,cACV,MAAM;AAAA,YACR;AAAA,YACA,SAAS;AAAA,cACP,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAEA,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,YAAY;AAAA,YACV,IAAI;AAAA,cACF,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU,CAAC,IAAI;AAAA,QACjB;AAAA;AAAA,QAEA,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,IACF,EACG,KAAK,uCAAuC,4BAA4B,EACxE;AAAA,MACC,eAAQ;AAAA,QACN;AAAA,QACA,CAAC,QAAQ;AACP,gBAAM,EAAE,iBAAiB,MAAM,aAAa,aAAa,IAAI;AAC7D,eAAK,oBAAoB,iBAAiB,QAAQ,MAAM;AACxD,eAAK,UAAU;AAAA,YACb,MAAM,gBAAgB,iBAAiB;AAAA,YACvC,CAAC,EAAE,GAAI,mBAAmB,KAAM,CAAC;AAAA,UACnC;AACA,eAAK,YAAY;AACjB,eAAK,aAAa;AAClB,kBAAQ,IAAI,iBAAiB,KAAK,iBAAiB;AACnD,iBAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF,EAAE,MAAM,yCAAyC;AAAA,IACnD;AAEF,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,CAAC,IAAI,oBAAoB;AAC3B,cAAI,wBAAwB;AAAA,QAC9B;AAEA,YAAI,WAAW;AACb,yBAAQ,eAAe,2BAA2B,MAAM;AACtD,mBAAO,CAAC;AAAA,UACV,CAAC,EAEE;AAAA,YACC,eAAQ,yBAAyB,mBAAmB;AAAA,cAClD,QAAQ,CAAC,MAAM;AAAA,cACf,QAAQ;AAAA,gBACN,QAAQ;AAAA,cACV;AAAA,YACF,CAAC,EAAE;AAAA,cACD,eAAQ;AAAA;AAAA,gBAEN;AAAA,gBACA,CAACA,MAAK,SAAS;AACb,wBAAM,iBAAiBA,KAAI;AAC3B,6BAAW,UAAU,gBAAgB;AACnC,yBAAK,mDAAmD;AAAA,sBACtD,qBAAqB,OAAO;AAAA,sBAC5B,uBAAuB,OAAO;AAAA,oBAChC,CAAC;AAAA,kBACH;AAEA,yBAAO;AAAA,gBACT;AAAA,cACF,EAAE;AAAA,gBACA,eAAQ,eAAe,uBAAuB,CAACA,MAAK,SAAS;AAC3D,wBAAM,WAAqB,MAAM;AAAA,oBAC/B,IAAI;AAAA,sBACFA,KAAI,eAAe,IAAI,CAAC,MAAW,EAAE,WAAW;AAAA,oBAClD;AAAA,kBACF;AACA,6BAAW,WAAW,UAAU;AAC9B,0BAAM,YAAY,KAAK,UACpB,IAAI,OAAO,EACX,OAAO,CAAC,MAAM,EAAE,QAAQ;AAC3B,+BAAW,YAAY,WAAW;AAChC,0BAAI,SAAS,cAAe;AAC5B,4BAAM,UAAU,SAAS;AACzB,4BAAM,OAAO,SAAS;AAEtB,4BAAM,gBAAgB,WAAW;AAAA,wBAC/B,CAAC,MACC,EAAE,YAAY,WACd,EAAE,SAAS,QACX,EAAE,iBACF,EAAE;AAAA,sBACN;AAEA,0BAAI,CAAC,eAAe;AAClB,6BAAK,6CAA6C;AAAA,0BAChD,aAAa;AAAA,0BACb,mBAAmB,SAAS;AAAA,0BAC5B,gBAAgB;AAAA,0BAChB,aAAa;AAAA,0BACb,UAAU,SAAS,UAAU,UAAU;AAAA,0BACvC,oBAAoB,CAAC,QAAQ;AAAA,wBAC/B,CAAC;AAAA,sBACH;AAEA,+BAAS,gBAAgB;AACzB,gCAAU,QAAQ,CAAC,MAAM;AACvB,4BAAI,EAAE,YAAY,WAAW,EAAE,SAAS,MAAM;AAC5C,4BAAE,gBAAgB;AAAA,wBACpB;AAAA,sBACF,CAAC;AAAA,oBACH;AAAA,kBACF;AACA,yBAAO,CAAC;AAAA,gBACV,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACJ;AAEA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG,KAAK,+BAA+B,EACpC,KAAK,KAAK,iBAAiB;AAAA,EAChC;AAAA,EA/yBA,WAAkB,WAA4B;AAC5C,QAAI,CAAC,KAAK,UAAW,MAAK,YAAY,IAAI,iBAAgB;AAC1D,WAAO,KAAK;AAAA,EACd;AAAA,EA8yBA,QAAQ;AACN,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;;;ACz1BA,IAAAC,eAAmD;AAOnD,IAAAC,eAA2B;AAU3B,IAAqB,yBAArB,cAAoD,kBAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BvD,YACE,MACA,YACA,aACA,cAAsB,IACtB,cAAsB,GACtB,UAAkB,GAClB,WAAoB,MACpB,WAAoB,OACpB,SAAkB,MAClB,YAAqB,OACrB,WAAoB,OACpB,iBAAgD,QAChD,cAA4C,QAC5C,uBAAgC,OAChC,eAA6C,QAC7C,wBAAiC,OACjC,aAAqB,GACrB,aAAqB,GACrB,gBAAwB,GACxB,mBAA2B,GAC3B;AACA,UAAM,eAAe,CAAC,YAAmC;AACvD,cAAQ,sBAAkB,aAAAC,IAAK;AAC/B,aAAO;AAAA,IACT;AAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AA7EF,SAAS,WAAoB;AA+E3B,SAAK,cAAc;AACnB,SAAK,aAAa;AAElB,SAAK,KAAK,UAAU;AACpB,SAAK,KAAK,eAAQ,gBAAgB,mBAAmB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QACE,SACA,MACA,SAKA,kBACY;AACZ,UAAM,MAAM,QAAQ,WAAW;AAC/B,UAAM,WAAW,QAAQ,YAAY;AAErC,UAAM,gBAAgB;AAAA,MACpB,iBAAiB,KAAK;AAAA,MACtB,oBAAoB,eAAQ,gBAAgB;AAAA,MAC5C,eAAe,KAAK;AAAA,MACpB,oBAAoB,SAAS,sBAAsB;AAAA,MACnD,sBACE,SAAS,mBAAmB,SAAS,YAAY;AAAA,MACnD,YAAY;AAAA,QACV,GAAG;AAAA,QACH,kBAAkB,KAAK;AAAA,MACzB;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,oBAAoB,SAAS,kBAAkB;AAAA,MAC/C,GAAG;AAAA,IACL;AAEA,WAAO,KAAK,aAAa,eAAe,MAAM,SAAS,gBAAgB;AAAA,EACzE;AACF;;;AC/IA,qBAA2C;AAC3C,yBAAuB;AACvB,oBAAmB;AACnB,kBAAiB;AACjB,mCAAkC;AAClC,uBAAiB;AACjB,qBAAe;AACf,wBAAkB;AAClB,wBAAkB;AAQlB,IAAqB,iBAArB,MAAqB,gBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0DlC,cAAc;AAzCd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAuB,eACrB,KACA,aACA,WACc;AACd,YAAM,SAAS,YAAY,QAAQ,SAAS;AAE5C,UAAI;AACF,cAAM,WAAW,UAAM,kBAAAC,SAAM,KAAK,EAAE,GAAG,aAAa,OAAO,CAAC;AAE5D,eAAO,MAAM,SAAS,KAAK;AAAA,MAC7B,SAAS,OAAY;AACnB,YAAI,OAAO,SAAS,cAAc;AAChC,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,OAAO,KAAK,KAAK,YAAY;AAAA,YAC/B;AAAA,UACF;AAAA,QAEF,OAAO;AACL,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,OAAO,KAAK,KAAK,YAAY;AAAA,YAC/B;AAAA,UACF;AAAA,QAEF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAaE,mBAAQ,SAAS,cAAc;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AACA,mBAAQ,SAAS,iBAAiB;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AAEA,mBAAQ;AAAA,MACN;AAAA,MACA;AAAA,QACE,eAAQ;AAAA,UACN;AAAA,UACA,CAAC,KAAK,SAAS;AACb,gBAAI,WAAW;AACb,mBAAK,8BAA8B;AAAA,gBACjC,MAAM;AAAA,kBACJ,MAAM,IAAI;AAAA,kBACV,SAAS,WAAW,IAAI,mBAAmB;AAAA,kBAC3C,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,aAAa;AAAA,kBACb,cAAc,IAAI;AAAA,kBAClB,aAAa;AAAA,kBACb,WAAW;AAAA,kBACX,mBAAmB;AAAA,kBACnB,YAAY;AAAA,kBACZ,QAAQ,CAAC;AAAA,gBACX;AAAA,gBACA,GAAG;AAAA,cACL,CAAC;AACD;AAAA,YACF;AACA,kBAAM,UAAM,eAAAC,SAAQ;AACpB,gBAAI,IAAI,mBAAAC,QAAW,KAAK,CAAC;AAEzB,oBAAQ,IAAI,mBAAmB;AAAA,cAC7B,KAAK;AACH,oBAAI,QAAI,cAAAC,SAAO,CAAC;AAChB,oBAAI,QAAI,YAAAC,SAAK,EAAE,QAAQ,IAAI,CAAC,CAAC;AAC7B;AAAA,cAEF,KAAK;AACH,oBAAI,QAAI,cAAAD,SAAO,CAAC;AAChB,oBAAI;AAAA,sBACF,YAAAC,SAAK;AAAA,oBACH,QAAQ,QAAQ,IAAI,eAAe;AAAA,oBACnC,SAAS,CAAC,OAAO,MAAM;AAAA,kBACzB,CAAC;AAAA,gBACH;AAGA,oBAAI,IAAI,CAAC,KAAU,KAAU,SAAc;AACzC,sBAAI,+CAAkB;AAAA,oBACpB,QAAQ;AAAA,oBACR,UAAU;AAAA,kBACZ,CAAC,EACE,QAAQ,IAAI,EAAE,EACd,KAAK,MAAM,KAAK,CAAC,EACjB;AAAA,oBAAM,MACL,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAA,kBACrD;AAAA,gBACJ,CAAC;AACD;AAAA,cAEF,KAAK;AACH,oBAAI;AAAA,sBACF,cAAAD,SAAO;AAAA,oBACL,uBAAuB;AAAA,sBACrB,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE;AAAA,oBACvC;AAAA;AAAA,oBACA,gBAAgB,EAAE,QAAQ,cAAc;AAAA,kBAC1C,CAAC;AAAA,gBACH;AAEA,oBAAI,CAAC,QAAQ,IAAI,aAAa;AAC5B,wBAAM,IAAI;AAAA,oBACR;AAAA,kBACF;AAAA,gBACF;AAEA,oBAAI;AAAA,sBACF,YAAAC,SAAK;AAAA,oBACH,QAAQ,QAAQ,IAAI,eAAe;AAAA,oBACnC,SAAS,CAAC,OAAO,MAAM;AAAA,oBACvB,aAAa;AAAA,kBACf,CAAC;AAAA,gBACH;AAGA,oBAAI,IAAI,CAAC,KAAU,KAAU,SAAc;AACzC,sBAAI,+CAAkB;AAAA,oBACpB,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,eAAe;AAAA,kBACjB,CAAC,EACE,QAAQ,IAAI,EAAE,EACd,KAAK,MAAM,KAAK,CAAC,EACjB,MAAM,CAAC,QAAQ;AACd,wBAAI,IAAI,eAAe,GAAG;AACxB,0BAAI,OAAO,GAAG,EAAE,KAAK;AAAA,wBACnB,OAAO;AAAA,wBACP,YAAY,IAAI,eAAe;AAAA,sBACjC,CAAC;AAAA,oBACH,OAAO;AACL,0BACG,OAAO,GAAG,EACV,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAAA,oBACnD;AAAA,kBACF,CAAC;AAAA,gBACL,CAAC;AACD;AAAA,YACJ;AAEA,mBAAO,EAAE,GAAG,KAAK,OAAO,IAAI;AAAA,UAC9B;AAAA,UACA;AAAA,QACF,EACG,aAAa,4BAA4B,EACzC;AAAA,UACC,eAAQ;AAAA,YACN;AAAA,YACA,CAAC,QAAQ;AACP,oBAAM,MAAM,IAAI;AAIhB,kBAAI,KAAK,cAAc,CAAC,KAAc,QAAkB;AACtD,oBAAI;AACF,iCAAQ,IAAI,yBAAyB,IAAI,IAAI;AAC7C,iCAAQ,KAAK,uBAAuB,IAAI,IAAI;AAC5C,sBAAI,KAAK;AAAA,oBACP,UAAU;AAAA,oBACV,qBACE,eAAQ,gBAAgB;AAAA,kBAC5B,CAAC;AAAA,gBACH,SAAS,GAAG;AACV,iCAAQ;AAAA,oBACN;AAAA,oBACA,EAAE,OAAO,GAAG,MAAM,IAAI,KAAK;AAAA,oBAC3B;AAAA,kBACF;AACA,sBAAI,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,gBAChC;AAAA,cACF,CAAC;AAED,kBAAI,KAAK,eAAe,CAAC,KAAc,QAAkB;AACvD,oBAAI;AACJ,oBAAIC;AACJ,gBAAAA,OAAM,IAAI;AACV,+BAAeA,KAAI,WAAW;AAE9B,+BAAQ;AAAA,kBACN;AAAA,kBACA,CAAC,WAAW;AACV,0BAAM,WAAW,OAAO;AACxB,2BAAO,OAAO;AACd,wBAAI,KAAK;AAAA,sBACP,GAAG;AAAA,sBACH,GAAG;AAAA,sBACH,UAAU;AAAA,oBACZ,CAAC;AAAA,kBACH;AAAA,kBACA;AAAA,kBACA,EAAE,UAAU,MAAM;AAAA,gBACpB,EACG,KAAK,6BAA6B,YAAY,EAAE,EAChD,MAAM,iCAAiC,YAAY,EAAE;AAqBxD,+BAAQ,KAAK,kCAAkC;AAAA,kBAC7C,GAAGA;AAAA,kBACH,QAAQA,KAAI;AAAA,gBACd,CAAC;AAAA,cACH,CAAC;AAED,kBAAI,KAAK,WAAW,CAAC,KAAc,QAAkB;AACnD,oBAAIA;AACJ,oBAAI;AACF,kBAAAA,OAAM,IAAI;AACV,sBACE,CAAC,eAAQ,aACN,oBAAoB,EACpB,SAASA,KAAI,YAAY,GAC5B;AACA,wBAAI,KAAK;AAAA,sBACP,GAAGA;AAAA,sBACH,UAAU;AAAA,sBACV,SAAS,mBAAmBA,KAAI,YAAY;AAAA,sBAC5C,SAAS;AAAA,oBACX,CAAC;AACD;AAAA,kBACF;AACA,sBAAI,KAAK;AAAA,oBACP,UAAU;AAAA,oBACV,cAAcA,KAAI;AAAA,kBACpB,CAAC;AAAA,gBACH,SAAS,GAAG;AACV,iCAAQ;AAAA,oBACN;AAAA,oBACA,EAAE,OAAO,GAAG,GAAGA,KAAI;AAAA,oBACnB;AAAA,kBACF;AACA,sBAAI,KAAK;AAAA,oBACP,UAAU;AAAA,oBACV,SAAS;AAAA,kBACX,CAAC;AACD;AAAA,gBACF;AAEA,+BAAQ,KAAKA,KAAI,cAAcA,IAAG;AAAA,cACpC,CAAC;AAED,kBAAI,IAAI,WAAW,CAAC,KAAc,QAAkB;AAClD,+BAAQ;AAAA,kBACN;AAAA,kBACA,CAAC,cAAc,IAAI,KAAK,SAAS;AAAA,kBACjC;AAAA,kBACA,EAAE,UAAU,MAAM;AAAA,gBACpB,EAAE,QAAQ,eAAQ,gBAAgB,aAAa;AAE/C,+BAAQ;AAAA,kBACN;AAAA,kBACA,IAAI,KAAK;AAAA,gBACX;AAAA,cACF,CAAC;AAED,qBAAO;AAAA,YACT;AAAA,YACA;AAAA,UACF,EACG;AAAA,YACC,eAAQ;AAAA,cACN;AAAA,cACA,OAAO,QAAQ;AACb,oBAAI,UAAkB;AACtB,oBAAI,OAAe,IAAI;AACvB,oBAAI,UAAmB;AAEvB,sBAAM,mBAAmB,OAAOA,SAAa;AAC3C,wBAAM,IAAI,QAAQ,CAAC,YAAY;AAC7B,0BAAM,SAAS,iBAAAC,QAAK,aAAaD,KAAI,KAAK;AAC1C,oBAAAA,KAAI,aAAa;AACjB,2BAAO,OAAOA,KAAI,QAAQ,MAAM;AAC9B,0BAAI,OAAO,QAAQ,QAAQ,MAAM,UAAU;AACzC,kCAAU,OAAO,QAAQ;AAAA,sBAE3B,WAAW,QAAQ,QAAQ,GAAG,YAAY,MAAM;AAC9C,4BAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,oCAAU;AAAA,wBACZ,WAAW,QAAQ,IAAI,cAAc,QAAQ;AAC3C,oCACE,QAAQ,IAAI,sBAAsB;AAAA,wBACtC;AAAA,sBACF,OAAO;AAEL,kCAAU,QAAQ,QAAQ,GAAG,WAAW;AAAA,sBAC1C;AAEA,8BAAQ;AAAA,wBACN,wBAAwB,OAAO,IAAI,IAAI;AAAA,sBACzC;AACA,8BAAQ,OAAO;AAAA,oBACjB,CAAC;AAED,mCAAQ;AAAA,sBACN;AAAA,sBACA,MAAM,OAAO,MAAM;AAAA,sBACnB;AAAA,oBACF,EACG,KAAK,gCAAgC,EACrC,MAAM,yBAAyB;AAAA,kBACpC,CAAC;AAAA,gBACH;AAEA,sBAAM,oBAAoB,OAAOA,SAAa;AAC5C,sBACE,CAAC,QAAQ,IAAI,gBACb,CAAC,QAAQ,IAAI,eACb;AACA,0BAAM,IAAI;AAAA,sBACR;AAAA,oBACF;AAAA,kBACF;AAEA,wBAAM,UAAU;AAAA,oBACd,KAAK,eAAAE,QAAG,aAAa,QAAQ,IAAI,YAAY;AAAA,oBAC7C,MAAM,eAAAA,QAAG,aAAa,QAAQ,IAAI,aAAa;AAAA,kBACjD;AAEA,wBAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACrC,0BAAM,cAAc,kBAAAC,QAAM;AAAA,sBACxB;AAAA,sBACAH,KAAI;AAAA,oBACN;AACA,oBAAAA,KAAI,cAAc;AAClB,oBAAAA,KAAI,SAAS;AACb,2BAAO;AACP,gCAAY,OAAO,KAAK,MAAM;AAC5B,0BAAI,OAAO,aAAa,QAAQ,MAAM,UAAU;AAC9C,kCAAU,YAAY,QAAQ;AAAA,sBAEhC,WAAW,aAAa,QAAQ,GAAG,YAAY,MAAM;AACnD,4BAAI,QAAQ,IAAI,cAAc,QAAQ;AACpC,oCACE,QAAQ,IAAI,sBAAsB;AAAA,wBACtC;AAAA,sBACF,OAAO;AAEL,kCAAU,aAAa,QAAQ,GAAG,WAAW;AAAA,sBAC/C;AAEA,gCAAU;AAEV,8BAAQ;AAAA,wBACN,8BAA8B,OAAO;AAAA,sBACvC;AACA,8BAAQ,OAAO;AAAA,oBACjB,CAAC;AAED,mCAAQ;AAAA,sBACN;AAAA,sBACA,MAAM,YAAY,MAAM;AAAA,sBACxB;AAAA,oBACF,EACG,KAAK,gCAAgC,EACrC,MAAM,0BAA0B;AAAA,kBACrC,CAAC;AAAA,gBACH;AAEA,oBACE,IAAI,kBAAkB,cACtB,IAAI,kBAAkB,OACtB;AACA,wBAAM,iBAAiB,GAAG;AAAA,gBAC5B,WAAW,IAAI,kBAAkB,WAAW;AAC1C,wBAAM,iBAAiB,GAAG;AAC1B,wBAAM,kBAAkB,GAAG;AAAA,gBAC7B,WAAW,IAAI,kBAAkB,oBAAoB;AACnD,wBAAM,kBAAkB,GAAG;AAAA,gBAC7B,WAAW,IAAI,kBAAkB,QAAQ;AAEvC,wBAAM,iBAAiB,GAAG;AAAA,gBAE5B;AAEA,oBAAI,OAAO;AAAA,kBACT,MAAM,IAAI;AAAA,kBACV;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,aAAa,QAAQ;AAAA,kBACrB,cAAc,IAAI;AAAA,kBAClB,WAAW;AAAA,kBACX,aAAa,IAAI;AAAA,kBACjB,mBAAmB;AAAA,kBACnB,YAAY;AAAA,kBACZ,QAAQ,CAAC;AAAA,gBACX;AAEA,uBAAO,IAAI;AAEX,uBAAO;AAAA,cACT;AAAA,cACA;AAAA,YACF,EACG,MAAM,qCAAqC,EAC3C,YAAY,wCAAwC,EACpD;AAAA,cACC,eAAQ;AAAA,gBACN;AAAA,gBACA,MAAM;AACJ,iCAAQ;AAAA,oBACN;AAAA,oBACA,CAAC,SAAS,SAAc;AACtB,0BAAI,QAAQ,QAAQ,QAAQ,SAAS;AACnC,8BAAM,UAAU,QAAQ,QAAQ,QAAQ;AACxC,+BAAO,QAAQ;AACf,+BAAO,QAAQ;AACf,gCAAQ,kBACN,QAAQ,YAAY,kBAAkB;AACxC,gCAAQ,aAAa;AACrB,uCAAQ,OAAO,IAAI,SAAS,OAAO;AACnC,+BAAO;AAAA,sBACT,OAAO;AACL,gCAAQ,UAAU;AAClB,gCAAQ,UAAU;AAClB,6BAAK,sBAAsB,OAAO;AAClC,+BAAO;AAAA,sBACT;AAAA,oBACF;AAAA,oBACA;AAAA,kBACF,EACG,aAAa,oBAAoB,EACjC;AAAA,oBACC,eAAQ,SAAS;AAAA,oBACjB,eAAQ,SAAS;AAAA,kBACnB;AAAA,gBACJ;AAAA,cACF;AAAA,YACF;AAAA,UACJ,EACC,YAAY,kBAAkB;AAAA,QACnC;AAAA,MACJ;AAAA,MACA;AAAA,IACF,EAAE,KAAK,wCAAwC;AAE/C,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,EAAE,aAAa,gBAAgB,aAAa,SAAS,IAAI;AAE/D,cAAM,OAAO,aAAa,UAAU,MAAM;AAC1C,cAAM,MAAM,GAAG,QAAQ,MAAM,cAAc,IAAI,IAAI;AACnD,cAAM,UAAU,GAAG,cAAc,IAAI,IAAI;AAEzC,YAAI,eAAQ,IAAI,qBAAqB,GAAG,EAAE,GAAG;AAC3C,kBAAQ,MAAM,+BAA+B,GAAG;AAChD;AAAA,QACF;AAEA,cAAM,gBAAgB,eAAQ;AAAA,UAC5B,qBAAqB,GAAG;AAAA,UACxB,OAAOA,MAAK,SAAS;AACnB,gBAAI;AACF,oBAAM,WAAW,MAAM,KAAK;AAAA,gBAC1B,GAAG,GAAG;AAAA,gBACN;AAAA,kBACE,SAAS;AAAA,oBACP,gBAAgB;AAAA,kBAClB;AAAA,kBACA,QAAQ;AAAA,kBACR,MAAM,KAAK,UAAUA,KAAI,aAAa;AAAA,gBACxC;AAAA,gBACA;AAAA,cACF;AACA,kBAAI,SAAS,aAAa,WAAW;AACnC,sBAAM,QACJ,SAAS,WACT,gCAAgC,WAAW,IAAIA,KAAI,iBAAiB;AACtE,+BAAQ;AAAA,kBACN;AAAA,kBACA,EAAE,OAAO,aAAa,IAAI;AAAA,kBAC1B;AAAA,gBACF;AACA,qBAAK,+BAA+B,OAAO,IAAI,QAAQ;AACvD,uBAAO,EAAE,GAAGA,MAAK,SAAS,OAAO,SAAS,KAAK;AAAA,cACjD;AAEA,cAAAA,KAAI,oBAAoB,SAAS;AAEjC,6BAAQ,IAAI,2BAA2B;AAAA,gBACrC;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AAED,yBAAW,qBAAqBA,KAAI,oBAAoB;AAEtD,qBAAK,uDAAuD;AAAA,kBAC1D,MAAM;AAAA,oBACJ,mBAAmBA,KAAI;AAAA,oBACvB,yBACE,eAAQ,gBAAgB;AAAA,oBAC1B;AAAA,kBACF;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF,SAAS,GAAG;AACV,6BAAQ;AAAA,gBACN;AAAA,gBACA,EAAE,OAAO,GAAG,aAAa,KAAK,KAAAA,KAAI;AAAA,gBAClC;AAAA,cACF;AACA,qBAAO,EAAE,GAAGA,MAAK,SAAS,GAAG,SAAS,KAAK;AAAA,YAC7C;AAEA,mBAAOA;AAAA,UACT;AAAA,UACA;AAAA,UACA,EAAE,YAAY,GAAG,YAAY,KAAM,kBAAkB,IAAI;AAAA,QAC3D,EACG,KAAK,kCAAkC,OAAO,EAAE,EAChD,MAAM,+BAA+B,EACrC;AAAA,UACC;AAAA,UACA;AAAA,QACF;AAEF,cAAM,eAAe,eAAQ;AAAA,UAC3B,gCAAgC,GAAG;AAAA,UACnC,OAAOA,MAAK,SAAS;AACnB,gBAAIA,KAAI,wBAAwB,QAAW;AACzC;AAAA,YACF;AAEA,gBAAI;AACJ,gBAAI;AACF,oBAAM,WAAW,UAAM,kBAAAL,SAAM,GAAG,GAAG,eAAe;AAAA,gBAChD,SAAS;AAAA,kBACP,gBAAgB;AAAA,gBAClB;AAAA,gBACA,QAAQ;AAAA,gBACR,MAAM,KAAK,UAAUK,IAAG;AAAA,cAC1B,CAAC;AACD,8BAAgB,MAAM,SAAS,KAAK;AAAA,YACtC,SAAS,GAAG;AAEV,8BAAgB;AAAA,gBACd,SAAS,UAAU,CAAC;AAAA,gBACpB,SAAS;AAAA,gBACT,GAAGA;AAAA,gBACH,GAAGA,KAAI;AAAA,cACT;AAAA,YACF,UAAE;AACA;AAAA,gBACE,wBAAwBA,KAAI,WAAW,cAAc;AAAA,gBACrD;AAAA,cACF;AAAA,YACF;AAEA,mBAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF,EACG;AAAA,UACC,qDAAqD,OAAO;AAAA,UAC5D,uCAAuC,OAAO;AAAA,QAChD,EACC,YAAY,4BAA4B,EACxC,aAAa,sBAAsB;AAEtC,cAAM,eAAe,eAAQ;AAAA,UAC3B,6BAA6B,GAAG;AAAA,UAChC,OAAOA,MAAK,SAAS;AACnB,gBAAIA,KAAI,iBAAiB,QAAW;AAClC;AAAA,YACF;AAEA,gBAAI;AACJ,gBAAI;AACF,yBAAW,MAAM,KAAK;AAAA,gBACpB,GAAG,GAAG;AAAA,gBACN;AAAA,kBACE,SAAS;AAAA,oBACP,gBAAgB;AAAA,kBAClB;AAAA,kBACA,QAAQ;AAAA,kBACR,MAAM,KAAK,UAAUA,IAAG;AAAA,gBAC1B;AAAA,gBACA;AAAA,cACF;AAEA,kBAAIA,KAAI,iBAAiB;AACvB,qBAAK,0BAA0BA,KAAI,eAAe,IAAI,QAAQ;AAAA,cAChE;AAAA,YACF,SAAS,GAAG;AAGV,yBAAW;AAAA,gBACT,SAAS,UAAU,CAAC;AAAA,gBACpB,SAAS;AAAA,gBACT,GAAGA;AAAA,cACL;AAAA,YACF;AAEA,mBAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF,EACG;AAAA,UACC,qDAAqD,OAAO;AAAA,UAC5D,mDAAmD,WAAW;AAAA,UAC9D;AAAA,QACF,EACC,YAAY,uCAAuC,EACnD,aAAa,wBAAwB;AAExC,cAAM,aAAa,eAAQ;AAAA,UACzB,uBAAuB,GAAG;AAAA,UAC1B,OAAOA,SAAQ;AACb,gBAAI;AACJ,gBAAI;AACF,uBAAS,MAAM,KAAK;AAAA,gBAClB,GAAG,GAAG;AAAA,gBACN;AAAA,kBACE,QAAQ;AAAA,gBACV;AAAA,gBACA;AAAA,cACF;AAAA,YACF,SAAS,GAAG;AAGV,uBAAS;AAAA,gBACP,SAAS,UAAU,CAAC;AAAA,gBACpB,SAAS;AAAA,gBACT,GAAGA;AAAA,cACL;AAAA,YACF;AAEA,mBAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF,EACG,KAAK,mCAAmC,EACxC,MAAM,2BAA2B,EACjC,YAAY,gCAAgC;AAE/C,uBAAQ,wBAAwB,wBAAwB,MAAM;AAC5D,yBAAQ,IAAI,2BAA2B,EAAE,KAAK,YAAY,CAAC;AAC3D,wBAAc,QAAQ;AACtB,uBAAa,QAAQ;AACrB,uBAAa,QAAQ;AACrB,qBAAW,QAAQ;AAAA,QACrB,CAAC,EACE;AAAA,UACC,gCAAgC,OAAO;AAAA,UACvC,mCAAmC,OAAO;AAAA,UAC1C,+BAA+B,OAAO;AAAA,QACxC,EACC,MAAM,sBAAsB;AAE/B,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG;AAAA,MACC,eAAQ;AAAA,QACN;AAAA,QACA,CAAC,KAAK,SAAS;AACb,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI;AAEJ,gBAAM,UAAU,GAAG,cAAc,IAAI,WAAW;AAEhD,eAAK,kCAAkC,OAAO,IAAI;AAAA,YAChD;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe;AAAA,cACb,YAAY,eAAQ,gBAAgB;AAAA,cACpC,aAAa,eAAQ,gBAAgB;AAAA;AAAA,YAEvC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA;AAAA,MACF,EAAE,aAAa,gCAAgC;AAAA,IACjD,EACC,KAAK,2CAA2C,EAChD,YAAY,2BAA2B;AAAA,EAC5C;AAAA,EAjuBA,WAAkB,WAA2B;AAC3C,QAAI,CAAC,KAAK,UAAW,MAAK,YAAY,IAAI,gBAAe;AACzD,WAAO,KAAK;AAAA,EACd;AA+tBF;;;ACpvBA,oBAAuB;AACvB,IAAAI,gCAAuD;AAGvD,IAAAC,iBAAmB;AAUnB,IAAqB,mBAArB,MAAqB,kBAAiB;AAAA,EAEpC,WAAkB,WAA6B;AAC7C,QAAI,CAAC,KAAK,UAAW,MAAK,YAAY,IAAI,kBAAiB;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,cAAc;AACZ,mBAAQ;AAAA,MACN;AAAA,MACA;AAAA,QACE,eAAQ,eAAe,sBAAsB,CAAC,QAAQ;AACpD,cAAI,CAAC,IAAI,aAAa;AACpB;AAAA,UACF;AAEA,gBAAM,SAAS,IAAI,qBAAO,IAAI,eAAe,IAAI,YAAY;AAAA,YAC3D,cAAc;AAAA,YACd,aAAa;AAAA,YACb,mBAAmB;AAAA;AAAA,YACnB,yBAAyB;AAAA,cACvB,0BAA0B,IAAI,KAAK;AAAA;AAAA,cACnC,iBAAiB;AAAA;AAAA,YACnB;AAAA,UACF,CAAC;AAED,gBAAM,UAAU,IAAI,qBAAqB;AAEzC,iBAAO,IAAI,CAAC,QAAQ,SAAS;AAE3B,kBAAM,SAAS,QAAQ,WAAW,SAAS;AAC3C,kBAAM,iBAAiB,CAAC,GAAG;AAC3B,kBAAM,cAAc,IAAI,iBAAiB;AACzC,gBAAI,kBAAkB,UAAU;AAChC,gBAAI,gBAAgB,WAAY,mBAAkB;AAElD,gBACE,YAAY,SACZ,CAAC,eAAe,SAAS,eAAe,KACxC,CAAC,eAAe,SAAS,GAAG,GAC5B;AACA,qBAAO,KAAK,IAAI,MAAM,qBAAqB,CAAC;AAAA,YAC9C;AAGA,kBAAM,iBAAyD;AAAA,cAC7D,KAAK,EAAE,QAAQ,UAAU,UAAU,EAAE;AAAA,cACrC,QAAQ,EAAE,QAAQ,KAAO,UAAU,GAAG;AAAA,cACtC,MAAM,EAAE,QAAQ,KAAM,UAAU,IAAI,eAAe,IAAI;AAAA,YACzD;AACA,kBAAM,UAAU,IAAI,gDAAkB,eAAe,OAAO,CAAC;AAC7D,kBAAM,YAAY,QAAQ,WAAW,WAAW;AAChD,mBAAO,IAAI,CAAC,QAAQ,eAAe;AACjC,sBACG,QAAQ,SAAS,EACjB,KAAK,MAAM,WAAW,CAAC,EACvB,MAAM,CAAC,QAAQ;AACd,oBAAI,IAAI,eAAe,GAAG;AACxB,iCAAQ;AAAA,oBACN;AAAA,oBACA;AAAA,sBACE,YAAY,IAAI,eAAe;AAAA,sBAC/B;AAAA,sBACA,UAAU,OAAO;AAAA,oBACnB;AAAA,oBACA;AAAA,kBACF;AACA,yBAAO,KAAK,SAAS;AAAA,oBACnB,SAAS;AAAA,oBACT,YAAY,IAAI,eAAe;AAAA,kBACjC,CAAC;AACD,6BAAW,IAAI,MAAM,qBAAqB,CAAC;AAAA,gBAC7C,OAAO;AACL,iCAAQ;AAAA,oBACN;AAAA,oBACA;AAAA,sBACE;AAAA,sBACA,UAAU,OAAO;AAAA,oBACnB;AAAA,oBACA;AAAA,kBACF;AACA,yBAAO,WAAW,IAAI;AACtB,6BAAW,IAAI,MAAM,SAAS,CAAC;AAAA,gBACjC;AAAA,cACF,CAAC;AAAA,YACL,CAAC;AAsBD,iBAAK;AAAA,UACP,CAAC;AAED,cAAI,CAAC,QAAQ;AACX,2BAAQ,IAAI,iCAAiC,CAAC,GAAG,OAAO;AACxD,mBAAO,EAAE,GAAG,KAAK,SAAS,aAAa,SAAS,KAAK;AAAA,UACvD;AAEA,gBAAM,eAA2C,CAAC;AAElD,iBAAO,GAAG,cAAc,CAAC,OAAY;AACnC,gBAAI;AACF,iBAAG;AAAA,gBACD;AAAA,gBACA,CAACC,MAAgB,aAAoC;AACnD,sBAAI,aAAaA,KAAI,iBAAiB,GAAG;AACvC,6BAAS;AAAA,sBACP,QAAQ;AAAA,sBACR,OAAO;AAAA,oBACT,CAAC;AACD;AAAA,kBACF;AAEA,+BAAaA,KAAI,iBAAiB,IAAI;AACtC,iCAAQ,IAAI,gCAAgC;AAAA,oBAC1C,GAAGA;AAAA,oBACH,UAAU,GAAG;AAAA,kBACf,CAAC;AAED,2BAAS;AAAA,oBACP,QAAQ;AAAA,oBACR,aAAa,eAAQ,gBAAgB;AAAA,kBACvC,CAAC;AAED,sBAAIA,KAAI,YAAY;AAClB,0BAAM,UAAU,WAAWA,KAAI,iBAAiB;AAChD,mCAAQ;AAAA,sBACN,sBAAsB,OAAO;AAAA,sBAC7B,CAACA,MAAK,SAAS;AACb,4BAAIA,KAAI,iBAAiB,QAAW;AAClC;AAAA,wBACF;AAEA,2BAAG,KAAK,UAAUA,IAAG;AAErB,4BAAIA,KAAI,iBAAiB;AACvB;AAAA,4BACE,kCAAkCA,KAAI,eAAe;AAAA,4BACrD,CAAC;AAAA,0BACH;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF,EACG;AAAA,sBACC,sDAAsD,OAAO;AAAA,oBAC/D,EACC,aAAa,gCAAgC;AAAA,kBAClD;AAEA,iCAAQ,KAAK,yBAAyBA,IAAG;AAAA,gBAC3C;AAAA,cACF;AAEA,iBAAG;AAAA,gBACD;AAAA,gBACA,CAACA,MAAgB,aAAsC;AACrD,wBAAM,eAAeA,KAAI,WAAW;AAEpC,iCAAQ;AAAA,oBACN;AAAA,oBACA,CAACA,SAAmB;AAClB,+BAASA,IAAG;AAAA,oBACd;AAAA,oBACA;AAAA,oBACA,EAAE,UAAU,MAAM;AAAA,kBACpB,EACG,KAAK,6BAA6B,YAAY,EAAE,EAChD,MAAM,mCAAmC,YAAY,EAAE;AAE1D,iCAAQ;AAAA,oBACN;AAAA,oBACA,CAACA,SAAQ;AACP,0BAAIA,KAAI,eAAe;AACrB,2BAAG,KAAK,uBAAuBA,IAAG;AAAA,oBACtC;AAAA,oBACA;AAAA,oBACA;AAAA,sBACE,MAAM;AAAA,sBACN,kBAAkB,CAACA,SACjBA,KAAI,KAAK,aAAa,KACtBA,KAAI,MAAM,aAAa;AAAA,sBACzB,UAAU;AAAA,oBACZ;AAAA,kBACF,EACG;AAAA,oBACC,wCAAwC,YAAY;AAAA,oBACpD,6BAA6B,YAAY;AAAA,kBAC3C,EACC,YAAY,+BAA+B,YAAY,EAAE;AAE5D,iCAAQ,KAAK,oCAAoC;AAAA,oBAC/C,GAAGA;AAAA,oBACH,QAAQA,KAAI;AAAA,kBACd,CAAC;AAAA,gBACH;AAAA,cACF;AAEA,iBAAG;AAAA,gBACD;AAAA,gBACA,CAACA,MAAgB,aAAsC;AACrD,sBACE,eAAQ,aACL,oBAAoB,EACpB,SAASA,KAAI,YAAY,GAC5B;AACA,6BAAS;AAAA,sBACP,UAAU;AAAA,sBACV,cAAcA,KAAI;AAAA,oBACpB,CAAC;AAED,mCAAQ,KAAKA,KAAI,cAAcA,IAAG;AAAA,kBACpC,OAAO;AACL,mCAAQ;AAAA,sBACN,kBAAkBA,KAAI,YAAY,OAAOA,KAAI,aAAa;AAAA,sBAC1D;AAAA,oBACF;AACA,6BAAS;AAAA,sBACP,GAAGA;AAAA,sBACH,UAAU;AAAA,sBACV,SAAS,mBAAmBA,KAAI,YAAY;AAAA,sBAC5C,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH;AAAA,gBACF;AAAA,cACF;AAEA,iBAAG;AAAA,gBACD;AAAA,gBACA,CAACA,MAAgB,aAAsC;AACrD,iCAAQ;AAAA,oBACN;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,EAAE,UAAU,MAAM;AAAA,kBACpB,EAAE,QAAQ,eAAQ,gBAAgB,aAAa;AAE/C,iCAAQ,KAAK,sCAAsCA,IAAG;AAAA,gBACxD;AAAA,cACF;AAEA,iBAAG,GAAG,cAAc,MAAM;AACxB,+BAAQ;AAAA,kBACN;AAAA,kBACA,EAAE,UAAU,GAAG,GAAG;AAAA,kBAClB;AAAA,gBACF;AACA,+BAAQ,KAAK,4BAA4B;AAAA,kBACvC,QAAQ,GAAG;AAAA,gBACb,CAAC;AAAA,cACH,CAAC;AAAA,YACH,SAAS,GAAG;AACV,6BAAQ;AAAA,gBACN;AAAA,gBACA,EAAE,OAAO,EAAE;AAAA,gBACX;AAAA,cACF;AAAA,YACF;AAEA,2BAAQ,KAAK,yBAAyB,EAAE,QAAQ,GAAG,GAAG,CAAC;AAAA,UACzD,CAAC;AAED,yBAAQ;AAAA,YACN;AAAA,YACA,CAACA,SAAQ,OAAO,KAAK,iBAAiBA,IAAG;AAAA,YACzC;AAAA,UACF,EAAE,KAAK,sBAAsB;AAE7B,yBAAQ;AAAA,YACN;AAAA,YACA,MAAM,OAAO,MAAM;AAAA,YACnB;AAAA,UACF,EACG,KAAK,uCAAuC,EAC5C,MAAM,sBAAsB;AAE/B,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF,EAAE,KAAK,qCAAqC;AAE5C,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,EAAE,aAAa,gBAAgB,aAAa,SAAS,IAAI;AAE/D,cAAM,iBAAiB,aAAa,UAAU,QAAQ;AACtD,cAAM,OAAO,aAAa,UAAU,MAAM;AAC1C,cAAM,MAAM,GAAG,cAAc,MAAM,cAAc,IAAI,IAAI;AACzD,cAAM,UAAU,GAAG,cAAc,IAAI,IAAI;AACzC,YAAI,YAAY;AAEhB,cAAM,aAAS,mBAAG,KAAK;AAAA,UACrB,cAAc;AAAA,UACd,sBAAsB;AAAA,UACtB,mBAAmB;AAAA,UACnB,sBAAsB;AAAA,UACtB,qBAAqB;AAAA,UACrB,YAAY,CAAC,WAAW;AAAA,UACxB,aAAa;AAAA,QACf,CAAC;AAED,cAAM,gBAAgB,CACpB,OACA,MACA,YAAoB,KACpB,QACe;AACf,iBAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,kBAAM,UAAU,MAAM;AACpB,kBAAI,CAAC,OAAO,WAAW;AAErB,uBAAO,KAAK,WAAW,OAAO;AAC9B;AAAA,cACF;AAEA,kBAAI;AACJ,kBAAI,cAAc,GAAG;AACnB,wBAAQ,WAAW,MAAM;AACvB,iCAAQ;AAAA,oBACN,iBAAiB,KAAK;AAAA,oBACtB,EAAE,GAAG,MAAM,UAAU,OAAO,IAAI,aAAa,IAAI;AAAA,oBACjD;AAAA,kBACF;AACA,0BAAQ;AAAA,oBACN,GAAG;AAAA,oBACH,SAAS;AAAA,oBACT,SAAS,iBAAiB,KAAK;AAAA,oBAC/B,OAAO,iBAAiB,KAAK;AAAA,oBAC7B,UAAU,OAAO;AAAA,oBACjB;AAAA,oBACA;AAAA,kBACF,CAAC;AAAA,gBACH,GAAG,SAAS;AAAA,cACd;AAEA,qBACG,QAAQ,SAAS,EACjB,KAAK,OAAO,MAAM,CAAC,KAAU,aAAgB;AAC5C,oBAAI,KAAK;AACP,iCAAQ;AAAA,oBACN;AAAA,oBACA,EAAE,OAAO,KAAK,UAAU,OAAO,IAAI,YAAY;AAAA,oBAC/C;AAAA,kBACF;AACA,6BAAW;AAAA,oBACT,SAAS,kBAAkB,GAAG;AAAA,oBAC9B,SAAS;AAAA,oBACT,GAAG;AAAA,oBACH,GAAG,IAAI;AAAA,kBACT;AACA,0BAAQ,QAAQ;AAChB;AAAA,gBACF;AACA,oBAAI,MAAO,cAAa,KAAK;AAC7B,oBAAI,IAAK,KAAI,QAAQ;AACrB,wBAAQ,QAAQ;AAAA,cAClB,CAAC;AAAA,YACL;AAEA,gBAAI,OAAO,WAAW;AACpB,sBAAQ;AAAA,YACV,OAAO;AACL,qBAAO,KAAK,WAAW,OAAO;AAAA,YAChC;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO,GAAG,WAAW,MAAM;AACzB,cAAI,UAAW;AACf,yBAAQ,KAAK,gCAAgC,OAAO,IAAI,GAAG;AAAA,QAC7D,CAAC;AAED,eAAO,GAAG,uBAAuB,CAACA,SAAQ;AACxC,yBAAQ;AAAA,YACN,0CAA0CA,KAAI,WAAW,cAAc;AAAA,YACvEA;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO,GAAG,UAAU,CAACA,SAAQ;AAC3B,cACE,eAAQ,aACL,oBAAoB,EACpB,SAASA,KAAI,YAAY,GAC5B;AACA,2BAAQ,KAAKA,KAAI,cAAcA,IAAG;AAAA,UACpC;AAAA,QACF,CAAC;AAED,eAAO,GAAG,iBAAiB,CAAC,WAAW;AACrC,yBAAQ,KAAK,sCAAsC,MAAM;AAAA,QAC3D,CAAC;AAED,eAAO,GAAG,iBAAiB,CAAC,QAAQ;AAClC,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,OAAO,IAAI,SAAS,aAAa,UAAU,OAAO,IAAI,IAAI;AAAA,YAC5D;AAAA,UACF;AACA,yBAAQ,KAAK,oCAAoC,GAAG;AAAA,QACtD,CAAC;AAED,eAAO,GAAG,qBAAqB,CAAC,YAAY;AAC1C,yBAAQ,IAAI,sBAAsB,OAAO,EAAE;AAAA,QAC7C,CAAC;AAED,eAAO,GAAG,aAAa,CAAC,YAAY;AAClC,yBAAQ,IAAI,4BAA4B,OAAO,UAAU;AAAA,YACvD,UAAU,OAAO;AAAA,YACjB;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,eAAO,GAAG,mBAAmB,CAAC,QAAQ;AACpC,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,OAAO,IAAI,SAAS,aAAa,KAAK,UAAU,OAAO,GAAG;AAAA,YAC5D;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO,GAAG,SAAS,CAAC,QAAQ;AAG1B,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,OAAO,KAAK,UAAU,OAAO,IAAI,KAAK,YAAY;AAAA,YACpD;AAAA,UACF;AACA,yBAAQ,KAAK,4BAA4B,GAAG;AAAA,QAC9C,CAAC;AAED,eAAO,GAAG,cAAc,MAAM;AAC5B,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,KAAK,aAAa,UAAU,OAAO,GAAG;AAAA,YACxC;AAAA,UACF;AACA,yBAAQ,KAAK,mCAAmC,OAAO,IAAI;AAAA,YACzD;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AACD,sBAAY;AAAA,QACd,CAAC;AAED,eAAO,QAAQ;AAEf,uBAAQ;AAAA,UACN,kBAAkB,GAAG;AAAA,UACrB,YAAY;AACV,gBAAI,UAAW;AACf,wBAAY;AAEZ,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,gBACE,mBAAmB,eAAQ,gBAAgB;AAAA,gBAC3C,aAAa,eAAQ,gBAAgB;AAAA,gBACrC,YAAY;AAAA,gBACZ,UAAU;AAAA,cACZ;AAAA,cACA;AAAA,cACA,CAAC,WAAgB;AACf,oBAAI,OAAO,WAAW,WAAW;AAC/B,iCAAQ,IAAI,oBAAoB;AAAA,oBAC9B;AAAA,oBACA;AAAA,oBACA,UAAU,OAAO;AAAA,oBACjB;AAAA,kBACF,CAAC;AAAA,gBACH,OAAO;AACL,iCAAQ;AAAA,oBACN;AAAA,oBACA,EAAE,QAAQ,aAAa,UAAU,OAAO,IAAI,IAAI;AAAA,oBAChD;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,QACF,EAAE,KAAK,gCAAgC,OAAO,EAAE;AAEhD,cAAM,eAAe,eAAQ;AAAA,UAC3B,oBAAoB,GAAG;AAAA,UACvB,OAAOA,MAAK,SAAS;AACnB,gBAAIA,KAAI,wBAAwB,QAAW;AACzC;AAAA,YACF;AAEA,mBAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,qBAAOA,KAAI;AACX,qBAAOA,KAAI;AACX,oBAAM,gBAAgB,KAAK,IAAI;AAC/B;AAAA,gBACE;AAAA,gBACAA;AAAA,gBACA;AAAA,gBACA,CAAC,kBAA6B;AAC5B,wBAAM,kBAAkB,KAAK,IAAI,IAAI;AACrC,wBAAM,WAAW,cAAc;AAC/B,yBAAO,cAAc;AACrB;AAAA,oBACE,gCAAgCA,KAAI,WAAW,cAAc;AAAA,oBAC7D;AAAA,sBACE,GAAG;AAAA,sBACH,GAAG;AAAA,sBACH,mBAAmB;AAAA,oBACrB;AAAA,kBACF;AACA,0BAAQ,aAAa;AAAA,gBACvB;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,UACA,4BAA4B,WAAW,iBAAiB,GAAG;AAAA,QAC7D,EACG,KAAK,sDAAsD,OAAO,EAAE,EACpE,aAAa,8BAA8B;AAE9C,cAAM,eAAe,eAAQ;AAAA,UAC3B,sBAAsB,GAAG;AAAA,UACzB,OAAOA,MAAK,SAAS;AACnB,gBAAIA,KAAI,iBAAiB,QAAW;AAClC;AAAA,YACF;AAEA,mBAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,qBAAOA,KAAI;AAEX,4BAAc,UAAUA,MAAK,KAAQ,CAAC,aAAwB;AAC5D,oBAAIA,KAAI,iBAAiB;AACvB;AAAA,oBACE,kCAAkCA,KAAI,eAAe;AAAA,oBACrD;AAAA,kBACF;AAAA,gBACF;AACA,wBAAQ,QAAQ;AAAA,cAClB,CAAC;AAAA,YACH,CAAC;AAAA,UACH;AAAA,UACA,+BAA+B,WAAW,iBAAiB,GAAG;AAAA,QAChE,EACG,KAAK,sDAAsD,OAAO,EAAE,EACpE,aAAa,gCAAgC;AAEhD,uBAAQ;AAAA,UACN,yBAAyB,GAAG;AAAA,UAC5B,MAAM;AACJ,oBAAQ,MAAM;AACd,yBAAa,QAAQ;AACrB,yBAAa,QAAQ;AAAA,UACvB;AAAA,UACA;AAAA,QACF,EACG;AAAA,UACC,kCAAkC,OAAO;AAAA,UACzC,mCAAmC,OAAO;AAAA,UAC1C,+BAA+B,OAAO;AAAA,QACxC,EACC,MAAM,sCAAsC;AAE/C,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG,KAAK,+BAA+B,EACpC,YAAY,mCAAmC;AAAA,EACpD;AACF;;;ACvmBO,SAAS,gBAAgB,WAAmB;AACjD,SAAO,IAAI,KAAK,SAAS,EAAE,YAAY;AACzC;AAYO,SAAS,oBAAoB,YAAoB;AACtD,QAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,MAAI,SACF,MAAM,CAAC,MAAM,UACb,MAAM,CAAC,MAAM,cACb,MAAM,CAAC,MAAM,UACb,MAAM,CAAC,MAAM;AACf,MAAI,WAAW,MAAM,CAAC,MAAM;AAC5B,MAAI,SAAS,WACT,SACE,MAAM,WAAW,IACf,MAAM,CAAC,IACP,KACF,MAAM,WAAW,IACf,MAAM,CAAC,IACP,KACJ,SACE,MAAM,WAAW,IACf,MAAM,CAAC,IACP,KACF,MAAM,WAAW,IACf,MAAM,CAAC,IACP;AACR,QAAM,SAAS,MAAM,MAAM,SAAS,CAAC;AAErC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC/BA,IAAqB,mBAArB,MAAqB,kBAAiB;AAAA,EAEpC,WAAkB,WAA6B;AAC7C,QAAI,CAAC,KAAK,UAAW,MAAK,YAAY,IAAI,kBAAiB;AAC3D,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,cAAc;AACZ,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,KAAK,SAAS;AACb,cAAM,EAAE,WAAW,IAAI;AACvB,cAAM,EAAE,QAAQ,UAAU,QAAQ,OAAO,IACvC,oBAAoB,UAAU;AAEhC,aAAK,8CAA8C;AAAA,UACjD,MAAM;AAAA,YACJ,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,EACG,KAAK,0BAA0B,EAC/B,aAAa,4CAA4C;AAE5D,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,iBAAiB,IAAI;AAC3B,eAAO,IAAI;AAEX,YAAI,CAAC,gBAAgB;AACnB,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,MAAM,eAAe;AAAA,YACrB,aAAa,eAAe;AAAA,YAC5B,YAAY,eAAe;AAAA,YAC3B,WAAW,eAAe;AAAA,YAC1B,cAAc,eAAe;AAAA,YAC7B,mBAAmB,eAAe;AAAA,YAClC,SAAS,eAAe;AAAA,YACxB,WAAW,eAAe,YAAY;AAAA,YACtC,sBAAsB,eAAe;AAAA,YACrC,oBAAoB,eAAe;AAAA,YACnC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,cAAc,eAAQ,gBAAgB;AAAA,YACtC,qBAAqB,eAAQ,gBAAgB;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,WAAW,MAAM,aAAa,IAAI;AAAA,IACtC,EACG,KAAK,wCAAwC,EAC7C,MAAM,kDAAkD;AAAA,EAC7D;AACF;;;AClGA,IAAqB,0BAArB,MAAqB,yBAAwB;AAAA,EAE3C,WAAkB,WAAoC;AACpD,QAAI,CAAC,KAAK,UAAW,MAAK,YAAY,IAAI,yBAAwB;AAClE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc;AACZ,mBAAQ,eAAe,wBAAwB,CAAC,QAAQ;AACtD,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,mBAAmB,EACxB,MAAM,yCAAyC;AAElD,mBAAQ,eAAe,sBAAsB,CAAC,QAAQ;AACpD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,iCAAiC,qBAAqB,EAC3D,MAAM,yCAAyC;AAElD,mBAAQ,eAAe,qCAAqC,CAAC,QAAQ;AACnE,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,UACrC,wBAAwB,eAAQ,gBAAgB;AAAA,QAClD;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,8BAA8B,EACnC,MAAM,sDAAsD;AAE/D,mBAAQ,eAAe,qBAAqB,CAAC,QAAQ;AACnD,qBAAQ,IAAI,iBAAiB,IAAI,KAAK,QAAQ,IAAI,IAAI,MAAM,OAAO;AAAA,IACrE,CAAC,EAAE,KAAK,mBAAmB;AAE3B,mBAAQ,eAAe,kCAAkC,CAAC,QAAQ;AAChE,YAAM,WAAW,IAAI,WAAW,WAAW,SAAS;AACpD,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,UACP;AAAA,UACA,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,2BAA2B,EAChC,MAAM,iDAAiD;AAE1D,mBAAQ,eAAe,iCAAiC,CAAC,QAAQ;AAC/D,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,UACN,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,2BAA2B,EAChC,MAAM,iDAAiD;AAE1D,mBAAQ,eAAe,oCAAoC,CAAC,QAAQ;AAClE,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,SAAS;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,UACN,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,+BAA+B,EACpC,MAAM,8CAA8C;AAEvD,mBAAQ,eAAe,gCAAgC,CAAC,QAAQ;AAC9D,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,SAAS;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,UACN,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,2BAA2B,EAChC,MAAM,iDAAiD;AAE1D,mBAAQ,eAAe,2BAA2B,CAAC,QAAQ;AACzD,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,QAAQ,eAAQ,SAAS,eAAe,EACxC,MAAM,4CAA4C;AAErD,mBAAQ,eAAe,yBAAyB,CAAC,QAAQ;AACvD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,wBAAwB,EAC7B,MAAM,4CAA4C;AAErD,mBAAQ,eAAe,iCAAiC,CAAC,QAAQ;AAC/D,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,UACP,aAAa,eAAQ,gBAAgB;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,yBAAyB,EAC9B,MAAM,kDAAkD;AAE3D,mBAAQ,eAAe,oBAAoB,CAAC,QAAQ;AAClD,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,UACP,cAAc,eAAQ,gBAAgB;AAAA,UACtC,qBAAqB,eAAQ,gBAAgB;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,yBAAyB,kCAAkC,EAChE,MAAM,oDAAoD;AAE7D,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,eAAO;AAAA,UACL,WAAW;AAAA,YACT,MAAM;AAAA,cACJ,GAAG,IAAI;AAAA,cACP,aAAa,eAAQ,gBAAgB;AAAA,cACrC,mBAAmB,eAAQ,gBAAgB;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,yBAAyB,EAC9B,MAAM,sDAAsD;AAE/D,mBAAQ;AAAA,MACN;AAAA,MACA,MAAM;AACJ,eAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,qCAAqC,EAC1C,MAAM,sDAAsD;AAE/D,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,GAAG,IAAI;AAAA,YACP,aAAa,eAAQ,gBAAgB;AAAA,YACrC,oBAAoB,eAAQ,gBAAgB;AAAA,UAC9C;AAAA,UACA,QAAQ;AAAA,YACN,GAAG,IAAI;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,mCAAmC,EACxC,MAAM,oDAAoD;AAE7D,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,GAAG,IAAI;AAAA,YACP,aAAa,eAAQ,gBAAgB;AAAA,YACrC,mBAAmB,eAAQ,gBAAgB;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,qBAAqB,EAC1B,MAAM,mDAAmD;AAE5D,mBAAQ;AAAA,MACN;AAAA,MACA,MAAM;AACJ,eAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,oBAAoB,4CAA4C,EACrE,MAAM,kDAAkD;AAE3D,mBAAQ;AAAA,MACN;AAAA,MACA,MAAM;AACJ,eAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,mBAAmB,EACxB,MAAM,mDAAmD;AAE5D,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,GAAG,IAAI;AAAA,YACP,aAAa,eAAQ,gBAAgB;AAAA,YACrC,mBAAmB,eAAQ,gBAAgB;AAAA,UAC7C;AAAA,UACA,QAAQ;AAAA,YACN,GAAG,IAAI;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,iBAAiB,EACtB,MAAM,iDAAiD;AAE1D,mBAAQ;AAAA,MACN;AAAA,MACA,CAAC,QAAQ;AACP,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,gBAAgB;AAAA,YAChB,cAAc,gBAAgB,KAAK,IAAI,CAAC;AAAA,UAC1C;AAAA,UACA,QAAQ;AAAA,YACN,GAAG,IAAI;AAAA,YACP,aAAa,eAAQ,gBAAgB;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE,aAAa,KAAK,WAAW,KAAK;AAAA,IACtC,EACG,KAAK,oBAAoB,4CAA4C,EACrE,MAAM,kDAAkD;AAE3D,mBAAQ,eAAe,0BAA0B,CAAC,QAAQ;AACxD,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,GAAG,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC,EACE,KAAK,2BAA2B,EAChC,MAAM,2CAA2C;AAAA,EACtD;AACF;;;AV1QA,IAAAC,oBAA0B;;;AWVnB,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC5BA,gBAAiC;AACjC,uBAAqC;AAarC,IAAqB,qBAArB,MAAqB,oBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqCtC,cAAc;AA9Bd,wBAAuB;AAEvB,oBAAW,IAAI,eAAK;AAAA,MAClB,kBAAkB,QAAQ,IAAI,oBAAoB;AAAA,MAClD,UAAU;AAAA,MACV,KAAK;AAAA,QACH,oBAAoB;AAAA;AAAA,MACtB;AAAA,IACF,CAAC;AAuBC,mBAAQ;AAAA,MACN;AAAA,MACA;AAAA;AAAA;AAAA;AAAA,QAIE,eAAQ;AAAA,UACN;AAAA,UACA,OAAO,QAAQ;AACb,kBAAM,EAAE,aAAa,IAAI;AACzB,gBAAI;AACF,kBACE,CAAC,aAAa,MAAM,EAAE,EAAE,MAAM,CAAC,MAAc,SAAS,KAAK,CAAC,CAAC,GAC7D;AACA,sBAAM,IAAI;AAAA,kBACR,yBAAyB,YAAY;AAAA,gBACvC;AAAA,cACF;AACA,sBAAQ,IAAI,qBAAqB,YAAY,IAAI;AAAA,gBAC/C,kBAAkB,QAAQ,IAAI,oBAAoB;AAAA,gBAClD,UAAU;AAAA,gBACV,UAAU,QAAQ,IAAI,qBAAqB;AAAA,cAC7C,CAAC;AAED,oBAAM,KAAK,SAAS,MAAM,mBAAmB,YAAY,EAAE;AAC3D,sBAAQ,IAAI,YAAY,YAAY,UAAU;AAE9C,mBAAK,WAAW,IAAI,eAAK;AAAA,gBACvB,kBAAkB,QAAQ,IAAI,oBAAoB;AAAA,gBAClD,UAAU;AAAA,gBACV,KAAK;AAAA,kBACH,oBAAoB;AAAA;AAAA,gBACtB;AAAA,cACF,CAAC;AAED,mBAAK,eAAe;AACpB,qBAAO;AAAA,YACT,SAAS,OAAY;AACnB,kBAAI,MAAM,SAAS,SAAS;AAC1B,wBAAQ,IAAI,yBAAyB;AAErC,uBAAO;AAAA,cACT;AACA,sBAAQ,MAAM,6BAA6B,KAAK;AAChD,oBAAM,IAAI,MAAM,8BAA8B,MAAM,OAAO,EAAE;AAAA,YAC/D;AAAA,UACF;AAAA,UACA;AAAA,QACF,EAAE;AAAA,UACA,eAAQ;AAAA,YACN;AAAA,YACA,CAAC,QAAQ;AACP,oBAAM,EAAE,OAAO,IAAI;AAInB,kBAAI,CAAC,QAAQ,UAAU,OAAO,OAAO,WAAW,UAAU;AACxD,sBAAM,IAAI,MAAM,2CAA2C;AAAA,cAC7D;AACA,yBAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAC9D,oBAAI,CAAC,MAAM,UAAU,OAAO,MAAM,WAAW,UAAU;AACrD,0BAAQ,IAAI,WAAW,gBAAgB;AACvC,wBAAM,IAAI,MAAM,iBAAiB,SAAS,kBAAkB;AAAA,gBAC9D;AAGA,2BAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AAC7D,sBAAI,CAAC,UAAU,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,SAAS,KAAK,CAAC,CAAC,GAAG;AACvD,4BAAQ,IAAI,WAAW,uBAAuB,SAAS;AACvD,0BAAM,IAAI;AAAA,sBACR,sBAAsB,SAAS,QAAQ,SAAS;AAAA,oBAClD;AAAA,kBACF;AACA,sBAAI,CAAC,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM,IAAI,GAAG;AACrD,4BAAQ;AAAA,sBACN;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,MAAM;AAAA,oBACR;AACA,0BAAM,IAAI;AAAA,sBACR,gBAAgB,MAAM,IAAI,QAAQ,SAAS,IAAI,SAAS;AAAA,oBAC1D;AAAA,kBACF;AACA,sBACE,MAAM,cACN,CAAC,MAAM,WAAW,MAAM,gBAAgB,GACxC;AACA,4BAAQ;AAAA,sBACN;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,MAAM;AAAA,oBACR;AACA,0BAAM,IAAI;AAAA,sBACR,qBAAqB,MAAM,UAAU,QAAQ,SAAS,IAAI,SAAS;AAAA,oBACrE;AAAA,kBACF;AACA,sBAAI,MAAM,eAAe;AACvB,+BAAW,MAAM,CAAC,SAAS,UAAU,UAAU,QAAQ,GAAG;AACxD,4BAAM,WACJ,MAAM,cAAc,WAAW,EAAqB;AACtD,4BAAM,YACJ,MAAM,cAAc,YAAY,EAAqB;AACvD,0BACE,YACA,CAAC,MAAM,QAAQ,QAAQ,KACvB,OAAO,aAAa,UACpB;AACA,gCAAQ;AAAA,0BACN;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF;AACA,8BAAM,IAAI;AAAA,0BACR,wBAAwB,SAAS,IAAI,EAAE;AAAA,wBACzC;AAAA,sBACF;AACA,0BACE,aACA,CAAC,MAAM,QAAQ,SAAS,KACxB,OAAO,cAAc,UACrB;AACA,gCAAQ;AAAA,0BACN;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF;AACA,8BAAM,IAAI;AAAA,0BACR,yBAAyB,SAAS,IAAI,EAAE;AAAA,wBAC1C;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA,sBAAQ,IAAI,kBAAkB;AAC9B,qBAAO;AAAA,YACT;AAAA,YACA;AAAA,UACF,EAAE;AAAA,YACA,eAAQ;AAAA,cACN;AAAA,cACA,KAAK,uBAAuB,KAAK,IAAI;AAAA,cACrC;AAAA,YACF,EAAE;AAAA,cACA,eAAQ;AAAA,gBACN;AAAA,gBACA,KAAK,YAAY,KAAK,IAAI;AAAA,gBAC1B;AAAA,cACF,EAAE;AAAA,gBACA,eAAQ;AAAA,kBACN;AAAA,kBACA,OAAO,QAAQ;AACb,0BAAM;AAAA,sBACJ;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF,IAAI;AACJ,0BAAM,YAAY,OAAO,QAAQ,MAAM,MAAM,EAC1C,IAAI,CAAC,UAAU;AACd,4BAAM,CAAC,WAAW,KAAK,IAAI;AAI3B,0BAAI,MAAM,GAAG,SAAS,IAAI,MAAM,KAAK,YAAY,CAAC;AAClD,0BAAI,MAAM,SAAS;AACjB,+BAAO,IAAI,MAAM,aAAa,aAAa,GAAG;AAChD,0BAAI,MAAM,SAAS;AACjB,+BAAO,IAAI,MAAM,aAAa,aAAa,EAAE,IAAI,MAAM,aAAa,SAAS,CAAC;AAChF,0BAAI,MAAM,QAAS,QAAO;AAC1B,0BAAI,MAAM,OAAQ,QAAO;AACzB,0BAAI,MAAM,YAAY;AACpB,+BAAO,YAAY,MAAM,YAAY,KAAK,OAAO,OAAO,MAAM,OAAO,CAAC;AACxE,0BAAI,MAAM,YAAY,CAAC,MAAM;AAC3B,+BAAO;AACT,0BAAI,MAAM,SAAU,QAAO;AAC3B,0BAAI,MAAM;AACR,+BAAO,wBAAwB,MAAM,UAAU,YAAY,CAAC;AAC9D,0BAAI,MAAM;AACR,+BAAO,eAAe,MAAM,UAAU,cAAc,MAAM,YAAY,SAAS;AACjF,0BAAI,MAAM,UAAW,QAAO;AAE5B,0BAAI,MAAM,aAAa,OAAO;AAC5B,+BAAO,WAAW,MAAM,YAAY,KAAK;AAAA,sBAC3C;AACA,6BAAO;AAAA,oBACT,CAAC,EACA,KAAK,IAAI;AAEZ,wBAAI,OAAO,MAAM,cAAc;AAC7B,4BAAM,SAAS,MAAM,KAAK,SAAS;AAAA,wBACjC,eAAe,SAAS;AAAA,sBAC1B;AACA,8BAAQ,IAAI,cAAc,WAAW,MAAM;AAAA,oBAC7C;AAEA,0BAAM,MAAM,8BAA8B,SAAS,KAAK,SAAS;AAKjE,wBAAI,KAAK,GAAG;AAEZ,2BAAO;AAAA,sBACL;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF,EAAE;AAAA,kBACA,eAAQ,eAAe,sBAAsB,CAAC,QAAQ;AACpD,0BAAM;AAAA,sBACJ;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF,IAAI;AACJ,wBAAI,MAAM,SAAS;AACjB,4BAAM,QAAQ,QAAQ,CAAC,WAAqB;AAC1C,4BAAI;AAAA,0BACF,kCAAkC,SAAS,IAAI,OAAO,KAAK,GAAG,CAAC,OAAO,SAAS,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,wBACvG;AAAA,sBACF,CAAC;AAAA,oBACH;AAEA,2BAAO;AAAA,sBACL;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF;AAAA,kBACF,CAAC,EAAE;AAAA,oBACD,eAAQ;AAAA,sBACN;AAAA,sBACA,CAAC,QAAQ;AACP,8BAAM;AAAA,0BACJ;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF,IAAI;AACJ,4BAAI,MAAM,YAAY;AACpB,8BAAI;AAAA,4BACF,eAAe,SAAS,qCAAqC,SAAS,IAAI,MAAM,WAAW,KAAK,GAAG,CAAC;AAAA;AAAA,4BACpG,eAAe,SAAS,0BAA0B,SAAS,IAAI,MAAM,WAAW,KAAK,GAAG,CAAC,iBAAiB,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,0BACvI;AAAA,wBACF;AAEA,+BAAO;AAAA,0BACL;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF,EAAE;AAAA,sBACA,eAAQ;AAAA,wBACN;AAAA,wBACA,CAAC,QAAQ;AACP,gCAAM;AAAA,4BACJ;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,0BACF,IAAI;AACJ,8BAAI,MAAM,mBAAmB;AAC3B,kCAAM,kBAAkB;AAAA,8BACtB,CAAC,WAAqB;AACpB,oCAAI;AAAA,kCACF,eAAe,SAAS,qCAAqC,SAAS,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA;AAAA,kCAC1F,eAAe,SAAS,0BAA0B,SAAS,IAAI,OAAO,KAAK,GAAG,CAAC,YAAY,OAAO,KAAK,IAAI,CAAC;AAAA,gCAC9G;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAEA,iCAAO;AAAA,4BACL;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF,EAAE;AAAA,wBACA,eAAQ;AAAA,0BACN;AAAA,0BACA,CAAC,QAAQ;AACP,kCAAM;AAAA,8BACJ;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,4BACF,IAAI;AACJ,gCAAI,MAAM,aAAa;AACrB,yCAAW,cAAc,MAAM,aAI1B;AACH,sCAAM,iBAAiB,MAAM,SAAS,IAAI,WAAW,OAAO,KAAK,GAAG,CAAC;AACrE,oCAAI;AAAA,kCACF,eAAe,SAAS,8BAA8B,cAAc;AAAA;AAAA,kCACpE,eAAe,SAAS,mBAAmB,cAAc,iBAAiB,WAAW,OAAO;AAAA,oCAC1F;AAAA,kCACF,CAAC,gBAAgB,WAAW,SAAS,KAAK,WAAW,gBAAgB;AAAA,oCACnE;AAAA,kCACF,CAAC;AAAA,gCACH;AAAA,8BACF;AAAA,4BACF;AACA,mCAAO;AAAA,8BACL;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,8BACA;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF,EAAE;AAAA,0BACA,eAAQ;AAAA,4BACN;AAAA,4BACA,CAAC,QAAQ;AACP,oCAAM;AAAA,gCACJ;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA,8BACF,IAAI;AACJ,kCAAI,MAAM,UAAU;AAClB,2CAAW;AAAA,kCACT;AAAA,kCACA;AAAA,gCACF,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAG7B;AACH,sCAAI;AAAA,oCACF,kBAAkB,WAAW,IAAI,QAAQ,IAAI,IAAI,QAAQ,KAAK,OAAO,SAAS,wCAAwC,QAAQ,QAAQ;AAAA,kCACxI;AAAA,gCACF;AAAA,8BACF;AACA,qCAAO;AAAA,gCACL;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF,EAAE;AAAA,4BACA,eAAQ;AAAA,8BACN;AAAA,8BACA,CAAC,QAAQ;AACP,sCAAM;AAAA,kCACJ;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,gCACF,IAAI;AACJ,oCAAI,MAAM,aAAa;AACrB,sCAAI;AAAA,oCACF,eAAe,SAAS,KAAK,MAAM,YAAY,OAAO,KAAK,IAAI,CAAC,YAAY,MAAM,YAAY,KAC3F;AAAA,sCACC,CAAC,QACC,IAAI,IACD;AAAA,wCAAI,CAAC,UACJ,UAAU,SACN,SACA,MAAM,OAAO,CAAC,MAAM,MAClB,QACA,IAAI,KAAK;AAAA,sCACjB,EACC,KAAK,IAAI,CAAC;AAAA;AAAA,oCACjB,EACC,KAAK,IAAI,CAAC;AAAA,kCACf;AAAA,gCACF;AAEA,uCAAO;AAAA,kCACL;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,kCACA;AAAA,gCACF;AAAA,8BACF;AAAA,4BACF,EAAE;AAAA,8BACA,eAAQ;AAAA,gCACN;AAAA,gCACA,CAAC,QAAQ;AACP,wCAAM,EAAE,eAAe,IAAI;AAC3B,wCAAM,MAAgB,CAAC;AACvB,6CAAW,iBAAiB,gBAAgB;AAC1C,wCAAI,KAAK,GAAG,cAAc,GAAG;AAAA,kCAC/B;AACA,sCAAI,KAAK;AACT,yCAAO;AAAA,oCACL;AAAA,oCACA,QAAQ,eAAe,CAAC,EAAE;AAAA,oCAC1B,SAAS,eAAe,CAAC,EAAE;AAAA,oCAC3B,OAAO,eAAe,CAAC,EAAE;AAAA,oCACzB,WAAW,eAAe,CAAC,EAAE;AAAA,oCAC7B,cACE,eAAe,CAAC,EAAE;AAAA,kCACtB;AAAA,gCACF;AAAA,8BACF,EAAE;AAAA,gCACA,eAAQ;AAAA,kCACN;AAAA,kCACA,OAAO,QAAQ;AACb,0CAAM,EAAE,IAAI,IAAI;AAChB,wCAAI,OAAO,IAAI,SAAS,GAAG;AACzB,iDAAW,OAAO,KAAK;AACrB,4CAAI;AACF,kDAAQ,IAAI,iBAAiB,GAAG;AAChC,gDAAM,KAAK,SAAS,MAAM,GAAG;AAAA,wCAC/B,SAAS,OAAY;AACnB,kDAAQ;AAAA,4CACN;AAAA,4CACA;AAAA,4CACA;AAAA,0CACF;AAAA,wCACF;AAAA,sCACF;AAAA,oCACF;AACA,2CAAO;AAAA,kCACT;AAAA,kCACA;AAAA,gCACF,EAAE;AAAA,kCACA,eAAQ;AAAA,oCACN;AAAA,oCACA,KAAK,YAAY,KAAK,IAAI;AAAA,oCAC1B;AAAA,kCACF,EAAE;AAAA,oCACA,eAAQ;AAAA,sCACN;AAAA,sCACA,CAAC,QAAQ;AACP,8CAAM,EAAE,OAAO,WAAW,QAAQ,IAChC;AAEF,6CAAK;AAAA,0CACH;AAAA,0CACA;AAAA,0CACA;AAAA,0CACA,KAAK,cAAc,KAAK,IAAI;AAAA,0CAC5B;AAAA,wCACF;AAEA,6CAAK;AAAA,0CACH;AAAA,0CACA;AAAA,0CACA;AAAA,0CACA,KAAK,eAAe,KAAK,IAAI;AAAA,0CAC7B;AAAA,wCACF;AAEA,6CAAK;AAAA,0CACH;AAAA,0CACA;AAAA,0CACA;AAAA,0CACA,KAAK,eAAe,KAAK,IAAI;AAAA,0CAC7B;AAAA,wCACF;AAEA,6CAAK;AAAA,0CACH;AAAA,0CACA;AAAA,0CACA;AAAA,0CACA,KAAK,eAAe,KAAK,IAAI;AAAA,0CAC7B;AAAA,wCACF;AAEA,+CAAO;AAAA,sCACT;AAAA,sCACA;AAAA,oCACF,EAAE;AAAA,sCACA,eAAQ;AAAA,wCACN;AAAA,wCACA,MAAM;AACJ,iDAAO;AAAA,wCACT;AAAA,sCACF,EAAE,MAAM,0BAA0B;AAAA,oCACpC;AAAA,kCACF;AAAA,gCACF;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IACF,EAAE,KAAK,8BAA8B;AAAA,EACvC;AAAA,EAtjBA,WAAkB,WAA+B;AAC/C,QAAI,CAAC,KAAK,UAAW,MAAK,YAAY,IAAI,oBAAmB;AAC7D,WAAO,KAAK;AAAA,EACd;AAAA,EAYA,QAAQ;AACN,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8iBA,MAAc,YAAiC;AAC7C,UAAM,SAAU,MAAM,KAAK,SAAS,QAAQ;AAC5C,UAAM,QAAQ,OAAO;AACrB,UAAM,UAAU,OAAO;AAEvB,UAAM,UAAU,WAAW,MAAM;AAC/B,qBAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,UAAU,OAAO;AAAA,UACjB,OAAO,OAAO;AAAA,UACd,cAAc,KAAK;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF,GAAG,GAAI;AAEP,WAAO,QAAQ,IAAI,SAAgB;AACjC,aAAO,YAAY;AACnB,aAAO,MAAM,MAAM,QAAQ,IAAI;AAAA,IACjC;AACA,WAAO,UAAU,MAAM;AAErB,mBAAa,OAAO;AAEpB,aAAO,QAAQ;AACf,aAAO,UAAU;AACjB,aAAO,QAAQ,MAAM,MAAM;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBACZ,aAIA,QACA,SACA;AACA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAI;AACF,eAAO,MAAM,YAAY,QAAQ,OAAO;AAAA,MAC1C,SAAS,KAAc;AACrB,YAAI,OAAQ,IAAc,QAAQ,SAAS,gBAAgB,GAAG;AAC5D,yBAAQ,IAAI,qCAAqC;AACjD,gBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,GAAI,CAAC;AAAA,QAClD,OAAO;AACL,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,OAAO,KAAK,QAAQ;AAAA,YACtB;AAAA,UACF;AACA,iBAAO,EAAE,MAAM,CAAC,EAAE;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AACA,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,uBAAuB,KAA2B;AAEhD,UAAM,SAA2B,IAAI;AACrC,UAAM,QAAkC,oBAAI,IAAI;AAChD,UAAM,YAAY,OAAO,KAAK,OAAO,MAAM;AAG3C,cAAU,QAAQ,CAAC,UAAU,MAAM,IAAI,OAAO,oBAAI,IAAI,CAAC,CAAC;AAGxD,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAC9D,iBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,YAAI,MAAM,YAAY;AACpB,gBAAM,CAAC,QAAQ,IAAI,MAAM,WAAW,MAAM,GAAG;AAC7C,cAAI,aAAa,aAAa,UAAU,SAAS,QAAQ,GAAG;AAC1D,kBAAM,IAAI,QAAQ,GAAG,IAAI,SAAS;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,MAAM,aAAa;AACrB,mBAAW,cAAc,MAAM,aAAa;AAC1C,gBAAM,WAAW,WAAW;AAC5B,cAAI,aAAa,aAAa,UAAU,SAAS,QAAQ,GAAG;AAC1D,kBAAM,IAAI,QAAQ,GAAG,IAAI,SAAS;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAuB,oBAAI,IAAI;AACrC,UAAM,WAAwB,oBAAI,IAAI;AACtC,UAAM,SAAmB,CAAC;AAC1B,QAAI,YAAY;AAEhB,aAAS,MAAM,OAAe;AAC5B,UAAI,SAAS,IAAI,KAAK,GAAG;AACvB,oBAAY;AACZ;AAAA,MACF;AACA,UAAI,QAAQ,IAAI,KAAK,EAAG;AAExB,eAAS,IAAI,KAAK;AAClB,iBAAW,OAAO,MAAM,IAAI,KAAK,KAAK,CAAC,GAAG;AACxC,cAAM,GAAG;AAAA,MACX;AACA,eAAS,OAAO,KAAK;AACrB,cAAQ,IAAI,KAAK;AACjB,aAAO,KAAK,KAAK;AAAA,IACnB;AAGA,eAAW,SAAS,WAAW;AAC7B,UAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;AACvB,cAAM,KAAK;AAAA,MACb;AAAA,IACF;AAGA,eAAW,SAAS,WAAW;AAC7B,UAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;AACvB,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,QAAQ;AACf,WAAO,EAAE,GAAG,KAAK,cAAc,QAAQ,UAAU;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,YAAY,KAAU;AAC3B,UAAM,EAAE,cAAc,QAAQ,UAAU,CAAC,EAAE,IAAI;AAC/C,eAAW,aAAa,cAAc;AACpC,YAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,YAAM,EAAE,KAAK,CAAC,GAAG,OAAO,WAAW,QAAQ,SAAS,aAAa;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,MAAa;AACvB,WAAO,KAAK,IAAI,CAAC,QAAa;AAC5B,YAAM,gBAAqB,CAAC;AAC5B,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,0BAAc,4BAAU,GAAG,CAAC,IAAI;AAAA,MAClC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cACJ,WACA,SACc;AACd,UAAM;AAAA,MACJ,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,MACT,OAAO,CAAC;AAAA,MACR;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,QAAI,MAAM,UAAU,OAAO,SAAS,OAAO,KAAK,IAAI,IAAI,GAAG,SAAS,SAAS;AAC7E,UAAM,SAAgB,CAAC;AAGvB,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,aAAO,MAAM,KAAK,iBAAiB,QAAQ,MAAM;AAAA,IACnD;AAGA,QAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,aAAO,MAAM,KAAK,gBAAgB,KAAK;AAAA,IACzC;AAGA,QAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,aACE,eACA,OAAO,QAAQ,IAAI,EAChB,IAAI,CAAC,CAAC,OAAO,SAAS,MAAM,GAAG,KAAK,IAAI,SAAS,EAAE,EACnD,KAAK,IAAI;AAAA,IAChB;AAGA,QAAI,UAAU,QAAW;AACvB,aAAO,WAAW,OAAO,SAAS,CAAC;AACnC,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,QAAI,WAAW,QAAW;AACxB,aAAO,YAAY,OAAO,SAAS,CAAC;AACpC,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM;AAEpD,YAAM,OAAO,KAAK,YAAY,OAAO,IAAI;AAEzC,aAAO;AAAA,QACL,CAAC,OAAG,4BAAU,SAAS,CAAC,GAAG,GAAG;AAAA,QAC9B,UAAU,OAAO;AAAA,QACjB,WAAW;AAAA,QACX,GAAG;AAAA,MACL;AAAA,IACF,SAAS,OAAY;AACnB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,QACT,SAAS,iBAAiB,MAAM,OAAO;AAAA,QACvC,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,eACJ,WACA,SACc;AACd,UAAM,EAAE,MAAM,cAAc,MAAM,SAAS,CAAC,GAAG,WAAW,IAAI;AAE9D,QAAI,CAAC,QAAS,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAI;AACvD,aAAO,EAAE,SAAS,MAAM,SAAS,8BAA8B;AAAA,IACjE;AAEA,QAAI,gBAAgB,CAAC;AAErB,UAAM,SAAS,cAAc,MAAM,KAAK,UAAU,IAAI,KAAK;AAC3D,QAAI;AACF,UAAI,YAAa,OAAM,OAAO,MAAM,OAAO;AAE3C,YAAM,eAAe,MAAM,KAAK,kBAAkB,MAAM,SAAS;AACjE,YAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,YAAM,OAAO,UAAU,eAAe,CAAC,YAAY;AAEnD,YAAM,MAAM,eAAe,SAAS,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,IAAI,0BAAS,EAAE,KAAK,IAAI,CAAC;AACvF,YAAM,SAAS,KACZ;AAAA,QACC,CAAC,QACC,IAAI,OAAO,OAAO,GAAG,EAClB,IAAI,CAAC,OAAY,MAAM;AACtB,cAAI,OAAO,UAAU,YAAY,OAAO,UAAU;AAChD,gBAAI,MAAM,aAAa,aAAa;AAClC,qBAAO,GAAG,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC;AAAA,YAC/B;AACA,gBAAI,MAAM,aAAa,aAAa;AAClC,qBAAO,GAAG,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC;AAAA,YAC/B;AACA,gBAAI,MAAM,aAAa,OAAO;AAC5B,qBAAO,GAAG,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,YAClD;AAAA,UACF;AACA,iBAAO,IAAI,IAAI,CAAC;AAAA,QAClB,CAAC,EACA,KAAK,IAAI,CAAC;AAAA,MACjB,EACC,KAAK,IAAI;AACZ,YAAM,SAAS,KAAK,QAAQ,CAAC,QAAQ,OAAO,OAAO,GAAG,CAAC;AAEvD,UAAI,gBAAgB;AACpB,UAAI,YAAY;AACd,cAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,yBAAiB,iBAAiB,OAAO,KAAK,IAAI,CAAC;AACnD,YAAI,OAAO,OAAO,UAAU;AAC1B,cAAI,CAAC,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,WAAW,GAAG;AACvD,kBAAM,IAAI,MAAM,qCAAqC;AAAA,UACvD;AACA,gBAAM,aAAa,OAAO,QAAQ,OAAO,GAAG,EACzC;AAAA,YACC,CAAC,CAAC,OAAO,KAAK,MACZ,GAAG,KAAK,MAAM,UAAU,aAAa,cAAc,QAAQ,IAAI,OAAO,SAAS,CAAC,EAAE;AAAA,UACtF,EACC,KAAK,IAAI;AACZ,iBAAO;AAAA,YACL,GAAG,OAAO,OAAO,OAAO,GAAG,EAAE;AAAA,cAC3B,CAAC,MAAM,OAAO,MAAM,YAAY,CAAC,EAAE,WAAW,WAAW;AAAA,YAC3D;AAAA,UACF;AACA,2BAAiB,kBAAkB,UAAU;AAC7C,cAAI,OAAO,MAAO,kBAAiB,UAAU,OAAO,KAAK;AAAA,QAC3D,OAAO;AACL,2BAAiB;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B,GAAG,GAAG,IAAI,MAAM,GAAG,aAAa,cAAc,OAAO,SAAS,OAAO,KAAK,IAAI,IAAI,GAAG;AAAA,QACrF;AAAA,MACF;AACA,UAAI,YAAa,OAAM,OAAO,MAAM,QAAQ;AAC5C,YAAM,aAAa,KAAK,YAAY,OAAO,IAAI;AAE/C,sBAAgB;AAAA,QACd,CAAC,OAAG,4BAAU,SAAS,CAAC,GAAG,UAAU,MAAM,EAAE,EAAE,GAAG,UAC9C,aACA,WAAW,CAAC;AAAA,QAChB,UAAU,OAAO;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF,SAAS,OAAY;AACnB,UAAI,YAAa,OAAM,OAAO,MAAM,UAAU;AAE9C,UAAI,MAAM,QAAQ,SAAS,4BAA4B,GAAG;AACxD,wBAAgB;AAAA,UACd,CAAC,OAAG,4BAAU,SAAS,CAAC,EAAE,GAAG;AAAA,UAC7B,WAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,wBAAgB;AAAA,UACd,GAAG;AAAA,UACH,SAAS;AAAA,UACT,SAAS,kBAAkB,MAAM,OAAO;AAAA,UACxC,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,UAAE;AACA,UAAI,eAAe,QAAQ;AAEzB,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,eACJ,WACA,SACc;AACd,UAAM,EAAE,MAAM,SAAS,CAAC,GAAG,cAAc,KAAK,IAAI;AAElD,QAAI,CAAC,QAAQ,OAAO,KAAK,IAAI,EAAE,WAAW,GAAG;AAC3C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,kCAAkC,SAAS;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,gBAAgB,CAAC;AAErB,UAAM,SAAS,cAAc,MAAM,KAAK,UAAU,IAAI,KAAK;AAC3D,QAAI;AACF,UAAI,YAAa,OAAM,OAAO,MAAM,OAAO;AAE3C,YAAM,eAAe,MAAM,KAAK,kBAAkB,MAAM,SAAS;AACjE,YAAM,SAAS,OAAO,OAAO,YAAY;AAEzC,UAAI,SAAS;AACb,YAAM,YAAY,OAAO,QAAQ,OAAO,KAAK,YAAY,CAAC,EACvD,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM;AACjB,cAAM,QAAQ,aAAa,GAAG;AAC9B,cAAM,cAAc,SAAS,CAAC,IAAI;AAClC,YAAI,MAAM,aAAa,aAAa;AAClC,iBAAO,OAAO,aAAa,CAAC;AAC5B;AACA,iBAAO,OAAG,4BAAU,GAAG,CAAC,UAAM,4BAAU,GAAG,CAAC;AAAA,QAC9C;AACA,YAAI,MAAM,aAAa,aAAa;AAClC,iBAAO,OAAO,aAAa,CAAC;AAC5B;AACA,iBAAO,OAAG,4BAAU,GAAG,CAAC,UAAM,4BAAU,GAAG,CAAC;AAAA,QAC9C;AACA,YAAI,MAAM,aAAa,OAAO;AAC5B,iBAAO,OAAO,aAAa,CAAC;AAC5B;AACA,iBAAO,OAAG,4BAAU,GAAG,CAAC,MAAM,MAAM,OAAO;AAAA,QAC7C;AACA,eAAO,OAAG,4BAAU,GAAG,CAAC,OAAO,cAAc,CAAC;AAAA,MAChD,CAAC,EACA,KAAK,IAAI;AAEZ,YAAM,cAAc,KAAK,iBAAiB,QAAQ,MAAM;AAExD,YAAM,MAAM,UAAU,SAAS,QAAQ,SAAS,IAAI,WAAW;AAC/D,YAAM,SAAS,MAAM,OAAO,MAAM,KAAK,MAAM;AAC7C,UAAI,YAAa,OAAM,OAAO,MAAM,QAAQ;AAC5C,YAAM,OAAO,KAAK,YAAY,OAAO,IAAI;AAEzC,UAAI,KAAK,WAAW,GAAG;AACrB,wBAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,wBAAgB;AAAA,UACd,CAAC,OAAG,4BAAU,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC;AAAA,UACnC,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,UAAI,YAAa,OAAM,OAAO,MAAM,UAAU;AAC9C,sBAAgB;AAAA,QACd,GAAG;AAAA,QACH,SAAS;AAAA,QACT,SAAS,kBAAkB,MAAM,OAAO;AAAA,QACxC,WAAW;AAAA,MACb;AAAA,IACF,UAAE;AACA,UAAI,eAAe,QAAQ;AAEzB,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,eACJ,WACA,SACc;AACd,UAAM,EAAE,SAAS,CAAC,GAAG,cAAc,KAAK,IAAI;AAE5C,QAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,aAAO,EAAE,SAAS,MAAM,SAAS,gCAAgC;AAAA,IACnE;AAEA,QAAI,gBAAgB,CAAC;AAErB,UAAM,SAAS,cAAc,MAAM,KAAK,UAAU,IAAI,KAAK;AAC3D,QAAI;AACF,UAAI,YAAa,OAAM,OAAO,MAAM,OAAO;AAE3C,YAAM,SAAgB,CAAC;AACvB,YAAM,cAAc,KAAK,iBAAiB,QAAQ,MAAM;AACxD,YAAM,MAAM,eAAe,SAAS,IAAI,WAAW;AACnD,YAAM,SAAS,MAAM,OAAO,MAAM,KAAK,MAAM;AAC7C,UAAI,YAAa,OAAM,OAAO,MAAM,QAAQ;AAC5C,YAAM,OAAO,KAAK,YAAY,OAAO,IAAI;AACzC,sBAAgB;AAAA,QACd,CAAC,OAAG,4BAAU,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC;AAAA,QACnC,WAAW;AAAA,MACb;AAAA,IACF,SAAS,OAAY;AACnB,UAAI,YAAa,OAAM,OAAO,MAAM,UAAU;AAC9C,sBAAgB;AAAA,QACd,SAAS;AAAA,QACT,SAAS,kBAAkB,MAAM,OAAO;AAAA,QACxC,UAAU,EAAE,QAAQ,MAAM,QAAQ;AAAA,QAClC,WAAW;AAAA,MACb;AAAA,IACF,UAAE;AACA,UAAI,eAAe,QAAQ;AAEzB,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,iBAAiB,QAAmB,QAAuB;AACzD,UAAM,aAAa,CAAC;AACpB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,QAAW;AACvB,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,qBAAW;AAAA,YACT,OAAG,4BAAU,GAAG,CAAC,QAAQ,MACtB,IAAI,CAAC,MAAM;AACV,oBAAM,MAAM,IAAI,OAAO,SAAS,CAAC;AACjC,qBAAO,KAAK,CAAC;AACb,qBAAO;AAAA,YACT,CAAC,EACA,KAAK,IAAI,CAAC;AAAA,UACf;AAAA,QACF,OAAO;AACL,qBAAW,KAAK,OAAG,4BAAU,GAAG,CAAC,OAAO,OAAO,SAAS,CAAC,EAAE;AAC3D,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,WAAO,WAAW,SAAS,SAAS,WAAW,KAAK,OAAO,CAAC,KAAK;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgB,OAA+C;AAC7D,QAAI,UAAU;AACd,eAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,iBAAW,kBAAc,4BAAU,KAAK,CAAC,IAAI,KAAK,KAAK,OAAO,KAAK,EAAE;AACrE,UAAI,KAAK,MAAO,YAAW,MAAM,KAAK,gBAAgB,KAAK,KAAK;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBAAkB,MAAW,WAAiC;AAClE,QAAI,MAAM,QAAQ,IAAI;AACpB,aAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC,CAAC;AAC1E,QAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AAEtD,UAAM,WAAW,EAAE,GAAG,KAAK;AAC3B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,UACE,OAAO,UAAU,YACjB,UAAU,QACV,kBAAkB,OAClB;AACA,cAAM,QAAQ;AACd,iBAAS,GAAG,IAAI,MAAM,KAAK,oBAAoB,KAAK;AAAA,MACtD,WACE,OAAO,UAAU,YACjB,CAAC,aAAa,aAAa,KAAK,EAAE,SAAS,KAAK,GAChD;AACA,iBAAS,GAAG,IAAI,EAAE,UAAU,MAAM;AAAA,MACpC,WAAW,OAAO,UAAU,UAAU;AACpC,iBAAS,GAAG,IAAI,MAAM,KAAK,kBAAkB,OAAO,SAAS;AAAA,MAC/D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,oBAAoB,IAAgC;AACxD,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,QAAI;AACF,YAAM,OAAO,MAAM,OAAO;AAC1B,UAAI;AACJ,UAAI,GAAG,iBAAiB,UAAU;AAChC,cAAM,eAAe,MAAM,KAAK,kBAAkB,GAAG,MAAM,GAAG,KAAK;AACnE,cAAM,MAAM,eAAe,GAAG,KAAK,KAAK,OAAO,KAAK,YAAY,EAC7D,IAAI,CAAC,UAAM,4BAAU,CAAC,CAAC,EACvB,KAAK,IAAI,CAAC,aAAa,OAAO,OAAO,YAAY,EACjD,IAAI,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,EAAE,EACzB,KAAK,IAAI,CAAC,sCAAsC,GAAG,UAAU,GAAG;AACnE,iBAAS,MAAM,OAAO,MAAM,KAAK,OAAO,OAAO,YAAY,CAAC;AAC5D,iBAAS,OAAO,KAAK,CAAC,IAAI,GAAG,UAAU,MAAM;AAC7C,YAAI,CAAC,QAAQ;AACX,mBACE,GAAG,UAAU,GAAG,UAAU,eACtB,aAAa,GAAG,MAAM,IACtB,aAAa,MAAM;AAAA,QAC3B;AAAA,MACF,WAAW,GAAG,iBAAiB,SAAS;AACtC,cAAM,SAAgB,CAAC;AACvB,cAAM,cAAc,KAAK,iBAAiB,GAAG,UAAU,CAAC,GAAG,MAAM;AACjE,cAAM,MAAM,UAAU,GAAG,QAAQ,KAAK,IAAI,KAAK,GAAG,SAAS,GAAG,KAAK,IAAI,WAAW;AAClF,kBAAU,MAAM,OAAO,MAAM,KAAK,MAAM,GAAG,KAAK,CAAC,IAC/C,GAAG,UAAU,MACf;AAAA,MACF;AACA,YAAM,OAAO,MAAM,QAAQ;AAC3B,aAAO,UAAU,CAAC;AAAA,IACpB,SAAS,OAAO;AACd,YAAM,OAAO,MAAM,UAAU;AAC7B,YAAM;AAAA,IACR,UAAE;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,mBACE,IACA,WACA,OACA,eACA,SACA;AACA,UAAM,WACJ,OAAO,UACH,YACA,OAAO,WACL,aACA,OAAO,WACL,YACA,OAAO,WACL,YACA;AAEZ,UAAM,gBAAgB,UAAU,QAAQ,SAAS,UAAU,EAAE,GAAG,SAAS,IAAI,QAAQ;AAErF,UAAM,qBAAqB,UACxB,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AAEV,UAAM,WAAW,KAAK,GAAG,OAAO,CAAC,EAAE,YAAY,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,kBAAkB;AAEnF,mBAAQ;AAAA,MACN;AAAA,MACA,OAAO,SAAoB,SAAc;AACvC,mBAAW,UAAU,OAAO,KAAK,MAAM,eAAe,YAAY,CAAC,CAAC,GAAG;AACrE,gBAAM;AAAA;AAAA,YACJ,MAAM,eAAe,WAAW,MAAM,EAAE;AAAA,cACtC,CAAC,YAAiB,QAAQ;AAAA,YAC5B;AAAA;AACF,qBAAW,oBAAoB,qBAAqB,CAAC,GAAG;AACtD,gBACE,iBAAiB,aACjB,CAAC,iBAAiB,UAAU,OAAO,GACnC;AACA,qBAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,OAAO,wCAAwC,iBAAiB,MAAM;AAAA,cACxE;AAAA,YACF;AAAA,UACF;AAEA,gBAAM;AAAA;AAAA,YACJ,MAAM,eAAe,WAAW,MAAM,EAAE;AAAA,cACtC,CAAC,YAAiB,QAAQ;AAAA,YAC5B;AAAA;AACF,qBAAW,aAAa,oBAAoB,CAAC,GAAG;AAC9C,gBAAI,QAAQ,WAAW;AACrB,sBAAQ,YAAY;AAAA,gBAClB,GAAG,QAAQ;AAAA,gBACX,GAAG;AAAA,cACL;AAAA,YACF,OAAO;AACL,wBAAU;AAAA,gBACR,GAAG;AAAA,gBACH,GAAG;AAAA,cACL;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,QAAQ,aAAa;AAAA,UACvB;AAEA,oBAAU;AAAA,YACR,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAAA,QACF,SAAS,GAAG;AACV,yBAAQ;AAAA,YACN;AAAA,YACA,EAAE,UAAU,OAAO,EAAE;AAAA,YACrB;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAEA,YAAI,CAAC,QAAQ,SAAS;AACpB,qBAAW,UAAU,MAAM,eAAe,YAAY,EAAE,KACrD,CAAC,GAAa;AACf,gBAAI,OAAO,aAAa,CAAC,OAAO,UAAU,OAAO,GAAG;AAClD;AAAA,YACF;AACA,iBAAK,OAAO,UAAU,QAAQ,OAAO;AAAA,UACvC;AAAA,QACF;AAEA,YAAI,cAAc,gBAAgB,QAAQ,SAAS;AACjD,yBAAQ;AAAA,YACN,YAAY,QAAQ;AAAA,YACpB,KAAK,UAAU;AAAA,cACb,MAAM,QAAQ;AAAA,cACd,WAAW,QAAQ;AAAA,cACnB,QAAQ,QAAQ;AAAA,cAChB,QAAQ,QAAQ;AAAA,cAChB,OAAO,QAAQ;AAAA,cACf,MAAM,QAAQ;AAAA,cACd,OAAO,QAAQ;AAAA,cACf,QAAQ,QAAQ;AAAA,cAChB,OAAO,QAAQ;AAAA,YACjB,CAAC;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAEA,eAAO,QAAQ;AACf,eAAO,QAAQ;AACf,eAAO,QAAQ;AACf,eAAO,QAAQ;AACf,eAAO,QAAQ;AACf,eAAO,QAAQ;AACf,eAAO,QAAQ;AACf,eAAO,QAAQ;AAEf,eAAO;AAAA,MACT;AAAA,MACA,CAAC,YACC,SAAS,YAAY,sBACrB,SAAS,sBACT;AAAA,MACF,kBAAkB,EAAE,aAAa,SAAS;AAAA,MAC1C;AAAA,QACE,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB,sBAAsB;AAAA;AAAA,QACtB,aAAa;AAAA;AAAA,UAEX,MAAM;AAAA,UACN,YAAY;AAAA,YACV,QAAQ;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,EACG;AAAA,MACC,GAAI,MAAM,eAAe,WAAW,EAAE,GAAG,IAAI,CAAC,WAAgB;AAC5D,eAAO,OAAO,WAAW,WAAW,SAAS,OAAO;AAAA,MACtD,CAAC,KAAK,CAAC;AAAA,IACT,EACC,MAAM,aAAa,EACnB;AAAA,MACC,GAAI,MAAM,eAAe,YAAY,EAAE,GAAG,IAAI,CAAC,WAAgB;AAC7D,eAAO,OAAO,WAAW,WAAW,SAAS,OAAO;AAAA,MACtD,CAAC,KAAK,CAAC;AAAA,IACT;AAAA,EACJ;AACF;;;AZx3CA,IAAAC,eAA2B;;;Aa3B3B,IAAqB,sBAArB,MAAqB,qBAAoB;AAAA,EAAzC;AAeE,4BAA4B;AAAA;AAAA,EAb5B,WAAkB,WAAgC;AAChD,QAAI,CAAC,KAAK,UAAW,MAAK,YAAY,IAAI,qBAAoB;AAC9D,WAAO,KAAK;AAAA,EACd;AAAA,EAYA,OAAO;AACL,SAAK,oBAAoB,eAAQ;AAAA,MAC/B;AAAA,MACA,iBAAiB,KAAK,MAAM;AAC1B,cAAM,EAAE,SAAS,IAAI;AACrB,YAAI,CAAC,SAAU;AACf,uBAAQ,SAAS,wCAAwC;AAAA,UACvD,SAAS;AAAA,QACX,CAAC;AAED,mBAAW,WAAW,UAAU;AAC9B,cAAI,QAAQ,WAAY;AACxB,gBAAM;AAAA,YACJ,MAAM;AAAA,cACJ,MAAM,QAAQ;AAAA,cACd,SAAS,QAAQ;AAAA,cACjB,aAAa,QAAQ;AAAA,cACrB,aAAa,eAAQ,gBAAgB;AAAA,cACrC,QAAQ,QAAQ;AAAA,YAClB;AAAA,YACA,eAAe,QAAQ;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAE;AAAA,OACC,KAAK,mBACF,eAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,QAAQ,CAAC,QAAQ,WAAW,cAAc;AAAA,YAC1C,QAAQ;AAAA,cACN,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG;AAAA,MACpB,IACA,eAAQ,IAAI,iBAAiB,IAC9B;AAAA,QACD,eAAQ,eAAe,oBAAoB,CAAC,QAAQ;AAClD,cAAI,CAAC,IAAI,WAAW;AAClB;AAAA,UACF;AAEA,yBAAQ,SAAS,wCAAwC;AAAA,YACvD,SAAS;AAAA,UACX,CAAC;AACD,yBAAQ,WAAW,IAAI,aAAa,EAAG,aAAa;AAEpD,iBAAO;AAAA,QACT,CAAC,EAAE;AAAA,UACD,eAAQ;AAAA,YACN;AAAA,YACA,MAAM;AAAA,UACR,EAAE,MAAM,sCAAsC;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAEA,SAAK,uBAAuB,eAAQ;AAAA,MAClC;AAAA,MACA,WAAW,KAAK;AACd,cAAM,EAAE,SAAS,IAAI;AACrB,YAAI,CAAC,SAAU;AACf,uBAAQ,SAAS,wCAAwC;AAAA,UACvD,SAAS;AAAA,QACX,CAAC;AACD,mBAAW,WAAW,UAAU;AAC9B,qBAAW,QAAQ,QAAQ,OAAO;AAChC,gBAAI,CAAC,MAAM;AACT,sBAAQ,IAAI,gBAAgB,SAAS,IAAI;AACzC;AAAA,YACF;AAEA,gBAAI,QAAQ,gBAAgB,IAAI,KAAK,IAAI,EAAG;AAE5C,kBAAM,QAAQ,KAAK,YAAY;AAE/B,mBAAO,MAAM,QAAQ,GAAG;AACtB,oBAAM,WAAW,MAAM,KAAK;AAC5B,oBAAM;AAAA,gBACJ,MAAM;AAAA,kBACJ,UAAU,SAAS;AAAA,kBACnB,aAAa,SAAS;AAAA,kBACtB,aAAa,QAAQ;AAAA,kBACrB,gBAAgB,QAAQ;AAAA,kBACxB,aAAa,eAAQ,gBAAgB;AAAA,gBACvC;AAAA,gBACA,eAAe,QAAQ;AAAA,gBACvB,YAAY,SAAS;AAAA,cACvB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAE;AAAA,OACC,KAAK,mBACF,eAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,QAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,QAAQ;AAAA,cACN,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG;AAAA,MACpB,IACA,eAAQ,IAAI,0BAA0B,IACvC;AAAA,QACD,eAAQ,eAAe,yBAAyB,CAAC,QAAQ;AACvD,cAAI,CAAC,IAAI,WAAW;AAClB;AAAA,UACF;AAEA,yBAAQ,SAAS,wCAAwC;AAAA,YACvD,SAAS;AAAA,UACX,CAAC;AACD,yBAAQ,WAAW,IAAI,aAAa,EAAG,gBAAgB;AAAA,YACrD,IAAI;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,mBAAmB,eAAQ;AAAA,MAC9B;AAAA,MACA,WAAW,KAAK;AACd,uBAAQ,SAAS,wCAAwC;AAAA,UACvD,SAAS;AAAA,QACX,CAAC;AAED,cAAM,EAAE,QAAQ,IAAI;AACpB,YAAI,CAAC,QAAS;AAEd,cAAM,kBAAkB,QACrB;AAAA,UACC,CAAC,WAA0C,CAAC,OAAO,KAAK;AAAA,QAC1D,EACC,IAAI,CAAC,WAA0C,OAAO,MAAM;AAE/D,mBAAW,UAAU,iBAAiB;AACpC,gBAAM,EAAE,QAAQ,UAAU,QAAQ,OAAO,IACvC,oBAAoB,MAAM;AAE5B,gBAAM;AAAA,YACJ,MAAM;AAAA,cACJ,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAE;AAAA,OACC,KAAK,mBACF,eAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,QAAQ,CAAC,MAAM;AAAA,YACf,QAAQ;AAAA,cACN,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG;AAAA,MACpB,IACA,eAAQ,IAAI,wBAAwB,IACrC;AAAA,QACD,eAAQ,eAAe,+BAA+B,CAAC,QAAQ;AAC7D,cAAI,CAAC,IAAI,WAAW;AAClB;AAAA,UACF;AAEA,yBAAQ,SAAS,wCAAwC;AAAA,YACvD,SAAS;AAAA,UACX,CAAC;AAED,iBAAO,EAAE,YAAY,IAAI,SAAS;AAAA,QACpC,CAAC,EAAE;AAAA,UACD,eAAQ,aAAa;AAAA,UACrB,eAAQ;AAAA,YACN;AAAA,YACA,MAAM;AAAA,UACR,EAAE,MAAM,qCAAqC;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAEA,SAAK,4BAA4B,eAAQ;AAAA,MACvC;AAAA,MACA,WAAW,KAAK;AACd,uBAAQ,SAAS,wCAAwC;AAAA,UACvD,SAAS;AAAA,QACX,CAAC;AAED,cAAM,QAAQ,IAAI;AAClB,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,WAAY;AACrB,gBAAM,EAAE,kBAAkB,iBAAiB,IAAI,KAAK,OAAO;AAE3D,gBAAM;AAAA,YACJ,MAAM;AAAA,cACJ,MAAM,KAAK;AAAA,cACX,SAAS,KAAK;AAAA,cACd,aAAa,KAAK;AAAA,cAClB,gBAAgB;AAAA,cAChB,aAAa;AAAA,cACb,YAAY,KAAK;AAAA,cACjB,aAAa,KAAK;AAAA,cAClB,SAAS,KAAK;AAAA,cACd,UAAU,KAAK;AAAA,cACf,UAAU,KAAK;AAAA,cACf,aAAa,KAAK;AAAA,cAClB,YAAY,KAAK;AAAA,cACjB,aAAa,KAAK;AAAA,cAClB,QAAQ,KAAK;AAAA,cACb,WAAW,KAAK;AAAA,cAChB,UAAU,KAAK;AAAA;AAAA,cAEf,sBAAsB,KAAK;AAAA;AAAA,cAE3B,uBAAuB,KAAK;AAAA,cAC5B,YAAY,KAAK;AAAA,cACjB,YAAY,KAAK;AAAA,cACjB,eAAe,KAAK;AAAA,cACpB,kBAAkB,KAAK;AAAA,cACvB,cAAc,eAAQ,gBAAgB;AAAA,cACtC,SAAS;AAAA,gBACP,OAAO,MAAM,KAAK,KAAK,YAAY;AAAA,gBACnC,oBAAoB,MAAM,KAAK,KAAK,kBAAkB;AAAA,gBACtD,qBAAqB,MAAM,KAAK,KAAK,mBAAmB;AAAA,gBACxD,UAAU,MAAM,KAAK,KAAK,eAAe;AAAA,cAC3C;AAAA,YACF;AAAA,YACA,YAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAE;AAAA,OACC,KAAK,mBACF,eAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,QAAQ,CAAC,QAAQ,gBAAgB,SAAS;AAAA,YAC1C,QAAQ;AAAA,cACN,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG;AAAA,MACpB,IACA,eAAQ,IAAI,cAAc,IAC3B;AAAA,QACD,eAAQ,eAAe,uBAAuB,CAAC,QAAQ;AACrD,cAAI,CAAC,IAAI,WAAW;AAClB;AAAA,UACF;AAEA,yBAAQ,SAAS,wCAAwC;AAAA,YACvD,SAAS;AAAA,UACX,CAAC;AAED,yBAAQ,IAAI,IAAI,UAAU,EAAG,aAAa;AAE1C,iBAAO;AAAA,QACT,CAAC,EAAE;AAAA,UACD,eAAQ;AAAA,YACN;AAAA,YACA,MAAM;AAAA,UACR,EAAE,MAAM,mCAAmC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,qBAAqB,eAAQ;AAAA,MACjC;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,CAAC,IAAI,WAAW;AAClB;AAAA,QACF;AAEA,uBAAQ,SAAS,wCAAwC;AAAA,UACvD,SAAS;AAAA,QACX,CAAC;AAED,uBAAQ,IAAI,IAAI,UAAU,GAAG,kBAAkB,IAAI,IAAI,QAAQ;AAAA,MACjE;AAAA,IACF;AAEA,SAAK,8BAA8B,eAAQ;AAAA,MACzC;AAAA,MACA,WAAW,KAAK;AACd,cAAM,OAAO,IAAI;AACjB,YAAI,KAAK,UAAU,CAAC,KAAK,SAAU;AAEnC,mBAAW,UAAU,KAAK,iBAAiB;AACzC,gBAAM,UAAU,OAAO,MAAM,GAAG,EAAE,CAAC;AACnC,cAAI,KAAK,kBAAkB,IAAI,MAAM,EAAG;AAExC,gBAAM,EAAE,SAAS,IAAI,oBAAoB,OAAO;AAEhD,gBAAM;AAAA,YACJ,MAAM;AAAA,cACJ,YAAY;AAAA,cACZ;AAAA,cACA,UAAU,KAAK;AAAA,cACf,aAAa,KAAK;AAAA,cAClB,aAAa,eAAQ,gBAAgB;AAAA,YACvC;AAAA,YACA,YAAY,KAAK;AAAA,YACjB,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAE;AAAA,OACC,KAAK,mBACF,eAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,QAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,QAAQ;AAAA,cACN,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG;AAAA,MACpB,IACA,eAAQ,IAAI,yBAAyB,IACtC,KAAK,kBAAkB;AAAA,IAC5B;AAEA,SAAK,sBAAsB,eAAQ;AAAA,MACjC;AAAA,MACA,WAAW,KAAK;AACd,cAAM,OAAO,IAAI;AACjB,uBAAQ,SAAS,wCAAwC;AAAA,UACvD,SAAS;AAAA,QACX,CAAC;AACD,YAAI,KAAK,UAAU,CAAC,KAAK,SAAU;AAEnC,mBAAW,KAAK,KAAK,WAAW;AAC9B,cAAI,KAAK,oBAAoB,IAAI,EAAE,IAAI,KAAK,EAAE,UAAU,CAAC,EAAE,UAAU;AACnE;AAAA,UACF;AAEA,gBAAM;AAAA,YACJ,MAAM;AAAA,cACJ,UAAU,EAAE;AAAA,cACZ,aAAa,EAAE;AAAA,cACf,qBAAqB,KAAK;AAAA,cAC1B,wBAAwB,KAAK;AAAA,cAC7B,aAAa,eAAQ,gBAAgB;AAAA,cACrC,wBAAwB,eAAQ,gBAAgB;AAAA,YAClD;AAAA,YACA,YAAY,KAAK;AAAA,YACjB,gBAAgB,EAAE;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAE;AAAA,OACC,KAAK,mBACF,eAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,QAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,QAAQ;AAAA,cACN,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG;AAAA,MACpB,IACA,eAAQ,IAAI,iCAAiC,IAC9C;AAAA,QACD,eAAQ,eAAe,gCAAgC,CAAC,QAAQ;AAC9D,cAAI,CAAC,IAAI,WAAW;AAClB;AAAA,UACF;AAEA,yBAAQ,SAAS,wCAAwC;AAAA,YACvD,SAAS;AAAA,UACX,CAAC;AAED,yBAAQ,IAAI,IAAI,UAAU,GAAG,oBAAoB;AAAA,YAC/C,IAAI;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,iCAAiC,eAAQ;AAAA,MAC5C;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,OAAO,IAAI;AACjB,YAAI,KAAK,UAAU,CAAC,KAAK,SAAU;AAEnC,YAAI,KAAK,YAAY,CAAC,KAAK,YAAY;AACrC,cAAI,KAAK,oBAAqB;AAE9B,iBAAO;AAAA,YACL,MAAM;AAAA,cACJ,WAAW,KAAK;AAAA,cAChB,cAAc;AAAA,cACd,cAAc,KAAK;AAAA,cACnB,uBAAuB,KAAK;AAAA,cAC5B,0BAA0B,KAAK;AAAA,cAC/B,0BAA0B,eAAQ,gBAAgB;AAAA,YACpD;AAAA,YACA,YAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAE;AAAA,OACC,KAAK,mBACF,eAAQ;AAAA,QACN;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,QAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,QAAQ;AAAA,cACN,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG;AAAA,MACpB,IACA,eAAQ,IAAI,iCAAiC,IAC9C;AAAA,QACD,eAAQ;AAAA,UACN;AAAA,UACA,CAAC,QAAQ;AACP,gBAAI,CAAC,IAAI,WAAW;AAClB;AAAA,YACF;AAEA,2BAAQ,SAAS,wCAAwC;AAAA,cACvD,SAAS;AAAA,YACX,CAAC;AAED,YAAC,eAAQ,IAAI,IAAI,UAAU,EAAiB,sBAC1C;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,mBAAQ,aACL,eAAgB,MAAM,EACtB,KAAK,kCAAkC,qBAAqB,EAC5D,KAAK,KAAK,gBAAgB;AAE7B,mBAAQ,SACL,YAAa,MAAM,EACnB,KAAK,qCAAqC,EAC1C,KAAK,KAAK,yBAAyB;AAEtC,mBAAQ,SACL,eAAgB,MAAM,EACtB,KAAK,mCAAmC,EACxC,KAAK,KAAK,iBAAiB;AAE9B,mBAAQ,SACL,cAAe,MAAM,EACrB,KAAK,mCAAmC,EACxC;AAAA,MACC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEF,mBAAQ,SACL,eAAgB,MAAM,EACtB,KAAK,sCAAsC,EAC3C,KAAK,KAAK,oBAAoB;AAEjC,mBAAQ,eAAe,eAAe,CAAC,KAAK,SAAS;AACnD,WAAK,sCAAsC;AAAA,QACzC,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,mBAAmB;AAAA,UACnB,YAAY;AAAA,UACZ,aAAa,gBAAgB,KAAK,IAAI,CAAC;AAAA,QACzC;AAAA,QACA,QAAQ;AAAA,UACN,MAAM,eAAQ,gBAAgB;AAAA,QAChC;AAAA,MACF,CAAC;AAED,qBAAQ,IAAI,qBAAqB;AAAA,IACnC,CAAC,EACE,aAAa,oCAAoC,EACjD,KAAK,sCAAsC;AAE9C,QAAI,CAAC,KAAK,kBAAkB;AAC1B,qBAAQ;AAAA,QACN;AAAA,QACA,EAAE,WAAW,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,qBAAQ;AAAA,QACN;AAAA,QACA,EAAE,WAAW,KAAK;AAAA,QAClB;AAAA,MACF;AACA,qBAAQ,SAAS,uBAAuB,EAAE,WAAW,KAAK,GAAG,GAAI;AAAA,IACnE;AAAA,EACF;AACF;;;Ab9eA,IAAqB,iBAArB,MAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBlC,OAAO,YAAkB;AACvB,QAAI,KAAK,eAAgB;AACzB,SAAK,iBAAiB;AAEtB,iBAAAC,QAAQ,UAAU;AAClB,SAAK,eAAe,aAAAA,QAAQ;AAC5B,SAAK,gBAAgB,aAAAA,QAAQ;AAC7B,SAAK,SAAS,aAAAA,QAAQ;AACtB,SAAK,aAAa,aAAAA,QAAQ;AAC1B,SAAK,WAAW,aAAAA,QAAQ;AACxB,SAAK,kBAAkB,gBAAgB;AACvC,qBAAiB;AACjB,mBAAe;AACf,qBAAiB;AACjB,YAAQ,IAAI,cAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAiB,oBAAoB,aAAqB;AACxD,QAAI,YAAY,SAAS,KAAK;AAC5B,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,QAAI,YAAY,SAAS,GAAG,GAAG;AAC7B,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,QAAI,YAAY,SAAS,GAAG,GAAG;AAC7B,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,QAAI,YAAY,SAAS,IAAI,GAAG;AAC9B,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,QACE,YAAY,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,YAAY,KAC5D,YAAY,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,EAAE,YAAY,GAC5D;AACA,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAiB,aAAa,MAAoB;AAChD,iBAAAA,QAAQ,aAAa,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAkB,cAAc;AAC9B,WAAO,aAAAA,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAc,QAAQ,MAAmB;AACvC,iBAAAA,QAAQ,QAAQ,IAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,KAAK,QAAgB,OAAkB,CAAC,GAAG,UAAuB,CAAC,GAAG;AAC3E,iBAAAA,QAAQ,KAAK,QAAQ,MAAM,OAAO;AAAA,EACpC;AAAA,EAEA,OAAO,SAAS,QAAgB,UAAe,CAAC,GAAG,UAAkB,KAAK;AACxE,iBAAAA,QAAQ,SAAS,QAAQ,SAAS,OAAO;AAAA,EAC3C;AAAA,EAEA,OAAc,SACZ,QACA,SACA,WACA,eACA;AACA,iBAAAA,QAAQ,SAAS,QAAQ,SAAS,WAAW,aAAa;AAAA,EAC5D;AAAA,EAEA,OAAc,SACZ,QACA,SACA,YACA,UAAU,OACV,eACA;AACA,iBAAAA,QAAQ,SAAS,QAAQ,SAAS,YAAY,SAAS,aAAa;AAAA,EACtE;AAAA,EAEA,OAAc,aAAa,QAAwB;AACjD,SAAK,eAAe,QAAQ,IAAI,OAAO,MAAM,MAAM;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,aAAoB,QAClB,SACA,SACA,SACoB;AACpB,WAAO,KAAK,eAAe,QAAQ,SAAS,SAAS,OAAO;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,IAAI,MAA2B,SAAoB;AACxD,SAAK,QAAQ,IAAI,MAAM,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,IACL,SACA,OAAY,CAAC,GACb,QAAmD,QACnD,qBAAoC,MACpC,2BAA0C,MAC1C;AACA,QAAI,UAAU,YAAY;AACxB,cAAQ,MAAM,aAAa,SAAS,IAAI;AAAA,IAC1C,WAAW,UAAU,SAAS;AAC5B,cAAQ,MAAM,SAAS,IAAI;AAAA,IAC7B,WAAW,UAAU,WAAW;AAC9B,cAAQ,KAAK,SAAS,IAAI;AAAA,IAC5B,OAAO;AACL,cAAQ,IAAI,SAAS,IAAI;AAAA,IAC3B;AAEA,SAAK,KAAK,8BAA8B;AAAA,MACtC,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,KAAK,iBAAiB;AAAA,QACnC,mBAAmB,KAAK,iBAAiB;AAAA,QACzC;AAAA,QACA;AAAA,QACA,SAAS,gBAAgB,KAAK,IAAI,CAAC;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAc,IAAI,UAAoC;AACpD,WAAO,aAAAA,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AAAA,EAEA,OAAc,WAAW,aAA+C;AACtE,WAAO,aAAAA,QAAQ,WAAW,WAAW;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyDA,OAAO,iBACL,aACA,cAAkC,QAClC,UAAuB,CAAC,GACZ;AACZ,SAAK,UAAU;AACf,SAAK,aAAa,WAAW;AAC7B,UAAM,OAAO,GAAG,WAAW;AAE3B,cAAU;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,cAAc;AAAA,MACd,uBAAuB;AAAA,MACvB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,GAAG;AAAA,IACL;AAEA,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,mCAAmC,WAAW,gBAAgB,WAAW;AAAA,MACzE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,qBACL,aACA,cAAkC,QAClC,UAAuB,CAAC,GACZ;AACZ,YAAQ,SAAS;AACjB,WAAO,KAAK,iBAAiB,aAAa,aAAa,OAAO;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,0BACL,aACA,cAAkC,QAClC,oBAAuC,MAAM,WAC7C,UAAuB,CAAC,GACxB;AACA,YAAQ,cAAc;AACtB,YAAQ,iBAAiB;AACzB,WAAO,KAAK,iBAAiB,aAAa,aAAa,OAAO;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,8BACL,aACA,cAAkC,QAClC,oBAAuC,MAAM,WAC7C,UAAuB,CAAC,GACxB;AACA,YAAQ,SAAS;AACjB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,6BACL,YACA,aACA,UAAuB,CAAC,GACY;AACpC,SAAK,UAAU;AACf,SAAK,aAAa,UAAU;AAC5B,SAAK,aAAa,WAAW;AAE7B,cAAU;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,cAAc;AAAA,MACd,uBAAuB;AAAA,MACvB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,GAAG;AAAA,IACL;AAEA,YAAQ,SAAS;AAEjB,UAAM,OAAO,oBAAoB,UAAU,OAAO,WAAW;AAC7D,QAAI,KAAK,IAAI,IAAI,GAAG;AAClB;AAAA,IACF;AAEA,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB,UAAU,OAAO,WAAW;AAAA,MAChD,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,mBACL,WACA,WACA,sBAA0C,QAC1C,WACA,UAAuB,CAAC,GACxB;AACA,SAAK,UAAU;AACf,SAAK,aAAa,SAAS;AAC3B,SAAK,aAAa,SAAS;AAC3B,UAAM,qBAAqB,UACxB,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AACV,UAAM,OAAO,GAAG,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC,CAAC,IAAI,SAAS,OAAO,uBAAuB,0BAA0B;AAC3I,UAAM,cAAc,cAAc,SAAS,aAAa,SAAS,OAAO,uBAAuB,0BAA0B;AACzH,UAAM,WAAW,KAAK,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC,CAAC,GAAG,kBAAkB;AAEjG,cAAU;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,cAAc;AAAA,MACd,uBAAuB;AAAA,MACvB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,GAAG;AAAA,IACL;AAEA,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,yBACL,WACA,sBAA0C,QAC1C,YAAgC,CAAC,GACjC,UAAuB,CAAC,GACxB;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,wBACL,WACA,sBAA0C,QAC1C,WACA,UAAuB,CAAC,GACxB;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,oBACL,WACA,WACA,WACA,UAAuB,CAAC,GACxB;AACA,YAAQ,SAAS;AACjB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,0BACL,WACA,YAAgC,CAAC,GACjC,UAAuB,CAAC,GACxB;AACA,YAAQ,SAAS;AACjB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,yBACL,WACA,WACA,UAAuB,CAAC,GACxB;AACA,YAAQ,SAAS;AACjB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,qBACL,aACA,cAAsB,IACtB,UAAyB,CAAC,GAC1B;AACA,QAAI,KAAK,eAAgB;AACzB,SAAK,UAAU;AACf,SAAK,aAAa,WAAW;AAC7B,SAAK,oBAAoB,WAAW;AAEpC,UAAM,YAAY,QAAQ,uBAAmB,aAAAC,IAAK;AAClD,SAAK,gBAAgB,cAAc;AACnC,SAAK,gBAAgB,oBAAoB;AAEzC,cAAU;AAAA,MACR,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,SAAS,QAAQ,IAAI,aAAa,MAAM;AAAA,MAC9C,iBACG,QAAQ,IAAI,oBAAwC;AAAA,MACvD,aAAc,QAAQ,IAAI,gBAAgC;AAAA,MAC1D,YAAY;AAAA,MACZ,WAAW;AAAA,QACT,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,sBAAsB;AAAA,QAC3C,MAAM,SAAS,QAAQ,IAAI,mBAAmB,MAAM;AAAA,MACtD;AAAA,MACA,iBAAiB,QAAQ,IAAI,mBACzB,QAAQ,IAAI,iBAAiB,MAAM,GAAG,EAAE;AAAA,QAAI,CAAC,MAC3C,EAAE,KAAK,EAAE,MAAM,GAAG;AAAA,MACpB,IACA,CAAC;AAAA,MACL,YAAY;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,QAAI,QAAQ,WAAW,SAAS;AAC9B,WAAK,KAAK,6BAA6B;AAAA;AAAA,QAErC,iBAAiB;AAAA,UACf,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS,QAAQ,WAAW;AAAA,UAC5B,MAAM,QAAQ,WAAW;AAAA,UACzB,SAAS,QAAQ,gBAAgB;AAAA,UACjC,uBAAuB;AAAA,UACvB,UAAU;AAAA;AAAA,UACV,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,QAAQ,CAAC;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAEA,YAAQ,iBAAiB,QAAQ,CAAC,YAAY;AAC5C,WAAK,KAAK,6BAA6B;AAAA,QACrC,iBAAiB;AAAA,UACf,MAAM,QAAQ,CAAC;AAAA,UACf,aAAa,QAAQ,CAAC;AAAA,UACtB,SAAS,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,UAChC,MAAM,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,UAClC,SAAS,QAAQ,gBAAgB;AAAA,UACjC,uBAAuB;AAAA,UACvB,UAAU;AAAA;AAAA,UACV,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,QAAQ,CAAC;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,YAAQ,IAAI,qBAAqB;AAEjC,UAAM,cAAc;AAAA,MAClB,MAAM;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,aAAa,QAAQ,eAAe;AAAA,QACpC,QAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,eAAe,QAAQ;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,mBAAmB,QAAQ;AAAA,MAC3B,eAAe,QAAQ;AAAA,MACvB,cAAc,QAAQ;AAAA,MACtB,oBAAoB,QAAQ,WAAW;AAAA,MACvC,cAAc,QAAQ;AAAA,IACxB;AAEA,QAAI,QAAQ,WAAW,SAAS;AAC9B,WAAK,wBAAwB,kBAAkB,OAAO,SAAS,SAAS;AACtE,aAAK,iCAAiC,WAAW;AAAA,MACnD,CAAC,EAAE,KAAK,+BAA+B;AAAA,IACzC,OAAO;AACL,WAAK,KAAK,iCAAiC,WAAW;AACtD,WAAK,eAAe,uCAAuC,CAAC,QAAQ;AAClE,aAAK;AAAA,UACH;AAAA,UACA,IAAI;AAAA,QACN;AAAA,MACF,CAAC,EAAE,KAAK,qBAAqB;AAAA,IAC/B;AAEA,SAAK,eAAe,mCAAmC,MAAM;AAC3D,8BAAwB;AACxB,0BAAoB,SAAS,mBAC3B,CAAC,CAAC,QAAQ,WAAW;AACvB,0BAAoB,SAAS,KAAK;AAElC,WAAK,IAAI,kBAAkB;AAE3B,aAAO;AAAA,IACT,CAAC,EAAE,KAAK,yCAAyC;AAEjD,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,yBACL,aACA,aACA,UAAyB,CAAC,GAC1B;AACA,YAAQ,SAAS;AACjB,SAAK,qBAAqB,aAAa,aAAa,OAAO;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,sBACL,MACA,QACA,cAAsB,IACtB,UAA2C,CAAC,GAC5C;AACA,QAAI,WAAW;AACb,cAAQ;AAAA,QACN;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,KAAK,eAAgB;AACzB,SAAK,UAAU;AACf,SAAK,gBAAgB,cAAc;AACnC,uBAAmB;AAEnB,cAAU;AAAA,MACR,aAAa;AAAA,MACb,WAAW;AAAA,MACX,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,SAAS,QAAQ,IAAI,aAAa,MAAM;AAAA,MAC9C,iBACG,QAAQ,IAAI,oBAAwC;AAAA,MACvD,aAAc,QAAQ,IAAI,gBAAgC;AAAA,MAC1D,YAAY;AAAA,MACZ,WAAW;AAAA,QACT,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,sBAAsB;AAAA,QAC3C,MAAM,SAAS,QAAQ,IAAI,mBAAmB,MAAM;AAAA,MACtD;AAAA,MACA,cAAc;AAAA,MACd,kBAAc,6BAAU,IAAI;AAAA,MAC5B,UAAU,SAAS,QAAQ,IAAI,sBAAsB,IAAI;AAAA,MACzD,YAAY;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,YAAQ,IAAI,6BAA6B,OAAO;AAEhD,SAAK,KAAK,gCAAgC;AAAA,MACxC;AAAA,MACA,cAAc,QAAQ;AAAA,MACtB;AAAA,IACF,CAAC;AAED,SAAK,eAAe,2BAA2B,MAAM;AACnD,WAAK,eAAe,2BAA2B,CAAC,GAAG,SAAS;AAC1D,aAAK,wCAAwC;AAAA,UAC3C,MAAM;AAAA,YACJ,cAAc;AAAA,YACd;AAAA,YACA;AAAA,YACA,SAAS,QAAQ;AAAA,UACnB;AAAA,QACF,CAAC;AACD,aAAK,IAAI,4BAA4B;AAAA,UACnC;AAAA,UACA,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH,CAAC,EAAE,KAAK,wCAAwC;AAEhD,WAAK,qBAAqB,MAAM,aAAa,OAAO;AAAA,IACtD,CAAC,EAAE,KAAK,0BAA0B;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,0BACL,MACA,QACA,cAAsB,IACtB,UAA2C,CAAC,GAC5C;AACA,SAAK,UAAU;AACf,YAAQ,SAAS;AACjB,SAAK,sBAAsB,MAAM,QAAQ,aAAa,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwEA,OAAO,WACL,MACA,MACA,aACA,UAAuB,CAAC,GAClB;AACN,SAAK,UAAU;AACf,WAAO,aAAAD,QAAQ,WAAW,MAAM,MAAM,aAAa,OAAO;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,eACL,MACA,MACA,aACA,UAAuB,CAAC,GAClB;AACN,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ,eAAe,MAAM,MAAM,aAAa,OAAO;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgDA,OAAO,iBACL,MACA,MACA,aACA,UAAuB,CAAC,GAClB;AACN,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ,iBAAiB,MAAM,MAAM,aAAa,OAAO;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,qBACL,MACA,MACA,aACA,UAAuB,CAAC,GAClB;AACN,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ,qBAAqB,MAAM,MAAM,aAAa,OAAO;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,OAAO,oBACL,MACA,MACA,oBAAuC,MAAM,WAC7C,aACA,UAAuB,CAAC,GAClB;AACN,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,wBACL,MACA,MACA,oBAAuC,MAAM,WAC7C,aACA,UAAuB,CAAC,GAClB;AACN,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,OAAO,mBACL,MACA,MACA,aACA,eAAuB,KACvB,UAAyC,CAAC,GAC5B;AACd,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,uBACL,MACA,MACA,aACA,eAAuB,KACvB,UAAyC,CAAC,GAC5B;AACd,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8DA,OAAO,oBACL,MACA,MACA,aACA,UAA8C,CAAC,GAChC;AACf,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ,oBAAoB,MAAM,MAAM,aAAa,OAAO;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,wBACL,MACA,MACA,aACA,UAA8C,CAAC,GAChC;AACf,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ,wBAAwB,MAAM,MAAM,aAAa,OAAO;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,OAAO,cACL,MACA,OACA,cAAsB,IACR;AACd,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ,cAAc,MAAM,OAAO,WAAW;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,kBACL,MACA,OACA,cAAsB,IACR;AACd,SAAK,UAAU;AACf,WAAO,aAAAA,QAAQ,kBAAkB,MAAM,OAAO,WAAW;AAAA,EAC3D;AAAA,EAEA,OAAO,QAAQ;AACb,iBAAAA,QAAQ,MAAM;AACd,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AACF;AAz2CqB,eAOF,iBAAiB;AAPf,eAQF,iBAAiB;;;AD3EpC,IAAAE,eAKO;AA+BP,IAAO,gBAAQ;","names":["import_core","uuid","uuid","ctx","import_core","import_uuid","uuid","fetch","express","bodyParser","helmet","cors","ctx","http","fs","https","import_rate_limiter_flexible","import_socket","ctx","import_lodash_es","import_uuid","Cadenza","uuid","import_core"]}
|