@jayfong/x-server 2.119.0 → 3.1.1

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 (288) hide show
  1. package/lib/_virtual/_rolldown/runtime.mjs +4 -0
  2. package/lib/cli/api_generator.d.mts +75 -0
  3. package/lib/cli/api_generator.mjs +334 -0
  4. package/lib/cli/build_util.d.mts +15 -0
  5. package/lib/cli/build_util.mjs +101 -0
  6. package/lib/cli/cli.d.mts +1 -0
  7. package/lib/cli/cli.mjs +345 -0
  8. package/lib/cli/css_register.d.mts +1 -0
  9. package/lib/cli/css_register.mjs +7 -0
  10. package/lib/cli/deploy_util.d.mts +23 -0
  11. package/lib/cli/deploy_util.mjs +70 -0
  12. package/lib/cli/dev_util.d.mts +9 -0
  13. package/lib/cli/dev_util.mjs +25 -0
  14. package/lib/cli/env_util.d.mts +45 -0
  15. package/lib/cli/env_util.mjs +207 -0
  16. package/lib/cli/template_util.d.mts +18 -0
  17. package/lib/cli/template_util.mjs +85 -0
  18. package/lib/cli/templates/crons.ts +1 -1
  19. package/lib/cli/templates/handlers.ts +1 -1
  20. package/lib/cli/templates/hooks.ts +1 -1
  21. package/lib/cli/templates/models.ts +7 -7
  22. package/lib/cli/templates/package.json +11 -1
  23. package/lib/cli/templates/routes.ts +2 -2
  24. package/lib/core/ctx_storage.d.mts +3 -0
  25. package/lib/core/ctx_storage.mjs +4 -0
  26. package/lib/core/define_bus.d.mts +37 -0
  27. package/lib/core/define_bus.mjs +12 -0
  28. package/lib/core/{define_cron.d.ts → define_cron.d.mts} +2 -2
  29. package/lib/core/define_cron.mjs +11 -0
  30. package/lib/core/{define_handler.d.ts → define_handler.d.mts} +19 -19
  31. package/lib/core/define_handler.mjs +44 -0
  32. package/lib/core/define_hook.d.mts +2 -0
  33. package/lib/core/define_hook.mjs +6 -0
  34. package/lib/core/define_server.d.mts +3 -0
  35. package/lib/core/define_server.mjs +8 -0
  36. package/lib/core/{define_task.d.ts → define_task.d.mts} +2 -2
  37. package/lib/core/define_task.mjs +106 -0
  38. package/lib/core/get_handler_url.d.mts +2 -0
  39. package/lib/core/get_handler_url.mjs +7 -0
  40. package/lib/core/handler.d.mts +16 -0
  41. package/lib/core/handler.mjs +132 -0
  42. package/lib/core/http_error.d.mts +2 -0
  43. package/lib/core/http_error.mjs +1 -0
  44. package/lib/core/http_header.d.mts +856 -0
  45. package/lib/core/http_header.mjs +860 -0
  46. package/lib/core/http_method.d.mts +3 -0
  47. package/lib/core/http_method.mjs +10 -0
  48. package/lib/core/http_redirect.d.mts +5 -0
  49. package/lib/core/http_redirect.mjs +10 -0
  50. package/lib/core/server.d.mts +20 -0
  51. package/lib/core/server.mjs +186 -0
  52. package/lib/core/types.d.mts +256 -0
  53. package/lib/exports.d.mts +46 -0
  54. package/lib/exports.mjs +46 -0
  55. package/lib/index.d.mts +48 -0
  56. package/lib/index.mjs +45 -0
  57. package/lib/plugins/base.d.mts +4 -0
  58. package/lib/plugins/compress.d.mts +12 -0
  59. package/lib/plugins/compress.mjs +15 -0
  60. package/lib/plugins/cookie.d.mts +12 -0
  61. package/lib/plugins/cookie.mjs +15 -0
  62. package/lib/plugins/cors.d.mts +22 -0
  63. package/lib/plugins/cors.mjs +34 -0
  64. package/lib/plugins/file_parser.d.mts +15 -0
  65. package/lib/plugins/file_parser.mjs +24 -0
  66. package/lib/plugins/form_body_parser.d.mts +12 -0
  67. package/lib/plugins/form_body_parser.mjs +15 -0
  68. package/lib/plugins/ws_parser.d.mts +12 -0
  69. package/lib/plugins/ws_parser.mjs +15 -0
  70. package/lib/plugins/xml_parser.d.mts +19 -0
  71. package/lib/plugins/xml_parser.mjs +40 -0
  72. package/lib/services/ai.d.mts +31 -0
  73. package/lib/services/ai.mjs +44 -0
  74. package/lib/services/base.d.mts +4 -0
  75. package/lib/services/base.mjs +1 -0
  76. package/lib/services/cache.d.mts +165 -0
  77. package/lib/services/cache.mjs +323 -0
  78. package/lib/services/captcha.d.mts +65 -0
  79. package/lib/services/captcha.mjs +61 -0
  80. package/lib/services/{crypto.js → crypto.d.mts} +19 -78
  81. package/lib/services/crypto.mjs +141 -0
  82. package/lib/services/db_value.d.mts +60 -0
  83. package/lib/services/db_value.mjs +64 -0
  84. package/lib/services/dingtalk.d.mts +39 -0
  85. package/lib/services/dingtalk.mjs +44 -0
  86. package/lib/services/dispose.d.mts +17 -0
  87. package/lib/services/dispose.mjs +18 -0
  88. package/lib/services/emoji.d.mts +10 -0
  89. package/lib/services/emoji.mjs +2025 -0
  90. package/lib/services/file_store.d.mts +49 -0
  91. package/lib/services/file_store.mjs +58 -0
  92. package/lib/services/html.d.mts +11 -0
  93. package/lib/services/html.mjs +12 -0
  94. package/lib/services/jwt.d.mts +33 -0
  95. package/lib/services/jwt.mjs +42 -0
  96. package/lib/services/log.d.mts +37 -0
  97. package/lib/services/log.mjs +99 -0
  98. package/lib/services/mail.d.mts +22 -0
  99. package/lib/services/mail.mjs +28 -0
  100. package/lib/services/pay.d.mts +123 -0
  101. package/lib/services/pay.mjs +157 -0
  102. package/lib/services/random.d.mts +27 -0
  103. package/lib/services/random.mjs +42 -0
  104. package/lib/services/rate_limit.d.mts +37 -0
  105. package/lib/services/rate_limit.mjs +40 -0
  106. package/lib/services/redis.d.mts +11 -0
  107. package/lib/services/redis.mjs +6 -0
  108. package/lib/services/sensitive_words.d.mts +29 -0
  109. package/lib/services/sensitive_words.mjs +37 -0
  110. package/lib/services/sms.d.mts +40 -0
  111. package/lib/services/sms.mjs +30238 -0
  112. package/lib/types/dto.d.mts +30 -0
  113. package/lib/types/dto.mjs +1 -0
  114. package/lib/x.d.mts +11 -0
  115. package/lib/x.mjs +21 -0
  116. package/lib/x_init.d.mts +1 -0
  117. package/lib/x_init.mjs +10 -0
  118. package/package.json +82 -32
  119. package/lib/_cjs/cli/api_generator.js +0 -458
  120. package/lib/_cjs/cli/build_util.js +0 -243
  121. package/lib/_cjs/cli/cli.js +0 -378
  122. package/lib/_cjs/cli/css_register.js +0 -7
  123. package/lib/_cjs/cli/deploy_util.js +0 -76
  124. package/lib/_cjs/cli/dev_util.js +0 -26
  125. package/lib/_cjs/cli/env_util.js +0 -252
  126. package/lib/_cjs/cli/esbuild_register.js +0 -7
  127. package/lib/_cjs/cli/template_util.js +0 -101
  128. package/lib/_cjs/cli/templates/crons.ts +0 -2
  129. package/lib/_cjs/cli/templates/handlers.ts +0 -3
  130. package/lib/_cjs/cli/templates/hooks.ts +0 -2
  131. package/lib/_cjs/cli/templates/models.ts +0 -123
  132. package/lib/_cjs/cli/templates/package.json +0 -3
  133. package/lib/_cjs/cli/templates/routes.ts +0 -68
  134. package/lib/_cjs/core/ctx_storage.js +0 -6
  135. package/lib/_cjs/core/define_bus.js +0 -31
  136. package/lib/_cjs/core/define_cron.js +0 -13
  137. package/lib/_cjs/core/define_handler.js +0 -56
  138. package/lib/_cjs/core/define_hook.js +0 -8
  139. package/lib/_cjs/core/define_server.js +0 -10
  140. package/lib/_cjs/core/define_task.js +0 -113
  141. package/lib/_cjs/core/get_handler_url.js +0 -11
  142. package/lib/_cjs/core/handler.js +0 -216
  143. package/lib/_cjs/core/http_error.js +0 -6
  144. package/lib/_cjs/core/http_header.js +0 -142
  145. package/lib/_cjs/core/http_method.js +0 -12
  146. package/lib/_cjs/core/http_redirect.js +0 -11
  147. package/lib/_cjs/core/server.js +0 -219
  148. package/lib/_cjs/core/types.js +0 -8
  149. package/lib/_cjs/exports.js +0 -273
  150. package/lib/_cjs/index.js +0 -15
  151. package/lib/_cjs/plugins/base.js +0 -3
  152. package/lib/_cjs/plugins/compress.js +0 -18
  153. package/lib/_cjs/plugins/cookie.js +0 -18
  154. package/lib/_cjs/plugins/cors.js +0 -38
  155. package/lib/_cjs/plugins/file_parser.js +0 -28
  156. package/lib/_cjs/plugins/form_body_parser.js +0 -18
  157. package/lib/_cjs/plugins/ws_parser.js +0 -18
  158. package/lib/_cjs/plugins/xml_parser.js +0 -48
  159. package/lib/_cjs/services/ai.js +0 -48
  160. package/lib/_cjs/services/base.js +0 -3
  161. package/lib/_cjs/services/cache.js +0 -400
  162. package/lib/_cjs/services/captcha.js +0 -78
  163. package/lib/_cjs/services/crypto.js +0 -175
  164. package/lib/_cjs/services/db_value.js +0 -77
  165. package/lib/_cjs/services/dingtalk.js +0 -51
  166. package/lib/_cjs/services/dispose.js +0 -23
  167. package/lib/_cjs/services/emoji.js +0 -2034
  168. package/lib/_cjs/services/file_store.js +0 -67
  169. package/lib/_cjs/services/html.js +0 -17
  170. package/lib/_cjs/services/jwt.js +0 -65
  171. package/lib/_cjs/services/log.js +0 -108
  172. package/lib/_cjs/services/mail.js +0 -31
  173. package/lib/_cjs/services/pay.js +0 -191
  174. package/lib/_cjs/services/random.js +0 -51
  175. package/lib/_cjs/services/rate_limit.js +0 -54
  176. package/lib/_cjs/services/redis.js +0 -12
  177. package/lib/_cjs/services/sensitive_words.js +0 -61
  178. package/lib/_cjs/services/sms.js +0 -84
  179. package/lib/_cjs/types/dto.js +0 -3
  180. package/lib/_cjs/x.js +0 -35
  181. package/lib/cli/api_generator.d.ts +0 -74
  182. package/lib/cli/api_generator.js +0 -452
  183. package/lib/cli/build_util.d.ts +0 -17
  184. package/lib/cli/build_util.js +0 -236
  185. package/lib/cli/cli.d.ts +0 -2
  186. package/lib/cli/cli.js +0 -374
  187. package/lib/cli/css_register.js +0 -5
  188. package/lib/cli/deploy_util.d.ts +0 -23
  189. package/lib/cli/deploy_util.js +0 -70
  190. package/lib/cli/dev_util.d.ts +0 -8
  191. package/lib/cli/dev_util.js +0 -20
  192. package/lib/cli/env_util.d.ts +0 -45
  193. package/lib/cli/env_util.js +0 -246
  194. package/lib/cli/esbuild_register.js +0 -5
  195. package/lib/cli/template_util.d.ts +0 -18
  196. package/lib/cli/template_util.js +0 -95
  197. package/lib/core/ctx_storage.d.ts +0 -3
  198. package/lib/core/ctx_storage.js +0 -2
  199. package/lib/core/define_bus.d.ts +0 -37
  200. package/lib/core/define_bus.js +0 -27
  201. package/lib/core/define_cron.js +0 -9
  202. package/lib/core/define_handler.js +0 -48
  203. package/lib/core/define_hook.d.ts +0 -2
  204. package/lib/core/define_hook.js +0 -4
  205. package/lib/core/define_server.d.ts +0 -3
  206. package/lib/core/define_server.js +0 -6
  207. package/lib/core/define_task.js +0 -107
  208. package/lib/core/get_handler_url.d.ts +0 -2
  209. package/lib/core/get_handler_url.js +0 -7
  210. package/lib/core/handler.d.ts +0 -16
  211. package/lib/core/handler.js +0 -209
  212. package/lib/core/http_error.d.ts +0 -2
  213. package/lib/core/http_error.js +0 -2
  214. package/lib/core/http_header.d.ts +0 -856
  215. package/lib/core/http_header.js +0 -139
  216. package/lib/core/http_method.d.ts +0 -3
  217. package/lib/core/http_method.js +0 -8
  218. package/lib/core/http_redirect.d.ts +0 -5
  219. package/lib/core/http_redirect.js +0 -6
  220. package/lib/core/server.d.ts +0 -20
  221. package/lib/core/server.js +0 -213
  222. package/lib/core/types.d.ts +0 -265
  223. package/lib/core/types.js +0 -4
  224. package/lib/exports.d.ts +0 -45
  225. package/lib/exports.js +0 -47
  226. package/lib/index.d.ts +0 -2
  227. package/lib/index.js +0 -3
  228. package/lib/plugins/base.d.ts +0 -4
  229. package/lib/plugins/base.js +0 -1
  230. package/lib/plugins/compress.d.ts +0 -13
  231. package/lib/plugins/compress.js +0 -12
  232. package/lib/plugins/cookie.d.ts +0 -13
  233. package/lib/plugins/cookie.js +0 -12
  234. package/lib/plugins/cors.d.ts +0 -22
  235. package/lib/plugins/cors.js +0 -32
  236. package/lib/plugins/file_parser.d.ts +0 -16
  237. package/lib/plugins/file_parser.js +0 -22
  238. package/lib/plugins/form_body_parser.d.ts +0 -13
  239. package/lib/plugins/form_body_parser.js +0 -12
  240. package/lib/plugins/ws_parser.d.ts +0 -13
  241. package/lib/plugins/ws_parser.js +0 -12
  242. package/lib/plugins/xml_parser.d.ts +0 -19
  243. package/lib/plugins/xml_parser.js +0 -43
  244. package/lib/services/ai.d.ts +0 -31
  245. package/lib/services/ai.js +0 -43
  246. package/lib/services/base.d.ts +0 -4
  247. package/lib/services/base.js +0 -1
  248. package/lib/services/cache.d.ts +0 -173
  249. package/lib/services/cache.js +0 -394
  250. package/lib/services/captcha.d.ts +0 -65
  251. package/lib/services/captcha.js +0 -72
  252. package/lib/services/crypto.d.ts +0 -110
  253. package/lib/services/db_value.d.ts +0 -60
  254. package/lib/services/db_value.js +0 -72
  255. package/lib/services/dingtalk.d.ts +0 -39
  256. package/lib/services/dingtalk.js +0 -45
  257. package/lib/services/dispose.d.ts +0 -17
  258. package/lib/services/dispose.js +0 -17
  259. package/lib/services/emoji.d.ts +0 -10
  260. package/lib/services/emoji.js +0 -2029
  261. package/lib/services/file_store.d.ts +0 -49
  262. package/lib/services/file_store.js +0 -61
  263. package/lib/services/html.d.ts +0 -11
  264. package/lib/services/html.js +0 -12
  265. package/lib/services/jwt.d.ts +0 -34
  266. package/lib/services/jwt.js +0 -59
  267. package/lib/services/log.d.ts +0 -37
  268. package/lib/services/log.js +0 -102
  269. package/lib/services/mail.d.ts +0 -23
  270. package/lib/services/mail.js +0 -25
  271. package/lib/services/pay.d.ts +0 -123
  272. package/lib/services/pay.js +0 -185
  273. package/lib/services/random.d.ts +0 -27
  274. package/lib/services/random.js +0 -45
  275. package/lib/services/rate_limit.d.ts +0 -37
  276. package/lib/services/rate_limit.js +0 -49
  277. package/lib/services/redis.d.ts +0 -12
  278. package/lib/services/redis.js +0 -7
  279. package/lib/services/sensitive_words.d.ts +0 -29
  280. package/lib/services/sensitive_words.js +0 -56
  281. package/lib/services/sms.d.ts +0 -40
  282. package/lib/services/sms.js +0 -78
  283. package/lib/types/dto.d.ts +0 -86
  284. package/lib/types/dto.js +0 -1
  285. package/lib/x.d.ts +0 -17
  286. package/lib/x.js +0 -30
  287. /package/lib/{cli/css_register.d.ts → core/types.mjs} +0 -0
  288. /package/lib/{cli/esbuild_register.d.ts → plugins/base.mjs} +0 -0
package/lib/index.mjs ADDED
@@ -0,0 +1,45 @@
1
+ import { ctxStorage } from "./core/ctx_storage.mjs";
2
+ import { defineBus } from "./core/define_bus.mjs";
3
+ import { defineCron } from "./core/define_cron.mjs";
4
+ import { HttpError } from "./core/http_error.mjs";
5
+ import { DisposeService } from "./services/dispose.mjs";
6
+ import { HttpRedirect } from "./core/http_redirect.mjs";
7
+ import { x } from "./x.mjs";
8
+ import { HandlerMethodToHttpMethod } from "./core/http_method.mjs";
9
+ import { Server } from "./core/server.mjs";
10
+ import { Handler } from "./core/handler.mjs";
11
+ import { defineHandler, defineHandlerANY, defineHandlerFILE, defineHandlerGET, defineHandlerXML } from "./core/define_handler.mjs";
12
+ import { defineHook } from "./core/define_hook.mjs";
13
+ import { defineServer } from "./core/define_server.mjs";
14
+ import { defineSliceTask, defineTask } from "./core/define_task.mjs";
15
+ import { getHandlerUrl } from "./core/get_handler_url.mjs";
16
+ import { HttpRequestHeader, HttpResponseHeader } from "./core/http_header.mjs";
17
+ import { CompressPlugin } from "./plugins/compress.mjs";
18
+ import { CookiePlugin } from "./plugins/cookie.mjs";
19
+ import { CorsPlugin } from "./plugins/cors.mjs";
20
+ import { FileParserPlugin } from "./plugins/file_parser.mjs";
21
+ import { FormBodyParserPlugin } from "./plugins/form_body_parser.mjs";
22
+ import { WsParserPlugin } from "./plugins/ws_parser.mjs";
23
+ import { XmlParserPlugin } from "./plugins/xml_parser.mjs";
24
+ import { AiService } from "./services/ai.mjs";
25
+ import { CacheService } from "./services/cache.mjs";
26
+ import { CaptchaService } from "./services/captcha.mjs";
27
+ import { CryptoService } from "./services/crypto.mjs";
28
+ import { DbValueService } from "./services/db_value.mjs";
29
+ import { DingtalkService } from "./services/dingtalk.mjs";
30
+ import { EmojiService } from "./services/emoji.mjs";
31
+ import { FileStoreService } from "./services/file_store.mjs";
32
+ import { HtmlService } from "./services/html.mjs";
33
+ import { JwtService } from "./services/jwt.mjs";
34
+ import { LogService } from "./services/log.mjs";
35
+ import { MailService } from "./services/mail.mjs";
36
+ import { PayService } from "./services/pay.mjs";
37
+ import { RandomService } from "./services/random.mjs";
38
+ import { RateLimitService } from "./services/rate_limit.mjs";
39
+ import { RedisService } from "./services/redis.mjs";
40
+ import { SensitiveWordsService } from "./services/sensitive_words.mjs";
41
+ import { SmsService } from "./services/sms.mjs";
42
+ import "./x_init.mjs";
43
+ import "./exports.mjs";
44
+ export * from "@a/x/models";
45
+ export { AiService, CacheService, CaptchaService, CompressPlugin, CookiePlugin, CorsPlugin, CryptoService, DbValueService, DingtalkService, DisposeService, EmojiService, FileParserPlugin, FileStoreService, FormBodyParserPlugin, Handler, HandlerMethodToHttpMethod, HtmlService, HttpError, HttpRedirect, HttpRequestHeader, HttpResponseHeader, JwtService, LogService, MailService, PayService, RandomService, RateLimitService, RedisService, SensitiveWordsService, Server, SmsService, WsParserPlugin, XmlParserPlugin, ctxStorage, defineBus, defineCron, defineHandler, defineHandlerANY, defineHandlerFILE, defineHandlerGET, defineHandlerXML, defineHook, defineServer, defineSliceTask, defineTask, getHandlerUrl, x };
@@ -0,0 +1,4 @@
1
+ import { FastifyInstance } from "fastify";
2
+ export interface BasePlugin {
3
+ readonly register: (fastify: FastifyInstance<any, any, any, any, any>) => void;
4
+ }
@@ -0,0 +1,12 @@
1
+ import { BasePlugin } from "./base.mjs";
2
+ import { FastifyInstance } from "fastify";
3
+ import { FastifyCompressOptions } from "@fastify/compress";
4
+ export interface CompressPluginOptions extends FastifyCompressOptions {}
5
+ /**
6
+ * 响应压缩插件
7
+ */
8
+ export declare class CompressPlugin implements BasePlugin {
9
+ private options?;
10
+ constructor(options?: CompressPluginOptions | undefined);
11
+ register(fastify: FastifyInstance<any, any, any, any, any>): void;
12
+ }
@@ -0,0 +1,15 @@
1
+ import FastifyCompress from "@fastify/compress";
2
+ // src/plugins/compress.ts
3
+ /**
4
+ * 响应压缩插件
5
+ */
6
+ var CompressPlugin = class {
7
+ options;
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ register(fastify) {
12
+ fastify.register(FastifyCompress, this.options ?? {});
13
+ }
14
+ };
15
+ export { CompressPlugin };
@@ -0,0 +1,12 @@
1
+ import { BasePlugin } from "./base.mjs";
2
+ import { FastifyInstance } from "fastify";
3
+ import { FastifyCookieOptions } from "@fastify/cookie";
4
+ export interface CookiePluginOptions extends FastifyCookieOptions {}
5
+ /**
6
+ * Cookie 支持插件
7
+ */
8
+ export declare class CookiePlugin implements BasePlugin {
9
+ private options?;
10
+ constructor(options?: CookiePluginOptions | undefined);
11
+ register(fastify: FastifyInstance<any, any, any, any, any>): void;
12
+ }
@@ -0,0 +1,15 @@
1
+ import FastifyCookie from "@fastify/cookie";
2
+ // src/plugins/cookie.ts
3
+ /**
4
+ * Cookie 支持插件
5
+ */
6
+ var CookiePlugin = class {
7
+ options;
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ register(fastify) {
12
+ fastify.register(FastifyCookie, this.options ?? {});
13
+ }
14
+ };
15
+ export { CookiePlugin };
@@ -0,0 +1,22 @@
1
+ import { BasePlugin } from "./base.mjs";
2
+ import { MsValue } from "vtils";
3
+ import { FastifyInstance } from "fastify";
4
+ import { FastifyCorsOptions } from "@fastify/cors";
5
+ export interface CorsPluginOptions extends FastifyCorsOptions {
6
+ /**
7
+ * 允许的来源,支持位于开头的 * 通配符
8
+ */
9
+ allow: string[];
10
+ /**
11
+ * 预检请求缓存时长
12
+ */
13
+ ttl: MsValue;
14
+ }
15
+ /**
16
+ * CORS 支持插件
17
+ */
18
+ export declare class CorsPlugin implements BasePlugin {
19
+ private options;
20
+ constructor(options: CorsPluginOptions);
21
+ register(fastify: FastifyInstance<any, any, any, any, any>): void;
22
+ }
@@ -0,0 +1,34 @@
1
+ import { memoize, ms, omitStrict } from "vtils";
2
+ import FastifyCors from "@fastify/cors";
3
+ // src/plugins/cors.ts
4
+ /**
5
+ * CORS 支持插件
6
+ */
7
+ var CorsPlugin = class {
8
+ options;
9
+ constructor(options) {
10
+ this.options = options;
11
+ }
12
+ register(fastify) {
13
+ const allows = this.options.allow.map((item) => ({
14
+ type: item === "*" ? "all" : item.startsWith("*.") ? "endsWith" : "equal",
15
+ domain: item.startsWith("*.") ? item.replace("*.", ".") : item
16
+ }));
17
+ const allowAll = allows.length === 1 && allows[0].type === "all";
18
+ const check = memoize((origin) => {
19
+ let i = origin.indexOf(":");
20
+ let j = origin.indexOf(":", i + 1);
21
+ i += 3;
22
+ j = j === -1 ? origin.length : j;
23
+ const domain = origin.substring(i, j);
24
+ return allows.some((item) => item.type === "equal" ? domain === item.domain : domain.endsWith(item.domain));
25
+ });
26
+ fastify.register(FastifyCors, {
27
+ origin: (origin, cb) => allowAll ? cb(null, true) : cb(null, origin ? check(origin) : true),
28
+ maxAge: ms(this.options.ttl, true),
29
+ exposedHeaders: ["x-trace-id"],
30
+ ...omitStrict(this.options, ["allow", "ttl"])
31
+ });
32
+ }
33
+ };
34
+ export { CorsPlugin };
@@ -0,0 +1,15 @@
1
+ import { BasePlugin } from "./base.mjs";
2
+ import { FastifyInstance } from "fastify";
3
+ import { FastifyMultipartOptions, MultipartFile } from "@fastify/multipart";
4
+ export interface FileParserPluginOptions extends FastifyMultipartOptions {}
5
+ /**
6
+ * file 解析器插件
7
+ *
8
+ * 注意:默认文件大小限制 1MB
9
+ */
10
+ export declare class FileParserPlugin implements BasePlugin {
11
+ private options?;
12
+ constructor(options?: FileParserPluginOptions | undefined);
13
+ register(fastify: FastifyInstance<any, any, any, any, any>): void;
14
+ }
15
+ export type { MultipartFile };
@@ -0,0 +1,24 @@
1
+ import { bytes } from "vtils";
2
+ import FastifyMultipart from "@fastify/multipart";
3
+ // src/plugins/file_parser.ts
4
+ /**
5
+ * file 解析器插件
6
+ *
7
+ * 注意:默认文件大小限制 1MB
8
+ */
9
+ var FileParserPlugin = class {
10
+ options;
11
+ constructor(options) {
12
+ this.options = options;
13
+ }
14
+ register(fastify) {
15
+ fastify.register(FastifyMultipart, {
16
+ ...this.options,
17
+ limits: {
18
+ fileSize: bytes(1, "MB"),
19
+ ...this.options?.limits
20
+ }
21
+ });
22
+ }
23
+ };
24
+ export { FileParserPlugin };
@@ -0,0 +1,12 @@
1
+ import { BasePlugin } from "./base.mjs";
2
+ import { FastifyInstance } from "fastify";
3
+ import { FastifyFormbodyOptions } from "@fastify/formbody";
4
+ export interface FormBodyParserPluginOptions extends FastifyFormbodyOptions {}
5
+ /**
6
+ * POST application/x-www-form-urlencoded 解析器插件
7
+ */
8
+ export declare class FormBodyParserPlugin implements BasePlugin {
9
+ private options?;
10
+ constructor(options?: FormBodyParserPluginOptions | undefined);
11
+ register(fastify: FastifyInstance<any, any, any, any, any>): void;
12
+ }
@@ -0,0 +1,15 @@
1
+ import FastifyFormBody from "@fastify/formbody";
2
+ // src/plugins/form_body_parser.ts
3
+ /**
4
+ * POST application/x-www-form-urlencoded 解析器插件
5
+ */
6
+ var FormBodyParserPlugin = class {
7
+ options;
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ register(fastify) {
12
+ fastify.register(FastifyFormBody, this.options || {});
13
+ }
14
+ };
15
+ export { FormBodyParserPlugin };
@@ -0,0 +1,12 @@
1
+ import { BasePlugin } from "./base.mjs";
2
+ import { FastifyInstance } from "fastify";
3
+ import { WebsocketPluginOptions } from "@fastify/websocket";
4
+ export interface WsParserPluginOptions extends WebsocketPluginOptions {}
5
+ /**
6
+ * websocket 解析器插件
7
+ */
8
+ export declare class WsParserPlugin implements BasePlugin {
9
+ private options?;
10
+ constructor(options?: WsParserPluginOptions | undefined);
11
+ register(fastify: FastifyInstance<any, any, any, any, any>): void;
12
+ }
@@ -0,0 +1,15 @@
1
+ import FastifyWebsocket from "@fastify/websocket";
2
+ // src/plugins/ws_parser.ts
3
+ /**
4
+ * websocket 解析器插件
5
+ */
6
+ var WsParserPlugin = class {
7
+ options;
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ register(fastify) {
12
+ fastify.register(FastifyWebsocket, this.options ?? {});
13
+ }
14
+ };
15
+ export { WsParserPlugin };
@@ -0,0 +1,19 @@
1
+ import { BasePlugin } from "./base.mjs";
2
+ import { FastifyInstance } from "fastify";
3
+ import { X2jOptions } from "fast-xml-parser";
4
+ export interface XmlParserPluginOptions extends Partial<X2jOptions> {
5
+ /**
6
+ * 要处理的 `Content-Type`
7
+ */
8
+ contentType?: string | RegExp | string[];
9
+ }
10
+ /**
11
+ * XML 解析器插件
12
+ *
13
+ * 底层解析器是 [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
14
+ */
15
+ export declare class XmlParserPlugin implements BasePlugin {
16
+ private options?;
17
+ constructor(options?: XmlParserPluginOptions | undefined);
18
+ register(fastify: FastifyInstance<any, any, any, any, any>): void;
19
+ }
@@ -0,0 +1,40 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ // src/plugins/xml_parser.ts
3
+ /**
4
+ * XML 解析器插件
5
+ *
6
+ * 底层解析器是 [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
7
+ */
8
+ var XmlParserPlugin = class {
9
+ options;
10
+ constructor(options) {
11
+ this.options = options;
12
+ }
13
+ register(fastify) {
14
+ const { contentType = ["text/xml", "application/xml"], ...parseOptions } = this.options || {};
15
+ const xmlParser = new XMLParser(parseOptions);
16
+ fastify.addContentTypeParser(contentType, (_req, payload, done) => {
17
+ let body = "";
18
+ const handleError = (err) => done(err);
19
+ const handleData = (data) => body += data;
20
+ const handleEnd = () => {
21
+ let data;
22
+ let err;
23
+ try {
24
+ data = xmlParser.parse(body);
25
+ } catch (_err) {
26
+ err = _err;
27
+ }
28
+ payload.removeListener("error", handleError);
29
+ payload.removeListener("data", handleData);
30
+ payload.removeListener("end", handleEnd);
31
+ if (err) done(err);
32
+ else done(null, data);
33
+ };
34
+ payload.on("error", handleError);
35
+ payload.on("data", handleData);
36
+ payload.on("end", handleEnd);
37
+ });
38
+ }
39
+ };
40
+ export { XmlParserPlugin };
@@ -0,0 +1,31 @@
1
+ import { BaseService } from "./base.mjs";
2
+ import { PartialBy } from "vtils/types";
3
+ export type AiServiceOptions = {
4
+ /** 基础路径,如: https://dashscope.aliyuncs.com/compatible-mode/v1 */
5
+ baseUrl: string;
6
+ /** API密钥,如: sk-xxx */
7
+ apiKey: string;
8
+ /** 模型名称,如: deepseek-v3.1 */
9
+ model: string;
10
+ /** 额外请求头 */
11
+ headers?: Record<string, string>;
12
+ };
13
+ export type AiServiceAskPayload = AiServiceOptions & {
14
+ prompt?: string;
15
+ question: string;
16
+ };
17
+ export type AiServiceAskResult = {
18
+ answer: string;
19
+ };
20
+ export declare class AiService implements BaseService {
21
+ private options;
22
+ serviceName: string;
23
+ static ask(payload: AiServiceAskPayload): Promise<AiServiceAskResult>;
24
+ constructor(options: AiServiceOptions);
25
+ ask(payload: PartialBy<AiServiceAskPayload, keyof AiServiceOptions>): Promise<AiServiceAskResult>;
26
+ }
27
+ declare module '../x.mjs' {
28
+ interface X {
29
+ ai: AiService;
30
+ }
31
+ }
@@ -0,0 +1,44 @@
1
+ import { xr } from "@jayfong/x-request";
2
+ import { ms } from "vtils";
3
+ // src/services/ai.ts
4
+ var AiService = class AiService {
5
+ options;
6
+ serviceName = "ai";
7
+ static async ask(payload) {
8
+ const res = await xr.postJson({
9
+ url: `${payload.baseUrl}/chat/completions`,
10
+ headers: {
11
+ Authorization: `Bearer ${payload.apiKey}`,
12
+ ...payload.headers
13
+ },
14
+ data: {
15
+ model: payload.model,
16
+ messages: [...payload.prompt ? [{
17
+ role: "system",
18
+ content: payload.prompt
19
+ }] : [], {
20
+ role: "user",
21
+ content: payload.question
22
+ }],
23
+ stream: false
24
+ },
25
+ timeoutMs: ms("1m"),
26
+ noThrowHttpErrors: true
27
+ });
28
+ if (res.status !== 200) {
29
+ console.error(res.data);
30
+ throw new Error(JSON.stringify(res.data));
31
+ }
32
+ return { answer: res.data.choices[0].message.content };
33
+ }
34
+ constructor(options) {
35
+ this.options = options;
36
+ }
37
+ ask(payload) {
38
+ return AiService.ask({
39
+ ...this.options,
40
+ ...payload
41
+ });
42
+ }
43
+ };
44
+ export { AiService };
@@ -0,0 +1,4 @@
1
+ export interface BaseService {
2
+ /** 服务名称 */
3
+ readonly serviceName: string;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,165 @@
1
+ import { BaseService } from "./base.mjs";
2
+ import { MsValue } from "vtils";
3
+ import { AsyncOrSync, IsEmptyArray } from "vtils/types";
4
+ export interface CacheSerializer {
5
+ stringify(value: unknown): string;
6
+ parse<T>(value: string): T;
7
+ }
8
+ export interface CacheServiceOptions {
9
+ /** 默认过期时间 */
10
+ ttl: MsValue;
11
+ /**
12
+ * 启用内存缓存
13
+ *
14
+ * - `true` 表示启用内存缓存
15
+ * - `'only'` 表示仅使用内存缓存,不使用 Redis
16
+ */
17
+ memory?: boolean | 'only';
18
+ /**
19
+ * 序列化工具
20
+ *
21
+ * - `'nativeJson'` 使用原生 JSON 进行序列化和反序列化(默认)
22
+ * - `'superJson'` 使用 SuperJson 进行序列化和反序列化,支持更多数据类型(比如Date、RegExp等)但性能较原生 JSON 略差
23
+ * - 也可直接传入自定义 `{ stringify, parse }`
24
+ */
25
+ serializer?: 'nativeJson' | 'superJson' | CacheSerializer;
26
+ }
27
+ type Data = { [K in string]: (...args: any[]) => any; };
28
+ type Key<T extends Data> = keyof T;
29
+ type KeyPath<T extends Data> = { [K in keyof T]: T[K] extends ((...args: infer X) => any) ? IsEmptyArray<X> extends true ? K : [K, ...X] : never; }[keyof T];
30
+ type KeyPathForNumberValue<T extends Data> = { [K in keyof T]: T[K] extends ((...args: infer X) => number) ? IsEmptyArray<X> extends true ? K : [K, ...X] : never; }[keyof T];
31
+ type Value<T extends Data, P extends KeyPath<T>> = ReturnType<T[P extends any[] ? P[0] : P]>;
32
+ type KeyPartialPath<T extends Data> = { [K in keyof T]: T[K] extends ((...args: infer X) => any) ? IsEmptyArray<X> extends true ? K : [K, ...Partial<X>] : never; }[keyof T];
33
+ type CacheSetTTL<V> = MsValue | ((data: V, defaultTTL: MsValue) => MsValue);
34
+ type CacheSetOptions<V> = CacheSetTTL<V> | {
35
+ ttl?: CacheSetTTL<V>;
36
+ };
37
+ export declare class CacheService<TData extends Data = Data, TKey extends Key<TData> = any, TKeyPath extends KeyPath<TData> = any, TKeyPathForNumberValue extends KeyPathForNumberValue<TData> = any, TKeyPartialPath extends KeyPartialPath<TData> = any> implements BaseService {
38
+ options: CacheServiceOptions;
39
+ serviceName: string;
40
+ private prefix;
41
+ private hasMemoryCache;
42
+ private hasMemoryCacheOnly;
43
+ private memoryCache;
44
+ private serializer;
45
+ constructor(options: CacheServiceOptions);
46
+ private toRedisKey;
47
+ private serialize;
48
+ private deserialize;
49
+ /**
50
+ * 设置缓存内容。对象类内容尽量避免使用,以免造成问题。
51
+ *
52
+ * @memory 支持
53
+ * @param key 键
54
+ * @param value 值
55
+ * @param ttlOrOptions 缓存时间或选项
56
+ * @returns 返回设置的缓存内容
57
+ */
58
+ set<K extends TKeyPath, V extends Value<TData, K>>(key: K, value: V, ttlOrOptions?: CacheSetOptions<V>): Promise<V>;
59
+ /**
60
+ * 存储值然后返回其对应的键,该键 URL 友好。
61
+ *
62
+ * @memory 支持
63
+ * @param value 值
64
+ * @param ttl 存活时间
65
+ */
66
+ save<T>(value: T | ((key: string) => AsyncOrSync<T>), ttl?: MsValue): Promise<string>;
67
+ /**
68
+ * 获取缓存内容。
69
+ *
70
+ * @memory 支持
71
+ * @param key 键
72
+ * @param options 选项
73
+ * @returns 返回获取到的缓存内容
74
+ */
75
+ get<K extends TKeyPath, V extends Value<TData, K>>(key: K): Promise<V | null>;
76
+ /**
77
+ * 获取多个缓存内容。
78
+ *
79
+ * @memory 支持
80
+ * @param keys 键
81
+ * @returns 返回获取到的缓存内容
82
+ */
83
+ getMany<K extends TKeyPath, V extends Value<TData, K>>(...keys: K[]): Promise<Array<V | null>>;
84
+ /**
85
+ * 获取距离过期时间的毫秒数(未设置过期时间返回-1,键不存在返回-2)。
86
+ * memory=only 模式下内存缓存无 TTL 概念,始终返回-1。
87
+ *
88
+ * @memory 支持
89
+ * @param key 键
90
+ * @returns 返回距离过期时间的毫秒数
91
+ */
92
+ ttl<K extends TKeyPath>(key: K): Promise<number>;
93
+ /**
94
+ * 缓存内容。
95
+ *
96
+ * @memory 支持
97
+ * @param key 键
98
+ * @param action 获取缓存内容的操作
99
+ * @param ttlOrOptions 缓存时间或选项
100
+ * @returns 返回获取到的内容
101
+ */
102
+ remember<K extends TKeyPath, V extends Value<TData, K>>(key: K, action: () => V | Promise<V>, ttlOrOptions?: CacheSetOptions<V>): Promise<V>;
103
+ rememberMany<T, K extends TKeyPath, V extends Value<TData, K>>(raws: T[], key: (raw: T) => K, action: (raws: T[]) => V[] | Promise<V[]>, ttlOrOptions?: CacheSetOptions<V>): Promise<V[]>;
104
+ /**
105
+ * 自增。
106
+ *
107
+ * @memory 支持
108
+ * @param key 键
109
+ * @param increment 增量
110
+ */
111
+ increase<K extends TKeyPathForNumberValue>(key: K, increment?: number): Promise<number>;
112
+ /**
113
+ * 自减。
114
+ *
115
+ * @memory 支持
116
+ * @param key 键
117
+ * @param decrement 减量
118
+ */
119
+ decrease<K extends TKeyPathForNumberValue>(key: K, decrement?: number): Promise<number>;
120
+ /**
121
+ * 新增元素。
122
+ *
123
+ * @memory 支持
124
+ * @param key 键
125
+ * @param values 元素列表
126
+ */
127
+ push<K extends TKeyPath, V extends Value<TData, K>>(key: K, ...values: V[]): Promise<any>;
128
+ /**
129
+ * 从头部弹出元素并返回。
130
+ *
131
+ * @memory 支持
132
+ * @param key 键
133
+ * @param count 弹出元素个数
134
+ */
135
+ shift<K extends TKeyPath, V extends Value<TData, K>>(key: K, count?: number): Promise<V[]>;
136
+ /**
137
+ * 删除缓存。
138
+ *
139
+ * @memory 支持
140
+ * @param keys 键列表
141
+ */
142
+ remove<K extends TKeyPath>(...keys: K[]): Promise<number>;
143
+ /**
144
+ * 清空全部缓存。
145
+ *
146
+ * @memory 支持
147
+ */
148
+ clearAll(): Promise<number>;
149
+ /**
150
+ * 清空指定前缀的缓存。
151
+ *
152
+ * @memory 支持
153
+ */
154
+ clear(...prefixes: Array<TKey | TKeyPartialPath>): Promise<number>;
155
+ /**
156
+ * 派生出一个指定类型的缓存服务。
157
+ */
158
+ fork<TNextData extends Data>(options?: Partial<CacheServiceOptions>): CacheService<TNextData, Key<TNextData>, KeyPath<TNextData>, KeyPathForNumberValue<TNextData>, KeyPartialPath<TNextData>>;
159
+ }
160
+ declare module '../x.mjs' {
161
+ interface X {
162
+ cache: CacheService;
163
+ }
164
+ }
165
+ export {};