@lvce-editor/shared-process 0.108.12 → 0.108.14

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/shared-process",
3
- "version": "0.108.12",
3
+ "version": "0.108.14",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -3,6 +3,6 @@ import { fileURLToPath } from 'url'
3
3
 
4
4
  export const getBuiltinExtensionsPath = () => {
5
5
  const staticServerPath = fileURLToPath(import.meta.resolve('@lvce-editor/static-server'))
6
- const builtinExtensionsPath = join(staticServerPath, '..', '..', 'static', 'bf15721', 'extensions')
6
+ const builtinExtensionsPath = join(staticServerPath, '..', '..', 'static', '0efdeb9', 'extensions')
7
7
  return builtinExtensionsPath
8
8
  }
@@ -12,6 +12,7 @@ export const getExtensionManifests = async (path) => {
12
12
  return [
13
13
  {
14
14
  ...manifest,
15
+ linked: true,
15
16
  symlink: path,
16
17
  },
17
18
  ]
@@ -12,6 +12,12 @@ export const handleElectronReady = async (parsedArgs, workingDirectory) => {
12
12
  Assert.string(workingDirectory)
13
13
  try {
14
14
  await TransientLinkedExtensions.validate()
15
+ } catch (error) {
16
+ Logger.error(error)
17
+ Process.exit(ExitCode.Error)
18
+ return
19
+ }
20
+ try {
15
21
  const preferences = await Preferences.getAllSafe()
16
22
  const preloadUrl = PreloadUrl.getPreloadUrl()
17
23
  await AppWindow.createAppWindow({ parsedArgs, preferences, preloadUrl, workingDirectory })
@@ -1,7 +1,7 @@
1
- import * as HandleRequestTest from './HandleRequest.js'
1
+ import * as HandleRequest from './HandleRequest.js'
2
2
 
3
3
  export const name = 'HandleRequest'
4
4
 
5
5
  export const Commands = {
6
- handleRequest: HandleRequestTest.handleRequest,
6
+ handleRequest: HandleRequest.handleRequest,
7
7
  }
@@ -1,22 +1,28 @@
1
1
  import { join } from 'path'
2
2
  import * as Assert from '../Assert/Assert.js'
3
3
  import * as GetElectronFileResponse from '../GetElectronFileResponse/GetElectronFileResponse.js'
4
- import * as HandleRequestTest from '../HandleRequestTest/HandleRequestTest.js'
5
- import * as HttpServerResponse from '../HttpServerResponse/HttpServerResponse.js'
4
+ import * as GetTestRequestResponse from '../GetTestRequestResponse/GetTestRequestResponse.js'
5
+ import * as HttpStatusCode from '../HttpStatusCode/HttpStatusCode.js'
6
6
  import * as StaticPath from '../StaticPath/StaticPath.js'
7
7
 
8
- export const handleRequest = async (socket, request) => {
9
- if (!request) {
10
- // socket might have been closed during transfer
11
- return
8
+ const toHttpResponse = (request, response) => {
9
+ const { body, init } = response
10
+ return {
11
+ body,
12
+ hasBody: request.method !== 'HEAD' && init.status !== HttpStatusCode.NotModifed,
13
+ headers: init.headers || {},
14
+ status: init.status,
12
15
  }
13
- Assert.object(socket)
16
+ }
17
+
18
+ export const handleRequest = async (request) => {
14
19
  Assert.object(request)
15
20
  if (request.url.startsWith('/tests')) {
16
21
  const staticPath = StaticPath.getStaticPath()
17
22
  const indexHtmlPath = join(staticPath, 'index.html')
18
- return HandleRequestTest.handleRequestTest(socket, request, indexHtmlPath)
23
+ const response = await GetTestRequestResponse.getTestRequestResponse(request, indexHtmlPath)
24
+ return toHttpResponse(request, response)
19
25
  }
20
- const fileResponse = await GetElectronFileResponse.getElectronFileResponse(request.url, request)
21
- HttpServerResponse.send(request, socket, fileResponse)
26
+ const response = await GetElectronFileResponse.getElectronFileResponse(request.url, request)
27
+ return toHttpResponse(request, response)
22
28
  }
@@ -0,0 +1,42 @@
1
+ import workers from '../Workers/Workers.json' with { type: 'json' }
2
+ import * as FileSystem from '../FileSystem/FileSystem.js'
3
+ import * as Path from '../Path/Path.js'
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ const getPackageName = (worker) => {
16
+ const marker = '/node_modules/'
17
+ const index = worker.defaultPath.indexOf(marker)
18
+ if (index === -1) {
19
+ return ''
20
+ }
21
+ const packagePath = worker.defaultPath.slice(index + marker.length)
22
+ const parts = packagePath.split('/')
23
+ return packagePath.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]
24
+ }
25
+
26
+ const workersByPackageName = new Map((workers).map((worker) => [getPackageName(worker), worker]))
27
+
28
+ export const getLinkedWorkerPreference = async (path) => {
29
+ try {
30
+ const packageJson = await FileSystem.readJson(Path.join(path, 'package.json'))
31
+ const worker = workersByPackageName.get(packageJson?.name)
32
+ if (!worker || typeof packageJson.main !== 'string') {
33
+ return undefined
34
+ }
35
+ return {
36
+ path: Path.join(path, packageJson.main),
37
+ settingName: worker.settingName,
38
+ }
39
+ } catch {
40
+ return undefined
41
+ }
42
+ }
@@ -1,43 +1,14 @@
1
- import workers from '../Workers/Workers.json' with { type: 'json' }
2
- import * as FileSystem from '../FileSystem/FileSystem.js'
3
- import * as Path from '../Path/Path.js'
1
+ import * as LinkedWorkerManifest from '../LinkedWorkerManifest/LinkedWorkerManifest.js'
4
2
  import * as TransientLinkedExtensions from '../TransientLinkedExtensions/TransientLinkedExtensions.js'
5
3
 
6
-
7
-
8
-
9
-
10
-
11
- const getPackageName = (worker) => {
12
- const marker = '/node_modules/'
13
- const index = worker.defaultPath.indexOf(marker)
14
- if (index === -1) {
15
- return ''
16
- }
17
- const packagePath = worker.defaultPath.slice(index + marker.length)
18
- const parts = packagePath.split('/')
19
- return packagePath.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]
20
- }
21
-
22
- const workersByPackageName = new Map((workers).map((worker) => [getPackageName(worker), worker]))
23
-
24
- const getPackageJson = async (path) => {
25
- try {
26
- return await FileSystem.readJson(Path.join(path, 'package.json'))
27
- } catch {
28
- return undefined
29
- }
30
- }
31
-
32
4
  export const getLinkedWorkerPreferences = async () => {
33
5
  const preferences = {}
34
6
  for (const link of TransientLinkedExtensions.getLinkedExtensions()) {
35
- const packageJson = await getPackageJson(link.resolvedPath)
36
- const worker = workersByPackageName.get(packageJson?.name)
37
- if (!worker || typeof packageJson.main !== 'string') {
7
+ const preference = await LinkedWorkerManifest.getLinkedWorkerPreference(link.resolvedPath)
8
+ if (!preference) {
38
9
  continue
39
10
  }
40
- preferences[worker.settingName] = Path.join(link.resolvedPath, packageJson.main)
11
+ preferences[preference.settingName] = preference.path
41
12
  }
42
13
  return preferences
43
14
  }
@@ -98,12 +98,8 @@ export const load = (moduleId) => {
98
98
  return import('../HandleMessagePortForTerminalProcess/HandleMessagePortForTerminalProcess.ipc.js')
99
99
  case ModuleId.HandleNodeMessagePort:
100
100
  return import('../HandleNodeMessagePort/HandleNodeMessagePort.ipc.js')
101
- case ModuleId.HandleRemoteRequest:
102
- return import('../HandleRemoteRequest/HandleRemoteRequest.ipc.js')
103
101
  case ModuleId.HandleRequest:
104
102
  return import('../HandleRequest/HandleRequest.ipc.js')
105
- case ModuleId.HandleRequestTest:
106
- return import('../HandleRequestTest/HandleRequestTest.ipc.js')
107
103
  case ModuleId.HandleWebSocket:
108
104
  return import('../HandleWebSocket/HandleWebSocket.ipc.js')
109
105
  case ModuleId.HandleWindowAllClosed:
@@ -59,8 +59,6 @@ export const HandleWindowAllClosed = 60
59
59
  export const HandleMessagePortForTerminalProcess = 61
60
60
  export const TemporaryMessagePort = 62
61
61
  export const GetElectronFileResponse = 63
62
- export const HandleRemoteRequest = 64
63
- export const HandleRequestTest = 69
64
62
  export const ContentSecurityPolicy = 70
65
63
  export const HandleMessagePortForEmbedsProcess = 72
66
64
  export const HandleMessagePortForProcessExplorer = 73
@@ -193,12 +193,8 @@ export const getModuleId = (commandId) => {
193
193
  return ModuleId.HandleMessagePortForTerminalProcess
194
194
  case 'HandleNodeMessagePort.handleNodeMessagePort':
195
195
  return ModuleId.HandleNodeMessagePort
196
- case 'HandleRemoteRequest.handleRemoteRequest':
197
- return ModuleId.HandleRemoteRequest
198
196
  case 'HandleRequest.handleRequest':
199
197
  return ModuleId.HandleRequest
200
- case 'HandleRequestTest.handleRequestTest':
201
- return ModuleId.HandleRequestTest
202
198
  case 'HandleWebSocket.handleWebSocket':
203
199
  return ModuleId.HandleWebSocket
204
200
  case 'HandleWindowAllClosed.handleWindowAllClosed':
@@ -61,11 +61,11 @@ export const getSetupName = () => {
61
61
  return 'Lvce-Setup'
62
62
  }
63
63
 
64
- export const version = '0.108.12'
64
+ export const version = '0.108.14'
65
65
 
66
- export const commit = 'bf15721'
66
+ export const commit = '0efdeb9'
67
67
 
68
- export const date = '2026-08-23T23:24:00.000Z'
68
+ export const date = '2026-08-24T11:51:18.000Z'
69
69
 
70
70
  export const getVersion = () => {
71
71
  return version
@@ -2,5 +2,5 @@ import { join } from 'node:path'
2
2
  import * as Root from '../Root/Root.js'
3
3
 
4
4
  export const getPreloadUrl = () => {
5
- return join(Root.root, 'static', 'bf15721', 'packages', 'preload', 'dist', 'index.js')
5
+ return join(Root.root, 'static', '0efdeb9', 'packages', 'preload', 'dist', 'index.js')
6
6
  }
@@ -1,5 +1,8 @@
1
1
  import * as ErrorCodes from '../ErrorCodes/ErrorCodes.js'
2
+ import * as ExtensionManifest from '../ExtensionManifest/ExtensionManifest.js'
3
+ import * as ExtensionManifestStatus from '../ExtensionManifestStatus/ExtensionManifestStatus.js'
2
4
  import * as FileSystem from '../FileSystem/FileSystem.js'
5
+ import * as LinkedWorkerManifest from '../LinkedWorkerManifest/LinkedWorkerManifest.js'
3
6
  import * as Path from '../Path/Path.js'
4
7
  import * as Process from '../Process/Process.js'
5
8
 
@@ -58,6 +61,14 @@ const createPathNotFoundError = (link) => {
58
61
  return error
59
62
  }
60
63
 
64
+ const createExtensionNotFoundError = (link) => {
65
+ const message = link.path === link.resolvedPath ? link.path : `${link.path} (resolved to ${link.resolvedPath})`
66
+ const error = new Error(`Failed to start: ${link.source} path does not contain an extension: ${message}`)
67
+ // @ts-ignore
68
+ error.code = ErrorCodes.E_MANIFEST_NOT_FOUND
69
+ return error
70
+ }
71
+
61
72
  export const validate = async () => {
62
73
  const links = getLinkedExtensions()
63
74
  for (const link of links) {
@@ -67,6 +78,10 @@ export const validate = async () => {
67
78
  if (!(await FileSystem.exists(link.resolvedPath))) {
68
79
  throw createPathNotFoundError(link)
69
80
  }
81
+ const manifest = await ExtensionManifest.get(link.resolvedPath)
82
+ if (manifest.status !== ExtensionManifestStatus.Resolved && !(await LinkedWorkerManifest.getLinkedWorkerPreference(link.resolvedPath))) {
83
+ throw createExtensionNotFoundError(link)
84
+ }
70
85
  }
71
86
  return links
72
87
  }
@@ -1,7 +0,0 @@
1
- import * as HandleRemoteRequest from './HandleRemoteRequest.js'
2
-
3
- export const name = 'HandleRemoteRequest'
4
-
5
- export const Commands = {
6
- handleRemoteRequest: HandleRemoteRequest.handleRemoteRequest,
7
- }
@@ -1,12 +0,0 @@
1
- import * as Assert from '../Assert/Assert.js'
2
- import * as GetElectronFileResponse from '../GetElectronFileResponse/GetElectronFileResponse.js'
3
- import * as HandleSocketError from '../HandleSocketError/HandleSocketError.js'
4
- import * as HttpServerResponse from '../HttpServerResponse/HttpServerResponse.js'
5
-
6
- export const handleRemoteRequest = async (socket, request) => {
7
- Assert.object(socket)
8
- Assert.object(request)
9
- socket.on('error', HandleSocketError.handleSocketError)
10
- const result = await GetElectronFileResponse.getElectronFileResponse(request.url, request)
11
- HttpServerResponse.send(request, socket, result)
12
- }
@@ -1,7 +0,0 @@
1
- import * as HandleRequestTest from './HandleRequestTest.js'
2
-
3
- export const name = 'HandleRequestTest'
4
-
5
- export const Commands = {
6
- handleRequestTest: HandleRequestTest.handleRequestTest,
7
- }
@@ -1,11 +0,0 @@
1
- import * as Assert from '../Assert/Assert.js'
2
- import * as GetTestRequestResponse from '../GetTestRequestResponse/GetTestRequestResponse.js'
3
- import * as HttpServerResponse from '../HttpServerResponse/HttpServerResponse.js'
4
-
5
- export const handleRequestTest = async (socket, request, indexHtmlPath) => {
6
- Assert.object(socket)
7
- Assert.object(request)
8
- Assert.string(indexHtmlPath)
9
- const result = await GetTestRequestResponse.getTestRequestResponse(request, indexHtmlPath)
10
- await HttpServerResponse.send(request, socket, result)
11
- }
@@ -1,24 +0,0 @@
1
- import { ServerResponse } from 'node:http'
2
- import * as Assert from '../Assert/Assert.js'
3
- import * as SetHeaders from '../SetHeaders/SetHeaders.js'
4
-
5
- const handleResponseError = (error) => {
6
- console.error(`[shared-process] Failed to send response ${error}`)
7
- }
8
-
9
- export const send = async (request, socket, result) => {
10
- Assert.object(request)
11
- Assert.object(socket)
12
- Assert.object(result)
13
- const response = new ServerResponse(request)
14
- response.assignSocket(socket)
15
- response.statusCode = result.init.status
16
- SetHeaders.setHeaders(response, {
17
- ...result.init.headers,
18
- Connection: 'close',
19
- })
20
-
21
- // TODO use promises if possible
22
- socket.on('error', handleResponseError)
23
- response.end(result.body)
24
- }
@@ -1,5 +0,0 @@
1
- export const setHeaders = (response, headers) => {
2
- for (const [key, value] of Object.entries(headers)) {
3
- response.setHeader(key, value)
4
- }
5
- }