@lvce-editor/shared-process 0.24.5 → 0.25.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 (56) hide show
  1. package/package.json +3 -3
  2. package/src/parts/AppWindow/AppWindow.js +1 -1
  3. package/src/parts/ChildProcess/ChildProcess.js +1 -1
  4. package/src/parts/ChromeExtension/ChromeExtension.js +1 -1
  5. package/src/parts/ClipBoard/ClipBoardWindows.js +1 -0
  6. package/src/parts/CollectTextSearchStdout/CollectTextSearchStdout.js +1 -1
  7. package/src/parts/ContentSecurityPolicy/ContentSecurityPolicy.ipc.js +7 -0
  8. package/src/parts/ContentSecurityPolicy/ContentSecurityPolicy.js +7 -15
  9. package/src/parts/ContentSecurityPolicyDocument/ContentSecurityPolicyDocument.js +14 -0
  10. package/src/parts/ContentSecurityPolicyState/ContentSecurityPolicyState.js +9 -0
  11. package/src/parts/ContentSecurityPolicyTerminalWorker/ContentSecurityPolicyTerminalWorker.js +4 -0
  12. package/src/parts/ContentSecurityPolicyTestWorker/ContentSecurityPolicyTestWorker.js +4 -0
  13. package/src/parts/ContentSecurityPolicyWorker/ContentSecurityPolicyWorker.js +0 -2
  14. package/src/parts/CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js +0 -1
  15. package/src/parts/Developer/Developer.js +3 -4
  16. package/src/parts/DownloadAndExtract/DownloadAndExtract.js +1 -1
  17. package/src/parts/Env/Env.js +1 -1
  18. package/src/parts/ErrorHandling/ErrorHandling.js +1 -0
  19. package/src/parts/ExportStatic/ExportStatic.js +16 -9
  20. package/src/parts/ExtensionInstall/ExtensionInstall.js +1 -3
  21. package/src/parts/ExtensionManagement/ExtensionManagement.ipc.js +0 -1
  22. package/src/parts/ExtensionManifests/ExtensionManifestsFromLinkedExtensionsFolder.js +1 -1
  23. package/src/parts/Extract/Extract.js +1 -1
  24. package/src/parts/GetElectronFileResponse/GetElectronFileResponse.js +6 -17
  25. package/src/parts/GetHeaders/GetHeaders.js +21 -14
  26. package/src/parts/GetHeadersDefault/GetHeadersDefault.js +3 -0
  27. package/src/parts/GetHeadersExtensionHostWorker/GetHeadersExtensionHostWorker.js +3 -2
  28. package/src/parts/GetHeadersMainFrame/GetHeadersMainFrame.js +5 -4
  29. package/src/parts/GetHeadersOtherWorker/GetHeadersOtherWorker.js +10 -3
  30. package/src/parts/GetHeadersRendererWorker/GetHeadersRendererWorker.js +3 -2
  31. package/src/parts/GetHeadersTerminalWorker/GetHeadersTerminalWorker.js +10 -0
  32. package/src/parts/GetHeadersTestWorker/GetHeadersTestWorker.js +10 -0
  33. package/src/parts/GetNotModifiedResponse/GetNotModifiedResponse.js +11 -0
  34. package/src/parts/GetServerErrorResponse/GetServerErrorResponse.js +12 -0
  35. package/src/parts/GetTestRequestResponse/GetTestRequestResponse.js +5 -4
  36. package/src/parts/GetTypeScriptPath/GetTypeScriptPath.js +5 -2
  37. package/src/parts/HandleWebSocketForTerminalProcess/HandleWebSocketForTerminalProcess.js +1 -1
  38. package/src/parts/HandleWebSocketModule/HandleWebSocketModule.js +0 -2
  39. package/src/parts/HeapSnapshot/HeapSnapshot.js +1 -1
  40. package/src/parts/HttpHeader/HttpHeader.js +7 -0
  41. package/src/parts/IpcChild/IpcChild.js +1 -0
  42. package/src/parts/IpcParent/IpcParent.js +1 -0
  43. package/src/parts/JsoncFile/JsoncFile.js +1 -0
  44. package/src/parts/Module/Module.js +2 -2
  45. package/src/parts/ModuleId/ModuleId.js +1 -0
  46. package/src/parts/ModuleMap/ModuleMap.js +2 -0
  47. package/src/parts/Platform/Platform.js +3 -3
  48. package/src/parts/PlatformPaths/PlatformPaths.js +0 -7
  49. package/src/parts/TranspileTypeScript/TranspileTypeScript.js +2 -2
  50. package/src/parts/WindowsProcessTree/WindowsProcessTree.js +1 -0
  51. package/src/parts/ExtensionHost/ExtensionHost.ipc.js +0 -20
  52. package/src/parts/ExtensionHost/ExtensionHost.js +0 -80
  53. package/src/parts/ExtensionHost/ExtensionHostKeyBindings.js +0 -11
  54. package/src/parts/ExtensionHostIpc/ExtensionHostIpc.js +0 -5
  55. package/src/parts/ExtensionHostIpcWithChildProcess/ExtensionHostIpcWithChildProcess.js +0 -56
  56. package/src/parts/HandleWebSocketForExtensionHost/HandleWebSocketForExtensionHost.js +0 -15
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/shared-process",
3
- "version": "0.24.5",
3
+ "version": "0.25.0",
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.24.5",
21
+ "@lvce-editor/extension-host-helper-process": "0.25.0",
22
22
  "@lvce-editor/ipc": "^2.1.0",
23
23
  "@lvce-editor/json-rpc": "^1.0.0",
24
24
  "@lvce-editor/jsonc-parser": "^1.1.1",
25
25
  "@lvce-editor/pretty-error": "^1.5.0",
26
- "@lvce-editor/pty-host": "0.24.5",
26
+ "@lvce-editor/pty-host": "0.25.0",
27
27
  "@lvce-editor/verror": "^1.1.2",
28
28
  "@lvce-editor/web-socket-server": "^1.1.0",
29
29
  "debug": "^4.3.4",
@@ -9,7 +9,7 @@ export const createAppWindow = async (preferences, parsedArgs, workingDirectory,
9
9
  const { width, height } = await Screen.getBounds()
10
10
  const windowOptions = GetAppWindowOptions.getAppWindowOptions(preferences, width, height)
11
11
  const titleBarItems = GetTitleBarItems.getTitleBarItems()
12
- return ParentIpc.invoke('AppWindow.createAppWindow2', windowOptions, parsedArgs, workingDirectory, titleBarItems, url)
12
+ return ParentIpc.invoke('AppWindow.createAppWindow', windowOptions, parsedArgs, workingDirectory, titleBarItems, url)
13
13
  }
14
14
 
15
15
  export const openNew = async (url) => {
@@ -4,7 +4,7 @@ import exitHook from 'exit-hook'
4
4
  import * as Debug from '../Debug/Debug.js'
5
5
 
6
6
  export const state = {
7
- /** @type{ChildProcess[]} */
7
+ /** @type{NodeChildProcess.ChildProcess[]} */
8
8
  childProcesses: [],
9
9
  }
10
10
 
@@ -3,12 +3,12 @@ import * as Download from '../Download/Download.js'
3
3
  import * as ExtractZip from '../ExtractZip/ExtractZip.js'
4
4
  import * as FileSystem from '../FileSystem/FileSystem.js'
5
5
  import * as Path from '../Path/Path.js'
6
- import * as Platform from '../Platform/Platform.js'
7
6
  import * as PlatformPaths from '../PlatformPaths/PlatformPaths.js'
8
7
  import { VError } from '../VError/VError.js'
9
8
 
10
9
  const getExtensionPath = async (tmpDir) => {
11
10
  const dirents = await FileSystem.readDirWithFileTypes(tmpDir)
11
+ // @ts-ignore
12
12
  if (dirents.length === 1 && dirents[0].type === 'directory') {
13
13
  return Path.join(tmpDir, dirents[0].name)
14
14
  }
@@ -1,3 +1,4 @@
1
+ // @ts-ignore
1
2
  import clipboardEx from 'electron-clipboard-ex'
2
3
  import { VError } from '../VError/VError.js'
3
4
 
@@ -92,7 +92,7 @@ export const collectStdout = async (childProcess, maxSearchResults, charsBefore,
92
92
  callback(error)
93
93
  }
94
94
  },
95
- })
95
+ }),
96
96
  )
97
97
  const results = Object.values(allSearchResults).flat(1)
98
98
  return {
@@ -0,0 +1,7 @@
1
+ import * as ContentSecurityPolicy from './ContentSecurityPolicy.js'
2
+
3
+ export const name = 'ContentSecurityPolicy'
4
+
5
+ export const Commands = {
6
+ set: ContentSecurityPolicy.set,
7
+ }
@@ -1,16 +1,8 @@
1
- import * as Character from '../Character/Character.js'
2
- import * as AddSemiColon from '../AddSemiColon/AddSemiColon.js'
1
+ import * as Assert from '../Assert/Assert.js'
2
+ import * as ContentSecurityPolicyState from '../ContentSecurityPolicyState/ContentSecurityPolicyState.js'
3
3
 
4
- export const key = 'Content-Security-Policy'
5
-
6
- export const value = [
7
- `default-src 'none'`,
8
- `font-src 'self'`,
9
- `frame-src *`,
10
- `img-src 'self' https: data:`,
11
- `script-src 'self'`,
12
- `media-src 'self'`,
13
- `style-src 'self'`,
14
- ]
15
- .map(AddSemiColon.addSemicolon)
16
- .join(Character.Space)
4
+ export const set = (url, contentSecurityPolicy) => {
5
+ Assert.string(url)
6
+ Assert.string(contentSecurityPolicy)
7
+ ContentSecurityPolicyState.set(url, contentSecurityPolicy)
8
+ }
@@ -0,0 +1,14 @@
1
+ import * as AddSemiColon from '../AddSemiColon/AddSemiColon.js'
2
+ import * as Character from '../Character/Character.js'
3
+
4
+ export const value = [
5
+ `default-src 'none'`,
6
+ `font-src 'self'`,
7
+ `frame-src *`,
8
+ `img-src 'self' https: data:`,
9
+ `script-src 'self'`,
10
+ `media-src 'self'`,
11
+ `style-src 'self'`,
12
+ ]
13
+ .map(AddSemiColon.addSemicolon)
14
+ .join(Character.Space)
@@ -0,0 +1,9 @@
1
+ const map = Object.create(null)
2
+
3
+ export const set = (url, contentSecurityPolicy) => {
4
+ map[url] = contentSecurityPolicy
5
+ }
6
+
7
+ export const get = (url) => {
8
+ return map[url]
9
+ }
@@ -0,0 +1,4 @@
1
+ import * as Character from '../Character/Character.js'
2
+ import * as AddSemiColon from '../AddSemiColon/AddSemiColon.js'
3
+
4
+ export const value = [`default-src 'none'`, `script-src 'self'`, `connect-src 'self'`].map(AddSemiColon.addSemicolon).join(Character.Space)
@@ -0,0 +1,4 @@
1
+ import * as Character from '../Character/Character.js'
2
+ import * as AddSemiColon from '../AddSemiColon/AddSemiColon.js'
3
+
4
+ export const value = [`default-src 'none'`, `script-src 'self'`].map(AddSemiColon.addSemicolon).join(Character.Space)
@@ -1,8 +1,6 @@
1
1
  import * as Character from '../Character/Character.js'
2
2
  import * as AddSemiColon from '../AddSemiColon/AddSemiColon.js'
3
3
 
4
- export const key = 'Content-Security-Policy'
5
-
6
4
  // prettier-ignore
7
5
  export const value = [
8
6
  `default-src 'none'`,
@@ -1,2 +1 @@
1
- export const key = 'Cross-Origin-Embedder-Policy'
2
1
  export const value = 'require-corp'
@@ -1,11 +1,10 @@
1
- import { performance } from 'node:perf_hooks'
2
- import * as ExtensionHost from '../ExtensionHost/ExtensionHost.js'
3
1
  import * as Process from '../Process/Process.js'
4
2
 
5
3
  export const measureLatencyBetweenExtensionHostAndSharedProcess = async (socket, id) => {
6
4
  // TODO lazy load extension host
7
- const latency = await ExtensionHost.measureLatency()
8
- socket.send([/* callback */ id, /* latency */ latency])
5
+ // @ts-ignore
6
+ // const latency = await ExtensionHost.measureLatency()
7
+ // socket.send([/* callback */ id, /* latency */ latency])
9
8
  }
10
9
 
11
10
  export const measureLatencyBetweenSharedProcessAndRendererProcess = async (socket, id) => {
@@ -11,7 +11,7 @@ export const downloadAndExtractTarGz = async ({ url, outDir, strip }) => {
11
11
  createGunzip(),
12
12
  tar.extract(outDir, {
13
13
  strip,
14
- })
14
+ }),
15
15
  )
16
16
  } catch (error) {
17
17
  if (error && error instanceof RequestError) {
@@ -18,4 +18,4 @@ export const getRipGrepPath = () => {
18
18
  return process.env.RIP_GREP_PATH
19
19
  }
20
20
 
21
- export const {env} = process
21
+ export const { env } = process
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  import * as Character from '../Character/Character.js'
2
3
  import * as ExitCode from '../ExitCode/ExitCode.js'
3
4
  import * as GetNewLineIndex from '../GetNewLineIndex/GetNewLineIndex.js'
@@ -4,10 +4,6 @@ import * as FileSystem from '../FileSystem/FileSystem.js'
4
4
  import * as JsonFile from '../JsonFile/JsonFile.js'
5
5
  import * as Path from '../Path/Path.js'
6
6
 
7
- // TODO
8
- // - implement this for syntax highlighting projects
9
- // - implement this for language features web extensions
10
-
11
7
  const readExtensionManifest = async (path) => {
12
8
  const json = await JsonFile.readJson(path)
13
9
  return { ...json, path }
@@ -316,15 +312,21 @@ const addExtensionLanguages = async ({ root, extensionPath, extensionJson, commi
316
312
  }
317
313
  }
318
314
 
319
- const addExtensionWebExtension = async ({ root, extensionPath, commitHash, extensionJson, pathPrefix }) => {
315
+ const addExtensionWebExtension = async ({ root, extensionPath, commitHash, extensionJson, pathPrefix, useSimpleWebExtensionFile }) => {
320
316
  if (!extensionJson.browser) {
321
317
  return
322
318
  }
319
+ const webExtensionPath = `${pathPrefix}/${commitHash}/extensions/${extensionJson.id}`
320
+ if (useSimpleWebExtensionFile) {
321
+ const webExtensions = [webExtensionPath]
322
+ await JsonFile.writeJson(Path.join(root, 'dist', commitHash, 'config', 'webExtensions.json'), webExtensions)
323
+ return
324
+ }
323
325
  const webExtensions = [
324
326
  {
325
327
  ...extensionJson,
326
328
  isWeb: true,
327
- path: `${pathPrefix}/${commitHash}/extensions/${extensionJson.id}`,
329
+ path: webExtensionPath,
328
330
  },
329
331
  ]
330
332
  await JsonFile.writeJson(Path.join(root, 'dist', commitHash, 'config', 'webExtensions.json'), webExtensions)
@@ -333,7 +335,7 @@ const addExtensionWebExtension = async ({ root, extensionPath, commitHash, exten
333
335
  }
334
336
  }
335
337
 
336
- const addExtension = async ({ root, extensionPath, commitHash, pathPrefix }) => {
338
+ const addExtension = async ({ root, extensionPath, commitHash, pathPrefix, useSimpleWebExtensionFile }) => {
337
339
  const extensionJson = await readExtensionManifest(Path.join(extensionPath, 'extension.json'))
338
340
  const name = extensionJson.name || extensionJson.id || ''
339
341
  const description = extensionJson.description || ''
@@ -362,6 +364,7 @@ const addExtension = async ({ root, extensionPath, commitHash, pathPrefix }) =>
362
364
  commitHash,
363
365
  extensionJson,
364
366
  pathPrefix,
367
+ useSimpleWebExtensionFile,
365
368
  })
366
369
  }
367
370
 
@@ -420,9 +423,9 @@ const addTestFiles = async ({ testPath, commitHash, root, pathPrefix }) => {
420
423
 
421
424
  /**
422
425
  *
423
- * @param {{root:string, pathPrefix:string , extensionPath:string, testPath:string }} param0
426
+ * @param {{root:string, pathPrefix:string , extensionPath:string, testPath:string, useSimpleWebExtensionFile?:boolean }} param0
424
427
  */
425
- export const exportStatic = async ({ root, pathPrefix, extensionPath, testPath }) => {
428
+ export const exportStatic = async ({ root, pathPrefix, extensionPath, testPath, useSimpleWebExtensionFile }) => {
426
429
  if (!existsSync(root)) {
427
430
  throw new Error(`root path does not exist: ${root}`)
428
431
  }
@@ -460,6 +463,7 @@ export const exportStatic = async ({ root, pathPrefix, extensionPath, testPath }
460
463
  commitHash,
461
464
  pathPrefix,
462
465
  root,
466
+ useSimpleWebExtensionFile,
463
467
  })
464
468
  console.timeEnd('addExtension')
465
469
 
@@ -473,4 +477,7 @@ export const exportStatic = async ({ root, pathPrefix, extensionPath, testPath }
473
477
  })
474
478
  console.timeEnd('addTestFiles')
475
479
  }
480
+ return {
481
+ commitHash,
482
+ }
476
483
  }
@@ -4,9 +4,7 @@ import * as ExtensionInstallType from '../ExtensionInstallType/ExtensionInstallT
4
4
  const getModule = (type) => {
5
5
  switch (type) {
6
6
  case ExtensionInstallType.GithubRepository:
7
- return import(
8
- '../ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js'
9
- )
7
+ return import('../ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js')
10
8
  case ExtensionInstallType.Url:
11
9
  return import('../ExtensionInstallFromUrl/ExtensionInstallFromUrl.js')
12
10
  case ExtensionInstallType.File:
@@ -15,6 +15,5 @@ export const Commands = {
15
15
  'ExtensionManagement.enable': ExtensionManagement.enable,
16
16
  'ExtensionManagement.getAllExtensions': ExtensionManagement.getExtensions,
17
17
  'ExtensionManagement.getExtensions': ExtensionManagement.getExtensions,
18
- 'ExtensionManagement.install': ExtensionManagement.install,
19
18
  'ExtensionManagement.uninstall': ExtensionManagement.uninstall,
20
19
  }
@@ -20,7 +20,7 @@ const readSymlinks = (absolutePaths) => {
20
20
  }
21
21
 
22
22
  const mergeWithSymLinks = (manifests, symlinks) => {
23
- const {length} = manifests
23
+ const { length } = manifests
24
24
  const merged = []
25
25
  for (let i = 0; i < length; i++) {
26
26
  const manifest = manifests[i]
@@ -22,7 +22,7 @@ export const extractTarGz = async ({ inFile, outDir, strip }) => {
22
22
  createGunzip(),
23
23
  tar.extract(outDir, {
24
24
  strip,
25
- })
25
+ }),
26
26
  )
27
27
  } catch (error) {
28
28
  throw new VError(error, `Failed to extract ${inFile}`)
@@ -4,8 +4,10 @@ import * as GetElectronFileResponseContent from '../GetElectronFileResponseConte
4
4
  import * as GetElectronFileResponseRelativePath from '../GetElectronFileResponseRelativePath/GetElectronFileResponseRelativePath.js'
5
5
  import * as GetEtag from '../GetEtag/GetEtag.js'
6
6
  import * as GetHeaders from '../GetHeaders/GetHeaders.js'
7
- import * as HttpStatusCode from '../HttpStatusCode/HttpStatusCode.js'
8
7
  import * as GetNotFoundResponse from '../GetNotFoundResponse/GetNotFoundResponse.js'
8
+ import * as GetNotModifiedResponse from '../GetNotModifiedResponse/GetNotModifiedResponse.js'
9
+ import * as GetServerErrorResponse from '../GetServerErrorResponse/GetServerErrorResponse.js'
10
+ import * as HttpStatusCode from '../HttpStatusCode/HttpStatusCode.js'
9
11
  import * as IsEnoentError from '../IsEnoentError/IsEnoentError.js'
10
12
  import * as Logger from '../Logger/Logger.js'
11
13
 
@@ -18,17 +20,11 @@ export const getElectronFileResponse = async (url, request) => {
18
20
  const stats = await stat(absolutePath)
19
21
  etag = GetEtag.getEtag(stats)
20
22
  if (request.headers['if-none-match'] === etag) {
21
- return {
22
- body: '',
23
- init: {
24
- status: HttpStatusCode.NotModifed,
25
- headers: {},
26
- },
27
- }
23
+ return GetNotModifiedResponse.getNotModifiedResponse()
28
24
  }
29
25
  }
30
26
  const content = await GetElectronFileResponseContent.getElectronFileResponseContent(request, absolutePath, url)
31
- const headers = GetHeaders.getHeaders(absolutePath)
27
+ const headers = GetHeaders.getHeaders(absolutePath, pathName)
32
28
  headers['Cache-Control'] = 'public, max-age=0, must-revalidate'
33
29
  if (etag) {
34
30
  headers['Etag'] = etag
@@ -45,13 +41,6 @@ export const getElectronFileResponse = async (url, request) => {
45
41
  return GetNotFoundResponse.getNotFoundResponse()
46
42
  }
47
43
  Logger.error(error)
48
- return {
49
- body: 'server-error',
50
- init: {
51
- status: HttpStatusCode.ServerError,
52
- statusText: 'server-error',
53
- headers: {},
54
- },
55
- }
44
+ return GetServerErrorResponse.getServerErrorResponse()
56
45
  }
57
46
  }
@@ -1,41 +1,48 @@
1
1
  import { extname } from 'path'
2
+ import * as GetHeadersDefault from '../GetHeadersDefault/GetHeadersDefault.js'
2
3
  import * as GetHeadersExtensionHostWorker from '../GetHeadersExtensionHostWorker/GetHeadersExtensionHostWorker.js'
3
4
  import * as GetHeadersMainFrame from '../GetHeadersMainFrame/GetHeadersMainFrame.js'
4
5
  import * as GetHeadersOtherWorker from '../GetHeadersOtherWorker/GetHeadersOtherWorker.js'
6
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
5
7
  import * as GetHeadersRendererWorker from '../GetHeadersRendererWorker/GetHeadersRendererWorker.js'
8
+ import * as GetHeadersTerminalWorker from '../GetHeadersTerminalWorker/GetHeadersTerminalWorker.js'
9
+ import * as GetHeadersTestWorker from '../GetHeadersTestWorker/GetHeadersTestWorker.js'
6
10
  import * as GetMimeType from '../GetMimeType/GetMimeType.js'
7
11
 
8
- const getHeadersDefault = () => {
9
- return {}
10
- }
11
-
12
- const getExtraHeaders = (url, fileExtension) => {
12
+ const getExtraHeaders = (pathName, fileExtension) => {
13
13
  switch (fileExtension) {
14
14
  case '.html':
15
15
  return GetHeadersMainFrame.getHeadersMainFrame()
16
16
  case '.js':
17
- if (url.endsWith('rendererWorkerMain.js')) {
17
+ case '.ts':
18
+ if (pathName.endsWith('testWorkerMain.js') || pathName.endsWith('testWorkerMain.ts')) {
19
+ return GetHeadersTestWorker.getHeadersExtensionHostWorker()
20
+ }
21
+ if (pathName.endsWith('rendererWorkerMain.js')) {
18
22
  return GetHeadersRendererWorker.getHeadersRendererWorker()
19
23
  }
20
- if (url.endsWith('extensionHostWorkerMain.js')) {
24
+ if (pathName.endsWith('extensionHostWorkerMain.js') || pathName.endsWith('extensionHostWorkerMain.ts')) {
21
25
  return GetHeadersExtensionHostWorker.getHeadersExtensionHostWorker()
22
26
  }
23
- if (url.endsWith('WorkerMain.js')) {
24
- return GetHeadersOtherWorker.getHeadersOtherWorker()
27
+ if (pathName.endsWith('terminalWorkerMain.js') || pathName.endsWith('terminalWorkerMain.ts')) {
28
+ return GetHeadersTerminalWorker.getHeadersTerminalWorker()
29
+ }
30
+ if (pathName.endsWith('WorkerMain.js') || pathName.endsWith('WorkerMain.ts')) {
31
+ return GetHeadersOtherWorker.getHeadersOtherWorker(pathName)
25
32
  }
26
- return getHeadersDefault()
33
+ return GetHeadersDefault.getHeadersDefault()
27
34
  default:
28
- return getHeadersDefault()
35
+ return GetHeadersDefault.getHeadersDefault()
29
36
  }
30
37
  }
31
38
 
32
- export const getHeaders = (absolutePath) => {
39
+ export const getHeaders = (absolutePath, pathName) => {
33
40
  const extension = extname(absolutePath)
34
41
  const mime = GetMimeType.getMimeType(extension)
35
42
  const headers = {
36
- 'Content-Type': mime,
43
+ [HttpHeader.ContentType]: mime,
37
44
  }
38
- const extraHeaders = getExtraHeaders(absolutePath, extension)
45
+ const extraHeaders = getExtraHeaders(pathName, extension)
39
46
  return {
40
47
  ...headers,
41
48
  ...extraHeaders,
@@ -0,0 +1,3 @@
1
+ export const getHeadersDefault = () => {
2
+ return {}
3
+ }
@@ -1,9 +1,10 @@
1
1
  import * as ContentSecurityPolicyWorker from '../ContentSecurityPolicyWorker/ContentSecurityPolicyWorker.js'
2
2
  import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
3
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
3
4
 
4
5
  export const getHeadersExtensionHostWorker = () => {
5
6
  return {
6
- [CrossOriginEmbedderPolicy.key]: CrossOriginEmbedderPolicy.value,
7
- [ContentSecurityPolicyWorker.key]: ContentSecurityPolicyWorker.value,
7
+ [HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
8
+ [HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyWorker.value,
8
9
  }
9
10
  }
@@ -1,11 +1,12 @@
1
- import * as ContentSecurityPolicy from '../ContentSecurityPolicy/ContentSecurityPolicy.js'
1
+ import * as ContentSecurityPolicyDocument from '../ContentSecurityPolicyDocument/ContentSecurityPolicyDocument.js'
2
2
  import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
3
3
  import * as CrossOriginOpenerPolicy from '../CrossOriginOpenerPolicy/CrossOriginOpenerPolicy.js'
4
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
4
5
 
5
6
  export const getHeadersMainFrame = () => {
6
7
  return {
7
- [ContentSecurityPolicy.key]: ContentSecurityPolicy.value,
8
- [CrossOriginOpenerPolicy.key]: CrossOriginOpenerPolicy.value,
9
- [CrossOriginEmbedderPolicy.key]: CrossOriginEmbedderPolicy.value,
8
+ [HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyDocument.value,
9
+ [HttpHeader.CrossOriginOpenerPolicy]: CrossOriginOpenerPolicy.value,
10
+ [HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
10
11
  }
11
12
  }
@@ -1,7 +1,14 @@
1
+ import * as ContentSecurityPolicyState from '../ContentSecurityPolicyState/ContentSecurityPolicyState.js'
1
2
  import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
3
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
2
4
 
3
- export const getHeadersOtherWorker = () => {
4
- return {
5
- [CrossOriginEmbedderPolicy.key]: CrossOriginEmbedderPolicy.value,
5
+ export const getHeadersOtherWorker = (url) => {
6
+ const headers = {
7
+ [HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
6
8
  }
9
+ const dynamicCsp = ContentSecurityPolicyState.get(url)
10
+ if (dynamicCsp) {
11
+ headers[HttpHeader.ContentSecurityPolicy] = dynamicCsp
12
+ }
13
+ return headers
7
14
  }
@@ -1,9 +1,10 @@
1
1
  import * as ContentSecurityPolicyWorker from '../ContentSecurityPolicyWorker/ContentSecurityPolicyWorker.js'
2
2
  import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
3
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
3
4
 
4
5
  export const getHeadersRendererWorker = () => {
5
6
  return {
6
- [CrossOriginEmbedderPolicy.key]: CrossOriginEmbedderPolicy.value,
7
- [ContentSecurityPolicyWorker.key]: ContentSecurityPolicyWorker.value,
7
+ [HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
8
+ [HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyWorker.value,
8
9
  }
9
10
  }
@@ -0,0 +1,10 @@
1
+ import * as ContentSecurityPolicyTerminalWorker from '../ContentSecurityPolicyTerminalWorker/ContentSecurityPolicyTerminalWorker.js'
2
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
3
+ import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
4
+
5
+ export const getHeadersTerminalWorker = () => {
6
+ return {
7
+ [HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
8
+ [HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyTerminalWorker.value,
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ import * as ContentSecurityPolicyTestWorker from '../ContentSecurityPolicyTestWorker/ContentSecurityPolicyTestWorker.js'
2
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
3
+ import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
4
+
5
+ export const getHeadersExtensionHostWorker = () => {
6
+ return {
7
+ [HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
8
+ [HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyTestWorker.value,
9
+ }
10
+ }
@@ -0,0 +1,11 @@
1
+ import * as HttpStatusCode from '../HttpStatusCode/HttpStatusCode.js'
2
+
3
+ export const getNotModifiedResponse = async () => {
4
+ return {
5
+ body: '',
6
+ init: {
7
+ status: HttpStatusCode.NotModifed,
8
+ headers: {},
9
+ },
10
+ }
11
+ }
@@ -0,0 +1,12 @@
1
+ import * as HttpStatusCode from '../HttpStatusCode/HttpStatusCode.js'
2
+
3
+ export const getServerErrorResponse = () => {
4
+ return {
5
+ body: 'server-error',
6
+ init: {
7
+ status: HttpStatusCode.ServerError,
8
+ statusText: 'server-error',
9
+ headers: {},
10
+ },
11
+ }
12
+ }
@@ -3,6 +3,7 @@ import { join } from 'node:path'
3
3
  import * as CreateTestOverview from '../CreateTestOverview/CreateTestOverview.js'
4
4
  import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
5
5
  import * as CrossOriginOpenerPolicy from '../CrossOriginOpenerPolicy/CrossOriginOpenerPolicy.js'
6
+ import * as HttpHeader from '../HttpHeader/HttpHeader.js'
6
7
  import * as GetPathName from '../GetPathName/GetPathName.js'
7
8
  import * as GetTestPath from '../GetTestPath/GetTestPath.js'
8
9
  import * as HttpStatusCode from '../HttpStatusCode/HttpStatusCode.js'
@@ -28,10 +29,10 @@ export const getTestRequestResponse = async (request, indexHtmlPath) => {
28
29
  init: {
29
30
  status: HttpStatusCode.MultipleChoices,
30
31
  headers: {
31
- 'Cache-Control': 'public, max-age=0, must-revalidate',
32
- [CrossOriginEmbedderPolicy.key]: CrossOriginEmbedderPolicy.value,
33
- [CrossOriginOpenerPolicy.key]: CrossOriginOpenerPolicy.value,
34
- 'Content-Security-Policy': "default-src 'none'",
32
+ [HttpHeader.CacheControl]: 'public, max-age=0, must-revalidate',
33
+ [HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
34
+ [HttpHeader.CrossOriginOpenerPolicy]: CrossOriginOpenerPolicy.value,
35
+ [HttpHeader.ContentSecurityPolicy]: "default-src 'none'",
35
36
  },
36
37
  },
37
38
  }
@@ -1,12 +1,13 @@
1
1
  import { join } from 'node:path'
2
2
  import * as IsBuiltServer from '../IsBuiltServer/IsBuiltServer.js'
3
3
  import * as PlatformPaths from '../PlatformPaths/PlatformPaths.js'
4
+ import { pathToFileURL } from 'node:url'
4
5
 
5
- export const getTypeScriptPath = () => {
6
+ export const getTypeScriptUri = () => {
6
7
  if (IsBuiltServer.isBuiltServer) {
7
8
  return 'typescript'
8
9
  }
9
- return join(
10
+ const typescriptPath = join(
10
11
  PlatformPaths.getBuiltinExtensionsPath(),
11
12
  'builtin.language-features-typescript',
12
13
  'node',
@@ -15,4 +16,6 @@ export const getTypeScriptPath = () => {
15
16
  'lib',
16
17
  'typescript.js',
17
18
  )
19
+ const typescriptUri = pathToFileURL(typescriptPath).toString()
20
+ return typescriptUri
18
21
  }
@@ -8,7 +8,7 @@ export const handleWebSocket = async (message, handle) => {
8
8
  method: 'HandleWebSocket.handleWebSocket',
9
9
  params: [message],
10
10
  },
11
- handle
11
+ handle,
12
12
  )
13
13
  // console.log({ instance })
14
14
  // const ipc = await PtyHost.getOrCreate()
@@ -8,8 +8,6 @@ export const load = (protocol) => {
8
8
  switch (protocol) {
9
9
  case ProtocolType.SharedProcess:
10
10
  return import('../HandleWebSocketForSharedProcess/HandleWebSocketForSharedProcess.js')
11
- case ProtocolType.ExtensionHost:
12
- return import('../HandleWebSocketForExtensionHost/HandleWebSocketForExtensionHost.js')
13
11
  case ProtocolType.ExtensionHostHelperProcess:
14
12
  return import('../HandleWebSocketForExtensionHostHelperProcess/HandleWebSocketForExtensionHostHelperProcess.js')
15
13
  case ProtocolType.TerminalProcess:
@@ -6,6 +6,6 @@ export const createHeapSnapshot = async () => {
6
6
  await pipeline(
7
7
  getHeapSnapshot(),
8
8
  // TODO get tmp dir from env
9
- createWriteStream(`/tmp/vscode-${Date.now()}.heapsnapshot`)
9
+ createWriteStream(`/tmp/vscode-${Date.now()}.heapsnapshot`),
10
10
  )
11
11
  }
@@ -0,0 +1,7 @@
1
+ export const CacheControl = 'Cache-Control'
2
+ export const ContentType = 'Content-Type'
3
+ export const ContentSecurityPolicy = 'Content-Security-Policy'
4
+ export const CrossOriginEmbedderPolicy = 'Cross-Origin-Embedder-Policy'
5
+ export const CrossOriginOpenerPolicy = 'Cross-Origin-Opener-Policy'
6
+ export const Etag = 'Etag'
7
+ export const IfNotMatch = 'if-none-match'
@@ -9,6 +9,7 @@ export const listen = async ({ method, ...params }) => {
9
9
  // @ts-ignore
10
10
  module.signal(rawIpc)
11
11
  }
12
+ // @ts-ignore
12
13
  const ipc = module.wrap(rawIpc)
13
14
  return ipc
14
15
  }
@@ -4,6 +4,7 @@ export const create = async ({ method, ...options }) => {
4
4
  const module = await IpcParentModule.getModule(method)
5
5
  // @ts-ignore
6
6
  const rawIpc = await module.create(options)
7
+ // @ts-ignore
7
8
  const ipc = module.wrap(rawIpc)
8
9
  return ipc
9
10
  }
@@ -3,6 +3,7 @@ import * as Jsonc from '../Jsonc/Jsonc.js'
3
3
 
4
4
  export const readJsonc = async (absolutePath) => {
5
5
  const content = await FileSystem.readFile(absolutePath)
6
+ // @ts-ignore
6
7
  const json = await Jsonc.parse(content)
7
8
  return json
8
9
  }
@@ -60,8 +60,6 @@ export const load = (moduleId) => {
60
60
  return import('../Exit/Exit.ipc.js')
61
61
  case ModuleId.HandleRequestTest:
62
62
  return import('../HandleRequestTest/HandleRequestTest.ipc.js')
63
- case ModuleId.ExtensionHost:
64
- return import('../ExtensionHost/ExtensionHost.ipc.js')
65
63
  case ModuleId.ExtensionManagement:
66
64
  return import('../ExtensionManagement/ExtensionManagement.ipc.js')
67
65
  case ModuleId.FileSystem:
@@ -148,6 +146,8 @@ export const load = (moduleId) => {
148
146
  return import('../ElectronWebContentsView/ElectronWebContentsView.ipc.js')
149
147
  case ModuleId.ElectronWebContentsViewFunctions:
150
148
  return import('../ElectronWebContentsViewFunctions/ElectronWebContentsViewFunctions.ipc.js')
149
+ case ModuleId.ContentSecurityPolicy:
150
+ return import('../ContentSecurityPolicy/ContentSecurityPolicy.ipc.js')
151
151
  default:
152
152
  throw new Error(`module ${moduleId} not found`)
153
153
  }
@@ -73,3 +73,4 @@ export const ElectronWebContents = 66
73
73
  export const ElectronWebContentsView = 67
74
74
  export const ElectronWebContentsViewFunctions = 68
75
75
  export const HandleRequestTest = 69
76
+ export const ContentSecurityPolicy = 70
@@ -323,6 +323,8 @@ export const getModuleId = (commandId) => {
323
323
  return ModuleId.ElectronWebContentsView
324
324
  case 'HandleRequestTest.handleRequestTest':
325
325
  return ModuleId.HandleRequestTest
326
+ case 'ContentSecurityPolicy.set':
327
+ return ModuleId.ContentSecurityPolicy
326
328
  default:
327
329
  throw new CommandNotFoundError(commandId)
328
330
  }
@@ -61,11 +61,11 @@ export const getSetupName = () => {
61
61
  return 'Lvce-Setup'
62
62
  }
63
63
 
64
- export const version = '0.24.5'
64
+ export const version = '0.25.0'
65
65
 
66
- export const commit = '0319484'
66
+ export const commit = '7b5484b'
67
67
 
68
- export const date = '2024-03-22T20:31:46.000Z'
68
+ export const date = '2024-03-28T18:47:46.000Z'
69
69
 
70
70
  export const getVersion = () => {
71
71
  return version
@@ -71,13 +71,6 @@ export const getUserKeyBindingsPath = () => {
71
71
  return Path.join(configDir, 'keybindings.json')
72
72
  }
73
73
 
74
- export const getExtensionHostPath = async () => {
75
- const { extensionHostPath } = await import(
76
- '@lvce-editor/extension-host'
77
- )
78
- return extensionHostPath
79
- }
80
-
81
74
  export const getExtensionHostHelperProcessPath = async () => {
82
75
  const { extensionHostHelperProcessPath } = await import(
83
76
  '@lvce-editor/extension-host-helper-process'
@@ -6,8 +6,8 @@ import * as LoadTypeScript from '../LoadTypeScript/LoadTypeScript.js'
6
6
  export const transpileTypeScript = async (code) => {
7
7
  try {
8
8
  Assert.string(code)
9
- const typescriptPath = GetTypeScriptPath.getTypeScriptPath()
10
- const typescript = await LoadTypeScript.loadTypeScript(typescriptPath)
9
+ const typescriptUri = GetTypeScriptPath.getTypeScriptUri()
10
+ const typescript = await LoadTypeScript.loadTypeScript(typescriptUri)
11
11
  const newContent = await typescript.transpileModule(code, {
12
12
  compilerOptions: {
13
13
  target: 'esnext',
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  import * as LoadWindowsProcessTree from '../LoadWindowsProcessTree/LoadWindowsProcessTree.js'
2
3
  import * as Promises from '../Promises/Promises.js'
3
4
 
@@ -1,20 +0,0 @@
1
- import * as Command from '../Command/Command.js'
2
- import * as ExtensionHost from './ExtensionHost.js'
3
- import * as ExtensionHostKeyBindings from './ExtensionHostKeyBindings.js'
4
-
5
- // prettier-ignore
6
- export const Commands = {
7
-
8
- 'ExtensionHost.dispose': ExtensionHost.dispose,
9
- 'ExtensionHost.send': ExtensionHost.send,
10
- 'ExtensionHost.start': ExtensionHost.start,
11
- 'ExtensionHostKeyBindings.getKeyBindings': ExtensionHostKeyBindings.getKeyBindings,
12
- // 'ExtensionHost.getCommands': ExtensionHostCommand.getCommandsIpc,
13
- // 'ExtensionHostCompletion.execute': ExtensionHost.forward,
14
- // 'ExtensionHostExtension.activate': ExtensionHost.forward,
15
- // 'ExtensionHostExtension.disable': ExtensionHost.forward,
16
- // 'ExtensionHostSemanticTokens.executeSemanticTokenProvider': ExtensionHost.forward,
17
- // 'ExtensionHostTextDocument.setLanguageId': ExtensionHost.forward,
18
- // 'ExtensionHostTextDocument.syncFull': ExtensionHost.forward,
19
- // 'ExtensionHostTextDocument.syncIncremental': ExtensionHost.forward,
20
- }
@@ -1,80 +0,0 @@
1
- import * as Assert from '../Assert/Assert.js'
2
- import * as Callback from '../Callback/Callback.js'
3
- import * as ExtensionHostIpc from '../ExtensionHostIpc/ExtensionHostIpc.js'
4
- import * as ExtensionHostRpc from '../ExtensionHostRpc/ExtensionHostRpc.js'
5
- import * as JsonRpc from '../JsonRpc/JsonRpc.js'
6
- import * as JsonRpcVersion from '../JsonRpcVersion/JsonRpcVersion.js'
7
- import { VError } from '../VError/VError.js'
8
-
9
- // TODO maybe rename to extension host management for clarity
10
-
11
- /**
12
- * @type{{extensionHosts:any }}
13
- */
14
- export const state = {
15
- extensionHosts: Object.create(null),
16
- }
17
-
18
- // TODO this function is very ugly and has probably memory leaks
19
- const createExtensionHost = async (socket) => {
20
- Assert.object(socket)
21
- const ipc = await ExtensionHostIpc.create()
22
- const rpc = ExtensionHostRpc.create(ipc, socket)
23
- return rpc
24
- }
25
-
26
- export const start = async (socket) => {
27
- try {
28
- const id = 1
29
- console.log('start extension host', id)
30
- const handleMessage = (message) => {
31
- if ('result' in message) {
32
- Callback.resolve(message.id, message.result)
33
- } else if ('error' in message) {
34
- Callback.reject(message.id, message.error)
35
- } else {
36
- console.error('unsupported message type')
37
- }
38
- }
39
- const extensionHost = await createExtensionHost(socket)
40
- extensionHost.on('message', handleMessage)
41
- state.extensionHosts[id] = extensionHost
42
- return id
43
- } catch (error) {
44
- throw new VError(error, 'Failed to start extension host')
45
- }
46
- }
47
-
48
- export const send = async (socket, id, message) => {
49
- Assert.number(id)
50
- Assert.object(message)
51
- console.log(Object.keys(state))
52
- const extensionHost = state.extensionHosts[id]
53
- if (!extensionHost) {
54
- throw new VError(`no extension host with id ${id} found`)
55
- }
56
- try {
57
- const result = await JsonRpc.invoke(extensionHost, message.method, ...message.params)
58
- socket.send({
59
- jsonrpc: JsonRpcVersion.Two,
60
- id: message.id,
61
- result,
62
- })
63
- } catch (error) {
64
- // console.log({ error })
65
- socket.send({
66
- jsonrpc: JsonRpcVersion.Two,
67
- id: message.id,
68
- error,
69
- })
70
- }
71
- }
72
-
73
- export const dispose = (id) => {
74
- const extensionHost = state.extensionHosts[id]
75
- if (!extensionHost) {
76
- throw new VError(`no extension host with id ${id} found`)
77
- }
78
- extensionHost.dispose()
79
- delete state.extensionHosts[id]
80
- }
@@ -1,11 +0,0 @@
1
- import * as ExtensionManagement from '../ExtensionManagement/ExtensionManagement.js'
2
-
3
- const getExtensionKeyBindings = (extension) => {
4
- return extension.keyBindings || []
5
- }
6
-
7
- export const getKeyBindings = async () => {
8
- const extensions = await ExtensionManagement.getExtensions()
9
- const keyBindings = extensions.flatMap(getExtensionKeyBindings)
10
- return keyBindings
11
- }
@@ -1,5 +0,0 @@
1
- import * as ExtensionHostIpcWithChildProcess from '../ExtensionHostIpcWithChildProcess/ExtensionHostIpcWithChildProcess.js'
2
-
3
- export const create = () => {
4
- return ExtensionHostIpcWithChildProcess.create()
5
- }
@@ -1,56 +0,0 @@
1
- import * as ChildProcess from '../ChildProcess/ChildProcess.js'
2
- import * as PlatformPaths from '../PlatformPaths/PlatformPaths.js'
3
-
4
- export const create = async () => {
5
- const extensionHostPath = await PlatformPaths.getExtensionHostPath()
6
- const childProcess = ChildProcess.fork(
7
- extensionHostPath,
8
- ['--ipc-type=websocket', '--experimental-json-modules', '--max-old-space-size=60', '--enable-source-maps'],
9
- {
10
- env: {
11
- ...process.env,
12
- LOGS_DIR: PlatformPaths.getLogsDir(),
13
- CONFIG_DIR: PlatformPaths.getConfigDir(),
14
- },
15
- },
16
- )
17
- return {
18
- on(event, listener) {
19
- switch (event) {
20
- case 'message':
21
- childProcess.on('message', listener)
22
- break
23
- case 'error':
24
- childProcess.on('error', listener)
25
- break
26
- case 'exit':
27
- childProcess.on('exit', listener)
28
- break
29
- default:
30
- throw new Error(`unsupported event type ${event}`)
31
- }
32
- },
33
- off(event, listener) {
34
- switch (event) {
35
- case 'message':
36
- childProcess.off('message', listener)
37
- break
38
- case 'error':
39
- childProcess.off('error', listener)
40
- break
41
- case 'exit':
42
- childProcess.off('exit', listener)
43
- break
44
- default:
45
- throw new Error(`unsupported event type ${event}`)
46
- }
47
- },
48
- send(message) {
49
- childProcess.send(message)
50
- },
51
- dispose() {
52
- childProcess.kill()
53
- },
54
- _process: childProcess,
55
- }
56
- }
@@ -1,15 +0,0 @@
1
- import * as ExtensionHostIpc from '../ExtensionHostIpc/ExtensionHostIpc.js'
2
- import * as ExtensionHostRpc from '../ExtensionHostRpc/ExtensionHostRpc.js'
3
-
4
- // TODO lazyload modules for spawning extension host, they are only needed later
5
- export const handleWebSocket = async (message, handle) => {
6
- // console.log('[shared-process] received extension host websocket', message)
7
- const ipc = await ExtensionHostIpc.create()
8
- console.info('[sharedprocess] creating extension ipc')
9
- const rpc = await ExtensionHostRpc.create(ipc, handle)
10
- console.info('[sharedprocess] created extension host rpc')
11
- ipc._process.send(message, handle)
12
- // rpc.send(message)
13
- // console.log('spawned extension host')
14
- // console.log(rpc)
15
- }