@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$5 = (id, fn) => {
581
+ const set$7 = (id, fn) => {
539
582
  callbacks[id] = fn;
540
583
  };
541
- const get$2 = id => {
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$5(id, resolve);
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$2(id);
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$3 = (ipc, method, ...params) => {
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$3(ipc, method, ...params);
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$4 = (id, rpc) => {
1136
+ const set$6 = (id, rpc) => {
1093
1137
  rpcs[id] = rpc;
1094
1138
  };
1095
- const get$1 = id => {
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$1(rpcId);
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$1(rpcId);
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$1(rpcId);
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$4(rpcId, rpc);
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$3
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$2
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$1
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(/* ExtensionManagement.getAllExtensions */'ExtensionManagement.getAllExtensions');
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$3(rpc);
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$1(rpc);
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$2(rpc);
1633
+ set$3(rpc);
1453
1634
  };
1454
1635
 
1455
1636
  const main = async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/extension-management-worker",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "Webworker for the Extension Management functionality in Lvce Editor.",
5
5
  "keywords": [
6
6
  "web-worker"