@lvce-editor/iframe-worker 3.2.0 → 3.4.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 +651 -694
- package/package.json +1 -1
package/dist/iframeWorkerMain.js
CHANGED
|
@@ -1,368 +1,108 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
jsonrpc: Two,
|
|
5
|
-
method,
|
|
6
|
-
params
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
const state$2 = {
|
|
10
|
-
callbacks: Object.create(null)
|
|
11
|
-
};
|
|
12
|
-
const set = (id, fn) => {
|
|
13
|
-
state$2.callbacks[id] = fn;
|
|
14
|
-
};
|
|
15
|
-
const get = id => {
|
|
16
|
-
return state$2.callbacks[id];
|
|
17
|
-
};
|
|
18
|
-
const remove = id => {
|
|
19
|
-
delete state$2.callbacks[id];
|
|
20
|
-
};
|
|
21
|
-
let id = 0;
|
|
22
|
-
const create$3 = () => {
|
|
23
|
-
return ++id;
|
|
24
|
-
};
|
|
25
|
-
const warn = (...args) => {
|
|
26
|
-
console.warn(...args);
|
|
27
|
-
};
|
|
28
|
-
const registerPromise = () => {
|
|
29
|
-
const id = create$3();
|
|
30
|
-
const {
|
|
31
|
-
resolve,
|
|
32
|
-
promise
|
|
33
|
-
} = Promise.withResolvers();
|
|
34
|
-
set(id, resolve);
|
|
35
|
-
return {
|
|
36
|
-
id,
|
|
37
|
-
promise
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
const resolve = (id, response) => {
|
|
41
|
-
const fn = get(id);
|
|
42
|
-
if (!fn) {
|
|
43
|
-
console.log(response);
|
|
44
|
-
warn(`callback ${id} may already be disposed`);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
fn(response);
|
|
48
|
-
remove(id);
|
|
49
|
-
};
|
|
50
|
-
const create$2 = (method, params) => {
|
|
51
|
-
const {
|
|
52
|
-
id,
|
|
53
|
-
promise
|
|
54
|
-
} = registerPromise();
|
|
55
|
-
const message = {
|
|
56
|
-
jsonrpc: Two,
|
|
57
|
-
method,
|
|
58
|
-
params,
|
|
59
|
-
id
|
|
60
|
-
};
|
|
61
|
-
return {
|
|
62
|
-
message,
|
|
63
|
-
promise
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
class JsonRpcError extends Error {
|
|
67
|
-
constructor(message) {
|
|
68
|
-
super(message);
|
|
69
|
-
this.name = 'JsonRpcError';
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
const NewLine$3 = '\n';
|
|
73
|
-
const DomException = 'DOMException';
|
|
74
|
-
const ReferenceError$1 = 'ReferenceError';
|
|
75
|
-
const SyntaxError$1 = 'SyntaxError';
|
|
76
|
-
const TypeError$1 = 'TypeError';
|
|
77
|
-
const getErrorConstructor = (message, type) => {
|
|
78
|
-
if (type) {
|
|
79
|
-
switch (type) {
|
|
80
|
-
case DomException:
|
|
81
|
-
return DOMException;
|
|
82
|
-
case TypeError$1:
|
|
83
|
-
return TypeError;
|
|
84
|
-
case SyntaxError$1:
|
|
85
|
-
return SyntaxError;
|
|
86
|
-
case ReferenceError$1:
|
|
87
|
-
return ReferenceError;
|
|
88
|
-
default:
|
|
89
|
-
return Error;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (message.startsWith('TypeError: ')) {
|
|
93
|
-
return TypeError;
|
|
94
|
-
}
|
|
95
|
-
if (message.startsWith('SyntaxError: ')) {
|
|
96
|
-
return SyntaxError;
|
|
97
|
-
}
|
|
98
|
-
if (message.startsWith('ReferenceError: ')) {
|
|
99
|
-
return ReferenceError;
|
|
100
|
-
}
|
|
101
|
-
return Error;
|
|
102
|
-
};
|
|
103
|
-
const constructError = (message, type, name) => {
|
|
104
|
-
const ErrorConstructor = getErrorConstructor(message, type);
|
|
105
|
-
if (ErrorConstructor === DOMException && name) {
|
|
106
|
-
return new ErrorConstructor(message, name);
|
|
1
|
+
const normalizeLine = line => {
|
|
2
|
+
if (line.startsWith('Error: ')) {
|
|
3
|
+
return line.slice('Error: '.length);
|
|
107
4
|
}
|
|
108
|
-
if (
|
|
109
|
-
|
|
110
|
-
if (name && name !== 'VError') {
|
|
111
|
-
error.name = name;
|
|
112
|
-
}
|
|
113
|
-
return error;
|
|
5
|
+
if (line.startsWith('VError: ')) {
|
|
6
|
+
return line.slice('VError: '.length);
|
|
114
7
|
}
|
|
115
|
-
return
|
|
116
|
-
};
|
|
117
|
-
const getNewLineIndex$2 = (string, startIndex = undefined) => {
|
|
118
|
-
return string.indexOf(NewLine$3, startIndex);
|
|
8
|
+
return line;
|
|
119
9
|
};
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
|
|
10
|
+
const getCombinedMessage = (error, message) => {
|
|
11
|
+
const stringifiedError = normalizeLine(`${error}`);
|
|
12
|
+
if (message) {
|
|
13
|
+
return `${message}: ${stringifiedError}`;
|
|
124
14
|
}
|
|
125
|
-
return
|
|
126
|
-
};
|
|
127
|
-
const joinLines$1 = lines => {
|
|
128
|
-
return lines.join(NewLine$3);
|
|
129
|
-
};
|
|
130
|
-
const MethodNotFound = -32601;
|
|
131
|
-
const Custom = -32001;
|
|
132
|
-
const splitLines$1 = lines => {
|
|
133
|
-
return lines.split(NewLine$3);
|
|
15
|
+
return stringifiedError;
|
|
134
16
|
};
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
const currentStack = joinLines$1(splitLines$1(new Error().stack || '').slice(1));
|
|
140
|
-
if (error && error.code && error.code === MethodNotFound) {
|
|
141
|
-
const restoredError = new JsonRpcError(error.message);
|
|
142
|
-
const parentStack = getParentStack(error);
|
|
143
|
-
restoredError.stack = parentStack + NewLine$3 + currentStack;
|
|
144
|
-
return restoredError;
|
|
145
|
-
}
|
|
146
|
-
if (error && error.message) {
|
|
147
|
-
const restoredError = constructError(error.message, error.type, error.name);
|
|
148
|
-
if (error.data) {
|
|
149
|
-
if (error.data.stack && error.data.type && error.message) {
|
|
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;
|
|
181
|
-
}
|
|
182
|
-
if (typeof error === 'string') {
|
|
183
|
-
return new Error(`JsonRpc Error: ${error}`);
|
|
184
|
-
}
|
|
185
|
-
return new Error(`JsonRpc Error: ${error}`);
|
|
17
|
+
const NewLine$2 = '\n';
|
|
18
|
+
const getNewLineIndex$1 = (string, startIndex = undefined) => {
|
|
19
|
+
return string.indexOf(NewLine$2, startIndex);
|
|
186
20
|
};
|
|
187
|
-
const
|
|
188
|
-
if (
|
|
189
|
-
|
|
190
|
-
throw restoredError;
|
|
191
|
-
}
|
|
192
|
-
if ('result' in responseMessage) {
|
|
193
|
-
return responseMessage.result;
|
|
21
|
+
const mergeStacks = (parent, child) => {
|
|
22
|
+
if (!child) {
|
|
23
|
+
return parent;
|
|
194
24
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (prettyError && prettyError.type) {
|
|
200
|
-
return prettyError.type;
|
|
25
|
+
const parentNewLineIndex = getNewLineIndex$1(parent);
|
|
26
|
+
const childNewLineIndex = getNewLineIndex$1(child);
|
|
27
|
+
if (childNewLineIndex === -1) {
|
|
28
|
+
return parent;
|
|
201
29
|
}
|
|
202
|
-
|
|
203
|
-
|
|
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;
|
|
204
35
|
}
|
|
205
|
-
return
|
|
36
|
+
return child;
|
|
206
37
|
};
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
code: prettyError.code,
|
|
223
|
-
name: prettyError.name
|
|
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;
|
|
224
53
|
}
|
|
225
|
-
};
|
|
226
|
-
};
|
|
227
|
-
const create$1$2 = (message, error) => {
|
|
228
|
-
return {
|
|
229
|
-
jsonrpc: Two,
|
|
230
|
-
id: message.id,
|
|
231
|
-
error
|
|
232
|
-
};
|
|
233
|
-
};
|
|
234
|
-
const getErrorResponse = (message, error, preparePrettyError, logError) => {
|
|
235
|
-
const prettyError = preparePrettyError(error);
|
|
236
|
-
logError(error, prettyError);
|
|
237
|
-
const errorProperty = getErrorProperty(error, prettyError);
|
|
238
|
-
return create$1$2(message, errorProperty);
|
|
239
|
-
};
|
|
240
|
-
const create$5 = (message, result) => {
|
|
241
|
-
return {
|
|
242
|
-
jsonrpc: Two,
|
|
243
|
-
id: message.id,
|
|
244
|
-
result: result ?? null
|
|
245
|
-
};
|
|
246
|
-
};
|
|
247
|
-
const getSuccessResponse = (message, result) => {
|
|
248
|
-
const resultProperty = result ?? null;
|
|
249
|
-
return create$5(message, resultProperty);
|
|
250
|
-
};
|
|
251
|
-
const getResponse = async (message, ipc, execute, preparePrettyError, logError, requiresSocket) => {
|
|
252
|
-
try {
|
|
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
54
|
}
|
|
258
|
-
}
|
|
259
|
-
const defaultPreparePrettyError = error => {
|
|
260
|
-
return error;
|
|
261
|
-
};
|
|
262
|
-
const defaultLogError = () => {
|
|
263
|
-
// ignore
|
|
264
|
-
};
|
|
265
|
-
const defaultRequiresSocket = () => {
|
|
266
|
-
return false;
|
|
267
|
-
};
|
|
268
|
-
const defaultResolve = resolve;
|
|
55
|
+
}
|
|
269
56
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
const options = args[0];
|
|
274
|
-
return {
|
|
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
|
-
};
|
|
57
|
+
const walkValue = (value, transferrables, isTransferrable) => {
|
|
58
|
+
if (!value) {
|
|
59
|
+
return;
|
|
283
60
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
message: args[1],
|
|
287
|
-
execute: args[2],
|
|
288
|
-
resolve: args[3],
|
|
289
|
-
preparePrettyError: args[4],
|
|
290
|
-
logError: args[5],
|
|
291
|
-
requiresSocket: args[6]
|
|
292
|
-
};
|
|
293
|
-
};
|
|
294
|
-
const handleJsonRpcMessage = async (...args) => {
|
|
295
|
-
const options = normalizeParams(args);
|
|
296
|
-
const {
|
|
297
|
-
message,
|
|
298
|
-
ipc,
|
|
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);
|
|
61
|
+
if (isTransferrable(value)) {
|
|
62
|
+
transferrables.push(value);
|
|
317
63
|
return;
|
|
318
64
|
}
|
|
319
|
-
if (
|
|
320
|
-
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
for (const item of value) {
|
|
67
|
+
walkValue(item, transferrables, isTransferrable);
|
|
68
|
+
}
|
|
321
69
|
return;
|
|
322
70
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
promise
|
|
329
|
-
} = create$2(method, params);
|
|
330
|
-
if (useSendAndTransfer && ipc.sendAndTransfer) {
|
|
331
|
-
ipc.sendAndTransfer(message);
|
|
332
|
-
} else {
|
|
333
|
-
ipc.send(message);
|
|
71
|
+
if (typeof value === 'object') {
|
|
72
|
+
for (const property of Object.values(value)) {
|
|
73
|
+
walkValue(property, transferrables, isTransferrable);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
334
76
|
}
|
|
335
|
-
const responseMessage = await promise;
|
|
336
|
-
return unwrapJsonRpcResult(responseMessage);
|
|
337
77
|
};
|
|
338
|
-
const
|
|
339
|
-
|
|
340
|
-
transport.send(message);
|
|
78
|
+
const isMessagePort = value => {
|
|
79
|
+
return value && value instanceof MessagePort;
|
|
341
80
|
};
|
|
342
|
-
const
|
|
343
|
-
return
|
|
81
|
+
const isMessagePortMain = value => {
|
|
82
|
+
return value && value.constructor && value.constructor.name === 'MessagePortMain';
|
|
344
83
|
};
|
|
345
|
-
const
|
|
346
|
-
return
|
|
84
|
+
const isOffscreenCanvas = value => {
|
|
85
|
+
return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
|
|
347
86
|
};
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
const register$4 = commandMap => {
|
|
351
|
-
Object.assign(commands, commandMap);
|
|
87
|
+
const isInstanceOf = (value, constructorName) => {
|
|
88
|
+
return value?.constructor?.name === constructorName;
|
|
352
89
|
};
|
|
353
|
-
const
|
|
354
|
-
return
|
|
90
|
+
const isSocket = value => {
|
|
91
|
+
return isInstanceOf(value, 'Socket');
|
|
355
92
|
};
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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
|
+
}
|
|
360
99
|
}
|
|
361
|
-
return
|
|
100
|
+
return false;
|
|
362
101
|
};
|
|
363
|
-
|
|
364
|
-
const
|
|
365
|
-
|
|
102
|
+
const getTransferrables = value => {
|
|
103
|
+
const transferrables = [];
|
|
104
|
+
walkValue(value, transferrables, isTransferrable);
|
|
105
|
+
return transferrables;
|
|
366
106
|
};
|
|
367
107
|
const attachEvents = that => {
|
|
368
108
|
const handleMessage = (...args) => {
|
|
@@ -384,70 +124,162 @@ class Ipc extends EventTarget {
|
|
|
384
124
|
attachEvents(this);
|
|
385
125
|
}
|
|
386
126
|
}
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
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);
|
|
133
|
+
};
|
|
134
|
+
const splitLines$1 = lines => {
|
|
135
|
+
return lines.split(NewLine$1);
|
|
136
|
+
};
|
|
137
|
+
const isModuleNotFoundMessage = line => {
|
|
138
|
+
return line.includes('[ERR_MODULE_NOT_FOUND]');
|
|
139
|
+
};
|
|
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
|
+
};
|
|
148
|
+
};
|
|
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);
|
|
157
|
+
};
|
|
158
|
+
const isMessageCodeBlockStartIndex = line => {
|
|
159
|
+
return RE_MESSAGE_CODE_BLOCK_START.test(line);
|
|
160
|
+
};
|
|
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);
|
|
174
|
+
return {
|
|
175
|
+
message: `Incompatible native node module: ${message}`,
|
|
176
|
+
code: E_INCOMPATIBLE_NATIVE_MODULE
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
const isModulesSyntaxError = stderr => {
|
|
180
|
+
if (!stderr) {
|
|
181
|
+
return false;
|
|
407
182
|
}
|
|
183
|
+
return stderr.includes('SyntaxError: Cannot use import statement outside a module');
|
|
408
184
|
};
|
|
409
|
-
const
|
|
410
|
-
return
|
|
185
|
+
const getModuleSyntaxError = () => {
|
|
186
|
+
return {
|
|
187
|
+
message: `ES Modules are not supported in electron`,
|
|
188
|
+
code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
|
|
189
|
+
};
|
|
411
190
|
};
|
|
412
|
-
const
|
|
413
|
-
|
|
191
|
+
const isModuleNotFoundError = stderr => {
|
|
192
|
+
if (!stderr) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return stderr.includes('ERR_MODULE_NOT_FOUND');
|
|
414
196
|
};
|
|
415
|
-
const
|
|
416
|
-
return
|
|
197
|
+
const isNormalStackLine = line => {
|
|
198
|
+
return RE_AT.test(line) && !RE_AT_PROMISE_INDEX.test(line);
|
|
417
199
|
};
|
|
418
|
-
const
|
|
419
|
-
|
|
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;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
actualMessage: lines[index - 1],
|
|
216
|
+
rest: lines.slice(index, lastIndex)
|
|
217
|
+
};
|
|
420
218
|
};
|
|
421
|
-
const
|
|
422
|
-
|
|
219
|
+
const getHelpfulChildProcessError = (stdout, stderr) => {
|
|
220
|
+
if (isUnhelpfulNativeModuleError(stderr)) {
|
|
221
|
+
return getNativeModuleErrorMessage(stderr);
|
|
222
|
+
}
|
|
223
|
+
if (isModulesSyntaxError(stderr)) {
|
|
224
|
+
return getModuleSyntaxError();
|
|
225
|
+
}
|
|
226
|
+
if (isModuleNotFoundError(stderr)) {
|
|
227
|
+
return getModuleNotFoundError(stderr);
|
|
228
|
+
}
|
|
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
|
+
};
|
|
423
239
|
};
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
if (
|
|
428
|
-
|
|
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);
|
|
429
257
|
}
|
|
258
|
+
// @ts-ignore
|
|
259
|
+
this.name = 'IpcError';
|
|
260
|
+
// @ts-ignore
|
|
261
|
+
this.stdout = stdout;
|
|
262
|
+
// @ts-ignore
|
|
263
|
+
this.stderr = stderr;
|
|
430
264
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
walkValue(value, transferrables, isTransferrable);
|
|
436
|
-
return transferrables;
|
|
265
|
+
}
|
|
266
|
+
const readyMessage = 'ready';
|
|
267
|
+
const getData$2 = event => {
|
|
268
|
+
return event.data;
|
|
437
269
|
};
|
|
438
|
-
const listen$
|
|
270
|
+
const listen$7 = () => {
|
|
439
271
|
// @ts-ignore
|
|
440
272
|
if (typeof WorkerGlobalScope === 'undefined') {
|
|
441
273
|
throw new TypeError('module is not in web worker scope');
|
|
442
274
|
}
|
|
443
275
|
return globalThis;
|
|
444
276
|
};
|
|
445
|
-
const signal$
|
|
277
|
+
const signal$7 = global => {
|
|
446
278
|
global.postMessage(readyMessage);
|
|
447
279
|
};
|
|
448
280
|
class IpcChildWithModuleWorker extends Ipc {
|
|
449
281
|
getData(event) {
|
|
450
|
-
return getData$
|
|
282
|
+
return getData$2(event);
|
|
451
283
|
}
|
|
452
284
|
send(message) {
|
|
453
285
|
// @ts-ignore
|
|
@@ -461,287 +293,454 @@ class IpcChildWithModuleWorker extends Ipc {
|
|
|
461
293
|
dispose() {
|
|
462
294
|
// ignore
|
|
463
295
|
}
|
|
464
|
-
onClose(callback) {
|
|
465
|
-
// ignore
|
|
296
|
+
onClose(callback) {
|
|
297
|
+
// ignore
|
|
298
|
+
}
|
|
299
|
+
onMessage(callback) {
|
|
300
|
+
this._rawIpc.addEventListener('message', callback);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const wrap$e = global => {
|
|
304
|
+
return new IpcChildWithModuleWorker(global);
|
|
305
|
+
};
|
|
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$6 = async () => {
|
|
329
|
+
const parentIpcRaw = listen$7();
|
|
330
|
+
signal$7(parentIpcRaw);
|
|
331
|
+
const parentIpc = wrap$e(parentIpcRaw);
|
|
332
|
+
const firstMessage = await waitForFirstMessage(parentIpc);
|
|
333
|
+
if (firstMessage.method !== 'initialize') {
|
|
334
|
+
throw new IpcError('unexpected first message');
|
|
335
|
+
}
|
|
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;
|
|
346
|
+
}
|
|
347
|
+
return globalThis;
|
|
348
|
+
};
|
|
349
|
+
class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
|
|
350
|
+
constructor(port) {
|
|
351
|
+
super(port);
|
|
352
|
+
}
|
|
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$d = port => {
|
|
377
|
+
return new IpcChildWithModuleWorkerAndMessagePort(port);
|
|
378
|
+
};
|
|
379
|
+
const IpcChildWithModuleWorkerAndMessagePort$1 = {
|
|
380
|
+
__proto__: null,
|
|
381
|
+
listen: listen$6,
|
|
382
|
+
wrap: wrap$d
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
const Two = '2.0';
|
|
386
|
+
const create$4 = (method, params) => {
|
|
387
|
+
return {
|
|
388
|
+
jsonrpc: Two,
|
|
389
|
+
method,
|
|
390
|
+
params
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
const callbacks = Object.create(null);
|
|
394
|
+
const set = (id, fn) => {
|
|
395
|
+
callbacks[id] = fn;
|
|
396
|
+
};
|
|
397
|
+
const get = id => {
|
|
398
|
+
return callbacks[id];
|
|
399
|
+
};
|
|
400
|
+
const remove = id => {
|
|
401
|
+
delete callbacks[id];
|
|
402
|
+
};
|
|
403
|
+
let id = 0;
|
|
404
|
+
const create$3 = () => {
|
|
405
|
+
return ++id;
|
|
406
|
+
};
|
|
407
|
+
const registerPromise = () => {
|
|
408
|
+
const id = create$3();
|
|
409
|
+
const {
|
|
410
|
+
resolve,
|
|
411
|
+
promise
|
|
412
|
+
} = Promise.withResolvers();
|
|
413
|
+
set(id, resolve);
|
|
414
|
+
return {
|
|
415
|
+
id,
|
|
416
|
+
promise
|
|
417
|
+
};
|
|
418
|
+
};
|
|
419
|
+
const create$2$1 = (method, params) => {
|
|
420
|
+
const {
|
|
421
|
+
id,
|
|
422
|
+
promise
|
|
423
|
+
} = registerPromise();
|
|
424
|
+
const message = {
|
|
425
|
+
jsonrpc: Two,
|
|
426
|
+
method,
|
|
427
|
+
params,
|
|
428
|
+
id
|
|
429
|
+
};
|
|
430
|
+
return {
|
|
431
|
+
message,
|
|
432
|
+
promise
|
|
433
|
+
};
|
|
434
|
+
};
|
|
435
|
+
class JsonRpcError extends Error {
|
|
436
|
+
constructor(message) {
|
|
437
|
+
super(message);
|
|
438
|
+
this.name = 'JsonRpcError';
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
const NewLine = '\n';
|
|
442
|
+
const DomException = 'DOMException';
|
|
443
|
+
const ReferenceError$1 = 'ReferenceError';
|
|
444
|
+
const SyntaxError$1 = 'SyntaxError';
|
|
445
|
+
const TypeError$1 = 'TypeError';
|
|
446
|
+
const getErrorConstructor = (message, type) => {
|
|
447
|
+
if (type) {
|
|
448
|
+
switch (type) {
|
|
449
|
+
case DomException:
|
|
450
|
+
return DOMException;
|
|
451
|
+
case TypeError$1:
|
|
452
|
+
return TypeError;
|
|
453
|
+
case SyntaxError$1:
|
|
454
|
+
return SyntaxError;
|
|
455
|
+
case ReferenceError$1:
|
|
456
|
+
return ReferenceError;
|
|
457
|
+
default:
|
|
458
|
+
return Error;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (message.startsWith('TypeError: ')) {
|
|
462
|
+
return TypeError;
|
|
463
|
+
}
|
|
464
|
+
if (message.startsWith('SyntaxError: ')) {
|
|
465
|
+
return SyntaxError;
|
|
466
466
|
}
|
|
467
|
-
|
|
468
|
-
|
|
467
|
+
if (message.startsWith('ReferenceError: ')) {
|
|
468
|
+
return ReferenceError;
|
|
469
469
|
}
|
|
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]');
|
|
470
|
+
return Error;
|
|
486
471
|
};
|
|
487
|
-
const
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
472
|
+
const constructError = (message, type, name) => {
|
|
473
|
+
const ErrorConstructor = getErrorConstructor(message, type);
|
|
474
|
+
if (ErrorConstructor === DOMException && name) {
|
|
475
|
+
return new ErrorConstructor(message, name);
|
|
476
|
+
}
|
|
477
|
+
if (ErrorConstructor === Error) {
|
|
478
|
+
const error = new Error(message);
|
|
479
|
+
if (name && name !== 'VError') {
|
|
480
|
+
error.name = name;
|
|
481
|
+
}
|
|
482
|
+
return error;
|
|
483
|
+
}
|
|
484
|
+
return new ErrorConstructor(message);
|
|
495
485
|
};
|
|
496
|
-
const
|
|
497
|
-
|
|
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);
|
|
486
|
+
const getNewLineIndex = (string, startIndex = undefined) => {
|
|
487
|
+
return string.indexOf(NewLine, startIndex);
|
|
504
488
|
};
|
|
505
|
-
const
|
|
506
|
-
|
|
489
|
+
const getParentStack = error => {
|
|
490
|
+
let parentStack = error.stack || error.data || error.message || '';
|
|
491
|
+
if (parentStack.startsWith(' at')) {
|
|
492
|
+
parentStack = error.message + NewLine + parentStack;
|
|
493
|
+
}
|
|
494
|
+
return parentStack;
|
|
507
495
|
};
|
|
508
|
-
const
|
|
509
|
-
return
|
|
496
|
+
const joinLines = lines => {
|
|
497
|
+
return lines.join(NewLine);
|
|
510
498
|
};
|
|
511
|
-
const
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
const relevantLines = lines.slice(startIndex, endIndex);
|
|
516
|
-
const relevantMessage = relevantLines.join(' ').slice('Error: '.length);
|
|
517
|
-
return relevantMessage;
|
|
499
|
+
const MethodNotFound = -32601;
|
|
500
|
+
const Custom = -32001;
|
|
501
|
+
const splitLines = lines => {
|
|
502
|
+
return lines.split(NewLine);
|
|
518
503
|
};
|
|
519
|
-
const
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
504
|
+
const restoreJsonRpcError = error => {
|
|
505
|
+
if (error && error instanceof Error) {
|
|
506
|
+
return error;
|
|
507
|
+
}
|
|
508
|
+
const currentStack = joinLines(splitLines(new Error().stack || '').slice(1));
|
|
509
|
+
if (error && error.code && error.code === MethodNotFound) {
|
|
510
|
+
const restoredError = new JsonRpcError(error.message);
|
|
511
|
+
const parentStack = getParentStack(error);
|
|
512
|
+
restoredError.stack = parentStack + NewLine + currentStack;
|
|
513
|
+
return restoredError;
|
|
514
|
+
}
|
|
515
|
+
if (error && error.message) {
|
|
516
|
+
const restoredError = constructError(error.message, error.type, error.name);
|
|
517
|
+
if (error.data) {
|
|
518
|
+
if (error.data.stack && error.data.type && error.message) {
|
|
519
|
+
restoredError.stack = error.data.type + ': ' + error.message + NewLine + error.data.stack + NewLine + currentStack;
|
|
520
|
+
} else if (error.data.stack) {
|
|
521
|
+
restoredError.stack = error.data.stack;
|
|
522
|
+
}
|
|
523
|
+
if (error.data.codeFrame) {
|
|
524
|
+
// @ts-ignore
|
|
525
|
+
restoredError.codeFrame = error.data.codeFrame;
|
|
526
|
+
}
|
|
527
|
+
if (error.data.code) {
|
|
528
|
+
// @ts-ignore
|
|
529
|
+
restoredError.code = error.data.code;
|
|
530
|
+
}
|
|
531
|
+
if (error.data.type) {
|
|
532
|
+
// @ts-ignore
|
|
533
|
+
restoredError.name = error.data.type;
|
|
534
|
+
}
|
|
535
|
+
} else {
|
|
536
|
+
if (error.stack) {
|
|
537
|
+
const lowerStack = restoredError.stack || '';
|
|
538
|
+
// @ts-ignore
|
|
539
|
+
const indexNewLine = getNewLineIndex(lowerStack);
|
|
540
|
+
const parentStack = getParentStack(error);
|
|
541
|
+
// @ts-ignore
|
|
542
|
+
restoredError.stack = parentStack + lowerStack.slice(indexNewLine);
|
|
543
|
+
}
|
|
544
|
+
if (error.codeFrame) {
|
|
545
|
+
// @ts-ignore
|
|
546
|
+
restoredError.codeFrame = error.codeFrame;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
return restoredError;
|
|
550
|
+
}
|
|
551
|
+
if (typeof error === 'string') {
|
|
552
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
553
|
+
}
|
|
554
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
525
555
|
};
|
|
526
|
-
const
|
|
527
|
-
if (
|
|
528
|
-
|
|
556
|
+
const unwrapJsonRpcResult = responseMessage => {
|
|
557
|
+
if ('error' in responseMessage) {
|
|
558
|
+
const restoredError = restoreJsonRpcError(responseMessage.error);
|
|
559
|
+
throw restoredError;
|
|
529
560
|
}
|
|
530
|
-
|
|
561
|
+
if ('result' in responseMessage) {
|
|
562
|
+
return responseMessage.result;
|
|
563
|
+
}
|
|
564
|
+
throw new JsonRpcError('unexpected response message');
|
|
531
565
|
};
|
|
532
|
-
const
|
|
533
|
-
|
|
534
|
-
message: `ES Modules are not supported in electron`,
|
|
535
|
-
code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
|
|
536
|
-
};
|
|
566
|
+
const warn = (...args) => {
|
|
567
|
+
console.warn(...args);
|
|
537
568
|
};
|
|
538
|
-
const
|
|
539
|
-
|
|
540
|
-
|
|
569
|
+
const resolve = (id, response) => {
|
|
570
|
+
const fn = get(id);
|
|
571
|
+
if (!fn) {
|
|
572
|
+
console.log(response);
|
|
573
|
+
warn(`callback ${id} may already be disposed`);
|
|
574
|
+
return;
|
|
541
575
|
}
|
|
542
|
-
|
|
576
|
+
fn(response);
|
|
577
|
+
remove(id);
|
|
543
578
|
};
|
|
544
|
-
const
|
|
545
|
-
|
|
579
|
+
const E_COMMAND_NOT_FOUND = 'E_COMMAND_NOT_FOUND';
|
|
580
|
+
const getErrorType = prettyError => {
|
|
581
|
+
if (prettyError && prettyError.type) {
|
|
582
|
+
return prettyError.type;
|
|
583
|
+
}
|
|
584
|
+
if (prettyError && prettyError.constructor && prettyError.constructor.name) {
|
|
585
|
+
return prettyError.constructor.name;
|
|
586
|
+
}
|
|
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 => {
|
|
@@ -986,13 +989,16 @@ const getDefaultBaseUrl = webView => {
|
|
|
986
989
|
}
|
|
987
990
|
return '';
|
|
988
991
|
};
|
|
989
|
-
const getWebViewBaseUrl = webView => {
|
|
992
|
+
const getWebViewBaseUrl = (webView, locationOrigin) => {
|
|
990
993
|
const defaultBaseUrl = getDefaultBaseUrl(webView);
|
|
994
|
+
if (defaultBaseUrl.startsWith(locationOrigin)) {
|
|
995
|
+
return defaultBaseUrl.slice(locationOrigin.length);
|
|
996
|
+
}
|
|
991
997
|
return defaultBaseUrl;
|
|
992
998
|
};
|
|
993
999
|
|
|
994
1000
|
const getIframeSrc$1 = (webView, locationOrigin, assetDir) => {
|
|
995
|
-
const baseUrl = getWebViewBaseUrl(webView);
|
|
1001
|
+
const baseUrl = getWebViewBaseUrl(webView, locationOrigin);
|
|
996
1002
|
const srcHtml = getWebViewHtml(baseUrl, locationOrigin, webView.elements, assetDir);
|
|
997
1003
|
if (srcHtml) {
|
|
998
1004
|
const blobUrl = getBlobUrl(srcHtml, 'text/html');
|
|
@@ -1015,62 +1021,6 @@ const getWebView = (webViews, webViewId) => {
|
|
|
1015
1021
|
return undefined;
|
|
1016
1022
|
};
|
|
1017
1023
|
|
|
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
1024
|
const getIframeSrc = (webViews, webViewId, webViewPort, root, isGitpod, locationProtocol, locationHost, locationOrigin, platform, assetDir) => {
|
|
1075
1025
|
try {
|
|
1076
1026
|
const webView = getWebView(webViews, webViewId);
|
|
@@ -1169,6 +1119,11 @@ const getIframeSandbox = (webView, platform) => {
|
|
|
1169
1119
|
return [AllowScripts, AllowSameOrigin, ...extensionSandbox];
|
|
1170
1120
|
};
|
|
1171
1121
|
|
|
1122
|
+
const getIframePermissionPolicy = webView => {
|
|
1123
|
+
const extensionAllow = webView.allow || [];
|
|
1124
|
+
return extensionAllow;
|
|
1125
|
+
};
|
|
1126
|
+
|
|
1172
1127
|
const state = {
|
|
1173
1128
|
id: 0
|
|
1174
1129
|
};
|
|
@@ -1304,6 +1259,8 @@ const create2 = async ({
|
|
|
1304
1259
|
|
|
1305
1260
|
const csp = getWebViewCsp(webView);
|
|
1306
1261
|
const sandbox = getIframeSandbox(webView, platform);
|
|
1262
|
+
const permissionPolicy = getIframePermissionPolicy(webView);
|
|
1263
|
+
const permissionPolicyString = permissionPolicy.join('; ');
|
|
1307
1264
|
const iframeCsp = platform === Web ? csp : '';
|
|
1308
1265
|
const credentialless = true;
|
|
1309
1266
|
await invoke$3('ExtensionHostManagement.activateByEvent', `onWebView:${webViewId}`);
|
|
@@ -1313,7 +1270,7 @@ const create2 = async ({
|
|
|
1313
1270
|
} = getPortTuple();
|
|
1314
1271
|
const portId = create$1();
|
|
1315
1272
|
await register(previewServerId, webViewPort, frameAncestors, webViewRoot, csp, iframeContent);
|
|
1316
|
-
await invoke$1('WebView.create', id, iframeSrc, sandbox, iframeCsp, credentialless);
|
|
1273
|
+
await invoke$1('WebView.create', id, iframeSrc, sandbox, iframeCsp, credentialless, permissionPolicyString);
|
|
1317
1274
|
await invoke$1('WebView.load', id);
|
|
1318
1275
|
const origin = getWebViewOrigin(webViewPort, platform);
|
|
1319
1276
|
const portType = '';
|