1- import { ReadWriteConnection } from "../common/connection" ;
2- import { NewEvalMessage , ServerMessage , EvalDoneMessage , EvalFailedMessage , TypedValue , ClientMessage , NewSessionMessage , TTYDimensions , SessionOutputMessage , CloseSessionInputMessage } from "../proto" ;
3- import { Emitter } from "@coder/events" ;
1+ import { ReadWriteConnection , InitData , OperatingSystem } from "../common/connection" ;
2+ import { NewEvalMessage , ServerMessage , EvalDoneMessage , EvalFailedMessage , TypedValue , ClientMessage , NewSessionMessage , TTYDimensions , SessionOutputMessage , CloseSessionInputMessage , InitMessage } from "../proto" ;
3+ import { Emitter , Event } from "@coder/events" ;
44import { logger , field } from "@coder/logger" ;
55import { ChildProcess , SpawnOptions , ServerProcess } from "./command" ;
66
@@ -15,12 +15,17 @@ export class Client {
1515 private sessionId : number = 0 ;
1616 private sessions : Map < number , ServerProcess > = new Map ( ) ;
1717
18+ private _initData : InitData | undefined ;
19+ private initDataEmitter : Emitter < InitData > = new Emitter ( ) ;
20+
1821 /**
1922 * @param connection Established connection to the server
2023 */
2124 public constructor (
2225 private readonly connection : ReadWriteConnection ,
2326 ) {
27+ this . initDataEmitter = new Emitter ( ) ;
28+
2429 connection . onMessage ( ( data ) => {
2530 try {
2631 this . handleMessage ( ServerMessage . deserializeBinary ( data ) ) ;
@@ -30,6 +35,14 @@ export class Client {
3035 } ) ;
3136 }
3237
38+ public get onInitData ( ) : Event < InitData > {
39+ return this . initDataEmitter . event ;
40+ }
41+
42+ public get initData ( ) : InitData | undefined {
43+ return this . _initData ;
44+ }
45+
3346 public evaluate < R > ( func : ( ) => R | Promise < R > ) : Promise < R > ;
3447 public evaluate < R , T1 > ( func : ( a1 : T1 ) => R | Promise < R > , a1 : T1 ) : Promise < R > ;
3548 public evaluate < R , T1 , T2 > ( func : ( a1 : T1 , a2 : T2 ) => R | Promise < R > , a1 : T1 , a2 : T2 ) : Promise < R > ;
@@ -47,7 +60,7 @@ export class Client {
4760 * console.log(returned);
4861 * // output: "hi"
4962 * @param func Function to evaluate
50- * @returns { Promise } Promise rejected or resolved from the evaluated function
63+ * @returns Promise rejected or resolved from the evaluated function
5164 */
5265 public evaluate < R , T1 , T2 , T3 , T4 , T5 , T6 > ( func : ( a1 ?: T1 , a2 ?: T2 , a3 ?: T3 , a4 ?: T4 , a5 ?: T5 , a6 ?: T6 ) => R | Promise < R > , a1 ?: T1 , a2 ?: T2 , a3 ?: T3 , a4 ?: T4 , a5 ?: T5 , a6 ?: T6 ) : Promise < R > {
5366 const newEval = new NewEvalMessage ( ) ;
@@ -61,8 +74,8 @@ export class Client {
6174 this . connection . send ( clientMsg . serializeBinary ( ) ) ;
6275
6376 let res : ( value ?: R ) => void ;
64- let rej : ( err ?: any ) => void ;
65- const prom = new Promise < R > ( ( r , e ) => {
77+ let rej : ( err ?: Error ) => void ;
78+ const prom = new Promise < R > ( ( r , e ) : void => {
6679 res = r ;
6780 rej = e ;
6881 } ) ;
@@ -80,6 +93,7 @@ export class Client {
8093 }
8194
8295 const rt = resp . getType ( ) ;
96+ // tslint:disable-next-line
8397 let val : any ;
8498 switch ( rt ) {
8599 case TypedValue . Type . BOOLEAN :
@@ -107,7 +121,7 @@ export class Client {
107121 d1 . dispose ( ) ;
108122 d2 . dispose ( ) ;
109123
110- rej ( failedMsg . getMessage ( ) ) ;
124+ rej ( new Error ( failedMsg . getMessage ( ) ) ) ;
111125 }
112126 } ) ;
113127
@@ -120,7 +134,6 @@ export class Client {
120134 * const cp = this.client.spawn("echo", ["test"]);
121135 * cp.stdout.on("data", (data) => console.log(data.toString()));
122136 * cp.on("exit", (code) => console.log("exited with", code));
123- * @param command
124137 * @param args Arguments
125138 * @param options Options to execute for the command
126139 */
@@ -167,14 +180,14 @@ export class Client {
167180
168181 const serverProc = new ServerProcess ( this . connection , id , options ? options . tty !== undefined : false ) ;
169182 serverProc . stdin . on ( "close" , ( ) => {
170- console . log ( "stdin closed" ) ;
171183 const c = new CloseSessionInputMessage ( ) ;
172184 c . setId ( id ) ;
173185 const cm = new ClientMessage ( ) ;
174186 cm . setCloseSessionInput ( c ) ;
175187 this . connection . send ( cm . serializeBinary ( ) ) ;
176188 } ) ;
177189 this . sessions . set ( id , serverProc ) ;
190+
178191 return serverProc ;
179192 }
180193
@@ -183,7 +196,31 @@ export class Client {
183196 * routed through here.
184197 */
185198 private handleMessage ( message : ServerMessage ) : void {
186- if ( message . hasEvalDone ( ) ) {
199+ if ( message . hasInit ( ) ) {
200+ const init = message . getInit ( ) ! ;
201+ let opSys : OperatingSystem ;
202+ switch ( init . getOperatingSystem ( ) ) {
203+ case InitMessage . OperatingSystem . WINDOWS :
204+ opSys = OperatingSystem . Windows ;
205+ break ;
206+ case InitMessage . OperatingSystem . LINUX :
207+ opSys = OperatingSystem . Linux ;
208+ break ;
209+ case InitMessage . OperatingSystem . MAC :
210+ opSys = OperatingSystem . Mac ;
211+ break ;
212+ default :
213+ throw new Error ( `unsupported operating system ${ init . getOperatingSystem ( ) } ` ) ;
214+ }
215+ this . _initData = {
216+ dataDirectory : init . getDataDirectory ( ) ,
217+ homeDirectory : init . getHomeDirectory ( ) ,
218+ tmpDirectory : init . getTmpDirectory ( ) ,
219+ workingDirectory : init . getWorkingDirectory ( ) ,
220+ os : opSys ,
221+ } ;
222+ this . initDataEmitter . emit ( this . _initData ) ;
223+ } else if ( message . hasEvalDone ( ) ) {
187224 this . evalDoneEmitter . emit ( message . getEvalDone ( ) ! ) ;
188225 } else if ( message . hasEvalFailed ( ) ) {
189226 this . evalFailedEmitter . emit ( message . getEvalFailed ( ) ! ) ;
0 commit comments