@lvce-editor/shared-process 0.24.6 → 0.25.1
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.
- package/package.json +3 -3
- package/src/parts/AppWindow/AppWindow.js +1 -1
- package/src/parts/ChildProcess/ChildProcess.js +1 -1
- package/src/parts/ChromeExtension/ChromeExtension.js +1 -1
- package/src/parts/ClipBoard/ClipBoardWindows.js +1 -0
- package/src/parts/CollectTextSearchStdout/CollectTextSearchStdout.js +1 -1
- package/src/parts/ContentSecurityPolicyDocument/ContentSecurityPolicyDocument.js +1 -3
- package/src/parts/ContentSecurityPolicyTerminalWorker/ContentSecurityPolicyTerminalWorker.js +4 -0
- package/src/parts/ContentSecurityPolicyTestWorker/ContentSecurityPolicyTestWorker.js +0 -2
- package/src/parts/ContentSecurityPolicyWorker/ContentSecurityPolicyWorker.js +0 -2
- package/src/parts/CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js +0 -1
- package/src/parts/Developer/Developer.js +3 -4
- package/src/parts/DownloadAndExtract/DownloadAndExtract.js +1 -1
- package/src/parts/Env/Env.js +1 -1
- package/src/parts/ErrorHandling/ErrorHandling.js +1 -0
- package/src/parts/ExportStatic/ExportStatic.js +16 -9
- package/src/parts/ExtensionInstall/ExtensionInstall.js +1 -3
- package/src/parts/ExtensionManagement/ExtensionManagement.ipc.js +0 -1
- package/src/parts/ExtensionManifests/ExtensionManifestsFromLinkedExtensionsFolder.js +1 -1
- package/src/parts/Extract/Extract.js +1 -1
- package/src/parts/GetElectronFileResponse/GetElectronFileResponse.js +5 -16
- package/src/parts/GetHeaders/GetHeaders.js +11 -9
- package/src/parts/GetHeadersDefault/GetHeadersDefault.js +3 -0
- package/src/parts/GetHeadersExtensionHostWorker/GetHeadersExtensionHostWorker.js +3 -2
- package/src/parts/GetHeadersMainFrame/GetHeadersMainFrame.js +4 -3
- package/src/parts/GetHeadersOtherWorker/GetHeadersOtherWorker.js +3 -2
- package/src/parts/GetHeadersRendererWorker/GetHeadersRendererWorker.js +3 -2
- package/src/parts/GetHeadersTerminalWorker/GetHeadersTerminalWorker.js +10 -0
- package/src/parts/GetHeadersTestWorker/GetHeadersTestWorker.js +3 -2
- package/src/parts/GetNotModifiedResponse/GetNotModifiedResponse.js +11 -0
- package/src/parts/GetServerErrorResponse/GetServerErrorResponse.js +12 -0
- package/src/parts/GetTestRequestResponse/GetTestRequestResponse.js +5 -4
- package/src/parts/GetTypeScriptPath/GetTypeScriptPath.js +5 -2
- package/src/parts/HandleWebSocketForTerminalProcess/HandleWebSocketForTerminalProcess.js +1 -1
- package/src/parts/HandleWebSocketModule/HandleWebSocketModule.js +0 -2
- package/src/parts/HeapSnapshot/HeapSnapshot.js +1 -1
- package/src/parts/HttpHeader/HttpHeader.js +7 -0
- package/src/parts/IpcChild/IpcChild.js +1 -0
- package/src/parts/IpcParent/IpcParent.js +1 -0
- package/src/parts/JsoncFile/JsoncFile.js +1 -0
- package/src/parts/Module/Module.js +0 -2
- package/src/parts/Platform/Platform.js +3 -3
- package/src/parts/PlatformPaths/PlatformPaths.js +0 -7
- package/src/parts/TranspileTypeScript/TranspileTypeScript.js +2 -2
- package/src/parts/WindowsProcessTree/WindowsProcessTree.js +1 -0
- package/src/parts/ExtensionHost/ExtensionHost.ipc.js +0 -20
- package/src/parts/ExtensionHost/ExtensionHost.js +0 -80
- package/src/parts/ExtensionHost/ExtensionHostKeyBindings.js +0 -11
- package/src/parts/ExtensionHostIpc/ExtensionHostIpc.js +0 -5
- package/src/parts/ExtensionHostIpcWithChildProcess/ExtensionHostIpcWithChildProcess.js +0 -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.
|
|
3
|
+
"version": "0.25.1",
|
|
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.
|
|
21
|
+
"@lvce-editor/extension-host-helper-process": "0.25.1",
|
|
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.
|
|
26
|
+
"@lvce-editor/pty-host": "0.25.1",
|
|
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.
|
|
12
|
+
return ParentIpc.invoke('AppWindow.createAppWindow', windowOptions, parsedArgs, workingDirectory, titleBarItems, url)
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export const openNew = async (url) => {
|
|
@@ -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,7 +1,5 @@
|
|
|
1
|
-
import * as Character from '../Character/Character.js'
|
|
2
1
|
import * as AddSemiColon from '../AddSemiColon/AddSemiColon.js'
|
|
3
|
-
|
|
4
|
-
export const key = 'Content-Security-Policy'
|
|
2
|
+
import * as Character from '../Character/Character.js'
|
|
5
3
|
|
|
6
4
|
export const value = [
|
|
7
5
|
`default-src 'none'`,
|
|
@@ -1,6 +1,4 @@
|
|
|
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
|
export const value = [`default-src 'none'`, `script-src 'self'`].map(AddSemiColon.addSemicolon).join(Character.Space)
|
|
@@ -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
|
-
|
|
8
|
-
|
|
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) => {
|
package/src/parts/Env/Env.js
CHANGED
|
@@ -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:
|
|
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
|
|
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
|
}
|
|
@@ -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,13 +20,7 @@ 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)
|
|
@@ -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,15 +1,14 @@
|
|
|
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
|
-
import * as GetHeadersTestWorker from '../GetHeadersTestWorker/GetHeadersTestWorker.js'
|
|
5
5
|
import * as GetHeadersOtherWorker from '../GetHeadersOtherWorker/GetHeadersOtherWorker.js'
|
|
6
|
+
import * as HttpHeader from '../HttpHeader/HttpHeader.js'
|
|
6
7
|
import * as GetHeadersRendererWorker from '../GetHeadersRendererWorker/GetHeadersRendererWorker.js'
|
|
8
|
+
import * as GetHeadersTerminalWorker from '../GetHeadersTerminalWorker/GetHeadersTerminalWorker.js'
|
|
9
|
+
import * as GetHeadersTestWorker from '../GetHeadersTestWorker/GetHeadersTestWorker.js'
|
|
7
10
|
import * as GetMimeType from '../GetMimeType/GetMimeType.js'
|
|
8
11
|
|
|
9
|
-
const getHeadersDefault = () => {
|
|
10
|
-
return {}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
12
|
const getExtraHeaders = (pathName, fileExtension) => {
|
|
14
13
|
switch (fileExtension) {
|
|
15
14
|
case '.html':
|
|
@@ -22,15 +21,18 @@ const getExtraHeaders = (pathName, fileExtension) => {
|
|
|
22
21
|
if (pathName.endsWith('rendererWorkerMain.js')) {
|
|
23
22
|
return GetHeadersRendererWorker.getHeadersRendererWorker()
|
|
24
23
|
}
|
|
25
|
-
if (pathName.endsWith('extensionHostWorkerMain.js')) {
|
|
24
|
+
if (pathName.endsWith('extensionHostWorkerMain.js') || pathName.endsWith('extensionHostWorkerMain.ts')) {
|
|
26
25
|
return GetHeadersExtensionHostWorker.getHeadersExtensionHostWorker()
|
|
27
26
|
}
|
|
27
|
+
if (pathName.endsWith('terminalWorkerMain.js') || pathName.endsWith('terminalWorkerMain.ts')) {
|
|
28
|
+
return GetHeadersTerminalWorker.getHeadersTerminalWorker()
|
|
29
|
+
}
|
|
28
30
|
if (pathName.endsWith('WorkerMain.js') || pathName.endsWith('WorkerMain.ts')) {
|
|
29
31
|
return GetHeadersOtherWorker.getHeadersOtherWorker(pathName)
|
|
30
32
|
}
|
|
31
|
-
return getHeadersDefault()
|
|
33
|
+
return GetHeadersDefault.getHeadersDefault()
|
|
32
34
|
default:
|
|
33
|
-
return getHeadersDefault()
|
|
35
|
+
return GetHeadersDefault.getHeadersDefault()
|
|
34
36
|
}
|
|
35
37
|
}
|
|
36
38
|
|
|
@@ -38,7 +40,7 @@ export const getHeaders = (absolutePath, pathName) => {
|
|
|
38
40
|
const extension = extname(absolutePath)
|
|
39
41
|
const mime = GetMimeType.getMimeType(extension)
|
|
40
42
|
const headers = {
|
|
41
|
-
|
|
43
|
+
[HttpHeader.ContentType]: mime,
|
|
42
44
|
}
|
|
43
45
|
const extraHeaders = getExtraHeaders(pathName, extension)
|
|
44
46
|
return {
|
|
@@ -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
|
|
7
|
-
[
|
|
7
|
+
[HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
|
|
8
|
+
[HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyWorker.value,
|
|
8
9
|
}
|
|
9
10
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
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
|
-
[
|
|
8
|
-
[CrossOriginOpenerPolicy
|
|
9
|
-
[CrossOriginEmbedderPolicy
|
|
8
|
+
[HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyDocument.value,
|
|
9
|
+
[HttpHeader.CrossOriginOpenerPolicy]: CrossOriginOpenerPolicy.value,
|
|
10
|
+
[HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
|
|
10
11
|
}
|
|
11
12
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import * as ContentSecurityPolicyState from '../ContentSecurityPolicyState/ContentSecurityPolicyState.js'
|
|
2
2
|
import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
|
|
3
|
+
import * as HttpHeader from '../HttpHeader/HttpHeader.js'
|
|
3
4
|
|
|
4
5
|
export const getHeadersOtherWorker = (url) => {
|
|
5
6
|
const headers = {
|
|
6
|
-
[CrossOriginEmbedderPolicy
|
|
7
|
+
[HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
|
|
7
8
|
}
|
|
8
9
|
const dynamicCsp = ContentSecurityPolicyState.get(url)
|
|
9
10
|
if (dynamicCsp) {
|
|
10
|
-
headers[
|
|
11
|
+
headers[HttpHeader.ContentSecurityPolicy] = dynamicCsp
|
|
11
12
|
}
|
|
12
13
|
return headers
|
|
13
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
|
|
7
|
-
[
|
|
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
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as ContentSecurityPolicyTestWorker from '../ContentSecurityPolicyTestWorker/ContentSecurityPolicyTestWorker.js'
|
|
2
|
+
import * as HttpHeader from '../HttpHeader/HttpHeader.js'
|
|
2
3
|
import * as CrossOriginEmbedderPolicy from '../CrossOriginEmbedderPolicy/CrossOriginEmbedderPolicy.js'
|
|
3
4
|
|
|
4
5
|
export const getHeadersExtensionHostWorker = () => {
|
|
5
6
|
return {
|
|
6
|
-
[CrossOriginEmbedderPolicy
|
|
7
|
-
[
|
|
7
|
+
[HttpHeader.CrossOriginEmbedderPolicy]: CrossOriginEmbedderPolicy.value,
|
|
8
|
+
[HttpHeader.ContentSecurityPolicy]: ContentSecurityPolicyTestWorker.value,
|
|
8
9
|
}
|
|
9
10
|
}
|
|
@@ -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
|
-
|
|
32
|
-
[CrossOriginEmbedderPolicy
|
|
33
|
-
[CrossOriginOpenerPolicy
|
|
34
|
-
|
|
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
|
|
6
|
+
export const getTypeScriptUri = () => {
|
|
6
7
|
if (IsBuiltServer.isBuiltServer) {
|
|
7
8
|
return 'typescript'
|
|
8
9
|
}
|
|
9
|
-
|
|
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,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:
|
|
@@ -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'
|
|
@@ -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:
|
|
@@ -61,11 +61,11 @@ export const getSetupName = () => {
|
|
|
61
61
|
return 'Lvce-Setup'
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
export const version = '0.
|
|
64
|
+
export const version = '0.25.1'
|
|
65
65
|
|
|
66
|
-
export const commit = '
|
|
66
|
+
export const commit = '2a1f221'
|
|
67
67
|
|
|
68
|
-
export const date = '2024-03-
|
|
68
|
+
export const date = '2024-03-31T09:33:36.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
|
|
10
|
-
const typescript = await LoadTypeScript.loadTypeScript(
|
|
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,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,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
|
-
}
|