@jayfong/x-server 2.119.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/_virtual/_rolldown/runtime.mjs +4 -0
- package/lib/cli/api_generator.d.mts +74 -0
- package/lib/cli/api_generator.mjs +310 -0
- package/lib/cli/build_util.d.mts +17 -0
- package/lib/cli/build_util.mjs +156 -0
- package/lib/cli/cli.d.mts +1 -0
- package/lib/cli/cli.mjs +355 -0
- package/lib/cli/css_register.d.mts +1 -0
- package/lib/cli/css_register.mjs +7 -0
- package/lib/cli/deploy_util.d.mts +23 -0
- package/lib/cli/deploy_util.mjs +70 -0
- package/lib/cli/dev_util.d.mts +7 -0
- package/lib/cli/dev_util.mjs +25 -0
- package/lib/cli/env_util.d.mts +45 -0
- package/lib/cli/env_util.mjs +207 -0
- package/lib/cli/esbuild_register.d.mts +1 -0
- package/lib/cli/esbuild_register.mjs +7 -0
- package/lib/cli/template_util.d.mts +18 -0
- package/lib/cli/template_util.mjs +85 -0
- package/lib/cli/templates/crons.ts +1 -1
- package/lib/cli/templates/handlers.ts +1 -1
- package/lib/cli/templates/hooks.ts +1 -1
- package/lib/cli/templates/models.ts +7 -7
- package/lib/cli/templates/package.json +11 -1
- package/lib/cli/templates/routes.ts +2 -1
- package/lib/core/ctx_storage.d.mts +3 -0
- package/lib/core/ctx_storage.mjs +4 -0
- package/lib/core/define_bus.d.mts +37 -0
- package/lib/core/define_bus.mjs +12 -0
- package/lib/core/{define_cron.d.ts → define_cron.d.mts} +2 -2
- package/lib/core/define_cron.mjs +11 -0
- package/lib/core/{define_handler.d.ts → define_handler.d.mts} +19 -19
- package/lib/core/define_handler.mjs +44 -0
- package/lib/core/define_hook.d.mts +2 -0
- package/lib/core/define_hook.mjs +6 -0
- package/lib/core/define_server.d.mts +3 -0
- package/lib/core/define_server.mjs +8 -0
- package/lib/core/{define_task.d.ts → define_task.d.mts} +2 -2
- package/lib/core/define_task.mjs +102 -0
- package/lib/core/get_handler_url.d.mts +2 -0
- package/lib/core/get_handler_url.mjs +7 -0
- package/lib/core/handler.d.mts +16 -0
- package/lib/core/handler.mjs +132 -0
- package/lib/core/http_error.d.mts +2 -0
- package/lib/core/http_error.mjs +1 -0
- package/lib/core/http_header.d.mts +856 -0
- package/lib/core/http_header.mjs +860 -0
- package/lib/core/http_method.d.mts +3 -0
- package/lib/core/http_method.mjs +10 -0
- package/lib/core/http_redirect.d.mts +5 -0
- package/lib/core/http_redirect.mjs +10 -0
- package/lib/core/server.d.mts +20 -0
- package/lib/core/server.mjs +186 -0
- package/lib/core/types.d.mts +256 -0
- package/lib/exports.d.mts +46 -0
- package/lib/exports.mjs +46 -0
- package/lib/index.d.mts +48 -0
- package/lib/index.mjs +45 -0
- package/lib/plugins/base.d.mts +4 -0
- package/lib/plugins/compress.d.mts +12 -0
- package/lib/plugins/compress.mjs +15 -0
- package/lib/plugins/cookie.d.mts +12 -0
- package/lib/plugins/cookie.mjs +15 -0
- package/lib/plugins/cors.d.mts +22 -0
- package/lib/plugins/cors.mjs +34 -0
- package/lib/plugins/file_parser.d.mts +15 -0
- package/lib/plugins/file_parser.mjs +24 -0
- package/lib/plugins/form_body_parser.d.mts +12 -0
- package/lib/plugins/form_body_parser.mjs +15 -0
- package/lib/plugins/ws_parser.d.mts +12 -0
- package/lib/plugins/ws_parser.mjs +15 -0
- package/lib/plugins/xml_parser.d.mts +19 -0
- package/lib/plugins/xml_parser.mjs +40 -0
- package/lib/services/ai.d.mts +31 -0
- package/lib/services/ai.mjs +44 -0
- package/lib/services/base.d.mts +4 -0
- package/lib/services/base.mjs +1 -0
- package/lib/services/cache.d.mts +165 -0
- package/lib/services/cache.mjs +323 -0
- package/lib/services/captcha.d.mts +65 -0
- package/lib/services/captcha.mjs +61 -0
- package/lib/services/{crypto.js → crypto.d.mts} +19 -78
- package/lib/services/crypto.mjs +141 -0
- package/lib/services/db_value.d.mts +60 -0
- package/lib/services/db_value.mjs +64 -0
- package/lib/services/dingtalk.d.mts +39 -0
- package/lib/services/dingtalk.mjs +44 -0
- package/lib/services/dispose.d.mts +17 -0
- package/lib/services/dispose.mjs +18 -0
- package/lib/services/emoji.d.mts +10 -0
- package/lib/services/emoji.mjs +2025 -0
- package/lib/services/file_store.d.mts +49 -0
- package/lib/services/file_store.mjs +58 -0
- package/lib/services/html.d.mts +11 -0
- package/lib/services/html.mjs +12 -0
- package/lib/services/jwt.d.mts +33 -0
- package/lib/services/jwt.mjs +42 -0
- package/lib/services/log.d.mts +37 -0
- package/lib/services/log.mjs +99 -0
- package/lib/services/mail.d.mts +22 -0
- package/lib/services/mail.mjs +28 -0
- package/lib/services/pay.d.mts +123 -0
- package/lib/services/pay.mjs +157 -0
- package/lib/services/random.d.mts +27 -0
- package/lib/services/random.mjs +42 -0
- package/lib/services/rate_limit.d.mts +37 -0
- package/lib/services/rate_limit.mjs +40 -0
- package/lib/services/redis.d.mts +11 -0
- package/lib/services/redis.mjs +6 -0
- package/lib/services/sensitive_words.d.mts +29 -0
- package/lib/services/sensitive_words.mjs +37 -0
- package/lib/services/sms.d.mts +40 -0
- package/lib/services/sms.mjs +30238 -0
- package/lib/types/dto.d.mts +30 -0
- package/lib/types/dto.mjs +1 -0
- package/lib/x.d.mts +11 -0
- package/lib/x.mjs +21 -0
- package/lib/x_init.d.mts +1 -0
- package/lib/x_init.mjs +10 -0
- package/package.json +71 -16
- package/lib/_cjs/cli/api_generator.js +0 -458
- package/lib/_cjs/cli/build_util.js +0 -243
- package/lib/_cjs/cli/cli.js +0 -378
- package/lib/_cjs/cli/css_register.js +0 -7
- package/lib/_cjs/cli/deploy_util.js +0 -76
- package/lib/_cjs/cli/dev_util.js +0 -26
- package/lib/_cjs/cli/env_util.js +0 -252
- package/lib/_cjs/cli/esbuild_register.js +0 -7
- package/lib/_cjs/cli/template_util.js +0 -101
- package/lib/_cjs/cli/templates/crons.ts +0 -2
- package/lib/_cjs/cli/templates/handlers.ts +0 -3
- package/lib/_cjs/cli/templates/hooks.ts +0 -2
- package/lib/_cjs/cli/templates/models.ts +0 -123
- package/lib/_cjs/cli/templates/package.json +0 -3
- package/lib/_cjs/cli/templates/routes.ts +0 -68
- package/lib/_cjs/core/ctx_storage.js +0 -6
- package/lib/_cjs/core/define_bus.js +0 -31
- package/lib/_cjs/core/define_cron.js +0 -13
- package/lib/_cjs/core/define_handler.js +0 -56
- package/lib/_cjs/core/define_hook.js +0 -8
- package/lib/_cjs/core/define_server.js +0 -10
- package/lib/_cjs/core/define_task.js +0 -113
- package/lib/_cjs/core/get_handler_url.js +0 -11
- package/lib/_cjs/core/handler.js +0 -216
- package/lib/_cjs/core/http_error.js +0 -6
- package/lib/_cjs/core/http_header.js +0 -142
- package/lib/_cjs/core/http_method.js +0 -12
- package/lib/_cjs/core/http_redirect.js +0 -11
- package/lib/_cjs/core/server.js +0 -219
- package/lib/_cjs/core/types.js +0 -8
- package/lib/_cjs/exports.js +0 -273
- package/lib/_cjs/index.js +0 -15
- package/lib/_cjs/plugins/base.js +0 -3
- package/lib/_cjs/plugins/compress.js +0 -18
- package/lib/_cjs/plugins/cookie.js +0 -18
- package/lib/_cjs/plugins/cors.js +0 -38
- package/lib/_cjs/plugins/file_parser.js +0 -28
- package/lib/_cjs/plugins/form_body_parser.js +0 -18
- package/lib/_cjs/plugins/ws_parser.js +0 -18
- package/lib/_cjs/plugins/xml_parser.js +0 -48
- package/lib/_cjs/services/ai.js +0 -48
- package/lib/_cjs/services/base.js +0 -3
- package/lib/_cjs/services/cache.js +0 -400
- package/lib/_cjs/services/captcha.js +0 -78
- package/lib/_cjs/services/crypto.js +0 -175
- package/lib/_cjs/services/db_value.js +0 -77
- package/lib/_cjs/services/dingtalk.js +0 -51
- package/lib/_cjs/services/dispose.js +0 -23
- package/lib/_cjs/services/emoji.js +0 -2034
- package/lib/_cjs/services/file_store.js +0 -67
- package/lib/_cjs/services/html.js +0 -17
- package/lib/_cjs/services/jwt.js +0 -65
- package/lib/_cjs/services/log.js +0 -108
- package/lib/_cjs/services/mail.js +0 -31
- package/lib/_cjs/services/pay.js +0 -191
- package/lib/_cjs/services/random.js +0 -51
- package/lib/_cjs/services/rate_limit.js +0 -54
- package/lib/_cjs/services/redis.js +0 -12
- package/lib/_cjs/services/sensitive_words.js +0 -61
- package/lib/_cjs/services/sms.js +0 -84
- package/lib/_cjs/types/dto.js +0 -3
- package/lib/_cjs/x.js +0 -35
- package/lib/cli/api_generator.d.ts +0 -74
- package/lib/cli/api_generator.js +0 -452
- package/lib/cli/build_util.d.ts +0 -17
- package/lib/cli/build_util.js +0 -236
- package/lib/cli/cli.d.ts +0 -2
- package/lib/cli/cli.js +0 -374
- package/lib/cli/css_register.js +0 -5
- package/lib/cli/deploy_util.d.ts +0 -23
- package/lib/cli/deploy_util.js +0 -70
- package/lib/cli/dev_util.d.ts +0 -8
- package/lib/cli/dev_util.js +0 -20
- package/lib/cli/env_util.d.ts +0 -45
- package/lib/cli/env_util.js +0 -246
- package/lib/cli/esbuild_register.js +0 -5
- package/lib/cli/template_util.d.ts +0 -18
- package/lib/cli/template_util.js +0 -95
- package/lib/core/ctx_storage.d.ts +0 -3
- package/lib/core/ctx_storage.js +0 -2
- package/lib/core/define_bus.d.ts +0 -37
- package/lib/core/define_bus.js +0 -27
- package/lib/core/define_cron.js +0 -9
- package/lib/core/define_handler.js +0 -48
- package/lib/core/define_hook.d.ts +0 -2
- package/lib/core/define_hook.js +0 -4
- package/lib/core/define_server.d.ts +0 -3
- package/lib/core/define_server.js +0 -6
- package/lib/core/define_task.js +0 -107
- package/lib/core/get_handler_url.d.ts +0 -2
- package/lib/core/get_handler_url.js +0 -7
- package/lib/core/handler.d.ts +0 -16
- package/lib/core/handler.js +0 -209
- package/lib/core/http_error.d.ts +0 -2
- package/lib/core/http_error.js +0 -2
- package/lib/core/http_header.d.ts +0 -856
- package/lib/core/http_header.js +0 -139
- package/lib/core/http_method.d.ts +0 -3
- package/lib/core/http_method.js +0 -8
- package/lib/core/http_redirect.d.ts +0 -5
- package/lib/core/http_redirect.js +0 -6
- package/lib/core/server.d.ts +0 -20
- package/lib/core/server.js +0 -213
- package/lib/core/types.d.ts +0 -265
- package/lib/core/types.js +0 -4
- package/lib/exports.d.ts +0 -45
- package/lib/exports.js +0 -47
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -3
- package/lib/plugins/base.d.ts +0 -4
- package/lib/plugins/base.js +0 -1
- package/lib/plugins/compress.d.ts +0 -13
- package/lib/plugins/compress.js +0 -12
- package/lib/plugins/cookie.d.ts +0 -13
- package/lib/plugins/cookie.js +0 -12
- package/lib/plugins/cors.d.ts +0 -22
- package/lib/plugins/cors.js +0 -32
- package/lib/plugins/file_parser.d.ts +0 -16
- package/lib/plugins/file_parser.js +0 -22
- package/lib/plugins/form_body_parser.d.ts +0 -13
- package/lib/plugins/form_body_parser.js +0 -12
- package/lib/plugins/ws_parser.d.ts +0 -13
- package/lib/plugins/ws_parser.js +0 -12
- package/lib/plugins/xml_parser.d.ts +0 -19
- package/lib/plugins/xml_parser.js +0 -43
- package/lib/services/ai.d.ts +0 -31
- package/lib/services/ai.js +0 -43
- package/lib/services/base.d.ts +0 -4
- package/lib/services/base.js +0 -1
- package/lib/services/cache.d.ts +0 -173
- package/lib/services/cache.js +0 -394
- package/lib/services/captcha.d.ts +0 -65
- package/lib/services/captcha.js +0 -72
- package/lib/services/crypto.d.ts +0 -110
- package/lib/services/db_value.d.ts +0 -60
- package/lib/services/db_value.js +0 -72
- package/lib/services/dingtalk.d.ts +0 -39
- package/lib/services/dingtalk.js +0 -45
- package/lib/services/dispose.d.ts +0 -17
- package/lib/services/dispose.js +0 -17
- package/lib/services/emoji.d.ts +0 -10
- package/lib/services/emoji.js +0 -2029
- package/lib/services/file_store.d.ts +0 -49
- package/lib/services/file_store.js +0 -61
- package/lib/services/html.d.ts +0 -11
- package/lib/services/html.js +0 -12
- package/lib/services/jwt.d.ts +0 -34
- package/lib/services/jwt.js +0 -59
- package/lib/services/log.d.ts +0 -37
- package/lib/services/log.js +0 -102
- package/lib/services/mail.d.ts +0 -23
- package/lib/services/mail.js +0 -25
- package/lib/services/pay.d.ts +0 -123
- package/lib/services/pay.js +0 -185
- package/lib/services/random.d.ts +0 -27
- package/lib/services/random.js +0 -45
- package/lib/services/rate_limit.d.ts +0 -37
- package/lib/services/rate_limit.js +0 -49
- package/lib/services/redis.d.ts +0 -12
- package/lib/services/redis.js +0 -7
- package/lib/services/sensitive_words.d.ts +0 -29
- package/lib/services/sensitive_words.js +0 -56
- package/lib/services/sms.d.ts +0 -40
- package/lib/services/sms.js +0 -78
- package/lib/types/dto.d.ts +0 -86
- package/lib/types/dto.js +0 -1
- package/lib/x.d.ts +0 -17
- package/lib/x.js +0 -30
- /package/lib/{cli/css_register.d.ts → core/types.mjs} +0 -0
- /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,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 { ms } from "vtils";
|
|
2
|
+
import { xr } from "@jayfong/x-request";
|
|
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 @@
|
|
|
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 {};
|