@@ -35,9 +35,23 @@ export interface ISimulationStatus {
35
35
export class Session {
36
36
private connection : Connection ;
37
37
38
+ private secondaryLinks : ILink [ ] = [ ] ;
39
+ private greetingPacketPromise : Promise < proto . ServerGreeting > ;
40
+
38
41
constructor ( link : ILink ) {
39
42
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
+ } ;
40
51
this . connection . onEvent = async ( event ) => {
52
+ for ( const secondaryLink of this . secondaryLinks ) {
53
+ secondaryLink . onRecv ( event ) ;
54
+ }
41
55
if ( event . event === 'simulation_paused' || event . event === 'simulation_finished' ) {
42
56
await this . querySimulationStatus ( ) ;
43
57
}
@@ -49,6 +63,35 @@ export class Session {
49
63
this . connection . dispose ( ) ;
50
64
}
51
65
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
+
52
95
// ======================================== Inspecting the design
53
96
54
97
private itemCache : Map < string , proto . ItemDescriptionMap > = new Map ( ) ;
0 commit comments