UNPKG

altair-graphql-core

Version:

Several of the core logic for altair graphql client

74 lines 2.93 kB
import { SCRIPT_INIT_EXECUTE } from './events'; const DEFAULT_TIMEOUT = 1000 * 60 * 5; // 5 minutes export class ScriptEvaluatorClientEngine { constructor(engineFactory, timeout = DEFAULT_TIMEOUT) { this.engineFactory = engineFactory; this.timeout = timeout; } async getClient() { const client = this.client ?? (await this.engineFactory.create()); this.client = client; return client; } async executeScript(script, data, userAvailableHandlers) { try { const engine = await this.getClient(); const result = await new Promise((resolve, reject) => { // Handle timeout const handle = setTimeout(() => { this.killClient(); reject(new Error('script timeout')); }, this.timeout); const allHandlers = { ...userAvailableHandlers, executeComplete: (data) => { clearTimeout(handle); resolve({ environment: data.environment, requestScriptLogs: data.requestScriptLogs || [], additionalHeaders: [], }); }, scriptError: (err) => { clearTimeout(handle); reject(err); }, }; // loop over all the script event handlers and create a listener for each // TODO: fn is of any type here. Figure out the typing Object.entries(allHandlers).forEach(([k, fn]) => { engine.subscribe(k, (key, event) => { // TODO: handle cancelling requests const { id, args } = event.payload; (async () => { try { const res = await fn(...args); engine.sendResponse(key, { id, response: res }); } catch (err) { engine.sendError(key, { id, error: `${err.message ?? err}`, }); } })(); }); }); engine.onError((e) => { clearTimeout(handle); reject(e); }); engine.send(SCRIPT_INIT_EXECUTE, [script, data]); }); return result; } finally { this.killClient(); } } killClient() { this.client?.destroy(); this.client = undefined; } } //# sourceMappingURL=evaluator-client-engine.js.map