brighterscript 0.72.5 → 0.73.1

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 (77) hide show
  1. package/dist/DiagnosticFilterer.js +10 -3
  2. package/dist/DiagnosticFilterer.js.map +1 -1
  3. package/dist/DiagnosticMessages.d.ts +68 -1
  4. package/dist/DiagnosticMessages.js +60 -1
  5. package/dist/DiagnosticMessages.js.map +1 -1
  6. package/dist/LanguageServer.d.ts +14 -2
  7. package/dist/LanguageServer.js +50 -5
  8. package/dist/LanguageServer.js.map +1 -1
  9. package/dist/Logger.js +2 -2
  10. package/dist/Logger.js.map +1 -1
  11. package/dist/Program.d.ts +87 -0
  12. package/dist/Program.js +197 -0
  13. package/dist/Program.js.map +1 -1
  14. package/dist/ProgramBuilder.js.map +1 -1
  15. package/dist/RokuConstants.d.ts +88 -0
  16. package/dist/RokuConstants.js +58 -0
  17. package/dist/RokuConstants.js.map +1 -0
  18. package/dist/Stopwatch.js +2 -2
  19. package/dist/Stopwatch.js.map +1 -1
  20. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +27 -6
  21. package/dist/bscPlugin/validation/BrsFileValidator.js +68 -10
  22. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  23. package/dist/bscPlugin/validation/ProgramValidator.d.ts +10 -0
  24. package/dist/bscPlugin/validation/ProgramValidator.js +54 -0
  25. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -1
  26. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +7 -0
  27. package/dist/bscPlugin/validation/XmlFileValidator.js +19 -0
  28. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
  29. package/dist/files/BrsFile.js +1 -2
  30. package/dist/files/BrsFile.js.map +1 -1
  31. package/dist/files/XmlFile.d.ts +45 -0
  32. package/dist/files/XmlFile.js +257 -2
  33. package/dist/files/XmlFile.js.map +1 -1
  34. package/dist/formatUtils.d.ts +20 -0
  35. package/dist/formatUtils.js +38 -0
  36. package/dist/formatUtils.js.map +1 -0
  37. package/dist/globalCallables.d.ts +1 -1
  38. package/dist/globalCallables.js +4 -1
  39. package/dist/globalCallables.js.map +1 -1
  40. package/dist/interfaces.d.ts +11 -0
  41. package/dist/lexer/Lexer.js +4 -1
  42. package/dist/lexer/Lexer.js.map +1 -1
  43. package/dist/lsp/ActionQueue.js +1 -2
  44. package/dist/lsp/ActionQueue.js.map +1 -1
  45. package/dist/lsp/ProjectManager.d.ts +5 -0
  46. package/dist/lsp/ProjectManager.js.map +1 -1
  47. package/dist/lsp/worker/MessageHandler.d.ts +1 -0
  48. package/dist/lsp/worker/MessageHandler.js +9 -0
  49. package/dist/lsp/worker/MessageHandler.js.map +1 -1
  50. package/dist/lsp/worker/WorkerPool.d.ts +38 -17
  51. package/dist/lsp/worker/WorkerPool.js +87 -39
  52. package/dist/lsp/worker/WorkerPool.js.map +1 -1
  53. package/dist/lsp/worker/WorkerThreadProject.d.ts +14 -1
  54. package/dist/lsp/worker/WorkerThreadProject.js +39 -9
  55. package/dist/lsp/worker/WorkerThreadProject.js.map +1 -1
  56. package/dist/lsp/worker/WorkerThreadProjectRunner.js +6 -0
  57. package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -1
  58. package/dist/lsp/worker/run.js +20 -3
  59. package/dist/lsp/worker/run.js.map +1 -1
  60. package/dist/parser/Expression.js +2 -3
  61. package/dist/parser/Expression.js.map +1 -1
  62. package/dist/parser/Parser.js +4 -4
  63. package/dist/parser/Parser.js.map +1 -1
  64. package/dist/parser/SGParser.d.ts +6 -0
  65. package/dist/parser/SGParser.js +24 -16
  66. package/dist/parser/SGParser.js.map +1 -1
  67. package/dist/parser/SGTypes.d.ts +18 -8
  68. package/dist/parser/SGTypes.js +42 -15
  69. package/dist/parser/SGTypes.js.map +1 -1
  70. package/dist/preprocessor/Manifest.d.ts +16 -0
  71. package/dist/preprocessor/Manifest.js +21 -5
  72. package/dist/preprocessor/Manifest.js.map +1 -1
  73. package/dist/roku-types/index.d.ts +4 -0
  74. package/dist/util.d.ts +16 -0
  75. package/dist/util.js +103 -1
  76. package/dist/util.js.map +1 -1
  77. package/package.json +8 -18
@@ -1,77 +1,125 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WorkerPool = void 0;
4
+ const worker_threads_1 = require("worker_threads");
4
5
  const logging_1 = require("../../logging");
6
+ const os = require("os");
5
7
  class WorkerPool {
6
8
  constructor(factory) {
7
9
  this.factory = factory;
8
10
  this.logger = (0, logging_1.createLogger)();
9
11
  /**
10
- * List of workers that are free to be used by a new task
12
+ * The maximum number of worker threads (i.e. separate V8 isolates) this pool will create.
13
+ * Once this limit is reached, additional projects are multiplexed onto existing workers
14
+ * (each project still gets its own dedicated MessagePort) instead of spawning new threads.
11
15
  */
12
- this.freeWorkers = [];
16
+ this.maxWorkers = Math.max(1, os.cpus().length);
13
17
  /**
14
- * List of all workers that we've ever created
18
+ * Every worker thread currently in the pool, along with how many projects are attached to it
15
19
  */
16
- this.allWorkers = [];
20
+ this.workers = [];
17
21
  }
18
22
  /**
19
- * Ensure that there are ${count} workers available in the pool
20
- * @param count the number of total free workers that should exist when this function exits
23
+ * Create a new worker and add it to the pool
21
24
  */
22
- preload(count) {
23
- while (this.freeWorkers.length < count) {
24
- this.freeWorkers.push(this.createWorker());
25
+ createWorker() {
26
+ const entry = {
27
+ worker: this.factory(),
28
+ projectCount: 0
29
+ };
30
+ this.workers.push(entry);
31
+ //stop tracking a worker once it unexpectedly exits, so it can't be reused and doesn't consume a maxWorkers slot forever
32
+ entry.worker.once('exit', () => this.removeWorker(entry.worker));
33
+ return entry;
34
+ }
35
+ /**
36
+ * Stop tracking a worker in this pool. Does NOT terminate the worker (it's assumed to already be gone,
37
+ * e.g. because it exited/crashed). Safe to call even if the worker is already untracked (e.g. because
38
+ * `releaseProject()` already removed it as part of an intentional shutdown).
39
+ */
40
+ removeWorker(worker) {
41
+ const index = this.workers.findIndex(x => x.worker === worker);
42
+ if (index > -1) {
43
+ this.workers.splice(index, 1);
25
44
  }
26
45
  }
27
46
  /**
28
- * Create a new worker
47
+ * Find the worker entry with the fewest attached projects
29
48
  */
30
- createWorker() {
31
- const worker = this.factory();
32
- this.allWorkers.push(worker);
33
- return worker;
49
+ getLeastLoadedEntry() {
50
+ return this.workers.reduce((least, current) => (current.projectCount < least.projectCount ? current : least), this.workers[0]);
34
51
  }
35
52
  /**
36
- * Get a worker from the pool, or create a new one if none are available
37
- * @returns a worker
53
+ * Ensure that there are at least `count` workers created in the pool
54
+ * @param count the minimum number of workers that should exist when this function exits
38
55
  */
39
- getWorker() {
40
- //we have no free workers. spin up a new one
41
- if (this.freeWorkers.length === 0) {
42
- this.logger.log('Creating new worker thread');
43
- return this.createWorker();
56
+ preload(count) {
57
+ while (this.workers.length < Math.min(count, this.maxWorkers)) {
58
+ this.createWorker();
59
+ }
60
+ }
61
+ /**
62
+ * Assign a new project to a worker thread. Prefers reusing an existing idle (zero-project) worker
63
+ * (e.g. one created via `preload()`). If none is available and the pool hasn't yet reached `maxWorkers`,
64
+ * a new worker is created for this project. Otherwise, the project is attached to the least-loaded
65
+ * existing worker via its own dedicated `MessagePort`, so multiple projects can share a single worker
66
+ * thread/isolate.
67
+ * @returns the worker thread hosting this project, and the MessagePort dedicated to it
68
+ */
69
+ assignProject() {
70
+ let entry = this.workers.find(x => x.projectCount === 0);
71
+ if (!entry) {
72
+ //the `=== 0` check guards against a nonsensical maxWorkers (0, negative, NaN) stranding the pool at zero workers
73
+ if (this.workers.length === 0 || this.workers.length < this.maxWorkers) {
74
+ this.logger.log('Creating new worker thread');
75
+ entry = this.createWorker();
76
+ }
77
+ else {
78
+ this.logger.log('Reusing existing worker thread');
79
+ entry = this.getLeastLoadedEntry();
80
+ }
44
81
  }
45
82
  else {
46
- //return an existing free worker
47
- this.logger.log('Reusing existing worker thread');
48
- return this.freeWorkers.pop();
83
+ this.logger.log('Reusing preloaded/idle worker thread');
49
84
  }
85
+ entry.projectCount++;
86
+ const { port1, port2 } = new worker_threads_1.MessageChannel();
87
+ entry.worker.postMessage({ type: 'attachProject', port: port2 }, [port2]);
88
+ return { worker: entry.worker, port: port1 };
50
89
  }
51
90
  /**
52
- * Give the worker back to the pool so it can be used by someone else
53
- * @param worker the worker
91
+ * Release a project from its worker. If that worker has no more attached projects, it is
92
+ * terminated and removed from the pool so its memory can be reclaimed.
93
+ * @param worker the worker the project was assigned to (from `assignProject()`)
54
94
  */
55
- releaseWorker(worker) {
56
- //add this worker back to the free workers list (if it's not already in there)
57
- if (!this.freeWorkers.includes(worker)) {
58
- this.freeWorkers.push(worker);
95
+ releaseProject(worker) {
96
+ const index = this.workers.findIndex(x => x.worker === worker);
97
+ if (index === -1) {
98
+ return;
99
+ }
100
+ const entry = this.workers[index];
101
+ entry.projectCount--;
102
+ if (entry.projectCount <= 0) {
103
+ this.workers.splice(index, 1);
104
+ this.terminateWorker(worker);
105
+ }
106
+ }
107
+ terminateWorker(worker) {
108
+ try {
109
+ Promise.resolve(worker.terminate()).catch(e => console.error(e));
110
+ }
111
+ catch (e) {
112
+ console.error(e);
59
113
  }
60
114
  }
61
115
  /**
62
116
  * Shut down all active worker pools
63
117
  */
64
118
  dispose() {
65
- for (const worker of this.allWorkers) {
66
- try {
67
- Promise.resolve(worker.terminate()).catch(e => console.error(e));
68
- }
69
- catch (e) {
70
- console.error(e);
71
- }
119
+ for (const entry of this.workers) {
120
+ this.terminateWorker(entry.worker);
72
121
  }
73
- this.allWorkers = [];
74
- this.freeWorkers = [];
122
+ this.workers = [];
75
123
  }
76
124
  }
77
125
  exports.WorkerPool = WorkerPool;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPool.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerPool.ts"],"names":[],"mappings":";;;AACA,2CAA6C;AAE7C,MAAa,UAAU;IACnB,YACY,OAAqB;QAArB,YAAO,GAAP,OAAO,CAAc;QAK1B,WAAM,GAAG,IAAA,sBAAY,GAAE,CAAC;QAE/B;;WAEG;QACK,gBAAW,GAAa,EAAE,CAAC;QACnC;;WAEG;QACK,eAAU,GAAa,EAAE,CAAC;IAXlC,CAAC;IAaD;;;OAGG;IACI,OAAO,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CACjB,IAAI,CAAC,YAAY,EAAE,CACtB,CAAC;SACL;IACL,CAAC;IAED;;OAEG;IACK,YAAY;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,SAAS;QACZ,4CAA4C;QAC5C,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;SAC9B;aAAM;YACH,gCAAgC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;SACjC;IACL,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,MAAc;QAC/B,8EAA8E;QAC9E,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACjC;IACL,CAAC;IAED;;OAEG;IACI,OAAO;QACV,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE;YAClC,IAAI;gBACA,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACpE;YAAC,OAAO,CAAC,EAAE;gBACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACpB;SACJ;QACD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;CACJ;AAhFD,gCAgFC"}
1
+ {"version":3,"file":"WorkerPool.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerPool.ts"],"names":[],"mappings":"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"}
@@ -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
  */
@@ -38,6 +38,27 @@ 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;
51
+ if (this.isDisposed) {
52
+ return;
53
+ }
54
+ this.logger.error(`Worker thread for project #${this.projectNumber} exited unexpectedly with code ${code}`);
55
+ //emit() is async; this handler can't be, so void it
56
+ void this.emit('critical-failure', {
57
+ 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.`
58
+ });
59
+ //reject any in-flight requests instead of leaving callers hanging forever on a worker that's gone
60
+ (_a = this.messageHandler) === null || _a === void 0 ? void 0 : _a.dispose();
61
+ };
41
62
  this.emitter = new EventEmitter();
42
63
  this.disposables = [];
43
64
  this.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) !== null && _a !== void 0 ? _a : (0, logging_1.createLogger)();
@@ -50,11 +71,14 @@ class WorkerThreadProject {
50
71
  this.projectKey = options.projectKey ? util_1.default.standardizePath(options.projectKey) : (_a = options.bsconfigPath) !== null && _a !== void 0 ? _a : options.projectDir;
51
72
  this.workspaceFolder = options.workspaceFolder ? util_1.default.standardizePath(options.workspaceFolder) : options.workspaceFolder;
52
73
  this.projectNumber = options.projectNumber;
53
- // start a new worker thread or get an unused existing thread
54
- this.worker = exports.workerPool.getWorker();
74
+ // get a dedicated MessagePort on a (possibly shared) worker thread
75
+ const assignment = exports.workerPool.assignProject();
76
+ this.worker = assignment.worker;
77
+ this.port = assignment.port;
78
+ this.worker.on('exit', this.handleWorkerExit);
55
79
  this.messageHandler = new MessageHandler_1.MessageHandler({
56
80
  name: 'MainThread',
57
- port: this.worker,
81
+ port: this.port,
58
82
  onRequest: this.processRequest.bind(this),
59
83
  onUpdate: this.processUpdate.bind(this)
60
84
  });
@@ -192,16 +216,22 @@ class WorkerThreadProject {
192
216
  this.emitter.emit('all', eventName, data);
193
217
  }
194
218
  dispose() {
195
- var _a, _b, _c;
196
- for (let disposable of (_a = this.disposables) !== null && _a !== void 0 ? _a : []) {
197
- (_b = disposable === null || disposable === void 0 ? void 0 : disposable.dispose) === null || _b === void 0 ? void 0 : _b.call(disposable);
219
+ var _a, _b, _c, _d, _e;
220
+ if (this.isDisposed) {
221
+ return;
222
+ }
223
+ this.isDisposed = true;
224
+ (_a = this.worker) === null || _a === void 0 ? void 0 : _a.off('exit', this.handleWorkerExit);
225
+ for (let disposable of (_b = this.disposables) !== null && _b !== void 0 ? _b : []) {
226
+ (_c = disposable === null || disposable === void 0 ? void 0 : disposable.dispose) === null || _c === void 0 ? void 0 : _c.call(disposable);
198
227
  }
199
228
  this.disposables = [];
200
- //move the worker back to the pool so it can be used again
229
+ //close our dedicated port and release our slot on the worker (which terminates the worker if it's now empty)
230
+ (_d = this.port) === null || _d === void 0 ? void 0 : _d.close();
201
231
  if (this.worker) {
202
- exports.workerPool.releaseWorker(this.worker);
232
+ exports.workerPool.releaseProject(this.worker);
203
233
  }
204
- (_c = this.emitter) === null || _c === void 0 ? void 0 : _c.removeAllListeners();
234
+ (_e = this.emitter) === null || _e === void 0 ? void 0 : _e.removeAllListeners();
205
235
  }
206
236
  }
207
237
  exports.WorkerThreadProject = WorkerThreadProject;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerThreadProject.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProject.ts"],"names":[],"mappings":"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"}
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;IAoD5F,CAAC;IA9CU,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;IACnE,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;AAtDD,8DAsDC"}
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"}
@@ -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
- * It sets up the WorkerThreadProjectRunner to handle messages from the main thread.
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
- runner.run(worker_threads_1.parentPort);
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;;;GAGG;AACH,mDAA4C;AAC5C,2EAAwE;AAExE,MAAM,MAAM,GAAG,IAAI,qDAAyB,EAAE,CAAC;AAC/C,IAAI,CAAC,2BAAU,EAAE;IACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;CACjE;AACD,MAAM,CAAC,GAAG,CAAC,2BAAU,CAAC,CAAC"}
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"}
@@ -4,7 +4,6 @@ exports.TypeCastExpression = exports.RegexLiteralExpression = exports.NullCoales
4
4
  const TokenKind_1 = require("../lexer/TokenKind");
5
5
  const util_1 = require("../util");
6
6
  const Parser_1 = require("./Parser");
7
- const fileUrl = require("file-url");
8
7
  const visitors_1 = require("../astUtils/visitors");
9
8
  const visitors_2 = require("../astUtils/visitors");
10
9
  const reflection_1 = require("../astUtils/reflection");
@@ -939,7 +938,7 @@ class SourceLiteralExpression extends AstNode_1.Expression {
939
938
  let text;
940
939
  switch (this.token.kind) {
941
940
  case TokenKind_1.TokenKind.SourceFilePathLiteral:
942
- const pathUrl = fileUrl(state.srcPath);
941
+ const pathUrl = util_1.default.fileUrl(state.srcPath);
943
942
  text = `"${pathUrl.substring(0, 4)}" + "${pathUrl.substring(4)}"`;
944
943
  break;
945
944
  case TokenKind_1.TokenKind.SourceLineNumLiteral:
@@ -964,7 +963,7 @@ class SourceLiteralExpression extends AstNode_1.Expression {
964
963
  text = `"${rootNamespace}"`;
965
964
  break;
966
965
  case TokenKind_1.TokenKind.SourceLocationLiteral:
967
- const locationUrl = fileUrl(state.srcPath);
966
+ const locationUrl = util_1.default.fileUrl(state.srcPath);
968
967
  //TODO find first parent that has range, or default to -1
969
968
  text = `"${locationUrl.substring(0, 4)}" + "${locationUrl.substring(4)}:${this.getClosestLineNumber()}"`;
970
969
  break;