@lvce-editor/shared-process 0.26.1 → 0.26.3

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 (35) hide show
  1. package/package.json +5 -5
  2. package/src/parts/ApplyIncomingIpcResponse/ApplyIncomingIpcResponse.js +13 -0
  3. package/src/parts/ConnectIpcToElectron/ConnectIpcToElectron.js +4 -3
  4. package/src/parts/EmbedsProcess/EmbedsProcess.js +0 -9
  5. package/src/parts/GetWindowId/GetWindowId.js +4 -3
  6. package/src/parts/HandleElectronMessagePort/HandleElectronMessagePort.js +7 -21
  7. package/src/parts/HandleIncomingIpc/HandleIncomingIpc.js +18 -0
  8. package/src/parts/HandleIncomingIpcMessagePort/HandleIncomingIpcMessagePort.js +8 -0
  9. package/src/parts/HandleIncomingIpcWebSocket/HandleIncomingIpcWebSocket.js +8 -0
  10. package/src/parts/HandleIpc/HandleIpc.js +22 -1
  11. package/src/parts/HandleIpcEmbedsProcess/HandleIpcEmbedsProcess.js +12 -0
  12. package/src/parts/HandleIpcExtensionHostHelperProcess/HandleIpcExtensionHostHelperProcess.js +30 -0
  13. package/src/parts/HandleIpcModule/HandleIpcModule.js +27 -0
  14. package/src/parts/HandleIpcProcessExplorer/HandleIpcProcessExplorer.js +14 -0
  15. package/src/parts/HandleIpcSearchProcess/HandleIpcSearchProcess.js +1 -0
  16. package/src/parts/HandleIpcSharedProcess/HandleIpcSharedProcess.js +41 -0
  17. package/src/parts/HandleIpcTerminalProcess/HandleIpcTerminalProcess.js +24 -0
  18. package/src/parts/HandleMessagePortForEmbedsProcess/HandleMessagePortForEmbedsProcess.js +6 -7
  19. package/src/parts/HandleMessagePortForExtensionHostHelperProcess/HandleMessagePortForExtensionHostHelperProcess.js +5 -5
  20. package/src/parts/HandleMessagePortForProcessExplorer/HandleMessagePortForProcessExplorer.js +4 -7
  21. package/src/parts/HandleMessagePortForTerminalProcess/HandleMessagePortForTerminalProcess.js +4 -8
  22. package/src/parts/HandleWebSocketForExtensionHostHelperProcess/HandleWebSocketForExtensionHostHelperProcess.js +4 -8
  23. package/src/parts/HandleWebSocketForSharedProcess/HandleWebSocketForSharedProcess.js +4 -15
  24. package/src/parts/HandleWebSocketForTerminalProcess/HandleWebSocketForTerminalProcess.js +4 -17
  25. package/src/parts/IpcId/IpcId.js +10 -0
  26. package/src/parts/IpcParentWithElectronUtilityProcess/IpcParentWithElectronUtilityProcess.js +17 -3
  27. package/src/parts/LaunchEmbedsProcess/LaunchEmbedsProcess.js +3 -1
  28. package/src/parts/LaunchProcessExplorer/LaunchProcessExplorer.js +3 -1
  29. package/src/parts/LaunchPtyHost/LaunchPtyHost.js +10 -9
  30. package/src/parts/ModuleMap/ModuleMap.js +1 -1
  31. package/src/parts/Platform/Platform.js +3 -3
  32. package/src/parts/RequiresSocket/RequiresSocket.js +1 -1
  33. package/src/parts/SendIncomingIpc/SendIncomingIpc.js +46 -0
  34. package/src/parts/TemporaryMessagePort/TemporaryMessagePort.ipc.js +1 -1
  35. package/src/parts/TemporaryMessagePort/TemporaryMessagePort.js +12 -18
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/shared-process",
3
- "version": "0.26.1",
3
+ "version": "0.26.3",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -18,12 +18,12 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@lvce-editor/assert": "^1.2.0",
21
- "@lvce-editor/extension-host-helper-process": "0.26.1",
22
- "@lvce-editor/ipc": "^5.1.0",
21
+ "@lvce-editor/extension-host-helper-process": "0.26.3",
22
+ "@lvce-editor/ipc": "^7.4.0",
23
23
  "@lvce-editor/json-rpc": "^1.3.0",
24
24
  "@lvce-editor/jsonc-parser": "^1.2.0",
25
25
  "@lvce-editor/pretty-error": "^1.5.0",
26
- "@lvce-editor/pty-host": "0.26.1",
26
+ "@lvce-editor/pty-host": "0.26.3",
27
27
  "@lvce-editor/verror": "^1.2.0",
28
28
  "@lvce-editor/web-socket-server": "^1.1.0",
29
29
  "debug": "^4.3.4",
@@ -32,7 +32,7 @@
32
32
  "got": "^14.2.1",
33
33
  "is-object": "^1.0.2",
34
34
  "p-queue": "^8.0.1",
35
- "tar-fs": "^3.0.5",
35
+ "tar-fs": "^3.0.6",
36
36
  "xdg-basedir": "^5.1.0"
37
37
  },
38
38
  "optionalDependencies": {
@@ -0,0 +1,13 @@
1
+ import * as HandleIpc from '../HandleIpc/HandleIpc.js';
2
+ import * as SendIncomingIpc from '../SendIncomingIpc/SendIncomingIpc.js';
3
+ export const applyIncomingIpcResponse = async (target, response, ipcId) => {
4
+ switch (response.type) {
5
+ case 'handle':
6
+ HandleIpc.handleIpc(target);
7
+ break;
8
+ case 'send':
9
+ return SendIncomingIpc.sendIncomingIpc(target, response, ipcId);
10
+ default:
11
+ throw new Error('unexpected response');
12
+ }
13
+ };
@@ -1,8 +1,9 @@
1
1
  import * as GetPortTuple from '../GetPortTuple/GetPortTuple.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
2
3
  import * as JsonRpc from '../JsonRpc/JsonRpc.js';
3
4
  import * as ParentIpc from '../ParentIpc/ParentIpc.js';
4
- export const connectIpcToElectron = async (ipc) => {
5
+ export const connectIpcToElectron = async (ipc, ipcId = IpcId.Unknown) => {
5
6
  const { port1, port2 } = await GetPortTuple.getPortTuple();
6
- await JsonRpc.invokeAndTransfer(ipc, [port1], 'HandleElectronMessagePort.handleElectronMessagePort', /* isElectron */ true);
7
- await ParentIpc.invokeAndTransfer('HandleElectronMessagePort.handleElectronMessagePort', [port2]);
7
+ await JsonRpc.invokeAndTransfer(ipc, [port1], 'HandleElectronMessagePort.handleElectronMessagePort', IpcId.MainProcess);
8
+ await ParentIpc.invokeAndTransfer('HandleElectronMessagePort.handleElectronMessagePort', [port2], ipcId);
8
9
  };
@@ -1,4 +1,3 @@
1
- import * as JsonRpc from '../JsonRpc/JsonRpc.js';
2
1
  import * as LaunchEmbedsProcess from '../LaunchEmbedsProcess/LaunchEmbedsProcess.js';
3
2
  export const state = {
4
3
  /**
@@ -12,11 +11,3 @@ export const getOrCreate = async () => {
12
11
  }
13
12
  return state.ipc;
14
13
  };
15
- export const invoke = async (method, ...params) => {
16
- const ipc = await getOrCreate();
17
- return JsonRpc.invoke(ipc, method, ...params);
18
- };
19
- export const invokeAndTransfer = async (method, transfer, ...params) => {
20
- const ipc = await getOrCreate();
21
- return JsonRpc.invokeAndTransfer(ipc, transfer, method, ...params);
22
- };
@@ -1,5 +1,6 @@
1
1
  import * as Assert from '../Assert/Assert.js';
2
- export const getWindowId = (ipc) => {
3
- Assert.object(ipc);
4
- return ipc.windowId;
2
+ import * as ParentIpc from '../ParentIpc/ParentIpc.js';
3
+ export const getWindowId = (webContentsId) => {
4
+ Assert.number(webContentsId);
5
+ return ParentIpc.invoke('GetWindowId.getWindowId', webContentsId);
5
6
  };
@@ -1,22 +1,8 @@
1
- import * as Assert from '../Assert/Assert.js';
2
- import * as HandleIpc from '../HandleIpc/HandleIpc.js';
3
- import * as IpcChild from '../IpcChild/IpcChild.js';
4
- import * as IpcChildType from '../IpcChildType/IpcChildType.js';
5
- import * as ParentIpc from '../ParentIpc/ParentIpc.js';
6
- const mainProcessSpecialId = -5;
7
- export const handleElectronMessagePort = async (messagePort, ...params) => {
8
- Assert.object(messagePort);
9
- const ipc = await IpcChild.listen({
10
- method: IpcChildType.ElectronMessagePort,
11
- messagePort,
12
- });
13
- HandleIpc.handleIpc(ipc);
14
- if (params[0] === mainProcessSpecialId) {
15
- // update ipc with message port ipc that supports transferring objects
16
- // @ts-ignore
17
- ParentIpc.state.ipc = ipc;
18
- }
19
- // TODO find better way to associate configuration with ipc
20
- // @ts-ignore
21
- ipc.windowId = params[1];
1
+ import * as HandleIncomingIpc from '../HandleIncomingIpc/HandleIncomingIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ export const handleElectronMessagePort = (messagePort, ipcId) => {
4
+ const message = {
5
+ ipcId,
6
+ };
7
+ return HandleIncomingIpc.handleIncomingIpc(IpcId.SharedProcess, messagePort, message);
22
8
  };
@@ -0,0 +1,18 @@
1
+ import * as ApplyIncomingIpcResponse from '../ApplyIncomingIpcResponse/ApplyIncomingIpcResponse.js';
2
+ import * as Assert from '../Assert/Assert.js';
3
+ import * as HandleIncomingIpcMessagePort from '../HandleIncomingIpcMessagePort/HandleIncomingIpcMessagePort.js';
4
+ import * as HandleIncomingIpcWebSocket from '../HandleIncomingIpcWebSocket/HandleIncomingIpcWebSocket.js';
5
+ import * as HandleIpcModule from '../HandleIpcModule/HandleIpcModule.js';
6
+ import * as IsMessagePortMain from '../IsMessagePortMain/IsMessagePortMain.js';
7
+ const getIpcAndResponse = (module, handle, message) => {
8
+ if (IsMessagePortMain.isMessagePortMain(handle)) {
9
+ return HandleIncomingIpcMessagePort.handleIncomingIpcMessagePort(module, handle, message);
10
+ }
11
+ return HandleIncomingIpcWebSocket.handleIncomingIpcWebSocket(module, handle, message);
12
+ };
13
+ export const handleIncomingIpc = async (ipcId, handle, message) => {
14
+ Assert.number(ipcId);
15
+ const module = HandleIpcModule.getModule(ipcId);
16
+ const { target, response } = await getIpcAndResponse(module, handle, message);
17
+ await ApplyIncomingIpcResponse.applyIncomingIpcResponse(target, response, ipcId);
18
+ };
@@ -0,0 +1,8 @@
1
+ export const handleIncomingIpcMessagePort = async (module, handle, message) => {
2
+ const target = await module.targetMessagePort(handle, message);
3
+ const response = module.upgradeMessagePort(handle, message);
4
+ return {
5
+ target,
6
+ response,
7
+ };
8
+ };
@@ -0,0 +1,8 @@
1
+ export const handleIncomingIpcWebSocket = async (module, handle, message) => {
2
+ const target = await module.targetWebSocket(handle, message);
3
+ const response = module.upgradeWebSocket(handle, message);
4
+ return {
5
+ target,
6
+ response,
7
+ };
8
+ };
@@ -1,4 +1,25 @@
1
1
  import * as HandleMessage from '../HandleMessage/HandleMessage.js';
2
+ const handled = new WeakSet();
2
3
  export const handleIpc = (ipc) => {
3
- ipc.on('message', HandleMessage.handleMessage);
4
+ if (handled.has(ipc)) {
5
+ return;
6
+ }
7
+ handled.add(ipc);
8
+ if ('addEventListener' in ipc) {
9
+ ipc.addEventListener('message', HandleMessage.handleMessage);
10
+ }
11
+ else if ('on' in ipc) {
12
+ // deprecated
13
+ ipc.on('message', HandleMessage.handleMessage);
14
+ }
15
+ };
16
+ export const unhandleIpc = (ipc) => {
17
+ handled.delete(ipc);
18
+ if ('removeEventListener' in ipc) {
19
+ ipc.removeEventListener('message', HandleMessage.handleMessage);
20
+ }
21
+ else if ('off' in ipc) {
22
+ // deprecated
23
+ ipc.off('message', HandleMessage.handleMessage);
24
+ }
4
25
  };
@@ -0,0 +1,12 @@
1
+ import * as EmbedsProcess from '../EmbedsProcess/EmbedsProcess.js';
2
+ export const targetMessagePort = () => {
3
+ return EmbedsProcess.getOrCreate();
4
+ };
5
+ export const upgradeMessagePort = (port, message) => {
6
+ return {
7
+ type: 'send',
8
+ method: 'HandleElectronMessagePort.handleElectronMessagePort',
9
+ params: [message.ipcId],
10
+ transfer: [port],
11
+ };
12
+ };
@@ -0,0 +1,30 @@
1
+ import * as ExtensionHostHelperProcessIpc from '../ExtensionHostHelperProcessIpc/ExtensionHostHelperProcessIpc.js';
2
+ import * as IpcParentType from '../IpcParentType/IpcParentType.js';
3
+ export const targetWebSocket = async () => {
4
+ const ipc = await ExtensionHostHelperProcessIpc.create({
5
+ method: IpcParentType.NodeForkedProcess,
6
+ });
7
+ return ipc;
8
+ };
9
+ export const upgradeWebSocket = (handle, message) => {
10
+ return {
11
+ type: 'send',
12
+ method: 'HandleWebSocket.handleWebSocket',
13
+ params: [message],
14
+ transfer: handle,
15
+ };
16
+ };
17
+ export const targetMessagePort = async () => {
18
+ const ipc = await ExtensionHostHelperProcessIpc.create({
19
+ method: IpcParentType.ElectronUtilityProcess,
20
+ });
21
+ return ipc;
22
+ };
23
+ export const upgradeMessagePort = (port) => {
24
+ return {
25
+ type: 'send',
26
+ method: 'HandleElectronMessagePort.handleElectronMessagePort',
27
+ params: [],
28
+ transfer: [port],
29
+ };
30
+ };
@@ -0,0 +1,27 @@
1
+ import * as Assert from '../Assert/Assert.js';
2
+ import * as HandleIpcEmbedsProcess from '../HandleIpcEmbedsProcess/HandleIpcEmbedsProcess.js';
3
+ import * as HandleIpcExtensionHostHelperProcess from '../HandleIpcExtensionHostHelperProcess/HandleIpcExtensionHostHelperProcess.js';
4
+ import * as HandleIpcProcessExplorer from '../HandleIpcProcessExplorer/HandleIpcProcessExplorer.js';
5
+ import * as HandleIpcSearchProcess from '../HandleIpcSearchProcess/HandleIpcSearchProcess.js';
6
+ import * as HandleIpcSharedProcess from '../HandleIpcSharedProcess/HandleIpcSharedProcess.js';
7
+ import * as HandleIpcTerminalProcess from '../HandleIpcTerminalProcess/HandleIpcTerminalProcess.js';
8
+ import * as IpcId from '../IpcId/IpcId.js';
9
+ export const getModule = (ipcId) => {
10
+ Assert.number(ipcId);
11
+ switch (ipcId) {
12
+ case IpcId.SharedProcess:
13
+ return HandleIpcSharedProcess;
14
+ case IpcId.EmbedsProcess:
15
+ return HandleIpcEmbedsProcess;
16
+ case IpcId.TerminalProcess:
17
+ return HandleIpcTerminalProcess;
18
+ case IpcId.ExtensionHostHelperProcess:
19
+ return HandleIpcExtensionHostHelperProcess;
20
+ case IpcId.ProcessExplorer:
21
+ return HandleIpcProcessExplorer;
22
+ case IpcId.SearchProcess:
23
+ return HandleIpcSearchProcess;
24
+ default:
25
+ throw new Error(`unexpected incoming ipc`);
26
+ }
27
+ };
@@ -0,0 +1,14 @@
1
+ import * as ProcessExplorer from '../ProcessExplorer/ProcessExplorer.js';
2
+ import * as Assert from '../Assert/Assert.js';
3
+ export const targetMessagePort = () => {
4
+ return ProcessExplorer.getOrCreate();
5
+ };
6
+ export const upgradeMessagePort = (port) => {
7
+ Assert.object(port);
8
+ return {
9
+ type: 'send',
10
+ method: 'HandleElectronMessagePort.handleElectronMessagePort',
11
+ params: [],
12
+ transfer: [port],
13
+ };
14
+ };
@@ -0,0 +1,41 @@
1
+ import * as Assert from '../Assert/Assert.js';
2
+ import * as HandleSocketError from '../HandleSocketError/HandleSocketError.js';
3
+ import * as IpcChild from '../IpcChild/IpcChild.js';
4
+ import * as IpcChildType from '../IpcChildType/IpcChildType.js';
5
+ import * as IpcId from '../IpcId/IpcId.js';
6
+ import * as ParentIpc from '../ParentIpc/ParentIpc.js';
7
+ export const targetWebSocket = async (handle, message) => {
8
+ handle.on('error', HandleSocketError.handleSocketError);
9
+ const ipc = await IpcChild.listen({
10
+ method: IpcChildType.WebSocket,
11
+ request: message,
12
+ handle,
13
+ });
14
+ return ipc;
15
+ };
16
+ export const upgradeWebSocket = () => {
17
+ return {
18
+ type: 'handle',
19
+ };
20
+ };
21
+ export const targetMessagePort = async (messagePort, message) => {
22
+ Assert.object(messagePort);
23
+ const ipc = await IpcChild.listen({
24
+ method: IpcChildType.ElectronMessagePort,
25
+ messagePort,
26
+ });
27
+ if (message.ipcId === IpcId.MainProcess) {
28
+ // update ipc with message port ipc that supports transferring objects
29
+ // @ts-ignore
30
+ ParentIpc.state.ipc = ipc;
31
+ }
32
+ // TODO find better way to associate configuration with ipc
33
+ // @ts-ignore
34
+ ipc.windowId = message.windowId;
35
+ return ipc;
36
+ };
37
+ export const upgradeMessagePort = () => {
38
+ return {
39
+ type: 'handle',
40
+ };
41
+ };
@@ -0,0 +1,24 @@
1
+ import * as PtyHost from '../PtyHost/PtyHost.js';
2
+ import * as IpcParentType from '../IpcParentType/IpcParentType.js';
3
+ export const targetWebSocket = () => {
4
+ return PtyHost.getOrCreate(IpcParentType.NodeForkedProcess);
5
+ };
6
+ export const upgradeWebSocket = (handle, message) => {
7
+ return {
8
+ type: 'send',
9
+ method: 'HandleWebSocket.handleWebSocket',
10
+ params: [message],
11
+ transfer: handle,
12
+ };
13
+ };
14
+ export const targetMessagePort = () => {
15
+ return PtyHost.getOrCreate(IpcParentType.ElectronUtilityProcess);
16
+ };
17
+ export const upgradeMessagePort = (port) => {
18
+ return {
19
+ type: 'send',
20
+ method: 'HandleElectronMessagePort.handleElectronMessagePort',
21
+ params: [],
22
+ transfer: [port],
23
+ };
24
+ };
@@ -1,8 +1,7 @@
1
- import * as Assert from '../Assert/Assert.js';
2
- import * as EmbedsProcess from '../EmbedsProcess/EmbedsProcess.js';
3
- import * as JsonRpc from '../JsonRpc/JsonRpc.js';
4
- export const handleMessagePortForEmbedsProcess = async (port) => {
5
- Assert.object(port);
6
- const embedsProcess = await EmbedsProcess.getOrCreate();
7
- await JsonRpc.invokeAndTransfer(embedsProcess, [port], 'HandleElectronMessagePort.handleElectronMessagePort');
1
+ import * as HandleIncomingIpc from '../HandleIncomingIpc/HandleIncomingIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ export const handleMessagePortForEmbedsProcess = (port, ipcId) => {
4
+ return HandleIncomingIpc.handleIncomingIpc(IpcId.EmbedsProcess, port, {
5
+ ipcId,
6
+ });
8
7
  };
@@ -15,9 +15,9 @@ export const handleMessagePortForExtensionHostHelperProcess = async (rendererWor
15
15
  });
16
16
  HandleIpc.handleIpc(ipc);
17
17
  await JsonRpc.invokeAndTransfer(ipc, [port], 'HandleElectronMessagePort.handleElectronMessagePort');
18
- const cleanup = () => {
19
- ipc.dispose();
20
- rendererWorkerIpc.off('close', cleanup);
21
- };
22
- rendererWorkerIpc.on('close', cleanup);
18
+ // const cleanup = () => {
19
+ // ipc.dispose()
20
+ // rendererWorkerIpc.off('close', cleanup)
21
+ // }
22
+ // rendererWorkerIpc.on('close', cleanup)
23
23
  };
@@ -1,8 +1,5 @@
1
- import * as Assert from '../Assert/Assert.js';
2
- import * as JsonRpc from '../JsonRpc/JsonRpc.js';
3
- import * as ProcessExplorer from '../ProcessExplorer/ProcessExplorer.js';
4
- export const handleMessagePortForProcessExplorer = async (port) => {
5
- Assert.object(port);
6
- const ipc = await ProcessExplorer.getOrCreate();
7
- await JsonRpc.invokeAndTransfer(ipc, [port], 'HandleElectronMessagePort.handleElectronMessagePort');
1
+ import * as HandleIncomingIpc from '../HandleIncomingIpc/HandleIncomingIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ export const handleMessagePortForProcessExplorer = (port) => {
4
+ return HandleIncomingIpc.handleIncomingIpc(IpcId.ProcessExplorer, port, {});
8
5
  };
@@ -1,9 +1,5 @@
1
- import * as Assert from '../Assert/Assert.js';
2
- import * as IpcParentType from '../IpcParentType/IpcParentType.js';
3
- import * as JsonRpc from '../JsonRpc/JsonRpc.js';
4
- import * as PtyHost from '../PtyHost/PtyHost.js';
5
- export const handleMessagePortForTerminalProcess = async (port) => {
6
- Assert.object(port);
7
- const ptyHost = await PtyHost.getOrCreate(IpcParentType.ElectronUtilityProcess);
8
- await JsonRpc.invokeAndTransfer(ptyHost, [port], 'HandleElectronMessagePort.handleElectronMessagePort');
1
+ import * as HandleIncomingIpc from '../HandleIncomingIpc/HandleIncomingIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ export const handleMessagePortForTerminalProcess = (port) => {
4
+ return HandleIncomingIpc.handleIncomingIpc(IpcId.TerminalProcess, port, {});
9
5
  };
@@ -1,9 +1,5 @@
1
- import * as ExtensionHostHelperProcessIpc from '../ExtensionHostHelperProcessIpc/ExtensionHostHelperProcessIpc.js';
2
- import * as IpcParentType from '../IpcParentType/IpcParentType.js';
3
- import * as JsonRpc from '../JsonRpc/JsonRpc.js';
4
- export const handleWebSocket = async (message, handle) => {
5
- const ipc = await ExtensionHostHelperProcessIpc.create({
6
- method: IpcParentType.NodeForkedProcess,
7
- });
8
- await JsonRpc.invokeAndTransfer(ipc, handle, 'HandleWebSocket.handleWebSocket', message);
1
+ import * as HandleIncomingIpc from '../HandleIncomingIpc/HandleIncomingIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ export const handleWebSocket = (message, handle) => {
4
+ return HandleIncomingIpc.handleIncomingIpc(IpcId.ExtensionHostHelperProcess, handle, message);
9
5
  };
@@ -1,16 +1,5 @@
1
- import * as Assert from '../Assert/Assert.js';
2
- import * as HandleIpc from '../HandleIpc/HandleIpc.js';
3
- import * as HandleSocketError from '../HandleSocketError/HandleSocketError.js';
4
- import * as IpcChild from '../IpcChild/IpcChild.js';
5
- import * as IpcChildType from '../IpcChildType/IpcChildType.js';
6
- export const handleWebSocket = async (request, handle) => {
7
- Assert.object(request);
8
- Assert.object(handle);
9
- handle.on('error', HandleSocketError.handleSocketError);
10
- const ipc = await IpcChild.listen({
11
- method: IpcChildType.WebSocket,
12
- request,
13
- handle,
14
- });
15
- HandleIpc.handleIpc(ipc);
1
+ import * as HandleIncomingIpc from '../HandleIncomingIpc/HandleIncomingIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ export const handleWebSocket = (request, handle) => {
4
+ return HandleIncomingIpc.handleIncomingIpc(IpcId.SharedProcess, handle, request);
16
5
  };
@@ -1,18 +1,5 @@
1
- import * as PtyHost from '../PtyHost/PtyHost.js';
2
- export const handleWebSocket = async (message, handle) => {
3
- const instance = await PtyHost.getOrCreate();
4
- instance.sendAndTransfer({
5
- jsonrpc: '2.0',
6
- method: 'HandleWebSocket.handleWebSocket',
7
- params: [message],
8
- }, handle);
9
- // console.log({ instance })
10
- // const ipc = await PtyHost.getOrCreate()
11
- // console.info('[sharedprocess] creating extension ipc')
12
- // const rpc = await ExtensionHostRpc.create(ipc, handle)
13
- // console.info('[sharedprocess] created extension host rpc')
14
- // ipc._process.send(message, handle)
15
- // rpc.send(message)
16
- // console.log('spawned extension host')
17
- // console.log(rpc)
1
+ import * as HandleIncomingIpc from '../HandleIncomingIpc/HandleIncomingIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ export const handleWebSocket = (message, handle) => {
4
+ return HandleIncomingIpc.handleIncomingIpc(IpcId.TerminalProcess, handle, message);
18
5
  };
@@ -0,0 +1,10 @@
1
+ export const EmbedsProcess = 2;
2
+ export const EmbedsWorker = 77;
3
+ export const ExtensionHostHelperProcess = 3;
4
+ export const MainProcess = -5;
5
+ export const ProcessExplorer = 11;
6
+ export const SearchProcess = 13;
7
+ export const SharedProcess = 1;
8
+ export const TerminalProcess = 7;
9
+ export const Unknown = 0;
10
+ export const ProcessExplorerRenderer = 33;
@@ -22,6 +22,7 @@ export const signal = (port) => {
22
22
  export const wrap = (port) => {
23
23
  return {
24
24
  port,
25
+ wrappedListener: undefined,
25
26
  send(message) {
26
27
  this.port.postMessage(message);
27
28
  },
@@ -34,20 +35,33 @@ export const wrap = (port) => {
34
35
  this.port.on(event, listener);
35
36
  break;
36
37
  case 'message':
37
- const wrapped = (event) => {
38
+ // @ts-ignore
39
+ this.wrappedListener = (event) => {
38
40
  const syntheticEvent = {
39
41
  data: event.data,
40
42
  target: this,
41
43
  };
42
44
  listener(syntheticEvent);
43
45
  };
44
- this.port.on(event, wrapped);
46
+ this.port.on(event, this.wrappedListener);
47
+ break;
48
+ default:
49
+ break;
50
+ }
51
+ },
52
+ off(event, listener) {
53
+ switch (event) {
54
+ case 'close':
55
+ this.port.off(event, listener);
56
+ break;
57
+ case 'message':
58
+ this.port.off(event, this.wrappedListener);
59
+ this.wrappedListener = undefined;
45
60
  break;
46
61
  default:
47
62
  break;
48
63
  }
49
64
  },
50
- off(event, listener) { },
51
65
  dispose() {
52
66
  this.port.close();
53
67
  ParentIpc.invoke('TemporaryMessagePort.dispose', this.port.name);
@@ -3,6 +3,7 @@ import * as EmbedsProcessPath from '../EmbedsProcessPath/EmbedsProcessPath.js';
3
3
  import * as HandleIpc from '../HandleIpc/HandleIpc.js';
4
4
  import * as IpcParent from '../IpcParent/IpcParent.js';
5
5
  import * as IpcParentType from '../IpcParentType/IpcParentType.js';
6
+ import * as IpcId from '../IpcId/IpcId.js';
6
7
  export const launchEmbedsProcess = async () => {
7
8
  const ipc = await IpcParent.create({
8
9
  method: IpcParentType.ElectronUtilityProcess,
@@ -12,6 +13,7 @@ export const launchEmbedsProcess = async () => {
12
13
  name: 'Embeds Process',
13
14
  });
14
15
  HandleIpc.handleIpc(ipc);
15
- await ConnectIpcToElectron.connectIpcToElectron(ipc);
16
+ await ConnectIpcToElectron.connectIpcToElectron(ipc, IpcId.EmbedsProcess);
17
+ HandleIpc.unhandleIpc(ipc);
16
18
  return ipc;
17
19
  };
@@ -1,5 +1,6 @@
1
1
  import * as ConnectIpcToElectron from '../ConnectIpcToElectron/ConnectIpcToElectron.js';
2
2
  import * as HandleIpc from '../HandleIpc/HandleIpc.js';
3
+ import * as IpcId from '../IpcId/IpcId.js';
3
4
  import * as IpcParent from '../IpcParent/IpcParent.js';
4
5
  import * as IpcParentType from '../IpcParentType/IpcParentType.js';
5
6
  import * as ProcessExplorerPath from '../ProcessExplorerPath/ProcessExplorerPath.js';
@@ -12,6 +13,7 @@ export const launchProcessExplorer = async () => {
12
13
  name: 'Process Explorer',
13
14
  });
14
15
  HandleIpc.handleIpc(ipc);
15
- await ConnectIpcToElectron.connectIpcToElectron(ipc);
16
+ await ConnectIpcToElectron.connectIpcToElectron(ipc, IpcId.ProcessExplorerRenderer);
17
+ HandleIpc.unhandleIpc(ipc);
16
18
  return ipc;
17
19
  };
@@ -1,6 +1,5 @@
1
1
  import exitHook from 'exit-hook';
2
2
  import * as Debug from '../Debug/Debug.js';
3
- import * as HandleIpc from '../HandleIpc/HandleIpc.js';
4
3
  import * as IpcParent from '../IpcParent/IpcParent.js';
5
4
  import * as PtyHostPath from '../PtyHostPath/PtyHostPath.js';
6
5
  import * as PtyHostState from '../PtyHostState/PtyHostState.js';
@@ -24,14 +23,16 @@ export const launchPtyHost = async (method) => {
24
23
  stdio: 'inherit',
25
24
  name: 'Terminal Process',
26
25
  });
27
- HandleIpc.handleIpc(ptyHost);
28
- const handleClose = () => {
29
- // @ts-ignore
30
- ptyHost.off('close', handleClose);
31
- PtyHostState.state.ipc = undefined;
32
- PtyHostState.state.ptyHostPromise = undefined;
33
- };
34
- ptyHost.on('close', handleClose);
26
+ // HandleIpc.handleIpc(ptyHost)
27
+ // TODO
28
+ // const handleClose = () => {
29
+ // // @ts-ignore
30
+ // ptyHost._rawIpc.off('close', handleClose)
31
+ // PtyHostState.state.ipc = undefined
32
+ // PtyHostState.state.ptyHostPromise = undefined
33
+ // }
34
+ // // @ts-ignore
35
+ // ptyHost._rawIpc.on('close', handleClose)
35
36
  PtyHostState.state.ipc = ptyHost;
36
37
  return ptyHost;
37
38
  };
@@ -262,7 +262,7 @@ export const getModuleId = (commandId) => {
262
262
  return ModuleId.HandleWindowAllClosed;
263
263
  case 'HandleMessagePortForTerminalProcess.handleMessagePortForTerminalProcess':
264
264
  return ModuleId.HandleMessagePortForTerminalProcess;
265
- case 'TemporaryMessagePort.handlePort':
265
+ case 'TemporaryMessagePort.handlePorts':
266
266
  return ModuleId.TemporaryMessagePort;
267
267
  case 'GetElectronFileResponse.getElectronFileResponse':
268
268
  return ModuleId.GetElectronFileResponse;
@@ -41,9 +41,9 @@ export const getAppImageName = () => {
41
41
  export const getSetupName = () => {
42
42
  return 'Lvce-Setup';
43
43
  };
44
- export const version = '0.26.1';
45
- export const commit = 'a044a77';
46
- export const date = '2024-04-21T08:08:58.000Z';
44
+ export const version = '0.26.3';
45
+ export const commit = '68c671e';
46
+ export const date = '2024-04-26T16:31:36.000Z';
47
47
  export const getVersion = () => {
48
48
  return version;
49
49
  };
@@ -1,6 +1,7 @@
1
1
  // TODO find a better way to do this
2
2
  // most commands don't require sockets
3
3
  // but output channel and terminal need to continuously send data through the socket
4
+ // TODO remove all of these
4
5
  const METHODS_THAT_REQUIRE_SOCKET = new Set([
5
6
  'OutputChannel.open',
6
7
  'ExtensionHost.start',
@@ -9,7 +10,6 @@ const METHODS_THAT_REQUIRE_SOCKET = new Set([
9
10
  'Terminal.create',
10
11
  'IncrementalTextSearch.start',
11
12
  'ElectronApplicationMenu.setItems',
12
- 'GetWindowId.getWindowId',
13
13
  'HandleMessagePortForExtensionHostHelperProcess.handleMessagePortForExtensionHostHelperProcess',
14
14
  'ElectronBrowserView.createBrowserView',
15
15
  'ElectronWebContentsView.createWebContentsView',
@@ -0,0 +1,46 @@
1
+ import * as HandleIpc from '../HandleIpc/HandleIpc.js';
2
+ import * as IpcId from '../IpcId/IpcId.js';
3
+ import * as JsonRpc from '../JsonRpc/JsonRpc.js';
4
+ const state = {
5
+ pendingCount: Object.create(null),
6
+ };
7
+ const addState = (ipcId) => {
8
+ state.pendingCount[ipcId] ||= 0;
9
+ state.pendingCount[ipcId]++;
10
+ };
11
+ const removeState = (ipcId) => {
12
+ state.pendingCount[ipcId]--;
13
+ if (state.pendingCount[ipcId] === 0) {
14
+ delete state.pendingCount[ipcId];
15
+ }
16
+ };
17
+ const hasState = (ipcId) => {
18
+ return ipcId in state.pendingCount;
19
+ };
20
+ const supportsPartialIpcHandling = (ipcId) => {
21
+ switch (ipcId) {
22
+ case IpcId.TerminalProcess:
23
+ case IpcId.ProcessExplorer:
24
+ case IpcId.EmbedsProcess:
25
+ return true;
26
+ default:
27
+ return false;
28
+ }
29
+ };
30
+ // TODO fork ipc object instead of ref counting
31
+ // duplicated ipc object sends and receives one message
32
+ // original ipc object is never used and can
33
+ // be collected after being out of scope
34
+ // duplicated ipc can also be collected
35
+ // when it is out of scope
36
+ export const sendIncomingIpc = async (target, response, ipcId) => {
37
+ if (!hasState(ipcId) && supportsPartialIpcHandling(ipcId)) {
38
+ HandleIpc.handleIpc(target);
39
+ }
40
+ addState(ipcId);
41
+ await JsonRpc.invokeAndTransfer(target, response.transfer, response.method, ...response.params);
42
+ removeState(ipcId);
43
+ if (!hasState(ipcId) && supportsPartialIpcHandling(ipcId)) {
44
+ HandleIpc.unhandleIpc(target);
45
+ }
46
+ };
@@ -1,5 +1,5 @@
1
1
  import * as TemporaryMessagePort from './TemporaryMessagePort.js';
2
2
  export const name = 'TemporaryMessagePort';
3
3
  export const Commands = {
4
- handlePort: TemporaryMessagePort.handlePort,
4
+ handlePorts: TemporaryMessagePort.handlePorts,
5
5
  };
@@ -1,26 +1,17 @@
1
- import * as ParentIpc from '../ParentIpc/ParentIpc.js';
2
1
  import * as Assert from '../Assert/Assert.js';
3
2
  import * as Id from '../Id/Id.js';
3
+ import * as ParentIpc from '../ParentIpc/ParentIpc.js';
4
4
  export const state = {
5
5
  ports: Object.create(null),
6
6
  };
7
- export const create = async (name) => {
8
- Assert.string(name);
9
- await ParentIpc.invoke('TemporaryMessagePort.create', name);
10
- const port = state.ports[name];
11
- if (!port) {
12
- throw new Error(`port was not created`);
13
- }
14
- delete state.ports[name];
15
- port.start();
16
- return port;
17
- };
18
7
  export const getPortTuple = async () => {
19
- const id1 = `${Id.create()}`;
20
- const id2 = `${Id.create()}`;
8
+ const id1 = Id.create();
9
+ const id2 = Id.create();
21
10
  await ParentIpc.invoke('TemporaryMessagePort.createPortTuple', id1, id2);
22
11
  const port1 = state.ports[id1];
23
12
  const port2 = state.ports[id2];
13
+ delete state.ports[id1];
14
+ delete state.ports[id2];
24
15
  return {
25
16
  port1,
26
17
  port2,
@@ -31,8 +22,11 @@ export const sendTo = async (name, port) => {
31
22
  Assert.object(port);
32
23
  await ParentIpc.invokeAndTransfer('TemporaryMessagePort.sendTo', [port], name);
33
24
  };
34
- export const handlePort = (port, name) => {
35
- Assert.string(name);
36
- Assert.object(port);
37
- state.ports[name] = port;
25
+ export const handlePorts = (port1, port2, id1, id2) => {
26
+ Assert.number(id1);
27
+ Assert.number(id2);
28
+ Assert.object(port1);
29
+ Assert.object(port2);
30
+ state.ports[id1] = port1;
31
+ state.ports[id2] = port2;
38
32
  };