UNPKG

@gentrace/core

Version:
1 lines 41.8 kB
{"version":3,"file":"test-job-runner.mjs","sources":["test-job-runner.js"],"sourcesContent":["var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { GENTRACE_API_KEY, GENTRACE_ENVIRONMENT_NAME, getGentraceBasePath, globalGentraceConfig, } from \"./init\";\nimport { Pipeline } from \"./pipeline\";\nimport { updateTestResultWithRunners } from \"./runners\";\nimport WebSocket from \"ws\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport * as Mustache from \"mustache\";\nimport { BASE_PATH } from \"../base\";\nconst interactions = {};\nexport function defineInteraction(interaction) {\n interactions[interaction.name] = interaction;\n Object.values(listeners).forEach((listener) => listener({\n type: \"register-interaction\",\n interaction,\n }));\n return interaction.fn;\n}\nconst testSuites = {};\nexport function defineTestSuite(testSuite) {\n testSuites[testSuite.name] = testSuite;\n Object.values(listeners).forEach((listener) => listener({\n type: \"register-test-suite\",\n testSuite,\n }));\n return testSuite.fn;\n}\nconst getWSBasePath = () => {\n const apiBasePath = getGentraceBasePath();\n if (apiBasePath === \"\") {\n return \"wss://gentrace.ai/ws\";\n }\n if (apiBasePath.includes(\"localhost\")) {\n return \"ws://localhost:3001\";\n }\n return (\"wss://\" +\n apiBasePath.slice(apiBasePath.indexOf(\"/\") + 2, apiBasePath.lastIndexOf(\"/\")) +\n \"/ws\");\n};\nconst listeners = {};\nconst makeUuid = () => {\n // Generate 16 random bytes\n const bytes = new Array(16);\n for (let i = 0; i < 16; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n // Set the version number to 4 (UUID version 4)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n // Set the variant to 10xxxxxx (RFC 4122 variant)\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n // Convert bytes to hex and format as UUID\n const hexBytes = bytes.map((byte) => (\"0\" + byte.toString(16)).slice(-2));\n return [\n hexBytes.slice(0, 4).join(\"\"),\n hexBytes.slice(4, 6).join(\"\"),\n hexBytes.slice(6, 8).join(\"\"),\n hexBytes.slice(8, 10).join(\"\"),\n hexBytes.slice(10, 16).join(\"\"),\n ].join(\"-\");\n};\nconst validate = (interaction, { id, inputs }) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\n if (!interaction.inputType) {\n return {\n status: \"failure\",\n error: \"No input validator found\",\n id,\n };\n }\n try {\n yield interaction.inputType.parseAsync(inputs);\n return { status: \"success\", id };\n }\n catch (e) {\n return {\n status: \"failure\",\n error: (_a = e === null || e === void 0 ? void 0 : e.message) !== null && _a !== void 0 ? _a : \"Validation failed\",\n id,\n };\n }\n});\nconst overridesAsyncLocalStorage = new AsyncLocalStorage();\nconst makeGetValue = (name, defaultValue) => {\n return () => {\n var _a;\n const overrides = overridesAsyncLocalStorage.getStore();\n return (_a = overrides === null || overrides === void 0 ? void 0 : overrides[name]) !== null && _a !== void 0 ? _a : defaultValue;\n };\n};\nconst parameters = {};\nexport const numericParameter = ({ name, defaultValue, }) => {\n parameters[name] = {\n name,\n type: \"numeric\",\n defaultValue,\n };\n return {\n name,\n getValue: makeGetValue(name, defaultValue),\n };\n};\nexport const stringParameter = ({ name, defaultValue, }) => {\n parameters[name] = {\n name,\n type: \"string\",\n defaultValue,\n };\n return {\n name,\n getValue: makeGetValue(name, defaultValue),\n };\n};\nexport const enumParameter = ({ name, options, defaultValue, }) => {\n parameters[name] = {\n name,\n type: \"enum\",\n defaultValue,\n options,\n };\n return {\n name,\n getValue: makeGetValue(name, defaultValue),\n };\n};\nexport const templateParameter = ({ name, defaultValue, variables, }) => {\n parameters[name] = {\n name,\n type: \"template\",\n defaultValue,\n variables: variables ? variables : [],\n };\n return {\n name,\n render: (values) => {\n var _a;\n const overrides = overridesAsyncLocalStorage.getStore();\n const template = (_a = overrides === null || overrides === void 0 ? void 0 : overrides[name]) !== null && _a !== void 0 ? _a : defaultValue;\n return Mustache.render(template, values);\n },\n };\n};\nfunction makeParallelRunner(parallelism) {\n const results = [];\n const queue = [];\n let numRunning = 0;\n function processQueue() {\n while ((!parallelism || numRunning < parallelism) && queue.length > 0) {\n const { fn, resolve, reject } = queue.shift();\n numRunning++;\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => {\n numRunning--;\n processQueue();\n });\n }\n }\n return {\n results,\n run: (fn) => __awaiter(this, void 0, void 0, function* () {\n results.push(new Promise((res, rej) => {\n queue.push({ fn, resolve: res, reject: rej });\n }));\n processQueue();\n }),\n };\n}\nfunction sendMessage(message, transport) {\n return __awaiter(this, void 0, void 0, function* () {\n if (transport.type === \"ws\") {\n if (!transport.pluginId) {\n transport.messageQueue.push(message);\n return;\n }\n if (transport.isClosed) {\n return;\n }\n transport.ws.send(JSON.stringify({\n id: makeUuid(),\n for: transport.pluginId,\n data: message,\n }));\n }\n else {\n transport.sendResponse(message);\n }\n });\n}\nconst handleRunInteractionInputValidation = (message, transport) => __awaiter(void 0, void 0, void 0, function* () {\n const { id, interactionName, data: testCases } = message;\n const interaction = interactions[interactionName];\n if (!interaction) {\n sendMessage({\n type: \"run-interaction-input-validation-results\",\n id,\n interactionName,\n data: testCases.map((tc) => ({\n id: tc.id,\n status: \"failure\",\n error: `Interaction ${interactionName} not found`,\n })),\n }, transport);\n }\n const validationResults = yield Promise.all(testCases.map((testCase) => validate(interaction, testCase)));\n sendMessage({\n type: \"run-interaction-input-validation-results\",\n id,\n interactionName,\n data: validationResults,\n }, transport);\n});\nconst runTestCaseThroughInteraction = (pipelineId, testJobId, interactionName, testCase) => __awaiter(void 0, void 0, void 0, function* () {\n const pipeline = new Pipeline({\n id: pipelineId,\n });\n const interaction = interactions[interactionName];\n if (!interaction) {\n // TODO: submit error to gentrace\n return;\n }\n const runner = pipeline.start();\n try {\n try {\n yield runner.measure(interaction.fn, [testCase.inputs]);\n }\n catch (e) {\n runner.setError(e.toString());\n }\n yield updateTestResultWithRunners(testJobId, [\n [runner, { id: testCase.id }],\n ]);\n }\n catch (e) {\n // TODO: submit error to gentrace\n console.error(e);\n throw e;\n }\n});\nconst handleRunTestInteraction = (message) => __awaiter(void 0, void 0, void 0, function* () {\n const { testJobId, pipelineId, interactionName, parallelism, data: testCases, overrides, } = message;\n const interaction = interactions[interactionName];\n if (!interaction) {\n return;\n }\n overridesAsyncLocalStorage.run(overrides, () => __awaiter(void 0, void 0, void 0, function* () {\n var _b, _c;\n const overrides = overridesAsyncLocalStorage.getStore();\n console.log(\"overrides\", overrides);\n const parallelRunner = makeParallelRunner(parallelism);\n for (const testCase of testCases) {\n parallelRunner.run(() => runTestCaseThroughInteraction(pipelineId, testJobId, interactionName, testCase));\n }\n const results = yield Promise.allSettled(parallelRunner.results);\n const erroredResults = results.filter((r) => r.status === \"rejected\");\n if (erroredResults.length > 0) {\n console.error(\"Errors in test job:\", erroredResults.map((r) => r.reason));\n }\n const apiBasePath = globalGentraceConfig.basePath || BASE_PATH;\n yield fetch(`${apiBasePath}/v1/test-result/status`, {\n method: \"POST\",\n headers: Object.assign({ \"Content-Type\": \"application/json\" }, ((_c = (_b = globalGentraceConfig.baseOptions) === null || _b === void 0 ? void 0 : _b.headers) !== null && _c !== void 0 ? _c : {})),\n body: JSON.stringify({\n id: testJobId,\n finished: true,\n }),\n });\n }));\n});\nconst handleRunTestSuite = (message) => __awaiter(void 0, void 0, void 0, function* () {\n var _d, _e;\n const { testSuiteName, testJobId, pipelineId } = message;\n const testSuite = testSuites[testSuiteName];\n if (!testSuite) {\n return;\n }\n yield testSuite.fn();\n const apiBasePath = globalGentraceConfig.basePath || BASE_PATH;\n yield fetch(`${apiBasePath}/v1/test-result/status`, {\n method: \"POST\",\n headers: Object.assign({ \"Content-Type\": \"application/json\" }, ((_e = (_d = globalGentraceConfig.baseOptions) === null || _d === void 0 ? void 0 : _d.headers) !== null && _e !== void 0 ? _e : {})),\n body: JSON.stringify({\n id: testJobId,\n finished: true,\n }),\n });\n});\nconst onInteraction = (interaction, transport) => {\n var _a, _b;\n sendMessage({\n type: \"register-interaction\",\n interaction: {\n name: interaction.name,\n hasValidation: !!interaction.inputType,\n parameters: (_b = (_a = interaction.parameters) === null || _a === void 0 ? void 0 : _a.map(({ name }) => parameters[name]).filter((v) => !!v)) !== null && _b !== void 0 ? _b : [],\n },\n }, transport);\n};\nconst onTestSuite = (testSuite, transport) => {\n sendMessage({\n type: \"register-test-suite\",\n testSuite: {\n name: testSuite.name,\n },\n }, transport);\n};\nconst handleEnvironmentDetails = (message, transport) => __awaiter(void 0, void 0, void 0, function* () {\n sendMessage({\n type: \"environment-details\",\n interactions: Object.values(interactions).map((interaction) => {\n var _a, _b;\n return ({\n name: interaction.name,\n hasValidation: !!interaction.inputType,\n parameters: (_b = (_a = interaction.parameters) === null || _a === void 0 ? void 0 : _a.map(({ name }) => parameters[name])) !== null && _b !== void 0 ? _b : [],\n });\n }),\n testSuites: Object.values(testSuites).map((testSuite) => ({\n name: testSuite.name,\n })),\n }, transport);\n});\nconst onMessage = (message, transport) => __awaiter(void 0, void 0, void 0, function* () {\n switch (message.type) {\n case \"environment-details\":\n yield handleEnvironmentDetails(message, transport);\n break;\n case \"run-interaction-input-validation\":\n yield handleRunInteractionInputValidation(message, transport);\n break;\n case \"run-test-interaction\":\n // Immediately send confirmation to avoid timeout, then run everything\n // else async\n sendMessage({\n type: \"confirmation\",\n ok: true,\n }, transport);\n yield handleRunTestInteraction(message);\n break;\n case \"run-test-suite\":\n sendMessage({\n type: \"confirmation\",\n ok: true,\n }, transport);\n yield handleRunTestSuite(message);\n break;\n }\n});\nfunction runWebSocket(environmentName, resolve, reject) {\n return __awaiter(this, void 0, void 0, function* () {\n const wsBasePath = getWSBasePath();\n let env = environmentName !== null && environmentName !== void 0 ? environmentName : GENTRACE_ENVIRONMENT_NAME;\n if (!env) {\n try {\n const os = yield import(\"os\");\n env = os.hostname();\n }\n catch (error) {\n reject(new Error(\"Gentrace environment name is not set\"));\n return;\n }\n }\n const transport = {\n type: \"ws\",\n pluginId: undefined,\n ws: new WebSocket(wsBasePath),\n isClosed: false,\n messageQueue: [],\n };\n const id = makeUuid();\n let intervals = [];\n const sendMessage = (message) => {\n if (!transport.pluginId) {\n transport.messageQueue.push(message);\n return;\n }\n if (transport.isClosed) {\n return;\n }\n console.log(\"WebSocket sending message:\", JSON.stringify(message, null, 2));\n transport.ws.send(JSON.stringify({\n id: makeUuid(),\n for: transport.pluginId,\n data: message,\n }));\n };\n const setup = () => {\n transport.messageQueue.forEach(sendMessage);\n intervals.push(setInterval(() => {\n console.log(\"sending heartbeat\");\n sendMessage({\n type: \"heartbeat\",\n });\n }, 30 * 1000));\n };\n const cleanup = () => {\n transport.isClosed = true;\n delete listeners[id];\n intervals.forEach(clearInterval);\n intervals = [];\n };\n transport.ws.onopen = () => {\n if (transport.isClosed) {\n return;\n }\n console.log(\"WebSocket connection opened, sending setup message\");\n transport.ws.send(JSON.stringify({\n id: makeUuid(),\n init: \"test-job-runner\",\n data: {\n type: \"setup\",\n environmentName: env,\n apiKey: GENTRACE_API_KEY,\n },\n }));\n // WSS layer, not plugin layer\n intervals.push(setInterval(() => {\n if (transport.isClosed) {\n return;\n }\n console.log(\"sending ping\");\n transport.ws.send(JSON.stringify({\n id: makeUuid(),\n ping: true,\n }));\n }, 30 * 1000));\n };\n transport.ws.onmessage = (event) => __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (transport.isClosed) {\n return;\n }\n console.log(\"WebSocket message received:\", event.data);\n const messageWrapper = JSON.parse(typeof event.data === \"string\" ? event.data : event.data.toString());\n if ((_a = messageWrapper === null || messageWrapper === void 0 ? void 0 : messageWrapper.data) === null || _a === void 0 ? void 0 : _a.pluginId) {\n transport.pluginId = messageWrapper.data.pluginId;\n setup();\n return;\n }\n if (messageWrapper === null || messageWrapper === void 0 ? void 0 : messageWrapper.error) {\n console.error(\"WebSocket error:\", messageWrapper.error);\n reject(new Error(JSON.stringify(messageWrapper.error, null, 2)));\n return;\n }\n try {\n const message = messageWrapper.data;\n yield onMessage(message, transport);\n }\n catch (e) {\n console.error(\"Error in WebSocket message handler:\", e);\n reject(e);\n }\n });\n transport.ws.onclose = () => {\n if (transport.isClosed) {\n return;\n }\n cleanup();\n console.log(\"WebSocket connection closed\");\n reject(new Error(\"WebSocket connection closed\"));\n };\n transport.ws.onerror = (error) => {\n console.error(\"Gentrace websocket error:\", error);\n };\n // wait for close signal from process\n process.on(\"SIGINT\", () => {\n if (transport.isClosed) {\n return;\n }\n console.log(\"Received SIGINT, closing WebSocket connection\");\n cleanup();\n transport.ws.close();\n resolve();\n });\n process.on(\"SIGTERM\", () => {\n if (transport.isClosed) {\n return;\n }\n console.log(\"Received SIGTERM, closing WebSocket connection\");\n cleanup();\n transport.ws.close();\n resolve();\n });\n Object.values(interactions).forEach((interaction) => onInteraction(interaction, transport));\n Object.values(testSuites).forEach((testSuite) => onTestSuite(testSuite, transport));\n listeners[id] = (event) => {\n switch (event.type) {\n case \"register-interaction\":\n onInteraction(event.interaction, transport);\n break;\n case \"register-test-suite\":\n onTestSuite(event.testSuite, transport);\n break;\n }\n };\n });\n}\nfunction listenInner({ environmentName, retries = 0, }) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!GENTRACE_API_KEY) {\n throw new Error(\"Gentrace API key is not set\");\n }\n let isClosingProcess = false;\n process.on(\"SIGINT\", () => {\n isClosingProcess = true;\n });\n process.on(\"SIGTERM\", () => {\n isClosingProcess = true;\n });\n try {\n const closePromise = new Promise((resolve, reject) => runWebSocket(environmentName, resolve, reject));\n yield closePromise;\n }\n catch (e) {\n console.error(\"Error in WebSocket connection:\", e);\n if (isClosingProcess) {\n return;\n }\n yield new Promise((resolve) => setTimeout(resolve, Math.min(Math.pow(2, retries) * 250, 10 * 1000)));\n if (isClosingProcess) {\n return;\n }\n return yield listenInner({ environmentName, retries: retries + 1 });\n }\n });\n}\nexport function listen(values) {\n const { environmentName } = values !== null && values !== void 0 ? values : {};\n return listenInner({ environmentName, retries: 0 });\n}\nexport function handleWebhook(body, sendResponse) {\n return __awaiter(this, void 0, void 0, function* () {\n console.log(\"Gentrace HTTP message received:\", body);\n yield onMessage(body, {\n type: \"http\",\n sendResponse,\n });\n });\n}\n"],"names":["this"],"mappings":"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"}