@yinuo-ngm/server 1.0.16 → 1.0.17

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.
Files changed (118) hide show
  1. package/lib/app.js +3 -15
  2. package/lib/common/editor.js +2 -2
  3. package/lib/env.d.ts +1 -0
  4. package/lib/env.js +1 -0
  5. package/lib/plugins/error-handler.plugin.d.ts +2 -2
  6. package/lib/plugins/error-handler.plugin.js +97 -93
  7. package/lib/plugins/ws/topics/nginx.ws.js +2 -1
  8. package/lib/plugins/ws/topics/svn.ws.d.ts +2 -1
  9. package/lib/plugins/ws/topics/svn.ws.js +3 -2
  10. package/lib/plugins/ws/topics/syslog.ws.d.ts +1 -1
  11. package/lib/plugins/ws/topics/task.ws.d.ts +2 -1
  12. package/lib/plugins/ws/topics/task.ws.js +2 -1
  13. package/lib/plugins/ws/ws.context.d.ts +1 -1
  14. package/lib/plugins/ws/ws.plugin.js +4 -3
  15. package/lib/plugins/ws/ws.router.d.ts +2 -2
  16. package/lib/plugins/ws/ws.router.js +8 -7
  17. package/lib/routes/api-client/collection.routes.js +8 -6
  18. package/lib/routes/api-client/env.routes.js +4 -3
  19. package/lib/routes/api-client/history.routes.js +3 -2
  20. package/lib/routes/api-client/hub-token.routes.js +11 -11
  21. package/lib/routes/api-client/request.routes.js +7 -6
  22. package/lib/routes/api-client/send.routes.js +3 -2
  23. package/lib/routes/config.routes.js +5 -5
  24. package/lib/routes/hub.routes.js +10 -10
  25. package/lib/routes/nginx/nginx-lifecycle.routes.js +4 -0
  26. package/lib/routes/nginx/nginx-route.context.js +23 -7
  27. package/lib/routes/nginx/nginx-server.routes.js +158 -6
  28. package/lib/routes/node-version.routes.js +7 -7
  29. package/lib/routes/project.routes.js +9 -9
  30. package/lib/routes/rss.routes.js +3 -3
  31. package/lib/routes/sprite-browse.routes.js +2 -1
  32. package/lib/routes/sprite.routes.js +3 -3
  33. package/lib/routes/static-files.routes.js +7 -7
  34. package/lib/routes/svn.routes.js +5 -3
  35. package/lib/routes/system.routes.js +20 -1
  36. package/lib/routes/task.routes.js +4 -4
  37. package/package.json +13 -6
  38. package/www/3rdpartylicenses.txt +52 -52
  39. package/www/browser/chunk-2L7NUOMX.js +2 -0
  40. package/www/browser/chunk-2NZJ7CN2.js +20 -0
  41. package/www/browser/{chunk-SPRWNZHF.js → chunk-3CM4SKDO.js} +2 -2
  42. package/www/browser/{chunk-EEVPZGEY.js → chunk-3I7BQCXS.js} +1 -1
  43. package/www/browser/{chunk-DXF7BVK5.js → chunk-3M56F2S2.js} +1 -1
  44. package/www/browser/chunk-3OHBKMAA.js +1 -0
  45. package/www/browser/{chunk-4KETC6EB.js → chunk-3XNNQFWR.js} +1 -1
  46. package/www/browser/chunk-4BRW6LCZ.js +4 -0
  47. package/www/browser/{chunk-HGONFYP6.js → chunk-4LBSLURA.js} +1 -1
  48. package/www/browser/{chunk-BYEU6KGP.js → chunk-4X42HB6N.js} +1 -1
  49. package/www/browser/chunk-5DYX4DUX.js +11 -0
  50. package/www/browser/chunk-6SYVDN5L.js +1 -0
  51. package/www/browser/{chunk-XJ5KZQNN.js → chunk-6YYNHZ2A.js} +1 -1
  52. package/www/browser/{chunk-G2W3B7TJ.js → chunk-75W3GVSO.js} +1 -1
  53. package/www/browser/{chunk-76TVIB33.js → chunk-7U44RF5F.js} +1 -1
  54. package/www/browser/{chunk-WD4IAQR3.js → chunk-AELTP6YN.js} +1 -1
  55. package/www/browser/chunk-AMXRL4GR.js +1 -0
  56. package/www/browser/chunk-AV2ZODEH.js +1 -0
  57. package/www/browser/chunk-AZ6SIMYH.js +1 -0
  58. package/www/browser/chunk-B3C35ET3.js +2 -0
  59. package/www/browser/chunk-BTQIUVTQ.js +1 -0
  60. package/www/browser/chunk-CN5J4WNO.js +1 -0
  61. package/www/browser/{chunk-N4LRZJBP.js → chunk-D2ODDESN.js} +1 -1
  62. package/www/browser/{chunk-O2EYEF7J.js → chunk-DE6E23ET.js} +1 -1
  63. package/www/browser/{chunk-SVQWPHF5.js → chunk-DIJPUYIA.js} +1 -1
  64. package/www/browser/{chunk-SYCNSLAW.js → chunk-DLGJD6YU.js} +4 -4
  65. package/www/browser/{chunk-JHMEKUZ5.js → chunk-EEDA5U4V.js} +1 -1
  66. package/www/browser/chunk-FK6Z4HLL.js +1 -0
  67. package/www/browser/chunk-FL6GDGHW.js +1 -0
  68. package/www/browser/{chunk-HRXCR3IN.js → chunk-FXCG34QS.js} +1 -1
  69. package/www/browser/{chunk-UJOHBN2Y.js → chunk-H2USFIYR.js} +1 -1
  70. package/www/browser/chunk-H5HGMOE6.js +1 -0
  71. package/www/browser/chunk-HB3HECPD.js +1 -0
  72. package/www/browser/{chunk-INL2PELS.js → chunk-HDNG236Q.js} +1 -1
  73. package/www/browser/{chunk-WF2QTF5L.js → chunk-HJTXXSMC.js} +1 -1
  74. package/www/browser/{chunk-LQ5OXSW7.js → chunk-HUMCWAKJ.js} +1 -1
  75. package/www/browser/chunk-IKB3EQCP.js +2 -0
  76. package/www/browser/{chunk-TMX5TTV3.js → chunk-K7PESFPY.js} +1 -1
  77. package/www/browser/{chunk-T3KK7ZXB.js → chunk-KRYMOHYF.js} +1 -1
  78. package/www/browser/{chunk-SQQNR223.js → chunk-M4QRBV3K.js} +1 -1
  79. package/www/browser/chunk-N2PELLMM.js +30 -0
  80. package/www/browser/{chunk-ACAZUX6C.js → chunk-ONXBYGIG.js} +1 -1
  81. package/www/browser/{chunk-JZULA5JV.js → chunk-OSBDR36P.js} +1 -1
  82. package/www/browser/chunk-OZCK4XVV.js +1 -0
  83. package/www/browser/{chunk-GDWS2L66.js → chunk-QJP5F735.js} +1 -1
  84. package/www/browser/{chunk-2X3MRS27.js → chunk-RGOYDY7H.js} +1 -1
  85. package/www/browser/{chunk-B6MBYCXI.js → chunk-UJKK4A7Y.js} +1 -1
  86. package/www/browser/{chunk-ZNTJRLVH.js → chunk-WD2EKZQC.js} +1 -1
  87. package/www/browser/{chunk-L5D75AMV.js → chunk-WUA5JFDD.js} +1 -1
  88. package/www/browser/chunk-XLFHB7RS.js +3 -0
  89. package/www/browser/{chunk-JU3TEDBV.js → chunk-YNW4HEJO.js} +1 -1
  90. package/www/browser/{chunk-RW2JPJV7.js → chunk-ZTDLWBW5.js} +1 -1
  91. package/www/browser/index.html +1 -1
  92. package/www/browser/main-N64WJCHX.js +34 -0
  93. package/www/browser/chunk-2BZRE4G7.js +0 -1
  94. package/www/browser/chunk-5T5KA5PG.js +0 -1
  95. package/www/browser/chunk-6CGHNKJI.js +0 -1
  96. package/www/browser/chunk-7J24TP36.js +0 -1
  97. package/www/browser/chunk-CZ5AZ3VW.js +0 -1
  98. package/www/browser/chunk-DW7F5PEA.js +0 -1
  99. package/www/browser/chunk-HHBPULJW.js +0 -2
  100. package/www/browser/chunk-KVFR7GFV.js +0 -20
  101. package/www/browser/chunk-L7TMCSHV.js +0 -1
  102. package/www/browser/chunk-MVQTKINJ.js +0 -1
  103. package/www/browser/chunk-OMDHJIUB.js +0 -1
  104. package/www/browser/chunk-OWUAAOHW.js +0 -2
  105. package/www/browser/chunk-PIK5YPIB.js +0 -1
  106. package/www/browser/chunk-RHLQRQDK.js +0 -9
  107. package/www/browser/chunk-S3SJ4VVM.js +0 -11
  108. package/www/browser/chunk-SIVPP74B.js +0 -0
  109. package/www/browser/chunk-UFY3FLDK.js +0 -1
  110. package/www/browser/chunk-UQGCUFNM.js +0 -1
  111. package/www/browser/chunk-UXXWRMM6.js +0 -1
  112. package/www/browser/chunk-UZRJGJTD.js +0 -2
  113. package/www/browser/chunk-WI67LAOV.js +0 -4
  114. package/www/browser/chunk-WNCM6QKB.js +0 -1
  115. package/www/browser/chunk-YETDFSQE.js +0 -1
  116. package/www/browser/chunk-YMTC5GZK.js +0 -1
  117. package/www/browser/chunk-YVZHJ76K.js +0 -1
  118. 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
- console.log(`Logger initialized with level: ${level || "silent (disabled)"}`);
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() {
@@ -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 core_1 = require("@yinuo-ngm/core");
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 core_1.AppError("EDITOR_NOT_FOUND", errorMsg, { fileName, editor, folder, file, target }));
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
@@ -3,5 +3,6 @@ export declare const env: {
3
3
  host: string;
4
4
  dataDir: string;
5
5
  logLevel: string;
6
+ shutdownToken: string;
6
7
  sysLogCapacity: number;
7
8
  };
package/lib/env.js CHANGED
@@ -12,5 +12,6 @@ exports.env = {
12
12
  dataDir: process.env.NGM_DATA_DIR ||
13
13
  path_1.default.join(os_1.default.homedir(), ".ng-manager"),
14
14
  logLevel: process.env.NGM_LOG_LEVEL || "info",
15
+ shutdownToken: process.env.NGM_SHUTDOWN_TOKEN || "",
15
16
  sysLogCapacity: 3000,
16
17
  };
@@ -1,6 +1,6 @@
1
1
  import type { FastifyPluginAsync } from "fastify";
2
- import { type ErrorCode } from "@yinuo-ngm/core";
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 core_1 = require("@yinuo-ngm/core");
9
+ const errors_1 = require("@yinuo-ngm/errors");
10
10
  exports.ERROR_STATUS = {
11
- PROJECT_NOT_FOUND: 404,
12
- PROJECT_ROOT_INVALID: 400,
13
- PROJECT_ALREADY_EXISTS: 409,
14
- PROJECT_ID_REQUIRED: 400,
15
- PROJECT_IMPORT_NOT_EXISTS: 404,
16
- PROJECT_IMPORT_NOT_DIR: 400,
17
- PROJECT_IMPORT_ALREADY_REGISTERED: 409,
18
- PROJECT_IMPORT_NOT_RECOGNIZED: 422,
19
- PROJECT_IMPORT_SCAN_FAILED: 500,
20
- ASSET_NOT_FOUND: 404,
21
- ASSET_KIND_NOT_SUPPORTED: 400,
22
- ASSET_URL_REQUIRED: 400,
23
- ASSET_LABEL_REQUIRED: 400,
24
- ASSET_URL_INVALID: 400,
25
- ASSET_MODE_INVALID: 400,
26
- INVALID_NAME: 400,
27
- TARGET_EXISTS: 409,
28
- INVALID_REPO_URL: 400,
29
- INVALID_PARENT_DIR: 400,
30
- GIT_CHECKOUT_FAILED: 500,
31
- BOOTSTRAP_NOT_IN_PICK_STATE: 400,
32
- BOOTSTRAP_CTX_NOT_FOUND: 404,
33
- BOOTSTRAP_INVALID_PICKED_ROOT: 400,
34
- BOOTSTRAP_NOT_WAITING_PICK: 400,
35
- PROJECT_ANGULAR_JSON_INVALID: 400,
36
- PROJECT_ANGULAR_JSON_NOT_FOUND: 404,
37
- PROJECT_VITE_CONFIG_INVALID: 400,
38
- PROJECT_VUE_CONFIG_NOT_FOUND: 404,
39
- CONFIG_BACKUP_NOT_FOUND: 404,
40
- CONFIG_READ_FAILED: 500,
41
- CONFIG_WRITE_FAILED: 500,
42
- CONFIG_CONFLICT: 409,
43
- CONFIG_OPEN_FAILED: 500,
44
- CONFIG_SCHEMA_NOT_FOUND: 404,
45
- CONFIG_DOMAIN_NOT_FOUND: 404,
46
- CONFIG_DOC_NOT_FOUND: 404,
47
- TASK_NOT_FOUND: 404,
48
- TASK_ALREADY_RUNNING: 409,
49
- PROCESS_SPAWN_FAILED: 500,
50
- TASK_SPEC_NOT_FOUND: 404,
51
- TASK_NOT_RUNNABLE: 400,
52
- RUN_NOT_FOUND: 404,
53
- TASK_ID_REQUIRED: 400,
54
- COMMAND_NOT_FOUND: 404,
55
- BAD_JSON: 400,
56
- BAD_MSG: 400,
57
- OP_NOT_SUPPORTED: 400,
58
- HANDLER_FAILED: 500,
59
- TOPIC_NOT_FOUND: 404,
60
- OP_NOT_FOUND: 400,
61
- FS_PATH_NOT_FOUND: 404,
62
- FS_ALREADY_EXISTS: 409,
63
- FS_PERMISSION_DENIED: 403,
64
- FS_EXISTS_FAILED: 500,
65
- FS_INVALID_NAME: 400,
66
- FS_MKDIR_FAILED: 500,
67
- EDITOR_NOT_FOUND: 404,
68
- EDITOR_LAUNCH_FAILED: 500,
69
- STORAGE_IO_ERROR: 500,
70
- UNAUTHORIZED: 401,
71
- INVALID_TIMESTAMP: 400,
72
- DEP_INSTALL_FAILED: 500,
73
- DEP_UNINSTALL_FAILED: 500,
74
- DEP_NOT_FOUND: 404,
75
- DASHBOARD_CONFLICT: 409,
76
- WIDGET_NOT_FOUND: 404,
77
- WIDGET_LOCKED: 423,
78
- KILL_PORT_FAILED: 500,
79
- INVALID_PORT: 400,
80
- RSS_FETCH_FAILED: 500,
81
- INVALID_RSS_URL: 400,
82
- UNKNOWN_ERROR: 500,
83
- BAD_REQUEST: 400,
84
- NOT_IMPLEMENTED: 501,
85
- NOT_FOUND: 404,
86
- SVN_SYNC_ALREADY_RUNNING: 409,
87
- SVN_SYNC_FAILED: 500,
88
- SVN_SOURCE_ID_REQUIRED: 400,
89
- SPRITE_CONFIG_NOT_FOUND: 404,
90
- SPRITE_ICONS_ROOT_NOT_FOUND: 404,
91
- SPRITE_GROUP_NOT_FOUND: 404,
92
- NO_VERSION_MANAGER: 503,
93
- NO_AVAILABLE_VERSIONS: 409,
94
- VERSION_REQUIRED: 400,
95
- PROJECT_PATH_REQUIRED: 400,
96
- SWITCH_VERSION_FAILED: 500,
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 core_1.AppError || isCoreAppError(err)) {
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, "VALIDATION_ERROR", "参数不合法", err.validation));
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, "INTERNAL_ERROR", "服务异常,请稍后重试"));
133
+ return reply.status(500).send(buildErrorBody(requestId, errors_1.GlobalErrorCodes.UNKNOWN_ERROR, "服务异常,请稍后重试"));
130
134
  });
131
135
  });
132
- function isCoreAppError(err) {
133
- return err && typeof err === "object" && typeof err.code === "string" && typeof err.message === "string";
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: "BAD_MSG",
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 { SvnEventPayloadMap, SvnEventType, SvnRuntime } from "@yinuo-ngm/core";
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: "PROJECT_ID_REQUIRED", message: "projectId is required", ts: Date.now() });
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: "PROJECT_ID_REQUIRED", message: "projectId is required", ts: Date.now() });
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,4 @@
1
- import type { LogLine } from "@yinuo-ngm/core";
1
+ import type { LogLine } from "@yinuo-ngm/protocol";
2
2
  import { WsContext } from "../ws.context";
3
3
  import type { TopicHandler } from "../ws.router";
4
4
  export type SyslogWsDeps = {
@@ -1,4 +1,5 @@
1
- import type { TaskEventPayloadMap, TaskEventType, TaskOutputPayload, LogLine, TaskRuntime } from "@yinuo-ngm/core";
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: "TASK_ID_REQUIRED", message: "taskId is required", ts: Date.now() });
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));
@@ -1,4 +1,4 @@
1
- import type { WsServerMsg, WsTopic } from "@yinuo-ngm/core";
1
+ import type { WsServerMsg, WsTopic } from "@yinuo-ngm/protocol";
2
2
  export declare class WsContext {
3
3
  private socket;
4
4
  readonly connId: string;
@@ -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(core_1.Events.PROJECT_BOOTSTRAP_DONE, (e) => {
54
+ offs.push(events.on(bootstrap_1.BootstrapEvents.DONE, (e) => {
54
55
  taskHandler.pushEvent("bootstrapDone", e);
55
56
  }));
56
- offs.push(events.on(core_1.Events.PROJECT_BOOTSTRAP_FAILED, (e) => {
57
+ offs.push(events.on(bootstrap_1.BootstrapEvents.FAILED, (e) => {
57
58
  taskHandler.pushEvent("bootstrapFailed", e);
58
59
  }));
59
- offs.push(events.on(core_1.Events.PROJECT_BOOTSTRAP_NEED_PICK_ROOT, (e) => {
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/core";
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: any): undefined;
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("BAD_JSON", "Invalid JSON"));
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("BAD_MSG", "Invalid message"));
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("OP_NOT_SUPPORTED", `resize not supported on topic: ${String(topic)}`, { topic }));
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("HANDLER_FAILED", e?.message ?? "handler failed", { topic, op: msg.op }));
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("TOPIC_NOT_FOUND", `Unknown topic: ${String(topic)}`, { topic }));
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("HANDLER_FAILED", e?.message ?? "handler failed", { topic, op: msg.op }));
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("OP_NOT_FOUND", `Unknown op: ${msg.op}`));
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 Error("projectId is required when scope=project");
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, reply) => {
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
- return reply.code(404).send({ code: "COLLECTION_NOT_FOUND", message: `collection not found: ${params.id}` });
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, reply) => {
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
- return reply.code(409).send({ code: "COLLECTION_NOT_EMPTY", message: "collection has child collections" });
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
- return reply.code(409).send({ code: "COLLECTION_NOT_EMPTY", message: "collection has requests" });
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 Error("projectId is required when scope=project");
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 Error("projectId is required when scope=project");
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 Error("env.id is required");
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 Error("projectId is required when scope=project");
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 Error("projectId is required when scope=project");
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,