@nsshunt/stsrunnerframework 2.0.4 → 2.0.5
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stsrunnerframework.umd.js","names":["#options","#workerId","#logMessage","#runners","#debug","#archiveDeleteTimeout","#processLoopExecutor","#error","#PostMessageToWorkerManagerByRunnerId","#collectorCollectorPort","#silly","#UpdateRunnerStateByRunnerId","#warn","#CreateRunnerEx2RunState","#SendRunnerCommandResponse","#GetRunnerInstanceByRunnerId","#GetRunnerExecutionProfileByRunnerId","#GetRunnerIterationByRunnerId","#CanExecuteNextIterationByRunnerId","#IsCompletedByRunnerId","#IncRunnerIterationByRunnerId","#SleepImmediate","#StopRunnerByRunnerId","#ResetRunnerIterationByRunnerId","#GetRunnerOptionsByRunnerId","#SetRunnerOptionsByRunnerId","#SetMessagePort","#AddRunner","#StartRunner","#StopRunner","#TerminateRunner","#PauseRunner","#ResumeRunner","#ResetRunner","#ExecuteRunner","#UpdateRunner","#PostRunnersToWorkerManager","native","#workerEx","#messageBroker","#sendRunnerCommand","#options","#messageBroker","#workerRegistry","#asyncRunnerInstanceManager","#logger","#addRunnerToWorker","#sendRunnerCommand","#invokeCommand","#id","#options","#workerRegistry","#STSInstrumentController","#messageBroker","#asyncRunnerInstanceManager","#archiveManager","#workerInstanceManager","#runnerLifecycleManager","#workerStateSynchroniser","#workerCommandCoordinator","#logMessage","#debug","#error"],"sources":["../src/commonTypes.ts","../node_modules/detect-node/browser.js","../node_modules/color-name/index.js","../node_modules/color-convert/conversions.js","../node_modules/color-convert/route.js","../node_modules/color-convert/index.js","../node_modules/ansi-styles/index.js","../node_modules/supports-color/browser.js","../node_modules/chalk/source/util.js","../node_modules/chalk/source/templates.js","../node_modules/chalk/source/index.js","../src/abstractRunnerExecutionWorker.ts","../node_modules/uuid/dist/stringify.js","../node_modules/uuid/dist/rng.js","../node_modules/uuid/dist/native.js","../node_modules/uuid/dist/v4.js","../node_modules/lodash.merge/index.js","../src/messageBroker.ts","../src/runnerInstance.ts","../src/asyncRunnerInstanceManager.ts","../src/archiveManager.ts","../src/workerInstance.ts","../src/workerInstanceMannager.ts","../src/workerRegistry.ts","../src/telemetryProcessor.ts","../src/runnerLifecycleManager.ts","../src/workerStateSynchroniser.ts","../src/workerCommandCoordinator.ts","../src/workerManager.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { MessagePort } from 'node:worker_threads';\n\nimport { PublishInstrumentController, IContextBase } from '@nsshunt/stsinstrumentmanagerclient'\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\nexport interface IAsyncRunnerContext extends IContextBase {\n\tid: string\n\thostName: string\n\tagentName: string\n\tthreadId: string\n\t//@@ asyncRunnerId: number ??\n}\n\n/**\n * Inter-Worker (IW) Payload context base.\n */\nexport interface IIWMessagePayloadContentBase {\n messageId: string\n}\n\n/**\n * Inter-Worker (IW) message commands.\n */\nexport enum eIWMessageCommands {\n\tInstrumentTelemetry ='__STS__InstrumentTelemetry', // Used to send instrument telemetry\n\n\tMessagePort = '__STS__MessagePort',\n\tMessagePortResponse = '__STS__MessagePortResponse',\n\n\tAddRunner = '__STS__AddRunner',\n\tAddRunnerResponse = '__STS__AddRunnerResponse',\n\n\tStartRunner = '__STS__StartRunner',\n\tStartRunnerResponse = '__STS__StartRunnerResponse',\n\n\tStopRunner = '__STS__StopRunner',\n\tStopRunnerResponse = '__STS__StopRunnerResponse',\n\n\tPauseRunner = '__STS__PauseRunner',\n\tPauseRunnerResponse = '__STS__PauseRunnerResult',\n\n\tResumeRunner = '__STS__ResumeRunner',\n\tResumeRunnerResponse = '__STS__ResumeRunnerResponse',\n\n\tResetRunner = '__STS__ResetRunner',\n\tResetRunnerResponse = '__STS__ResetRunnerResponse',\n\n\tExecuteRunner = '__STS__ExecuteRunner',\n\tExecuteRunnerResponse = '__STS__ExecuteRunnerResponse',\n\n\tCompleted = '__STS__Completed',\n\n\tUpdateRunner = '__STS__UpdateRunner',\n\tUpdateRunnerResponse = '__STS__UpdateRunnerResponse',\n\n\tTerminateRunner = '__STS__TerminateRunner',\n\tTerminateRunnerResponse = '__STS__TerminateRunnerResponse',\n\n\tRunnerStateChange = '__STS__RunnerStateChange',\n\n\tGetRunners = '__STS__GetRunners',\n\tGetRunnersResponse = '__STS__GetRunnersResponse'\n}\n\n/**\n * Inter-Worker (IW) message command.\n */\nexport type IIWMessageCommand = eIWMessageCommands\n\n/**\n * Inter-Worker (IW) message payload.\n */\nexport interface IIWMessagePayload {\n command: IIWMessageCommand\n payload: IIWMessagePayloadContentBase\n}\n\nexport interface ISTSAgentWorkerMessagePort extends IIWMessagePayloadContentBase {\n port: MessagePort\n options: IWorkerOptions\n\tworkerId: string\n}\n\nexport interface ISTSGetRunnersPayload extends IIWMessagePayloadContentBase {\n\tworkerId: string\n\trunners: IRunner[]\n}\n\nexport enum IRunnerState {\n\tcreated = 'created',\n\trunning = 'running',\n\tpaused = 'paused',\n\tcompleted = 'completed',\n\tstopped = 'stopped',\n\tterminated = 'terminated',\n\terror = 'error'\n}\n\nexport interface IRunnerTelemetry {\n\trequestCount: number // requestCount\n\terrorCount: number\n\tretryCount: number\n\tauthenticationCount: number\n\tauthenticationErrorCount: number\n\tauthenticationRetryCount: number\n\tvelocity: number\n\tcoreCount: number\n\ttimer: number\n\tduration: number\n\tlatency: number\n\tactiveRequestCount: number\n\tmessage: string[]\n\tchildCount: number\n\trx: number\n\ttx: number\n}\n\nexport interface IRunnerHistoryRecord {\n\teventDate: Date\n\trunner: IRunner\n}\n\nexport interface IRunnerPlan {\n\tid: string // Unique ID for this plan (uuidv4)\n\tplan: string // Human readable plan name (for drop-down, select lists, logging, etc.)\n\tplanInstanceId: string // unique instance ID (uuidv4) for this runner being exected within a plan\n\tstage: number // 0 based stage number within a plans execution\n\tplanVU: number // The plan virtual user identifer. When a plan executed, the VU number will start from 0 and increase as VUs are added.\n}\n\nexport interface ISTSRunner {\n\tget id(): string\n\tget workerId(): string\n\tget workerManagerId(): string\n\tget state(): IRunnerState\n\tget iteration(): number\n\tget asyncRunnerContext(): IAsyncRunnerContext\n\tget options(): IRunnerOptions\n\tset options(options: IRunnerOptions)\n\tget instrumentData(): IRunnerTelemetry\n\tset instrumentData(newRunnerTelemetry: IRunnerTelemetry)\n\tget runnerHistory(): IRunnerHistoryRecord[] | undefined\n}\n\nexport interface IRunner {\n\tget id(): string\n\tget workerId(): string\n\tget workerManagerId(): string\n\tstate: IRunnerState\n\titeration: number\n\tget asyncRunnerContext(): IAsyncRunnerContext\n\tget options(): IRunnerOptions\n\tset options(options: IRunnerOptions)\n\tget instrumentData(): IRunnerTelemetry\n\tset instrumentData(newRunnerTelemetry: IRunnerTelemetry)\n\trunnerHistory?: IRunnerHistoryRecord[]\n}\n\nexport interface IRunnerCore {\n\tget id(): string\n\titeration: number\n\tstate: IRunnerState\n\trunnerPlan?: IRunnerPlan\n}\n\nexport interface IRunnerEx {\n id: string\n workerId: string\n workerManagerId: string\n state: IRunnerState\n iteration: number\n options: IRunnerOptions\n asyncRunnerContext: IAsyncRunnerContext\n publishInstrumentController?: PublishInstrumentController\n instrumentData: IRunnerTelemetry\n runnerHistory: IRunnerHistoryRecord[]\n archived: boolean\n\n Start(): Promise<IExecuteRunnerActionResult>\n Stop(): Promise<IExecuteRunnerActionResult>\n Pause(): Promise<IExecuteRunnerActionResult>\n Resume(): Promise<IExecuteRunnerActionResult>\n Reset(): Promise<IExecuteRunnerActionResult>\n Execute(): Promise<IExecuteRunnerActionResult>\n Terminate(): Promise<IExecuteRunnerActionResult>\n Update(options: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult>\n\n on(eventName: string, cb: (args?: any) => void): IRunnerEx\n\n toJSON(): IRunner\n toRunner(includeHistory?: boolean): IRunner\n toRunnerCore(): IRunnerCore\n}\n\nexport interface IRunnerInstance {\n\tStartRunner: () => Promise<any>\n\tStopRunner: () => Promise<any>\n\tPauseRunner: () => Promise<any>\n\tResumeRunner: () => Promise<any>\n\tTerminateRunner: () => Promise<any>\n\tResetRunner: () => Promise<any>\n\tExecuteRunner: () => Promise<any> // Execute a single iteration for this test\n\tUpdateRunner: (runnerOptions: Partial<IRunnerOptions>) => Promise<any>\n\tCompleted: () => Promise<any>\n}\n\nexport enum IWorkerState {\n\tstarting = 'starting', // worker is starting up (very short state transition from this to started)\n\tstarted = 'started', // worker has been started and is currently running\n\tstopped = 'stopped', // workers has been stopped\n\tpaused = 'paused', // worker has been paused\n\terror = 'error' // worker has stopped in an error state\n}\n \nexport interface IWorkerOptions {\n hostName: string\n agentId: string\n userAgent: string\n\tmocked: boolean // true if this worker is mocked (i.e. in the same thread as the running thread - not using workers)\n\ttags: string[]\n\tuserData: any\n\tlogLevel: number // 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n}\n\nexport type IRunners = Record<string, IRunner>\n\nexport interface IWorkerCore {\n\tid: string,\n\trunners: Record<string, IRunnerCore>\n}\n\nexport interface IWorker {\n\tid: string\n\toptions: IWorkerOptions\n\tworkerManagerId: string\n\trunners?: IRunners // Will be created by utility helper\n\tstate?: IWorkerState // This should be a computed state based on the runners within this worker\n}\n\nexport type IWorkers = Record<string, IWorker>\n\n// If both iterations and duration are 0, run continuously until stop using the API.\nexport interface IExecutionProfile {\n iterations: number // Number of iterations to execute per runner. 0 = do not consider iterations.\n\tduration: number // Number of seconds to run per runner. 0 = do not consider duration.\n\tdelayBetweenIterations: number // Number of ms to delay between iterations\n\tpauseOnComplete: boolean // When either the iterations or the duration is hit, the runner will pause instead of being set to complete.\n}\n\n// default signals that already exist are\n// state change\n// completed\n// telemetry publish - @@ check if we can force publish ??\nexport enum IRunnerSignalType {\n\t'duration' = 'duration', // Signal the manager when any of the duration conditions are satisfied.\n\t'iteration' = 'iteration', // Signal the manager when any of the iteration conditions are satisfied.\n\t'log' = 'log', // Signal the manager when any log event occurs - a level 1-5 - 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n\t'user' = 'user' // The test runner code itself can signal the worker manager manually in code.\n}\n\n// Signal run-time objects\n\nexport interface IRunnerSignalBase {\n\trunner: IRunner\n}\n\nexport interface IRunnerSignalDuration extends IRunnerSignalBase {\n\tduration: number\n}\n\nexport interface IRunnerSignalIteration extends IRunnerSignalBase {\n\titeration: number\n}\n\nexport interface IRunnerSignalLog extends IRunnerSignalBase {\n\terror: any\n}\n\nexport interface IRunnerSignalUser extends IRunnerSignalBase {\n\tdata: any\n}\n\n// Object that is passed as the signal event\nexport interface IRunnerSignal {\n\ttype: IRunnerSignalType\n\tdata: IRunnerSignalDuration | IRunnerSignalIteration | IRunnerSignalLog | IRunnerSignalUser\n}\n\n// Signal configurations\n\nexport interface IRunnerSignalDurationConfig {\n\tevery?: number[] // Fire the duration signal every [every] ms\n\tat?: number[] // Fire the at duration signal at a sepcific duration from the start\n}\n\nexport interface IRunnerSignalIterationConfig {\n\tevery?: number[] // Fire the iteration signal every x number of iterations (i.e. when iteration % every = 0)\n\tat?: number[] // Fire the at iteration signal at the sepcific iteration(s)\n}\n\nexport interface IRunnerSignalErrorConfig {\n\tlogLevel: number // 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n}\n\nexport interface IRunnerSignalUserConfig {\n\tconfig: any\n}\n\nexport type IRunnerSignalConfigs = IRunnerSignalConfig[];\n\nexport interface IRunnerSignalConfig {\n\ttype: IRunnerSignalType\n\tdata: IRunnerSignalDurationConfig | IRunnerSignalIterationConfig | IRunnerSignalErrorConfig | IRunnerSignalUserConfig\n}\n\nexport interface IRunnerOptions {\n\ttestType: string\n\tdescription: string\n\texecutionProfile: IExecutionProfile\n\ttag: string[]\n\tuserData: any\n\trunnerPlan?: IRunnerPlan\n\trunnerSignals?: IRunnerSignalConfigs\n}\n\nexport interface IRunnerEvent {\n\teventName: string\n\tcb: (args?: any) => void\n}\n\nexport interface IWorkerEvent {\n\teventName: string\n\tcb: (args?: any) => void\n}\n\nexport interface IWorkerEx {\n id: string\n workerManagerId: string\n worker: any\n messagePort: any\n options: IWorkerOptions\n workerEvents: IWorkerEvent[]\n runnersEvents: Record<string, IRunnerEvent[]>\n\n AddRunnerEx(runnerEx: IRunnerEx): void\n GetRunnerEx(id: string): IRunnerEx | null\n GetAllRunnersEx(): IRunnerEx[]\n GetAllRunnersExMap(): Record<string, IRunnerEx>\n GetRunnersEx(runnerIds: string[]): IRunnerEx[]\n AddRunner(runnerOptions: IRunnerOptions): Promise<IRunnerEx>\n\n StartRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n StopRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n PauseRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n ResumeRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n TerminateRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n ResetRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n ExecuteRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n\n UpdateRunner(\n runner: IRunnerEx,\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult>\n\n Start(): Promise<IExecuteRunnerActionResult[]>\n Stop(): Promise<IExecuteRunnerActionResult[]>\n Pause(): Promise<IExecuteRunnerActionResult[]>\n Resume(): Promise<IExecuteRunnerActionResult[]>\n Reset(): Promise<IExecuteRunnerActionResult[]>\n Execute(): Promise<IExecuteRunnerActionResult[]>\n Terminate(): Promise<IExecuteRunnerActionResult[]>\n\n Update(\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]>\n\n on(eventName: string, cb: (args?: any) => void): IWorkerEx\n\n toJSON(): IWorker\n toWorker(): IWorker\n toWorkerCore(states?: IRunnerState[]): IWorkerCore\n}\n\nexport interface ISTSTestWorkerOptions {\n iterations: number\n}\n\nexport interface ITelemetryStore {\n\tworkers: IWorkers\n}\n\nexport interface ITestRunnerTelemetryPayload extends IIWMessagePayloadContentBase {\n\trunner: IRunner\n}\n\nexport interface ITestRunnerTelemetryPayloadResponse extends ITestRunnerTelemetryPayload {\n\texecuteRunnerActionResult: IExecuteRunnerActionResult\n}\n\nexport interface IWorkerFactory {\n\tcreateWorkerThreadWorker: () => any // | wt.Worker\n}\n\nexport interface IWorkerManagerOptions {\n workerFactory: IWorkerFactory\n\tpublishInstrumentController?: PublishInstrumentController\n\tmaxArchiveListLength: number\n\tlogger: ISTSLogger\n\tlogLevel: number // 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n\tmessageTimeout: number\n}\n\nexport const PublishMessageCommandsTestRunner = {\n ...eIWMessageCommands,\n GetAccessToken: '__GetAccessToken',\n GetAccessTokenResponse: '__GetAccessTokenResponse',\n GetDataFromPrimary: '__GetDataFromPrimary',\n ExecuteRefreshToken: '__ExecuteRefreshToken',\n ExecuteRefreshTokenResponse: '__ExecuteRefreshTokenResponse'\n} as const\n\nexport type PublishMessageCommandsTestRunner = typeof PublishMessageCommandsTestRunner[keyof typeof PublishMessageCommandsTestRunner];\n\nexport interface IExecuteWorkerActionResult {\n\tworkerManagerId: string\n\tworkerId: string\n\texecuteRunnerActionResults: IExecuteRunnerActionResult[] \n}\n\nexport interface IExecuteRunnerActionResult {\n\tworkerManagerId: string\n\tworkerId: string\n\trunnerId: string\n\tresult: any\n}\n\nexport interface IRunnerSearchFilters {\n\tplan?: string\n\tplanInstanceId?: string\n\ttag?: string\n\tuserDataKey?: string\n}\n\nexport interface ISTSWorkerManager {\n\tget id(): string;\n get options(): IWorkerManagerOptions\n\n\tSetOptions(options: IWorkerManagerOptions): void;\n\n /**\n * Get complete IWorkerCore model. The model will be refresh prior to returning the values.\n * Optionally include runners that are in the specified states.\n * @param states Use [] or undefined to include all runners irrespective of state.\n * @returns IWorkerCore recordset\n */\n GetWorkersCore(states?: IRunnerState[]): Promise<Record<string, IWorkerCore>>;\n\n /**\n * Get complete IWorkers model. The model will be refresh prior to returning the values.\n * @returns Complete refreshed IWorkers model.\n */\n GetWorkers(states: IRunnerState[]): Promise<IWorkers>;\n\tGetArchiveList(runnerSearchFilters: IRunnerSearchFilters): Promise<IRunner[]>;\n\n\tAddWorker(workerOptions: IWorkerOptions, useWorkerFactory?: IWorkerFactory): Promise<IWorkerEx>;\n AddRunnerToWorker(stsWorkerEx: IWorkerEx, runnerOptions: IRunnerOptions): Promise<IRunnerEx>;\n\n StartWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n StopWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n PauseWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n ResumeWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n ExecuteWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n ResetWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n TerminateWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n UpdateWorkers(workerIds: string[], runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteWorkerActionResult[]>\n\n StopRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n StartRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n PauseRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n ResumeRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n ExecuteRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n ResetRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n TerminateRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n UpdateRunners(workerId: string, runnerIds: string[], runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult[]>\n\n\tTerminate(): void\n}\n","module.exports = false;\n\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","'use strict';\n\nconst wrapAnsi16 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => (...args) => {\n\tconst rgb = fn(...args);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nconst ansi2ansi = n => n;\nconst rgb2rgb = (r, g, b) => [r, g, b];\n\nconst setLazyProperty = (object, property, get) => {\n\tObject.defineProperty(object, property, {\n\t\tget: () => {\n\t\t\tconst value = get();\n\n\t\t\tObject.defineProperty(object, property, {\n\t\t\t\tvalue,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\n\t\t\treturn value;\n\t\t},\n\t\tenumerable: true,\n\t\tconfigurable: true\n\t});\n};\n\n/** @type {typeof import('color-convert')} */\nlet colorConvert;\nconst makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {\n\tif (colorConvert === undefined) {\n\t\tcolorConvert = require('color-convert');\n\t}\n\n\tconst offset = isBackground ? 10 : 0;\n\tconst styles = {};\n\n\tfor (const [sourceSpace, suite] of Object.entries(colorConvert)) {\n\t\tconst name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;\n\t\tif (sourceSpace === targetSpace) {\n\t\t\tstyles[name] = wrap(identity, offset);\n\t\t} else if (typeof suite === 'object') {\n\t\t\tstyles[name] = wrap(suite[targetSpace], offset);\n\t\t}\n\t}\n\n\treturn styles;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\n\t\t\t// Bright color\n\t\t\tblackBright: [90, 39],\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Alias bright black as gray (and grey)\n\tstyles.color.gray = styles.color.blackBright;\n\tstyles.bgColor.bgGray = styles.bgColor.bgBlackBright;\n\tstyles.color.grey = styles.color.blackBright;\n\tstyles.bgColor.bgGrey = styles.bgColor.bgBlackBright;\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tsetLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));\n\tsetLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n","'use strict';\nmodule.exports = {\n\tstdout: false,\n\tstderr: false\n};\n","'use strict';\n\nconst stringReplaceAll = (string, substring, replacer) => {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.substr(endIndex, index - endIndex) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nconst stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nmodule.exports = {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n};\n","'use strict';\nconst TEMPLATE_REGEX = /(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi;\nconst STYLE_REGEX = /(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g;\nconst STRING_REGEX = /^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/;\nconst ESCAPE_REGEX = /\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi;\n\nconst ESCAPES = new Map([\n\t['n', '\\n'],\n\t['r', '\\r'],\n\t['t', '\\t'],\n\t['b', '\\b'],\n\t['f', '\\f'],\n\t['v', '\\v'],\n\t['0', '\\0'],\n\t['\\\\', '\\\\'],\n\t['e', '\\u001B'],\n\t['a', '\\u0007']\n]);\n\nfunction unescape(c) {\n\tconst u = c[0] === 'u';\n\tconst bracket = c[1] === '{';\n\n\tif ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {\n\t\treturn String.fromCharCode(parseInt(c.slice(1), 16));\n\t}\n\n\tif (u && bracket) {\n\t\treturn String.fromCodePoint(parseInt(c.slice(2, -1), 16));\n\t}\n\n\treturn ESCAPES.get(c) || c;\n}\n\nfunction parseArguments(name, arguments_) {\n\tconst results = [];\n\tconst chunks = arguments_.trim().split(/\\s*,\\s*/g);\n\tlet matches;\n\n\tfor (const chunk of chunks) {\n\t\tconst number = Number(chunk);\n\t\tif (!Number.isNaN(number)) {\n\t\t\tresults.push(number);\n\t\t} else if ((matches = chunk.match(STRING_REGEX))) {\n\t\t\tresults.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));\n\t\t} else {\n\t\t\tthrow new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction parseStyle(style) {\n\tSTYLE_REGEX.lastIndex = 0;\n\n\tconst results = [];\n\tlet matches;\n\n\twhile ((matches = STYLE_REGEX.exec(style)) !== null) {\n\t\tconst name = matches[1];\n\n\t\tif (matches[2]) {\n\t\t\tconst args = parseArguments(name, matches[2]);\n\t\t\tresults.push([name].concat(args));\n\t\t} else {\n\t\t\tresults.push([name]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction buildStyle(chalk, styles) {\n\tconst enabled = {};\n\n\tfor (const layer of styles) {\n\t\tfor (const style of layer.styles) {\n\t\t\tenabled[style[0]] = layer.inverse ? null : style.slice(1);\n\t\t}\n\t}\n\n\tlet current = chalk;\n\tfor (const [styleName, styles] of Object.entries(enabled)) {\n\t\tif (!Array.isArray(styles)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!(styleName in current)) {\n\t\t\tthrow new Error(`Unknown Chalk style: ${styleName}`);\n\t\t}\n\n\t\tcurrent = styles.length > 0 ? current[styleName](...styles) : current[styleName];\n\t}\n\n\treturn current;\n}\n\nmodule.exports = (chalk, temporary) => {\n\tconst styles = [];\n\tconst chunks = [];\n\tlet chunk = [];\n\n\t// eslint-disable-next-line max-params\n\ttemporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {\n\t\tif (escapeCharacter) {\n\t\t\tchunk.push(unescape(escapeCharacter));\n\t\t} else if (style) {\n\t\t\tconst string = chunk.join('');\n\t\t\tchunk = [];\n\t\t\tchunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));\n\t\t\tstyles.push({inverse, styles: parseStyle(style)});\n\t\t} else if (close) {\n\t\t\tif (styles.length === 0) {\n\t\t\t\tthrow new Error('Found extraneous } in Chalk template literal');\n\t\t\t}\n\n\t\t\tchunks.push(buildStyle(chalk, styles)(chunk.join('')));\n\t\t\tchunk = [];\n\t\t\tstyles.pop();\n\t\t} else {\n\t\t\tchunk.push(character);\n\t\t}\n\t});\n\n\tchunks.push(chunk.join(''));\n\n\tif (styles.length > 0) {\n\t\tconst errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\\`}\\`)`;\n\t\tthrow new Error(errMessage);\n\t}\n\n\treturn chunks.join('');\n};\n","'use strict';\nconst ansiStyles = require('ansi-styles');\nconst {stdout: stdoutColor, stderr: stderrColor} = require('supports-color');\nconst {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n} = require('./util');\n\nconst {isArray} = Array;\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m'\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nclass ChalkClass {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = {};\n\tapplyOptions(chalk, options);\n\n\tchalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);\n\n\tObject.setPrototypeOf(chalk, Chalk.prototype);\n\tObject.setPrototypeOf(chalk.template, chalk);\n\n\tchalk.template.constructor = () => {\n\t\tthrow new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');\n\t};\n\n\tchalk.template.Instance = ChalkClass;\n\n\treturn chalk.template;\n};\n\nfunction Chalk(options) {\n\treturn chalkFactory(options);\n}\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t}\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this._styler, true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t}\n};\n\nconst usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nfor (const model of usedModels) {\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this._generator.level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis._generator.level = level;\n\t\t}\n\t}\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\tconst builder = (...arguments_) => {\n\t\tif (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {\n\t\t\t// Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`\n\t\t\treturn applyStyle(builder, chalkTag(builder, ...arguments_));\n\t\t}\n\n\t\t// Single argument is hot path, implicit coercion is faster than anything\n\t\t// eslint-disable-next-line no-implicit-coercion\n\t\treturn applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\t};\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder._generator = self;\n\tbuilder._styler = _styler;\n\tbuilder._isEmpty = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self._isEmpty ? '' : string;\n\t}\n\n\tlet styler = self._styler;\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.indexOf('\\u001B') !== -1) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nlet template;\nconst chalkTag = (chalk, ...strings) => {\n\tconst [firstString] = strings;\n\n\tif (!isArray(firstString) || !isArray(firstString.raw)) {\n\t\t// If chalk() was called by itself or with a string,\n\t\t// return the string itself as a string.\n\t\treturn strings.join(' ');\n\t}\n\n\tconst arguments_ = strings.slice(1);\n\tconst parts = [firstString.raw[0]];\n\n\tfor (let i = 1; i < firstString.length; i++) {\n\t\tparts.push(\n\t\t\tString(arguments_[i - 1]).replace(/[{}\\\\]/g, '\\\\$&'),\n\t\t\tString(firstString.raw[i])\n\t\t);\n\t}\n\n\tif (template === undefined) {\n\t\ttemplate = require('./templates');\n\t}\n\n\treturn template(chalk, parts.join(''));\n};\n\nObject.defineProperties(Chalk.prototype, styles);\n\nconst chalk = Chalk(); // eslint-disable-line new-cap\nchalk.supportsColor = stdoutColor;\nchalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap\nchalk.stderr.supportsColor = stderrColor;\n\nmodule.exports = chalk;\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * AbstractRunnerExecutionWorker\n * =============================\n *\n * Abstract base class for the *actual execution worker runtime* that lives inside:\n *\n * - a browser Web Worker, or\n * - a Node.js worker thread\n *\n * This class is the worker-side execution host for runners. It is responsible for:\n *\n * - receiving commands from the manager/controller side\n * - creating concrete executable runner instances\n * - maintaining in-worker runner runtime state\n * - driving runner execution loops\n * - posting unsolicited telemetry and state changes back to the manager\n * - posting solicited command responses back to the manager\n * - retiring/removing finished runners from the worker's live runtime collection\n *\n * Important architectural distinction\n * -----------------------------------\n * This class is **not** the same as the manager-side worker model used in your\n * registry/coordinator layer.\n *\n * Manager side:\n * - owns worker metadata\n * - issues commands\n * - receives telemetry/results\n *\n * Worker side (this class):\n * - actually runs the work\n * - holds concrete runner implementations\n * - manages runner execution lifecycle inside the worker runtime\n *\n * Why abstract?\n * -------------\n * The runner logic can be anything:\n *\n * - HTTP/API execution\n * - synthetic load generation\n * - browser automation\n * - database work\n * - arbitrary domain workflows\n *\n * This class provides the common runtime/lifecycle/message-handling framework,\n * while subclasses override `CreateAsyncRunner(...)` to create a concrete\n * `IRunnerInstance` that performs the actual work.\n */\n\nimport { MessagePort } from 'worker_threads';\n\nimport isNode from 'detect-node';\n\nimport {\n IIWMessagePayload,\n eIWMessageCommands,\n IIWMessagePayloadContentBase,\n IRunnerInstance,\n ISTSAgentWorkerMessagePort,\n IRunner,\n ITestRunnerTelemetryPayload,\n IWorkerOptions,\n IRunnerState,\n IRunnerOptions,\n ISTSGetRunnersPayload,\n IExecutionProfile,\n ITestRunnerTelemetryPayloadResponse\n} from './commonTypes';\n\nimport chalk from 'chalk';\n// Force chalk level\nchalk.level = 3;\n\nimport { ISTSLogger, Sleep, defaultLogger } from '@nsshunt/stsutils';\n\n/**\n * Internal runtime record stored for each runner hosted inside this worker.\n *\n * This combines:\n * - the serialisable runner DTO/state (`runner`)\n * - the concrete executable runner implementation (`runnerInstance`)\n * - an archive flag used for in-worker cleanup (`archived`)\n */\nexport interface IRunnerEx2RunState {\n /**\n * Concrete executable runner implementation.\n *\n * This is the object that performs the actual domain work.\n */\n runnerInstance: IRunnerInstance;\n\n /**\n * Current serialisable runner model/state.\n *\n * This is the object sent back to the manager for state/telemetry updates.\n */\n runner: IRunner;\n\n /**\n * Indicates whether the runner has already been archived/marked for removal\n * from the worker's live runner collection.\n */\n archived: boolean;\n}\n\n/**\n * Abstract worker-runtime base class.\n *\n * A concrete subclass is expected to:\n * - run inside a real worker environment\n * - override `CreateAsyncRunner(...)`\n * - optionally expose its `ProcessMessage(...)` method as the worker message entry point\n *\n * High-level lifecycle\n * --------------------\n * 1. Manager bootstraps this worker by sending `MessagePort`\n * 2. This class stores the manager communication port and worker options\n * 3. Manager sends commands like:\n * - `AddRunner`\n * - `StartRunner`\n * - `PauseRunner`\n * - `GetRunners`\n * 4. This class processes those commands and updates runner runtime state\n * 5. This class sends:\n * - solicited responses for commands\n * - unsolicited state changes\n * - unsolicited telemetry\n */\nexport abstract class AbstractRunnerExecutionWorker {\n /**\n * Dedicated message port used to communicate back to the manager/controller.\n *\n * Set during worker bootstrap via the `MessagePort` command.\n */\n #collectorCollectorPort: MessagePort | null = null;\n\n /**\n * Live runner collection hosted by this worker runtime.\n *\n * Key: runner id\n * Value: combined runtime entry containing the serialisable runner model\n * and the concrete executable runner implementation.\n */\n #runners: Record<string, IRunnerEx2RunState> = {};\n\n /**\n * Worker runtime options supplied by the manager during bootstrap.\n *\n * Remains `null` until the `MessagePort` bootstrap command is received.\n */\n #options: IWorkerOptions | null = null;\n\n /**\n * Worker id assigned by the manager/controller.\n *\n * Remains `null` until the `MessagePort` bootstrap command is received.\n */\n #workerId: string | null = null;\n\n /**\n * Delay in seconds before archived runners are removed from the live\n * in-worker runner collection.\n */\n #archiveDeleteTimeout: number = 30;\n\n /**\n * Logger used by this worker runtime.\n *\n * Returns the shared default logger by default, but exposing this as a getter\n * allows subclasses to override/customise logging behaviour if desired.\n */\n get logger(): ISTSLogger {\n return defaultLogger;\n }\n\n /**\n * Prefix and emit a worker-scoped log message.\n *\n * If worker options are available, the log includes the worker id.\n *\n * @param fn Target logger method.\n * @param message Log message.\n */\n #logMessage = (fn: (message: any) => void, message: string) => {\n if (this.#options) {\n fn(`pid: [${process.pid}] WorkerInstance: Worker ID: [${this.#workerId}] Log: [${message}]`);\n } else {\n fn(`pid: [${process.pid}] WorkerInstance: Log: [${message}]`);\n }\n };\n\n /**\n * Log at silly/trace level when enabled by worker options.\n *\n * @param message Log message.\n */\n #silly = (message: any) => {\n if (this.#options && this.#options.logLevel >= 5) {\n this.#logMessage(this.logger.silly, message);\n }\n };\n\n /**\n * Log at debug level when enabled by worker options.\n *\n * @param message Log message.\n */\n #debug = (message: any) => {\n if (this.#options && this.#options.logLevel >= 4) {\n this.#logMessage(this.logger.debug, message);\n }\n };\n\n /**\n * Log at info level when enabled by worker options.\n *\n * @param message Log message.\n */\n #info = (message: any) => {\n if (this.#options && this.#options.logLevel >= 3) {\n this.#logMessage(this.logger.info, message);\n }\n };\n\n /**\n * Log at warn level when enabled by worker options.\n *\n * @param message Log message.\n */\n #warn = (message: any) => {\n if (this.#options && this.#options.logLevel >= 2) {\n this.#logMessage(this.logger.warn, message);\n }\n };\n\n /**\n * Log at error level when enabled by worker options.\n *\n * @param error Error or message.\n */\n #error = (error: any) => {\n if (this.#options && this.#options.logLevel >= 1) {\n this.#logMessage(this.logger.error, error);\n }\n };\n\n /**\n * Background cleanup/archive loop for runners hosted inside this worker runtime.\n *\n * Behaviour:\n * - scans all live runners\n * - identifies runners in terminal states:\n * - completed\n * - error\n * - stopped\n * - terminated\n * - marks them as archived\n * - schedules removal from the in-worker live runner collection after\n * `#archiveDeleteTimeout`\n * - repeats every second\n *\n * Notes:\n * - This is internal worker-side cleanup only.\n * - It is distinct from any manager-side archive list.\n * - In Node.js, deletion timers are `unref()`'d so they do not keep the process alive.\n * - The short 100ms delay separates detection from mutation/removal scheduling.\n */\n #processLoopExecutor = async () => {\n try {\n const removeList: string[] = [];\n\n for (const [, runner] of Object.entries(this.#runners)) {\n if (\n runner.archived === false &&\n (\n runner.runner.state === IRunnerState.completed ||\n runner.runner.state === IRunnerState.error ||\n runner.runner.state === IRunnerState.stopped ||\n runner.runner.state === IRunnerState.terminated\n )\n ) {\n removeList.push(runner.runner.id);\n }\n }\n\n if (removeList.length > 0) {\n setTimeout(() => {\n this.#debug(chalk.grey(`WorkerInstance:#processLoopExecutor(): Removing runners from collection: [${removeList}]`));\n\n for (let i = 0; i < removeList.length; i++) {\n this.#runners[removeList[i]].archived = true;\n\n if (this.#archiveDeleteTimeout !== 0) {\n if (isNode) {\n setTimeout(\n () => delete this.#runners[removeList[i]],\n this.#archiveDeleteTimeout * 1000.0\n ).unref();\n } else {\n setTimeout(\n () => delete this.#runners[removeList[i]],\n this.#archiveDeleteTimeout * 1000.0\n );\n }\n }\n }\n\n const message = `WorkerInstance:#processLoopExecutor(): Remaining Runner Count: [${Object.keys(this.#runners).length}]`;\n this.#debug(chalk.magenta(message));\n\n setTimeout(this.#processLoopExecutor, 1000);\n }, 100);\n } else {\n setTimeout(this.#processLoopExecutor, 1000);\n }\n } catch (error) {\n this.#error(`#processLoopExecutor(): [${error}]`);\n setTimeout(this.#processLoopExecutor, 1000);\n }\n };\n\n /**\n * Construct the worker runtime host and start the background cleanup loop.\n */\n constructor() {\n this.#processLoopExecutor();\n }\n\n /**\n * Return a random integer between `0` and `max - 1`.\n *\n * Utility helper available to subclasses/runner logic.\n *\n * @param max Exclusive upper bound.\n * @returns Random integer.\n */\n GetRandomInt = (max: number) => {\n return Math.floor(Math.random() * Math.floor(max));\n };\n\n /**\n * Post unsolicited telemetry for a runner back to the manager.\n *\n * Uses the runner's current live serialisable state.\n *\n * @param id Runner id.\n */\n PostTelemetryById = (id: string) => {\n this.#PostMessageToWorkerManagerByRunnerId(eIWMessageCommands.InstrumentTelemetry, id, false);\n };\n\n /**\n * Get the manager communication port.\n *\n * @returns Manager communication port, or `null` if bootstrap is not complete.\n */\n get CollectorCollectorPort(): MessagePort | null {\n return this.#collectorCollectorPort;\n }\n\n /**\n * Get the worker runtime options.\n *\n * @returns Worker options, or `null` if bootstrap is not complete.\n */\n get Options(): IWorkerOptions | null {\n return this.#options;\n }\n\n /**\n * Store and initialise the manager communication port.\n *\n * Behaviour:\n * - stores the transferred message port\n * - attaches diagnostic listeners\n * - posts a `MessagePortResponse` acknowledgement back to the manager\n *\n * Environment handling:\n * - Node: uses `.on('message', ...)`\n * - Browser: uses `.addEventListener('message', ...)`\n *\n * @param workerMessagePort Bootstrap payload containing the port, worker id, and options.\n */\n #SetMessagePort = (workerMessagePort: ISTSAgentWorkerMessagePort) => {\n try {\n this.#collectorCollectorPort = workerMessagePort.port as MessagePort;\n\n if (isNode) {\n this.#collectorCollectorPort.on('message', (data: any) => {\n this.#silly(`collectorCollectorPort on('message'): ${JSON.stringify(data)}`);\n });\n } else {\n (this.#collectorCollectorPort as any).addEventListener('message', (data: any) => {\n this.#silly(`collectorCollectorPort addEventListener('message'): ${JSON.stringify(data.data)}`);\n });\n }\n\n const response: IIWMessagePayload = {\n command: eIWMessageCommands.MessagePortResponse,\n payload: {} as IIWMessagePayloadContentBase\n };\n\n this.#collectorCollectorPort.postMessage(response);\n } catch (error) {\n this.#error(`#SetMessagePort(): [${error}]`);\n }\n };\n\n /**\n * Factory method to create a concrete executable runner instance.\n *\n * This is the main extension point for subclasses.\n *\n * Subclasses should override this and return an `IRunnerInstance` that knows\n * how to execute the actual domain work.\n *\n * Possible concrete runner behaviours:\n * - REST/API load generation\n * - browser automation\n * - database execution\n * - synthetic workflow orchestration\n * - any arbitrary executable task\n *\n * Base implementation returns `null`.\n *\n * @param testRunnerTelemetryPayload Runner creation payload.\n * @returns Concrete runner instance, or `null` if not implemented.\n */\n CreateAsyncRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<IRunnerInstance | null> => {\n return null;\n };\n\n /**\n * Create and register an internal runtime entry for a new runner.\n *\n * Behaviour:\n * - stores the runner DTO and concrete executable runner instance together\n * - marks the runner as not archived\n * - resets iteration to zero\n * - transitions state to `created`\n *\n * @param runner Serialisable runner DTO provided by the manager.\n * @param runnerInstance Concrete executable runner implementation.\n */\n #CreateRunnerEx2RunState = async (runner: IRunner, runnerInstance: IRunnerInstance): Promise<void> => {\n try {\n this.#runners[runner.id] = {\n runner,\n runnerInstance,\n archived: false\n };\n this.#runners[runner.id].runner.iteration = 0;\n this.#UpdateRunnerStateByRunnerId('#CreateRunnerEx2RunState', runner.id, IRunnerState.created);\n } catch (error) {\n this.#error(`#CreateRunnerEx2RunState(): [${error}]`);\n }\n };\n\n /**\n * Update a runner's state and emit an unsolicited state change back to the manager.\n *\n * Behaviour:\n * - updates the in-worker live runner state\n * - logs the transition\n * - posts `RunnerStateChange` to the manager\n *\n * @param fromContext Diagnostic context string used in logs.\n * @param runnerId Target runner id.\n * @param state New runner state.\n */\n #UpdateRunnerStateByRunnerId = (fromContext: string, runnerId: string, state: IRunnerState) => {\n try {\n if (this.#runners[runnerId]) {\n const previousState = this.#runners[runnerId].runner.state;\n this.#runners[runnerId].runner.state = state;\n this.#debug(`#UpdateRunnerStateByRunnerId(): Context: [${fromContext}] Previous State: [${previousState}] New State: [${state}]`);\n this.#PostMessageToWorkerManagerByRunnerId(eIWMessageCommands.RunnerStateChange, runnerId, false);\n } else {\n this.#warn(`#UpdateRunnerStateByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#UpdateRunnerStateByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Determine whether a runner may execute another iteration.\n *\n * Current rule:\n * - only runners in `running` state may continue executing iterations\n *\n * Fail-safe behaviour:\n * - returns `false` if the runner is missing or an error occurs\n *\n * @param runnerId Target runner id.\n * @returns `true` when the runner may execute another iteration.\n */\n #CanExecuteNextIterationByRunnerId = (runnerId: string): boolean => {\n try {\n if (this.#runners[runnerId]) {\n const state = this.#runners[runnerId].runner.state;\n if (state === IRunnerState.running) {\n return true;\n }\n return false;\n } else {\n this.#warn(`#CanExecuteNextIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return false;\n }\n } catch (error) {\n this.#error(`#CanExecuteNextIterationByRunnerId(): [${error}]`);\n return false;\n }\n };\n\n /**\n * Determine whether a runner is in a terminal/completed state.\n *\n * Terminal states:\n * - error\n * - completed\n * - stopped\n * - terminated\n *\n * Fail-safe behaviour:\n * - returns `true` if the runner is missing or an error occurs\n *\n * @param runnerId Target runner id.\n * @returns `true` if the runner is terminal/completed.\n */\n #IsCompletedByRunnerId = (runnerId: string): boolean => {\n try {\n if (this.#runners[runnerId]) {\n const state = this.#runners[runnerId].runner.state;\n if (\n state === IRunnerState.error ||\n state === IRunnerState.completed ||\n state === IRunnerState.stopped ||\n state === IRunnerState.terminated\n ) {\n return true;\n }\n return false;\n } else {\n this.#warn(`#IsCompletedByRunnerId(): Runner ID: [${runnerId}] not found`);\n return true;\n }\n } catch (error) {\n this.#error(`#IsCompletedByRunnerId(): [${error}]`);\n return true;\n }\n };\n\n /**\n * Get the current iteration count for a runner.\n *\n * @param runnerId Target runner id.\n * @returns Current iteration count, or `0` on failure.\n */\n #GetRunnerIterationByRunnerId = (runnerId: string): number => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runner.iteration;\n } else {\n this.#warn(`#GetRunnerIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return 0;\n }\n } catch (error) {\n this.#error(`#GetRunnerIterationByRunnerId(): [${error}]`);\n return 0;\n }\n };\n\n /**\n * Reset a runner's iteration count to zero.\n *\n * @param runnerId Target runner id.\n * @returns New iteration count (`0`), or `0` on failure.\n */\n #ResetRunnerIterationByRunnerId = (runnerId: string): number => {\n try {\n if (this.#runners[runnerId]) {\n this.#runners[runnerId].runner.iteration = 0;\n return 0;\n } else {\n this.#warn(`#ResetRunnerIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return 0;\n }\n } catch (error) {\n this.#error(`#ResetRunnerIterationByRunnerId(): [${error}]`);\n return 0;\n }\n };\n\n /**\n * Increment a runner's iteration count.\n *\n * @param runnerId Target runner id.\n * @returns New iteration count, or `0` on failure.\n */\n #IncRunnerIterationByRunnerId = (runnerId: string): number => {\n try {\n if (this.#runners[runnerId]) {\n this.#runners[runnerId].runner.iteration++;\n return this.#runners[runnerId].runner.iteration;\n } else {\n this.#warn(`#IncRunnerIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return 0;\n }\n } catch (error) {\n this.#error(`#IncRunnerIterationByRunnerId(): [${error}]`);\n return 0;\n }\n };\n\n /**\n * Resolve the concrete executable runner instance for a runner id.\n *\n * @param runnerId Target runner id.\n * @returns Concrete runner instance, or `undefined` if unavailable.\n */\n #GetRunnerInstanceByRunnerId = (runnerId: string): IRunnerInstance | undefined => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runnerInstance;\n } else {\n this.#warn(`#GetRunnerInstanceByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#GetRunnerInstanceByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Resolve the execution profile for a runner.\n *\n * The execution profile controls:\n * - number of iterations\n * - duration-limited execution\n * - delay between iterations\n * - pause-on-complete behaviour\n *\n * @param runnerId Target runner id.\n * @returns Execution profile, or `undefined`.\n */\n #GetRunnerExecutionProfileByRunnerId = (runnerId: string): IExecutionProfile | undefined => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runner.options.executionProfile;\n } else {\n this.#warn(`#GetRunnerExecutionProfileByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#GetRunnerExecutionProfileByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Get the current runner options for a runner.\n *\n * @param runnerId Target runner id.\n * @returns Runner options, or `undefined` if unavailable.\n */\n #GetRunnerOptionsByRunnerId = (runnerId: string): IRunnerOptions | undefined => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runner.options;\n } else {\n this.#warn(`#GetRunnerOptionsByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#GetRunnerOptionsByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Replace the full option object for a runner.\n *\n * @param runnerId Target runner id.\n * @param options New runner options.\n * @returns Stored runner options after replacement, or `undefined` on failure.\n */\n #SetRunnerOptionsByRunnerId = (runnerId: string, options: IRunnerOptions): IRunnerOptions | undefined => {\n try {\n if (this.#runners[runnerId]) {\n this.#runners[runnerId].runner.options = { ...options };\n return this.#runners[runnerId].runner.options;\n } else {\n this.#warn(`#SetRunnerOptionsByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#SetRunnerOptionsByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Add a runner to this worker runtime.\n *\n * Behaviour:\n * - creates a concrete executable runner via `CreateAsyncRunner(...)`\n * - stores live runtime state for that runner\n * - sends an `AddRunnerResponse` back to the manager\n *\n * Notes:\n * - if `CreateAsyncRunner(...)` returns `null`, the runner is not executable\n * - the original runner DTO is still returned locally if available\n *\n * @param testRunnerTelemetryPayload Payload containing the runner to add.\n * @returns Copy of the runner DTO, or `undefined` on failure.\n */\n #AddRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<IRunner | undefined> => {\n let result;\n let returnRunner;\n\n try {\n const { runner } = testRunnerTelemetryPayload;\n const asyncRunnerInstance = await this.CreateAsyncRunner(testRunnerTelemetryPayload);\n if (asyncRunnerInstance) {\n await this.#CreateRunnerEx2RunState(runner, asyncRunnerInstance);\n } else {\n this.#warn(`#AddRunner(): CreateAsyncRunner not defined.`);\n }\n returnRunner = { ...runner };\n } catch (error) {\n this.#error(`#AddRunner(): [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.AddRunnerResponse, testRunnerTelemetryPayload, result);\n\n return returnRunner;\n };\n\n /**\n * Yield to the event loop/microtask queue immediately.\n *\n * Used when cooperative yielding is required but no real delay is desired.\n *\n * @returns Resolved promise.\n */\n #SleepImmediate(): Promise<void> {\n return new Promise((resolve, reject) => {\n resolve();\n });\n }\n\n /**\n * Post an unsolicited runner-related message back to the manager by runner id.\n *\n * Typical commands:\n * - `InstrumentTelemetry`\n * - `RunnerStateChange`\n *\n * Behaviour:\n * - resolves the live runner DTO from worker-side storage\n * - builds the outbound message\n * - posts it on the manager communication port\n *\n * @param command Unsolicited command to emit.\n * @param runnerId Target runner id.\n * @param response Unused legacy flag retained for compatibility.\n */\n #PostMessageToWorkerManagerByRunnerId = async (\n command: eIWMessageCommands,\n runnerId: string,\n response: boolean\n ): Promise<void> => {\n try {\n if (this.#collectorCollectorPort) {\n if (this.#runners[runnerId]) {\n const message: IIWMessagePayload = {\n command,\n payload: {\n runner: this.#runners[runnerId].runner\n } as ITestRunnerTelemetryPayload\n };\n this.#collectorCollectorPort.postMessage(message);\n await Sleep(0);\n } else {\n this.#warn(`#PostMessageToWorkerManagerByRunnerId(): Runner: [${runnerId}] not found`);\n }\n }\n } catch (error) {\n this.#error(`#PostMessageToWorkerManagerByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Post the full current runner list back to the manager.\n *\n * Used to respond to `GetRunners`.\n *\n * Behaviour:\n * - returns all live runner DTOs currently hosted inside this worker runtime\n * - preserves the original request `messageId`\n *\n * @param command Currently ignored; response command is always `GetRunnersResponse`.\n * @param messagePayload Original inbound request.\n */\n #PostRunnersToWorkerManager = async (command: eIWMessageCommands, messagePayload: IIWMessagePayload): Promise<void> => {\n try {\n if (this.#collectorCollectorPort) {\n const message: IIWMessagePayload = {\n command: eIWMessageCommands.GetRunnersResponse,\n payload: {\n messageId: messagePayload.payload.messageId,\n workerId: this.#workerId,\n runners: Object.values(this.#runners).map((runnerEx) => runnerEx.runner)\n } as ISTSGetRunnersPayload,\n };\n this.#collectorCollectorPort.postMessage(message);\n await Sleep(0);\n }\n } catch (error) {\n this.#error(`#PostRunnersToWorkerManager(): [${error}]`);\n }\n };\n\n /**\n * Start a runner and, if valid, launch its execution loop.\n *\n * Valid starting state:\n * - `created`\n *\n * Behaviour:\n * - calls concrete runner `StartRunner()`\n * - transitions state to `running`\n * - launches an async execution loop controlled by the runner's execution profile\n *\n * Execution loop behaviour\n * ------------------------\n * - continues until:\n * - configured iteration count is reached, or\n * - configured duration expires\n * - executes one iteration at a time via concrete runner `ExecuteRunner()`\n * - increments runner iteration count after successful execution if the runner\n * is still active\n * - respects `delayBetweenIterations`\n * - if `pauseOnComplete` is true:\n * - pauses the runner instead of completing it\n * - keeps loop alive waiting in paused state\n * - otherwise:\n * - calls concrete runner `Completed()`\n * - transitions runner to `completed`\n *\n * Race-condition note\n * -------------------\n * During awaited calls inside the execute loop, the runner may be:\n * - stopped\n * - terminated\n * - archived/removed\n *\n * Therefore the loop re-checks:\n * - can execute next iteration\n * - is completed\n *\n * @param testRunnerTelemetryPayload Start request payload.\n */\n #StartRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<any> => {\n let result;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.created) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.StartRunner();\n this.#UpdateRunnerStateByRunnerId('#StartRunner-1', runnerId, IRunnerState.running);\n await Sleep(0);\n const startLoop = new Date();\n\n const ExecuteLoop = async () => {\n try {\n let cont: boolean = true;\n const executionProfile = this.#GetRunnerExecutionProfileByRunnerId(runnerId);\n if (executionProfile) {\n const { iterations, duration, delayBetweenIterations, pauseOnComplete } = executionProfile;\n\n if (iterations > 0) {\n cont = this.#GetRunnerIterationByRunnerId(runnerId) < iterations;\n if (\n cont === false &&\n pauseOnComplete === true &&\n this.#runners[runnerId].runner.state === IRunnerState.paused\n ) {\n cont = true;\n }\n } else if (duration > 0) {\n cont = ((new Date().getTime() - startLoop.getTime()) / 1000) < duration;\n }\n\n if (cont) {\n if (this.#CanExecuteNextIterationByRunnerId(runnerId)) {\n await this.#GetRunnerInstanceByRunnerId(runnerId)?.ExecuteRunner();\n\n if (!this.#IsCompletedByRunnerId(runnerId)) {\n this.#IncRunnerIterationByRunnerId(runnerId);\n }\n }\n\n if (this.#CanExecuteNextIterationByRunnerId(runnerId)) {\n if (delayBetweenIterations > 0) {\n await Sleep(delayBetweenIterations);\n } else {\n await this.#SleepImmediate();\n }\n ExecuteLoop();\n } else {\n if (!this.#IsCompletedByRunnerId(runnerId)) {\n await Sleep(50);\n ExecuteLoop();\n }\n }\n } else {\n if (pauseOnComplete === true) {\n await this.#GetRunnerInstanceByRunnerId(runnerId)?.PauseRunner();\n this.#UpdateRunnerStateByRunnerId('#StartRunner-2', runnerId, IRunnerState.paused);\n ExecuteLoop();\n } else {\n await this.#GetRunnerInstanceByRunnerId(runnerId)?.Completed();\n this.#UpdateRunnerStateByRunnerId('#StartRunner-3', runnerId, IRunnerState.completed);\n }\n }\n } else {\n this.#warn(`#StartRunner:ExecuteLoop(): Cannot get execution profile for runner: [${runnerId}]`);\n }\n } catch (error) {\n this.#error(`#StartRunner:ExecuteLoop(): Error: [${error}]`);\n }\n };\n\n ExecuteLoop();\n }\n } else {\n this.#warn(`#StartRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#StartRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.StartRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Stop a runner by id.\n *\n * Valid states:\n * - paused\n * - running\n *\n * Behaviour:\n * - calls concrete runner `StopRunner()`\n * - transitions state to `stopped`\n *\n * @param runnerId Target runner id.\n * @returns Result returned by the concrete runner, if any.\n */\n #StopRunnerByRunnerId = async (runnerId: string): Promise<any> => {\n let retVal;\n try {\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.running) {\n retVal = await this.#GetRunnerInstanceByRunnerId(runnerId)?.StopRunner();\n this.#UpdateRunnerStateByRunnerId('#StopRunnerByRunnerId', runnerId, IRunnerState.stopped);\n }\n } else {\n this.#warn(`#StopRunnerByRunnerId(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#StopRunnerByRunnerId(): Error: [${error}]`);\n }\n return retVal;\n };\n\n /**\n * Stop a runner in response to a manager command and send the solicited response.\n *\n * @param testRunnerTelemetryPayload Stop request payload.\n */\n #StopRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n result = await this.#StopRunnerByRunnerId(testRunnerTelemetryPayload.runner.id);\n } catch (error) {\n this.#error(`#StopRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.StopRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Terminate a runner in response to a manager command.\n *\n * Valid states:\n * - created\n * - paused\n * - running\n *\n * Behaviour:\n * - calls concrete runner `TerminateRunner()`\n * - transitions state to `terminated`\n *\n * @param testRunnerTelemetryPayload Terminate request payload.\n */\n #TerminateRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.created ||\n state === IRunnerState.paused ||\n state === IRunnerState.running) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.TerminateRunner();\n this.#UpdateRunnerStateByRunnerId('#TerminateRunner', runnerId, IRunnerState.terminated);\n }\n } else {\n this.#warn(`#TerminateRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#TerminateRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.TerminateRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Send a solicited runner-command response back to the manager.\n *\n * Behaviour:\n * - preserves the original request `messageId`\n * - includes the current full runner DTO if the runner still exists locally\n * - includes the `executeRunnerActionResult` wrapper with worker/runner identity\n * plus the raw result returned by the concrete runner implementation\n *\n * Used by:\n * - AddRunner\n * - StartRunner\n * - StopRunner\n * - PauseRunner\n * - ResumeRunner\n * - ResetRunner\n * - ExecuteRunner\n * - UpdateRunner\n * - TerminateRunner\n *\n * @param command Response command type.\n * @param testRunnerTelemetryPayload Original request payload.\n * @param result Raw command result from the concrete runner implementation.\n */\n #SendRunnerCommandResponse = (command: eIWMessageCommands, testRunnerTelemetryPayload: ITestRunnerTelemetryPayload, result: any): void => {\n try {\n let runner = undefined;\n const runnerId = testRunnerTelemetryPayload.runner.id;\n\n if (this.#runners[runnerId]) {\n runner = { ...this.#runners[runnerId].runner };\n }\n\n if (this.#collectorCollectorPort) {\n const message: IIWMessagePayload = {\n command,\n payload: {\n messageId: testRunnerTelemetryPayload.messageId,\n runner,\n executeRunnerActionResult: {\n workerManagerId: testRunnerTelemetryPayload.runner.workerManagerId,\n workerId: testRunnerTelemetryPayload.runner.workerId,\n runnerId: testRunnerTelemetryPayload.runner.id,\n result\n }\n } as ITestRunnerTelemetryPayloadResponse,\n };\n this.#collectorCollectorPort.postMessage(message);\n }\n } catch (error) {\n this.#error(`#SendRunnerCommandResponse(): [${error}]`);\n }\n };\n\n /**\n * Pause a running runner.\n *\n * Valid state:\n * - running\n *\n * Behaviour:\n * - calls concrete runner `PauseRunner()`\n * - transitions state to `paused`\n *\n * @param testRunnerTelemetryPayload Pause request payload.\n */\n #PauseRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.running) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.PauseRunner();\n this.#UpdateRunnerStateByRunnerId('#PauseRunner', runnerId, IRunnerState.paused);\n }\n } else {\n this.#warn(`#PauseRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#PauseRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.PauseRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Resume a paused runner.\n *\n * Valid state:\n * - paused\n *\n * Behaviour:\n * - calls concrete runner `ResumeRunner()`\n * - transitions state to `running`\n *\n * @param testRunnerTelemetryPayload Resume request payload.\n */\n #ResumeRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.ResumeRunner();\n this.#UpdateRunnerStateByRunnerId('#ResumeRunner', runnerId, IRunnerState.running);\n }\n } else {\n this.#warn(`#ResumeRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#ResumeRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.ResumeRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Reset a runner.\n *\n * Valid states:\n * - paused\n * - running\n *\n * Behaviour:\n * - first transitions to `paused` so current state/telemetry can be captured\n * - resets iteration count to zero\n * - calls concrete runner `ResetRunner()`\n *\n * Note:\n * - this method intentionally does not transition to another state after reset\n *\n * @param testRunnerTelemetryPayload Reset request payload.\n */\n #ResetRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.running) {\n this.#UpdateRunnerStateByRunnerId('#ResetRunner', runnerId, IRunnerState.paused);\n this.#ResetRunnerIterationByRunnerId(runnerId);\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.ResetRunner();\n }\n } else {\n this.#warn(`#ResetRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#ResetRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.ResetRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Execute exactly one iteration of a runner's work.\n *\n * Valid states:\n * - paused\n * - created\n *\n * Behaviour:\n * - calls concrete runner `ExecuteRunner()`\n * - increments iteration count\n * - transitions state to `paused`\n *\n * Intended use:\n * - single-step execution\n * - test/debug/manual execution flows\n *\n * @param testRunnerTelemetryPayload Execute request payload.\n */\n #ExecuteRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.created) {\n const currentIteration = this.#GetRunnerIterationByRunnerId(runnerId);\n this.#debug(`${chalk.magenta(`runner: [${runnerId}]`)} ExecuteRunner(${currentIteration})`);\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.ExecuteRunner();\n const newIteration = this.#IncRunnerIterationByRunnerId(runnerId);\n this.#debug(`${chalk.magenta(` --> runner: [${runnerId}]`)} Next iteration number: [${newIteration}] for next Execute or Resume.`);\n this.#UpdateRunnerStateByRunnerId('#ExecuteRunner', runnerId, IRunnerState.paused);\n }\n } else {\n this.#warn(`#ExecuteRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#ExecuteRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.ExecuteRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Update runner options.\n *\n * Valid states:\n * - paused\n * - created\n * - running\n *\n * Behaviour:\n * - replaces the locally stored runner options\n * - forwards the updated options to the concrete runner implementation\n * - does not change the runner state\n *\n * This allows live option updates while a runner is active.\n *\n * @param testRunnerTelemetryPayload Update request payload containing new runner options.\n */\n #UpdateRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.created ||\n state === IRunnerState.running) {\n this.#debug(chalk.cyan(`before: [${JSON.stringify(this.#GetRunnerOptionsByRunnerId(runnerId))}]`));\n this.#SetRunnerOptionsByRunnerId(runnerId, testRunnerTelemetryPayload.runner.options);\n this.#debug(chalk.cyan(`after: [${JSON.stringify(this.#GetRunnerOptionsByRunnerId(runnerId))}]`));\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.UpdateRunner(testRunnerTelemetryPayload.runner.options);\n }\n } else {\n this.#warn(`#UpdateRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#UpdateRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.UpdateRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Main inbound message dispatcher for this worker runtime.\n *\n * This method is intended to be wired to the actual worker's message handler.\n *\n * Supported commands:\n * - `MessagePort`\n * - `AddRunner`\n * - `StartRunner`\n * - `StopRunner`\n * - `TerminateRunner`\n * - `PauseRunner`\n * - `ResumeRunner`\n * - `ResetRunner`\n * - `ExecuteRunner`\n * - `UpdateRunner`\n * - `GetRunners`\n *\n * Behaviour:\n * - interprets the inbound message\n * - dispatches to the appropriate internal handler\n * - bootstrap-initialises the worker on `MessagePort`\n * - logs and ignores unknown commands\n *\n * @param data Raw inbound message payload.\n */\n ProcessMessage = async (data: any) => {\n this.#silly(`ProcessMessage: data: [${JSON.stringify(data)}]`);\n try {\n const payloadMessage: IIWMessagePayload = data as IIWMessagePayload;\n switch (payloadMessage.command) {\n case eIWMessageCommands.MessagePort:\n this.#silly(`ProcessMessage::MessagePort`);\n this.#SetMessagePort(payloadMessage.payload as ISTSAgentWorkerMessagePort);\n this.#options = (payloadMessage.payload as ISTSAgentWorkerMessagePort).options;\n this.#workerId = (payloadMessage.payload as ISTSAgentWorkerMessagePort).workerId;\n this.#debug(`ProcessMessage::#workerId: [${this.#workerId}]`);\n this.#debug(`ProcessMessage::#options: [${JSON.stringify(this.#options)}]`);\n break;\n\n case eIWMessageCommands.AddRunner:\n this.#silly(`ProcessMessage::AddRunner`);\n this.#AddRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.StartRunner:\n this.#silly(`ProcessMessage::StartRunner`);\n this.#StartRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.StopRunner:\n this.#silly(`ProcessMessage::StopRunner`);\n this.#StopRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.TerminateRunner:\n this.#silly(`ProcessMessage::TerminateRunner`);\n this.#TerminateRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.PauseRunner:\n this.#silly(`ProcessMessage::PauseRunner`);\n this.#PauseRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.ResumeRunner:\n this.#silly(`ProcessMessage::ResumeRunner`);\n this.#ResumeRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.ResetRunner:\n this.#silly(`ProcessMessage::ResetRunner`);\n this.#ResetRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.ExecuteRunner:\n this.#silly(`ProcessMessage::ExecuteRunner`);\n this.#ExecuteRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.UpdateRunner:\n this.#silly(`ProcessMessage::UpdateRunner`);\n this.#UpdateRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.GetRunners:\n this.#silly(`ProcessMessage::GetRunners`);\n this.#PostRunnersToWorkerManager(eIWMessageCommands.GetRunners, payloadMessage);\n break;\n\n default:\n this.#warn(`ProcessMessage::default: Invalid payloadMessage.command: [${payloadMessage.command}] - Ignoring`);\n }\n } catch (error: any) {\n this.#error(`ProcessMessage(): Error: [${error}]`);\n this.#error(error);\n }\n };\n}","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n","/**\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeMax = Math.max,\n nativeNow = Date.now;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = merge;\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * STSMessageBroker\n * ----------------\n * Central message broker for worker <-> manager communications.\n *\n * Responsibilities:\n * - Create and manage callback-correlated request/response message flows\n * - Route inbound port messages as either:\n * - solicited responses (request/response messages with `messageId`)\n * - unsolicited push/event messages (telemetry, state changes, etc.)\n * - Initialise message ports between the manager and the worker\n * - Provide helper methods for sending worker-level and runner-level commands\n * - Manage response timeouts for outstanding requests\n *\n * High-level design:\n * - Every solicited request gets a generated `messageId`\n * - The broker stores a pending promise resolver keyed by `messageId`\n * - When a matching inbound response arrives, the broker resolves that promise\n * - If no response arrives before the configured timeout, the request is rejected\n *\n * Notes:\n * - This broker supports both Node and browser worker environments\n * - Environment-specific message port listener wiring is handled internally\n * - The broker itself does not interpret business meaning of unsolicited messages;\n * those are delegated to a caller-supplied callback\n */\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\nimport {\n IIWMessagePayload,\n IIWMessagePayloadContentBase,\n IIWMessageCommand,\n eIWMessageCommands,\n IWorkerEx,\n IRunnerEx,\n ITestRunnerTelemetryPayload,\n IRunnerOptions,\n IWorkerOptions,\n IExecuteRunnerActionResult\n} from './commonTypes';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport isNode from 'detect-node';\nimport { v4 as uuidv4 } from 'uuid';\nimport merge from 'lodash.merge';\n\n/**\n * Configuration options for {@link STSMessageBroker}.\n */\nexport interface ISTSMessageBrokerOptions {\n /**\n * Logger implementation used by the broker for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Timeout in milliseconds for any solicited request waiting for a response.\n *\n * If a response with the matching `messageId` is not received before this period\n * elapses, the pending promise will be rejected and the callback entry removed.\n */\n messageTimeout: number;\n}\n\n/**\n * Internal pending message tracking record stored per `messageId`.\n *\n * This is not exported because it is only an internal implementation detail.\n */\ninterface IMessageRecord {\n /**\n * Timeout handle used to reject the request if no response arrives in time.\n */\n timeout: ReturnType<typeof setTimeout>;\n\n /**\n * Resolver used when the matching response is received.\n */\n resolveMessage: (payload: IIWMessagePayloadContentBase) => void;\n}\n\n/**\n * IMessageRecordMap\n * -----------------\n * Type alias representing the in-memory map used by the message broker\n * to track outstanding callback-correlated requests.\n *\n * Structure:\n * - The key is a unique `messageId` generated when a request is sent to a worker.\n * - The value is the associated {@link IMessageRecord} containing:\n * - the timeout handle for automatic request expiry\n * - the resolver callback used to complete the pending Promise when the\n * matching response arrives.\n *\n * Purpose:\n * This structure allows the {@link STSMessageBroker} to implement a\n * request/response messaging pattern on top of asynchronous worker message\n * channels.\n *\n * Lifecycle of an entry:\n *\n * 1. A command is sent to a worker.\n * 2. A new `messageId` is generated.\n * 3. A corresponding {@link IMessageRecord} is stored in this map.\n * 4. The message is transmitted to the worker including the `messageId`.\n * 5. When the worker responds:\n * - the broker extracts the `messageId`\n * - finds the entry in this map\n * - clears the timeout\n * - resolves the stored promise\n * - removes the entry from the map.\n *\n * Timeout behaviour:\n * If the response is not received before the configured broker timeout,\n * the stored timeout handler will:\n * - remove the entry from the map\n * - reject the original Promise to signal failure to the caller.\n *\n * Typical usage inside the message broker:\n *\n * ```ts\n * private messages: IMessageRecordMap = {};\n * ```\n *\n * Example internal structure at runtime:\n *\n * ```ts\n * {\n * \"9d5c4b42-12c7-4a7c-b1f2-2b0b3c4e5f67\": {\n * timeout: Timeout,\n * resolveMessage: (payload) => { ... }\n * }\n * }\n * ```\n *\n * Notes:\n * - Keys must always be UUID-style message identifiers.\n * - Entries must always be deleted after resolution or timeout to prevent\n * memory leaks.\n */\nexport type IMessageRecordMap = Record<string, IMessageRecord>;\n\n/**\n * Message broker used to coordinate request/response and push-style messaging\n * between the manager/runtime and worker instances.\n */\nexport class STSMessageBroker {\n /**\n * Outstanding solicited request map keyed by generated `messageId`.\n *\n * Each entry contains:\n * - the timeout handle for automatic cleanup/rejection\n * - the resolver that should be called when a matching response arrives\n */\n private messages: IMessageRecordMap = {};\n\n /**\n * Broker configuration.\n */\n private options: ISTSMessageBrokerOptions;\n\n /**\n * Construct a new message broker.\n *\n * @param options Logger and timeout configuration.\n */\n constructor(options: ISTSMessageBrokerOptions) {\n this.options = options;\n }\n\n /**\n * Process a single inbound payload received on a worker message port.\n *\n * Behaviour:\n * - If the inbound payload contains `payload.messageId`, it is treated as a\n * solicited response to an earlier request and is routed to the callback\n * correlation mechanism.\n * - Otherwise it is treated as an unsolicited push/event message and passed\n * to the caller-supplied callback.\n *\n * Typical unsolicited messages include:\n * - telemetry updates\n * - runner state change notifications\n * - other push-style runtime events\n *\n * Typical solicited messages include:\n * - responses to runner commands\n * - responses to worker queries such as `GetRunners`\n *\n * @param inboundPayload Inbound message payload read from the message port.\n * @param cb Callback used to handle unsolicited messages.\n */\n private _processInboundMessage = (\n inboundPayload: IIWMessagePayload,\n cb: (payload: IIWMessagePayload) => void\n ): void => {\n if (inboundPayload.payload && inboundPayload.payload.messageId) {\n // Process the response if message was solicited (request/response).\n this._ProcessRunnerResponse(inboundPayload.payload as IIWMessagePayloadContentBase);\n } else {\n // Process as an unsolicited push/event message.\n cb(inboundPayload);\n }\n };\n\n /**\n * Attach a listener to a worker's message port and route all inbound messages\n * through the broker.\n *\n * Environment handling:\n * - In Node, uses `messagePort.on('message', ...)`\n * - In the browser, uses `messagePort.addEventListener('message', ...)`\n *\n * Notes:\n * - In browser environments, `addEventListener` is used because `onmessage`\n * only allows a single handler.\n * - Browser MessagePorts may need to be manually started elsewhere when using\n * `addEventListener`.\n *\n * @param stsWorkerEx Worker that owns the message port to listen on.\n * @param cb Callback used to handle unsolicited inbound messages.\n */\n SetupMessagePortListener = (\n stsWorkerEx: IWorkerEx,\n cb: (payload: IIWMessagePayload) => void\n ) => {\n if (isNode) {\n (stsWorkerEx.messagePort as any).on('message', (data: any) => {\n this._processInboundMessage(data as IIWMessagePayload, cb);\n });\n } else {\n // In browser, onmessage only allows a single event handler.\n // addEventListener allows multiple handlers and avoids replacing any existing one.\n // Because addEventListener is used, ports usually need to be started manually.\n (stsWorkerEx.messagePort as any).addEventListener('message', (data: MessageEvent) => {\n this._processInboundMessage(data.data as IIWMessagePayload, cb);\n });\n }\n };\n\n /**\n * Resolve a pending solicited request using the `messageId` found in the response payload.\n *\n * Behaviour:\n * - Looks up the pending message entry by `messageId`\n * - Clears the timeout associated with the request\n * - Removes the pending entry from the map\n * - Resolves the original promise with the received payload\n *\n * Error handling:\n * - If the `messageId` is not found in the pending map, logs an error\n * - Any unexpected runtime errors are caught and logged\n *\n * @param payload Response payload containing the original `messageId`.\n */\n private _ProcessRunnerResponse(payload: IIWMessagePayloadContentBase) {\n try {\n const messageId = payload.messageId as string;\n if (this.messages[messageId]) {\n const messageRecord = this.messages[messageId];\n clearTimeout(messageRecord.timeout);\n\n // Remove the pending request entry before resolving.\n delete this.messages[messageId];\n\n // Resolve the original request promise with the returned payload.\n messageRecord.resolveMessage(payload);\n } else {\n this.options.logger.error(\n `_ProcessRunnerResponse(): Payload does not include messageId: Error: [${JSON.stringify(payload)}]`\n );\n }\n } catch (error) {\n this.options.logger.error(`_ProcessRunnerResponse(): Error: [${error}]`);\n }\n }\n\n /**\n * Create and register a new pending callback-correlated request.\n *\n * Behaviour:\n * - Generates a new UUID message id\n * - Stores a timeout that will reject the request if the response is not received in time\n * - Stores a resolver that will be invoked when the response arrives\n *\n * This is the core mechanism that turns low-level message port communication\n * into a Promise-based request/response API.\n *\n * @param resolve Promise resolver for the caller's request.\n * @param reject Promise rejecter for the caller's request.\n * @param command Command being sent, used only for diagnostics in timeout messages.\n * @returns The generated message id to embed in the outbound payload.\n */\n private _SetupCallbackMessage = (resolve: any, reject: any, command: IIWMessageCommand) => {\n const messageId = uuidv4();\n this.messages[messageId] = {\n timeout: setTimeout(() => {\n delete this.messages[messageId];\n reject(\n `STSWorkerManager:_SetupCallbackMessage(): message response timeout for message id: [${messageId}], command: [${command}]`\n );\n }, this.options.messageTimeout),\n resolveMessage: (payload: IIWMessagePayloadContentBase) => {\n resolve(payload);\n }\n };\n return messageId;\n };\n\n /**\n * Send a worker-scoped command that expects a callback-correlated response.\n *\n * Typical examples:\n * - `GetRunners`\n * - other worker-level queries or commands that do not target a specific runner\n *\n * Behaviour:\n * - Creates a callback-correlated pending request\n * - Generates a minimal payload containing only `messageId`\n * - Sends the command over the worker's dedicated message port\n * - Resolves once a matching response arrives\n *\n * @param workerEx Target worker whose message port should be used.\n * @param command Worker-level command to send.\n * @returns Promise resolving with the response payload returned by the worker.\n */\n public SendMessageToWorkerForWorkerWithCallBack = async (\n workerEx: IWorkerEx,\n command: IIWMessageCommand\n ): Promise<IIWMessagePayloadContentBase> => {\n return new Promise((resolve, reject) => {\n try {\n const messageId = this._SetupCallbackMessage(resolve, reject, command);\n const payload: IIWMessagePayloadContentBase = {\n messageId: messageId\n };\n workerEx.messagePort.postMessage({ command, payload });\n } catch (error) {\n this.options.logger.error(`_PostMessageToWorkerGetRunners(): Error: [${error}]`);\n }\n });\n };\n\n /**\n * Send a runner-scoped command that expects a callback-correlated response.\n *\n * Behaviour:\n * - Optionally merges the supplied partial runner options into the live runner options\n * - Creates a callback-correlated pending request\n * - Builds a runner payload using `runnerEx.toRunner(false)` to avoid sending history\n * - Sends the command over the worker's dedicated message port\n * - Resolves with the action result returned by the worker\n *\n * Notes:\n * - `merge(...)` is used so update commands can modify the live in-memory runner\n * options before sending the command.\n * - `toRunner(false)` intentionally excludes runner history to keep the message light.\n *\n * @param workerEx Target worker whose message port should be used.\n * @param runnerEx Target runner for the command.\n * @param command Runner command to send.\n * @param runnerOptions Optional partial runner option updates, typically used for `UpdateRunner`.\n * @returns Promise resolving with the worker's per-runner action result.\n */\n public SendMessageToWorkerForRunnerWithCallBack = async (\n workerEx: IWorkerEx,\n runnerEx: IRunnerEx,\n command: eIWMessageCommands,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> => {\n return new Promise((resolve, reject) => {\n try {\n if (runnerOptions) {\n merge(runnerEx.options, runnerOptions);\n }\n\n const messageId = this._SetupCallbackMessage(resolve, reject, command);\n const payload: ITestRunnerTelemetryPayload = {\n messageId: messageId,\n runner: runnerEx.toRunner(false)\n };\n workerEx.messagePort.postMessage({ command, payload });\n } catch (error) {\n this.options.logger.error(`_SetRunnerIntoWorker(): Error: [${error}]`);\n throw error;\n }\n });\n };\n\n /**\n * Send a command to the underlying worker using the worker's default communication channel\n * rather than the dedicated message port channel.\n *\n * This is primarily used during worker bootstrap, for example when transferring the\n * dedicated message port into the worker.\n *\n * Behaviour:\n * - If a transfer object is supplied, posts the message with transfer semantics\n * - Otherwise posts the message normally\n *\n * Typical use case:\n * - sending the `MessagePort` bootstrap command with the second port transferred\n * into the worker thread/worker instance\n *\n * @param workerEx Target worker.\n * @param command Command to send.\n * @param payload Optional payload to send.\n * @param transferObject Optional transferable object, typically a MessagePort.\n */\n private _PostMessageToWorkerUsingDefaultChannel = (\n workerEx: IWorkerEx,\n command: IIWMessageCommand,\n payload: IIWMessagePayloadContentBase | null,\n transferObject?: any\n ) => {\n try {\n if (transferObject) {\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): #PostMessageToWorker with transfer object`\n );\n workerEx.worker.postMessage({ command, payload }, [transferObject]);\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): #PostMessageToWorker with transfer object - done...`\n );\n } else {\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): #PostMessageToWorker`\n );\n workerEx.worker.postMessage({ command, payload });\n }\n } catch (error) {\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): Error: [${error}]`\n );\n throw error;\n }\n };\n\n /**\n * Initialise the worker's dedicated message port.\n *\n * Behaviour:\n * - If the worker is mocked, injects the port using the mock worker API (`SetPort`)\n * - Otherwise sends the `MessagePort` bootstrap command to the real underlying worker\n * and transfers the supplied port into it\n *\n * Payload contents include:\n * - a bootstrap `messageId`\n * - the transferred port\n * - a copy of the worker options\n * - the worker id\n *\n * Notes:\n * - This is part of worker startup/bootstrap, not normal runtime runner command flow\n * - The port passed here is typically the second end of a newly created `MessageChannel`\n *\n * @param stsWorkerEx Worker being initialised.\n * @param port Port to inject/transfer into the worker.\n */\n public SetupMessagePort = (stsWorkerEx: IWorkerEx, port: any) => {\n if (stsWorkerEx.options.mocked) {\n (stsWorkerEx.worker as any).SetPort({\n command: eIWMessageCommands.MessagePort,\n payload: {\n messageId: uuidv4(),\n port: port,\n options: {\n ...stsWorkerEx.options\n } as IWorkerOptions,\n workerId: stsWorkerEx.id\n } as IIWMessagePayloadContentBase\n });\n } else {\n this._PostMessageToWorkerUsingDefaultChannel(\n stsWorkerEx,\n eIWMessageCommands.MessagePort,\n {\n messageId: uuidv4(),\n port: port,\n options: {\n ...stsWorkerEx.options\n } as IWorkerOptions,\n workerId: stsWorkerEx.id\n } as IIWMessagePayloadContentBase,\n port\n );\n }\n };\n\n /**\n * Create a new `MessageChannel` and return both ports.\n *\n * Behaviour:\n * - Creates `port1` and `port2`\n * - In browser environments, manually starts `port1`\n *\n * Typical usage:\n * - `port1` remains with the manager/runtime side\n * - `port2` is transferred into the worker during bootstrap\n *\n * Notes:\n * - In browser mode, ports are often manually started when using `addEventListener`\n * - In Node, the message port wiring model differs and no explicit `start()` call is needed\n *\n * @returns Newly created message channel ports.\n */\n public GetPorts = (): { port1: any; port2: any } => {\n const {\n port1, // manager/runtime-side message port\n port2 // worker-side message port\n } = new MessageChannel();\n\n if (!isNode) {\n // In browser mode, when addEventListener is used, ports generally need to be\n // started manually. The transferred port will also typically need to be started\n // inside the worker runtime.\n port1.start();\n }\n\n return { port1, port2 };\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * RunnerInstance\n * --------------\n * Concrete runtime implementation of {@link IRunnerEx}.\n *\n * A RunnerInstance represents a single executable runner hosted inside a worker.\n *\n * Responsibilities:\n * - Store runner runtime state and metadata\n * - Dispatch runner commands to the owning worker via the message broker\n * - Maintain runner telemetry/instrumentation state\n * - Register runner-level event subscriptions against the owning worker\n * - Expose full and reduced serialisable runner models\n *\n * Design notes:\n * - A RunnerInstance belongs to exactly one {@link IWorkerEx}.\n * - Command execution is brokered through {@link STSMessageBroker}; the runner does\n * not communicate with the worker directly.\n * - Event subscriptions are stored on the owning worker, keyed by runner id.\n */\n\nimport {\n eIWMessageCommands,\n IAsyncRunnerContext,\n IExecuteRunnerActionResult,\n IIWMessageCommand,\n IRunner,\n IRunnerCore,\n IRunnerEvent,\n IRunnerEx,\n IRunnerOptions,\n IRunnerState,\n IRunnerTelemetry,\n IWorkerEx,\n IRunnerHistoryRecord\n} from './commonTypes';\n\nimport { defaultLogger } from '@nsshunt/stsutils';\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\nimport { STSMessageBroker } from './messageBroker';\n\n/**\n * Constructor options required to create a {@link RunnerInstance}.\n *\n * Notes:\n * - `workerEx` is the owning live worker instance that hosts this runner.\n * - `workerManagerId` identifies the top-level owning worker manager.\n * - `runnerId` is generated elsewhere and supplied to this instance.\n * - `asyncRunnerContext` contains the logical identity and hierarchy of this runner.\n * - `runnerOptions` contains runtime configuration for the runner.\n * - `messageBroker` is used to dispatch commands and correlate responses.\n * - `publishInstrumentController` is optional and is used when telemetry publishing\n * to an external instrumentation system is enabled.\n */\nexport interface IRunnerInstanceOptions {\n /** Owning live worker instance. */\n workerEx: IWorkerEx;\n\n /** Id of the top-level owning worker manager. */\n workerManagerId: string;\n\n /** Unique id for this runner instance. */\n runnerId: string;\n\n /** Hierarchical runtime context used to identify this runner. */\n asyncRunnerContext: IAsyncRunnerContext;\n\n /** Runner-specific runtime configuration. */\n runnerOptions: IRunnerOptions;\n\n /** Broker used for runner command dispatch and callback correlation. */\n messageBroker: STSMessageBroker;\n\n /** Optional external instrumentation publisher for this runner. */\n publishInstrumentController?: PublishInstrumentController;\n}\n\n/**\n * Concrete live runner runtime instance.\n *\n * This class owns:\n * - the current runtime state of the runner\n * - its current iteration counter\n * - its telemetry/instrumentation data\n * - its configuration/options\n * - its archived flag and runner history\n *\n * This class delegates command execution to the owning worker via\n * the injected message broker.\n */\nexport class RunnerInstance implements IRunnerEx {\n /** Unique id for this runner instance. */\n public id: string;\n\n /** Id of the owning worker instance. */\n public workerId: string;\n\n /** Id of the owning worker manager instance. */\n public workerManagerId: string;\n\n /**\n * Current lifecycle state of the runner.\n *\n * Defaults to `IRunnerState.created` when the runner instance is first created.\n */\n public state: IRunnerState = IRunnerState.created;\n\n /**\n * Current iteration number for the runner.\n *\n * The meaning of this depends on runner behaviour; typically it tracks\n * how many execute cycles/iterations have been completed.\n */\n public iteration = 0;\n\n /**\n * Optional instrumentation publisher used for telemetry integration.\n *\n * This is only populated when external instrumentation publishing is enabled.\n */\n public publishInstrumentController?: PublishInstrumentController;\n\n /**\n * Hierarchical runtime identity/context for the runner.\n *\n * Typically includes host, agent, worker, and runner identifiers.\n */\n public asyncRunnerContext: IAsyncRunnerContext;\n\n /** Runtime configuration/options for this runner. */\n public options: IRunnerOptions;\n\n /**\n * Historical runner snapshots/events for this runner.\n *\n * This is intentionally initialised as an empty array and populated elsewhere\n * by lifecycle/state management components.\n */\n public runnerHistory: IRunnerHistoryRecord[] = [ ];\n\n /**\n * Live telemetry/instrumentation values for this runner.\n *\n * These values are updated during runtime as telemetry arrives from the worker.\n */\n public instrumentData: IRunnerTelemetry;\n\n /**\n * Indicates whether this runner has been archived/retired from active in-memory use.\n *\n * This flag is typically managed externally by archive/lifecycle management logic.\n */\n public archived = false;\n\n /** Owning worker instance used for event subscription storage and broker dispatch context. */\n readonly #workerEx: IWorkerEx;\n\n /** Broker used to send runner commands to the worker and await responses. */\n readonly #messageBroker: STSMessageBroker;\n\n /**\n * Construct a new live runner runtime instance.\n *\n * Behaviour:\n * - Copies supplied identity and configuration values\n * - Derives `workerId` from the supplied owning worker\n * - Stores broker and worker references for later command dispatch\n * - Initialises telemetry counters/metrics to zeroed defaults\n *\n * @param options Construction options and collaborators.\n */\n constructor(options: IRunnerInstanceOptions) {\n this.id = options.runnerId;\n this.workerId = options.workerEx.id;\n this.workerManagerId = options.workerManagerId;\n this.asyncRunnerContext = options.asyncRunnerContext;\n this.options = options.runnerOptions;\n this.publishInstrumentController = options.publishInstrumentController;\n this.#workerEx = options.workerEx;\n this.#messageBroker = options.messageBroker;\n\n /**\n * Initialise live telemetry/instrumentation values.\n *\n * These defaults represent a newly created runner with no activity yet recorded.\n */\n this.instrumentData = {\n requestCount: 0,\n errorCount: 0,\n retryCount: 0,\n authenticationCount: 0,\n authenticationErrorCount: 0,\n authenticationRetryCount: 0,\n velocity: 0,\n coreCount: 0,\n timer: 0,\n duration: 0,\n latency: 0,\n activeRequestCount: 0,\n message: [],\n childCount: 0,\n rx: 0,\n tx: 0\n };\n }\n\n /**\n * Send a `StartRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Start(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.StartRunner);\n }\n\n /**\n * Send a `StopRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Stop(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.StopRunner);\n }\n\n /**\n * Send a `PauseRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Pause(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.PauseRunner);\n }\n\n /**\n * Send a `ResumeRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Resume(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.ResumeRunner);\n }\n\n /**\n * Send a `ResetRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Reset(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.ResetRunner);\n }\n\n /**\n * Send an `ExecuteRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Execute(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.ExecuteRunner);\n }\n\n /**\n * Send a `TerminateRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Terminate(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.TerminateRunner);\n }\n\n /**\n * Send an `UpdateRunner` command for this runner via the message broker.\n *\n * Behaviour:\n * - Sends the supplied partial options to the underlying worker\n * - The worker is responsible for applying/merging the update as appropriate\n *\n * @param runnerOptions Partial runner option updates to apply.\n * @returns Action result returned by the worker.\n */\n Update(runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.UpdateRunner, runnerOptions);\n }\n\n /**\n * Register a runner-level event subscription.\n *\n * Behaviour:\n * - Stores the subscription on the owning worker in `runnersEvents`\n * - Creates the per-runner event list lazily if it does not yet exist\n * - Returns this runner instance to support fluent chaining\n *\n * Notes:\n * - Runner event subscriptions are hosted on the worker because the worker is\n * the aggregate owner of all live runner instances.\n *\n * @param eventName Event name to subscribe to.\n * @param cb Callback invoked when the event is emitted for this runner.\n * @returns This runner instance for fluent chaining.\n */\n on(eventName: string, cb: (args?: any) => void): IRunnerEx {\n if (!this.#workerEx.runnersEvents[this.id]) {\n this.#workerEx.runnersEvents[this.id] = [];\n }\n\n this.#workerEx.runnersEvents[this.id].push({\n eventName,\n cb\n });\n\n return this;\n }\n\n /**\n * Convert this live runner runtime instance into a full serialisable runner model.\n *\n * Behaviour:\n * - Copies runner metadata and state\n * - Creates shallow copies of nested objects used by the DTO\n * - Copies telemetry messages into a new array to avoid external mutation\n * - Includes full `runnerHistory`\n *\n * @returns Full serialisable runner model.\n */\n toJSON(): IRunner {\n return {\n id: this.id,\n asyncRunnerContext: { ...this.asyncRunnerContext },\n instrumentData: {\n ...this.instrumentData,\n message: [...this.instrumentData.message]\n },\n iteration: this.iteration,\n options: { ...this.options },\n state: this.state,\n workerId: this.workerId,\n workerManagerId: this.workerManagerId,\n runnerHistory: [...this.runnerHistory]\n };\n }\n\n /**\n * Convert this runner into a serialisable runner model with optional history exclusion.\n *\n * Behaviour:\n * - When `includeHistory` is `true`, returns the full runner DTO from {@link toJSON}\n * - When `includeHistory` is `false`, removes `runnerHistory` from the returned model\n *\n * This is useful when sending a lighter-weight runner payload over message channels.\n *\n * @param includeHistory Whether to include `runnerHistory` in the returned DTO.\n * @returns Full or reduced serialisable runner model.\n */\n toRunner(includeHistory = true): IRunner {\n const runner = this.toJSON();\n if (includeHistory) {\n return runner;\n }\n\n const { runnerHistory, ...rest } = runner;\n return rest as IRunner;\n }\n\n /**\n * Convert this runner into a reduced/core representation.\n *\n * Behaviour:\n * - Includes only the minimal runtime state required for lightweight summaries\n * - Includes `runnerPlan` when present in the runner options\n *\n * Intended use cases:\n * - lightweight dashboards\n * - summary views\n * - state-only synchronisation payloads\n *\n * @returns Reduced/core runner DTO.\n * @throws Re-throws any error after logging.\n */\n toRunnerCore(): IRunnerCore {\n try {\n const retVal: IRunnerCore = {\n id: this.id,\n iteration: this.iteration,\n state: this.state\n };\n\n if (this.options?.runnerPlan) {\n retVal.runnerPlan = { ...this.options.runnerPlan };\n }\n\n return retVal;\n } catch (error) {\n defaultLogger.error(`toRunnerCore(): Error: [${error}]`);\n throw error;\n }\n }\n\n /**\n * Send a command for this runner to the owning worker via the message broker.\n *\n * This is the central low-level command-dispatch helper used by all public\n * runner command methods (`Start`, `Stop`, `Pause`, etc.).\n *\n * Behaviour:\n * - Uses the owning worker as the dispatch target/context\n * - Uses this live runner instance as the runner payload source\n * - Optionally includes partial runner options for update operations\n * - Awaits the worker/broker callback response\n *\n * @param command Broker command to send for this runner.\n * @param runnerOptions Optional partial runner option payload for update operations.\n * @returns Action result returned by the worker/message broker.\n */\n #sendRunnerCommand(\n command: IIWMessageCommand,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> {\n return this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n this.#workerEx,\n this,\n command,\n runnerOptions\n );\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * AsyncRunnerInstanceManager\n * --------------------------\n * Factory/creation manager responsible for constructing live {@link RunnerInstance}\n * objects for a given worker.\n *\n * Responsibilities:\n * - generate a unique runner id\n * - build the hierarchical {@link IAsyncRunnerContext} for the runner\n * - optionally create a child publish/instrument controller for the runner\n * - construct and return a new live {@link RunnerInstance}\n *\n * High-level role in the architecture:\n * - {@link WorkerInstance} owns runners\n * - {@link AsyncRunnerInstanceManager} creates runners\n * - {@link RunnerInstance} executes runner behaviour and communicates through the broker\n *\n * Notes:\n * - This class does not register the runner into a worker; it only creates it.\n * - Registration is handled elsewhere, typically by the worker that owns the runner.\n * - This class centralises runner identity/context construction so that every runner\n * follows the same naming and instrumentation conventions.\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport { IAsyncRunnerContext, IWorkerEx, IRunnerEx, IRunnerOptions } from './commonTypes';\n\nimport { ModelDelimeter } from '@nsshunt/stsutils';\n\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { STSMessageBroker } from './messageBroker';\n\nimport { RunnerInstance } from './runnerInstance';\n\n/**\n * Constructor options for {@link AsyncRunnerInstanceManager}.\n */\nexport interface IAsyncRunnerInstanceManagerOptions {\n /**\n * Id of the top-level worker manager that owns all workers/runners created through this factory.\n */\n workerManagerId: string;\n\n /**\n * Optional root publish/instrument controller.\n *\n * When supplied, a dedicated child publish controller is created for each new runner\n * using the runner's async context.\n */\n instrumentController?: PublishInstrumentController;\n\n /**\n * Message broker used by created runner instances to send commands to the worker.\n */\n messageBroker: STSMessageBroker;\n}\n\n/**\n * Factory/manager used to construct new live asynchronous runner instances.\n *\n * This class encapsulates:\n * - runner id creation\n * - async runner context creation\n * - optional per-runner instrumentation publisher creation\n * - `RunnerInstance` construction\n */\nexport class AsyncRunnerInstanceManager {\n /**\n * Immutable construction/configuration options for this manager.\n */\n #options: IAsyncRunnerInstanceManagerOptions;\n\n /**\n * Construct a new async runner instance manager.\n *\n * @param options Worker-manager id, optional instrumentation controller, and message broker.\n */\n constructor(options: IAsyncRunnerInstanceManagerOptions) {\n this.#options = options;\n }\n\n /**\n * Create a new live asynchronous runner instance for the supplied worker.\n *\n * Behaviour:\n * - Generates a new unique runner id\n * - Builds a hierarchical {@link IAsyncRunnerContext} for the runner\n * - Optionally creates a child publish/instrument controller scoped to that runner\n * - Constructs and returns a new {@link RunnerInstance}\n *\n * Async runner context structure:\n *\n * The generated context follows a 4-level hierarchy:\n *\n * 1. host\n * 2. agent\n * 3. worker/thread\n * 4. runner\n *\n * The generated `nid` format is:\n *\n * `[level1]@[level2]^[level3]|[level4]`\n *\n * Concretely:\n *\n * `[hostName]@[agentId]-[userAgent]^[workerId]|[runnerId]`\n *\n * Where:\n * - `hostName` identifies the host/runtime machine\n * - `agentId-userAgent` identifies the logical agent/browser/session instance\n * - `workerId` identifies the worker hosting the runner\n * - `runnerId` identifies the runner inside that worker\n *\n * Notes:\n * - This method only creates the runner instance; it does not add it to the worker's\n * internal runner map or push it into the underlying worker runtime.\n * - That registration/bootstrap step is performed elsewhere by the owning worker.\n *\n * @param workerEx The live worker instance that will own the new runner.\n * @param runnerOptions Runtime options/configuration for the new runner.\n * @returns Newly constructed live runner instance.\n */\n CreateAsyncRunner = (workerEx: IWorkerEx, runnerOptions: IRunnerOptions): IRunnerEx => {\n /**\n * Generate a unique id for the new runner.\n */\n const runnerId = uuidv4();\n\n /**\n * Construct the hierarchical async runner context used for:\n * - logical identification\n * - telemetry/instrumentation naming\n * - distributed runtime traceability\n */\n const asyncRunnerContext: IAsyncRunnerContext = {\n /**\n * Hierarchical node identifier.\n *\n * Format:\n * [level1]@[level2]^[level3]|[level4]\n *\n * Concrete layout:\n * [hostName]@[agentId]-[userAgent]^[workerId]|[runnerId]\n */\n nid: `\\\n${workerEx.options.hostName}${ModelDelimeter.COMPONENT_SEPERATOR}${workerEx.options.agentId}-${workerEx.options.userAgent}\\\n${ModelDelimeter.NID_SEPERATOR}\\\n${workerEx.id}\\\n${ModelDelimeter.SEPERATOR}\\\n${runnerId}`,\n\n /**\n * Level 1: host identity.\n *\n * Example:\n * - machine name\n * - physical host\n * - logical host/runtime name\n */\n hostName: workerEx.options.hostName,\n\n /**\n * Level 2: agent identity.\n *\n * Constructed as:\n * `${agentId}-${userAgent}`\n *\n * This typically identifies:\n * - browser session\n * - tab instance\n * - client/service instance\n */\n agentName: `${workerEx.options.agentId}-${workerEx.options.userAgent}`,\n\n /**\n * Level 3: worker/thread identity.\n *\n * This identifies the worker hosting the runner.\n */\n threadId: `${workerEx.id}`,\n\n /**\n * Level 4: runner identity.\n *\n * This identifies the specific async runner within the worker.\n */\n id: runnerId,\n };\n\n /**\n * Create the concrete live runner instance.\n *\n * If an instrumentation controller is available, create a child\n * publish controller scoped to this runner's async context.\n */\n const runnerEx = new RunnerInstance({\n workerEx,\n workerManagerId: this.#options.workerManagerId,\n runnerId,\n asyncRunnerContext,\n runnerOptions,\n messageBroker: this.#options.messageBroker,\n publishInstrumentController: this.#options.instrumentController\n ? this.#options.instrumentController.AddPublishInstrumentController(asyncRunnerContext)\n : undefined\n });\n\n return runnerEx;\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * ArchiveManager\n * --------------\n * Background lifecycle manager responsible for:\n *\n * - scanning all live workers/runners for runners that have reached an archiveable end state\n * - stopping any active telemetry/instrument publishing for those runners\n * - copying eligible runners into an in-memory archive list\n * - marking runners as archived so they are not processed repeatedly\n * - deleting archived runners from the live worker registry after a short delay\n *\n * High-level behaviour:\n * 1. Periodically scan all workers and their runners\n * 2. Identify runners in a terminal/archiveable state:\n * - completed\n * - error\n * - stopped\n * - terminated\n * 3. For each matching runner:\n * - stop instrumentation publishing if active\n * - archive the runner unless it was terminated\n * - mark the runner as archived\n * - schedule deletion from the live registry after `archiveDeleteTimeout`\n * 4. Repeat on a timed loop until `Terminate()` is called\n *\n * Notes:\n * - Terminated runners are intentionally NOT added to the archive list,\n * but they are still marked as archived and later removed from the live registry.\n * - The archive list is capped at `maxArchiveListLength`.\n * - This class owns only the archive list and loop scheduling; live worker/runner\n * ownership remains with the {@link WorkerRegistry}.\n */\n\nimport { IRunner, IRunnerState, IRunnerSearchFilters } from './commonTypes';\n\nimport { ISTSLogger, JSONObject } from '@nsshunt/stsutils';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport isNode from 'detect-node';\n\nimport { WorkerRegistry } from './workerRegistry';\n\n/**\n * Constructor options for {@link ArchiveManager}.\n */\nexport interface IArchiveManagerOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Maximum number of archived runner snapshots to keep in memory.\n *\n * When the archive exceeds this size, the oldest archived runner is removed.\n */\n maxArchiveListLength: number;\n\n /**\n * Shared live worker registry used to inspect workers/runners and delete\n * archived runners from the active runtime graph.\n */\n workerRegistry: WorkerRegistry;\n}\n\n/**\n * Archive manager for completed/stopped/failed runner instances.\n */\nexport class ArchiveManager {\n /**\n * Immutable runtime configuration for this archive manager.\n */\n private readonly options: IArchiveManagerOptions;\n\n /**\n * In-memory archive of serialised runner snapshots.\n *\n * Important:\n * - This stores serialised runner DTOs, not live `IRunnerEx` instances.\n * - The list is bounded by `maxArchiveListLength`.\n */\n private readonly archiveList: IRunner[] = [];\n\n /**\n * Delay in seconds before removing an archived runner from the live worker registry.\n *\n * Purpose:\n * - allows a short grace period after archiving\n * - avoids immediate deletion of the live runner instance\n *\n * A value of `0` would disable delayed deletion.\n */\n private readonly archiveDeleteTimeout: number = 30;\n\n /**\n * Timeout handle for the recurring archive scan loop.\n *\n * This is stored so the loop can be stopped later via {@link Terminate}.\n */\n private timeout: any;\n\n private archiveDelTimeout: any;\n\n /**\n * Construct a new archive manager.\n *\n * @param options Logger, archive size cap, and worker registry dependencies.\n */\n constructor(options: IArchiveManagerOptions) {\n this.options = options;\n }\n\n /**\n * Execute a single archive scan cycle and schedule the next cycle.\n *\n * Behaviour:\n * - scans all live workers and all live runners\n * - collects runners eligible for archiving into a temporary `removeList`\n * - processes the collected runners after a short delay\n * - schedules the next loop execution\n *\n * Archiveable runner states:\n * - `IRunnerState.completed`\n * - `IRunnerState.error`\n * - `IRunnerState.stopped`\n * - `IRunnerState.terminated`\n *\n * Additional behaviour per matching runner:\n * - If a publish instrument controller is attached, `EndPublish()` is called\n * - If the runner state is NOT `terminated`, the runner is serialised and pushed\n * into the in-memory archive list\n * - If the runner state IS `terminated`, it is skipped for archive storage\n * - In both cases, the runner is marked `archived = true`\n * - The live runner is scheduled for deletion from the worker registry after\n * `archiveDeleteTimeout`\n *\n * Loop scheduling:\n * - If one or more runners were found, processing happens after 100 ms, then the\n * next scan is scheduled 1000 ms later\n * - If none were found, the next scan is scheduled directly after 1000 ms\n *\n * Notes:\n * - The short 100 ms processing delay helps separate detection and mutation phases.\n * - In Node.js, delayed deletion timeouts are `unref()`'d so they do not keep the\n * process alive by themselves.\n *\n * @throws Re-throws unexpected errors after logging.\n */\n ProcessLoopExecutor = async () => {\n try {\n /**\n * Temporary list of live runners selected for archive/removal processing.\n *\n * Each entry contains:\n * - `workerId`\n * - `runnerId`\n */\n const removeList: JSONObject[] = [];\n\n /**\n * Scan all live workers and runners to identify archive candidates.\n */\n this.options.workerRegistry.GetWorkersEx([]).forEach(workerEx => {\n const runnersEx = workerEx.GetAllRunnersEx();\n\n runnersEx.forEach(runnerEx => {\n const runnerState = runnerEx.state;\n\n if (\n runnerEx.archived === false &&\n (\n runnerState === IRunnerState.completed ||\n runnerState === IRunnerState.error ||\n runnerState === IRunnerState.stopped ||\n runnerState === IRunnerState.terminated\n )\n ) {\n // Runner is in a terminal/archiveable state and has not yet been archived.\n removeList.push({\n workerId: workerEx.id,\n runnerId: runnerEx.id\n });\n }\n });\n });\n\n /**\n * If matching runners were found, process them after a short delay.\n * Otherwise just schedule the next scan loop.\n */\n if (removeList.length > 0) {\n const startTimeout = setTimeout(async () => {\n this.options.logger.debug(\n chalk.grey(\n `STSWorkerManager:_processLoopExecutor(): Removing runners from collection: [${JSON.stringify(removeList)}]`\n )\n );\n\n /**\n * Process each matched runner from the temporary remove list.\n */\n for (let i = 0; i < removeList.length; i++) {\n const workerEx = this.options.workerRegistry.GetWorkerEx(removeList[i].workerId);\n\n if (workerEx) {\n const runnerEx = workerEx.GetRunnerEx(removeList[i].runnerId);\n\n if (runnerEx) {\n /**\n * Stop any active telemetry/instrument publishing for this runner.\n *\n * This is done before archive/delete handling so no further\n * publishing occurs after the runner is considered retired.\n */\n if (runnerEx.publishInstrumentController) {\n this.options.logger.debug(\n chalk.grey(\n `Ending publish for runner: [${JSON.stringify(runnerEx.asyncRunnerContext)}]`\n )\n );\n\n // No wait/delay required after ending publish.\n runnerEx.publishInstrumentController.EndPublish();\n }\n\n /**\n * Only non-terminated runners are stored in the archive list.\n *\n * Terminated runners are treated as retired/removed but not archived.\n */\n if (runnerEx.state !== IRunnerState.terminated) {\n this.options.logger.debug(\n chalk.grey(\n `Archive runner: [${JSON.stringify(runnerEx.asyncRunnerContext)}]`\n )\n );\n\n const runner: IRunner = runnerEx.toRunner();\n this.archiveList.push(runner);\n\n /**\n * Enforce archive list size cap by discarding the oldest item.\n */\n if (this.archiveList.length > this.options.maxArchiveListLength) {\n this.archiveList.shift();\n }\n } else {\n this.options.logger.debug(\n chalk.grey(\n `Runner has been terminated and will not be archived, runner: [${JSON.stringify(runnerEx.asyncRunnerContext)}]`\n )\n );\n }\n\n /**\n * Mark as archived regardless of whether it was actually added\n * to the archive list. This prevents the runner from being\n * reprocessed on future scans.\n */\n runnerEx.archived = true;\n\n /**\n * Schedule deletion of the live runner instance from the worker registry.\n *\n * This removes the runner from the active runtime graph after a delay.\n */\n if (this.archiveDeleteTimeout !== 0) {\n this.archiveDelTimeout = setTimeout(() => {\n try {\n this.options.workerRegistry.DeleteRunner(workerEx.id, removeList[i].runnerId)\n } catch (error) {\n this.options.logger.error(`Error in: this.options.workerRegistry.DeleteRunner(${workerEx.id}, ${removeList[i].runnerId})`);\n }\n }, this.archiveDeleteTimeout * 1000.0);\n\n /**\n * In Node.js, unref the timer so it does not keep the process alive.\n */\n //if (isNode) {\n this.archiveDelTimeout.unref();\n //}\n }\n }\n }\n }\n\n /**\n * Emit a debug summary showing remaining live runner counts per worker.\n */\n for (const [, workerEx] of Object.entries(this.options.workerRegistry.GetWorkersEx([]))) {\n const message =\n `STSWorkerManager:_processLoopExecutor(): Remaining runners from worker: [${workerEx.id}]: [${workerEx.GetAllRunnersEx().length}]`;\n this.options.logger.debug(chalk.magenta(message));\n }\n\n /**\n * Schedule the next archive scan.\n */\n this.timeout = setTimeout(() => this.ProcessLoopExecutor(), 1000);\n if (isNode) {\n this.timeout.unref();\n }\n }, 100);\n if (isNode) {\n startTimeout.unref();\n }\n } else {\n /**\n * No archive candidates found; just schedule the next scan.\n */\n this.timeout = setTimeout(() => this.ProcessLoopExecutor(), 1000);\n if (isNode) {\n this.timeout.unref();\n }\n }\n } catch (error) {\n this.options.logger.error(`_processLoopExecutor(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get archived runner snapshots filtered by optional search criteria.\n *\n * Supported filters:\n * - `plan`\n * - `planInstanceId`\n * - `tag`\n * - `userDataKey`\n *\n * Filter behaviour:\n * - If a filter property is absent/blank, it is ignored\n * - All supplied filters are combined using logical AND\n *\n * Examples:\n * - by runner plan name\n * - by specific plan instance id\n * - by tag membership\n * - by existence of a userData key\n *\n * Notes:\n * - This method returns archived DTOs (`IRunner[]`), not live runner instances\n * - The archive list is in-memory only and bounded by `maxArchiveListLength`\n *\n * @param runnerSearchFilters Search/filter options to apply.\n * @returns Filtered archive list. Returns an empty array on error.\n */\n GetArchiveList = async (runnerSearchFilters: IRunnerSearchFilters): Promise<IRunner[]> => {\n this.options.logger.debug(`GetArchiveList()`);\n\n try {\n return this.archiveList\n .filter((runner) =>\n (!runnerSearchFilters.plan)\n ? true\n : runner.options.runnerPlan?.plan?.localeCompare(runnerSearchFilters.plan) === 0\n )\n .filter((runner) =>\n (!runnerSearchFilters.planInstanceId)\n ? true\n : runner.options.runnerPlan?.planInstanceId?.localeCompare(runnerSearchFilters.planInstanceId) === 0\n )\n .filter((runner) =>\n (!runnerSearchFilters.tag)\n ? true\n : runner.options.tag?.includes(runnerSearchFilters.tag)\n )\n .filter((runner) =>\n (!runnerSearchFilters.userDataKey)\n ? true\n : (!runner.options.userData)\n ? false\n : !!runner.options.userData[runnerSearchFilters.userDataKey]\n );\n } catch (error) {\n this.options.logger.error(`GetArchiveList(): Error: [${error}]`);\n return [];\n }\n };\n\n /**\n * Stop the recurring archive scan loop.\n *\n * Behaviour:\n * - Clears the currently scheduled scan timeout if present\n * - Does not clear already scheduled delayed per-runner deletion timeouts\n * - Does not modify the current archive list\n *\n * Intended use:\n * - called during overall worker-manager shutdown/termination\n */\n Terminate = () => {\n this.options.logger.debug(`ArchiveManager:Terminate()`);\n if (this.timeout) {\n this.options.logger.debug(`ArchiveManager:Terminate() - this.timeout cleared ...`);\n clearTimeout(this.timeout);\n }\n\n if (this.archiveDelTimeout) {\n this.options.logger.debug(`ArchiveManager:Terminate() - this.archiveDelTimeout cleared ...`);\n clearTimeout(this.archiveDelTimeout);\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerInstance\n * ----------------\n * Concrete runtime implementation of {@link IWorkerEx}.\n *\n * A WorkerInstance represents a single worker process/thread plus the collection\n * of runner instances hosted inside that worker.\n *\n * Responsibilities:\n * - Own the in-memory collection of runner instances for this worker\n * - Dispatch commands to individual runners via the message broker\n * - Dispatch bulk commands to all runners in this worker\n * - Create and register new runners in this worker\n * - Expose serialisable worker models (`toJSON`, `toWorker`, `toWorkerCore`)\n * - Maintain worker-level event subscriptions\n * - Coordinate worker termination and registry cleanup\n */\n\nimport {\n eIWMessageCommands,\n IExecuteRunnerActionResult,\n IRunnerEvent,\n IRunnerEx,\n IRunnerOptions,\n IRunnerState,\n IRunners,\n IWorker,\n IWorkerCore,\n IWorkerEx,\n IWorkerFactory,\n IWorkerOptions,\n IIWMessageCommand,\n IWorkerEvent\n} from './commonTypes';\n\nimport { defaultLogger } from '@nsshunt/stsutils';\nimport chalk from 'chalk';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { WorkerRegistry } from './workerRegistry';\nimport { STSMessageBroker } from './messageBroker';\nimport { AsyncRunnerInstanceManager } from './asyncRunnerInstanceManager';\n\nimport type { Worker as NodeWorker, MessagePort as NodeMessagePort } from 'node:worker_threads';\n\n/**\n * Runtime worker type supporting both browser and Node.js workers.\n */\nexport type RuntimeWorker = Worker | NodeWorker;\n\n/**\n * Runtime message port type supporting both browser and Node.js message ports.\n */\nexport type RuntimeMessagePort = MessagePort | NodeMessagePort;\n\n/**\n * Constructor options required to create a {@link WorkerInstance}.\n *\n * Notes:\n * - `workerManagerId` identifies the owning worker manager instance.\n * - `workerOptions` contains the runtime configuration for the worker itself.\n * - `messagePort` is the communication port already allocated for this worker.\n * - `workerFactory` is responsible for creating the underlying actual worker thread/process.\n * - `messageBroker` is used for request/response message dispatch to the worker.\n * - `workerRegistry` is used for central registry cleanup during termination.\n * - `asyncRunnerInstanceManager` is used to construct runner instances for this worker.\n * - `logger` is intentionally minimal and only requires debug/error methods.\n */\nexport interface IWorkerInstanceOptions {\n /** Id of the owning worker manager. */\n workerManagerId: string;\n\n /** Worker-specific runtime configuration. */\n workerOptions: IWorkerOptions;\n\n /** Message port used by this worker for brokered communications. */\n messagePort: RuntimeMessagePort;\n\n /** Factory used to construct the underlying worker implementation. */\n workerFactory: IWorkerFactory;\n\n /** Broker used to send commands and correlate responses for this worker. */\n messageBroker: STSMessageBroker;\n\n /** Shared registry containing all live worker instances. */\n workerRegistry: WorkerRegistry;\n\n /** Factory/manager used to create runner instances for this worker. */\n asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n\n /** Logger abstraction used by this class. */\n logger: {\n debug: (message: any) => void;\n error: (message: any) => void;\n };\n}\n\n/**\n * Worker-level bulk commands that can be fanned out across all runners\n * hosted by this worker.\n *\n * Important:\n * - These names intentionally match the public method names on {@link IRunnerEx},\n * allowing generic invocation in {@link WorkerInstance.#invokeCommand}.\n * - `Terminate` is intentionally excluded because worker termination requires\n * additional worker-level shutdown logic beyond simply calling all runner\n * terminate operations.\n */\ntype WorkerBulkCommand =\n | 'Start'\n | 'Stop'\n | 'Pause'\n | 'Resume'\n | 'Reset'\n | 'Execute'\n | 'Update';\n\n/**\n * Concrete worker runtime instance.\n *\n * This class owns:\n * - the underlying worker handle (`worker`)\n * - the broker message port (`messagePort`)\n * - all runner instances hosted inside this worker (`__runnersEx`)\n * - worker-level event subscriptions (`workerEvents`)\n * - runner-level event subscription collections (`runnersEvents`)\n *\n * Design notes:\n * - `__runnersEx` is intentionally private to stop callers from mutating the\n * runner collection directly.\n * - The class delegates command dispatch to the message broker rather than\n * communicating with the underlying worker directly.\n * - Most public methods are thin orchestration methods over private helpers.\n */\nexport class WorkerInstance implements IWorkerEx {\n /** Unique identifier for this worker instance. */\n public id: string;\n\n /** Id of the owning worker manager. */\n public workerManagerId: string;\n\n /**\n * Underlying actual worker runtime (browser worker or Node worker thread).\n */\n public worker: RuntimeWorker;\n\n /**\n * Registered worker-level event subscriptions.\n *\n * Typical events may include lifecycle events emitted elsewhere in the system,\n * such as `exit`, `error`, etc.\n */\n public workerEvents: IWorkerEvent[] = [];\n\n /**\n * Communication port used by the message broker for this worker.\n */\n public messagePort: RuntimeMessagePort;\n\n /** Worker runtime configuration. */\n public options: IWorkerOptions;\n\n /**\n * Per-runner event subscription collections, keyed by runner id.\n *\n * Each runner id maps to a list of subscriptions interested in events\n * for that specific runner.\n */\n public runnersEvents: Record<string, IRunnerEvent[]> = {};\n\n /**\n * Private in-memory map of runner runtime instances owned by this worker.\n *\n * Key: runner id\n * Value: live runner runtime instance\n */\n private __runnersEx: Record<string, IRunnerEx> = {};\n\n /** Message broker used for worker/runner command dispatch and callback correlation. */\n readonly #messageBroker: STSMessageBroker;\n\n /** Shared registry used for worker lookup and cleanup. */\n readonly #workerRegistry: WorkerRegistry;\n\n /** Manager responsible for constructing runner runtime instances. */\n readonly #asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n\n /** Logger used for operational diagnostics. */\n readonly #logger: {\n debug: (message: any) => void;\n error: (message: any) => void;\n };\n\n /**\n * Construct a new live worker runtime instance.\n *\n * Behaviour:\n * - Generates a new worker id\n * - Creates the underlying concrete worker using the provided factory\n * - Stores the provided message port and runtime options\n * - Stores references to collaborating services\n *\n * @param options Dependencies and configuration required to construct the worker.\n */\n constructor(options: IWorkerInstanceOptions) {\n this.id = uuidv4();\n this.workerManagerId = options.workerManagerId;\n this.worker = options.workerFactory.createWorkerThreadWorker() as RuntimeWorker;\n this.messagePort = options.messagePort;\n this.options = options.workerOptions;\n\n this.#messageBroker = options.messageBroker;\n this.#workerRegistry = options.workerRegistry;\n this.#asyncRunnerInstanceManager = options.asyncRunnerInstanceManager;\n this.#logger = options.logger;\n }\n\n /**\n * Add an already-created runner runtime instance into this worker's internal collection.\n *\n * This method only updates local in-memory state. It does not send any message\n * to the underlying worker. Use {@link AddRunner} when you want the runner to be\n * both created locally and pushed into the underlying worker process/thread.\n *\n * @param runnerEx Runner runtime instance to register under this worker.\n */\n AddRunnerEx(runnerEx: IRunnerEx): void {\n this.__runnersEx[runnerEx.id] = runnerEx;\n }\n\n /**\n * Get a single runner runtime instance by id.\n *\n * @param id Runner id to look up.\n * @returns The runner instance if found, otherwise `null`.\n */\n GetRunnerEx(id: string): IRunnerEx | null {\n return this.__runnersEx[id] ?? null;\n }\n\n /**\n * Get the raw internal runner map for this worker.\n *\n * Note:\n * This returns the live in-memory map, not a defensive copy.\n *\n * @returns Record of runner id -> runner instance.\n */\n GetAllRunnersExMap(): Record<string, IRunnerEx> {\n return this.__runnersEx;\n }\n\n /**\n * Get all runner runtime instances currently hosted by this worker.\n *\n * @returns Array of all runner instances.\n */\n GetAllRunnersEx(): IRunnerEx[] {\n return Object.values(this.__runnersEx);\n }\n\n /**\n * Get runner runtime instances filtered by runner id.\n *\n * Behaviour:\n * - If `runnerIds` is empty, all runners are returned.\n * - Otherwise only matching runner ids are returned.\n *\n * @param runnerIds List of runner ids to include. Use `[]` to include all.\n * @returns Filtered runner list.\n */\n GetRunnersEx(runnerIds: string[]): IRunnerEx[] {\n return this.GetAllRunnersEx().filter(\n runnerEx => runnerIds.length === 0 || runnerIds.includes(runnerEx.id)\n );\n }\n\n /**\n * Create a new runner runtime instance, register it in this worker,\n * and send an `AddRunner` command to the underlying worker.\n *\n * @param runnerOptions Runtime options for the new runner.\n * @returns Newly created runner instance once successfully registered with the underlying worker.\n */\n AddRunner(runnerOptions: IRunnerOptions): Promise<IRunnerEx> {\n return this.#addRunnerToWorker(runnerOptions);\n }\n\n /**\n * Send a `StartRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n StartRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.StartRunner);\n }\n\n /**\n * Send a `StopRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n StopRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.StopRunner);\n }\n\n /**\n * Send a `PauseRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n PauseRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.PauseRunner);\n }\n\n /**\n * Send a `ResumeRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n ResumeRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.ResumeRunner);\n }\n\n /**\n * Send a `TerminateRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n TerminateRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.TerminateRunner);\n }\n\n /**\n * Send a `ResetRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n ResetRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.ResetRunner);\n }\n\n /**\n * Send an `ExecuteRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n ExecuteRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.ExecuteRunner);\n }\n\n /**\n * Send an `UpdateRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @param runnerOptions Partial runner option updates to apply.\n * @returns Action result returned by the worker.\n */\n UpdateRunner(\n runner: IRunnerEx,\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.UpdateRunner, runnerOptions);\n }\n\n /**\n * Send `Start` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Start(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Start');\n }\n\n /**\n * Send `Stop` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Stop(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Stop');\n }\n\n /**\n * Send `Pause` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Pause(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Pause');\n }\n\n /**\n * Send `Resume` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Resume(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Resume');\n }\n\n /**\n * Send `Reset` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Reset(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Reset');\n }\n\n /**\n * Send `Execute` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Execute(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Execute');\n }\n\n /**\n * Send `Update` to all runners in this worker.\n *\n * @param runnerOptions Partial runner option updates to apply to all runners.\n * @returns Array of per-runner action results.\n */\n Update(runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Update', runnerOptions);\n }\n\n /**\n * Terminate all runners in this worker and then terminate the underlying worker itself.\n *\n * Behaviour:\n * - Calls `Terminate()` on all runner instances first\n * - Waits for those promises via `Promise.all`\n * - Schedules actual worker termination 500ms later\n * - Removes the worker from the central registry after terminating the worker\n *\n * Notes:\n * - This method intentionally handles worker-level shutdown separately rather than\n * using {@link #invokeCommand} because worker termination involves additional\n * cleanup beyond runner termination.\n * - The 500ms timeout is a grace period before terminating the underlying worker.\n *\n * @returns Array of per-runner action results, or `[]` if termination setup fails.\n */\n async Terminate(): Promise<IExecuteRunnerActionResult[]> {\n try {\n const runners = this.GetAllRunnersEx();\n const promArray: Promise<IExecuteRunnerActionResult>[] = [];\n\n for (let i = 0; i < runners.length; i++) {\n promArray.push(runners[i].Terminate());\n }\n\n const retVal = Promise.all(promArray);\n\n if (this.worker) {\n setTimeout(() => {\n this.worker.terminate();\n this.#logger.debug(`_TerminateWorker(): Terminated worker: [${this.id}]`);\n this.#workerRegistry.DeleteWorker(this.id);\n }, 500);\n }\n\n return retVal;\n } catch (error) {\n this.#logger.error(`_TerminateWorker(): Error: [${error}]`);\n return [];\n }\n }\n\n /**\n * Register a worker-level event subscription.\n *\n * This supports a fluent style:\n * `worker.on('exit', cb).on('error', cb2)`\n *\n * @param eventName Name of the event to subscribe to.\n * @param cb Callback to invoke when the event is emitted.\n * @returns The current worker instance for chaining.\n */\n on(eventName: string, cb: (args?: any) => void): IWorkerEx {\n this.workerEvents.push({\n eventName,\n cb\n });\n return this;\n }\n\n /**\n * Convert this live worker runtime instance into a serialisable worker model.\n *\n * Behaviour:\n * - Copies worker metadata\n * - Serialises all live runners via `runnerEx.toJSON()`\n *\n * @returns Full serialisable worker model.\n */\n toJSON(): IWorker {\n const workerCopy: IWorker = {\n id: this.id,\n options: { ...this.options },\n runners: {},\n workerManagerId: this.workerManagerId\n };\n\n for (const runnerEx of Object.values(this.__runnersEx)) {\n (workerCopy.runners as IRunners)[runnerEx.id] = runnerEx.toJSON();\n }\n\n return workerCopy;\n }\n\n /**\n * Alias for {@link toJSON}.\n *\n * @returns Full serialisable worker model.\n */\n toWorker(): IWorker {\n return this.toJSON();\n }\n\n /**\n * Convert this worker into a reduced/core representation.\n *\n * Behaviour:\n * - Includes only the worker id plus filtered runner core models\n * - If `states` is:\n * - `undefined`: includes all runners\n * - `[]`: includes all runners\n * - populated: includes only runners whose state matches one of the provided states\n *\n * @param states Optional runner state filter.\n * @returns Core worker model containing core runner representations.\n * @throws Re-throws any error after logging.\n */\n toWorkerCore(states?: IRunnerState[]): IWorkerCore {\n try {\n const workerCopy: IWorkerCore = {\n id: this.id,\n runners: {}\n };\n\n const filterList = this.GetAllRunnersEx().filter(\n runnerEx => (states ? (states.length === 0 ? true : states.includes(runnerEx.state)) : true)\n );\n\n filterList.forEach(runnerEx => {\n workerCopy.runners[runnerEx.id] = runnerEx.toRunnerCore();\n });\n\n return workerCopy;\n } catch (error) {\n defaultLogger.error(`toWorkerCore(): Error: [${error}]`);\n throw error;\n }\n }\n\n /**\n * Send a command for a specific runner via the message broker.\n *\n * This is the central low-level runner-command dispatch helper used by the\n * per-runner command methods.\n *\n * @param runnerEx Target runner.\n * @param command Broker command to send.\n * @param runnerOptions Optional partial runner options used for update operations.\n * @returns Action result returned by the message broker/worker.\n */\n #sendRunnerCommand(\n runnerEx: IRunnerEx,\n command: IIWMessageCommand,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> {\n return this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n this,\n runnerEx,\n command,\n runnerOptions\n );\n }\n\n /**\n * Invoke a bulk command across all runners currently hosted by this worker.\n *\n * Behaviour:\n * - Enumerates all current runners\n * - Dynamically invokes the matching runner method by name\n * - If `runnerOptions` is supplied, passes it as the single argument\n * - Returns a `Promise.all(...)` over all runner action promises\n *\n * Notes:\n * - This is used for worker-wide Start/Stop/Pause/Resume/Reset/Execute/Update operations.\n * - `Terminate` is intentionally not handled here because worker-level termination has\n * extra shutdown and cleanup behaviour.\n *\n * @param command Name of the runner method to invoke on each runner.\n * @param runnerOptions Optional partial runner options for update scenarios.\n * @returns Array of per-runner action results.\n */\n async #invokeCommand(\n command: WorkerBulkCommand,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]> {\n const runners = this.GetAllRunnersEx();\n const promArray: Promise<IExecuteRunnerActionResult>[] = [];\n\n for (let i = 0; i < runners.length; i++) {\n if (runnerOptions) {\n promArray.push((runners[i][command] as any)(runnerOptions));\n } else {\n promArray.push((runners[i][command] as any)());\n }\n }\n\n return Promise.all(promArray);\n }\n\n /**\n * Internal helper used by {@link AddRunner}.\n *\n * Behaviour:\n * - Creates a new live runner runtime instance using the async runner instance manager\n * - Registers the runner locally in this worker\n * - Sends `AddRunner` to the underlying worker via the message broker\n * - Writes optional instrument/log output for diagnostics\n *\n * @param runnerOptions Runtime options for the new runner.\n * @returns Newly created runner instance once worker-side registration succeeds.\n * @throws Re-throws any error after logging.\n */\n async #addRunnerToWorker(runnerOptions: IRunnerOptions): Promise<IRunnerEx> {\n this.#logger.debug(`AddRunnerToWorker()`);\n\n try {\n const runnerEx = this.#asyncRunnerInstanceManager.CreateAsyncRunner(this, runnerOptions);\n this.AddRunnerEx(runnerEx);\n\n const retVal = await this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n this,\n runnerEx,\n eIWMessageCommands.AddRunner\n );\n\n if (runnerEx.publishInstrumentController) {\n runnerEx.publishInstrumentController.LogEx(\n chalk.green(`Added runner: [${runnerEx.id}] into worker: [${this.id}]`)\n );\n }\n\n if (retVal) {\n this.#logger.debug(\n chalk.green(\n `Added runner: [${runnerEx.id}] into worker: [${this.id}] result: [${JSON.stringify(retVal)}]`\n )\n );\n }\n\n return runnerEx;\n } catch (error) {\n this.#logger.error(`AddRunnerToWorker(): Error: [${error}]`);\n throw error;\n }\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerInstanceManager\n * =====================\n *\n * Factory and lifecycle helper responsible for:\n *\n * - constructing manager-side worker runtime objects (`IWorkerEx`)\n * - wiring shared dependencies into those worker instances\n * - attaching low-level system/runtime event handlers to the underlying actual worker\n * - translating native worker events into higher-level worker events\n * - removing failed/exited workers from the shared registry\n *\n * Role in the architecture\n * ------------------------\n * This class lives on the **manager/controller side** of the system.\n *\n * It should not be confused with:\n *\n * - the actual browser Web Worker / Node worker thread runtime, or\n * - the abstract worker-runtime execution host that runs inside the worker\n *\n * Instead, this class is responsible for creating and configuring the\n * manager-side `IWorkerEx` object that represents a live worker to the rest\n * of the coordination layer.\n *\n * Typical responsibilities in practice\n * ------------------------------------\n * 1. Create a new manager-side worker object using the configured factory\n * 2. Inject shared collaborators such as:\n * - message broker\n * - worker registry\n * - async runner instance manager\n * 3. Attach low-level native worker runtime event listeners:\n * - Node.js: `exit`, `error`\n * - Browser: `onerror`, `onmessageerror`\n * 4. Forward those low-level events into higher-level worker events\n * 5. Remove failed/exited workers from the shared registry when appropriate\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport { IWorkerEx, IWorkerFactory, IWorkerOptions } from './commonTypes';\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport isNode from 'detect-node';\n\nimport { STSMessageBroker } from './messageBroker';\nimport { AsyncRunnerInstanceManager } from './asyncRunnerInstanceManager';\nimport { WorkerRegistry } from './workerRegistry';\nimport { WorkerInstance } from './workerInstance';\n\n/**\n * Constructor options for {@link WorkerInstanceManager}.\n */\nexport interface IWorkerInstanceManagerOptions {\n /**\n * Id of the top-level worker manager that owns all workers created through this manager.\n */\n workerManagerId: string;\n\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared message broker used by created worker instances to communicate with their\n * underlying actual worker runtime.\n */\n messageBroker: STSMessageBroker;\n\n /**\n * Shared live worker registry.\n *\n * Used when system events require worker removal/cleanup.\n */\n workerRegistry: WorkerRegistry;\n\n /**\n * Shared async runner instance manager used by worker instances when creating runners.\n */\n asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n}\n\n/**\n * Manager-side factory/helper for worker instances.\n *\n * This class creates concrete manager-side {@link IWorkerEx} objects and attaches\n * platform-specific system event listeners to the underlying worker runtime.\n */\nexport class WorkerInstanceManager {\n /**\n * Immutable runtime configuration and dependencies for this manager.\n */\n private readonly options: IWorkerInstanceManagerOptions;\n\n /**\n * Construct a new worker instance manager.\n *\n * @param options Shared collaborators required to create and manage worker instances.\n */\n constructor(options: IWorkerInstanceManagerOptions) {\n this.options = options;\n }\n\n /**\n * Create a new manager-side worker instance.\n *\n * Behaviour:\n * - constructs a new concrete {@link WorkerInstance}\n * - injects all shared collaborators required by that worker instance\n * - returns the created manager-side worker object\n *\n * Notes:\n * - This does not automatically register the worker in the registry\n * - This does not automatically attach system/runtime event handlers\n * - Those are handled separately by the caller\n *\n * Dependencies injected into the worker include:\n * - worker manager id\n * - worker-specific options\n * - message port\n * - worker factory\n * - message broker\n * - worker registry\n * - async runner instance manager\n * - logger\n *\n * @param workerOptions Worker-specific runtime configuration.\n * @param port Message port used for brokered worker communication.\n * @param workerFactory Factory used to create the underlying actual worker runtime.\n * @returns Newly created manager-side worker instance.\n */\n CreateWorkerInstance = (\n workerOptions: IWorkerOptions,\n port: any,\n workerFactory: IWorkerFactory\n ): IWorkerEx => {\n return new WorkerInstance({\n workerManagerId: this.options.workerManagerId,\n workerOptions,\n messagePort: port,\n workerFactory,\n messageBroker: this.options.messageBroker,\n workerRegistry: this.options.workerRegistry,\n asyncRunnerInstanceManager: this.options.asyncRunnerInstanceManager,\n logger: this.options.logger\n });\n };\n\n /**\n * Attach low-level system/runtime event handlers to the underlying actual worker.\n *\n * Environment-specific behaviour:\n *\n * Node.js worker thread:\n * - attaches `exit`\n * - attaches `error`\n *\n * Browser Web Worker:\n * - attaches `onerror`\n * - attaches `onmessageerror`\n *\n * Event handling behaviour\n * ------------------------\n * - Logs the low-level worker event\n * - Emits a higher-level worker event to any subscribers on `workerEx.workerEvents`\n * - Removes the worker from the shared registry when appropriate\n *\n * Registry removal behaviour:\n * - Node `exit` -> deletes worker from registry\n * - Browser `onerror` -> deletes worker from registry\n * - Node `error` does not immediately delete the worker\n * - Browser `onmessageerror` does not immediately delete the worker\n *\n * Notes:\n * - This method should typically be called after creating the worker instance\n * and before the worker is considered fully live\n * - For mocked workers or other special worker implementations, callers may\n * choose not to attach these runtime handlers\n *\n * @param stsWorkerEx Manager-side worker instance whose underlying actual worker should be monitored.\n */\n SetupWorkerSystemEvents = (stsWorkerEx: IWorkerEx) => {\n if (isNode) {\n /**\n * Node.js worker thread exit event.\n *\n * Indicates the worker has fully exited and should be removed from the live registry.\n */\n stsWorkerEx.worker.on('exit', (code: any) => {\n try {\n this.options.logger.debug(\n chalk.magenta(`STSWorkerManager:stsWorkerEx.worker.on(exit): Worker exited with code: ${code}`)\n );\n\n this._EmitWorkerEvent('exit', stsWorkerEx);\n\n this.options.workerRegistry.DeleteWorker(stsWorkerEx.id);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.on(exit): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n });\n\n /**\n * Node.js worker thread error event.\n *\n * Indicates an unhandled runtime error occurred inside the worker.\n * This implementation emits the higher-level event but does not\n * automatically remove the worker from the registry.\n */\n stsWorkerEx.worker.on('error', (error: any) => {\n try {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.on(error): Worker error: ${error}`)\n );\n\n this._EmitWorkerEvent('error', stsWorkerEx);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.on(error): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n });\n } else {\n /**\n * Browser Web Worker fatal/runtime error handler.\n *\n * Emits a higher-level worker error event and removes the worker from the registry.\n */\n (stsWorkerEx.worker as any).onerror = (error: any) => {\n try {\n this.options.logger.error(\n chalk.red('STSWorkerManager:stsWorkerEx.worker.onerror(): Error in worker:', error)\n );\n\n this._EmitWorkerEvent('onerror', stsWorkerEx);\n\n this.options.workerRegistry.DeleteWorker(stsWorkerEx.id);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.onerror(error): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n };\n\n /**\n * Browser Web Worker message deserialisation/invalid message handler.\n *\n * Emits a higher-level `onmessageerror` event but does not automatically\n * remove the worker from the registry.\n */\n (stsWorkerEx.worker as any).onmessageerror = (error: any) => {\n try {\n this.options.logger.error(\n chalk.red('STSWorkerManager:stsWorkerEx.worker.onmessageerror(): Message error in worker:', error)\n );\n\n this._EmitWorkerEvent('onmessageerror', stsWorkerEx);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.onmessageerror(error): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n };\n }\n };\n\n /**\n * Emit a higher-level worker event to any registered worker event subscribers.\n *\n * Behaviour:\n * - iterates the worker's registered `workerEvents`\n * - matches handlers whose `eventName` equals the supplied event name\n * - invokes each matching callback with the live worker instance\n *\n * This method is used to translate low-level native worker/runtime events into\n * the higher-level event model used by the rest of the framework.\n *\n * @param eventName Name of the worker event to emit.\n * @param workerEx Live manager-side worker instance associated with the event.\n * @throws Re-throws unexpected errors after logging.\n */\n private _EmitWorkerEvent = (eventName: string, workerEx: IWorkerEx) => {\n try {\n workerEx.workerEvents.forEach(ev => {\n if (ev.eventName.localeCompare(eventName) === 0) {\n ev.cb(workerEx);\n }\n });\n } catch (error) {\n this.options.logger.error(`_EmitWorkerEvent(): Error: [${error}]`);\n throw error;\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerRegistry\n * ==============\n *\n * Central in-memory registry for all live manager-side workers and runners.\n *\n * This class is responsible for maintaining the manager-side runtime graph of:\n *\n * - workers (`IWorkerEx`)\n * - runners (`IRunnerEx`) owned by those workers\n *\n * Architectural role\n * ------------------\n * `WorkerRegistry` acts as the single source of truth for the current live\n * manager-side object model.\n *\n * Other services use this registry to:\n *\n * - locate workers\n * - locate runners within workers\n * - add/remove workers and runners\n * - generate serialisable worker maps\n * - generate reduced/core worker maps\n * - select workers by current runner load\n *\n * Design notes\n * ------------\n * - This is an in-memory registry only.\n * - It stores live manager-side runtime objects, not worker-runtime objects.\n * - It does not perform worker/runner execution itself.\n * - It does not own broker or synchronisation logic; it is purely a shared store\n * plus convenience lookup/selection helpers.\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport { IWorkerEx, IRunnerEx, IRunnerState, IWorkers, IWorkerCore } from './commonTypes';\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link WorkerRegistry}.\n */\nexport interface IWorkerRegistryOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n}\n\n/**\n * Central live registry of workers and runners.\n *\n * This class stores the manager-side live runtime objects and provides lookup,\n * mutation, projection, and simple worker-selection helpers.\n */\nexport class WorkerRegistry {\n /**\n * Internal live worker map keyed by worker id.\n *\n * Each value is a live manager-side worker instance.\n */\n private readonly workersEx: Record<string, IWorkerEx> = {};\n\n /**\n * Immutable runtime configuration for the registry.\n */\n private readonly options: IWorkerRegistryOptions;\n\n /**\n * Construct a new worker registry.\n *\n * @param options Logger and related registry dependencies.\n */\n constructor(options: IWorkerRegistryOptions) {\n this.options = options;\n }\n\n /**\n * Add a live worker instance to the registry.\n *\n * Behaviour:\n * - stores the supplied worker under its `id`\n * - replaces any existing worker already stored under the same id\n *\n * Notes:\n * - This method does not validate whether the worker already exists\n * - Callers are responsible for ensuring worker ids are unique\n *\n * @param stsWorkerEx Live worker instance to register.\n */\n AddWorker = (stsWorkerEx: IWorkerEx) => {\n this.workersEx[stsWorkerEx.id] = stsWorkerEx;\n };\n\n /**\n * Add a runner to an existing worker in the registry.\n *\n * Behaviour:\n * - resolves the target worker by `workerId`\n * - delegates runner storage to the worker's `AddRunnerEx(...)` method\n *\n * Error handling:\n * - throws if the target worker does not exist\n *\n * @param workerId Id of the worker that should own the runner.\n * @param runnerEx Live runner instance to register.\n * @throws If the target worker does not exist in the registry.\n */\n AddRunner = (workerId: string, runnerEx: IRunnerEx) => {\n if (this.workersEx[workerId]) {\n this.workersEx[workerId].AddRunnerEx(runnerEx);\n } else {\n throw new Error(`WorkerRegistry:AddRunner(): Error: [Worker: [${workerId}] does not exist]`);\n }\n };\n\n /**\n * Get a live worker instance by id.\n *\n * @param worderId Worker id to resolve.\n * @returns Matching live worker instance, or `undefined` if not found.\n */\n GetWorker = (worderId: string): IWorkerEx | undefined => {\n return this.workersEx[worderId];\n };\n\n /**\n * Get a live runner instance by worker id and runner id.\n *\n * Behaviour:\n * - resolves the worker first\n * - asks the worker for the runner by id\n *\n * @param workerId Owning worker id.\n * @param id Runner id.\n * @returns Matching live runner instance, or `null` if not found.\n */\n GetRunnerEx = (workerId: string, id: string): IRunnerEx | null => {\n const workerEx = this.GetWorkerEx(workerId);\n if (workerEx) {\n return workerEx.GetRunnerEx(id);\n }\n return null;\n };\n\n /**\n * Delete a worker from the live registry.\n *\n * Behaviour:\n * - removes the worker entry if it exists\n * - does nothing if the worker is not present\n *\n * Note:\n * - This does not explicitly terminate the underlying worker\n * - It only removes the manager-side live registry entry\n *\n * @param workerId Worker id to delete.\n */\n DeleteWorker = (workerId: string): void => {\n if (this.workersEx[workerId]) {\n delete this.workersEx[workerId];\n }\n };\n\n /**\n * Delete a runner from a worker in the live registry.\n *\n * Behaviour:\n * - resolves the owning worker\n * - resolves the worker's live runner map\n * - deletes the matching runner entry if present\n *\n * Notes:\n * - This operates only on the manager-side live registry\n * - It does not send any message to the worker runtime\n * - It is typically used after a runner has already been archived/retired\n *\n * @param workerId Owning worker id.\n * @param runnerId Runner id to delete.\n */\n DeleteRunner = (workerId: string, runnerId: string): void => {\n const worker = this.GetWorker(workerId);\n if (worker) {\n const runnersMap = worker.GetAllRunnersExMap();\n if (runnersMap) {\n if (runnersMap[runnerId]) {\n delete runnersMap[runnerId];\n }\n }\n }\n };\n\n /**\n * Build and return the full serialisable workers map.\n *\n * Behaviour:\n * - iterates all live workers\n * - converts each worker to its serialisable `IWorker` representation\n * - returns the full map keyed by worker id\n *\n * Error handling:\n * - logs and re-throws unexpected errors\n *\n * @returns Full serialisable workers map.\n * @throws Re-throws unexpected errors after logging.\n */\n GetWorkersMap = (): IWorkers => {\n try {\n const retVal: IWorkers = {};\n for (const [, workerEx] of Object.entries(this.workersEx)) {\n retVal[workerEx.id] = workerEx.toWorker();\n }\n return retVal;\n } catch (error) {\n this.options.logger.error(`GetWorkers(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the raw live runner map for a specific worker.\n *\n * Behaviour:\n * - resolves the worker by id\n * - returns the worker's internal runner map\n *\n * @param workerId Worker id.\n * @returns Runner map keyed by runner id, or `undefined` if the worker does not exist.\n */\n GetAllRunnersExMap = (workerId: string): Record<string, IRunnerEx> | undefined => {\n const workersEx = this.GetWorkerEx(workerId);\n if (workersEx) {\n return workersEx.GetAllRunnersExMap();\n }\n };\n\n /**\n * Get a filtered list of live worker instances.\n *\n * Behaviour:\n * - if `workerIds` is empty, returns all workers\n * - otherwise returns only workers whose ids are present in `workerIds`\n *\n * @param workerIds Worker ids to include. Use `[]` for all workers.\n * @returns Filtered list of live worker instances.\n */\n GetWorkersEx = (workerIds: string[]): IWorkerEx[] => {\n return Object.values(this.workersEx).filter((workerEx) =>\n (workerIds.length === 0 ? true : workerIds.includes(workerEx.id))\n );\n };\n\n /**\n * Get a live worker instance by id.\n *\n * This is functionally equivalent to {@link GetWorker}, but preserves the\n * `Ex` naming convention used elsewhere in the framework.\n *\n * @param workerId Worker id.\n * @returns Matching live worker instance, or `undefined` if not found.\n */\n GetWorkerEx = (workerId: string): IWorkerEx | undefined => {\n return this.workersEx[workerId];\n };\n\n /**\n * Build and return the reduced/core workers map.\n *\n * Behaviour:\n * - iterates all live workers\n * - converts each worker to its reduced/core representation\n * - optionally filters included runners by state\n *\n * Runner state filtering:\n * - `undefined` => include all runners\n * - `[]` => include all runners\n * - populated array => include only matching runner states\n *\n * Error handling:\n * - logs and re-throws unexpected errors\n *\n * @param states Optional runner-state filter.\n * @returns Reduced/core workers map keyed by worker id.\n * @throws Re-throws unexpected errors after logging.\n */\n GetWorkersCoreMap = (states?: IRunnerState[]): Record<string, IWorkerCore> => {\n try {\n const retVal: Record<string, IWorkerCore> = {};\n for (const [, workerEx] of Object.entries(this.workersEx)) {\n (retVal[workerEx.id] as any) = workerEx.toWorkerCore(states);\n }\n return retVal;\n } catch (error) {\n this.options.logger.error(`GetWorkersCore(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the worker currently hosting the fewest runners.\n *\n * Selection rule:\n * - returns the worker with the smallest `GetAllRunnersEx().length`\n *\n * Behaviour:\n * - if no workers exist, returns `null`\n * - on error, logs and returns `null`\n *\n * Intended use:\n * - simple load spreading / least-loaded worker selection\n *\n * @returns Least-loaded worker, or `null` if unavailable.\n */\n GetNextAvailableWorker = (): IWorkerEx | null => {\n try {\n let leastRunnerWorker: IWorkerEx | null = null;\n\n for (const [, stsWorker] of Object.entries(this.workersEx)) {\n if (leastRunnerWorker) {\n if (stsWorker.GetAllRunnersEx().length < leastRunnerWorker.GetAllRunnersEx().length) {\n leastRunnerWorker = stsWorker;\n }\n } else {\n leastRunnerWorker = stsWorker;\n }\n }\n\n return leastRunnerWorker;\n } catch (error) {\n this.options.logger.error(`GetNextAvailableWorker(): Error: [${error}]`);\n return null;\n }\n };\n\n /**\n * Get the worker currently hosting the most runners.\n *\n * Selection rule:\n * - returns the worker with the largest `GetAllRunnersEx().length`\n *\n * Behaviour:\n * - if no workers exist, returns `null`\n * - on error, logs and returns `null`\n *\n * Intended use:\n * - diagnostics\n * - load analysis\n * - busiest-worker selection logic\n *\n * @returns Most-loaded worker, or `null` if unavailable.\n */\n GetBusiestWorker = (): IWorkerEx | null => {\n try {\n let busyWorker: IWorkerEx | null = null;\n\n for (const [, stsWorker] of Object.entries(this.workersEx)) {\n if (busyWorker) {\n if (stsWorker.GetAllRunnersEx().length > busyWorker.GetAllRunnersEx().length) {\n busyWorker = stsWorker;\n }\n } else {\n busyWorker = stsWorker;\n }\n }\n\n return busyWorker;\n } catch (error) {\n this.options.logger.error(`GetBusiestWorker(): Error: [${error}]`);\n return null;\n }\n };\n}","/**\n * TelemetryProcessor\n * ------------------\n * Responsible for translating raw runner telemetry into updates for the\n * observability instrumentation system.\n *\n * This class acts as the bridge between:\n *\n * - the internal runner telemetry model (`IRunnerTelemetry`)\n * - the external observability instrumentation system\n * (`PublishInstrumentController` from `@nsshunt/stsinstrumentmanagerclient`)\n *\n * The processor interprets telemetry values and updates the appropriate\n * gauges, counters, and histograms defined in the observability model\n * (`@nsshunt/stsobservability`).\n *\n * High-level responsibilities:\n *\n * 1. Convert runner telemetry fields into instrumentation updates\n * 2. Push those updates to the PublishInstrumentController\n * 3. Forward any telemetry log messages\n * 4. Track whether any meaningful update occurred\n *\n * The processor is intentionally stateless. It simply transforms and forwards\n * telemetry values.\n */\n\nimport { InstrumentGaugeTelemetry, Gauge } from '@nsshunt/stsobservability';\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\nimport { IRunnerTelemetry } from \"./commonTypes\";\n\n/**\n * hasValue\n * --------\n * Utility type-guard function used to determine whether a value is defined\n * (i.e., not `undefined` and not `null`).\n *\n * Purpose\n * -------\n * In many telemetry and data-processing scenarios, values such as `0` are\n * valid and should not be treated as \"missing\". However, common truthy checks\n * like:\n *\n * if (value) { ... }\n *\n * will incorrectly treat `0`, `false`, or empty strings as absent values.\n *\n * This helper explicitly checks only for `null` and `undefined`, allowing\n * legitimate values like `0` to pass through.\n *\n * Type Guard Behaviour\n * --------------------\n * This function is implemented as a **TypeScript type guard** using the\n * return type:\n *\n * v is T\n *\n * When used inside a conditional block, TypeScript will narrow the type\n * of `v` from `T | null | undefined` to `T`.\n *\n * Example\n * -------\n *\n * ```ts\n * const value: number | undefined = telemetry.requestCount;\n *\n * if (hasValue(value)) {\n * // value is now typed as number (not undefined)\n * publishMetric(value);\n * }\n * ```\n *\n * Without the type guard, TypeScript would still consider `value` to possibly\n * be `undefined`.\n *\n * Runtime Behaviour\n * -----------------\n * Returns `true` if:\n *\n * - the value is not `undefined`\n * - the value is not `null`\n *\n * Returns `false` if:\n *\n * - the value is `undefined`\n * - the value is `null`\n *\n * Valid values that will return `true` include:\n *\n * - `0`\n * - `false`\n * - `\"\"` (empty string)\n * - `NaN`\n * - empty arrays or objects\n *\n * This makes it safe for telemetry and metric processing where `0`\n * represents a valid measurement.\n *\n * @typeParam T\n * The underlying type of the value being checked.\n *\n * @param v\n * The value to evaluate.\n *\n * @returns\n * `true` if the value is neither `null` nor `undefined`,\n * otherwise `false`.\n */\nfunction hasValue<T>(v: T | null | undefined): v is T {\n return v !== undefined && v !== null;\n}\n\n/**\n * Processes telemetry emitted by a runner and forwards it to the\n * instrumentation subsystem.\n */\nexport class TelemetryProcessor {\n\n /**\n * Process telemetry data for a runner and publish it through the\n * provided instrumentation controller.\n *\n * Behaviour:\n *\n * - Each telemetry field is mapped to one or more observability gauges.\n * - Only fields with values are processed (except active request count,\n * which is always updated).\n * - Some telemetry values update gauges using:\n *\n * val → set absolute value\n * Inc → increment existing metric\n *\n * - Histogram gauges are updated alongside standard gauges for\n * latency and duration metrics.\n *\n * Logging behaviour:\n *\n * - Any telemetry messages present in `telemetry.message`\n * are forwarded to the publish instrument controller via `LogEx`.\n *\n * Return value:\n *\n * - `true` if any telemetry fields were processed and published\n * - `false` if no update occurred\n *\n * @param publishInstrumentController\n * Controller responsible for publishing metrics/logs to the\n * observability system.\n *\n * @param telemetry\n * Raw telemetry snapshot generated by a runner execution cycle.\n *\n * @returns\n * Boolean indicating whether telemetry updates were applied.\n */\n ProcessTelemetry = (\n publishInstrumentController: PublishInstrumentController,\n telemetry: IRunnerTelemetry\n ): boolean => {\n\n /**\n * Tracks whether any telemetry updates occurred.\n */\n let update = false;\n\n /**\n * -------------------------------------------------------\n * Telemetry message logging\n * -------------------------------------------------------\n *\n * Runner telemetry may contain informational or diagnostic\n * messages. These are forwarded directly to the instrument\n * controller logging facility.\n */\n if (telemetry.message) {\n telemetry.message.forEach((message) => {\n publishInstrumentController.LogEx(message);\n });\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Request metrics\n * -------------------------------------------------------\n */\n\n if (hasValue(telemetry.requestCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.REQUEST_COUNT_GAUGE, {\n val: telemetry.requestCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.errorCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.ERROR_COUNT_GAUGE, {\n val: telemetry.errorCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.retryCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.RETRY_COUNT_GAUGE, {\n val: telemetry.retryCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Authentication metrics\n * -------------------------------------------------------\n */\n\n if (hasValue(telemetry.authenticationCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_COUNT_GAUGE, {\n val: telemetry.authenticationCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.authenticationErrorCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE, {\n val: telemetry.authenticationErrorCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.authenticationRetryCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE, {\n val: telemetry.authenticationRetryCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Execution environment metrics\n * -------------------------------------------------------\n */\n\n if (hasValue(telemetry.coreCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.CORE_COUNT_GAUGE, {\n val: telemetry.coreCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.timer)) {\n publishInstrumentController.UpdateInstrument(Gauge.TIMER_GAUGE, {\n val: telemetry.timer\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Active request gauge\n * -------------------------------------------------------\n *\n * This gauge is updated unconditionally so that monitoring\n * dashboards always reflect the latest runner concurrency.\n */\n publishInstrumentController.UpdateInstrument(Gauge.ACTIVE_REQUEST_GAUGE, {\n val: telemetry.activeRequestCount\n } as InstrumentGaugeTelemetry);\n\n /**\n * -------------------------------------------------------\n * Throughput / velocity metrics\n * -------------------------------------------------------\n *\n * Velocity is applied as an increment to the gauge rather\n * than setting a value directly.\n */\n if (hasValue(telemetry.velocity)) {\n publishInstrumentController.UpdateInstrument(Gauge.VELOCITY_GAUGE, {\n Inc: telemetry.velocity\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Duration metrics\n * -------------------------------------------------------\n *\n * Duration is published to:\n * - a direct duration gauge\n * - a duration histogram for statistical aggregation\n */\n if (hasValue(telemetry.duration)) {\n publishInstrumentController.UpdateInstrument(Gauge.DURATION_GAUGE, {\n val: telemetry.duration\n } as InstrumentGaugeTelemetry);\n\n publishInstrumentController.UpdateInstrument(Gauge.DURATION_HISTOGRAM_GAUGE, {\n val: telemetry.duration\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Latency metrics\n * -------------------------------------------------------\n *\n * Latency is published both as a gauge and histogram\n * to allow percentile aggregation.\n */\n if (hasValue(telemetry.latency)) {\n publishInstrumentController.UpdateInstrument(Gauge.LATENCY_GAUGE, {\n val: telemetry.latency\n } as InstrumentGaugeTelemetry);\n\n publishInstrumentController.UpdateInstrument(Gauge.LATENCY_HISTOGRAM_GAUGE, {\n val: telemetry.latency\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Child execution metrics\n * -------------------------------------------------------\n *\n * Tracks spawned/child execution count if the runner\n * coordinates additional sub-tasks.\n */\n if (hasValue(telemetry.childCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.CHILD_COUNT, {\n val: telemetry.childCount\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Network telemetry\n * -------------------------------------------------------\n *\n * Network counters are applied as increments rather than\n * absolute values to accumulate totals.\n */\n\n if (hasValue(telemetry.rx)) {\n publishInstrumentController.UpdateInstrument(Gauge.NETWORK_RX_GAUGE, {\n Inc: telemetry.rx\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n if (hasValue(telemetry.tx)) {\n publishInstrumentController.UpdateInstrument(Gauge.NETWORK_TX_GAUGE, {\n Inc: telemetry.tx\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * Return whether any telemetry updates occurred.\n */\n return update;\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * RunnerLifecycleManager\n * ----------------------\n * Runtime lifecycle/event processor responsible for handling unsolicited\n * runner-related messages received from workers.\n *\n * Responsibilities:\n * - process unsolicited telemetry messages pushed from workers\n * - process unsolicited runner state change messages pushed from workers\n * - update live in-memory runner state in the {@link WorkerRegistry}\n * - trigger telemetry publishing via {@link TelemetryProcessor}\n * - emit runner-level events to registered listeners\n * - provide a message-handler factory suitable for wiring into the message broker\n *\n * High-level role in the architecture:\n * - Workers push unsolicited messages such as telemetry and state changes\n * - The {@link STSMessageBroker} routes those unsolicited messages to a callback\n * - This class provides that callback and applies the updates to live runner instances\n *\n * Important distinction:\n * - Solicited request/response traffic is handled by the message broker\n * - Unsolicited push/event traffic is handled here\n *\n * Typical unsolicited messages handled here:\n * - `InstrumentTelemetry`\n * - `RunnerStateChange`\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n IIWMessagePayload,\n eIWMessageCommands,\n IWorkerEx,\n IRunner,\n IRunnerEx,\n ITestRunnerTelemetryPayload,\n IRunnerEvent\n} from './commonTypes';\n\nimport { TelemetryProcessor } from './telemetryProcessor';\n\nimport { WorkerRegistry } from './workerRegistry';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link RunnerLifecycleManager}.\n */\nexport interface IRunnerLifecycleManagerOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared live worker/runner registry used to resolve and update\n * the current runtime runner instances.\n */\n workerRegistry: WorkerRegistry;\n}\n\n/**\n * Manages live runner lifecycle updates for unsolicited worker messages.\n *\n * This class updates the in-memory runtime graph and emits runner events\n * in response to messages pushed by workers.\n */\nexport class RunnerLifecycleManager {\n /**\n * Immutable runtime configuration for this lifecycle manager.\n */\n private readonly options: IRunnerLifecycleManagerOptions;\n\n /**\n * Processor used to forward/update external telemetry instrumentation.\n *\n * This is created eagerly in the constructor and used only when a runner\n * has a publish instrument controller attached.\n */\n private readonly telemetryProcessor: TelemetryProcessor | null = null;\n\n /**\n * Construct a new runner lifecycle manager.\n *\n * @param options Logger and worker registry dependencies.\n */\n constructor(options: IRunnerLifecycleManagerOptions) {\n this.options = options;\n this.telemetryProcessor = new TelemetryProcessor();\n }\n\n /**\n * Process an unsolicited telemetry message for a runner.\n *\n * Behaviour:\n * - resolves the live runner instance from the registry\n * - updates the live runner state/telemetry using {@link SyncRunnerData}\n * - if the runner has a publish instrument controller, pushes the telemetry\n * through the {@link TelemetryProcessor}\n * - emits a `Telemetry` runner event\n *\n * Notes:\n * - This method only handles unsolicited push telemetry from workers\n * - The incoming payload is expected to contain a serialised `runner`\n * snapshot with updated instrumentation values\n *\n * @param workerEx Worker that produced the telemetry message.\n * @param payloadContents Telemetry payload containing the updated runner snapshot.\n * @throws Re-throws unexpected errors after logging.\n */\n private _ProcessTelemetry = (workerEx: IWorkerEx, payloadContents: ITestRunnerTelemetryPayload): void => {\n try {\n const { runner } = payloadContents;\n const runnerEx = this.options.workerRegistry.GetRunnerEx(workerEx.id, runner.id);\n\n if (runnerEx) {\n this.SyncRunnerData(runnerEx, runner);\n\n if (runnerEx.publishInstrumentController && this.telemetryProcessor) {\n this.telemetryProcessor.ProcessTelemetry(\n runnerEx.publishInstrumentController,\n runnerEx.instrumentData\n );\n }\n\n this._EmitRunnerEvent('Telemetry', workerEx, runner.id);\n }\n } catch (error) {\n this.options.logger.error(`_ProcessTelemetry(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Emit a runner-level event for a specific runner.\n *\n * Behaviour:\n * - looks up all registered event handlers for the specified runner id\n * - filters to handlers whose `eventName` matches the supplied event name\n * - resolves the live runner instance from the registry\n * - invokes each matching callback with the live runner instance\n *\n * Notes:\n * - Event subscriptions are stored on the worker in `workerEx.runnersEvents`\n * - The live runner instance is resolved from the registry at emit time so\n * callbacks receive the current runtime object\n *\n * @param eventName Name of the runner event to emit.\n * @param workerEx Owning worker of the runner.\n * @param runnerId Id of the runner whose event should be emitted.\n * @throws Re-throws unexpected errors after logging.\n */\n private _EmitRunnerEvent = (eventName: string, workerEx: IWorkerEx, runnerId: string) => {\n try {\n if (workerEx.runnersEvents[runnerId]) {\n const runnersEvents: IRunnerEvent[] = workerEx.runnersEvents[runnerId];\n\n runnersEvents.forEach(ev => {\n if (ev.eventName.localeCompare(eventName) === 0) {\n const runnerEx = this.options.workerRegistry.GetRunnerEx(workerEx.id, runnerId);\n if (runnerEx) {\n ev.cb(runnerEx);\n }\n }\n });\n }\n } catch (error) {\n this.options.logger.error(`_EmitRunnerEvent(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Process an unsolicited runner state change message.\n *\n * Behaviour:\n * - resolves the live runner instance from the registry\n * - records the previous state for logging/debugging\n * - updates the runner's current state\n * - appends a runner-history entry containing a snapshot of the new state\n * - ensures nested `runnerHistory` is cleared from the history snapshot itself\n * to avoid recursive history growth\n * - updates other live runner fields via {@link SyncRunnerData}\n * - emits a `StateChange` runner event\n *\n * History entry structure:\n * - `eventDate`: timestamp when the state change was processed\n * - `runner`: shallow copy of the inbound runner snapshot\n *\n * Notes:\n * - This is intended for unsolicited push state updates from the worker\n * - The runner history list is lazily initialised if missing\n *\n * @param workerEx Worker that produced the state change.\n * @param payloadContents Payload containing the updated runner snapshot.\n * @throws Re-throws unexpected errors after logging.\n */\n private _RunnerStateChange = (workerEx: IWorkerEx, payloadContents: ITestRunnerTelemetryPayload): void => {\n try {\n const { runner } = payloadContents;\n\n const runnerEx = this.options.workerRegistry.GetRunnerEx(workerEx.id, runner.id);\n if (runnerEx) {\n const previousState = runnerEx.state;\n\n runnerEx.state = runner.state;\n\n if (!runnerEx.runnerHistory) {\n runnerEx.runnerHistory = [];\n }\n\n /**\n * Create a snapshot of the inbound runner data for history purposes.\n *\n * The nested history collection is explicitly cleared to prevent\n * recursive history growth inside history records.\n */\n const runnerHistoryRecord = { ...runner };\n runnerHistoryRecord.runnerHistory = [];\n\n runnerEx.runnerHistory.push({\n eventDate: new Date(),\n runner: runnerHistoryRecord\n });\n\n this.SyncRunnerData(runnerEx, runner);\n\n this.options.logger.debug(\n `STSWorkerManager:#RunnerStateChange(): Worker: [${workerEx.id}] Runner: [${runner.id}] Previous State: [${previousState}] State: [${runner.state}]`\n );\n\n this._EmitRunnerEvent('StateChange', workerEx, runner.id);\n }\n } catch (error) {\n this.options.logger.error(`_RunnerStateChange(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Synchronise live mutable runner fields from a serialised runner snapshot.\n *\n * Behaviour:\n * - updates iteration\n * - updates state\n * - replaces the current instrumentation payload\n *\n * Intended use:\n * - telemetry processing\n * - worker state synchronisation\n * - state change handling\n *\n * Notes:\n * - This method mutates the live `runnerEx` instance directly\n * - It intentionally updates only the current mutable runtime fields and not\n * the full runner identity/options model\n *\n * @param runnerEx Live runner instance to update.\n * @param runner Serialised runner snapshot containing updated values.\n */\n SyncRunnerData = (runnerEx: IRunnerEx, runner: IRunner) => {\n try {\n runnerEx.iteration = runner.iteration;\n runnerEx.state = runner.state;\n runnerEx.instrumentData = { ...runner.instrumentData };\n } catch (error) {\n this.options.logger.error(`_SyncRunnerData(): Error: [${error}]`);\n }\n };\n\n /**\n * Build the list of unsolicited command handlers supported by this lifecycle manager.\n *\n * Current unsolicited commands handled:\n * - `InstrumentTelemetry`\n * - `RunnerStateChange`\n *\n * Each mapping contains:\n * - `command`: the incoming message command\n * - `cb`: the handler to invoke for that command\n *\n * Notes:\n * - This method currently rebuilds the list on each call\n * - Since the mapping is small and static, this is acceptable, though it could\n * be cached later if desired\n *\n * @returns Array of unsolicited command -> handler mappings.\n */\n private _GetUnsolicitedCommandProcessMap = () => {\n return [\n { command: eIWMessageCommands.InstrumentTelemetry, cb: this._ProcessTelemetry },\n { command: eIWMessageCommands.RunnerStateChange, cb: this._RunnerStateChange }\n ];\n };\n\n /**\n * Create a message handler function suitable for wiring into a worker's\n * unsolicited-message listener.\n *\n * Behaviour of the returned handler:\n * - interprets the inbound raw data as an {@link IIWMessagePayload}\n * - finds a matching unsolicited command handler from the internal map\n * - if a handler is found, invokes it with:\n * - the specific worker instance for which this handler was created\n * - the inbound message payload cast as `ITestRunnerTelemetryPayload`\n *\n * Typical usage:\n * - one handler is created per worker\n * - that handler is passed into the message broker's port-listener setup\n * - the handler processes only unsolicited push/event traffic\n *\n * Notes:\n * - This method intentionally closes over `stsWorkerEx`, so the returned\n * handler is permanently associated with that worker instance\n * - Solicited request/response messages should already have been handled\n * by the message broker before reaching this handler\n *\n * Future design note:\n * - Runner state changes may eventually be fully embedded in solicited responses,\n * which could make separate `RunnerStateChange` push events redundant and reduce\n * race conditions between awaited commands and subsequent push updates\n *\n * @param stsWorkerEx Worker instance whose unsolicited messages should be processed.\n * @returns A function that processes unsolicited messages for the supplied worker.\n * @throws Re-throws unexpected errors after logging.\n */\n ProcessMessageHandlerFactory = (stsWorkerEx: IWorkerEx) => {\n return (data: any) => {\n try {\n const unsolicitedCommandProcessMap = this._GetUnsolicitedCommandProcessMap();\n const publishMessagePayload: IIWMessagePayload = data;\n const index = unsolicitedCommandProcessMap\n .findIndex(v => v.command === publishMessagePayload.command);\n\n if (index >= 0) {\n unsolicitedCommandProcessMap[index]\n .cb(stsWorkerEx, publishMessagePayload.payload as ITestRunnerTelemetryPayload);\n }\n } catch (error) {\n this.options.logger.error(`AddWorker:processMessage(): Error: [${error}]`);\n throw error;\n }\n };\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerStateSynchroniser\n * =======================\n *\n * Synchronises the manager-side in-memory worker/runner model with the current\n * state held inside the actual worker runtimes.\n *\n * Architectural role\n * ------------------\n * The manager-side registry (`WorkerRegistry`) stores live `IWorkerEx` and\n * `IRunnerEx` objects. However, the true current runner state is maintained\n * inside the actual worker runtime until it is pushed back or explicitly queried.\n *\n * `WorkerStateSynchroniser` provides the \"pull\" side of that synchronisation:\n *\n * - it asks each worker for its current runners via `GetRunners`\n * - it applies the returned runner snapshots to the live manager-side runner objects\n * - it then returns either:\n * - the full worker map, or\n * - the reduced/core worker map\n *\n * Responsibilities\n * ----------------\n * - issue `GetRunners` requests to all live workers\n * - await all worker responses\n * - apply returned runner state into the manager-side runtime graph\n * - expose synchronised full and reduced worker views\n *\n * Design notes\n * ------------\n * - This class does not own workers or runners directly.\n * - It relies on:\n * - {@link WorkerRegistry} for the live manager-side object graph\n * - {@link STSMessageBroker} for request/response communication\n * - {@link RunnerLifecycleManager} for applying runner state updates consistently\n *\n * Typical usage\n * -------------\n * - `GetSyncedWorkers()` when you want the full current worker/runners model\n * - `GetSyncedWorkersCore(states)` when you want a lighter summary view,\n * optionally filtered by runner state\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n eIWMessageCommands,\n IRunnerState,\n ISTSGetRunnersPayload,\n IIWMessagePayloadContentBase,\n IWorkers,\n IWorkerCore,\n} from './commonTypes';\n\nimport { STSMessageBroker } from './messageBroker';\nimport { WorkerRegistry } from './workerRegistry';\nimport { RunnerLifecycleManager } from './runnerLifecycleManager';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link WorkerStateSynchroniser}.\n */\nexport interface IWorkerStateSynchroniserOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared live worker/runner registry.\n *\n * This contains the manager-side runtime graph that will be updated during synchronisation.\n */\n workerRegistry: WorkerRegistry;\n\n /**\n * Shared message broker used to send `GetRunners` requests to workers and await responses.\n */\n messageBroker: STSMessageBroker;\n\n /**\n * Runner lifecycle manager used to apply incoming runner snapshots to live\n * manager-side runner objects in a consistent way.\n */\n runnerLifecycleManager: RunnerLifecycleManager;\n}\n\n/**\n * Synchronises live manager-side worker/runner state with the actual worker runtimes.\n */\nexport class WorkerStateSynchroniser {\n /**\n * Immutable runtime configuration and dependencies.\n */\n private readonly options: IWorkerStateSynchroniserOptions;\n\n /**\n * Construct a new worker state synchroniser.\n *\n * @param options Logger, registry, message broker, and runner lifecycle collaborators.\n */\n constructor(options: IWorkerStateSynchroniserOptions) {\n this.options = options;\n }\n\n /**\n * Synchronise all live workers from their current worker-runtime state.\n *\n * Behaviour\n * ---------\n * 1. Resolve all live workers from the registry\n * 2. Send `GetRunners` to each worker through the message broker\n * 3. Await all worker responses\n * 4. For each returned runner snapshot:\n * - resolve the owning worker from the registry\n * - resolve that worker's live runner map\n * - if the runner exists in the registry, apply the snapshot to the live runner\n * object using `RunnerLifecycleManager.SyncRunnerData(...)`\n *\n * Important notes\n * ---------------\n * - This method only updates existing manager-side runner objects.\n * - It does not create missing runners if a worker returns a runner id that is\n * not already present in the registry.\n * - It assumes the manager-side registry and worker runtime are already aligned\n * in terms of which runners exist.\n *\n * Error handling\n * --------------\n * - Logs and re-throws unexpected errors.\n *\n * @returns Resolves when all workers have been queried and all returned runner snapshots\n * have been applied to the manager-side runtime graph.\n * @throws Re-throws unexpected errors after logging.\n */\n private SyncAllWorkers = async (): Promise<void> => {\n try {\n /**\n * Resolve all live workers.\n *\n * Passing `[]` means \"all workers\" according to the registry convention.\n */\n const workersEx = this.options.workerRegistry.GetWorkersEx([]);\n\n /**\n * Build a broker request promise for each worker.\n *\n * Each worker is asked to return its full current runner list.\n */\n const promArray: Promise<IIWMessagePayloadContentBase>[] = [];\n workersEx.forEach(workerEx =>\n promArray.push(\n this.options.messageBroker.SendMessageToWorkerForWorkerWithCallBack(\n workerEx,\n eIWMessageCommands.GetRunners\n )\n )\n );\n\n /**\n * Wait for all workers to respond.\n *\n * Each payload is expected to be a `ISTSGetRunnersPayload`.\n */\n const retVal = await Promise.all(promArray);\n\n /**\n * Apply returned runner snapshots into the manager-side live runtime graph.\n */\n retVal.forEach((messagePayload: IIWMessagePayloadContentBase) => {\n const payload = messagePayload as ISTSGetRunnersPayload;\n\n const workerEx = this.options.workerRegistry.GetWorker(payload.workerId);\n if (workerEx) {\n const runnersEx = this.options.workerRegistry.GetAllRunnersExMap(workerEx.id);\n if (runnersEx) {\n payload.runners.forEach((runner) => {\n if (runnersEx[runner.id]) {\n this.options.runnerLifecycleManager.SyncRunnerData(\n runnersEx[runner.id],\n runner\n );\n }\n });\n }\n }\n });\n } catch (error) {\n this.options.logger.error(`_SyncWorkerDataFromWorkers(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the full synchronised workers model.\n *\n * Behaviour\n * ---------\n * - First synchronises all workers by querying their current runtime state\n * - Then returns the full serialisable workers map from the registry\n *\n * Returned model\n * --------------\n * The returned `IWorkers` structure includes:\n * - all live workers\n * - each worker's full serialisable runner set\n *\n * @returns Fully synchronised full workers model.\n * @throws Re-throws unexpected errors after logging.\n */\n GetSyncedWorkers = async (): Promise<IWorkers> => {\n try {\n await this.SyncAllWorkers();\n return this.options.workerRegistry.GetWorkersMap();\n } catch (error) {\n this.options.logger.error(`GetWorkers(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the reduced/core synchronised workers model.\n *\n * Behaviour\n * ---------\n * - First synchronises all workers by querying their current runtime state\n * - Then returns the reduced/core workers map from the registry\n *\n * Runner state filtering\n * ----------------------\n * - `undefined` => include all runners\n * - `[]` => include all runners\n * - populated array => include only runners whose state matches one of the supplied states\n *\n * Returned model\n * --------------\n * The returned structure includes a reduced representation of each worker and runner,\n * suitable for lightweight status/dashboard style views.\n *\n * @param states Optional runner-state filter.\n * @returns Fully synchronised reduced/core workers model.\n * @throws Re-throws unexpected errors after logging.\n */\n GetSyncedWorkersCore = async (states?: IRunnerState[]): Promise<Record<string, IWorkerCore>> => {\n try {\n await this.SyncAllWorkers();\n return this.options.workerRegistry.GetWorkersCoreMap(states);\n } catch (error) {\n this.options.logger.error(`GetWorkersCore(): Error: [${error}]`);\n throw error;\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerCommandCoordinator\n * ------------------------\n * Orchestration component responsible for executing commands across:\n *\n * 1. one or more workers\n * 2. one or more runners within a specific worker\n *\n * This class does not own workers or runners directly. Instead, it coordinates\n * command execution using the shared {@link WorkerRegistry}.\n *\n * Responsibilities:\n * - locate target workers from the registry\n * - fan out a command to multiple workers\n * - fan out a command to multiple runners within a worker\n * - aggregate per-runner results into worker-level result structures\n * - centralise error handling and logging for command orchestration\n *\n * Typical commands handled:\n * - Start\n * - Stop\n * - Pause\n * - Resume\n * - Execute\n * - Reset\n * - Terminate\n * - Update\n *\n * Notes:\n * - Worker-level commands ultimately invoke matching methods on {@link IWorkerEx}\n * - Runner-level commands ultimately invoke matching methods on {@link IRunnerEx}\n * - `Update` is handled specially because it requires `runnerOptions`\n * - An empty `workerIds` or `runnerIds` array is treated as \"all\"\n * for the relevant scope, depending on how the registry/worker methods behave\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n IRunnerOptions,\n IExecuteWorkerActionResult,\n IExecuteRunnerActionResult\n} from './commonTypes';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport { WorkerRegistry } from './workerRegistry';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link WorkerCommandCoordinator}.\n */\nexport interface IWorkerCommandCoordinator {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared live worker registry used to resolve workers and runners.\n */\n workerRegistry: WorkerRegistry;\n\n /**\n * Id of the top-level worker manager that owns the workers being coordinated.\n *\n * This value is included in worker-level result payloads so callers can\n * trace results back to the manager instance that executed them.\n */\n workerManagerId: string;\n}\n\n/**\n * Central coordinator for worker-level and runner-level command execution.\n *\n * This class is intentionally orchestration-only:\n * - it does not store workers itself\n * - it does not mutate registry structure directly\n * - it does not implement worker/runner business logic\n *\n * Instead, it:\n * - resolves workers/runners from the registry\n * - dispatches command calls to them\n * - collects/normalises the resulting responses\n */\nexport class WorkerCommandCoordinator {\n /**\n * Immutable configuration and dependencies for this coordinator.\n */\n private readonly options: IWorkerCommandCoordinator;\n\n /**\n * Construct a new worker command coordinator.\n *\n * @param options Logger, worker registry, and worker manager id.\n */\n constructor(options: IWorkerCommandCoordinator) {\n this.options = options;\n }\n\n /**\n * Execute the same command against one or more workers.\n *\n * Behaviour:\n * - resolves the target workers from the registry using `workerIds`\n * - invokes the specified command on each worker\n * - waits for all worker command calls to complete\n * - wraps each worker's per-runner result list in an `IExecuteWorkerActionResult`\n * - returns a result entry per worker\n *\n * Command semantics:\n * - For non-`Update` commands, the worker method is invoked with no arguments\n * - For `Update`, the worker method is invoked with `runnerOptions`\n *\n * Worker selection:\n * - The underlying registry method `GetWorkersEx(workerIds)` determines how\n * worker filtering works\n * - In the current design, an empty `workerIds` array typically means \"all workers\"\n *\n * Returned structure:\n * Each result includes:\n * - `workerManagerId`\n * - `workerId`\n * - `executeRunnerActionResults`\n *\n * Error handling:\n * - Errors are logged\n * - The method returns an empty array on failure rather than throwing\n *\n * @param workerIds List of target worker ids. Use `[]` to target all workers, if supported by the registry.\n * @param command Worker command to execute.\n * @param runnerOptions Optional runner option updates, only used for `Update`.\n * @returns Array of worker-level aggregated results.\n */\n public ExecuteWorkerCommands = async (\n workerIds: string[],\n command: 'Start' | 'Stop' | 'Pause' | 'Resume' | 'Execute' | 'Reset' | 'Terminate' | 'Update',\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteWorkerActionResult[]> => {\n this.options.logger.debug(\n `_ProcessWorkerCommands: workerIds: [${workerIds}] command: [${command}`\n );\n\n try {\n /**\n * Promise array holding each worker's command execution result.\n *\n * Each worker command resolves to an array of per-runner results,\n * because worker methods fan out internally to their hosted runners.\n */\n const promArray: Promise<IExecuteRunnerActionResult[]>[] = [];\n\n /**\n * Resolve the target workers from the registry.\n */\n const workers = this.options.workerRegistry.GetWorkersEx(workerIds);\n\n /**\n * Dispatch the requested command to each worker.\n */\n for (let i = 0; i < workers.length; i++) {\n if (command === 'Update') {\n promArray.push(workers[i][command](runnerOptions!));\n } else {\n promArray.push(workers[i][command]());\n }\n }\n\n /**\n * Wait for all worker command executions to complete.\n *\n * Result shape:\n * - one array per worker\n * - each worker array contains per-runner action results\n */\n const retValResult = await Promise.all(promArray);\n\n /**\n * Convert worker results into the higher-level worker action result structure.\n */\n const returnVal: IExecuteWorkerActionResult[] = [];\n\n for (let i = 0; i < workers.length; i++) {\n returnVal.push({\n workerManagerId: this.options.workerManagerId,\n workerId: workers[i].id,\n executeRunnerActionResults: retValResult[i]\n } as IExecuteWorkerActionResult);\n }\n\n return returnVal;\n } catch (error) {\n this.options.logger.error(\n `_ProcessWorkerCommands(): command: [${command}] workerIds: [${workerIds}] Error: [${error}]`\n );\n return [];\n }\n };\n\n /**\n * Execute the same command against one or more runners within a single worker.\n *\n * Behaviour:\n * - resolves the target worker from the registry\n * - if `runnerIds` is empty, executes the worker-level command directly\n * (which applies to all runners in that worker)\n * - otherwise resolves the specific target runners from the worker\n * - invokes the specified command on each target runner\n * - waits for all runner command calls to complete\n * - returns a flat array of per-runner results\n *\n * Command semantics:\n * - For non-`Update` commands, the runner method is invoked with no arguments\n * - For `Update`, the runner method is invoked with `runnerOptions`\n *\n * Runner selection:\n * - If `runnerIds.length === 0`, the worker itself is asked to execute the command\n * across all its runners\n * - Otherwise only runners matching the supplied ids are targeted\n *\n * Error handling:\n * - Errors are logged\n * - The method returns an empty array on failure rather than throwing\n *\n * @param workerId Id of the worker containing the target runners.\n * @param runnerIds List of target runner ids. Use `[]` to target all runners in the worker.\n * @param command Runner command to execute.\n * @param runnerOptions Optional runner option updates, only used for `Update`.\n * @returns Array of per-runner action results.\n */\n ExecuteRunnerCommands = async (\n workerId: string,\n runnerIds: string[],\n command: 'Start' | 'Stop' | 'Pause' | 'Resume' | 'Execute' | 'Reset' | 'Terminate' | 'Update',\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]> => {\n this.options.logger.debug(\n `#ExecuteVariableCommandOnRunners: workerId: [${workerId}] command: [${command} runnerIds: [${runnerIds}]`\n );\n\n try {\n /**\n * Resolve the owning worker from the registry.\n */\n const workersEx = this.options.workerRegistry.GetWorker(workerId);\n\n if (workersEx) {\n /**\n * If no runner ids are specified, delegate to the worker-level command.\n *\n * This is effectively \"run this command against all runners in this worker\".\n */\n if (runnerIds.length === 0) {\n if (command === 'Update') {\n return workersEx[command](runnerOptions!);\n } else {\n return workersEx[command]();\n }\n } else {\n /**\n * Promise array for the selected runner command executions.\n */\n const promArray: Promise<IExecuteRunnerActionResult>[] = [];\n\n /**\n * Resolve only the requested runners from the worker.\n */\n const runners = workersEx.GetRunnersEx(runnerIds);\n\n /**\n * Dispatch the requested command to each selected runner.\n */\n for (let i = 0; i < runners.length; i++) {\n if (command === 'Update') {\n promArray.push(runners[i][command](runnerOptions!));\n } else {\n promArray.push(runners[i][command]());\n }\n }\n\n /**\n * Wait for all selected runner command executions to complete.\n */\n const retValResult = await Promise.all(promArray);\n\n /**\n * Create a new array of per-runner results.\n *\n * The spread ensures the returned result objects are copied.\n */\n const returnVal: IExecuteRunnerActionResult[] = [];\n\n for (let i = 0; i < runners.length; i++) {\n returnVal.push({ ...retValResult[i] });\n }\n\n return returnVal;\n }\n }\n\n /**\n * Worker not found; return no results.\n */\n return [];\n } catch (error) {\n this.options.logger.error(\n `_ExecuteVariableCommandOnRunners(): command: [${command}] workerId: [${workerId}] runnerIds: [${runnerIds}] Error: [${error}]`\n );\n return [];\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * STSWorkerManager\n * ================\n *\n * Top-level orchestration class for the worker/runner framework.\n *\n * This class is the main manager-side entry point used to:\n *\n * - create and register workers\n * - create and register runners inside workers\n * - coordinate worker-wide and runner-specific commands\n * - synchronise live worker/runner state from worker runtimes\n * - expose archived runner history\n * - coordinate supporting infrastructure such as:\n * - message brokering\n * - worker registry\n * - archive management\n * - runner lifecycle processing\n * - worker state synchronisation\n * - worker command coordination\n *\n * Architectural role\n * ------------------\n * `STSWorkerManager` acts primarily as:\n *\n * - a composition root\n * - a façade\n * - a coordinator entry point\n *\n * It does **not** directly implement all worker or runner behaviour itself.\n * Instead, it composes several more focused collaborators:\n *\n * - {@link WorkerRegistry}\n * - {@link STSMessageBroker}\n * - {@link AsyncRunnerInstanceManager}\n * - {@link ArchiveManager}\n * - {@link WorkerInstanceManager}\n * - {@link RunnerLifecycleManager}\n * - {@link WorkerStateSynchroniser}\n * - {@link WorkerCommandCoordinator}\n *\n * High-level lifecycle\n * --------------------\n * 1. Construct manager and all supporting services\n * 2. Add workers\n * 3. Add runners to workers\n * 4. Start/pause/resume/execute/reset/update/terminate workers or runners\n * 5. Receive telemetry and state changes through broker + lifecycle manager\n * 6. Archive retired runners through archive manager\n * 7. Synchronise state on demand through worker state synchroniser\n *\n * Notes\n * -----\n * - This class owns the manager id.\n * - This class owns the shared registry and shared service instances.\n * - Most public methods are intentionally thin façade methods delegating to\n * more specialised collaborators.\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n eIWMessageCommands,\n IWorkerEx,\n IRunner,\n IRunnerEx,\n IRunnerOptions,\n IWorkerManagerOptions,\n IWorkerFactory,\n IWorkerOptions,\n IRunnerState,\n IExecuteWorkerActionResult,\n IExecuteRunnerActionResult,\n IWorkers,\n IRunnerSearchFilters,\n ISTSWorkerManager,\n IWorkerCore,\n} from './commonTypes';\n\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { STSMessageBroker } from './messageBroker';\nimport { AsyncRunnerInstanceManager } from './asyncRunnerInstanceManager';\nimport { ArchiveManager } from './archiveManager';\nimport { WorkerInstanceManager } from './workerInstanceMannager';\nimport { WorkerRegistry } from './workerRegistry';\nimport { RunnerLifecycleManager } from './runnerLifecycleManager';\nimport { WorkerStateSynchroniser } from './workerStateSynchroniser';\nimport { WorkerCommandCoordinator } from './workerCommandCoordinator';\n\n/**\n * Main manager/coordinator for workers and runners.\n *\n * This class implements {@link ISTSWorkerManager} and serves as the primary\n * public API for interacting with the framework from the manager side.\n */\nexport class STSWorkerManager implements ISTSWorkerManager {\n /**\n * Central live worker registry.\n *\n * Owns the manager-side in-memory graph of:\n * - workers\n * - runners\n *\n * Most other manager-side services depend on this shared registry.\n */\n #workerRegistry: WorkerRegistry;\n\n /**\n * Runtime options/configuration for this worker manager.\n */\n #options: IWorkerManagerOptions;\n\n /**\n * Optional root instrumentation publisher.\n *\n * When supplied, child publish controllers may be created for runners.\n */\n #STSInstrumentController?: PublishInstrumentController;\n\n /**\n * Unique id for this worker manager instance.\n *\n * This is included in result payloads and propagated to created worker/runner structures.\n */\n #id: string;\n\n /**\n * Shared message broker used for worker <-> manager request/response\n * and unsolicited message routing.\n */\n #messageBroker: STSMessageBroker;\n\n /**\n * Shared runner factory/creation manager.\n *\n * Responsible for constructing manager-side live runner instances.\n */\n #asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n\n /**\n * Background archive manager.\n *\n * Responsible for archiving retired runners and removing them from\n * the live worker registry after a delay.\n */\n #archiveManager: ArchiveManager;\n\n /**\n * Worker factory/helper used to create manager-side worker instances\n * and attach native/system runtime event handlers.\n */\n #workerInstanceManager: WorkerInstanceManager;\n\n /**\n * Processes unsolicited runner lifecycle messages such as:\n * - telemetry\n * - state changes\n */\n #runnerLifecycleManager: RunnerLifecycleManager;\n\n /**\n * Synchronises live manager-side worker/runner state from worker runtimes\n * on demand.\n */\n #workerStateSynchroniser: WorkerStateSynchroniser;\n\n /**\n * Executes coordinated commands across:\n * - multiple workers\n * - multiple runners within a worker\n */\n #workerCommandCoordinator: WorkerCommandCoordinator;\n\n /**\n * Construct a new worker manager.\n *\n * Behaviour:\n * - generates a manager id\n * - stores supplied options (or initialises an empty options object)\n * - constructs all shared supporting services\n * - starts the archive processing loop\n *\n * Constructed collaborators:\n * - worker registry\n * - optional instrumentation controller reference\n * - message broker\n * - async runner instance manager\n * - archive manager\n * - worker instance manager\n * - runner lifecycle manager\n * - worker state synchroniser\n * - worker command coordinator\n *\n * @param options Optional worker-manager runtime configuration.\n */\n constructor(options?: IWorkerManagerOptions) {\n this.#id = uuidv4();\n\n if (options) {\n this.#options = options;\n } else {\n this.#options = {} as IWorkerManagerOptions;\n }\n\n this.#workerRegistry = new WorkerRegistry({\n logger: this.#options.logger\n });\n\n if (this.#options.publishInstrumentController) {\n this.#STSInstrumentController = this.#options.publishInstrumentController;\n }\n\n this.#messageBroker = new STSMessageBroker({\n logger: this.options.logger,\n messageTimeout: this.options.messageTimeout\n });\n\n this.#asyncRunnerInstanceManager = new AsyncRunnerInstanceManager({\n instrumentController: this.#STSInstrumentController,\n messageBroker: this.#messageBroker,\n workerManagerId: this.#id\n });\n\n this.#archiveManager = new ArchiveManager({\n logger: this.#options.logger,\n maxArchiveListLength: this.#options.maxArchiveListLength,\n workerRegistry: this.#workerRegistry\n });\n\n /**\n * Start background archive processing immediately.\n */\n this.#archiveManager.ProcessLoopExecutor();\n\n this.#workerInstanceManager = new WorkerInstanceManager({\n asyncRunnerInstanceManager: this.#asyncRunnerInstanceManager,\n logger: this.#options.logger,\n messageBroker: this.#messageBroker,\n workerManagerId: this.#id,\n workerRegistry: this.#workerRegistry\n });\n\n this.#runnerLifecycleManager = new RunnerLifecycleManager({\n logger: this.#options.logger,\n workerRegistry: this.#workerRegistry\n });\n\n this.#workerStateSynchroniser = new WorkerStateSynchroniser({\n logger: this.#options.logger,\n messageBroker: this.#messageBroker,\n runnerLifecycleManager: this.#runnerLifecycleManager,\n workerRegistry: this.#workerRegistry\n });\n\n this.#workerCommandCoordinator = new WorkerCommandCoordinator({\n workerManagerId: this.#id,\n logger: this.#options.logger,\n workerRegistry: this.#workerRegistry\n });\n }\n\n /**\n * Prefix and emit a worker-manager-scoped log message.\n *\n * @param fn Target logger method.\n * @param message Message to write.\n */\n #logMessage = (fn: (message: any) => void, message: string) => {\n fn(`pid: [${process.pid}] STSWorkerManager: ID: [${this.#id}] Log: [${message}]`);\n };\n\n /**\n * Log at debug level when enabled by manager options.\n *\n * @param message Log message.\n */\n #debug = (message: any) => {\n if (this.#options && this.#options.logLevel >= 4) {\n this.#logMessage(this.#options.logger.debug, message);\n }\n };\n\n /**\n * Log at error level when enabled by manager options.\n *\n * @param error Error or message to log.\n */\n #error = (error: any) => {\n if (this.#options && this.#options.logLevel >= 1) {\n this.#logMessage(this.#options.logger.error, error);\n }\n };\n\n /**\n * Get archived runner snapshots filtered by the supplied search criteria.\n *\n * Delegates to the shared {@link ArchiveManager}.\n *\n * Supported filters are defined by {@link IRunnerSearchFilters}.\n *\n * @param runnerSearchFilters Archive search/filter criteria.\n * @returns Matching archived runners.\n */\n GetArchiveList = async (runnerSearchFilters: IRunnerSearchFilters): Promise<IRunner[]> => {\n return this.#archiveManager.GetArchiveList(runnerSearchFilters);\n };\n\n /**\n * Get the unique id for this worker manager instance.\n *\n * @returns Worker manager id.\n */\n get id(): string {\n return this.#id;\n }\n\n /**\n * Resolve the worker factory that should be used for worker creation.\n *\n * Behaviour:\n * - if an explicit `useWorkerFactory` is supplied, it is used\n * - otherwise falls back to the default factory configured in manager options\n *\n * @param useWorkerFactory Optional explicit factory override.\n * @returns Resolved worker factory.\n */\n private ResolveWorkerFactory = (useWorkerFactory?: IWorkerFactory): IWorkerFactory => {\n let workerFactory: IWorkerFactory;\n if (useWorkerFactory) {\n workerFactory = useWorkerFactory;\n } else {\n workerFactory = this.#options.workerFactory;\n }\n return workerFactory;\n };\n\n /**\n * Create a manager-side worker instance and wire its initial message port.\n *\n * Behaviour:\n * - creates the manager-side {@link IWorkerEx} using {@link WorkerInstanceManager}\n * - optionally writes instrumentation log output\n * - logs worker creation details\n * - bootstraps the worker's dedicated message port through the broker\n *\n * Notes:\n * - this method does not register the worker in the registry\n * - this method does not attach system/runtime worker event handlers\n * - both are handled by the caller (`AddWorker`)\n *\n * @param workerOptions Worker-specific runtime options.\n * @param workerFactory Factory used to create the actual worker.\n * @param port1 Manager-side message port.\n * @param port2 Worker-side message port to transfer into the worker runtime.\n * @returns Newly created manager-side worker instance.\n */\n private CreateAndWireWorker = (\n workerOptions: IWorkerOptions,\n workerFactory: IWorkerFactory,\n port1: MessagePort,\n port2: MessagePort\n ): IWorkerEx => {\n const stsWorkerEx: IWorkerEx =\n this.#workerInstanceManager.CreateWorkerInstance(workerOptions, port1, workerFactory);\n\n if (this.#STSInstrumentController) {\n this.#STSInstrumentController.LogEx(\n chalk.yellow(`pid: [${process.pid}] Creating new worker: [${stsWorkerEx.id}]`)\n );\n }\n\n this.#debug(\n `AddWorker::workerThreadWorkerOptions: Worker ID: [${stsWorkerEx.id}] Options: [${stsWorkerEx.options}]`\n );\n\n this.#messageBroker.SetupMessagePort(stsWorkerEx, port2);\n\n return stsWorkerEx;\n };\n\n /**\n * Create and register a new worker.\n *\n * Behaviour:\n * - resolves the worker factory\n * - creates a new dedicated message channel (`port1`, `port2`)\n * - creates and bootstraps the manager-side worker instance\n * - adds the worker to the live worker registry\n * - attaches native/system worker event handlers for real workers\n * - attaches broker message-port listener for unsolicited messages\n * - returns the live manager-side worker instance\n *\n * Notes:\n * - mocked workers do not get system/runtime worker event wiring\n * - unsolicited messages from the worker are processed by a handler produced\n * by {@link RunnerLifecycleManager}\n *\n * @param workerOptions Worker-specific runtime options.\n * @param useWorkerFactory Optional explicit worker factory override.\n * @returns Newly created live worker instance.\n * @throws Re-throws unexpected creation/wiring errors after logging.\n */\n AddWorker = async (workerOptions: IWorkerOptions, useWorkerFactory?: IWorkerFactory): Promise<IWorkerEx> => {\n this.#debug(`AddWorker()`);\n try {\n const workerFactory: IWorkerFactory = this.ResolveWorkerFactory(useWorkerFactory);\n\n const {\n port1, // manager-side message port\n port2 // worker-side message port\n } = this.#messageBroker.GetPorts();\n\n const stsWorkerEx: IWorkerEx =\n this.CreateAndWireWorker(workerOptions, workerFactory, port1, port2);\n\n this.#workerRegistry.AddWorker(stsWorkerEx);\n\n if (!stsWorkerEx.options.mocked) {\n this.#workerInstanceManager.SetupWorkerSystemEvents(stsWorkerEx);\n }\n\n this.#messageBroker.SetupMessagePortListener(\n stsWorkerEx,\n this.#runnerLifecycleManager.ProcessMessageHandlerFactory(stsWorkerEx)\n );\n\n this.#debug(`Added worker: [${stsWorkerEx.id}]`);\n\n return stsWorkerEx;\n } catch (error) {\n this.#error(`AddWorker: Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Create and add a new runner to an existing worker.\n *\n * Behaviour:\n * - creates a new manager-side live runner instance via {@link AsyncRunnerInstanceManager}\n * - adds the runner to the live worker registry\n * - sends `AddRunner` to the underlying worker via the message broker\n * - emits optional instrumentation logging for the new runner\n * - returns the live manager-side runner instance\n *\n * Notes:\n * - the runner is added to the manager-side registry before the brokered add command\n * completes\n * - the worker runtime is expected to create its own corresponding executable runner\n * when it receives the `AddRunner` command\n *\n * @param stsWorkerEx Target worker that will own the runner.\n * @param runnerOptions Runner-specific runtime options.\n * @returns Newly created live runner instance.\n * @throws Re-throws unexpected errors after logging.\n */\n AddRunnerToWorker = async (stsWorkerEx: IWorkerEx, runnerOptions: IRunnerOptions): Promise<IRunnerEx> => {\n this.#debug(`AddRunnerToWorker()`);\n try {\n const runnerEx: IRunnerEx =\n this.#asyncRunnerInstanceManager.CreateAsyncRunner(stsWorkerEx, runnerOptions);\n\n this.#workerRegistry.AddRunner(stsWorkerEx.id, runnerEx);\n\n const retVal = await this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n stsWorkerEx,\n runnerEx,\n eIWMessageCommands.AddRunner\n );\n\n if (runnerEx.publishInstrumentController) {\n runnerEx.publishInstrumentController.LogEx(\n chalk.green(`Added runner: [${runnerEx.id}] into worker: [${stsWorkerEx.id}]`)\n );\n }\n\n if (retVal) {\n this.#debug(\n chalk.green(\n `Added runner: [${runnerEx.id}] into worker: [${stsWorkerEx.id}] result: [${JSON.stringify(retVal)}]`\n )\n );\n }\n\n return runnerEx;\n } catch (error) {\n this.#error(`AddRunnerToWorker(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the current worker-manager options object.\n *\n * @returns Current worker-manager options.\n */\n get options(): IWorkerManagerOptions {\n return this.#options;\n }\n\n /**\n * Replace the current worker-manager options.\n *\n * Notes:\n * - this updates the stored options object\n * - already-created collaborators are not rebuilt automatically\n *\n * @param options New worker-manager options.\n */\n SetOptions(options: IWorkerManagerOptions) {\n this.#options = options;\n }\n\n /**\n * Start one or more workers.\n *\n * Delegates to {@link WorkerCommandCoordinator}.\n *\n * @param workerIds Worker ids to target. Use `[]` for all workers if supported by the registry/coordinator.\n * @returns Worker-level aggregated execution results.\n */\n StartWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Start');\n };\n\n /**\n * Stop one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n StopWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Stop');\n };\n\n /**\n * Pause one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n PauseWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Pause');\n };\n\n /**\n * Resume one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n ResumeWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Resume');\n };\n\n /**\n * Execute one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n ExecuteWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Execute');\n };\n\n /**\n * Reset one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n ResetWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Reset');\n };\n\n /**\n * Terminate one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n TerminateWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Terminate');\n };\n\n /**\n * Update runner options across one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @param runnerOptions Partial runner option updates to apply.\n * @returns Worker-level aggregated execution results.\n */\n UpdateWorkers = async (\n workerIds: string[],\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Update', runnerOptions);\n };\n\n /**\n * Stop one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n StopRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Stop');\n };\n\n /**\n * Start one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n StartRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Start');\n };\n\n /**\n * Pause one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n PauseRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Pause');\n };\n\n /**\n * Resume one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n ResumeRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Resume');\n };\n\n /**\n * Execute one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n ExecuteRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Execute');\n };\n\n /**\n * Reset one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n ResetRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Reset');\n };\n\n /**\n * Terminate one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n TerminateRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Terminate');\n };\n\n /**\n * Update one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @param runnerOptions Partial runner option updates.\n * @returns Per-runner execution results.\n */\n UpdateRunners = async (\n workerId: string,\n runnerIds: string[],\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(\n workerId,\n runnerIds,\n 'Update',\n runnerOptions\n );\n };\n\n /**\n * Terminate manager-owned background processing.\n *\n * Current behaviour:\n * - stops the archive manager loop\n *\n * Notes:\n * - this does not automatically terminate all workers\n * - callers should explicitly terminate workers first if desired\n */\n Terminate(): void {\n this.options.logger.debug(`STSWorkerManager:Terminate()`);\n this.#archiveManager.Terminate();\n }\n\n /**\n * Get the full current workers model.\n *\n * Behaviour:\n * - synchronises live state from worker runtimes through {@link WorkerStateSynchroniser}\n * - returns the fully populated serialisable workers model\n *\n * @returns Full worker/runners model.\n */\n GetWorkers = async (): Promise<IWorkers> => {\n return this.#workerStateSynchroniser.GetSyncedWorkers();\n };\n\n /**\n * Get the reduced/core workers model.\n *\n * Behaviour:\n * - synchronises live state from worker runtimes through {@link WorkerStateSynchroniser}\n * - returns a reduced/core worker model, optionally filtered by runner state\n *\n * Runner state filtering:\n * - `undefined` => include all runners\n * - `[]` => include all runners\n * - populated array => include only runners whose state matches\n *\n * @param states Optional runner-state filter.\n * @returns Reduced/core workers model.\n */\n GetWorkersCore = async (states?: IRunnerState[]): Promise<Record<string, IWorkerCore>> => {\n return this.#workerStateSynchroniser.GetSyncedWorkersCore(states);\n };\n}"],"x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,12,13,14,15,16],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stsrunnerframework.umd.js","names":["#options","#workerId","#logMessage","#runners","#debug","#archiveDeleteTimeout","#processLoopExecutor","#error","#PostMessageToWorkerManagerByRunnerId","#collectorCollectorPort","#silly","#UpdateRunnerStateByRunnerId","#warn","#CreateRunnerEx2RunState","#SendRunnerCommandResponse","#GetRunnerInstanceByRunnerId","#GetRunnerExecutionProfileByRunnerId","#GetRunnerIterationByRunnerId","#CanExecuteNextIterationByRunnerId","#IsCompletedByRunnerId","#IncRunnerIterationByRunnerId","#SleepImmediate","#StopRunnerByRunnerId","#ResetRunnerIterationByRunnerId","#GetRunnerOptionsByRunnerId","#SetRunnerOptionsByRunnerId","#SetMessagePort","#AddRunner","#StartRunner","#StopRunner","#TerminateRunner","#PauseRunner","#ResumeRunner","#ResetRunner","#ExecuteRunner","#UpdateRunner","#PostRunnersToWorkerManager","native","#workerEx","#messageBroker","#sendRunnerCommand","#options","#messageBroker","#workerRegistry","#asyncRunnerInstanceManager","#logger","#addRunnerToWorker","#sendRunnerCommand","#invokeCommand","#id","#options","#workerRegistry","#STSInstrumentController","#messageBroker","#asyncRunnerInstanceManager","#archiveManager","#workerInstanceManager","#runnerLifecycleManager","#workerStateSynchroniser","#workerCommandCoordinator","#logMessage","#debug","#error"],"sources":["../src/commonTypes.ts","../node_modules/color-name/index.js","../node_modules/color-convert/conversions.js","../node_modules/color-convert/route.js","../node_modules/color-convert/index.js","../node_modules/ansi-styles/index.js","../node_modules/supports-color/browser.js","../node_modules/chalk/source/util.js","../node_modules/chalk/source/templates.js","../node_modules/chalk/source/index.js","../src/abstractRunnerExecutionWorker.ts","../node_modules/uuid/dist/stringify.js","../node_modules/uuid/dist/rng.js","../node_modules/uuid/dist/native.js","../node_modules/uuid/dist/v4.js","../node_modules/lodash.merge/index.js","../src/messageBroker.ts","../src/runnerInstance.ts","../src/asyncRunnerInstanceManager.ts","../src/archiveManager.ts","../src/workerInstance.ts","../src/workerInstanceMannager.ts","../src/workerRegistry.ts","../src/telemetryProcessor.ts","../src/runnerLifecycleManager.ts","../src/workerStateSynchroniser.ts","../src/workerCommandCoordinator.ts","../src/workerManager.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { MessagePort } from 'node:worker_threads';\n\nimport { PublishInstrumentController, IContextBase } from '@nsshunt/stsinstrumentmanagerclient'\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\nexport interface IAsyncRunnerContext extends IContextBase {\n\tid: string\n\thostName: string\n\tagentName: string\n\tthreadId: string\n\t//@@ asyncRunnerId: number ??\n}\n\n/**\n * Inter-Worker (IW) Payload context base.\n */\nexport interface IIWMessagePayloadContentBase {\n messageId: string\n}\n\n/**\n * Inter-Worker (IW) message commands.\n */\nexport enum eIWMessageCommands {\n\tInstrumentTelemetry ='__STS__InstrumentTelemetry', // Used to send instrument telemetry\n\n\tMessagePort = '__STS__MessagePort',\n\tMessagePortResponse = '__STS__MessagePortResponse',\n\n\tAddRunner = '__STS__AddRunner',\n\tAddRunnerResponse = '__STS__AddRunnerResponse',\n\n\tStartRunner = '__STS__StartRunner',\n\tStartRunnerResponse = '__STS__StartRunnerResponse',\n\n\tStopRunner = '__STS__StopRunner',\n\tStopRunnerResponse = '__STS__StopRunnerResponse',\n\n\tPauseRunner = '__STS__PauseRunner',\n\tPauseRunnerResponse = '__STS__PauseRunnerResult',\n\n\tResumeRunner = '__STS__ResumeRunner',\n\tResumeRunnerResponse = '__STS__ResumeRunnerResponse',\n\n\tResetRunner = '__STS__ResetRunner',\n\tResetRunnerResponse = '__STS__ResetRunnerResponse',\n\n\tExecuteRunner = '__STS__ExecuteRunner',\n\tExecuteRunnerResponse = '__STS__ExecuteRunnerResponse',\n\n\tCompleted = '__STS__Completed',\n\n\tUpdateRunner = '__STS__UpdateRunner',\n\tUpdateRunnerResponse = '__STS__UpdateRunnerResponse',\n\n\tTerminateRunner = '__STS__TerminateRunner',\n\tTerminateRunnerResponse = '__STS__TerminateRunnerResponse',\n\n\tRunnerStateChange = '__STS__RunnerStateChange',\n\n\tGetRunners = '__STS__GetRunners',\n\tGetRunnersResponse = '__STS__GetRunnersResponse'\n}\n\n/**\n * Inter-Worker (IW) message command.\n */\nexport type IIWMessageCommand = eIWMessageCommands\n\n/**\n * Inter-Worker (IW) message payload.\n */\nexport interface IIWMessagePayload {\n command: IIWMessageCommand\n payload: IIWMessagePayloadContentBase\n}\n\nexport interface ISTSAgentWorkerMessagePort extends IIWMessagePayloadContentBase {\n port: MessagePort\n options: IWorkerOptions\n\tworkerId: string\n}\n\nexport interface ISTSGetRunnersPayload extends IIWMessagePayloadContentBase {\n\tworkerId: string\n\trunners: IRunner[]\n}\n\nexport enum IRunnerState {\n\tcreated = 'created',\n\trunning = 'running',\n\tpaused = 'paused',\n\tcompleted = 'completed',\n\tstopped = 'stopped',\n\tterminated = 'terminated',\n\terror = 'error'\n}\n\nexport interface IRunnerTelemetry {\n\trequestCount: number // requestCount\n\terrorCount: number\n\tretryCount: number\n\tauthenticationCount: number\n\tauthenticationErrorCount: number\n\tauthenticationRetryCount: number\n\tvelocity: number\n\tcoreCount: number\n\ttimer: number\n\tduration: number\n\tlatency: number\n\tactiveRequestCount: number\n\tmessage: string[]\n\tchildCount: number\n\trx: number\n\ttx: number\n}\n\nexport interface IRunnerHistoryRecord {\n\teventDate: Date\n\trunner: IRunner\n}\n\nexport interface IRunnerPlan {\n\tid: string // Unique ID for this plan (uuidv4)\n\tplan: string // Human readable plan name (for drop-down, select lists, logging, etc.)\n\tplanInstanceId: string // unique instance ID (uuidv4) for this runner being exected within a plan\n\tstage: number // 0 based stage number within a plans execution\n\tplanVU: number // The plan virtual user identifer. When a plan executed, the VU number will start from 0 and increase as VUs are added.\n}\n\nexport interface ISTSRunner {\n\tget id(): string\n\tget workerId(): string\n\tget workerManagerId(): string\n\tget state(): IRunnerState\n\tget iteration(): number\n\tget asyncRunnerContext(): IAsyncRunnerContext\n\tget options(): IRunnerOptions\n\tset options(options: IRunnerOptions)\n\tget instrumentData(): IRunnerTelemetry\n\tset instrumentData(newRunnerTelemetry: IRunnerTelemetry)\n\tget runnerHistory(): IRunnerHistoryRecord[] | undefined\n}\n\nexport interface IRunner {\n\tget id(): string\n\tget workerId(): string\n\tget workerManagerId(): string\n\tstate: IRunnerState\n\titeration: number\n\tget asyncRunnerContext(): IAsyncRunnerContext\n\tget options(): IRunnerOptions\n\tset options(options: IRunnerOptions)\n\tget instrumentData(): IRunnerTelemetry\n\tset instrumentData(newRunnerTelemetry: IRunnerTelemetry)\n\trunnerHistory?: IRunnerHistoryRecord[]\n}\n\nexport interface IRunnerCore {\n\tget id(): string\n\titeration: number\n\tstate: IRunnerState\n\trunnerPlan?: IRunnerPlan\n}\n\nexport interface IRunnerEx {\n id: string\n workerId: string\n workerManagerId: string\n state: IRunnerState\n iteration: number\n options: IRunnerOptions\n asyncRunnerContext: IAsyncRunnerContext\n publishInstrumentController?: PublishInstrumentController\n instrumentData: IRunnerTelemetry\n runnerHistory: IRunnerHistoryRecord[]\n archived: boolean\n\n Start(): Promise<IExecuteRunnerActionResult>\n Stop(): Promise<IExecuteRunnerActionResult>\n Pause(): Promise<IExecuteRunnerActionResult>\n Resume(): Promise<IExecuteRunnerActionResult>\n Reset(): Promise<IExecuteRunnerActionResult>\n Execute(): Promise<IExecuteRunnerActionResult>\n Terminate(): Promise<IExecuteRunnerActionResult>\n Update(options: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult>\n\n on(eventName: string, cb: (args?: any) => void): IRunnerEx\n\n toJSON(): IRunner\n toRunner(includeHistory?: boolean): IRunner\n toRunnerCore(): IRunnerCore\n}\n\nexport interface IRunnerInstance {\n\tStartRunner: () => Promise<any>\n\tStopRunner: () => Promise<any>\n\tPauseRunner: () => Promise<any>\n\tResumeRunner: () => Promise<any>\n\tTerminateRunner: () => Promise<any>\n\tResetRunner: () => Promise<any>\n\tExecuteRunner: () => Promise<any> // Execute a single iteration for this test\n\tUpdateRunner: (runnerOptions: Partial<IRunnerOptions>) => Promise<any>\n\tCompleted: () => Promise<any>\n}\n\nexport enum IWorkerState {\n\tstarting = 'starting', // worker is starting up (very short state transition from this to started)\n\tstarted = 'started', // worker has been started and is currently running\n\tstopped = 'stopped', // workers has been stopped\n\tpaused = 'paused', // worker has been paused\n\terror = 'error' // worker has stopped in an error state\n}\n \nexport interface IWorkerOptions {\n hostName: string\n agentId: string\n userAgent: string\n\tmocked: boolean // true if this worker is mocked (i.e. in the same thread as the running thread - not using workers)\n\ttags: string[]\n\tuserData: any\n\tlogLevel: number // 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n}\n\nexport type IRunners = Record<string, IRunner>\n\nexport interface IWorkerCore {\n\tid: string,\n\trunners: Record<string, IRunnerCore>\n}\n\nexport interface IWorker {\n\tid: string\n\toptions: IWorkerOptions\n\tworkerManagerId: string\n\trunners?: IRunners // Will be created by utility helper\n\tstate?: IWorkerState // This should be a computed state based on the runners within this worker\n}\n\nexport type IWorkers = Record<string, IWorker>\n\n// If both iterations and duration are 0, run continuously until stop using the API.\nexport interface IExecutionProfile {\n iterations: number // Number of iterations to execute per runner. 0 = do not consider iterations.\n\tduration: number // Number of seconds to run per runner. 0 = do not consider duration.\n\tdelayBetweenIterations: number // Number of ms to delay between iterations\n\tpauseOnComplete: boolean // When either the iterations or the duration is hit, the runner will pause instead of being set to complete.\n}\n\n// default signals that already exist are\n// state change\n// completed\n// telemetry publish - @@ check if we can force publish ??\nexport enum IRunnerSignalType {\n\t'duration' = 'duration', // Signal the manager when any of the duration conditions are satisfied.\n\t'iteration' = 'iteration', // Signal the manager when any of the iteration conditions are satisfied.\n\t'log' = 'log', // Signal the manager when any log event occurs - a level 1-5 - 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n\t'user' = 'user' // The test runner code itself can signal the worker manager manually in code.\n}\n\n// Signal run-time objects\n\nexport interface IRunnerSignalBase {\n\trunner: IRunner\n}\n\nexport interface IRunnerSignalDuration extends IRunnerSignalBase {\n\tduration: number\n}\n\nexport interface IRunnerSignalIteration extends IRunnerSignalBase {\n\titeration: number\n}\n\nexport interface IRunnerSignalLog extends IRunnerSignalBase {\n\terror: any\n}\n\nexport interface IRunnerSignalUser extends IRunnerSignalBase {\n\tdata: any\n}\n\n// Object that is passed as the signal event\nexport interface IRunnerSignal {\n\ttype: IRunnerSignalType\n\tdata: IRunnerSignalDuration | IRunnerSignalIteration | IRunnerSignalLog | IRunnerSignalUser\n}\n\n// Signal configurations\n\nexport interface IRunnerSignalDurationConfig {\n\tevery?: number[] // Fire the duration signal every [every] ms\n\tat?: number[] // Fire the at duration signal at a sepcific duration from the start\n}\n\nexport interface IRunnerSignalIterationConfig {\n\tevery?: number[] // Fire the iteration signal every x number of iterations (i.e. when iteration % every = 0)\n\tat?: number[] // Fire the at iteration signal at the sepcific iteration(s)\n}\n\nexport interface IRunnerSignalErrorConfig {\n\tlogLevel: number // 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n}\n\nexport interface IRunnerSignalUserConfig {\n\tconfig: any\n}\n\nexport type IRunnerSignalConfigs = IRunnerSignalConfig[];\n\nexport interface IRunnerSignalConfig {\n\ttype: IRunnerSignalType\n\tdata: IRunnerSignalDurationConfig | IRunnerSignalIterationConfig | IRunnerSignalErrorConfig | IRunnerSignalUserConfig\n}\n\nexport interface IRunnerOptions {\n\ttestType: string\n\tdescription: string\n\texecutionProfile: IExecutionProfile\n\ttag: string[]\n\tuserData: any\n\trunnerPlan?: IRunnerPlan\n\trunnerSignals?: IRunnerSignalConfigs\n}\n\nexport interface IRunnerEvent {\n\teventName: string\n\tcb: (args?: any) => void\n}\n\nexport interface IWorkerEvent {\n\teventName: string\n\tcb: (args?: any) => void\n}\n\nexport interface IWorkerEx {\n id: string\n workerManagerId: string\n worker: any\n messagePort: any\n options: IWorkerOptions\n workerEvents: IWorkerEvent[]\n runnersEvents: Record<string, IRunnerEvent[]>\n\n AddRunnerEx(runnerEx: IRunnerEx): void\n GetRunnerEx(id: string): IRunnerEx | null\n GetAllRunnersEx(): IRunnerEx[]\n GetAllRunnersExMap(): Record<string, IRunnerEx>\n GetRunnersEx(runnerIds: string[]): IRunnerEx[]\n AddRunner(runnerOptions: IRunnerOptions): Promise<IRunnerEx>\n\n StartRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n StopRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n PauseRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n ResumeRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n TerminateRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n ResetRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n ExecuteRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult>\n\n UpdateRunner(\n runner: IRunnerEx,\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult>\n\n Start(): Promise<IExecuteRunnerActionResult[]>\n Stop(): Promise<IExecuteRunnerActionResult[]>\n Pause(): Promise<IExecuteRunnerActionResult[]>\n Resume(): Promise<IExecuteRunnerActionResult[]>\n Reset(): Promise<IExecuteRunnerActionResult[]>\n Execute(): Promise<IExecuteRunnerActionResult[]>\n Terminate(): Promise<IExecuteRunnerActionResult[]>\n\n Update(\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]>\n\n on(eventName: string, cb: (args?: any) => void): IWorkerEx\n\n toJSON(): IWorker\n toWorker(): IWorker\n toWorkerCore(states?: IRunnerState[]): IWorkerCore\n}\n\nexport interface ISTSTestWorkerOptions {\n iterations: number\n}\n\nexport interface ITelemetryStore {\n\tworkers: IWorkers\n}\n\nexport interface ITestRunnerTelemetryPayload extends IIWMessagePayloadContentBase {\n\trunner: IRunner\n}\n\nexport interface ITestRunnerTelemetryPayloadResponse extends ITestRunnerTelemetryPayload {\n\texecuteRunnerActionResult: IExecuteRunnerActionResult\n}\n\nexport interface IWorkerFactory {\n\tcreateWorkerThreadWorker: () => any // | wt.Worker\n}\n\nexport interface IWorkerManagerOptions {\n workerFactory: IWorkerFactory\n\tpublishInstrumentController?: PublishInstrumentController\n\tmaxArchiveListLength: number\n\tlogger: ISTSLogger\n\tlogLevel: number // 'silly' 5 | 'debug' 4 | 'info' 3 | 'warn' 2 | 'error' 1\n\tmessageTimeout: number\n}\n\nexport const PublishMessageCommandsTestRunner = {\n ...eIWMessageCommands,\n GetAccessToken: '__GetAccessToken',\n GetAccessTokenResponse: '__GetAccessTokenResponse',\n GetDataFromPrimary: '__GetDataFromPrimary',\n ExecuteRefreshToken: '__ExecuteRefreshToken',\n ExecuteRefreshTokenResponse: '__ExecuteRefreshTokenResponse'\n} as const\n\nexport type PublishMessageCommandsTestRunner = typeof PublishMessageCommandsTestRunner[keyof typeof PublishMessageCommandsTestRunner];\n\nexport interface IExecuteWorkerActionResult {\n\tworkerManagerId: string\n\tworkerId: string\n\texecuteRunnerActionResults: IExecuteRunnerActionResult[] \n}\n\nexport interface IExecuteRunnerActionResult {\n\tworkerManagerId: string\n\tworkerId: string\n\trunnerId: string\n\tresult: any\n}\n\nexport interface IRunnerSearchFilters {\n\tplan?: string\n\tplanInstanceId?: string\n\ttag?: string\n\tuserDataKey?: string\n}\n\nexport interface ISTSWorkerManager {\n\tget id(): string;\n get options(): IWorkerManagerOptions\n\n\tSetOptions(options: IWorkerManagerOptions): void;\n\n /**\n * Get complete IWorkerCore model. The model will be refresh prior to returning the values.\n * Optionally include runners that are in the specified states.\n * @param states Use [] or undefined to include all runners irrespective of state.\n * @returns IWorkerCore recordset\n */\n GetWorkersCore(states?: IRunnerState[]): Promise<Record<string, IWorkerCore>>;\n\n /**\n * Get complete IWorkers model. The model will be refresh prior to returning the values.\n * @returns Complete refreshed IWorkers model.\n */\n GetWorkers(states: IRunnerState[]): Promise<IWorkers>;\n\tGetArchiveList(runnerSearchFilters: IRunnerSearchFilters): Promise<IRunner[]>;\n\n\tAddWorker(workerOptions: IWorkerOptions, useWorkerFactory?: IWorkerFactory): Promise<IWorkerEx>;\n AddRunnerToWorker(stsWorkerEx: IWorkerEx, runnerOptions: IRunnerOptions): Promise<IRunnerEx>;\n\n StartWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n StopWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n PauseWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n ResumeWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n ExecuteWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n ResetWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n TerminateWorkers(workerIds: string[]): Promise<IExecuteWorkerActionResult[]>\n UpdateWorkers(workerIds: string[], runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteWorkerActionResult[]>\n\n StopRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n StartRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n PauseRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n ResumeRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n ExecuteRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n ResetRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n TerminateRunners(workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]>\n UpdateRunners(workerId: string, runnerIds: string[], runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult[]>\n\n\tTerminate(): void\n}\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","'use strict';\n\nconst wrapAnsi16 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => (...args) => {\n\tconst rgb = fn(...args);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nconst ansi2ansi = n => n;\nconst rgb2rgb = (r, g, b) => [r, g, b];\n\nconst setLazyProperty = (object, property, get) => {\n\tObject.defineProperty(object, property, {\n\t\tget: () => {\n\t\t\tconst value = get();\n\n\t\t\tObject.defineProperty(object, property, {\n\t\t\t\tvalue,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\n\t\t\treturn value;\n\t\t},\n\t\tenumerable: true,\n\t\tconfigurable: true\n\t});\n};\n\n/** @type {typeof import('color-convert')} */\nlet colorConvert;\nconst makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {\n\tif (colorConvert === undefined) {\n\t\tcolorConvert = require('color-convert');\n\t}\n\n\tconst offset = isBackground ? 10 : 0;\n\tconst styles = {};\n\n\tfor (const [sourceSpace, suite] of Object.entries(colorConvert)) {\n\t\tconst name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;\n\t\tif (sourceSpace === targetSpace) {\n\t\t\tstyles[name] = wrap(identity, offset);\n\t\t} else if (typeof suite === 'object') {\n\t\t\tstyles[name] = wrap(suite[targetSpace], offset);\n\t\t}\n\t}\n\n\treturn styles;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\n\t\t\t// Bright color\n\t\t\tblackBright: [90, 39],\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Alias bright black as gray (and grey)\n\tstyles.color.gray = styles.color.blackBright;\n\tstyles.bgColor.bgGray = styles.bgColor.bgBlackBright;\n\tstyles.color.grey = styles.color.blackBright;\n\tstyles.bgColor.bgGrey = styles.bgColor.bgBlackBright;\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tsetLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));\n\tsetLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n","'use strict';\nmodule.exports = {\n\tstdout: false,\n\tstderr: false\n};\n","'use strict';\n\nconst stringReplaceAll = (string, substring, replacer) => {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.substr(endIndex, index - endIndex) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nconst stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nmodule.exports = {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n};\n","'use strict';\nconst TEMPLATE_REGEX = /(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi;\nconst STYLE_REGEX = /(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g;\nconst STRING_REGEX = /^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/;\nconst ESCAPE_REGEX = /\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi;\n\nconst ESCAPES = new Map([\n\t['n', '\\n'],\n\t['r', '\\r'],\n\t['t', '\\t'],\n\t['b', '\\b'],\n\t['f', '\\f'],\n\t['v', '\\v'],\n\t['0', '\\0'],\n\t['\\\\', '\\\\'],\n\t['e', '\\u001B'],\n\t['a', '\\u0007']\n]);\n\nfunction unescape(c) {\n\tconst u = c[0] === 'u';\n\tconst bracket = c[1] === '{';\n\n\tif ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {\n\t\treturn String.fromCharCode(parseInt(c.slice(1), 16));\n\t}\n\n\tif (u && bracket) {\n\t\treturn String.fromCodePoint(parseInt(c.slice(2, -1), 16));\n\t}\n\n\treturn ESCAPES.get(c) || c;\n}\n\nfunction parseArguments(name, arguments_) {\n\tconst results = [];\n\tconst chunks = arguments_.trim().split(/\\s*,\\s*/g);\n\tlet matches;\n\n\tfor (const chunk of chunks) {\n\t\tconst number = Number(chunk);\n\t\tif (!Number.isNaN(number)) {\n\t\t\tresults.push(number);\n\t\t} else if ((matches = chunk.match(STRING_REGEX))) {\n\t\t\tresults.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));\n\t\t} else {\n\t\t\tthrow new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction parseStyle(style) {\n\tSTYLE_REGEX.lastIndex = 0;\n\n\tconst results = [];\n\tlet matches;\n\n\twhile ((matches = STYLE_REGEX.exec(style)) !== null) {\n\t\tconst name = matches[1];\n\n\t\tif (matches[2]) {\n\t\t\tconst args = parseArguments(name, matches[2]);\n\t\t\tresults.push([name].concat(args));\n\t\t} else {\n\t\t\tresults.push([name]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction buildStyle(chalk, styles) {\n\tconst enabled = {};\n\n\tfor (const layer of styles) {\n\t\tfor (const style of layer.styles) {\n\t\t\tenabled[style[0]] = layer.inverse ? null : style.slice(1);\n\t\t}\n\t}\n\n\tlet current = chalk;\n\tfor (const [styleName, styles] of Object.entries(enabled)) {\n\t\tif (!Array.isArray(styles)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!(styleName in current)) {\n\t\t\tthrow new Error(`Unknown Chalk style: ${styleName}`);\n\t\t}\n\n\t\tcurrent = styles.length > 0 ? current[styleName](...styles) : current[styleName];\n\t}\n\n\treturn current;\n}\n\nmodule.exports = (chalk, temporary) => {\n\tconst styles = [];\n\tconst chunks = [];\n\tlet chunk = [];\n\n\t// eslint-disable-next-line max-params\n\ttemporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {\n\t\tif (escapeCharacter) {\n\t\t\tchunk.push(unescape(escapeCharacter));\n\t\t} else if (style) {\n\t\t\tconst string = chunk.join('');\n\t\t\tchunk = [];\n\t\t\tchunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));\n\t\t\tstyles.push({inverse, styles: parseStyle(style)});\n\t\t} else if (close) {\n\t\t\tif (styles.length === 0) {\n\t\t\t\tthrow new Error('Found extraneous } in Chalk template literal');\n\t\t\t}\n\n\t\t\tchunks.push(buildStyle(chalk, styles)(chunk.join('')));\n\t\t\tchunk = [];\n\t\t\tstyles.pop();\n\t\t} else {\n\t\t\tchunk.push(character);\n\t\t}\n\t});\n\n\tchunks.push(chunk.join(''));\n\n\tif (styles.length > 0) {\n\t\tconst errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\\`}\\`)`;\n\t\tthrow new Error(errMessage);\n\t}\n\n\treturn chunks.join('');\n};\n","'use strict';\nconst ansiStyles = require('ansi-styles');\nconst {stdout: stdoutColor, stderr: stderrColor} = require('supports-color');\nconst {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n} = require('./util');\n\nconst {isArray} = Array;\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m'\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nclass ChalkClass {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = {};\n\tapplyOptions(chalk, options);\n\n\tchalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);\n\n\tObject.setPrototypeOf(chalk, Chalk.prototype);\n\tObject.setPrototypeOf(chalk.template, chalk);\n\n\tchalk.template.constructor = () => {\n\t\tthrow new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');\n\t};\n\n\tchalk.template.Instance = ChalkClass;\n\n\treturn chalk.template;\n};\n\nfunction Chalk(options) {\n\treturn chalkFactory(options);\n}\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t}\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this._styler, true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t}\n};\n\nconst usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nfor (const model of usedModels) {\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this._generator.level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis._generator.level = level;\n\t\t}\n\t}\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\tconst builder = (...arguments_) => {\n\t\tif (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {\n\t\t\t// Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`\n\t\t\treturn applyStyle(builder, chalkTag(builder, ...arguments_));\n\t\t}\n\n\t\t// Single argument is hot path, implicit coercion is faster than anything\n\t\t// eslint-disable-next-line no-implicit-coercion\n\t\treturn applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\t};\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder._generator = self;\n\tbuilder._styler = _styler;\n\tbuilder._isEmpty = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self._isEmpty ? '' : string;\n\t}\n\n\tlet styler = self._styler;\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.indexOf('\\u001B') !== -1) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nlet template;\nconst chalkTag = (chalk, ...strings) => {\n\tconst [firstString] = strings;\n\n\tif (!isArray(firstString) || !isArray(firstString.raw)) {\n\t\t// If chalk() was called by itself or with a string,\n\t\t// return the string itself as a string.\n\t\treturn strings.join(' ');\n\t}\n\n\tconst arguments_ = strings.slice(1);\n\tconst parts = [firstString.raw[0]];\n\n\tfor (let i = 1; i < firstString.length; i++) {\n\t\tparts.push(\n\t\t\tString(arguments_[i - 1]).replace(/[{}\\\\]/g, '\\\\$&'),\n\t\t\tString(firstString.raw[i])\n\t\t);\n\t}\n\n\tif (template === undefined) {\n\t\ttemplate = require('./templates');\n\t}\n\n\treturn template(chalk, parts.join(''));\n};\n\nObject.defineProperties(Chalk.prototype, styles);\n\nconst chalk = Chalk(); // eslint-disable-line new-cap\nchalk.supportsColor = stdoutColor;\nchalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap\nchalk.stderr.supportsColor = stderrColor;\n\nmodule.exports = chalk;\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * AbstractRunnerExecutionWorker\n * =============================\n *\n * Abstract base class for the *actual execution worker runtime* that lives inside:\n *\n * - a browser Web Worker, or\n * - a Node.js worker thread\n *\n * This class is the worker-side execution host for runners. It is responsible for:\n *\n * - receiving commands from the manager/controller side\n * - creating concrete executable runner instances\n * - maintaining in-worker runner runtime state\n * - driving runner execution loops\n * - posting unsolicited telemetry and state changes back to the manager\n * - posting solicited command responses back to the manager\n * - retiring/removing finished runners from the worker's live runtime collection\n *\n * Important architectural distinction\n * -----------------------------------\n * This class is **not** the same as the manager-side worker model used in your\n * registry/coordinator layer.\n *\n * Manager side:\n * - owns worker metadata\n * - issues commands\n * - receives telemetry/results\n *\n * Worker side (this class):\n * - actually runs the work\n * - holds concrete runner implementations\n * - manages runner execution lifecycle inside the worker runtime\n *\n * Why abstract?\n * -------------\n * The runner logic can be anything:\n *\n * - HTTP/API execution\n * - synthetic load generation\n * - browser automation\n * - database work\n * - arbitrary domain workflows\n *\n * This class provides the common runtime/lifecycle/message-handling framework,\n * while subclasses override `CreateAsyncRunner(...)` to create a concrete\n * `IRunnerInstance` that performs the actual work.\n */\n\nimport { MessagePort } from 'worker_threads';\n\nimport isNode from 'detect-node';\n\nimport {\n IIWMessagePayload,\n eIWMessageCommands,\n IIWMessagePayloadContentBase,\n IRunnerInstance,\n ISTSAgentWorkerMessagePort,\n IRunner,\n ITestRunnerTelemetryPayload,\n IWorkerOptions,\n IRunnerState,\n IRunnerOptions,\n ISTSGetRunnersPayload,\n IExecutionProfile,\n ITestRunnerTelemetryPayloadResponse\n} from './commonTypes';\n\nimport chalk from 'chalk';\n// Force chalk level\nchalk.level = 3;\n\nimport { ISTSLogger, Sleep, defaultLogger } from '@nsshunt/stsutils';\n\n/**\n * Internal runtime record stored for each runner hosted inside this worker.\n *\n * This combines:\n * - the serialisable runner DTO/state (`runner`)\n * - the concrete executable runner implementation (`runnerInstance`)\n * - an archive flag used for in-worker cleanup (`archived`)\n */\nexport interface IRunnerEx2RunState {\n /**\n * Concrete executable runner implementation.\n *\n * This is the object that performs the actual domain work.\n */\n runnerInstance: IRunnerInstance;\n\n /**\n * Current serialisable runner model/state.\n *\n * This is the object sent back to the manager for state/telemetry updates.\n */\n runner: IRunner;\n\n /**\n * Indicates whether the runner has already been archived/marked for removal\n * from the worker's live runner collection.\n */\n archived: boolean;\n}\n\n/**\n * Abstract worker-runtime base class.\n *\n * A concrete subclass is expected to:\n * - run inside a real worker environment\n * - override `CreateAsyncRunner(...)`\n * - optionally expose its `ProcessMessage(...)` method as the worker message entry point\n *\n * High-level lifecycle\n * --------------------\n * 1. Manager bootstraps this worker by sending `MessagePort`\n * 2. This class stores the manager communication port and worker options\n * 3. Manager sends commands like:\n * - `AddRunner`\n * - `StartRunner`\n * - `PauseRunner`\n * - `GetRunners`\n * 4. This class processes those commands and updates runner runtime state\n * 5. This class sends:\n * - solicited responses for commands\n * - unsolicited state changes\n * - unsolicited telemetry\n */\nexport abstract class AbstractRunnerExecutionWorker {\n /**\n * Dedicated message port used to communicate back to the manager/controller.\n *\n * Set during worker bootstrap via the `MessagePort` command.\n */\n #collectorCollectorPort: MessagePort | null = null;\n\n /**\n * Live runner collection hosted by this worker runtime.\n *\n * Key: runner id\n * Value: combined runtime entry containing the serialisable runner model\n * and the concrete executable runner implementation.\n */\n #runners: Record<string, IRunnerEx2RunState> = {};\n\n /**\n * Worker runtime options supplied by the manager during bootstrap.\n *\n * Remains `null` until the `MessagePort` bootstrap command is received.\n */\n #options: IWorkerOptions | null = null;\n\n /**\n * Worker id assigned by the manager/controller.\n *\n * Remains `null` until the `MessagePort` bootstrap command is received.\n */\n #workerId: string | null = null;\n\n /**\n * Delay in seconds before archived runners are removed from the live\n * in-worker runner collection.\n */\n #archiveDeleteTimeout: number = 30;\n\n /**\n * Logger used by this worker runtime.\n *\n * Returns the shared default logger by default, but exposing this as a getter\n * allows subclasses to override/customise logging behaviour if desired.\n */\n get logger(): ISTSLogger {\n return defaultLogger;\n }\n\n /**\n * Prefix and emit a worker-scoped log message.\n *\n * If worker options are available, the log includes the worker id.\n *\n * @param fn Target logger method.\n * @param message Log message.\n */\n #logMessage = (fn: (message: any) => void, message: string) => {\n if (this.#options) {\n fn(`pid: [${process.pid}] WorkerInstance: Worker ID: [${this.#workerId}] Log: [${message}]`);\n } else {\n fn(`pid: [${process.pid}] WorkerInstance: Log: [${message}]`);\n }\n };\n\n /**\n * Log at silly/trace level when enabled by worker options.\n *\n * @param message Log message.\n */\n #silly = (message: any) => {\n if (this.#options && this.#options.logLevel >= 5) {\n this.#logMessage(this.logger.silly, message);\n }\n };\n\n /**\n * Log at debug level when enabled by worker options.\n *\n * @param message Log message.\n */\n #debug = (message: any) => {\n if (this.#options && this.#options.logLevel >= 4) {\n this.#logMessage(this.logger.debug, message);\n }\n };\n\n /**\n * Log at info level when enabled by worker options.\n *\n * @param message Log message.\n */\n #info = (message: any) => {\n if (this.#options && this.#options.logLevel >= 3) {\n this.#logMessage(this.logger.info, message);\n }\n };\n\n /**\n * Log at warn level when enabled by worker options.\n *\n * @param message Log message.\n */\n #warn = (message: any) => {\n if (this.#options && this.#options.logLevel >= 2) {\n this.#logMessage(this.logger.warn, message);\n }\n };\n\n /**\n * Log at error level when enabled by worker options.\n *\n * @param error Error or message.\n */\n #error = (error: any) => {\n if (this.#options && this.#options.logLevel >= 1) {\n this.#logMessage(this.logger.error, error);\n }\n };\n\n /**\n * Background cleanup/archive loop for runners hosted inside this worker runtime.\n *\n * Behaviour:\n * - scans all live runners\n * - identifies runners in terminal states:\n * - completed\n * - error\n * - stopped\n * - terminated\n * - marks them as archived\n * - schedules removal from the in-worker live runner collection after\n * `#archiveDeleteTimeout`\n * - repeats every second\n *\n * Notes:\n * - This is internal worker-side cleanup only.\n * - It is distinct from any manager-side archive list.\n * - In Node.js, deletion timers are `unref()`'d so they do not keep the process alive.\n * - The short 100ms delay separates detection from mutation/removal scheduling.\n */\n #processLoopExecutor = async () => {\n try {\n const removeList: string[] = [];\n\n for (const [, runner] of Object.entries(this.#runners)) {\n if (\n runner.archived === false &&\n (\n runner.runner.state === IRunnerState.completed ||\n runner.runner.state === IRunnerState.error ||\n runner.runner.state === IRunnerState.stopped ||\n runner.runner.state === IRunnerState.terminated\n )\n ) {\n removeList.push(runner.runner.id);\n }\n }\n\n if (removeList.length > 0) {\n setTimeout(() => {\n this.#debug(chalk.grey(`WorkerInstance:#processLoopExecutor(): Removing runners from collection: [${removeList}]`));\n\n for (let i = 0; i < removeList.length; i++) {\n this.#runners[removeList[i]].archived = true;\n\n if (this.#archiveDeleteTimeout !== 0) {\n if (isNode) {\n setTimeout(\n () => delete this.#runners[removeList[i]],\n this.#archiveDeleteTimeout * 1000.0\n ).unref();\n } else {\n setTimeout(\n () => delete this.#runners[removeList[i]],\n this.#archiveDeleteTimeout * 1000.0\n );\n }\n }\n }\n\n const message = `WorkerInstance:#processLoopExecutor(): Remaining Runner Count: [${Object.keys(this.#runners).length}]`;\n this.#debug(chalk.magenta(message));\n\n setTimeout(this.#processLoopExecutor, 1000);\n }, 100);\n } else {\n setTimeout(this.#processLoopExecutor, 1000);\n }\n } catch (error) {\n this.#error(`#processLoopExecutor(): [${error}]`);\n setTimeout(this.#processLoopExecutor, 1000);\n }\n };\n\n /**\n * Construct the worker runtime host and start the background cleanup loop.\n */\n constructor() {\n this.#processLoopExecutor();\n }\n\n /**\n * Return a random integer between `0` and `max - 1`.\n *\n * Utility helper available to subclasses/runner logic.\n *\n * @param max Exclusive upper bound.\n * @returns Random integer.\n */\n GetRandomInt = (max: number) => {\n return Math.floor(Math.random() * Math.floor(max));\n };\n\n /**\n * Post unsolicited telemetry for a runner back to the manager.\n *\n * Uses the runner's current live serialisable state.\n *\n * @param id Runner id.\n */\n PostTelemetryById = (id: string) => {\n this.#PostMessageToWorkerManagerByRunnerId(eIWMessageCommands.InstrumentTelemetry, id, false);\n };\n\n /**\n * Get the manager communication port.\n *\n * @returns Manager communication port, or `null` if bootstrap is not complete.\n */\n get CollectorCollectorPort(): MessagePort | null {\n return this.#collectorCollectorPort;\n }\n\n /**\n * Get the worker runtime options.\n *\n * @returns Worker options, or `null` if bootstrap is not complete.\n */\n get Options(): IWorkerOptions | null {\n return this.#options;\n }\n\n /**\n * Store and initialise the manager communication port.\n *\n * Behaviour:\n * - stores the transferred message port\n * - attaches diagnostic listeners\n * - posts a `MessagePortResponse` acknowledgement back to the manager\n *\n * Environment handling:\n * - Node: uses `.on('message', ...)`\n * - Browser: uses `.addEventListener('message', ...)`\n *\n * @param workerMessagePort Bootstrap payload containing the port, worker id, and options.\n */\n #SetMessagePort = (workerMessagePort: ISTSAgentWorkerMessagePort) => {\n try {\n this.#collectorCollectorPort = workerMessagePort.port as MessagePort;\n\n if (isNode) {\n this.#collectorCollectorPort.on('message', (data: any) => {\n this.#silly(`collectorCollectorPort on('message'): ${JSON.stringify(data)}`);\n });\n } else {\n (this.#collectorCollectorPort as any).addEventListener('message', (data: any) => {\n this.#silly(`collectorCollectorPort addEventListener('message'): ${JSON.stringify(data.data)}`);\n });\n }\n\n const response: IIWMessagePayload = {\n command: eIWMessageCommands.MessagePortResponse,\n payload: {} as IIWMessagePayloadContentBase\n };\n\n this.#collectorCollectorPort.postMessage(response);\n } catch (error) {\n this.#error(`#SetMessagePort(): [${error}]`);\n }\n };\n\n /**\n * Factory method to create a concrete executable runner instance.\n *\n * This is the main extension point for subclasses.\n *\n * Subclasses should override this and return an `IRunnerInstance` that knows\n * how to execute the actual domain work.\n *\n * Possible concrete runner behaviours:\n * - REST/API load generation\n * - browser automation\n * - database execution\n * - synthetic workflow orchestration\n * - any arbitrary executable task\n *\n * Base implementation returns `null`.\n *\n * @param testRunnerTelemetryPayload Runner creation payload.\n * @returns Concrete runner instance, or `null` if not implemented.\n */\n CreateAsyncRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<IRunnerInstance | null> => {\n return null;\n };\n\n /**\n * Create and register an internal runtime entry for a new runner.\n *\n * Behaviour:\n * - stores the runner DTO and concrete executable runner instance together\n * - marks the runner as not archived\n * - resets iteration to zero\n * - transitions state to `created`\n *\n * @param runner Serialisable runner DTO provided by the manager.\n * @param runnerInstance Concrete executable runner implementation.\n */\n #CreateRunnerEx2RunState = async (runner: IRunner, runnerInstance: IRunnerInstance): Promise<void> => {\n try {\n this.#runners[runner.id] = {\n runner,\n runnerInstance,\n archived: false\n };\n this.#runners[runner.id].runner.iteration = 0;\n this.#UpdateRunnerStateByRunnerId('#CreateRunnerEx2RunState', runner.id, IRunnerState.created);\n } catch (error) {\n this.#error(`#CreateRunnerEx2RunState(): [${error}]`);\n }\n };\n\n /**\n * Update a runner's state and emit an unsolicited state change back to the manager.\n *\n * Behaviour:\n * - updates the in-worker live runner state\n * - logs the transition\n * - posts `RunnerStateChange` to the manager\n *\n * @param fromContext Diagnostic context string used in logs.\n * @param runnerId Target runner id.\n * @param state New runner state.\n */\n #UpdateRunnerStateByRunnerId = (fromContext: string, runnerId: string, state: IRunnerState) => {\n try {\n if (this.#runners[runnerId]) {\n const previousState = this.#runners[runnerId].runner.state;\n this.#runners[runnerId].runner.state = state;\n this.#debug(`#UpdateRunnerStateByRunnerId(): Context: [${fromContext}] Previous State: [${previousState}] New State: [${state}]`);\n this.#PostMessageToWorkerManagerByRunnerId(eIWMessageCommands.RunnerStateChange, runnerId, false);\n } else {\n this.#warn(`#UpdateRunnerStateByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#UpdateRunnerStateByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Determine whether a runner may execute another iteration.\n *\n * Current rule:\n * - only runners in `running` state may continue executing iterations\n *\n * Fail-safe behaviour:\n * - returns `false` if the runner is missing or an error occurs\n *\n * @param runnerId Target runner id.\n * @returns `true` when the runner may execute another iteration.\n */\n #CanExecuteNextIterationByRunnerId = (runnerId: string): boolean => {\n try {\n if (this.#runners[runnerId]) {\n const state = this.#runners[runnerId].runner.state;\n if (state === IRunnerState.running) {\n return true;\n }\n return false;\n } else {\n this.#warn(`#CanExecuteNextIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return false;\n }\n } catch (error) {\n this.#error(`#CanExecuteNextIterationByRunnerId(): [${error}]`);\n return false;\n }\n };\n\n /**\n * Determine whether a runner is in a terminal/completed state.\n *\n * Terminal states:\n * - error\n * - completed\n * - stopped\n * - terminated\n *\n * Fail-safe behaviour:\n * - returns `true` if the runner is missing or an error occurs\n *\n * @param runnerId Target runner id.\n * @returns `true` if the runner is terminal/completed.\n */\n #IsCompletedByRunnerId = (runnerId: string): boolean => {\n try {\n if (this.#runners[runnerId]) {\n const state = this.#runners[runnerId].runner.state;\n if (\n state === IRunnerState.error ||\n state === IRunnerState.completed ||\n state === IRunnerState.stopped ||\n state === IRunnerState.terminated\n ) {\n return true;\n }\n return false;\n } else {\n this.#warn(`#IsCompletedByRunnerId(): Runner ID: [${runnerId}] not found`);\n return true;\n }\n } catch (error) {\n this.#error(`#IsCompletedByRunnerId(): [${error}]`);\n return true;\n }\n };\n\n /**\n * Get the current iteration count for a runner.\n *\n * @param runnerId Target runner id.\n * @returns Current iteration count, or `0` on failure.\n */\n #GetRunnerIterationByRunnerId = (runnerId: string): number => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runner.iteration;\n } else {\n this.#warn(`#GetRunnerIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return 0;\n }\n } catch (error) {\n this.#error(`#GetRunnerIterationByRunnerId(): [${error}]`);\n return 0;\n }\n };\n\n /**\n * Reset a runner's iteration count to zero.\n *\n * @param runnerId Target runner id.\n * @returns New iteration count (`0`), or `0` on failure.\n */\n #ResetRunnerIterationByRunnerId = (runnerId: string): number => {\n try {\n if (this.#runners[runnerId]) {\n this.#runners[runnerId].runner.iteration = 0;\n return 0;\n } else {\n this.#warn(`#ResetRunnerIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return 0;\n }\n } catch (error) {\n this.#error(`#ResetRunnerIterationByRunnerId(): [${error}]`);\n return 0;\n }\n };\n\n /**\n * Increment a runner's iteration count.\n *\n * @param runnerId Target runner id.\n * @returns New iteration count, or `0` on failure.\n */\n #IncRunnerIterationByRunnerId = (runnerId: string): number => {\n try {\n if (this.#runners[runnerId]) {\n this.#runners[runnerId].runner.iteration++;\n return this.#runners[runnerId].runner.iteration;\n } else {\n this.#warn(`#IncRunnerIterationByRunnerId(): Runner ID: [${runnerId}] not found`);\n return 0;\n }\n } catch (error) {\n this.#error(`#IncRunnerIterationByRunnerId(): [${error}]`);\n return 0;\n }\n };\n\n /**\n * Resolve the concrete executable runner instance for a runner id.\n *\n * @param runnerId Target runner id.\n * @returns Concrete runner instance, or `undefined` if unavailable.\n */\n #GetRunnerInstanceByRunnerId = (runnerId: string): IRunnerInstance | undefined => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runnerInstance;\n } else {\n this.#warn(`#GetRunnerInstanceByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#GetRunnerInstanceByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Resolve the execution profile for a runner.\n *\n * The execution profile controls:\n * - number of iterations\n * - duration-limited execution\n * - delay between iterations\n * - pause-on-complete behaviour\n *\n * @param runnerId Target runner id.\n * @returns Execution profile, or `undefined`.\n */\n #GetRunnerExecutionProfileByRunnerId = (runnerId: string): IExecutionProfile | undefined => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runner.options.executionProfile;\n } else {\n this.#warn(`#GetRunnerExecutionProfileByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#GetRunnerExecutionProfileByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Get the current runner options for a runner.\n *\n * @param runnerId Target runner id.\n * @returns Runner options, or `undefined` if unavailable.\n */\n #GetRunnerOptionsByRunnerId = (runnerId: string): IRunnerOptions | undefined => {\n try {\n if (this.#runners[runnerId]) {\n return this.#runners[runnerId].runner.options;\n } else {\n this.#warn(`#GetRunnerOptionsByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#GetRunnerOptionsByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Replace the full option object for a runner.\n *\n * @param runnerId Target runner id.\n * @param options New runner options.\n * @returns Stored runner options after replacement, or `undefined` on failure.\n */\n #SetRunnerOptionsByRunnerId = (runnerId: string, options: IRunnerOptions): IRunnerOptions | undefined => {\n try {\n if (this.#runners[runnerId]) {\n this.#runners[runnerId].runner.options = { ...options };\n return this.#runners[runnerId].runner.options;\n } else {\n this.#warn(`#SetRunnerOptionsByRunnerId(): Runner ID: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#SetRunnerOptionsByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Add a runner to this worker runtime.\n *\n * Behaviour:\n * - creates a concrete executable runner via `CreateAsyncRunner(...)`\n * - stores live runtime state for that runner\n * - sends an `AddRunnerResponse` back to the manager\n *\n * Notes:\n * - if `CreateAsyncRunner(...)` returns `null`, the runner is not executable\n * - the original runner DTO is still returned locally if available\n *\n * @param testRunnerTelemetryPayload Payload containing the runner to add.\n * @returns Copy of the runner DTO, or `undefined` on failure.\n */\n #AddRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<IRunner | undefined> => {\n let result;\n let returnRunner;\n\n try {\n const { runner } = testRunnerTelemetryPayload;\n const asyncRunnerInstance = await this.CreateAsyncRunner(testRunnerTelemetryPayload);\n if (asyncRunnerInstance) {\n await this.#CreateRunnerEx2RunState(runner, asyncRunnerInstance);\n } else {\n this.#warn(`#AddRunner(): CreateAsyncRunner not defined.`);\n }\n returnRunner = { ...runner };\n } catch (error) {\n this.#error(`#AddRunner(): [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.AddRunnerResponse, testRunnerTelemetryPayload, result);\n\n return returnRunner;\n };\n\n /**\n * Yield to the event loop/microtask queue immediately.\n *\n * Used when cooperative yielding is required but no real delay is desired.\n *\n * @returns Resolved promise.\n */\n #SleepImmediate(): Promise<void> {\n return new Promise((resolve, reject) => {\n resolve();\n });\n }\n\n /**\n * Post an unsolicited runner-related message back to the manager by runner id.\n *\n * Typical commands:\n * - `InstrumentTelemetry`\n * - `RunnerStateChange`\n *\n * Behaviour:\n * - resolves the live runner DTO from worker-side storage\n * - builds the outbound message\n * - posts it on the manager communication port\n *\n * @param command Unsolicited command to emit.\n * @param runnerId Target runner id.\n * @param response Unused legacy flag retained for compatibility.\n */\n #PostMessageToWorkerManagerByRunnerId = async (\n command: eIWMessageCommands,\n runnerId: string,\n response: boolean\n ): Promise<void> => {\n try {\n if (this.#collectorCollectorPort) {\n if (this.#runners[runnerId]) {\n const message: IIWMessagePayload = {\n command,\n payload: {\n runner: this.#runners[runnerId].runner\n } as ITestRunnerTelemetryPayload\n };\n this.#collectorCollectorPort.postMessage(message);\n await Sleep(0);\n } else {\n this.#warn(`#PostMessageToWorkerManagerByRunnerId(): Runner: [${runnerId}] not found`);\n }\n }\n } catch (error) {\n this.#error(`#PostMessageToWorkerManagerByRunnerId(): [${error}]`);\n }\n };\n\n /**\n * Post the full current runner list back to the manager.\n *\n * Used to respond to `GetRunners`.\n *\n * Behaviour:\n * - returns all live runner DTOs currently hosted inside this worker runtime\n * - preserves the original request `messageId`\n *\n * @param command Currently ignored; response command is always `GetRunnersResponse`.\n * @param messagePayload Original inbound request.\n */\n #PostRunnersToWorkerManager = async (command: eIWMessageCommands, messagePayload: IIWMessagePayload): Promise<void> => {\n try {\n if (this.#collectorCollectorPort) {\n const message: IIWMessagePayload = {\n command: eIWMessageCommands.GetRunnersResponse,\n payload: {\n messageId: messagePayload.payload.messageId,\n workerId: this.#workerId,\n runners: Object.values(this.#runners).map((runnerEx) => runnerEx.runner)\n } as ISTSGetRunnersPayload,\n };\n this.#collectorCollectorPort.postMessage(message);\n await Sleep(0);\n }\n } catch (error) {\n this.#error(`#PostRunnersToWorkerManager(): [${error}]`);\n }\n };\n\n /**\n * Start a runner and, if valid, launch its execution loop.\n *\n * Valid starting state:\n * - `created`\n *\n * Behaviour:\n * - calls concrete runner `StartRunner()`\n * - transitions state to `running`\n * - launches an async execution loop controlled by the runner's execution profile\n *\n * Execution loop behaviour\n * ------------------------\n * - continues until:\n * - configured iteration count is reached, or\n * - configured duration expires\n * - executes one iteration at a time via concrete runner `ExecuteRunner()`\n * - increments runner iteration count after successful execution if the runner\n * is still active\n * - respects `delayBetweenIterations`\n * - if `pauseOnComplete` is true:\n * - pauses the runner instead of completing it\n * - keeps loop alive waiting in paused state\n * - otherwise:\n * - calls concrete runner `Completed()`\n * - transitions runner to `completed`\n *\n * Race-condition note\n * -------------------\n * During awaited calls inside the execute loop, the runner may be:\n * - stopped\n * - terminated\n * - archived/removed\n *\n * Therefore the loop re-checks:\n * - can execute next iteration\n * - is completed\n *\n * @param testRunnerTelemetryPayload Start request payload.\n */\n #StartRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<any> => {\n let result;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.created) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.StartRunner();\n this.#UpdateRunnerStateByRunnerId('#StartRunner-1', runnerId, IRunnerState.running);\n await Sleep(0);\n const startLoop = new Date();\n\n const ExecuteLoop = async () => {\n try {\n let cont: boolean = true;\n const executionProfile = this.#GetRunnerExecutionProfileByRunnerId(runnerId);\n if (executionProfile) {\n const { iterations, duration, delayBetweenIterations, pauseOnComplete } = executionProfile;\n\n if (iterations > 0) {\n cont = this.#GetRunnerIterationByRunnerId(runnerId) < iterations;\n if (\n cont === false &&\n pauseOnComplete === true &&\n this.#runners[runnerId].runner.state === IRunnerState.paused\n ) {\n cont = true;\n }\n } else if (duration > 0) {\n cont = ((new Date().getTime() - startLoop.getTime()) / 1000) < duration;\n }\n\n if (cont) {\n if (this.#CanExecuteNextIterationByRunnerId(runnerId)) {\n await this.#GetRunnerInstanceByRunnerId(runnerId)?.ExecuteRunner();\n\n if (!this.#IsCompletedByRunnerId(runnerId)) {\n this.#IncRunnerIterationByRunnerId(runnerId);\n }\n }\n\n if (this.#CanExecuteNextIterationByRunnerId(runnerId)) {\n if (delayBetweenIterations > 0) {\n await Sleep(delayBetweenIterations);\n } else {\n await this.#SleepImmediate();\n }\n ExecuteLoop();\n } else {\n if (!this.#IsCompletedByRunnerId(runnerId)) {\n await Sleep(50);\n ExecuteLoop();\n }\n }\n } else {\n if (pauseOnComplete === true) {\n await this.#GetRunnerInstanceByRunnerId(runnerId)?.PauseRunner();\n this.#UpdateRunnerStateByRunnerId('#StartRunner-2', runnerId, IRunnerState.paused);\n ExecuteLoop();\n } else {\n await this.#GetRunnerInstanceByRunnerId(runnerId)?.Completed();\n this.#UpdateRunnerStateByRunnerId('#StartRunner-3', runnerId, IRunnerState.completed);\n }\n }\n } else {\n this.#warn(`#StartRunner:ExecuteLoop(): Cannot get execution profile for runner: [${runnerId}]`);\n }\n } catch (error) {\n this.#error(`#StartRunner:ExecuteLoop(): Error: [${error}]`);\n }\n };\n\n ExecuteLoop();\n }\n } else {\n this.#warn(`#StartRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#StartRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.StartRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Stop a runner by id.\n *\n * Valid states:\n * - paused\n * - running\n *\n * Behaviour:\n * - calls concrete runner `StopRunner()`\n * - transitions state to `stopped`\n *\n * @param runnerId Target runner id.\n * @returns Result returned by the concrete runner, if any.\n */\n #StopRunnerByRunnerId = async (runnerId: string): Promise<any> => {\n let retVal;\n try {\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.running) {\n retVal = await this.#GetRunnerInstanceByRunnerId(runnerId)?.StopRunner();\n this.#UpdateRunnerStateByRunnerId('#StopRunnerByRunnerId', runnerId, IRunnerState.stopped);\n }\n } else {\n this.#warn(`#StopRunnerByRunnerId(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#StopRunnerByRunnerId(): Error: [${error}]`);\n }\n return retVal;\n };\n\n /**\n * Stop a runner in response to a manager command and send the solicited response.\n *\n * @param testRunnerTelemetryPayload Stop request payload.\n */\n #StopRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n result = await this.#StopRunnerByRunnerId(testRunnerTelemetryPayload.runner.id);\n } catch (error) {\n this.#error(`#StopRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.StopRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Terminate a runner in response to a manager command.\n *\n * Valid states:\n * - created\n * - paused\n * - running\n *\n * Behaviour:\n * - calls concrete runner `TerminateRunner()`\n * - transitions state to `terminated`\n *\n * @param testRunnerTelemetryPayload Terminate request payload.\n */\n #TerminateRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.created ||\n state === IRunnerState.paused ||\n state === IRunnerState.running) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.TerminateRunner();\n this.#UpdateRunnerStateByRunnerId('#TerminateRunner', runnerId, IRunnerState.terminated);\n }\n } else {\n this.#warn(`#TerminateRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#TerminateRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.TerminateRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Send a solicited runner-command response back to the manager.\n *\n * Behaviour:\n * - preserves the original request `messageId`\n * - includes the current full runner DTO if the runner still exists locally\n * - includes the `executeRunnerActionResult` wrapper with worker/runner identity\n * plus the raw result returned by the concrete runner implementation\n *\n * Used by:\n * - AddRunner\n * - StartRunner\n * - StopRunner\n * - PauseRunner\n * - ResumeRunner\n * - ResetRunner\n * - ExecuteRunner\n * - UpdateRunner\n * - TerminateRunner\n *\n * @param command Response command type.\n * @param testRunnerTelemetryPayload Original request payload.\n * @param result Raw command result from the concrete runner implementation.\n */\n #SendRunnerCommandResponse = (command: eIWMessageCommands, testRunnerTelemetryPayload: ITestRunnerTelemetryPayload, result: any): void => {\n try {\n let runner = undefined;\n const runnerId = testRunnerTelemetryPayload.runner.id;\n\n if (this.#runners[runnerId]) {\n runner = { ...this.#runners[runnerId].runner };\n }\n\n if (this.#collectorCollectorPort) {\n const message: IIWMessagePayload = {\n command,\n payload: {\n messageId: testRunnerTelemetryPayload.messageId,\n runner,\n executeRunnerActionResult: {\n workerManagerId: testRunnerTelemetryPayload.runner.workerManagerId,\n workerId: testRunnerTelemetryPayload.runner.workerId,\n runnerId: testRunnerTelemetryPayload.runner.id,\n result\n }\n } as ITestRunnerTelemetryPayloadResponse,\n };\n this.#collectorCollectorPort.postMessage(message);\n }\n } catch (error) {\n this.#error(`#SendRunnerCommandResponse(): [${error}]`);\n }\n };\n\n /**\n * Pause a running runner.\n *\n * Valid state:\n * - running\n *\n * Behaviour:\n * - calls concrete runner `PauseRunner()`\n * - transitions state to `paused`\n *\n * @param testRunnerTelemetryPayload Pause request payload.\n */\n #PauseRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.running) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.PauseRunner();\n this.#UpdateRunnerStateByRunnerId('#PauseRunner', runnerId, IRunnerState.paused);\n }\n } else {\n this.#warn(`#PauseRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#PauseRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.PauseRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Resume a paused runner.\n *\n * Valid state:\n * - paused\n *\n * Behaviour:\n * - calls concrete runner `ResumeRunner()`\n * - transitions state to `running`\n *\n * @param testRunnerTelemetryPayload Resume request payload.\n */\n #ResumeRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused) {\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.ResumeRunner();\n this.#UpdateRunnerStateByRunnerId('#ResumeRunner', runnerId, IRunnerState.running);\n }\n } else {\n this.#warn(`#ResumeRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#ResumeRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.ResumeRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Reset a runner.\n *\n * Valid states:\n * - paused\n * - running\n *\n * Behaviour:\n * - first transitions to `paused` so current state/telemetry can be captured\n * - resets iteration count to zero\n * - calls concrete runner `ResetRunner()`\n *\n * Note:\n * - this method intentionally does not transition to another state after reset\n *\n * @param testRunnerTelemetryPayload Reset request payload.\n */\n #ResetRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload): Promise<void> => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.running) {\n this.#UpdateRunnerStateByRunnerId('#ResetRunner', runnerId, IRunnerState.paused);\n this.#ResetRunnerIterationByRunnerId(runnerId);\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.ResetRunner();\n }\n } else {\n this.#warn(`#ResetRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#ResetRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.ResetRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Execute exactly one iteration of a runner's work.\n *\n * Valid states:\n * - paused\n * - created\n *\n * Behaviour:\n * - calls concrete runner `ExecuteRunner()`\n * - increments iteration count\n * - transitions state to `paused`\n *\n * Intended use:\n * - single-step execution\n * - test/debug/manual execution flows\n *\n * @param testRunnerTelemetryPayload Execute request payload.\n */\n #ExecuteRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.created) {\n const currentIteration = this.#GetRunnerIterationByRunnerId(runnerId);\n this.#debug(`${chalk.magenta(`runner: [${runnerId}]`)} ExecuteRunner(${currentIteration})`);\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.ExecuteRunner();\n const newIteration = this.#IncRunnerIterationByRunnerId(runnerId);\n this.#debug(`${chalk.magenta(` --> runner: [${runnerId}]`)} Next iteration number: [${newIteration}] for next Execute or Resume.`);\n this.#UpdateRunnerStateByRunnerId('#ExecuteRunner', runnerId, IRunnerState.paused);\n }\n } else {\n this.#warn(`#ExecuteRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#ExecuteRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.ExecuteRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Update runner options.\n *\n * Valid states:\n * - paused\n * - created\n * - running\n *\n * Behaviour:\n * - replaces the locally stored runner options\n * - forwards the updated options to the concrete runner implementation\n * - does not change the runner state\n *\n * This allows live option updates while a runner is active.\n *\n * @param testRunnerTelemetryPayload Update request payload containing new runner options.\n */\n #UpdateRunner = async (testRunnerTelemetryPayload: ITestRunnerTelemetryPayload) => {\n let result: any;\n try {\n const runnerId = testRunnerTelemetryPayload.runner.id;\n if (this.#runners[runnerId]) {\n const { state } = this.#runners[runnerId].runner;\n if (state === IRunnerState.paused ||\n state === IRunnerState.created ||\n state === IRunnerState.running) {\n this.#debug(chalk.cyan(`before: [${JSON.stringify(this.#GetRunnerOptionsByRunnerId(runnerId))}]`));\n this.#SetRunnerOptionsByRunnerId(runnerId, testRunnerTelemetryPayload.runner.options);\n this.#debug(chalk.cyan(`after: [${JSON.stringify(this.#GetRunnerOptionsByRunnerId(runnerId))}]`));\n result = await this.#GetRunnerInstanceByRunnerId(runnerId)?.UpdateRunner(testRunnerTelemetryPayload.runner.options);\n }\n } else {\n this.#warn(`#UpdateRunner(): Runner: [${runnerId}] not found`);\n }\n } catch (error) {\n this.#error(`#UpdateRunner(): Error: [${error}]`);\n }\n\n this.#SendRunnerCommandResponse(eIWMessageCommands.UpdateRunnerResponse, testRunnerTelemetryPayload, result);\n };\n\n /**\n * Main inbound message dispatcher for this worker runtime.\n *\n * This method is intended to be wired to the actual worker's message handler.\n *\n * Supported commands:\n * - `MessagePort`\n * - `AddRunner`\n * - `StartRunner`\n * - `StopRunner`\n * - `TerminateRunner`\n * - `PauseRunner`\n * - `ResumeRunner`\n * - `ResetRunner`\n * - `ExecuteRunner`\n * - `UpdateRunner`\n * - `GetRunners`\n *\n * Behaviour:\n * - interprets the inbound message\n * - dispatches to the appropriate internal handler\n * - bootstrap-initialises the worker on `MessagePort`\n * - logs and ignores unknown commands\n *\n * @param data Raw inbound message payload.\n */\n ProcessMessage = async (data: any) => {\n this.#silly(`ProcessMessage: data: [${JSON.stringify(data)}]`);\n try {\n const payloadMessage: IIWMessagePayload = data as IIWMessagePayload;\n switch (payloadMessage.command) {\n case eIWMessageCommands.MessagePort:\n this.#silly(`ProcessMessage::MessagePort`);\n this.#SetMessagePort(payloadMessage.payload as ISTSAgentWorkerMessagePort);\n this.#options = (payloadMessage.payload as ISTSAgentWorkerMessagePort).options;\n this.#workerId = (payloadMessage.payload as ISTSAgentWorkerMessagePort).workerId;\n this.#debug(`ProcessMessage::#workerId: [${this.#workerId}]`);\n this.#debug(`ProcessMessage::#options: [${JSON.stringify(this.#options)}]`);\n break;\n\n case eIWMessageCommands.AddRunner:\n this.#silly(`ProcessMessage::AddRunner`);\n this.#AddRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.StartRunner:\n this.#silly(`ProcessMessage::StartRunner`);\n this.#StartRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.StopRunner:\n this.#silly(`ProcessMessage::StopRunner`);\n this.#StopRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.TerminateRunner:\n this.#silly(`ProcessMessage::TerminateRunner`);\n this.#TerminateRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.PauseRunner:\n this.#silly(`ProcessMessage::PauseRunner`);\n this.#PauseRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.ResumeRunner:\n this.#silly(`ProcessMessage::ResumeRunner`);\n this.#ResumeRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.ResetRunner:\n this.#silly(`ProcessMessage::ResetRunner`);\n this.#ResetRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.ExecuteRunner:\n this.#silly(`ProcessMessage::ExecuteRunner`);\n this.#ExecuteRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.UpdateRunner:\n this.#silly(`ProcessMessage::UpdateRunner`);\n this.#UpdateRunner(payloadMessage.payload as ITestRunnerTelemetryPayload);\n break;\n\n case eIWMessageCommands.GetRunners:\n this.#silly(`ProcessMessage::GetRunners`);\n this.#PostRunnersToWorkerManager(eIWMessageCommands.GetRunners, payloadMessage);\n break;\n\n default:\n this.#warn(`ProcessMessage::default: Invalid payloadMessage.command: [${payloadMessage.command}] - Ignoring`);\n }\n } catch (error: any) {\n this.#error(`ProcessMessage(): Error: [${error}]`);\n this.#error(error);\n }\n };\n}","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n","/**\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeMax = Math.max,\n nativeNow = Date.now;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = merge;\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * STSMessageBroker\n * ----------------\n * Central message broker for worker <-> manager communications.\n *\n * Responsibilities:\n * - Create and manage callback-correlated request/response message flows\n * - Route inbound port messages as either:\n * - solicited responses (request/response messages with `messageId`)\n * - unsolicited push/event messages (telemetry, state changes, etc.)\n * - Initialise message ports between the manager and the worker\n * - Provide helper methods for sending worker-level and runner-level commands\n * - Manage response timeouts for outstanding requests\n *\n * High-level design:\n * - Every solicited request gets a generated `messageId`\n * - The broker stores a pending promise resolver keyed by `messageId`\n * - When a matching inbound response arrives, the broker resolves that promise\n * - If no response arrives before the configured timeout, the request is rejected\n *\n * Notes:\n * - This broker supports both Node and browser worker environments\n * - Environment-specific message port listener wiring is handled internally\n * - The broker itself does not interpret business meaning of unsolicited messages;\n * those are delegated to a caller-supplied callback\n */\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\nimport {\n IIWMessagePayload,\n IIWMessagePayloadContentBase,\n IIWMessageCommand,\n eIWMessageCommands,\n IWorkerEx,\n IRunnerEx,\n ITestRunnerTelemetryPayload,\n IRunnerOptions,\n IWorkerOptions,\n IExecuteRunnerActionResult\n} from './commonTypes';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport isNode from 'detect-node';\nimport { v4 as uuidv4 } from 'uuid';\nimport merge from 'lodash.merge';\n\n/**\n * Configuration options for {@link STSMessageBroker}.\n */\nexport interface ISTSMessageBrokerOptions {\n /**\n * Logger implementation used by the broker for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Timeout in milliseconds for any solicited request waiting for a response.\n *\n * If a response with the matching `messageId` is not received before this period\n * elapses, the pending promise will be rejected and the callback entry removed.\n */\n messageTimeout: number;\n}\n\n/**\n * Internal pending message tracking record stored per `messageId`.\n *\n * This is not exported because it is only an internal implementation detail.\n */\ninterface IMessageRecord {\n /**\n * Timeout handle used to reject the request if no response arrives in time.\n */\n timeout: ReturnType<typeof setTimeout>;\n\n /**\n * Resolver used when the matching response is received.\n */\n resolveMessage: (payload: IIWMessagePayloadContentBase) => void;\n}\n\n/**\n * IMessageRecordMap\n * -----------------\n * Type alias representing the in-memory map used by the message broker\n * to track outstanding callback-correlated requests.\n *\n * Structure:\n * - The key is a unique `messageId` generated when a request is sent to a worker.\n * - The value is the associated {@link IMessageRecord} containing:\n * - the timeout handle for automatic request expiry\n * - the resolver callback used to complete the pending Promise when the\n * matching response arrives.\n *\n * Purpose:\n * This structure allows the {@link STSMessageBroker} to implement a\n * request/response messaging pattern on top of asynchronous worker message\n * channels.\n *\n * Lifecycle of an entry:\n *\n * 1. A command is sent to a worker.\n * 2. A new `messageId` is generated.\n * 3. A corresponding {@link IMessageRecord} is stored in this map.\n * 4. The message is transmitted to the worker including the `messageId`.\n * 5. When the worker responds:\n * - the broker extracts the `messageId`\n * - finds the entry in this map\n * - clears the timeout\n * - resolves the stored promise\n * - removes the entry from the map.\n *\n * Timeout behaviour:\n * If the response is not received before the configured broker timeout,\n * the stored timeout handler will:\n * - remove the entry from the map\n * - reject the original Promise to signal failure to the caller.\n *\n * Typical usage inside the message broker:\n *\n * ```ts\n * private messages: IMessageRecordMap = {};\n * ```\n *\n * Example internal structure at runtime:\n *\n * ```ts\n * {\n * \"9d5c4b42-12c7-4a7c-b1f2-2b0b3c4e5f67\": {\n * timeout: Timeout,\n * resolveMessage: (payload) => { ... }\n * }\n * }\n * ```\n *\n * Notes:\n * - Keys must always be UUID-style message identifiers.\n * - Entries must always be deleted after resolution or timeout to prevent\n * memory leaks.\n */\nexport type IMessageRecordMap = Record<string, IMessageRecord>;\n\n/**\n * Message broker used to coordinate request/response and push-style messaging\n * between the manager/runtime and worker instances.\n */\nexport class STSMessageBroker {\n /**\n * Outstanding solicited request map keyed by generated `messageId`.\n *\n * Each entry contains:\n * - the timeout handle for automatic cleanup/rejection\n * - the resolver that should be called when a matching response arrives\n */\n private messages: IMessageRecordMap = {};\n\n /**\n * Broker configuration.\n */\n private options: ISTSMessageBrokerOptions;\n\n /**\n * Construct a new message broker.\n *\n * @param options Logger and timeout configuration.\n */\n constructor(options: ISTSMessageBrokerOptions) {\n this.options = options;\n }\n\n /**\n * Process a single inbound payload received on a worker message port.\n *\n * Behaviour:\n * - If the inbound payload contains `payload.messageId`, it is treated as a\n * solicited response to an earlier request and is routed to the callback\n * correlation mechanism.\n * - Otherwise it is treated as an unsolicited push/event message and passed\n * to the caller-supplied callback.\n *\n * Typical unsolicited messages include:\n * - telemetry updates\n * - runner state change notifications\n * - other push-style runtime events\n *\n * Typical solicited messages include:\n * - responses to runner commands\n * - responses to worker queries such as `GetRunners`\n *\n * @param inboundPayload Inbound message payload read from the message port.\n * @param cb Callback used to handle unsolicited messages.\n */\n private _processInboundMessage = (\n inboundPayload: IIWMessagePayload,\n cb: (payload: IIWMessagePayload) => void\n ): void => {\n if (inboundPayload.payload && inboundPayload.payload.messageId) {\n // Process the response if message was solicited (request/response).\n this._ProcessRunnerResponse(inboundPayload.payload as IIWMessagePayloadContentBase);\n } else {\n // Process as an unsolicited push/event message.\n cb(inboundPayload);\n }\n };\n\n /**\n * Attach a listener to a worker's message port and route all inbound messages\n * through the broker.\n *\n * Environment handling:\n * - In Node, uses `messagePort.on('message', ...)`\n * - In the browser, uses `messagePort.addEventListener('message', ...)`\n *\n * Notes:\n * - In browser environments, `addEventListener` is used because `onmessage`\n * only allows a single handler.\n * - Browser MessagePorts may need to be manually started elsewhere when using\n * `addEventListener`.\n *\n * @param stsWorkerEx Worker that owns the message port to listen on.\n * @param cb Callback used to handle unsolicited inbound messages.\n */\n SetupMessagePortListener = (\n stsWorkerEx: IWorkerEx,\n cb: (payload: IIWMessagePayload) => void\n ) => {\n if (isNode) {\n (stsWorkerEx.messagePort as any).on('message', (data: any) => {\n this._processInboundMessage(data as IIWMessagePayload, cb);\n });\n } else {\n // In browser, onmessage only allows a single event handler.\n // addEventListener allows multiple handlers and avoids replacing any existing one.\n // Because addEventListener is used, ports usually need to be started manually.\n (stsWorkerEx.messagePort as any).addEventListener('message', (data: MessageEvent) => {\n this._processInboundMessage(data.data as IIWMessagePayload, cb);\n });\n }\n };\n\n /**\n * Resolve a pending solicited request using the `messageId` found in the response payload.\n *\n * Behaviour:\n * - Looks up the pending message entry by `messageId`\n * - Clears the timeout associated with the request\n * - Removes the pending entry from the map\n * - Resolves the original promise with the received payload\n *\n * Error handling:\n * - If the `messageId` is not found in the pending map, logs an error\n * - Any unexpected runtime errors are caught and logged\n *\n * @param payload Response payload containing the original `messageId`.\n */\n private _ProcessRunnerResponse(payload: IIWMessagePayloadContentBase) {\n try {\n const messageId = payload.messageId as string;\n if (this.messages[messageId]) {\n const messageRecord = this.messages[messageId];\n clearTimeout(messageRecord.timeout);\n\n // Remove the pending request entry before resolving.\n delete this.messages[messageId];\n\n // Resolve the original request promise with the returned payload.\n messageRecord.resolveMessage(payload);\n } else {\n this.options.logger.error(\n `_ProcessRunnerResponse(): Payload does not include messageId: Error: [${JSON.stringify(payload)}]`\n );\n }\n } catch (error) {\n this.options.logger.error(`_ProcessRunnerResponse(): Error: [${error}]`);\n }\n }\n\n /**\n * Create and register a new pending callback-correlated request.\n *\n * Behaviour:\n * - Generates a new UUID message id\n * - Stores a timeout that will reject the request if the response is not received in time\n * - Stores a resolver that will be invoked when the response arrives\n *\n * This is the core mechanism that turns low-level message port communication\n * into a Promise-based request/response API.\n *\n * @param resolve Promise resolver for the caller's request.\n * @param reject Promise rejecter for the caller's request.\n * @param command Command being sent, used only for diagnostics in timeout messages.\n * @returns The generated message id to embed in the outbound payload.\n */\n private _SetupCallbackMessage = (resolve: any, reject: any, command: IIWMessageCommand) => {\n const messageId = uuidv4();\n this.messages[messageId] = {\n timeout: setTimeout(() => {\n delete this.messages[messageId];\n reject(\n `STSWorkerManager:_SetupCallbackMessage(): message response timeout for message id: [${messageId}], command: [${command}]`\n );\n }, this.options.messageTimeout),\n resolveMessage: (payload: IIWMessagePayloadContentBase) => {\n resolve(payload);\n }\n };\n return messageId;\n };\n\n /**\n * Send a worker-scoped command that expects a callback-correlated response.\n *\n * Typical examples:\n * - `GetRunners`\n * - other worker-level queries or commands that do not target a specific runner\n *\n * Behaviour:\n * - Creates a callback-correlated pending request\n * - Generates a minimal payload containing only `messageId`\n * - Sends the command over the worker's dedicated message port\n * - Resolves once a matching response arrives\n *\n * @param workerEx Target worker whose message port should be used.\n * @param command Worker-level command to send.\n * @returns Promise resolving with the response payload returned by the worker.\n */\n public SendMessageToWorkerForWorkerWithCallBack = async (\n workerEx: IWorkerEx,\n command: IIWMessageCommand\n ): Promise<IIWMessagePayloadContentBase> => {\n return new Promise((resolve, reject) => {\n try {\n const messageId = this._SetupCallbackMessage(resolve, reject, command);\n const payload: IIWMessagePayloadContentBase = {\n messageId: messageId\n };\n workerEx.messagePort.postMessage({ command, payload });\n } catch (error) {\n this.options.logger.error(`_PostMessageToWorkerGetRunners(): Error: [${error}]`);\n }\n });\n };\n\n /**\n * Send a runner-scoped command that expects a callback-correlated response.\n *\n * Behaviour:\n * - Optionally merges the supplied partial runner options into the live runner options\n * - Creates a callback-correlated pending request\n * - Builds a runner payload using `runnerEx.toRunner(false)` to avoid sending history\n * - Sends the command over the worker's dedicated message port\n * - Resolves with the action result returned by the worker\n *\n * Notes:\n * - `merge(...)` is used so update commands can modify the live in-memory runner\n * options before sending the command.\n * - `toRunner(false)` intentionally excludes runner history to keep the message light.\n *\n * @param workerEx Target worker whose message port should be used.\n * @param runnerEx Target runner for the command.\n * @param command Runner command to send.\n * @param runnerOptions Optional partial runner option updates, typically used for `UpdateRunner`.\n * @returns Promise resolving with the worker's per-runner action result.\n */\n public SendMessageToWorkerForRunnerWithCallBack = async (\n workerEx: IWorkerEx,\n runnerEx: IRunnerEx,\n command: eIWMessageCommands,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> => {\n return new Promise((resolve, reject) => {\n try {\n if (runnerOptions) {\n merge(runnerEx.options, runnerOptions);\n }\n\n const messageId = this._SetupCallbackMessage(resolve, reject, command);\n const payload: ITestRunnerTelemetryPayload = {\n messageId: messageId,\n runner: runnerEx.toRunner(false)\n };\n workerEx.messagePort.postMessage({ command, payload });\n } catch (error) {\n this.options.logger.error(`_SetRunnerIntoWorker(): Error: [${error}]`);\n throw error;\n }\n });\n };\n\n /**\n * Send a command to the underlying worker using the worker's default communication channel\n * rather than the dedicated message port channel.\n *\n * This is primarily used during worker bootstrap, for example when transferring the\n * dedicated message port into the worker.\n *\n * Behaviour:\n * - If a transfer object is supplied, posts the message with transfer semantics\n * - Otherwise posts the message normally\n *\n * Typical use case:\n * - sending the `MessagePort` bootstrap command with the second port transferred\n * into the worker thread/worker instance\n *\n * @param workerEx Target worker.\n * @param command Command to send.\n * @param payload Optional payload to send.\n * @param transferObject Optional transferable object, typically a MessagePort.\n */\n private _PostMessageToWorkerUsingDefaultChannel = (\n workerEx: IWorkerEx,\n command: IIWMessageCommand,\n payload: IIWMessagePayloadContentBase | null,\n transferObject?: any\n ) => {\n try {\n if (transferObject) {\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): #PostMessageToWorker with transfer object`\n );\n workerEx.worker.postMessage({ command, payload }, [transferObject]);\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): #PostMessageToWorker with transfer object - done...`\n );\n } else {\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): #PostMessageToWorker`\n );\n workerEx.worker.postMessage({ command, payload });\n }\n } catch (error) {\n this.options.logger.debug(\n `_PostMessageToWorkerUsingDefaultChannel(): Error: [${error}]`\n );\n throw error;\n }\n };\n\n /**\n * Initialise the worker's dedicated message port.\n *\n * Behaviour:\n * - If the worker is mocked, injects the port using the mock worker API (`SetPort`)\n * - Otherwise sends the `MessagePort` bootstrap command to the real underlying worker\n * and transfers the supplied port into it\n *\n * Payload contents include:\n * - a bootstrap `messageId`\n * - the transferred port\n * - a copy of the worker options\n * - the worker id\n *\n * Notes:\n * - This is part of worker startup/bootstrap, not normal runtime runner command flow\n * - The port passed here is typically the second end of a newly created `MessageChannel`\n *\n * @param stsWorkerEx Worker being initialised.\n * @param port Port to inject/transfer into the worker.\n */\n public SetupMessagePort = (stsWorkerEx: IWorkerEx, port: any) => {\n if (stsWorkerEx.options.mocked) {\n (stsWorkerEx.worker as any).SetPort({\n command: eIWMessageCommands.MessagePort,\n payload: {\n messageId: uuidv4(),\n port: port,\n options: {\n ...stsWorkerEx.options\n } as IWorkerOptions,\n workerId: stsWorkerEx.id\n } as IIWMessagePayloadContentBase\n });\n } else {\n this._PostMessageToWorkerUsingDefaultChannel(\n stsWorkerEx,\n eIWMessageCommands.MessagePort,\n {\n messageId: uuidv4(),\n port: port,\n options: {\n ...stsWorkerEx.options\n } as IWorkerOptions,\n workerId: stsWorkerEx.id\n } as IIWMessagePayloadContentBase,\n port\n );\n }\n };\n\n /**\n * Create a new `MessageChannel` and return both ports.\n *\n * Behaviour:\n * - Creates `port1` and `port2`\n * - In browser environments, manually starts `port1`\n *\n * Typical usage:\n * - `port1` remains with the manager/runtime side\n * - `port2` is transferred into the worker during bootstrap\n *\n * Notes:\n * - In browser mode, ports are often manually started when using `addEventListener`\n * - In Node, the message port wiring model differs and no explicit `start()` call is needed\n *\n * @returns Newly created message channel ports.\n */\n public GetPorts = (): { port1: any; port2: any } => {\n const {\n port1, // manager/runtime-side message port\n port2 // worker-side message port\n } = new MessageChannel();\n\n if (!isNode) {\n // In browser mode, when addEventListener is used, ports generally need to be\n // started manually. The transferred port will also typically need to be started\n // inside the worker runtime.\n port1.start();\n }\n\n return { port1, port2 };\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * RunnerInstance\n * --------------\n * Concrete runtime implementation of {@link IRunnerEx}.\n *\n * A RunnerInstance represents a single executable runner hosted inside a worker.\n *\n * Responsibilities:\n * - Store runner runtime state and metadata\n * - Dispatch runner commands to the owning worker via the message broker\n * - Maintain runner telemetry/instrumentation state\n * - Register runner-level event subscriptions against the owning worker\n * - Expose full and reduced serialisable runner models\n *\n * Design notes:\n * - A RunnerInstance belongs to exactly one {@link IWorkerEx}.\n * - Command execution is brokered through {@link STSMessageBroker}; the runner does\n * not communicate with the worker directly.\n * - Event subscriptions are stored on the owning worker, keyed by runner id.\n */\n\nimport {\n eIWMessageCommands,\n IAsyncRunnerContext,\n IExecuteRunnerActionResult,\n IIWMessageCommand,\n IRunner,\n IRunnerCore,\n IRunnerEvent,\n IRunnerEx,\n IRunnerOptions,\n IRunnerState,\n IRunnerTelemetry,\n IWorkerEx,\n IRunnerHistoryRecord\n} from './commonTypes';\n\nimport { defaultLogger } from '@nsshunt/stsutils';\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\nimport { STSMessageBroker } from './messageBroker';\n\n/**\n * Constructor options required to create a {@link RunnerInstance}.\n *\n * Notes:\n * - `workerEx` is the owning live worker instance that hosts this runner.\n * - `workerManagerId` identifies the top-level owning worker manager.\n * - `runnerId` is generated elsewhere and supplied to this instance.\n * - `asyncRunnerContext` contains the logical identity and hierarchy of this runner.\n * - `runnerOptions` contains runtime configuration for the runner.\n * - `messageBroker` is used to dispatch commands and correlate responses.\n * - `publishInstrumentController` is optional and is used when telemetry publishing\n * to an external instrumentation system is enabled.\n */\nexport interface IRunnerInstanceOptions {\n /** Owning live worker instance. */\n workerEx: IWorkerEx;\n\n /** Id of the top-level owning worker manager. */\n workerManagerId: string;\n\n /** Unique id for this runner instance. */\n runnerId: string;\n\n /** Hierarchical runtime context used to identify this runner. */\n asyncRunnerContext: IAsyncRunnerContext;\n\n /** Runner-specific runtime configuration. */\n runnerOptions: IRunnerOptions;\n\n /** Broker used for runner command dispatch and callback correlation. */\n messageBroker: STSMessageBroker;\n\n /** Optional external instrumentation publisher for this runner. */\n publishInstrumentController?: PublishInstrumentController;\n}\n\n/**\n * Concrete live runner runtime instance.\n *\n * This class owns:\n * - the current runtime state of the runner\n * - its current iteration counter\n * - its telemetry/instrumentation data\n * - its configuration/options\n * - its archived flag and runner history\n *\n * This class delegates command execution to the owning worker via\n * the injected message broker.\n */\nexport class RunnerInstance implements IRunnerEx {\n /** Unique id for this runner instance. */\n public id: string;\n\n /** Id of the owning worker instance. */\n public workerId: string;\n\n /** Id of the owning worker manager instance. */\n public workerManagerId: string;\n\n /**\n * Current lifecycle state of the runner.\n *\n * Defaults to `IRunnerState.created` when the runner instance is first created.\n */\n public state: IRunnerState = IRunnerState.created;\n\n /**\n * Current iteration number for the runner.\n *\n * The meaning of this depends on runner behaviour; typically it tracks\n * how many execute cycles/iterations have been completed.\n */\n public iteration = 0;\n\n /**\n * Optional instrumentation publisher used for telemetry integration.\n *\n * This is only populated when external instrumentation publishing is enabled.\n */\n public publishInstrumentController?: PublishInstrumentController;\n\n /**\n * Hierarchical runtime identity/context for the runner.\n *\n * Typically includes host, agent, worker, and runner identifiers.\n */\n public asyncRunnerContext: IAsyncRunnerContext;\n\n /** Runtime configuration/options for this runner. */\n public options: IRunnerOptions;\n\n /**\n * Historical runner snapshots/events for this runner.\n *\n * This is intentionally initialised as an empty array and populated elsewhere\n * by lifecycle/state management components.\n */\n public runnerHistory: IRunnerHistoryRecord[] = [ ];\n\n /**\n * Live telemetry/instrumentation values for this runner.\n *\n * These values are updated during runtime as telemetry arrives from the worker.\n */\n public instrumentData: IRunnerTelemetry;\n\n /**\n * Indicates whether this runner has been archived/retired from active in-memory use.\n *\n * This flag is typically managed externally by archive/lifecycle management logic.\n */\n public archived = false;\n\n /** Owning worker instance used for event subscription storage and broker dispatch context. */\n readonly #workerEx: IWorkerEx;\n\n /** Broker used to send runner commands to the worker and await responses. */\n readonly #messageBroker: STSMessageBroker;\n\n /**\n * Construct a new live runner runtime instance.\n *\n * Behaviour:\n * - Copies supplied identity and configuration values\n * - Derives `workerId` from the supplied owning worker\n * - Stores broker and worker references for later command dispatch\n * - Initialises telemetry counters/metrics to zeroed defaults\n *\n * @param options Construction options and collaborators.\n */\n constructor(options: IRunnerInstanceOptions) {\n this.id = options.runnerId;\n this.workerId = options.workerEx.id;\n this.workerManagerId = options.workerManagerId;\n this.asyncRunnerContext = options.asyncRunnerContext;\n this.options = options.runnerOptions;\n this.publishInstrumentController = options.publishInstrumentController;\n this.#workerEx = options.workerEx;\n this.#messageBroker = options.messageBroker;\n\n /**\n * Initialise live telemetry/instrumentation values.\n *\n * These defaults represent a newly created runner with no activity yet recorded.\n */\n this.instrumentData = {\n requestCount: 0,\n errorCount: 0,\n retryCount: 0,\n authenticationCount: 0,\n authenticationErrorCount: 0,\n authenticationRetryCount: 0,\n velocity: 0,\n coreCount: 0,\n timer: 0,\n duration: 0,\n latency: 0,\n activeRequestCount: 0,\n message: [],\n childCount: 0,\n rx: 0,\n tx: 0\n };\n }\n\n /**\n * Send a `StartRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Start(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.StartRunner);\n }\n\n /**\n * Send a `StopRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Stop(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.StopRunner);\n }\n\n /**\n * Send a `PauseRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Pause(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.PauseRunner);\n }\n\n /**\n * Send a `ResumeRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Resume(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.ResumeRunner);\n }\n\n /**\n * Send a `ResetRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Reset(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.ResetRunner);\n }\n\n /**\n * Send an `ExecuteRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Execute(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.ExecuteRunner);\n }\n\n /**\n * Send a `TerminateRunner` command for this runner via the message broker.\n *\n * @returns Action result returned by the worker.\n */\n Terminate(): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.TerminateRunner);\n }\n\n /**\n * Send an `UpdateRunner` command for this runner via the message broker.\n *\n * Behaviour:\n * - Sends the supplied partial options to the underlying worker\n * - The worker is responsible for applying/merging the update as appropriate\n *\n * @param runnerOptions Partial runner option updates to apply.\n * @returns Action result returned by the worker.\n */\n Update(runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(eIWMessageCommands.UpdateRunner, runnerOptions);\n }\n\n /**\n * Register a runner-level event subscription.\n *\n * Behaviour:\n * - Stores the subscription on the owning worker in `runnersEvents`\n * - Creates the per-runner event list lazily if it does not yet exist\n * - Returns this runner instance to support fluent chaining\n *\n * Notes:\n * - Runner event subscriptions are hosted on the worker because the worker is\n * the aggregate owner of all live runner instances.\n *\n * @param eventName Event name to subscribe to.\n * @param cb Callback invoked when the event is emitted for this runner.\n * @returns This runner instance for fluent chaining.\n */\n on(eventName: string, cb: (args?: any) => void): IRunnerEx {\n if (!this.#workerEx.runnersEvents[this.id]) {\n this.#workerEx.runnersEvents[this.id] = [];\n }\n\n this.#workerEx.runnersEvents[this.id].push({\n eventName,\n cb\n });\n\n return this;\n }\n\n /**\n * Convert this live runner runtime instance into a full serialisable runner model.\n *\n * Behaviour:\n * - Copies runner metadata and state\n * - Creates shallow copies of nested objects used by the DTO\n * - Copies telemetry messages into a new array to avoid external mutation\n * - Includes full `runnerHistory`\n *\n * @returns Full serialisable runner model.\n */\n toJSON(): IRunner {\n return {\n id: this.id,\n asyncRunnerContext: { ...this.asyncRunnerContext },\n instrumentData: {\n ...this.instrumentData,\n message: [...this.instrumentData.message]\n },\n iteration: this.iteration,\n options: { ...this.options },\n state: this.state,\n workerId: this.workerId,\n workerManagerId: this.workerManagerId,\n runnerHistory: [...this.runnerHistory]\n };\n }\n\n /**\n * Convert this runner into a serialisable runner model with optional history exclusion.\n *\n * Behaviour:\n * - When `includeHistory` is `true`, returns the full runner DTO from {@link toJSON}\n * - When `includeHistory` is `false`, removes `runnerHistory` from the returned model\n *\n * This is useful when sending a lighter-weight runner payload over message channels.\n *\n * @param includeHistory Whether to include `runnerHistory` in the returned DTO.\n * @returns Full or reduced serialisable runner model.\n */\n toRunner(includeHistory = true): IRunner {\n const runner = this.toJSON();\n if (includeHistory) {\n return runner;\n }\n\n const { runnerHistory, ...rest } = runner;\n return rest as IRunner;\n }\n\n /**\n * Convert this runner into a reduced/core representation.\n *\n * Behaviour:\n * - Includes only the minimal runtime state required for lightweight summaries\n * - Includes `runnerPlan` when present in the runner options\n *\n * Intended use cases:\n * - lightweight dashboards\n * - summary views\n * - state-only synchronisation payloads\n *\n * @returns Reduced/core runner DTO.\n * @throws Re-throws any error after logging.\n */\n toRunnerCore(): IRunnerCore {\n try {\n const retVal: IRunnerCore = {\n id: this.id,\n iteration: this.iteration,\n state: this.state\n };\n\n if (this.options?.runnerPlan) {\n retVal.runnerPlan = { ...this.options.runnerPlan };\n }\n\n return retVal;\n } catch (error) {\n defaultLogger.error(`toRunnerCore(): Error: [${error}]`);\n throw error;\n }\n }\n\n /**\n * Send a command for this runner to the owning worker via the message broker.\n *\n * This is the central low-level command-dispatch helper used by all public\n * runner command methods (`Start`, `Stop`, `Pause`, etc.).\n *\n * Behaviour:\n * - Uses the owning worker as the dispatch target/context\n * - Uses this live runner instance as the runner payload source\n * - Optionally includes partial runner options for update operations\n * - Awaits the worker/broker callback response\n *\n * @param command Broker command to send for this runner.\n * @param runnerOptions Optional partial runner option payload for update operations.\n * @returns Action result returned by the worker/message broker.\n */\n #sendRunnerCommand(\n command: IIWMessageCommand,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> {\n return this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n this.#workerEx,\n this,\n command,\n runnerOptions\n );\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * AsyncRunnerInstanceManager\n * --------------------------\n * Factory/creation manager responsible for constructing live {@link RunnerInstance}\n * objects for a given worker.\n *\n * Responsibilities:\n * - generate a unique runner id\n * - build the hierarchical {@link IAsyncRunnerContext} for the runner\n * - optionally create a child publish/instrument controller for the runner\n * - construct and return a new live {@link RunnerInstance}\n *\n * High-level role in the architecture:\n * - {@link WorkerInstance} owns runners\n * - {@link AsyncRunnerInstanceManager} creates runners\n * - {@link RunnerInstance} executes runner behaviour and communicates through the broker\n *\n * Notes:\n * - This class does not register the runner into a worker; it only creates it.\n * - Registration is handled elsewhere, typically by the worker that owns the runner.\n * - This class centralises runner identity/context construction so that every runner\n * follows the same naming and instrumentation conventions.\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport { IAsyncRunnerContext, IWorkerEx, IRunnerEx, IRunnerOptions } from './commonTypes';\n\nimport { ModelDelimeter } from '@nsshunt/stsutils';\n\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { STSMessageBroker } from './messageBroker';\n\nimport { RunnerInstance } from './runnerInstance';\n\n/**\n * Constructor options for {@link AsyncRunnerInstanceManager}.\n */\nexport interface IAsyncRunnerInstanceManagerOptions {\n /**\n * Id of the top-level worker manager that owns all workers/runners created through this factory.\n */\n workerManagerId: string;\n\n /**\n * Optional root publish/instrument controller.\n *\n * When supplied, a dedicated child publish controller is created for each new runner\n * using the runner's async context.\n */\n instrumentController?: PublishInstrumentController;\n\n /**\n * Message broker used by created runner instances to send commands to the worker.\n */\n messageBroker: STSMessageBroker;\n}\n\n/**\n * Factory/manager used to construct new live asynchronous runner instances.\n *\n * This class encapsulates:\n * - runner id creation\n * - async runner context creation\n * - optional per-runner instrumentation publisher creation\n * - `RunnerInstance` construction\n */\nexport class AsyncRunnerInstanceManager {\n /**\n * Immutable construction/configuration options for this manager.\n */\n #options: IAsyncRunnerInstanceManagerOptions;\n\n /**\n * Construct a new async runner instance manager.\n *\n * @param options Worker-manager id, optional instrumentation controller, and message broker.\n */\n constructor(options: IAsyncRunnerInstanceManagerOptions) {\n this.#options = options;\n }\n\n /**\n * Create a new live asynchronous runner instance for the supplied worker.\n *\n * Behaviour:\n * - Generates a new unique runner id\n * - Builds a hierarchical {@link IAsyncRunnerContext} for the runner\n * - Optionally creates a child publish/instrument controller scoped to that runner\n * - Constructs and returns a new {@link RunnerInstance}\n *\n * Async runner context structure:\n *\n * The generated context follows a 4-level hierarchy:\n *\n * 1. host\n * 2. agent\n * 3. worker/thread\n * 4. runner\n *\n * The generated `nid` format is:\n *\n * `[level1]@[level2]^[level3]|[level4]`\n *\n * Concretely:\n *\n * `[hostName]@[agentId]-[userAgent]^[workerId]|[runnerId]`\n *\n * Where:\n * - `hostName` identifies the host/runtime machine\n * - `agentId-userAgent` identifies the logical agent/browser/session instance\n * - `workerId` identifies the worker hosting the runner\n * - `runnerId` identifies the runner inside that worker\n *\n * Notes:\n * - This method only creates the runner instance; it does not add it to the worker's\n * internal runner map or push it into the underlying worker runtime.\n * - That registration/bootstrap step is performed elsewhere by the owning worker.\n *\n * @param workerEx The live worker instance that will own the new runner.\n * @param runnerOptions Runtime options/configuration for the new runner.\n * @returns Newly constructed live runner instance.\n */\n CreateAsyncRunner = (workerEx: IWorkerEx, runnerOptions: IRunnerOptions): IRunnerEx => {\n /**\n * Generate a unique id for the new runner.\n */\n const runnerId = uuidv4();\n\n /**\n * Construct the hierarchical async runner context used for:\n * - logical identification\n * - telemetry/instrumentation naming\n * - distributed runtime traceability\n */\n const asyncRunnerContext: IAsyncRunnerContext = {\n /**\n * Hierarchical node identifier.\n *\n * Format:\n * [level1]@[level2]^[level3]|[level4]\n *\n * Concrete layout:\n * [hostName]@[agentId]-[userAgent]^[workerId]|[runnerId]\n */\n nid: `\\\n${workerEx.options.hostName}${ModelDelimeter.COMPONENT_SEPERATOR}${workerEx.options.agentId}-${workerEx.options.userAgent}\\\n${ModelDelimeter.NID_SEPERATOR}\\\n${workerEx.id}\\\n${ModelDelimeter.SEPERATOR}\\\n${runnerId}`,\n\n /**\n * Level 1: host identity.\n *\n * Example:\n * - machine name\n * - physical host\n * - logical host/runtime name\n */\n hostName: workerEx.options.hostName,\n\n /**\n * Level 2: agent identity.\n *\n * Constructed as:\n * `${agentId}-${userAgent}`\n *\n * This typically identifies:\n * - browser session\n * - tab instance\n * - client/service instance\n */\n agentName: `${workerEx.options.agentId}-${workerEx.options.userAgent}`,\n\n /**\n * Level 3: worker/thread identity.\n *\n * This identifies the worker hosting the runner.\n */\n threadId: `${workerEx.id}`,\n\n /**\n * Level 4: runner identity.\n *\n * This identifies the specific async runner within the worker.\n */\n id: runnerId,\n };\n\n /**\n * Create the concrete live runner instance.\n *\n * If an instrumentation controller is available, create a child\n * publish controller scoped to this runner's async context.\n */\n const runnerEx = new RunnerInstance({\n workerEx,\n workerManagerId: this.#options.workerManagerId,\n runnerId,\n asyncRunnerContext,\n runnerOptions,\n messageBroker: this.#options.messageBroker,\n publishInstrumentController: this.#options.instrumentController\n ? this.#options.instrumentController.AddPublishInstrumentController(asyncRunnerContext)\n : undefined\n });\n\n return runnerEx;\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * ArchiveManager\n * --------------\n * Background lifecycle manager responsible for:\n *\n * - scanning all live workers/runners for runners that have reached an archiveable end state\n * - stopping any active telemetry/instrument publishing for those runners\n * - copying eligible runners into an in-memory archive list\n * - marking runners as archived so they are not processed repeatedly\n * - deleting archived runners from the live worker registry after a short delay\n *\n * High-level behaviour:\n * 1. Periodically scan all workers and their runners\n * 2. Identify runners in a terminal/archiveable state:\n * - completed\n * - error\n * - stopped\n * - terminated\n * 3. For each matching runner:\n * - stop instrumentation publishing if active\n * - archive the runner unless it was terminated\n * - mark the runner as archived\n * - schedule deletion from the live registry after `archiveDeleteTimeout`\n * 4. Repeat on a timed loop until `Terminate()` is called\n *\n * Notes:\n * - Terminated runners are intentionally NOT added to the archive list,\n * but they are still marked as archived and later removed from the live registry.\n * - The archive list is capped at `maxArchiveListLength`.\n * - This class owns only the archive list and loop scheduling; live worker/runner\n * ownership remains with the {@link WorkerRegistry}.\n */\n\nimport { IRunner, IRunnerState, IRunnerSearchFilters } from './commonTypes';\n\nimport { ISTSLogger, JSONObject } from '@nsshunt/stsutils';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport isNode from 'detect-node';\n\nimport { WorkerRegistry } from './workerRegistry';\n\n/**\n * Constructor options for {@link ArchiveManager}.\n */\nexport interface IArchiveManagerOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Maximum number of archived runner snapshots to keep in memory.\n *\n * When the archive exceeds this size, the oldest archived runner is removed.\n */\n maxArchiveListLength: number;\n\n /**\n * Shared live worker registry used to inspect workers/runners and delete\n * archived runners from the active runtime graph.\n */\n workerRegistry: WorkerRegistry;\n}\n\n/**\n * Archive manager for completed/stopped/failed runner instances.\n */\nexport class ArchiveManager {\n /**\n * Immutable runtime configuration for this archive manager.\n */\n private readonly options: IArchiveManagerOptions;\n\n /**\n * In-memory archive of serialised runner snapshots.\n *\n * Important:\n * - This stores serialised runner DTOs, not live `IRunnerEx` instances.\n * - The list is bounded by `maxArchiveListLength`.\n */\n private readonly archiveList: IRunner[] = [];\n\n /**\n * Delay in seconds before removing an archived runner from the live worker registry.\n *\n * Purpose:\n * - allows a short grace period after archiving\n * - avoids immediate deletion of the live runner instance\n *\n * A value of `0` would disable delayed deletion.\n */\n private readonly archiveDeleteTimeout: number = 30;\n\n /**\n * Timeout handle for the recurring archive scan loop.\n *\n * This is stored so the loop can be stopped later via {@link Terminate}.\n */\n private timeout: any;\n\n private archiveDelTimeout: any;\n\n /**\n * Construct a new archive manager.\n *\n * @param options Logger, archive size cap, and worker registry dependencies.\n */\n constructor(options: IArchiveManagerOptions) {\n this.options = options;\n }\n\n /**\n * Execute a single archive scan cycle and schedule the next cycle.\n *\n * Behaviour:\n * - scans all live workers and all live runners\n * - collects runners eligible for archiving into a temporary `removeList`\n * - processes the collected runners after a short delay\n * - schedules the next loop execution\n *\n * Archiveable runner states:\n * - `IRunnerState.completed`\n * - `IRunnerState.error`\n * - `IRunnerState.stopped`\n * - `IRunnerState.terminated`\n *\n * Additional behaviour per matching runner:\n * - If a publish instrument controller is attached, `EndPublish()` is called\n * - If the runner state is NOT `terminated`, the runner is serialised and pushed\n * into the in-memory archive list\n * - If the runner state IS `terminated`, it is skipped for archive storage\n * - In both cases, the runner is marked `archived = true`\n * - The live runner is scheduled for deletion from the worker registry after\n * `archiveDeleteTimeout`\n *\n * Loop scheduling:\n * - If one or more runners were found, processing happens after 100 ms, then the\n * next scan is scheduled 1000 ms later\n * - If none were found, the next scan is scheduled directly after 1000 ms\n *\n * Notes:\n * - The short 100 ms processing delay helps separate detection and mutation phases.\n * - In Node.js, delayed deletion timeouts are `unref()`'d so they do not keep the\n * process alive by themselves.\n *\n * @throws Re-throws unexpected errors after logging.\n */\n ProcessLoopExecutor = async () => {\n try {\n /**\n * Temporary list of live runners selected for archive/removal processing.\n *\n * Each entry contains:\n * - `workerId`\n * - `runnerId`\n */\n const removeList: JSONObject[] = [];\n\n /**\n * Scan all live workers and runners to identify archive candidates.\n */\n this.options.workerRegistry.GetWorkersEx([]).forEach(workerEx => {\n const runnersEx = workerEx.GetAllRunnersEx();\n\n runnersEx.forEach(runnerEx => {\n const runnerState = runnerEx.state;\n\n if (\n runnerEx.archived === false &&\n (\n runnerState === IRunnerState.completed ||\n runnerState === IRunnerState.error ||\n runnerState === IRunnerState.stopped ||\n runnerState === IRunnerState.terminated\n )\n ) {\n // Runner is in a terminal/archiveable state and has not yet been archived.\n removeList.push({\n workerId: workerEx.id,\n runnerId: runnerEx.id\n });\n }\n });\n });\n\n /**\n * If matching runners were found, process them after a short delay.\n * Otherwise just schedule the next scan loop.\n */\n if (removeList.length > 0) {\n const startTimeout = setTimeout(async () => {\n this.options.logger.debug(\n chalk.grey(\n `STSWorkerManager:_processLoopExecutor(): Removing runners from collection: [${JSON.stringify(removeList)}]`\n )\n );\n\n /**\n * Process each matched runner from the temporary remove list.\n */\n for (let i = 0; i < removeList.length; i++) {\n const workerEx = this.options.workerRegistry.GetWorkerEx(removeList[i].workerId);\n\n if (workerEx) {\n const runnerEx = workerEx.GetRunnerEx(removeList[i].runnerId);\n\n if (runnerEx) {\n /**\n * Stop any active telemetry/instrument publishing for this runner.\n *\n * This is done before archive/delete handling so no further\n * publishing occurs after the runner is considered retired.\n */\n if (runnerEx.publishInstrumentController) {\n this.options.logger.debug(\n chalk.grey(\n `Ending publish for runner: [${JSON.stringify(runnerEx.asyncRunnerContext)}]`\n )\n );\n\n // No wait/delay required after ending publish.\n runnerEx.publishInstrumentController.EndPublish();\n }\n\n /**\n * Only non-terminated runners are stored in the archive list.\n *\n * Terminated runners are treated as retired/removed but not archived.\n */\n if (runnerEx.state !== IRunnerState.terminated) {\n this.options.logger.debug(\n chalk.grey(\n `Archive runner: [${JSON.stringify(runnerEx.asyncRunnerContext)}]`\n )\n );\n\n const runner: IRunner = runnerEx.toRunner();\n this.archiveList.push(runner);\n\n /**\n * Enforce archive list size cap by discarding the oldest item.\n */\n if (this.archiveList.length > this.options.maxArchiveListLength) {\n this.archiveList.shift();\n }\n } else {\n this.options.logger.debug(\n chalk.grey(\n `Runner has been terminated and will not be archived, runner: [${JSON.stringify(runnerEx.asyncRunnerContext)}]`\n )\n );\n }\n\n /**\n * Mark as archived regardless of whether it was actually added\n * to the archive list. This prevents the runner from being\n * reprocessed on future scans.\n */\n runnerEx.archived = true;\n\n /**\n * Schedule deletion of the live runner instance from the worker registry.\n *\n * This removes the runner from the active runtime graph after a delay.\n */\n if (this.archiveDeleteTimeout !== 0) {\n this.archiveDelTimeout = setTimeout(() => {\n try {\n this.options.workerRegistry.DeleteRunner(workerEx.id, removeList[i].runnerId)\n } catch (error) {\n this.options.logger.error(`Error in: this.options.workerRegistry.DeleteRunner(${workerEx.id}, ${removeList[i].runnerId})`);\n }\n }, this.archiveDeleteTimeout * 1000.0);\n\n /**\n * In Node.js, unref the timer so it does not keep the process alive.\n */\n if (isNode) {\n this.archiveDelTimeout.unref();\n }\n }\n }\n }\n }\n\n /**\n * Emit a debug summary showing remaining live runner counts per worker.\n */\n for (const [, workerEx] of Object.entries(this.options.workerRegistry.GetWorkersEx([]))) {\n const message =\n `STSWorkerManager:_processLoopExecutor(): Remaining runners from worker: [${workerEx.id}]: [${workerEx.GetAllRunnersEx().length}]`;\n this.options.logger.debug(chalk.magenta(message));\n }\n\n /**\n * Schedule the next archive scan.\n */\n this.timeout = setTimeout(() => this.ProcessLoopExecutor(), 1000);\n if (isNode) {\n this.timeout.unref();\n }\n }, 100);\n if (isNode) {\n startTimeout.unref();\n }\n } else {\n /**\n * No archive candidates found; just schedule the next scan.\n */\n this.timeout = setTimeout(() => this.ProcessLoopExecutor(), 1000);\n if (isNode) {\n this.timeout.unref();\n }\n }\n } catch (error) {\n this.options.logger.error(`_processLoopExecutor(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get archived runner snapshots filtered by optional search criteria.\n *\n * Supported filters:\n * - `plan`\n * - `planInstanceId`\n * - `tag`\n * - `userDataKey`\n *\n * Filter behaviour:\n * - If a filter property is absent/blank, it is ignored\n * - All supplied filters are combined using logical AND\n *\n * Examples:\n * - by runner plan name\n * - by specific plan instance id\n * - by tag membership\n * - by existence of a userData key\n *\n * Notes:\n * - This method returns archived DTOs (`IRunner[]`), not live runner instances\n * - The archive list is in-memory only and bounded by `maxArchiveListLength`\n *\n * @param runnerSearchFilters Search/filter options to apply.\n * @returns Filtered archive list. Returns an empty array on error.\n */\n GetArchiveList = async (runnerSearchFilters: IRunnerSearchFilters): Promise<IRunner[]> => {\n this.options.logger.debug(`GetArchiveList()`);\n\n try {\n return this.archiveList\n .filter((runner) =>\n (!runnerSearchFilters.plan)\n ? true\n : runner.options.runnerPlan?.plan?.localeCompare(runnerSearchFilters.plan) === 0\n )\n .filter((runner) =>\n (!runnerSearchFilters.planInstanceId)\n ? true\n : runner.options.runnerPlan?.planInstanceId?.localeCompare(runnerSearchFilters.planInstanceId) === 0\n )\n .filter((runner) =>\n (!runnerSearchFilters.tag)\n ? true\n : runner.options.tag?.includes(runnerSearchFilters.tag)\n )\n .filter((runner) =>\n (!runnerSearchFilters.userDataKey)\n ? true\n : (!runner.options.userData)\n ? false\n : !!runner.options.userData[runnerSearchFilters.userDataKey]\n );\n } catch (error) {\n this.options.logger.error(`GetArchiveList(): Error: [${error}]`);\n return [];\n }\n };\n\n /**\n * Stop the recurring archive scan loop.\n *\n * Behaviour:\n * - Clears the currently scheduled scan timeout if present\n * - Does not clear already scheduled delayed per-runner deletion timeouts\n * - Does not modify the current archive list\n *\n * Intended use:\n * - called during overall worker-manager shutdown/termination\n */\n Terminate = () => {\n this.options.logger.debug(`ArchiveManager:Terminate()`);\n if (this.timeout) {\n this.options.logger.debug(`ArchiveManager:Terminate() - this.timeout cleared ...`);\n clearTimeout(this.timeout);\n }\n\n if (this.archiveDelTimeout) {\n this.options.logger.debug(`ArchiveManager:Terminate() - this.archiveDelTimeout cleared ...`);\n clearTimeout(this.archiveDelTimeout);\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerInstance\n * ----------------\n * Concrete runtime implementation of {@link IWorkerEx}.\n *\n * A WorkerInstance represents a single worker process/thread plus the collection\n * of runner instances hosted inside that worker.\n *\n * Responsibilities:\n * - Own the in-memory collection of runner instances for this worker\n * - Dispatch commands to individual runners via the message broker\n * - Dispatch bulk commands to all runners in this worker\n * - Create and register new runners in this worker\n * - Expose serialisable worker models (`toJSON`, `toWorker`, `toWorkerCore`)\n * - Maintain worker-level event subscriptions\n * - Coordinate worker termination and registry cleanup\n */\n\nimport {\n eIWMessageCommands,\n IExecuteRunnerActionResult,\n IRunnerEvent,\n IRunnerEx,\n IRunnerOptions,\n IRunnerState,\n IRunners,\n IWorker,\n IWorkerCore,\n IWorkerEx,\n IWorkerFactory,\n IWorkerOptions,\n IIWMessageCommand,\n IWorkerEvent\n} from './commonTypes';\n\nimport { defaultLogger } from '@nsshunt/stsutils';\nimport chalk from 'chalk';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { WorkerRegistry } from './workerRegistry';\nimport { STSMessageBroker } from './messageBroker';\nimport { AsyncRunnerInstanceManager } from './asyncRunnerInstanceManager';\n\nimport type { Worker as NodeWorker, MessagePort as NodeMessagePort } from 'node:worker_threads';\n\n/**\n * Runtime worker type supporting both browser and Node.js workers.\n */\nexport type RuntimeWorker = Worker | NodeWorker;\n\n/**\n * Runtime message port type supporting both browser and Node.js message ports.\n */\nexport type RuntimeMessagePort = MessagePort | NodeMessagePort;\n\n/**\n * Constructor options required to create a {@link WorkerInstance}.\n *\n * Notes:\n * - `workerManagerId` identifies the owning worker manager instance.\n * - `workerOptions` contains the runtime configuration for the worker itself.\n * - `messagePort` is the communication port already allocated for this worker.\n * - `workerFactory` is responsible for creating the underlying actual worker thread/process.\n * - `messageBroker` is used for request/response message dispatch to the worker.\n * - `workerRegistry` is used for central registry cleanup during termination.\n * - `asyncRunnerInstanceManager` is used to construct runner instances for this worker.\n * - `logger` is intentionally minimal and only requires debug/error methods.\n */\nexport interface IWorkerInstanceOptions {\n /** Id of the owning worker manager. */\n workerManagerId: string;\n\n /** Worker-specific runtime configuration. */\n workerOptions: IWorkerOptions;\n\n /** Message port used by this worker for brokered communications. */\n messagePort: RuntimeMessagePort;\n\n /** Factory used to construct the underlying worker implementation. */\n workerFactory: IWorkerFactory;\n\n /** Broker used to send commands and correlate responses for this worker. */\n messageBroker: STSMessageBroker;\n\n /** Shared registry containing all live worker instances. */\n workerRegistry: WorkerRegistry;\n\n /** Factory/manager used to create runner instances for this worker. */\n asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n\n /** Logger abstraction used by this class. */\n logger: {\n debug: (message: any) => void;\n error: (message: any) => void;\n };\n}\n\n/**\n * Worker-level bulk commands that can be fanned out across all runners\n * hosted by this worker.\n *\n * Important:\n * - These names intentionally match the public method names on {@link IRunnerEx},\n * allowing generic invocation in {@link WorkerInstance.#invokeCommand}.\n * - `Terminate` is intentionally excluded because worker termination requires\n * additional worker-level shutdown logic beyond simply calling all runner\n * terminate operations.\n */\ntype WorkerBulkCommand =\n | 'Start'\n | 'Stop'\n | 'Pause'\n | 'Resume'\n | 'Reset'\n | 'Execute'\n | 'Update';\n\n/**\n * Concrete worker runtime instance.\n *\n * This class owns:\n * - the underlying worker handle (`worker`)\n * - the broker message port (`messagePort`)\n * - all runner instances hosted inside this worker (`__runnersEx`)\n * - worker-level event subscriptions (`workerEvents`)\n * - runner-level event subscription collections (`runnersEvents`)\n *\n * Design notes:\n * - `__runnersEx` is intentionally private to stop callers from mutating the\n * runner collection directly.\n * - The class delegates command dispatch to the message broker rather than\n * communicating with the underlying worker directly.\n * - Most public methods are thin orchestration methods over private helpers.\n */\nexport class WorkerInstance implements IWorkerEx {\n /** Unique identifier for this worker instance. */\n public id: string;\n\n /** Id of the owning worker manager. */\n public workerManagerId: string;\n\n /**\n * Underlying actual worker runtime (browser worker or Node worker thread).\n */\n public worker: RuntimeWorker;\n\n /**\n * Registered worker-level event subscriptions.\n *\n * Typical events may include lifecycle events emitted elsewhere in the system,\n * such as `exit`, `error`, etc.\n */\n public workerEvents: IWorkerEvent[] = [];\n\n /**\n * Communication port used by the message broker for this worker.\n */\n public messagePort: RuntimeMessagePort;\n\n /** Worker runtime configuration. */\n public options: IWorkerOptions;\n\n /**\n * Per-runner event subscription collections, keyed by runner id.\n *\n * Each runner id maps to a list of subscriptions interested in events\n * for that specific runner.\n */\n public runnersEvents: Record<string, IRunnerEvent[]> = {};\n\n /**\n * Private in-memory map of runner runtime instances owned by this worker.\n *\n * Key: runner id\n * Value: live runner runtime instance\n */\n private __runnersEx: Record<string, IRunnerEx> = {};\n\n /** Message broker used for worker/runner command dispatch and callback correlation. */\n readonly #messageBroker: STSMessageBroker;\n\n /** Shared registry used for worker lookup and cleanup. */\n readonly #workerRegistry: WorkerRegistry;\n\n /** Manager responsible for constructing runner runtime instances. */\n readonly #asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n\n /** Logger used for operational diagnostics. */\n readonly #logger: {\n debug: (message: any) => void;\n error: (message: any) => void;\n };\n\n /**\n * Construct a new live worker runtime instance.\n *\n * Behaviour:\n * - Generates a new worker id\n * - Creates the underlying concrete worker using the provided factory\n * - Stores the provided message port and runtime options\n * - Stores references to collaborating services\n *\n * @param options Dependencies and configuration required to construct the worker.\n */\n constructor(options: IWorkerInstanceOptions) {\n this.id = uuidv4();\n this.workerManagerId = options.workerManagerId;\n this.worker = options.workerFactory.createWorkerThreadWorker() as RuntimeWorker;\n this.messagePort = options.messagePort;\n this.options = options.workerOptions;\n\n this.#messageBroker = options.messageBroker;\n this.#workerRegistry = options.workerRegistry;\n this.#asyncRunnerInstanceManager = options.asyncRunnerInstanceManager;\n this.#logger = options.logger;\n }\n\n /**\n * Add an already-created runner runtime instance into this worker's internal collection.\n *\n * This method only updates local in-memory state. It does not send any message\n * to the underlying worker. Use {@link AddRunner} when you want the runner to be\n * both created locally and pushed into the underlying worker process/thread.\n *\n * @param runnerEx Runner runtime instance to register under this worker.\n */\n AddRunnerEx(runnerEx: IRunnerEx): void {\n this.__runnersEx[runnerEx.id] = runnerEx;\n }\n\n /**\n * Get a single runner runtime instance by id.\n *\n * @param id Runner id to look up.\n * @returns The runner instance if found, otherwise `null`.\n */\n GetRunnerEx(id: string): IRunnerEx | null {\n return this.__runnersEx[id] ?? null;\n }\n\n /**\n * Get the raw internal runner map for this worker.\n *\n * Note:\n * This returns the live in-memory map, not a defensive copy.\n *\n * @returns Record of runner id -> runner instance.\n */\n GetAllRunnersExMap(): Record<string, IRunnerEx> {\n return this.__runnersEx;\n }\n\n /**\n * Get all runner runtime instances currently hosted by this worker.\n *\n * @returns Array of all runner instances.\n */\n GetAllRunnersEx(): IRunnerEx[] {\n return Object.values(this.__runnersEx);\n }\n\n /**\n * Get runner runtime instances filtered by runner id.\n *\n * Behaviour:\n * - If `runnerIds` is empty, all runners are returned.\n * - Otherwise only matching runner ids are returned.\n *\n * @param runnerIds List of runner ids to include. Use `[]` to include all.\n * @returns Filtered runner list.\n */\n GetRunnersEx(runnerIds: string[]): IRunnerEx[] {\n return this.GetAllRunnersEx().filter(\n runnerEx => runnerIds.length === 0 || runnerIds.includes(runnerEx.id)\n );\n }\n\n /**\n * Create a new runner runtime instance, register it in this worker,\n * and send an `AddRunner` command to the underlying worker.\n *\n * @param runnerOptions Runtime options for the new runner.\n * @returns Newly created runner instance once successfully registered with the underlying worker.\n */\n AddRunner(runnerOptions: IRunnerOptions): Promise<IRunnerEx> {\n return this.#addRunnerToWorker(runnerOptions);\n }\n\n /**\n * Send a `StartRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n StartRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.StartRunner);\n }\n\n /**\n * Send a `StopRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n StopRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.StopRunner);\n }\n\n /**\n * Send a `PauseRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n PauseRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.PauseRunner);\n }\n\n /**\n * Send a `ResumeRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n ResumeRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.ResumeRunner);\n }\n\n /**\n * Send a `TerminateRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n TerminateRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.TerminateRunner);\n }\n\n /**\n * Send a `ResetRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n ResetRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.ResetRunner);\n }\n\n /**\n * Send an `ExecuteRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @returns Action result returned by the worker.\n */\n ExecuteRunner(runner: IRunnerEx): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.ExecuteRunner);\n }\n\n /**\n * Send an `UpdateRunner` command for the specified runner.\n *\n * @param runner Target runner.\n * @param runnerOptions Partial runner option updates to apply.\n * @returns Action result returned by the worker.\n */\n UpdateRunner(\n runner: IRunnerEx,\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> {\n return this.#sendRunnerCommand(runner, eIWMessageCommands.UpdateRunner, runnerOptions);\n }\n\n /**\n * Send `Start` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Start(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Start');\n }\n\n /**\n * Send `Stop` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Stop(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Stop');\n }\n\n /**\n * Send `Pause` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Pause(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Pause');\n }\n\n /**\n * Send `Resume` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Resume(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Resume');\n }\n\n /**\n * Send `Reset` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Reset(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Reset');\n }\n\n /**\n * Send `Execute` to all runners in this worker.\n *\n * @returns Array of per-runner action results.\n */\n Execute(): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Execute');\n }\n\n /**\n * Send `Update` to all runners in this worker.\n *\n * @param runnerOptions Partial runner option updates to apply to all runners.\n * @returns Array of per-runner action results.\n */\n Update(runnerOptions: Partial<IRunnerOptions>): Promise<IExecuteRunnerActionResult[]> {\n return this.#invokeCommand('Update', runnerOptions);\n }\n\n /**\n * Terminate all runners in this worker and then terminate the underlying worker itself.\n *\n * Behaviour:\n * - Calls `Terminate()` on all runner instances first\n * - Waits for those promises via `Promise.all`\n * - Schedules actual worker termination 500ms later\n * - Removes the worker from the central registry after terminating the worker\n *\n * Notes:\n * - This method intentionally handles worker-level shutdown separately rather than\n * using {@link #invokeCommand} because worker termination involves additional\n * cleanup beyond runner termination.\n * - The 500ms timeout is a grace period before terminating the underlying worker.\n *\n * @returns Array of per-runner action results, or `[]` if termination setup fails.\n */\n async Terminate(): Promise<IExecuteRunnerActionResult[]> {\n try {\n const runners = this.GetAllRunnersEx();\n const promArray: Promise<IExecuteRunnerActionResult>[] = [];\n\n for (let i = 0; i < runners.length; i++) {\n promArray.push(runners[i].Terminate());\n }\n\n const retVal = Promise.all(promArray);\n\n if (this.worker) {\n setTimeout(() => {\n this.worker.terminate();\n this.#logger.debug(`_TerminateWorker(): Terminated worker: [${this.id}]`);\n this.#workerRegistry.DeleteWorker(this.id);\n }, 500);\n }\n\n return retVal;\n } catch (error) {\n this.#logger.error(`_TerminateWorker(): Error: [${error}]`);\n return [];\n }\n }\n\n /**\n * Register a worker-level event subscription.\n *\n * This supports a fluent style:\n * `worker.on('exit', cb).on('error', cb2)`\n *\n * @param eventName Name of the event to subscribe to.\n * @param cb Callback to invoke when the event is emitted.\n * @returns The current worker instance for chaining.\n */\n on(eventName: string, cb: (args?: any) => void): IWorkerEx {\n this.workerEvents.push({\n eventName,\n cb\n });\n return this;\n }\n\n /**\n * Convert this live worker runtime instance into a serialisable worker model.\n *\n * Behaviour:\n * - Copies worker metadata\n * - Serialises all live runners via `runnerEx.toJSON()`\n *\n * @returns Full serialisable worker model.\n */\n toJSON(): IWorker {\n const workerCopy: IWorker = {\n id: this.id,\n options: { ...this.options },\n runners: {},\n workerManagerId: this.workerManagerId\n };\n\n for (const runnerEx of Object.values(this.__runnersEx)) {\n (workerCopy.runners as IRunners)[runnerEx.id] = runnerEx.toJSON();\n }\n\n return workerCopy;\n }\n\n /**\n * Alias for {@link toJSON}.\n *\n * @returns Full serialisable worker model.\n */\n toWorker(): IWorker {\n return this.toJSON();\n }\n\n /**\n * Convert this worker into a reduced/core representation.\n *\n * Behaviour:\n * - Includes only the worker id plus filtered runner core models\n * - If `states` is:\n * - `undefined`: includes all runners\n * - `[]`: includes all runners\n * - populated: includes only runners whose state matches one of the provided states\n *\n * @param states Optional runner state filter.\n * @returns Core worker model containing core runner representations.\n * @throws Re-throws any error after logging.\n */\n toWorkerCore(states?: IRunnerState[]): IWorkerCore {\n try {\n const workerCopy: IWorkerCore = {\n id: this.id,\n runners: {}\n };\n\n const filterList = this.GetAllRunnersEx().filter(\n runnerEx => (states ? (states.length === 0 ? true : states.includes(runnerEx.state)) : true)\n );\n\n filterList.forEach(runnerEx => {\n workerCopy.runners[runnerEx.id] = runnerEx.toRunnerCore();\n });\n\n return workerCopy;\n } catch (error) {\n defaultLogger.error(`toWorkerCore(): Error: [${error}]`);\n throw error;\n }\n }\n\n /**\n * Send a command for a specific runner via the message broker.\n *\n * This is the central low-level runner-command dispatch helper used by the\n * per-runner command methods.\n *\n * @param runnerEx Target runner.\n * @param command Broker command to send.\n * @param runnerOptions Optional partial runner options used for update operations.\n * @returns Action result returned by the message broker/worker.\n */\n #sendRunnerCommand(\n runnerEx: IRunnerEx,\n command: IIWMessageCommand,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult> {\n return this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n this,\n runnerEx,\n command,\n runnerOptions\n );\n }\n\n /**\n * Invoke a bulk command across all runners currently hosted by this worker.\n *\n * Behaviour:\n * - Enumerates all current runners\n * - Dynamically invokes the matching runner method by name\n * - If `runnerOptions` is supplied, passes it as the single argument\n * - Returns a `Promise.all(...)` over all runner action promises\n *\n * Notes:\n * - This is used for worker-wide Start/Stop/Pause/Resume/Reset/Execute/Update operations.\n * - `Terminate` is intentionally not handled here because worker-level termination has\n * extra shutdown and cleanup behaviour.\n *\n * @param command Name of the runner method to invoke on each runner.\n * @param runnerOptions Optional partial runner options for update scenarios.\n * @returns Array of per-runner action results.\n */\n async #invokeCommand(\n command: WorkerBulkCommand,\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]> {\n const runners = this.GetAllRunnersEx();\n const promArray: Promise<IExecuteRunnerActionResult>[] = [];\n\n for (let i = 0; i < runners.length; i++) {\n if (runnerOptions) {\n promArray.push((runners[i][command] as any)(runnerOptions));\n } else {\n promArray.push((runners[i][command] as any)());\n }\n }\n\n return Promise.all(promArray);\n }\n\n /**\n * Internal helper used by {@link AddRunner}.\n *\n * Behaviour:\n * - Creates a new live runner runtime instance using the async runner instance manager\n * - Registers the runner locally in this worker\n * - Sends `AddRunner` to the underlying worker via the message broker\n * - Writes optional instrument/log output for diagnostics\n *\n * @param runnerOptions Runtime options for the new runner.\n * @returns Newly created runner instance once worker-side registration succeeds.\n * @throws Re-throws any error after logging.\n */\n async #addRunnerToWorker(runnerOptions: IRunnerOptions): Promise<IRunnerEx> {\n this.#logger.debug(`AddRunnerToWorker()`);\n\n try {\n const runnerEx = this.#asyncRunnerInstanceManager.CreateAsyncRunner(this, runnerOptions);\n this.AddRunnerEx(runnerEx);\n\n const retVal = await this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n this,\n runnerEx,\n eIWMessageCommands.AddRunner\n );\n\n if (runnerEx.publishInstrumentController) {\n runnerEx.publishInstrumentController.LogEx(\n chalk.green(`Added runner: [${runnerEx.id}] into worker: [${this.id}]`)\n );\n }\n\n if (retVal) {\n this.#logger.debug(\n chalk.green(\n `Added runner: [${runnerEx.id}] into worker: [${this.id}] result: [${JSON.stringify(retVal)}]`\n )\n );\n }\n\n return runnerEx;\n } catch (error) {\n this.#logger.error(`AddRunnerToWorker(): Error: [${error}]`);\n throw error;\n }\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerInstanceManager\n * =====================\n *\n * Factory and lifecycle helper responsible for:\n *\n * - constructing manager-side worker runtime objects (`IWorkerEx`)\n * - wiring shared dependencies into those worker instances\n * - attaching low-level system/runtime event handlers to the underlying actual worker\n * - translating native worker events into higher-level worker events\n * - removing failed/exited workers from the shared registry\n *\n * Role in the architecture\n * ------------------------\n * This class lives on the **manager/controller side** of the system.\n *\n * It should not be confused with:\n *\n * - the actual browser Web Worker / Node worker thread runtime, or\n * - the abstract worker-runtime execution host that runs inside the worker\n *\n * Instead, this class is responsible for creating and configuring the\n * manager-side `IWorkerEx` object that represents a live worker to the rest\n * of the coordination layer.\n *\n * Typical responsibilities in practice\n * ------------------------------------\n * 1. Create a new manager-side worker object using the configured factory\n * 2. Inject shared collaborators such as:\n * - message broker\n * - worker registry\n * - async runner instance manager\n * 3. Attach low-level native worker runtime event listeners:\n * - Node.js: `exit`, `error`\n * - Browser: `onerror`, `onmessageerror`\n * 4. Forward those low-level events into higher-level worker events\n * 5. Remove failed/exited workers from the shared registry when appropriate\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport { IWorkerEx, IWorkerFactory, IWorkerOptions } from './commonTypes';\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport isNode from 'detect-node';\n\nimport { STSMessageBroker } from './messageBroker';\nimport { AsyncRunnerInstanceManager } from './asyncRunnerInstanceManager';\nimport { WorkerRegistry } from './workerRegistry';\nimport { WorkerInstance } from './workerInstance';\n\n/**\n * Constructor options for {@link WorkerInstanceManager}.\n */\nexport interface IWorkerInstanceManagerOptions {\n /**\n * Id of the top-level worker manager that owns all workers created through this manager.\n */\n workerManagerId: string;\n\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared message broker used by created worker instances to communicate with their\n * underlying actual worker runtime.\n */\n messageBroker: STSMessageBroker;\n\n /**\n * Shared live worker registry.\n *\n * Used when system events require worker removal/cleanup.\n */\n workerRegistry: WorkerRegistry;\n\n /**\n * Shared async runner instance manager used by worker instances when creating runners.\n */\n asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n}\n\n/**\n * Manager-side factory/helper for worker instances.\n *\n * This class creates concrete manager-side {@link IWorkerEx} objects and attaches\n * platform-specific system event listeners to the underlying worker runtime.\n */\nexport class WorkerInstanceManager {\n /**\n * Immutable runtime configuration and dependencies for this manager.\n */\n private readonly options: IWorkerInstanceManagerOptions;\n\n /**\n * Construct a new worker instance manager.\n *\n * @param options Shared collaborators required to create and manage worker instances.\n */\n constructor(options: IWorkerInstanceManagerOptions) {\n this.options = options;\n }\n\n /**\n * Create a new manager-side worker instance.\n *\n * Behaviour:\n * - constructs a new concrete {@link WorkerInstance}\n * - injects all shared collaborators required by that worker instance\n * - returns the created manager-side worker object\n *\n * Notes:\n * - This does not automatically register the worker in the registry\n * - This does not automatically attach system/runtime event handlers\n * - Those are handled separately by the caller\n *\n * Dependencies injected into the worker include:\n * - worker manager id\n * - worker-specific options\n * - message port\n * - worker factory\n * - message broker\n * - worker registry\n * - async runner instance manager\n * - logger\n *\n * @param workerOptions Worker-specific runtime configuration.\n * @param port Message port used for brokered worker communication.\n * @param workerFactory Factory used to create the underlying actual worker runtime.\n * @returns Newly created manager-side worker instance.\n */\n CreateWorkerInstance = (\n workerOptions: IWorkerOptions,\n port: any,\n workerFactory: IWorkerFactory\n ): IWorkerEx => {\n return new WorkerInstance({\n workerManagerId: this.options.workerManagerId,\n workerOptions,\n messagePort: port,\n workerFactory,\n messageBroker: this.options.messageBroker,\n workerRegistry: this.options.workerRegistry,\n asyncRunnerInstanceManager: this.options.asyncRunnerInstanceManager,\n logger: this.options.logger\n });\n };\n\n /**\n * Attach low-level system/runtime event handlers to the underlying actual worker.\n *\n * Environment-specific behaviour:\n *\n * Node.js worker thread:\n * - attaches `exit`\n * - attaches `error`\n *\n * Browser Web Worker:\n * - attaches `onerror`\n * - attaches `onmessageerror`\n *\n * Event handling behaviour\n * ------------------------\n * - Logs the low-level worker event\n * - Emits a higher-level worker event to any subscribers on `workerEx.workerEvents`\n * - Removes the worker from the shared registry when appropriate\n *\n * Registry removal behaviour:\n * - Node `exit` -> deletes worker from registry\n * - Browser `onerror` -> deletes worker from registry\n * - Node `error` does not immediately delete the worker\n * - Browser `onmessageerror` does not immediately delete the worker\n *\n * Notes:\n * - This method should typically be called after creating the worker instance\n * and before the worker is considered fully live\n * - For mocked workers or other special worker implementations, callers may\n * choose not to attach these runtime handlers\n *\n * @param stsWorkerEx Manager-side worker instance whose underlying actual worker should be monitored.\n */\n SetupWorkerSystemEvents = (stsWorkerEx: IWorkerEx) => {\n if (isNode) {\n /**\n * Node.js worker thread exit event.\n *\n * Indicates the worker has fully exited and should be removed from the live registry.\n */\n stsWorkerEx.worker.on('exit', (code: any) => {\n try {\n this.options.logger.debug(\n chalk.magenta(`STSWorkerManager:stsWorkerEx.worker.on(exit): Worker exited with code: ${code}`)\n );\n\n this._EmitWorkerEvent('exit', stsWorkerEx);\n\n this.options.workerRegistry.DeleteWorker(stsWorkerEx.id);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.on(exit): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n });\n\n /**\n * Node.js worker thread error event.\n *\n * Indicates an unhandled runtime error occurred inside the worker.\n * This implementation emits the higher-level event but does not\n * automatically remove the worker from the registry.\n */\n stsWorkerEx.worker.on('error', (error: any) => {\n try {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.on(error): Worker error: ${error}`)\n );\n\n this._EmitWorkerEvent('error', stsWorkerEx);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.on(error): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n });\n } else {\n /**\n * Browser Web Worker fatal/runtime error handler.\n *\n * Emits a higher-level worker error event and removes the worker from the registry.\n */\n (stsWorkerEx.worker as any).onerror = (error: any) => {\n try {\n this.options.logger.error(\n chalk.red('STSWorkerManager:stsWorkerEx.worker.onerror(): Error in worker:', error)\n );\n\n this._EmitWorkerEvent('onerror', stsWorkerEx);\n\n this.options.workerRegistry.DeleteWorker(stsWorkerEx.id);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.onerror(error): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n };\n\n /**\n * Browser Web Worker message deserialisation/invalid message handler.\n *\n * Emits a higher-level `onmessageerror` event but does not automatically\n * remove the worker from the registry.\n */\n (stsWorkerEx.worker as any).onmessageerror = (error: any) => {\n try {\n this.options.logger.error(\n chalk.red('STSWorkerManager:stsWorkerEx.worker.onmessageerror(): Message error in worker:', error)\n );\n\n this._EmitWorkerEvent('onmessageerror', stsWorkerEx);\n } catch (error) {\n this.options.logger.error(\n chalk.red(`STSWorkerManager:stsWorkerEx.worker.onmessageerror(error): Error: [${error}] Worker: [${stsWorkerEx.id}]`)\n );\n }\n };\n }\n };\n\n /**\n * Emit a higher-level worker event to any registered worker event subscribers.\n *\n * Behaviour:\n * - iterates the worker's registered `workerEvents`\n * - matches handlers whose `eventName` equals the supplied event name\n * - invokes each matching callback with the live worker instance\n *\n * This method is used to translate low-level native worker/runtime events into\n * the higher-level event model used by the rest of the framework.\n *\n * @param eventName Name of the worker event to emit.\n * @param workerEx Live manager-side worker instance associated with the event.\n * @throws Re-throws unexpected errors after logging.\n */\n private _EmitWorkerEvent = (eventName: string, workerEx: IWorkerEx) => {\n try {\n workerEx.workerEvents.forEach(ev => {\n if (ev.eventName.localeCompare(eventName) === 0) {\n ev.cb(workerEx);\n }\n });\n } catch (error) {\n this.options.logger.error(`_EmitWorkerEvent(): Error: [${error}]`);\n throw error;\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerRegistry\n * ==============\n *\n * Central in-memory registry for all live manager-side workers and runners.\n *\n * This class is responsible for maintaining the manager-side runtime graph of:\n *\n * - workers (`IWorkerEx`)\n * - runners (`IRunnerEx`) owned by those workers\n *\n * Architectural role\n * ------------------\n * `WorkerRegistry` acts as the single source of truth for the current live\n * manager-side object model.\n *\n * Other services use this registry to:\n *\n * - locate workers\n * - locate runners within workers\n * - add/remove workers and runners\n * - generate serialisable worker maps\n * - generate reduced/core worker maps\n * - select workers by current runner load\n *\n * Design notes\n * ------------\n * - This is an in-memory registry only.\n * - It stores live manager-side runtime objects, not worker-runtime objects.\n * - It does not perform worker/runner execution itself.\n * - It does not own broker or synchronisation logic; it is purely a shared store\n * plus convenience lookup/selection helpers.\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport { IWorkerEx, IRunnerEx, IRunnerState, IWorkers, IWorkerCore } from './commonTypes';\n\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link WorkerRegistry}.\n */\nexport interface IWorkerRegistryOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n}\n\n/**\n * Central live registry of workers and runners.\n *\n * This class stores the manager-side live runtime objects and provides lookup,\n * mutation, projection, and simple worker-selection helpers.\n */\nexport class WorkerRegistry {\n /**\n * Internal live worker map keyed by worker id.\n *\n * Each value is a live manager-side worker instance.\n */\n private readonly workersEx: Record<string, IWorkerEx> = {};\n\n /**\n * Immutable runtime configuration for the registry.\n */\n private readonly options: IWorkerRegistryOptions;\n\n /**\n * Construct a new worker registry.\n *\n * @param options Logger and related registry dependencies.\n */\n constructor(options: IWorkerRegistryOptions) {\n this.options = options;\n }\n\n /**\n * Add a live worker instance to the registry.\n *\n * Behaviour:\n * - stores the supplied worker under its `id`\n * - replaces any existing worker already stored under the same id\n *\n * Notes:\n * - This method does not validate whether the worker already exists\n * - Callers are responsible for ensuring worker ids are unique\n *\n * @param stsWorkerEx Live worker instance to register.\n */\n AddWorker = (stsWorkerEx: IWorkerEx) => {\n this.workersEx[stsWorkerEx.id] = stsWorkerEx;\n };\n\n /**\n * Add a runner to an existing worker in the registry.\n *\n * Behaviour:\n * - resolves the target worker by `workerId`\n * - delegates runner storage to the worker's `AddRunnerEx(...)` method\n *\n * Error handling:\n * - throws if the target worker does not exist\n *\n * @param workerId Id of the worker that should own the runner.\n * @param runnerEx Live runner instance to register.\n * @throws If the target worker does not exist in the registry.\n */\n AddRunner = (workerId: string, runnerEx: IRunnerEx) => {\n if (this.workersEx[workerId]) {\n this.workersEx[workerId].AddRunnerEx(runnerEx);\n } else {\n throw new Error(`WorkerRegistry:AddRunner(): Error: [Worker: [${workerId}] does not exist]`);\n }\n };\n\n /**\n * Get a live worker instance by id.\n *\n * @param worderId Worker id to resolve.\n * @returns Matching live worker instance, or `undefined` if not found.\n */\n GetWorker = (worderId: string): IWorkerEx | undefined => {\n return this.workersEx[worderId];\n };\n\n /**\n * Get a live runner instance by worker id and runner id.\n *\n * Behaviour:\n * - resolves the worker first\n * - asks the worker for the runner by id\n *\n * @param workerId Owning worker id.\n * @param id Runner id.\n * @returns Matching live runner instance, or `null` if not found.\n */\n GetRunnerEx = (workerId: string, id: string): IRunnerEx | null => {\n const workerEx = this.GetWorkerEx(workerId);\n if (workerEx) {\n return workerEx.GetRunnerEx(id);\n }\n return null;\n };\n\n /**\n * Delete a worker from the live registry.\n *\n * Behaviour:\n * - removes the worker entry if it exists\n * - does nothing if the worker is not present\n *\n * Note:\n * - This does not explicitly terminate the underlying worker\n * - It only removes the manager-side live registry entry\n *\n * @param workerId Worker id to delete.\n */\n DeleteWorker = (workerId: string): void => {\n if (this.workersEx[workerId]) {\n delete this.workersEx[workerId];\n }\n };\n\n /**\n * Delete a runner from a worker in the live registry.\n *\n * Behaviour:\n * - resolves the owning worker\n * - resolves the worker's live runner map\n * - deletes the matching runner entry if present\n *\n * Notes:\n * - This operates only on the manager-side live registry\n * - It does not send any message to the worker runtime\n * - It is typically used after a runner has already been archived/retired\n *\n * @param workerId Owning worker id.\n * @param runnerId Runner id to delete.\n */\n DeleteRunner = (workerId: string, runnerId: string): void => {\n const worker = this.GetWorker(workerId);\n if (worker) {\n const runnersMap = worker.GetAllRunnersExMap();\n if (runnersMap) {\n if (runnersMap[runnerId]) {\n delete runnersMap[runnerId];\n }\n }\n }\n };\n\n /**\n * Build and return the full serialisable workers map.\n *\n * Behaviour:\n * - iterates all live workers\n * - converts each worker to its serialisable `IWorker` representation\n * - returns the full map keyed by worker id\n *\n * Error handling:\n * - logs and re-throws unexpected errors\n *\n * @returns Full serialisable workers map.\n * @throws Re-throws unexpected errors after logging.\n */\n GetWorkersMap = (): IWorkers => {\n try {\n const retVal: IWorkers = {};\n for (const [, workerEx] of Object.entries(this.workersEx)) {\n retVal[workerEx.id] = workerEx.toWorker();\n }\n return retVal;\n } catch (error) {\n this.options.logger.error(`GetWorkers(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the raw live runner map for a specific worker.\n *\n * Behaviour:\n * - resolves the worker by id\n * - returns the worker's internal runner map\n *\n * @param workerId Worker id.\n * @returns Runner map keyed by runner id, or `undefined` if the worker does not exist.\n */\n GetAllRunnersExMap = (workerId: string): Record<string, IRunnerEx> | undefined => {\n const workersEx = this.GetWorkerEx(workerId);\n if (workersEx) {\n return workersEx.GetAllRunnersExMap();\n }\n };\n\n /**\n * Get a filtered list of live worker instances.\n *\n * Behaviour:\n * - if `workerIds` is empty, returns all workers\n * - otherwise returns only workers whose ids are present in `workerIds`\n *\n * @param workerIds Worker ids to include. Use `[]` for all workers.\n * @returns Filtered list of live worker instances.\n */\n GetWorkersEx = (workerIds: string[]): IWorkerEx[] => {\n return Object.values(this.workersEx).filter((workerEx) =>\n (workerIds.length === 0 ? true : workerIds.includes(workerEx.id))\n );\n };\n\n /**\n * Get a live worker instance by id.\n *\n * This is functionally equivalent to {@link GetWorker}, but preserves the\n * `Ex` naming convention used elsewhere in the framework.\n *\n * @param workerId Worker id.\n * @returns Matching live worker instance, or `undefined` if not found.\n */\n GetWorkerEx = (workerId: string): IWorkerEx | undefined => {\n return this.workersEx[workerId];\n };\n\n /**\n * Build and return the reduced/core workers map.\n *\n * Behaviour:\n * - iterates all live workers\n * - converts each worker to its reduced/core representation\n * - optionally filters included runners by state\n *\n * Runner state filtering:\n * - `undefined` => include all runners\n * - `[]` => include all runners\n * - populated array => include only matching runner states\n *\n * Error handling:\n * - logs and re-throws unexpected errors\n *\n * @param states Optional runner-state filter.\n * @returns Reduced/core workers map keyed by worker id.\n * @throws Re-throws unexpected errors after logging.\n */\n GetWorkersCoreMap = (states?: IRunnerState[]): Record<string, IWorkerCore> => {\n try {\n const retVal: Record<string, IWorkerCore> = {};\n for (const [, workerEx] of Object.entries(this.workersEx)) {\n (retVal[workerEx.id] as any) = workerEx.toWorkerCore(states);\n }\n return retVal;\n } catch (error) {\n this.options.logger.error(`GetWorkersCore(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the worker currently hosting the fewest runners.\n *\n * Selection rule:\n * - returns the worker with the smallest `GetAllRunnersEx().length`\n *\n * Behaviour:\n * - if no workers exist, returns `null`\n * - on error, logs and returns `null`\n *\n * Intended use:\n * - simple load spreading / least-loaded worker selection\n *\n * @returns Least-loaded worker, or `null` if unavailable.\n */\n GetNextAvailableWorker = (): IWorkerEx | null => {\n try {\n let leastRunnerWorker: IWorkerEx | null = null;\n\n for (const [, stsWorker] of Object.entries(this.workersEx)) {\n if (leastRunnerWorker) {\n if (stsWorker.GetAllRunnersEx().length < leastRunnerWorker.GetAllRunnersEx().length) {\n leastRunnerWorker = stsWorker;\n }\n } else {\n leastRunnerWorker = stsWorker;\n }\n }\n\n return leastRunnerWorker;\n } catch (error) {\n this.options.logger.error(`GetNextAvailableWorker(): Error: [${error}]`);\n return null;\n }\n };\n\n /**\n * Get the worker currently hosting the most runners.\n *\n * Selection rule:\n * - returns the worker with the largest `GetAllRunnersEx().length`\n *\n * Behaviour:\n * - if no workers exist, returns `null`\n * - on error, logs and returns `null`\n *\n * Intended use:\n * - diagnostics\n * - load analysis\n * - busiest-worker selection logic\n *\n * @returns Most-loaded worker, or `null` if unavailable.\n */\n GetBusiestWorker = (): IWorkerEx | null => {\n try {\n let busyWorker: IWorkerEx | null = null;\n\n for (const [, stsWorker] of Object.entries(this.workersEx)) {\n if (busyWorker) {\n if (stsWorker.GetAllRunnersEx().length > busyWorker.GetAllRunnersEx().length) {\n busyWorker = stsWorker;\n }\n } else {\n busyWorker = stsWorker;\n }\n }\n\n return busyWorker;\n } catch (error) {\n this.options.logger.error(`GetBusiestWorker(): Error: [${error}]`);\n return null;\n }\n };\n}","/**\n * TelemetryProcessor\n * ------------------\n * Responsible for translating raw runner telemetry into updates for the\n * observability instrumentation system.\n *\n * This class acts as the bridge between:\n *\n * - the internal runner telemetry model (`IRunnerTelemetry`)\n * - the external observability instrumentation system\n * (`PublishInstrumentController` from `@nsshunt/stsinstrumentmanagerclient`)\n *\n * The processor interprets telemetry values and updates the appropriate\n * gauges, counters, and histograms defined in the observability model\n * (`@nsshunt/stsobservability`).\n *\n * High-level responsibilities:\n *\n * 1. Convert runner telemetry fields into instrumentation updates\n * 2. Push those updates to the PublishInstrumentController\n * 3. Forward any telemetry log messages\n * 4. Track whether any meaningful update occurred\n *\n * The processor is intentionally stateless. It simply transforms and forwards\n * telemetry values.\n */\n\nimport { InstrumentGaugeTelemetry, Gauge } from '@nsshunt/stsobservability';\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\nimport { IRunnerTelemetry } from \"./commonTypes\";\n\n/**\n * hasValue\n * --------\n * Utility type-guard function used to determine whether a value is defined\n * (i.e., not `undefined` and not `null`).\n *\n * Purpose\n * -------\n * In many telemetry and data-processing scenarios, values such as `0` are\n * valid and should not be treated as \"missing\". However, common truthy checks\n * like:\n *\n * if (value) { ... }\n *\n * will incorrectly treat `0`, `false`, or empty strings as absent values.\n *\n * This helper explicitly checks only for `null` and `undefined`, allowing\n * legitimate values like `0` to pass through.\n *\n * Type Guard Behaviour\n * --------------------\n * This function is implemented as a **TypeScript type guard** using the\n * return type:\n *\n * v is T\n *\n * When used inside a conditional block, TypeScript will narrow the type\n * of `v` from `T | null | undefined` to `T`.\n *\n * Example\n * -------\n *\n * ```ts\n * const value: number | undefined = telemetry.requestCount;\n *\n * if (hasValue(value)) {\n * // value is now typed as number (not undefined)\n * publishMetric(value);\n * }\n * ```\n *\n * Without the type guard, TypeScript would still consider `value` to possibly\n * be `undefined`.\n *\n * Runtime Behaviour\n * -----------------\n * Returns `true` if:\n *\n * - the value is not `undefined`\n * - the value is not `null`\n *\n * Returns `false` if:\n *\n * - the value is `undefined`\n * - the value is `null`\n *\n * Valid values that will return `true` include:\n *\n * - `0`\n * - `false`\n * - `\"\"` (empty string)\n * - `NaN`\n * - empty arrays or objects\n *\n * This makes it safe for telemetry and metric processing where `0`\n * represents a valid measurement.\n *\n * @typeParam T\n * The underlying type of the value being checked.\n *\n * @param v\n * The value to evaluate.\n *\n * @returns\n * `true` if the value is neither `null` nor `undefined`,\n * otherwise `false`.\n */\nfunction hasValue<T>(v: T | null | undefined): v is T {\n return v !== undefined && v !== null;\n}\n\n/**\n * Processes telemetry emitted by a runner and forwards it to the\n * instrumentation subsystem.\n */\nexport class TelemetryProcessor {\n\n /**\n * Process telemetry data for a runner and publish it through the\n * provided instrumentation controller.\n *\n * Behaviour:\n *\n * - Each telemetry field is mapped to one or more observability gauges.\n * - Only fields with values are processed (except active request count,\n * which is always updated).\n * - Some telemetry values update gauges using:\n *\n * val → set absolute value\n * Inc → increment existing metric\n *\n * - Histogram gauges are updated alongside standard gauges for\n * latency and duration metrics.\n *\n * Logging behaviour:\n *\n * - Any telemetry messages present in `telemetry.message`\n * are forwarded to the publish instrument controller via `LogEx`.\n *\n * Return value:\n *\n * - `true` if any telemetry fields were processed and published\n * - `false` if no update occurred\n *\n * @param publishInstrumentController\n * Controller responsible for publishing metrics/logs to the\n * observability system.\n *\n * @param telemetry\n * Raw telemetry snapshot generated by a runner execution cycle.\n *\n * @returns\n * Boolean indicating whether telemetry updates were applied.\n */\n ProcessTelemetry = (\n publishInstrumentController: PublishInstrumentController,\n telemetry: IRunnerTelemetry\n ): boolean => {\n\n /**\n * Tracks whether any telemetry updates occurred.\n */\n let update = false;\n\n /**\n * -------------------------------------------------------\n * Telemetry message logging\n * -------------------------------------------------------\n *\n * Runner telemetry may contain informational or diagnostic\n * messages. These are forwarded directly to the instrument\n * controller logging facility.\n */\n if (telemetry.message) {\n telemetry.message.forEach((message) => {\n publishInstrumentController.LogEx(message);\n });\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Request metrics\n * -------------------------------------------------------\n */\n\n if (hasValue(telemetry.requestCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.REQUEST_COUNT_GAUGE, {\n val: telemetry.requestCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.errorCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.ERROR_COUNT_GAUGE, {\n val: telemetry.errorCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.retryCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.RETRY_COUNT_GAUGE, {\n val: telemetry.retryCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Authentication metrics\n * -------------------------------------------------------\n */\n\n if (hasValue(telemetry.authenticationCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_COUNT_GAUGE, {\n val: telemetry.authenticationCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.authenticationErrorCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_ERROR_COUNT_GAUGE, {\n val: telemetry.authenticationErrorCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.authenticationRetryCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.AUTHENTICATION_RETRY_COUNT_GAUGE, {\n val: telemetry.authenticationRetryCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Execution environment metrics\n * -------------------------------------------------------\n */\n\n if (hasValue(telemetry.coreCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.CORE_COUNT_GAUGE, {\n val: telemetry.coreCount\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n if (hasValue(telemetry.timer)) {\n publishInstrumentController.UpdateInstrument(Gauge.TIMER_GAUGE, {\n val: telemetry.timer\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Active request gauge\n * -------------------------------------------------------\n *\n * This gauge is updated unconditionally so that monitoring\n * dashboards always reflect the latest runner concurrency.\n */\n publishInstrumentController.UpdateInstrument(Gauge.ACTIVE_REQUEST_GAUGE, {\n val: telemetry.activeRequestCount\n } as InstrumentGaugeTelemetry);\n\n /**\n * -------------------------------------------------------\n * Throughput / velocity metrics\n * -------------------------------------------------------\n *\n * Velocity is applied as an increment to the gauge rather\n * than setting a value directly.\n */\n if (hasValue(telemetry.velocity)) {\n publishInstrumentController.UpdateInstrument(Gauge.VELOCITY_GAUGE, {\n Inc: telemetry.velocity\n } as InstrumentGaugeTelemetry);\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Duration metrics\n * -------------------------------------------------------\n *\n * Duration is published to:\n * - a direct duration gauge\n * - a duration histogram for statistical aggregation\n */\n if (hasValue(telemetry.duration)) {\n publishInstrumentController.UpdateInstrument(Gauge.DURATION_GAUGE, {\n val: telemetry.duration\n } as InstrumentGaugeTelemetry);\n\n publishInstrumentController.UpdateInstrument(Gauge.DURATION_HISTOGRAM_GAUGE, {\n val: telemetry.duration\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Latency metrics\n * -------------------------------------------------------\n *\n * Latency is published both as a gauge and histogram\n * to allow percentile aggregation.\n */\n if (hasValue(telemetry.latency)) {\n publishInstrumentController.UpdateInstrument(Gauge.LATENCY_GAUGE, {\n val: telemetry.latency\n } as InstrumentGaugeTelemetry);\n\n publishInstrumentController.UpdateInstrument(Gauge.LATENCY_HISTOGRAM_GAUGE, {\n val: telemetry.latency\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Child execution metrics\n * -------------------------------------------------------\n *\n * Tracks spawned/child execution count if the runner\n * coordinates additional sub-tasks.\n */\n if (hasValue(telemetry.childCount)) {\n publishInstrumentController.UpdateInstrument(Gauge.CHILD_COUNT, {\n val: telemetry.childCount\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * -------------------------------------------------------\n * Network telemetry\n * -------------------------------------------------------\n *\n * Network counters are applied as increments rather than\n * absolute values to accumulate totals.\n */\n\n if (hasValue(telemetry.rx)) {\n publishInstrumentController.UpdateInstrument(Gauge.NETWORK_RX_GAUGE, {\n Inc: telemetry.rx\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n if (hasValue(telemetry.tx)) {\n publishInstrumentController.UpdateInstrument(Gauge.NETWORK_TX_GAUGE, {\n Inc: telemetry.tx\n } as InstrumentGaugeTelemetry);\n\n update = true;\n }\n\n /**\n * Return whether any telemetry updates occurred.\n */\n return update;\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * RunnerLifecycleManager\n * ----------------------\n * Runtime lifecycle/event processor responsible for handling unsolicited\n * runner-related messages received from workers.\n *\n * Responsibilities:\n * - process unsolicited telemetry messages pushed from workers\n * - process unsolicited runner state change messages pushed from workers\n * - update live in-memory runner state in the {@link WorkerRegistry}\n * - trigger telemetry publishing via {@link TelemetryProcessor}\n * - emit runner-level events to registered listeners\n * - provide a message-handler factory suitable for wiring into the message broker\n *\n * High-level role in the architecture:\n * - Workers push unsolicited messages such as telemetry and state changes\n * - The {@link STSMessageBroker} routes those unsolicited messages to a callback\n * - This class provides that callback and applies the updates to live runner instances\n *\n * Important distinction:\n * - Solicited request/response traffic is handled by the message broker\n * - Unsolicited push/event traffic is handled here\n *\n * Typical unsolicited messages handled here:\n * - `InstrumentTelemetry`\n * - `RunnerStateChange`\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n IIWMessagePayload,\n eIWMessageCommands,\n IWorkerEx,\n IRunner,\n IRunnerEx,\n ITestRunnerTelemetryPayload,\n IRunnerEvent\n} from './commonTypes';\n\nimport { TelemetryProcessor } from './telemetryProcessor';\n\nimport { WorkerRegistry } from './workerRegistry';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link RunnerLifecycleManager}.\n */\nexport interface IRunnerLifecycleManagerOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared live worker/runner registry used to resolve and update\n * the current runtime runner instances.\n */\n workerRegistry: WorkerRegistry;\n}\n\n/**\n * Manages live runner lifecycle updates for unsolicited worker messages.\n *\n * This class updates the in-memory runtime graph and emits runner events\n * in response to messages pushed by workers.\n */\nexport class RunnerLifecycleManager {\n /**\n * Immutable runtime configuration for this lifecycle manager.\n */\n private readonly options: IRunnerLifecycleManagerOptions;\n\n /**\n * Processor used to forward/update external telemetry instrumentation.\n *\n * This is created eagerly in the constructor and used only when a runner\n * has a publish instrument controller attached.\n */\n private readonly telemetryProcessor: TelemetryProcessor | null = null;\n\n /**\n * Construct a new runner lifecycle manager.\n *\n * @param options Logger and worker registry dependencies.\n */\n constructor(options: IRunnerLifecycleManagerOptions) {\n this.options = options;\n this.telemetryProcessor = new TelemetryProcessor();\n }\n\n /**\n * Process an unsolicited telemetry message for a runner.\n *\n * Behaviour:\n * - resolves the live runner instance from the registry\n * - updates the live runner state/telemetry using {@link SyncRunnerData}\n * - if the runner has a publish instrument controller, pushes the telemetry\n * through the {@link TelemetryProcessor}\n * - emits a `Telemetry` runner event\n *\n * Notes:\n * - This method only handles unsolicited push telemetry from workers\n * - The incoming payload is expected to contain a serialised `runner`\n * snapshot with updated instrumentation values\n *\n * @param workerEx Worker that produced the telemetry message.\n * @param payloadContents Telemetry payload containing the updated runner snapshot.\n * @throws Re-throws unexpected errors after logging.\n */\n private _ProcessTelemetry = (workerEx: IWorkerEx, payloadContents: ITestRunnerTelemetryPayload): void => {\n try {\n const { runner } = payloadContents;\n const runnerEx = this.options.workerRegistry.GetRunnerEx(workerEx.id, runner.id);\n\n if (runnerEx) {\n this.SyncRunnerData(runnerEx, runner);\n\n if (runnerEx.publishInstrumentController && this.telemetryProcessor) {\n this.telemetryProcessor.ProcessTelemetry(\n runnerEx.publishInstrumentController,\n runnerEx.instrumentData\n );\n }\n\n this._EmitRunnerEvent('Telemetry', workerEx, runner.id);\n }\n } catch (error) {\n this.options.logger.error(`_ProcessTelemetry(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Emit a runner-level event for a specific runner.\n *\n * Behaviour:\n * - looks up all registered event handlers for the specified runner id\n * - filters to handlers whose `eventName` matches the supplied event name\n * - resolves the live runner instance from the registry\n * - invokes each matching callback with the live runner instance\n *\n * Notes:\n * - Event subscriptions are stored on the worker in `workerEx.runnersEvents`\n * - The live runner instance is resolved from the registry at emit time so\n * callbacks receive the current runtime object\n *\n * @param eventName Name of the runner event to emit.\n * @param workerEx Owning worker of the runner.\n * @param runnerId Id of the runner whose event should be emitted.\n * @throws Re-throws unexpected errors after logging.\n */\n private _EmitRunnerEvent = (eventName: string, workerEx: IWorkerEx, runnerId: string) => {\n try {\n if (workerEx.runnersEvents[runnerId]) {\n const runnersEvents: IRunnerEvent[] = workerEx.runnersEvents[runnerId];\n\n runnersEvents.forEach(ev => {\n if (ev.eventName.localeCompare(eventName) === 0) {\n const runnerEx = this.options.workerRegistry.GetRunnerEx(workerEx.id, runnerId);\n if (runnerEx) {\n ev.cb(runnerEx);\n }\n }\n });\n }\n } catch (error) {\n this.options.logger.error(`_EmitRunnerEvent(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Process an unsolicited runner state change message.\n *\n * Behaviour:\n * - resolves the live runner instance from the registry\n * - records the previous state for logging/debugging\n * - updates the runner's current state\n * - appends a runner-history entry containing a snapshot of the new state\n * - ensures nested `runnerHistory` is cleared from the history snapshot itself\n * to avoid recursive history growth\n * - updates other live runner fields via {@link SyncRunnerData}\n * - emits a `StateChange` runner event\n *\n * History entry structure:\n * - `eventDate`: timestamp when the state change was processed\n * - `runner`: shallow copy of the inbound runner snapshot\n *\n * Notes:\n * - This is intended for unsolicited push state updates from the worker\n * - The runner history list is lazily initialised if missing\n *\n * @param workerEx Worker that produced the state change.\n * @param payloadContents Payload containing the updated runner snapshot.\n * @throws Re-throws unexpected errors after logging.\n */\n private _RunnerStateChange = (workerEx: IWorkerEx, payloadContents: ITestRunnerTelemetryPayload): void => {\n try {\n const { runner } = payloadContents;\n\n const runnerEx = this.options.workerRegistry.GetRunnerEx(workerEx.id, runner.id);\n if (runnerEx) {\n const previousState = runnerEx.state;\n\n runnerEx.state = runner.state;\n\n if (!runnerEx.runnerHistory) {\n runnerEx.runnerHistory = [];\n }\n\n /**\n * Create a snapshot of the inbound runner data for history purposes.\n *\n * The nested history collection is explicitly cleared to prevent\n * recursive history growth inside history records.\n */\n const runnerHistoryRecord = { ...runner };\n runnerHistoryRecord.runnerHistory = [];\n\n runnerEx.runnerHistory.push({\n eventDate: new Date(),\n runner: runnerHistoryRecord\n });\n\n this.SyncRunnerData(runnerEx, runner);\n\n this.options.logger.debug(\n `STSWorkerManager:#RunnerStateChange(): Worker: [${workerEx.id}] Runner: [${runner.id}] Previous State: [${previousState}] State: [${runner.state}]`\n );\n\n this._EmitRunnerEvent('StateChange', workerEx, runner.id);\n }\n } catch (error) {\n this.options.logger.error(`_RunnerStateChange(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Synchronise live mutable runner fields from a serialised runner snapshot.\n *\n * Behaviour:\n * - updates iteration\n * - updates state\n * - replaces the current instrumentation payload\n *\n * Intended use:\n * - telemetry processing\n * - worker state synchronisation\n * - state change handling\n *\n * Notes:\n * - This method mutates the live `runnerEx` instance directly\n * - It intentionally updates only the current mutable runtime fields and not\n * the full runner identity/options model\n *\n * @param runnerEx Live runner instance to update.\n * @param runner Serialised runner snapshot containing updated values.\n */\n SyncRunnerData = (runnerEx: IRunnerEx, runner: IRunner) => {\n try {\n runnerEx.iteration = runner.iteration;\n runnerEx.state = runner.state;\n runnerEx.instrumentData = { ...runner.instrumentData };\n } catch (error) {\n this.options.logger.error(`_SyncRunnerData(): Error: [${error}]`);\n }\n };\n\n /**\n * Build the list of unsolicited command handlers supported by this lifecycle manager.\n *\n * Current unsolicited commands handled:\n * - `InstrumentTelemetry`\n * - `RunnerStateChange`\n *\n * Each mapping contains:\n * - `command`: the incoming message command\n * - `cb`: the handler to invoke for that command\n *\n * Notes:\n * - This method currently rebuilds the list on each call\n * - Since the mapping is small and static, this is acceptable, though it could\n * be cached later if desired\n *\n * @returns Array of unsolicited command -> handler mappings.\n */\n private _GetUnsolicitedCommandProcessMap = () => {\n return [\n { command: eIWMessageCommands.InstrumentTelemetry, cb: this._ProcessTelemetry },\n { command: eIWMessageCommands.RunnerStateChange, cb: this._RunnerStateChange }\n ];\n };\n\n /**\n * Create a message handler function suitable for wiring into a worker's\n * unsolicited-message listener.\n *\n * Behaviour of the returned handler:\n * - interprets the inbound raw data as an {@link IIWMessagePayload}\n * - finds a matching unsolicited command handler from the internal map\n * - if a handler is found, invokes it with:\n * - the specific worker instance for which this handler was created\n * - the inbound message payload cast as `ITestRunnerTelemetryPayload`\n *\n * Typical usage:\n * - one handler is created per worker\n * - that handler is passed into the message broker's port-listener setup\n * - the handler processes only unsolicited push/event traffic\n *\n * Notes:\n * - This method intentionally closes over `stsWorkerEx`, so the returned\n * handler is permanently associated with that worker instance\n * - Solicited request/response messages should already have been handled\n * by the message broker before reaching this handler\n *\n * Future design note:\n * - Runner state changes may eventually be fully embedded in solicited responses,\n * which could make separate `RunnerStateChange` push events redundant and reduce\n * race conditions between awaited commands and subsequent push updates\n *\n * @param stsWorkerEx Worker instance whose unsolicited messages should be processed.\n * @returns A function that processes unsolicited messages for the supplied worker.\n * @throws Re-throws unexpected errors after logging.\n */\n ProcessMessageHandlerFactory = (stsWorkerEx: IWorkerEx) => {\n return (data: any) => {\n try {\n const unsolicitedCommandProcessMap = this._GetUnsolicitedCommandProcessMap();\n const publishMessagePayload: IIWMessagePayload = data;\n const index = unsolicitedCommandProcessMap\n .findIndex(v => v.command === publishMessagePayload.command);\n\n if (index >= 0) {\n unsolicitedCommandProcessMap[index]\n .cb(stsWorkerEx, publishMessagePayload.payload as ITestRunnerTelemetryPayload);\n }\n } catch (error) {\n this.options.logger.error(`AddWorker:processMessage(): Error: [${error}]`);\n throw error;\n }\n };\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerStateSynchroniser\n * =======================\n *\n * Synchronises the manager-side in-memory worker/runner model with the current\n * state held inside the actual worker runtimes.\n *\n * Architectural role\n * ------------------\n * The manager-side registry (`WorkerRegistry`) stores live `IWorkerEx` and\n * `IRunnerEx` objects. However, the true current runner state is maintained\n * inside the actual worker runtime until it is pushed back or explicitly queried.\n *\n * `WorkerStateSynchroniser` provides the \"pull\" side of that synchronisation:\n *\n * - it asks each worker for its current runners via `GetRunners`\n * - it applies the returned runner snapshots to the live manager-side runner objects\n * - it then returns either:\n * - the full worker map, or\n * - the reduced/core worker map\n *\n * Responsibilities\n * ----------------\n * - issue `GetRunners` requests to all live workers\n * - await all worker responses\n * - apply returned runner state into the manager-side runtime graph\n * - expose synchronised full and reduced worker views\n *\n * Design notes\n * ------------\n * - This class does not own workers or runners directly.\n * - It relies on:\n * - {@link WorkerRegistry} for the live manager-side object graph\n * - {@link STSMessageBroker} for request/response communication\n * - {@link RunnerLifecycleManager} for applying runner state updates consistently\n *\n * Typical usage\n * -------------\n * - `GetSyncedWorkers()` when you want the full current worker/runners model\n * - `GetSyncedWorkersCore(states)` when you want a lighter summary view,\n * optionally filtered by runner state\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n eIWMessageCommands,\n IRunnerState,\n ISTSGetRunnersPayload,\n IIWMessagePayloadContentBase,\n IWorkers,\n IWorkerCore,\n} from './commonTypes';\n\nimport { STSMessageBroker } from './messageBroker';\nimport { WorkerRegistry } from './workerRegistry';\nimport { RunnerLifecycleManager } from './runnerLifecycleManager';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link WorkerStateSynchroniser}.\n */\nexport interface IWorkerStateSynchroniserOptions {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared live worker/runner registry.\n *\n * This contains the manager-side runtime graph that will be updated during synchronisation.\n */\n workerRegistry: WorkerRegistry;\n\n /**\n * Shared message broker used to send `GetRunners` requests to workers and await responses.\n */\n messageBroker: STSMessageBroker;\n\n /**\n * Runner lifecycle manager used to apply incoming runner snapshots to live\n * manager-side runner objects in a consistent way.\n */\n runnerLifecycleManager: RunnerLifecycleManager;\n}\n\n/**\n * Synchronises live manager-side worker/runner state with the actual worker runtimes.\n */\nexport class WorkerStateSynchroniser {\n /**\n * Immutable runtime configuration and dependencies.\n */\n private readonly options: IWorkerStateSynchroniserOptions;\n\n /**\n * Construct a new worker state synchroniser.\n *\n * @param options Logger, registry, message broker, and runner lifecycle collaborators.\n */\n constructor(options: IWorkerStateSynchroniserOptions) {\n this.options = options;\n }\n\n /**\n * Synchronise all live workers from their current worker-runtime state.\n *\n * Behaviour\n * ---------\n * 1. Resolve all live workers from the registry\n * 2. Send `GetRunners` to each worker through the message broker\n * 3. Await all worker responses\n * 4. For each returned runner snapshot:\n * - resolve the owning worker from the registry\n * - resolve that worker's live runner map\n * - if the runner exists in the registry, apply the snapshot to the live runner\n * object using `RunnerLifecycleManager.SyncRunnerData(...)`\n *\n * Important notes\n * ---------------\n * - This method only updates existing manager-side runner objects.\n * - It does not create missing runners if a worker returns a runner id that is\n * not already present in the registry.\n * - It assumes the manager-side registry and worker runtime are already aligned\n * in terms of which runners exist.\n *\n * Error handling\n * --------------\n * - Logs and re-throws unexpected errors.\n *\n * @returns Resolves when all workers have been queried and all returned runner snapshots\n * have been applied to the manager-side runtime graph.\n * @throws Re-throws unexpected errors after logging.\n */\n private SyncAllWorkers = async (): Promise<void> => {\n try {\n /**\n * Resolve all live workers.\n *\n * Passing `[]` means \"all workers\" according to the registry convention.\n */\n const workersEx = this.options.workerRegistry.GetWorkersEx([]);\n\n /**\n * Build a broker request promise for each worker.\n *\n * Each worker is asked to return its full current runner list.\n */\n const promArray: Promise<IIWMessagePayloadContentBase>[] = [];\n workersEx.forEach(workerEx =>\n promArray.push(\n this.options.messageBroker.SendMessageToWorkerForWorkerWithCallBack(\n workerEx,\n eIWMessageCommands.GetRunners\n )\n )\n );\n\n /**\n * Wait for all workers to respond.\n *\n * Each payload is expected to be a `ISTSGetRunnersPayload`.\n */\n const retVal = await Promise.all(promArray);\n\n /**\n * Apply returned runner snapshots into the manager-side live runtime graph.\n */\n retVal.forEach((messagePayload: IIWMessagePayloadContentBase) => {\n const payload = messagePayload as ISTSGetRunnersPayload;\n\n const workerEx = this.options.workerRegistry.GetWorker(payload.workerId);\n if (workerEx) {\n const runnersEx = this.options.workerRegistry.GetAllRunnersExMap(workerEx.id);\n if (runnersEx) {\n payload.runners.forEach((runner) => {\n if (runnersEx[runner.id]) {\n this.options.runnerLifecycleManager.SyncRunnerData(\n runnersEx[runner.id],\n runner\n );\n }\n });\n }\n }\n });\n } catch (error) {\n this.options.logger.error(`_SyncWorkerDataFromWorkers(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the full synchronised workers model.\n *\n * Behaviour\n * ---------\n * - First synchronises all workers by querying their current runtime state\n * - Then returns the full serialisable workers map from the registry\n *\n * Returned model\n * --------------\n * The returned `IWorkers` structure includes:\n * - all live workers\n * - each worker's full serialisable runner set\n *\n * @returns Fully synchronised full workers model.\n * @throws Re-throws unexpected errors after logging.\n */\n GetSyncedWorkers = async (): Promise<IWorkers> => {\n try {\n await this.SyncAllWorkers();\n return this.options.workerRegistry.GetWorkersMap();\n } catch (error) {\n this.options.logger.error(`GetWorkers(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the reduced/core synchronised workers model.\n *\n * Behaviour\n * ---------\n * - First synchronises all workers by querying their current runtime state\n * - Then returns the reduced/core workers map from the registry\n *\n * Runner state filtering\n * ----------------------\n * - `undefined` => include all runners\n * - `[]` => include all runners\n * - populated array => include only runners whose state matches one of the supplied states\n *\n * Returned model\n * --------------\n * The returned structure includes a reduced representation of each worker and runner,\n * suitable for lightweight status/dashboard style views.\n *\n * @param states Optional runner-state filter.\n * @returns Fully synchronised reduced/core workers model.\n * @throws Re-throws unexpected errors after logging.\n */\n GetSyncedWorkersCore = async (states?: IRunnerState[]): Promise<Record<string, IWorkerCore>> => {\n try {\n await this.SyncAllWorkers();\n return this.options.workerRegistry.GetWorkersCoreMap(states);\n } catch (error) {\n this.options.logger.error(`GetWorkersCore(): Error: [${error}]`);\n throw error;\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * WorkerCommandCoordinator\n * ------------------------\n * Orchestration component responsible for executing commands across:\n *\n * 1. one or more workers\n * 2. one or more runners within a specific worker\n *\n * This class does not own workers or runners directly. Instead, it coordinates\n * command execution using the shared {@link WorkerRegistry}.\n *\n * Responsibilities:\n * - locate target workers from the registry\n * - fan out a command to multiple workers\n * - fan out a command to multiple runners within a worker\n * - aggregate per-runner results into worker-level result structures\n * - centralise error handling and logging for command orchestration\n *\n * Typical commands handled:\n * - Start\n * - Stop\n * - Pause\n * - Resume\n * - Execute\n * - Reset\n * - Terminate\n * - Update\n *\n * Notes:\n * - Worker-level commands ultimately invoke matching methods on {@link IWorkerEx}\n * - Runner-level commands ultimately invoke matching methods on {@link IRunnerEx}\n * - `Update` is handled specially because it requires `runnerOptions`\n * - An empty `workerIds` or `runnerIds` array is treated as \"all\"\n * for the relevant scope, depending on how the registry/worker methods behave\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n IRunnerOptions,\n IExecuteWorkerActionResult,\n IExecuteRunnerActionResult\n} from './commonTypes';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport { WorkerRegistry } from './workerRegistry';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\n/**\n * Constructor options for {@link WorkerCommandCoordinator}.\n */\nexport interface IWorkerCommandCoordinator {\n /**\n * Logger used for diagnostics and error reporting.\n */\n logger: ISTSLogger;\n\n /**\n * Shared live worker registry used to resolve workers and runners.\n */\n workerRegistry: WorkerRegistry;\n\n /**\n * Id of the top-level worker manager that owns the workers being coordinated.\n *\n * This value is included in worker-level result payloads so callers can\n * trace results back to the manager instance that executed them.\n */\n workerManagerId: string;\n}\n\n/**\n * Central coordinator for worker-level and runner-level command execution.\n *\n * This class is intentionally orchestration-only:\n * - it does not store workers itself\n * - it does not mutate registry structure directly\n * - it does not implement worker/runner business logic\n *\n * Instead, it:\n * - resolves workers/runners from the registry\n * - dispatches command calls to them\n * - collects/normalises the resulting responses\n */\nexport class WorkerCommandCoordinator {\n /**\n * Immutable configuration and dependencies for this coordinator.\n */\n private readonly options: IWorkerCommandCoordinator;\n\n /**\n * Construct a new worker command coordinator.\n *\n * @param options Logger, worker registry, and worker manager id.\n */\n constructor(options: IWorkerCommandCoordinator) {\n this.options = options;\n }\n\n /**\n * Execute the same command against one or more workers.\n *\n * Behaviour:\n * - resolves the target workers from the registry using `workerIds`\n * - invokes the specified command on each worker\n * - waits for all worker command calls to complete\n * - wraps each worker's per-runner result list in an `IExecuteWorkerActionResult`\n * - returns a result entry per worker\n *\n * Command semantics:\n * - For non-`Update` commands, the worker method is invoked with no arguments\n * - For `Update`, the worker method is invoked with `runnerOptions`\n *\n * Worker selection:\n * - The underlying registry method `GetWorkersEx(workerIds)` determines how\n * worker filtering works\n * - In the current design, an empty `workerIds` array typically means \"all workers\"\n *\n * Returned structure:\n * Each result includes:\n * - `workerManagerId`\n * - `workerId`\n * - `executeRunnerActionResults`\n *\n * Error handling:\n * - Errors are logged\n * - The method returns an empty array on failure rather than throwing\n *\n * @param workerIds List of target worker ids. Use `[]` to target all workers, if supported by the registry.\n * @param command Worker command to execute.\n * @param runnerOptions Optional runner option updates, only used for `Update`.\n * @returns Array of worker-level aggregated results.\n */\n public ExecuteWorkerCommands = async (\n workerIds: string[],\n command: 'Start' | 'Stop' | 'Pause' | 'Resume' | 'Execute' | 'Reset' | 'Terminate' | 'Update',\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteWorkerActionResult[]> => {\n this.options.logger.debug(\n `_ProcessWorkerCommands: workerIds: [${workerIds}] command: [${command}`\n );\n\n try {\n /**\n * Promise array holding each worker's command execution result.\n *\n * Each worker command resolves to an array of per-runner results,\n * because worker methods fan out internally to their hosted runners.\n */\n const promArray: Promise<IExecuteRunnerActionResult[]>[] = [];\n\n /**\n * Resolve the target workers from the registry.\n */\n const workers = this.options.workerRegistry.GetWorkersEx(workerIds);\n\n /**\n * Dispatch the requested command to each worker.\n */\n for (let i = 0; i < workers.length; i++) {\n if (command === 'Update') {\n promArray.push(workers[i][command](runnerOptions!));\n } else {\n promArray.push(workers[i][command]());\n }\n }\n\n /**\n * Wait for all worker command executions to complete.\n *\n * Result shape:\n * - one array per worker\n * - each worker array contains per-runner action results\n */\n const retValResult = await Promise.all(promArray);\n\n /**\n * Convert worker results into the higher-level worker action result structure.\n */\n const returnVal: IExecuteWorkerActionResult[] = [];\n\n for (let i = 0; i < workers.length; i++) {\n returnVal.push({\n workerManagerId: this.options.workerManagerId,\n workerId: workers[i].id,\n executeRunnerActionResults: retValResult[i]\n } as IExecuteWorkerActionResult);\n }\n\n return returnVal;\n } catch (error) {\n this.options.logger.error(\n `_ProcessWorkerCommands(): command: [${command}] workerIds: [${workerIds}] Error: [${error}]`\n );\n return [];\n }\n };\n\n /**\n * Execute the same command against one or more runners within a single worker.\n *\n * Behaviour:\n * - resolves the target worker from the registry\n * - if `runnerIds` is empty, executes the worker-level command directly\n * (which applies to all runners in that worker)\n * - otherwise resolves the specific target runners from the worker\n * - invokes the specified command on each target runner\n * - waits for all runner command calls to complete\n * - returns a flat array of per-runner results\n *\n * Command semantics:\n * - For non-`Update` commands, the runner method is invoked with no arguments\n * - For `Update`, the runner method is invoked with `runnerOptions`\n *\n * Runner selection:\n * - If `runnerIds.length === 0`, the worker itself is asked to execute the command\n * across all its runners\n * - Otherwise only runners matching the supplied ids are targeted\n *\n * Error handling:\n * - Errors are logged\n * - The method returns an empty array on failure rather than throwing\n *\n * @param workerId Id of the worker containing the target runners.\n * @param runnerIds List of target runner ids. Use `[]` to target all runners in the worker.\n * @param command Runner command to execute.\n * @param runnerOptions Optional runner option updates, only used for `Update`.\n * @returns Array of per-runner action results.\n */\n ExecuteRunnerCommands = async (\n workerId: string,\n runnerIds: string[],\n command: 'Start' | 'Stop' | 'Pause' | 'Resume' | 'Execute' | 'Reset' | 'Terminate' | 'Update',\n runnerOptions?: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]> => {\n this.options.logger.debug(\n `#ExecuteVariableCommandOnRunners: workerId: [${workerId}] command: [${command} runnerIds: [${runnerIds}]`\n );\n\n try {\n /**\n * Resolve the owning worker from the registry.\n */\n const workersEx = this.options.workerRegistry.GetWorker(workerId);\n\n if (workersEx) {\n /**\n * If no runner ids are specified, delegate to the worker-level command.\n *\n * This is effectively \"run this command against all runners in this worker\".\n */\n if (runnerIds.length === 0) {\n if (command === 'Update') {\n return workersEx[command](runnerOptions!);\n } else {\n return workersEx[command]();\n }\n } else {\n /**\n * Promise array for the selected runner command executions.\n */\n const promArray: Promise<IExecuteRunnerActionResult>[] = [];\n\n /**\n * Resolve only the requested runners from the worker.\n */\n const runners = workersEx.GetRunnersEx(runnerIds);\n\n /**\n * Dispatch the requested command to each selected runner.\n */\n for (let i = 0; i < runners.length; i++) {\n if (command === 'Update') {\n promArray.push(runners[i][command](runnerOptions!));\n } else {\n promArray.push(runners[i][command]());\n }\n }\n\n /**\n * Wait for all selected runner command executions to complete.\n */\n const retValResult = await Promise.all(promArray);\n\n /**\n * Create a new array of per-runner results.\n *\n * The spread ensures the returned result objects are copied.\n */\n const returnVal: IExecuteRunnerActionResult[] = [];\n\n for (let i = 0; i < runners.length; i++) {\n returnVal.push({ ...retValResult[i] });\n }\n\n return returnVal;\n }\n }\n\n /**\n * Worker not found; return no results.\n */\n return [];\n } catch (error) {\n this.options.logger.error(\n `_ExecuteVariableCommandOnRunners(): command: [${command}] workerId: [${workerId}] runnerIds: [${runnerIds}] Error: [${error}]`\n );\n return [];\n }\n };\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n\n/**\n * STSWorkerManager\n * ================\n *\n * Top-level orchestration class for the worker/runner framework.\n *\n * This class is the main manager-side entry point used to:\n *\n * - create and register workers\n * - create and register runners inside workers\n * - coordinate worker-wide and runner-specific commands\n * - synchronise live worker/runner state from worker runtimes\n * - expose archived runner history\n * - coordinate supporting infrastructure such as:\n * - message brokering\n * - worker registry\n * - archive management\n * - runner lifecycle processing\n * - worker state synchronisation\n * - worker command coordination\n *\n * Architectural role\n * ------------------\n * `STSWorkerManager` acts primarily as:\n *\n * - a composition root\n * - a façade\n * - a coordinator entry point\n *\n * It does **not** directly implement all worker or runner behaviour itself.\n * Instead, it composes several more focused collaborators:\n *\n * - {@link WorkerRegistry}\n * - {@link STSMessageBroker}\n * - {@link AsyncRunnerInstanceManager}\n * - {@link ArchiveManager}\n * - {@link WorkerInstanceManager}\n * - {@link RunnerLifecycleManager}\n * - {@link WorkerStateSynchroniser}\n * - {@link WorkerCommandCoordinator}\n *\n * High-level lifecycle\n * --------------------\n * 1. Construct manager and all supporting services\n * 2. Add workers\n * 3. Add runners to workers\n * 4. Start/pause/resume/execute/reset/update/terminate workers or runners\n * 5. Receive telemetry and state changes through broker + lifecycle manager\n * 6. Archive retired runners through archive manager\n * 7. Synchronise state on demand through worker state synchroniser\n *\n * Notes\n * -----\n * - This class owns the manager id.\n * - This class owns the shared registry and shared service instances.\n * - Most public methods are intentionally thin façade methods delegating to\n * more specialised collaborators.\n */\n\n//import MyWorker from './sts-worker?worker' // https://vitejs.dev/guide/features.html#web-workers\nimport {\n eIWMessageCommands,\n IWorkerEx,\n IRunner,\n IRunnerEx,\n IRunnerOptions,\n IWorkerManagerOptions,\n IWorkerFactory,\n IWorkerOptions,\n IRunnerState,\n IExecuteWorkerActionResult,\n IExecuteRunnerActionResult,\n IWorkers,\n IRunnerSearchFilters,\n ISTSWorkerManager,\n IWorkerCore,\n} from './commonTypes';\n\nimport { PublishInstrumentController } from '@nsshunt/stsinstrumentmanagerclient';\n\nimport chalk from 'chalk';\nchalk.level = 3;\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { STSMessageBroker } from './messageBroker';\nimport { AsyncRunnerInstanceManager } from './asyncRunnerInstanceManager';\nimport { ArchiveManager } from './archiveManager';\nimport { WorkerInstanceManager } from './workerInstanceMannager';\nimport { WorkerRegistry } from './workerRegistry';\nimport { RunnerLifecycleManager } from './runnerLifecycleManager';\nimport { WorkerStateSynchroniser } from './workerStateSynchroniser';\nimport { WorkerCommandCoordinator } from './workerCommandCoordinator';\n\n/**\n * Main manager/coordinator for workers and runners.\n *\n * This class implements {@link ISTSWorkerManager} and serves as the primary\n * public API for interacting with the framework from the manager side.\n */\nexport class STSWorkerManager implements ISTSWorkerManager {\n /**\n * Central live worker registry.\n *\n * Owns the manager-side in-memory graph of:\n * - workers\n * - runners\n *\n * Most other manager-side services depend on this shared registry.\n */\n #workerRegistry: WorkerRegistry;\n\n /**\n * Runtime options/configuration for this worker manager.\n */\n #options: IWorkerManagerOptions;\n\n /**\n * Optional root instrumentation publisher.\n *\n * When supplied, child publish controllers may be created for runners.\n */\n #STSInstrumentController?: PublishInstrumentController;\n\n /**\n * Unique id for this worker manager instance.\n *\n * This is included in result payloads and propagated to created worker/runner structures.\n */\n #id: string;\n\n /**\n * Shared message broker used for worker <-> manager request/response\n * and unsolicited message routing.\n */\n #messageBroker: STSMessageBroker;\n\n /**\n * Shared runner factory/creation manager.\n *\n * Responsible for constructing manager-side live runner instances.\n */\n #asyncRunnerInstanceManager: AsyncRunnerInstanceManager;\n\n /**\n * Background archive manager.\n *\n * Responsible for archiving retired runners and removing them from\n * the live worker registry after a delay.\n */\n #archiveManager: ArchiveManager;\n\n /**\n * Worker factory/helper used to create manager-side worker instances\n * and attach native/system runtime event handlers.\n */\n #workerInstanceManager: WorkerInstanceManager;\n\n /**\n * Processes unsolicited runner lifecycle messages such as:\n * - telemetry\n * - state changes\n */\n #runnerLifecycleManager: RunnerLifecycleManager;\n\n /**\n * Synchronises live manager-side worker/runner state from worker runtimes\n * on demand.\n */\n #workerStateSynchroniser: WorkerStateSynchroniser;\n\n /**\n * Executes coordinated commands across:\n * - multiple workers\n * - multiple runners within a worker\n */\n #workerCommandCoordinator: WorkerCommandCoordinator;\n\n /**\n * Construct a new worker manager.\n *\n * Behaviour:\n * - generates a manager id\n * - stores supplied options (or initialises an empty options object)\n * - constructs all shared supporting services\n * - starts the archive processing loop\n *\n * Constructed collaborators:\n * - worker registry\n * - optional instrumentation controller reference\n * - message broker\n * - async runner instance manager\n * - archive manager\n * - worker instance manager\n * - runner lifecycle manager\n * - worker state synchroniser\n * - worker command coordinator\n *\n * @param options Optional worker-manager runtime configuration.\n */\n constructor(options?: IWorkerManagerOptions) {\n this.#id = uuidv4();\n\n if (options) {\n this.#options = options;\n } else {\n this.#options = {} as IWorkerManagerOptions;\n }\n\n this.#workerRegistry = new WorkerRegistry({\n logger: this.#options.logger\n });\n\n if (this.#options.publishInstrumentController) {\n this.#STSInstrumentController = this.#options.publishInstrumentController;\n }\n\n this.#messageBroker = new STSMessageBroker({\n logger: this.options.logger,\n messageTimeout: this.options.messageTimeout\n });\n\n this.#asyncRunnerInstanceManager = new AsyncRunnerInstanceManager({\n instrumentController: this.#STSInstrumentController,\n messageBroker: this.#messageBroker,\n workerManagerId: this.#id\n });\n\n this.#archiveManager = new ArchiveManager({\n logger: this.#options.logger,\n maxArchiveListLength: this.#options.maxArchiveListLength,\n workerRegistry: this.#workerRegistry\n });\n\n /**\n * Start background archive processing immediately.\n */\n this.#archiveManager.ProcessLoopExecutor();\n\n this.#workerInstanceManager = new WorkerInstanceManager({\n asyncRunnerInstanceManager: this.#asyncRunnerInstanceManager,\n logger: this.#options.logger,\n messageBroker: this.#messageBroker,\n workerManagerId: this.#id,\n workerRegistry: this.#workerRegistry\n });\n\n this.#runnerLifecycleManager = new RunnerLifecycleManager({\n logger: this.#options.logger,\n workerRegistry: this.#workerRegistry\n });\n\n this.#workerStateSynchroniser = new WorkerStateSynchroniser({\n logger: this.#options.logger,\n messageBroker: this.#messageBroker,\n runnerLifecycleManager: this.#runnerLifecycleManager,\n workerRegistry: this.#workerRegistry\n });\n\n this.#workerCommandCoordinator = new WorkerCommandCoordinator({\n workerManagerId: this.#id,\n logger: this.#options.logger,\n workerRegistry: this.#workerRegistry\n });\n }\n\n /**\n * Prefix and emit a worker-manager-scoped log message.\n *\n * @param fn Target logger method.\n * @param message Message to write.\n */\n #logMessage = (fn: (message: any) => void, message: string) => {\n fn(`pid: [${process.pid}] STSWorkerManager: ID: [${this.#id}] Log: [${message}]`);\n };\n\n /**\n * Log at debug level when enabled by manager options.\n *\n * @param message Log message.\n */\n #debug = (message: any) => {\n if (this.#options && this.#options.logLevel >= 4) {\n this.#logMessage(this.#options.logger.debug, message);\n }\n };\n\n /**\n * Log at error level when enabled by manager options.\n *\n * @param error Error or message to log.\n */\n #error = (error: any) => {\n if (this.#options && this.#options.logLevel >= 1) {\n this.#logMessage(this.#options.logger.error, error);\n }\n };\n\n /**\n * Get archived runner snapshots filtered by the supplied search criteria.\n *\n * Delegates to the shared {@link ArchiveManager}.\n *\n * Supported filters are defined by {@link IRunnerSearchFilters}.\n *\n * @param runnerSearchFilters Archive search/filter criteria.\n * @returns Matching archived runners.\n */\n GetArchiveList = async (runnerSearchFilters: IRunnerSearchFilters): Promise<IRunner[]> => {\n return this.#archiveManager.GetArchiveList(runnerSearchFilters);\n };\n\n /**\n * Get the unique id for this worker manager instance.\n *\n * @returns Worker manager id.\n */\n get id(): string {\n return this.#id;\n }\n\n /**\n * Resolve the worker factory that should be used for worker creation.\n *\n * Behaviour:\n * - if an explicit `useWorkerFactory` is supplied, it is used\n * - otherwise falls back to the default factory configured in manager options\n *\n * @param useWorkerFactory Optional explicit factory override.\n * @returns Resolved worker factory.\n */\n private ResolveWorkerFactory = (useWorkerFactory?: IWorkerFactory): IWorkerFactory => {\n let workerFactory: IWorkerFactory;\n if (useWorkerFactory) {\n workerFactory = useWorkerFactory;\n } else {\n workerFactory = this.#options.workerFactory;\n }\n return workerFactory;\n };\n\n /**\n * Create a manager-side worker instance and wire its initial message port.\n *\n * Behaviour:\n * - creates the manager-side {@link IWorkerEx} using {@link WorkerInstanceManager}\n * - optionally writes instrumentation log output\n * - logs worker creation details\n * - bootstraps the worker's dedicated message port through the broker\n *\n * Notes:\n * - this method does not register the worker in the registry\n * - this method does not attach system/runtime worker event handlers\n * - both are handled by the caller (`AddWorker`)\n *\n * @param workerOptions Worker-specific runtime options.\n * @param workerFactory Factory used to create the actual worker.\n * @param port1 Manager-side message port.\n * @param port2 Worker-side message port to transfer into the worker runtime.\n * @returns Newly created manager-side worker instance.\n */\n private CreateAndWireWorker = (\n workerOptions: IWorkerOptions,\n workerFactory: IWorkerFactory,\n port1: MessagePort,\n port2: MessagePort\n ): IWorkerEx => {\n const stsWorkerEx: IWorkerEx =\n this.#workerInstanceManager.CreateWorkerInstance(workerOptions, port1, workerFactory);\n\n if (this.#STSInstrumentController) {\n this.#STSInstrumentController.LogEx(\n chalk.yellow(`pid: [${process.pid}] Creating new worker: [${stsWorkerEx.id}]`)\n );\n }\n\n this.#debug(\n `AddWorker::workerThreadWorkerOptions: Worker ID: [${stsWorkerEx.id}] Options: [${stsWorkerEx.options}]`\n );\n\n this.#messageBroker.SetupMessagePort(stsWorkerEx, port2);\n\n return stsWorkerEx;\n };\n\n /**\n * Create and register a new worker.\n *\n * Behaviour:\n * - resolves the worker factory\n * - creates a new dedicated message channel (`port1`, `port2`)\n * - creates and bootstraps the manager-side worker instance\n * - adds the worker to the live worker registry\n * - attaches native/system worker event handlers for real workers\n * - attaches broker message-port listener for unsolicited messages\n * - returns the live manager-side worker instance\n *\n * Notes:\n * - mocked workers do not get system/runtime worker event wiring\n * - unsolicited messages from the worker are processed by a handler produced\n * by {@link RunnerLifecycleManager}\n *\n * @param workerOptions Worker-specific runtime options.\n * @param useWorkerFactory Optional explicit worker factory override.\n * @returns Newly created live worker instance.\n * @throws Re-throws unexpected creation/wiring errors after logging.\n */\n AddWorker = async (workerOptions: IWorkerOptions, useWorkerFactory?: IWorkerFactory): Promise<IWorkerEx> => {\n this.#debug(`AddWorker()`);\n try {\n const workerFactory: IWorkerFactory = this.ResolveWorkerFactory(useWorkerFactory);\n\n const {\n port1, // manager-side message port\n port2 // worker-side message port\n } = this.#messageBroker.GetPorts();\n\n const stsWorkerEx: IWorkerEx =\n this.CreateAndWireWorker(workerOptions, workerFactory, port1, port2);\n\n this.#workerRegistry.AddWorker(stsWorkerEx);\n\n if (!stsWorkerEx.options.mocked) {\n this.#workerInstanceManager.SetupWorkerSystemEvents(stsWorkerEx);\n }\n\n this.#messageBroker.SetupMessagePortListener(\n stsWorkerEx,\n this.#runnerLifecycleManager.ProcessMessageHandlerFactory(stsWorkerEx)\n );\n\n this.#debug(`Added worker: [${stsWorkerEx.id}]`);\n\n return stsWorkerEx;\n } catch (error) {\n this.#error(`AddWorker: Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Create and add a new runner to an existing worker.\n *\n * Behaviour:\n * - creates a new manager-side live runner instance via {@link AsyncRunnerInstanceManager}\n * - adds the runner to the live worker registry\n * - sends `AddRunner` to the underlying worker via the message broker\n * - emits optional instrumentation logging for the new runner\n * - returns the live manager-side runner instance\n *\n * Notes:\n * - the runner is added to the manager-side registry before the brokered add command\n * completes\n * - the worker runtime is expected to create its own corresponding executable runner\n * when it receives the `AddRunner` command\n *\n * @param stsWorkerEx Target worker that will own the runner.\n * @param runnerOptions Runner-specific runtime options.\n * @returns Newly created live runner instance.\n * @throws Re-throws unexpected errors after logging.\n */\n AddRunnerToWorker = async (stsWorkerEx: IWorkerEx, runnerOptions: IRunnerOptions): Promise<IRunnerEx> => {\n this.#debug(`AddRunnerToWorker()`);\n try {\n const runnerEx: IRunnerEx =\n this.#asyncRunnerInstanceManager.CreateAsyncRunner(stsWorkerEx, runnerOptions);\n\n this.#workerRegistry.AddRunner(stsWorkerEx.id, runnerEx);\n\n const retVal = await this.#messageBroker.SendMessageToWorkerForRunnerWithCallBack(\n stsWorkerEx,\n runnerEx,\n eIWMessageCommands.AddRunner\n );\n\n if (runnerEx.publishInstrumentController) {\n runnerEx.publishInstrumentController.LogEx(\n chalk.green(`Added runner: [${runnerEx.id}] into worker: [${stsWorkerEx.id}]`)\n );\n }\n\n if (retVal) {\n this.#debug(\n chalk.green(\n `Added runner: [${runnerEx.id}] into worker: [${stsWorkerEx.id}] result: [${JSON.stringify(retVal)}]`\n )\n );\n }\n\n return runnerEx;\n } catch (error) {\n this.#error(`AddRunnerToWorker(): Error: [${error}]`);\n throw error;\n }\n };\n\n /**\n * Get the current worker-manager options object.\n *\n * @returns Current worker-manager options.\n */\n get options(): IWorkerManagerOptions {\n return this.#options;\n }\n\n /**\n * Replace the current worker-manager options.\n *\n * Notes:\n * - this updates the stored options object\n * - already-created collaborators are not rebuilt automatically\n *\n * @param options New worker-manager options.\n */\n SetOptions(options: IWorkerManagerOptions) {\n this.#options = options;\n }\n\n /**\n * Start one or more workers.\n *\n * Delegates to {@link WorkerCommandCoordinator}.\n *\n * @param workerIds Worker ids to target. Use `[]` for all workers if supported by the registry/coordinator.\n * @returns Worker-level aggregated execution results.\n */\n StartWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Start');\n };\n\n /**\n * Stop one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n StopWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Stop');\n };\n\n /**\n * Pause one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n PauseWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Pause');\n };\n\n /**\n * Resume one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n ResumeWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Resume');\n };\n\n /**\n * Execute one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n ExecuteWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Execute');\n };\n\n /**\n * Reset one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n ResetWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Reset');\n };\n\n /**\n * Terminate one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @returns Worker-level aggregated execution results.\n */\n TerminateWorkers = async (workerIds: string[]): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Terminate');\n };\n\n /**\n * Update runner options across one or more workers.\n *\n * @param workerIds Worker ids to target.\n * @param runnerOptions Partial runner option updates to apply.\n * @returns Worker-level aggregated execution results.\n */\n UpdateWorkers = async (\n workerIds: string[],\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteWorkerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteWorkerCommands(workerIds, 'Update', runnerOptions);\n };\n\n /**\n * Stop one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n StopRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Stop');\n };\n\n /**\n * Start one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n StartRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Start');\n };\n\n /**\n * Pause one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n PauseRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Pause');\n };\n\n /**\n * Resume one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n ResumeRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Resume');\n };\n\n /**\n * Execute one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n ExecuteRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Execute');\n };\n\n /**\n * Reset one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n ResetRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Reset');\n };\n\n /**\n * Terminate one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @returns Per-runner execution results.\n */\n TerminateRunners = async (workerId: string, runnerIds: string[]): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(workerId, runnerIds, 'Terminate');\n };\n\n /**\n * Update one or more runners within a worker.\n *\n * @param workerId Owning worker id.\n * @param runnerIds Runner ids to target.\n * @param runnerOptions Partial runner option updates.\n * @returns Per-runner execution results.\n */\n UpdateRunners = async (\n workerId: string,\n runnerIds: string[],\n runnerOptions: Partial<IRunnerOptions>\n ): Promise<IExecuteRunnerActionResult[]> => {\n return this.#workerCommandCoordinator.ExecuteRunnerCommands(\n workerId,\n runnerIds,\n 'Update',\n runnerOptions\n );\n };\n\n /**\n * Terminate manager-owned background processing.\n *\n * Current behaviour:\n * - stops the archive manager loop\n *\n * Notes:\n * - this does not automatically terminate all workers\n * - callers should explicitly terminate workers first if desired\n */\n Terminate(): void {\n this.options.logger.debug(`STSWorkerManager:Terminate()`);\n this.#archiveManager.Terminate();\n }\n\n /**\n * Get the full current workers model.\n *\n * Behaviour:\n * - synchronises live state from worker runtimes through {@link WorkerStateSynchroniser}\n * - returns the fully populated serialisable workers model\n *\n * @returns Full worker/runners model.\n */\n GetWorkers = async (): Promise<IWorkers> => {\n return this.#workerStateSynchroniser.GetSyncedWorkers();\n };\n\n /**\n * Get the reduced/core workers model.\n *\n * Behaviour:\n * - synchronises live state from worker runtimes through {@link WorkerStateSynchroniser}\n * - returns a reduced/core worker model, optionally filtered by runner state\n *\n * Runner state filtering:\n * - `undefined` => include all runners\n * - `[]` => include all runners\n * - populated array => include only runners whose state matches\n *\n * @param states Optional runner-state filter.\n * @returns Reduced/core workers model.\n */\n GetWorkersCore = async (states?: IRunnerState[]): Promise<Record<string, IWorkerCore>> => {\n return this.#workerStateSynchroniser.GetSyncedWorkersCore(states);\n };\n}"],"x_google_ignoreList":[1,2,3,4,5,6,7,8,9,11,12,13,14,15],"mappings":"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"}
|