@lvce-editor/shared-process 0.94.8 → 0.94.9

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.94.8",
3
+ "version": "0.94.9",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -19,7 +19,7 @@
19
19
  "dependencies": {
20
20
  "@lvce-editor/assert": "1.7.0",
21
21
  "@lvce-editor/auth-process": "1.12.0",
22
- "@lvce-editor/extension-host-helper-process": "0.94.8",
22
+ "@lvce-editor/extension-host-helper-process": "0.94.9",
23
23
  "@lvce-editor/ipc": "16.6.0",
24
24
  "@lvce-editor/json-rpc": "8.5.0",
25
25
  "@lvce-editor/jsonc-parser": "1.5.0",
@@ -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', 'a5f399e', 'extensions')
6
+ const builtinExtensionsPath = join(staticServerPath, '..', '..', 'static', '0716cb3', 'extensions')
7
7
  return builtinExtensionsPath
8
8
  }
@@ -140,6 +140,8 @@ export const load = (moduleId) => {
140
140
  return import('../RecentlyOpened/RecentlyOpened.ipc.js')
141
141
  case ModuleId.Screen:
142
142
  return import('../Screen/Screen.ipc.js')
143
+ case ModuleId.SecretStorage:
144
+ return import('../SecretStorage/SecretStorage.ipc.js')
143
145
  case ModuleId.SendMessagePortToMainProcess:
144
146
  return import('../SendMessagePortToMainProcess/SendMessagePortToMainProcess.ipc.js')
145
147
  case ModuleId.TemporaryMessagePort:
@@ -80,3 +80,4 @@ export const PlatformPaths = 84
80
80
  export const HandleMessagePortForAuthProcess = 86
81
81
  export const LanguageServer = 87
82
82
  export const SendMessagePortToMainProcess = 88
83
+ export const SecretStorage = 89
@@ -320,6 +320,10 @@ export const getModuleId = (commandId) => {
320
320
  case 'Screen.getHeight':
321
321
  case 'Screen.getWidth':
322
322
  return ModuleId.Screen
323
+ case 'SecretStorage.delete':
324
+ case 'SecretStorage.get':
325
+ case 'SecretStorage.store':
326
+ return ModuleId.SecretStorage
323
327
  case 'SendMessagePortToMainProcess.sendMessagePortToMainProcess':
324
328
  return ModuleId.SendMessagePortToMainProcess
325
329
  case 'TemporaryMessagePort.getPortTuple2':
@@ -61,11 +61,11 @@ export const getSetupName = () => {
61
61
  return 'Lvce-Setup'
62
62
  }
63
63
 
64
- export const version = '0.94.8'
64
+ export const version = '0.94.9'
65
65
 
66
- export const commit = 'a5f399e'
66
+ export const commit = '0716cb3'
67
67
 
68
- export const date = '2026-07-26T19:09:31.000Z'
68
+ export const date = '2026-07-27T12:58:03.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', 'a5f399e', 'packages', 'preload', 'dist', 'index.js')
5
+ return join(Root.root, 'static', '0716cb3', 'packages', 'preload', 'dist', 'index.js')
6
6
  }
@@ -0,0 +1,9 @@
1
+ import * as SecretStorage from './SecretStorage.js'
2
+
3
+ export const name = 'SecretStorage'
4
+
5
+ export const Commands = {
6
+ delete: SecretStorage.deleteSecret,
7
+ get: SecretStorage.get,
8
+ store: SecretStorage.store,
9
+ }
@@ -0,0 +1,71 @@
1
+ import * as ElectronSafeStorage from '../ElectronSafeStorage/ElectronSafeStorage.js'
2
+ import { FileNotFoundError } from '../FileNotFoundError/FileNotFoundError.js'
3
+ import * as JsonFile from '../JsonFile/JsonFile.js'
4
+ import * as Path from '../Path/Path.js'
5
+ import * as PlatformPaths from '../PlatformPaths/PlatformPaths.js'
6
+ import * as Queue from '../Queue/Queue.js'
7
+
8
+
9
+
10
+ const queueKey = 'secret-storage'
11
+
12
+ const getStoragePath = () => {
13
+ return Path.join(PlatformPaths.getConfigDir(), 'secrets.json')
14
+ }
15
+
16
+ const readStoredSecrets = async () => {
17
+ try {
18
+ const stored = await JsonFile.readJson(getStoragePath())
19
+ if (!stored || typeof stored !== 'object' || Array.isArray(stored)) {
20
+ return {}
21
+ }
22
+ return stored
23
+ } catch (error) {
24
+ if (error instanceof FileNotFoundError) {
25
+ return {}
26
+ }
27
+ throw error
28
+ }
29
+ }
30
+
31
+ export const get = async (extensionId, key) => {
32
+ const stored = await readStoredSecrets()
33
+ const encrypted = stored[extensionId]?.[key]
34
+ if (typeof encrypted !== 'string') {
35
+ return undefined
36
+ }
37
+ return ElectronSafeStorage.decryptString(encrypted)
38
+ }
39
+
40
+ export const store = async (extensionId, key, value) => {
41
+ await Queue.add(queueKey, async () => {
42
+ const encrypted = await ElectronSafeStorage.encryptString(value)
43
+ const stored = await readStoredSecrets()
44
+ await JsonFile.writeJson(getStoragePath(), {
45
+ ...stored,
46
+ [extensionId]: {
47
+ ...stored[extensionId],
48
+ [key]: encrypted,
49
+ },
50
+ })
51
+ })
52
+ }
53
+
54
+ export const deleteSecret = async (extensionId, key) => {
55
+ await Queue.add(queueKey, async () => {
56
+ const stored = await readStoredSecrets()
57
+ const extensionSecrets = stored[extensionId]
58
+ if (!extensionSecrets || typeof extensionSecrets[key] !== 'string') {
59
+ return
60
+ }
61
+ const nextExtensionSecrets = { ...extensionSecrets }
62
+ delete nextExtensionSecrets[key]
63
+ const nextStored = { ...stored }
64
+ if (Object.keys(nextExtensionSecrets).length === 0) {
65
+ delete nextStored[extensionId]
66
+ } else {
67
+ nextStored[extensionId] = nextExtensionSecrets
68
+ }
69
+ await JsonFile.writeJson(getStoragePath(), nextStored)
70
+ })
71
+ }