Make everything use active evals (#30)

* 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
This commit is contained in:
Asher
2019-02-19 10:17:03 -06:00
committed by GitHub
parent 73762017c8
commit 4a80bcb42c
39 changed files with 1694 additions and 8731 deletions

View File

@@ -2,61 +2,10 @@
// file: client.proto
import * as jspb from "google-protobuf";
import * as command_pb from "./command_pb";
import * as node_pb from "./node_pb";
import * as vscode_pb from "./vscode_pb";
export class ClientMessage extends jspb.Message {
hasNewSession(): boolean;
clearNewSession(): void;
getNewSession(): command_pb.NewSessionMessage | undefined;
setNewSession(value?: command_pb.NewSessionMessage): void;
hasShutdownSession(): boolean;
clearShutdownSession(): void;
getShutdownSession(): command_pb.ShutdownSessionMessage | undefined;
setShutdownSession(value?: command_pb.ShutdownSessionMessage): void;
hasWriteToSession(): boolean;
clearWriteToSession(): void;
getWriteToSession(): command_pb.WriteToSessionMessage | undefined;
setWriteToSession(value?: command_pb.WriteToSessionMessage): void;
hasCloseSessionInput(): boolean;
clearCloseSessionInput(): void;
getCloseSessionInput(): command_pb.CloseSessionInputMessage | undefined;
setCloseSessionInput(value?: command_pb.CloseSessionInputMessage): void;
hasResizeSessionTty(): boolean;
clearResizeSessionTty(): void;
getResizeSessionTty(): command_pb.ResizeSessionTTYMessage | undefined;
setResizeSessionTty(value?: command_pb.ResizeSessionTTYMessage): void;
hasNewConnection(): boolean;
clearNewConnection(): void;
getNewConnection(): command_pb.NewConnectionMessage | undefined;
setNewConnection(value?: command_pb.NewConnectionMessage): void;
hasConnectionOutput(): boolean;
clearConnectionOutput(): void;
getConnectionOutput(): command_pb.ConnectionOutputMessage | undefined;
setConnectionOutput(value?: command_pb.ConnectionOutputMessage): void;
hasConnectionClose(): boolean;
clearConnectionClose(): void;
getConnectionClose(): command_pb.ConnectionCloseMessage | undefined;
setConnectionClose(value?: command_pb.ConnectionCloseMessage): void;
hasNewServer(): boolean;
clearNewServer(): void;
getNewServer(): command_pb.NewServerMessage | undefined;
setNewServer(value?: command_pb.NewServerMessage): void;
hasServerClose(): boolean;
clearServerClose(): void;
getServerClose(): command_pb.ServerCloseMessage | undefined;
setServerClose(value?: command_pb.ServerCloseMessage): void;
hasNewEval(): boolean;
clearNewEval(): void;
getNewEval(): node_pb.NewEvalMessage | undefined;
@@ -80,98 +29,18 @@ export class ClientMessage extends jspb.Message {
export namespace ClientMessage {
export type AsObject = {
newSession?: command_pb.NewSessionMessage.AsObject,
shutdownSession?: command_pb.ShutdownSessionMessage.AsObject,
writeToSession?: command_pb.WriteToSessionMessage.AsObject,
closeSessionInput?: command_pb.CloseSessionInputMessage.AsObject,
resizeSessionTty?: command_pb.ResizeSessionTTYMessage.AsObject,
newConnection?: command_pb.NewConnectionMessage.AsObject,
connectionOutput?: command_pb.ConnectionOutputMessage.AsObject,
connectionClose?: command_pb.ConnectionCloseMessage.AsObject,
newServer?: command_pb.NewServerMessage.AsObject,
serverClose?: command_pb.ServerCloseMessage.AsObject,
newEval?: node_pb.NewEvalMessage.AsObject,
evalEvent?: node_pb.EvalEventMessage.AsObject,
}
export enum MsgCase {
MSG_NOT_SET = 0,
NEW_SESSION = 1,
SHUTDOWN_SESSION = 2,
WRITE_TO_SESSION = 3,
CLOSE_SESSION_INPUT = 4,
RESIZE_SESSION_TTY = 5,
NEW_CONNECTION = 6,
CONNECTION_OUTPUT = 7,
CONNECTION_CLOSE = 8,
NEW_SERVER = 9,
SERVER_CLOSE = 10,
NEW_EVAL = 11,
EVAL_EVENT = 12,
}
}
export class ServerMessage extends jspb.Message {
hasNewSessionFailure(): boolean;
clearNewSessionFailure(): void;
getNewSessionFailure(): command_pb.NewSessionFailureMessage | undefined;
setNewSessionFailure(value?: command_pb.NewSessionFailureMessage): void;
hasSessionDone(): boolean;
clearSessionDone(): void;
getSessionDone(): command_pb.SessionDoneMessage | undefined;
setSessionDone(value?: command_pb.SessionDoneMessage): void;
hasSessionOutput(): boolean;
clearSessionOutput(): void;
getSessionOutput(): command_pb.SessionOutputMessage | undefined;
setSessionOutput(value?: command_pb.SessionOutputMessage): void;
hasIdentifySession(): boolean;
clearIdentifySession(): void;
getIdentifySession(): command_pb.IdentifySessionMessage | undefined;
setIdentifySession(value?: command_pb.IdentifySessionMessage): void;
hasConnectionFailure(): boolean;
clearConnectionFailure(): void;
getConnectionFailure(): command_pb.NewConnectionFailureMessage | undefined;
setConnectionFailure(value?: command_pb.NewConnectionFailureMessage): void;
hasConnectionOutput(): boolean;
clearConnectionOutput(): void;
getConnectionOutput(): command_pb.ConnectionOutputMessage | undefined;
setConnectionOutput(value?: command_pb.ConnectionOutputMessage): void;
hasConnectionClose(): boolean;
clearConnectionClose(): void;
getConnectionClose(): command_pb.ConnectionCloseMessage | undefined;
setConnectionClose(value?: command_pb.ConnectionCloseMessage): void;
hasConnectionEstablished(): boolean;
clearConnectionEstablished(): void;
getConnectionEstablished(): command_pb.ConnectionEstablishedMessage | undefined;
setConnectionEstablished(value?: command_pb.ConnectionEstablishedMessage): void;
hasServerFailure(): boolean;
clearServerFailure(): void;
getServerFailure(): command_pb.NewServerFailureMessage | undefined;
setServerFailure(value?: command_pb.NewServerFailureMessage): void;
hasServerEstablished(): boolean;
clearServerEstablished(): void;
getServerEstablished(): command_pb.ServerEstablishedMessage | undefined;
setServerEstablished(value?: command_pb.ServerEstablishedMessage): void;
hasServerClose(): boolean;
clearServerClose(): void;
getServerClose(): command_pb.ServerCloseMessage | undefined;
setServerClose(value?: command_pb.ServerCloseMessage): void;
hasServerConnectionEstablished(): boolean;
clearServerConnectionEstablished(): void;
getServerConnectionEstablished(): command_pb.ServerConnectionEstablishedMessage | undefined;
setServerConnectionEstablished(value?: command_pb.ServerConnectionEstablishedMessage): void;
hasEvalFailed(): boolean;
clearEvalFailed(): void;
getEvalFailed(): node_pb.EvalFailedMessage | undefined;
@@ -210,18 +79,6 @@ export class ServerMessage extends jspb.Message {
export namespace ServerMessage {
export type AsObject = {
newSessionFailure?: command_pb.NewSessionFailureMessage.AsObject,
sessionDone?: command_pb.SessionDoneMessage.AsObject,
sessionOutput?: command_pb.SessionOutputMessage.AsObject,
identifySession?: command_pb.IdentifySessionMessage.AsObject,
connectionFailure?: command_pb.NewConnectionFailureMessage.AsObject,
connectionOutput?: command_pb.ConnectionOutputMessage.AsObject,
connectionClose?: command_pb.ConnectionCloseMessage.AsObject,
connectionEstablished?: command_pb.ConnectionEstablishedMessage.AsObject,
serverFailure?: command_pb.NewServerFailureMessage.AsObject,
serverEstablished?: command_pb.ServerEstablishedMessage.AsObject,
serverClose?: command_pb.ServerCloseMessage.AsObject,
serverConnectionEstablished?: command_pb.ServerConnectionEstablishedMessage.AsObject,
evalFailed?: node_pb.EvalFailedMessage.AsObject,
evalDone?: node_pb.EvalDoneMessage.AsObject,
evalEvent?: node_pb.EvalEventMessage.AsObject,
@@ -231,18 +88,6 @@ export namespace ServerMessage {
export enum MsgCase {
MSG_NOT_SET = 0,
NEW_SESSION_FAILURE = 1,
SESSION_DONE = 2,
SESSION_OUTPUT = 3,
IDENTIFY_SESSION = 4,
CONNECTION_FAILURE = 5,
CONNECTION_OUTPUT = 6,
CONNECTION_CLOSE = 7,
CONNECTION_ESTABLISHED = 8,
SERVER_FAILURE = 9,
SERVER_ESTABLISHED = 10,
SERVER_CLOSE = 11,
SERVER_CONNECTION_ESTABLISHED = 12,
EVAL_FAILED = 13,
EVAL_DONE = 14,
EVAL_EVENT = 15,