brighterscript 1.0.0-alpha.52 → 1.0.0-alpha.53
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/README.md +5 -3
- package/bsconfig.schema.json +151 -0
- package/dist/BsConfig.d.ts +158 -44
- package/dist/BsConfig.js +24 -0
- package/dist/BsConfig.js.map +1 -1
- package/dist/BusyStatusTracker.js +3 -0
- package/dist/BusyStatusTracker.js.map +1 -1
- package/dist/CrossScopeValidator.js +5 -0
- package/dist/CrossScopeValidator.js.map +1 -1
- package/dist/DiagnosticFilterer.d.ts +17 -1
- package/dist/DiagnosticFilterer.js +69 -6
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticManager.d.ts +11 -1
- package/dist/DiagnosticManager.js +22 -3
- package/dist/DiagnosticManager.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +93 -4
- package/dist/DiagnosticMessages.js +91 -5
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +15 -3
- package/dist/LanguageServer.js +53 -6
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +7 -7
- package/dist/Logger.js +2 -2
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.js +2 -1
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +106 -9
- package/dist/Program.js +273 -23
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.js +6 -0
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/RokuConstants.d.ts +123 -0
- package/dist/RokuConstants.js +87 -0
- package/dist/RokuConstants.js.map +1 -0
- package/dist/ScopeNamespaceLookup.js.map +1 -1
- package/dist/Stopwatch.js +2 -2
- package/dist/Stopwatch.js.map +1 -1
- package/dist/SymbolTable.d.ts +1 -0
- package/dist/SymbolTable.js +20 -12
- package/dist/SymbolTable.js.map +1 -1
- package/dist/Throttler.d.ts +1 -1
- package/dist/Throttler.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +6 -1
- package/dist/astUtils/reflection.js +15 -4
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +1 -1
- package/dist/astUtils/visitors.js +2 -0
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +2 -2
- package/dist/bscPlugin/BscPlugin.js +1 -1
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
- package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -1
- package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.d.ts +3 -3
- package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.js +2 -3
- package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
- package/dist/bscPlugin/definition/DefinitionProvider.d.ts +67 -2
- package/dist/bscPlugin/definition/DefinitionProvider.js +244 -5
- package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -1
- package/dist/bscPlugin/references/ReferencesProvider.js +7 -1
- package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -1
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +40 -6
- package/dist/bscPlugin/validation/BrsFileValidator.js +109 -18
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
- package/dist/bscPlugin/validation/ProgramValidator.d.ts +10 -0
- package/dist/bscPlugin/validation/ProgramValidator.js +54 -0
- package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -1
- package/dist/bscPlugin/validation/ScopeValidator.js +55 -30
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
- package/dist/bscPlugin/validation/XmlFileValidator.d.ts +18 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js +51 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +1 -1
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/files/BrsFile.d.ts +2 -2
- package/dist/files/BrsFile.js +2 -2
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/XmlFile.d.ts +51 -1
- package/dist/files/XmlFile.js +264 -0
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/formatUtils.d.ts +20 -0
- package/dist/formatUtils.js +38 -0
- package/dist/formatUtils.js.map +1 -0
- package/dist/globalCallables.d.ts +1 -1
- package/dist/globalCallables.js +4 -1
- package/dist/globalCallables.js.map +1 -1
- package/dist/interfaces.d.ts +60 -5
- package/dist/interfaces.js.map +1 -1
- package/dist/lexer/Lexer.d.ts +26 -0
- package/dist/lexer/Lexer.js +140 -15
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +27 -0
- package/dist/lexer/TokenKind.js +77 -3
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/lsp/ActionQueue.js +1 -2
- package/dist/lsp/ActionQueue.js.map +1 -1
- package/dist/lsp/DocumentManager.js +4 -0
- package/dist/lsp/DocumentManager.js.map +1 -1
- package/dist/lsp/LspProject.d.ts +2 -2
- package/dist/lsp/Project.d.ts +2 -2
- package/dist/lsp/Project.js +2 -0
- package/dist/lsp/Project.js.map +1 -1
- package/dist/lsp/ProjectManager.d.ts +7 -2
- package/dist/lsp/ProjectManager.js +3 -1
- package/dist/lsp/ProjectManager.js.map +1 -1
- package/dist/lsp/worker/MessageHandler.d.ts +1 -0
- package/dist/lsp/worker/MessageHandler.js +9 -0
- package/dist/lsp/worker/MessageHandler.js.map +1 -1
- package/dist/lsp/worker/WorkerPool.d.ts +51 -17
- package/dist/lsp/worker/WorkerPool.js +118 -40
- package/dist/lsp/worker/WorkerPool.js.map +1 -1
- package/dist/lsp/worker/WorkerThreadProject.d.ts +16 -3
- package/dist/lsp/worker/WorkerThreadProject.js +50 -10
- package/dist/lsp/worker/WorkerThreadProject.js.map +1 -1
- package/dist/lsp/worker/WorkerThreadProjectRunner.js +6 -0
- package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -1
- package/dist/lsp/worker/run.js +20 -3
- package/dist/lsp/worker/run.js.map +1 -1
- package/dist/parser/AstNode.d.ts +59 -2
- package/dist/parser/AstNode.js +63 -5
- package/dist/parser/AstNode.js.map +1 -1
- package/dist/parser/BrsTranspileState.d.ts +44 -0
- package/dist/parser/BrsTranspileState.js +49 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +56 -8
- package/dist/parser/Expression.js +91 -8
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.d.ts +0 -5
- package/dist/parser/Parser.js +5 -9
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/SGParser.d.ts +7 -1
- package/dist/parser/SGParser.js +20 -10
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGTypes.js +8 -2
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/Statement.d.ts +21 -10
- package/dist/parser/Statement.js +61 -1
- package/dist/parser/Statement.js.map +1 -1
- package/dist/preprocessor/Manifest.d.ts +16 -0
- package/dist/preprocessor/Manifest.js +21 -5
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/roku-types/index.d.ts +3 -0
- package/dist/types/BuiltInInterfaceAdder.js +1 -1
- package/dist/types/BuiltInInterfaceAdder.js.map +1 -1
- package/dist/types/InheritableType.d.ts +0 -1
- package/dist/types/InheritableType.js +12 -11
- package/dist/types/InheritableType.js.map +1 -1
- package/dist/types/InterfaceType.js +6 -0
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/IntersectionType.d.ts +1 -1
- package/dist/types/IntersectionType.js +7 -7
- package/dist/types/IntersectionType.js.map +1 -1
- package/dist/types/ReferenceType.js +1 -1
- package/dist/types/ReferenceType.js.map +1 -1
- package/dist/types/helpers.d.ts +2 -2
- package/dist/types/helpers.js +8 -5
- package/dist/types/helpers.js.map +1 -1
- package/dist/util.d.ts +38 -4
- package/dist/util.js +296 -29
- package/dist/util.js.map +1 -1
- package/package.json +12 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../../src/lsp/worker/MessageHandler.ts"],"names":[],"mappings":";;;AACA,8CAA8C;AAE9C,qCAA8B;AAC9B,6CAA0C;AAO1C,MAAa,cAAc;IACvB,YACI,OAMC;QAiCG,gBAAW,GAAqB,EAAE,CAAC;QAEnC,YAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QAE7B,mBAAc,GAAG,IAAI,GAAG,EAG5B,CAAC;QAwBL;;WAEG;QACK,eAAU,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../../src/lsp/worker/MessageHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,70 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import type { Worker } from 'worker_threads';
|
|
2
|
+
import type { Worker, MessagePort } from 'worker_threads';
|
|
3
|
+
export declare const MEMORY_GB_PER_V8_INSTANCE = 2;
|
|
4
|
+
export declare const MEMORY_GB_BUFFER = 1;
|
|
5
|
+
/**
|
|
6
|
+
* Gets the lower bound of number of CPUS available vs 2GB chunks of memory.
|
|
7
|
+
* This allows as many concurrent threads as possible, while still allowing a full v8 instance per thread.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getDefaultMaxWorkerThreads(): number;
|
|
3
10
|
export declare class WorkerPool {
|
|
4
11
|
private factory;
|
|
5
12
|
constructor(factory: () => Worker);
|
|
6
|
-
logger: import("@rokucommunity/logger
|
|
13
|
+
logger: import("@rokucommunity/logger").Logger;
|
|
7
14
|
/**
|
|
8
|
-
*
|
|
15
|
+
* The maximum number of worker threads (i.e. separate V8 isolates) this pool will create.
|
|
16
|
+
* Once this limit is reached, additional projects are multiplexed onto existing workers
|
|
17
|
+
* (each project still gets its own dedicated MessagePort) instead of spawning new threads.
|
|
9
18
|
*/
|
|
10
|
-
|
|
19
|
+
maxWorkers: number;
|
|
11
20
|
/**
|
|
12
|
-
*
|
|
21
|
+
* Every worker thread currently in the pool, along with how many projects are attached to it
|
|
13
22
|
*/
|
|
14
|
-
private
|
|
23
|
+
private workers;
|
|
15
24
|
/**
|
|
16
|
-
*
|
|
17
|
-
* @param count the number of total free workers that should exist when this function exits
|
|
25
|
+
* Create a new worker and add it to the pool
|
|
18
26
|
*/
|
|
19
|
-
|
|
27
|
+
private createWorker;
|
|
20
28
|
/**
|
|
21
|
-
*
|
|
29
|
+
* Mark a worker as dead so it can't be reused and doesn't consume a `maxWorkers` slot. Does NOT terminate
|
|
30
|
+
* the worker (it's assumed to already be gone, e.g. because it exited/crashed). The entry is only fully
|
|
31
|
+
* untracked once no projects are attached to it, so surviving tenants can still release their slots.
|
|
32
|
+
* Safe to call even if the worker is already untracked (e.g. because `releaseProject()` already removed
|
|
33
|
+
* it as part of an intentional shutdown).
|
|
22
34
|
*/
|
|
23
|
-
private
|
|
35
|
+
private removeWorker;
|
|
36
|
+
/**
|
|
37
|
+
* Find the worker entry with the fewest attached projects
|
|
38
|
+
*/
|
|
39
|
+
private getLeastLoadedEntry;
|
|
40
|
+
/**
|
|
41
|
+
* All workers that are still alive (i.e. eligible to host new projects)
|
|
42
|
+
*/
|
|
43
|
+
private getLiveWorkers;
|
|
44
|
+
/**
|
|
45
|
+
* Ensure that there are at least `count` workers created in the pool
|
|
46
|
+
* @param count the minimum number of workers that should exist when this function exits
|
|
47
|
+
*/
|
|
48
|
+
preload(count: number): void;
|
|
24
49
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
50
|
+
* Assign a new project to a worker thread. Prefers reusing an existing idle (zero-project) worker
|
|
51
|
+
* (e.g. one created via `preload()`). If none is available and the pool hasn't yet reached `maxWorkers`,
|
|
52
|
+
* a new worker is created for this project. Otherwise, the project is attached to the least-loaded
|
|
53
|
+
* existing worker via its own dedicated `MessagePort`, so multiple projects can share a single worker
|
|
54
|
+
* thread/isolate.
|
|
55
|
+
* @returns the worker thread hosting this project, and the MessagePort dedicated to it
|
|
27
56
|
*/
|
|
28
|
-
|
|
57
|
+
assignProject(): {
|
|
58
|
+
worker: Worker;
|
|
59
|
+
port: MessagePort;
|
|
60
|
+
};
|
|
29
61
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
62
|
+
* Release a project from its worker. If that worker has no more attached projects, it is
|
|
63
|
+
* terminated and removed from the pool so its memory can be reclaimed.
|
|
64
|
+
* @param worker the worker the project was assigned to (from `assignProject()`)
|
|
32
65
|
*/
|
|
33
|
-
|
|
66
|
+
releaseProject(worker: Worker): void;
|
|
67
|
+
private terminateWorker;
|
|
34
68
|
/**
|
|
35
69
|
* Shut down all active worker pools
|
|
36
70
|
*/
|
|
@@ -1,77 +1,155 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WorkerPool = void 0;
|
|
3
|
+
exports.WorkerPool = exports.getDefaultMaxWorkerThreads = exports.MEMORY_GB_BUFFER = exports.MEMORY_GB_PER_V8_INSTANCE = void 0;
|
|
4
|
+
const worker_threads_1 = require("worker_threads");
|
|
4
5
|
const logging_1 = require("../../logging");
|
|
6
|
+
const os = require("os");
|
|
7
|
+
exports.MEMORY_GB_PER_V8_INSTANCE = 2;
|
|
8
|
+
exports.MEMORY_GB_BUFFER = 1;
|
|
9
|
+
/**
|
|
10
|
+
* Gets the lower bound of number of CPUS available vs 2GB chunks of memory.
|
|
11
|
+
* This allows as many concurrent threads as possible, while still allowing a full v8 instance per thread.
|
|
12
|
+
*/
|
|
13
|
+
function getDefaultMaxWorkerThreads() {
|
|
14
|
+
const numCpus = os.cpus().length;
|
|
15
|
+
const availableMemoryGB = Math.floor(os.totalmem() / (1024 * 1024 * 1024)) - exports.MEMORY_GB_BUFFER;
|
|
16
|
+
return Math.max(1, Math.min(numCpus, Math.floor(availableMemoryGB / exports.MEMORY_GB_PER_V8_INSTANCE)));
|
|
17
|
+
}
|
|
18
|
+
exports.getDefaultMaxWorkerThreads = getDefaultMaxWorkerThreads;
|
|
5
19
|
class WorkerPool {
|
|
6
20
|
constructor(factory) {
|
|
7
21
|
this.factory = factory;
|
|
8
22
|
this.logger = (0, logging_1.createLogger)();
|
|
9
23
|
/**
|
|
10
|
-
*
|
|
24
|
+
* The maximum number of worker threads (i.e. separate V8 isolates) this pool will create.
|
|
25
|
+
* Once this limit is reached, additional projects are multiplexed onto existing workers
|
|
26
|
+
* (each project still gets its own dedicated MessagePort) instead of spawning new threads.
|
|
11
27
|
*/
|
|
12
|
-
this.
|
|
28
|
+
this.maxWorkers = getDefaultMaxWorkerThreads();
|
|
13
29
|
/**
|
|
14
|
-
*
|
|
30
|
+
* Every worker thread currently in the pool, along with how many projects are attached to it
|
|
15
31
|
*/
|
|
16
|
-
this.
|
|
32
|
+
this.workers = [];
|
|
17
33
|
}
|
|
18
34
|
/**
|
|
19
|
-
*
|
|
20
|
-
* @param count the number of total free workers that should exist when this function exits
|
|
35
|
+
* Create a new worker and add it to the pool
|
|
21
36
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.
|
|
37
|
+
createWorker() {
|
|
38
|
+
const entry = {
|
|
39
|
+
worker: this.factory(),
|
|
40
|
+
projectCount: 0
|
|
41
|
+
};
|
|
42
|
+
this.workers.push(entry);
|
|
43
|
+
//stop tracking a worker once it unexpectedly exits, so it can't be reused and doesn't consume a maxWorkers slot forever
|
|
44
|
+
entry.worker.once('exit', () => this.removeWorker(entry.worker));
|
|
45
|
+
return entry;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Mark a worker as dead so it can't be reused and doesn't consume a `maxWorkers` slot. Does NOT terminate
|
|
49
|
+
* the worker (it's assumed to already be gone, e.g. because it exited/crashed). The entry is only fully
|
|
50
|
+
* untracked once no projects are attached to it, so surviving tenants can still release their slots.
|
|
51
|
+
* Safe to call even if the worker is already untracked (e.g. because `releaseProject()` already removed
|
|
52
|
+
* it as part of an intentional shutdown).
|
|
53
|
+
*/
|
|
54
|
+
removeWorker(worker) {
|
|
55
|
+
const index = this.workers.findIndex(x => x.worker === worker);
|
|
56
|
+
if (index > -1) {
|
|
57
|
+
const entry = this.workers[index];
|
|
58
|
+
entry.isDead = true;
|
|
59
|
+
//nobody is attached anymore, so we can drop the entry entirely
|
|
60
|
+
if (entry.projectCount <= 0) {
|
|
61
|
+
this.workers.splice(index, 1);
|
|
62
|
+
}
|
|
25
63
|
}
|
|
26
64
|
}
|
|
27
65
|
/**
|
|
28
|
-
*
|
|
66
|
+
* Find the worker entry with the fewest attached projects
|
|
29
67
|
*/
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
68
|
+
getLeastLoadedEntry() {
|
|
69
|
+
const liveWorkers = this.getLiveWorkers();
|
|
70
|
+
return liveWorkers.reduce((least, current) => (current.projectCount < least.projectCount ? current : least), liveWorkers[0]);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* All workers that are still alive (i.e. eligible to host new projects)
|
|
74
|
+
*/
|
|
75
|
+
getLiveWorkers() {
|
|
76
|
+
return this.workers.filter(x => !x.isDead);
|
|
34
77
|
}
|
|
35
78
|
/**
|
|
36
|
-
*
|
|
37
|
-
* @
|
|
79
|
+
* Ensure that there are at least `count` workers created in the pool
|
|
80
|
+
* @param count the minimum number of workers that should exist when this function exits
|
|
38
81
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
82
|
+
preload(count) {
|
|
83
|
+
while (this.getLiveWorkers().length < Math.min(count, this.maxWorkers)) {
|
|
84
|
+
this.createWorker();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Assign a new project to a worker thread. Prefers reusing an existing idle (zero-project) worker
|
|
89
|
+
* (e.g. one created via `preload()`). If none is available and the pool hasn't yet reached `maxWorkers`,
|
|
90
|
+
* a new worker is created for this project. Otherwise, the project is attached to the least-loaded
|
|
91
|
+
* existing worker via its own dedicated `MessagePort`, so multiple projects can share a single worker
|
|
92
|
+
* thread/isolate.
|
|
93
|
+
* @returns the worker thread hosting this project, and the MessagePort dedicated to it
|
|
94
|
+
*/
|
|
95
|
+
assignProject() {
|
|
96
|
+
const liveWorkerCount = this.getLiveWorkers().length;
|
|
97
|
+
let entry = this.workers.find(x => !x.isDead && x.projectCount === 0);
|
|
98
|
+
if (!entry) {
|
|
99
|
+
//the `=== 0` check guards against a nonsensical maxWorkers (0, negative, NaN) stranding the pool at zero workers
|
|
100
|
+
if (liveWorkerCount === 0 || liveWorkerCount < this.maxWorkers) {
|
|
101
|
+
this.logger.log('Creating new worker thread');
|
|
102
|
+
entry = this.createWorker();
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.logger.log('Reusing existing worker thread');
|
|
106
|
+
entry = this.getLeastLoadedEntry();
|
|
107
|
+
}
|
|
44
108
|
}
|
|
45
109
|
else {
|
|
46
|
-
|
|
47
|
-
this.logger.log('Reusing existing worker thread');
|
|
48
|
-
return this.freeWorkers.pop();
|
|
110
|
+
this.logger.log('Reusing preloaded/idle worker thread');
|
|
49
111
|
}
|
|
112
|
+
entry.projectCount++;
|
|
113
|
+
const { port1, port2 } = new worker_threads_1.MessageChannel();
|
|
114
|
+
entry.worker.postMessage({ type: 'attachProject', port: port2 }, [port2]);
|
|
115
|
+
return { worker: entry.worker, port: port1 };
|
|
50
116
|
}
|
|
51
117
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
118
|
+
* Release a project from its worker. If that worker has no more attached projects, it is
|
|
119
|
+
* terminated and removed from the pool so its memory can be reclaimed.
|
|
120
|
+
* @param worker the worker the project was assigned to (from `assignProject()`)
|
|
54
121
|
*/
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (
|
|
58
|
-
|
|
122
|
+
releaseProject(worker) {
|
|
123
|
+
const index = this.workers.findIndex(x => x.worker === worker);
|
|
124
|
+
if (index === -1) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const entry = this.workers[index];
|
|
128
|
+
entry.projectCount--;
|
|
129
|
+
if (entry.projectCount <= 0) {
|
|
130
|
+
this.workers.splice(index, 1);
|
|
131
|
+
//an already-exited worker needs no termination
|
|
132
|
+
if (!entry.isDead) {
|
|
133
|
+
this.terminateWorker(worker);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
terminateWorker(worker) {
|
|
138
|
+
try {
|
|
139
|
+
Promise.resolve(worker.terminate()).catch(e => console.error(e));
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
console.error(e);
|
|
59
143
|
}
|
|
60
144
|
}
|
|
61
145
|
/**
|
|
62
146
|
* Shut down all active worker pools
|
|
63
147
|
*/
|
|
64
148
|
dispose() {
|
|
65
|
-
for (const
|
|
66
|
-
|
|
67
|
-
Promise.resolve(worker.terminate()).catch(e => console.error(e));
|
|
68
|
-
}
|
|
69
|
-
catch (e) {
|
|
70
|
-
console.error(e);
|
|
71
|
-
}
|
|
149
|
+
for (const entry of this.workers) {
|
|
150
|
+
this.terminateWorker(entry.worker);
|
|
72
151
|
}
|
|
73
|
-
this.
|
|
74
|
-
this.freeWorkers = [];
|
|
152
|
+
this.workers = [];
|
|
75
153
|
}
|
|
76
154
|
}
|
|
77
155
|
exports.WorkerPool = WorkerPool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerPool.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerPool.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"WorkerPool.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerPool.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { WorkerPool } from './WorkerPool';
|
|
|
4
4
|
import type { Hover, MaybePromise, SemanticToken } from '../../interfaces';
|
|
5
5
|
import type { DocumentAction, DocumentActionWithStatus } from '../DocumentManager';
|
|
6
6
|
import type { FileTranspileResult, SignatureInfoObj } from '../../Program';
|
|
7
|
-
import type { Position, Range, Location, DocumentSymbol, WorkspaceSymbol, CodeAction, CompletionList, SelectionRange, InlayHint } from 'vscode-languageserver-protocol';
|
|
7
|
+
import type { Position, Range, Location, LocationLink, DocumentSymbol, WorkspaceSymbol, CodeAction, CompletionList, SelectionRange, InlayHint } from 'vscode-languageserver-protocol';
|
|
8
8
|
import type { Logger } from '../../logging';
|
|
9
9
|
export declare const workerPool: WorkerPool;
|
|
10
10
|
export declare class WorkerThreadProject implements LspProject {
|
|
@@ -53,9 +53,22 @@ export declare class WorkerThreadProject implements LspProject {
|
|
|
53
53
|
*/
|
|
54
54
|
manifestSrcPath?: string;
|
|
55
55
|
/**
|
|
56
|
-
* The worker thread where the actual project will execute
|
|
56
|
+
* The worker thread where the actual project will execute. May be shared with other projects.
|
|
57
57
|
*/
|
|
58
58
|
private worker;
|
|
59
|
+
/**
|
|
60
|
+
* This project's dedicated MessagePort on `worker`, used for all request/response/update traffic
|
|
61
|
+
*/
|
|
62
|
+
private port;
|
|
63
|
+
/**
|
|
64
|
+
* True once `dispose()` has run. Used to distinguish an intentional worker shutdown from an unexpected crash.
|
|
65
|
+
*/
|
|
66
|
+
private isDisposed;
|
|
67
|
+
/**
|
|
68
|
+
* Called if this project's worker thread exits. If we didn't cause that ourselves via `dispose()`,
|
|
69
|
+
* treat it as a critical failure so the user finds out instead of every request just hanging forever.
|
|
70
|
+
*/
|
|
71
|
+
private handleWorkerExit;
|
|
59
72
|
/**
|
|
60
73
|
* Path to the project. For directory-only projects, this is the path to the dir. For bsconfig.json projects, this is the path to the config.
|
|
61
74
|
*/
|
|
@@ -116,7 +129,7 @@ export declare class WorkerThreadProject implements LspProject {
|
|
|
116
129
|
getDefinition(options: {
|
|
117
130
|
srcPath: string;
|
|
118
131
|
position: Position;
|
|
119
|
-
}): Promise<Location
|
|
132
|
+
}): Promise<Array<Location | LocationLink>>;
|
|
120
133
|
getSignatureHelp(options: {
|
|
121
134
|
srcPath: string;
|
|
122
135
|
position: Position;
|
|
@@ -38,6 +38,35 @@ class WorkerThreadProject {
|
|
|
38
38
|
var _a;
|
|
39
39
|
this.isStandaloneProject = false;
|
|
40
40
|
this.activationDeferred = new deferred_1.Deferred();
|
|
41
|
+
/**
|
|
42
|
+
* True once `dispose()` has run. Used to distinguish an intentional worker shutdown from an unexpected crash.
|
|
43
|
+
*/
|
|
44
|
+
this.isDisposed = false;
|
|
45
|
+
/**
|
|
46
|
+
* Called if this project's worker thread exits. If we didn't cause that ourselves via `dispose()`,
|
|
47
|
+
* treat it as a critical failure so the user finds out instead of every request just hanging forever.
|
|
48
|
+
*/
|
|
49
|
+
this.handleWorkerExit = (code) => {
|
|
50
|
+
var _a, _b;
|
|
51
|
+
if (this.isDisposed) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
//the worker is gone, so this project can never serve another request. Mark it dead BEFORE emitting so
|
|
55
|
+
//anything reacting to the critical-failure sees an accurate `isDisposed`
|
|
56
|
+
this.isDisposed = true;
|
|
57
|
+
this.logger.error(`Worker thread for project #${this.projectNumber} exited unexpectedly with code ${code}`);
|
|
58
|
+
//emit() is async; this handler can't be, so void it
|
|
59
|
+
void this.emit('critical-failure', {
|
|
60
|
+
message: `The BrighterScript language server's worker thread crashed unexpectedly (exit code ${code}). This project (and any others sharing its worker thread) will stop responding until the language server is reloaded - there is currently no automatic recovery for a crashed worker thread.`
|
|
61
|
+
});
|
|
62
|
+
//reject any in-flight requests instead of leaving callers hanging forever on a worker that's gone
|
|
63
|
+
(_a = this.messageHandler) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
64
|
+
//give up our slot on the (now-dead) worker so co-tenant projects keep an accurate projectCount
|
|
65
|
+
(_b = this.port) === null || _b === void 0 ? void 0 : _b.close();
|
|
66
|
+
if (this.worker) {
|
|
67
|
+
exports.workerPool.releaseProject(this.worker);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
41
70
|
this.emitter = new EventEmitter();
|
|
42
71
|
this.disposables = [];
|
|
43
72
|
this.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) !== null && _a !== void 0 ? _a : (0, logging_1.createLogger)();
|
|
@@ -50,11 +79,14 @@ class WorkerThreadProject {
|
|
|
50
79
|
this.projectKey = options.projectKey ? util_1.default.standardizePath(options.projectKey) : (_a = options.bsconfigPath) !== null && _a !== void 0 ? _a : options.projectDir;
|
|
51
80
|
this.workspaceFolder = options.workspaceFolder ? util_1.default.standardizePath(options.workspaceFolder) : options.workspaceFolder;
|
|
52
81
|
this.projectNumber = options.projectNumber;
|
|
53
|
-
//
|
|
54
|
-
|
|
82
|
+
// get a dedicated MessagePort on a (possibly shared) worker thread
|
|
83
|
+
const assignment = exports.workerPool.assignProject();
|
|
84
|
+
this.worker = assignment.worker;
|
|
85
|
+
this.port = assignment.port;
|
|
86
|
+
this.worker.on('exit', this.handleWorkerExit);
|
|
55
87
|
this.messageHandler = new MessageHandler_1.MessageHandler({
|
|
56
88
|
name: 'MainThread',
|
|
57
|
-
port: this.
|
|
89
|
+
port: this.port,
|
|
58
90
|
onRequest: this.processRequest.bind(this),
|
|
59
91
|
onUpdate: this.processUpdate.bind(this)
|
|
60
92
|
});
|
|
@@ -176,11 +208,13 @@ class WorkerThreadProject {
|
|
|
176
208
|
}
|
|
177
209
|
processUpdate(update) {
|
|
178
210
|
//for now, all updates are treated like "events"
|
|
179
|
-
this.emit(update.name, update.data);
|
|
211
|
+
void this.emit(update.name, update.data);
|
|
180
212
|
}
|
|
181
213
|
on(eventName, handler) {
|
|
214
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
182
215
|
this.emitter.on(eventName, handler);
|
|
183
216
|
return () => {
|
|
217
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
184
218
|
this.emitter.removeListener(eventName, handler);
|
|
185
219
|
};
|
|
186
220
|
}
|
|
@@ -192,16 +226,22 @@ class WorkerThreadProject {
|
|
|
192
226
|
this.emitter.emit('all', eventName, data);
|
|
193
227
|
}
|
|
194
228
|
dispose() {
|
|
195
|
-
var _a, _b, _c;
|
|
196
|
-
|
|
197
|
-
|
|
229
|
+
var _a, _b, _c, _d, _e;
|
|
230
|
+
if (this.isDisposed) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
this.isDisposed = true;
|
|
234
|
+
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.off('exit', this.handleWorkerExit);
|
|
235
|
+
for (let disposable of (_b = this.disposables) !== null && _b !== void 0 ? _b : []) {
|
|
236
|
+
(_c = disposable === null || disposable === void 0 ? void 0 : disposable.dispose) === null || _c === void 0 ? void 0 : _c.call(disposable);
|
|
198
237
|
}
|
|
199
238
|
this.disposables = [];
|
|
200
|
-
//
|
|
239
|
+
//close our dedicated port and release our slot on the worker (which terminates the worker if it's now empty)
|
|
240
|
+
(_d = this.port) === null || _d === void 0 ? void 0 : _d.close();
|
|
201
241
|
if (this.worker) {
|
|
202
|
-
exports.workerPool.
|
|
242
|
+
exports.workerPool.releaseProject(this.worker);
|
|
203
243
|
}
|
|
204
|
-
(
|
|
244
|
+
(_e = this.emitter) === null || _e === void 0 ? void 0 : _e.removeAllListeners();
|
|
205
245
|
}
|
|
206
246
|
}
|
|
207
247
|
exports.WorkerThreadProject = WorkerThreadProject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerThreadProject.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProject.ts"],"names":[],"mappings":";;;AAAA,8CAA8C;AAC9C,mDAAwC;
|
|
1
|
+
{"version":3,"file":"WorkerThreadProject.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProject.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,12 @@ class WorkerThreadProjectRunner {
|
|
|
37
37
|
}
|
|
38
38
|
});
|
|
39
39
|
this.requestInterceptors.activate = this.onActivate.bind(this);
|
|
40
|
+
//dispose this project's Program when its dedicated port closes, even though the shared worker keeps running
|
|
41
|
+
parentPort.on('close', () => {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
(_a = this.project) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
44
|
+
(_b = this.messageHandler) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
45
|
+
});
|
|
40
46
|
}
|
|
41
47
|
/**
|
|
42
48
|
* Fired anytime we get an `activate` request from the client. This allows us to clean up the previous project and make a new one
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerThreadProjectRunner.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProjectRunner.ts"],"names":[],"mappings":";;;AAAA,2CAAkD;AAElD,wCAAqC;AAErC,qDAAkD;AAGlD;;GAEG;AACH,MAAa,yBAAyB;IAAtC;QACI,sEAAsE;QAC9D,wBAAmB,GAAG,EAAyD,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkerThreadProjectRunner.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProjectRunner.ts"],"names":[],"mappings":";;;AAAA,2CAAkD;AAElD,wCAAqC;AAErC,qDAAkD;AAGlD;;GAEG;AACH,MAAa,yBAAyB;IAAtC;QACI,sEAAsE;QAC9D,wBAAmB,GAAG,EAAyD,CAAC;IA0D5F,CAAC;IApDU,GAAG,CAAC,UAAuB;QAC9B,8CAA8C;QAC9C,IAAA,2BAAiB,GAAE,CAAC;QAEpB,IAAI,CAAC,cAAc,GAAG,IAAI,+BAAc,CAAC;YACrC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;;gBACxC,IAAI;oBACA,qEAAqE;oBACrE,MAAA,MAAA,IAAI,CAAC,mBAAmB,EAAC,OAAO,CAAC,IAAI,CAAC,mDAAG,OAAO,CAAC,IAAI,CAAC,CAAC;oBAEvD,wIAAwI;oBACxI,IAAI,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,MAAA,OAAO,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC;oBAC3E,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;oBAElE,uFAAuF;iBAC1F;gBAAC,OAAO,CAAC,EAAE;oBACR,MAAM,KAAK,GAAU,CAAQ,CAAC;oBAC9B,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;iBAC/D;YACL,CAAC;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAErB,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/D,4GAA4G;QAC5G,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;;YACxB,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,EAAE,CAAC;YACxB,MAAA,IAAI,CAAC,cAAc,0CAAE,OAAO,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,UAAU;;QACd,+BAA+B;QAC/B,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,EAAE,CAAC;QAExB,0FAA0F;QAC1F,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,SAAiB,EAAE,IAAS,EAAE,EAAE;YACpD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE;gBACtC,IAAI,EAAE,IAAI;aACb,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AA5DD,8DA4DC"}
|
package/dist/lsp/worker/run.js
CHANGED
|
@@ -2,13 +2,30 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
/**
|
|
4
4
|
* This script is the entry point for worker threads that run LSP Projects.
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* A worker thread can host multiple projects at once (see `WorkerPool.assignProject()`): each project
|
|
7
|
+
* gets its own dedicated `MessagePort`, delivered to this worker as an `attachProject` message on
|
|
8
|
+
* `parentPort`. For every such message, we spin up a new `WorkerThreadProjectRunner` bound to that
|
|
9
|
+
* project's port, so each project's request/response traffic stays fully independent even though they
|
|
10
|
+
* share this worker's JS realm (and its module-level caches).
|
|
6
11
|
*/
|
|
7
12
|
const worker_threads_1 = require("worker_threads");
|
|
8
13
|
const WorkerThreadProjectRunner_1 = require("./WorkerThreadProjectRunner");
|
|
9
|
-
const runner = new WorkerThreadProjectRunner_1.WorkerThreadProjectRunner();
|
|
10
14
|
if (!worker_threads_1.parentPort) {
|
|
11
15
|
throw new Error('This script must be run as a worker thread');
|
|
12
16
|
}
|
|
13
|
-
|
|
17
|
+
worker_threads_1.parentPort.on('message', (message) => {
|
|
18
|
+
if ((message === null || message === void 0 ? void 0 : message.type) === 'attachProject') {
|
|
19
|
+
try {
|
|
20
|
+
const runner = new WorkerThreadProjectRunner_1.WorkerThreadProjectRunner();
|
|
21
|
+
runner.run(message.port);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
//don't let one project's setup failure crash this worker thread and take down every other project sharing it
|
|
25
|
+
console.error('Failed to attach project to worker thread', e);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
//tell the main thread this worker has booted and is actually ready to receive `attachProject` messages (see WorkerPool)
|
|
30
|
+
worker_threads_1.parentPort.postMessage({ type: 'ready' });
|
|
14
31
|
//# sourceMappingURL=run.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/lsp/worker/run.ts"],"names":[],"mappings":";;AAAA
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/lsp/worker/run.ts"],"names":[],"mappings":";;AAAA;;;;;;;;GAQG;AACH,mDAA4C;AAE5C,2EAAwE;AAExE,IAAI,CAAC,2BAAU,EAAE;IACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;CACjE;AAED,2BAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAA4C,EAAE,EAAE;IACtE,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,eAAe,EAAE;QACnC,IAAI;YACA,MAAM,MAAM,GAAG,IAAI,qDAAyB,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC5B;QAAC,OAAO,CAAC,EAAE;YACR,6GAA6G;YAC7G,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;SACjE;KACJ;AACL,CAAC,CAAC,CAAC;AAEH,wHAAwH;AACxH,2BAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC"}
|