@procwire/transport 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +844 -0
- package/dist/channel/builder.d.ts +68 -0
- package/dist/channel/builder.d.ts.map +1 -0
- package/dist/channel/builder.js +120 -0
- package/dist/channel/builder.js.map +1 -0
- package/dist/channel/index.d.ts +6 -0
- package/dist/channel/index.d.ts.map +1 -0
- package/dist/channel/index.js +6 -0
- package/dist/channel/index.js.map +1 -0
- package/dist/channel/quickstart.d.ts +94 -0
- package/dist/channel/quickstart.d.ts.map +1 -0
- package/dist/channel/quickstart.js +104 -0
- package/dist/channel/quickstart.js.map +1 -0
- package/dist/channel/request-channel.d.ts +119 -0
- package/dist/channel/request-channel.d.ts.map +1 -0
- package/dist/channel/request-channel.js +476 -0
- package/dist/channel/request-channel.js.map +1 -0
- package/dist/channel/types.d.ts +226 -0
- package/dist/channel/types.d.ts.map +1 -0
- package/dist/channel/types.js +2 -0
- package/dist/channel/types.js.map +1 -0
- package/dist/framing/index.d.ts +4 -0
- package/dist/framing/index.d.ts.map +1 -0
- package/dist/framing/index.js +4 -0
- package/dist/framing/index.js.map +1 -0
- package/dist/framing/length-prefixed.d.ts +55 -0
- package/dist/framing/length-prefixed.d.ts.map +1 -0
- package/dist/framing/length-prefixed.js +102 -0
- package/dist/framing/length-prefixed.js.map +1 -0
- package/dist/framing/line-delimited.d.ts +61 -0
- package/dist/framing/line-delimited.d.ts.map +1 -0
- package/dist/framing/line-delimited.js +94 -0
- package/dist/framing/line-delimited.js.map +1 -0
- package/dist/framing/types.d.ts +35 -0
- package/dist/framing/types.d.ts.map +1 -0
- package/dist/framing/types.js +2 -0
- package/dist/framing/types.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/process/handle.d.ts +64 -0
- package/dist/process/handle.d.ts.map +1 -0
- package/dist/process/handle.js +107 -0
- package/dist/process/handle.js.map +1 -0
- package/dist/process/index.d.ts +37 -0
- package/dist/process/index.d.ts.map +1 -0
- package/dist/process/index.js +37 -0
- package/dist/process/index.js.map +1 -0
- package/dist/process/manager.d.ts +58 -0
- package/dist/process/manager.d.ts.map +1 -0
- package/dist/process/manager.js +360 -0
- package/dist/process/manager.js.map +1 -0
- package/dist/process/types.d.ts +322 -0
- package/dist/process/types.d.ts.map +1 -0
- package/dist/process/types.js +2 -0
- package/dist/process/types.js.map +1 -0
- package/dist/protocol/index.d.ts +4 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +6 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/jsonrpc.d.ts +146 -0
- package/dist/protocol/jsonrpc.d.ts.map +1 -0
- package/dist/protocol/jsonrpc.js +288 -0
- package/dist/protocol/jsonrpc.js.map +1 -0
- package/dist/protocol/simple.d.ts +139 -0
- package/dist/protocol/simple.d.ts.map +1 -0
- package/dist/protocol/simple.js +297 -0
- package/dist/protocol/simple.js.map +1 -0
- package/dist/protocol/types.d.ts +117 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/serialization/index.d.ts +5 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +5 -0
- package/dist/serialization/index.js.map +1 -0
- package/dist/serialization/json.d.ts +66 -0
- package/dist/serialization/json.d.ts.map +1 -0
- package/dist/serialization/json.js +66 -0
- package/dist/serialization/json.js.map +1 -0
- package/dist/serialization/raw.d.ts +38 -0
- package/dist/serialization/raw.d.ts.map +1 -0
- package/dist/serialization/raw.js +41 -0
- package/dist/serialization/raw.js.map +1 -0
- package/dist/serialization/registry.d.ts +91 -0
- package/dist/serialization/registry.d.ts.map +1 -0
- package/dist/serialization/registry.js +119 -0
- package/dist/serialization/registry.js.map +1 -0
- package/dist/serialization/types.d.ts +27 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +2 -0
- package/dist/serialization/types.js.map +1 -0
- package/dist/transport/factory.d.ts +139 -0
- package/dist/transport/factory.d.ts.map +1 -0
- package/dist/transport/factory.js +162 -0
- package/dist/transport/factory.js.map +1 -0
- package/dist/transport/index.d.ts +6 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +9 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/socket-server.d.ts +48 -0
- package/dist/transport/socket-server.d.ts.map +1 -0
- package/dist/transport/socket-server.js +215 -0
- package/dist/transport/socket-server.js.map +1 -0
- package/dist/transport/socket-transport.d.ts +67 -0
- package/dist/transport/socket-transport.d.ts.map +1 -0
- package/dist/transport/socket-transport.js +193 -0
- package/dist/transport/socket-transport.js.map +1 -0
- package/dist/transport/stdio-transport.d.ts +94 -0
- package/dist/transport/stdio-transport.d.ts.map +1 -0
- package/dist/transport/stdio-transport.js +234 -0
- package/dist/transport/stdio-transport.js.map +1 -0
- package/dist/transport/types.d.ts +131 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +2 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/utils/assert.d.ts +16 -0
- package/dist/utils/assert.d.ts.map +1 -0
- package/dist/utils/assert.js +31 -0
- package/dist/utils/assert.js.map +1 -0
- package/dist/utils/disposables.d.ts +38 -0
- package/dist/utils/disposables.d.ts.map +1 -0
- package/dist/utils/disposables.js +59 -0
- package/dist/utils/disposables.js.map +1 -0
- package/dist/utils/errors.d.ts +43 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +69 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/events.d.ts +58 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/events.js +95 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pipe-path.d.ts +48 -0
- package/dist/utils/pipe-path.d.ts.map +1 -0
- package/dist/utils/pipe-path.js +89 -0
- package/dist/utils/pipe-path.js.map +1 -0
- package/dist/utils/platform.d.ts +16 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +22 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/time.d.ts +38 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +55 -0
- package/dist/utils/time.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { EventEmitter } from "../utils/events.js";
|
|
2
|
+
import { ProtocolError, toError, SerializationError } from "../utils/errors.js";
|
|
3
|
+
import { createTimeoutSignal } from "../utils/time.js";
|
|
4
|
+
/**
|
|
5
|
+
* JSON-RPC response accessor implementation.
|
|
6
|
+
*/
|
|
7
|
+
export class JsonRpcResponseAccessor {
|
|
8
|
+
getResponseId(message) {
|
|
9
|
+
if (typeof message === "object" &&
|
|
10
|
+
message !== null &&
|
|
11
|
+
"id" in message &&
|
|
12
|
+
(typeof message.id === "string" || typeof message.id === "number")) {
|
|
13
|
+
return message.id;
|
|
14
|
+
}
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
isErrorResponse(message) {
|
|
18
|
+
return typeof message === "object" && message !== null && "error" in message;
|
|
19
|
+
}
|
|
20
|
+
getResult(message) {
|
|
21
|
+
if (typeof message === "object" && message !== null && "result" in message) {
|
|
22
|
+
return message.result;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
getError(message) {
|
|
27
|
+
if (typeof message === "object" && message !== null && "error" in message) {
|
|
28
|
+
return message.error;
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Simple protocol response accessor implementation.
|
|
35
|
+
*/
|
|
36
|
+
export class SimpleResponseAccessor {
|
|
37
|
+
getResponseId(message) {
|
|
38
|
+
if (typeof message === "object" &&
|
|
39
|
+
message !== null &&
|
|
40
|
+
"type" in message &&
|
|
41
|
+
message.type === "response" &&
|
|
42
|
+
"id" in message &&
|
|
43
|
+
(typeof message.id === "string" || typeof message.id === "number")) {
|
|
44
|
+
return message.id;
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
isErrorResponse(message) {
|
|
49
|
+
return typeof message === "object" && message !== null && "error" in message;
|
|
50
|
+
}
|
|
51
|
+
getResult(message) {
|
|
52
|
+
if (typeof message === "object" && message !== null && "result" in message) {
|
|
53
|
+
return message.result;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
getError(message) {
|
|
58
|
+
if (typeof message === "object" && message !== null && "error" in message) {
|
|
59
|
+
return message.error;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Request channel implementation.
|
|
66
|
+
* Combines Transport + Framing + Serialization + Protocol layers
|
|
67
|
+
* to provide high-level request/response and notification patterns.
|
|
68
|
+
*
|
|
69
|
+
* @template TReq - Request message type (wire format)
|
|
70
|
+
* @template TRes - Response message type (wire format)
|
|
71
|
+
* @template TNotif - Notification message type (wire format)
|
|
72
|
+
*/
|
|
73
|
+
export class RequestChannel {
|
|
74
|
+
transport;
|
|
75
|
+
framing;
|
|
76
|
+
serialization;
|
|
77
|
+
protocol;
|
|
78
|
+
defaultTimeout;
|
|
79
|
+
responseAccessor;
|
|
80
|
+
middleware;
|
|
81
|
+
maxInboundFrames;
|
|
82
|
+
events = new EventEmitter();
|
|
83
|
+
pendingRequests = new Map();
|
|
84
|
+
requestHandlers = [];
|
|
85
|
+
notificationHandlers = [];
|
|
86
|
+
transportDataUnsubscribe;
|
|
87
|
+
transportErrorUnsubscribe;
|
|
88
|
+
_isConnected = false;
|
|
89
|
+
inboundFrameCount = 0;
|
|
90
|
+
constructor(options) {
|
|
91
|
+
this.transport = options.transport;
|
|
92
|
+
this.framing = options.framing;
|
|
93
|
+
this.serialization = options.serialization;
|
|
94
|
+
this.protocol = options.protocol;
|
|
95
|
+
this.defaultTimeout = options.timeout !== undefined ? options.timeout : 30000;
|
|
96
|
+
this.middleware = options.middleware !== undefined ? options.middleware : [];
|
|
97
|
+
this.maxInboundFrames = options.maxInboundFrames !== undefined ? options.maxInboundFrames : undefined;
|
|
98
|
+
// Auto-detect response accessor if not provided
|
|
99
|
+
this.responseAccessor =
|
|
100
|
+
options.responseAccessor !== undefined
|
|
101
|
+
? options.responseAccessor
|
|
102
|
+
: this.createDefaultAccessor();
|
|
103
|
+
}
|
|
104
|
+
get isConnected() {
|
|
105
|
+
return this._isConnected;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Starts the channel (connects transport and begins message processing).
|
|
109
|
+
*/
|
|
110
|
+
async start() {
|
|
111
|
+
if (this._isConnected) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Connect transport if not already connected (e.g., server-accepted connections)
|
|
115
|
+
if (this.transport.state !== "connected") {
|
|
116
|
+
await this.transport.connect();
|
|
117
|
+
}
|
|
118
|
+
// Subscribe to transport events
|
|
119
|
+
this.transportDataUnsubscribe = this.transport.onData((chunk) => {
|
|
120
|
+
this.handleChunk(chunk).catch((error) => {
|
|
121
|
+
this.emitError(toError(error));
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
this.transportErrorUnsubscribe = this.transport.on("error", (error) => {
|
|
125
|
+
this.emitError(error);
|
|
126
|
+
});
|
|
127
|
+
this._isConnected = true;
|
|
128
|
+
this.events.emit("start", undefined);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Closes the channel gracefully.
|
|
132
|
+
*/
|
|
133
|
+
async close() {
|
|
134
|
+
if (!this._isConnected) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this._isConnected = false;
|
|
138
|
+
// Unsubscribe from transport
|
|
139
|
+
if (this.transportDataUnsubscribe !== undefined) {
|
|
140
|
+
this.transportDataUnsubscribe();
|
|
141
|
+
this.transportDataUnsubscribe = undefined;
|
|
142
|
+
}
|
|
143
|
+
if (this.transportErrorUnsubscribe !== undefined) {
|
|
144
|
+
this.transportErrorUnsubscribe();
|
|
145
|
+
this.transportErrorUnsubscribe = undefined;
|
|
146
|
+
}
|
|
147
|
+
// Reject all pending requests
|
|
148
|
+
const channelClosedError = new Error("Channel closed");
|
|
149
|
+
for (const pending of this.pendingRequests.values()) {
|
|
150
|
+
pending.timeoutSignal.cancel();
|
|
151
|
+
pending.reject(channelClosedError);
|
|
152
|
+
}
|
|
153
|
+
this.pendingRequests.clear();
|
|
154
|
+
// Reset framing state
|
|
155
|
+
this.framing.reset();
|
|
156
|
+
// Disconnect transport
|
|
157
|
+
await this.transport.disconnect();
|
|
158
|
+
this.events.emit("close", undefined);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Sends a request and waits for response.
|
|
162
|
+
*/
|
|
163
|
+
async request(method, params, timeout) {
|
|
164
|
+
if (!this._isConnected) {
|
|
165
|
+
throw new Error("Channel is not connected");
|
|
166
|
+
}
|
|
167
|
+
// Generate request ID and create request message
|
|
168
|
+
const request = this.protocol.createRequest(method, params);
|
|
169
|
+
const id = this.extractRequestId(request);
|
|
170
|
+
if (id === undefined) {
|
|
171
|
+
throw new ProtocolError("Failed to extract request ID from created request");
|
|
172
|
+
}
|
|
173
|
+
// Call middleware
|
|
174
|
+
await this.runMiddlewareHook("onOutgoingRequest", request);
|
|
175
|
+
// Setup pending request promise
|
|
176
|
+
const resultPromise = new Promise((resolve, reject) => {
|
|
177
|
+
const effectiveTimeout = timeout ?? this.defaultTimeout;
|
|
178
|
+
const timeoutSignal = createTimeoutSignal(effectiveTimeout);
|
|
179
|
+
// Store pending request
|
|
180
|
+
this.pendingRequests.set(id, {
|
|
181
|
+
resolve,
|
|
182
|
+
reject,
|
|
183
|
+
timeoutSignal,
|
|
184
|
+
});
|
|
185
|
+
// Race between response and timeout
|
|
186
|
+
timeoutSignal.promise.catch((error) => {
|
|
187
|
+
// Timeout occurred
|
|
188
|
+
const pending = this.pendingRequests.get(id);
|
|
189
|
+
if (pending) {
|
|
190
|
+
this.pendingRequests.delete(id);
|
|
191
|
+
reject(error);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
// Serialize and frame
|
|
196
|
+
const serialized = this.serialization.serialize(request);
|
|
197
|
+
const framed = this.framing.encode(serialized);
|
|
198
|
+
// Write to transport
|
|
199
|
+
try {
|
|
200
|
+
await this.transport.write(framed);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
// Write failed, clean up pending request
|
|
204
|
+
const pending = this.pendingRequests.get(id);
|
|
205
|
+
if (pending) {
|
|
206
|
+
pending.timeoutSignal.cancel();
|
|
207
|
+
this.pendingRequests.delete(id);
|
|
208
|
+
}
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
return resultPromise;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Sends a notification (fire-and-forget).
|
|
215
|
+
*/
|
|
216
|
+
async notify(method, params) {
|
|
217
|
+
if (!this._isConnected) {
|
|
218
|
+
throw new Error("Channel is not connected");
|
|
219
|
+
}
|
|
220
|
+
// Create notification message
|
|
221
|
+
const notification = this.protocol.createNotification(method, params);
|
|
222
|
+
// Call middleware
|
|
223
|
+
await this.runMiddlewareHook("onOutgoingRequest", notification);
|
|
224
|
+
// Serialize and frame
|
|
225
|
+
const serialized = this.serialization.serialize(notification);
|
|
226
|
+
const framed = this.framing.encode(serialized);
|
|
227
|
+
// Write to transport
|
|
228
|
+
await this.transport.write(framed);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Registers handler for incoming requests.
|
|
232
|
+
*/
|
|
233
|
+
onRequest(handler) {
|
|
234
|
+
this.requestHandlers.push(handler);
|
|
235
|
+
return () => {
|
|
236
|
+
const index = this.requestHandlers.indexOf(handler);
|
|
237
|
+
if (index !== -1) {
|
|
238
|
+
this.requestHandlers.splice(index, 1);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Registers handler for incoming notifications.
|
|
244
|
+
*/
|
|
245
|
+
onNotification(handler) {
|
|
246
|
+
this.notificationHandlers.push(handler);
|
|
247
|
+
return () => {
|
|
248
|
+
const index = this.notificationHandlers.indexOf(handler);
|
|
249
|
+
if (index !== -1) {
|
|
250
|
+
this.notificationHandlers.splice(index, 1);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Subscribes to channel events.
|
|
256
|
+
*/
|
|
257
|
+
on(event, handler) {
|
|
258
|
+
return this.events.on(event, handler);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Handles incoming chunk from transport.
|
|
262
|
+
*/
|
|
263
|
+
async handleChunk(chunk) {
|
|
264
|
+
let frames;
|
|
265
|
+
try {
|
|
266
|
+
frames = this.framing.decode(chunk);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
this.emitError(toError(error));
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Check max inbound frames limit
|
|
273
|
+
if (this.maxInboundFrames !== undefined) {
|
|
274
|
+
this.inboundFrameCount += frames.length;
|
|
275
|
+
if (this.inboundFrameCount > this.maxInboundFrames) {
|
|
276
|
+
this.emitError(new Error(`Exceeded max inbound frames: ${this.maxInboundFrames}`));
|
|
277
|
+
// Don't process these frames, but don't crash the channel either
|
|
278
|
+
this.inboundFrameCount -= frames.length;
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Process each frame
|
|
283
|
+
for (const frame of frames) {
|
|
284
|
+
try {
|
|
285
|
+
await this.processFrame(frame);
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
// Emit error but continue processing other frames
|
|
289
|
+
this.emitError(toError(error));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Reset counter after processing batch
|
|
293
|
+
if (this.maxInboundFrames !== undefined) {
|
|
294
|
+
this.inboundFrameCount = 0;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Processes a single frame.
|
|
299
|
+
*/
|
|
300
|
+
async processFrame(frame) {
|
|
301
|
+
// Deserialize
|
|
302
|
+
let obj;
|
|
303
|
+
try {
|
|
304
|
+
obj = this.serialization.deserialize(frame);
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
throw new SerializationError("Failed to deserialize frame", error);
|
|
308
|
+
}
|
|
309
|
+
// Parse message
|
|
310
|
+
const parsed = this.protocol.parseMessage(obj);
|
|
311
|
+
if (parsed.kind === "invalid") {
|
|
312
|
+
await this.runMiddlewareHook("onError", new ProtocolError(parsed.error.message));
|
|
313
|
+
this.emitError(new ProtocolError(`Invalid message: ${parsed.error.message}`));
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (this.protocol.isResponse(parsed)) {
|
|
317
|
+
await this.handleResponse(parsed.message);
|
|
318
|
+
}
|
|
319
|
+
else if (this.protocol.isRequest(parsed)) {
|
|
320
|
+
await this.handleRequest(parsed.message);
|
|
321
|
+
}
|
|
322
|
+
else if (this.protocol.isNotification(parsed)) {
|
|
323
|
+
await this.handleNotification(parsed.message);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Handles incoming response message.
|
|
328
|
+
*/
|
|
329
|
+
async handleResponse(response) {
|
|
330
|
+
await this.runMiddlewareHook("onIncomingResponse", response);
|
|
331
|
+
const id = this.responseAccessor.getResponseId(response);
|
|
332
|
+
if (id === undefined) {
|
|
333
|
+
this.emitError(new ProtocolError("Response missing id"));
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const pending = this.pendingRequests.get(id);
|
|
337
|
+
if (!pending) {
|
|
338
|
+
// Unsolicited response, ignore
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
// Remove from pending
|
|
342
|
+
this.pendingRequests.delete(id);
|
|
343
|
+
pending.timeoutSignal.cancel();
|
|
344
|
+
// Check if error response
|
|
345
|
+
if (this.responseAccessor.isErrorResponse(response)) {
|
|
346
|
+
const error = this.responseAccessor.getError(response);
|
|
347
|
+
pending.reject(new ProtocolError("Request failed", error));
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
const result = this.responseAccessor.getResult(response);
|
|
351
|
+
pending.resolve(result);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Handles incoming request message.
|
|
356
|
+
*/
|
|
357
|
+
async handleRequest(request) {
|
|
358
|
+
await this.runMiddlewareHook("onIncomingRequest", request);
|
|
359
|
+
// Extract request ID (protocol-specific)
|
|
360
|
+
// We need a way to get the ID from the request message
|
|
361
|
+
// This is also protocol-specific, so we need a RequestAccessor similar to ResponseAccessor
|
|
362
|
+
// For now, let's assume the message has an `id` field (common for both jsonrpc and simple)
|
|
363
|
+
const id = this.extractRequestId(request);
|
|
364
|
+
if (id === undefined) {
|
|
365
|
+
this.emitError(new ProtocolError("Request missing id"));
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
// Call all request handlers (FIFO order)
|
|
369
|
+
// Note: Multiple handlers is unusual, but supported per spec
|
|
370
|
+
// Typically, only one handler should be registered
|
|
371
|
+
if (this.requestHandlers.length === 0) {
|
|
372
|
+
// No handler registered, send error response
|
|
373
|
+
const errorResponse = this.protocol.createErrorResponse(id, {
|
|
374
|
+
code: -32601,
|
|
375
|
+
message: "No request handler registered",
|
|
376
|
+
});
|
|
377
|
+
await this.sendResponse(errorResponse);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
try {
|
|
381
|
+
// Call first handler (or could call all and use last result)
|
|
382
|
+
const handler = this.requestHandlers[0];
|
|
383
|
+
if (handler === undefined) {
|
|
384
|
+
throw new Error("No handler available");
|
|
385
|
+
}
|
|
386
|
+
const result = await handler(request);
|
|
387
|
+
// Create success response
|
|
388
|
+
const response = this.protocol.createResponse(id, result);
|
|
389
|
+
await this.sendResponse(response);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
// Create error response
|
|
393
|
+
const err = toError(error);
|
|
394
|
+
const errorResponse = this.protocol.createErrorResponse(id, {
|
|
395
|
+
code: -32603,
|
|
396
|
+
message: err.message,
|
|
397
|
+
data: err,
|
|
398
|
+
});
|
|
399
|
+
await this.sendResponse(errorResponse);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Handles incoming notification message.
|
|
404
|
+
*/
|
|
405
|
+
async handleNotification(notification) {
|
|
406
|
+
// Call all notification handlers
|
|
407
|
+
for (const handler of this.notificationHandlers) {
|
|
408
|
+
try {
|
|
409
|
+
handler(notification);
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
// Log error but don't stop processing other handlers
|
|
413
|
+
this.emitError(toError(error));
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Sends a response message.
|
|
419
|
+
*/
|
|
420
|
+
async sendResponse(response) {
|
|
421
|
+
await this.runMiddlewareHook("onOutgoingResponse", response);
|
|
422
|
+
const serialized = this.serialization.serialize(response);
|
|
423
|
+
const framed = this.framing.encode(serialized);
|
|
424
|
+
await this.transport.write(framed);
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Extracts request ID from request message (protocol-specific).
|
|
428
|
+
*/
|
|
429
|
+
extractRequestId(request) {
|
|
430
|
+
if (typeof request === "object" && request !== null && "id" in request) {
|
|
431
|
+
const id = request.id;
|
|
432
|
+
if (typeof id === "string" || typeof id === "number") {
|
|
433
|
+
return id;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return undefined;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Creates default response accessor based on protocol name.
|
|
440
|
+
*/
|
|
441
|
+
createDefaultAccessor() {
|
|
442
|
+
const protocolName = this.protocol.name.toLowerCase();
|
|
443
|
+
if (protocolName === "jsonrpc") {
|
|
444
|
+
return new JsonRpcResponseAccessor();
|
|
445
|
+
}
|
|
446
|
+
if (protocolName === "simple") {
|
|
447
|
+
return new SimpleResponseAccessor();
|
|
448
|
+
}
|
|
449
|
+
throw new Error(`Unknown protocol '${this.protocol.name}'. Please provide a custom responseAccessor.`);
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Runs middleware hook for all registered middleware.
|
|
453
|
+
*/
|
|
454
|
+
async runMiddlewareHook(hook, data) {
|
|
455
|
+
for (const mw of this.middleware) {
|
|
456
|
+
const fn = mw[hook];
|
|
457
|
+
if (fn !== undefined) {
|
|
458
|
+
const typedFn = fn;
|
|
459
|
+
try {
|
|
460
|
+
await typedFn.call(mw, data);
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
// Log but don't throw - middleware errors shouldn't break the channel
|
|
464
|
+
console.error(`Error in middleware hook '${hook}':`, error);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Emits error event.
|
|
471
|
+
*/
|
|
472
|
+
emitError(error) {
|
|
473
|
+
this.events.emit("error", error);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=request-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-channel.js","sourceRoot":"","sources":["../../src/channel/request-channel.ts"],"names":[],"mappings":"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"}
|