@lvce-editor/extension-management-worker 1.6.0 → 1.8.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,10 +1468,28 @@ const enableExtension = async (id, isTest) => {
|
|
|
1357
1468
|
return undefined;
|
|
1358
1469
|
};
|
|
1359
1470
|
|
|
1360
|
-
const
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1471
|
+
const readJson = url => {
|
|
1472
|
+
return invoke$1('FileSystem.readJson', url);
|
|
1473
|
+
};
|
|
1474
|
+
|
|
1475
|
+
const join = (pathSeparator, ...parts) => {
|
|
1476
|
+
return parts.join(pathSeparator);
|
|
1477
|
+
};
|
|
1478
|
+
|
|
1479
|
+
const getColorThemeUri = (extensions, colorThemeId) => {
|
|
1480
|
+
for (const extension of extensions) {
|
|
1481
|
+
if (!extension.colorThemes) {
|
|
1482
|
+
continue;
|
|
1483
|
+
}
|
|
1484
|
+
for (const colorTheme of extension.colorThemes) {
|
|
1485
|
+
if (colorTheme.id !== colorThemeId) {
|
|
1486
|
+
continue;
|
|
1487
|
+
}
|
|
1488
|
+
const absolutePath = join('/', extension.uri, colorTheme.path);
|
|
1489
|
+
return absolutePath;
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1492
|
+
return '';
|
|
1364
1493
|
};
|
|
1365
1494
|
|
|
1366
1495
|
const getAllExtensions = async () => {
|
|
@@ -1368,7 +1497,80 @@ const getAllExtensions = async () => {
|
|
|
1368
1497
|
if (state.platform === Web) {
|
|
1369
1498
|
return [];
|
|
1370
1499
|
}
|
|
1371
|
-
return invoke(
|
|
1500
|
+
return invoke('ExtensionManagement.getAllExtensions');
|
|
1501
|
+
};
|
|
1502
|
+
|
|
1503
|
+
const getColorThemeJson$2 = async colorThemeId => {
|
|
1504
|
+
const extensions = await getAllExtensions();
|
|
1505
|
+
const colorThemeUri = getColorThemeUri(extensions, colorThemeId);
|
|
1506
|
+
if (!colorThemeUri) {
|
|
1507
|
+
return {};
|
|
1508
|
+
}
|
|
1509
|
+
const json = await readJson(colorThemeUri);
|
|
1510
|
+
return json;
|
|
1511
|
+
};
|
|
1512
|
+
|
|
1513
|
+
const assetDir = '';
|
|
1514
|
+
|
|
1515
|
+
const getColorThemeUrlWeb = colorThemeId => {
|
|
1516
|
+
return `${assetDir}/extensions/builtin.theme-${colorThemeId}/color-theme.json`;
|
|
1517
|
+
};
|
|
1518
|
+
const getColorThemeJson$1 = colorThemeId => {
|
|
1519
|
+
const url = getColorThemeUrlWeb(colorThemeId);
|
|
1520
|
+
// TODO handle error ?
|
|
1521
|
+
return getJson(url);
|
|
1522
|
+
};
|
|
1523
|
+
|
|
1524
|
+
const getColorThemeJson = (colorThemeId, platform) => {
|
|
1525
|
+
if (platform === Web) {
|
|
1526
|
+
return getColorThemeJson$1(colorThemeId);
|
|
1527
|
+
}
|
|
1528
|
+
return getColorThemeJson$2(colorThemeId);
|
|
1529
|
+
};
|
|
1530
|
+
|
|
1531
|
+
const getExtensionColorThemeNames = extension => {
|
|
1532
|
+
return extension.colorThemes || [];
|
|
1533
|
+
};
|
|
1534
|
+
const getColorThemeId = colorTheme => {
|
|
1535
|
+
return colorTheme.id;
|
|
1536
|
+
};
|
|
1537
|
+
|
|
1538
|
+
// TODO should send names to renderer worker or names with ids?
|
|
1539
|
+
const getColorThemeNamesFromExtensions = async extensions => {
|
|
1540
|
+
const colorThemes = extensions.flatMap(getExtensionColorThemeNames);
|
|
1541
|
+
const colorThemeNames = colorThemes.map(getColorThemeId);
|
|
1542
|
+
return colorThemeNames;
|
|
1543
|
+
};
|
|
1544
|
+
|
|
1545
|
+
const getColorThemeNames = async () => {
|
|
1546
|
+
const extensions = await getAllExtensions();
|
|
1547
|
+
const colorThemeNames = getColorThemeNamesFromExtensions(extensions);
|
|
1548
|
+
return colorThemeNames;
|
|
1549
|
+
};
|
|
1550
|
+
|
|
1551
|
+
const getExtension = async id => {
|
|
1552
|
+
const allExtensions = await getAllExtensions();
|
|
1553
|
+
for (const extension of allExtensions) {
|
|
1554
|
+
if (extension.id === id) {
|
|
1555
|
+
return extension;
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
return undefined;
|
|
1559
|
+
};
|
|
1560
|
+
|
|
1561
|
+
const emptyStatus = {
|
|
1562
|
+
activationEndTime: 0,
|
|
1563
|
+
activationEvent: '',
|
|
1564
|
+
activationStartTime: 0,
|
|
1565
|
+
activationTime: 0,
|
|
1566
|
+
id: '',
|
|
1567
|
+
importEndTime: 0,
|
|
1568
|
+
importStartTime: 0,
|
|
1569
|
+
importTime: 0,
|
|
1570
|
+
status: None
|
|
1571
|
+
};
|
|
1572
|
+
const getRuntimeStatus = extensionId => {
|
|
1573
|
+
return get$1(extensionId) || emptyStatus;
|
|
1372
1574
|
};
|
|
1373
1575
|
|
|
1374
1576
|
const commandMapRef = {};
|
|
@@ -1380,6 +1582,54 @@ const handleMessagePort = async port => {
|
|
|
1380
1582
|
});
|
|
1381
1583
|
};
|
|
1382
1584
|
|
|
1585
|
+
const importExtension = async (extensionId, absolutePath, activationEvent) => {
|
|
1586
|
+
try {
|
|
1587
|
+
string(absolutePath);
|
|
1588
|
+
const startTime = performance.now();
|
|
1589
|
+
set$1({
|
|
1590
|
+
activationEndTime: 0,
|
|
1591
|
+
activationEvent: activationEvent,
|
|
1592
|
+
activationStartTime: performance.now(),
|
|
1593
|
+
activationTime: 0,
|
|
1594
|
+
id: extensionId,
|
|
1595
|
+
importEndTime: 0,
|
|
1596
|
+
importStartTime: startTime,
|
|
1597
|
+
importTime: 0,
|
|
1598
|
+
status: Importing
|
|
1599
|
+
});
|
|
1600
|
+
try {
|
|
1601
|
+
await invoke$3('ExtneionHost.importExtension2', extensionId, absolutePath);
|
|
1602
|
+
const endTime = performance.now();
|
|
1603
|
+
const time = endTime - startTime;
|
|
1604
|
+
update$1(extensionId, {
|
|
1605
|
+
importEndTime: endTime,
|
|
1606
|
+
importTime: time
|
|
1607
|
+
});
|
|
1608
|
+
} catch (error) {
|
|
1609
|
+
update$1(extensionId, {
|
|
1610
|
+
status: Error$1 // TODO maybe store error also in runtime status state
|
|
1611
|
+
});
|
|
1612
|
+
if (isImportError(error)) {
|
|
1613
|
+
const actualErrorMessage = await tryToGetActualImportErrorMessage(absolutePath, error);
|
|
1614
|
+
throw new Error(actualErrorMessage);
|
|
1615
|
+
}
|
|
1616
|
+
throw error;
|
|
1617
|
+
}
|
|
1618
|
+
} catch (error) {
|
|
1619
|
+
throw new VError(error, `Failed to import extension ${extensionId}`);
|
|
1620
|
+
}
|
|
1621
|
+
};
|
|
1622
|
+
|
|
1623
|
+
const initializeExtensionHostWorker = async () => {
|
|
1624
|
+
const rpc = await TransferMessagePortRpcParent.create({
|
|
1625
|
+
commandMap: commandMapRef,
|
|
1626
|
+
async send(port) {
|
|
1627
|
+
await sendMessagePortToExtensionHostWorker(port, 0);
|
|
1628
|
+
}
|
|
1629
|
+
});
|
|
1630
|
+
set$5(rpc);
|
|
1631
|
+
};
|
|
1632
|
+
|
|
1383
1633
|
const initializeFileSystemWorker = async () => {
|
|
1384
1634
|
const rpc = await TransferMessagePortRpcParent.create({
|
|
1385
1635
|
commandMap: commandMapRef,
|
|
@@ -1387,7 +1637,7 @@ const initializeFileSystemWorker = async () => {
|
|
|
1387
1637
|
await sendMessagePortToFileSystemWorker(port, 0);
|
|
1388
1638
|
}
|
|
1389
1639
|
});
|
|
1390
|
-
set$
|
|
1640
|
+
set$4(rpc);
|
|
1391
1641
|
};
|
|
1392
1642
|
|
|
1393
1643
|
const getRpc = async platform => {
|
|
@@ -1413,7 +1663,7 @@ const getRpc = async platform => {
|
|
|
1413
1663
|
const initializeSharedProcess = async platform => {
|
|
1414
1664
|
const rpc = await getRpc(platform);
|
|
1415
1665
|
if (rpc) {
|
|
1416
|
-
set$
|
|
1666
|
+
set$2(rpc);
|
|
1417
1667
|
}
|
|
1418
1668
|
};
|
|
1419
1669
|
|
|
@@ -1421,26 +1671,77 @@ const initialize = async platform => {
|
|
|
1421
1671
|
update({
|
|
1422
1672
|
platform
|
|
1423
1673
|
});
|
|
1424
|
-
await Promise.all([initializeFileSystemWorker(), initializeSharedProcess(platform)]);
|
|
1674
|
+
await Promise.all([initializeFileSystemWorker(), initializeSharedProcess(platform), initializeExtensionHostWorker()]);
|
|
1425
1675
|
};
|
|
1426
1676
|
|
|
1427
1677
|
const installExtension = async () => {
|
|
1428
1678
|
// TODO
|
|
1429
1679
|
};
|
|
1430
1680
|
|
|
1681
|
+
const getLanguagesFromExtension = extension => {
|
|
1682
|
+
// TODO what if extension is null? should not crash process, handle error gracefully
|
|
1683
|
+
// TODO what if extension languages is not of type array?
|
|
1684
|
+
// TODO what if language is null?
|
|
1685
|
+
if (!extension) {
|
|
1686
|
+
return [];
|
|
1687
|
+
}
|
|
1688
|
+
if (!extension.languages) {
|
|
1689
|
+
return [];
|
|
1690
|
+
}
|
|
1691
|
+
const extensionPath = extension.path;
|
|
1692
|
+
const getLanguageFromExtension = language => {
|
|
1693
|
+
if (language.tokenize) {
|
|
1694
|
+
if (typeof language.tokenize !== 'string') {
|
|
1695
|
+
console.warn(`[info] ${language.id}: language.tokenize must be of type string but was of type ${typeof language.tokenize}`);
|
|
1696
|
+
return {
|
|
1697
|
+
...language,
|
|
1698
|
+
extensionPath,
|
|
1699
|
+
tokenize: ''
|
|
1700
|
+
};
|
|
1701
|
+
}
|
|
1702
|
+
const relativePath = `${extensionPath}/${language.tokenize}`;
|
|
1703
|
+
const absolutePath = relativePath ;
|
|
1704
|
+
return {
|
|
1705
|
+
...language,
|
|
1706
|
+
extensionPath,
|
|
1707
|
+
tokenize: absolutePath
|
|
1708
|
+
};
|
|
1709
|
+
}
|
|
1710
|
+
return language;
|
|
1711
|
+
};
|
|
1712
|
+
return extension.languages.map(getLanguageFromExtension);
|
|
1713
|
+
};
|
|
1714
|
+
|
|
1715
|
+
const getLanguages = async () => {
|
|
1716
|
+
try {
|
|
1717
|
+
const extensions = await getAllExtensions();
|
|
1718
|
+
const languages = extensions.flatMap(getLanguagesFromExtension);
|
|
1719
|
+
return languages;
|
|
1720
|
+
} catch (error) {
|
|
1721
|
+
throw new VError(error, 'Failed to load languages');
|
|
1722
|
+
}
|
|
1723
|
+
};
|
|
1724
|
+
|
|
1431
1725
|
const uninstallExtension = async () => {
|
|
1432
1726
|
// TODO
|
|
1433
1727
|
};
|
|
1434
1728
|
|
|
1435
1729
|
const commandMap = {
|
|
1436
1730
|
'Extensions.activate2': activateExtension2,
|
|
1731
|
+
'Extensions.addWebExtension': addWebExtension,
|
|
1437
1732
|
'Extensions.disable': disableExtension,
|
|
1438
1733
|
'Extensions.enable': enableExtension,
|
|
1439
1734
|
'Extensions.getAllExtensions': getAllExtensions,
|
|
1735
|
+
'Extensions.getColorThemeJson': getColorThemeJson,
|
|
1736
|
+
'Extensions.getColorThemeNames': getColorThemeNames,
|
|
1440
1737
|
'Extensions.getExtension': getExtension,
|
|
1738
|
+
'Extensions.getLanguages': getLanguages,
|
|
1739
|
+
'Extensions.getRuntimeStatus': getRuntimeStatus,
|
|
1441
1740
|
'Extensions.handleMessagePort': handleMessagePort,
|
|
1741
|
+
'Extensions.importExtension': importExtension,
|
|
1442
1742
|
'Extensions.initialize': initialize,
|
|
1443
1743
|
'Extensions.install': installExtension,
|
|
1744
|
+
'Extensions.invalidateExtensionsCache': invalidateExtensionsCache,
|
|
1444
1745
|
'Extensions.uninstall': uninstallExtension
|
|
1445
1746
|
};
|
|
1446
1747
|
|
|
@@ -1449,7 +1750,7 @@ const listen = async () => {
|
|
|
1449
1750
|
const rpc = await WebWorkerRpcClient.create({
|
|
1450
1751
|
commandMap: commandMap
|
|
1451
1752
|
});
|
|
1452
|
-
set$
|
|
1753
|
+
set$3(rpc);
|
|
1453
1754
|
};
|
|
1454
1755
|
|
|
1455
1756
|
const main = async () => {
|