@nosana/node 1.0.0-rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -0
- package/dist/.env +7 -0
- package/dist/.env.dev +5 -0
- package/dist/.env.prd +4 -0
- package/dist/NodeManager/client/index.d.ts +4 -0
- package/dist/NodeManager/client/index.js +14 -0
- package/dist/NodeManager/configs/NodeConfigs.d.ts +14 -0
- package/dist/NodeManager/configs/NodeConfigs.js +32 -0
- package/dist/NodeManager/configs/__tests__/NodeConfigs.spec.d.ts +1 -0
- package/dist/NodeManager/configs/__tests__/NodeConfigs.spec.js +161 -0
- package/dist/NodeManager/configs/configs.d.ts +21 -0
- package/dist/NodeManager/configs/configs.js +23 -0
- package/dist/NodeManager/db/__tests__/index.spec.d.ts +1 -0
- package/dist/NodeManager/db/__tests__/index.spec.js +65 -0
- package/dist/NodeManager/db/index.d.ts +50 -0
- package/dist/NodeManager/db/index.js +64 -0
- package/dist/NodeManager/errors/NodeAlreadyActiveError.d.ts +3 -0
- package/dist/NodeManager/errors/NodeAlreadyActiveError.js +6 -0
- package/dist/NodeManager/index.d.ts +24 -0
- package/dist/NodeManager/index.js +317 -0
- package/dist/NodeManager/jobs/index.d.ts +6 -0
- package/dist/NodeManager/jobs/index.js +45 -0
- package/dist/NodeManager/monitoring/LogMonitoringRegistry.d.ts +9 -0
- package/dist/NodeManager/monitoring/LogMonitoringRegistry.js +23 -0
- package/dist/NodeManager/monitoring/log/NodeLog.d.ts +56 -0
- package/dist/NodeManager/monitoring/log/NodeLog.js +1357 -0
- package/dist/NodeManager/monitoring/log/console/ConsoleLogger.d.ts +20 -0
- package/dist/NodeManager/monitoring/log/console/ConsoleLogger.js +290 -0
- package/dist/NodeManager/monitoring/ping/PingHandler.d.ts +13 -0
- package/dist/NodeManager/monitoring/ping/PingHandler.js +68 -0
- package/dist/NodeManager/monitoring/proxy/loggingProxy.d.ts +15 -0
- package/dist/NodeManager/monitoring/proxy/loggingProxy.js +145 -0
- package/dist/NodeManager/monitoring/state/NodeState.d.ts +29 -0
- package/dist/NodeManager/monitoring/state/NodeState.js +680 -0
- package/dist/NodeManager/monitoring/state/classifyState.d.ts +14 -0
- package/dist/NodeManager/monitoring/state/classifyState.js +57 -0
- package/dist/NodeManager/monitoring/streaming/LogStreamer.d.ts +14 -0
- package/dist/NodeManager/monitoring/streaming/LogStreamer.js +58 -0
- package/dist/NodeManager/monitoring/streaming/StateStreamer.d.ts +15 -0
- package/dist/NodeManager/monitoring/streaming/StateStreamer.js +59 -0
- package/dist/NodeManager/node/Node.d.ts +44 -0
- package/dist/NodeManager/node/Node.js +321 -0
- package/dist/NodeManager/node/abort/NodeAbortController.d.ts +6 -0
- package/dist/NodeManager/node/abort/NodeAbortController.js +12 -0
- package/dist/NodeManager/node/abort/abortControllerSelector.d.ts +3 -0
- package/dist/NodeManager/node/abort/abortControllerSelector.js +13 -0
- package/dist/NodeManager/node/api/ApiEventEmitter.d.ts +8 -0
- package/dist/NodeManager/node/api/ApiEventEmitter.js +13 -0
- package/dist/NodeManager/node/api/ApiHandler.d.ts +28 -0
- package/dist/NodeManager/node/api/ApiHandler.js +193 -0
- package/dist/NodeManager/node/api/eventsource/index.d.ts +6 -0
- package/dist/NodeManager/node/api/eventsource/index.js +35 -0
- package/dist/NodeManager/node/api/middlewares/index.d.ts +5 -0
- package/dist/NodeManager/node/api/middlewares/index.js +7 -0
- package/dist/NodeManager/node/api/middlewares/rest/verifyBackendSignatureMiddleware.d.ts +3 -0
- package/dist/NodeManager/node/api/middlewares/rest/verifyBackendSignatureMiddleware.js +20 -0
- package/dist/NodeManager/node/api/middlewares/rest/verifyJobOwnerSignatureMiddleware.d.ts +5 -0
- package/dist/NodeManager/node/api/middlewares/rest/verifyJobOwnerSignatureMiddleware.js +28 -0
- package/dist/NodeManager/node/api/middlewares/ws/verifyWSJobOwnerSignatureMiddleware.d.ts +6 -0
- package/dist/NodeManager/node/api/middlewares/ws/verifyWSJobOwnerSignatureMiddleware.js +30 -0
- package/dist/NodeManager/node/api/middlewares/ws/verifyWSMiddleware.d.ts +6 -0
- package/dist/NodeManager/node/api/middlewares/ws/verifyWSMiddleware.js +20 -0
- package/dist/NodeManager/node/api/middlewares/ws/verifyWSNodeOrJobOwnerSignatureMiddleware.d.ts +6 -0
- package/dist/NodeManager/node/api/middlewares/ws/verifyWSNodeOrJobOwnerSignatureMiddleware.js +33 -0
- package/dist/NodeManager/node/api/routes/get/index.d.ts +6 -0
- package/dist/NodeManager/node/api/routes/get/index.js +6 -0
- package/dist/NodeManager/node/api/routes/get/job-definition.d.ts +5 -0
- package/dist/NodeManager/node/api/routes/get/job-definition.js +16 -0
- package/dist/NodeManager/node/api/routes/get/job-info/buildInfoObject.d.ts +17 -0
- package/dist/NodeManager/node/api/routes/get/job-info/buildInfoObject.js +15 -0
- package/dist/NodeManager/node/api/routes/get/job-info/job-info.d.ts +5 -0
- package/dist/NodeManager/node/api/routes/get/job-info/job-info.js +18 -0
- package/dist/NodeManager/node/api/routes/get/job-info/pollActiveJob.d.ts +6 -0
- package/dist/NodeManager/node/api/routes/get/job-info/pollActiveJob.js +42 -0
- package/dist/NodeManager/node/api/routes/get/job-operation-info.d.ts +28 -0
- package/dist/NodeManager/node/api/routes/get/job-operation-info.js +53 -0
- package/dist/NodeManager/node/api/routes/get/job-results.d.ts +5 -0
- package/dist/NodeManager/node/api/routes/get/job-results.js +15 -0
- package/dist/NodeManager/node/api/routes/get/node-info.d.ts +3 -0
- package/dist/NodeManager/node/api/routes/get/node-info.js +23 -0
- package/dist/NodeManager/node/api/routes/get/service-url.d.ts +5 -0
- package/dist/NodeManager/node/api/routes/get/service-url.js +27 -0
- package/dist/NodeManager/node/api/routes/index.d.ts +3 -0
- package/dist/NodeManager/node/api/routes/index.js +3 -0
- package/dist/NodeManager/node/api/routes/post/index.d.ts +4 -0
- package/dist/NodeManager/node/api/routes/post/index.js +4 -0
- package/dist/NodeManager/node/api/routes/post/job-definition.d.ts +6 -0
- package/dist/NodeManager/node/api/routes/post/job-definition.js +15 -0
- package/dist/NodeManager/node/api/routes/post/job-operation-actions.d.ts +24 -0
- package/dist/NodeManager/node/api/routes/post/job-operation-actions.js +79 -0
- package/dist/NodeManager/node/api/routes/post/node-validation.d.ts +4 -0
- package/dist/NodeManager/node/api/routes/post/node-validation.js +1783 -0
- package/dist/NodeManager/node/api/routes/post/service-stop.d.ts +5 -0
- package/dist/NodeManager/node/api/routes/post/service-stop.js +13 -0
- package/dist/NodeManager/node/api/routes/wss/index.d.ts +2 -0
- package/dist/NodeManager/node/api/routes/wss/index.js +2 -0
- package/dist/NodeManager/node/api/routes/wss/log.d.ts +14 -0
- package/dist/NodeManager/node/api/routes/wss/log.js +34 -0
- package/dist/NodeManager/node/api/routes/wss/status.d.ts +8 -0
- package/dist/NodeManager/node/api/routes/wss/status.js +11 -0
- package/dist/NodeManager/node/api/types/index.d.ts +12 -0
- package/dist/NodeManager/node/api/types/index.js +1 -0
- package/dist/NodeManager/node/balance/balanceHandler.d.ts +12 -0
- package/dist/NodeManager/node/balance/balanceHandler.js +52 -0
- package/dist/NodeManager/node/expiry/expiryHandler.d.ts +24 -0
- package/dist/NodeManager/node/expiry/expiryHandler.js +99 -0
- package/dist/NodeManager/node/grid/gridHandler.d.ts +19 -0
- package/dist/NodeManager/node/grid/gridHandler.js +168 -0
- package/dist/NodeManager/node/health/healthHandler.d.ts +16 -0
- package/dist/NodeManager/node/health/healthHandler.js +69 -0
- package/dist/NodeManager/node/job/JobRegistry.d.ts +14 -0
- package/dist/NodeManager/node/job/JobRegistry.js +48 -0
- package/dist/NodeManager/node/job/defination/JobDefinitionStrategy.d.ts +13 -0
- package/dist/NodeManager/node/job/defination/JobDefinitionStrategy.js +21 -0
- package/dist/NodeManager/node/job/defination/strategy/ApiJobDefinitionStrategy.d.ts +8 -0
- package/dist/NodeManager/node/job/defination/strategy/ApiJobDefinitionStrategy.js +40 -0
- package/dist/NodeManager/node/job/defination/strategy/ApiListenJobDefinitionStrategy.d.ts +9 -0
- package/dist/NodeManager/node/job/defination/strategy/ApiListenJobDefinitionStrategy.js +16 -0
- package/dist/NodeManager/node/job/defination/strategy/IpfsJobDefinitionStrategy.d.ts +7 -0
- package/dist/NodeManager/node/job/defination/strategy/IpfsJobDefinitionStrategy.js +13 -0
- package/dist/NodeManager/node/job/jobExternalUtil.d.ts +10 -0
- package/dist/NodeManager/node/job/jobExternalUtil.js +82 -0
- package/dist/NodeManager/node/job/jobHandler.d.ts +43 -0
- package/dist/NodeManager/node/job/jobHandler.js +193 -0
- package/dist/NodeManager/node/job/result/ResultReturnStrategy.d.ts +13 -0
- package/dist/NodeManager/node/job/result/ResultReturnStrategy.js +21 -0
- package/dist/NodeManager/node/job/result/startegy/ApiListenResultReturnStrategy.d.ts +8 -0
- package/dist/NodeManager/node/job/result/startegy/ApiListenResultReturnStrategy.js +22 -0
- package/dist/NodeManager/node/job/result/startegy/ApiResultReturnStrategy.d.ts +8 -0
- package/dist/NodeManager/node/job/result/startegy/ApiResultReturnStrategy.js +42 -0
- package/dist/NodeManager/node/key/keyHandler.d.ts +16 -0
- package/dist/NodeManager/node/key/keyHandler.js +74 -0
- package/dist/NodeManager/node/market/marketHandler.d.ts +30 -0
- package/dist/NodeManager/node/market/marketHandler.js +137 -0
- package/dist/NodeManager/node/register/index.d.ts +16 -0
- package/dist/NodeManager/node/register/index.js +88 -0
- package/dist/NodeManager/node/resource/definition/index.d.ts +2 -0
- package/dist/NodeManager/node/resource/definition/index.js +2 -0
- package/dist/NodeManager/node/resource/helpers/createHFArgs.d.ts +6 -0
- package/dist/NodeManager/node/resource/helpers/createHFArgs.js +26 -0
- package/dist/NodeManager/node/resource/helpers/createOllamaArgs.d.ts +2 -0
- package/dist/NodeManager/node/resource/helpers/createOllamaArgs.js +20 -0
- package/dist/NodeManager/node/resource/helpers/createResourceName.d.ts +2 -0
- package/dist/NodeManager/node/resource/helpers/createResourceName.js +18 -0
- package/dist/NodeManager/node/resource/helpers/createS3Args.d.ts +7 -0
- package/dist/NodeManager/node/resource/helpers/createS3Args.js +32 -0
- package/dist/NodeManager/node/resource/helpers/hasDockerVolume.d.ts +2 -0
- package/dist/NodeManager/node/resource/helpers/hasDockerVolume.js +3 -0
- package/dist/NodeManager/node/resource/helpers/hoursSunceDate.d.ts +1 -0
- package/dist/NodeManager/node/resource/helpers/hoursSunceDate.js +3 -0
- package/dist/NodeManager/node/resource/helpers/repoTagsContainsImage.d.ts +1 -0
- package/dist/NodeManager/node/resource/helpers/repoTagsContainsImage.js +13 -0
- package/dist/NodeManager/node/resource/image/imageManager.d.ts +13 -0
- package/dist/NodeManager/node/resource/image/imageManager.js +66 -0
- package/dist/NodeManager/node/resource/resourceManager.d.ts +21 -0
- package/dist/NodeManager/node/resource/resourceManager.js +57 -0
- package/dist/NodeManager/node/resource/volume/volumeManager.d.ts +20 -0
- package/dist/NodeManager/node/resource/volume/volumeManager.js +228 -0
- package/dist/NodeManager/node/run/runHandler.d.ts +18 -0
- package/dist/NodeManager/node/run/runHandler.js +139 -0
- package/dist/NodeManager/node/specs/specsHandler.d.ts +17 -0
- package/dist/NodeManager/node/specs/specsHandler.js +135 -0
- package/dist/NodeManager/node/specs/type.d.ts +15 -0
- package/dist/NodeManager/node/specs/type.js +1 -0
- package/dist/NodeManager/node/stake/StakeHandler.d.ts +22 -0
- package/dist/NodeManager/node/stake/StakeHandler.js +111 -0
- package/dist/NodeManager/node/task/TaskManager.d.ts +267 -0
- package/dist/NodeManager/node/task/TaskManager.js +480 -0
- package/dist/NodeManager/node/task/TaskManagerRegistry.d.ts +49 -0
- package/dist/NodeManager/node/task/TaskManagerRegistry.js +68 -0
- package/dist/NodeManager/node/task/executions/createDependencyMap.d.ts +18 -0
- package/dist/NodeManager/node/task/executions/createDependencyMap.js +32 -0
- package/dist/NodeManager/node/task/executions/createExecutionPlan.d.ts +14 -0
- package/dist/NodeManager/node/task/executions/createExecutionPlan.js +36 -0
- package/dist/NodeManager/node/task/executions/createOperationMap.d.ts +11 -0
- package/dist/NodeManager/node/task/executions/createOperationMap.js +34 -0
- package/dist/NodeManager/node/task/executions/validateExecutionPlan.d.ts +12 -0
- package/dist/NodeManager/node/task/executions/validateExecutionPlan.js +48 -0
- package/dist/NodeManager/node/task/globalStore/finalizeEnv.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/finalizeEnv.js +30 -0
- package/dist/NodeManager/node/task/globalStore/getByPath.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/getByPath.js +12 -0
- package/dist/NodeManager/node/task/globalStore/index.d.ts +9 -0
- package/dist/NodeManager/node/task/globalStore/index.js +9 -0
- package/dist/NodeManager/node/task/globalStore/interpolate.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/interpolate.js +16 -0
- package/dist/NodeManager/node/task/globalStore/interpolateOperation.d.ts +3 -0
- package/dist/NodeManager/node/task/globalStore/interpolateOperation.js +221 -0
- package/dist/NodeManager/node/task/globalStore/resolveLiteralsInString.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/resolveLiteralsInString.js +7 -0
- package/dist/NodeManager/node/task/globalStore/setDefaults.d.ts +4 -0
- package/dist/NodeManager/node/task/globalStore/setDefaults.js +65 -0
- package/dist/NodeManager/node/task/globalStore/setHost.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/setHost.js +9 -0
- package/dist/NodeManager/node/task/globalStore/setResult.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/setResult.js +10 -0
- package/dist/NodeManager/node/task/globalStore/setResults.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/setResults.js +9 -0
- package/dist/NodeManager/node/task/globalStore/stanatizeArrays.d.ts +2 -0
- package/dist/NodeManager/node/task/globalStore/stanatizeArrays.js +14 -0
- package/dist/NodeManager/node/task/globalStore/transformCollections.d.ts +13 -0
- package/dist/NodeManager/node/task/globalStore/transformCollections.js +152 -0
- package/dist/NodeManager/node/task/helpers/createDefaultOpState.d.ts +2 -0
- package/dist/NodeManager/node/task/helpers/createDefaultOpState.js +20 -0
- package/dist/NodeManager/node/task/helpers/createInitialFlow.d.ts +8 -0
- package/dist/NodeManager/node/task/helpers/createInitialFlow.js +24 -0
- package/dist/NodeManager/node/task/loggers/logManager.d.ts +8 -0
- package/dist/NodeManager/node/task/loggers/logManager.js +54 -0
- package/dist/NodeManager/node/task/operations/getOperationsInfos.d.ts +6 -0
- package/dist/NodeManager/node/task/operations/getOperationsInfos.js +33 -0
- package/dist/NodeManager/node/task/operations/moveTaskManagerGroupOperation.d.ts +2 -0
- package/dist/NodeManager/node/task/operations/moveTaskManagerGroupOperation.js +65 -0
- package/dist/NodeManager/node/task/operations/restartTaskManagerGroupOperation.d.ts +10 -0
- package/dist/NodeManager/node/task/operations/restartTaskManagerGroupOperation.js +37 -0
- package/dist/NodeManager/node/task/operations/restartTaskManagerOperation.d.ts +14 -0
- package/dist/NodeManager/node/task/operations/restartTaskManagerOperation.js +117 -0
- package/dist/NodeManager/node/task/operations/runTaskManagerOperation.d.ts +21 -0
- package/dist/NodeManager/node/task/operations/runTaskManagerOperation.js +488 -0
- package/dist/NodeManager/node/task/operations/stopAllTaskManagerOperations.d.ts +21 -0
- package/dist/NodeManager/node/task/operations/stopAllTaskManagerOperations.js +54 -0
- package/dist/NodeManager/node/task/operations/stopTaskManagerGroupOperation.d.ts +10 -0
- package/dist/NodeManager/node/task/operations/stopTaskManagerGroupOperation.js +43 -0
- package/dist/NodeManager/node/task/operations/stopTaskManagerOperation.d.ts +14 -0
- package/dist/NodeManager/node/task/operations/stopTaskManagerOperation.js +137 -0
- package/dist/NodeManager/node/utils/convertFromBytes.d.ts +4 -0
- package/dist/NodeManager/node/utils/convertFromBytes.js +11 -0
- package/dist/NodeManager/node/utils/extractLogsAndResultsFromLogBuffer.d.ts +7 -0
- package/dist/NodeManager/node/utils/extractLogsAndResultsFromLogBuffer.js +34 -0
- package/dist/NodeManager/node/utils/extractResultsFromLogs.d.ts +18 -0
- package/dist/NodeManager/node/utils/extractResultsFromLogs.js +37 -0
- package/dist/NodeManager/node/utils/generateRandomId.d.ts +1 -0
- package/dist/NodeManager/node/utils/generateRandomId.js +3 -0
- package/dist/NodeManager/node/utils/multiProgressBarReporter.d.ts +16 -0
- package/dist/NodeManager/node/utils/multiProgressBarReporter.js +22 -0
- package/dist/NodeManager/node/utils/poll.d.ts +5 -0
- package/dist/NodeManager/node/utils/poll.js +25 -0
- package/dist/NodeManager/node/utils/progressBarReporter.d.ts +9 -0
- package/dist/NodeManager/node/utils/progressBarReporter.js +28 -0
- package/dist/NodeManager/provider/ContainerStateManager.d.ts +24 -0
- package/dist/NodeManager/provider/ContainerStateManager.js +122 -0
- package/dist/NodeManager/provider/ExposedPortHealthCheck.d.ts +29 -0
- package/dist/NodeManager/provider/ExposedPortHealthCheck.js +183 -0
- package/dist/NodeManager/provider/Provider.d.ts +70 -0
- package/dist/NodeManager/provider/Provider.js +457 -0
- package/dist/NodeManager/provider/__tests__/Provider.spec.d.ts +1 -0
- package/dist/NodeManager/provider/__tests__/Provider.spec.js +337 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/dockerExtended/index.d.ts +6 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/dockerExtended/index.js +45 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/index.d.ts +43 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/index.js +366 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/utils/createServerObject.d.ts +5 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/utils/createServerObject.js +15 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/utils/deadline.d.ts +1 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/utils/deadline.js +15 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/utils/repoTagsContainsImage.d.ts +1 -0
- package/dist/NodeManager/provider/containerOrchestration/docker/utils/repoTagsContainsImage.js +13 -0
- package/dist/NodeManager/provider/containerOrchestration/interface.d.ts +53 -0
- package/dist/NodeManager/provider/containerOrchestration/interface.js +1 -0
- package/dist/NodeManager/provider/containerOrchestration/podman/index.d.ts +11 -0
- package/dist/NodeManager/provider/containerOrchestration/podman/index.js +69 -0
- package/dist/NodeManager/provider/containerOrchestration/podman/utils/createPodmanRunOptions.d.ts +103 -0
- package/dist/NodeManager/provider/containerOrchestration/podman/utils/createPodmanRunOptions.js +66 -0
- package/dist/NodeManager/provider/containerOrchestration/selectContainerOrchestration.d.ts +2 -0
- package/dist/NodeManager/provider/containerOrchestration/selectContainerOrchestration.js +11 -0
- package/dist/NodeManager/provider/types.d.ts +18 -0
- package/dist/NodeManager/provider/types.js +1 -0
- package/dist/NodeManager/provider/utils/parseBuffer.d.ts +4 -0
- package/dist/NodeManager/provider/utils/parseBuffer.js +19 -0
- package/dist/NodeManager/repository/NodeRepository.d.ts +53 -0
- package/dist/NodeManager/repository/NodeRepository.js +153 -0
- package/dist/NodeManager/sdk/index.d.ts +9 -0
- package/dist/NodeManager/sdk/index.js +146 -0
- package/dist/NodeManager/types/index.d.ts +27 -0
- package/dist/NodeManager/types/index.js +1 -0
- package/dist/NodeManager/utils/convertFromBytes.d.ts +4 -0
- package/dist/NodeManager/utils/convertFromBytes.js +11 -0
- package/dist/NodeManager/utils/expose-util.d.ts +14 -0
- package/dist/NodeManager/utils/expose-util.js +88 -0
- package/dist/NodeManager/utils/jobDefinitionParser.d.ts +12 -0
- package/dist/NodeManager/utils/jobDefinitionParser.js +31 -0
- package/dist/NodeManager/utils/ops-util.d.ts +3 -0
- package/dist/NodeManager/utils/ops-util.js +19 -0
- package/dist/NodeManager/utils/timeoutPromiseWrapper.d.ts +1 -0
- package/dist/NodeManager/utils/timeoutPromiseWrapper.js +27 -0
- package/dist/NodeManager/utils/utils.d.ts +39 -0
- package/dist/NodeManager/utils/utils.js +107 -0
- package/dist/NodeManager/utils/wslCheck.d.ts +14 -0
- package/dist/NodeManager/utils/wslCheck.js +54 -0
- package/dist/cli/address/__tests__/command.spec.d.ts +1 -0
- package/dist/cli/address/__tests__/command.spec.js +33 -0
- package/dist/cli/address/action.d.ts +4 -0
- package/dist/cli/address/action.js +4 -0
- package/dist/cli/address/command.d.ts +2 -0
- package/dist/cli/address/command.js +9 -0
- package/dist/cli/createNosanaCli.d.ts +2 -0
- package/dist/cli/createNosanaCli.js +32 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/node/__tests__/index.spec.d.ts +1 -0
- package/dist/cli/node/__tests__/index.spec.js +10 -0
- package/dist/cli/node/index.d.ts +5 -0
- package/dist/cli/node/index.js +12 -0
- package/dist/cli/node/prune/action.d.ts +4 -0
- package/dist/cli/node/prune/action.js +18 -0
- package/dist/cli/node/prune/command.d.ts +2 -0
- package/dist/cli/node/prune/command.js +10 -0
- package/dist/cli/node/run/__tests__/command.spec.d.ts +1 -0
- package/dist/cli/node/run/__tests__/command.spec.js +38 -0
- package/dist/cli/node/run/action.d.ts +3 -0
- package/dist/cli/node/run/action.js +82 -0
- package/dist/cli/node/run/command.d.ts +3 -0
- package/dist/cli/node/run/command.js +17 -0
- package/dist/cli/node/run/generateDeploymentEndpointsTable.d.ts +2 -0
- package/dist/cli/node/run/generateDeploymentEndpointsTable.js +45 -0
- package/dist/cli/node/start/__tests__/command.spec.d.ts +1 -0
- package/dist/cli/node/start/__tests__/command.spec.js +39 -0
- package/dist/cli/node/start/action.d.ts +4 -0
- package/dist/cli/node/start/action.js +48 -0
- package/dist/cli/node/start/command.d.ts +3 -0
- package/dist/cli/node/start/command.js +19 -0
- package/dist/cli/sharedOptions/--api.d.ts +2 -0
- package/dist/cli/sharedOptions/--api.js +2 -0
- package/dist/cli/sharedOptions/--format.d.ts +2 -0
- package/dist/cli/sharedOptions/--format.js +4 -0
- package/dist/cli/sharedOptions/--gpu.d.ts +2 -0
- package/dist/cli/sharedOptions/--gpu.js +12 -0
- package/dist/cli/sharedOptions/--network.d.ts +2 -0
- package/dist/cli/sharedOptions/--network.js +4 -0
- package/dist/cli/sharedOptions/--port.d.ts +2 -0
- package/dist/cli/sharedOptions/--port.js +2 -0
- package/dist/cli/sharedOptions/--rpc.d.ts +2 -0
- package/dist/cli/sharedOptions/--rpc.js +2 -0
- package/dist/cli/sharedOptions/--timeout.d.ts +2 -0
- package/dist/cli/sharedOptions/--timeout.js +12 -0
- package/dist/cli/sharedOptions/--verbose.d.ts +2 -0
- package/dist/cli/sharedOptions/--verbose.js +2 -0
- package/dist/cli/sharedOptions/--wallet.d.ts +2 -0
- package/dist/cli/sharedOptions/--wallet.js +2 -0
- package/dist/cli/sharedOptions/index.d.ts +7 -0
- package/dist/cli/sharedOptions/index.js +8 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -0
- package/dist/output-formatter/OutputFormatter.d.ts +61 -0
- package/dist/output-formatter/OutputFormatter.js +58 -0
- package/dist/output-formatter/OutputFormatterFactory.d.ts +4 -0
- package/dist/output-formatter/OutputFormatterFactory.js +18 -0
- package/dist/output-formatter/__mocks__/outputEvents.mock.d.ts +42 -0
- package/dist/output-formatter/__mocks__/outputEvents.mock.js +45 -0
- package/dist/output-formatter/__mocks__/outputFormatter.mock.d.ts +0 -0
- package/dist/output-formatter/__mocks__/outputFormatter.mock.js +21 -0
- package/dist/output-formatter/__tests__/OutputFormatter.spec.d.ts +1 -0
- package/dist/output-formatter/__tests__/OutputFormatter.spec.js +34 -0
- package/dist/output-formatter/__tests__/OutputFormatterFactory.spec.d.ts +1 -0
- package/dist/output-formatter/__tests__/OutputFormatterFactory.spec.js +26 -0
- package/dist/output-formatter/__tests__/outputFormatSelector.spec.d.ts +1 -0
- package/dist/output-formatter/__tests__/outputFormatSelector.spec.js +21 -0
- package/dist/output-formatter/json/JsonOutputEventHandlers.d.ts +8 -0
- package/dist/output-formatter/json/JsonOutputEventHandlers.js +191 -0
- package/dist/output-formatter/json/JsonOutputFormatter.d.ts +47 -0
- package/dist/output-formatter/json/JsonOutputFormatter.js +12 -0
- package/dist/output-formatter/json/__tests__/JsonOutputFormatter.spec.d.ts +1 -0
- package/dist/output-formatter/json/__tests__/JsonOutputFormatter.spec.js +36 -0
- package/dist/output-formatter/outputEvents.d.ts +213 -0
- package/dist/output-formatter/outputEvents.js +63 -0
- package/dist/output-formatter/outputFormatArgumentParser.d.ts +1 -0
- package/dist/output-formatter/outputFormatArgumentParser.js +10 -0
- package/dist/output-formatter/outputFormatSelector.d.ts +15 -0
- package/dist/output-formatter/outputFormatSelector.js +23 -0
- package/dist/output-formatter/text/TextOutputEventHandlers.d.ts +7 -0
- package/dist/output-formatter/text/TextOutputEventHandlers.js +128 -0
- package/dist/output-formatter/text/TextOutputFormatter.d.ts +6 -0
- package/dist/output-formatter/text/TextOutputFormatter.js +7 -0
- package/dist/output-formatter/text/VerboseTextOutputEventHandlers.d.ts +7 -0
- package/dist/output-formatter/text/VerboseTextOutputEventHandlers.js +138 -0
- package/dist/output-formatter/text/VerboseTextOutputFormatter.d.ts +6 -0
- package/dist/output-formatter/text/VerboseTextOutputFormatter.js +7 -0
- package/dist/output-formatter/text/__tests__/TextOutputFormatter.spec.d.ts +1 -0
- package/dist/output-formatter/text/__tests__/TextOutputFormatter.spec.js +25 -0
- package/dist/static/index.d.ts +7 -0
- package/dist/static/index.js +12 -0
- package/dist/version/index.d.ts +1 -0
- package/dist/version/index.js +47 -0
- package/npm-shrinkwrap.json +9928 -0
- package/package.json +102 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { Statuses, OperationProgressStatuses, StopReasons, } from '../TaskManager.js';
|
|
3
|
+
import { finalizeEnvOnOperation } from '../globalStore/finalizeEnv.js';
|
|
4
|
+
import { createResultsObject, extractResultFromLog, } from '../../utils/extractResultsFromLogs.js';
|
|
5
|
+
import { stanatizeArrays } from '../globalStore/stanatizeArrays.js';
|
|
6
|
+
import { logEmitter } from '../../../monitoring/proxy/loggingProxy.js';
|
|
7
|
+
/**
|
|
8
|
+
* Executes a full lifecycle of a container-based operation using internal class state.
|
|
9
|
+
*
|
|
10
|
+
* This function is intended to be bound to a `TaskManager` instance using `.bind(this)`.
|
|
11
|
+
* It handles:
|
|
12
|
+
* - Setup
|
|
13
|
+
* - Log streaming
|
|
14
|
+
* - Abort controller registration
|
|
15
|
+
* - Container execution
|
|
16
|
+
* - Exit/error handling
|
|
17
|
+
* - Cleanup
|
|
18
|
+
*
|
|
19
|
+
* It uses internal state like `this.repository`, `this.provider`, `this.job`, etc.,
|
|
20
|
+
* and serves as the core execution driver for all operations.
|
|
21
|
+
*
|
|
22
|
+
* Keeps lifecycle doc comments in sync with original `setUpOperationFunc`.
|
|
23
|
+
*/
|
|
24
|
+
export async function runTaskManagerOperation(flow, op, dependent) {
|
|
25
|
+
/**
|
|
26
|
+
* Retrieves the index of the operation within the job definition's ops array.
|
|
27
|
+
*
|
|
28
|
+
* This index is used to look up and update the operation's state in the repository.
|
|
29
|
+
* It's necessary because the repository stores op states in an array, not a map,
|
|
30
|
+
* so index-based access is required for performance and mutation.
|
|
31
|
+
*
|
|
32
|
+
* The `getOpStateIndex` method is passed from the TaskManager to maintain context
|
|
33
|
+
* and ensure consistent lookup logic throughout the system.
|
|
34
|
+
*/
|
|
35
|
+
const index = this.getOpStateIndex(op.id);
|
|
36
|
+
/**
|
|
37
|
+
* Creates a new EventEmitter instance that serves as the communication channel
|
|
38
|
+
* for the lifecycle of this operation.
|
|
39
|
+
* This emitter is used to handle logs, update operation state, and respond to various
|
|
40
|
+
* execution events like 'start', 'exit', 'error', and 'end'.
|
|
41
|
+
*/
|
|
42
|
+
const emitter = new EventEmitter();
|
|
43
|
+
// register the emitter
|
|
44
|
+
this.registerAndRelayOpEmitter(op.id, emitter);
|
|
45
|
+
/**
|
|
46
|
+
* Initializes and registers an AbortController specific to this operation ID.
|
|
47
|
+
* This controller is used to handle cancellation of the operation.
|
|
48
|
+
* It is tied to the main task manager's AbortController, so a global stop
|
|
49
|
+
* will also trigger this one unless already aborted.
|
|
50
|
+
*/
|
|
51
|
+
const abort = new AbortController();
|
|
52
|
+
const handleMainAbort = () => {
|
|
53
|
+
emitter.emit('log', 'Operation Stopping', 'info');
|
|
54
|
+
this.operationStatus.set(op.id, OperationProgressStatuses.STOPPING);
|
|
55
|
+
abort.abort(this.mainAbortController.signal.reason);
|
|
56
|
+
if ([StopReasons.EXPIRED, StopReasons.STOPPED, StopReasons.QUIT].includes(this.mainAbortController.signal.reason)) {
|
|
57
|
+
this.repository.setOpStateDiagnosticsReason(this.job, index, {
|
|
58
|
+
...(this.mainAbortController.signal.reason === StopReasons.EXPIRED
|
|
59
|
+
? { jobExpired: true }
|
|
60
|
+
: {}),
|
|
61
|
+
...(this.mainAbortController.signal.reason === StopReasons.STOPPED
|
|
62
|
+
? { jobStopped: true }
|
|
63
|
+
: {}),
|
|
64
|
+
...(this.mainAbortController.signal.reason === StopReasons.QUIT
|
|
65
|
+
? { hostShutDown: true }
|
|
66
|
+
: {}),
|
|
67
|
+
reason: `Operation stopped due to flow ${this.mainAbortController.signal.reason}`,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
this.mainAbortController.signal.addEventListener('abort', handleMainAbort);
|
|
72
|
+
this.abortControllerMap.set(op.id, abort);
|
|
73
|
+
/**
|
|
74
|
+
* quit the operation if the main controller is already emmited
|
|
75
|
+
*/
|
|
76
|
+
if (this.mainAbortController.signal.aborted) {
|
|
77
|
+
this.repository.updateOpState(this.job, index, {
|
|
78
|
+
exitCode: 0,
|
|
79
|
+
startTime: Date.now(),
|
|
80
|
+
endTime: Date.now(),
|
|
81
|
+
status: this.getStatus(this.mainAbortController.signal.reason, 'ops'),
|
|
82
|
+
});
|
|
83
|
+
return Promise.resolve();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Subscribes to 'log' events emitted during operation execution.
|
|
87
|
+
*
|
|
88
|
+
* These events are typically triggered by the operation’s execution engine (e.g., a container)
|
|
89
|
+
* to emit stdout/stderr logs. Every time a log is received, it's appended to the operation’s
|
|
90
|
+
* existing logs in the repository using `updateOpStateLogs`.
|
|
91
|
+
*
|
|
92
|
+
* This enables real-time or post-mortem log inspection, useful for debugging or UI display.
|
|
93
|
+
* Logs are stored in a buffer-like array, and later parsed during the `exit` or `error` phase
|
|
94
|
+
* to extract structured logs and results.
|
|
95
|
+
*/
|
|
96
|
+
emitter.on('log', (log, logType, type, timestamp) => {
|
|
97
|
+
// add logs to the log manager
|
|
98
|
+
this.addlog({
|
|
99
|
+
opId: op.id,
|
|
100
|
+
group: this.currentGroup ?? '',
|
|
101
|
+
type: type,
|
|
102
|
+
message: log,
|
|
103
|
+
timestamp: Date.now(),
|
|
104
|
+
});
|
|
105
|
+
if (type == 'container') {
|
|
106
|
+
// FOR NOW Skip if it's an actual Error object
|
|
107
|
+
// TODO: Format errors and insert
|
|
108
|
+
if (log instanceof Error)
|
|
109
|
+
return;
|
|
110
|
+
this.repository.updateOpStateLogs(this.job, index, {
|
|
111
|
+
log,
|
|
112
|
+
type: logType || 'stdout',
|
|
113
|
+
timestamp: timestamp || Date.now().toString(),
|
|
114
|
+
});
|
|
115
|
+
this.repository.displayLog(log);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
/**
|
|
119
|
+
* Subscribes to 'updateOpState' events that allow partial mutation of the operation's state.
|
|
120
|
+
*
|
|
121
|
+
* This is a flexible and general-purpose hook. It accepts a `body` payload which is a partial
|
|
122
|
+
* `OpState` object, which is merged into the existing operation state in the repository.
|
|
123
|
+
*
|
|
124
|
+
* Example use cases:
|
|
125
|
+
* - Updating metadata like progress percentage, internal flags, or status messages
|
|
126
|
+
* - Recording dynamic outputs or intermediate results during execution
|
|
127
|
+
*
|
|
128
|
+
* This gives the running operation a channel to self-report its own evolving state.
|
|
129
|
+
*/
|
|
130
|
+
emitter.on('updateOpState', (body) => {
|
|
131
|
+
this.repository.updateOpState(this.job, index, body);
|
|
132
|
+
});
|
|
133
|
+
/**
|
|
134
|
+
* update the host name
|
|
135
|
+
*/
|
|
136
|
+
emitter.on('updateOpHost', (body) => {
|
|
137
|
+
this.setHost(op.id, body.name);
|
|
138
|
+
});
|
|
139
|
+
/**
|
|
140
|
+
* Subscribes to the 'start' event, which marks the official beginning of an operation’s execution.
|
|
141
|
+
*
|
|
142
|
+
* When triggered, it updates the corresponding operation’s status to 'running' and records
|
|
143
|
+
* the `startTime` timestamp. This serves as the entry point for lifecycle tracking of this op.
|
|
144
|
+
*
|
|
145
|
+
* Important: This should be emitted **after** all setup is complete and just before the core
|
|
146
|
+
* execution logic begins (e.g., launching a container or invoking a function).
|
|
147
|
+
*
|
|
148
|
+
* This is crucial for analytics, timeout enforcement, and auditing purposes.
|
|
149
|
+
*/
|
|
150
|
+
emitter.on('start', () => {
|
|
151
|
+
const opName = op.name || op.id;
|
|
152
|
+
this.addlog({
|
|
153
|
+
opId: op.id,
|
|
154
|
+
group: this.currentGroup ?? '',
|
|
155
|
+
type: 'info',
|
|
156
|
+
message: `Operation Started: ${opName}`,
|
|
157
|
+
timestamp: Date.now(),
|
|
158
|
+
});
|
|
159
|
+
this.operationStatus.set(op.id, OperationProgressStatuses.RUNNING);
|
|
160
|
+
this.repository.updateOpState(this.job, index, {
|
|
161
|
+
status: 'running',
|
|
162
|
+
startTime: Date.now(),
|
|
163
|
+
endTime: null,
|
|
164
|
+
exitCode: null,
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
/**
|
|
168
|
+
* Subscribes to the 'exit' event, which signals that the operation has finished executing.
|
|
169
|
+
*
|
|
170
|
+
* This event may fire under normal completion, error, or external cancellation (abort).
|
|
171
|
+
*
|
|
172
|
+
* What this handler does:
|
|
173
|
+
* - Determines whether the operation was aborted or completed naturally.
|
|
174
|
+
* - Uses the exit code and abort reason to infer the final operation status.
|
|
175
|
+
* - Converts raw log strings to a buffer, then extracts structured logs and results.
|
|
176
|
+
* - Updates the operation's state in the repository with logs, results, exit code, status, and end time.
|
|
177
|
+
*/
|
|
178
|
+
emitter.on('exit', ({ exitCode }) => {
|
|
179
|
+
const opName = op.name || op.id;
|
|
180
|
+
this.addlog({
|
|
181
|
+
opId: op.id,
|
|
182
|
+
group: this.currentGroup ?? '',
|
|
183
|
+
type: 'info',
|
|
184
|
+
message: `Operation Completed: ${opName}`,
|
|
185
|
+
timestamp: Date.now(),
|
|
186
|
+
});
|
|
187
|
+
this.operationStatus.set(op.id, OperationProgressStatuses.FINISHED);
|
|
188
|
+
const wasAborted = abort.signal.aborted;
|
|
189
|
+
const reason = wasAborted ? abort.signal.reason : undefined;
|
|
190
|
+
const status = wasAborted
|
|
191
|
+
? this.getStatus(reason, 'ops')
|
|
192
|
+
: exitCode === 0
|
|
193
|
+
? Statuses.SUCCESS
|
|
194
|
+
: Statuses.FAILED;
|
|
195
|
+
const opState = this.repository.getOpState(this.job, index);
|
|
196
|
+
const results = op.results
|
|
197
|
+
? createResultsObject(op.results)
|
|
198
|
+
: undefined;
|
|
199
|
+
if (results && op.results) {
|
|
200
|
+
for (const logObj of opState.logs) {
|
|
201
|
+
extractResultFromLog(results, logObj, op.results);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
this.repository.updateOpState(this.job, index, {
|
|
205
|
+
logs: opState.logs,
|
|
206
|
+
results,
|
|
207
|
+
exitCode,
|
|
208
|
+
endTime: Date.now(),
|
|
209
|
+
status,
|
|
210
|
+
});
|
|
211
|
+
this.setResults(op.id, results ?? {});
|
|
212
|
+
});
|
|
213
|
+
/**
|
|
214
|
+
* Subscribes to the 'error' event, which is emitted when an unhandled exception or failure
|
|
215
|
+
* occurs during the operation's execution lifecycle.
|
|
216
|
+
*
|
|
217
|
+
* This could result from:
|
|
218
|
+
* - Internal execution issues (e.g., runtime crash, invalid state)
|
|
219
|
+
* - External interruptions (e.g., aborts triggered manually or by timeout)
|
|
220
|
+
*
|
|
221
|
+
* What this handler does:
|
|
222
|
+
* - Determines whether the operation was aborted or failed on its own.
|
|
223
|
+
* - Sets the final operation status accordingly.
|
|
224
|
+
* - Parses accumulated logs to extract clean output and structured results.
|
|
225
|
+
* - Updates the operation state with final logs, results, status, exit code, and end time.
|
|
226
|
+
*
|
|
227
|
+
* Notes:
|
|
228
|
+
* - `exitCode: 2` is used as a standard error indicator (non-zero, but distinct from process exit).
|
|
229
|
+
* - The actual `err` is not persisted currently, but could be added to logs in future.
|
|
230
|
+
*/
|
|
231
|
+
emitter.on('error', (err) => {
|
|
232
|
+
const wasAborted = abort.signal.aborted;
|
|
233
|
+
const reason = wasAborted ? abort.signal.reason : undefined;
|
|
234
|
+
this.operationStatus.set(op.id, wasAborted
|
|
235
|
+
? OperationProgressStatuses.STOPPED
|
|
236
|
+
: OperationProgressStatuses.FAILED);
|
|
237
|
+
const status = wasAborted
|
|
238
|
+
? this.getStatus(reason, 'ops')
|
|
239
|
+
: Statuses.FAILED;
|
|
240
|
+
if (!wasAborted) {
|
|
241
|
+
emitter.emit('log', 'Operation Failed', 'info');
|
|
242
|
+
emitter.emit('log', err, 'error');
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
emitter.emit('log', 'Operation Completed', 'info');
|
|
246
|
+
}
|
|
247
|
+
const opState = this.repository.getOpState(this.job, index);
|
|
248
|
+
const results = op.results
|
|
249
|
+
? createResultsObject(op.results)
|
|
250
|
+
: undefined;
|
|
251
|
+
if (results && op.results) {
|
|
252
|
+
for (const logObj of opState.logs) {
|
|
253
|
+
extractResultFromLog(results, logObj, op.results);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Format error message and add to opState.error array
|
|
257
|
+
if (!wasAborted) {
|
|
258
|
+
const message = ('message' in err && err.message) || String(err);
|
|
259
|
+
const event = ('eventType' in err && err.eventType) || 'operation-error';
|
|
260
|
+
let errorCode = undefined;
|
|
261
|
+
const httpCodeMatch = message.match(/HTTP code (\d{3})|status code (\d{3})/);
|
|
262
|
+
if (httpCodeMatch) {
|
|
263
|
+
errorCode = parseInt(httpCodeMatch[1] || httpCodeMatch[2]);
|
|
264
|
+
}
|
|
265
|
+
this.repository.updateOpStateError(this.job, index, {
|
|
266
|
+
event,
|
|
267
|
+
message,
|
|
268
|
+
...(errorCode ? { code: errorCode } : {}),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
this.repository.updateOpState(this.job, index, {
|
|
272
|
+
results,
|
|
273
|
+
logs: opState.logs,
|
|
274
|
+
exitCode: 2,
|
|
275
|
+
status,
|
|
276
|
+
endTime: Date.now(),
|
|
277
|
+
});
|
|
278
|
+
this.setResults(op.id, results ?? {});
|
|
279
|
+
});
|
|
280
|
+
/**
|
|
281
|
+
* what else can we clean up here?
|
|
282
|
+
*/
|
|
283
|
+
emitter.on('end', async () => {
|
|
284
|
+
emitter.removeAllListeners();
|
|
285
|
+
this.abortControllerMap.delete(op.id);
|
|
286
|
+
this.mainAbortController.signal.removeEventListener('abort', handleMainAbort);
|
|
287
|
+
});
|
|
288
|
+
/**
|
|
289
|
+
* Subscribes to the 'healthcheck:startup:success' event, which is emitted when
|
|
290
|
+
* the container for a given operation has started up successfully and passed its
|
|
291
|
+
* initial health checks.
|
|
292
|
+
*
|
|
293
|
+
* Once this event fires, we treat the current operation as "ready", and begin triggering
|
|
294
|
+
* the **next operations** that are waiting for this one to start.
|
|
295
|
+
*
|
|
296
|
+
* What happens here:
|
|
297
|
+
* - For each of this operation's dependents (i.e., ops that declared `depends_on: [thisOp]`)
|
|
298
|
+
* - We re-check their dependents using `getDependentsFromPlan`, ensuring the correct downstream chain.
|
|
299
|
+
* - We then queue them for execution using `trackGroupOperationPromise` and `setUpOperationFunc`.
|
|
300
|
+
*
|
|
301
|
+
* This mechanism allows dynamic chaining of operations based on runtime readiness,
|
|
302
|
+
* ensuring ops start only after their declared dependencies are healthy and active.
|
|
303
|
+
*/
|
|
304
|
+
emitter.on('healthcheck:startup:success', (payload) => {
|
|
305
|
+
emitter.emit('log', 'Operation StartUp Success', 'info');
|
|
306
|
+
const port = payload?.port;
|
|
307
|
+
if (typeof port === 'number' || typeof port === 'string') {
|
|
308
|
+
const portKey = String(port);
|
|
309
|
+
const stored_url = this.getByPath(op.id, `endpoint.${portKey}`);
|
|
310
|
+
if (!stored_url)
|
|
311
|
+
return;
|
|
312
|
+
const url = stored_url.startsWith('http')
|
|
313
|
+
? stored_url
|
|
314
|
+
: `https://${stored_url}`;
|
|
315
|
+
logEmitter.emit('log', {
|
|
316
|
+
class: 'FlowHandler',
|
|
317
|
+
method: 'operationExposed',
|
|
318
|
+
arguments: [
|
|
319
|
+
{
|
|
320
|
+
port,
|
|
321
|
+
opId: op.id,
|
|
322
|
+
},
|
|
323
|
+
true,
|
|
324
|
+
],
|
|
325
|
+
timestamp: new Date().toISOString(),
|
|
326
|
+
type: 'return',
|
|
327
|
+
result: url,
|
|
328
|
+
});
|
|
329
|
+
try {
|
|
330
|
+
const flow = this.repository.getFlow(this.job);
|
|
331
|
+
const secrets = flow?.state?.secrets;
|
|
332
|
+
let jobSecrets = {};
|
|
333
|
+
if (secrets &&
|
|
334
|
+
typeof secrets[this.job] === 'object' &&
|
|
335
|
+
secrets[this.job] !== 'private' &&
|
|
336
|
+
secrets[this.job] !== 'public' &&
|
|
337
|
+
secrets[this.job]) {
|
|
338
|
+
jobSecrets = secrets[this.job];
|
|
339
|
+
}
|
|
340
|
+
const targetHost = url.replace(/^https?:\/\//, '');
|
|
341
|
+
let updated = false;
|
|
342
|
+
const newJobSecrets = { ...jobSecrets };
|
|
343
|
+
for (const [exposeId, value] of Object.entries(jobSecrets)) {
|
|
344
|
+
const v = value;
|
|
345
|
+
if (v && typeof v === 'object' && v.url) {
|
|
346
|
+
const host = v.url.replace(/^https?:\/\//, '');
|
|
347
|
+
if (host === targetHost) {
|
|
348
|
+
newJobSecrets[exposeId] = { ...v, status: 'ONLINE' };
|
|
349
|
+
updated = true;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
if (updated) {
|
|
354
|
+
this.repository.updateflowStateSecret(this.job, {
|
|
355
|
+
[this.job]: newJobSecrets,
|
|
356
|
+
});
|
|
357
|
+
emitter.emit('flow:secrets-updated', {
|
|
358
|
+
flowId: this.job,
|
|
359
|
+
opId: op.id,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
catch { }
|
|
364
|
+
}
|
|
365
|
+
// Loop through each operation that depends on this one
|
|
366
|
+
for (const id of dependent) {
|
|
367
|
+
const dependencyContext = this.dependecyMap.get(id);
|
|
368
|
+
// Schedule the dependent operation to start, now that its dependency is healthy
|
|
369
|
+
this.currentGroupOperationsPromises.set(id, this.trackGroupOperationPromise(id, this.setUpOperationFunc(flow, id, dependencyContext.dependents)));
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
emitter.on('healthcheck:continuous:failure', (payload) => {
|
|
373
|
+
const port = payload?.port;
|
|
374
|
+
if (typeof port !== 'number' && typeof port !== 'string')
|
|
375
|
+
return;
|
|
376
|
+
try {
|
|
377
|
+
const flow = this.repository.getFlow(this.job);
|
|
378
|
+
const secrets = flow?.state?.secrets;
|
|
379
|
+
let jobSecrets = {};
|
|
380
|
+
if (secrets &&
|
|
381
|
+
typeof secrets[this.job] === 'object' &&
|
|
382
|
+
secrets[this.job] !== 'private' &&
|
|
383
|
+
secrets[this.job] !== 'public' &&
|
|
384
|
+
secrets[this.job]) {
|
|
385
|
+
jobSecrets = secrets[this.job];
|
|
386
|
+
}
|
|
387
|
+
let updated = false;
|
|
388
|
+
const newJobSecrets = {};
|
|
389
|
+
for (const [exposeId, value] of Object.entries(jobSecrets)) {
|
|
390
|
+
const v = value;
|
|
391
|
+
if (v &&
|
|
392
|
+
typeof v === 'object' &&
|
|
393
|
+
v.opID === op.id &&
|
|
394
|
+
String(v.port) === String(port)) {
|
|
395
|
+
newJobSecrets[exposeId] = { ...v, status: 'OFFLINE' };
|
|
396
|
+
updated = true;
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
newJobSecrets[exposeId] = v;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
if (updated) {
|
|
403
|
+
this.repository.updateflowStateSecret(this.job, {
|
|
404
|
+
[this.job]: newJobSecrets,
|
|
405
|
+
});
|
|
406
|
+
emitter.emit('flow:secrets-updated', {
|
|
407
|
+
flowId: this.job,
|
|
408
|
+
opId: op.id,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch { }
|
|
413
|
+
});
|
|
414
|
+
emitter.on('healthcheck:url:exposed', () => {
|
|
415
|
+
emitter.emit('log', 'Operation Service URL exposed', 'info');
|
|
416
|
+
});
|
|
417
|
+
/**
|
|
418
|
+
* Hydrate an operation by resolving all literal references in its `args`.
|
|
419
|
+
*
|
|
420
|
+
* Interpolates strings like:
|
|
421
|
+
* - %%ops.<opId>.results.someKey%%
|
|
422
|
+
* - %%ops.<opId>.host%%
|
|
423
|
+
* against the TaskManager's global store, returning a new `Operation<T>` with
|
|
424
|
+
* the same `type`, `id`, and `results`, but with `args` fully substituted.
|
|
425
|
+
*
|
|
426
|
+
* Notes:
|
|
427
|
+
* - Only `args` are modified. `type`, `id`, and `results` are preserved.
|
|
428
|
+
* - `args.env` values are normalized to strings after interpolation.
|
|
429
|
+
* - Unresolved literals currently resolve to empty strings. If you prefer
|
|
430
|
+
* strict behavior, update `resolveLiteralsInString` to throw on misses.
|
|
431
|
+
*
|
|
432
|
+
* @example
|
|
433
|
+
* // Before:
|
|
434
|
+
* // op.args.env.API = "http://%%ops.nginx-1.host%%:80"
|
|
435
|
+
* const interpolatedOp = this.interpolateOperation(op);
|
|
436
|
+
* // After:
|
|
437
|
+
* // interpolatedOp.args.env.API = "http://nginx-1:80"
|
|
438
|
+
*/
|
|
439
|
+
let interpolatedOp = op;
|
|
440
|
+
try {
|
|
441
|
+
interpolatedOp = this.interpolateOperation(op);
|
|
442
|
+
/**
|
|
443
|
+
* now after interpolation we want to proceed to
|
|
444
|
+
* TransformCollections(interpolatedOp)
|
|
445
|
+
*/
|
|
446
|
+
interpolatedOp = this.transformCollections(interpolatedOp);
|
|
447
|
+
interpolatedOp = finalizeEnvOnOperation(interpolatedOp);
|
|
448
|
+
interpolatedOp = stanatizeArrays(interpolatedOp);
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
this.repository.updateOpStateLogs(this.job, index, {
|
|
452
|
+
type: 'nodeerr',
|
|
453
|
+
log: error.message,
|
|
454
|
+
});
|
|
455
|
+
this.repository.updateOpState(this.job, index, {
|
|
456
|
+
exitCode: 0,
|
|
457
|
+
startTime: Date.now(),
|
|
458
|
+
endTime: Date.now(),
|
|
459
|
+
status: Statuses.FAILED,
|
|
460
|
+
});
|
|
461
|
+
emitter.emit('log', 'Operation Stopping', 'info');
|
|
462
|
+
this.operationStatus.set(op.id, OperationProgressStatuses.STOPPING);
|
|
463
|
+
abort.abort(this.mainAbortController.signal.reason);
|
|
464
|
+
return Promise.resolve();
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Executes the full lifecycle of a container-based operation:
|
|
468
|
+
*
|
|
469
|
+
* 1. **Start Phase**: Runs the container using the operation’s configuration,
|
|
470
|
+
* emits all lifecycle events (`start`, `log`, `updateOpState`, `exit`, `error`, `end`),
|
|
471
|
+
* and streams logs via the provided `EventEmitter`.
|
|
472
|
+
*
|
|
473
|
+
* 2. **Stop Phase**: Cleans up after the operation completes by stopping and removing
|
|
474
|
+
* the container, its associated network, and optionally its Docker image
|
|
475
|
+
* (if marked as authenticated/private).
|
|
476
|
+
*
|
|
477
|
+
* The underlying method blocks until the operation is fully completed or aborted,
|
|
478
|
+
* and ensures that no containers or networks are left dangling.
|
|
479
|
+
*
|
|
480
|
+
* This method is essential for:
|
|
481
|
+
* - Enforcing deterministic cleanup
|
|
482
|
+
* - Supporting clean restarts and re-runs
|
|
483
|
+
* - Ensuring resource isolation per operation
|
|
484
|
+
*
|
|
485
|
+
* @returns Promise<void> that resolves only after the operation has run and cleanup has completed
|
|
486
|
+
*/
|
|
487
|
+
return this.provider.runTaskManagerOperation(flow, interpolatedOp, abort, emitter);
|
|
488
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import TaskManager, { StopReason } from '../TaskManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Immediately stops the current task flow with the given reason.
|
|
4
|
+
*
|
|
5
|
+
* This triggers:
|
|
6
|
+
* - Flow-wide abort via `mainAbortController`
|
|
7
|
+
* - Lifecycle shutdown for any running ops
|
|
8
|
+
* - A consistent status applied to the flow and all ops
|
|
9
|
+
*
|
|
10
|
+
* The stop reason determines what status each op and the overall flow will be marked with.
|
|
11
|
+
*
|
|
12
|
+
* | Reason | Ops Status | Flow Status |
|
|
13
|
+
* |----------|------------|-------------|
|
|
14
|
+
* | expired | success | success |
|
|
15
|
+
* | stopped | stopped | stopped |
|
|
16
|
+
* | quit | failed | failed |
|
|
17
|
+
* | unknown | failed | failed |
|
|
18
|
+
*
|
|
19
|
+
* `getStatus()` is used internally to apply the correct status values.
|
|
20
|
+
*/
|
|
21
|
+
export declare function stopAllTaskManagerOperations(this: TaskManager, reason: StopReason): void;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { OperationProgressStatuses, } from '../TaskManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Immediately stops the current task flow with the given reason.
|
|
4
|
+
*
|
|
5
|
+
* This triggers:
|
|
6
|
+
* - Flow-wide abort via `mainAbortController`
|
|
7
|
+
* - Lifecycle shutdown for any running ops
|
|
8
|
+
* - A consistent status applied to the flow and all ops
|
|
9
|
+
*
|
|
10
|
+
* The stop reason determines what status each op and the overall flow will be marked with.
|
|
11
|
+
*
|
|
12
|
+
* | Reason | Ops Status | Flow Status |
|
|
13
|
+
* |----------|------------|-------------|
|
|
14
|
+
* | expired | success | success |
|
|
15
|
+
* | stopped | stopped | stopped |
|
|
16
|
+
* | quit | failed | failed |
|
|
17
|
+
* | unknown | failed | failed |
|
|
18
|
+
*
|
|
19
|
+
* `getStatus()` is used internally to apply the correct status values.
|
|
20
|
+
*/
|
|
21
|
+
export function stopAllTaskManagerOperations(reason) {
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the correct flow-level status from the stop reason.
|
|
24
|
+
* This ensures consistent results across all status tracking.
|
|
25
|
+
*/
|
|
26
|
+
this.status = this.getStatus(reason, 'flow');
|
|
27
|
+
/**
|
|
28
|
+
* Abort the main controller signal, which in turn should cascade
|
|
29
|
+
* down to any op-level AbortControllers that are still active.
|
|
30
|
+
*/
|
|
31
|
+
this.mainAbortController.abort(reason);
|
|
32
|
+
/**
|
|
33
|
+
* Mark any operations that have NOT started yet as stopped in the repository.
|
|
34
|
+
*/
|
|
35
|
+
try {
|
|
36
|
+
const flow = this.repository.getFlow(this.job);
|
|
37
|
+
if (!flow)
|
|
38
|
+
return;
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
for (const [opId] of this.opMap) {
|
|
41
|
+
const index = this.getOpStateIndex(opId);
|
|
42
|
+
const opState = flow.state.opStates[index];
|
|
43
|
+
if (opState?.startTime)
|
|
44
|
+
continue;
|
|
45
|
+
this.operationStatus.set(opId, OperationProgressStatuses.STOPPED);
|
|
46
|
+
this.repository.updateOpState(this.job, index, {
|
|
47
|
+
status: this.getStatus(reason, 'ops'),
|
|
48
|
+
endTime: now,
|
|
49
|
+
exitCode: 0,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch { }
|
|
54
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import TaskManager from '../TaskManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Stops all operations currently running in the given group.
|
|
4
|
+
*
|
|
5
|
+
* This method:
|
|
6
|
+
* - Validates the group exists and is actively running
|
|
7
|
+
* - Iterates over all ops in the group and stops them in parallel
|
|
8
|
+
* - Waits for all stops to complete (or be caught if they fail)
|
|
9
|
+
*/
|
|
10
|
+
export declare function stopTaskManagerGroupOperations(this: TaskManager, group: string): Promise<void>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { OperationProgressStatuses } from '../TaskManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Stops all operations currently running in the given group.
|
|
4
|
+
*
|
|
5
|
+
* This method:
|
|
6
|
+
* - Validates the group exists and is actively running
|
|
7
|
+
* - Iterates over all ops in the group and stops them in parallel
|
|
8
|
+
* - Waits for all stops to complete (or be caught if they fail)
|
|
9
|
+
*/
|
|
10
|
+
export async function stopTaskManagerGroupOperations(group) {
|
|
11
|
+
/**
|
|
12
|
+
* Look up the group context to get its operation IDs.
|
|
13
|
+
* If the group doesn't exist in the execution plan, it's invalid.
|
|
14
|
+
*/
|
|
15
|
+
const groupContext = this.executionPlan.find((ctx) => ctx.group === group);
|
|
16
|
+
if (!groupContext) {
|
|
17
|
+
throw new Error('GROUP_NOT_FOUND');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Ensure we're currently within the provided group context before proceeding.
|
|
21
|
+
* Prevents stopping inactive or completed groups.
|
|
22
|
+
*/
|
|
23
|
+
if (this.currentGroup !== group) {
|
|
24
|
+
throw new Error('GROUP_NOT_ACTIVE');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Stop each operation in parallel.
|
|
28
|
+
*/
|
|
29
|
+
for (const id of groupContext.ops) {
|
|
30
|
+
this.operationStatus.set(id, OperationProgressStatuses.STOPPING);
|
|
31
|
+
}
|
|
32
|
+
// Emit once after all statuses are updated to avoid interleaving state reads
|
|
33
|
+
this.events?.emit('flow:updated', {
|
|
34
|
+
jobId: this.job,
|
|
35
|
+
group,
|
|
36
|
+
type: 'group:stopping',
|
|
37
|
+
});
|
|
38
|
+
const stopPromises = groupContext.ops.map((id) => this.stopTaskManagerOperation(group, id).catch((err) => {
|
|
39
|
+
console.warn(`Failed to stop operation ${id}:`, err.message);
|
|
40
|
+
}));
|
|
41
|
+
// Await all stop promises before resolving
|
|
42
|
+
await Promise.all(stopPromises);
|
|
43
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import TaskManager from '../TaskManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Publicly exposed method to stop a running operation within the active group.
|
|
4
|
+
*
|
|
5
|
+
* This:
|
|
6
|
+
* - Validates the operation belongs to the current group
|
|
7
|
+
* - Prevents concurrent mutation using `lockedOperations`
|
|
8
|
+
* - Aborts the operation's container execution
|
|
9
|
+
* - Waits for full cleanup (exit/error + container teardown)
|
|
10
|
+
* - Ensures promise is resolved before continuing
|
|
11
|
+
*
|
|
12
|
+
* Usage: await taskManager.stopTaskOperation(groupId, opId)
|
|
13
|
+
*/
|
|
14
|
+
export declare function stopTaskManagerOperation(this: TaskManager, group: string, opId: string): Promise<void>;
|