@lvce-editor/iframe-worker 3.2.0 → 3.3.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/iframeWorkerMain.js +656 -702
- package/package.json +1 -1
package/dist/iframeWorkerMain.js
CHANGED
|
@@ -1,747 +1,746 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
const normalizeLine = line => {
|
|
2
|
+
if (line.startsWith('Error: ')) {
|
|
3
|
+
return line.slice('Error: '.length);
|
|
4
|
+
}
|
|
5
|
+
if (line.startsWith('VError: ')) {
|
|
6
|
+
return line.slice('VError: '.length);
|
|
7
|
+
}
|
|
8
|
+
return line;
|
|
9
|
+
};
|
|
10
|
+
const getCombinedMessage = (error, message) => {
|
|
11
|
+
const stringifiedError = normalizeLine(`${error}`);
|
|
12
|
+
if (message) {
|
|
13
|
+
return `${message}: ${stringifiedError}`;
|
|
14
|
+
}
|
|
15
|
+
return stringifiedError;
|
|
16
|
+
};
|
|
17
|
+
const NewLine$2 = '\n';
|
|
18
|
+
const getNewLineIndex$1 = (string, startIndex = undefined) => {
|
|
19
|
+
return string.indexOf(NewLine$2, startIndex);
|
|
20
|
+
};
|
|
21
|
+
const mergeStacks = (parent, child) => {
|
|
22
|
+
if (!child) {
|
|
23
|
+
return parent;
|
|
24
|
+
}
|
|
25
|
+
const parentNewLineIndex = getNewLineIndex$1(parent);
|
|
26
|
+
const childNewLineIndex = getNewLineIndex$1(child);
|
|
27
|
+
if (childNewLineIndex === -1) {
|
|
28
|
+
return parent;
|
|
29
|
+
}
|
|
30
|
+
const parentFirstLine = parent.slice(0, parentNewLineIndex);
|
|
31
|
+
const childRest = child.slice(childNewLineIndex);
|
|
32
|
+
const childFirstLine = normalizeLine(child.slice(0, childNewLineIndex));
|
|
33
|
+
if (parentFirstLine.includes(childFirstLine)) {
|
|
34
|
+
return parentFirstLine + childRest;
|
|
35
|
+
}
|
|
36
|
+
return child;
|
|
37
|
+
};
|
|
38
|
+
class VError extends Error {
|
|
39
|
+
constructor(error, message) {
|
|
40
|
+
const combinedMessage = getCombinedMessage(error, message);
|
|
41
|
+
super(combinedMessage);
|
|
42
|
+
this.name = 'VError';
|
|
43
|
+
if (error instanceof Error) {
|
|
44
|
+
this.stack = mergeStacks(this.stack, error.stack);
|
|
45
|
+
}
|
|
46
|
+
if (error.codeFrame) {
|
|
47
|
+
// @ts-ignore
|
|
48
|
+
this.codeFrame = error.codeFrame;
|
|
49
|
+
}
|
|
50
|
+
if (error.code) {
|
|
51
|
+
// @ts-ignore
|
|
52
|
+
this.code = error.code;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const walkValue = (value, transferrables, isTransferrable) => {
|
|
58
|
+
if (!value) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (isTransferrable(value)) {
|
|
62
|
+
transferrables.push(value);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
for (const item of value) {
|
|
67
|
+
walkValue(item, transferrables, isTransferrable);
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (typeof value === 'object') {
|
|
72
|
+
for (const property of Object.values(value)) {
|
|
73
|
+
walkValue(property, transferrables, isTransferrable);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const isMessagePort = value => {
|
|
79
|
+
return value && value instanceof MessagePort;
|
|
80
|
+
};
|
|
81
|
+
const isMessagePortMain = value => {
|
|
82
|
+
return value && value.constructor && value.constructor.name === 'MessagePortMain';
|
|
83
|
+
};
|
|
84
|
+
const isOffscreenCanvas = value => {
|
|
85
|
+
return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
|
|
86
|
+
};
|
|
87
|
+
const isInstanceOf = (value, constructorName) => {
|
|
88
|
+
return value?.constructor?.name === constructorName;
|
|
89
|
+
};
|
|
90
|
+
const isSocket = value => {
|
|
91
|
+
return isInstanceOf(value, 'Socket');
|
|
92
|
+
};
|
|
93
|
+
const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
|
|
94
|
+
const isTransferrable = value => {
|
|
95
|
+
for (const fn of transferrables) {
|
|
96
|
+
if (fn(value)) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
};
|
|
102
|
+
const getTransferrables = value => {
|
|
103
|
+
const transferrables = [];
|
|
104
|
+
walkValue(value, transferrables, isTransferrable);
|
|
105
|
+
return transferrables;
|
|
106
|
+
};
|
|
107
|
+
const attachEvents = that => {
|
|
108
|
+
const handleMessage = (...args) => {
|
|
109
|
+
const data = that.getData(...args);
|
|
110
|
+
that.dispatchEvent(new MessageEvent('message', {
|
|
111
|
+
data
|
|
112
|
+
}));
|
|
113
|
+
};
|
|
114
|
+
that.onMessage(handleMessage);
|
|
115
|
+
const handleClose = event => {
|
|
116
|
+
that.dispatchEvent(new Event('close'));
|
|
7
117
|
};
|
|
118
|
+
that.onClose(handleClose);
|
|
8
119
|
};
|
|
9
|
-
|
|
10
|
-
|
|
120
|
+
class Ipc extends EventTarget {
|
|
121
|
+
constructor(rawIpc) {
|
|
122
|
+
super();
|
|
123
|
+
this._rawIpc = rawIpc;
|
|
124
|
+
attachEvents(this);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const E_INCOMPATIBLE_NATIVE_MODULE = 'E_INCOMPATIBLE_NATIVE_MODULE';
|
|
128
|
+
const E_MODULES_NOT_SUPPORTED_IN_ELECTRON = 'E_MODULES_NOT_SUPPORTED_IN_ELECTRON';
|
|
129
|
+
const ERR_MODULE_NOT_FOUND = 'ERR_MODULE_NOT_FOUND';
|
|
130
|
+
const NewLine$1 = '\n';
|
|
131
|
+
const joinLines$1 = lines => {
|
|
132
|
+
return lines.join(NewLine$1);
|
|
11
133
|
};
|
|
12
|
-
const
|
|
13
|
-
|
|
134
|
+
const splitLines$1 = lines => {
|
|
135
|
+
return lines.split(NewLine$1);
|
|
14
136
|
};
|
|
15
|
-
const
|
|
16
|
-
return
|
|
137
|
+
const isModuleNotFoundMessage = line => {
|
|
138
|
+
return line.includes('[ERR_MODULE_NOT_FOUND]');
|
|
17
139
|
};
|
|
18
|
-
const
|
|
19
|
-
|
|
140
|
+
const getModuleNotFoundError = stderr => {
|
|
141
|
+
const lines = splitLines$1(stderr);
|
|
142
|
+
const messageIndex = lines.findIndex(isModuleNotFoundMessage);
|
|
143
|
+
const message = lines[messageIndex];
|
|
144
|
+
return {
|
|
145
|
+
message,
|
|
146
|
+
code: ERR_MODULE_NOT_FOUND
|
|
147
|
+
};
|
|
20
148
|
};
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
149
|
+
const RE_NATIVE_MODULE_ERROR = /^innerError Error: Cannot find module '.*.node'/;
|
|
150
|
+
const RE_NATIVE_MODULE_ERROR_2 = /was compiled against a different Node.js version/;
|
|
151
|
+
const RE_MESSAGE_CODE_BLOCK_START = /^Error: The module '.*'$/;
|
|
152
|
+
const RE_MESSAGE_CODE_BLOCK_END = /^\s* at/;
|
|
153
|
+
const RE_AT = /^\s+at/;
|
|
154
|
+
const RE_AT_PROMISE_INDEX = /^\s*at async Promise.all \(index \d+\)$/;
|
|
155
|
+
const isUnhelpfulNativeModuleError = stderr => {
|
|
156
|
+
return RE_NATIVE_MODULE_ERROR.test(stderr) && RE_NATIVE_MODULE_ERROR_2.test(stderr);
|
|
24
157
|
};
|
|
25
|
-
const
|
|
26
|
-
|
|
158
|
+
const isMessageCodeBlockStartIndex = line => {
|
|
159
|
+
return RE_MESSAGE_CODE_BLOCK_START.test(line);
|
|
27
160
|
};
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
161
|
+
const isMessageCodeBlockEndIndex = line => {
|
|
162
|
+
return RE_MESSAGE_CODE_BLOCK_END.test(line);
|
|
163
|
+
};
|
|
164
|
+
const getMessageCodeBlock = stderr => {
|
|
165
|
+
const lines = splitLines$1(stderr);
|
|
166
|
+
const startIndex = lines.findIndex(isMessageCodeBlockStartIndex);
|
|
167
|
+
const endIndex = startIndex + lines.slice(startIndex).findIndex(isMessageCodeBlockEndIndex, startIndex);
|
|
168
|
+
const relevantLines = lines.slice(startIndex, endIndex);
|
|
169
|
+
const relevantMessage = relevantLines.join(' ').slice('Error: '.length);
|
|
170
|
+
return relevantMessage;
|
|
171
|
+
};
|
|
172
|
+
const getNativeModuleErrorMessage = stderr => {
|
|
173
|
+
const message = getMessageCodeBlock(stderr);
|
|
35
174
|
return {
|
|
36
|
-
|
|
37
|
-
|
|
175
|
+
message: `Incompatible native node module: ${message}`,
|
|
176
|
+
code: E_INCOMPATIBLE_NATIVE_MODULE
|
|
38
177
|
};
|
|
39
178
|
};
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
console.log(response);
|
|
44
|
-
warn(`callback ${id} may already be disposed`);
|
|
45
|
-
return;
|
|
179
|
+
const isModulesSyntaxError = stderr => {
|
|
180
|
+
if (!stderr) {
|
|
181
|
+
return false;
|
|
46
182
|
}
|
|
47
|
-
|
|
48
|
-
remove(id);
|
|
183
|
+
return stderr.includes('SyntaxError: Cannot use import statement outside a module');
|
|
49
184
|
};
|
|
50
|
-
const
|
|
51
|
-
const {
|
|
52
|
-
id,
|
|
53
|
-
promise
|
|
54
|
-
} = registerPromise();
|
|
55
|
-
const message = {
|
|
56
|
-
jsonrpc: Two,
|
|
57
|
-
method,
|
|
58
|
-
params,
|
|
59
|
-
id
|
|
60
|
-
};
|
|
185
|
+
const getModuleSyntaxError = () => {
|
|
61
186
|
return {
|
|
62
|
-
message
|
|
63
|
-
|
|
187
|
+
message: `ES Modules are not supported in electron`,
|
|
188
|
+
code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
|
|
64
189
|
};
|
|
65
190
|
};
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
this.name = 'JsonRpcError';
|
|
191
|
+
const isModuleNotFoundError = stderr => {
|
|
192
|
+
if (!stderr) {
|
|
193
|
+
return false;
|
|
70
194
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
default:
|
|
89
|
-
return Error;
|
|
195
|
+
return stderr.includes('ERR_MODULE_NOT_FOUND');
|
|
196
|
+
};
|
|
197
|
+
const isNormalStackLine = line => {
|
|
198
|
+
return RE_AT.test(line) && !RE_AT_PROMISE_INDEX.test(line);
|
|
199
|
+
};
|
|
200
|
+
const getDetails = lines => {
|
|
201
|
+
const index = lines.findIndex(isNormalStackLine);
|
|
202
|
+
if (index === -1) {
|
|
203
|
+
return {
|
|
204
|
+
actualMessage: joinLines$1(lines),
|
|
205
|
+
rest: []
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
let lastIndex = index - 1;
|
|
209
|
+
while (++lastIndex < lines.length) {
|
|
210
|
+
if (!isNormalStackLine(lines[lastIndex])) {
|
|
211
|
+
break;
|
|
90
212
|
}
|
|
91
213
|
}
|
|
92
|
-
|
|
93
|
-
|
|
214
|
+
return {
|
|
215
|
+
actualMessage: lines[index - 1],
|
|
216
|
+
rest: lines.slice(index, lastIndex)
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
const getHelpfulChildProcessError = (stdout, stderr) => {
|
|
220
|
+
if (isUnhelpfulNativeModuleError(stderr)) {
|
|
221
|
+
return getNativeModuleErrorMessage(stderr);
|
|
94
222
|
}
|
|
95
|
-
if (
|
|
96
|
-
return
|
|
223
|
+
if (isModulesSyntaxError(stderr)) {
|
|
224
|
+
return getModuleSyntaxError();
|
|
97
225
|
}
|
|
98
|
-
if (
|
|
99
|
-
return
|
|
226
|
+
if (isModuleNotFoundError(stderr)) {
|
|
227
|
+
return getModuleNotFoundError(stderr);
|
|
100
228
|
}
|
|
101
|
-
|
|
229
|
+
const lines = splitLines$1(stderr);
|
|
230
|
+
const {
|
|
231
|
+
actualMessage,
|
|
232
|
+
rest
|
|
233
|
+
} = getDetails(lines);
|
|
234
|
+
return {
|
|
235
|
+
message: `${actualMessage}`,
|
|
236
|
+
code: '',
|
|
237
|
+
stack: rest
|
|
238
|
+
};
|
|
102
239
|
};
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
240
|
+
class IpcError extends VError {
|
|
241
|
+
// @ts-ignore
|
|
242
|
+
constructor(betterMessage, stdout = '', stderr = '') {
|
|
243
|
+
if (stdout || stderr) {
|
|
244
|
+
// @ts-ignore
|
|
245
|
+
const {
|
|
246
|
+
message,
|
|
247
|
+
code,
|
|
248
|
+
stack
|
|
249
|
+
} = getHelpfulChildProcessError(stdout, stderr);
|
|
250
|
+
const cause = new Error(message);
|
|
251
|
+
// @ts-ignore
|
|
252
|
+
cause.code = code;
|
|
253
|
+
cause.stack = stack;
|
|
254
|
+
super(cause, betterMessage);
|
|
255
|
+
} else {
|
|
256
|
+
super(betterMessage);
|
|
112
257
|
}
|
|
113
|
-
|
|
258
|
+
// @ts-ignore
|
|
259
|
+
this.name = 'IpcError';
|
|
260
|
+
// @ts-ignore
|
|
261
|
+
this.stdout = stdout;
|
|
262
|
+
// @ts-ignore
|
|
263
|
+
this.stderr = stderr;
|
|
114
264
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const
|
|
118
|
-
return
|
|
265
|
+
}
|
|
266
|
+
const readyMessage = 'ready';
|
|
267
|
+
const getData$2 = event => {
|
|
268
|
+
return event.data;
|
|
119
269
|
};
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
|
|
270
|
+
const listen$6 = () => {
|
|
271
|
+
// @ts-ignore
|
|
272
|
+
if (typeof WorkerGlobalScope === 'undefined') {
|
|
273
|
+
throw new TypeError('module is not in web worker scope');
|
|
124
274
|
}
|
|
125
|
-
return
|
|
126
|
-
};
|
|
127
|
-
const joinLines$1 = lines => {
|
|
128
|
-
return lines.join(NewLine$3);
|
|
275
|
+
return globalThis;
|
|
129
276
|
};
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
const splitLines$1 = lines => {
|
|
133
|
-
return lines.split(NewLine$3);
|
|
277
|
+
const signal$6 = global => {
|
|
278
|
+
global.postMessage(readyMessage);
|
|
134
279
|
};
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
return
|
|
280
|
+
class IpcChildWithModuleWorker extends Ipc {
|
|
281
|
+
getData(event) {
|
|
282
|
+
return getData$2(event);
|
|
138
283
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const parentStack = getParentStack(error);
|
|
143
|
-
restoredError.stack = parentStack + NewLine$3 + currentStack;
|
|
144
|
-
return restoredError;
|
|
284
|
+
send(message) {
|
|
285
|
+
// @ts-ignore
|
|
286
|
+
this._rawIpc.postMessage(message);
|
|
145
287
|
}
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
restoredError.stack = error.data.type + ': ' + error.message + NewLine$3 + error.data.stack + NewLine$3 + currentStack;
|
|
151
|
-
} else if (error.data.stack) {
|
|
152
|
-
restoredError.stack = error.data.stack;
|
|
153
|
-
}
|
|
154
|
-
if (error.data.codeFrame) {
|
|
155
|
-
// @ts-ignore
|
|
156
|
-
restoredError.codeFrame = error.data.codeFrame;
|
|
157
|
-
}
|
|
158
|
-
if (error.data.code) {
|
|
159
|
-
// @ts-ignore
|
|
160
|
-
restoredError.code = error.data.code;
|
|
161
|
-
}
|
|
162
|
-
if (error.data.type) {
|
|
163
|
-
// @ts-ignore
|
|
164
|
-
restoredError.name = error.data.type;
|
|
165
|
-
}
|
|
166
|
-
} else {
|
|
167
|
-
if (error.stack) {
|
|
168
|
-
const lowerStack = restoredError.stack || '';
|
|
169
|
-
// @ts-ignore
|
|
170
|
-
const indexNewLine = getNewLineIndex$2(lowerStack);
|
|
171
|
-
const parentStack = getParentStack(error);
|
|
172
|
-
// @ts-ignore
|
|
173
|
-
restoredError.stack = parentStack + lowerStack.slice(indexNewLine);
|
|
174
|
-
}
|
|
175
|
-
if (error.codeFrame) {
|
|
176
|
-
// @ts-ignore
|
|
177
|
-
restoredError.codeFrame = error.codeFrame;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return restoredError;
|
|
288
|
+
sendAndTransfer(message) {
|
|
289
|
+
const transfer = getTransferrables(message);
|
|
290
|
+
// @ts-ignore
|
|
291
|
+
this._rawIpc.postMessage(message, transfer);
|
|
181
292
|
}
|
|
182
|
-
|
|
183
|
-
|
|
293
|
+
dispose() {
|
|
294
|
+
// ignore
|
|
184
295
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const unwrapJsonRpcResult = responseMessage => {
|
|
188
|
-
if ('error' in responseMessage) {
|
|
189
|
-
const restoredError = restoreJsonRpcError(responseMessage.error);
|
|
190
|
-
throw restoredError;
|
|
296
|
+
onClose(callback) {
|
|
297
|
+
// ignore
|
|
191
298
|
}
|
|
192
|
-
|
|
193
|
-
|
|
299
|
+
onMessage(callback) {
|
|
300
|
+
this._rawIpc.addEventListener('message', callback);
|
|
194
301
|
}
|
|
195
|
-
|
|
302
|
+
}
|
|
303
|
+
const wrap$d = global => {
|
|
304
|
+
return new IpcChildWithModuleWorker(global);
|
|
196
305
|
};
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
306
|
+
const withResolvers = () => {
|
|
307
|
+
let _resolve;
|
|
308
|
+
const promise = new Promise(resolve => {
|
|
309
|
+
_resolve = resolve;
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
resolve: _resolve,
|
|
313
|
+
promise
|
|
314
|
+
};
|
|
315
|
+
};
|
|
316
|
+
const waitForFirstMessage = async port => {
|
|
317
|
+
const {
|
|
318
|
+
resolve,
|
|
319
|
+
promise
|
|
320
|
+
} = withResolvers();
|
|
321
|
+
port.addEventListener('message', resolve, {
|
|
322
|
+
once: true
|
|
323
|
+
});
|
|
324
|
+
const event = await promise;
|
|
325
|
+
// @ts-ignore
|
|
326
|
+
return event.data;
|
|
327
|
+
};
|
|
328
|
+
const listen$5 = async () => {
|
|
329
|
+
const parentIpcRaw = listen$6();
|
|
330
|
+
signal$6(parentIpcRaw);
|
|
331
|
+
const parentIpc = wrap$d(parentIpcRaw);
|
|
332
|
+
const firstMessage = await waitForFirstMessage(parentIpc);
|
|
333
|
+
if (firstMessage.method !== 'initialize') {
|
|
334
|
+
throw new IpcError('unexpected first message');
|
|
201
335
|
}
|
|
202
|
-
|
|
203
|
-
|
|
336
|
+
const type = firstMessage.params[0];
|
|
337
|
+
if (type === 'message-port') {
|
|
338
|
+
parentIpc.send({
|
|
339
|
+
jsonrpc: '2.0',
|
|
340
|
+
id: firstMessage.id,
|
|
341
|
+
result: null
|
|
342
|
+
});
|
|
343
|
+
parentIpc.dispose();
|
|
344
|
+
const port = firstMessage.params[1];
|
|
345
|
+
return port;
|
|
204
346
|
}
|
|
205
|
-
return
|
|
347
|
+
return globalThis;
|
|
206
348
|
};
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
code: MethodNotFound,
|
|
211
|
-
message: error.message,
|
|
212
|
-
data: error.stack
|
|
213
|
-
};
|
|
349
|
+
class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
|
|
350
|
+
constructor(port) {
|
|
351
|
+
super(port);
|
|
214
352
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
353
|
+
getData(event) {
|
|
354
|
+
return getData$2(event);
|
|
355
|
+
}
|
|
356
|
+
send(message) {
|
|
357
|
+
this._rawIpc.postMessage(message);
|
|
358
|
+
}
|
|
359
|
+
sendAndTransfer(message) {
|
|
360
|
+
const transfer = getTransferrables(message);
|
|
361
|
+
this._rawIpc.postMessage(message, transfer);
|
|
362
|
+
}
|
|
363
|
+
dispose() {
|
|
364
|
+
if (this._rawIpc.close) {
|
|
365
|
+
this._rawIpc.close();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
onClose(callback) {
|
|
369
|
+
// ignore
|
|
370
|
+
}
|
|
371
|
+
onMessage(callback) {
|
|
372
|
+
this._rawIpc.addEventListener('message', callback);
|
|
373
|
+
this._rawIpc.start();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const wrap$c = port => {
|
|
377
|
+
return new IpcChildWithModuleWorkerAndMessagePort(port);
|
|
233
378
|
};
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
return create$1$2(message, errorProperty);
|
|
379
|
+
const IpcChildWithModuleWorkerAndMessagePort$1 = {
|
|
380
|
+
__proto__: null,
|
|
381
|
+
listen: listen$5,
|
|
382
|
+
wrap: wrap$c
|
|
239
383
|
};
|
|
240
|
-
|
|
384
|
+
|
|
385
|
+
const Two = '2.0';
|
|
386
|
+
const create$4 = (method, params) => {
|
|
241
387
|
return {
|
|
242
388
|
jsonrpc: Two,
|
|
243
|
-
|
|
244
|
-
|
|
389
|
+
method,
|
|
390
|
+
params
|
|
245
391
|
};
|
|
246
392
|
};
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
393
|
+
const callbacks = Object.create(null);
|
|
394
|
+
const set = (id, fn) => {
|
|
395
|
+
callbacks[id] = fn;
|
|
250
396
|
};
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
const result = requiresSocket(message.method) ? await execute(message.method, ipc, ...message.params) : await execute(message.method, ...message.params);
|
|
254
|
-
return getSuccessResponse(message, result);
|
|
255
|
-
} catch (error) {
|
|
256
|
-
return getErrorResponse(message, error, preparePrettyError, logError);
|
|
257
|
-
}
|
|
397
|
+
const get = id => {
|
|
398
|
+
return callbacks[id];
|
|
258
399
|
};
|
|
259
|
-
const
|
|
260
|
-
|
|
400
|
+
const remove = id => {
|
|
401
|
+
delete callbacks[id];
|
|
261
402
|
};
|
|
262
|
-
|
|
263
|
-
|
|
403
|
+
let id = 0;
|
|
404
|
+
const create$3 = () => {
|
|
405
|
+
return ++id;
|
|
264
406
|
};
|
|
265
|
-
const
|
|
266
|
-
|
|
407
|
+
const warn = (...args) => {
|
|
408
|
+
console.warn(...args);
|
|
267
409
|
};
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
ipc: options.ipc,
|
|
276
|
-
message: options.message,
|
|
277
|
-
execute: options.execute,
|
|
278
|
-
resolve: options.resolve || defaultResolve,
|
|
279
|
-
preparePrettyError: options.preparePrettyError || defaultPreparePrettyError,
|
|
280
|
-
logError: options.logError || defaultLogError,
|
|
281
|
-
requiresSocket: options.requiresSocket || defaultRequiresSocket
|
|
282
|
-
};
|
|
283
|
-
}
|
|
410
|
+
const registerPromise = () => {
|
|
411
|
+
const id = create$3();
|
|
412
|
+
const {
|
|
413
|
+
resolve,
|
|
414
|
+
promise
|
|
415
|
+
} = Promise.withResolvers();
|
|
416
|
+
set(id, resolve);
|
|
284
417
|
return {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
execute: args[2],
|
|
288
|
-
resolve: args[3],
|
|
289
|
-
preparePrettyError: args[4],
|
|
290
|
-
logError: args[5],
|
|
291
|
-
requiresSocket: args[6]
|
|
418
|
+
id,
|
|
419
|
+
promise
|
|
292
420
|
};
|
|
293
421
|
};
|
|
294
|
-
const
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
execute,
|
|
300
|
-
resolve,
|
|
301
|
-
preparePrettyError,
|
|
302
|
-
logError,
|
|
303
|
-
requiresSocket
|
|
304
|
-
} = options;
|
|
305
|
-
if ('id' in message) {
|
|
306
|
-
if ('method' in message) {
|
|
307
|
-
const response = await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
|
|
308
|
-
try {
|
|
309
|
-
ipc.send(response);
|
|
310
|
-
} catch (error) {
|
|
311
|
-
const errorResponse = getErrorResponse(message, error, preparePrettyError, logError);
|
|
312
|
-
ipc.send(errorResponse);
|
|
313
|
-
}
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
resolve(message.id, message);
|
|
317
|
-
return;
|
|
318
|
-
}
|
|
319
|
-
if ('method' in message) {
|
|
320
|
-
await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
|
|
422
|
+
const resolve = (id, response) => {
|
|
423
|
+
const fn = get(id);
|
|
424
|
+
if (!fn) {
|
|
425
|
+
console.log(response);
|
|
426
|
+
warn(`callback ${id} may already be disposed`);
|
|
321
427
|
return;
|
|
322
428
|
}
|
|
323
|
-
|
|
429
|
+
fn(response);
|
|
430
|
+
remove(id);
|
|
324
431
|
};
|
|
325
|
-
const
|
|
432
|
+
const create$2$1 = (method, params) => {
|
|
326
433
|
const {
|
|
327
|
-
|
|
434
|
+
id,
|
|
328
435
|
promise
|
|
329
|
-
} =
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
const responseMessage = await promise;
|
|
336
|
-
return unwrapJsonRpcResult(responseMessage);
|
|
337
|
-
};
|
|
338
|
-
const send = (transport, method, ...params) => {
|
|
339
|
-
const message = create$4(method, params);
|
|
340
|
-
transport.send(message);
|
|
341
|
-
};
|
|
342
|
-
const invoke$4 = (ipc, method, ...params) => {
|
|
343
|
-
return invokeHelper(ipc, method, params, false);
|
|
344
|
-
};
|
|
345
|
-
const invokeAndTransfer$3 = (ipc, method, ...params) => {
|
|
346
|
-
return invokeHelper(ipc, method, params, true);
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
const commands = Object.create(null);
|
|
350
|
-
const register$4 = commandMap => {
|
|
351
|
-
Object.assign(commands, commandMap);
|
|
352
|
-
};
|
|
353
|
-
const getCommand = key => {
|
|
354
|
-
return commands[key];
|
|
355
|
-
};
|
|
356
|
-
const execute = (command, ...args) => {
|
|
357
|
-
const fn = getCommand(command);
|
|
358
|
-
if (!fn) {
|
|
359
|
-
throw new Error(`command not found ${command}`);
|
|
360
|
-
}
|
|
361
|
-
return fn(...args);
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
const getData$1 = event => {
|
|
365
|
-
return event.data;
|
|
366
|
-
};
|
|
367
|
-
const attachEvents = that => {
|
|
368
|
-
const handleMessage = (...args) => {
|
|
369
|
-
const data = that.getData(...args);
|
|
370
|
-
that.dispatchEvent(new MessageEvent('message', {
|
|
371
|
-
data
|
|
372
|
-
}));
|
|
436
|
+
} = registerPromise();
|
|
437
|
+
const message = {
|
|
438
|
+
jsonrpc: Two,
|
|
439
|
+
method,
|
|
440
|
+
params,
|
|
441
|
+
id
|
|
373
442
|
};
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
443
|
+
return {
|
|
444
|
+
message,
|
|
445
|
+
promise
|
|
377
446
|
};
|
|
378
|
-
that.onClose(handleClose);
|
|
379
447
|
};
|
|
380
|
-
class
|
|
381
|
-
constructor(
|
|
382
|
-
super();
|
|
383
|
-
this.
|
|
384
|
-
attachEvents(this);
|
|
448
|
+
class JsonRpcError extends Error {
|
|
449
|
+
constructor(message) {
|
|
450
|
+
super(message);
|
|
451
|
+
this.name = 'JsonRpcError';
|
|
385
452
|
}
|
|
386
453
|
}
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
|
|
390
|
-
|
|
454
|
+
const NewLine = '\n';
|
|
455
|
+
const DomException = 'DOMException';
|
|
456
|
+
const ReferenceError$1 = 'ReferenceError';
|
|
457
|
+
const SyntaxError$1 = 'SyntaxError';
|
|
458
|
+
const TypeError$1 = 'TypeError';
|
|
459
|
+
const getErrorConstructor = (message, type) => {
|
|
460
|
+
if (type) {
|
|
461
|
+
switch (type) {
|
|
462
|
+
case DomException:
|
|
463
|
+
return DOMException;
|
|
464
|
+
case TypeError$1:
|
|
465
|
+
return TypeError;
|
|
466
|
+
case SyntaxError$1:
|
|
467
|
+
return SyntaxError;
|
|
468
|
+
case ReferenceError$1:
|
|
469
|
+
return ReferenceError;
|
|
470
|
+
default:
|
|
471
|
+
return Error;
|
|
472
|
+
}
|
|
391
473
|
}
|
|
392
|
-
if (
|
|
393
|
-
|
|
394
|
-
return;
|
|
474
|
+
if (message.startsWith('TypeError: ')) {
|
|
475
|
+
return TypeError;
|
|
395
476
|
}
|
|
396
|
-
if (
|
|
397
|
-
|
|
398
|
-
walkValue(item, transferrables, isTransferrable);
|
|
399
|
-
}
|
|
400
|
-
return;
|
|
477
|
+
if (message.startsWith('SyntaxError: ')) {
|
|
478
|
+
return SyntaxError;
|
|
401
479
|
}
|
|
402
|
-
if (
|
|
403
|
-
|
|
404
|
-
walkValue(property, transferrables, isTransferrable);
|
|
405
|
-
}
|
|
406
|
-
return;
|
|
480
|
+
if (message.startsWith('ReferenceError: ')) {
|
|
481
|
+
return ReferenceError;
|
|
407
482
|
}
|
|
483
|
+
return Error;
|
|
408
484
|
};
|
|
409
|
-
const
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
const isInstanceOf = (value, constructorName) => {
|
|
419
|
-
return value?.constructor?.name === constructorName;
|
|
420
|
-
};
|
|
421
|
-
const isSocket = value => {
|
|
422
|
-
return isInstanceOf(value, 'Socket');
|
|
423
|
-
};
|
|
424
|
-
const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
|
|
425
|
-
const isTransferrable = value => {
|
|
426
|
-
for (const fn of transferrables) {
|
|
427
|
-
if (fn(value)) {
|
|
428
|
-
return true;
|
|
485
|
+
const constructError = (message, type, name) => {
|
|
486
|
+
const ErrorConstructor = getErrorConstructor(message, type);
|
|
487
|
+
if (ErrorConstructor === DOMException && name) {
|
|
488
|
+
return new ErrorConstructor(message, name);
|
|
489
|
+
}
|
|
490
|
+
if (ErrorConstructor === Error) {
|
|
491
|
+
const error = new Error(message);
|
|
492
|
+
if (name && name !== 'VError') {
|
|
493
|
+
error.name = name;
|
|
429
494
|
}
|
|
495
|
+
return error;
|
|
430
496
|
}
|
|
431
|
-
return
|
|
497
|
+
return new ErrorConstructor(message);
|
|
432
498
|
};
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
walkValue(value, transferrables, isTransferrable);
|
|
436
|
-
return transferrables;
|
|
499
|
+
const getNewLineIndex = (string, startIndex = undefined) => {
|
|
500
|
+
return string.indexOf(NewLine, startIndex);
|
|
437
501
|
};
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
if (
|
|
441
|
-
|
|
502
|
+
const getParentStack = error => {
|
|
503
|
+
let parentStack = error.stack || error.data || error.message || '';
|
|
504
|
+
if (parentStack.startsWith(' at')) {
|
|
505
|
+
parentStack = error.message + NewLine + parentStack;
|
|
442
506
|
}
|
|
443
|
-
return
|
|
507
|
+
return parentStack;
|
|
444
508
|
};
|
|
445
|
-
const
|
|
446
|
-
|
|
509
|
+
const joinLines = lines => {
|
|
510
|
+
return lines.join(NewLine);
|
|
447
511
|
};
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
512
|
+
const MethodNotFound = -32601;
|
|
513
|
+
const Custom = -32001;
|
|
514
|
+
const splitLines = lines => {
|
|
515
|
+
return lines.split(NewLine);
|
|
516
|
+
};
|
|
517
|
+
const restoreJsonRpcError = error => {
|
|
518
|
+
if (error && error instanceof Error) {
|
|
519
|
+
return error;
|
|
451
520
|
}
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
521
|
+
const currentStack = joinLines(splitLines(new Error().stack || '').slice(1));
|
|
522
|
+
if (error && error.code && error.code === MethodNotFound) {
|
|
523
|
+
const restoredError = new JsonRpcError(error.message);
|
|
524
|
+
const parentStack = getParentStack(error);
|
|
525
|
+
restoredError.stack = parentStack + NewLine + currentStack;
|
|
526
|
+
return restoredError;
|
|
455
527
|
}
|
|
456
|
-
|
|
457
|
-
const
|
|
458
|
-
|
|
459
|
-
|
|
528
|
+
if (error && error.message) {
|
|
529
|
+
const restoredError = constructError(error.message, error.type, error.name);
|
|
530
|
+
if (error.data) {
|
|
531
|
+
if (error.data.stack && error.data.type && error.message) {
|
|
532
|
+
restoredError.stack = error.data.type + ': ' + error.message + NewLine + error.data.stack + NewLine + currentStack;
|
|
533
|
+
} else if (error.data.stack) {
|
|
534
|
+
restoredError.stack = error.data.stack;
|
|
535
|
+
}
|
|
536
|
+
if (error.data.codeFrame) {
|
|
537
|
+
// @ts-ignore
|
|
538
|
+
restoredError.codeFrame = error.data.codeFrame;
|
|
539
|
+
}
|
|
540
|
+
if (error.data.code) {
|
|
541
|
+
// @ts-ignore
|
|
542
|
+
restoredError.code = error.data.code;
|
|
543
|
+
}
|
|
544
|
+
if (error.data.type) {
|
|
545
|
+
// @ts-ignore
|
|
546
|
+
restoredError.name = error.data.type;
|
|
547
|
+
}
|
|
548
|
+
} else {
|
|
549
|
+
if (error.stack) {
|
|
550
|
+
const lowerStack = restoredError.stack || '';
|
|
551
|
+
// @ts-ignore
|
|
552
|
+
const indexNewLine = getNewLineIndex(lowerStack);
|
|
553
|
+
const parentStack = getParentStack(error);
|
|
554
|
+
// @ts-ignore
|
|
555
|
+
restoredError.stack = parentStack + lowerStack.slice(indexNewLine);
|
|
556
|
+
}
|
|
557
|
+
if (error.codeFrame) {
|
|
558
|
+
// @ts-ignore
|
|
559
|
+
restoredError.codeFrame = error.codeFrame;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return restoredError;
|
|
460
563
|
}
|
|
461
|
-
|
|
462
|
-
|
|
564
|
+
if (typeof error === 'string') {
|
|
565
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
463
566
|
}
|
|
464
|
-
|
|
465
|
-
|
|
567
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
568
|
+
};
|
|
569
|
+
const unwrapJsonRpcResult = responseMessage => {
|
|
570
|
+
if ('error' in responseMessage) {
|
|
571
|
+
const restoredError = restoreJsonRpcError(responseMessage.error);
|
|
572
|
+
throw restoredError;
|
|
466
573
|
}
|
|
467
|
-
|
|
468
|
-
|
|
574
|
+
if ('result' in responseMessage) {
|
|
575
|
+
return responseMessage.result;
|
|
469
576
|
}
|
|
470
|
-
|
|
471
|
-
const wrap$5 = global => {
|
|
472
|
-
return new IpcChildWithModuleWorker(global);
|
|
473
|
-
};
|
|
474
|
-
const E_INCOMPATIBLE_NATIVE_MODULE = 'E_INCOMPATIBLE_NATIVE_MODULE';
|
|
475
|
-
const E_MODULES_NOT_SUPPORTED_IN_ELECTRON = 'E_MODULES_NOT_SUPPORTED_IN_ELECTRON';
|
|
476
|
-
const ERR_MODULE_NOT_FOUND = 'ERR_MODULE_NOT_FOUND';
|
|
477
|
-
const NewLine$1 = '\n';
|
|
478
|
-
const joinLines = lines => {
|
|
479
|
-
return lines.join(NewLine$1);
|
|
480
|
-
};
|
|
481
|
-
const splitLines = lines => {
|
|
482
|
-
return lines.split(NewLine$1);
|
|
483
|
-
};
|
|
484
|
-
const isModuleNotFoundMessage = line => {
|
|
485
|
-
return line.includes('[ERR_MODULE_NOT_FOUND]');
|
|
486
|
-
};
|
|
487
|
-
const getModuleNotFoundError = stderr => {
|
|
488
|
-
const lines = splitLines(stderr);
|
|
489
|
-
const messageIndex = lines.findIndex(isModuleNotFoundMessage);
|
|
490
|
-
const message = lines[messageIndex];
|
|
491
|
-
return {
|
|
492
|
-
message,
|
|
493
|
-
code: ERR_MODULE_NOT_FOUND
|
|
494
|
-
};
|
|
495
|
-
};
|
|
496
|
-
const RE_NATIVE_MODULE_ERROR = /^innerError Error: Cannot find module '.*.node'/;
|
|
497
|
-
const RE_NATIVE_MODULE_ERROR_2 = /was compiled against a different Node.js version/;
|
|
498
|
-
const RE_MESSAGE_CODE_BLOCK_START = /^Error: The module '.*'$/;
|
|
499
|
-
const RE_MESSAGE_CODE_BLOCK_END = /^\s* at/;
|
|
500
|
-
const RE_AT = /^\s+at/;
|
|
501
|
-
const RE_AT_PROMISE_INDEX = /^\s*at async Promise.all \(index \d+\)$/;
|
|
502
|
-
const isUnhelpfulNativeModuleError = stderr => {
|
|
503
|
-
return RE_NATIVE_MODULE_ERROR.test(stderr) && RE_NATIVE_MODULE_ERROR_2.test(stderr);
|
|
504
|
-
};
|
|
505
|
-
const isMessageCodeBlockStartIndex = line => {
|
|
506
|
-
return RE_MESSAGE_CODE_BLOCK_START.test(line);
|
|
507
|
-
};
|
|
508
|
-
const isMessageCodeBlockEndIndex = line => {
|
|
509
|
-
return RE_MESSAGE_CODE_BLOCK_END.test(line);
|
|
510
|
-
};
|
|
511
|
-
const getMessageCodeBlock = stderr => {
|
|
512
|
-
const lines = splitLines(stderr);
|
|
513
|
-
const startIndex = lines.findIndex(isMessageCodeBlockStartIndex);
|
|
514
|
-
const endIndex = startIndex + lines.slice(startIndex).findIndex(isMessageCodeBlockEndIndex, startIndex);
|
|
515
|
-
const relevantLines = lines.slice(startIndex, endIndex);
|
|
516
|
-
const relevantMessage = relevantLines.join(' ').slice('Error: '.length);
|
|
517
|
-
return relevantMessage;
|
|
518
|
-
};
|
|
519
|
-
const getNativeModuleErrorMessage = stderr => {
|
|
520
|
-
const message = getMessageCodeBlock(stderr);
|
|
521
|
-
return {
|
|
522
|
-
message: `Incompatible native node module: ${message}`,
|
|
523
|
-
code: E_INCOMPATIBLE_NATIVE_MODULE
|
|
524
|
-
};
|
|
577
|
+
throw new JsonRpcError('unexpected response message');
|
|
525
578
|
};
|
|
526
|
-
const
|
|
527
|
-
|
|
528
|
-
|
|
579
|
+
const E_COMMAND_NOT_FOUND = 'E_COMMAND_NOT_FOUND';
|
|
580
|
+
const getErrorType = prettyError => {
|
|
581
|
+
if (prettyError && prettyError.type) {
|
|
582
|
+
return prettyError.type;
|
|
529
583
|
}
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
const getModuleSyntaxError = () => {
|
|
533
|
-
return {
|
|
534
|
-
message: `ES Modules are not supported in electron`,
|
|
535
|
-
code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
|
|
536
|
-
};
|
|
537
|
-
};
|
|
538
|
-
const isModuleNotFoundError = stderr => {
|
|
539
|
-
if (!stderr) {
|
|
540
|
-
return false;
|
|
584
|
+
if (prettyError && prettyError.constructor && prettyError.constructor.name) {
|
|
585
|
+
return prettyError.constructor.name;
|
|
541
586
|
}
|
|
542
|
-
return
|
|
543
|
-
};
|
|
544
|
-
const isNormalStackLine = line => {
|
|
545
|
-
return RE_AT.test(line) && !RE_AT_PROMISE_INDEX.test(line);
|
|
587
|
+
return undefined;
|
|
546
588
|
};
|
|
547
|
-
const
|
|
548
|
-
|
|
549
|
-
if (index === -1) {
|
|
589
|
+
const getErrorProperty = (error, prettyError) => {
|
|
590
|
+
if (error && error.code === E_COMMAND_NOT_FOUND) {
|
|
550
591
|
return {
|
|
551
|
-
|
|
552
|
-
|
|
592
|
+
code: MethodNotFound,
|
|
593
|
+
message: error.message,
|
|
594
|
+
data: error.stack
|
|
553
595
|
};
|
|
554
596
|
}
|
|
555
|
-
let lastIndex = index - 1;
|
|
556
|
-
while (++lastIndex < lines.length) {
|
|
557
|
-
if (!isNormalStackLine(lines[lastIndex])) {
|
|
558
|
-
break;
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
597
|
return {
|
|
562
|
-
|
|
563
|
-
|
|
598
|
+
code: Custom,
|
|
599
|
+
message: prettyError.message,
|
|
600
|
+
data: {
|
|
601
|
+
stack: prettyError.stack,
|
|
602
|
+
codeFrame: prettyError.codeFrame,
|
|
603
|
+
type: getErrorType(prettyError),
|
|
604
|
+
code: prettyError.code,
|
|
605
|
+
name: prettyError.name
|
|
606
|
+
}
|
|
564
607
|
};
|
|
565
608
|
};
|
|
566
|
-
const
|
|
567
|
-
if (isUnhelpfulNativeModuleError(stderr)) {
|
|
568
|
-
return getNativeModuleErrorMessage(stderr);
|
|
569
|
-
}
|
|
570
|
-
if (isModulesSyntaxError(stderr)) {
|
|
571
|
-
return getModuleSyntaxError();
|
|
572
|
-
}
|
|
573
|
-
if (isModuleNotFoundError(stderr)) {
|
|
574
|
-
return getModuleNotFoundError(stderr);
|
|
575
|
-
}
|
|
576
|
-
const lines = splitLines(stderr);
|
|
577
|
-
const {
|
|
578
|
-
actualMessage,
|
|
579
|
-
rest
|
|
580
|
-
} = getDetails(lines);
|
|
609
|
+
const create$1$1 = (message, error) => {
|
|
581
610
|
return {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
611
|
+
jsonrpc: Two,
|
|
612
|
+
id: message.id,
|
|
613
|
+
error
|
|
585
614
|
};
|
|
586
615
|
};
|
|
587
|
-
const
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
return line.slice('VError: '.length);
|
|
593
|
-
}
|
|
594
|
-
return line;
|
|
595
|
-
};
|
|
596
|
-
const getCombinedMessage$1 = (error, message) => {
|
|
597
|
-
const stringifiedError = normalizeLine$1(`${error}`);
|
|
598
|
-
if (message) {
|
|
599
|
-
return `${message}: ${stringifiedError}`;
|
|
600
|
-
}
|
|
601
|
-
return stringifiedError;
|
|
616
|
+
const getErrorResponse = (message, error, preparePrettyError, logError) => {
|
|
617
|
+
const prettyError = preparePrettyError(error);
|
|
618
|
+
logError(error, prettyError);
|
|
619
|
+
const errorProperty = getErrorProperty(error, prettyError);
|
|
620
|
+
return create$1$1(message, errorProperty);
|
|
602
621
|
};
|
|
603
|
-
const
|
|
604
|
-
|
|
605
|
-
|
|
622
|
+
const create$5 = (message, result) => {
|
|
623
|
+
return {
|
|
624
|
+
jsonrpc: Two,
|
|
625
|
+
id: message.id,
|
|
626
|
+
result: result ?? null
|
|
627
|
+
};
|
|
606
628
|
};
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
}
|
|
611
|
-
const parentNewLineIndex = getNewLineIndex$1(parent);
|
|
612
|
-
const childNewLineIndex = getNewLineIndex$1(child);
|
|
613
|
-
if (childNewLineIndex === -1) {
|
|
614
|
-
return parent;
|
|
615
|
-
}
|
|
616
|
-
const parentFirstLine = parent.slice(0, parentNewLineIndex);
|
|
617
|
-
const childRest = child.slice(childNewLineIndex);
|
|
618
|
-
const childFirstLine = normalizeLine$1(child.slice(0, childNewLineIndex));
|
|
619
|
-
if (parentFirstLine.includes(childFirstLine)) {
|
|
620
|
-
return parentFirstLine + childRest;
|
|
621
|
-
}
|
|
622
|
-
return child;
|
|
629
|
+
const getSuccessResponse = (message, result) => {
|
|
630
|
+
const resultProperty = result ?? null;
|
|
631
|
+
return create$5(message, resultProperty);
|
|
623
632
|
};
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
const
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
this.stack = mergeStacks$1(this.stack, error.stack);
|
|
631
|
-
}
|
|
632
|
-
if (error.codeFrame) {
|
|
633
|
-
// @ts-ignore
|
|
634
|
-
this.codeFrame = error.codeFrame;
|
|
635
|
-
}
|
|
636
|
-
if (error.code) {
|
|
637
|
-
// @ts-ignore
|
|
638
|
-
this.code = error.code;
|
|
639
|
-
}
|
|
633
|
+
const getResponse = async (message, ipc, execute, preparePrettyError, logError, requiresSocket) => {
|
|
634
|
+
try {
|
|
635
|
+
const result = requiresSocket(message.method) ? await execute(message.method, ipc, ...message.params) : await execute(message.method, ...message.params);
|
|
636
|
+
return getSuccessResponse(message, result);
|
|
637
|
+
} catch (error) {
|
|
638
|
+
return getErrorResponse(message, error, preparePrettyError, logError);
|
|
640
639
|
}
|
|
641
640
|
};
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
641
|
+
const defaultPreparePrettyError = error => {
|
|
642
|
+
return error;
|
|
643
|
+
};
|
|
644
|
+
const defaultLogError = () => {
|
|
645
|
+
// ignore
|
|
646
|
+
};
|
|
647
|
+
const defaultRequiresSocket = () => {
|
|
648
|
+
return false;
|
|
649
|
+
};
|
|
650
|
+
const defaultResolve = resolve;
|
|
651
|
+
|
|
652
|
+
// TODO maybe remove this in v6 or v7, only accept options object to simplify the code
|
|
653
|
+
const normalizeParams = args => {
|
|
654
|
+
if (args.length === 1) {
|
|
655
|
+
const options = args[0];
|
|
656
|
+
return {
|
|
657
|
+
ipc: options.ipc,
|
|
658
|
+
message: options.message,
|
|
659
|
+
execute: options.execute,
|
|
660
|
+
resolve: options.resolve || defaultResolve,
|
|
661
|
+
preparePrettyError: options.preparePrettyError || defaultPreparePrettyError,
|
|
662
|
+
logError: options.logError || defaultLogError,
|
|
663
|
+
requiresSocket: options.requiresSocket || defaultRequiresSocket
|
|
664
|
+
};
|
|
666
665
|
}
|
|
667
|
-
}
|
|
668
|
-
const withResolvers = () => {
|
|
669
|
-
let _resolve;
|
|
670
|
-
const promise = new Promise(resolve => {
|
|
671
|
-
_resolve = resolve;
|
|
672
|
-
});
|
|
673
666
|
return {
|
|
674
|
-
|
|
675
|
-
|
|
667
|
+
ipc: args[0],
|
|
668
|
+
message: args[1],
|
|
669
|
+
execute: args[2],
|
|
670
|
+
resolve: args[3],
|
|
671
|
+
preparePrettyError: args[4],
|
|
672
|
+
logError: args[5],
|
|
673
|
+
requiresSocket: args[6]
|
|
676
674
|
};
|
|
677
675
|
};
|
|
678
|
-
const
|
|
676
|
+
const handleJsonRpcMessage = async (...args) => {
|
|
677
|
+
const options = normalizeParams(args);
|
|
679
678
|
const {
|
|
679
|
+
message,
|
|
680
|
+
ipc,
|
|
681
|
+
execute,
|
|
680
682
|
resolve,
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
if (firstMessage.method !== 'initialize') {
|
|
696
|
-
throw new IpcError('unexpected first message');
|
|
697
|
-
}
|
|
698
|
-
const type = firstMessage.params[0];
|
|
699
|
-
if (type === 'message-port') {
|
|
700
|
-
parentIpc.send({
|
|
701
|
-
jsonrpc: '2.0',
|
|
702
|
-
id: firstMessage.id,
|
|
703
|
-
result: null
|
|
704
|
-
});
|
|
705
|
-
parentIpc.dispose();
|
|
706
|
-
const port = firstMessage.params[1];
|
|
707
|
-
return port;
|
|
708
|
-
}
|
|
709
|
-
return globalThis;
|
|
710
|
-
};
|
|
711
|
-
class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
|
|
712
|
-
constructor(port) {
|
|
713
|
-
super(port);
|
|
714
|
-
}
|
|
715
|
-
getData(event) {
|
|
716
|
-
return getData$1(event);
|
|
717
|
-
}
|
|
718
|
-
send(message) {
|
|
719
|
-
this._rawIpc.postMessage(message);
|
|
720
|
-
}
|
|
721
|
-
sendAndTransfer(message) {
|
|
722
|
-
const transfer = getTransferrables(message);
|
|
723
|
-
this._rawIpc.postMessage(message, transfer);
|
|
724
|
-
}
|
|
725
|
-
dispose() {
|
|
726
|
-
if (this._rawIpc.close) {
|
|
727
|
-
this._rawIpc.close();
|
|
683
|
+
preparePrettyError,
|
|
684
|
+
logError,
|
|
685
|
+
requiresSocket
|
|
686
|
+
} = options;
|
|
687
|
+
if ('id' in message) {
|
|
688
|
+
if ('method' in message) {
|
|
689
|
+
const response = await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
|
|
690
|
+
try {
|
|
691
|
+
ipc.send(response);
|
|
692
|
+
} catch (error) {
|
|
693
|
+
const errorResponse = getErrorResponse(message, error, preparePrettyError, logError);
|
|
694
|
+
ipc.send(errorResponse);
|
|
695
|
+
}
|
|
696
|
+
return;
|
|
728
697
|
}
|
|
698
|
+
resolve(message.id, message);
|
|
699
|
+
return;
|
|
729
700
|
}
|
|
730
|
-
|
|
731
|
-
|
|
701
|
+
if ('method' in message) {
|
|
702
|
+
await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
|
|
703
|
+
return;
|
|
732
704
|
}
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
705
|
+
throw new JsonRpcError('unexpected message');
|
|
706
|
+
};
|
|
707
|
+
const invokeHelper = async (ipc, method, params, useSendAndTransfer) => {
|
|
708
|
+
const {
|
|
709
|
+
message,
|
|
710
|
+
promise
|
|
711
|
+
} = create$2$1(method, params);
|
|
712
|
+
if (useSendAndTransfer && ipc.sendAndTransfer) {
|
|
713
|
+
ipc.sendAndTransfer(message);
|
|
714
|
+
} else {
|
|
715
|
+
ipc.send(message);
|
|
736
716
|
}
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
return new IpcChildWithModuleWorkerAndMessagePort(port);
|
|
717
|
+
const responseMessage = await promise;
|
|
718
|
+
return unwrapJsonRpcResult(responseMessage);
|
|
740
719
|
};
|
|
741
|
-
const
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
720
|
+
const send = (transport, method, ...params) => {
|
|
721
|
+
const message = create$4(method, params);
|
|
722
|
+
transport.send(message);
|
|
723
|
+
};
|
|
724
|
+
const invoke$4 = (ipc, method, ...params) => {
|
|
725
|
+
return invokeHelper(ipc, method, params, false);
|
|
726
|
+
};
|
|
727
|
+
const invokeAndTransfer$3 = (ipc, method, ...params) => {
|
|
728
|
+
return invokeHelper(ipc, method, params, true);
|
|
729
|
+
};
|
|
730
|
+
|
|
731
|
+
const commands = Object.create(null);
|
|
732
|
+
const register$4 = commandMap => {
|
|
733
|
+
Object.assign(commands, commandMap);
|
|
734
|
+
};
|
|
735
|
+
const getCommand = key => {
|
|
736
|
+
return commands[key];
|
|
737
|
+
};
|
|
738
|
+
const execute = (command, ...args) => {
|
|
739
|
+
const fn = getCommand(command);
|
|
740
|
+
if (!fn) {
|
|
741
|
+
throw new Error(`command not found ${command}`);
|
|
742
|
+
}
|
|
743
|
+
return fn(...args);
|
|
745
744
|
};
|
|
746
745
|
|
|
747
746
|
const createRpc = ipc => {
|
|
@@ -771,32 +770,38 @@ const logError = () => {
|
|
|
771
770
|
// handled by renderer worker
|
|
772
771
|
};
|
|
773
772
|
const handleMessage = event => {
|
|
774
|
-
|
|
773
|
+
const actualRequiresSocket = event?.target?.requiresSocket || requiresSocket;
|
|
774
|
+
return handleJsonRpcMessage(event.target, event.data, execute, resolve, preparePrettyError, logError, actualRequiresSocket);
|
|
775
775
|
};
|
|
776
776
|
const handleIpc = ipc => {
|
|
777
|
-
|
|
777
|
+
if ('addEventListener' in ipc) {
|
|
778
|
+
ipc.addEventListener('message', handleMessage);
|
|
779
|
+
} else if ('on' in ipc) {
|
|
780
|
+
// deprecated
|
|
781
|
+
ipc.on('message', handleMessage);
|
|
782
|
+
}
|
|
778
783
|
};
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
+
const listen$1 = async (module, options) => {
|
|
785
|
+
const rawIpc = await module.listen(options);
|
|
786
|
+
if (module.signal) {
|
|
787
|
+
module.signal(rawIpc);
|
|
788
|
+
}
|
|
784
789
|
const ipc = module.wrap(rawIpc);
|
|
785
790
|
return ipc;
|
|
786
791
|
};
|
|
787
|
-
const create$
|
|
792
|
+
const create$2 = async ({
|
|
788
793
|
commandMap
|
|
789
794
|
}) => {
|
|
790
795
|
// TODO create a commandMap per rpc instance
|
|
791
796
|
register$4(commandMap);
|
|
792
|
-
const ipc = await listen$1();
|
|
797
|
+
const ipc = await listen$1(IpcChildWithModuleWorkerAndMessagePort$1);
|
|
793
798
|
handleIpc(ipc);
|
|
794
799
|
const rpc = createRpc(ipc);
|
|
795
800
|
return rpc;
|
|
796
801
|
};
|
|
797
802
|
const WebWorkerRpcClient = {
|
|
798
803
|
__proto__: null,
|
|
799
|
-
create: create$
|
|
804
|
+
create: create$2
|
|
800
805
|
};
|
|
801
806
|
|
|
802
807
|
const state$1 = {
|
|
@@ -804,12 +809,10 @@ const state$1 = {
|
|
|
804
809
|
};
|
|
805
810
|
const invoke$3 = (method, ...params) => {
|
|
806
811
|
const rpc = state$1.rpc;
|
|
807
|
-
// @ts-ignore
|
|
808
812
|
return rpc.invoke(method, ...params);
|
|
809
813
|
};
|
|
810
814
|
const invokeAndTransfer$2 = (method, ...params) => {
|
|
811
815
|
const rpc = state$1.rpc;
|
|
812
|
-
// @ts-ignore
|
|
813
816
|
return rpc.invokeAndTransfer(method, ...params);
|
|
814
817
|
};
|
|
815
818
|
const setRpc = rpc => {
|
|
@@ -1015,62 +1018,6 @@ const getWebView = (webViews, webViewId) => {
|
|
|
1015
1018
|
return undefined;
|
|
1016
1019
|
};
|
|
1017
1020
|
|
|
1018
|
-
const normalizeLine = line => {
|
|
1019
|
-
if (line.startsWith('Error: ')) {
|
|
1020
|
-
return line.slice('Error: '.length);
|
|
1021
|
-
}
|
|
1022
|
-
if (line.startsWith('VError: ')) {
|
|
1023
|
-
return line.slice('VError: '.length);
|
|
1024
|
-
}
|
|
1025
|
-
return line;
|
|
1026
|
-
};
|
|
1027
|
-
const getCombinedMessage = (error, message) => {
|
|
1028
|
-
const stringifiedError = normalizeLine(`${error}`);
|
|
1029
|
-
if (message) {
|
|
1030
|
-
return `${message}: ${stringifiedError}`;
|
|
1031
|
-
}
|
|
1032
|
-
return stringifiedError;
|
|
1033
|
-
};
|
|
1034
|
-
const NewLine = '\n';
|
|
1035
|
-
const getNewLineIndex = (string, startIndex = undefined) => {
|
|
1036
|
-
return string.indexOf(NewLine, startIndex);
|
|
1037
|
-
};
|
|
1038
|
-
const mergeStacks = (parent, child) => {
|
|
1039
|
-
if (!child) {
|
|
1040
|
-
return parent;
|
|
1041
|
-
}
|
|
1042
|
-
const parentNewLineIndex = getNewLineIndex(parent);
|
|
1043
|
-
const childNewLineIndex = getNewLineIndex(child);
|
|
1044
|
-
if (childNewLineIndex === -1) {
|
|
1045
|
-
return parent;
|
|
1046
|
-
}
|
|
1047
|
-
const parentFirstLine = parent.slice(0, parentNewLineIndex);
|
|
1048
|
-
const childRest = child.slice(childNewLineIndex);
|
|
1049
|
-
const childFirstLine = normalizeLine(child.slice(0, childNewLineIndex));
|
|
1050
|
-
if (parentFirstLine.includes(childFirstLine)) {
|
|
1051
|
-
return parentFirstLine + childRest;
|
|
1052
|
-
}
|
|
1053
|
-
return child;
|
|
1054
|
-
};
|
|
1055
|
-
class VError extends Error {
|
|
1056
|
-
constructor(error, message) {
|
|
1057
|
-
const combinedMessage = getCombinedMessage(error, message);
|
|
1058
|
-
super(combinedMessage);
|
|
1059
|
-
this.name = 'VError';
|
|
1060
|
-
if (error instanceof Error) {
|
|
1061
|
-
this.stack = mergeStacks(this.stack, error.stack);
|
|
1062
|
-
}
|
|
1063
|
-
if (error.codeFrame) {
|
|
1064
|
-
// @ts-ignore
|
|
1065
|
-
this.codeFrame = error.codeFrame;
|
|
1066
|
-
}
|
|
1067
|
-
if (error.code) {
|
|
1068
|
-
// @ts-ignore
|
|
1069
|
-
this.code = error.code;
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
|
|
1074
1021
|
const getIframeSrc = (webViews, webViewId, webViewPort, root, isGitpod, locationProtocol, locationHost, locationOrigin, platform, assetDir) => {
|
|
1075
1022
|
try {
|
|
1076
1023
|
const webView = getWebView(webViews, webViewId);
|
|
@@ -1169,6 +1116,11 @@ const getIframeSandbox = (webView, platform) => {
|
|
|
1169
1116
|
return [AllowScripts, AllowSameOrigin, ...extensionSandbox];
|
|
1170
1117
|
};
|
|
1171
1118
|
|
|
1119
|
+
const getIframePermissionPolicy = webView => {
|
|
1120
|
+
const extensionAllow = webView.allow || [];
|
|
1121
|
+
return extensionAllow;
|
|
1122
|
+
};
|
|
1123
|
+
|
|
1172
1124
|
const state = {
|
|
1173
1125
|
id: 0
|
|
1174
1126
|
};
|
|
@@ -1304,6 +1256,8 @@ const create2 = async ({
|
|
|
1304
1256
|
|
|
1305
1257
|
const csp = getWebViewCsp(webView);
|
|
1306
1258
|
const sandbox = getIframeSandbox(webView, platform);
|
|
1259
|
+
const permissionPolicy = getIframePermissionPolicy(webView);
|
|
1260
|
+
const permissionPolicyString = permissionPolicy.join('; ');
|
|
1307
1261
|
const iframeCsp = platform === Web ? csp : '';
|
|
1308
1262
|
const credentialless = true;
|
|
1309
1263
|
await invoke$3('ExtensionHostManagement.activateByEvent', `onWebView:${webViewId}`);
|
|
@@ -1313,7 +1267,7 @@ const create2 = async ({
|
|
|
1313
1267
|
} = getPortTuple();
|
|
1314
1268
|
const portId = create$1();
|
|
1315
1269
|
await register(previewServerId, webViewPort, frameAncestors, webViewRoot, csp, iframeContent);
|
|
1316
|
-
await invoke$1('WebView.create', id, iframeSrc, sandbox, iframeCsp, credentialless);
|
|
1270
|
+
await invoke$1('WebView.create', id, iframeSrc, sandbox, iframeCsp, credentialless, permissionPolicyString);
|
|
1317
1271
|
await invoke$1('WebView.load', id);
|
|
1318
1272
|
const origin = getWebViewOrigin(webViewPort, platform);
|
|
1319
1273
|
const portType = '';
|