@ttkit/daily-hot-api 0.1.2 → 0.1.4
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/.env.example +26 -0
- package/README.md +26 -0
- package/dist/app.module.js +2 -0
- package/dist/app.module.js.map +1 -1
- package/dist/cli/args.d.ts +3 -1
- package/dist/cli/args.js +25 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/logs.js +5 -0
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/restart.js +14 -3
- package/dist/cli/commands/restart.js.map +1 -1
- package/dist/cli/commands/start.js +17 -9
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +5 -4
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.js +1 -1
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/env.d.ts +1 -0
- package/dist/cli/env.js +12 -0
- package/dist/cli/env.js.map +1 -1
- package/dist/cli/health.d.ts +1 -1
- package/dist/cli/health.js +32 -17
- package/dist/cli/health.js.map +1 -1
- package/dist/cli/help.js +14 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/log-file.d.ts +4 -0
- package/dist/cli/log-file.js +54 -5
- package/dist/cli/log-file.js.map +1 -1
- package/dist/cli/paths.d.ts +1 -0
- package/dist/cli/paths.js +2 -1
- package/dist/cli/paths.js.map +1 -1
- package/dist/cli/run-state.d.ts +6 -1
- package/dist/cli/run-state.js +18 -6
- package/dist/cli/run-state.js.map +1 -1
- package/dist/config/validation.schema.d.ts +54 -0
- package/dist/config/validation.schema.js +75 -0
- package/dist/config/validation.schema.js.map +1 -1
- package/dist/daily-brief/daily-brief.module.js +1 -1
- package/dist/daily-brief/daily-brief.module.js.map +1 -1
- package/dist/daily-brief/daily-brief.service.js +1 -1
- package/dist/daily-brief/daily-brief.service.js.map +1 -1
- package/dist/database/database.module.js +15 -2
- package/dist/database/database.module.js.map +1 -1
- package/dist/database/repositories/daily-brief.repository.js +11 -1
- package/dist/database/repositories/daily-brief.repository.js.map +1 -1
- package/dist/database/repositories/hot-item.repository.d.ts +1 -1
- package/dist/database/repositories/hot-item.repository.js +7 -4
- package/dist/database/repositories/hot-item.repository.js.map +1 -1
- package/dist/database/repositories/news-brief.repository.d.ts +81 -0
- package/dist/database/repositories/news-brief.repository.js +208 -0
- package/dist/database/repositories/news-brief.repository.js.map +1 -0
- package/dist/database/schemas/news-brief.schema.d.ts +48 -0
- package/dist/database/schemas/news-brief.schema.js +130 -0
- package/dist/database/schemas/news-brief.schema.js.map +1 -0
- package/dist/main.js +2 -1
- package/dist/main.js.map +1 -1
- package/dist/news-brief/categories/news-category.registry.d.ts +5 -0
- package/dist/news-brief/categories/news-category.registry.js +106 -0
- package/dist/news-brief/categories/news-category.registry.js.map +1 -0
- package/dist/news-brief/clients/news-brief-ai.client.d.ts +45 -0
- package/dist/news-brief/clients/news-brief-ai.client.js +314 -0
- package/dist/news-brief/clients/news-brief-ai.client.js.map +1 -0
- package/dist/news-brief/clients/news-brief-search.service.d.ts +12 -0
- package/dist/news-brief/clients/news-brief-search.service.js +57 -0
- package/dist/news-brief/clients/news-brief-search.service.js.map +1 -0
- package/dist/news-brief/dto/generate-news-brief.dto.d.ts +7 -0
- package/dist/news-brief/dto/generate-news-brief.dto.js +45 -0
- package/dist/news-brief/dto/generate-news-brief.dto.js.map +1 -0
- package/dist/news-brief/dto/list-news-briefs-query.dto.d.ts +7 -0
- package/dist/news-brief/dto/list-news-briefs-query.dto.js +59 -0
- package/dist/news-brief/dto/list-news-briefs-query.dto.js.map +1 -0
- package/dist/news-brief/dto/news-brief-date-param.dto.d.ts +3 -0
- package/dist/news-brief/dto/news-brief-date-param.dto.js +22 -0
- package/dist/news-brief/dto/news-brief-date-param.dto.js.map +1 -0
- package/dist/news-brief/interfaces/news-brief.interface.d.ts +202 -0
- package/dist/news-brief/interfaces/news-brief.interface.js +3 -0
- package/dist/news-brief/interfaces/news-brief.interface.js.map +1 -0
- package/dist/news-brief/news-brief.config.d.ts +33 -0
- package/dist/news-brief/news-brief.config.js +118 -0
- package/dist/news-brief/news-brief.config.js.map +1 -0
- package/dist/news-brief/news-brief.controller.d.ts +56 -0
- package/dist/news-brief/news-brief.controller.js +185 -0
- package/dist/news-brief/news-brief.controller.js.map +1 -0
- package/dist/news-brief/news-brief.module.d.ts +2 -0
- package/dist/news-brief/news-brief.module.js +47 -0
- package/dist/news-brief/news-brief.module.js.map +1 -0
- package/dist/news-brief/news-brief.scheduler.d.ts +34 -0
- package/dist/news-brief/news-brief.scheduler.js +143 -0
- package/dist/news-brief/news-brief.scheduler.js.map +1 -0
- package/dist/news-brief/news-brief.service.d.ts +60 -0
- package/dist/news-brief/news-brief.service.js +676 -0
- package/dist/news-brief/news-brief.service.js.map +1 -0
- package/package.json +3 -1
package/dist/cli/env.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export declare function applyEnvFile(envFile: string, env?: NodeJS.ProcessEnv): string[];
|
|
2
2
|
export declare function resolvePort(flagPort: number | undefined, env?: NodeJS.ProcessEnv): number;
|
|
3
|
+
export declare function resolveHost(flagHost: string | undefined, env?: NodeJS.ProcessEnv): string;
|
package/dist/cli/env.js
CHANGED
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.applyEnvFile = applyEnvFile;
|
|
37
37
|
exports.resolvePort = resolvePort;
|
|
38
|
+
exports.resolveHost = resolveHost;
|
|
38
39
|
const fs_1 = require("fs");
|
|
39
40
|
const dotenv = __importStar(require("dotenv"));
|
|
40
41
|
const errors_1 = require("./errors");
|
|
@@ -77,4 +78,15 @@ function resolvePort(flagPort, env = process.env) {
|
|
|
77
78
|
}
|
|
78
79
|
return port;
|
|
79
80
|
}
|
|
81
|
+
function resolveHost(flagHost, env = process.env) {
|
|
82
|
+
const flag = flagHost?.trim();
|
|
83
|
+
if (flag) {
|
|
84
|
+
return flag;
|
|
85
|
+
}
|
|
86
|
+
const raw = (env.HOST ?? '').trim();
|
|
87
|
+
if (!raw) {
|
|
88
|
+
return paths_1.DEFAULT_HOST;
|
|
89
|
+
}
|
|
90
|
+
return raw;
|
|
91
|
+
}
|
|
80
92
|
//# sourceMappingURL=env.js.map
|
package/dist/cli/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,oCAwBC;AAKD,kCAsBC;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,oCAwBC;AAKD,kCAsBC;AAKD,kCAcC;AAnFD,2BAA8C;AAC9C,+CAAiC;AACjC,qCAAoC;AACpC,mCAAqD;AAUrD,SAAgB,YAAY,CAC1B,OAAe,EACf,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,CAAC,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,iBAAQ,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,MAAgC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,iBAAQ,CAAC,aAAa,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAKD,SAAgB,WAAW,CACzB,QAA4B,EAC5B,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,oBAAY,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,iBAAQ,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,iBAAQ,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAKD,SAAgB,WAAW,CACzB,QAA4B,EAC5B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,oBAAY,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/cli/health.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
+
export declare function looksLikeHealthBody(body: string): boolean;
|
|
1
2
|
export declare function checkHealth(port: number, timeoutMs?: number, host?: string): Promise<boolean>;
|
|
2
|
-
export declare function waitForHealthy(port: number, timeoutMs: number, intervalMs?: number): Promise<boolean>;
|
package/dist/cli/health.js
CHANGED
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.looksLikeHealthBody = looksLikeHealthBody;
|
|
3
4
|
exports.checkHealth = checkHealth;
|
|
4
|
-
exports.waitForHealthy = waitForHealthy;
|
|
5
5
|
const http_1 = require("http");
|
|
6
6
|
const run_state_1 = require("./run-state");
|
|
7
|
+
const MAX_BODY_BYTES = 64 * 1024;
|
|
8
|
+
function looksLikeHealthBody(body) {
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(body);
|
|
11
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const value = parsed;
|
|
15
|
+
return (typeof value.status === 'string' &&
|
|
16
|
+
typeof value.checks === 'object' &&
|
|
17
|
+
value.checks !== null);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
7
23
|
function checkHealth(port, timeoutMs = 2000, host = '127.0.0.1') {
|
|
8
24
|
return new Promise((resolve) => {
|
|
9
25
|
let settled = false;
|
|
@@ -14,10 +30,22 @@ function checkHealth(port, timeoutMs = 2000, host = '127.0.0.1') {
|
|
|
14
30
|
settled = true;
|
|
15
31
|
resolve(healthy);
|
|
16
32
|
};
|
|
17
|
-
const request = (0, http_1.get)({ host, port, path: '/health', timeout: timeoutMs }, (response) => {
|
|
18
|
-
response.resume();
|
|
33
|
+
const request = (0, http_1.get)({ host: (0, run_state_1.probeHost)(host), port, path: '/health', timeout: timeoutMs }, (response) => {
|
|
19
34
|
const statusCode = response.statusCode ?? 0;
|
|
20
|
-
|
|
35
|
+
if (statusCode < 200 || statusCode >= 300) {
|
|
36
|
+
response.resume();
|
|
37
|
+
finish(false);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let body = '';
|
|
41
|
+
response.setEncoding('utf8');
|
|
42
|
+
response.on('data', (chunk) => {
|
|
43
|
+
if (body.length <= MAX_BODY_BYTES) {
|
|
44
|
+
body += chunk;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
response.on('end', () => finish(looksLikeHealthBody(body)));
|
|
48
|
+
response.on('error', () => finish(false));
|
|
21
49
|
});
|
|
22
50
|
request.on('timeout', () => {
|
|
23
51
|
request.destroy();
|
|
@@ -28,17 +56,4 @@ function checkHealth(port, timeoutMs = 2000, host = '127.0.0.1') {
|
|
|
28
56
|
});
|
|
29
57
|
});
|
|
30
58
|
}
|
|
31
|
-
async function waitForHealthy(port, timeoutMs, intervalMs = 250) {
|
|
32
|
-
const deadline = Date.now() + timeoutMs;
|
|
33
|
-
do {
|
|
34
|
-
if (await checkHealth(port)) {
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
if (Date.now() >= deadline) {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
await (0, run_state_1.sleep)(intervalMs);
|
|
41
|
-
} while (Date.now() < deadline);
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
59
|
//# sourceMappingURL=health.js.map
|
package/dist/cli/health.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/cli/health.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/cli/health.ts"],"names":[],"mappings":";;AAaA,kDAeC;AAGD,kCA2CC;AA1ED,+BAA2B;AAC3B,2CAAwC;AAGxC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;AASjC,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,MAAiC,CAAC;QAChD,OAAO,CACL,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAChC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAChC,KAAK,CAAC,MAAM,KAAK,IAAI,CACtB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAGD,SAAgB,WAAW,CACzB,IAAY,EACZ,SAAS,GAAG,IAAI,EAChB,IAAI,GAAG,WAAW;IAElB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAQ,EAAE;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAA,UAAG,EACjB,EAAE,IAAI,EAAE,IAAA,qBAAS,EAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EACpE,CAAC,QAAQ,EAAE,EAAE;YACX,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC;YAC5C,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;gBAC1C,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACpC,IAAI,IAAI,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;oBAClC,IAAI,IAAI,KAAK,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC,CACF,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cli/help.js
CHANGED
|
@@ -13,6 +13,8 @@ const START_HELP = `用法: daily-hot-api [start] [选项]
|
|
|
13
13
|
|
|
14
14
|
选项:
|
|
15
15
|
-p, --port <端口> 覆盖监听端口(默认取 .env 的 PORT,否则 6689)
|
|
16
|
+
--host <地址> 覆盖监听地址(默认取 .env 的 HOST,否则 0.0.0.0;
|
|
17
|
+
只给本机用可设 127.0.0.1)
|
|
16
18
|
-d, --daemon 在后台启动,日志写入状态目录
|
|
17
19
|
--config <路径> 指定 .env 配置文件(默认顺序: DAILY_HOT_API_ENV_FILE → 当前目录 .env → 状态目录 .env)
|
|
18
20
|
--home <目录> 指定状态目录(默认 ~/.daily-hot-api)
|
|
@@ -22,6 +24,7 @@ const START_HELP = `用法: daily-hot-api [start] [选项]
|
|
|
22
24
|
daily-hot-api 前台启动
|
|
23
25
|
daily-hot-api -p 6699 前台启动并指定端口
|
|
24
26
|
daily-hot-api start -d 后台启动
|
|
27
|
+
daily-hot-api start -d --host 127.0.0.1
|
|
25
28
|
daily-hot-api start -d --port 6699 --config ./prod.env`;
|
|
26
29
|
const STOP_HELP = `用法: daily-hot-api stop [选项]
|
|
27
30
|
|
|
@@ -59,6 +62,7 @@ const RESTART_HELP = `用法: daily-hot-api restart [选项]
|
|
|
59
62
|
-d, --daemon 重启后在后台运行
|
|
60
63
|
--foreground 重启后在前台运行
|
|
61
64
|
-p, --port <端口> 覆盖监听端口
|
|
65
|
+
--host <地址> 覆盖监听地址
|
|
62
66
|
--config <路径> 指定 .env 配置文件
|
|
63
67
|
--timeout <秒> 等待旧进程退出的超时时间(默认 10 秒)
|
|
64
68
|
--force 停止旧进程时立即 SIGKILL
|
|
@@ -74,16 +78,21 @@ const LOGS_HELP = `用法: daily-hot-api logs [选项]
|
|
|
74
78
|
查看后台服务日志。前台模式的标准输出直接打印在启动终端,
|
|
75
79
|
不会写入日志文件。
|
|
76
80
|
|
|
81
|
+
日志超过 10 MB 时会在下一次 start -d 轮转为 .log.1 ~ .log.3;
|
|
82
|
+
运行期间想立刻回收空间用 --clear。
|
|
83
|
+
|
|
77
84
|
选项:
|
|
78
85
|
-n, --lines <行数> 显示最后 N 行(默认 50)
|
|
79
86
|
-f, --follow 持续跟踪新增日志,按 Ctrl+C 退出
|
|
87
|
+
--clear 清空日志文件(不能与 --follow 同用)
|
|
80
88
|
--home <目录> 指定状态目录(默认 ~/.daily-hot-api)
|
|
81
89
|
-h, --help 查看帮助
|
|
82
90
|
|
|
83
91
|
示例:
|
|
84
92
|
daily-hot-api logs
|
|
85
93
|
daily-hot-api logs -n 200
|
|
86
|
-
daily-hot-api logs -f
|
|
94
|
+
daily-hot-api logs -f
|
|
95
|
+
daily-hot-api logs --clear`;
|
|
87
96
|
const HELP_HELP = `用法: daily-hot-api help [命令]
|
|
88
97
|
|
|
89
98
|
显示全局帮助或指定命令的帮助。
|
|
@@ -120,6 +129,7 @@ function globalHelp() {
|
|
|
120
129
|
|
|
121
130
|
常用选项:
|
|
122
131
|
-p, --port <端口> 覆盖监听端口(默认取 .env 的 PORT,否则 6689)
|
|
132
|
+
--host <地址> 覆盖监听地址(默认取 .env 的 HOST,否则 0.0.0.0)
|
|
123
133
|
-d, --daemon 在后台运行(start/restart)
|
|
124
134
|
--foreground 在前台运行(restart 用来覆盖原模式)
|
|
125
135
|
--config <路径> 指定 .env 配置文件
|
|
@@ -129,6 +139,7 @@ function globalHelp() {
|
|
|
129
139
|
--json 以 JSON 输出(status/stop)
|
|
130
140
|
-n, --lines <行数> logs 显示的行数(默认 50)
|
|
131
141
|
-f, --follow logs 持续跟踪新增日志
|
|
142
|
+
--clear logs 清空日志文件
|
|
132
143
|
-h, --help 查看帮助
|
|
133
144
|
-v, --version 查看版本
|
|
134
145
|
|
|
@@ -139,10 +150,11 @@ function globalHelp() {
|
|
|
139
150
|
daily-hot-api status 查看状态
|
|
140
151
|
daily-hot-api logs -f 跟踪后台日志
|
|
141
152
|
daily-hot-api stop 停止服务
|
|
142
|
-
npx daily-hot-api start -d
|
|
153
|
+
npx -y @ttkit/daily-hot-api start -d 不全局安装,直接用 npx 后台启动
|
|
143
154
|
|
|
144
155
|
环境变量:
|
|
145
156
|
PORT 服务端口
|
|
157
|
+
HOST 监听地址,默认 0.0.0.0
|
|
146
158
|
DAILY_HOT_API_HOME 状态目录,默认 ~/.daily-hot-api
|
|
147
159
|
DAILY_HOT_API_ENV_FILE 显式指定 .env 文件(等同于 --config)
|
|
148
160
|
|
package/dist/cli/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":";;AAyHA,gCAgDC;AAED,kCAKC;AA/KD,mCAA4C;AAE5C,SAAS,gBAAgB;IACvB,OAAO,IAAA,yBAAiB,GAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;yDAmBsC,CAAC;AAE1D,MAAM,SAAS,GAAG;;;;;;;;;;;;;;UAcR,CAAC;AAEX,MAAM,WAAW,GAAG;;;;;;;;;;;SAWX,CAAC;AAEV,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;6CAmBwB,CAAC;AAE9C,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;6BAmBW,CAAC;AAE9B,MAAM,SAAS,GAAG;;;;;;2BAMS,CAAC;AAE5B,MAAM,YAAY,GAAG;;aAER,CAAC;AAEd,MAAM,YAAY,GAAgC;IAChD,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF,SAAgB,UAAU;IACxB,OAAO,kBAAkB,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA8CO,CAAC;AACrD,CAAC;AAED,SAAgB,WAAW,CAAC,OAAoB;IAC9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,kBAAkB,gBAAgB,EAAE,OAAO,YAAY,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC"}
|
package/dist/cli/log-file.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export declare const LOG_TAIL_MAX_BYTES: number;
|
|
2
|
+
export declare const LOG_MAX_BYTES: number;
|
|
3
|
+
export declare const LOG_KEEP_FILES = 3;
|
|
2
4
|
export declare function tailFile(file: string, lines: number, maxBytes?: number): string;
|
|
3
5
|
export interface LogChunk {
|
|
4
6
|
text: string;
|
|
@@ -6,3 +8,5 @@ export interface LogChunk {
|
|
|
6
8
|
truncated: boolean;
|
|
7
9
|
}
|
|
8
10
|
export declare function readLogChunk(file: string, fromPosition: number): LogChunk;
|
|
11
|
+
export declare function rotateLogFile(file: string, maxBytes?: number, keep?: number): boolean;
|
|
12
|
+
export declare function clearLogFile(file: string): void;
|
package/dist/cli/log-file.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LOG_TAIL_MAX_BYTES = void 0;
|
|
3
|
+
exports.LOG_KEEP_FILES = exports.LOG_MAX_BYTES = exports.LOG_TAIL_MAX_BYTES = void 0;
|
|
4
4
|
exports.tailFile = tailFile;
|
|
5
5
|
exports.readLogChunk = readLogChunk;
|
|
6
|
+
exports.rotateLogFile = rotateLogFile;
|
|
7
|
+
exports.clearLogFile = clearLogFile;
|
|
6
8
|
const fs_1 = require("fs");
|
|
7
9
|
const errors_1 = require("./errors");
|
|
8
10
|
exports.LOG_TAIL_MAX_BYTES = 256 * 1024;
|
|
11
|
+
exports.LOG_MAX_BYTES = 10 * 1024 * 1024;
|
|
12
|
+
exports.LOG_KEEP_FILES = 3;
|
|
9
13
|
function tailFile(file, lines, maxBytes = exports.LOG_TAIL_MAX_BYTES) {
|
|
10
14
|
if (!(0, fs_1.existsSync)(file)) {
|
|
11
15
|
throw new errors_1.CliError(`日志文件不存在: ${file}`);
|
|
@@ -18,8 +22,8 @@ function tailFile(file, lines, maxBytes = exports.LOG_TAIL_MAX_BYTES) {
|
|
|
18
22
|
const fd = (0, fs_1.openSync)(file, 'r');
|
|
19
23
|
try {
|
|
20
24
|
const buffer = Buffer.alloc(size - start);
|
|
21
|
-
(0, fs_1.readSync)(fd, buffer, 0, buffer.length, start);
|
|
22
|
-
let text = buffer.toString('utf8');
|
|
25
|
+
const bytesRead = (0, fs_1.readSync)(fd, buffer, 0, buffer.length, start);
|
|
26
|
+
let text = buffer.subarray(0, bytesRead).toString('utf8');
|
|
23
27
|
if (start > 0) {
|
|
24
28
|
const firstNewline = text.indexOf('\n');
|
|
25
29
|
text = firstNewline >= 0 ? text.slice(firstNewline + 1) : '';
|
|
@@ -48,11 +52,56 @@ function readLogChunk(file, fromPosition) {
|
|
|
48
52
|
const fd = (0, fs_1.openSync)(file, 'r');
|
|
49
53
|
try {
|
|
50
54
|
const buffer = Buffer.alloc(size - start);
|
|
51
|
-
(0, fs_1.readSync)(fd, buffer, 0, buffer.length, start);
|
|
52
|
-
return {
|
|
55
|
+
const bytesRead = (0, fs_1.readSync)(fd, buffer, 0, buffer.length, start);
|
|
56
|
+
return {
|
|
57
|
+
text: buffer.subarray(0, bytesRead).toString('utf8'),
|
|
58
|
+
nextPosition: start + bytesRead,
|
|
59
|
+
truncated,
|
|
60
|
+
};
|
|
53
61
|
}
|
|
54
62
|
finally {
|
|
55
63
|
(0, fs_1.closeSync)(fd);
|
|
56
64
|
}
|
|
57
65
|
}
|
|
66
|
+
function rotateLogFile(file, maxBytes = exports.LOG_MAX_BYTES, keep = exports.LOG_KEEP_FILES) {
|
|
67
|
+
if (!(0, fs_1.existsSync)(file)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
let size;
|
|
71
|
+
try {
|
|
72
|
+
size = (0, fs_1.statSync)(file).size;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (size <= maxBytes) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
(0, fs_1.rmSync)(`${file}.${keep}`, { force: true });
|
|
82
|
+
for (let index = keep - 1; index >= 1; index -= 1) {
|
|
83
|
+
const current = `${file}.${index}`;
|
|
84
|
+
if ((0, fs_1.existsSync)(current)) {
|
|
85
|
+
(0, fs_1.renameSync)(current, `${file}.${index + 1}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
(0, fs_1.renameSync)(file, `${file}.1`);
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function clearLogFile(file) {
|
|
96
|
+
if (!(0, fs_1.existsSync)(file)) {
|
|
97
|
+
throw new errors_1.CliError(`日志文件不存在: ${file}`);
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
(0, fs_1.truncateSync)(file, 0);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
104
|
+
throw new errors_1.CliError(`清空日志失败: ${file} (${reason})`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
58
107
|
//# sourceMappingURL=log-file.js.map
|
package/dist/cli/log-file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-file.js","sourceRoot":"","sources":["../../src/cli/log-file.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"log-file.js","sourceRoot":"","sources":["../../src/cli/log-file.ts"],"names":[],"mappings":";;;AAqBA,4BAkCC;AAUD,oCAsBC;AAWD,sCAgCC;AAGD,oCAUC;AA/ID,2BASY;AACZ,qCAAoC;AAEvB,QAAA,kBAAkB,GAAG,GAAG,GAAG,IAAI,CAAC;AAGhC,QAAA,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAGjC,QAAA,cAAc,GAAG,CAAC,CAAC;AAGhC,SAAgB,QAAQ,CACtB,IAAY,EACZ,KAAa,EACb,QAAQ,GAAG,0BAAkB;IAE7B,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,iBAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,IAAI,GAAG,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACjC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAA,aAAQ,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAG1C,MAAM,SAAS,GAAG,IAAA,aAAQ,EAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChE,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAEd,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;YAAS,CAAC;QACT,IAAA,cAAS,EAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAUD,SAAgB,YAAY,CAAC,IAAY,EAAE,YAAoB;IAC7D,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,GAAG,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,MAAM,IAAI,GAAG,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,YAAY,CAAC;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC3C,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,EAAE,GAAG,IAAA,aAAQ,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAA,aAAQ,EAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpD,YAAY,EAAE,KAAK,GAAG,SAAS;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAA,cAAS,EAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAWD,SAAgB,aAAa,CAC3B,IAAY,EACZ,QAAQ,GAAG,qBAAa,EACxB,IAAI,GAAG,sBAAc;IAErB,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,IAAA,WAAM,EAAC,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,KAAK,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;YACnC,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,IAAA,eAAU,EAAC,OAAO,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,IAAA,eAAU,EAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAGD,SAAgB,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,iBAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC;QACH,IAAA,iBAAY,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,iBAAQ,CAAC,WAAW,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
|
package/dist/cli/paths.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const APP_NAME = "daily-hot-api";
|
|
2
2
|
export declare const DEFAULT_PORT = 6689;
|
|
3
|
+
export declare const DEFAULT_HOST = "0.0.0.0";
|
|
3
4
|
export declare const DEFAULT_STOP_TIMEOUT_SECONDS = 10;
|
|
4
5
|
export declare const START_TIMEOUT_MS = 60000;
|
|
5
6
|
export declare const START_POLL_INTERVAL_MS = 200;
|
package/dist/cli/paths.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DAEMON_CHILD_ENV = exports.ENV_FILE_ENV = exports.HOME_ENV = exports.START_POLL_INTERVAL_MS = exports.START_TIMEOUT_MS = exports.DEFAULT_STOP_TIMEOUT_SECONDS = exports.DEFAULT_PORT = exports.APP_NAME = void 0;
|
|
3
|
+
exports.DAEMON_CHILD_ENV = exports.ENV_FILE_ENV = exports.HOME_ENV = exports.START_POLL_INTERVAL_MS = exports.START_TIMEOUT_MS = exports.DEFAULT_STOP_TIMEOUT_SECONDS = exports.DEFAULT_HOST = exports.DEFAULT_PORT = exports.APP_NAME = void 0;
|
|
4
4
|
exports.getPackageRoot = getPackageRoot;
|
|
5
5
|
exports.getBinPath = getBinPath;
|
|
6
6
|
exports.getPackageVersion = getPackageVersion;
|
|
@@ -12,6 +12,7 @@ const os_1 = require("os");
|
|
|
12
12
|
const path_1 = require("path");
|
|
13
13
|
exports.APP_NAME = 'daily-hot-api';
|
|
14
14
|
exports.DEFAULT_PORT = 6689;
|
|
15
|
+
exports.DEFAULT_HOST = '0.0.0.0';
|
|
15
16
|
exports.DEFAULT_STOP_TIMEOUT_SECONDS = 10;
|
|
16
17
|
exports.START_TIMEOUT_MS = 60_000;
|
|
17
18
|
exports.START_POLL_INTERVAL_MS = 200;
|
package/dist/cli/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/cli/paths.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/cli/paths.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/run-state.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export type RunMode = 'foreground' | 'daemon';
|
|
|
2
2
|
export interface RunState {
|
|
3
3
|
pid: number;
|
|
4
4
|
port: number;
|
|
5
|
+
host: string;
|
|
5
6
|
mode: RunMode;
|
|
6
7
|
startedAt: string;
|
|
7
8
|
cwd: string;
|
|
@@ -19,7 +20,11 @@ export declare function readRunState(stateFile: string): RunStateReadResult;
|
|
|
19
20
|
export declare function writeRunState(stateFile: string, state: RunState): void;
|
|
20
21
|
export declare function clearRunState(stateFile: string, expectedPid?: number): 'cleared' | 'kept' | 'missing';
|
|
21
22
|
export declare function isProcessAlive(pid: number): boolean;
|
|
22
|
-
export declare function processLooksLikeService(pid: number,
|
|
23
|
+
export declare function processLooksLikeService(pid: number, options?: {
|
|
24
|
+
entry?: string;
|
|
25
|
+
packageRoot?: string;
|
|
26
|
+
}): boolean;
|
|
23
27
|
export declare function sleep(ms: number): Promise<void>;
|
|
24
28
|
export declare function waitForProcessExit(pid: number, timeoutMs: number, intervalMs?: number): Promise<boolean>;
|
|
29
|
+
export declare function probeHost(host: string | undefined): string;
|
|
25
30
|
export declare function isPortInUse(port: number, host?: string, timeoutMs?: number): Promise<boolean>;
|
package/dist/cli/run-state.js
CHANGED
|
@@ -8,6 +8,7 @@ exports.isProcessAlive = isProcessAlive;
|
|
|
8
8
|
exports.processLooksLikeService = processLooksLikeService;
|
|
9
9
|
exports.sleep = sleep;
|
|
10
10
|
exports.waitForProcessExit = waitForProcessExit;
|
|
11
|
+
exports.probeHost = probeHost;
|
|
11
12
|
exports.isPortInUse = isPortInUse;
|
|
12
13
|
const child_process_1 = require("child_process");
|
|
13
14
|
const fs_1 = require("fs");
|
|
@@ -39,6 +40,7 @@ function parseRunState(raw) {
|
|
|
39
40
|
return {
|
|
40
41
|
pid,
|
|
41
42
|
port,
|
|
43
|
+
host: typeof value.host === 'string' ? value.host : '',
|
|
42
44
|
mode: value.mode,
|
|
43
45
|
startedAt: value.startedAt,
|
|
44
46
|
cwd: typeof value.cwd === 'string' ? value.cwd : '',
|
|
@@ -100,7 +102,7 @@ function isProcessAlive(pid) {
|
|
|
100
102
|
return error.code === 'EPERM';
|
|
101
103
|
}
|
|
102
104
|
}
|
|
103
|
-
function processLooksLikeService(pid,
|
|
105
|
+
function processLooksLikeService(pid, options = {}) {
|
|
104
106
|
if (!isProcessAlive(pid)) {
|
|
105
107
|
return false;
|
|
106
108
|
}
|
|
@@ -115,12 +117,15 @@ function processLooksLikeService(pid, packageRoot = (0, paths_1.getPackageRoot)(
|
|
|
115
117
|
if (!commandLine) {
|
|
116
118
|
return true;
|
|
117
119
|
}
|
|
120
|
+
const packageRoot = options.packageRoot ?? (0, paths_1.getPackageRoot)();
|
|
118
121
|
const markers = [
|
|
119
|
-
|
|
120
|
-
`${
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
options.entry,
|
|
123
|
+
(0, path_1.join)(packageRoot, 'bin', `${paths_1.APP_NAME}.js`),
|
|
124
|
+
(0, path_1.join)(packageRoot, 'dist', 'main.js'),
|
|
125
|
+
(0, path_1.join)(packageRoot, 'dist', 'cli', 'index.js'),
|
|
126
|
+
`bin/${paths_1.APP_NAME}.js`,
|
|
127
|
+
`bin\\${paths_1.APP_NAME}.js`,
|
|
128
|
+
].filter((marker) => Boolean(marker));
|
|
124
129
|
return markers.some((marker) => commandLine.includes(marker));
|
|
125
130
|
}
|
|
126
131
|
function sleep(ms) {
|
|
@@ -138,6 +143,13 @@ async function waitForProcessExit(pid, timeoutMs, intervalMs = 100) {
|
|
|
138
143
|
}
|
|
139
144
|
return !isProcessAlive(pid);
|
|
140
145
|
}
|
|
146
|
+
function probeHost(host) {
|
|
147
|
+
const value = (host ?? '').trim();
|
|
148
|
+
if (!value || value === '0.0.0.0' || value === '::' || value === '*') {
|
|
149
|
+
return '127.0.0.1';
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
141
153
|
function isPortInUse(port, host = '127.0.0.1', timeoutMs = 500) {
|
|
142
154
|
return new Promise((resolve) => {
|
|
143
155
|
let settled = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-state.js","sourceRoot":"","sources":["../../src/cli/run-state.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"run-state.js","sourceRoot":"","sources":["../../src/cli/run-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const configValidationSchema: z.ZodObject<{
|
|
3
3
|
PORT: z.ZodDefault<z.ZodNumber>;
|
|
4
|
+
HOST: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
|
|
4
5
|
CACHE_TTL: z.ZodDefault<z.ZodNumber>;
|
|
5
6
|
REQUEST_TIMEOUT: z.ZodDefault<z.ZodNumber>;
|
|
6
7
|
ALLOWED_DOMAIN: z.ZodDefault<z.ZodString>;
|
|
@@ -36,12 +37,30 @@ export declare const configValidationSchema: z.ZodObject<{
|
|
|
36
37
|
DEEPSEEK_SEARCH_API_KEY: z.ZodDefault<z.ZodString>;
|
|
37
38
|
DEEPSEEK_SEARCH_MAX_RESULTS: z.ZodDefault<z.ZodNumber>;
|
|
38
39
|
DEEPSEEK_SEARCH_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
|
|
40
|
+
NEWS_BRIEF_ENABLED: z.ZodEffects<z.ZodBoolean, boolean, unknown>;
|
|
41
|
+
NEWS_BRIEF_CRON_EXPRESSION: z.ZodDefault<z.ZodString>;
|
|
42
|
+
NEWS_BRIEF_TIMEZONE: z.ZodDefault<z.ZodString>;
|
|
43
|
+
NEWS_BRIEF_CATEGORIES: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
|
|
44
|
+
NEWS_BRIEF_LOOKBACK_HOURS: z.ZodDefault<z.ZodNumber>;
|
|
45
|
+
NEWS_BRIEF_TOP_ITEMS_PER_SOURCE: z.ZodDefault<z.ZodNumber>;
|
|
46
|
+
NEWS_BRIEF_MAX_CANDIDATES: z.ZodDefault<z.ZodNumber>;
|
|
47
|
+
NEWS_BRIEF_MAX_ITEMS_PER_CATEGORY: z.ZodDefault<z.ZodNumber>;
|
|
48
|
+
NEWS_BRIEF_SOURCE_CONCURRENCY: z.ZodDefault<z.ZodNumber>;
|
|
49
|
+
NEWS_BRIEF_CATEGORY_CONCURRENCY: z.ZodDefault<z.ZodNumber>;
|
|
50
|
+
NEWS_BRIEF_GENERATING_TIMEOUT_MINUTES: z.ZodDefault<z.ZodNumber>;
|
|
51
|
+
NEWS_BRIEF_MANUAL_GENERATE_ENABLED: z.ZodEffects<z.ZodBoolean, boolean, unknown>;
|
|
52
|
+
NEWS_BRIEF_SEARCH_ENABLED: z.ZodEffects<z.ZodBoolean, boolean, unknown>;
|
|
53
|
+
NEWS_BRIEF_SEARCH_MAX_QUERIES: z.ZodDefault<z.ZodNumber>;
|
|
54
|
+
NEWS_BRIEF_SEARCH_CONCURRENCY: z.ZodDefault<z.ZodNumber>;
|
|
55
|
+
NEWS_BRIEF_SEARCH_QUERY_MAX_CHARS: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
NEWS_BRIEF_SEARCH_PROVIDERS: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
|
|
39
57
|
}, "strip", z.ZodTypeAny, {
|
|
40
58
|
CACHE_TTL: number;
|
|
41
59
|
REDIS_HOST: string;
|
|
42
60
|
REDIS_PORT: number;
|
|
43
61
|
REDIS_PASSWORD: string;
|
|
44
62
|
PORT: number;
|
|
63
|
+
HOST: string;
|
|
45
64
|
REQUEST_TIMEOUT: number;
|
|
46
65
|
ALLOWED_DOMAIN: string;
|
|
47
66
|
RSS_MODE: boolean;
|
|
@@ -73,12 +92,30 @@ export declare const configValidationSchema: z.ZodObject<{
|
|
|
73
92
|
DEEPSEEK_SEARCH_API_KEY: string;
|
|
74
93
|
DEEPSEEK_SEARCH_MAX_RESULTS: number;
|
|
75
94
|
DEEPSEEK_SEARCH_TIMEOUT_MS: number;
|
|
95
|
+
NEWS_BRIEF_ENABLED: boolean;
|
|
96
|
+
NEWS_BRIEF_CRON_EXPRESSION: string;
|
|
97
|
+
NEWS_BRIEF_TIMEZONE: string;
|
|
98
|
+
NEWS_BRIEF_CATEGORIES: string;
|
|
99
|
+
NEWS_BRIEF_LOOKBACK_HOURS: number;
|
|
100
|
+
NEWS_BRIEF_TOP_ITEMS_PER_SOURCE: number;
|
|
101
|
+
NEWS_BRIEF_MAX_CANDIDATES: number;
|
|
102
|
+
NEWS_BRIEF_MAX_ITEMS_PER_CATEGORY: number;
|
|
103
|
+
NEWS_BRIEF_SOURCE_CONCURRENCY: number;
|
|
104
|
+
NEWS_BRIEF_CATEGORY_CONCURRENCY: number;
|
|
105
|
+
NEWS_BRIEF_GENERATING_TIMEOUT_MINUTES: number;
|
|
106
|
+
NEWS_BRIEF_MANUAL_GENERATE_ENABLED: boolean;
|
|
107
|
+
NEWS_BRIEF_SEARCH_ENABLED: boolean;
|
|
108
|
+
NEWS_BRIEF_SEARCH_MAX_QUERIES: number;
|
|
109
|
+
NEWS_BRIEF_SEARCH_CONCURRENCY: number;
|
|
110
|
+
NEWS_BRIEF_SEARCH_QUERY_MAX_CHARS: number;
|
|
111
|
+
NEWS_BRIEF_SEARCH_PROVIDERS: string;
|
|
76
112
|
}, {
|
|
77
113
|
CACHE_TTL?: number | undefined;
|
|
78
114
|
REDIS_HOST?: string | undefined;
|
|
79
115
|
REDIS_PORT?: number | undefined;
|
|
80
116
|
REDIS_PASSWORD?: string | undefined;
|
|
81
117
|
PORT?: number | undefined;
|
|
118
|
+
HOST?: string | undefined;
|
|
82
119
|
REQUEST_TIMEOUT?: number | undefined;
|
|
83
120
|
ALLOWED_DOMAIN?: string | undefined;
|
|
84
121
|
RSS_MODE?: unknown;
|
|
@@ -110,5 +147,22 @@ export declare const configValidationSchema: z.ZodObject<{
|
|
|
110
147
|
DEEPSEEK_SEARCH_API_KEY?: string | undefined;
|
|
111
148
|
DEEPSEEK_SEARCH_MAX_RESULTS?: number | undefined;
|
|
112
149
|
DEEPSEEK_SEARCH_TIMEOUT_MS?: number | undefined;
|
|
150
|
+
NEWS_BRIEF_ENABLED?: unknown;
|
|
151
|
+
NEWS_BRIEF_CRON_EXPRESSION?: string | undefined;
|
|
152
|
+
NEWS_BRIEF_TIMEZONE?: string | undefined;
|
|
153
|
+
NEWS_BRIEF_CATEGORIES?: string | undefined;
|
|
154
|
+
NEWS_BRIEF_LOOKBACK_HOURS?: number | undefined;
|
|
155
|
+
NEWS_BRIEF_TOP_ITEMS_PER_SOURCE?: number | undefined;
|
|
156
|
+
NEWS_BRIEF_MAX_CANDIDATES?: number | undefined;
|
|
157
|
+
NEWS_BRIEF_MAX_ITEMS_PER_CATEGORY?: number | undefined;
|
|
158
|
+
NEWS_BRIEF_SOURCE_CONCURRENCY?: number | undefined;
|
|
159
|
+
NEWS_BRIEF_CATEGORY_CONCURRENCY?: number | undefined;
|
|
160
|
+
NEWS_BRIEF_GENERATING_TIMEOUT_MINUTES?: number | undefined;
|
|
161
|
+
NEWS_BRIEF_MANUAL_GENERATE_ENABLED?: unknown;
|
|
162
|
+
NEWS_BRIEF_SEARCH_ENABLED?: unknown;
|
|
163
|
+
NEWS_BRIEF_SEARCH_MAX_QUERIES?: number | undefined;
|
|
164
|
+
NEWS_BRIEF_SEARCH_CONCURRENCY?: number | undefined;
|
|
165
|
+
NEWS_BRIEF_SEARCH_QUERY_MAX_CHARS?: number | undefined;
|
|
166
|
+
NEWS_BRIEF_SEARCH_PROVIDERS?: string | undefined;
|
|
113
167
|
}>;
|
|
114
168
|
export type ConfigType = z.infer<typeof configValidationSchema>;
|