@lvce-editor/shared-process 0.0.2

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/bin/sharedProcess.js +3 -0
  4. package/index.js +6 -0
  5. package/package.json +96 -0
  6. package/src/parts/Assert/Assert.js +57 -0
  7. package/src/parts/Callback/Callback.js +48 -0
  8. package/src/parts/ChildProcess/ChildProcess.js +98 -0
  9. package/src/parts/ClipBoard/ClipBoard.ipc.js +7 -0
  10. package/src/parts/ClipBoard/ClipBoard.js +23 -0
  11. package/src/parts/ClipBoard/ClipBoardGnome.js +78 -0
  12. package/src/parts/ClipBoard/ClipBoardNoop.js +14 -0
  13. package/src/parts/ClipBoard/ClipBoardWindows.js +22 -0
  14. package/src/parts/Command/Command.js +264 -0
  15. package/src/parts/Configuration/Configuration.ipc.js +7 -0
  16. package/src/parts/Configuration/Configuration.js +39 -0
  17. package/src/parts/Credentials/Credentials.ipc.js +10 -0
  18. package/src/parts/Credentials/Credentials.js +69 -0
  19. package/src/parts/Debug/Debug.js +3 -0
  20. package/src/parts/Developer/Developer.ipc.js +20 -0
  21. package/src/parts/Developer/Developer.js +132 -0
  22. package/src/parts/Download/Download.js +33 -0
  23. package/src/parts/Electron/Electron.ipc.js +19 -0
  24. package/src/parts/Electron/Electron.js +99 -0
  25. package/src/parts/Env/Env.js +3 -0
  26. package/src/parts/Error/Error.js +30 -0
  27. package/src/parts/ErrorHandling/ErrorHandling.js +40 -0
  28. package/src/parts/Exec/Exec.js +16 -0
  29. package/src/parts/Extension/Extension.js +7 -0
  30. package/src/parts/ExtensionHost/ExtensionHost.ipc.js +80 -0
  31. package/src/parts/ExtensionHost/ExtensionHost.js +163 -0
  32. package/src/parts/ExtensionHost/ExtensionHostBraceCompletion.js +14 -0
  33. package/src/parts/ExtensionHost/ExtensionHostClosingTag.js +14 -0
  34. package/src/parts/ExtensionHost/ExtensionHostColorTheme.js +60 -0
  35. package/src/parts/ExtensionHost/ExtensionHostCommand.js +19 -0
  36. package/src/parts/ExtensionHost/ExtensionHostCompletion.js +12 -0
  37. package/src/parts/ExtensionHost/ExtensionHostDefinition.js +12 -0
  38. package/src/parts/ExtensionHost/ExtensionHostDiagnostic.js +7 -0
  39. package/src/parts/ExtensionHost/ExtensionHostFileSystem.js +23 -0
  40. package/src/parts/ExtensionHost/ExtensionHostFormatting.js +4 -0
  41. package/src/parts/ExtensionHost/ExtensionHostHover.js +12 -0
  42. package/src/parts/ExtensionHost/ExtensionHostIconTheme.js +35 -0
  43. package/src/parts/ExtensionHost/ExtensionHostImplementation.js +12 -0
  44. package/src/parts/ExtensionHost/ExtensionHostKeyBindings.js +23 -0
  45. package/src/parts/ExtensionHost/ExtensionHostLanguages.js +84 -0
  46. package/src/parts/ExtensionHost/ExtensionHostManagement.js +26 -0
  47. package/src/parts/ExtensionHost/ExtensionHostOutput.js +3 -0
  48. package/src/parts/ExtensionHost/ExtensionHostQuickPick.js +6 -0
  49. package/src/parts/ExtensionHost/ExtensionHostReference.js +12 -0
  50. package/src/parts/ExtensionHost/ExtensionHostRename.js +27 -0
  51. package/src/parts/ExtensionHost/ExtensionHostSemanticTokens.js +10 -0
  52. package/src/parts/ExtensionHost/ExtensionHostSourceControl.js +15 -0
  53. package/src/parts/ExtensionHost/ExtensionHostStats.js +3 -0
  54. package/src/parts/ExtensionHost/ExtensionHostStatusBar.js +7 -0
  55. package/src/parts/ExtensionHost/ExtensionHostTabCompletion.js +12 -0
  56. package/src/parts/ExtensionHost/ExtensionHostTextDocument.js +35 -0
  57. package/src/parts/ExtensionHost/ExtensionHostTypeDefinition.js +12 -0
  58. package/src/parts/ExtensionHost/ExtensionHostWorkspace.js +3 -0
  59. package/src/parts/ExtensionManagement/ExtensionManagement.ipc.js +11 -0
  60. package/src/parts/ExtensionManagement/ExtensionManagement.js +319 -0
  61. package/src/parts/FileSystem/FileSystem.ipc.js +32 -0
  62. package/src/parts/FileSystem/FileSystem.js +228 -0
  63. package/src/parts/Git/Git.js +58 -0
  64. package/src/parts/Json/Json.js +67 -0
  65. package/src/parts/JsonFile/JsonFile.js +14 -0
  66. package/src/parts/JsonRpc/JsonRpc.js +22 -0
  67. package/src/parts/Native/Native.ipc.js +6 -0
  68. package/src/parts/Native/Native.js +14 -0
  69. package/src/parts/OutputChannel/OutputChannel.ipc.js +51 -0
  70. package/src/parts/OutputChannel/OutputChannel.js +37 -0
  71. package/src/parts/ParentIpc/ParentIpc.js +203 -0
  72. package/src/parts/Path/Path.js +17 -0
  73. package/src/parts/Platform/Platform.ipc.js +18 -0
  74. package/src/parts/Platform/Platform.js +165 -0
  75. package/src/parts/Preferences/Preferences.ipc.js +6 -0
  76. package/src/parts/Preferences/Preferences.js +75 -0
  77. package/src/parts/PrettyError/PrettyError.js +86 -0
  78. package/src/parts/Process/Process.ipc.js +7 -0
  79. package/src/parts/Process/Process.js +7 -0
  80. package/src/parts/Queue/Queue.js +35 -0
  81. package/src/parts/RequiresSocket/RequiresSocket.js +11 -0
  82. package/src/parts/RgPath/RgPath.js +1 -0
  83. package/src/parts/Root/Root.js +6 -0
  84. package/src/parts/Search/Search.ipc.js +6 -0
  85. package/src/parts/Search/Search.js +101 -0
  86. package/src/parts/SearchFile/SearchFile.ipc.js +6 -0
  87. package/src/parts/SearchFile/SearchFile.js +51 -0
  88. package/src/parts/Socket/Socket.js +132 -0
  89. package/src/parts/Stats/Stats.js +45 -0
  90. package/src/parts/Terminal/Terminal.ipc.js +45 -0
  91. package/src/parts/Terminal/Terminal.js +161 -0
  92. package/src/parts/TextDocument/TextDocument.ipc.js +6 -0
  93. package/src/parts/TextDocument/TextDocument.js +37 -0
  94. package/src/parts/Trace/Trace.js +15 -0
  95. package/src/parts/Trash/Trash.js +11 -0
  96. package/src/parts/WebSocketServer/WebSocketServer.ipc.js +6 -0
  97. package/src/parts/WebSocketServer/WebSocketServer.js +43 -0
  98. package/src/parts/Workspace/Workspace.ipc.js +7 -0
  99. package/src/parts/Workspace/Workspace.js +107 -0
  100. package/src/sharedProcessMain.js +61 -0
  101. package/test/Callback.test.js +42 -0
  102. package/test/ClipBoard.test.js +105 -0
  103. package/test/Credentials.test.js +147 -0
  104. package/test/Developer.test.js +34 -0
  105. package/test/Electron.test.js +93 -0
  106. package/test/Error.test.js +16 -0
  107. package/test/Exec.test.js +25 -0
  108. package/test/ExtensionHost.test.js +127 -0
  109. package/test/ExtensionHostColorTheme.test.js +141 -0
  110. package/test/ExtensionHostCommand.test.js +27 -0
  111. package/test/ExtensionHostCompletion.test.js +45 -0
  112. package/test/ExtensionHostDefinition.test.js +35 -0
  113. package/test/ExtensionHostDiagnostic.test.js +23 -0
  114. package/test/ExtensionHostFileSystem.test.js +91 -0
  115. package/test/ExtensionHostFormatting.test.js +27 -0
  116. package/test/ExtensionHostIconTheme.test.js +73 -0
  117. package/test/ExtensionHostLanguages.test.js +212 -0
  118. package/test/ExtensionHostOutput.test.js +23 -0
  119. package/test/ExtensionHostRename.test.js +59 -0
  120. package/test/ExtensionHostSemanticTokens.test.js +26 -0
  121. package/test/ExtensionHostTabCompletion.test.js +35 -0
  122. package/test/ExtensionHostTextDocument.test.js +61 -0
  123. package/test/ExtensionHostTypeDefinition.test.js +35 -0
  124. package/test/ExtensionHostWorkspace.test.js +21 -0
  125. package/test/ExtensionManagement.test.js +408 -0
  126. package/test/FileSystem.test.js +294 -0
  127. package/test/Json.test.js +25 -0
  128. package/test/Native.test.js +31 -0
  129. package/test/OutputChannel.test.js +68 -0
  130. package/test/Path.test.js +17 -0
  131. package/test/Platform.test.js +61 -0
  132. package/test/Preferences.test.js +140 -0
  133. package/test/Process.test.js +9 -0
  134. package/test/RgPath.test.js +5 -0
  135. package/test/Search.test.js +45 -0
  136. package/test/SearchFile.test.js +80 -0
  137. package/test/Terminal.test.js +53 -0
  138. package/test/Trash.test.js +34 -0
  139. package/test/WebSocketServer.test.js +98 -0
  140. package/test/fixture-search-1/index.html +10 -0
  141. package/test/fixture-search-file-1/fileA +0 -0
  142. package/test/fixture-search-file-1/fileB +0 -0
  143. package/test/fixture-search-file-1/nested/fileC +0 -0
@@ -0,0 +1,264 @@
1
+ const MODULE_FILE_SYSTEM = 1
2
+ const MODULE_WORKSPACE = 2
3
+ const MODULE_TERMINAL = 3
4
+ const MODULE_SEARCH = 5
5
+ const MODULE_SEARCH_FILE = 6
6
+ const MODULE_OUTPUT_CHANNEL = 7
7
+ const MODULE_DEVELOPER = 8
8
+ const MODULE_EXTENSION_MANAGEMENT = 9
9
+ const MODULE_EXTENSION_HOST = 10
10
+ const MODULE_PREFERENCES = 11
11
+ const MODULE_NATIVE = 12
12
+ const MODULE_CLIPBOARD = 13
13
+ const MODULE_TEXT_DOCUMENT = 14
14
+ const MODULE_ELECTRON = 15
15
+ const MODULE_WEBSOCKET_SERVER = 16
16
+ const MODULE_PLATFORM = 17
17
+
18
+ const commands = Object.create(null)
19
+ const invocables = Object.create(null)
20
+
21
+ const pendingModules = Object.create(null)
22
+
23
+ const loadModule = (moduleId) => {
24
+ switch (moduleId) {
25
+ case MODULE_FILE_SYSTEM:
26
+ return import('../FileSystem/FileSystem.ipc.js')
27
+ case MODULE_WORKSPACE:
28
+ return import('../Workspace/Workspace.ipc.js')
29
+ case MODULE_TERMINAL:
30
+ return import('../Terminal/Terminal.ipc.js')
31
+ case MODULE_SEARCH:
32
+ return import('../Search/Search.ipc.js')
33
+ case MODULE_SEARCH_FILE:
34
+ return import('../SearchFile/SearchFile.ipc.js')
35
+ case MODULE_OUTPUT_CHANNEL:
36
+ return import('../OutputChannel/OutputChannel.ipc.js')
37
+ case MODULE_DEVELOPER:
38
+ return import('../Developer/Developer.ipc.js')
39
+ case MODULE_EXTENSION_MANAGEMENT:
40
+ return import('../ExtensionManagement/ExtensionManagement.ipc.js')
41
+ case MODULE_EXTENSION_HOST:
42
+ return import('../ExtensionHost/ExtensionHost.ipc.js')
43
+ case MODULE_PREFERENCES:
44
+ return import('../Preferences/Preferences.ipc.js')
45
+ case MODULE_NATIVE:
46
+ return import('../Native/Native.ipc.js')
47
+ case MODULE_CLIPBOARD:
48
+ return import('../ClipBoard/ClipBoard.ipc.js')
49
+ case MODULE_TEXT_DOCUMENT:
50
+ return import('../TextDocument/TextDocument.ipc.js')
51
+ case MODULE_ELECTRON:
52
+ return import('../Electron/Electron.ipc.js')
53
+ case MODULE_WEBSOCKET_SERVER:
54
+ return import('../WebSocketServer/WebSocketServer.ipc.js')
55
+ case MODULE_PLATFORM:
56
+ return import('../Platform/Platform.ipc.js')
57
+ default:
58
+ throw new Error(`unknown module ${moduleId}`)
59
+ }
60
+ }
61
+
62
+ const getOrLoadModule = (moduleId) => {
63
+ if (!pendingModules[moduleId]) {
64
+ const importPromise = loadModule(moduleId)
65
+ pendingModules[moduleId] = importPromise
66
+ .then((module) => module.__initialize__())
67
+ .catch((error) => {
68
+ console.error(error)
69
+ })
70
+ }
71
+ return pendingModules[moduleId]
72
+ }
73
+
74
+ const getModuleId = (commandId) => {
75
+ switch (commandId) {
76
+ case 'FileSystem.readFile':
77
+ case 'FileSystem.writeFile':
78
+ case 'FileSystem.readDirWithFileTypes':
79
+ case 'FileSystem.remove':
80
+ case 'FileSystem.mkdir':
81
+ case 'FileSystem.createFile':
82
+ case 'FileSystem.createFolder':
83
+ case 'FileSystem.rename':
84
+ case 'FileSystem.ensureFile':
85
+ case 'FileSystem.copy':
86
+ case 'FileSystem.getPathSeparator':
87
+ return MODULE_FILE_SYSTEM
88
+ case 'Workspace.resolveRoot':
89
+ case 'Workspace.getHomeDir':
90
+ return MODULE_WORKSPACE
91
+ case 'Native.openFolder':
92
+ return MODULE_NATIVE
93
+ case 'ClipBoard.readFiles':
94
+ case 'ClipBoard.writeFiles':
95
+ return MODULE_CLIPBOARD
96
+ case 'Developer.sharedProcessStartupPerformance':
97
+ case 'Developer.sharedProcessMemoryUsage':
98
+ case 'Developer.allocateMemory':
99
+ case 'Developer.crashSharedProcess':
100
+ case 'Developer.createHeapSnapshot':
101
+ case 'Developer.createProfile':
102
+ case 'Developer.getNodeStartupTiming':
103
+ return MODULE_DEVELOPER
104
+ case 'ExtensionHost.getColorThemeJson':
105
+ case 'ExtensionHost.getIconThemeJson':
106
+ case 'ExtensionHost.executeTabCompletionProvider':
107
+ case 'ExtensionHostLanguages.getLanguages':
108
+ case 'ExtensionHost.getIconTheme':
109
+ case 'ExtensionHostKeyBindings.getKeyBindings':
110
+ case 'ExtensionHost.executeCommand':
111
+ case 'ExtensionHost.getColorThemeJson':
112
+ case 'ExtensionHost.getColorThemeNames':
113
+ case 'ExtensionHost.getMemoryUsage':
114
+ case 'ExtensionHost.getSourceControlBadgeCount':
115
+ case 'ExtensionHost.format':
116
+ case 'ExtensionHost.executeCommand':
117
+ case 'ExtensionHost.getSourceControlBadgeCount':
118
+ case 'ExtensionHost.getLanguageConfiguration':
119
+ case 'ExtensionHost.getColorThemes':
120
+ case 'ExtensionHostTextDocument.syncInitial':
121
+ case 'ExtensionHostHover.execute':
122
+ case 'ExtensionHostDiagnostic.execute':
123
+ case 'ExtensionHostTextDocument':
124
+ case 'EXtensionHostRename.executePrepareRename':
125
+ case 'ExtensionHostRename.executeRename':
126
+ case 'ExtensionHostDefinition.executeDefinitionProvider':
127
+ case 'ExtensionHostFileSystem.readFile':
128
+ case 'ExtensionHostFileSystem.writeFile':
129
+ case 'ExtensionHostFileSystem.readDirWithFileTypes':
130
+ case 'ExtensionHostFileSystem.remove':
131
+ case 'ExtensionHostFileSystem.rename':
132
+ case 'ExtensionHostSourceControl.acceptInput':
133
+ case 'ExtensionHost.start':
134
+ case 'ExtensionHostManagement.activateAll':
135
+ case 'ExtensionHostManagement.enableExtensions':
136
+ case 'ExtensionHostFileSystem.getPathSeparator':
137
+ case 'ExtensionHostWorkspace.setWorkspacePath':
138
+ case 'ExtensionHostOutput.getOutputChannels':
139
+ case 'ExtensionHost.getStatusBarItems':
140
+ case 'ExtensionHost.registerChangeListener':
141
+ case 'ExtensionHostTextDocument.setLanguageId':
142
+ case 'ExtensionHostQuickPick.handleQuickPickResult':
143
+ case 'ExtensionHostBraceCompletion.executeBraceCompletionProvider':
144
+ case 'ExtensionHostReferences.executeReferenceProvider':
145
+ case 'ExtensionHostImplementation.executeImplementationProvider':
146
+ case 'ExtensionHostClosingTag.executeTypeDefinitionProvider':
147
+ case 'ExtensionHostClosingTag.execute':
148
+ case 'ExtensionHostTextDocument.syncFull':
149
+ case 'ExtensionHost.setWorkspacePath':
150
+ case 'ExtensionHost.enableExtension':
151
+ case 'ExtensionHost.getIconThemeJson':
152
+ case 'ExtensionHost.getLanguages':
153
+ case 'ExtensionHostCompletion.execute':
154
+ case 'ExtensionHostTextDocument.syncIncremental':
155
+ case 'ExtensionHostClosingTag.executeClosingTagProvider':
156
+ case 'ExtensionHost.sourceControlGetChangedFiles':
157
+ case 'ExtensionHostSemanticTokens.executeSemanticTokenProvider':
158
+ return MODULE_EXTENSION_HOST
159
+ case 'ExtensionManagement.install':
160
+ case 'ExtensionManagement.uninstall':
161
+ case 'ExtensionManagement.enable':
162
+ case 'ExtensionManagement.disable':
163
+ case 'ExtensionManagement.getAllExtensions':
164
+ case 'ExtensionManagement.getExtensions':
165
+ return MODULE_EXTENSION_MANAGEMENT
166
+ case 'Search.search':
167
+ return MODULE_SEARCH
168
+ case 'Platform.getConfigDir':
169
+ case 'Platform.getAppDir':
170
+ case 'Platform.getHomeDir':
171
+ case 'Platform.getDataDir':
172
+ case 'Platform.getExtensionsPath':
173
+ case 'Platform.getBuiltinExtensionsPath':
174
+ case 'Platform.getDisabledExtensionsPath':
175
+ case 'Platform.getCachedExtensionsPath':
176
+ case 'Platform.getMarketplaceUrl':
177
+ case 'Platform.getLogsDir':
178
+ case 'Platform.getUserSettingsPath':
179
+ case 'Platform.getRecentlyOpenedPath':
180
+ case 'Platform.getCacheDir':
181
+ return MODULE_PLATFORM
182
+ case 'Terminal.create':
183
+ case 'Terminal.dispose':
184
+ case 'Terminal.write':
185
+ case 'Terminal.resize':
186
+ return MODULE_TERMINAL
187
+ case 'Preferences.getAll':
188
+ return MODULE_PREFERENCES
189
+ case 4820:
190
+ return MODULE_TEXT_DOCUMENT
191
+ case 5621:
192
+ return MODULE_WEBSOCKET_SERVER
193
+ case 'SearchFile.searchFile':
194
+ return MODULE_SEARCH_FILE
195
+ case 'OutputChannel.open':
196
+ case 'OutputChannel.close':
197
+ return MODULE_OUTPUT_CHANNEL
198
+ case 'Electron.toggleDevtools':
199
+ case 'Electron.windowMinimize':
200
+ case 'Electron.windowMaximize':
201
+ case 'Electron.windowUnmaximize':
202
+ case 'Electron.windowClose':
203
+ case 'Electron.about':
204
+ case 'Electron.showOpenDialog':
205
+ case 'Electron.windowReload':
206
+ case 'Electron.getPerformanceEntries':
207
+ case 'Electron.crashMainProcess':
208
+ case 'Electron.showMessageBox':
209
+ case 'Electron.windowOpenNew':
210
+ case 'Electron.exit':
211
+ case 'Electron.openProcessExplorer':
212
+ return MODULE_ELECTRON
213
+ default:
214
+ throw new Error(`command ${commandId} not found`)
215
+ }
216
+ }
217
+
218
+ const loadCommand = (command) => getOrLoadModule(getModuleId(command))
219
+
220
+ export const register = (commandId, listener) => {
221
+ commands[commandId] = listener
222
+ }
223
+
224
+ export const registerInvocable = (commandId, listener) => {
225
+ invocables[commandId] = listener
226
+ }
227
+
228
+ export const invoke = async (command, ...args) => {
229
+ if (!(command in commands)) {
230
+ await loadCommand(command)
231
+ if (!(command in commands)) {
232
+ console.warn(`[shared process] Unknown command "${command}"`)
233
+ return
234
+ }
235
+ }
236
+ if (typeof commands[command] !== 'function') {
237
+ throw new Error(`Command ${command} is not a function`)
238
+ }
239
+ return commands[command](...args)
240
+ }
241
+
242
+ export const execute = (command, ...args) => {
243
+ if (command in commands) {
244
+ commands[command](...args)
245
+ } else {
246
+ loadCommand(command)
247
+ // TODO can skip then block in prod (only to prevent endless loop in dev)
248
+ .then(() => {
249
+ if (!(command in commands)) {
250
+ console.warn(`Unknown command "${command}"`)
251
+ return
252
+ }
253
+ try {
254
+ execute(command, ...args)
255
+ } catch (error) {
256
+ console.error('[shared process] command failed to execute')
257
+ console.error(error)
258
+ }
259
+ })
260
+ .catch((error) => {
261
+ console.error(error)
262
+ })
263
+ }
264
+ }
@@ -0,0 +1,7 @@
1
+ import * as Command from '../Command/Command.js'
2
+ import * as Configuration from './Configuration.js'
3
+
4
+ export const __initialize = () => {
5
+ Command.register(-1, Configuration.get)
6
+ Command.register(-1, Configuration.set)
7
+ }
@@ -0,0 +1,39 @@
1
+ import { readFile } from 'node:fs/promises'
2
+ import { writeFile } from '../FileSystem/FileSystem.js'
3
+ import * as ReadJson from '../JsonFile/JsonFile.js'
4
+
5
+ let settings
6
+ let settingsPromise
7
+
8
+ const readSettings = async () => {
9
+ // TODO allow jsonc
10
+ if (!settings) {
11
+ if (!settingsPromise) {
12
+ settingsPromise = ReadJson.readJson('/tmp/settings.json')
13
+ }
14
+ await settingsPromise
15
+ }
16
+ return settings
17
+ }
18
+
19
+ const writeSettings = async () => {
20
+ // TODO jsonc
21
+ await writeFile(
22
+ '/tmp/settings.json',
23
+ JSON.stringify(settings, null, 2) + '\n'
24
+ )
25
+ }
26
+
27
+ export const get = async (key) => {
28
+ await readSettings()
29
+ // TODO allow nested object get
30
+ return settings[key]
31
+ }
32
+
33
+ export const set = async (key, value) => {
34
+ await readSettings()
35
+ // TODO allow nested object set?
36
+ // how does vscode do it?
37
+ settings[key] = value
38
+ await writeSettings()
39
+ }
@@ -0,0 +1,10 @@
1
+ import * as Command from '../Command/Command.js'
2
+ import * as Credentials from './Credentials.js'
3
+
4
+ export const __initialize__ = () => {
5
+ Command.register(801, Credentials.getPassword)
6
+ Command.register(802, Credentials.setPassword)
7
+ Command.register(803, Credentials.deletePassword)
8
+ Command.register(804, Credentials.findPassword)
9
+ Command.register(805, Credentials.findCredentials)
10
+ }
@@ -0,0 +1,69 @@
1
+ import keytar from 'keytar'
2
+ import VError from 'verror'
3
+
4
+ /**
5
+ * @param {string} service
6
+ * @param {string} account
7
+ */
8
+ export const deletePassword = async (service, account) => {
9
+ try {
10
+ return await keytar.deletePassword(service, account)
11
+ } catch (error) {
12
+ // @ts-ignore
13
+ throw new VError(error, `Failed to delete password from service ${service}`)
14
+ }
15
+ }
16
+
17
+ /**
18
+ * @param {string} service
19
+ */
20
+ export const findCredentials = async (service) => {
21
+ try {
22
+ return keytar.findCredentials(service)
23
+ } catch (error) {
24
+ throw new VError(
25
+ // @ts-ignore
26
+ error,
27
+ `Failed to find credentials from service ${service}`
28
+ )
29
+ }
30
+ }
31
+
32
+ /**
33
+ * @param {string} service
34
+ */
35
+ export const findPassword = async (service) => {
36
+ try {
37
+ return await keytar.findPassword(service)
38
+ } catch (error) {
39
+ // @ts-ignore
40
+ throw new VError(error, `Failed to find password from service ${service}`)
41
+ }
42
+ }
43
+
44
+ /**
45
+ * @param {string} service
46
+ * @param {string} account
47
+ */
48
+ export const getPassword = async (service, account) => {
49
+ try {
50
+ return await keytar.getPassword(service, account)
51
+ } catch (error) {
52
+ // @ts-ignore
53
+ throw new VError(error, `Failed to get password from service ${service}`)
54
+ }
55
+ }
56
+
57
+ /**
58
+ * @param {string} service
59
+ * @param {string} account
60
+ * @param {string} password
61
+ */
62
+ export const setPassword = async (service, account, password) => {
63
+ try {
64
+ return await keytar.setPassword(service, account, password)
65
+ } catch (error) {
66
+ // @ts-ignore
67
+ throw new VError(error, `Failed to set password for service ${service}`)
68
+ }
69
+ }
@@ -0,0 +1,3 @@
1
+ import debugModule from 'debug'
2
+
3
+ export const debug = debugModule('shared-process')
@@ -0,0 +1,20 @@
1
+ import * as Command from '../Command/Command.js'
2
+ import * as Developer from './Developer.js'
3
+
4
+ export const __initialize__ = () => {
5
+ // Command.register(
6
+ // 281,
7
+ // Developer.measureLatencyBetweenExtensionHostAndSharedProcess
8
+ // )
9
+ // Command.register(
10
+ // 282,
11
+ // Developer.measureLatencyBetweenSharedProcessAndRendererProcess
12
+ // )
13
+ Command.register('Developer.sharedProcessStartupPerformance', Developer.sharedProcessStartupPerformance)
14
+ Command.register('Developer.sharedProcessMemoryUsage', Developer.sharedProcessMemoryUsage)
15
+ Command.register('Developer.allocateMemory', Developer.allocateMemory)
16
+ Command.register('Developer.crashSharedProcess', Developer.crashSharedProcess)
17
+ Command.register('Developer.createHeapSnapshot', Developer.createHeapSnapshot)
18
+ Command.register('Developer.createProfile', Developer.createProfile)
19
+ Command.register('Developer.getNodeStartupTiming', Developer.getNodeStartupTiming)
20
+ }
@@ -0,0 +1,132 @@
1
+ import { createWriteStream, writeFileSync } from 'node:fs'
2
+ import { performance } from 'node:perf_hooks'
3
+ import * as ExtensionHost from '../ExtensionHost/ExtensionHost.js'
4
+
5
+ export const measureLatencyBetweenExtensionHostAndSharedProcess = async (
6
+ socket,
7
+ id
8
+ ) => {
9
+ // TODO lazy load extension host
10
+ const latency = await ExtensionHost.measureLatency()
11
+ socket.send([/* callback */ id, /* latency */ latency])
12
+ }
13
+
14
+ export const measureLatencyBetweenSharedProcessAndRendererProcess = async (
15
+ socket,
16
+ id
17
+ ) => {
18
+ // const start = performance.now()
19
+ // await new Promise((resolve) => {
20
+ // const callbackId = Callback.register(resolve)
21
+ // socket.send(JSON.stringify([/* ping */ 1, /* callbackId */ callbackId]))
22
+ // })
23
+ // const end = performance.now()
24
+ // const latency = end - start
25
+ const latency = 200
26
+ socket.send([/* callback */ id, /* latency */ latency])
27
+ }
28
+
29
+ export const sharedProcessStartupPerformance = () => {
30
+ // TODO
31
+ // performance.eventLoopUtilization
32
+ }
33
+
34
+ export const getNodeStartupTiming = () => {
35
+ const {
36
+ name,
37
+ entryType,
38
+ startTime,
39
+ duration,
40
+ // @ts-ignore
41
+ nodeStart,
42
+ v8Start,
43
+ bootstrapComplete,
44
+ environment,
45
+ loopStart,
46
+ loopExit,
47
+ idleTime,
48
+ } = performance.nodeTiming
49
+ return {
50
+ name,
51
+ entryType,
52
+ startTime,
53
+ duration,
54
+ nodeStart,
55
+ v8Start,
56
+ bootstrapComplete,
57
+ environment,
58
+ loopStart,
59
+ loopExit,
60
+ idleTime,
61
+ }
62
+ }
63
+
64
+ export const sharedProcessMemoryUsage = () => {
65
+ // TODO also print out number of watched files
66
+ return process.memoryUsage()
67
+ }
68
+
69
+ // TODO not sure if this is actually useful
70
+
71
+ /* istanbul ignore next */
72
+ export const allocateMemory = () => {
73
+ const array = Array.from({ length: 1e7 }).fill('some string')
74
+ globalThis.arr = array
75
+ }
76
+
77
+ /* istanbul ignore next */
78
+ export const crashSharedProcess = () => {
79
+ setTimeout(() => {
80
+ throw new Error('oops')
81
+ }, 0)
82
+ }
83
+
84
+ export const osStats = () => {
85
+ // TODO stats
86
+ // - os name
87
+ // - uptime
88
+ // - cpu usage
89
+ // - ram usage
90
+ // - cpu temperature
91
+ // - network usage
92
+ }
93
+
94
+ /* istanbul ignore next */
95
+ export const createHeapSnapshot = async () => {
96
+ const { getHeapSnapshot } = await import('node:v8')
97
+ const { pipeline } = await import('node:stream/promises')
98
+ await pipeline(
99
+ getHeapSnapshot(),
100
+ // TODO get tmp dir from env
101
+ createWriteStream(`/tmp/vscode-${Date.now()}.heapsnapshot`)
102
+ )
103
+ }
104
+
105
+ export const createProfile = async () => {
106
+ const inspector = await import('node:inspector')
107
+ const session = new inspector.Session()
108
+ session.connect()
109
+
110
+ await new Promise((resolve) => {
111
+ session.post('Profiler.enable', () => {
112
+ session.post('Profiler.start', () => {
113
+ // Invoke business logic under measurement here...
114
+
115
+ setTimeout(() => {
116
+ session.post('Profiler.stop', (error, { profile }) => {
117
+ // Write profile to disk, upload, etc.
118
+ if (!error) {
119
+ writeFileSync(
120
+ '/tmp/vscode-profile.cpuprofile',
121
+ JSON.stringify(profile)
122
+ )
123
+ }
124
+ })
125
+ }, 15000)
126
+ // some time later...
127
+ })
128
+ })
129
+ })
130
+ }
131
+
132
+ // require('inspector').open()
@@ -0,0 +1,33 @@
1
+ import { createReadStream, createWriteStream } from 'node:fs'
2
+ import { mkdir, rm } from 'node:fs/promises'
3
+ import { pipeline } from 'node:stream/promises'
4
+ import { createBrotliDecompress } from 'node:zlib'
5
+ import got from 'got'
6
+ import tar from 'tar-fs'
7
+ import * as Error from '../Error/Error.js'
8
+ import * as Path from '../Path/Path.js'
9
+
10
+ export const download = async (url, outFile) => {
11
+ try {
12
+ await mkdir(Path.dirname(outFile), { recursive: true })
13
+ await pipeline(got.stream(url), createWriteStream(outFile))
14
+ } catch (error) {
15
+ try {
16
+ await rm(outFile)
17
+ } catch {}
18
+ throw new Error.OperationalError({
19
+ cause: error,
20
+ code: 'E_DOWNLOAD_FAILED',
21
+ message: `Failed to download "${url}"`,
22
+ })
23
+ }
24
+ }
25
+
26
+ export const extract = async (inFile, outDir) => {
27
+ await mkdir(outDir, { recursive: true })
28
+ await pipeline(
29
+ createReadStream(inFile),
30
+ createBrotliDecompress(),
31
+ tar.extract(outDir)
32
+ )
33
+ }
@@ -0,0 +1,19 @@
1
+ import * as Command from '../Command/Command.js'
2
+ import * as Electron from './Electron.js'
3
+
4
+ export const __initialize__ = () => {
5
+ Command.register('Electron.toggleDevtools', Electron.toggleDevtools)
6
+ Command.register('Electron.windowMinimize', Electron.windowMinimize)
7
+ Command.register('Electron.windowMaximize', Electron.windowMaximize)
8
+ Command.register('Electron.windowUnmaximize', Electron.windowUnmaximize)
9
+ Command.register('Electron.windowClose', Electron.windowClose)
10
+ Command.register('Electron.about', Electron.about)
11
+ Command.register('Electron.showOpenDialog', Electron.showOpenDialog)
12
+ Command.register('Electron.windowReload', Electron.windowReload)
13
+ Command.register('Electron.getPerformanceEntries', Electron.getPerformanceEntries)
14
+ Command.register('Electron.crashMainProcess', Electron.crashMainProcess)
15
+ Command.register('Electron.showMessageBox', Electron.showMessageBox)
16
+ Command.register('Electron.windowOpenNew', Electron.windowOpenNew)
17
+ Command.register('Electron.exit', Electron.exit)
18
+ Command.register('Electron.openProcessExplorer', Electron.openProcessExplorer)
19
+ }