rpc-server.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { clipboard } from 'electron/common';
  2. import * as fs from 'fs';
  3. import { ipcMainInternal } from '@electron/internal/browser/ipc-main-internal';
  4. import * as ipcMainUtils from '@electron/internal/browser/ipc-main-internal-utils';
  5. import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
  6. // Implements window.close()
  7. ipcMainInternal.on(IPC_MESSAGES.BROWSER_WINDOW_CLOSE, function (event) {
  8. const window = event.sender.getOwnerBrowserWindow();
  9. if (window) {
  10. window.close();
  11. }
  12. event.returnValue = null;
  13. });
  14. ipcMainInternal.handle(IPC_MESSAGES.BROWSER_GET_LAST_WEB_PREFERENCES, function (event) {
  15. return event.sender.getLastWebPreferences();
  16. });
  17. ipcMainInternal.handle(IPC_MESSAGES.BROWSER_GET_PROCESS_MEMORY_INFO, function (event) {
  18. return event.sender._getProcessMemoryInfo();
  19. });
  20. // Methods not listed in this set are called directly in the renderer process.
  21. const allowedClipboardMethods = (() => {
  22. switch (process.platform) {
  23. case 'darwin':
  24. return new Set(['readFindText', 'writeFindText']);
  25. case 'linux':
  26. return new Set(Object.keys(clipboard));
  27. default:
  28. return new Set();
  29. }
  30. })();
  31. ipcMainUtils.handleSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, function (event, method: string, ...args: any[]) {
  32. if (!allowedClipboardMethods.has(method)) {
  33. throw new Error(`Invalid method: ${method}`);
  34. }
  35. return (clipboard as any)[method](...args);
  36. });
  37. const getPreloadScript = async function (preloadPath: string) {
  38. let preloadSrc = null;
  39. let preloadError = null;
  40. try {
  41. preloadSrc = await fs.promises.readFile(preloadPath, 'utf8');
  42. } catch (error) {
  43. preloadError = error;
  44. }
  45. return { preloadPath, preloadSrc, preloadError };
  46. };
  47. ipcMainUtils.handleSync(IPC_MESSAGES.BROWSER_SANDBOX_LOAD, async function (event) {
  48. const preloadPaths = event.sender._getPreloadPaths();
  49. return {
  50. preloadScripts: await Promise.all(preloadPaths.map(path => getPreloadScript(path))),
  51. process: {
  52. arch: process.arch,
  53. platform: process.platform,
  54. env: { ...process.env },
  55. version: process.version,
  56. versions: process.versions,
  57. execPath: process.helperExecPath
  58. }
  59. };
  60. });
  61. ipcMainInternal.on(IPC_MESSAGES.BROWSER_PRELOAD_ERROR, function (event, preloadPath: string, error: Error) {
  62. event.sender.emit('preload-error', event, preloadPath, error);
  63. });