@lvce-editor/ipc 9.5.1 → 10.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/browser.js CHANGED
@@ -2,6 +2,67 @@ const getData$1 = event => {
2
2
  return event.data;
3
3
  };
4
4
 
5
+ const isMessagePort = value => {
6
+ return value && value instanceof MessagePort;
7
+ };
8
+
9
+ const isMessagePortMain = value => {
10
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
11
+ };
12
+
13
+ const isOffscreenCanvas = value => {
14
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
15
+ };
16
+
17
+ const isInstanceOf = (value, constructorName) => {
18
+ return value?.constructor?.name === constructorName;
19
+ };
20
+
21
+ const isSocket = value => {
22
+ return isInstanceOf(value, 'Socket');
23
+ };
24
+
25
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
26
+
27
+ const isTransferrable = value => {
28
+ for (const fn of transferrables) {
29
+ if (fn(value)) {
30
+ return true;
31
+ }
32
+ }
33
+ return false;
34
+ };
35
+
36
+ const walkValue = (value, transferrables) => {
37
+ if (!value) {
38
+ return value;
39
+ }
40
+ if (isTransferrable(value)) {
41
+ transferrables.push(value);
42
+ return;
43
+ }
44
+ if (Array.isArray(value)) {
45
+ for (const item of value) {
46
+ walkValue(item, transferrables);
47
+ }
48
+ return;
49
+ }
50
+ if (typeof value === 'object') {
51
+ const newObject = Object.create(null);
52
+ for (const property of Object.values(value)) {
53
+ walkValue(property, transferrables);
54
+ }
55
+ return newObject;
56
+ }
57
+ return value;
58
+ };
59
+
60
+ const getTransferrables = value => {
61
+ const transferrables = [];
62
+ walkValue(value, transferrables);
63
+ return transferrables;
64
+ };
65
+
5
66
  const attachEvents = that => {
6
67
  const handleMessage = (...args) => {
7
68
  const data = that.getData(...args);
@@ -44,7 +105,8 @@ class IpcChildWithModuleWorker extends Ipc {
44
105
  // @ts-ignore
45
106
  this._rawIpc.postMessage(message);
46
107
  }
47
- sendAndTransfer(message, transfer) {
108
+ sendAndTransfer(message) {
109
+ const transfer = getTransferrables(message);
48
110
  // @ts-ignore
49
111
  this._rawIpc.postMessage(message, transfer);
50
112
  }
@@ -320,7 +382,8 @@ class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
320
382
  send(message) {
321
383
  this._rawIpc.postMessage(message);
322
384
  }
323
- sendAndTransfer(message, transfer) {
385
+ sendAndTransfer(message) {
386
+ const transfer = getTransferrables(message);
324
387
  this._rawIpc.postMessage(message, transfer);
325
388
  }
326
389
  dispose() {
@@ -359,7 +422,8 @@ class IpcChildWithWindow extends Ipc {
359
422
  send(message) {
360
423
  this._rawIpc.postMessage(message);
361
424
  }
362
- sendAndTransfer(message, transfer) {
425
+ sendAndTransfer(message) {
426
+ const transfer = getTransferrables(message);
363
427
  this._rawIpc.postMessage(message, location.origin, transfer);
364
428
  }
365
429
  dispose() {
@@ -393,26 +457,15 @@ const IpcChildWithWindow$1 = {
393
457
  wrap: wrap$4
394
458
  };
395
459
 
396
- const isTransferrable = value => {
397
- return value instanceof MessagePort;
398
- };
399
-
400
- const UntransferrableValue = {};
401
-
402
- const walkValue = (value, transferrables) => {
460
+ const removeValues = (value, toRemove) => {
403
461
  if (!value) {
404
462
  return value;
405
463
  }
406
- if (isTransferrable(value)) {
407
- transferrables.push(value);
408
- return UntransferrableValue;
409
- }
410
464
  if (Array.isArray(value)) {
411
465
  const newItems = [];
412
466
  for (const item of value) {
413
- const newItem = walkValue(item, transferrables);
414
- if (newItem !== UntransferrableValue) {
415
- newItems.push(newItem);
467
+ if (!toRemove.includes(item)) {
468
+ newItems.push(removeValues(item, toRemove));
416
469
  }
417
470
  }
418
471
  return newItems;
@@ -420,9 +473,8 @@ const walkValue = (value, transferrables) => {
420
473
  if (typeof value === 'object') {
421
474
  const newObject = Object.create(null);
422
475
  for (const [key, property] of Object.entries(value)) {
423
- const newValue = walkValue(property, transferrables);
424
- if (newValue !== UntransferrableValue) {
425
- newObject[key] = newValue;
476
+ if (!toRemove.includes(property)) {
477
+ newObject[key] = removeValues(property, toRemove);
426
478
  }
427
479
  }
428
480
  return newObject;
@@ -434,8 +486,8 @@ const walkValue = (value, transferrables) => {
434
486
  // as parameters. If the transferrable object is a parameter, in electron
435
487
  // only an empty objected is received in the main process
436
488
  const fixElectronParameters = value => {
437
- const transfer = [];
438
- const newValue = walkValue(value, transfer);
489
+ const transfer = getTransferrables(value);
490
+ const newValue = removeValues(value, transfer);
439
491
  return {
440
492
  newValue,
441
493
  transfer
@@ -455,7 +507,7 @@ class IpcChildWithElectronWindow extends Ipc {
455
507
  send(message) {
456
508
  this._rawIpc.postMessage(message);
457
509
  }
458
- sendAndTransfer(message, _transfer) {
510
+ sendAndTransfer(message) {
459
511
  const {
460
512
  newValue,
461
513
  transfer
@@ -511,7 +563,8 @@ class IpcChildWithMessagePort extends Ipc {
511
563
  send(message) {
512
564
  this._rawIpc.postMessage(message);
513
565
  }
514
- sendAndTransfer(message, transfer) {
566
+ sendAndTransfer(message) {
567
+ const transfer = getTransferrables(message);
515
568
  this._rawIpc.postMessage(message, transfer);
516
569
  }
517
570
  dispose() {
@@ -663,7 +716,8 @@ class IpcParentWithModuleWorker extends Ipc {
663
716
  send(message) {
664
717
  this._rawIpc.postMessage(message);
665
718
  }
666
- sendAndTransfer(message, transfer) {
719
+ sendAndTransfer(message) {
720
+ const transfer = getTransferrables(message);
667
721
  this._rawIpc.postMessage(message, transfer);
668
722
  }
669
723
  dispose() {
@@ -727,7 +781,7 @@ class IpcParentWithWebSocket extends Ipc {
727
781
  send(message) {
728
782
  this._rawIpc.send(stringifyCompact(message));
729
783
  }
730
- sendAndTransfer(message, transfer) {
784
+ sendAndTransfer(message) {
731
785
  throw new Error('sendAndTransfer not supported');
732
786
  }
733
787
  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,67 @@ class IpcError extends VError {
346
340
  }
347
341
  }
348
342
 
343
+ const isMessagePort = value => {
344
+ return value && value instanceof MessagePort;
345
+ };
346
+
347
+ const isMessagePortMain = value => {
348
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
349
+ };
350
+
351
+ const isOffscreenCanvas = value => {
352
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
353
+ };
354
+
355
+ const isInstanceOf = (value, constructorName) => {
356
+ return value?.constructor?.name === constructorName;
357
+ };
358
+
359
+ const isSocket = value => {
360
+ return isInstanceOf(value, 'Socket');
361
+ };
362
+
363
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
364
+
365
+ const isTransferrable = value => {
366
+ for (const fn of transferrables) {
367
+ if (fn(value)) {
368
+ return true;
369
+ }
370
+ }
371
+ return false;
372
+ };
373
+
374
+ const walkValue = (value, transferrables) => {
375
+ if (!value) {
376
+ return value;
377
+ }
378
+ if (isTransferrable(value)) {
379
+ transferrables.push(value);
380
+ return;
381
+ }
382
+ if (Array.isArray(value)) {
383
+ for (const item of value) {
384
+ walkValue(item, transferrables);
385
+ }
386
+ return;
387
+ }
388
+ if (typeof value === 'object') {
389
+ const newObject = Object.create(null);
390
+ for (const property of Object.values(value)) {
391
+ walkValue(property, transferrables);
392
+ }
393
+ return newObject;
394
+ }
395
+ return value;
396
+ };
397
+
398
+ const getTransferrables = value => {
399
+ const transferrables = [];
400
+ walkValue(value, transferrables);
401
+ return transferrables;
402
+ };
403
+
349
404
  // @ts-ignore
350
405
  const create$2 = async ({
351
406
  path,
@@ -393,7 +448,8 @@ class IpcParentWithElectronUtilityProcess extends Ipc {
393
448
  send(message) {
394
449
  this._rawIpc.postMessage(message);
395
450
  }
396
- sendAndTransfer(message, transfer) {
451
+ sendAndTransfer(message) {
452
+ const transfer = getTransferrables(message);
397
453
  this._rawIpc.postMessage(message, transfer);
398
454
  }
399
455
  dispose() {
@@ -566,7 +622,8 @@ class IpcParentWithNodeForkedProcess extends Ipc {
566
622
  send(message) {
567
623
  this._rawIpc.send(message);
568
624
  }
569
- sendAndTransfer(message, transfer) {
625
+ sendAndTransfer(message) {
626
+ const transfer = getTransferrables(message);
570
627
  this._rawIpc.send(message, transfer);
571
628
  }
572
629
  dispose() {
@@ -697,8 +754,8 @@ const wrap = worker => {
697
754
  this.worker.postMessage(message);
698
755
  },
699
756
  // @ts-ignore
700
- sendAndTransfer(message, transfer) {
701
- array(transfer);
757
+ sendAndTransfer(message) {
758
+ const transfer = getTransferrables(message);
702
759
  this.worker.postMessage(message, transfer);
703
760
  },
704
761
  dispose() {
package/dist/index.js CHANGED
@@ -1,5 +1,103 @@
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 isMessagePort = value => {
5
+ return value && value instanceof MessagePort;
6
+ };
7
+
8
+ const isMessagePortMain = value => {
9
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
10
+ };
11
+
12
+ const isOffscreenCanvas = value => {
13
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
14
+ };
15
+
16
+ const isInstanceOf = (value, constructorName) => {
17
+ return value?.constructor?.name === constructorName;
18
+ };
19
+
20
+ const isSocket = value => {
21
+ return isInstanceOf(value, 'Socket');
22
+ };
23
+
24
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
25
+
26
+ const isTransferrable = value => {
27
+ for (const fn of transferrables) {
28
+ if (fn(value)) {
29
+ return true;
30
+ }
31
+ }
32
+ return false;
33
+ };
34
+
35
+ const walkValue = (value, transferrables) => {
36
+ if (!value) {
37
+ return value;
38
+ }
39
+ if (isTransferrable(value)) {
40
+ transferrables.push(value);
41
+ return;
42
+ }
43
+ if (Array.isArray(value)) {
44
+ for (const item of value) {
45
+ walkValue(item, transferrables);
46
+ }
47
+ return;
48
+ }
49
+ if (typeof value === 'object') {
50
+ const newObject = Object.create(null);
51
+ for (const property of Object.values(value)) {
52
+ walkValue(property, transferrables);
53
+ }
54
+ return newObject;
55
+ }
56
+ return value;
57
+ };
58
+
59
+ const getTransferrables = value => {
60
+ const transferrables = [];
61
+ walkValue(value, transferrables);
62
+ return transferrables;
63
+ };
64
+
65
+ const removeValues = (value, toRemove) => {
66
+ if (!value) {
67
+ return value;
68
+ }
69
+ if (Array.isArray(value)) {
70
+ const newItems = [];
71
+ for (const item of value) {
72
+ if (!toRemove.includes(item)) {
73
+ newItems.push(removeValues(item, toRemove));
74
+ }
75
+ }
76
+ return newItems;
77
+ }
78
+ if (typeof value === 'object') {
79
+ const newObject = Object.create(null);
80
+ for (const [key, property] of Object.entries(value)) {
81
+ if (!toRemove.includes(property)) {
82
+ newObject[key] = removeValues(property, toRemove);
83
+ }
84
+ }
85
+ return newObject;
86
+ }
87
+ return value;
88
+ };
89
+
90
+ // workaround for electron not supporting transferrable objects
91
+ // as parameters. If the transferrable object is a parameter, in electron
92
+ // only an empty objected is received in the main process
93
+ const fixElectronParameters = value => {
94
+ const transfer = getTransferrables(value);
95
+ const newValue = removeValues(value, transfer);
96
+ return {
97
+ newValue,
98
+ transfer
99
+ };
100
+ };
3
101
 
4
102
  const attachEvents = that => {
5
103
  const handleMessage = (...args) => {
@@ -168,10 +266,6 @@ class IpcError extends VError {
168
266
  }
169
267
  }
170
268
 
171
- const isMessagePortMain = value => {
172
- return value && value.constructor && value.constructor.name === 'MessagePortMain';
173
- };
174
-
175
269
  const listen$8 = ({
176
270
  messagePort
177
271
  }) => {
@@ -206,8 +300,12 @@ class IpcChildWithElectronMessagePort extends Ipc {
206
300
  send(message) {
207
301
  this._rawIpc.postMessage(message);
208
302
  }
209
- sendAndTransfer(message, transfer) {
210
- this._rawIpc.postMessage(message, transfer);
303
+ sendAndTransfer(message) {
304
+ const {
305
+ newValue,
306
+ transfer
307
+ } = fixElectronParameters(message);
308
+ this._rawIpc.postMessage(newValue, transfer);
211
309
  }
212
310
  dispose() {
213
311
  this._rawIpc.close();
@@ -267,8 +365,12 @@ class IpcChildWithElectronUtilityProcess extends Ipc {
267
365
  send(message) {
268
366
  this._rawIpc.postMessage(message);
269
367
  }
270
- sendAndTransfer(message, transfer) {
271
- this._rawIpc.postMessage(message, transfer);
368
+ sendAndTransfer(message) {
369
+ const {
370
+ newValue,
371
+ transfer
372
+ } = fixElectronParameters(message);
373
+ this._rawIpc.postMessage(newValue, transfer);
272
374
  }
273
375
  dispose() {
274
376
  this._rawIpc.close();
@@ -313,7 +415,8 @@ class IpcChildWithModuleWorker extends Ipc {
313
415
  // @ts-ignore
314
416
  this._rawIpc.postMessage(message);
315
417
  }
316
- sendAndTransfer(message, transfer) {
418
+ sendAndTransfer(message) {
419
+ const transfer = getTransferrables(message);
317
420
  // @ts-ignore
318
421
  this._rawIpc.postMessage(message, transfer);
319
422
  }
@@ -388,7 +491,8 @@ class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
388
491
  send(message) {
389
492
  this._rawIpc.postMessage(message);
390
493
  }
391
- sendAndTransfer(message, transfer) {
494
+ sendAndTransfer(message) {
495
+ const transfer = getTransferrables(message);
392
496
  this._rawIpc.postMessage(message, transfer);
393
497
  }
394
498
  dispose() {
@@ -448,7 +552,8 @@ class IpcChildWithNodeForkedProcess extends Ipc {
448
552
  onMessage(callback) {
449
553
  this._rawIpc.on('message', callback);
450
554
  }
451
- sendAndTransfer(message, transfer) {
555
+ sendAndTransfer(message) {
556
+ const transfer = getTransferrables(message);
452
557
  this._rawIpc.send(message, transfer);
453
558
  }
454
559
  dispose() {
@@ -466,10 +571,6 @@ const IpcChildWithNodeForkedProcess$1 = {
466
571
  wrap: wrap$7
467
572
  };
468
573
 
469
- const isMessagePort = value => {
470
- return value && value instanceof MessagePort;
471
- };
472
-
473
574
  const listen$3 = async ({
474
575
  messagePort
475
576
  }) => {
@@ -584,7 +685,8 @@ class IpcChildWithRendererProcess2 extends Ipc {
584
685
  send(message) {
585
686
  this._rawIpc.postMessage(preloadChannelType, message);
586
687
  }
587
- sendAndTransfer(message, transfer) {
688
+ sendAndTransfer(message) {
689
+ const transfer = getTransferrables(message);
588
690
  this._rawIpc.postMessage(preloadChannelType, message, transfer);
589
691
  }
590
692
  dispose() {
@@ -904,7 +1006,8 @@ class IpcParentWithElectronUtilityProcess extends Ipc {
904
1006
  send(message) {
905
1007
  this._rawIpc.postMessage(message);
906
1008
  }
907
- sendAndTransfer(message, transfer) {
1009
+ sendAndTransfer(message) {
1010
+ const transfer = getTransferrables(message);
908
1011
  this._rawIpc.postMessage(message, transfer);
909
1012
  }
910
1013
  dispose() {
@@ -1077,7 +1180,8 @@ class IpcParentWithNodeForkedProcess extends Ipc {
1077
1180
  send(message) {
1078
1181
  this._rawIpc.send(message);
1079
1182
  }
1080
- sendAndTransfer(message, transfer) {
1183
+ sendAndTransfer(message) {
1184
+ const transfer = getTransferrables(message);
1081
1185
  this._rawIpc.send(message, transfer);
1082
1186
  }
1083
1187
  dispose() {
@@ -1167,8 +1271,8 @@ const wrap = worker => {
1167
1271
  this.worker.postMessage(message);
1168
1272
  },
1169
1273
  // @ts-ignore
1170
- sendAndTransfer(message, transfer) {
1171
- array(transfer);
1274
+ sendAndTransfer(message) {
1275
+ const transfer = getTransferrables(message);
1172
1276
  this.worker.postMessage(message, transfer);
1173
1277
  },
1174
1278
  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.0",
4
4
  "description": "Inter Process Communication for Lvce Editor",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",