@flun/windows 3.0.11 → 4.0.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/bin/cli.js ADDED
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { execSync } from 'child_process';
5
+ import { pathToFileURL } from 'url';
6
+ import chalk from 'chalk';
7
+ import { Service, kill, list, elevate, EventLogger } from '../index.js';
8
+ import { copyFile } from '../copy-files.js';
9
+
10
+ const [, , sub, ...args] = process.argv,
11
+ /**
12
+ * 解析 --键 值,值先按 JSON 解析,失败按字符串;
13
+ * @param {string[]} argv 参数数组
14
+ * @returns {{flags: Object, rest: string[]}} 选项与位置参数
15
+ */
16
+ parseFlags = argv => {
17
+ const flags = {}, rest = [];
18
+ for (let i = 0; i < argv.length; i++) {
19
+ const cur = argv[i];
20
+ if (!cur.startsWith('--')) { rest.push(cur); continue }
21
+ const key = cur.slice(2), next = argv[i + 1];
22
+ if (next === undefined || next.startsWith('--')) { flags[key] = true; continue }
23
+ try { flags[key] = JSON.parse(next) } catch { flags[key] = next }
24
+ i++;
25
+ }
26
+ return { flags, rest };
27
+ },
28
+
29
+ /**
30
+ * 读取当前目录的 win-service.config.js,不存在返回空对象;
31
+ * @returns {Promise<Object>} 配置对象
32
+ */
33
+ loadConfig = async () => {
34
+ const cfg = path.resolve(process.env.INIT_CWD || process.cwd(), 'win-service.config.js');
35
+ if (!fs.existsSync(cfg)) return {};
36
+ const mod = await import(pathToFileURL(cfg).href);
37
+ return mod.default ?? {};
38
+ },
39
+ resolveConfig = async flags => ({ ...(await loadConfig()), ...flags }),
40
+
41
+ /**
42
+ * 校验配置必填项,缺失即退出;
43
+ * @param {Object} config 配置对象
44
+ */
45
+ requireConfig = config => {
46
+ if (config.name && config.script) return;
47
+ console.error(chalk.red('✗ ') + '缺少配置:请在 win-service.config.js 填写 name 与 script,或用 --name/--script 覆盖');
48
+ process.exit(1);
49
+ },
50
+
51
+ /**
52
+ * 解析配置并构造 Service;
53
+ * @param {string[]} argv 参数
54
+ * @returns {Promise<{svc: Service, flags: Object}>} 服务实例与命令行选项
55
+ */
56
+ buildService = async argv => {
57
+ const { flags } = parseFlags(argv), config = await resolveConfig(flags);
58
+ requireConfig(config);
59
+ return { svc: new Service({ ...config, quiet: true }), flags };
60
+ },
61
+
62
+ /**
63
+ * 等待服务事件,超时后按 exists 判定;
64
+ * @param {Service} svc 服务实例
65
+ * @param {string[]} okEvents 成功事件名
66
+ * @param {string[]} [errEvents] 失败事件名
67
+ * @returns {Promise<string>} 触发的事件名
68
+ */
69
+ waitEvent = (svc, okEvents, errEvents = ['error']) => new Promise((resolve, reject) => {
70
+ const timer = setTimeout(() => {
71
+ const code = svc.exists;
72
+ if (code === 3) resolve('timeout-ok');
73
+ else reject(new Error(`操作超时,服务状态码:${code}`));
74
+ }, 30000);
75
+ okEvents.forEach(e => svc.once(e, () => { clearTimeout(timer); resolve(e) }));
76
+ errEvents.forEach(e => svc.once(e, err => { clearTimeout(timer); reject(err) }));
77
+ }),
78
+
79
+ /**
80
+ * 判定安装后是否启动,命令行 --start/--no-start 优先,其次配置 autoStart,缺省启动;
81
+ * @param {Object} config 配置对象,判定后移除相关字段
82
+ * @returns {boolean} 是否启动
83
+ */
84
+ resolveAutoStart = config => {
85
+ const take = key => { const v = config[key]; delete config[key]; return v },
86
+ startFlag = take('start'), noStartFlag = take('no-start'), cfgStart = take('autoStart');
87
+ if (startFlag !== undefined) return startFlag !== false;
88
+ if (noStartFlag !== undefined) return false;
89
+ if (typeof cfgStart === 'boolean') return cfgStart;
90
+ return true;
91
+ },
92
+
93
+ /**
94
+ * 按配置执行服务方法;
95
+ * @param {string} method 方法名
96
+ * @param {string[]} argv 参数
97
+ * @returns {Promise<void>}
98
+ */
99
+ runService = async (method, argv) => {
100
+ const { flags } = parseFlags(argv), config = await resolveConfig(flags);
101
+ requireConfig(config);
102
+ const svc = new Service({ ...config, quiet: true }),
103
+ autoStart = method === 'install' && svc.exists !== 3 ? resolveAutoStart(config) : true,
104
+ okMap = {
105
+ install: ['install', 'alreadyinstalled'], uninstall: ['uninstall', 'alreadyuninstalled'],
106
+ start: ['start'], stop: ['stop', 'alreadystopped'], restart: ['start']
107
+ }, pending = waitEvent(svc, okMap[method]);
108
+ let started = false;
109
+ if (method === 'install' && autoStart) svc.once('start', () => { started = true });
110
+
111
+ if (method === 'install') await svc.install(undefined, autoStart);
112
+ else await svc[method]();
113
+ const evt = await pending, labelMap = { install: '安装', uninstall: '卸载', start: '启动', stop: '停止' },
114
+ label = method === 'restart' ? '重启' : labelMap[method];
115
+ if (evt.startsWith('already'))
116
+ return console.log(chalk.yellow('✓ 已跳过: ') + chalk.gray(`服务${evt.includes('install') ? '已安装' : '已卸载'}`));
117
+ console.log(chalk.green('✓ ') + chalk.greenBright(`${label}完成`));
118
+ if (started) console.log(chalk.green('✓ ') + chalk.greenBright('服务已启动'));
119
+ },
120
+
121
+ /**
122
+ * 输出用法;
123
+ */
124
+ printHelp = () => {
125
+ const cmd = (name, desc) => ` ${chalk.cyanBright(name.padEnd(26))}${chalk.gray(desc)}`;
126
+ console.log([
127
+ `${chalk.blueBright('用法:')} windows <命令> [--键 值]`, '',
128
+ ` ${chalk.cyan('服务类')} ${chalk.gray('(默认读当前目录 win-service.config.js,--键 值 覆盖)')}`,
129
+ cmd('install', '安装服务,装完默认启动;--no-start 关闭自动启动'),
130
+ cmd('uninstall', '卸载服务'),
131
+ cmd('start', '启动服务'),
132
+ cmd('stop', '停止服务'),
133
+ cmd('restart', '重启服务'),
134
+ cmd('status', '查询状态,输出 0 不存在 1 有服务无文件 2 有文件无服务 3 完整'),
135
+ cmd('xml', '输出 winsw 配置 XML'),
136
+ cmd('exe', '生成 winsw 可执行文件;--dir 指定输出目录,默认脚本目录下 daemon'), '',
137
+ ` ${chalk.cyan('其它')}`,
138
+ cmd('example', '生成 win-service.config.js 模板到当前项目'),
139
+ cmd('list', '列出运行中的进程;--verbose 显示详细信息'),
140
+ cmd('kill', '结束进程,参数为进程 PID;例如 kill 1234,--force 强制结束'),
141
+ cmd('log', '写事件日志,参数依次为级别与消息;例如 log info 启动完成'),
142
+ cmd('is-admin', '检查当前是否管理员'),
143
+ cmd('elevate', '以管理员权限执行命令,参数为要执行的命令;例如 elevate "net session"'),
144
+ cmd('help', '显示本帮助')
145
+ ].join('\n'));
146
+ },
147
+
148
+ /**
149
+ * 命令分发入口;
150
+ */
151
+ main = async () => {
152
+ if (!sub || sub === 'help' || sub === '-h' || sub === '--help') return printHelp(), process.exit(0);
153
+ if (sub === 'example') return copyFile() ? process.exit(0) : process.exit(1);
154
+ if (sub === 'is-admin') {
155
+ try {
156
+ execSync('net session', { stdio: 'ignore' });
157
+ console.log(chalk.green('✓ ') + chalk.greenBright('管理员')), process.exit(0);
158
+ } catch {
159
+ console.log(chalk.red('✗ ') + chalk.redBright('非管理员')), process.exit(1);
160
+ }
161
+ }
162
+ if (sub === 'elevate') {
163
+ if (!args.length) return console.error(chalk.red('✗ ') + '缺少命令'), process.exit(1);
164
+ return elevate(args.join(' '), (err, stdout) => {
165
+ if (err) return console.error(chalk.red('✗ ') + err.message), process.exit(1);
166
+ if (stdout) console.log(stdout);
167
+ process.exit(0);
168
+ });
169
+ }
170
+ if (sub === 'kill') {
171
+ const { flags, rest } = parseFlags(args);
172
+ if (!rest[0]) return console.error(chalk.red('✗ ') + '缺少 pid'), process.exit(1);
173
+ const onDone = err => err
174
+ ? (console.error(chalk.red('✗ ') + err.message), process.exit(1))
175
+ : (console.log(chalk.green('✓ ') + chalk.greenBright('已结束')), process.exit(0));
176
+ return kill(Number(rest[0]), onDone, Boolean(flags.force));
177
+ }
178
+ if (sub === 'list') {
179
+ const { flags } = parseFlags(args);
180
+ return list(procs => {
181
+ procs.forEach(p => console.log(Object.values(p).join('\t'))), process.exit(0);
182
+ }, Boolean(flags.verbose));
183
+ }
184
+ if (sub === 'log') {
185
+ const { flags, rest } = parseFlags(args), [level, ...msgParts] = rest,
186
+ methodMap = { info: 'info', warn: 'warn', error: 'error', success: 'auditSuccess', failure: 'auditFailure' },
187
+ method = methodMap[level];
188
+ if (!method)
189
+ return console.error(chalk.red('✗ ') + `未知级别: ${level};可用:info|warn|error|success|failure`), process.exit(1);
190
+ if (!msgParts.length) return console.error(chalk.red('✗ ') + '缺少消息'), process.exit(1);
191
+ const logger = new EventLogger(flags.source ? { source: flags.source } : {});
192
+ return logger[method](msgParts.join(' '), flags.id ?? 1000, err => {
193
+ if (err) return console.error(chalk.red('✗ ') + err.message), process.exit(1);
194
+ console.log(chalk.green('✓ ') + chalk.greenBright('已写入')), process.exit(0);
195
+ });
196
+ }
197
+ if (sub === 'xml') {
198
+ const { svc } = await buildService(args);
199
+ return console.log(svc.toXml()), process.exit(0);
200
+ }
201
+ if (sub === 'exe') {
202
+ const { svc, flags } = await buildService(args);
203
+ try { await svc.toExe(flags.dir), console.log(chalk.green('✓ 已生成: ') + svc.root), process.exit(0) }
204
+ catch (e) { console.error(chalk.red('✗ ') + e.message), process.exit(1) }
205
+ }
206
+ if (sub === 'status') {
207
+ const { svc } = await buildService(args), code = svc.exists,
208
+ color = code === 3 ? chalk.green : code === 0 ? chalk.red : chalk.yellow;
209
+ return console.log(chalk.gray('状态码: ') + color(code)), process.exit(0);
210
+ }
211
+ if (['install', 'uninstall', 'start', 'stop', 'restart'].includes(sub)) {
212
+ try { await runService(sub, args), process.exit(0) }
213
+ catch (e) { console.error(chalk.red('✗ ') + e.message), process.exit(1) }
214
+ }
215
+ console.error(chalk.red('✗ 未知命令: ') + chalk.yellow(sub)), console.log(''), printHelp(), process.exit(1);
216
+ };
217
+
218
+ main();
package/copy-files.js CHANGED
@@ -1,35 +1,35 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { fileURLToPath } from 'url';
4
-
5
- // 要复制的文件位置和文件目标位置
6
- const __filename = fileURLToPath(import.meta.url), __dirname = path.dirname(__filename),
7
- fileName = 'sevWin.js', targetDir = path.resolve(process.env.INIT_CWD || process.cwd()),
8
- // 要拷贝的源文件和目标文件路径
9
- sourceFile = path.join(__dirname, fileName), targetFile = path.join(targetDir, fileName);
10
- /**
11
- * 复制文件到项目根目录
12
- * >查看定义:@see {@link copyFile}
13
- * @returns {boolean} - 复制是否成功
14
- */
15
- const copyFile = () => {
16
- console.log(`🔍 检查 ${fileName} 文件...`), console.log(`📁 项目根目录:${targetDir}`);
17
- try {
18
- // 目标目录不是 Node 项目 || 包自身的 npm install(开发调试)→ 跳过
19
- if (!fs.existsSync(path.join(targetDir, 'package.json'))) return true;
20
- if (targetDir === path.resolve(__dirname, '..')) return true;
21
- if (fs.existsSync(targetFile)) return true; // 目标文件已存在 → 直接返回
22
- console.log(`⚠️ 在项目根目录未找到 ${fileName} 文件,正在创建...`);
23
-
24
- fs.copyFileSync(sourceFile, targetFile); // 复制源文件到项目根目录
25
- console.log(`✓ 已创建 ${fileName} 示例文件:${targetFile}`);
26
- return true;
27
- } catch (error) {
28
- console.error(`✗ 创建 ${fileName} 文件失败:`, error.message);
29
- return false;
30
- }
31
- };
32
-
33
- // 执行脚本并导出函数
34
- if (process.argv[1] === __filename) copyFile();
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ // 要复制的文件位置和文件目标位置
6
+ const __filename = fileURLToPath(import.meta.url), __dirname = path.dirname(__filename),
7
+ fileName = 'win-service.config.js', targetDir = path.resolve(process.env.INIT_CWD || process.cwd()),
8
+ // 要拷贝的源文件和目标文件路径
9
+ sourceFile = path.join(__dirname, fileName), targetFile = path.join(targetDir, fileName);
10
+ /**
11
+ * 复制文件到项目根目录
12
+ * >查看定义:@see {@link copyFile}
13
+ * @returns {boolean} - 复制是否成功
14
+ */
15
+ const copyFile = () => {
16
+ console.log(`🔍 检查 ${fileName} 文件...`), console.log(`📁 项目根目录:${targetDir}`);
17
+ try {
18
+ // 目标目录不是 Node 项目 || 包自身的 npm install(开发调试)→ 跳过
19
+ if (!fs.existsSync(path.join(targetDir, 'package.json'))) return true;
20
+ if (targetDir === path.resolve(__dirname, '..')) return true;
21
+ if (fs.existsSync(targetFile)) return true; // 目标文件已存在 → 直接返回
22
+ console.log(`⚠️ 在项目根目录未找到 ${fileName} 文件,正在创建...`);
23
+
24
+ fs.copyFileSync(sourceFile, targetFile); // 复制源文件到项目根目录
25
+ console.log(`✓ 已创建 ${fileName} 示例文件:${targetFile}`);
26
+ return true;
27
+ } catch (error) {
28
+ console.error(`✗ 创建 ${fileName} 文件失败:`, error.message);
29
+ return false;
30
+ }
31
+ };
32
+
33
+ // 执行脚本并导出函数
34
+ if (process.argv[1] === __filename) copyFile();
35
35
  export { copyFile };
package/index.d.ts CHANGED
@@ -1,134 +1,134 @@
1
- import { elevate, sudo, isAdminUser, platform } from './lib/binaries.js';
2
- import { kill, list } from './lib/cmd.js';
3
- import { Service } from './lib/daemon.js';
4
- import { EventLogger } from './lib/eventlog.js';
5
- import {
6
- exec, execSync, fork, promisify, execPromise, path, fs, EventEmitter, isPermissionError, getDirname
7
- } from './lib/shared.js';
8
- import { generateXml, createExe } from './lib/winsw.js';
9
-
10
- // =================================== lib/binaries.js ===================================
11
- /**
12
- * ```js
13
- * // 文件导出内容
14
- * elevate(); // 提升当前进程权限(Windows UAC)
15
- * sudo(); // 使用sudo.exe提升权限(适用于Windows 10及以上版本)
16
- * isAdminUser(); // 检查当前用户是否拥有管理员权限
17
- * platform(); // 获取操作系统平台字符串,用于判断当前运行环境是否为Windows
18
- * ```
19
- * >查看定义:@see {@link elevate}、{@link sudo}、{@link isAdminUser}、{@link platform}
20
- */
21
- declare module './lib/binaries.js' {
22
- export * from './lib/binaries.js';
23
- }
24
-
25
- // =================================== lib/cmd.js ===================================
26
- /**
27
- * ```js
28
- * // 文件导出内容
29
- * kill(); // 结束指定PID进程
30
- * list(); // 列出服务器上正在运行的进程
31
- * ```
32
- * >查看定义:@see {@link kill}、{@link list}
33
- */
34
- declare module './lib/cmd.js' {
35
- export * from './lib/cmd.js';
36
- }
37
-
38
- // =================================== lib/daemon.js ===================================
39
- /**
40
- * ```js
41
- * // 文件导出内容
42
- * Service{}; // 服务管理类,提供创建、安装、卸载、启动、停止和查询服务状态等功能
43
- * ```
44
- * >查看定义:@see {@link Service}
45
- */
46
- declare module './lib/daemon.js' {
47
- export * from './lib/daemon.js';
48
- }
49
-
50
- // =================================== lib/eventlog.js ===================================
51
- /**
52
- * ```js
53
- * // 文件导出内容
54
- * EventLogger{}; // 事件日志记录器类,用于向Windows事件查看器写入日志
55
- * ```
56
- * >查看定义:@see {@link EventLogger}
57
- */
58
- declare module './lib/eventlog.js' {
59
- export * from './lib/eventlog.js';
60
- }
61
-
62
- // =================================== lib/shared.js ===================================
63
- /**
64
- * 共享模块,导出在多个文件中使用的常用函数和模块
65
- * ```js
66
- * // 外部包函数
67
- * exec(); // 子进程执行命令的函数,提供回调和Promise两种接口
68
- * execSync; // 子进程执行命令的同步函数,返回命令输出结果
69
- * fork(); // 创建一个新的Node.js子进程来运行指定的模块,提供与父进程的通信通道
70
- * promisify(); // 将Node.js回调风格的函数转换为返回Promise的函数
71
- * 模块:
72
- * path, fs; // Node.js内置模块,提供文件路径处理、文件系统操作等功能
73
- * class EventEmitter{}; // Node.js内置模块,提供事件驱动编程的功能,允许对象之间进行事件通信
74
- * // 自定义函数:
75
- * execPromise(); // 基于exec函数的Promise版本,用于执行命令并以Promise方式获取结果
76
- * isPermissionError(); // 检查错误对象是否表示权限错误的函数,用于判断操作失败是否由于权限不足引起
77
- * getDirname(); // 获取当前模块目录路径的函数,用于在ES模块环境中替代__dirname变量的功能
78
- * ```
79
- * >查看定义:@see {@link exec}、{@link execSync}、{@link fork}、{@link promisify}、{@link path}、
80
- * {@link fs}、{@link EventEmitter}
81
- * - 自定义函数:{@link execPromise}、{@link isPermissionError}、{@link getDirname}
82
- */
83
- declare module './lib/shared.js' {
84
- export * from './lib/shared.js';
85
- }
86
-
87
- // =================================== lib/winsw.js ===================================
88
- /**
89
- * ```js
90
- * // 文件导出内容
91
- * generateXml(); // 生成 winsw 配置文件的 XML;
92
- * createExe(); // 创建 winsw 可执行文件,将 XML 配置文件和 Node.js 脚本打包成一个独立的 Windows 服务可执行文件;
93
- * ```
94
- * >查看定义:@see {@link generateXml}、{@link createExe}
95
- */
96
- declare module './lib/winsw.js' {
97
- export * from './lib/winsw.js';
98
- }
99
-
100
- // =================================== 模块导出入口 ===================================
101
- /**
102
- * Windows功能模块 主要功能:
103
- * ```js
104
- * Service{}; // 服务管理类
105
- * EventLogger{}; // 事件日志记录器类
106
- * elevate(); // 权限提升(机制:ShellExecute + "runas")
107
- * sudo(); // 权限提升(机制:sudo.exe)
108
- * isAdminUser(); // 检查当前用户是否拥有管理员权限
109
- * kill(); // 结束指定PID进程
110
- * list(); // 列出服务器上正在运行的进程
111
- * ```
112
- * ---
113
- * >查看定义:@see {@link Service}、{@link EventLogger}、{@link elevate}、{@link sudo}、{@link isAdminUser}、
114
- * {@link kill}、{@link list}
115
- * @example
116
- * // 基础示例
117
- * import { Service } from '@flun/windows';
118
- *
119
- * // 创建服务对象
120
- * const svc = new Service({
121
- * name: 'Hello World', // 服务名称
122
- * description: 'nodejs.org 示例服务器', // 服务描述
123
- * script: 'C:\\path\\to\\helloworld.js',// 启动服务的入口脚本路径
124
- *
125
- * // 传递给node进程的选项
126
- * nodeOptions: [ '--harmony','--max-old-space-size=4096' ]
127
- * });
128
- */
129
- declare module './index.js' {
130
- export { elevate, sudo, isAdminUser } from './lib/binaries.js';
131
- export { kill, list } from './lib/cmd.js';
132
- export { Service } from './lib/daemon.js';
133
- export { EventLogger } from './lib/eventlog.js';
1
+ import { elevate, sudo, isAdminUser, platform } from './lib/binaries.js';
2
+ import { kill, list } from './lib/cmd.js';
3
+ import { Service } from './lib/daemon.js';
4
+ import { EventLogger } from './lib/eventlog.js';
5
+ import {
6
+ exec, execSync, fork, promisify, execPromise, path, fs, EventEmitter, isPermissionError, getDirname
7
+ } from './lib/shared.js';
8
+ import { generateXml, createExe } from './lib/winsw.js';
9
+
10
+ // =================================== lib/binaries.js ===================================
11
+ /**
12
+ * ```js
13
+ * // 文件导出内容
14
+ * elevate(); // 提升当前进程权限(Windows UAC)
15
+ * sudo(); // 使用sudo.exe提升权限(适用于Windows 10及以上版本)
16
+ * isAdminUser(); // 检查当前用户是否拥有管理员权限
17
+ * platform(); // 获取操作系统平台字符串,用于判断当前运行环境是否为Windows
18
+ * ```
19
+ * >查看定义:@see {@link elevate}、{@link sudo}、{@link isAdminUser}、{@link platform}
20
+ */
21
+ declare module './lib/binaries.js' {
22
+ export * from './lib/binaries.js';
23
+ }
24
+
25
+ // =================================== lib/cmd.js ===================================
26
+ /**
27
+ * ```js
28
+ * // 文件导出内容
29
+ * kill(); // 结束指定PID进程
30
+ * list(); // 列出服务器上正在运行的进程
31
+ * ```
32
+ * >查看定义:@see {@link kill}、{@link list}
33
+ */
34
+ declare module './lib/cmd.js' {
35
+ export * from './lib/cmd.js';
36
+ }
37
+
38
+ // =================================== lib/daemon.js ===================================
39
+ /**
40
+ * ```js
41
+ * // 文件导出内容
42
+ * Service{}; // 服务管理类,提供创建、安装、卸载、启动、停止和查询服务状态等功能
43
+ * ```
44
+ * >查看定义:@see {@link Service}
45
+ */
46
+ declare module './lib/daemon.js' {
47
+ export * from './lib/daemon.js';
48
+ }
49
+
50
+ // =================================== lib/eventlog.js ===================================
51
+ /**
52
+ * ```js
53
+ * // 文件导出内容
54
+ * EventLogger{}; // 事件日志记录器类,用于向Windows事件查看器写入日志
55
+ * ```
56
+ * >查看定义:@see {@link EventLogger}
57
+ */
58
+ declare module './lib/eventlog.js' {
59
+ export * from './lib/eventlog.js';
60
+ }
61
+
62
+ // =================================== lib/shared.js ===================================
63
+ /**
64
+ * 共享模块,导出在多个文件中使用的常用函数和模块
65
+ * ```js
66
+ * // 外部包函数
67
+ * exec(); // 子进程执行命令的函数,提供回调和Promise两种接口
68
+ * execSync; // 子进程执行命令的同步函数,返回命令输出结果
69
+ * fork(); // 创建一个新的Node.js子进程来运行指定的模块,提供与父进程的通信通道
70
+ * promisify(); // 将Node.js回调风格的函数转换为返回Promise的函数
71
+ * 模块:
72
+ * path, fs; // Node.js内置模块,提供文件路径处理、文件系统操作等功能
73
+ * class EventEmitter{}; // Node.js内置模块,提供事件驱动编程的功能,允许对象之间进行事件通信
74
+ * // 自定义函数:
75
+ * execPromise(); // 基于exec函数的Promise版本,用于执行命令并以Promise方式获取结果
76
+ * isPermissionError(); // 检查错误对象是否表示权限错误的函数,用于判断操作失败是否由于权限不足引起
77
+ * getDirname(); // 获取当前模块目录路径的函数,用于在ES模块环境中替代__dirname变量的功能
78
+ * ```
79
+ * >查看定义:@see {@link exec}、{@link execSync}、{@link fork}、{@link promisify}、{@link path}、
80
+ * {@link fs}、{@link EventEmitter}
81
+ * - 自定义函数:{@link execPromise}、{@link isPermissionError}、{@link getDirname}
82
+ */
83
+ declare module './lib/shared.js' {
84
+ export * from './lib/shared.js';
85
+ }
86
+
87
+ // =================================== lib/winsw.js ===================================
88
+ /**
89
+ * ```js
90
+ * // 文件导出内容
91
+ * generateXml(); // 生成 winsw 配置文件的 XML;
92
+ * createExe(); // 创建 winsw 可执行文件,将 XML 配置文件和 Node.js 脚本打包成一个独立的 Windows 服务可执行文件;
93
+ * ```
94
+ * >查看定义:@see {@link generateXml}、{@link createExe}
95
+ */
96
+ declare module './lib/winsw.js' {
97
+ export * from './lib/winsw.js';
98
+ }
99
+
100
+ // =================================== 模块导出入口 ===================================
101
+ /**
102
+ * Windows功能模块 主要功能:
103
+ * ```js
104
+ * Service{}; // 服务管理类
105
+ * EventLogger{}; // 事件日志记录器类
106
+ * elevate(); // 权限提升(机制:ShellExecute + "runas")
107
+ * sudo(); // 权限提升(机制:sudo.exe)
108
+ * isAdminUser(); // 检查当前用户是否拥有管理员权限
109
+ * kill(); // 结束指定PID进程
110
+ * list(); // 列出服务器上正在运行的进程
111
+ * ```
112
+ * ---
113
+ * >查看定义:@see {@link Service}、{@link EventLogger}、{@link elevate}、{@link sudo}、{@link isAdminUser}、
114
+ * {@link kill}、{@link list}
115
+ * @example
116
+ * // 基础示例
117
+ * import { Service } from '@flun/windows';
118
+ * import config from './win-service.config.js';
119
+ *
120
+ * const svc = new Service(config);
121
+ *
122
+ * // 安装并自动启动服务(默认)
123
+ * svc.install();
124
+ *
125
+ * // 只安装,不自动启动
126
+ * // svc.install(undefined, false);
127
+ *
128
+ */
129
+ declare module './index.js' {
130
+ export { elevate, sudo, isAdminUser } from './lib/binaries.js';
131
+ export { kill, list } from './lib/cmd.js';
132
+ export { Service } from './lib/daemon.js';
133
+ export { EventLogger } from './lib/eventlog.js';
134
134
  }