@lvce-editor/iframe-worker 3.1.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 +693 -742
- package/package.json +1 -1
package/dist/iframeWorkerMain.js
CHANGED
|
@@ -1,390 +1,59 @@
|
|
|
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);
|
|
107
|
-
}
|
|
108
|
-
if (ErrorConstructor === Error) {
|
|
109
|
-
const error = new Error(message);
|
|
110
|
-
if (name && name !== 'VError') {
|
|
111
|
-
error.name = name;
|
|
112
|
-
}
|
|
113
|
-
return error;
|
|
114
|
-
}
|
|
115
|
-
return new ErrorConstructor(message);
|
|
116
|
-
};
|
|
117
|
-
const getNewLineIndex$2 = (string, startIndex = undefined) => {
|
|
118
|
-
return string.indexOf(NewLine$3, startIndex);
|
|
119
|
-
};
|
|
120
|
-
const getParentStack = error => {
|
|
121
|
-
let parentStack = error.stack || error.data || error.message || '';
|
|
122
|
-
if (parentStack.startsWith(' at')) {
|
|
123
|
-
parentStack = error.message + NewLine$3 + parentStack;
|
|
124
|
-
}
|
|
125
|
-
return parentStack;
|
|
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);
|
|
134
|
-
};
|
|
135
|
-
const restoreJsonRpcError = error => {
|
|
136
|
-
if (error && error instanceof Error) {
|
|
137
|
-
return error;
|
|
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}`);
|
|
186
|
-
};
|
|
187
|
-
const unwrapJsonRpcResult = responseMessage => {
|
|
188
|
-
if ('error' in responseMessage) {
|
|
189
|
-
const restoredError = restoreJsonRpcError(responseMessage.error);
|
|
190
|
-
throw restoredError;
|
|
191
|
-
}
|
|
192
|
-
if ('result' in responseMessage) {
|
|
193
|
-
return responseMessage.result;
|
|
194
|
-
}
|
|
195
|
-
throw new JsonRpcError('unexpected response message');
|
|
196
|
-
};
|
|
197
|
-
const E_COMMAND_NOT_FOUND = 'E_COMMAND_NOT_FOUND';
|
|
198
|
-
const getErrorType = prettyError => {
|
|
199
|
-
if (prettyError && prettyError.type) {
|
|
200
|
-
return prettyError.type;
|
|
201
|
-
}
|
|
202
|
-
if (prettyError && prettyError.constructor && prettyError.constructor.name) {
|
|
203
|
-
return prettyError.constructor.name;
|
|
204
|
-
}
|
|
205
|
-
return undefined;
|
|
206
|
-
};
|
|
207
|
-
const getErrorProperty = (error, prettyError) => {
|
|
208
|
-
if (error && error.code === E_COMMAND_NOT_FOUND) {
|
|
209
|
-
return {
|
|
210
|
-
code: MethodNotFound,
|
|
211
|
-
message: error.message,
|
|
212
|
-
data: error.stack
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
return {
|
|
216
|
-
code: Custom,
|
|
217
|
-
message: prettyError.message,
|
|
218
|
-
data: {
|
|
219
|
-
stack: prettyError.stack,
|
|
220
|
-
codeFrame: prettyError.codeFrame,
|
|
221
|
-
type: getErrorType(prettyError),
|
|
222
|
-
code: prettyError.code,
|
|
223
|
-
name: prettyError.name
|
|
224
|
-
}
|
|
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
|
-
}
|
|
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;
|
|
269
|
-
|
|
270
|
-
// TODO maybe remove this in v6 or v7, only accept options object to simplify the code
|
|
271
|
-
const normalizeParams = args => {
|
|
272
|
-
if (args.length === 1) {
|
|
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
|
-
};
|
|
283
|
-
}
|
|
284
|
-
return {
|
|
285
|
-
ipc: args[0],
|
|
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);
|
|
317
|
-
return;
|
|
1
|
+
const normalizeLine = line => {
|
|
2
|
+
if (line.startsWith('Error: ')) {
|
|
3
|
+
return line.slice('Error: '.length);
|
|
318
4
|
}
|
|
319
|
-
if ('
|
|
320
|
-
|
|
321
|
-
return;
|
|
5
|
+
if (line.startsWith('VError: ')) {
|
|
6
|
+
return line.slice('VError: '.length);
|
|
322
7
|
}
|
|
323
|
-
|
|
8
|
+
return line;
|
|
324
9
|
};
|
|
325
|
-
const
|
|
326
|
-
const {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
} = create$2(method, params);
|
|
330
|
-
if (useSendAndTransfer && ipc.sendAndTransfer) {
|
|
331
|
-
ipc.sendAndTransfer(message);
|
|
332
|
-
} else {
|
|
333
|
-
ipc.send(message);
|
|
10
|
+
const getCombinedMessage = (error, message) => {
|
|
11
|
+
const stringifiedError = normalizeLine(`${error}`);
|
|
12
|
+
if (message) {
|
|
13
|
+
return `${message}: ${stringifiedError}`;
|
|
334
14
|
}
|
|
335
|
-
|
|
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);
|
|
15
|
+
return stringifiedError;
|
|
352
16
|
};
|
|
353
|
-
const
|
|
354
|
-
|
|
17
|
+
const NewLine$2 = '\n';
|
|
18
|
+
const getNewLineIndex$1 = (string, startIndex = undefined) => {
|
|
19
|
+
return string.indexOf(NewLine$2, startIndex);
|
|
355
20
|
};
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
throw new Error(`command not found ${command}`);
|
|
21
|
+
const mergeStacks = (parent, child) => {
|
|
22
|
+
if (!child) {
|
|
23
|
+
return parent;
|
|
360
24
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
const
|
|
368
|
-
const
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
};
|
|
374
|
-
that.onMessage(handleMessage);
|
|
375
|
-
const handleClose = event => {
|
|
376
|
-
that.dispatchEvent(new Event('close'));
|
|
377
|
-
};
|
|
378
|
-
that.onClose(handleClose);
|
|
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;
|
|
379
37
|
};
|
|
380
|
-
class
|
|
381
|
-
constructor(
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
+
}
|
|
385
54
|
}
|
|
386
55
|
}
|
|
387
|
-
|
|
56
|
+
|
|
388
57
|
const walkValue = (value, transferrables, isTransferrable) => {
|
|
389
58
|
if (!value) {
|
|
390
59
|
return;
|
|
@@ -421,33 +90,196 @@ const isInstanceOf = (value, constructorName) => {
|
|
|
421
90
|
const isSocket = value => {
|
|
422
91
|
return isInstanceOf(value, 'Socket');
|
|
423
92
|
};
|
|
424
|
-
const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
|
|
425
|
-
const isTransferrable = value => {
|
|
426
|
-
for (const fn of transferrables) {
|
|
427
|
-
if (fn(value)) {
|
|
428
|
-
return true;
|
|
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'));
|
|
117
|
+
};
|
|
118
|
+
that.onClose(handleClose);
|
|
119
|
+
};
|
|
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);
|
|
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;
|
|
182
|
+
}
|
|
183
|
+
return stderr.includes('SyntaxError: Cannot use import statement outside a module');
|
|
184
|
+
};
|
|
185
|
+
const getModuleSyntaxError = () => {
|
|
186
|
+
return {
|
|
187
|
+
message: `ES Modules are not supported in electron`,
|
|
188
|
+
code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
const isModuleNotFoundError = stderr => {
|
|
192
|
+
if (!stderr) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
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;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
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);
|
|
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
|
+
};
|
|
239
|
+
};
|
|
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$6 = () => {
|
|
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$6 = 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
|
|
@@ -468,280 +300,447 @@ class IpcChildWithModuleWorker extends Ipc {
|
|
|
468
300
|
this._rawIpc.addEventListener('message', callback);
|
|
469
301
|
}
|
|
470
302
|
}
|
|
471
|
-
const wrap$
|
|
303
|
+
const wrap$d = global => {
|
|
472
304
|
return new IpcChildWithModuleWorker(global);
|
|
473
305
|
};
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
const
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
return
|
|
306
|
+
const withResolvers = () => {
|
|
307
|
+
let _resolve;
|
|
308
|
+
const promise = new Promise(resolve => {
|
|
309
|
+
_resolve = resolve;
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
resolve: _resolve,
|
|
313
|
+
promise
|
|
314
|
+
};
|
|
480
315
|
};
|
|
481
|
-
const
|
|
482
|
-
|
|
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;
|
|
483
327
|
};
|
|
484
|
-
const
|
|
485
|
-
|
|
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');
|
|
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;
|
|
486
348
|
};
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
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$c = port => {
|
|
377
|
+
return new IpcChildWithModuleWorkerAndMessagePort(port);
|
|
378
|
+
};
|
|
379
|
+
const IpcChildWithModuleWorkerAndMessagePort$1 = {
|
|
380
|
+
__proto__: null,
|
|
381
|
+
listen: listen$5,
|
|
382
|
+
wrap: wrap$c
|
|
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 warn = (...args) => {
|
|
408
|
+
console.warn(...args);
|
|
409
|
+
};
|
|
410
|
+
const registerPromise = () => {
|
|
411
|
+
const id = create$3();
|
|
412
|
+
const {
|
|
413
|
+
resolve,
|
|
414
|
+
promise
|
|
415
|
+
} = Promise.withResolvers();
|
|
416
|
+
set(id, resolve);
|
|
417
|
+
return {
|
|
418
|
+
id,
|
|
419
|
+
promise
|
|
420
|
+
};
|
|
421
|
+
};
|
|
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`);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
fn(response);
|
|
430
|
+
remove(id);
|
|
431
|
+
};
|
|
432
|
+
const create$2$1 = (method, params) => {
|
|
433
|
+
const {
|
|
434
|
+
id,
|
|
435
|
+
promise
|
|
436
|
+
} = registerPromise();
|
|
437
|
+
const message = {
|
|
438
|
+
jsonrpc: Two,
|
|
439
|
+
method,
|
|
440
|
+
params,
|
|
441
|
+
id
|
|
442
|
+
};
|
|
491
443
|
return {
|
|
492
444
|
message,
|
|
493
|
-
|
|
445
|
+
promise
|
|
494
446
|
};
|
|
495
447
|
};
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
const
|
|
503
|
-
|
|
448
|
+
class JsonRpcError extends Error {
|
|
449
|
+
constructor(message) {
|
|
450
|
+
super(message);
|
|
451
|
+
this.name = 'JsonRpcError';
|
|
452
|
+
}
|
|
453
|
+
}
|
|
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
|
+
}
|
|
473
|
+
}
|
|
474
|
+
if (message.startsWith('TypeError: ')) {
|
|
475
|
+
return TypeError;
|
|
476
|
+
}
|
|
477
|
+
if (message.startsWith('SyntaxError: ')) {
|
|
478
|
+
return SyntaxError;
|
|
479
|
+
}
|
|
480
|
+
if (message.startsWith('ReferenceError: ')) {
|
|
481
|
+
return ReferenceError;
|
|
482
|
+
}
|
|
483
|
+
return Error;
|
|
504
484
|
};
|
|
505
|
-
const
|
|
506
|
-
|
|
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;
|
|
494
|
+
}
|
|
495
|
+
return error;
|
|
496
|
+
}
|
|
497
|
+
return new ErrorConstructor(message);
|
|
507
498
|
};
|
|
508
|
-
const
|
|
509
|
-
return
|
|
499
|
+
const getNewLineIndex = (string, startIndex = undefined) => {
|
|
500
|
+
return string.indexOf(NewLine, startIndex);
|
|
501
|
+
};
|
|
502
|
+
const getParentStack = error => {
|
|
503
|
+
let parentStack = error.stack || error.data || error.message || '';
|
|
504
|
+
if (parentStack.startsWith(' at')) {
|
|
505
|
+
parentStack = error.message + NewLine + parentStack;
|
|
506
|
+
}
|
|
507
|
+
return parentStack;
|
|
510
508
|
};
|
|
511
|
-
const
|
|
512
|
-
|
|
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;
|
|
509
|
+
const joinLines = lines => {
|
|
510
|
+
return lines.join(NewLine);
|
|
518
511
|
};
|
|
519
|
-
const
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
code: E_INCOMPATIBLE_NATIVE_MODULE
|
|
524
|
-
};
|
|
512
|
+
const MethodNotFound = -32601;
|
|
513
|
+
const Custom = -32001;
|
|
514
|
+
const splitLines = lines => {
|
|
515
|
+
return lines.split(NewLine);
|
|
525
516
|
};
|
|
526
|
-
const
|
|
527
|
-
if (
|
|
528
|
-
return
|
|
517
|
+
const restoreJsonRpcError = error => {
|
|
518
|
+
if (error && error instanceof Error) {
|
|
519
|
+
return error;
|
|
529
520
|
}
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
const
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
}
|
|
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;
|
|
527
|
+
}
|
|
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;
|
|
563
|
+
}
|
|
564
|
+
if (typeof error === 'string') {
|
|
565
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
566
|
+
}
|
|
567
|
+
return new Error(`JsonRpc Error: ${error}`);
|
|
537
568
|
};
|
|
538
|
-
const
|
|
539
|
-
if (
|
|
540
|
-
|
|
569
|
+
const unwrapJsonRpcResult = responseMessage => {
|
|
570
|
+
if ('error' in responseMessage) {
|
|
571
|
+
const restoredError = restoreJsonRpcError(responseMessage.error);
|
|
572
|
+
throw restoredError;
|
|
541
573
|
}
|
|
542
|
-
|
|
574
|
+
if ('result' in responseMessage) {
|
|
575
|
+
return responseMessage.result;
|
|
576
|
+
}
|
|
577
|
+
throw new JsonRpcError('unexpected response message');
|
|
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
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
597
|
+
return {
|
|
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
|
|
559
606
|
}
|
|
560
|
-
}
|
|
607
|
+
};
|
|
608
|
+
};
|
|
609
|
+
const create$1$1 = (message, error) => {
|
|
561
610
|
return {
|
|
562
|
-
|
|
563
|
-
|
|
611
|
+
jsonrpc: Two,
|
|
612
|
+
id: message.id,
|
|
613
|
+
error
|
|
564
614
|
};
|
|
565
615
|
};
|
|
566
|
-
const
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
if (isModuleNotFoundError(stderr)) {
|
|
574
|
-
return getModuleNotFoundError(stderr);
|
|
575
|
-
}
|
|
576
|
-
const lines = splitLines(stderr);
|
|
577
|
-
const {
|
|
578
|
-
actualMessage,
|
|
579
|
-
rest
|
|
580
|
-
} = getDetails(lines);
|
|
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);
|
|
621
|
+
};
|
|
622
|
+
const create$5 = (message, result) => {
|
|
581
623
|
return {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
624
|
+
jsonrpc: Two,
|
|
625
|
+
id: message.id,
|
|
626
|
+
result: result ?? null
|
|
585
627
|
};
|
|
586
628
|
};
|
|
587
|
-
const
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
}
|
|
591
|
-
if (line.startsWith('VError: ')) {
|
|
592
|
-
return line.slice('VError: '.length);
|
|
593
|
-
}
|
|
594
|
-
return line;
|
|
629
|
+
const getSuccessResponse = (message, result) => {
|
|
630
|
+
const resultProperty = result ?? null;
|
|
631
|
+
return create$5(message, resultProperty);
|
|
595
632
|
};
|
|
596
|
-
const
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
return
|
|
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);
|
|
600
639
|
}
|
|
601
|
-
return stringifiedError;
|
|
602
640
|
};
|
|
603
|
-
const
|
|
604
|
-
|
|
605
|
-
return string.indexOf(NewLine$2, startIndex);
|
|
641
|
+
const defaultPreparePrettyError = error => {
|
|
642
|
+
return error;
|
|
606
643
|
};
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
return parent;
|
|
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;
|
|
644
|
+
const defaultLogError = () => {
|
|
645
|
+
// ignore
|
|
623
646
|
};
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
const combinedMessage = getCombinedMessage$1(error, message);
|
|
627
|
-
super(combinedMessage);
|
|
628
|
-
this.name = 'VError';
|
|
629
|
-
if (error instanceof Error) {
|
|
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
|
-
}
|
|
640
|
-
}
|
|
647
|
+
const defaultRequiresSocket = () => {
|
|
648
|
+
return false;
|
|
641
649
|
};
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
} else {
|
|
658
|
-
super(betterMessage);
|
|
659
|
-
}
|
|
660
|
-
// @ts-ignore
|
|
661
|
-
this.name = 'IpcError';
|
|
662
|
-
// @ts-ignore
|
|
663
|
-
this.stdout = stdout;
|
|
664
|
-
// @ts-ignore
|
|
665
|
-
this.stderr = stderr;
|
|
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 => {
|
|
@@ -834,6 +837,33 @@ const createLocalHostUrl = (locationProtocol, locationHost, isGitpod, webViewPor
|
|
|
834
837
|
return `http://localhost:${webViewPort}`;
|
|
835
838
|
};
|
|
836
839
|
|
|
840
|
+
const getWebViewHtml = (baseUrl, locationOrigin, elements, assetDir) => {
|
|
841
|
+
if (!elements) {
|
|
842
|
+
return '';
|
|
843
|
+
}
|
|
844
|
+
const middle = [];
|
|
845
|
+
middle.push('<meta charset="utf-8">');
|
|
846
|
+
for (const element of elements) {
|
|
847
|
+
if (element.type === 'title') {
|
|
848
|
+
middle.push(`<title>${element.value}</title>`);
|
|
849
|
+
} else if (element.type === 'script') {
|
|
850
|
+
middle.push(`<script type="module" src="${locationOrigin}${assetDir}/js/preview-injected.js"></script>`);
|
|
851
|
+
middle.push(`<script type="module" src="${locationOrigin}${baseUrl}/${element.path}"></script>`);
|
|
852
|
+
} else if (element.type === 'css') {
|
|
853
|
+
middle.push(`<link rel="stylesheet" href="${locationOrigin}${baseUrl}/${element.path}" />`);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
const middleHtml = middle.join('\n ');
|
|
857
|
+
const html = `<!DOCTYPE html>
|
|
858
|
+
<html>
|
|
859
|
+
<head>
|
|
860
|
+
${middleHtml}
|
|
861
|
+
</head>
|
|
862
|
+
</html>
|
|
863
|
+
`;
|
|
864
|
+
return html;
|
|
865
|
+
};
|
|
866
|
+
|
|
837
867
|
const Web = 1;
|
|
838
868
|
const Electron = 2;
|
|
839
869
|
const Remote = 3;
|
|
@@ -869,46 +899,6 @@ const getPlatform = () => {
|
|
|
869
899
|
};
|
|
870
900
|
const platform = getPlatform();
|
|
871
901
|
|
|
872
|
-
const getAssetDir = () => {
|
|
873
|
-
// @ts-ignore
|
|
874
|
-
if (typeof ASSET_DIR !== 'undefined') {
|
|
875
|
-
// @ts-ignore
|
|
876
|
-
return ASSET_DIR;
|
|
877
|
-
}
|
|
878
|
-
if (platform === Electron) {
|
|
879
|
-
return '';
|
|
880
|
-
}
|
|
881
|
-
return '';
|
|
882
|
-
};
|
|
883
|
-
const assetDir = getAssetDir();
|
|
884
|
-
|
|
885
|
-
const getWebViewHtml = (baseUrl, locationOrigin, elements) => {
|
|
886
|
-
if (!elements) {
|
|
887
|
-
return '';
|
|
888
|
-
}
|
|
889
|
-
const middle = [];
|
|
890
|
-
middle.push('<meta charset="utf-8">');
|
|
891
|
-
for (const element of elements) {
|
|
892
|
-
if (element.type === 'title') {
|
|
893
|
-
middle.push(`<title>${element.value}</title>`);
|
|
894
|
-
} else if (element.type === 'script') {
|
|
895
|
-
middle.push(`<script type="module" src="${locationOrigin}${assetDir}/js/preview-injected.js"></script>`);
|
|
896
|
-
middle.push(`<script type="module" src="${locationOrigin}${baseUrl}/${element.path}"></script>`);
|
|
897
|
-
} else if (element.type === 'css') {
|
|
898
|
-
middle.push(`<link rel="stylesheet" href="${locationOrigin}${baseUrl}/${element.path}" />`);
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
const middleHtml = middle.join('\n ');
|
|
902
|
-
const html = `<!DOCTYPE html>
|
|
903
|
-
<html>
|
|
904
|
-
<head>
|
|
905
|
-
${middleHtml}
|
|
906
|
-
</head>
|
|
907
|
-
</html>
|
|
908
|
-
`;
|
|
909
|
-
return html;
|
|
910
|
-
};
|
|
911
|
-
|
|
912
902
|
const WebView = 'lvce-oss-webview';
|
|
913
903
|
|
|
914
904
|
const getWebView$1 = (webViews, webViewId) => {
|
|
@@ -937,13 +927,9 @@ const getWebViewUri = (webViews, webViewId) => {
|
|
|
937
927
|
}
|
|
938
928
|
return webViewPath;
|
|
939
929
|
};
|
|
940
|
-
const getIframeSrcRemote = (webViews, webViewPort, webViewId, locationProtocol, locationHost, isGitpod, root, platform$1 = platform) => {
|
|
930
|
+
const getIframeSrcRemote = (webViews, webViewPort, webViewId, locationProtocol, locationHost, isGitpod, root, platform$1 = platform, assetDir) => {
|
|
941
931
|
const webView = getWebView$1(webViews, webViewId);
|
|
942
932
|
const webViewUri = getWebViewUri(webViews, webViewId);
|
|
943
|
-
console.log({
|
|
944
|
-
webViews,
|
|
945
|
-
webViewId
|
|
946
|
-
});
|
|
947
933
|
if (!webViewUri) {
|
|
948
934
|
return undefined;
|
|
949
935
|
}
|
|
@@ -963,7 +949,7 @@ const getIframeSrcRemote = (webViews, webViewPort, webViewId, locationProtocol,
|
|
|
963
949
|
}
|
|
964
950
|
iframeSrc = createLocalHostUrl(locationProtocol, locationHost, isGitpod, webViewPort);
|
|
965
951
|
}
|
|
966
|
-
let iframeContent = getWebViewHtml('', '', webView.elements);
|
|
952
|
+
let iframeContent = getWebViewHtml('', '', webView.elements, assetDir);
|
|
967
953
|
// TODO either
|
|
968
954
|
// - load webviews the same as in web using blob urls
|
|
969
955
|
// - load webviews from a pattern like /webviews/:id/:fileName
|
|
@@ -1008,9 +994,9 @@ const getWebViewBaseUrl = webView => {
|
|
|
1008
994
|
return defaultBaseUrl;
|
|
1009
995
|
};
|
|
1010
996
|
|
|
1011
|
-
const getIframeSrc$1 = (webView, locationOrigin) => {
|
|
997
|
+
const getIframeSrc$1 = (webView, locationOrigin, assetDir) => {
|
|
1012
998
|
const baseUrl = getWebViewBaseUrl(webView);
|
|
1013
|
-
const srcHtml = getWebViewHtml(baseUrl, locationOrigin, webView.elements);
|
|
999
|
+
const srcHtml = getWebViewHtml(baseUrl, locationOrigin, webView.elements, assetDir);
|
|
1014
1000
|
if (srcHtml) {
|
|
1015
1001
|
const blobUrl = getBlobUrl(srcHtml, 'text/html');
|
|
1016
1002
|
return {
|
|
@@ -1032,69 +1018,13 @@ const getWebView = (webViews, webViewId) => {
|
|
|
1032
1018
|
return undefined;
|
|
1033
1019
|
};
|
|
1034
1020
|
|
|
1035
|
-
const
|
|
1036
|
-
if (line.startsWith('Error: ')) {
|
|
1037
|
-
return line.slice('Error: '.length);
|
|
1038
|
-
}
|
|
1039
|
-
if (line.startsWith('VError: ')) {
|
|
1040
|
-
return line.slice('VError: '.length);
|
|
1041
|
-
}
|
|
1042
|
-
return line;
|
|
1043
|
-
};
|
|
1044
|
-
const getCombinedMessage = (error, message) => {
|
|
1045
|
-
const stringifiedError = normalizeLine(`${error}`);
|
|
1046
|
-
if (message) {
|
|
1047
|
-
return `${message}: ${stringifiedError}`;
|
|
1048
|
-
}
|
|
1049
|
-
return stringifiedError;
|
|
1050
|
-
};
|
|
1051
|
-
const NewLine = '\n';
|
|
1052
|
-
const getNewLineIndex = (string, startIndex = undefined) => {
|
|
1053
|
-
return string.indexOf(NewLine, startIndex);
|
|
1054
|
-
};
|
|
1055
|
-
const mergeStacks = (parent, child) => {
|
|
1056
|
-
if (!child) {
|
|
1057
|
-
return parent;
|
|
1058
|
-
}
|
|
1059
|
-
const parentNewLineIndex = getNewLineIndex(parent);
|
|
1060
|
-
const childNewLineIndex = getNewLineIndex(child);
|
|
1061
|
-
if (childNewLineIndex === -1) {
|
|
1062
|
-
return parent;
|
|
1063
|
-
}
|
|
1064
|
-
const parentFirstLine = parent.slice(0, parentNewLineIndex);
|
|
1065
|
-
const childRest = child.slice(childNewLineIndex);
|
|
1066
|
-
const childFirstLine = normalizeLine(child.slice(0, childNewLineIndex));
|
|
1067
|
-
if (parentFirstLine.includes(childFirstLine)) {
|
|
1068
|
-
return parentFirstLine + childRest;
|
|
1069
|
-
}
|
|
1070
|
-
return child;
|
|
1071
|
-
};
|
|
1072
|
-
class VError extends Error {
|
|
1073
|
-
constructor(error, message) {
|
|
1074
|
-
const combinedMessage = getCombinedMessage(error, message);
|
|
1075
|
-
super(combinedMessage);
|
|
1076
|
-
this.name = 'VError';
|
|
1077
|
-
if (error instanceof Error) {
|
|
1078
|
-
this.stack = mergeStacks(this.stack, error.stack);
|
|
1079
|
-
}
|
|
1080
|
-
if (error.codeFrame) {
|
|
1081
|
-
// @ts-ignore
|
|
1082
|
-
this.codeFrame = error.codeFrame;
|
|
1083
|
-
}
|
|
1084
|
-
if (error.code) {
|
|
1085
|
-
// @ts-ignore
|
|
1086
|
-
this.code = error.code;
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
|
-
}
|
|
1090
|
-
|
|
1091
|
-
const getIframeSrc = (webViews, webViewId, webViewPort, root, isGitpod, locationProtocol, locationHost, locationOrigin, platform$1 = platform) => {
|
|
1021
|
+
const getIframeSrc = (webViews, webViewId, webViewPort, root, isGitpod, locationProtocol, locationHost, locationOrigin, platform, assetDir) => {
|
|
1092
1022
|
try {
|
|
1093
1023
|
const webView = getWebView(webViews, webViewId);
|
|
1094
|
-
if (platform
|
|
1095
|
-
return getIframeSrc$1(webView, locationOrigin);
|
|
1024
|
+
if (platform === Web) {
|
|
1025
|
+
return getIframeSrc$1(webView, locationOrigin, assetDir);
|
|
1096
1026
|
}
|
|
1097
|
-
return getIframeSrcRemote(webViews, webViewPort, webViewId, locationProtocol, locationHost, isGitpod, root);
|
|
1027
|
+
return getIframeSrcRemote(webViews, webViewPort, webViewId, locationProtocol, locationHost, isGitpod, root, platform, assetDir);
|
|
1098
1028
|
} catch (error) {
|
|
1099
1029
|
throw new VError(error, `Failed to construct webview iframe src`);
|
|
1100
1030
|
}
|
|
@@ -1186,6 +1116,11 @@ const getIframeSandbox = (webView, platform) => {
|
|
|
1186
1116
|
return [AllowScripts, AllowSameOrigin, ...extensionSandbox];
|
|
1187
1117
|
};
|
|
1188
1118
|
|
|
1119
|
+
const getIframePermissionPolicy = webView => {
|
|
1120
|
+
const extensionAllow = webView.allow || [];
|
|
1121
|
+
return extensionAllow;
|
|
1122
|
+
};
|
|
1123
|
+
|
|
1189
1124
|
const state = {
|
|
1190
1125
|
id: 0
|
|
1191
1126
|
};
|
|
@@ -1218,6 +1153,19 @@ const invoke = async (method, ...params) => {
|
|
|
1218
1153
|
return invoke$3('WebView.compatSharedProcessInvoke', method, ...params);
|
|
1219
1154
|
};
|
|
1220
1155
|
|
|
1156
|
+
const getAssetDir = () => {
|
|
1157
|
+
// @ts-ignore
|
|
1158
|
+
if (typeof ASSET_DIR !== 'undefined') {
|
|
1159
|
+
// @ts-ignore
|
|
1160
|
+
return ASSET_DIR;
|
|
1161
|
+
}
|
|
1162
|
+
if (platform === Electron) {
|
|
1163
|
+
return '';
|
|
1164
|
+
}
|
|
1165
|
+
return '';
|
|
1166
|
+
};
|
|
1167
|
+
const assetDir = getAssetDir();
|
|
1168
|
+
|
|
1221
1169
|
const registerProtocol = async () => {
|
|
1222
1170
|
await invoke('WebViewServer.registerProtocol');
|
|
1223
1171
|
};
|
|
@@ -1274,7 +1222,8 @@ const create2 = async ({
|
|
|
1274
1222
|
previewServerId,
|
|
1275
1223
|
uri,
|
|
1276
1224
|
platform,
|
|
1277
|
-
isGitpod
|
|
1225
|
+
isGitpod,
|
|
1226
|
+
assetDir: assetDir$1 = assetDir
|
|
1278
1227
|
}) => {
|
|
1279
1228
|
let root = '';
|
|
1280
1229
|
if (platform === Remote) {
|
|
@@ -1284,7 +1233,7 @@ const create2 = async ({
|
|
|
1284
1233
|
const locationProtocol = getProtocol();
|
|
1285
1234
|
const locationHost = getHost();
|
|
1286
1235
|
const locationOrigin = getOrigin();
|
|
1287
|
-
const iframeResult = getIframeSrc(webViews, webViewId, webViewPort, root, isGitpod, locationProtocol, locationHost, locationOrigin, platform);
|
|
1236
|
+
const iframeResult = getIframeSrc(webViews, webViewId, webViewPort, root, isGitpod, locationProtocol, locationHost, locationOrigin, platform, assetDir$1);
|
|
1288
1237
|
if (!iframeResult) {
|
|
1289
1238
|
return undefined;
|
|
1290
1239
|
}
|
|
@@ -1307,6 +1256,8 @@ const create2 = async ({
|
|
|
1307
1256
|
|
|
1308
1257
|
const csp = getWebViewCsp(webView);
|
|
1309
1258
|
const sandbox = getIframeSandbox(webView, platform);
|
|
1259
|
+
const permissionPolicy = getIframePermissionPolicy(webView);
|
|
1260
|
+
const permissionPolicyString = permissionPolicy.join('; ');
|
|
1310
1261
|
const iframeCsp = platform === Web ? csp : '';
|
|
1311
1262
|
const credentialless = true;
|
|
1312
1263
|
await invoke$3('ExtensionHostManagement.activateByEvent', `onWebView:${webViewId}`);
|
|
@@ -1316,7 +1267,7 @@ const create2 = async ({
|
|
|
1316
1267
|
} = getPortTuple();
|
|
1317
1268
|
const portId = create$1();
|
|
1318
1269
|
await register(previewServerId, webViewPort, frameAncestors, webViewRoot, csp, iframeContent);
|
|
1319
|
-
await invoke$1('WebView.create', id, iframeSrc, sandbox, iframeCsp, credentialless);
|
|
1270
|
+
await invoke$1('WebView.create', id, iframeSrc, sandbox, iframeCsp, credentialless, permissionPolicyString);
|
|
1320
1271
|
await invoke$1('WebView.load', id);
|
|
1321
1272
|
const origin = getWebViewOrigin(webViewPort, platform);
|
|
1322
1273
|
const portType = '';
|