@theia/application-manager 1.19.0 → 1.20.0
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/lib/generator/webpack-generator.d.ts.map +1 -1
- package/lib/generator/webpack-generator.js +3 -5
- package/lib/generator/webpack-generator.js.map +1 -1
- package/lib/rebuild.d.ts.map +1 -1
- package/lib/rebuild.js +184 -45
- package/lib/rebuild.js.map +1 -1
- package/package.json +5 -6
- package/src/generator/webpack-generator.ts +3 -5
- package/src/rebuild.ts +195 -50
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webpack-generator.d.ts","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAIlF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBAAa,gBAAiB,SAAQ,iBAAiB;IAE7C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;cAOf,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAC;IAQnE,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3D,SAAS,CAAC,oBAAoB,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"webpack-generator.d.ts","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAIlF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBAAa,gBAAiB,SAAQ,iBAAiB;IAE7C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;cAOf,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAC;IAQnE,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3D,SAAS,CAAC,oBAAoB,IAAI,MAAM;IAoKxC,SAAS,CAAC,wBAAwB,IAAI,MAAM;CAoB/C"}
|
|
@@ -53,7 +53,7 @@ const webpack = require('webpack');
|
|
|
53
53
|
const yargs = require('yargs');
|
|
54
54
|
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
|
55
55
|
const CircularDependencyPlugin = require('circular-dependency-plugin');
|
|
56
|
-
const CompressionPlugin = require('
|
|
56
|
+
const CompressionPlugin = require('compression-webpack-plugin')
|
|
57
57
|
|
|
58
58
|
const outputPath = path.resolve(__dirname, 'lib');
|
|
59
59
|
const { mode, staticCompression } = yargs.option('mode', {
|
|
@@ -83,10 +83,7 @@ const plugins = [
|
|
|
83
83
|
];
|
|
84
84
|
// it should go after copy-plugin in order to compress monaco as well
|
|
85
85
|
if (staticCompression) {
|
|
86
|
-
plugins.push(new CompressionPlugin({
|
|
87
|
-
// enable reuse of compressed artifacts for incremental development
|
|
88
|
-
cache: development
|
|
89
|
-
}));
|
|
86
|
+
plugins.push(new CompressionPlugin({}));
|
|
90
87
|
}
|
|
91
88
|
plugins.push(new CircularDependencyPlugin({
|
|
92
89
|
exclude: /(node_modules|examples)[\\\\|\/]./,
|
|
@@ -103,6 +100,7 @@ module.exports = {
|
|
|
103
100
|
path: outputPath
|
|
104
101
|
},
|
|
105
102
|
target: '${this.ifBrowser('web', 'electron-renderer')}',
|
|
103
|
+
cache: staticCompression,
|
|
106
104
|
module: {
|
|
107
105
|
rules: [
|
|
108
106
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webpack-generator.js","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;;AAElF,8BAA8B;AAC9B,+BAA+B;AAC/B,6DAAyD;AAEzD,MAAa,gBAAiB,SAAQ,sCAAiB;IAEnD,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAClE,IAAI,MAAM,IAAI,CAAC,+BAA+B,EAAE,EAAE;YAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;SACtE;IACL,CAAC;IAES,KAAK,CAAC,+BAA+B;QAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE;YACzC,OAAO,IAAI,CAAC;SACf;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IAES,OAAO,CAAC,UAAkB,EAAE,IAAY;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;IAES,oBAAoB;QAC1B,OAAO;;+CAEgC,IAAI,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;6CAoBjB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;8CAEnB,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,IAAI,CAAC;;;;qBAI5I,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;;UAG/B,CAAC
|
|
1
|
+
{"version":3,"file":"webpack-generator.js","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;;AAElF,8BAA8B;AAC9B,+BAA+B;AAC/B,6DAAyD;AAEzD,MAAa,gBAAiB,SAAQ,sCAAiB;IAEnD,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAClE,IAAI,MAAM,IAAI,CAAC,+BAA+B,EAAE,EAAE;YAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;SACtE;IACL,CAAC;IAES,KAAK,CAAC,+BAA+B;QAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE;YACzC,OAAO,IAAI,CAAC;SACf;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IAES,OAAO,CAAC,UAAkB,EAAE,IAAY;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;IAES,oBAAoB;QAC1B,OAAO;;+CAEgC,IAAI,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;6CAoBjB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;8CAEnB,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,IAAI,CAAC;;;;qBAI5I,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;;UAG/B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;eAyBI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA+F5B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;;UAGvC,CAAC;;;;;;GAMR,CAAC;IACA,CAAC;IAES,wBAAwB;QAC9B,OAAO;;;;;4BAKa,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;;;;;;;;;;;yBAWrC,CAAC;IACtB,CAAC;CAEJ;AArND,4CAqNC"}
|
package/lib/rebuild.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;
|
|
1
|
+
{"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAOlF,oBAAY,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AASnD,eAAO,MAAM,eAAe,UAM3B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,cAAmB,GAAG,IAAI,CAsBjF"}
|
package/lib/rebuild.js
CHANGED
|
@@ -19,6 +19,8 @@ exports.rebuild = exports.DEFAULT_MODULES = void 0;
|
|
|
19
19
|
const cp = require("child_process");
|
|
20
20
|
const fs = require("fs-extra");
|
|
21
21
|
const path = require("path");
|
|
22
|
+
const os = require("os");
|
|
23
|
+
const EXIT_SIGNALS = ['SIGINT', 'SIGTERM'];
|
|
22
24
|
exports.DEFAULT_MODULES = [
|
|
23
25
|
'@theia/node-pty',
|
|
24
26
|
'nsfw',
|
|
@@ -34,15 +36,24 @@ function rebuild(target, options = {}) {
|
|
|
34
36
|
const { modules = exports.DEFAULT_MODULES, cacheRoot = process.cwd(), } = options;
|
|
35
37
|
const cache = path.resolve(cacheRoot, '.browser_modules');
|
|
36
38
|
const cacheExists = folderExists(cache);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
guardExit(async (token) => {
|
|
40
|
+
if (target === 'electron' && !cacheExists) {
|
|
41
|
+
process.exitCode = await rebuildElectronModules(cache, modules, token);
|
|
42
|
+
}
|
|
43
|
+
else if (target === 'browser' && cacheExists) {
|
|
44
|
+
process.exitCode = await revertBrowserModules(cache, modules);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log(`native node modules are already rebuilt for ${target}`);
|
|
48
|
+
}
|
|
49
|
+
}).catch(errorOrSignal => {
|
|
50
|
+
if (typeof errorOrSignal === 'string' && errorOrSignal in os.constants.signals) {
|
|
51
|
+
process.kill(process.pid, errorOrSignal);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw errorOrSignal;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
46
57
|
}
|
|
47
58
|
exports.rebuild = rebuild;
|
|
48
59
|
function folderExists(folder) {
|
|
@@ -56,11 +67,11 @@ function folderExists(folder) {
|
|
|
56
67
|
}
|
|
57
68
|
return false;
|
|
58
69
|
}
|
|
59
|
-
async function rebuildElectronModules(browserModuleCache, modules) {
|
|
70
|
+
async function rebuildElectronModules(browserModuleCache, modules, token) {
|
|
60
71
|
const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
|
|
61
|
-
const modulesJson = await fs.access(modulesJsonPath).then(
|
|
72
|
+
const modulesJson = await fs.access(modulesJsonPath).then(() => fs.readJson(modulesJsonPath), () => ({}));
|
|
62
73
|
let success = true;
|
|
63
|
-
//
|
|
74
|
+
// Backup already built browser modules.
|
|
64
75
|
await Promise.all(modules.map(async (module) => {
|
|
65
76
|
let modulePath;
|
|
66
77
|
try {
|
|
@@ -70,13 +81,13 @@ async function rebuildElectronModules(browserModuleCache, modules) {
|
|
|
70
81
|
}
|
|
71
82
|
catch (_) {
|
|
72
83
|
console.debug(`Module not found: ${module}`);
|
|
73
|
-
return; // Skip
|
|
84
|
+
return; // Skip current module.
|
|
74
85
|
}
|
|
75
86
|
const src = path.dirname(modulePath);
|
|
76
87
|
const dest = path.join(browserModuleCache, module);
|
|
77
88
|
try {
|
|
78
89
|
await fs.remove(dest);
|
|
79
|
-
await fs.copy(src, dest);
|
|
90
|
+
await fs.copy(src, dest, { overwrite: true });
|
|
80
91
|
modulesJson[module] = {
|
|
81
92
|
originalLocation: src,
|
|
82
93
|
};
|
|
@@ -89,68 +100,196 @@ async function rebuildElectronModules(browserModuleCache, modules) {
|
|
|
89
100
|
}));
|
|
90
101
|
if (Object.keys(modulesJson).length === 0) {
|
|
91
102
|
console.debug('No module to rebuild.');
|
|
92
|
-
|
|
103
|
+
return 0;
|
|
93
104
|
}
|
|
94
|
-
//
|
|
95
|
-
await fs.
|
|
96
|
-
//
|
|
105
|
+
// Update manifest tracking the backups' original locations.
|
|
106
|
+
await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
|
|
107
|
+
// If we failed to process a module then exit now.
|
|
97
108
|
if (!success) {
|
|
98
|
-
|
|
109
|
+
return 1;
|
|
99
110
|
}
|
|
100
|
-
|
|
101
|
-
const todo = modules
|
|
102
|
-
.map(m => {
|
|
111
|
+
const todo = modules.map(m => {
|
|
103
112
|
// electron-rebuild ignores the module namespace...
|
|
104
113
|
const slash = m.indexOf('/');
|
|
105
114
|
return m.startsWith('@') && slash !== -1
|
|
106
115
|
? m.substring(slash + 1)
|
|
107
116
|
: m;
|
|
108
|
-
})
|
|
109
|
-
.join(',');
|
|
110
|
-
await new Promise((resolve, reject) => {
|
|
111
|
-
const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
|
|
112
|
-
stdio: 'inherit',
|
|
113
|
-
shell: true,
|
|
114
|
-
});
|
|
115
|
-
electronRebuild.on('error', reject);
|
|
116
|
-
electronRebuild.on('close', (code, signal) => {
|
|
117
|
-
if (code || signal) {
|
|
118
|
-
reject(`electron-rebuild exited with "${code || signal}"`);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
resolve();
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
117
|
});
|
|
118
|
+
try {
|
|
119
|
+
if (process.env.THEIA_REBUILD_NO_WORKAROUND) {
|
|
120
|
+
return await runElectronRebuild(todo, token);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
return await electronRebuildExtraModulesWorkaround(process.cwd(), todo, () => runElectronRebuild(todo, token), token);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return revertBrowserModules(browserModuleCache, modules);
|
|
128
|
+
}
|
|
125
129
|
}
|
|
126
130
|
async function revertBrowserModules(browserModuleCache, modules) {
|
|
131
|
+
let exitCode = 0;
|
|
127
132
|
const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
|
|
128
|
-
const modulesJson = await fs.
|
|
133
|
+
const modulesJson = await fs.readJson(modulesJsonPath);
|
|
129
134
|
await Promise.all(Object.entries(modulesJson).map(async ([moduleName, entry]) => {
|
|
130
135
|
if (!modules.includes(moduleName)) {
|
|
131
|
-
return; //
|
|
136
|
+
return; // Skip modules that weren't requested.
|
|
132
137
|
}
|
|
133
138
|
const src = path.join(browserModuleCache, moduleName);
|
|
139
|
+
if (!await fs.pathExists(src)) {
|
|
140
|
+
delete modulesJson[moduleName];
|
|
141
|
+
console.error(`Missing backup for ${moduleName}!`);
|
|
142
|
+
exitCode = 1;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
134
145
|
const dest = entry.originalLocation;
|
|
135
146
|
try {
|
|
136
147
|
await fs.remove(dest);
|
|
137
|
-
await fs.copy(src, dest);
|
|
148
|
+
await fs.copy(src, dest, { overwrite: false });
|
|
138
149
|
await fs.remove(src);
|
|
139
150
|
delete modulesJson[moduleName];
|
|
140
151
|
console.debug(`Reverted "${moduleName}"`);
|
|
141
152
|
}
|
|
142
153
|
catch (error) {
|
|
143
154
|
console.error(`Error while reverting "${moduleName}": ${error}`);
|
|
144
|
-
|
|
155
|
+
exitCode = 1;
|
|
145
156
|
}
|
|
146
157
|
}));
|
|
147
158
|
if (Object.keys(modulesJson).length === 0) {
|
|
148
|
-
//
|
|
159
|
+
// We restored everything, so we can delete the cache.
|
|
149
160
|
await fs.remove(browserModuleCache);
|
|
150
161
|
}
|
|
151
162
|
else {
|
|
152
|
-
//
|
|
153
|
-
await fs.
|
|
163
|
+
// Some things were not restored, so we update the manifest.
|
|
164
|
+
await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
|
|
165
|
+
}
|
|
166
|
+
return exitCode;
|
|
167
|
+
}
|
|
168
|
+
async function runElectronRebuild(modules, token) {
|
|
169
|
+
const todo = modules.join(',');
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
|
|
172
|
+
stdio: 'inherit',
|
|
173
|
+
shell: true,
|
|
174
|
+
});
|
|
175
|
+
token.onSignal(signal => electronRebuild.kill(signal));
|
|
176
|
+
electronRebuild.on('error', reject);
|
|
177
|
+
electronRebuild.on('close', (code, signal) => {
|
|
178
|
+
if (signal) {
|
|
179
|
+
reject(new Error(`electron-rebuild exited with "${signal}"`));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
resolve(code);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* `electron-rebuild` is supposed to accept a list of modules to build, even when not part of the dependencies.
|
|
189
|
+
* But there is a bug that causes `electron-rebuild` to not correctly process this list of modules.
|
|
190
|
+
*
|
|
191
|
+
* This workaround will temporarily modify the current package.json file.
|
|
192
|
+
*
|
|
193
|
+
* PR with fix: https://github.com/electron/electron-rebuild/pull/888
|
|
194
|
+
*
|
|
195
|
+
* TODO: Remove this workaround.
|
|
196
|
+
*/
|
|
197
|
+
async function electronRebuildExtraModulesWorkaround(cwd, extraModules, run, token) {
|
|
198
|
+
const packageJsonPath = path.resolve(cwd, 'package.json');
|
|
199
|
+
if (await fs.pathExists(packageJsonPath)) {
|
|
200
|
+
// package.json exists: We back it up before modifying it then revert it.
|
|
201
|
+
const packageJsonCopyPath = `${packageJsonPath}.copy`;
|
|
202
|
+
const packageJson = await fs.readJson(packageJsonPath);
|
|
203
|
+
await fs.copy(packageJsonPath, packageJsonCopyPath);
|
|
204
|
+
await throwIfSignal(token, async () => {
|
|
205
|
+
await fs.unlink(packageJsonCopyPath);
|
|
206
|
+
});
|
|
207
|
+
if (typeof packageJson.dependencies !== 'object') {
|
|
208
|
+
packageJson.dependencies = {};
|
|
209
|
+
}
|
|
210
|
+
for (const extraModule of extraModules) {
|
|
211
|
+
if (!packageJson.dependencies[extraModule]) {
|
|
212
|
+
packageJson.dependencies[extraModule] = '*';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
|
|
217
|
+
await throwIfSignal(token);
|
|
218
|
+
return await run(token);
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
await fs.move(packageJsonCopyPath, packageJsonPath, { overwrite: true });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// package.json does not exist: We create one then remove it.
|
|
226
|
+
const packageJson = {
|
|
227
|
+
name: 'theia-rebuild-workaround',
|
|
228
|
+
version: '0.0.0',
|
|
229
|
+
dependencies: {},
|
|
230
|
+
};
|
|
231
|
+
for (const extraModule of extraModules) {
|
|
232
|
+
packageJson.dependencies[extraModule] = '*';
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
await fs.writeJson(packageJsonPath, packageJson);
|
|
236
|
+
await throwIfSignal(token);
|
|
237
|
+
return await run(token);
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
await fs.unlink(packageJsonPath);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Temporarily install hooks to **try** to prevent the process from exiting while `run` is running.
|
|
246
|
+
*
|
|
247
|
+
* Note that it is still possible to kill the process and prevent cleanup logic (e.g. SIGKILL, computer forced shutdown, etc).
|
|
248
|
+
*/
|
|
249
|
+
async function guardExit(run) {
|
|
250
|
+
const token = new ExitTokenImpl();
|
|
251
|
+
const signalListener = (signal) => token._emitSignal(signal);
|
|
252
|
+
for (const signal of EXIT_SIGNALS) {
|
|
253
|
+
process.on(signal, signalListener);
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
return await run(token);
|
|
257
|
+
}
|
|
258
|
+
finally {
|
|
259
|
+
for (const signal of EXIT_SIGNALS) {
|
|
260
|
+
process.off(signal, signalListener);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
class ExitTokenImpl {
|
|
265
|
+
constructor() {
|
|
266
|
+
this._listeners = new Set();
|
|
267
|
+
}
|
|
268
|
+
onSignal(callback) {
|
|
269
|
+
this._listeners.add(callback);
|
|
270
|
+
}
|
|
271
|
+
getLastSignal() {
|
|
272
|
+
return this._lastSignal;
|
|
273
|
+
}
|
|
274
|
+
_emitSignal(signal) {
|
|
275
|
+
this._lastSignal = signal;
|
|
276
|
+
for (const listener of this._listeners) {
|
|
277
|
+
listener(signal);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Throw `signal` if one was received, runs `cleanup` before doing so.
|
|
283
|
+
*/
|
|
284
|
+
async function throwIfSignal(token, cleanup) {
|
|
285
|
+
if (token.getLastSignal()) {
|
|
286
|
+
try {
|
|
287
|
+
await (cleanup === null || cleanup === void 0 ? void 0 : cleanup());
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
// eslint-disable-next-line no-throw-literal
|
|
291
|
+
throw token.getLastSignal();
|
|
292
|
+
}
|
|
154
293
|
}
|
|
155
294
|
}
|
|
156
295
|
//# sourceMappingURL=rebuild.js.map
|
package/lib/rebuild.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;;AAElF,oCAAqC;AACrC,+BAAgC;AAChC,6BAA8B;
|
|
1
|
+
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/application-manager",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"description": "Theia application manager API.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -33,16 +33,15 @@
|
|
|
33
33
|
"@babel/plugin-transform-classes": "^7.10.0",
|
|
34
34
|
"@babel/plugin-transform-runtime": "^7.10.0",
|
|
35
35
|
"@babel/preset-env": "^7.10.0",
|
|
36
|
-
"@theia/application-package": "1.
|
|
37
|
-
"@theia/compression-webpack-plugin": "^3.0.0",
|
|
36
|
+
"@theia/application-package": "1.20.0",
|
|
38
37
|
"@types/fs-extra": "^4.0.2",
|
|
39
38
|
"babel-loader": "^8.2.2",
|
|
40
39
|
"buffer": "^6.0.3",
|
|
41
40
|
"circular-dependency-plugin": "^5.2.2",
|
|
41
|
+
"compression-webpack-plugin": "^9.0.0",
|
|
42
42
|
"copy-webpack-plugin": "^8.1.1",
|
|
43
43
|
"css-loader": "^6.2.0",
|
|
44
44
|
"electron-rebuild": "^1.8.6",
|
|
45
|
-
"font-awesome-webpack": "0.0.5-beta.2",
|
|
46
45
|
"fs-extra": "^4.0.2",
|
|
47
46
|
"ignore-loader": "^0.1.2",
|
|
48
47
|
"less": "^3.0.3",
|
|
@@ -57,10 +56,10 @@
|
|
|
57
56
|
"yargs": "^15.3.1"
|
|
58
57
|
},
|
|
59
58
|
"devDependencies": {
|
|
60
|
-
"@theia/ext-scripts": "1.
|
|
59
|
+
"@theia/ext-scripts": "1.20.0"
|
|
61
60
|
},
|
|
62
61
|
"nyc": {
|
|
63
62
|
"extends": "../../configs/nyc.json"
|
|
64
63
|
},
|
|
65
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "774a2724c51d4ae026c6d2499bff3a02e3d50ba9"
|
|
66
65
|
}
|
|
@@ -58,7 +58,7 @@ const webpack = require('webpack');
|
|
|
58
58
|
const yargs = require('yargs');
|
|
59
59
|
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
|
60
60
|
const CircularDependencyPlugin = require('circular-dependency-plugin');
|
|
61
|
-
const CompressionPlugin = require('
|
|
61
|
+
const CompressionPlugin = require('compression-webpack-plugin')
|
|
62
62
|
|
|
63
63
|
const outputPath = path.resolve(__dirname, 'lib');
|
|
64
64
|
const { mode, staticCompression } = yargs.option('mode', {
|
|
@@ -88,10 +88,7 @@ const plugins = [
|
|
|
88
88
|
];
|
|
89
89
|
// it should go after copy-plugin in order to compress monaco as well
|
|
90
90
|
if (staticCompression) {
|
|
91
|
-
plugins.push(new CompressionPlugin({
|
|
92
|
-
// enable reuse of compressed artifacts for incremental development
|
|
93
|
-
cache: development
|
|
94
|
-
}));
|
|
91
|
+
plugins.push(new CompressionPlugin({}));
|
|
95
92
|
}
|
|
96
93
|
plugins.push(new CircularDependencyPlugin({
|
|
97
94
|
exclude: /(node_modules|examples)[\\\\|\/]./,
|
|
@@ -108,6 +105,7 @@ module.exports = {
|
|
|
108
105
|
path: outputPath
|
|
109
106
|
},
|
|
110
107
|
target: '${this.ifBrowser('web', 'electron-renderer')}',
|
|
108
|
+
cache: staticCompression,
|
|
111
109
|
module: {
|
|
112
110
|
rules: [
|
|
113
111
|
{
|
package/src/rebuild.ts
CHANGED
|
@@ -17,9 +17,17 @@
|
|
|
17
17
|
import cp = require('child_process');
|
|
18
18
|
import fs = require('fs-extra');
|
|
19
19
|
import path = require('path');
|
|
20
|
+
import os = require('os');
|
|
20
21
|
|
|
21
22
|
export type RebuildTarget = 'electron' | 'browser';
|
|
22
23
|
|
|
24
|
+
const EXIT_SIGNALS: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'];
|
|
25
|
+
|
|
26
|
+
interface ExitToken {
|
|
27
|
+
getLastSignal(): NodeJS.Signals | undefined
|
|
28
|
+
onSignal(callback: (signal: NodeJS.Signals) => void): void
|
|
29
|
+
}
|
|
30
|
+
|
|
23
31
|
export const DEFAULT_MODULES = [
|
|
24
32
|
'@theia/node-pty',
|
|
25
33
|
'nsfw',
|
|
@@ -54,13 +62,21 @@ export function rebuild(target: RebuildTarget, options: RebuildOptions = {}): vo
|
|
|
54
62
|
} = options;
|
|
55
63
|
const cache = path.resolve(cacheRoot, '.browser_modules');
|
|
56
64
|
const cacheExists = folderExists(cache);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
guardExit(async token => {
|
|
66
|
+
if (target === 'electron' && !cacheExists) {
|
|
67
|
+
process.exitCode = await rebuildElectronModules(cache, modules, token);
|
|
68
|
+
} else if (target === 'browser' && cacheExists) {
|
|
69
|
+
process.exitCode = await revertBrowserModules(cache, modules);
|
|
70
|
+
} else {
|
|
71
|
+
console.log(`native node modules are already rebuilt for ${target}`);
|
|
72
|
+
}
|
|
73
|
+
}).catch(errorOrSignal => {
|
|
74
|
+
if (typeof errorOrSignal === 'string' && errorOrSignal in os.constants.signals) {
|
|
75
|
+
process.kill(process.pid, errorOrSignal);
|
|
76
|
+
} else {
|
|
77
|
+
throw errorOrSignal;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
64
80
|
}
|
|
65
81
|
|
|
66
82
|
function folderExists(folder: string): boolean {
|
|
@@ -75,7 +91,7 @@ function folderExists(folder: string): boolean {
|
|
|
75
91
|
}
|
|
76
92
|
|
|
77
93
|
/**
|
|
78
|
-
* Schema for `<browserModuleCache>/modules.json
|
|
94
|
+
* Schema for `<browserModuleCache>/modules.json`.
|
|
79
95
|
*/
|
|
80
96
|
interface ModulesJson {
|
|
81
97
|
[moduleName: string]: ModuleBackup
|
|
@@ -84,14 +100,14 @@ interface ModuleBackup {
|
|
|
84
100
|
originalLocation: string
|
|
85
101
|
}
|
|
86
102
|
|
|
87
|
-
async function rebuildElectronModules(browserModuleCache: string, modules: string[]): Promise<
|
|
103
|
+
async function rebuildElectronModules(browserModuleCache: string, modules: string[], token: ExitToken): Promise<number> {
|
|
88
104
|
const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
|
|
89
105
|
const modulesJson: ModulesJson = await fs.access(modulesJsonPath).then(
|
|
90
|
-
|
|
91
|
-
|
|
106
|
+
() => fs.readJson(modulesJsonPath),
|
|
107
|
+
() => ({})
|
|
92
108
|
);
|
|
93
109
|
let success = true;
|
|
94
|
-
//
|
|
110
|
+
// Backup already built browser modules.
|
|
95
111
|
await Promise.all(modules.map(async module => {
|
|
96
112
|
let modulePath;
|
|
97
113
|
try {
|
|
@@ -100,13 +116,13 @@ async function rebuildElectronModules(browserModuleCache: string, modules: strin
|
|
|
100
116
|
});
|
|
101
117
|
} catch (_) {
|
|
102
118
|
console.debug(`Module not found: ${module}`);
|
|
103
|
-
return; // Skip
|
|
119
|
+
return; // Skip current module.
|
|
104
120
|
}
|
|
105
121
|
const src = path.dirname(modulePath);
|
|
106
122
|
const dest = path.join(browserModuleCache, module);
|
|
107
123
|
try {
|
|
108
124
|
await fs.remove(dest);
|
|
109
|
-
await fs.copy(src, dest);
|
|
125
|
+
await fs.copy(src, dest, { overwrite: true });
|
|
110
126
|
modulesJson[module] = {
|
|
111
127
|
originalLocation: src,
|
|
112
128
|
};
|
|
@@ -118,65 +134,194 @@ async function rebuildElectronModules(browserModuleCache: string, modules: strin
|
|
|
118
134
|
}));
|
|
119
135
|
if (Object.keys(modulesJson).length === 0) {
|
|
120
136
|
console.debug('No module to rebuild.');
|
|
121
|
-
|
|
137
|
+
return 0;
|
|
122
138
|
}
|
|
123
|
-
//
|
|
124
|
-
await fs.
|
|
125
|
-
//
|
|
139
|
+
// Update manifest tracking the backups' original locations.
|
|
140
|
+
await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
|
|
141
|
+
// If we failed to process a module then exit now.
|
|
126
142
|
if (!success) {
|
|
127
|
-
|
|
143
|
+
return 1;
|
|
128
144
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
? m.substring(slash + 1)
|
|
136
|
-
: m;
|
|
137
|
-
})
|
|
138
|
-
.join(',');
|
|
139
|
-
await new Promise<void>((resolve, reject) => {
|
|
140
|
-
const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
|
|
141
|
-
stdio: 'inherit',
|
|
142
|
-
shell: true,
|
|
143
|
-
});
|
|
144
|
-
electronRebuild.on('error', reject);
|
|
145
|
-
electronRebuild.on('close', (code, signal) => {
|
|
146
|
-
if (code || signal) {
|
|
147
|
-
reject(`electron-rebuild exited with "${code || signal}"`);
|
|
148
|
-
} else {
|
|
149
|
-
resolve();
|
|
150
|
-
}
|
|
151
|
-
});
|
|
145
|
+
const todo = modules.map(m => {
|
|
146
|
+
// electron-rebuild ignores the module namespace...
|
|
147
|
+
const slash = m.indexOf('/');
|
|
148
|
+
return m.startsWith('@') && slash !== -1
|
|
149
|
+
? m.substring(slash + 1)
|
|
150
|
+
: m;
|
|
152
151
|
});
|
|
152
|
+
try {
|
|
153
|
+
if (process.env.THEIA_REBUILD_NO_WORKAROUND) {
|
|
154
|
+
return await runElectronRebuild(todo, token);
|
|
155
|
+
} else {
|
|
156
|
+
return await electronRebuildExtraModulesWorkaround(process.cwd(), todo, () => runElectronRebuild(todo, token), token);
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
return revertBrowserModules(browserModuleCache, modules);
|
|
160
|
+
}
|
|
153
161
|
}
|
|
154
162
|
|
|
155
|
-
async function revertBrowserModules(browserModuleCache: string, modules: string[]): Promise<
|
|
163
|
+
async function revertBrowserModules(browserModuleCache: string, modules: string[]): Promise<number> {
|
|
164
|
+
let exitCode = 0;
|
|
156
165
|
const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
|
|
157
|
-
const modulesJson: ModulesJson = await fs.
|
|
166
|
+
const modulesJson: ModulesJson = await fs.readJson(modulesJsonPath);
|
|
158
167
|
await Promise.all(Object.entries(modulesJson).map(async ([moduleName, entry]) => {
|
|
159
168
|
if (!modules.includes(moduleName)) {
|
|
160
|
-
return; //
|
|
169
|
+
return; // Skip modules that weren't requested.
|
|
161
170
|
}
|
|
162
171
|
const src = path.join(browserModuleCache, moduleName);
|
|
172
|
+
if (!await fs.pathExists(src)) {
|
|
173
|
+
delete modulesJson[moduleName];
|
|
174
|
+
console.error(`Missing backup for ${moduleName}!`);
|
|
175
|
+
exitCode = 1;
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
163
178
|
const dest = entry.originalLocation;
|
|
164
179
|
try {
|
|
165
180
|
await fs.remove(dest);
|
|
166
|
-
await fs.copy(src, dest);
|
|
181
|
+
await fs.copy(src, dest, { overwrite: false });
|
|
167
182
|
await fs.remove(src);
|
|
168
183
|
delete modulesJson[moduleName];
|
|
169
184
|
console.debug(`Reverted "${moduleName}"`);
|
|
170
185
|
} catch (error) {
|
|
171
186
|
console.error(`Error while reverting "${moduleName}": ${error}`);
|
|
172
|
-
|
|
187
|
+
exitCode = 1;
|
|
173
188
|
}
|
|
174
189
|
}));
|
|
175
190
|
if (Object.keys(modulesJson).length === 0) {
|
|
176
|
-
//
|
|
191
|
+
// We restored everything, so we can delete the cache.
|
|
177
192
|
await fs.remove(browserModuleCache);
|
|
178
193
|
} else {
|
|
179
|
-
//
|
|
180
|
-
await fs.
|
|
194
|
+
// Some things were not restored, so we update the manifest.
|
|
195
|
+
await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
|
|
196
|
+
}
|
|
197
|
+
return exitCode;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function runElectronRebuild(modules: string[], token: ExitToken): Promise<number> {
|
|
201
|
+
const todo = modules.join(',');
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
|
|
204
|
+
stdio: 'inherit',
|
|
205
|
+
shell: true,
|
|
206
|
+
});
|
|
207
|
+
token.onSignal(signal => electronRebuild.kill(signal));
|
|
208
|
+
electronRebuild.on('error', reject);
|
|
209
|
+
electronRebuild.on('close', (code, signal) => {
|
|
210
|
+
if (signal) {
|
|
211
|
+
reject(new Error(`electron-rebuild exited with "${signal}"`));
|
|
212
|
+
} else {
|
|
213
|
+
resolve(code);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* `electron-rebuild` is supposed to accept a list of modules to build, even when not part of the dependencies.
|
|
221
|
+
* But there is a bug that causes `electron-rebuild` to not correctly process this list of modules.
|
|
222
|
+
*
|
|
223
|
+
* This workaround will temporarily modify the current package.json file.
|
|
224
|
+
*
|
|
225
|
+
* PR with fix: https://github.com/electron/electron-rebuild/pull/888
|
|
226
|
+
*
|
|
227
|
+
* TODO: Remove this workaround.
|
|
228
|
+
*/
|
|
229
|
+
async function electronRebuildExtraModulesWorkaround<T>(cwd: string, extraModules: string[], run: (token: ExitToken) => Promise<T>, token: ExitToken): Promise<T> {
|
|
230
|
+
const packageJsonPath = path.resolve(cwd, 'package.json');
|
|
231
|
+
if (await fs.pathExists(packageJsonPath)) {
|
|
232
|
+
// package.json exists: We back it up before modifying it then revert it.
|
|
233
|
+
const packageJsonCopyPath = `${packageJsonPath}.copy`;
|
|
234
|
+
const packageJson = await fs.readJson(packageJsonPath);
|
|
235
|
+
await fs.copy(packageJsonPath, packageJsonCopyPath);
|
|
236
|
+
await throwIfSignal(token, async () => {
|
|
237
|
+
await fs.unlink(packageJsonCopyPath);
|
|
238
|
+
});
|
|
239
|
+
if (typeof packageJson.dependencies !== 'object') {
|
|
240
|
+
packageJson.dependencies = {};
|
|
241
|
+
}
|
|
242
|
+
for (const extraModule of extraModules) {
|
|
243
|
+
if (!packageJson.dependencies[extraModule]) {
|
|
244
|
+
packageJson.dependencies[extraModule] = '*';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
|
|
249
|
+
await throwIfSignal(token);
|
|
250
|
+
return await run(token);
|
|
251
|
+
} finally {
|
|
252
|
+
await fs.move(packageJsonCopyPath, packageJsonPath, { overwrite: true });
|
|
253
|
+
}
|
|
254
|
+
} else {
|
|
255
|
+
// package.json does not exist: We create one then remove it.
|
|
256
|
+
const packageJson = {
|
|
257
|
+
name: 'theia-rebuild-workaround',
|
|
258
|
+
version: '0.0.0',
|
|
259
|
+
dependencies: {} as Record<string, string>,
|
|
260
|
+
};
|
|
261
|
+
for (const extraModule of extraModules) {
|
|
262
|
+
packageJson.dependencies[extraModule] = '*';
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
await fs.writeJson(packageJsonPath, packageJson);
|
|
266
|
+
await throwIfSignal(token);
|
|
267
|
+
return await run(token);
|
|
268
|
+
} finally {
|
|
269
|
+
await fs.unlink(packageJsonPath);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Temporarily install hooks to **try** to prevent the process from exiting while `run` is running.
|
|
276
|
+
*
|
|
277
|
+
* Note that it is still possible to kill the process and prevent cleanup logic (e.g. SIGKILL, computer forced shutdown, etc).
|
|
278
|
+
*/
|
|
279
|
+
async function guardExit<T>(run: (token: ExitToken) => Promise<T>): Promise<T> {
|
|
280
|
+
const token = new ExitTokenImpl();
|
|
281
|
+
const signalListener = (signal: NodeJS.Signals) => token._emitSignal(signal);
|
|
282
|
+
for (const signal of EXIT_SIGNALS) {
|
|
283
|
+
process.on(signal, signalListener);
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
return await run(token);
|
|
287
|
+
} finally {
|
|
288
|
+
for (const signal of EXIT_SIGNALS) {
|
|
289
|
+
process.off(signal, signalListener);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
class ExitTokenImpl implements ExitToken {
|
|
295
|
+
|
|
296
|
+
protected _listeners = new Set<(signal: NodeJS.Signals) => void>();
|
|
297
|
+
protected _lastSignal?: NodeJS.Signals;
|
|
298
|
+
|
|
299
|
+
onSignal(callback: (signal: NodeJS.Signals) => void): void {
|
|
300
|
+
this._listeners.add(callback);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
getLastSignal(): NodeJS.Signals | undefined {
|
|
304
|
+
return this._lastSignal;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
_emitSignal(signal: NodeJS.Signals): void {
|
|
308
|
+
this._lastSignal = signal;
|
|
309
|
+
for (const listener of this._listeners) {
|
|
310
|
+
listener(signal);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Throw `signal` if one was received, runs `cleanup` before doing so.
|
|
317
|
+
*/
|
|
318
|
+
async function throwIfSignal(token: ExitToken, cleanup?: () => Promise<void>): Promise<void> {
|
|
319
|
+
if (token.getLastSignal()) {
|
|
320
|
+
try {
|
|
321
|
+
await cleanup?.();
|
|
322
|
+
} finally {
|
|
323
|
+
// eslint-disable-next-line no-throw-literal
|
|
324
|
+
throw token.getLastSignal()!;
|
|
325
|
+
}
|
|
181
326
|
}
|
|
182
327
|
}
|