evaluate.ts 2.2 KB
Newer Older
K
Kyle Carberry 已提交
1 2 3 4
import * as vm from "vm";
import { NewEvalMessage, TypedValue, EvalFailedMessage, EvalDoneMessage, ServerMessage } from "../proto";
import { SendableConnection } from "../common/connection";

5
declare var __non_webpack_require__: typeof require;
K
Kyle Carberry 已提交
6
export const evaluate = async (connection: SendableConnection, message: NewEvalMessage): Promise<void> => {
K
Kyle Carberry 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
	const argStr: string[] = [];
	message.getArgsList().forEach((value) => {
		argStr.push(value);
	});
	const sendResp = (resp: any): void => {
		const evalDone = new EvalDoneMessage();
		evalDone.setId(message.getId());
		const tof = typeof resp;
		if (tof !== "undefined") {
			const tv = new TypedValue();
			let t: TypedValue.Type;
			switch (tof) {
				case "string":
					t = TypedValue.Type.STRING;
					break;
				case "boolean":
					t = TypedValue.Type.BOOLEAN;
					break;
				case "object":
					t = TypedValue.Type.OBJECT;
					break;
				case "number":
					t = TypedValue.Type.NUMBER;
					break;
				default:
A
Asher 已提交
32
					return sendErr(EvalFailedMessage.Reason.EXCEPTION, `unsupported response type ${tof}`);
K
Kyle Carberry 已提交
33 34 35 36 37
			}
			tv.setValue(tof === "string" ? resp : JSON.stringify(resp));
			tv.setType(t);
			evalDone.setResponse(tv);
		}
K
Kyle Carberry 已提交
38

K
Kyle Carberry 已提交
39 40 41 42 43 44 45 46 47
		const serverMsg = new ServerMessage();
		serverMsg.setEvalDone(evalDone);
		connection.send(serverMsg.serializeBinary());
	};
	const sendErr = (reason: EvalFailedMessage.Reason, msg: string): void => {
		const evalFailed = new EvalFailedMessage();
		evalFailed.setId(message.getId());
		evalFailed.setReason(reason);
		evalFailed.setMessage(msg);
K
Kyle Carberry 已提交
48

K
Kyle Carberry 已提交
49 50 51 52 53
		const serverMsg = new ServerMessage();
		serverMsg.setEvalFailed(evalFailed);
		connection.send(serverMsg.serializeBinary());
	};
	try {
A
Asher 已提交
54 55 56 57 58 59 60
		const value = vm.runInNewContext(`(${message.getFunction()})(${argStr.join(",")})`, {
			Buffer,
			require: typeof __non_webpack_require__ !== "undefined" ? __non_webpack_require__ : require,
			_require: typeof __non_webpack_require__ !== "undefined" ? __non_webpack_require__ : require,
			tslib_1: require("tslib"), // TODO: is there a better way to do this?
			setTimeout,
		}, {
K
Kyle Carberry 已提交
61 62 63 64 65 66
			timeout: message.getTimeout() || 30000,
		});
		sendResp(await value);
	} catch (ex) {
		sendErr(EvalFailedMessage.Reason.EXCEPTION, ex.toString());
	}
A
Asher 已提交
67
};