|
1 | 1 | import type { WebSocket as NodeWebSocket } from "ws"; |
2 | 2 |
|
3 | 3 | import type { JSONSerializable, BusMessage } from "./types"; |
| 4 | +import type { RequestMessage, RequestName, ResponseFrom } from "./bus-types"; |
| 5 | + |
4 | 6 | export interface Payload { |
5 | 7 | /** The actual message content */ |
6 | | - message: BusMessage; |
| 8 | + message: BusMessage | JSONSerializable; |
7 | 9 | /** Request ID if this message expects a response */ |
8 | 10 | needResponse?: string; |
9 | 11 | /** Response ID if this message is responding to a request */ |
@@ -46,11 +48,9 @@ export class Bus { |
46 | 48 | /** Global ID counter for Bus instances */ |
47 | 49 | private static _idCount = 0; |
48 | 50 | /** Message handler for incoming messages */ |
49 | | - // eslint-disable-next-line @typescript-eslint/no-explicit-any |
50 | 51 | public onMessage?: (message: BusMessage) => void; |
51 | 52 | /** Request handler for incoming requests */ |
52 | | - // eslint-disable-next-line @typescript-eslint/no-explicit-any |
53 | | - public onRequest?: (request: BusMessage) => Promise<any | void>; |
| 53 | + public onRequest?: (request: RequestMessage) => Promise<JSONSerializable | void>; |
54 | 54 | /** Unique bus instance identifier */ |
55 | 55 | public readonly id: number = Bus._idCount++; |
56 | 56 | /** Request counter for generating unique request IDs */ |
@@ -96,16 +96,22 @@ export class Bus { |
96 | 96 | /** |
97 | 97 | * Sends a request and waits for a response |
98 | 98 | */ |
99 | | - // eslint-disable-next-line @typescript-eslint/no-explicit-any |
100 | | - request(message: BusMessage, options: RequestOptions = {}): Promise<JSONSerializable> { |
| 99 | + request<T extends RequestName>( |
| 100 | + message: RequestMessage<T>, |
| 101 | + options: RequestOptions = {} |
| 102 | + ): Promise<ResponseFrom<T>> { |
101 | 103 | const { timeout = 5000, batch } = options; |
102 | 104 | const requestId = this._getNextRequestId(); |
103 | 105 | return new Promise((resolve, reject) => { |
104 | 106 | const timeoutId = setTimeout(() => { |
105 | 107 | reject(new Error("bus request timed out")); |
106 | 108 | this._pendingRequests.delete(requestId); |
107 | 109 | }, timeout); |
108 | | - this._pendingRequests.set(requestId, { resolve, reject, timeout: timeoutId }); |
| 110 | + this._pendingRequests.set(requestId, { |
| 111 | + resolve, |
| 112 | + reject, |
| 113 | + timeout: timeoutId |
| 114 | + }); |
109 | 115 | this._sendPayload(message, { needResponse: requestId, batch }); |
110 | 116 | }); |
111 | 117 | } |
@@ -138,8 +144,7 @@ export class Bus { |
138 | 144 | } |
139 | 145 |
|
140 | 146 | private _sendPayload( |
141 | | - // eslint-disable-next-line @typescript-eslint/no-explicit-any |
142 | | - message: BusMessage, |
| 147 | + message: BusMessage | JSONSerializable, |
143 | 148 | options: { |
144 | 149 | needResponse?: string; |
145 | 150 | responseTo?: string; |
@@ -212,11 +217,11 @@ export class Bus { |
212 | 217 | } |
213 | 218 | } else if (needResponse) { |
214 | 219 | // This is a request that expects a response |
215 | | - const response = await this.onRequest?.(message); |
216 | | - this._sendPayload(response!, { responseTo: needResponse }); |
| 220 | + const response = await this.onRequest?.(message as RequestMessage); |
| 221 | + this._sendPayload(response ?? {}, { responseTo: needResponse }); |
217 | 222 | } else { |
218 | 223 | // This is a plain message |
219 | | - this.onMessage?.(message); |
| 224 | + this.onMessage?.(message as BusMessage); |
220 | 225 | } |
221 | 226 | } |
222 | 227 | } |
0 commit comments