@lvce-editor/process-explorer-worker 3.12.0 → 3.13.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.
Files changed (2) hide show
  1. package/index.js +529 -396
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -235,12 +235,12 @@ const collapseAll = state => {
235
235
  };
236
236
 
237
237
  const {
238
- dispose: dispose$4,
238
+ dispose: dispose$5,
239
239
  get: get$2,
240
240
  getCommandIds,
241
241
  getKeys: getKeys$1,
242
242
  registerCommands,
243
- set: set$6,
243
+ set: set$7,
244
244
  wrapCommand,
245
245
  wrapGetter,
246
246
  wrapLoadContent
@@ -289,7 +289,7 @@ const create$d = (id, _uri, x, y, width, height, args, parentUid, platform = 0,
289
289
  x,
290
290
  y
291
291
  };
292
- set$6(state.uid, state, state);
292
+ set$7(state.uid, state, state);
293
293
  return state;
294
294
  };
295
295
 
@@ -944,7 +944,10 @@ const constructError = (message, type, name) => {
944
944
  if (ErrorConstructor === Error) {
945
945
  const error = new Error(message);
946
946
  if (name && name !== 'VError') {
947
- error.name = name;
947
+ Object.defineProperty(error, 'name', {
948
+ configurable: true,
949
+ value: name
950
+ });
948
951
  }
949
952
  return error;
950
953
  }
@@ -975,31 +978,45 @@ const getParentStack = error => {
975
978
  };
976
979
  const MethodNotFound = -32601;
977
980
  const Custom = -32001;
981
+ const setStack = (error, stack) => {
982
+ const descriptor = Object.getOwnPropertyDescriptor(error, 'stack');
983
+ if (descriptor) {
984
+ if (!descriptor.configurable && !descriptor.writable) {
985
+ return;
986
+ }
987
+ if (!descriptor.configurable && descriptor.writable) {
988
+ error.stack = stack;
989
+ return;
990
+ }
991
+ }
992
+ Object.defineProperty(error, 'stack', {
993
+ configurable: true,
994
+ value: stack,
995
+ writable: true
996
+ });
997
+ };
978
998
  const restoreExistingError = (error, currentStack) => {
979
999
  if (typeof error.stack === 'string') {
980
- error.stack = error.stack + NewLine + currentStack;
1000
+ setStack(error, `${error.stack}${NewLine}${currentStack}`);
981
1001
  }
982
1002
  return error;
983
1003
  };
984
1004
  const restoreMethodNotFoundError = (error, currentStack) => {
985
1005
  const restoredError = new JsonRpcError(error.message);
986
1006
  const parentStack = getParentStack(error);
987
- restoredError.stack = parentStack + NewLine + currentStack;
1007
+ setStack(restoredError, `${parentStack}${NewLine}${currentStack}`);
988
1008
  return restoredError;
989
1009
  };
990
1010
  const restoreStackFromData = (restoredError, error, currentStack) => {
991
1011
  if (error.data.stack && error.data.type && error.message) {
992
- restoredError.stack = error.data.type + ': ' + error.message + NewLine + error.data.stack + NewLine + currentStack;
1012
+ setStack(restoredError, `${error.data.type}: ${error.message}${NewLine}${error.data.stack}${NewLine}${currentStack}`);
993
1013
  return;
994
1014
  }
995
1015
  if (error.data.stack) {
996
- restoredError.stack = error.data.stack;
1016
+ setStack(restoredError, error.data.stack);
997
1017
  }
998
1018
  };
999
1019
  const applyDataProperties = (restoredError, error) => {
1000
- if (!error.data) {
1001
- return;
1002
- }
1003
1020
  restoreStackFromData(restoredError, error, getCurrentStack());
1004
1021
  if (error.data.codeFrame) {
1005
1022
  // @ts-ignore
@@ -1020,7 +1037,7 @@ const applyDirectProperties = (restoredError, error) => {
1020
1037
  const indexNewLine = getNewLineIndex(lowerStack);
1021
1038
  const parentStack = getParentStack(error);
1022
1039
  // @ts-ignore
1023
- restoredError.stack = parentStack + lowerStack.slice(indexNewLine);
1040
+ setStack(restoredError, `${parentStack}${lowerStack.slice(indexNewLine)}`);
1024
1041
  }
1025
1042
  if (error.codeFrame) {
1026
1043
  // @ts-ignore
@@ -1230,280 +1247,6 @@ const handleJsonRpcMessage = async (...args) => {
1230
1247
  throw new JsonRpcError('unexpected message');
1231
1248
  };
1232
1249
 
1233
- const Two = '2.0';
1234
-
1235
- const create$a = (method, params) => {
1236
- return {
1237
- jsonrpc: Two,
1238
- method,
1239
- params
1240
- };
1241
- };
1242
-
1243
- const create$9 = (id, method, params) => {
1244
- const message = {
1245
- id,
1246
- jsonrpc: Two,
1247
- method,
1248
- params
1249
- };
1250
- return message;
1251
- };
1252
-
1253
- let id = 0;
1254
- const create$8 = () => {
1255
- return ++id;
1256
- };
1257
-
1258
- const registerPromise = map => {
1259
- const id = create$8();
1260
- const {
1261
- promise,
1262
- resolve
1263
- } = Promise.withResolvers();
1264
- map[id] = resolve;
1265
- return {
1266
- id,
1267
- promise
1268
- };
1269
- };
1270
-
1271
- const invokeHelper = async (callbacks, ipc, method, params, useSendAndTransfer) => {
1272
- const {
1273
- id,
1274
- promise
1275
- } = registerPromise(callbacks);
1276
- const message = create$9(id, method, params);
1277
- if (useSendAndTransfer && ipc.sendAndTransfer) {
1278
- ipc.sendAndTransfer(message);
1279
- } else {
1280
- ipc.send(message);
1281
- }
1282
- const responseMessage = await promise;
1283
- return unwrapJsonRpcResult(responseMessage);
1284
- };
1285
- const createRpc = ipc => {
1286
- const callbacks = Object.create(null);
1287
- ipc._resolve = (id, response) => {
1288
- const fn = callbacks[id];
1289
- if (!fn) {
1290
- console.warn(`callback ${id} may already be disposed`);
1291
- return;
1292
- }
1293
- fn(response);
1294
- delete callbacks[id];
1295
- };
1296
- const rpc = {
1297
- async dispose() {
1298
- await ipc?.dispose();
1299
- },
1300
- invoke(method, ...params) {
1301
- return invokeHelper(callbacks, ipc, method, params, false);
1302
- },
1303
- invokeAndTransfer(method, ...params) {
1304
- return invokeHelper(callbacks, ipc, method, params, true);
1305
- },
1306
- // @ts-ignore
1307
- ipc,
1308
- /**
1309
- * @deprecated
1310
- */
1311
- send(method, ...params) {
1312
- const message = create$a(method, params);
1313
- ipc.send(message);
1314
- }
1315
- };
1316
- return rpc;
1317
- };
1318
-
1319
- const requiresSocket = () => {
1320
- return false;
1321
- };
1322
- const preparePrettyError = error => {
1323
- return error;
1324
- };
1325
- const logError = () => {
1326
- // handled by renderer worker
1327
- };
1328
- const handleMessage = event => {
1329
- const actualRequiresSocket = event?.target?.requiresSocket || requiresSocket;
1330
- const actualExecute = event?.target?.execute || execute;
1331
- return handleJsonRpcMessage(event.target, event.data, actualExecute, event.target._resolve, preparePrettyError, logError, actualRequiresSocket);
1332
- };
1333
-
1334
- const handleIpc = ipc => {
1335
- if ('addEventListener' in ipc) {
1336
- ipc.addEventListener('message', handleMessage);
1337
- } else if ('on' in ipc) {
1338
- // deprecated
1339
- ipc.on('message', handleMessage);
1340
- }
1341
- };
1342
-
1343
- const listen$1 = async (module, options) => {
1344
- const rawIpc = await module.listen(options);
1345
- if (module.signal) {
1346
- module.signal(rawIpc);
1347
- }
1348
- const ipc = module.wrap(rawIpc);
1349
- return ipc;
1350
- };
1351
-
1352
- const create$7 = async ({
1353
- commandMap,
1354
- isMessagePortOpen = true,
1355
- messagePort
1356
- }) => {
1357
- // TODO create a commandMap per rpc instance
1358
- register(commandMap);
1359
- const rawIpc = await IpcParentWithMessagePort$1.create({
1360
- isMessagePortOpen,
1361
- messagePort
1362
- });
1363
- const ipc = IpcParentWithMessagePort$1.wrap(rawIpc);
1364
- handleIpc(ipc);
1365
- const rpc = createRpc(ipc);
1366
- messagePort.start();
1367
- return rpc;
1368
- };
1369
-
1370
- const create$6 = async ({
1371
- commandMap,
1372
- isMessagePortOpen,
1373
- send
1374
- }) => {
1375
- const {
1376
- port1,
1377
- port2
1378
- } = new MessageChannel();
1379
- await send(port1);
1380
- return create$7({
1381
- commandMap,
1382
- isMessagePortOpen,
1383
- messagePort: port2
1384
- });
1385
- };
1386
-
1387
- const createSharedLazyRpc = factory => {
1388
- let rpcPromise;
1389
- const getOrCreate = () => {
1390
- if (!rpcPromise) {
1391
- rpcPromise = factory();
1392
- }
1393
- return rpcPromise;
1394
- };
1395
- return {
1396
- async dispose() {
1397
- const rpc = await getOrCreate();
1398
- await rpc.dispose();
1399
- },
1400
- async invoke(method, ...params) {
1401
- const rpc = await getOrCreate();
1402
- return rpc.invoke(method, ...params);
1403
- },
1404
- async invokeAndTransfer(method, ...params) {
1405
- const rpc = await getOrCreate();
1406
- return rpc.invokeAndTransfer(method, ...params);
1407
- },
1408
- async send(method, ...params) {
1409
- const rpc = await getOrCreate();
1410
- rpc.send(method, ...params);
1411
- }
1412
- };
1413
- };
1414
-
1415
- const create$5 = async ({
1416
- commandMap,
1417
- isMessagePortOpen,
1418
- send
1419
- }) => {
1420
- return createSharedLazyRpc(() => {
1421
- return create$6({
1422
- commandMap,
1423
- isMessagePortOpen,
1424
- send
1425
- });
1426
- });
1427
- };
1428
-
1429
- const Https = 'https:';
1430
- const Ws = 'ws:';
1431
- const Wss = 'wss:';
1432
-
1433
- const getWebSocketProtocol = locationProtocol => {
1434
- return locationProtocol === Https ? Wss : Ws;
1435
- };
1436
-
1437
- const getWebSocketUrl = (type, host, locationProtocol) => {
1438
- const wsProtocol = getWebSocketProtocol(locationProtocol);
1439
- return `${wsProtocol}//${host}/websocket/${type}`;
1440
- };
1441
-
1442
- const getHost = () => {
1443
- return location.host;
1444
- };
1445
- const getProtocol = () => {
1446
- return location.protocol;
1447
- };
1448
-
1449
- const create$4 = async ({
1450
- commandMap,
1451
- webSocket
1452
- }) => {
1453
- // TODO create a commandMap per rpc instance
1454
- register(commandMap);
1455
- let rawIpc;
1456
- try {
1457
- rawIpc = await IpcParentWithWebSocket$1.create({
1458
- webSocket
1459
- });
1460
- } catch (error) {
1461
- throw new VError(error, 'Failed to create rpc connection');
1462
- }
1463
- const ipc = IpcParentWithWebSocket$1.wrap(rawIpc);
1464
- handleIpc(ipc);
1465
- const rpc = createRpc(ipc);
1466
- return rpc;
1467
- };
1468
-
1469
- const create$3 = async ({
1470
- commandMap,
1471
- type
1472
- }) => {
1473
- const host = getHost();
1474
- const protocol = getProtocol();
1475
- const wsUrl = getWebSocketUrl(type, host, protocol);
1476
- const webSocket = new WebSocket(wsUrl);
1477
- const rpc = await create$4({
1478
- commandMap,
1479
- webSocket
1480
- });
1481
- return rpc;
1482
- };
1483
-
1484
- const create$2 = async ({
1485
- commandMap,
1486
- type
1487
- }) => {
1488
- return createSharedLazyRpc(() => {
1489
- return create$3({
1490
- commandMap,
1491
- type
1492
- });
1493
- });
1494
- };
1495
-
1496
- const create$1 = async ({
1497
- commandMap
1498
- }) => {
1499
- // TODO create a commandMap per rpc instance
1500
- register(commandMap);
1501
- const ipc = await listen$1(IpcChildWithModuleWorkerAndMessagePort$1);
1502
- handleIpc(ipc);
1503
- const rpc = createRpc(ipc);
1504
- return rpc;
1505
- };
1506
-
1507
1250
  const createMockRpc = ({
1508
1251
  commandMap
1509
1252
  }) => {
@@ -1525,7 +1268,7 @@ const createMockRpc = ({
1525
1268
  };
1526
1269
 
1527
1270
  const rpcs = Object.create(null);
1528
- const set$5 = (id, rpc) => {
1271
+ const set$6 = (id, rpc) => {
1529
1272
  rpcs[id] = rpc;
1530
1273
  };
1531
1274
  const get = id => {
@@ -1536,7 +1279,7 @@ const remove = id => {
1536
1279
  };
1537
1280
 
1538
1281
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
1539
- const create = rpcId => {
1282
+ const create$a = rpcId => {
1540
1283
  return {
1541
1284
  async dispose() {
1542
1285
  const rpc = get(rpcId);
@@ -1558,7 +1301,7 @@ const create = rpcId => {
1558
1301
  const mockRpc = createMockRpc({
1559
1302
  commandMap
1560
1303
  });
1561
- set$5(rpcId, mockRpc);
1304
+ set$6(rpcId, mockRpc);
1562
1305
  // @ts-ignore
1563
1306
  mockRpc[Symbol.dispose] = () => {
1564
1307
  remove(rpcId);
@@ -1567,7 +1310,7 @@ const create = rpcId => {
1567
1310
  return mockRpc;
1568
1311
  },
1569
1312
  set(rpc) {
1570
- set$5(rpcId, rpc);
1313
+ set$6(rpcId, rpc);
1571
1314
  }
1572
1315
  };
1573
1316
  };
@@ -1764,6 +1507,7 @@ const Remote = 3;
1764
1507
 
1765
1508
  const ErrorWorker = 3308;
1766
1509
  const FileSystemWorker$1 = 209;
1510
+ const MainProcess = -5;
1767
1511
  const ProcessExplorerRenderer = 33;
1768
1512
  const RendererWorker = 1;
1769
1513
 
@@ -1776,27 +1520,33 @@ const Empty = 0;
1776
1520
  const FocusExplorer = 13;
1777
1521
 
1778
1522
  const {
1779
- invoke: invoke$2,
1780
- set: set$4
1781
- } = create(ErrorWorker);
1523
+ invoke: invoke$3,
1524
+ set: set$5
1525
+ } = create$a(ErrorWorker);
1782
1526
  const prepare = async error => {
1783
- return invoke$2('Errors.prepare', error);
1527
+ return invoke$3('Errors.prepare', error);
1784
1528
  };
1785
1529
 
1786
1530
  const {
1787
- set: set$3
1788
- } = create(FileSystemWorker$1);
1531
+ set: set$4
1532
+ } = create$a(FileSystemWorker$1);
1789
1533
 
1790
1534
  const FileSystemWorker = {
1791
1535
  __proto__: null,
1792
- set: set$3
1536
+ set: set$4
1793
1537
  };
1794
1538
 
1539
+ const {
1540
+ dispose: dispose$4,
1541
+ invoke: invoke$2,
1542
+ set: set$3
1543
+ } = create$a(MainProcess);
1544
+
1795
1545
  const {
1796
1546
  invoke: invoke$1,
1797
1547
  invokeAndTransfer,
1798
1548
  set: set$2
1799
- } = create(RendererWorker);
1549
+ } = create$a(RendererWorker);
1800
1550
  const showContextMenu2 = async (uid, menuId, x, y, args) => {
1801
1551
  number(uid);
1802
1552
  number(menuId);
@@ -1808,116 +1558,464 @@ const sendMessagePortToErrorWorker$1 = async (port, rpcId) => {
1808
1558
  const command = 'Errors.handleMessagePort';
1809
1559
  await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToErrorWorker', port, command, rpcId);
1810
1560
  };
1811
- const sendMessagePortToFileSystemWorker$1 = async (port, rpcId) => {
1812
- const command = 'FileSystem.handleMessagePort';
1813
- await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSystemWorker', port, command, rpcId);
1561
+ const sendMessagePortToFileSystemWorker$1 = async (port, rpcId) => {
1562
+ const command = 'FileSystem.handleMessagePort';
1563
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSystemWorker', port, command, rpcId);
1564
+ };
1565
+ const sendMessagePortToProcessExplorer$1 = async port => {
1566
+ const command = 'ProcessExplorer.handleMessagePort';
1567
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToProcessExplorer', port, command, 0);
1568
+ };
1569
+
1570
+ const debugProcess = async (state, index = state.focusedIndex) => {
1571
+ const process = state.visibleProcesses[index];
1572
+ if (!process) {
1573
+ return state;
1574
+ }
1575
+ await invoke$1('AttachDebugger.attachDebugger', process.pid);
1576
+ return state;
1577
+ };
1578
+
1579
+ const isEqual$1 = (oldState, newState) => {
1580
+ return oldState.focused === newState.focused && oldState.focusedIndex === newState.focusedIndex;
1581
+ };
1582
+
1583
+ const isEqual = (oldState, newState) => {
1584
+ return oldState.initial === newState.initial && oldState.errorCodeFrame === newState.errorCodeFrame && oldState.errorMessage === newState.errorMessage && oldState.errorStack === newState.errorStack && oldState.focusedIndex === newState.focusedIndex && oldState.visibleProcesses === newState.visibleProcesses;
1585
+ };
1586
+
1587
+ const RenderItems = 1;
1588
+ const RenderFocus = 2;
1589
+ const RenderFocusContext = 3;
1590
+ const RenderIncremental = 4;
1591
+
1592
+ const modules = [isEqual, isEqual$1, isEqual$1];
1593
+ const numbers = [RenderIncremental, RenderFocus, RenderFocusContext];
1594
+
1595
+ const diff = (oldState, newState) => {
1596
+ const diffResult = [];
1597
+ for (let i = 0; i < modules.length; i++) {
1598
+ const fn = modules[i];
1599
+ if (!fn(oldState, newState)) {
1600
+ diffResult.push(numbers[i]);
1601
+ }
1602
+ }
1603
+ return diffResult;
1604
+ };
1605
+
1606
+ const diff2 = uid => {
1607
+ const {
1608
+ oldState,
1609
+ scheduledState
1610
+ } = get$2(uid);
1611
+ return diff(oldState, scheduledState);
1612
+ };
1613
+
1614
+ const intervals = new Map();
1615
+ const pending = new Set();
1616
+ const dispose$3 = uid => {
1617
+ const interval = intervals.get(uid);
1618
+ if (interval) {
1619
+ clearInterval(interval);
1620
+ intervals.delete(uid);
1621
+ }
1622
+ pending.delete(uid);
1623
+ };
1624
+ const update = async uid => {
1625
+ if (!getKeys$1().includes(uid)) {
1626
+ dispose$3(uid);
1627
+ return;
1628
+ }
1629
+ if (pending.has(uid)) {
1630
+ return;
1631
+ }
1632
+ pending.add(uid);
1633
+ try {
1634
+ await invoke$1('ProcessExplorer.update');
1635
+ } catch (error) {
1636
+ console.error(error);
1637
+ } finally {
1638
+ pending.delete(uid);
1639
+ }
1640
+ };
1641
+ const start = (uid, interval = processExplorerUpdateInterval) => {
1642
+ if (interval <= 0 || intervals.has(uid)) {
1643
+ return;
1644
+ }
1645
+ const intervalId = setInterval(() => {
1646
+ void update(uid);
1647
+ }, interval);
1648
+ intervals.set(uid, intervalId);
1649
+ };
1650
+ const restart = (uid, interval) => {
1651
+ dispose$3(uid);
1652
+ start(uid, interval);
1653
+ };
1654
+
1655
+ const processExplorerRpcClosedMessage = 'Process explorer RPC connection was closed';
1656
+ const toProcessExplorerRpcClosedState = state => {
1657
+ return {
1658
+ ...state,
1659
+ errorCodeFrame: '',
1660
+ errorMessage: processExplorerRpcClosedMessage,
1661
+ errorStack: '',
1662
+ initial: false
1663
+ };
1664
+ };
1665
+ const handleProcessExplorerRpcClose = async () => {
1666
+ let didUpdate = false;
1667
+ for (const uid of getKeys$1()) {
1668
+ const viewletState = get$2(uid);
1669
+ if (!viewletState) {
1670
+ continue;
1671
+ }
1672
+ dispose$3(uid);
1673
+ const {
1674
+ oldState,
1675
+ scheduledState
1676
+ } = viewletState;
1677
+ const newState = toProcessExplorerRpcClosedState(scheduledState);
1678
+ set$7(uid, oldState, newState);
1679
+ didUpdate = true;
1680
+ }
1681
+ if (didUpdate) {
1682
+ await invoke$1('ProcessExplorer.rerender');
1683
+ }
1684
+ };
1685
+
1686
+ const Two = '2.0';
1687
+
1688
+ const create$9 = (method, params) => {
1689
+ return {
1690
+ jsonrpc: Two,
1691
+ method,
1692
+ params
1693
+ };
1694
+ };
1695
+
1696
+ const create$8 = (id, method, params) => {
1697
+ const message = {
1698
+ id,
1699
+ jsonrpc: Two,
1700
+ method,
1701
+ params
1702
+ };
1703
+ return message;
1704
+ };
1705
+
1706
+ let id = 0;
1707
+ const create$7 = () => {
1708
+ return ++id;
1709
+ };
1710
+
1711
+ const registerPromise = map => {
1712
+ const id = create$7();
1713
+ const {
1714
+ promise,
1715
+ resolve
1716
+ } = Promise.withResolvers();
1717
+ map[id] = resolve;
1718
+ return {
1719
+ id,
1720
+ promise
1721
+ };
1722
+ };
1723
+
1724
+ const invokeHelper = async (callbacks, ipc, method, params, useSendAndTransfer) => {
1725
+ const {
1726
+ id,
1727
+ promise
1728
+ } = registerPromise(callbacks);
1729
+ const message = create$8(id, method, params);
1730
+ if (useSendAndTransfer && ipc.sendAndTransfer) {
1731
+ ipc.sendAndTransfer(message);
1732
+ } else {
1733
+ ipc.send(message);
1734
+ }
1735
+ const responseMessage = await promise;
1736
+ return unwrapJsonRpcResult(responseMessage);
1737
+ };
1738
+ const createRpc$1 = ipc => {
1739
+ const callbacks = Object.create(null);
1740
+ ipc._resolve = (id, response) => {
1741
+ const fn = callbacks[id];
1742
+ if (!fn) {
1743
+ console.warn(`callback ${id} may already be disposed`);
1744
+ return;
1745
+ }
1746
+ fn(response);
1747
+ delete callbacks[id];
1748
+ };
1749
+ const rpc = {
1750
+ async dispose() {
1751
+ await ipc?.dispose();
1752
+ },
1753
+ invoke(method, ...params) {
1754
+ return invokeHelper(callbacks, ipc, method, params, false);
1755
+ },
1756
+ invokeAndTransfer(method, ...params) {
1757
+ return invokeHelper(callbacks, ipc, method, params, true);
1758
+ },
1759
+ // @ts-ignore
1760
+ ipc,
1761
+ /**
1762
+ * @deprecated
1763
+ */
1764
+ send(method, ...params) {
1765
+ const message = create$9(method, params);
1766
+ ipc.send(message);
1767
+ }
1768
+ };
1769
+ return rpc;
1770
+ };
1771
+
1772
+ const requiresSocket = () => {
1773
+ return false;
1774
+ };
1775
+ const preparePrettyError = error => {
1776
+ return error;
1777
+ };
1778
+ const logError = () => {
1779
+ // handled by renderer worker
1780
+ };
1781
+ const handleMessage = event => {
1782
+ const actualRequiresSocket = event?.target?.requiresSocket || requiresSocket;
1783
+ const actualExecute = event?.target?.execute || execute;
1784
+ return handleJsonRpcMessage(event.target, event.data, actualExecute, event.target._resolve, preparePrettyError, logError, actualRequiresSocket);
1814
1785
  };
1815
1786
 
1816
- const debugProcess = async (state, index = state.focusedIndex) => {
1817
- const process = state.visibleProcesses[index];
1818
- if (!process) {
1819
- return state;
1787
+ const handleIpc = ipc => {
1788
+ if ('addEventListener' in ipc) {
1789
+ ipc.addEventListener('message', handleMessage);
1790
+ } else if ('on' in ipc) {
1791
+ // deprecated
1792
+ ipc.on('message', handleMessage);
1820
1793
  }
1821
- await invoke$1('AttachDebugger.attachDebugger', process.pid);
1822
- return state;
1823
1794
  };
1824
1795
 
1825
- const isEqual$1 = (oldState, newState) => {
1826
- return oldState.focused === newState.focused && oldState.focusedIndex === newState.focusedIndex;
1796
+ const listen$1 = async (module, options) => {
1797
+ const rawIpc = await module.listen(options);
1798
+ if (module.signal) {
1799
+ module.signal(rawIpc);
1800
+ }
1801
+ const ipc = module.wrap(rawIpc);
1802
+ return ipc;
1827
1803
  };
1828
1804
 
1829
- const isEqual = (oldState, newState) => {
1830
- return oldState.initial === newState.initial && oldState.errorCodeFrame === newState.errorCodeFrame && oldState.errorMessage === newState.errorMessage && oldState.errorStack === newState.errorStack && oldState.focusedIndex === newState.focusedIndex && oldState.visibleProcesses === newState.visibleProcesses;
1805
+ const create$6 = async ({
1806
+ commandMap,
1807
+ isMessagePortOpen = true,
1808
+ messagePort
1809
+ }) => {
1810
+ // TODO create a commandMap per rpc instance
1811
+ register(commandMap);
1812
+ const rawIpc = await IpcParentWithMessagePort$1.create({
1813
+ isMessagePortOpen,
1814
+ messagePort
1815
+ });
1816
+ const ipc = IpcParentWithMessagePort$1.wrap(rawIpc);
1817
+ handleIpc(ipc);
1818
+ const rpc = createRpc$1(ipc);
1819
+ messagePort.start();
1820
+ return rpc;
1831
1821
  };
1832
1822
 
1833
- const RenderItems = 1;
1834
- const RenderFocus = 2;
1835
- const RenderFocusContext = 3;
1836
- const RenderIncremental = 4;
1837
-
1838
- const modules = [isEqual, isEqual$1, isEqual$1];
1839
- const numbers = [RenderIncremental, RenderFocus, RenderFocusContext];
1823
+ const create$5 = async ({
1824
+ commandMap,
1825
+ isMessagePortOpen,
1826
+ send
1827
+ }) => {
1828
+ const {
1829
+ port1,
1830
+ port2
1831
+ } = new MessageChannel();
1832
+ await send(port1);
1833
+ return create$6({
1834
+ commandMap,
1835
+ isMessagePortOpen,
1836
+ messagePort: port2
1837
+ });
1838
+ };
1840
1839
 
1841
- const diff = (oldState, newState) => {
1842
- const diffResult = [];
1843
- for (let i = 0; i < modules.length; i++) {
1844
- const fn = modules[i];
1845
- if (!fn(oldState, newState)) {
1846
- diffResult.push(numbers[i]);
1840
+ const createSharedLazyRpc = factory => {
1841
+ let rpcPromise;
1842
+ const getOrCreate = () => {
1843
+ if (!rpcPromise) {
1844
+ rpcPromise = factory();
1847
1845
  }
1848
- }
1849
- return diffResult;
1846
+ return rpcPromise;
1847
+ };
1848
+ return {
1849
+ async dispose() {
1850
+ const rpc = await getOrCreate();
1851
+ await rpc.dispose();
1852
+ },
1853
+ async invoke(method, ...params) {
1854
+ const rpc = await getOrCreate();
1855
+ return rpc.invoke(method, ...params);
1856
+ },
1857
+ async invokeAndTransfer(method, ...params) {
1858
+ const rpc = await getOrCreate();
1859
+ return rpc.invokeAndTransfer(method, ...params);
1860
+ },
1861
+ async send(method, ...params) {
1862
+ const rpc = await getOrCreate();
1863
+ rpc.send(method, ...params);
1864
+ }
1865
+ };
1850
1866
  };
1851
1867
 
1852
- const diff2 = uid => {
1853
- const {
1854
- oldState,
1855
- scheduledState
1856
- } = get$2(uid);
1857
- return diff(oldState, scheduledState);
1868
+ const create$4 = async ({
1869
+ commandMap,
1870
+ isMessagePortOpen,
1871
+ send
1872
+ }) => {
1873
+ return createSharedLazyRpc(() => {
1874
+ return create$5({
1875
+ commandMap,
1876
+ isMessagePortOpen,
1877
+ send
1878
+ });
1879
+ });
1858
1880
  };
1859
1881
 
1860
- const intervals = new Map();
1861
- const pending = new Set();
1862
- const dispose$3 = uid => {
1863
- const interval = intervals.get(uid);
1864
- if (interval) {
1865
- clearInterval(interval);
1866
- intervals.delete(uid);
1867
- }
1868
- pending.delete(uid);
1882
+ const Https = 'https:';
1883
+ const Ws = 'ws:';
1884
+ const Wss = 'wss:';
1885
+
1886
+ const getWebSocketProtocol = locationProtocol => {
1887
+ return locationProtocol === Https ? Wss : Ws;
1869
1888
  };
1870
- const update = async uid => {
1871
- if (!getKeys$1().includes(uid)) {
1872
- dispose$3(uid);
1873
- return;
1874
- }
1875
- if (pending.has(uid)) {
1876
- return;
1877
- }
1878
- pending.add(uid);
1889
+
1890
+ const getWebSocketUrl = (type, host, locationProtocol) => {
1891
+ const wsProtocol = getWebSocketProtocol(locationProtocol);
1892
+ return `${wsProtocol}//${host}/websocket/${type}`;
1893
+ };
1894
+
1895
+ const getHost = () => {
1896
+ return location.host;
1897
+ };
1898
+ const getProtocol = () => {
1899
+ return location.protocol;
1900
+ };
1901
+
1902
+ const create$3 = async ({
1903
+ commandMap,
1904
+ webSocket
1905
+ }) => {
1906
+ // TODO create a commandMap per rpc instance
1907
+ register(commandMap);
1908
+ let rawIpc;
1879
1909
  try {
1880
- await invoke$1('ProcessExplorer.update');
1910
+ rawIpc = await IpcParentWithWebSocket$1.create({
1911
+ webSocket
1912
+ });
1881
1913
  } catch (error) {
1882
- console.error(error);
1883
- } finally {
1884
- pending.delete(uid);
1914
+ throw new VError(error, 'Failed to create rpc connection');
1885
1915
  }
1916
+ const ipc = IpcParentWithWebSocket$1.wrap(rawIpc);
1917
+ handleIpc(ipc);
1918
+ const rpc = createRpc$1(ipc);
1919
+ return rpc;
1886
1920
  };
1887
- const start = (uid, interval = processExplorerUpdateInterval) => {
1888
- if (interval <= 0 || intervals.has(uid)) {
1889
- return;
1921
+
1922
+ const create$2 = async ({
1923
+ commandMap,
1924
+ onClose,
1925
+ type
1926
+ }) => {
1927
+ const host = getHost();
1928
+ const protocol = getProtocol();
1929
+ const wsUrl = getWebSocketUrl(type, host, protocol);
1930
+ const webSocket = new WebSocket(wsUrl);
1931
+ if (onClose) {
1932
+ webSocket.addEventListener('close', onClose, {
1933
+ once: true
1934
+ });
1890
1935
  }
1891
- const intervalId = setInterval(() => {
1892
- void update(uid);
1893
- }, interval);
1894
- intervals.set(uid, intervalId);
1936
+ const rpc = await create$3({
1937
+ commandMap,
1938
+ webSocket
1939
+ });
1940
+ return rpc;
1895
1941
  };
1896
- const restart = (uid, interval) => {
1897
- dispose$3(uid);
1898
- start(uid, interval);
1942
+
1943
+ const create$1 = async ({
1944
+ commandMap,
1945
+ onClose,
1946
+ type
1947
+ }) => {
1948
+ return createSharedLazyRpc(() => {
1949
+ return create$2({
1950
+ commandMap,
1951
+ onClose,
1952
+ type
1953
+ });
1954
+ });
1955
+ };
1956
+
1957
+ const create = async ({
1958
+ commandMap
1959
+ }) => {
1960
+ // TODO create a commandMap per rpc instance
1961
+ register(commandMap);
1962
+ const ipc = await listen$1(IpcChildWithModuleWorkerAndMessagePort$1);
1963
+ handleIpc(ipc);
1964
+ const rpc = createRpc$1(ipc);
1965
+ return rpc;
1899
1966
  };
1900
1967
 
1901
1968
  const sendMessagePortToMainProcess = async port => {
1902
1969
  await invokeAndTransfer('SendMessagePortToMainProcess.sendMessagePortToMainProcess', port, 'HandleElectronMessagePort.handleElectronMessagePort', ProcessExplorerRenderer);
1903
1970
  };
1904
1971
 
1972
+ const sendMessagePortToProcessExplorer = async port => {
1973
+ await sendMessagePortToProcessExplorer$1(port);
1974
+ };
1975
+
1976
+ const createRpc = async send => {
1977
+ return create$4({
1978
+ commandMap: {},
1979
+ send
1980
+ });
1981
+ };
1905
1982
  const launchProcessExplorerElectron = async () => {
1983
+ let processExplorerRpc;
1906
1984
  try {
1907
- const rpc = await create$5({
1908
- commandMap: {},
1909
- send: sendMessagePortToMainProcess
1910
- });
1911
- return rpc;
1985
+ processExplorerRpc = await createRpc(sendMessagePortToProcessExplorer);
1986
+ const mainProcessRpc = await createRpc(sendMessagePortToMainProcess);
1987
+ return {
1988
+ mainProcessRpc,
1989
+ processExplorerRpc
1990
+ };
1912
1991
  } catch (error) {
1913
- throw new VError(error, 'Failed to create process explorer electron rpc');
1992
+ await processExplorerRpc?.dispose();
1993
+ throw new VError(error, 'Failed to create process explorer electron rpcs');
1914
1994
  }
1915
1995
  };
1916
1996
 
1917
- const launchProcessExplorerNode = async () => {
1997
+ const commandNotFoundRegex = /command not found|not found/i;
1998
+ const launchProcessExplorerNode = async onClose => {
1918
1999
  try {
1919
- const rpc = await create$2({
2000
+ try {
2001
+ const {
2002
+ protocols,
2003
+ url
2004
+ } = await invoke$1('WebSocketCapability.create', 'process-explorer');
2005
+ const webSocket = new WebSocket(url, protocols);
2006
+ webSocket.addEventListener('close', onClose);
2007
+ return await create$3({
2008
+ commandMap: {},
2009
+ webSocket
2010
+ });
2011
+ } catch (error) {
2012
+ if (!(error instanceof Error && (error.message.includes('WebSocketCapability.create') || error.message.includes('module WebSocketCapability not found')) && commandNotFoundRegex.test(error.message))) {
2013
+ throw error;
2014
+ }
2015
+ }
2016
+ const rpc = await create$1({
1920
2017
  commandMap: {},
2018
+ onClose,
1921
2019
  type: 'process-explorer'
1922
2020
  });
1923
2021
  return rpc;
@@ -1938,6 +2036,9 @@ const invoke = async (method, ...params) => {
1938
2036
  const set$1 = newRpc => {
1939
2037
  state$1.rpc = newRpc;
1940
2038
  };
2039
+ const clear = () => {
2040
+ state$1.rpc = undefined;
2041
+ };
1941
2042
  const dispose$2 = async () => {
1942
2043
  const {
1943
2044
  rpc
@@ -1949,30 +2050,48 @@ const dispose$2 = async () => {
1949
2050
  const state = {
1950
2051
  initializedPlatform: 0
1951
2052
  };
2053
+ const handleClose = async () => {
2054
+ state.initializedPlatform = 0;
2055
+ clear();
2056
+ await handleProcessExplorerRpcClose();
2057
+ };
1952
2058
  const initializeProcessExplorer = async platform => {
1953
2059
  if (state.initializedPlatform === platform) {
1954
2060
  return;
1955
2061
  }
1956
2062
  if (platform === Electron) {
1957
- const rpc = await launchProcessExplorerElectron();
1958
- set$1(rpc);
2063
+ const {
2064
+ mainProcessRpc,
2065
+ processExplorerRpc
2066
+ } = await launchProcessExplorerElectron();
2067
+ set$3(mainProcessRpc);
2068
+ set$1(processExplorerRpc);
1959
2069
  state.initializedPlatform = platform;
1960
2070
  return;
1961
2071
  }
1962
2072
  if (platform === Remote) {
1963
- const rpc = await launchProcessExplorerNode();
2073
+ const rpc = await launchProcessExplorerNode(() => {
2074
+ void handleClose();
2075
+ });
1964
2076
  set$1(rpc);
1965
2077
  state.initializedPlatform = platform;
1966
2078
  }
1967
2079
  };
1968
2080
  const dispose$1 = async () => {
2081
+ const {
2082
+ initializedPlatform
2083
+ } = state;
1969
2084
  state.initializedPlatform = 0;
2085
+ if (initializedPlatform === Electron) {
2086
+ await Promise.all([dispose$4(), dispose$2()]);
2087
+ return;
2088
+ }
1970
2089
  await dispose$2();
1971
2090
  };
1972
2091
 
1973
2092
  const dispose = async uid => {
1974
2093
  dispose$3(uid);
1975
- dispose$4(uid);
2094
+ dispose$5(uid);
1976
2095
  if (getKeys$1().length === 0) {
1977
2096
  await dispose$1();
1978
2097
  }
@@ -2217,7 +2336,7 @@ const handleContextMenu = async (state, index = state.focusedIndex, x = 0, y = 0
2217
2336
  focused: false,
2218
2337
  focusedIndex: numericIndex
2219
2338
  };
2220
- set$6(state.uid, state, newState);
2339
+ set$7(state.uid, state, newState);
2221
2340
  await show2(state.uid, ProcessExplorer$1, x, y, {
2222
2341
  index: numericIndex,
2223
2342
  menuId: ProcessExplorer$1
@@ -2241,7 +2360,13 @@ const killProcess = async (state, index = state.focusedIndex) => {
2241
2360
  if (!process) {
2242
2361
  return state;
2243
2362
  }
2244
- await invoke('Process.kill', process.pid);
2363
+ const killPromise = invoke('Process.kill', process.pid);
2364
+ if (process.name === 'process-explorer') {
2365
+ dispose$3(state.uid);
2366
+ void killPromise.catch(() => {});
2367
+ return toProcessExplorerRpcClosedState(state);
2368
+ }
2369
+ await killPromise;
2245
2370
  return state;
2246
2371
  };
2247
2372
 
@@ -2360,6 +2485,13 @@ const getFocusedIndex = (oldFocusedIndex, visibleProcesses) => {
2360
2485
  }
2361
2486
  return Math.min(oldFocusedIndex, visibleProcesses.length - 1);
2362
2487
  };
2488
+ const listProcesses = async (rootPid, platform) => {
2489
+ if (platform === Electron) {
2490
+ const pidMap = await invoke$2('CreatePidMap.createPidMap');
2491
+ return invoke('ListProcessesWithMemoryUsage.listProcessesWithMemoryUsage', rootPid, false, pidMap);
2492
+ }
2493
+ return invoke('ListProcessesWithMemoryUsage.listProcessesWithMemoryUsage', rootPid, false);
2494
+ };
2363
2495
  const refresh = async state => {
2364
2496
  try {
2365
2497
  await initializeProcessExplorer(state.platform);
@@ -2367,7 +2499,7 @@ const refresh = async state => {
2367
2499
  const rootPid = state.rootPid === -1 ? await invoke('ProcessId.getMainProcessId', {
2368
2500
  includeElectronData
2369
2501
  }) : state.rootPid;
2370
- const processes = await invoke('ListProcessesWithMemoryUsage.listProcessesWithMemoryUsage', rootPid, includeElectronData);
2502
+ const processes = await listProcesses(rootPid, state.platform);
2371
2503
  const frontendMemoryProcesses = state.includeFrontendMemoryUsage ? await getFrontendMemoryUsage(rootPid) : [];
2372
2504
  const allProcesses = [...processes, ...frontendMemoryProcesses];
2373
2505
  const visibleProcesses = getVisibleProcesses(allProcesses, state.collapsedPids, rootPid);
@@ -2760,6 +2892,12 @@ const headerCellNode = {
2760
2892
  className: HeaderCell,
2761
2893
  type: Th
2762
2894
  };
2895
+ const processExplorer = {
2896
+ childCount: 1,
2897
+ className: mergeClassNames(Viewlet, ProcessExplorer),
2898
+ role: None,
2899
+ type: Div
2900
+ };
2763
2901
  const getRowClassName = focused => {
2764
2902
  if (focused) {
2765
2903
  return mergeClassNames(Row, RowFocused);
@@ -2851,12 +2989,7 @@ const getErrorDom = state => {
2851
2989
  const codeFrameDom = getErrorSectionDom(errorCodeFrame, Pre);
2852
2990
  const stackDom = getErrorSectionDom(errorStack, Pre);
2853
2991
  const childCount = messageDom.length / 2 + codeFrameDom.length / 2 + stackDom.length / 2;
2854
- return [{
2855
- childCount: 1,
2856
- className: mergeClassNames(Viewlet, ProcessExplorer),
2857
- role: None,
2858
- type: Div
2859
- }, {
2992
+ return [processExplorer, {
2860
2993
  childCount,
2861
2994
  className: Error$1,
2862
2995
  type: Div
@@ -2866,12 +2999,7 @@ const getTableDom = state => {
2866
2999
  const {
2867
3000
  visibleProcesses
2868
3001
  } = state;
2869
- return [{
2870
- childCount: 1,
2871
- className: mergeClassNames(Viewlet, ProcessExplorer),
2872
- role: None,
2873
- type: Div
2874
- }, {
3002
+ return [processExplorer, {
2875
3003
  ariaLabel: 'Process Explorer',
2876
3004
  ariaRowCount: visibleProcesses.length + 1,
2877
3005
  childCount: 2,
@@ -2942,7 +3070,7 @@ const render2 = (uid, diffResult) => {
2942
3070
  oldState,
2943
3071
  scheduledState
2944
3072
  } = get$2(uid);
2945
- set$6(uid, scheduledState, scheduledState);
3073
+ set$7(uid, scheduledState, scheduledState);
2946
3074
  return applyRender(oldState, scheduledState, diffResult);
2947
3075
  };
2948
3076
 
@@ -2971,6 +3099,10 @@ const renderEventListeners = () => {
2971
3099
  }];
2972
3100
  };
2973
3101
 
3102
+ const rerender = state => {
3103
+ return state;
3104
+ };
3105
+
2974
3106
  const isRawError = value => {
2975
3107
  return Boolean(value && typeof value === 'object');
2976
3108
  };
@@ -3058,6 +3190,7 @@ const commandMap = {
3058
3190
  'ProcessExplorer.refresh': wrapCommand(refresh),
3059
3191
  'ProcessExplorer.render2': render2,
3060
3192
  'ProcessExplorer.renderEventListeners': renderEventListeners,
3193
+ 'ProcessExplorer.rerender': wrapCommand(rerender),
3061
3194
  'ProcessExplorer.setError': wrapCommand(setError),
3062
3195
  'ProcessExplorer.setRootProcessId': wrapCommand(setRootProcessId),
3063
3196
  'ProcessExplorer.setUpdateInterval': wrapCommand(setUpdateInterval),
@@ -3071,7 +3204,7 @@ const sendMessagePortToErrorWorker = async port => {
3071
3204
 
3072
3205
  const createErrorWorkerRpc = async () => {
3073
3206
  try {
3074
- const rpc = await create$5({
3207
+ const rpc = await create$4({
3075
3208
  commandMap: {},
3076
3209
  send: sendMessagePortToErrorWorker
3077
3210
  });
@@ -3083,7 +3216,7 @@ const createErrorWorkerRpc = async () => {
3083
3216
 
3084
3217
  const initializeErrorWorker = async () => {
3085
3218
  const rpc = await createErrorWorkerRpc();
3086
- set$4(rpc);
3219
+ set$5(rpc);
3087
3220
  };
3088
3221
 
3089
3222
  const sendMessagePortToFileSystemWorker = async port => {
@@ -3092,7 +3225,7 @@ const sendMessagePortToFileSystemWorker = async port => {
3092
3225
 
3093
3226
  const createFileSystemWorkerRpc = async () => {
3094
3227
  try {
3095
- const rpc = await create$5({
3228
+ const rpc = await create$4({
3096
3229
  commandMap: {},
3097
3230
  send: sendMessagePortToFileSystemWorker
3098
3231
  });
@@ -3112,7 +3245,7 @@ const initializeFileSystemWorker = async () => {
3112
3245
  };
3113
3246
 
3114
3247
  const initializeRendererWorker = async () => {
3115
- const rpc = await create$1({
3248
+ const rpc = await create({
3116
3249
  commandMap: commandMap
3117
3250
  });
3118
3251
  set$2(rpc);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/process-explorer-worker",
3
- "version": "3.12.0",
3
+ "version": "3.13.0",
4
4
  "description": "Explorer Worker",
5
5
  "repository": {
6
6
  "type": "git",