@@ -35,9 +35,23 @@ export interface ISimulationStatus {
3535export class Session {
3636 private connection : Connection ;
3737
38+ private secondaryLinks : ILink [ ] = [ ] ;
39+ private greetingPacketPromise : Promise < proto . ServerGreeting > ;
40+
3841 constructor ( link : ILink ) {
3942 this . connection = new Connection ( link ) ;
43+ this . greetingPacketPromise = new Promise ( ( resolve , _reject ) => {
44+ this . connection . onConnected = async ( greetingPacket ) => resolve ( greetingPacket ) ;
45+ } ) ;
46+ this . connection . onDisconnected = async ( ) => {
47+ for ( const secondaryLink of this . secondaryLinks ) {
48+ secondaryLink . onDone ( ) ;
49+ }
50+ } ;
4051 this . connection . onEvent = async ( event ) => {
52+ for ( const secondaryLink of this . secondaryLinks ) {
53+ secondaryLink . onRecv ( event ) ;
54+ }
4155 if ( event . event === 'simulation_paused' || event . event === 'simulation_finished' ) {
4256 await this . querySimulationStatus ( ) ;
4357 }
@@ -49,6 +63,35 @@ export class Session {
4963 this . connection . dispose ( ) ;
5064 }
5165
66+ createSecondaryLink ( ) : ILink {
67+ const link : ILink = {
68+ dispose : ( ) => {
69+ this . secondaryLinks . splice ( this . secondaryLinks . indexOf ( link ) ) ;
70+ } ,
71+
72+ send : async ( clientPacket ) => {
73+ if ( clientPacket . type === 'greeting' ) {
74+ const serverGreetingPacket = await this . greetingPacketPromise ;
75+ if ( clientPacket . version === serverGreetingPacket . version ) {
76+ await link . onRecv ( serverGreetingPacket ) ;
77+ } else {
78+ throw new Error (
79+ `Secondary link requested greeting version ${ clientPacket . version } , ` +
80+ `but server greeting version is ${ serverGreetingPacket . version } `
81+ ) ;
82+ }
83+ } else {
84+ const serverPacket = await this . connection . perform ( clientPacket ) ;
85+ await link . onRecv ( serverPacket ) ;
86+ }
87+ } ,
88+
89+ onRecv : async ( serverPacket ) => { } ,
90+ onDone : async ( ) => { } ,
91+ } ;
92+ return link ;
93+ }
94+
5295 // ======================================== Inspecting the design
5396
5497 private itemCache : Map < string , proto . ItemDescriptionMap > = new Map ( ) ;
0 commit comments