1
1
import { ReadWriteConnection , InitData , OperatingSystem , ISharedProcessData } from "../common/connection" ;
2
- import { NewEvalMessage , ServerMessage , EvalDoneMessage , EvalFailedMessage , TypedValue , ClientMessage , NewSessionMessage , TTYDimensions , SessionOutputMessage , CloseSessionInputMessage , WorkingInitMessage , NewConnectionMessage } from "../proto" ;
2
+ import { NewEvalMessage , ServerMessage , EvalDoneMessage , EvalFailedMessage , TypedValue , ClientMessage , NewSessionMessage , TTYDimensions , SessionOutputMessage , CloseSessionInputMessage , WorkingInitMessage , NewConnectionMessage , NewServerMessage } from "../proto" ;
3
3
import { Emitter , Event } from "@coder/events" ;
4
4
import { logger , field } from "@coder/logger" ;
5
- import { ChildProcess , SpawnOptions , ServerProcess , ServerSocket , Socket } from "./command" ;
5
+ import { ChildProcess , SpawnOptions , ServerProcess , ServerSocket , Socket , ServerListener , Server } from "./command" ;
6
6
7
7
/**
8
8
* Client accepts an arbitrary connection intended to communicate with the Server.
@@ -18,6 +18,9 @@ export class Client {
18
18
private connectionId : number = 0 ;
19
19
private readonly connections : Map < number , ServerSocket > = new Map ( ) ;
20
20
21
+ private serverId : number = 0 ;
22
+ private readonly servers : Map < number , ServerListener > = new Map ( ) ;
23
+
21
24
private _initData : InitData | undefined ;
22
25
private initDataEmitter = new Emitter < InitData > ( ) ;
23
26
private initDataPromise : Promise < InitData > ;
@@ -189,6 +192,14 @@ export class Client {
189
192
return socket ;
190
193
}
191
194
195
+ public createServer ( callback ?: ( ) => void ) : Server {
196
+ const id = this . serverId ++ ;
197
+ const server = new ServerListener ( this . connection , id , callback ) ;
198
+ this . servers . set ( id , server ) ;
199
+
200
+ return server ;
201
+ }
202
+
192
203
private doSpawn ( command : string , args : string [ ] = [ ] , options ?: SpawnOptions , isFork : boolean = false , isBootstrapFork : boolean = true ) : ChildProcess {
193
204
const id = this . sessionId ++ ;
194
205
const newSess = new NewSessionMessage ( ) ;
@@ -333,6 +344,36 @@ export class Client {
333
344
this . sharedProcessActiveEmitter . emit ( {
334
345
socketPath : message . getSharedProcessActive ( ) ! . getSocketPath ( ) ,
335
346
} ) ;
347
+ } else if ( message . hasServerEstablished ( ) ) {
348
+ const s = this . servers . get ( message . getServerEstablished ( ) ! . getId ( ) ) ;
349
+ if ( ! s ) {
350
+ return ;
351
+ }
352
+ s . emit ( "connect" ) ;
353
+ } else if ( message . hasServerConnectionEstablished ( ) ) {
354
+ const s = this . servers . get ( message . getServerConnectionEstablished ( ) ! . getServerId ( ) ) ;
355
+ if ( ! s ) {
356
+ return ;
357
+ }
358
+ const conId = message . getServerConnectionEstablished ( ) ! . getConnectionId ( ) ;
359
+ const serverSocket = new ServerSocket ( this . connection , conId ) ;
360
+ serverSocket . emit ( "connect" ) ;
361
+ this . connections . set ( conId , serverSocket ) ;
362
+ s . emit ( "connection" , serverSocket ) ;
363
+ } else if ( message . getServerFailure ( ) ) {
364
+ const s = this . servers . get ( message . getServerFailure ( ) ! . getId ( ) ) ;
365
+ if ( ! s ) {
366
+ return ;
367
+ }
368
+ s . emit ( "error" , new Error ( message . getNewSessionFailure ( ) ! . getReason ( ) . toString ( ) ) ) ;
369
+ this . servers . delete ( message . getNewSessionFailure ( ) ! . getId ( ) ) ;
370
+ } else if ( message . hasServerClose ( ) ) {
371
+ const s = this . servers . get ( message . getServerClose ( ) ! . getId ( ) ) ;
372
+ if ( ! s ) {
373
+ return ;
374
+ }
375
+ s . emit ( "close" ) ;
376
+ this . servers . delete ( message . getServerClose ( ) ! . getId ( ) ) ;
336
377
}
337
378
}
338
379
}
0 commit comments