Parse args sent through evaluation function

Previously they'd go in still stringified so we didn't get a chance to
convert buffer objects back to buffers, for example, making things like
`fs.write` write `[object Object]` to files.
This commit is contained in:
Asher 2019-02-21 14:09:07 -06:00
parent fe107802e3
commit 7edf797efc
No known key found for this signature in database
GPG Key ID: 7BB4BA9C783D2BBC
4 changed files with 20 additions and 10 deletions

View File

@ -11,7 +11,7 @@ const fs = require("../src/fill/fs") as typeof import("fs");
describe("fs", () => { describe("fs", () => {
let i = 0; let i = 0;
const coderDir = path.join(os.tmpdir(), "coder"); const coderDir = path.join(os.tmpdir(), "coder", "fs");
const testFile = path.join(__dirname, "fs.test.ts"); const testFile = path.join(__dirname, "fs.test.ts");
const tmpFile = (): string => path.join(coderDir, `${i++}`); const tmpFile = (): string => path.join(coderDir, `${i++}`);
const createTmpFile = async (): Promise<string> => { const createTmpFile = async (): Promise<string> => {
@ -22,6 +22,13 @@ describe("fs", () => {
}; };
beforeAll(async () => { beforeAll(async () => {
try {
await util.promisify(nativeFs.mkdir)(path.dirname(coderDir));
} catch (error) {
if (error.code !== "EEXIST") {
throw error;
}
}
await util.promisify(rimraf)(coderDir); await util.promisify(rimraf)(coderDir);
await util.promisify(nativeFs.mkdir)(coderDir); await util.promisify(nativeFs.mkdir)(coderDir);
}); });
@ -332,7 +339,7 @@ describe("fs", () => {
describe("mkdtemp", () => { describe("mkdtemp", () => {
it("should create temp dir", async () => { it("should create temp dir", async () => {
await expect(util.promisify(fs.mkdtemp)(coderDir + "/")) await expect(util.promisify(fs.mkdtemp)(coderDir + "/"))
.resolves.toMatch(/^\/tmp\/coder\/[a-zA-Z0-9]{6}/); .resolves.toMatch(/^\/tmp\/coder\/fs\/[a-zA-Z0-9]{6}/);
}); });
}); });

View File

@ -12,10 +12,17 @@ const net = require("../src/fill/net") as typeof import("net");
describe("net", () => { describe("net", () => {
let i = 0; let i = 0;
const coderDir = path.join(os.tmpdir(), "coder"); const coderDir = path.join(os.tmpdir(), "coder", "net");
const tmpFile = (): string => path.join(coderDir, `socket.${i++}`); const tmpFile = (): string => path.join(coderDir, `socket.${i++}`);
beforeAll(async () => { beforeAll(async () => {
try {
await util.promisify(fs.mkdir)(path.dirname(coderDir));
} catch (error) {
if (error.code !== "EEXIST") {
throw error;
}
}
await util.promisify(rimraf)(coderDir); await util.promisify(rimraf)(coderDir);
await util.promisify(fs.mkdir)(coderDir); await util.promisify(fs.mkdir)(coderDir);
}); });

View File

@ -4,7 +4,7 @@ import { logger, field } from "@coder/logger";
import { ReadWriteConnection, InitData, OperatingSystem, SharedProcessData } from "../common/connection"; import { ReadWriteConnection, InitData, OperatingSystem, SharedProcessData } from "../common/connection";
import { Disposer, stringify, parse } from "../common/util"; import { Disposer, stringify, parse } from "../common/util";
import { NewEvalMessage, ServerMessage, EvalDoneMessage, EvalFailedMessage, ClientMessage, WorkingInitMessage, EvalEventMessage } from "../proto"; import { NewEvalMessage, ServerMessage, EvalDoneMessage, EvalFailedMessage, ClientMessage, WorkingInitMessage, EvalEventMessage } from "../proto";
import { ActiveEval } from "./command"; import { ActiveEval } from "./evaluate";
/** /**
* Client accepts an arbitrary connection intended to communicate with the Server. * Client accepts an arbitrary connection intended to communicate with the Server.

View File

@ -12,11 +12,6 @@ export interface ActiveEvaluation {
declare var __non_webpack_require__: typeof require; declare var __non_webpack_require__: typeof require;
export const evaluate = (connection: SendableConnection, message: NewEvalMessage, onDispose: () => void): ActiveEvaluation | void => { export const evaluate = (connection: SendableConnection, message: NewEvalMessage, onDispose: () => void): ActiveEvaluation | void => {
const argStr: string[] = [];
message.getArgsList().forEach((value) => {
argStr.push(value);
});
/** /**
* Send the response and call onDispose. * Send the response and call onDispose.
*/ */
@ -94,11 +89,12 @@ export const evaluate = (connection: SendableConnection, message: NewEvalMessage
process: { process: {
env: process.env, env: process.env,
}, },
args: message.getArgsList().map(parse),
}; };
let value: any; // tslint:disable-line no-any let value: any; // tslint:disable-line no-any
try { try {
const code = `(${message.getFunction()})(${eventEmitter ? "eventEmitter, " : ""}${argStr.join(",")});`; const code = `(${message.getFunction()})(${eventEmitter ? "eventEmitter, " : ""}...args);`;
value = vm.runInNewContext(code, sandbox, { value = vm.runInNewContext(code, sandbox, {
// If the code takes longer than this to return, it is killed and throws. // If the code takes longer than this to return, it is killed and throws.
timeout: message.getTimeout() || 15000, timeout: message.getTimeout() || 15000,