@lvce-editor/json-rpc 0.1.0 → 0.2.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/dist/index.d.ts CHANGED
@@ -1,3 +1,26 @@
1
- export const invoke: (method: string, ...params: any[]) => Promise<any>
1
+ export const send: (ipc: any, method: string, ...params: any[]) => void
2
+
3
+ export const invoke: (
4
+ ipc: any,
5
+ method: string,
6
+ ...params: any[]
7
+ ) => Promise<any>
8
+
9
+ export const invokeAndTransfer: (
10
+ ipc: any,
11
+ transfer: any,
12
+ method: string,
13
+ ...params: any[]
14
+ ) => Promise<any>
2
15
 
3
16
  export const resolve: (id: number, message: any) => void
17
+
18
+ export const handleJsonRpcMessage: (
19
+ ipc: any,
20
+ message: any,
21
+ execute: (method: string, ...params: any[]) => Promise<any>,
22
+ resolve: any,
23
+ preparePrettyError: (error: any) => Promise<any>,
24
+ logError: (error: any) => void,
25
+ requiresSocket: (method: string) => void,
26
+ ) => Promise<void>
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  const Two = '2.0';
2
2
 
3
- const create$2 = (method, params) => {
3
+ const create$4 = (method, params) => {
4
4
  return {
5
5
  jsonrpc: Two,
6
6
  method,
@@ -8,14 +8,55 @@ const create$2 = (method, params) => {
8
8
  }
9
9
  };
10
10
 
11
+ class AssertionError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = 'AssertionError';
15
+ }
16
+ }
17
+
18
+ const getType = (value) => {
19
+ switch (typeof value) {
20
+ case 'number':
21
+ return 'number'
22
+ case 'function':
23
+ return 'function'
24
+ case 'string':
25
+ return 'string'
26
+ case 'object':
27
+ if (value === null) {
28
+ return 'null'
29
+ }
30
+ if (Array.isArray(value)) {
31
+ return 'array'
32
+ }
33
+ return 'object'
34
+ case 'boolean':
35
+ return 'boolean'
36
+ default:
37
+ return 'unknown'
38
+ }
39
+ };
40
+
41
+ const number = (value) => {
42
+ const type = getType(value);
43
+ if (type !== 'number') {
44
+ throw new AssertionError('expected value to be of type number')
45
+ }
46
+ };
47
+
11
48
  const state$1 = {
12
49
  id: 0,
13
50
  };
14
51
 
15
- const create$1 = () => {
52
+ const create$3 = () => {
16
53
  return ++state$1.id
17
54
  };
18
55
 
56
+ const warn = (...args) => {
57
+ console.warn(...args);
58
+ };
59
+
19
60
  const withResolvers = () => {
20
61
  /**
21
62
  * @type {any}
@@ -41,13 +82,24 @@ const state = {
41
82
  };
42
83
 
43
84
  const registerPromise = () => {
44
- const id = create$1();
85
+ const id = create$3();
45
86
  const { resolve, promise } = withResolvers();
46
87
  state.callbacks[id] = resolve;
47
88
  return { id, promise }
48
89
  };
49
90
 
50
- const create = (method, params) => {
91
+ const resolve = (id, args) => {
92
+ number(id);
93
+ if (!(id in state.callbacks)) {
94
+ console.log(args);
95
+ warn(`callback ${id} may already be disposed`);
96
+ return
97
+ }
98
+ state.callbacks[id](args);
99
+ delete state.callbacks[id];
100
+ };
101
+
102
+ const create$2 = (method, params) => {
51
103
  const { id, promise } = registerPromise();
52
104
  const message = {
53
105
  jsonrpc: Two,
@@ -117,6 +169,7 @@ const joinLines = (lines) => {
117
169
  };
118
170
 
119
171
  const MethodNotFound = -32601;
172
+ const Custom = -32001;
120
173
 
121
174
  const splitLines = (lines) => {
122
175
  return lines.split(NewLine)
@@ -210,13 +263,142 @@ const unwrapJsonRpcResult = (responseMessage) => {
210
263
  throw new JsonRpcError('unexpected response message')
211
264
  };
212
265
 
266
+ const create$1 = (message, error) => {
267
+ return {
268
+ jsonrpc: Two,
269
+ id: message.id,
270
+ error,
271
+ }
272
+ };
273
+
274
+ const E_COMMAND_NOT_FOUND = 'E_COMMAND_NOT_FOUND';
275
+
276
+ const getErrorProperty = (error, prettyError) => {
277
+ if (error && error.code === E_COMMAND_NOT_FOUND) {
278
+ return {
279
+ code: MethodNotFound,
280
+ message: error.message,
281
+ data: error.stack,
282
+ }
283
+ }
284
+ return {
285
+ code: Custom,
286
+ message: prettyError.message,
287
+ data: {
288
+ stack: prettyError.stack,
289
+ codeFrame: prettyError.codeFrame,
290
+ type: prettyError.type,
291
+ code: prettyError.code,
292
+ },
293
+ }
294
+ };
295
+
296
+ const getErrorResponse = (
297
+ message,
298
+ error,
299
+ ipc,
300
+ preparePrettyError,
301
+ logError,
302
+ ) => {
303
+ const prettyError = preparePrettyError(error);
304
+ logError(error, prettyError);
305
+ const errorProperty = getErrorProperty(error, prettyError);
306
+ return create$1(message, errorProperty)
307
+ };
308
+
309
+ const create = (message, result) => {
310
+ return {
311
+ jsonrpc: Two,
312
+ id: message.id,
313
+ result: result ?? null,
314
+ }
315
+ };
316
+
317
+ const getSuccessResponse = (message, result) => {
318
+ const resultProperty = result ?? null;
319
+ return create(message, resultProperty)
320
+ };
321
+
322
+ const getResponse = async (
323
+ message,
324
+ ipc,
325
+ execute,
326
+ preparePrettyError,
327
+ logError,
328
+ requiresSocket,
329
+ ) => {
330
+ try {
331
+ const result = requiresSocket(message.method)
332
+ ? await execute(message.method, ipc, ...message.params)
333
+ : await execute(message.method, ...message.params);
334
+ return getSuccessResponse(message, result)
335
+ } catch (error) {
336
+ return getErrorResponse(
337
+ message,
338
+ error,
339
+ ipc,
340
+ preparePrettyError,
341
+ logError,
342
+ )
343
+ }
344
+ };
345
+
346
+ const handleJsonRpcMessage = async (
347
+ ipc,
348
+ message,
349
+ execute,
350
+ resolve,
351
+ preparePrettyError,
352
+ logError,
353
+ requiresSocket,
354
+ ) => {
355
+ if ('id' in message) {
356
+ if ('method' in message) {
357
+ const response = await getResponse(
358
+ message,
359
+ ipc,
360
+ execute,
361
+ preparePrettyError,
362
+ logError,
363
+ requiresSocket,
364
+ );
365
+ try {
366
+ ipc.send(response);
367
+ } catch (error) {
368
+ const errorResponse = getErrorResponse(
369
+ message,
370
+ error,
371
+ ipc,
372
+ preparePrettyError,
373
+ logError,
374
+ );
375
+ ipc.send(errorResponse);
376
+ }
377
+ return
378
+ }
379
+ resolve(message.id, message);
380
+ return
381
+ }
382
+ if ('method' in message) {
383
+ await getResponse(
384
+ message,
385
+ ipc,
386
+ execute,
387
+ preparePrettyError,
388
+ logError,
389
+ );
390
+ return
391
+ }
392
+ throw new JsonRpcError('unexpected message')
393
+ };
394
+
213
395
  const send = (transport, method, ...params) => {
214
- const message = create$2(method, params);
396
+ const message = create$4(method, params);
215
397
  transport.send(message);
216
398
  };
217
399
 
218
400
  const invoke = async (ipc, method, ...params) => {
219
- const { message, promise } = create(method, params);
401
+ const { message, promise } = create$2(method, params);
220
402
  ipc.send(message);
221
403
  const responseMessage = await promise;
222
404
  const result = unwrapJsonRpcResult(responseMessage);
@@ -224,11 +406,11 @@ const invoke = async (ipc, method, ...params) => {
224
406
  };
225
407
 
226
408
  const invokeAndTransfer = async (ipc, handle, method, ...params) => {
227
- const { message, promise } = create(method, params);
409
+ const { message, promise } = create$2(method, params);
228
410
  ipc.sendAndTransfer(message, handle);
229
411
  const responseMessage = await promise;
230
412
  const result = unwrapJsonRpcResult(responseMessage);
231
413
  return result
232
414
  };
233
415
 
234
- export { invoke, invokeAndTransfer, send };
416
+ export { handleJsonRpcMessage, invoke, invokeAndTransfer, resolve, send };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/json-rpc",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "JsonRpc implementation",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",