4a80bcb42c
* Add trace log level * Use active eval to implement spdlog * Split server/client active eval interfaces Since all properties are *not* valid on both sides * +200% fire resistance * Implement exec using active evaluations * Fully implement child process streams * Watch impl, move child_process back to explicitly adding events Automatically forwarding all events might be the right move, but wanna think/discuss it a bit more because it didn't come out very cleanly. * Would you like some args with that callback? * Implement the rest of child_process using active evals * Rampant memory leaks Emit "kill" to active evaluations when client disconnects in order to kill processes. Most likely won't be the final solution. * Resolve some minor issues with output panel * Implement node-pty with active evals * Provide clearTimeout to vm sandbox * Implement socket with active evals * Extract some callback logic Also remove some eval interfaces, need to re-think those. * Implement net.Server and remainder of net.Socket using active evals * Implement dispose for active evaluations * Use trace for express requests * Handle sending buffers through evaluation events * Make event logging a bit more clear * Fix some errors due to us not actually instantiating until connect/listen * is this a commit message? * We can just create the evaluator in the ctor Not sure what I was thinking. * memory leak for you, memory leak for everyone * it's a ternary now * Don't dispose automatically on close or error The code may or may not be disposable at that point. * Handle parsing buffers on the client side as well * Remove unused protobuf * Remove TypedValue * Remove unused forkProvider and test * Improve dispose pattern for active evals * Socket calls close after error; no need to bind both * Improve comment * Comment is no longer wishy washy due to explicit boolean * Simplify check for sendHandle and options * Replace _require with __non_webpack_require__ Webpack will then replace this with `require` which we then provide to the vm sandbox. * Provide path.parse * Prevent original-fs from loading * Start with a pid of -1 vscode immediately checks the PID to see if the debug process launch correctly, but of course we don't get the pid synchronously. * Pass arguments to bootstrap-fork * Fully implement streams Was causing errors because internally the stream would set this.writing to true and it would never become false, so subsequent messages would never send. * Fix serializing errors and streams emitting errors multiple times * Was emitting close to data * Fix missing path for spawned processes * Move evaluation onDispose call Now it's accurate and runs when the active evaluation has actually disposed. * Fix promisifying fs.exists * Fix some active eval callback issues * Patch existsSync in debug adapter
78 lines
1.7 KiB
TypeScript
78 lines
1.7 KiB
TypeScript
import { createClient } from "./helpers";
|
|
|
|
describe("Evaluate", () => {
|
|
const client = createClient();
|
|
|
|
it("should transfer string", async () => {
|
|
const value = await client.evaluate(function () {
|
|
return "hi";
|
|
});
|
|
|
|
expect(value).toEqual("hi");
|
|
}, 100);
|
|
|
|
it("should compute from string", async () => {
|
|
const start = "ban\%\$\"``a,,,,asdasd";
|
|
const value = await client.evaluate((a) => {
|
|
return a;
|
|
}, start);
|
|
|
|
expect(value).toEqual(start);
|
|
}, 100);
|
|
|
|
it("should compute from object", async () => {
|
|
const value = await client.evaluate((arg) => {
|
|
return arg.bananas * 2;
|
|
}, { bananas: 1 });
|
|
|
|
expect(value).toEqual(2);
|
|
}, 100);
|
|
|
|
it("should transfer object", async () => {
|
|
const value = await client.evaluate(() => {
|
|
return { alpha: "beta" };
|
|
});
|
|
|
|
expect(value.alpha).toEqual("beta");
|
|
}, 100);
|
|
|
|
it("should require", async () => {
|
|
const value = await client.evaluate(() => {
|
|
const fs = require("fs") as typeof import("fs");
|
|
|
|
return Object.keys(fs).filter((f) => f === "readFileSync");
|
|
});
|
|
|
|
expect(value[0]).toEqual("readFileSync");
|
|
}, 100);
|
|
|
|
it("should resolve with promise", async () => {
|
|
const value = await client.evaluate(async () => {
|
|
await new Promise((r): number => setTimeout(r, 100));
|
|
|
|
return "donkey";
|
|
});
|
|
|
|
expect(value).toEqual("donkey");
|
|
}, 250);
|
|
|
|
it("should do active process", (done) => {
|
|
const runner = client.run((ae) => {
|
|
ae.on("1", () => {
|
|
ae.emit("2");
|
|
ae.on("3", () => {
|
|
ae.emit("close");
|
|
});
|
|
});
|
|
|
|
return {
|
|
onDidDispose: (): void => undefined,
|
|
dispose: (): void => undefined,
|
|
};
|
|
});
|
|
runner.emit("1");
|
|
runner.on("2", () => runner.emit("3"));
|
|
runner.on("close", () => done());
|
|
});
|
|
});
|