@lvce-editor/ipc 10.0.2 → 10.0.4

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/electron.js CHANGED
@@ -37,6 +37,102 @@ const Exit = 1;
37
37
  const Error$1 = 2;
38
38
  const Message = 3;
39
39
 
40
+ const walkValue = (value, transferrables, isTransferrable) => {
41
+ if (!value) {
42
+ return;
43
+ }
44
+ if (isTransferrable(value)) {
45
+ transferrables.push(value);
46
+ return;
47
+ }
48
+ if (Array.isArray(value)) {
49
+ for (const item of value) {
50
+ walkValue(item, transferrables, isTransferrable);
51
+ }
52
+ return;
53
+ }
54
+ if (typeof value === 'object') {
55
+ for (const property of Object.values(value)) {
56
+ walkValue(property, transferrables, isTransferrable);
57
+ }
58
+ return;
59
+ }
60
+ };
61
+
62
+ const isMessagePort = value => {
63
+ return value && value instanceof MessagePort;
64
+ };
65
+
66
+ const isMessagePortMain = value => {
67
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
68
+ };
69
+
70
+ const isOffscreenCanvas = value => {
71
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
72
+ };
73
+
74
+ const isInstanceOf = (value, constructorName) => {
75
+ return value?.constructor?.name === constructorName;
76
+ };
77
+
78
+ const isSocket = value => {
79
+ return isInstanceOf(value, 'Socket');
80
+ };
81
+
82
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
83
+
84
+ const isTransferrable = value => {
85
+ for (const fn of transferrables) {
86
+ if (fn(value)) {
87
+ return true;
88
+ }
89
+ }
90
+ return false;
91
+ };
92
+
93
+ const getTransferrables = value => {
94
+ const transferrables = [];
95
+ walkValue(value, transferrables, isTransferrable);
96
+ return transferrables;
97
+ };
98
+
99
+ const removeValues = (value, toRemove) => {
100
+ if (!value) {
101
+ return value;
102
+ }
103
+ if (Array.isArray(value)) {
104
+ const newItems = [];
105
+ for (const item of value) {
106
+ if (!toRemove.includes(item)) {
107
+ newItems.push(removeValues(item, toRemove));
108
+ }
109
+ }
110
+ return newItems;
111
+ }
112
+ if (typeof value === 'object') {
113
+ const newObject = Object.create(null);
114
+ for (const [key, property] of Object.entries(value)) {
115
+ if (!toRemove.includes(property)) {
116
+ newObject[key] = removeValues(property, toRemove);
117
+ }
118
+ }
119
+ return newObject;
120
+ }
121
+ return value;
122
+ };
123
+
124
+ // workaround for electron not supporting transferrable objects
125
+ // as parameters. If the transferrable object is a parameter, in electron
126
+ // only an empty objected is received in the main process
127
+ const fixElectronParameters = value => {
128
+ const transfer = getTransferrables(value);
129
+ const newValue = removeValues(value, transfer);
130
+ return {
131
+ newValue,
132
+ transfer
133
+ };
134
+ };
135
+
40
136
  const withResolvers = () => {
41
137
  let _resolve;
42
138
  const promise = new Promise(resolve => {
@@ -340,65 +436,6 @@ class IpcError extends VError {
340
436
  }
341
437
  }
342
438
 
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
-
402
439
  // @ts-ignore
403
440
  const create$2 = async ({
404
441
  path,
@@ -447,8 +484,11 @@ class IpcParentWithElectronUtilityProcess extends Ipc {
447
484
  this._rawIpc.postMessage(message);
448
485
  }
449
486
  sendAndTransfer(message) {
450
- const transfer = getTransferrables(message);
451
- this._rawIpc.postMessage(message, transfer);
487
+ const {
488
+ newValue,
489
+ transfer
490
+ } = fixElectronParameters(message);
491
+ this._rawIpc.postMessage(newValue, transfer);
452
492
  }
453
493
  dispose() {
454
494
  this._rawIpc.kill();
@@ -496,6 +536,21 @@ class ChildProcessError extends Error {
496
536
  }
497
537
  }
498
538
 
539
+ // workaround for node not supporting transferrable objects
540
+ // as parameters. If the transferrable object is a parameter,
541
+ // it is received as a plain object is received in the receiving process
542
+ const fixNodeParameters = value => {
543
+ const transfer = getTransferrables(value);
544
+ if (transfer.length === 0) {
545
+ throw new Error('no transferrables found');
546
+ }
547
+ const newValue = removeValues(value, transfer);
548
+ return {
549
+ newValue,
550
+ transfer: transfer[0]
551
+ };
552
+ };
553
+
499
554
  // @ts-ignore
500
555
  const getFirstNodeChildProcessEvent = async childProcess => {
501
556
  // @ts-ignore
@@ -569,14 +624,6 @@ const getFirstNodeChildProcessEvent = async childProcess => {
569
624
  };
570
625
  };
571
626
 
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
-
580
627
  // @ts-ignore
581
628
  const create$1 = async ({
582
629
  path,
@@ -629,8 +676,11 @@ class IpcParentWithNodeForkedProcess extends Ipc {
629
676
  this._rawIpc.send(message);
630
677
  }
631
678
  sendAndTransfer(message) {
632
- const transfer = getTransferrablesNode(message);
633
- this._rawIpc.send(message, transfer);
679
+ const {
680
+ newValue,
681
+ transfer
682
+ } = fixNodeParameters(message);
683
+ this._rawIpc.send(newValue, transfer);
634
684
  }
635
685
  dispose() {
636
686
  this._rawIpc.kill();
@@ -761,8 +811,11 @@ const wrap = worker => {
761
811
  },
762
812
  // @ts-ignore
763
813
  sendAndTransfer(message) {
764
- const transfer = getTransferrablesNode(message);
765
- this.worker.postMessage(message, transfer);
814
+ const {
815
+ newValue,
816
+ transfer
817
+ } = fixNodeParameters(message);
818
+ this.worker.postMessage(newValue, transfer);
766
819
  },
767
820
  dispose() {
768
821
  this.worker.terminate();
package/dist/index.js CHANGED
@@ -275,7 +275,7 @@ const listen$8 = ({
275
275
  const signal$6 = messagePort => {
276
276
  messagePort.start();
277
277
  };
278
- const getActualData = event => {
278
+ const getActualData$1 = event => {
279
279
  const {
280
280
  data,
281
281
  ports
@@ -293,7 +293,7 @@ class IpcChildWithElectronMessagePort extends Ipc {
293
293
  super(port);
294
294
  }
295
295
  getData(event) {
296
- return getActualData(event);
296
+ return getActualData$1(event);
297
297
  }
298
298
  send(message) {
299
299
  this._rawIpc.postMessage(message);
@@ -524,6 +524,16 @@ const getTransferrablesNode = value => {
524
524
  return transferrables[0];
525
525
  };
526
526
 
527
+ const getActualData = (message, handle) => {
528
+ if (handle) {
529
+ return {
530
+ ...message,
531
+ params: [handle, ...message.params]
532
+ };
533
+ }
534
+ return message;
535
+ };
536
+
527
537
  const listen$4 = async () => {
528
538
  if (!process.send) {
529
539
  throw new Error('process.send must be defined');
@@ -537,8 +547,8 @@ class IpcChildWithNodeForkedProcess extends Ipc {
537
547
  constructor(process) {
538
548
  super(process);
539
549
  }
540
- getData(message) {
541
- return message;
550
+ getData(message, handle) {
551
+ return getActualData(message, handle);
542
552
  }
543
553
  onClose(callback) {
544
554
  this._rawIpc.on('close', callback);
@@ -630,9 +640,9 @@ const wrap$5 = parentPort => {
630
640
  return {
631
641
  parentPort,
632
642
  on(event, listener) {
633
- const wrappedListener = message => {
643
+ const wrappedListener = (message, handle) => {
634
644
  const event = {
635
- data: message,
645
+ data: getActualData(message, handle),
636
646
  target: this
637
647
  };
638
648
  listener(event);
@@ -1004,8 +1014,11 @@ class IpcParentWithElectronUtilityProcess extends Ipc {
1004
1014
  this._rawIpc.postMessage(message);
1005
1015
  }
1006
1016
  sendAndTransfer(message) {
1007
- const transfer = getTransferrables(message);
1008
- this._rawIpc.postMessage(message, transfer);
1017
+ const {
1018
+ newValue,
1019
+ transfer
1020
+ } = fixElectronParameters(message);
1021
+ this._rawIpc.postMessage(newValue, transfer);
1009
1022
  }
1010
1023
  dispose() {
1011
1024
  this._rawIpc.kill();
@@ -1053,6 +1066,21 @@ class ChildProcessError extends Error {
1053
1066
  }
1054
1067
  }
1055
1068
 
1069
+ // workaround for node not supporting transferrable objects
1070
+ // as parameters. If the transferrable object is a parameter,
1071
+ // it is received as a plain object is received in the receiving process
1072
+ const fixNodeParameters = value => {
1073
+ const transfer = getTransferrables(value);
1074
+ if (transfer.length === 0) {
1075
+ throw new Error('no transferrables found');
1076
+ }
1077
+ const newValue = removeValues(value, transfer);
1078
+ return {
1079
+ newValue,
1080
+ transfer: transfer[0]
1081
+ };
1082
+ };
1083
+
1056
1084
  // @ts-ignore
1057
1085
  const getFirstNodeChildProcessEvent = async childProcess => {
1058
1086
  // @ts-ignore
@@ -1178,8 +1206,11 @@ class IpcParentWithNodeForkedProcess extends Ipc {
1178
1206
  this._rawIpc.send(message);
1179
1207
  }
1180
1208
  sendAndTransfer(message) {
1181
- const transfer = getTransferrablesNode(message);
1182
- this._rawIpc.send(message, transfer);
1209
+ const {
1210
+ newValue,
1211
+ transfer
1212
+ } = fixNodeParameters(message);
1213
+ this._rawIpc.send(newValue, transfer);
1183
1214
  }
1184
1215
  dispose() {
1185
1216
  this._rawIpc.kill();
@@ -1269,8 +1300,11 @@ const wrap = worker => {
1269
1300
  },
1270
1301
  // @ts-ignore
1271
1302
  sendAndTransfer(message) {
1272
- const transfer = getTransferrablesNode(message);
1273
- this.worker.postMessage(message, transfer);
1303
+ const {
1304
+ newValue,
1305
+ transfer
1306
+ } = fixNodeParameters(message);
1307
+ this.worker.postMessage(newValue, transfer);
1274
1308
  },
1275
1309
  dispose() {
1276
1310
  this.worker.terminate();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/ipc",
3
- "version": "10.0.2",
3
+ "version": "10.0.4",
4
4
  "description": "Inter Process Communication for Lvce Editor",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",