@yuhere/js-jsonrpc2 0.0.0-stage → 2.1.2

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.
Files changed (174) hide show
  1. package/README.md +277 -2
  2. package/SKILL.md +237 -0
  3. package/dist/cli/cli.d.ts +3 -0
  4. package/dist/cli/cli.d.ts.map +1 -0
  5. package/dist/cli/cli.js +132 -0
  6. package/dist/cli/cli.js.map +1 -0
  7. package/dist/cli/demo-methods.d.ts +10 -0
  8. package/dist/cli/demo-methods.d.ts.map +1 -0
  9. package/dist/cli/demo-methods.js +477 -0
  10. package/dist/cli/demo-methods.js.map +1 -0
  11. package/dist/cli/express.d.ts +2 -0
  12. package/dist/cli/express.d.ts.map +1 -0
  13. package/dist/cli/express.js +42 -0
  14. package/dist/cli/express.js.map +1 -0
  15. package/dist/cli/stdio.d.ts +2 -0
  16. package/dist/cli/stdio.d.ts.map +1 -0
  17. package/dist/cli/stdio.js +5 -0
  18. package/dist/cli/stdio.js.map +1 -0
  19. package/dist/core/Repository.d.ts +24 -0
  20. package/dist/core/Repository.d.ts.map +1 -0
  21. package/dist/core/Repository.js +153 -0
  22. package/dist/core/Repository.js.map +1 -0
  23. package/dist/core/convert.d.ts +4 -0
  24. package/dist/core/convert.d.ts.map +1 -0
  25. package/dist/core/convert.js +29 -0
  26. package/dist/core/convert.js.map +1 -0
  27. package/dist/core/descriptor.d.ts +27 -0
  28. package/dist/core/descriptor.d.ts.map +1 -0
  29. package/dist/core/descriptor.js +83 -0
  30. package/dist/core/descriptor.js.map +1 -0
  31. package/dist/core/index.d.ts +4 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +3 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/permission.d.ts +4 -0
  36. package/dist/core/permission.d.ts.map +1 -0
  37. package/dist/core/permission.js +18 -0
  38. package/dist/core/permission.js.map +1 -0
  39. package/dist/core/spec-check.d.ts +3 -0
  40. package/dist/core/spec-check.d.ts.map +1 -0
  41. package/dist/core/spec-check.js +11 -0
  42. package/dist/core/spec-check.js.map +1 -0
  43. package/dist/core/system-methods.d.ts +3 -0
  44. package/dist/core/system-methods.d.ts.map +1 -0
  45. package/dist/core/system-methods.js +76 -0
  46. package/dist/core/system-methods.js.map +1 -0
  47. package/dist/errors/RpcError.d.ts +9 -0
  48. package/dist/errors/RpcError.d.ts.map +1 -0
  49. package/dist/errors/RpcError.js +23 -0
  50. package/dist/errors/RpcError.js.map +1 -0
  51. package/dist/errors/codes.d.ts +7 -0
  52. package/dist/errors/codes.d.ts.map +1 -0
  53. package/dist/errors/codes.js +7 -0
  54. package/dist/errors/codes.js.map +1 -0
  55. package/dist/errors/index.d.ts +3 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +3 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/index.d.ts +18 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +17 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/schema/index.d.ts +4 -0
  64. package/dist/schema/index.d.ts.map +1 -0
  65. package/dist/schema/index.js +4 -0
  66. package/dist/schema/index.js.map +1 -0
  67. package/dist/schema/json/index.d.ts +19 -0
  68. package/dist/schema/json/index.d.ts.map +1 -0
  69. package/dist/schema/json/index.js +6 -0
  70. package/dist/schema/json/index.js.map +1 -0
  71. package/dist/schema/json/marker.d.ts +23 -0
  72. package/dist/schema/json/marker.d.ts.map +1 -0
  73. package/dist/schema/json/marker.js +27 -0
  74. package/dist/schema/json/marker.js.map +1 -0
  75. package/dist/schema/json/primitives.d.ts +202 -0
  76. package/dist/schema/json/primitives.d.ts.map +1 -0
  77. package/dist/schema/json/primitives.js +598 -0
  78. package/dist/schema/json/primitives.js.map +1 -0
  79. package/dist/schema/primitives.d.ts +25 -0
  80. package/dist/schema/primitives.d.ts.map +1 -0
  81. package/dist/schema/primitives.js +153 -0
  82. package/dist/schema/primitives.js.map +1 -0
  83. package/dist/schema/rpc.d.ts +21 -0
  84. package/dist/schema/rpc.d.ts.map +1 -0
  85. package/dist/schema/rpc.js +17 -0
  86. package/dist/schema/rpc.js.map +1 -0
  87. package/dist/schema/z/protocol.d.ts +9 -0
  88. package/dist/schema/z/protocol.d.ts.map +1 -0
  89. package/dist/schema/z/protocol.js +9 -0
  90. package/dist/schema/z/protocol.js.map +1 -0
  91. package/dist/schema/z/register.d.ts +9 -0
  92. package/dist/schema/z/register.d.ts.map +1 -0
  93. package/dist/schema/z/register.js +21 -0
  94. package/dist/schema/z/register.js.map +1 -0
  95. package/dist/stream/index.d.ts +3 -0
  96. package/dist/stream/index.d.ts.map +1 -0
  97. package/dist/stream/index.js +2 -0
  98. package/dist/stream/index.js.map +1 -0
  99. package/dist/stream/stringify-stream.d.ts +15 -0
  100. package/dist/stream/stringify-stream.d.ts.map +1 -0
  101. package/dist/stream/stringify-stream.js +322 -0
  102. package/dist/stream/stringify-stream.js.map +1 -0
  103. package/dist/stream/stringify.d.ts +19 -0
  104. package/dist/stream/stringify.d.ts.map +1 -0
  105. package/dist/stream/stringify.js +217 -0
  106. package/dist/stream/stringify.js.map +1 -0
  107. package/dist/transport/express/body.d.ts +9 -0
  108. package/dist/transport/express/body.d.ts.map +1 -0
  109. package/dist/transport/express/body.js +28 -0
  110. package/dist/transport/express/body.js.map +1 -0
  111. package/dist/transport/express/index.d.ts +3 -0
  112. package/dist/transport/express/index.d.ts.map +1 -0
  113. package/dist/transport/express/index.js +2 -0
  114. package/dist/transport/express/index.js.map +1 -0
  115. package/dist/transport/express/middleware.d.ts +12 -0
  116. package/dist/transport/express/middleware.d.ts.map +1 -0
  117. package/dist/transport/express/middleware.js +73 -0
  118. package/dist/transport/express/middleware.js.map +1 -0
  119. package/dist/transport/express/respond.d.ts +4 -0
  120. package/dist/transport/express/respond.d.ts.map +1 -0
  121. package/dist/transport/express/respond.js +125 -0
  122. package/dist/transport/express/respond.js.map +1 -0
  123. package/dist/transport/stdio/index.d.ts +2 -0
  124. package/dist/transport/stdio/index.d.ts.map +1 -0
  125. package/dist/transport/stdio/index.js +2 -0
  126. package/dist/transport/stdio/index.js.map +1 -0
  127. package/dist/transport/stdio/middleware.d.ts +34 -0
  128. package/dist/transport/stdio/middleware.d.ts.map +1 -0
  129. package/dist/transport/stdio/middleware.js +274 -0
  130. package/dist/transport/stdio/middleware.js.map +1 -0
  131. package/dist/transport/ws/index.d.ts +3 -0
  132. package/dist/transport/ws/index.d.ts.map +1 -0
  133. package/dist/transport/ws/index.js +3 -0
  134. package/dist/transport/ws/index.js.map +1 -0
  135. package/dist/transport/ws/middleware.d.ts +25 -0
  136. package/dist/transport/ws/middleware.d.ts.map +1 -0
  137. package/dist/transport/ws/middleware.js +209 -0
  138. package/dist/transport/ws/middleware.js.map +1 -0
  139. package/dist/transport/ws/standalone.d.ts +22 -0
  140. package/dist/transport/ws/standalone.d.ts.map +1 -0
  141. package/dist/transport/ws/standalone.js +39 -0
  142. package/dist/transport/ws/standalone.js.map +1 -0
  143. package/dist/types.d.ts +75 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +2 -0
  146. package/dist/types.js.map +1 -0
  147. package/htdoc/assets/index-CQr-lnlD.js +9286 -0
  148. package/htdoc/assets/index-CQr-lnlD.js.map +1 -0
  149. package/htdoc/assets/index-hcP2-9jw.css +729 -0
  150. package/htdoc/index.html +13 -0
  151. package/package.json +89 -3
  152. package/webui/index.html +12 -0
  153. package/webui/src/App.tsx +56 -0
  154. package/webui/src/api/httpTransport.ts +148 -0
  155. package/webui/src/api/paramForm.ts +79 -0
  156. package/webui/src/api/rpc.ts +57 -0
  157. package/webui/src/api/schema.ts +12 -0
  158. package/webui/src/api/types.ts +16 -0
  159. package/webui/src/api/wsTransport.ts +305 -0
  160. package/webui/src/components/MethodDetail.tsx +43 -0
  161. package/webui/src/components/MethodTree.tsx +118 -0
  162. package/webui/src/components/SchemaForm.tsx +696 -0
  163. package/webui/src/components/SchemaView.tsx +151 -0
  164. package/webui/src/components/TestPanel.tsx +279 -0
  165. package/webui/src/components/Toolbar.tsx +70 -0
  166. package/webui/src/hooks/useMethodDetail.ts +61 -0
  167. package/webui/src/hooks/useMethods.ts +27 -0
  168. package/webui/src/main.tsx +13 -0
  169. package/webui/src/styles/geek.css +729 -0
  170. package/webui/src/theme/ThemeProvider.tsx +79 -0
  171. package/webui/src/vite-env.d.ts +1 -0
  172. package/webui/tsconfig.json +34 -0
  173. package/webui/tsconfig.node.json +13 -0
  174. package/webui/vite.config.ts +15 -0
@@ -0,0 +1,274 @@
1
+ import { StringDecoder } from 'node:string_decoder';
2
+ import { Repository } from '../../core/Repository';
3
+ import { INTERNAL_ERROR, PARSE_ERROR } from '../../errors/codes';
4
+ import { RPCVersion } from '../../schema/z/protocol';
5
+ import { stringify } from '../../stream/stringify-stream';
6
+ function isStreamSuccess(payload) {
7
+ return (!!payload &&
8
+ typeof payload === 'object' &&
9
+ typeof payload.chunks === 'object' &&
10
+ payload.chunks !== null &&
11
+ typeof payload.chunks[Symbol.asyncIterator] === 'function');
12
+ }
13
+ /**
14
+ * Serve JSON-RPC 2.0 over a pair of newline-delimited JSON (NDJSON) streams.
15
+ *
16
+ * This is useful for IDE/CLI integrations where each request is a single line
17
+ * of JSON on stdin and each response is a single line of JSON on stdout.
18
+ *
19
+ * Resolves when the input stream ends.
20
+ */
21
+ export async function serveStdio(options = {}) {
22
+ const repository = options.repository ?? new Repository();
23
+ const input = options.input ?? process.stdin;
24
+ const output = options.output ?? process.stdout;
25
+ const framing = options.framing ?? 'lines';
26
+ const maxFrameBytes = options.maxFrameBytes ?? 1024 * 1024;
27
+ const decoder = new StringDecoder('utf8');
28
+ let buffer = '';
29
+ // Serialize writes so responses don't interleave.
30
+ let writeChain = Promise.resolve();
31
+ const ctx = {
32
+ repository,
33
+ options,
34
+ injectables: buildInjectables(options.mkInjectable, repository),
35
+ writeChain: () => writeChain,
36
+ setWriteChain: (p) => {
37
+ writeChain = p;
38
+ },
39
+ output,
40
+ };
41
+ await new Promise((resolve, reject) => {
42
+ const onData = (chunk) => {
43
+ try {
44
+ buffer += typeof chunk === 'string' ? chunk : decoder.write(chunk);
45
+ if (framing === 'lines') {
46
+ const parts = buffer.split('\n');
47
+ buffer = parts.pop() ?? '';
48
+ for (const line of parts) {
49
+ const trimmed = line.trim();
50
+ if (trimmed.length > 0) {
51
+ void dispatch(ctx, trimmed);
52
+ }
53
+ }
54
+ }
55
+ else {
56
+ // JSON framing: extract balanced JSON values.
57
+ let consumed = 0;
58
+ let rest = buffer;
59
+ while (rest.length > 0) {
60
+ const slice = extractJsonValue(rest);
61
+ if (slice === undefined)
62
+ break;
63
+ consumed += slice.length;
64
+ rest = rest.slice(slice.length);
65
+ if (slice.trim().length > 0) {
66
+ void dispatch(ctx, slice);
67
+ }
68
+ }
69
+ buffer = rest;
70
+ }
71
+ if (buffer.length > maxFrameBytes) {
72
+ throw new Error(`JSON-RPC frame exceeded ${maxFrameBytes} bytes without terminator.`);
73
+ }
74
+ }
75
+ catch (error) {
76
+ reject(error);
77
+ }
78
+ };
79
+ const onEnd = () => {
80
+ // Flush any trailing frame (no trailing newline).
81
+ const trailing = framing === 'lines' ? buffer.trim() : buffer.trim();
82
+ buffer = '';
83
+ if (trailing.length > 0) {
84
+ void dispatch(ctx, trailing);
85
+ }
86
+ input.off('data', onData);
87
+ input.off('end', onEnd);
88
+ input.off('error', onError);
89
+ // Wait for outstanding writes to drain before resolving.
90
+ writeChain.then(() => resolve(), reject);
91
+ };
92
+ const onError = (error) => {
93
+ input.off('data', onData);
94
+ input.off('end', onEnd);
95
+ input.off('error', onError);
96
+ reject(error);
97
+ };
98
+ input.on('data', onData);
99
+ input.on('end', onEnd);
100
+ input.on('error', onError);
101
+ });
102
+ }
103
+ async function dispatch(ctx, text) {
104
+ let input;
105
+ try {
106
+ input = JSON.parse(text);
107
+ }
108
+ catch (error) {
109
+ await writeResponse(ctx, {
110
+ jsonrpc: RPCVersion,
111
+ id: null,
112
+ error: {
113
+ code: PARSE_ERROR,
114
+ message: 'Parse error',
115
+ ...(process.env['NODE_ENV'] !== 'production'
116
+ ? { data: error instanceof Error ? error.message : String(error) }
117
+ : {}),
118
+ },
119
+ });
120
+ return;
121
+ }
122
+ let output;
123
+ try {
124
+ output = await ctx.repository.invoke(input, {
125
+ injections: ctx.injectables,
126
+ errorTransform: ctx.options.errorTransform,
127
+ });
128
+ }
129
+ catch (error) {
130
+ output = fallbackFailure(error);
131
+ }
132
+ if (isStreamSuccess(output)) {
133
+ await writeStream(ctx, output);
134
+ return;
135
+ }
136
+ await writeResponse(ctx, output);
137
+ }
138
+ async function writeStream(ctx, stream) {
139
+ try {
140
+ for await (const chunk of stream.chunks) {
141
+ await writeFrame(ctx, chunk);
142
+ }
143
+ }
144
+ catch (error) {
145
+ if (process.env['NODE_ENV'] !== 'production') {
146
+ const message = error instanceof Error ? error.message : String(error);
147
+ console.error('Failed to stream JSON-RPC response over stdio', message, error);
148
+ }
149
+ }
150
+ }
151
+ async function writeResponse(ctx, payload) {
152
+ await enqueueWrite(ctx, payload);
153
+ }
154
+ async function writeFrame(ctx, chunk) {
155
+ await enqueueWrite(ctx, chunk);
156
+ }
157
+ async function enqueueWrite(ctx, payload) {
158
+ const next = ctx.writeChain().then(() => new Promise(async (resolve) => {
159
+ const text = await stringify(payload) + '\n';
160
+ let done = false;
161
+ const finish = () => {
162
+ if (done)
163
+ return;
164
+ done = true;
165
+ resolve();
166
+ };
167
+ try {
168
+ const flushed = ctx.output.write(text, 'utf8', finish);
169
+ if (flushed) {
170
+ // Node may not call the callback if the buffer was already flushed
171
+ // for some streams; still resolve on next tick to be safe.
172
+ queueMicrotask(finish);
173
+ }
174
+ }
175
+ catch (error) {
176
+ if (process.env['NODE_ENV'] !== 'production') {
177
+ console.error('Failed to write JSON-RPC response to stdio', error);
178
+ }
179
+ finish();
180
+ }
181
+ if ('chunks' in payload === false && ctx.options.onResponse) {
182
+ try {
183
+ ctx.options.onResponse(payload);
184
+ }
185
+ catch {
186
+ /* ignore listener errors */
187
+ }
188
+ }
189
+ }));
190
+ ctx.setWriteChain(next);
191
+ await next;
192
+ }
193
+ function buildInjectables(factory, repository) {
194
+ if (typeof factory === 'function') {
195
+ // No HTTP req/res in stdio; pass through placeholder values.
196
+ return factory(undefined, undefined, repository);
197
+ }
198
+ return {
199
+ repository,
200
+ input: process.stdin,
201
+ output: process.stdout,
202
+ };
203
+ }
204
+ function fallbackFailure(error) {
205
+ const message = error instanceof Error ? error.message : String(error);
206
+ return {
207
+ jsonrpc: RPCVersion,
208
+ id: null,
209
+ error: {
210
+ code: INTERNAL_ERROR,
211
+ message: 'Internal error',
212
+ ...(process.env['NODE_ENV'] !== 'production' ? { data: message } : {}),
213
+ },
214
+ };
215
+ }
216
+ /**
217
+ * Scan `text` for the first complete JSON value and return it.
218
+ * Returns `undefined` if `text` does not yet contain a complete value.
219
+ */
220
+ function extractJsonValue(text) {
221
+ let i = 0;
222
+ // Skip leading whitespace.
223
+ while (i < text.length && isWs(text.charCodeAt(i)))
224
+ i++;
225
+ if (i >= text.length)
226
+ return undefined;
227
+ const start = i;
228
+ const first = text.charCodeAt(i);
229
+ if (first !== 0x7b /* { */ && first !== 0x5b /* [ */) {
230
+ // Primitive top-level values (unusual for RPC, but JSON-valid).
231
+ // Consume until whitespace or end.
232
+ while (i < text.length && !isWs(text.charCodeAt(i)))
233
+ i++;
234
+ if (i >= text.length)
235
+ return undefined;
236
+ return text.slice(start, i);
237
+ }
238
+ let depth = 0;
239
+ let inString = false;
240
+ let escaped = false;
241
+ for (; i < text.length; i++) {
242
+ const ch = text.charCodeAt(i);
243
+ if (inString) {
244
+ if (escaped) {
245
+ escaped = false;
246
+ }
247
+ else if (ch === 0x5c /* \ */) {
248
+ escaped = true;
249
+ }
250
+ else if (ch === 0x22 /* " */) {
251
+ inString = false;
252
+ }
253
+ continue;
254
+ }
255
+ if (ch === 0x22) {
256
+ inString = true;
257
+ }
258
+ else if (ch === 0x7b || ch === 0x5b) {
259
+ depth++;
260
+ }
261
+ else if (ch === 0x7d || ch === 0x5d) {
262
+ depth--;
263
+ if (depth === 0) {
264
+ return text.slice(start, i + 1);
265
+ }
266
+ }
267
+ }
268
+ return undefined;
269
+ }
270
+ function isWs(code) {
271
+ // space, \t, \n, \r
272
+ return code === 0x20 || code === 0x09 || code === 0x0a || code === 0x0d;
273
+ }
274
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/transport/stdio/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { attachWebSocket, type WSOptions } from './middleware';
2
+ export { createWebSocketServer, type StandaloneWsOptions, type StandaloneWsHandle, } from './standalone';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transport/ws/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { attachWebSocket } from './middleware';
2
+ export { createWebSocketServer, } from './standalone';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/ws/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAC;AAC/D,OAAO,EACL,qBAAqB,GAGtB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { IncomingMessage, Server } from 'node:http';
2
+ import { WebSocketServer, WebSocket } from 'ws';
3
+ import { Repository } from '../../core/Repository';
4
+ import type { InjectableFactory, RPCErrorTransform } from '../../types';
5
+ export interface WSOptions {
6
+ /** Build injectables for a WS connection. */
7
+ mkInjectable?: InjectableFactory;
8
+ /** Global error transform. */
9
+ errorTransform?: RPCErrorTransform;
10
+ /** WebSocket server path (default: `/`). Only used by `attachWebSocket`. */
11
+ path?: string;
12
+ /** Whether to skip connection upgrade for non-matching paths. */
13
+ allowOrigin?: (origin: string | undefined, req: IncomingMessage) => boolean;
14
+ /** Max payload size forwarded to `ws` (default 1mb). */
15
+ maxPayload?: number;
16
+ /** Called once a connection is established. */
17
+ onConnection?: (socket: WebSocket, req: IncomingMessage) => void;
18
+ }
19
+ /**
20
+ * Attach a JSON-RPC 2.0 WebSocket endpoint to an existing `http.Server`.
21
+ *
22
+ * Returns the underlying `WebSocketServer` so the caller can close it.
23
+ */
24
+ export declare function attachWebSocket(server: Server, repository: Repository, options: WSOptions): WebSocketServer;
25
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/transport/ws/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EACR,iBAAiB,EAEjB,iBAAiB,EAIpB,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,SAAS;IACtB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,8BAA8B;IAC9B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC;IAC5E,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;CACpE;AAmBD;;;;GAIG;AACH,wBAAgB,eAAe,CAC3B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,SAAS,GACnB,eAAe,CAgDjB"}
@@ -0,0 +1,209 @@
1
+ import { WebSocketServer, WebSocket } from 'ws';
2
+ import { INTERNAL_ERROR, PARSE_ERROR } from '../../errors/codes';
3
+ import { stringify } from "../../stream/stringify-stream";
4
+ import { RPCVersion } from '../../schema/z/protocol';
5
+ function isStreamSuccess(payload) {
6
+ return (!!payload &&
7
+ typeof payload === 'object' &&
8
+ typeof payload.chunks === 'object' &&
9
+ payload.chunks !== null &&
10
+ typeof payload.chunks[Symbol.asyncIterator] === 'function');
11
+ }
12
+ /**
13
+ * Attach a JSON-RPC 2.0 WebSocket endpoint to an existing `http.Server`.
14
+ *
15
+ * Returns the underlying `WebSocketServer` so the caller can close it.
16
+ */
17
+ export function attachWebSocket(server, repository, options) {
18
+ const wss = new WebSocketServer({
19
+ noServer: true,
20
+ maxPayload: options.maxPayload ?? 1024 * 1024,
21
+ });
22
+ const path = options.path ?? '/';
23
+ const upgradeHandler = (req, socket, head) => {
24
+ const url = req.url ?? '/';
25
+ // Strip query string before matching.
26
+ const pathname = url.split('?', 1)[0] ?? '/';
27
+ if (pathname !== path) {
28
+ socket.destroy();
29
+ return;
30
+ }
31
+ if (options.allowOrigin) {
32
+ const origin = req.headers.origin;
33
+ if (!options.allowOrigin(origin, req)) {
34
+ socket.destroy();
35
+ return;
36
+ }
37
+ }
38
+ wss.handleUpgrade(req, socket, head, (ws) => {
39
+ wss.emit('connection', ws, req);
40
+ });
41
+ };
42
+ server.on('upgrade', upgradeHandler);
43
+ // Cleanup hook so callers can detach the upgrade handler.
44
+ const originalClose = wss.close.bind(wss);
45
+ wss.close = ((callback) => {
46
+ server.off('upgrade', upgradeHandler);
47
+ return originalClose(callback);
48
+ });
49
+ wss.on('connection', (ws, req) => {
50
+ handleConnection(ws, req, repository, options);
51
+ });
52
+ return wss;
53
+ }
54
+ function handleConnection(ws, req, repository, options) {
55
+ const injectables = buildInjectables(options.mkInjectable, ws, req, repository);
56
+ const ctx = {
57
+ repository,
58
+ options,
59
+ injectables,
60
+ closed: false,
61
+ };
62
+ if (options.onConnection) {
63
+ options.onConnection(ws, req);
64
+ }
65
+ ws.on('message', (data, isBinary) => {
66
+ void onMessage(ctx, ws, data, isBinary);
67
+ });
68
+ ws.on('close', () => {
69
+ ctx.closed = true;
70
+ });
71
+ ws.on('error', (error) => {
72
+ if (process.env['NODE_ENV'] !== 'production') {
73
+ console.error('JSON-RPC WebSocket error', error);
74
+ }
75
+ });
76
+ }
77
+ async function onMessage(ctx, ws, data, isBinary) {
78
+ if (ctx.closed || ws.readyState !== WebSocket.OPEN)
79
+ return;
80
+ let input;
81
+ try {
82
+ input = parseFrame(data, isBinary);
83
+ }
84
+ catch (error) {
85
+ await send(ctx, ws, {
86
+ jsonrpc: RPCVersion,
87
+ id: null,
88
+ error: {
89
+ code: PARSE_ERROR,
90
+ message: 'Parse error',
91
+ ...(process.env['NODE_ENV'] !== 'production'
92
+ ? { data: error instanceof Error ? error.message : String(error) }
93
+ : {}),
94
+ },
95
+ });
96
+ return;
97
+ }
98
+ let output;
99
+ try {
100
+ output = await ctx.repository.invoke(input, {
101
+ injections: ctx.injectables,
102
+ errorTransform: ctx.options.errorTransform,
103
+ });
104
+ }
105
+ catch (error) {
106
+ output = fallbackFailure(error);
107
+ }
108
+ if (isStreamSuccess(output)) {
109
+ await sendStream(ctx, ws, output);
110
+ return;
111
+ }
112
+ await send(ctx, ws, output);
113
+ }
114
+ async function sendStream(ctx, ws, stream) {
115
+ const onClose = () => {
116
+ void stream.chunks.return?.(undefined);
117
+ };
118
+ ws.once('close', onClose);
119
+ try {
120
+ for await (const chunk of stream.chunks) {
121
+ if (ctx.closed || ws.readyState !== WebSocket.OPEN)
122
+ break;
123
+ await sendRaw(ctx, ws, chunk);
124
+ }
125
+ }
126
+ catch (error) {
127
+ if (process.env['NODE_ENV'] !== 'production') {
128
+ const message = error instanceof Error ? error.message : String(error);
129
+ console.error('Failed to stream JSON-RPC response over WebSocket', message, error);
130
+ }
131
+ }
132
+ finally {
133
+ ws.off('close', onClose);
134
+ }
135
+ }
136
+ function parseFrame(data, isBinary) {
137
+ // Reject binary frames: protocol requires text JSON.
138
+ if (isBinary) {
139
+ throw new Error('Binary frames are not supported; send JSON text.');
140
+ }
141
+ let text;
142
+ if (typeof data === 'string') {
143
+ text = data;
144
+ }
145
+ else if (Buffer.isBuffer(data)) {
146
+ text = data.toString('utf8');
147
+ }
148
+ else if (Array.isArray(data)) {
149
+ text = Buffer.concat(data).toString('utf8');
150
+ }
151
+ else {
152
+ text = Buffer.from(data).toString('utf8');
153
+ }
154
+ return JSON.parse(text);
155
+ }
156
+ async function send(ctx, ws, payload) {
157
+ if (ctx.closed || ws.readyState !== WebSocket.OPEN)
158
+ return;
159
+ try {
160
+ const text = await stringify(payload);
161
+ await new Promise((resolve, reject) => {
162
+ ws.send(text, (error) => (error ? reject(error) : resolve()));
163
+ });
164
+ }
165
+ catch (error) {
166
+ if (process.env['NODE_ENV'] !== 'production') {
167
+ console.error('Failed to send JSON-RPC response over WebSocket', error);
168
+ }
169
+ }
170
+ }
171
+ /** 发送一个流帧(RPCStreamChunk 已是完整帧)。 */
172
+ async function sendRaw(ctx, ws, chunk) {
173
+ if (ctx.closed || ws.readyState !== WebSocket.OPEN)
174
+ return;
175
+ try {
176
+ const text = await stringify(chunk);
177
+ await new Promise((resolve, reject) => {
178
+ ws.send(text, (error) => (error ? reject(error) : resolve()));
179
+ });
180
+ }
181
+ catch (error) {
182
+ if (process.env['NODE_ENV'] !== 'production') {
183
+ console.error('Failed to send JSON-RPC stream chunk over WebSocket', error);
184
+ }
185
+ }
186
+ }
187
+ function fallbackFailure(error) {
188
+ const message = error instanceof Error ? error.message : String(error);
189
+ return {
190
+ jsonrpc: RPCVersion,
191
+ id: null,
192
+ error: {
193
+ code: INTERNAL_ERROR,
194
+ message: 'Internal error',
195
+ ...(process.env['NODE_ENV'] !== 'production' ? { data: message } : {}),
196
+ },
197
+ };
198
+ }
199
+ function buildInjectables(factory, ws, req, repository) {
200
+ if (typeof factory === 'function') {
201
+ return factory(ws, req, repository);
202
+ }
203
+ return {
204
+ socket: ws,
205
+ request: req,
206
+ repository,
207
+ };
208
+ }
209
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/transport/ws/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Server } from 'node:http';
2
+ import { WebSocketServer } from 'ws';
3
+ import { type WSOptions } from './middleware';
4
+ export interface StandaloneWsOptions extends WSOptions {
5
+ /** Existing HTTP server to attach to. If omitted, one is created. */
6
+ server?: Server;
7
+ /** Port for the auto-created server. */
8
+ port?: number;
9
+ /** Host for the auto-created server. */
10
+ host?: string;
11
+ }
12
+ export interface StandaloneWsHandle {
13
+ server: Server;
14
+ wss: WebSocketServer;
15
+ close(): Promise<void>;
16
+ }
17
+ /**
18
+ * Create a standalone HTTP server (unless one is provided) and attach the
19
+ * JSON-RPC WebSocket endpoint. Returns a handle for clean shutdown.
20
+ */
21
+ export declare function createWebSocketServer(options?: StandaloneWsOptions): Promise<StandaloneWsHandle>;
22
+ //# sourceMappingURL=standalone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../../src/transport/ws/standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAErC,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAgC7B"}
@@ -0,0 +1,39 @@
1
+ import { createServer } from 'node:http';
2
+ import { Repository } from '../../core/Repository';
3
+ import { attachWebSocket } from './middleware';
4
+ /**
5
+ * Create a standalone HTTP server (unless one is provided) and attach the
6
+ * JSON-RPC WebSocket endpoint. Returns a handle for clean shutdown.
7
+ */
8
+ export async function createWebSocketServer(options = {}) {
9
+ const server = options.server ?? createServer();
10
+ const wss = attachWebSocket(server, new Repository(), options);
11
+ if (!options.server) {
12
+ const port = options.port ?? 8080;
13
+ const host = options.host ?? '127.0.0.1';
14
+ await new Promise((resolve, reject) => {
15
+ const onError = (error) => {
16
+ server.off('listening', onListening);
17
+ reject(error);
18
+ };
19
+ const onListening = () => {
20
+ server.off('error', onError);
21
+ resolve();
22
+ };
23
+ server.once('error', onError);
24
+ server.once('listening', onListening);
25
+ server.listen(port, host);
26
+ });
27
+ }
28
+ return {
29
+ server,
30
+ wss,
31
+ async close() {
32
+ await new Promise((resolve) => wss.close(() => resolve()));
33
+ if (!options.server) {
34
+ await new Promise((resolve) => server.close(() => resolve()));
35
+ }
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../../src/transport/ws/standalone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAC;AAiB/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAO,GAAwB,EAAE;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;IAChD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;IAE/D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QACzC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;gBAC/B,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;YACF,MAAM,WAAW,GAAG,GAAG,EAAE;gBACvB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7B,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM;QACN,GAAG;QACH,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}