@yinuo-ngm/server 1.0.16 → 1.0.18
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/app.js +3 -15
- package/lib/common/editor.js +2 -2
- package/lib/env.d.ts +1 -0
- package/lib/env.js +1 -0
- package/lib/plugins/error-handler.plugin.d.ts +2 -2
- package/lib/plugins/error-handler.plugin.js +97 -93
- package/lib/plugins/ws/topics/nginx.ws.js +2 -1
- package/lib/plugins/ws/topics/svn.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/svn.ws.js +3 -2
- package/lib/plugins/ws/topics/syslog.ws.d.ts +1 -1
- package/lib/plugins/ws/topics/task.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/task.ws.js +2 -1
- package/lib/plugins/ws/ws.context.d.ts +1 -1
- package/lib/plugins/ws/ws.plugin.js +4 -3
- package/lib/plugins/ws/ws.router.d.ts +2 -2
- package/lib/plugins/ws/ws.router.js +8 -7
- package/lib/routes/api-client/collection.routes.js +8 -6
- package/lib/routes/api-client/env.routes.js +4 -3
- package/lib/routes/api-client/history.routes.js +3 -2
- package/lib/routes/api-client/hub-token.routes.js +11 -11
- package/lib/routes/api-client/request.routes.js +7 -6
- package/lib/routes/api-client/send.routes.js +3 -2
- package/lib/routes/config.routes.js +5 -5
- package/lib/routes/hub.routes.js +10 -10
- package/lib/routes/nginx/nginx-lifecycle.routes.js +4 -0
- package/lib/routes/nginx/nginx-route.context.js +23 -7
- package/lib/routes/nginx/nginx-server.routes.js +158 -6
- package/lib/routes/node-version.routes.js +7 -7
- package/lib/routes/project.routes.js +9 -9
- package/lib/routes/rss.routes.js +3 -3
- package/lib/routes/sprite-browse.routes.js +2 -1
- package/lib/routes/sprite.routes.js +3 -3
- package/lib/routes/static-files.routes.js +7 -7
- package/lib/routes/svn.routes.js +5 -3
- package/lib/routes/system.routes.js +20 -1
- package/lib/routes/task.routes.js +4 -4
- package/package.json +13 -6
- package/www/3rdpartylicenses.txt +52 -52
- package/www/browser/chunk-2L7NUOMX.js +2 -0
- package/www/browser/chunk-2NZJ7CN2.js +20 -0
- package/www/browser/{chunk-SPRWNZHF.js → chunk-3CM4SKDO.js} +2 -2
- package/www/browser/{chunk-EEVPZGEY.js → chunk-3I7BQCXS.js} +1 -1
- package/www/browser/{chunk-DXF7BVK5.js → chunk-3M56F2S2.js} +1 -1
- package/www/browser/chunk-3OHBKMAA.js +1 -0
- package/www/browser/{chunk-4KETC6EB.js → chunk-3XNNQFWR.js} +1 -1
- package/www/browser/chunk-4BRW6LCZ.js +4 -0
- package/www/browser/{chunk-HGONFYP6.js → chunk-4LBSLURA.js} +1 -1
- package/www/browser/{chunk-BYEU6KGP.js → chunk-4X42HB6N.js} +1 -1
- package/www/browser/chunk-5DYX4DUX.js +11 -0
- package/www/browser/chunk-6SYVDN5L.js +1 -0
- package/www/browser/{chunk-XJ5KZQNN.js → chunk-6YYNHZ2A.js} +1 -1
- package/www/browser/{chunk-G2W3B7TJ.js → chunk-75W3GVSO.js} +1 -1
- package/www/browser/{chunk-76TVIB33.js → chunk-7U44RF5F.js} +1 -1
- package/www/browser/{chunk-WD4IAQR3.js → chunk-AELTP6YN.js} +1 -1
- package/www/browser/chunk-AMXRL4GR.js +1 -0
- package/www/browser/chunk-AV2ZODEH.js +1 -0
- package/www/browser/chunk-AZ6SIMYH.js +1 -0
- package/www/browser/chunk-B3C35ET3.js +2 -0
- package/www/browser/chunk-BTQIUVTQ.js +1 -0
- package/www/browser/chunk-CN5J4WNO.js +1 -0
- package/www/browser/{chunk-N4LRZJBP.js → chunk-D2ODDESN.js} +1 -1
- package/www/browser/{chunk-O2EYEF7J.js → chunk-DE6E23ET.js} +1 -1
- package/www/browser/{chunk-SVQWPHF5.js → chunk-DIJPUYIA.js} +1 -1
- package/www/browser/{chunk-SYCNSLAW.js → chunk-DLGJD6YU.js} +4 -4
- package/www/browser/{chunk-JHMEKUZ5.js → chunk-EEDA5U4V.js} +1 -1
- package/www/browser/chunk-FK6Z4HLL.js +1 -0
- package/www/browser/chunk-FL6GDGHW.js +1 -0
- package/www/browser/{chunk-HRXCR3IN.js → chunk-FXCG34QS.js} +1 -1
- package/www/browser/{chunk-UJOHBN2Y.js → chunk-H2USFIYR.js} +1 -1
- package/www/browser/chunk-H5HGMOE6.js +1 -0
- package/www/browser/chunk-HB3HECPD.js +1 -0
- package/www/browser/{chunk-INL2PELS.js → chunk-HDNG236Q.js} +1 -1
- package/www/browser/{chunk-WF2QTF5L.js → chunk-HJTXXSMC.js} +1 -1
- package/www/browser/{chunk-LQ5OXSW7.js → chunk-HUMCWAKJ.js} +1 -1
- package/www/browser/chunk-IKB3EQCP.js +2 -0
- package/www/browser/{chunk-TMX5TTV3.js → chunk-K7PESFPY.js} +1 -1
- package/www/browser/{chunk-T3KK7ZXB.js → chunk-KRYMOHYF.js} +1 -1
- package/www/browser/{chunk-SQQNR223.js → chunk-M4QRBV3K.js} +1 -1
- package/www/browser/chunk-N2PELLMM.js +30 -0
- package/www/browser/{chunk-ACAZUX6C.js → chunk-ONXBYGIG.js} +1 -1
- package/www/browser/{chunk-JZULA5JV.js → chunk-OSBDR36P.js} +1 -1
- package/www/browser/chunk-OZCK4XVV.js +1 -0
- package/www/browser/{chunk-GDWS2L66.js → chunk-QJP5F735.js} +1 -1
- package/www/browser/{chunk-2X3MRS27.js → chunk-RGOYDY7H.js} +1 -1
- package/www/browser/{chunk-B6MBYCXI.js → chunk-UJKK4A7Y.js} +1 -1
- package/www/browser/{chunk-ZNTJRLVH.js → chunk-WD2EKZQC.js} +1 -1
- package/www/browser/{chunk-L5D75AMV.js → chunk-WUA5JFDD.js} +1 -1
- package/www/browser/chunk-XLFHB7RS.js +3 -0
- package/www/browser/{chunk-JU3TEDBV.js → chunk-YNW4HEJO.js} +1 -1
- package/www/browser/{chunk-RW2JPJV7.js → chunk-ZTDLWBW5.js} +1 -1
- package/www/browser/index.html +1 -1
- package/www/browser/main-N64WJCHX.js +34 -0
- package/www/browser/chunk-2BZRE4G7.js +0 -1
- package/www/browser/chunk-5T5KA5PG.js +0 -1
- package/www/browser/chunk-6CGHNKJI.js +0 -1
- package/www/browser/chunk-7J24TP36.js +0 -1
- package/www/browser/chunk-CZ5AZ3VW.js +0 -1
- package/www/browser/chunk-DW7F5PEA.js +0 -1
- package/www/browser/chunk-HHBPULJW.js +0 -2
- package/www/browser/chunk-KVFR7GFV.js +0 -20
- package/www/browser/chunk-L7TMCSHV.js +0 -1
- package/www/browser/chunk-MVQTKINJ.js +0 -1
- package/www/browser/chunk-OMDHJIUB.js +0 -1
- package/www/browser/chunk-OWUAAOHW.js +0 -2
- package/www/browser/chunk-PIK5YPIB.js +0 -1
- package/www/browser/chunk-RHLQRQDK.js +0 -9
- package/www/browser/chunk-S3SJ4VVM.js +0 -11
- package/www/browser/chunk-SIVPP74B.js +0 -0
- package/www/browser/chunk-UFY3FLDK.js +0 -1
- package/www/browser/chunk-UQGCUFNM.js +0 -1
- package/www/browser/chunk-UXXWRMM6.js +0 -1
- package/www/browser/chunk-UZRJGJTD.js +0 -2
- package/www/browser/chunk-WI67LAOV.js +0 -4
- package/www/browser/chunk-WNCM6QKB.js +0 -1
- package/www/browser/chunk-YETDFSQE.js +0 -1
- package/www/browser/chunk-YMTC5GZK.js +0 -1
- package/www/browser/chunk-YVZHJ76K.js +0 -1
- package/www/browser/main-6LN5C22E.js +0 -34
package/lib/app.js
CHANGED
|
@@ -25,23 +25,11 @@ function normalizeLogLevel(v) {
|
|
|
25
25
|
}
|
|
26
26
|
function createFastifyLogger() {
|
|
27
27
|
const level = normalizeLogLevel(env_1.env.logLevel);
|
|
28
|
-
|
|
28
|
+
if (process.env.NGM_DEBUG === '1') {
|
|
29
|
+
console.log(`Logger initialized with level: ${level || 'silent (disabled)'}`);
|
|
30
|
+
}
|
|
29
31
|
if (!level)
|
|
30
32
|
return false;
|
|
31
|
-
const isDev = process.env.NODE_ENV !== "production";
|
|
32
|
-
if (isDev) {
|
|
33
|
-
return {
|
|
34
|
-
level,
|
|
35
|
-
transport: {
|
|
36
|
-
target: "pino-pretty",
|
|
37
|
-
options: {
|
|
38
|
-
colorize: true,
|
|
39
|
-
translateTime: "HH:MM:ss.l",
|
|
40
|
-
ignore: "pid,hostname",
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
33
|
return { level };
|
|
46
34
|
}
|
|
47
35
|
async function createServer() {
|
package/lib/common/editor.js
CHANGED
|
@@ -37,7 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.openFolder = openFolder;
|
|
40
|
-
const
|
|
40
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
41
41
|
const launch_editor_1 = __importDefault(require("launch-editor"));
|
|
42
42
|
const path = __importStar(require("path"));
|
|
43
43
|
async function openFolder(folder, opts = {}) {
|
|
@@ -60,7 +60,7 @@ async function openFolder(folder, opts = {}) {
|
|
|
60
60
|
settled = true;
|
|
61
61
|
clearTimeout(timer);
|
|
62
62
|
if (errorMsg) {
|
|
63
|
-
reject(new
|
|
63
|
+
reject(new errors_1.CoreError(errors_1.CoreErrorCodes.EDITOR_NOT_FOUND, errorMsg, { fileName, editor, folder, file, target }));
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
resolve();
|
package/lib/env.d.ts
CHANGED
package/lib/env.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FastifyPluginAsync } from "fastify";
|
|
2
|
-
import { type ErrorCode } from "@yinuo-ngm/
|
|
3
|
-
export declare const ERROR_STATUS: Record<ErrorCode, number
|
|
2
|
+
import { type ErrorCode } from "@yinuo-ngm/errors";
|
|
3
|
+
export declare const ERROR_STATUS: Partial<Record<ErrorCode, number>>;
|
|
4
4
|
export declare function mapStatus(code: ErrorCode): number;
|
|
5
5
|
export declare const errorHandlerPlugin: FastifyPluginAsync;
|
|
6
6
|
export default errorHandlerPlugin;
|
|
@@ -6,94 +6,99 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.errorHandlerPlugin = exports.ERROR_STATUS = void 0;
|
|
7
7
|
exports.mapStatus = mapStatus;
|
|
8
8
|
const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
|
|
9
|
-
const
|
|
9
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
10
10
|
exports.ERROR_STATUS = {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
NO_AVAILABLE_VERSIONS: 409,
|
|
94
|
-
VERSION_REQUIRED: 400,
|
|
95
|
-
PROJECT_PATH_REQUIRED: 400,
|
|
96
|
-
|
|
11
|
+
[errors_1.GlobalErrorCodes.UNKNOWN_ERROR]: 500,
|
|
12
|
+
[errors_1.GlobalErrorCodes.BAD_REQUEST]: 400,
|
|
13
|
+
[errors_1.GlobalErrorCodes.NOT_FOUND]: 404,
|
|
14
|
+
[errors_1.GlobalErrorCodes.NOT_IMPLEMENTED]: 501,
|
|
15
|
+
[errors_1.GlobalErrorCodes.STORAGE_IO_ERROR]: 500,
|
|
16
|
+
[errors_1.GlobalErrorCodes.FS_PATH_NOT_FOUND]: 404,
|
|
17
|
+
[errors_1.GlobalErrorCodes.FS_PERMISSION_DENIED]: 403,
|
|
18
|
+
[errors_1.GlobalErrorCodes.FS_ALREADY_EXISTS]: 409,
|
|
19
|
+
[errors_1.GlobalErrorCodes.FS_INVALID_NAME]: 400,
|
|
20
|
+
[errors_1.GlobalErrorCodes.FS_MKDIR_FAILED]: 500,
|
|
21
|
+
[errors_1.GlobalErrorCodes.BAD_JSON]: 400,
|
|
22
|
+
[errors_1.GlobalErrorCodes.BAD_MSG]: 400,
|
|
23
|
+
[errors_1.GlobalErrorCodes.OP_NOT_SUPPORTED]: 400,
|
|
24
|
+
[errors_1.GlobalErrorCodes.TOPIC_NOT_FOUND]: 404,
|
|
25
|
+
[errors_1.GlobalErrorCodes.HANDLER_FAILED]: 500,
|
|
26
|
+
[errors_1.GlobalErrorCodes.OP_NOT_FOUND]: 400,
|
|
27
|
+
[errors_1.GlobalErrorCodes.UNAUTHORIZED]: 401,
|
|
28
|
+
[errors_1.GlobalErrorCodes.INVALID_TIMESTAMP]: 400,
|
|
29
|
+
[errors_1.CoreErrorCodes.PROJECT_NOT_FOUND]: 404,
|
|
30
|
+
[errors_1.CoreErrorCodes.PROJECT_ROOT_INVALID]: 400,
|
|
31
|
+
[errors_1.CoreErrorCodes.PROJECT_ALREADY_EXISTS]: 409,
|
|
32
|
+
[errors_1.CoreErrorCodes.PROJECT_ID_REQUIRED]: 400,
|
|
33
|
+
[errors_1.CoreErrorCodes.PROJECT_IMPORT_NOT_EXISTS]: 404,
|
|
34
|
+
[errors_1.CoreErrorCodes.PROJECT_IMPORT_NOT_DIR]: 400,
|
|
35
|
+
[errors_1.CoreErrorCodes.PROJECT_IMPORT_ALREADY_REGISTERED]: 409,
|
|
36
|
+
[errors_1.CoreErrorCodes.PROJECT_IMPORT_NOT_RECOGNIZED]: 422,
|
|
37
|
+
[errors_1.CoreErrorCodes.PROJECT_IMPORT_SCAN_FAILED]: 500,
|
|
38
|
+
[errors_1.CoreErrorCodes.BOOTSTRAP_NOT_IN_PICK_STATE]: 400,
|
|
39
|
+
[errors_1.CoreErrorCodes.BOOTSTRAP_CTX_NOT_FOUND]: 404,
|
|
40
|
+
[errors_1.CoreErrorCodes.BOOTSTRAP_INVALID_PICKED_ROOT]: 400,
|
|
41
|
+
[errors_1.CoreErrorCodes.BOOTSTRAP_NOT_WAITING_PICK]: 400,
|
|
42
|
+
[errors_1.CoreErrorCodes.INVALID_NAME]: 400,
|
|
43
|
+
[errors_1.CoreErrorCodes.TARGET_EXISTS]: 409,
|
|
44
|
+
[errors_1.CoreErrorCodes.INVALID_REPO_URL]: 400,
|
|
45
|
+
[errors_1.CoreErrorCodes.INVALID_PARENT_DIR]: 400,
|
|
46
|
+
[errors_1.CoreErrorCodes.GIT_CHECKOUT_FAILED]: 500,
|
|
47
|
+
[errors_1.CoreErrorCodes.PROJECT_ANGULAR_JSON_INVALID]: 400,
|
|
48
|
+
[errors_1.CoreErrorCodes.PROJECT_ANGULAR_JSON_NOT_FOUND]: 404,
|
|
49
|
+
[errors_1.CoreErrorCodes.PROJECT_VITE_CONFIG_INVALID]: 400,
|
|
50
|
+
[errors_1.CoreErrorCodes.PROJECT_VUE_CONFIG_NOT_FOUND]: 404,
|
|
51
|
+
[errors_1.CoreErrorCodes.ASSET_NOT_FOUND]: 404,
|
|
52
|
+
[errors_1.CoreErrorCodes.ASSET_KIND_NOT_SUPPORTED]: 400,
|
|
53
|
+
[errors_1.CoreErrorCodes.ASSET_URL_REQUIRED]: 400,
|
|
54
|
+
[errors_1.CoreErrorCodes.ASSET_LABEL_REQUIRED]: 400,
|
|
55
|
+
[errors_1.CoreErrorCodes.ASSET_URL_INVALID]: 400,
|
|
56
|
+
[errors_1.CoreErrorCodes.ASSET_MODE_INVALID]: 400,
|
|
57
|
+
[errors_1.CoreErrorCodes.CONFIG_BACKUP_NOT_FOUND]: 404,
|
|
58
|
+
[errors_1.CoreErrorCodes.CONFIG_READ_FAILED]: 500,
|
|
59
|
+
[errors_1.CoreErrorCodes.CONFIG_WRITE_FAILED]: 500,
|
|
60
|
+
[errors_1.CoreErrorCodes.CONFIG_CONFLICT]: 409,
|
|
61
|
+
[errors_1.CoreErrorCodes.CONFIG_OPEN_FAILED]: 500,
|
|
62
|
+
[errors_1.CoreErrorCodes.CONFIG_SCHEMA_NOT_FOUND]: 404,
|
|
63
|
+
[errors_1.CoreErrorCodes.CONFIG_DOMAIN_NOT_FOUND]: 404,
|
|
64
|
+
[errors_1.CoreErrorCodes.CONFIG_DOC_NOT_FOUND]: 404,
|
|
65
|
+
[errors_1.CoreErrorCodes.TASK_NOT_FOUND]: 404,
|
|
66
|
+
[errors_1.CoreErrorCodes.RUN_NOT_FOUND]: 404,
|
|
67
|
+
[errors_1.CoreErrorCodes.TASK_ID_REQUIRED]: 400,
|
|
68
|
+
[errors_1.CoreErrorCodes.TASK_ALREADY_RUNNING]: 409,
|
|
69
|
+
[errors_1.CoreErrorCodes.PROCESS_SPAWN_FAILED]: 500,
|
|
70
|
+
[errors_1.CoreErrorCodes.TASK_SPEC_NOT_FOUND]: 404,
|
|
71
|
+
[errors_1.CoreErrorCodes.TASK_NOT_RUNNABLE]: 400,
|
|
72
|
+
[errors_1.CoreErrorCodes.COMMAND_NOT_FOUND]: 404,
|
|
73
|
+
[errors_1.CoreErrorCodes.FS_EXISTS_FAILED]: 500,
|
|
74
|
+
[errors_1.CoreErrorCodes.FS_INVALID_NAME]: 400,
|
|
75
|
+
[errors_1.CoreErrorCodes.FS_ALREADY_EXISTS]: 409,
|
|
76
|
+
[errors_1.CoreErrorCodes.FS_PERMISSION_DENIED]: 403,
|
|
77
|
+
[errors_1.CoreErrorCodes.FS_MKDIR_FAILED]: 500,
|
|
78
|
+
[errors_1.CoreErrorCodes.FS_PATH_NOT_FOUND]: 404,
|
|
79
|
+
[errors_1.CoreErrorCodes.DASHBOARD_CONFLICT]: 409,
|
|
80
|
+
[errors_1.CoreErrorCodes.WIDGET_NOT_FOUND]: 404,
|
|
81
|
+
[errors_1.CoreErrorCodes.WIDGET_LOCKED]: 423,
|
|
82
|
+
[errors_1.CoreErrorCodes.SPRITE_CONFIG_NOT_FOUND]: 404,
|
|
83
|
+
[errors_1.CoreErrorCodes.SPRITE_GROUP_NOT_FOUND]: 404,
|
|
84
|
+
[errors_1.CoreErrorCodes.SPRITE_ICONS_ROOT_NOT_FOUND]: 404,
|
|
85
|
+
[errors_1.CoreErrorCodes.SVN_SYNC_ALREADY_RUNNING]: 409,
|
|
86
|
+
[errors_1.CoreErrorCodes.SVN_SYNC_FAILED]: 500,
|
|
87
|
+
[errors_1.CoreErrorCodes.SVN_SOURCE_ID_REQUIRED]: 400,
|
|
88
|
+
[errors_1.CoreErrorCodes.DEP_INSTALL_FAILED]: 500,
|
|
89
|
+
[errors_1.CoreErrorCodes.DEP_UNINSTALL_FAILED]: 500,
|
|
90
|
+
[errors_1.CoreErrorCodes.DEP_NOT_FOUND]: 404,
|
|
91
|
+
[errors_1.CoreErrorCodes.NO_VERSION_MANAGER]: 503,
|
|
92
|
+
[errors_1.CoreErrorCodes.SWITCH_VERSION_FAILED]: 500,
|
|
93
|
+
[errors_1.CoreErrorCodes.NO_AVAILABLE_VERSIONS]: 409,
|
|
94
|
+
[errors_1.CoreErrorCodes.VERSION_REQUIRED]: 400,
|
|
95
|
+
[errors_1.CoreErrorCodes.PROJECT_PATH_REQUIRED]: 400,
|
|
96
|
+
[errors_1.CoreErrorCodes.EDITOR_NOT_FOUND]: 404,
|
|
97
|
+
[errors_1.CoreErrorCodes.EDITOR_LAUNCH_FAILED]: 500,
|
|
98
|
+
[errors_1.CoreErrorCodes.RSS_FETCH_FAILED]: 500,
|
|
99
|
+
[errors_1.CoreErrorCodes.INVALID_RSS_URL]: 400,
|
|
100
|
+
[errors_1.CoreErrorCodes.KILL_PORT_FAILED]: 500,
|
|
101
|
+
[errors_1.CoreErrorCodes.INVALID_PORT]: 400,
|
|
97
102
|
};
|
|
98
103
|
function mapStatus(code) {
|
|
99
104
|
return exports.ERROR_STATUS[code] ?? 400;
|
|
@@ -115,21 +120,20 @@ function buildErrorBody(reqId, code, message, details) {
|
|
|
115
120
|
exports.errorHandlerPlugin = (0, fastify_plugin_1.default)(async (app) => {
|
|
116
121
|
app.setErrorHandler((err, req, reply) => {
|
|
117
122
|
const requestId = req.id;
|
|
118
|
-
if (err instanceof
|
|
123
|
+
if (err instanceof errors_1.AppError || isAppErrorLike(err)) {
|
|
119
124
|
const status = mapStatus(err.code);
|
|
120
125
|
return reply.status(status).send(buildErrorBody(requestId, err.code, err.message, err.meta));
|
|
121
126
|
}
|
|
122
127
|
if (err?.validation) {
|
|
123
128
|
return reply
|
|
124
129
|
.status(400)
|
|
125
|
-
.send(buildErrorBody(requestId,
|
|
130
|
+
.send(buildErrorBody(requestId, errors_1.GlobalErrorCodes.BAD_REQUEST, "参数不合法", err.validation));
|
|
126
131
|
}
|
|
127
|
-
console.log('err', err);
|
|
128
132
|
req.log.error({ err, requestId }, "Unhandled error");
|
|
129
|
-
return reply.status(500).send(buildErrorBody(requestId,
|
|
133
|
+
return reply.status(500).send(buildErrorBody(requestId, errors_1.GlobalErrorCodes.UNKNOWN_ERROR, "服务异常,请稍后重试"));
|
|
130
134
|
});
|
|
131
135
|
});
|
|
132
|
-
function
|
|
133
|
-
return err && typeof err ===
|
|
136
|
+
function isAppErrorLike(err) {
|
|
137
|
+
return err !== null && typeof err === 'object' && typeof err.code === 'number' && typeof err.message === 'string';
|
|
134
138
|
}
|
|
135
139
|
exports.default = exports.errorHandlerPlugin;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createNginxTopicHandler = createNginxTopicHandler;
|
|
4
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
4
5
|
function createNginxTopicHandler(deps, getAllClients) {
|
|
5
6
|
const { logService } = deps;
|
|
6
7
|
const onLog = (entry) => {
|
|
@@ -24,7 +25,7 @@ function createNginxTopicHandler(deps, getAllClients) {
|
|
|
24
25
|
if (!logType || (logType !== "error" && logType !== "access")) {
|
|
25
26
|
ctx.send({
|
|
26
27
|
op: "error",
|
|
27
|
-
code:
|
|
28
|
+
code: errors_1.GlobalErrorCodes.BAD_MSG,
|
|
28
29
|
message: "logType must be 'error' or 'access'",
|
|
29
30
|
ts: Date.now()
|
|
30
31
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SvnRuntime } from "@yinuo-ngm/core";
|
|
2
|
+
import type { SvnEventPayloadMap, SvnEventType } from "@yinuo-ngm/protocol";
|
|
2
3
|
import { WsContext } from "../ws.context";
|
|
3
4
|
import { TopicHandler } from "../ws.router";
|
|
4
5
|
export type SvnSyncWsDeps = {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createSvnSyncTopicHandler = createSvnSyncTopicHandler;
|
|
4
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
4
5
|
const keyOf = (projectId) => `svn:${projectId}`;
|
|
5
6
|
function createSvnSyncTopicHandler(deps, getAllClients) {
|
|
6
7
|
return {
|
|
@@ -8,7 +9,7 @@ function createSvnSyncTopicHandler(deps, getAllClients) {
|
|
|
8
9
|
async sub(ctx, msg) {
|
|
9
10
|
const projectId = String(msg?.projectId ?? "").trim();
|
|
10
11
|
if (!projectId) {
|
|
11
|
-
ctx.send({ op: "error", code:
|
|
12
|
+
ctx.send({ op: "error", code: errors_1.CoreErrorCodes.PROJECT_ID_REQUIRED, message: "projectId is required", ts: Date.now() });
|
|
12
13
|
return;
|
|
13
14
|
}
|
|
14
15
|
const t = Number(msg?.tail ?? 0) || 0;
|
|
@@ -31,7 +32,7 @@ function createSvnSyncTopicHandler(deps, getAllClients) {
|
|
|
31
32
|
async unsub(ctx, msg) {
|
|
32
33
|
const projectId = String(msg?.projectId ?? "").trim();
|
|
33
34
|
if (!projectId) {
|
|
34
|
-
ctx.send({ op: "error", code:
|
|
35
|
+
ctx.send({ op: "error", code: errors_1.CoreErrorCodes.PROJECT_ID_REQUIRED, message: "projectId is required", ts: Date.now() });
|
|
35
36
|
return;
|
|
36
37
|
}
|
|
37
38
|
ctx.delSub("svn", keyOf(projectId));
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TaskRuntime } from "@yinuo-ngm/core";
|
|
2
|
+
import type { LogLine, TaskEventPayloadMap, TaskEventType, TaskOutputPayload } from "@yinuo-ngm/protocol";
|
|
2
3
|
import { WsContext } from "../ws.context";
|
|
3
4
|
import type { TopicHandler } from "../ws.router";
|
|
4
5
|
export type TaskWsDeps = {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createTaskTopicHandler = createTaskTopicHandler;
|
|
4
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
4
5
|
const keyOfTask = (taskId) => `task:${taskId}`;
|
|
5
6
|
function createTaskTopicHandler(deps, getAllClients) {
|
|
6
7
|
return {
|
|
@@ -9,7 +10,7 @@ function createTaskTopicHandler(deps, getAllClients) {
|
|
|
9
10
|
const taskId = String(msg?.taskId ?? "").trim();
|
|
10
11
|
const tail = Number(msg?.tail ?? 0);
|
|
11
12
|
if (!taskId) {
|
|
12
|
-
ctx.send({ op: "error", code:
|
|
13
|
+
ctx.send({ op: "error", code: errors_1.CoreErrorCodes.TASK_ID_REQUIRED, message: "taskId is required", ts: Date.now() });
|
|
13
14
|
return;
|
|
14
15
|
}
|
|
15
16
|
ctx.addSub("task", keyOfTask(taskId));
|
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const core_1 = require("@yinuo-ngm/core");
|
|
7
|
+
const bootstrap_1 = require("@yinuo-ngm/bootstrap");
|
|
7
8
|
const websocket_1 = __importDefault(require("@fastify/websocket"));
|
|
8
9
|
const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
|
|
9
10
|
const topics_1 = require("./topics");
|
|
@@ -50,13 +51,13 @@ exports.default = (0, fastify_plugin_1.default)(async function wsPlugin(fastify)
|
|
|
50
51
|
offs.push(events.on(core_1.Events.SYSLOG_APPENDED, (e) => {
|
|
51
52
|
syslogHandler.push(e.entry);
|
|
52
53
|
}));
|
|
53
|
-
offs.push(events.on(
|
|
54
|
+
offs.push(events.on(bootstrap_1.BootstrapEvents.DONE, (e) => {
|
|
54
55
|
taskHandler.pushEvent("bootstrapDone", e);
|
|
55
56
|
}));
|
|
56
|
-
offs.push(events.on(
|
|
57
|
+
offs.push(events.on(bootstrap_1.BootstrapEvents.FAILED, (e) => {
|
|
57
58
|
taskHandler.pushEvent("bootstrapFailed", e);
|
|
58
59
|
}));
|
|
59
|
-
offs.push(events.on(
|
|
60
|
+
offs.push(events.on(bootstrap_1.BootstrapEvents.NEED_PICK_ROOT, (e) => {
|
|
60
61
|
taskHandler.pushEvent("bootstrapNeedPickRoot", e);
|
|
61
62
|
}));
|
|
62
63
|
offs.push(events.on(core_1.Events.SVN_SYNC_STARTED, (e) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WsClientMsg, WsTopic } from "@yinuo-ngm/
|
|
1
|
+
import type { WsClientMsg, WsTopic } from "@yinuo-ngm/protocol";
|
|
2
2
|
import { WsContext } from "./ws.context";
|
|
3
3
|
export type TopicHandler = {
|
|
4
4
|
topic: WsTopic;
|
|
@@ -15,6 +15,6 @@ export type TopicHandler = {
|
|
|
15
15
|
export declare class WsRouter {
|
|
16
16
|
private handlers;
|
|
17
17
|
register(handler: TopicHandler): void;
|
|
18
|
-
handleRaw(ctx: WsContext, raw:
|
|
18
|
+
handleRaw(ctx: WsContext, raw: unknown): undefined;
|
|
19
19
|
private err;
|
|
20
20
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WsRouter = void 0;
|
|
4
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
4
5
|
class WsRouter {
|
|
5
6
|
constructor() {
|
|
6
7
|
this.handlers = new Map();
|
|
@@ -15,11 +16,11 @@ class WsRouter {
|
|
|
15
16
|
msg = JSON.parse(text);
|
|
16
17
|
}
|
|
17
18
|
catch {
|
|
18
|
-
ctx.send(this.err(
|
|
19
|
+
ctx.send(this.err(errors_1.GlobalErrorCodes.BAD_JSON, "Invalid JSON"));
|
|
19
20
|
return;
|
|
20
21
|
}
|
|
21
22
|
if (!msg || typeof msg !== "object" || !("op" in msg)) {
|
|
22
|
-
ctx.send(this.err(
|
|
23
|
+
ctx.send(this.err(errors_1.GlobalErrorCodes.BAD_MSG, "Invalid message"));
|
|
23
24
|
return;
|
|
24
25
|
}
|
|
25
26
|
if (msg.op === "ping") {
|
|
@@ -30,14 +31,14 @@ class WsRouter {
|
|
|
30
31
|
const topic = msg.topic;
|
|
31
32
|
const h = this.handlers.get(topic);
|
|
32
33
|
if (!h || !h.resize) {
|
|
33
|
-
ctx.send(this.err(
|
|
34
|
+
ctx.send(this.err(errors_1.GlobalErrorCodes.OP_NOT_SUPPORTED, `resize not supported on topic: ${String(topic)}`, { topic }));
|
|
34
35
|
return;
|
|
35
36
|
}
|
|
36
37
|
try {
|
|
37
38
|
return void h.resize(ctx, msg);
|
|
38
39
|
}
|
|
39
40
|
catch (e) {
|
|
40
|
-
ctx.send(this.err(
|
|
41
|
+
ctx.send(this.err(errors_1.GlobalErrorCodes.HANDLER_FAILED, e?.message ?? "handler failed", { topic, op: msg.op }));
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
44
|
}
|
|
@@ -45,7 +46,7 @@ class WsRouter {
|
|
|
45
46
|
const topic = msg.topic;
|
|
46
47
|
const h = this.handlers.get(topic);
|
|
47
48
|
if (!h) {
|
|
48
|
-
ctx.send(this.err(
|
|
49
|
+
ctx.send(this.err(errors_1.GlobalErrorCodes.TOPIC_NOT_FOUND, `Unknown topic: ${String(topic)}`, { topic }));
|
|
49
50
|
return;
|
|
50
51
|
}
|
|
51
52
|
try {
|
|
@@ -54,11 +55,11 @@ class WsRouter {
|
|
|
54
55
|
return void h.unsub(ctx, msg);
|
|
55
56
|
}
|
|
56
57
|
catch (e) {
|
|
57
|
-
ctx.send(this.err(
|
|
58
|
+
ctx.send(this.err(errors_1.GlobalErrorCodes.HANDLER_FAILED, e?.message ?? "handler failed", { topic, op: msg.op }));
|
|
58
59
|
}
|
|
59
60
|
return;
|
|
60
61
|
}
|
|
61
|
-
ctx.send(this.err(
|
|
62
|
+
ctx.send(this.err(errors_1.GlobalErrorCodes.OP_NOT_FOUND, `Unknown op: ${msg.op}`));
|
|
62
63
|
}
|
|
63
64
|
err(code, message, details) {
|
|
64
65
|
return { op: "error", code, message, details, ts: Date.now() };
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.apiClientCollectionsRoutes = apiClientCollectionsRoutes;
|
|
4
4
|
const api_1 = require("@yinuo-ngm/api");
|
|
5
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
6
|
+
const errors_2 = require("@yinuo-ngm/errors");
|
|
5
7
|
function assertProjectScope(scope, projectId) {
|
|
6
8
|
if (scope === "project" && !projectId)
|
|
7
|
-
throw new
|
|
9
|
+
throw new errors_2.GlobalError(errors_2.GlobalErrorCodes.BAD_REQUEST, "projectId is required when scope=project");
|
|
8
10
|
}
|
|
9
11
|
function now() { return Date.now(); }
|
|
10
12
|
async function apiClientCollectionsRoutes(fastify) {
|
|
@@ -52,7 +54,7 @@ async function apiClientCollectionsRoutes(fastify) {
|
|
|
52
54
|
await api.saveCollection(entity, scope, body.projectId);
|
|
53
55
|
return entity;
|
|
54
56
|
});
|
|
55
|
-
fastify.post("/:id", async (req
|
|
57
|
+
fastify.post("/:id", async (req) => {
|
|
56
58
|
const params = req.params;
|
|
57
59
|
const q = req.query;
|
|
58
60
|
const body = req.body;
|
|
@@ -60,7 +62,7 @@ async function apiClientCollectionsRoutes(fastify) {
|
|
|
60
62
|
assertProjectScope(scope, q.projectId);
|
|
61
63
|
const old = await api.getCollection(params.id, scope, q.projectId);
|
|
62
64
|
if (!old) {
|
|
63
|
-
|
|
65
|
+
throw new errors_1.ApiError(errors_1.ApiErrorCodes.API_COLLECTION_NOT_FOUND, `collection not found: ${params.id}`);
|
|
64
66
|
}
|
|
65
67
|
const ts = now();
|
|
66
68
|
const next = {
|
|
@@ -73,7 +75,7 @@ async function apiClientCollectionsRoutes(fastify) {
|
|
|
73
75
|
await api.saveCollection(next, scope, q.projectId);
|
|
74
76
|
return next;
|
|
75
77
|
});
|
|
76
|
-
fastify.delete("/:id", async (req
|
|
78
|
+
fastify.delete("/:id", async (req) => {
|
|
77
79
|
const params = req.params;
|
|
78
80
|
const q = req.query;
|
|
79
81
|
const scope = (q.scope ?? "project");
|
|
@@ -81,12 +83,12 @@ async function apiClientCollectionsRoutes(fastify) {
|
|
|
81
83
|
const allCols = await api.listCollections(scope, q.projectId);
|
|
82
84
|
const hasChildCol = allCols.some(c => (c.parentId ?? null) === params.id);
|
|
83
85
|
if (hasChildCol) {
|
|
84
|
-
|
|
86
|
+
throw new errors_1.ApiError(errors_1.ApiErrorCodes.API_COLLECTION_NOT_EMPTY, "collection has child collections");
|
|
85
87
|
}
|
|
86
88
|
const reqs = await api.listRequests(scope, q.projectId);
|
|
87
89
|
const hasReq = reqs.some((r) => (r.collectionId ?? null) === params.id);
|
|
88
90
|
if (hasReq) {
|
|
89
|
-
|
|
91
|
+
throw new errors_1.ApiError(errors_1.ApiErrorCodes.API_COLLECTION_NOT_EMPTY, "collection has requests");
|
|
90
92
|
}
|
|
91
93
|
await api.deleteCollection(params.id, scope, q.projectId);
|
|
92
94
|
return { ok: true };
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.apiClientEnvsRoutes = apiClientEnvsRoutes;
|
|
4
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
4
5
|
function parseScope(q) {
|
|
5
6
|
const scope = (q?.scope ?? "project");
|
|
6
7
|
const projectId = q?.projectId;
|
|
7
8
|
if (scope === "project" && !projectId) {
|
|
8
|
-
throw new
|
|
9
|
+
throw new errors_1.GlobalError(errors_1.GlobalErrorCodes.BAD_REQUEST, "projectId is required when scope=project");
|
|
9
10
|
}
|
|
10
11
|
return { scope, projectId };
|
|
11
12
|
}
|
|
@@ -29,9 +30,9 @@ async function apiClientEnvsRoutes(fastify) {
|
|
|
29
30
|
const body = req.body;
|
|
30
31
|
const scope = body?.scope ?? "project";
|
|
31
32
|
if (scope === "project" && !body.projectId)
|
|
32
|
-
throw new
|
|
33
|
+
throw new errors_1.GlobalError(errors_1.GlobalErrorCodes.BAD_REQUEST, "projectId is required when scope=project");
|
|
33
34
|
if (!body?.env?.id)
|
|
34
|
-
throw new
|
|
35
|
+
throw new errors_1.GlobalError(errors_1.GlobalErrorCodes.BAD_REQUEST, "env.id is required");
|
|
35
36
|
await env.saveEnv(body.env, scope, body.projectId);
|
|
36
37
|
return { id: body.env.id };
|
|
37
38
|
});
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.apiClientHistoryRoutes = apiClientHistoryRoutes;
|
|
4
|
+
const errors_1 = require("@yinuo-ngm/errors");
|
|
4
5
|
function parseScope(q) {
|
|
5
6
|
const scope = (q?.scope ?? "project");
|
|
6
7
|
const projectId = q?.projectId;
|
|
7
8
|
if (scope === "project" && !projectId)
|
|
8
|
-
throw new
|
|
9
|
+
throw new errors_1.GlobalError(errors_1.GlobalErrorCodes.BAD_REQUEST, "projectId is required when scope=project");
|
|
9
10
|
return { scope, projectId };
|
|
10
11
|
}
|
|
11
12
|
function parseNum(v, fallback) {
|
|
@@ -24,7 +25,7 @@ async function apiClientHistoryRoutes(fastify) {
|
|
|
24
25
|
const body = req.body;
|
|
25
26
|
const scope = body?.scope ?? "project";
|
|
26
27
|
if (scope === "project" && !body.projectId)
|
|
27
|
-
throw new
|
|
28
|
+
throw new errors_1.GlobalError(errors_1.GlobalErrorCodes.BAD_REQUEST, "projectId is required when scope=project");
|
|
28
29
|
const removed = await api.purgeHistory({
|
|
29
30
|
scope,
|
|
30
31
|
projectId: body.projectId,
|