@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,288 @@
|
|
|
1
|
+
import { ProtocolError } from "../utils/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* JSON-RPC 2.0 error codes.
|
|
4
|
+
* @see https://www.jsonrpc.org/specification#error_object
|
|
5
|
+
*/
|
|
6
|
+
export const JsonRpcErrorCodes = {
|
|
7
|
+
/** Invalid JSON was received by the server. */
|
|
8
|
+
PARSE_ERROR: -32700,
|
|
9
|
+
/** The JSON sent is not a valid Request object. */
|
|
10
|
+
INVALID_REQUEST: -32600,
|
|
11
|
+
/** The method does not exist / is not available. */
|
|
12
|
+
METHOD_NOT_FOUND: -32601,
|
|
13
|
+
/** Invalid method parameter(s). */
|
|
14
|
+
INVALID_PARAMS: -32602,
|
|
15
|
+
/** Internal JSON-RPC error. */
|
|
16
|
+
INTERNAL_ERROR: -32603,
|
|
17
|
+
// Server errors: -32000 to -32099 are reserved for implementation-defined server errors
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* JSON-RPC 2.0 protocol implementation.
|
|
21
|
+
*
|
|
22
|
+
* Follows the JSON-RPC 2.0 specification for request/response messaging.
|
|
23
|
+
* Provides strict validation and automatic ID generation.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const protocol = new JsonRpcProtocol();
|
|
28
|
+
* const req = protocol.createRequest('getUser', { id: 42 });
|
|
29
|
+
* const res = protocol.createResponse(req.id, { name: 'Alice' });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class JsonRpcProtocol {
|
|
33
|
+
name = "jsonrpc";
|
|
34
|
+
version = "2.0";
|
|
35
|
+
idCounter = 0;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a JSON-RPC 2.0 request message.
|
|
38
|
+
*
|
|
39
|
+
* @param method - Method name (must be non-empty string)
|
|
40
|
+
* @param params - Optional parameters
|
|
41
|
+
* @param id - Optional request ID (auto-generated if not provided)
|
|
42
|
+
* @returns JSON-RPC request object
|
|
43
|
+
* @throws {ProtocolError} if method is invalid
|
|
44
|
+
*/
|
|
45
|
+
createRequest(method, params, id) {
|
|
46
|
+
if (typeof method !== "string" || method.length === 0) {
|
|
47
|
+
throw new ProtocolError("Method must be a non-empty string");
|
|
48
|
+
}
|
|
49
|
+
const requestId = id ?? this.generateId();
|
|
50
|
+
const request = {
|
|
51
|
+
jsonrpc: "2.0",
|
|
52
|
+
id: requestId,
|
|
53
|
+
method,
|
|
54
|
+
};
|
|
55
|
+
if (params !== undefined) {
|
|
56
|
+
request.params = params;
|
|
57
|
+
}
|
|
58
|
+
return request;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Creates a JSON-RPC 2.0 success response message.
|
|
62
|
+
*
|
|
63
|
+
* @param id - Request ID
|
|
64
|
+
* @param result - Response result
|
|
65
|
+
* @returns JSON-RPC response object
|
|
66
|
+
*/
|
|
67
|
+
createResponse(id, result) {
|
|
68
|
+
return {
|
|
69
|
+
jsonrpc: "2.0",
|
|
70
|
+
id,
|
|
71
|
+
result,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a JSON-RPC 2.0 error response message.
|
|
76
|
+
*
|
|
77
|
+
* @param id - Request ID
|
|
78
|
+
* @param error - Error details
|
|
79
|
+
* @returns JSON-RPC error response object
|
|
80
|
+
*/
|
|
81
|
+
createErrorResponse(id, error) {
|
|
82
|
+
return {
|
|
83
|
+
jsonrpc: "2.0",
|
|
84
|
+
id,
|
|
85
|
+
error,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Creates a JSON-RPC 2.0 notification message.
|
|
90
|
+
*
|
|
91
|
+
* @param method - Method name (must be non-empty string)
|
|
92
|
+
* @param params - Optional parameters
|
|
93
|
+
* @returns JSON-RPC notification object
|
|
94
|
+
* @throws {ProtocolError} if method is invalid
|
|
95
|
+
*/
|
|
96
|
+
createNotification(method, params) {
|
|
97
|
+
if (typeof method !== "string" || method.length === 0) {
|
|
98
|
+
throw new ProtocolError("Method must be a non-empty string");
|
|
99
|
+
}
|
|
100
|
+
const notification = {
|
|
101
|
+
jsonrpc: "2.0",
|
|
102
|
+
method,
|
|
103
|
+
};
|
|
104
|
+
if (params !== undefined) {
|
|
105
|
+
notification.params = params;
|
|
106
|
+
}
|
|
107
|
+
return notification;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parses incoming data as JSON-RPC 2.0 message.
|
|
111
|
+
* Does not throw - returns 'invalid' kind for malformed messages.
|
|
112
|
+
*
|
|
113
|
+
* @param data - Raw incoming data
|
|
114
|
+
* @returns ParsedMessage discriminated union
|
|
115
|
+
*/
|
|
116
|
+
parseMessage(data) {
|
|
117
|
+
// Must be an object
|
|
118
|
+
if (!isObject(data)) {
|
|
119
|
+
return {
|
|
120
|
+
kind: "invalid",
|
|
121
|
+
error: {
|
|
122
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
123
|
+
message: "Message must be an object",
|
|
124
|
+
},
|
|
125
|
+
raw: data,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Must have jsonrpc: "2.0"
|
|
129
|
+
if (data.jsonrpc !== "2.0") {
|
|
130
|
+
return {
|
|
131
|
+
kind: "invalid",
|
|
132
|
+
error: {
|
|
133
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
134
|
+
message: 'Message must have jsonrpc: "2.0"',
|
|
135
|
+
},
|
|
136
|
+
raw: data,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Check if it's a response (has result or error, plus id)
|
|
140
|
+
if ("result" in data || "error" in data) {
|
|
141
|
+
return this.parseResponse(data);
|
|
142
|
+
}
|
|
143
|
+
// Check if it has a method (request or notification)
|
|
144
|
+
if ("method" in data) {
|
|
145
|
+
return this.parseRequestOrNotification(data);
|
|
146
|
+
}
|
|
147
|
+
// Invalid: no method, result, or error
|
|
148
|
+
return {
|
|
149
|
+
kind: "invalid",
|
|
150
|
+
error: {
|
|
151
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
152
|
+
message: "Message must have method, result, or error",
|
|
153
|
+
},
|
|
154
|
+
raw: data,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Type guard for request messages.
|
|
159
|
+
*/
|
|
160
|
+
isRequest(msg) {
|
|
161
|
+
return msg.kind === "request";
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Type guard for response messages.
|
|
165
|
+
*/
|
|
166
|
+
isResponse(msg) {
|
|
167
|
+
return msg.kind === "response";
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Type guard for notification messages.
|
|
171
|
+
*/
|
|
172
|
+
isNotification(msg) {
|
|
173
|
+
return msg.kind === "notification";
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Parses a response message (success or error).
|
|
177
|
+
*/
|
|
178
|
+
parseResponse(data) {
|
|
179
|
+
// Must have id
|
|
180
|
+
if (!("id" in data)) {
|
|
181
|
+
return {
|
|
182
|
+
kind: "invalid",
|
|
183
|
+
error: {
|
|
184
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
185
|
+
message: "Response must have id",
|
|
186
|
+
},
|
|
187
|
+
raw: data,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Validate id type
|
|
191
|
+
if (!isValidId(data.id)) {
|
|
192
|
+
return {
|
|
193
|
+
kind: "invalid",
|
|
194
|
+
error: {
|
|
195
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
196
|
+
message: "Response id must be string or number",
|
|
197
|
+
},
|
|
198
|
+
raw: data,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const hasResult = "result" in data;
|
|
202
|
+
const hasError = "error" in data;
|
|
203
|
+
// Must have exactly one of result or error
|
|
204
|
+
if (hasResult && hasError) {
|
|
205
|
+
return {
|
|
206
|
+
kind: "invalid",
|
|
207
|
+
error: {
|
|
208
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
209
|
+
message: "Response must have either result or error, not both",
|
|
210
|
+
},
|
|
211
|
+
raw: data,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (!hasResult && !hasError) {
|
|
215
|
+
return {
|
|
216
|
+
kind: "invalid",
|
|
217
|
+
error: {
|
|
218
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
219
|
+
message: "Response must have either result or error",
|
|
220
|
+
},
|
|
221
|
+
raw: data,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
// Valid response
|
|
225
|
+
return {
|
|
226
|
+
kind: "response",
|
|
227
|
+
message: data,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Parses a request or notification message.
|
|
232
|
+
*/
|
|
233
|
+
parseRequestOrNotification(data) {
|
|
234
|
+
// Validate method
|
|
235
|
+
if (typeof data.method !== "string" || data.method.length === 0) {
|
|
236
|
+
return {
|
|
237
|
+
kind: "invalid",
|
|
238
|
+
error: {
|
|
239
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
240
|
+
message: "Method must be a non-empty string",
|
|
241
|
+
},
|
|
242
|
+
raw: data,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// If has id, it's a request
|
|
246
|
+
if ("id" in data) {
|
|
247
|
+
// Validate id type
|
|
248
|
+
if (!isValidId(data.id)) {
|
|
249
|
+
return {
|
|
250
|
+
kind: "invalid",
|
|
251
|
+
error: {
|
|
252
|
+
code: JsonRpcErrorCodes.INVALID_REQUEST,
|
|
253
|
+
message: "Request id must be string or number",
|
|
254
|
+
},
|
|
255
|
+
raw: data,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
kind: "request",
|
|
260
|
+
message: data,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
// No id, it's a notification
|
|
264
|
+
return {
|
|
265
|
+
kind: "notification",
|
|
266
|
+
message: data,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Generates a unique request ID.
|
|
271
|
+
*/
|
|
272
|
+
generateId() {
|
|
273
|
+
return ++this.idCounter;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Type guard to check if value is an object (non-null).
|
|
278
|
+
*/
|
|
279
|
+
function isObject(value) {
|
|
280
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Type guard to validate request ID type.
|
|
284
|
+
*/
|
|
285
|
+
function isValidId(value) {
|
|
286
|
+
return typeof value === "string" || typeof value === "number";
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=jsonrpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../src/protocol/jsonrpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { Protocol, ParsedMessage, RequestId, ProtocolDataError } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Simple protocol request message.
|
|
4
|
+
*/
|
|
5
|
+
export interface SimpleRequest {
|
|
6
|
+
type: "request";
|
|
7
|
+
id: RequestId;
|
|
8
|
+
method: string;
|
|
9
|
+
params?: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Simple protocol response message (success).
|
|
13
|
+
*/
|
|
14
|
+
export interface SimpleResponse {
|
|
15
|
+
type: "response";
|
|
16
|
+
id: RequestId;
|
|
17
|
+
result?: unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Simple protocol error response message.
|
|
21
|
+
*/
|
|
22
|
+
export interface SimpleErrorResponse {
|
|
23
|
+
type: "response";
|
|
24
|
+
id: RequestId;
|
|
25
|
+
error: ProtocolDataError;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Simple protocol notification message (no response expected).
|
|
29
|
+
*/
|
|
30
|
+
export interface SimpleNotification {
|
|
31
|
+
type: "notification";
|
|
32
|
+
method: string;
|
|
33
|
+
params?: unknown;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Union of all simple protocol message types for responses.
|
|
37
|
+
*/
|
|
38
|
+
export type SimpleResponseMessage = SimpleResponse | SimpleErrorResponse;
|
|
39
|
+
/**
|
|
40
|
+
* Minimal protocol implementation with no JSON-RPC overhead.
|
|
41
|
+
*
|
|
42
|
+
* Provides a lightweight request/response/notification protocol
|
|
43
|
+
* suitable for high-performance or custom IPC scenarios.
|
|
44
|
+
*
|
|
45
|
+
* Message format:
|
|
46
|
+
* - Request: `{ type: 'request', id, method, params? }`
|
|
47
|
+
* - Response: `{ type: 'response', id, result?, error? }`
|
|
48
|
+
* - Notification: `{ type: 'notification', method, params? }`
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const protocol = new SimpleProtocol();
|
|
53
|
+
* const req = protocol.createRequest('getUser', { id: 42 });
|
|
54
|
+
* const res = protocol.createResponse(req.id, { name: 'Alice' });
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare class SimpleProtocol implements Protocol<SimpleRequest, SimpleResponseMessage, SimpleNotification> {
|
|
58
|
+
readonly name = "simple";
|
|
59
|
+
readonly version = "1.0";
|
|
60
|
+
private idCounter;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a simple protocol request message.
|
|
63
|
+
*
|
|
64
|
+
* @param method - Method name (must be non-empty string)
|
|
65
|
+
* @param params - Optional parameters
|
|
66
|
+
* @param id - Optional request ID (auto-generated if not provided)
|
|
67
|
+
* @returns Simple request object
|
|
68
|
+
* @throws {ProtocolError} if method is invalid
|
|
69
|
+
*/
|
|
70
|
+
createRequest(method: string, params?: unknown, id?: RequestId): SimpleRequest;
|
|
71
|
+
/**
|
|
72
|
+
* Creates a simple protocol success response message.
|
|
73
|
+
*
|
|
74
|
+
* @param id - Request ID
|
|
75
|
+
* @param result - Response result
|
|
76
|
+
* @returns Simple response object
|
|
77
|
+
*/
|
|
78
|
+
createResponse(id: RequestId, result: unknown): SimpleResponse;
|
|
79
|
+
/**
|
|
80
|
+
* Creates a simple protocol error response message.
|
|
81
|
+
*
|
|
82
|
+
* @param id - Request ID
|
|
83
|
+
* @param error - Error details
|
|
84
|
+
* @returns Simple error response object
|
|
85
|
+
*/
|
|
86
|
+
createErrorResponse(id: RequestId, error: ProtocolDataError): SimpleErrorResponse;
|
|
87
|
+
/**
|
|
88
|
+
* Creates a simple protocol notification message.
|
|
89
|
+
*
|
|
90
|
+
* @param method - Method name (must be non-empty string)
|
|
91
|
+
* @param params - Optional parameters
|
|
92
|
+
* @returns Simple notification object
|
|
93
|
+
* @throws {ProtocolError} if method is invalid
|
|
94
|
+
*/
|
|
95
|
+
createNotification(method: string, params?: unknown): SimpleNotification;
|
|
96
|
+
/**
|
|
97
|
+
* Parses incoming data as simple protocol message.
|
|
98
|
+
* Does not throw - returns 'invalid' kind for malformed messages.
|
|
99
|
+
*
|
|
100
|
+
* @param data - Raw incoming data
|
|
101
|
+
* @returns ParsedMessage discriminated union
|
|
102
|
+
*/
|
|
103
|
+
parseMessage(data: unknown): ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>;
|
|
104
|
+
/**
|
|
105
|
+
* Type guard for request messages.
|
|
106
|
+
*/
|
|
107
|
+
isRequest(msg: ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>): msg is Extract<ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>, {
|
|
108
|
+
kind: "request";
|
|
109
|
+
}>;
|
|
110
|
+
/**
|
|
111
|
+
* Type guard for response messages.
|
|
112
|
+
*/
|
|
113
|
+
isResponse(msg: ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>): msg is Extract<ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>, {
|
|
114
|
+
kind: "response";
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* Type guard for notification messages.
|
|
118
|
+
*/
|
|
119
|
+
isNotification(msg: ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>): msg is Extract<ParsedMessage<SimpleRequest, SimpleResponseMessage, SimpleNotification>, {
|
|
120
|
+
kind: "notification";
|
|
121
|
+
}>;
|
|
122
|
+
/**
|
|
123
|
+
* Parses a request message.
|
|
124
|
+
*/
|
|
125
|
+
private parseRequest;
|
|
126
|
+
/**
|
|
127
|
+
* Parses a response message.
|
|
128
|
+
*/
|
|
129
|
+
private parseResponse;
|
|
130
|
+
/**
|
|
131
|
+
* Parses a notification message.
|
|
132
|
+
*/
|
|
133
|
+
private parseNotification;
|
|
134
|
+
/**
|
|
135
|
+
* Generates a unique request ID.
|
|
136
|
+
*/
|
|
137
|
+
private generateId;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=simple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../src/protocol/simple.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEzE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cACX,YAAW,QAAQ,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC;IAE7E,SAAgB,IAAI,YAAY;IAChC,SAAgB,OAAO,SAAS;IAEhC,OAAO,CAAC,SAAS,CAAK;IAEtB;;;;;;;;OAQG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,aAAa;IAoB9E;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,cAAc;IAQ9D;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,GAAG,mBAAmB;IAQjF;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,kBAAkB;IAiBxE;;;;;;OAMG;IACH,YAAY,CACV,IAAI,EAAE,OAAO,GACZ,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC;IA4C1E;;OAEG;IACH,SAAS,CACP,GAAG,EAAE,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,GAC3E,GAAG,IAAI,OAAO,CACf,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EACvE;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CACpB;IAID;;OAEG;IACH,UAAU,CACR,GAAG,EAAE,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,GAC3E,GAAG,IAAI,OAAO,CACf,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EACvE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,CACrB;IAID;;OAEG;IACH,cAAc,CACZ,GAAG,EAAE,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,GAC3E,GAAG,IAAI,OAAO,CACf,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EACvE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,CACzB;IAID;;OAEG;IACH,OAAO,CAAC,YAAY;IA6CpB;;OAEG;IACH,OAAO,CAAC,aAAa;IA6CrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
|