@lvce-editor/shared-process 0.22.2 → 0.22.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/shared-process",
3
- "version": "0.22.2",
3
+ "version": "0.22.3",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -18,11 +18,11 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@lvce-editor/assert": "^1.1.0",
21
- "@lvce-editor/extension-host-helper-process": "0.22.2",
21
+ "@lvce-editor/extension-host-helper-process": "0.22.3",
22
22
  "@lvce-editor/json-rpc": "^1.0.0",
23
23
  "@lvce-editor/jsonc-parser": "^1.1.0",
24
24
  "@lvce-editor/pretty-error": "^1.4.0",
25
- "@lvce-editor/pty-host": "0.22.2",
25
+ "@lvce-editor/pty-host": "0.22.3",
26
26
  "@lvce-editor/verror": "^1.1.2",
27
27
  "@lvce-editor/web-socket-server": "^1.1.0",
28
28
  "debug": "^4.3.4",
@@ -37,7 +37,7 @@
37
37
  "optionalDependencies": {
38
38
  "@lvce-editor/ripgrep": "^1.0.2",
39
39
  "extract-zip": "^2.0.1",
40
- "open": "^10.0.2",
40
+ "open": "^10.0.3",
41
41
  "tail": "^2.2.6",
42
42
  "tmp-promise": "^3.0.3",
43
43
  "trash": "^8.1.1"
@@ -1,17 +1,37 @@
1
+ import { stat } from 'fs/promises'
1
2
  import * as GetElectronFileResponseAbsolutePath from '../GetElectronFileResponseAbsolutePath/GetElectronFileResponseAbsolutePath.js'
2
3
  import * as GetElectronFileResponseContent from '../GetElectronFileResponseContent/GetElectronFileResponseContent.js'
3
4
  import * as GetElectronFileResponseRelativePath from '../GetElectronFileResponseRelativePath/GetElectronFileResponseRelativePath.js'
5
+ import * as GetEtag from '../GetEtag/GetEtag.js'
4
6
  import * as GetHeaders from '../GetHeaders/GetHeaders.js'
5
7
  import * as HttpStatusCode from '../HttpStatusCode/HttpStatusCode.js'
6
8
  import * as IsEnoentError from '../IsEnoentError/IsEnoentError.js'
7
9
  import * as Logger from '../Logger/Logger.js'
8
10
 
9
- export const getElectronFileResponse = async (url) => {
11
+ export const getElectronFileResponse = async (url, request) => {
10
12
  try {
11
13
  const pathName = GetElectronFileResponseRelativePath.getElectronFileResponseRelativePath(url)
12
14
  const absolutePath = GetElectronFileResponseAbsolutePath.getElectronFileResponseAbsolutePath(pathName)
15
+ let etag
16
+ if (request) {
17
+ const stats = await stat(absolutePath)
18
+ etag = GetEtag.getEtag(stats)
19
+ if (request.headers['if-none-match'] === etag) {
20
+ return {
21
+ body: '',
22
+ init: {
23
+ status: HttpStatusCode.NotModifed,
24
+ headers: {},
25
+ },
26
+ }
27
+ }
28
+ }
13
29
  const content = await GetElectronFileResponseContent.getElectronFileResponseContent(absolutePath, url)
14
30
  const headers = GetHeaders.getHeaders(absolutePath)
31
+ headers['Cache-Control'] = 'public, max-age=0, must-revalidate'
32
+ if (etag) {
33
+ headers['Etag'] = etag
34
+ }
15
35
  return {
16
36
  body: content,
17
37
  init: {
@@ -0,0 +1,3 @@
1
+ export const getEtag = (fileStat) => {
2
+ return `W/"${[fileStat.ino, fileStat.size, fileStat.mtime.getTime()].join('-')}"`
3
+ }
@@ -17,6 +17,7 @@ export const getMimeType = (fileExtension) => {
17
17
  case '.png':
18
18
  return MimeType.ImagePng
19
19
  case '.json':
20
+ case '.map':
20
21
  return MimeType.ApplicationJson
21
22
  case '.mp3':
22
23
  return MimeType.AudioMpeg
@@ -1,17 +1,10 @@
1
- import { ServerResponse } from 'node:http'
2
1
  import * as Assert from '../Assert/Assert.js'
3
2
  import * as GetElectronFileResponse from '../GetElectronFileResponse/GetElectronFileResponse.js'
3
+ import * as HttpServerResponse from '../HttpServerResponse/HttpServerResponse.js'
4
4
 
5
5
  export const handleRemoteRequest = async (request, socket) => {
6
6
  Assert.object(request)
7
7
  Assert.object(socket)
8
- const response = new ServerResponse(request)
9
- response.assignSocket(socket)
10
- const result = await GetElectronFileResponse.getElectronFileResponse(request.url)
11
- response.statusCode = result.init.status
12
- for (const [key, value] of Object.entries(result.init.headers)) {
13
- response.setHeader(key, value)
14
- }
15
- response.setHeader('Connection', 'close')
16
- response.end(result.body)
8
+ const result = await GetElectronFileResponse.getElectronFileResponse(request.url, request)
9
+ HttpServerResponse.send(request, socket, result)
17
10
  }
@@ -0,0 +1,17 @@
1
+ import { ServerResponse } from 'node:http'
2
+ import * as Assert from '../Assert/Assert.js'
3
+ import * as SetHeaders from '../SetHeaders/SetHeaders.js'
4
+
5
+ export const send = (request, socket, result) => {
6
+ Assert.object(request)
7
+ Assert.object(socket)
8
+ Assert.object(result)
9
+ const response = new ServerResponse(request)
10
+ response.assignSocket(socket)
11
+ response.statusCode = result.init.status
12
+ SetHeaders.setHeaders(response, {
13
+ ...result.init.headers,
14
+ Connection: 'close',
15
+ })
16
+ response.end(result.body)
17
+ }
@@ -1,3 +1,4 @@
1
1
  export const NotFound = 404
2
2
  export const Ok = 200
3
3
  export const ServerError = 500
4
+ export const NotModifed = 304
@@ -15,7 +15,6 @@ export const listen = async ({ request, handle }) => {
15
15
  webSocket.pause()
16
16
  if (!IsWebSocketOpen.isWebSocketOpen(webSocket)) {
17
17
  const { type, event } = await GetFirstWebSocketEvent.getFirstWebSocketEvent(webSocket)
18
- console.log({ type, event })
19
18
  }
20
19
  return webSocket
21
20
  }
@@ -61,11 +61,11 @@ export const getSetupName = () => {
61
61
  return 'Lvce-Setup'
62
62
  }
63
63
 
64
- export const version = '0.22.2'
64
+ export const version = '0.22.3'
65
65
 
66
- export const commit = 'c239d9c'
66
+ export const commit = '5c984c2'
67
67
 
68
- export const date = '2024-01-06T23:18:20.000Z'
68
+ export const date = '2024-01-13T15:58:30.000Z'
69
69
 
70
70
  export const getVersion = () => {
71
71
  return version
@@ -0,0 +1,5 @@
1
+ export const setHeaders = (response, headers) => {
2
+ for (const [key, value] of Object.entries(headers)) {
3
+ response.setHeader(key, value)
4
+ }
5
+ }