@lvce-editor/json-rpc 1.3.0 → 2.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/dist/index.d.ts CHANGED
@@ -6,24 +6,46 @@ export const invoke: (
6
6
  ...params: any[]
7
7
  ) => Promise<any>
8
8
 
9
- export const invokeAndTransfer: (
10
- ipc: any,
11
- transfer: any,
12
- method: string,
13
- ...params: any[]
14
- ) => Promise<any>
9
+ interface InvokeAndTransfer {
10
+ (ipc: any, transfer: any, method: string, ...params: any[]): Promise<any>
11
+ (ipc: any, method: string, ...params: any[]): Promise<any>
12
+ }
13
+
14
+ export const invokeAndTransfer: InvokeAndTransfer
15
15
 
16
16
  export const resolve: (id: number, message: any) => void
17
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) => any,
24
- logError: (error: any) => void,
25
- requiresSocket: (method: string) => void,
26
- ) => Promise<void>
18
+ interface HandleJsonRpcMessage {
19
+ (
20
+ ipc: any,
21
+ message: any,
22
+ execute: (method: string, ...params: any[]) => Promise<any>,
23
+ resolve: any,
24
+ preparePrettyError: (error: any) => any,
25
+ logError: (error: any) => void,
26
+ requiresSocket: (method: string) => void,
27
+ ): Promise<void>
28
+
29
+ ({
30
+ ipc,
31
+ message,
32
+ execute,
33
+ resolve,
34
+ preparePrettyError,
35
+ logError,
36
+ requiresSocket,
37
+ }: {
38
+ ipc: any
39
+ message: any
40
+ execute: (method: string, ...params: any[]) => Promise<any>
41
+ resolve?: any
42
+ preparePrettyError: (error: any) => any
43
+ logError: (error: any) => void
44
+ requiresSocket: (method: string) => void
45
+ }): Promise<void>
46
+ }
47
+
48
+ export const handleJsonRpcMessage: HandleJsonRpcMessage
27
49
 
28
50
  export const getErrorResponse: (
29
51
  message: any,
package/dist/index.js CHANGED
@@ -277,6 +277,58 @@ const unwrapJsonRpcResult = responseMessage => {
277
277
  throw new JsonRpcError('unexpected response message');
278
278
  };
279
279
 
280
+ const isInstanceOf = (value, constructorName) => {
281
+ return value?.constructor?.name === constructorName;
282
+ };
283
+
284
+ const isSocket = value => {
285
+ return isInstanceOf(value, 'Socket');
286
+ };
287
+
288
+ const isSingleTransferrable = value => {
289
+ return isSocket(value);
290
+ };
291
+
292
+ const isMessagePort = value => {
293
+ return typeof MessagePort !== 'undefined' && value instanceof MessagePort;
294
+ };
295
+
296
+ const isMessagePortMain = value => {
297
+ return isInstanceOf(value, 'MessagePortMain');
298
+ };
299
+
300
+ const isOffscreenCanvas = value => {
301
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
302
+ };
303
+
304
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
305
+
306
+ const isTransferrable = value => {
307
+ for (const fn of transferrables) {
308
+ if (fn(value)) {
309
+ return true;
310
+ }
311
+ }
312
+ return false;
313
+ };
314
+
315
+ const getTransferrableParams = value => {
316
+ if (isTransferrable(value)) {
317
+ return value;
318
+ }
319
+ if (Array.isArray(value)) {
320
+ const result = value.filter(isTransferrable);
321
+ if (result.length === 0) {
322
+ return undefined;
323
+ }
324
+ if (result.length === 1 && isSingleTransferrable(result[0])) {
325
+ return result[0];
326
+ }
327
+ return result;
328
+ }
329
+ return undefined;
330
+ };
331
+
280
332
  const create$1 = (message, error) => {
281
333
  return {
282
334
  jsonrpc: Two,
@@ -306,7 +358,7 @@ const getErrorProperty = (error, prettyError) => {
306
358
  }
307
359
  };
308
360
  };
309
- const getErrorResponse = (message, error, ipc, preparePrettyError, logError) => {
361
+ const getErrorResponse = (message, error, preparePrettyError, logError) => {
310
362
  const prettyError = preparePrettyError(error);
311
363
  logError(error, prettyError);
312
364
  const errorProperty = getErrorProperty(error, prettyError);
@@ -331,18 +383,53 @@ const getResponse = async (message, ipc, execute, preparePrettyError, logError,
331
383
  const result = requiresSocket(message.method) ? await execute(message.method, ipc, ...message.params) : await execute(message.method, ...message.params);
332
384
  return getSuccessResponse(message, result);
333
385
  } catch (error) {
334
- return getErrorResponse(message, error, ipc, preparePrettyError, logError);
386
+ return getErrorResponse(message, error, preparePrettyError, logError);
335
387
  }
336
388
  };
337
389
 
338
- const handleJsonRpcMessage = async (ipc, message, execute, resolve, preparePrettyError, logError, requiresSocket) => {
390
+ const defaultPreparePrettyError = error => {
391
+ return error;
392
+ };
393
+ const defaultLogError = () => {
394
+ // ignore
395
+ };
396
+ const defaultRequiresSocket = () => {
397
+ return false;
398
+ };
399
+ const defaultResolve = resolve;
400
+ const handleJsonRpcMessage = async (...args) => {
401
+ let message;
402
+ let ipc;
403
+ let execute;
404
+ let preparePrettyError;
405
+ let logError;
406
+ let resolve;
407
+ let requiresSocket;
408
+ if (args.length === 1) {
409
+ const arg = args[0];
410
+ message = arg.message;
411
+ ipc = arg.ipc;
412
+ execute = arg.execute;
413
+ preparePrettyError = arg.preparePrettyError || defaultPreparePrettyError;
414
+ logError = arg.logError || defaultLogError;
415
+ requiresSocket = arg.requiresSocket || defaultRequiresSocket;
416
+ resolve = arg.resolve || defaultResolve;
417
+ } else {
418
+ ipc = args[0];
419
+ message = args[1];
420
+ execute = args[2];
421
+ resolve = args[3];
422
+ preparePrettyError = args[4];
423
+ logError = args[5];
424
+ requiresSocket = args[6];
425
+ }
339
426
  if ('id' in message) {
340
427
  if ('method' in message) {
341
428
  const response = await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
342
429
  try {
343
430
  ipc.send(response);
344
431
  } catch (error) {
345
- const errorResponse = getErrorResponse(message, error, ipc, preparePrettyError, logError);
432
+ const errorResponse = getErrorResponse(message, error, preparePrettyError, logError);
346
433
  ipc.send(errorResponse);
347
434
  }
348
435
  return;
@@ -371,12 +458,21 @@ const invoke = async (ipc, method, ...params) => {
371
458
  const result = unwrapJsonRpcResult(responseMessage);
372
459
  return result;
373
460
  };
461
+
462
+ // TODO deprecated old typings,
463
+ // always use automatic transferrable detection
374
464
  const invokeAndTransfer = async (ipc, handle, method, ...params) => {
465
+ let transfer = handle;
466
+ if (typeof handle === 'string') {
467
+ params = [method, ...params];
468
+ method = handle;
469
+ transfer = getTransferrableParams(params);
470
+ }
375
471
  const {
376
472
  message,
377
473
  promise
378
474
  } = create$2(method, params);
379
- ipc.sendAndTransfer(message, handle);
475
+ ipc.sendAndTransfer(message, transfer);
380
476
  const responseMessage = await promise;
381
477
  const result = unwrapJsonRpcResult(responseMessage);
382
478
  return result;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/json-rpc",
3
- "version": "1.3.0",
3
+ "version": "2.0.0",
4
4
  "description": "JsonRpc implementation",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",