@lvce-editor/extension-management-worker 1.6.0 → 1.7.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.
|
@@ -54,6 +54,49 @@ class VError extends Error {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
class AssertionError extends Error {
|
|
58
|
+
constructor(message) {
|
|
59
|
+
super(message);
|
|
60
|
+
this.name = 'AssertionError';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const Object$1 = 1;
|
|
64
|
+
const Number = 2;
|
|
65
|
+
const Array$1 = 3;
|
|
66
|
+
const String = 4;
|
|
67
|
+
const Boolean$1 = 5;
|
|
68
|
+
const Function = 6;
|
|
69
|
+
const Null = 7;
|
|
70
|
+
const Unknown = 8;
|
|
71
|
+
const getType = value => {
|
|
72
|
+
switch (typeof value) {
|
|
73
|
+
case 'number':
|
|
74
|
+
return Number;
|
|
75
|
+
case 'function':
|
|
76
|
+
return Function;
|
|
77
|
+
case 'string':
|
|
78
|
+
return String;
|
|
79
|
+
case 'object':
|
|
80
|
+
if (value === null) {
|
|
81
|
+
return Null;
|
|
82
|
+
}
|
|
83
|
+
if (Array.isArray(value)) {
|
|
84
|
+
return Array$1;
|
|
85
|
+
}
|
|
86
|
+
return Object$1;
|
|
87
|
+
case 'boolean':
|
|
88
|
+
return Boolean$1;
|
|
89
|
+
default:
|
|
90
|
+
return Unknown;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const string = value => {
|
|
94
|
+
const type = getType(value);
|
|
95
|
+
if (type !== String) {
|
|
96
|
+
throw new AssertionError('expected value to be of type string');
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
57
100
|
const isMessagePort = value => {
|
|
58
101
|
return value && value instanceof MessagePort;
|
|
59
102
|
};
|
|
@@ -535,18 +578,18 @@ const create$4$1 = (method, params) => {
|
|
|
535
578
|
};
|
|
536
579
|
};
|
|
537
580
|
const callbacks = Object.create(null);
|
|
538
|
-
const set$
|
|
581
|
+
const set$7 = (id, fn) => {
|
|
539
582
|
callbacks[id] = fn;
|
|
540
583
|
};
|
|
541
|
-
const get$
|
|
584
|
+
const get$3 = id => {
|
|
542
585
|
return callbacks[id];
|
|
543
586
|
};
|
|
544
587
|
const remove = id => {
|
|
545
588
|
delete callbacks[id];
|
|
546
589
|
};
|
|
547
|
-
let id = 0;
|
|
590
|
+
let id$1 = 0;
|
|
548
591
|
const create$3$1 = () => {
|
|
549
|
-
return ++id;
|
|
592
|
+
return ++id$1;
|
|
550
593
|
};
|
|
551
594
|
const registerPromise = () => {
|
|
552
595
|
const id = create$3$1();
|
|
@@ -554,7 +597,7 @@ const registerPromise = () => {
|
|
|
554
597
|
resolve,
|
|
555
598
|
promise
|
|
556
599
|
} = Promise.withResolvers();
|
|
557
|
-
set$
|
|
600
|
+
set$7(id, resolve);
|
|
558
601
|
return {
|
|
559
602
|
id,
|
|
560
603
|
promise
|
|
@@ -719,7 +762,7 @@ const warn = (...args) => {
|
|
|
719
762
|
console.warn(...args);
|
|
720
763
|
};
|
|
721
764
|
const resolve = (id, response) => {
|
|
722
|
-
const fn = get$
|
|
765
|
+
const fn = get$3(id);
|
|
723
766
|
if (!fn) {
|
|
724
767
|
console.log(response);
|
|
725
768
|
warn(`callback ${id} may already be disposed`);
|
|
@@ -899,7 +942,7 @@ const send = (transport, method, ...params) => {
|
|
|
899
942
|
const message = create$4$1(method, params);
|
|
900
943
|
transport.send(message);
|
|
901
944
|
};
|
|
902
|
-
const invoke$
|
|
945
|
+
const invoke$4 = (ipc, method, ...params) => {
|
|
903
946
|
return invokeHelper(ipc, method, params, false);
|
|
904
947
|
};
|
|
905
948
|
const invokeAndTransfer$1 = (ipc, method, ...params) => {
|
|
@@ -938,7 +981,7 @@ const createRpc = ipc => {
|
|
|
938
981
|
send(ipc, method, ...params);
|
|
939
982
|
},
|
|
940
983
|
invoke(method, ...params) {
|
|
941
|
-
return invoke$
|
|
984
|
+
return invoke$4(ipc, method, ...params);
|
|
942
985
|
},
|
|
943
986
|
invokeAndTransfer(method, ...params) {
|
|
944
987
|
return invokeAndTransfer$1(ipc, method, ...params);
|
|
@@ -1084,45 +1127,51 @@ const Web = 1;
|
|
|
1084
1127
|
const Electron = 2;
|
|
1085
1128
|
const Remote = 3;
|
|
1086
1129
|
|
|
1130
|
+
const ExtensionHostWorker = 44;
|
|
1087
1131
|
const FileSystemWorker = 209;
|
|
1088
1132
|
const RendererWorker = 1;
|
|
1089
1133
|
const SharedProcess = 1;
|
|
1090
1134
|
|
|
1091
1135
|
const rpcs = Object.create(null);
|
|
1092
|
-
const set$
|
|
1136
|
+
const set$6 = (id, rpc) => {
|
|
1093
1137
|
rpcs[id] = rpc;
|
|
1094
1138
|
};
|
|
1095
|
-
const get$
|
|
1139
|
+
const get$2 = id => {
|
|
1096
1140
|
return rpcs[id];
|
|
1097
1141
|
};
|
|
1098
1142
|
|
|
1099
1143
|
const create$1 = rpcId => {
|
|
1100
1144
|
return {
|
|
1101
1145
|
async dispose() {
|
|
1102
|
-
const rpc = get$
|
|
1146
|
+
const rpc = get$2(rpcId);
|
|
1103
1147
|
await rpc.dispose();
|
|
1104
1148
|
},
|
|
1105
1149
|
// @ts-ignore
|
|
1106
1150
|
invoke(method, ...params) {
|
|
1107
|
-
const rpc = get$
|
|
1151
|
+
const rpc = get$2(rpcId);
|
|
1108
1152
|
// @ts-ignore
|
|
1109
1153
|
return rpc.invoke(method, ...params);
|
|
1110
1154
|
},
|
|
1111
1155
|
// @ts-ignore
|
|
1112
1156
|
invokeAndTransfer(method, ...params) {
|
|
1113
|
-
const rpc = get$
|
|
1157
|
+
const rpc = get$2(rpcId);
|
|
1114
1158
|
// @ts-ignore
|
|
1115
1159
|
return rpc.invokeAndTransfer(method, ...params);
|
|
1116
1160
|
},
|
|
1117
1161
|
set(rpc) {
|
|
1118
|
-
set$
|
|
1162
|
+
set$6(rpcId, rpc);
|
|
1119
1163
|
}
|
|
1120
1164
|
};
|
|
1121
1165
|
};
|
|
1122
1166
|
|
|
1167
|
+
const {
|
|
1168
|
+
invoke: invoke$3,
|
|
1169
|
+
set: set$5
|
|
1170
|
+
} = create$1(ExtensionHostWorker);
|
|
1171
|
+
|
|
1123
1172
|
const {
|
|
1124
1173
|
invoke: invoke$2,
|
|
1125
|
-
set: set$
|
|
1174
|
+
set: set$4
|
|
1126
1175
|
} = create$1(FileSystemWorker);
|
|
1127
1176
|
const readFile = async uri => {
|
|
1128
1177
|
return invoke$2('FileSystem.readFile', uri);
|
|
@@ -1138,26 +1187,26 @@ const exists = async uri => {
|
|
|
1138
1187
|
const {
|
|
1139
1188
|
invoke: invoke$1,
|
|
1140
1189
|
invokeAndTransfer,
|
|
1141
|
-
set: set$
|
|
1190
|
+
set: set$3
|
|
1142
1191
|
} = create$1(RendererWorker);
|
|
1143
1192
|
const sendMessagePortToFileSystemWorker = async (port, rpcId) => {
|
|
1144
1193
|
const command = 'FileSystem.handleMessagePort';
|
|
1145
1194
|
// @ts-ignore
|
|
1146
1195
|
await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSystemWorker', port, command, rpcId);
|
|
1147
1196
|
};
|
|
1197
|
+
const sendMessagePortToExtensionHostWorker = async (port, rpcId = 0) => {
|
|
1198
|
+
const command = 'HandleMessagePort.handleMessagePort2';
|
|
1199
|
+
await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToExtensionHostWorker', port, command, rpcId);
|
|
1200
|
+
};
|
|
1148
1201
|
const sendMessagePortToSharedProcess = async port => {
|
|
1149
1202
|
const command = 'HandleElectronMessagePort.handleElectronMessagePort';
|
|
1150
1203
|
// @ts-ignore
|
|
1151
1204
|
await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToSharedProcess', port, command, 0);
|
|
1152
1205
|
};
|
|
1153
|
-
const getExtension$1 = async id => {
|
|
1154
|
-
// @ts-ignore
|
|
1155
|
-
return invoke$1('ExtensionManagement.getExtension', id);
|
|
1156
|
-
};
|
|
1157
1206
|
|
|
1158
1207
|
const {
|
|
1159
1208
|
invoke,
|
|
1160
|
-
set: set$
|
|
1209
|
+
set: set$2
|
|
1161
1210
|
} = create$1(SharedProcess);
|
|
1162
1211
|
|
|
1163
1212
|
const create = () => {
|
|
@@ -1203,6 +1252,12 @@ const isImportError = error => {
|
|
|
1203
1252
|
};
|
|
1204
1253
|
|
|
1205
1254
|
const states = Object.create(null);
|
|
1255
|
+
const set$1 = status => {
|
|
1256
|
+
states[status.id] = status;
|
|
1257
|
+
};
|
|
1258
|
+
const get$1 = extensionId => {
|
|
1259
|
+
return states[extensionId];
|
|
1260
|
+
};
|
|
1206
1261
|
const update$1 = (id, update) => {
|
|
1207
1262
|
states[id] = {
|
|
1208
1263
|
...states[id],
|
|
@@ -1210,6 +1265,8 @@ const update$1 = (id, update) => {
|
|
|
1210
1265
|
};
|
|
1211
1266
|
};
|
|
1212
1267
|
|
|
1268
|
+
const None = 0;
|
|
1269
|
+
const Importing = 1;
|
|
1213
1270
|
const Activating = 2;
|
|
1214
1271
|
const Activated = 3;
|
|
1215
1272
|
const Error$1 = 4;
|
|
@@ -1253,7 +1310,9 @@ const rejectAfterTimeout = async (timeout, token) => {
|
|
|
1253
1310
|
}
|
|
1254
1311
|
throw new Error(`Activation timeout of ${timeout}ms exceeded`);
|
|
1255
1312
|
};
|
|
1256
|
-
const activate = async extension => {
|
|
1313
|
+
const activate = async (extensionId, extension) => {
|
|
1314
|
+
await invoke$3('ExtensionHost.activateExtension3', extensionId, extension);
|
|
1315
|
+
};
|
|
1257
1316
|
const activateExtension2 = async (extensionId, extension, absolutePath) => {
|
|
1258
1317
|
const token = create();
|
|
1259
1318
|
try {
|
|
@@ -1262,7 +1321,7 @@ const activateExtension2 = async (extensionId, extension, absolutePath) => {
|
|
|
1262
1321
|
activationStartTime: startTime,
|
|
1263
1322
|
status: Activating
|
|
1264
1323
|
});
|
|
1265
|
-
await Promise.race([activate(extension), rejectAfterTimeout(activationTimeout, token)]);
|
|
1324
|
+
await Promise.race([activate(extensionId, extension), rejectAfterTimeout(activationTimeout, token)]);
|
|
1266
1325
|
const endTime = performance.now();
|
|
1267
1326
|
const time = endTime - startTime;
|
|
1268
1327
|
update$1(extensionId, {
|
|
@@ -1285,6 +1344,58 @@ const activateExtension2 = async (extensionId, extension, absolutePath) => {
|
|
|
1285
1344
|
}
|
|
1286
1345
|
};
|
|
1287
1346
|
|
|
1347
|
+
const cache = Object.create(null);
|
|
1348
|
+
const id = 1;
|
|
1349
|
+
const clear = () => {
|
|
1350
|
+
delete cache[id];
|
|
1351
|
+
};
|
|
1352
|
+
|
|
1353
|
+
const getJson = async url => {
|
|
1354
|
+
try {
|
|
1355
|
+
const response = await fetch(url);
|
|
1356
|
+
if (!response.ok) {
|
|
1357
|
+
throw new Error(response.statusText);
|
|
1358
|
+
}
|
|
1359
|
+
const json = await response.json();
|
|
1360
|
+
return json;
|
|
1361
|
+
} catch (error) {
|
|
1362
|
+
throw new VError(error, `Failed to get json`);
|
|
1363
|
+
}
|
|
1364
|
+
};
|
|
1365
|
+
|
|
1366
|
+
const Slash = '/';
|
|
1367
|
+
|
|
1368
|
+
const interExtensionId = path => {
|
|
1369
|
+
const slashIndex = path.lastIndexOf(Slash);
|
|
1370
|
+
return path.slice(slashIndex + 1);
|
|
1371
|
+
};
|
|
1372
|
+
|
|
1373
|
+
const getWebExtensionManifest = async (path, manifestPath) => {
|
|
1374
|
+
try {
|
|
1375
|
+
const manifest = await getJson(manifestPath);
|
|
1376
|
+
return {
|
|
1377
|
+
...manifest,
|
|
1378
|
+
path,
|
|
1379
|
+
uri: path
|
|
1380
|
+
};
|
|
1381
|
+
} catch (error) {
|
|
1382
|
+
const id = interExtensionId(path);
|
|
1383
|
+
throw new VError(error, `Failed to load extension manifest for ${id}`);
|
|
1384
|
+
}
|
|
1385
|
+
};
|
|
1386
|
+
|
|
1387
|
+
const getWebManifestPath = path => {
|
|
1388
|
+
const manifestPath = `${path}/extension.json`;
|
|
1389
|
+
return manifestPath;
|
|
1390
|
+
};
|
|
1391
|
+
|
|
1392
|
+
const addWebExtension = async path => {
|
|
1393
|
+
const manifestPath = getWebManifestPath(path);
|
|
1394
|
+
const manifest = await getWebExtensionManifest(path, manifestPath);
|
|
1395
|
+
clear();
|
|
1396
|
+
return manifest;
|
|
1397
|
+
};
|
|
1398
|
+
|
|
1288
1399
|
const invalidateExtensionsCache = async () => {
|
|
1289
1400
|
await invoke$1('ExtensionManagement.invalidateExtensionsCache');
|
|
1290
1401
|
};
|
|
@@ -1357,18 +1468,37 @@ const enableExtension = async (id, isTest) => {
|
|
|
1357
1468
|
return undefined;
|
|
1358
1469
|
};
|
|
1359
1470
|
|
|
1360
|
-
const getExtension = async id => {
|
|
1361
|
-
// TODO
|
|
1362
|
-
const extension = await getExtension$1(id);
|
|
1363
|
-
return extension;
|
|
1364
|
-
};
|
|
1365
|
-
|
|
1366
1471
|
const getAllExtensions = async () => {
|
|
1367
1472
|
const state = get();
|
|
1368
1473
|
if (state.platform === Web) {
|
|
1369
1474
|
return [];
|
|
1370
1475
|
}
|
|
1371
|
-
return invoke(
|
|
1476
|
+
return invoke('ExtensionManagement.getAllExtensions');
|
|
1477
|
+
};
|
|
1478
|
+
|
|
1479
|
+
const getExtension = async id => {
|
|
1480
|
+
const allExtensions = await getAllExtensions();
|
|
1481
|
+
for (const extension of allExtensions) {
|
|
1482
|
+
if (extension.id === id) {
|
|
1483
|
+
return extension;
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
return undefined;
|
|
1487
|
+
};
|
|
1488
|
+
|
|
1489
|
+
const emptyStatus = {
|
|
1490
|
+
activationEndTime: 0,
|
|
1491
|
+
activationEvent: '',
|
|
1492
|
+
activationStartTime: 0,
|
|
1493
|
+
activationTime: 0,
|
|
1494
|
+
id: '',
|
|
1495
|
+
importEndTime: 0,
|
|
1496
|
+
importStartTime: 0,
|
|
1497
|
+
importTime: 0,
|
|
1498
|
+
status: None
|
|
1499
|
+
};
|
|
1500
|
+
const getRuntimeStatus = extensionId => {
|
|
1501
|
+
return get$1(extensionId) || emptyStatus;
|
|
1372
1502
|
};
|
|
1373
1503
|
|
|
1374
1504
|
const commandMapRef = {};
|
|
@@ -1380,6 +1510,54 @@ const handleMessagePort = async port => {
|
|
|
1380
1510
|
});
|
|
1381
1511
|
};
|
|
1382
1512
|
|
|
1513
|
+
const importExtension = async (extensionId, absolutePath, activationEvent) => {
|
|
1514
|
+
try {
|
|
1515
|
+
string(absolutePath);
|
|
1516
|
+
const startTime = performance.now();
|
|
1517
|
+
set$1({
|
|
1518
|
+
activationEndTime: 0,
|
|
1519
|
+
activationEvent: activationEvent,
|
|
1520
|
+
activationStartTime: performance.now(),
|
|
1521
|
+
activationTime: 0,
|
|
1522
|
+
id: extensionId,
|
|
1523
|
+
importEndTime: 0,
|
|
1524
|
+
importStartTime: startTime,
|
|
1525
|
+
importTime: 0,
|
|
1526
|
+
status: Importing
|
|
1527
|
+
});
|
|
1528
|
+
try {
|
|
1529
|
+
await invoke$3('ExtneionHost.importExtension2', extensionId, absolutePath);
|
|
1530
|
+
const endTime = performance.now();
|
|
1531
|
+
const time = endTime - startTime;
|
|
1532
|
+
update$1(extensionId, {
|
|
1533
|
+
importEndTime: endTime,
|
|
1534
|
+
importTime: time
|
|
1535
|
+
});
|
|
1536
|
+
} catch (error) {
|
|
1537
|
+
update$1(extensionId, {
|
|
1538
|
+
status: Error$1 // TODO maybe store error also in runtime status state
|
|
1539
|
+
});
|
|
1540
|
+
if (isImportError(error)) {
|
|
1541
|
+
const actualErrorMessage = await tryToGetActualImportErrorMessage(absolutePath, error);
|
|
1542
|
+
throw new Error(actualErrorMessage);
|
|
1543
|
+
}
|
|
1544
|
+
throw error;
|
|
1545
|
+
}
|
|
1546
|
+
} catch (error) {
|
|
1547
|
+
throw new VError(error, `Failed to import extension ${extensionId}`);
|
|
1548
|
+
}
|
|
1549
|
+
};
|
|
1550
|
+
|
|
1551
|
+
const initializeExtensionHostWorker = async () => {
|
|
1552
|
+
const rpc = await TransferMessagePortRpcParent.create({
|
|
1553
|
+
commandMap: commandMapRef,
|
|
1554
|
+
async send(port) {
|
|
1555
|
+
await sendMessagePortToExtensionHostWorker(port, 0);
|
|
1556
|
+
}
|
|
1557
|
+
});
|
|
1558
|
+
set$5(rpc);
|
|
1559
|
+
};
|
|
1560
|
+
|
|
1383
1561
|
const initializeFileSystemWorker = async () => {
|
|
1384
1562
|
const rpc = await TransferMessagePortRpcParent.create({
|
|
1385
1563
|
commandMap: commandMapRef,
|
|
@@ -1387,7 +1565,7 @@ const initializeFileSystemWorker = async () => {
|
|
|
1387
1565
|
await sendMessagePortToFileSystemWorker(port, 0);
|
|
1388
1566
|
}
|
|
1389
1567
|
});
|
|
1390
|
-
set$
|
|
1568
|
+
set$4(rpc);
|
|
1391
1569
|
};
|
|
1392
1570
|
|
|
1393
1571
|
const getRpc = async platform => {
|
|
@@ -1413,7 +1591,7 @@ const getRpc = async platform => {
|
|
|
1413
1591
|
const initializeSharedProcess = async platform => {
|
|
1414
1592
|
const rpc = await getRpc(platform);
|
|
1415
1593
|
if (rpc) {
|
|
1416
|
-
set$
|
|
1594
|
+
set$2(rpc);
|
|
1417
1595
|
}
|
|
1418
1596
|
};
|
|
1419
1597
|
|
|
@@ -1421,7 +1599,7 @@ const initialize = async platform => {
|
|
|
1421
1599
|
update({
|
|
1422
1600
|
platform
|
|
1423
1601
|
});
|
|
1424
|
-
await Promise.all([initializeFileSystemWorker(), initializeSharedProcess(platform)]);
|
|
1602
|
+
await Promise.all([initializeFileSystemWorker(), initializeSharedProcess(platform), initializeExtensionHostWorker()]);
|
|
1425
1603
|
};
|
|
1426
1604
|
|
|
1427
1605
|
const installExtension = async () => {
|
|
@@ -1434,11 +1612,14 @@ const uninstallExtension = async () => {
|
|
|
1434
1612
|
|
|
1435
1613
|
const commandMap = {
|
|
1436
1614
|
'Extensions.activate2': activateExtension2,
|
|
1615
|
+
'Extensions.addWebExtension': addWebExtension,
|
|
1437
1616
|
'Extensions.disable': disableExtension,
|
|
1438
1617
|
'Extensions.enable': enableExtension,
|
|
1439
1618
|
'Extensions.getAllExtensions': getAllExtensions,
|
|
1440
1619
|
'Extensions.getExtension': getExtension,
|
|
1620
|
+
'Extensions.getRuntimeStatus': getRuntimeStatus,
|
|
1441
1621
|
'Extensions.handleMessagePort': handleMessagePort,
|
|
1622
|
+
'Extensions.importExtension': importExtension,
|
|
1442
1623
|
'Extensions.initialize': initialize,
|
|
1443
1624
|
'Extensions.install': installExtension,
|
|
1444
1625
|
'Extensions.uninstall': uninstallExtension
|
|
@@ -1449,7 +1630,7 @@ const listen = async () => {
|
|
|
1449
1630
|
const rpc = await WebWorkerRpcClient.create({
|
|
1450
1631
|
commandMap: commandMap
|
|
1451
1632
|
});
|
|
1452
|
-
set$
|
|
1633
|
+
set$3(rpc);
|
|
1453
1634
|
};
|
|
1454
1635
|
|
|
1455
1636
|
const main = async () => {
|