Add stdio sources (#17)

This commit is contained in:
Kyle Carberry
2019-01-23 11:52:58 -06:00
parent 704a0defc9
commit 4cd6bed8d2
10 changed files with 157 additions and 47 deletions

View File

@@ -284,8 +284,18 @@ export class Client {
return;
}
const data = new TextDecoder().decode(output.getData_asU8());
const stream = output.getFd() === SessionOutputMessage.FD.STDOUT ? s.stdout : s.stderr;
stream.emit("data", data);
const source = output.getSource();
switch (source) {
case SessionOutputMessage.Source.STDOUT:
case SessionOutputMessage.Source.STDERR:
(source === SessionOutputMessage.Source.STDOUT ? s.stdout : s.stderr).emit("data", data);
break;
case SessionOutputMessage.Source.IPC:
s.emit("message", JSON.parse(data));
break;
default:
throw new Error(`Unknown source ${source}`);
}
} else if (message.hasIdentifySession()) {
const s = this.sessions.get(message.getIdentifySession()!.getId());
if (!s) {

View File

@@ -23,8 +23,11 @@ export interface ChildProcess {
readonly pid: number | undefined;
kill(signal?: string): void;
send(message: string | Uint8Array): void;
send(message: string | Uint8Array, ipc?: false): void;
send(message: any, ipc: true): void;
on(event: "message", listener: (data: any) => void): void;
on(event: "error", listener: (err: Error) => void): void;
on(event: "exit", listener: (code: number, signal: string) => void): void;
@@ -45,10 +48,6 @@ export class ServerProcess extends events.EventEmitter implements ChildProcess {
private readonly hasTty: boolean = false,
) {
super();
this.connection.onMessage((message) => {
this.emit("message", message);
});
if (!this.hasTty) {
delete this.resize;
}
@@ -71,10 +70,15 @@ export class ServerProcess extends events.EventEmitter implements ChildProcess {
this._killed = true;
}
public send(message: string | Uint8Array): void {
public send(message: string | Uint8Array | any, ipc: boolean = false): void {
const send = new WriteToSessionMessage();
send.setId(this.id);
send.setData(typeof message === "string" ? new TextEncoder().encode(message) : message);
send.setSource(ipc ? WriteToSessionMessage.Source.IPC : WriteToSessionMessage.Source.STDIN);
if (ipc) {
send.setData(new TextEncoder().encode(JSON.stringify(message)));
} else {
send.setData(typeof message === "string" ? new TextEncoder().encode(message) : message);
}
const client = new ClientMessage();
client.setWriteToSession(send);
this.connection.send(client.serializeBinary());