@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.
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/bin/sharedProcess.js +3 -0
- package/index.js +6 -0
- package/package.json +96 -0
- package/src/parts/Assert/Assert.js +57 -0
- package/src/parts/Callback/Callback.js +48 -0
- package/src/parts/ChildProcess/ChildProcess.js +98 -0
- package/src/parts/ClipBoard/ClipBoard.ipc.js +7 -0
- package/src/parts/ClipBoard/ClipBoard.js +23 -0
- package/src/parts/ClipBoard/ClipBoardGnome.js +78 -0
- package/src/parts/ClipBoard/ClipBoardNoop.js +14 -0
- package/src/parts/ClipBoard/ClipBoardWindows.js +22 -0
- package/src/parts/Command/Command.js +264 -0
- package/src/parts/Configuration/Configuration.ipc.js +7 -0
- package/src/parts/Configuration/Configuration.js +39 -0
- package/src/parts/Credentials/Credentials.ipc.js +10 -0
- package/src/parts/Credentials/Credentials.js +69 -0
- package/src/parts/Debug/Debug.js +3 -0
- package/src/parts/Developer/Developer.ipc.js +20 -0
- package/src/parts/Developer/Developer.js +132 -0
- package/src/parts/Download/Download.js +33 -0
- package/src/parts/Electron/Electron.ipc.js +19 -0
- package/src/parts/Electron/Electron.js +99 -0
- package/src/parts/Env/Env.js +3 -0
- package/src/parts/Error/Error.js +30 -0
- package/src/parts/ErrorHandling/ErrorHandling.js +40 -0
- package/src/parts/Exec/Exec.js +16 -0
- package/src/parts/Extension/Extension.js +7 -0
- package/src/parts/ExtensionHost/ExtensionHost.ipc.js +80 -0
- package/src/parts/ExtensionHost/ExtensionHost.js +163 -0
- package/src/parts/ExtensionHost/ExtensionHostBraceCompletion.js +14 -0
- package/src/parts/ExtensionHost/ExtensionHostClosingTag.js +14 -0
- package/src/parts/ExtensionHost/ExtensionHostColorTheme.js +60 -0
- package/src/parts/ExtensionHost/ExtensionHostCommand.js +19 -0
- package/src/parts/ExtensionHost/ExtensionHostCompletion.js +12 -0
- package/src/parts/ExtensionHost/ExtensionHostDefinition.js +12 -0
- package/src/parts/ExtensionHost/ExtensionHostDiagnostic.js +7 -0
- package/src/parts/ExtensionHost/ExtensionHostFileSystem.js +23 -0
- package/src/parts/ExtensionHost/ExtensionHostFormatting.js +4 -0
- package/src/parts/ExtensionHost/ExtensionHostHover.js +12 -0
- package/src/parts/ExtensionHost/ExtensionHostIconTheme.js +35 -0
- package/src/parts/ExtensionHost/ExtensionHostImplementation.js +12 -0
- package/src/parts/ExtensionHost/ExtensionHostKeyBindings.js +23 -0
- package/src/parts/ExtensionHost/ExtensionHostLanguages.js +84 -0
- package/src/parts/ExtensionHost/ExtensionHostManagement.js +26 -0
- package/src/parts/ExtensionHost/ExtensionHostOutput.js +3 -0
- package/src/parts/ExtensionHost/ExtensionHostQuickPick.js +6 -0
- package/src/parts/ExtensionHost/ExtensionHostReference.js +12 -0
- package/src/parts/ExtensionHost/ExtensionHostRename.js +27 -0
- package/src/parts/ExtensionHost/ExtensionHostSemanticTokens.js +10 -0
- package/src/parts/ExtensionHost/ExtensionHostSourceControl.js +15 -0
- package/src/parts/ExtensionHost/ExtensionHostStats.js +3 -0
- package/src/parts/ExtensionHost/ExtensionHostStatusBar.js +7 -0
- package/src/parts/ExtensionHost/ExtensionHostTabCompletion.js +12 -0
- package/src/parts/ExtensionHost/ExtensionHostTextDocument.js +35 -0
- package/src/parts/ExtensionHost/ExtensionHostTypeDefinition.js +12 -0
- package/src/parts/ExtensionHost/ExtensionHostWorkspace.js +3 -0
- package/src/parts/ExtensionManagement/ExtensionManagement.ipc.js +11 -0
- package/src/parts/ExtensionManagement/ExtensionManagement.js +319 -0
- package/src/parts/FileSystem/FileSystem.ipc.js +32 -0
- package/src/parts/FileSystem/FileSystem.js +228 -0
- package/src/parts/Git/Git.js +58 -0
- package/src/parts/Json/Json.js +67 -0
- package/src/parts/JsonFile/JsonFile.js +14 -0
- package/src/parts/JsonRpc/JsonRpc.js +22 -0
- package/src/parts/Native/Native.ipc.js +6 -0
- package/src/parts/Native/Native.js +14 -0
- package/src/parts/OutputChannel/OutputChannel.ipc.js +51 -0
- package/src/parts/OutputChannel/OutputChannel.js +37 -0
- package/src/parts/ParentIpc/ParentIpc.js +203 -0
- package/src/parts/Path/Path.js +17 -0
- package/src/parts/Platform/Platform.ipc.js +18 -0
- package/src/parts/Platform/Platform.js +165 -0
- package/src/parts/Preferences/Preferences.ipc.js +6 -0
- package/src/parts/Preferences/Preferences.js +75 -0
- package/src/parts/PrettyError/PrettyError.js +86 -0
- package/src/parts/Process/Process.ipc.js +7 -0
- package/src/parts/Process/Process.js +7 -0
- package/src/parts/Queue/Queue.js +35 -0
- package/src/parts/RequiresSocket/RequiresSocket.js +11 -0
- package/src/parts/RgPath/RgPath.js +1 -0
- package/src/parts/Root/Root.js +6 -0
- package/src/parts/Search/Search.ipc.js +6 -0
- package/src/parts/Search/Search.js +101 -0
- package/src/parts/SearchFile/SearchFile.ipc.js +6 -0
- package/src/parts/SearchFile/SearchFile.js +51 -0
- package/src/parts/Socket/Socket.js +132 -0
- package/src/parts/Stats/Stats.js +45 -0
- package/src/parts/Terminal/Terminal.ipc.js +45 -0
- package/src/parts/Terminal/Terminal.js +161 -0
- package/src/parts/TextDocument/TextDocument.ipc.js +6 -0
- package/src/parts/TextDocument/TextDocument.js +37 -0
- package/src/parts/Trace/Trace.js +15 -0
- package/src/parts/Trash/Trash.js +11 -0
- package/src/parts/WebSocketServer/WebSocketServer.ipc.js +6 -0
- package/src/parts/WebSocketServer/WebSocketServer.js +43 -0
- package/src/parts/Workspace/Workspace.ipc.js +7 -0
- package/src/parts/Workspace/Workspace.js +107 -0
- package/src/sharedProcessMain.js +61 -0
- package/test/Callback.test.js +42 -0
- package/test/ClipBoard.test.js +105 -0
- package/test/Credentials.test.js +147 -0
- package/test/Developer.test.js +34 -0
- package/test/Electron.test.js +93 -0
- package/test/Error.test.js +16 -0
- package/test/Exec.test.js +25 -0
- package/test/ExtensionHost.test.js +127 -0
- package/test/ExtensionHostColorTheme.test.js +141 -0
- package/test/ExtensionHostCommand.test.js +27 -0
- package/test/ExtensionHostCompletion.test.js +45 -0
- package/test/ExtensionHostDefinition.test.js +35 -0
- package/test/ExtensionHostDiagnostic.test.js +23 -0
- package/test/ExtensionHostFileSystem.test.js +91 -0
- package/test/ExtensionHostFormatting.test.js +27 -0
- package/test/ExtensionHostIconTheme.test.js +73 -0
- package/test/ExtensionHostLanguages.test.js +212 -0
- package/test/ExtensionHostOutput.test.js +23 -0
- package/test/ExtensionHostRename.test.js +59 -0
- package/test/ExtensionHostSemanticTokens.test.js +26 -0
- package/test/ExtensionHostTabCompletion.test.js +35 -0
- package/test/ExtensionHostTextDocument.test.js +61 -0
- package/test/ExtensionHostTypeDefinition.test.js +35 -0
- package/test/ExtensionHostWorkspace.test.js +21 -0
- package/test/ExtensionManagement.test.js +408 -0
- package/test/FileSystem.test.js +294 -0
- package/test/Json.test.js +25 -0
- package/test/Native.test.js +31 -0
- package/test/OutputChannel.test.js +68 -0
- package/test/Path.test.js +17 -0
- package/test/Platform.test.js +61 -0
- package/test/Preferences.test.js +140 -0
- package/test/Process.test.js +9 -0
- package/test/RgPath.test.js +5 -0
- package/test/Search.test.js +45 -0
- package/test/SearchFile.test.js +80 -0
- package/test/Terminal.test.js +53 -0
- package/test/Trash.test.js +34 -0
- package/test/WebSocketServer.test.js +98 -0
- package/test/fixture-search-1/index.html +10 -0
- package/test/fixture-search-file-1/fileA +0 -0
- package/test/fixture-search-file-1/fileB +0 -0
- 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,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,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
|
+
}
|