@lvce-editor/ipc 9.5.1 → 10.0.1

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/browser.js CHANGED
@@ -2,6 +2,65 @@ const getData$1 = event => {
2
2
  return event.data;
3
3
  };
4
4
 
5
+ const walkValue = (value, transferrables, isTransferrable) => {
6
+ if (!value) {
7
+ return;
8
+ }
9
+ if (isTransferrable(value)) {
10
+ transferrables.push(value);
11
+ return;
12
+ }
13
+ if (Array.isArray(value)) {
14
+ for (const item of value) {
15
+ walkValue(item, transferrables, isTransferrable);
16
+ }
17
+ return;
18
+ }
19
+ if (typeof value === 'object') {
20
+ for (const property of Object.values(value)) {
21
+ walkValue(property, transferrables, isTransferrable);
22
+ }
23
+ return;
24
+ }
25
+ };
26
+
27
+ const isMessagePort = value => {
28
+ return value && value instanceof MessagePort;
29
+ };
30
+
31
+ const isMessagePortMain = value => {
32
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
33
+ };
34
+
35
+ const isOffscreenCanvas = value => {
36
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
37
+ };
38
+
39
+ const isInstanceOf = (value, constructorName) => {
40
+ return value?.constructor?.name === constructorName;
41
+ };
42
+
43
+ const isSocket = value => {
44
+ return isInstanceOf(value, 'Socket');
45
+ };
46
+
47
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
48
+
49
+ const isTransferrable = value => {
50
+ for (const fn of transferrables) {
51
+ if (fn(value)) {
52
+ return true;
53
+ }
54
+ }
55
+ return false;
56
+ };
57
+
58
+ const getTransferrables = value => {
59
+ const transferrables = [];
60
+ walkValue(value, transferrables, isTransferrable);
61
+ return transferrables;
62
+ };
63
+
5
64
  const attachEvents = that => {
6
65
  const handleMessage = (...args) => {
7
66
  const data = that.getData(...args);
@@ -44,7 +103,8 @@ class IpcChildWithModuleWorker extends Ipc {
44
103
  // @ts-ignore
45
104
  this._rawIpc.postMessage(message);
46
105
  }
47
- sendAndTransfer(message, transfer) {
106
+ sendAndTransfer(message) {
107
+ const transfer = getTransferrables(message);
48
108
  // @ts-ignore
49
109
  this._rawIpc.postMessage(message, transfer);
50
110
  }
@@ -320,7 +380,8 @@ class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
320
380
  send(message) {
321
381
  this._rawIpc.postMessage(message);
322
382
  }
323
- sendAndTransfer(message, transfer) {
383
+ sendAndTransfer(message) {
384
+ const transfer = getTransferrables(message);
324
385
  this._rawIpc.postMessage(message, transfer);
325
386
  }
326
387
  dispose() {
@@ -359,7 +420,8 @@ class IpcChildWithWindow extends Ipc {
359
420
  send(message) {
360
421
  this._rawIpc.postMessage(message);
361
422
  }
362
- sendAndTransfer(message, transfer) {
423
+ sendAndTransfer(message) {
424
+ const transfer = getTransferrables(message);
363
425
  this._rawIpc.postMessage(message, location.origin, transfer);
364
426
  }
365
427
  dispose() {
@@ -393,26 +455,15 @@ const IpcChildWithWindow$1 = {
393
455
  wrap: wrap$4
394
456
  };
395
457
 
396
- const isTransferrable = value => {
397
- return value instanceof MessagePort;
398
- };
399
-
400
- const UntransferrableValue = {};
401
-
402
- const walkValue = (value, transferrables) => {
458
+ const removeValues = (value, toRemove) => {
403
459
  if (!value) {
404
460
  return value;
405
461
  }
406
- if (isTransferrable(value)) {
407
- transferrables.push(value);
408
- return UntransferrableValue;
409
- }
410
462
  if (Array.isArray(value)) {
411
463
  const newItems = [];
412
464
  for (const item of value) {
413
- const newItem = walkValue(item, transferrables);
414
- if (newItem !== UntransferrableValue) {
415
- newItems.push(newItem);
465
+ if (!toRemove.includes(item)) {
466
+ newItems.push(removeValues(item, toRemove));
416
467
  }
417
468
  }
418
469
  return newItems;
@@ -420,9 +471,8 @@ const walkValue = (value, transferrables) => {
420
471
  if (typeof value === 'object') {
421
472
  const newObject = Object.create(null);
422
473
  for (const [key, property] of Object.entries(value)) {
423
- const newValue = walkValue(property, transferrables);
424
- if (newValue !== UntransferrableValue) {
425
- newObject[key] = newValue;
474
+ if (!toRemove.includes(property)) {
475
+ newObject[key] = removeValues(property, toRemove);
426
476
  }
427
477
  }
428
478
  return newObject;
@@ -434,8 +484,8 @@ const walkValue = (value, transferrables) => {
434
484
  // as parameters. If the transferrable object is a parameter, in electron
435
485
  // only an empty objected is received in the main process
436
486
  const fixElectronParameters = value => {
437
- const transfer = [];
438
- const newValue = walkValue(value, transfer);
487
+ const transfer = getTransferrables(value);
488
+ const newValue = removeValues(value, transfer);
439
489
  return {
440
490
  newValue,
441
491
  transfer
@@ -455,7 +505,7 @@ class IpcChildWithElectronWindow extends Ipc {
455
505
  send(message) {
456
506
  this._rawIpc.postMessage(message);
457
507
  }
458
- sendAndTransfer(message, _transfer) {
508
+ sendAndTransfer(message) {
459
509
  const {
460
510
  newValue,
461
511
  transfer
@@ -511,7 +561,8 @@ class IpcChildWithMessagePort extends Ipc {
511
561
  send(message) {
512
562
  this._rawIpc.postMessage(message);
513
563
  }
514
- sendAndTransfer(message, transfer) {
564
+ sendAndTransfer(message) {
565
+ const transfer = getTransferrables(message);
515
566
  this._rawIpc.postMessage(message, transfer);
516
567
  }
517
568
  dispose() {
@@ -663,7 +714,8 @@ class IpcParentWithModuleWorker extends Ipc {
663
714
  send(message) {
664
715
  this._rawIpc.postMessage(message);
665
716
  }
666
- sendAndTransfer(message, transfer) {
717
+ sendAndTransfer(message) {
718
+ const transfer = getTransferrables(message);
667
719
  this._rawIpc.postMessage(message, transfer);
668
720
  }
669
721
  dispose() {
@@ -727,7 +779,7 @@ class IpcParentWithWebSocket extends Ipc {
727
779
  send(message) {
728
780
  this._rawIpc.send(stringifyCompact(message));
729
781
  }
730
- sendAndTransfer(message, transfer) {
782
+ sendAndTransfer(message) {
731
783
  throw new Error('sendAndTransfer not supported');
732
784
  }
733
785
  dispose() {
package/dist/electron.js CHANGED
@@ -26,12 +26,6 @@ const getType = value => {
26
26
  return 'unknown';
27
27
  }
28
28
  };
29
- const array = value => {
30
- const type = getType(value);
31
- if (type !== 'array') {
32
- throw new AssertionError('expected value to be of type array');
33
- }
34
- };
35
29
  const string = value => {
36
30
  const type = getType(value);
37
31
  if (type !== 'string') {
@@ -346,6 +340,65 @@ class IpcError extends VError {
346
340
  }
347
341
  }
348
342
 
343
+ const walkValue = (value, transferrables, isTransferrable) => {
344
+ if (!value) {
345
+ return;
346
+ }
347
+ if (isTransferrable(value)) {
348
+ transferrables.push(value);
349
+ return;
350
+ }
351
+ if (Array.isArray(value)) {
352
+ for (const item of value) {
353
+ walkValue(item, transferrables, isTransferrable);
354
+ }
355
+ return;
356
+ }
357
+ if (typeof value === 'object') {
358
+ for (const property of Object.values(value)) {
359
+ walkValue(property, transferrables, isTransferrable);
360
+ }
361
+ return;
362
+ }
363
+ };
364
+
365
+ const isMessagePort = value => {
366
+ return value && value instanceof MessagePort;
367
+ };
368
+
369
+ const isMessagePortMain = value => {
370
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
371
+ };
372
+
373
+ const isOffscreenCanvas = value => {
374
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
375
+ };
376
+
377
+ const isInstanceOf = (value, constructorName) => {
378
+ return value?.constructor?.name === constructorName;
379
+ };
380
+
381
+ const isSocket = value => {
382
+ return isInstanceOf(value, 'Socket');
383
+ };
384
+
385
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
386
+
387
+ const isTransferrable = value => {
388
+ for (const fn of transferrables) {
389
+ if (fn(value)) {
390
+ return true;
391
+ }
392
+ }
393
+ return false;
394
+ };
395
+
396
+ const getTransferrables = value => {
397
+ const transferrables = [];
398
+ walkValue(value, transferrables, isTransferrable);
399
+ return transferrables;
400
+ };
401
+
349
402
  // @ts-ignore
350
403
  const create$2 = async ({
351
404
  path,
@@ -393,7 +446,8 @@ class IpcParentWithElectronUtilityProcess extends Ipc {
393
446
  send(message) {
394
447
  this._rawIpc.postMessage(message);
395
448
  }
396
- sendAndTransfer(message, transfer) {
449
+ sendAndTransfer(message) {
450
+ const transfer = getTransferrables(message);
397
451
  this._rawIpc.postMessage(message, transfer);
398
452
  }
399
453
  dispose() {
@@ -515,6 +569,14 @@ const getFirstNodeChildProcessEvent = async childProcess => {
515
569
  };
516
570
  };
517
571
 
572
+ const getTransferrablesNode = value => {
573
+ const transferrables = getTransferrables(value);
574
+ if (transferrables.length === 0) {
575
+ throw new Error(`no transferrables found`);
576
+ }
577
+ return transferrables[0];
578
+ };
579
+
518
580
  // @ts-ignore
519
581
  const create$1 = async ({
520
582
  path,
@@ -566,7 +628,8 @@ class IpcParentWithNodeForkedProcess extends Ipc {
566
628
  send(message) {
567
629
  this._rawIpc.send(message);
568
630
  }
569
- sendAndTransfer(message, transfer) {
631
+ sendAndTransfer(message) {
632
+ const transfer = getTransferrablesNode(message);
570
633
  this._rawIpc.send(message, transfer);
571
634
  }
572
635
  dispose() {
@@ -697,8 +760,8 @@ const wrap = worker => {
697
760
  this.worker.postMessage(message);
698
761
  },
699
762
  // @ts-ignore
700
- sendAndTransfer(message, transfer) {
701
- array(transfer);
763
+ sendAndTransfer(message) {
764
+ const transfer = getTransferrablesNode(message);
702
765
  this.worker.postMessage(message, transfer);
703
766
  },
704
767
  dispose() {
package/dist/index.js CHANGED
@@ -1,5 +1,101 @@
1
1
  import { VError } from '@lvce-editor/verror';
2
- import { string, array } from '@lvce-editor/assert';
2
+ import { string } from '@lvce-editor/assert';
3
+
4
+ const walkValue = (value, transferrables, isTransferrable) => {
5
+ if (!value) {
6
+ return;
7
+ }
8
+ if (isTransferrable(value)) {
9
+ transferrables.push(value);
10
+ return;
11
+ }
12
+ if (Array.isArray(value)) {
13
+ for (const item of value) {
14
+ walkValue(item, transferrables, isTransferrable);
15
+ }
16
+ return;
17
+ }
18
+ if (typeof value === 'object') {
19
+ for (const property of Object.values(value)) {
20
+ walkValue(property, transferrables, isTransferrable);
21
+ }
22
+ return;
23
+ }
24
+ };
25
+
26
+ const isMessagePort = value => {
27
+ return value && value instanceof MessagePort;
28
+ };
29
+
30
+ const isMessagePortMain = value => {
31
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
32
+ };
33
+
34
+ const isOffscreenCanvas = value => {
35
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
36
+ };
37
+
38
+ const isInstanceOf = (value, constructorName) => {
39
+ return value?.constructor?.name === constructorName;
40
+ };
41
+
42
+ const isSocket = value => {
43
+ return isInstanceOf(value, 'Socket');
44
+ };
45
+
46
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
47
+
48
+ const isTransferrable = value => {
49
+ for (const fn of transferrables) {
50
+ if (fn(value)) {
51
+ return true;
52
+ }
53
+ }
54
+ return false;
55
+ };
56
+
57
+ const getTransferrables = value => {
58
+ const transferrables = [];
59
+ walkValue(value, transferrables, isTransferrable);
60
+ return transferrables;
61
+ };
62
+
63
+ const removeValues = (value, toRemove) => {
64
+ if (!value) {
65
+ return value;
66
+ }
67
+ if (Array.isArray(value)) {
68
+ const newItems = [];
69
+ for (const item of value) {
70
+ if (!toRemove.includes(item)) {
71
+ newItems.push(removeValues(item, toRemove));
72
+ }
73
+ }
74
+ return newItems;
75
+ }
76
+ if (typeof value === 'object') {
77
+ const newObject = Object.create(null);
78
+ for (const [key, property] of Object.entries(value)) {
79
+ if (!toRemove.includes(property)) {
80
+ newObject[key] = removeValues(property, toRemove);
81
+ }
82
+ }
83
+ return newObject;
84
+ }
85
+ return value;
86
+ };
87
+
88
+ // workaround for electron not supporting transferrable objects
89
+ // as parameters. If the transferrable object is a parameter, in electron
90
+ // only an empty objected is received in the main process
91
+ const fixElectronParameters = value => {
92
+ const transfer = getTransferrables(value);
93
+ const newValue = removeValues(value, transfer);
94
+ return {
95
+ newValue,
96
+ transfer
97
+ };
98
+ };
3
99
 
4
100
  const attachEvents = that => {
5
101
  const handleMessage = (...args) => {
@@ -168,10 +264,6 @@ class IpcError extends VError {
168
264
  }
169
265
  }
170
266
 
171
- const isMessagePortMain = value => {
172
- return value && value.constructor && value.constructor.name === 'MessagePortMain';
173
- };
174
-
175
267
  const listen$8 = ({
176
268
  messagePort
177
269
  }) => {
@@ -206,8 +298,12 @@ class IpcChildWithElectronMessagePort extends Ipc {
206
298
  send(message) {
207
299
  this._rawIpc.postMessage(message);
208
300
  }
209
- sendAndTransfer(message, transfer) {
210
- this._rawIpc.postMessage(message, transfer);
301
+ sendAndTransfer(message) {
302
+ const {
303
+ newValue,
304
+ transfer
305
+ } = fixElectronParameters(message);
306
+ this._rawIpc.postMessage(newValue, transfer);
211
307
  }
212
308
  dispose() {
213
309
  this._rawIpc.close();
@@ -267,8 +363,12 @@ class IpcChildWithElectronUtilityProcess extends Ipc {
267
363
  send(message) {
268
364
  this._rawIpc.postMessage(message);
269
365
  }
270
- sendAndTransfer(message, transfer) {
271
- this._rawIpc.postMessage(message, transfer);
366
+ sendAndTransfer(message) {
367
+ const {
368
+ newValue,
369
+ transfer
370
+ } = fixElectronParameters(message);
371
+ this._rawIpc.postMessage(newValue, transfer);
272
372
  }
273
373
  dispose() {
274
374
  this._rawIpc.close();
@@ -313,7 +413,8 @@ class IpcChildWithModuleWorker extends Ipc {
313
413
  // @ts-ignore
314
414
  this._rawIpc.postMessage(message);
315
415
  }
316
- sendAndTransfer(message, transfer) {
416
+ sendAndTransfer(message) {
417
+ const transfer = getTransferrables(message);
317
418
  // @ts-ignore
318
419
  this._rawIpc.postMessage(message, transfer);
319
420
  }
@@ -388,7 +489,8 @@ class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
388
489
  send(message) {
389
490
  this._rawIpc.postMessage(message);
390
491
  }
391
- sendAndTransfer(message, transfer) {
492
+ sendAndTransfer(message) {
493
+ const transfer = getTransferrables(message);
392
494
  this._rawIpc.postMessage(message, transfer);
393
495
  }
394
496
  dispose() {
@@ -414,6 +516,14 @@ const IpcChildWithModuleWorkerAndMessagePort$1 = {
414
516
  wrap: wrap$8
415
517
  };
416
518
 
519
+ const getTransferrablesNode = value => {
520
+ const transferrables = getTransferrables(value);
521
+ if (transferrables.length === 0) {
522
+ throw new Error(`no transferrables found`);
523
+ }
524
+ return transferrables[0];
525
+ };
526
+
417
527
  const listen$4 = async () => {
418
528
  if (!process.send) {
419
529
  throw new Error('process.send must be defined');
@@ -448,7 +558,8 @@ class IpcChildWithNodeForkedProcess extends Ipc {
448
558
  onMessage(callback) {
449
559
  this._rawIpc.on('message', callback);
450
560
  }
451
- sendAndTransfer(message, transfer) {
561
+ sendAndTransfer(message) {
562
+ const transfer = getTransferrablesNode(message);
452
563
  this._rawIpc.send(message, transfer);
453
564
  }
454
565
  dispose() {
@@ -466,10 +577,6 @@ const IpcChildWithNodeForkedProcess$1 = {
466
577
  wrap: wrap$7
467
578
  };
468
579
 
469
- const isMessagePort = value => {
470
- return value && value instanceof MessagePort;
471
- };
472
-
473
580
  const listen$3 = async ({
474
581
  messagePort
475
582
  }) => {
@@ -584,7 +691,8 @@ class IpcChildWithRendererProcess2 extends Ipc {
584
691
  send(message) {
585
692
  this._rawIpc.postMessage(preloadChannelType, message);
586
693
  }
587
- sendAndTransfer(message, transfer) {
694
+ sendAndTransfer(message) {
695
+ const transfer = getTransferrables(message);
588
696
  this._rawIpc.postMessage(preloadChannelType, message, transfer);
589
697
  }
590
698
  dispose() {
@@ -904,7 +1012,8 @@ class IpcParentWithElectronUtilityProcess extends Ipc {
904
1012
  send(message) {
905
1013
  this._rawIpc.postMessage(message);
906
1014
  }
907
- sendAndTransfer(message, transfer) {
1015
+ sendAndTransfer(message) {
1016
+ const transfer = getTransferrables(message);
908
1017
  this._rawIpc.postMessage(message, transfer);
909
1018
  }
910
1019
  dispose() {
@@ -1077,7 +1186,8 @@ class IpcParentWithNodeForkedProcess extends Ipc {
1077
1186
  send(message) {
1078
1187
  this._rawIpc.send(message);
1079
1188
  }
1080
- sendAndTransfer(message, transfer) {
1189
+ sendAndTransfer(message) {
1190
+ const transfer = getTransferrablesNode(message);
1081
1191
  this._rawIpc.send(message, transfer);
1082
1192
  }
1083
1193
  dispose() {
@@ -1167,8 +1277,8 @@ const wrap = worker => {
1167
1277
  this.worker.postMessage(message);
1168
1278
  },
1169
1279
  // @ts-ignore
1170
- sendAndTransfer(message, transfer) {
1171
- array(transfer);
1280
+ sendAndTransfer(message) {
1281
+ const transfer = getTransferrablesNode(message);
1172
1282
  this.worker.postMessage(message, transfer);
1173
1283
  },
1174
1284
  dispose() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/ipc",
3
- "version": "9.5.1",
3
+ "version": "10.0.1",
4
4
  "description": "Inter Process Communication for Lvce Editor",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",