Skip to content

Commit 0f1bbdb

Browse files
committed
Allow requesting a secondary link from a session.
This is provided for Surfer integration.
1 parent 0946e8f commit 0f1bbdb

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

src/cxxrtl/client.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export class Connection {
8484
this._events = packet.events;
8585
this._itemValuesEncodings = packet.features.item_values_encoding;
8686
this._state = ConnectionState.Connected;
87-
await this.onConnected();
87+
await this.onConnected(packet);
8888
} else {
8989
this.rejectPromises(new Error(`unexpected CXXRTL protocol version ${packet.version}`));
9090
}
@@ -119,14 +119,14 @@ export class Connection {
119119
}
120120
}
121121

122-
private async perform(command: proto.AnyCommand): Promise<proto.AnyResponse> {
122+
async perform(command: proto.AnyCommand): Promise<proto.AnyResponse> {
123123
await this.send(command);
124124
return new Promise((resolve, reject) => {
125125
this.promises.push({ resolve, reject });
126126
});
127127
}
128128

129-
async onConnected(): Promise<void> {}
129+
async onConnected(greetingPacket: proto.ServerGreeting): Promise<void> {}
130130

131131
async onDisconnected(): Promise<void> {}
132132

src/debug/session.ts

+43
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,23 @@ export interface ISimulationStatus {
3535
export 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

Comments
 (0)