Skip to content

Commit 1ed4b57

Browse files
committed
refactor: improve internal event handling code
1 parent b94ff0e commit 1ed4b57

File tree

2 files changed

+36
-22
lines changed

2 files changed

+36
-22
lines changed

src/APIClient.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export class APIClient {
2222
private closed = false;
2323
private _running = false;
2424
private _lastNanos = 0;
25+
private readonly apiEvents = new EventTarget();
2526
private readonly pendingCommands = new Map<
2627
string,
2728
[(result: any) => void, (error: Error) => void]
@@ -30,7 +31,6 @@ export class APIClient {
3031
readonly connected;
3132

3233
onConnected?: (helloMessage: APIHello) => void;
33-
onEvent?: (event: APIEvent) => void;
3434
onError?: (error: APIError) => void;
3535

3636
constructor(
@@ -139,9 +139,9 @@ export class APIClient {
139139
return await this.sendCommand('sim:pause');
140140
}
141141

142-
async simResume(pauseAfter?: number) {
142+
async simResume(pauseAfter?: number, { waitForBytes }: { waitForBytes?: number[] } = {}) {
143143
this._running = true;
144-
return await this.sendCommand('sim:resume', { pauseAfter });
144+
return await this.sendCommand('sim:resume', { pauseAfter, waitForBytes });
145145
}
146146

147147
async simRestart({ pause }: { pause?: boolean } = {}) {
@@ -253,7 +253,21 @@ export class APIClient {
253253
this._running = false;
254254
}
255255
this._lastNanos = message.nanos;
256-
this.onEvent?.(message);
256+
this.apiEvents.dispatchEvent(new CustomEvent<APIEvent>(message.event, { detail: message }));
257+
}
258+
259+
listen(event: string, listener: (event: APIEvent) => void, options?: AddEventListenerOptions) {
260+
const callback = (e: CustomEventInit<APIEvent>) => {
261+
if (e.detail == null) {
262+
return;
263+
}
264+
listener(e.detail);
265+
};
266+
267+
this.apiEvents.addEventListener(event, callback, options);
268+
return () => {
269+
this.apiEvents.removeEventListener(event, callback, options);
270+
};
257271
}
258272

259273
processResponse(message: APIResponse) {

src/main.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -335,27 +335,27 @@ async function main() {
335335
await client.serialMonitorListen();
336336
const { timeToNextEvent } = eventManager;
337337

338-
client.onEvent = (event) => {
339-
if (event.event === 'sim:pause') {
340-
eventManager.processEvents(event.nanos);
341-
if (eventManager.timeToNextEvent >= 0) {
342-
void client.simResume(eventManager.timeToNextEvent);
343-
}
338+
client.listen('sim:pause', (event) => {
339+
eventManager.processEvents(event.nanos);
340+
if (eventManager.timeToNextEvent >= 0) {
341+
void client.simResume(eventManager.timeToNextEvent);
344342
}
345-
if (event.event === 'serial-monitor:data') {
346-
const { bytes } = (event as APIEvent<SerialMonitorDataPayload>).payload;
347-
for (const byte of bytes) {
348-
process.stdout.write(String.fromCharCode(byte));
349-
}
343+
});
350344

351-
serialLogStream?.write(Buffer.from(bytes));
352-
expectEngine.feed(bytes);
353-
}
354-
if (event.event === 'chips:log') {
355-
const { message, chip } = (event as APIEvent<ChipsLogPayload>).payload;
356-
console.log(chalkTemplate`[{magenta ${chip}}] ${message}`);
345+
client.listen('serial-monitor:data', (event: APIEvent<SerialMonitorDataPayload>) => {
346+
const { bytes } = event.payload;
347+
for (const byte of bytes) {
348+
process.stdout.write(String.fromCharCode(byte));
357349
}
358-
};
350+
351+
serialLogStream?.write(Buffer.from(bytes));
352+
expectEngine.feed(bytes);
353+
});
354+
355+
client.listen('chips:log', (event: APIEvent<ChipsLogPayload>) => {
356+
const { message, chip } = event.payload;
357+
console.log(chalkTemplate`[{magenta ${chip}}] ${message}`);
358+
});
359359

360360
await client.simStart({
361361
firmware: firmwareName,

0 commit comments

Comments
 (0)