@jayfong/x-server 2.118.1 → 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.
Files changed (290) hide show
  1. package/lib/_virtual/_rolldown/runtime.mjs +4 -0
  2. package/lib/cli/api_generator.d.mts +74 -0
  3. package/lib/cli/api_generator.mjs +310 -0
  4. package/lib/cli/build_util.d.mts +17 -0
  5. package/lib/cli/build_util.mjs +156 -0
  6. package/lib/cli/cli.d.mts +1 -0
  7. package/lib/cli/cli.mjs +355 -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 +7 -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/esbuild_register.d.mts +1 -0
  17. package/lib/cli/esbuild_register.mjs +7 -0
  18. package/lib/cli/template_util.d.mts +18 -0
  19. package/lib/cli/template_util.mjs +85 -0
  20. package/lib/cli/templates/crons.ts +1 -1
  21. package/lib/cli/templates/handlers.ts +1 -1
  22. package/lib/cli/templates/hooks.ts +1 -1
  23. package/lib/cli/templates/models.ts +7 -7
  24. package/lib/cli/templates/package.json +11 -1
  25. package/lib/cli/templates/routes.ts +2 -1
  26. package/lib/core/ctx_storage.d.mts +3 -0
  27. package/lib/core/ctx_storage.mjs +4 -0
  28. package/lib/core/define_bus.d.mts +37 -0
  29. package/lib/core/define_bus.mjs +12 -0
  30. package/lib/core/{define_cron.d.ts → define_cron.d.mts} +2 -2
  31. package/lib/core/define_cron.mjs +11 -0
  32. package/lib/core/{define_handler.d.ts → define_handler.d.mts} +19 -19
  33. package/lib/core/define_handler.mjs +44 -0
  34. package/lib/core/define_hook.d.mts +2 -0
  35. package/lib/core/define_hook.mjs +6 -0
  36. package/lib/core/define_server.d.mts +3 -0
  37. package/lib/core/define_server.mjs +8 -0
  38. package/lib/core/{define_task.d.ts → define_task.d.mts} +2 -2
  39. package/lib/core/define_task.mjs +102 -0
  40. package/lib/core/get_handler_url.d.mts +2 -0
  41. package/lib/core/get_handler_url.mjs +7 -0
  42. package/lib/core/handler.d.mts +16 -0
  43. package/lib/core/handler.mjs +132 -0
  44. package/lib/core/http_error.d.mts +2 -0
  45. package/lib/core/http_error.mjs +1 -0
  46. package/lib/core/http_header.d.mts +856 -0
  47. package/lib/core/http_header.mjs +860 -0
  48. package/lib/core/http_method.d.mts +3 -0
  49. package/lib/core/http_method.mjs +10 -0
  50. package/lib/core/http_redirect.d.mts +5 -0
  51. package/lib/core/http_redirect.mjs +10 -0
  52. package/lib/core/server.d.mts +20 -0
  53. package/lib/core/server.mjs +186 -0
  54. package/lib/core/types.d.mts +256 -0
  55. package/lib/exports.d.mts +46 -0
  56. package/lib/exports.mjs +46 -0
  57. package/lib/index.d.mts +48 -0
  58. package/lib/index.mjs +45 -0
  59. package/lib/plugins/base.d.mts +4 -0
  60. package/lib/plugins/compress.d.mts +12 -0
  61. package/lib/plugins/compress.mjs +15 -0
  62. package/lib/plugins/cookie.d.mts +12 -0
  63. package/lib/plugins/cookie.mjs +15 -0
  64. package/lib/plugins/cors.d.mts +22 -0
  65. package/lib/plugins/cors.mjs +34 -0
  66. package/lib/plugins/file_parser.d.mts +15 -0
  67. package/lib/plugins/file_parser.mjs +24 -0
  68. package/lib/plugins/form_body_parser.d.mts +12 -0
  69. package/lib/plugins/form_body_parser.mjs +15 -0
  70. package/lib/plugins/ws_parser.d.mts +12 -0
  71. package/lib/plugins/ws_parser.mjs +15 -0
  72. package/lib/plugins/xml_parser.d.mts +19 -0
  73. package/lib/plugins/xml_parser.mjs +40 -0
  74. package/lib/services/ai.d.mts +31 -0
  75. package/lib/services/ai.mjs +44 -0
  76. package/lib/services/base.d.mts +4 -0
  77. package/lib/services/base.mjs +1 -0
  78. package/lib/services/cache.d.mts +165 -0
  79. package/lib/services/cache.mjs +323 -0
  80. package/lib/services/captcha.d.mts +65 -0
  81. package/lib/services/captcha.mjs +61 -0
  82. package/lib/services/{crypto.js → crypto.d.mts} +19 -78
  83. package/lib/services/crypto.mjs +141 -0
  84. package/lib/services/db_value.d.mts +60 -0
  85. package/lib/services/db_value.mjs +64 -0
  86. package/lib/services/dingtalk.d.mts +39 -0
  87. package/lib/services/dingtalk.mjs +44 -0
  88. package/lib/services/dispose.d.mts +17 -0
  89. package/lib/services/dispose.mjs +18 -0
  90. package/lib/services/emoji.d.mts +10 -0
  91. package/lib/services/emoji.mjs +2025 -0
  92. package/lib/services/file_store.d.mts +49 -0
  93. package/lib/services/file_store.mjs +58 -0
  94. package/lib/services/html.d.mts +11 -0
  95. package/lib/services/html.mjs +12 -0
  96. package/lib/services/jwt.d.mts +33 -0
  97. package/lib/services/jwt.mjs +42 -0
  98. package/lib/services/log.d.mts +37 -0
  99. package/lib/services/log.mjs +99 -0
  100. package/lib/services/mail.d.mts +22 -0
  101. package/lib/services/mail.mjs +28 -0
  102. package/lib/services/pay.d.mts +123 -0
  103. package/lib/services/pay.mjs +157 -0
  104. package/lib/services/random.d.mts +27 -0
  105. package/lib/services/random.mjs +42 -0
  106. package/lib/services/rate_limit.d.mts +37 -0
  107. package/lib/services/rate_limit.mjs +40 -0
  108. package/lib/services/redis.d.mts +11 -0
  109. package/lib/services/redis.mjs +6 -0
  110. package/lib/services/sensitive_words.d.mts +29 -0
  111. package/lib/services/sensitive_words.mjs +37 -0
  112. package/lib/services/sms.d.mts +40 -0
  113. package/lib/services/sms.mjs +30238 -0
  114. package/lib/types/dto.d.mts +30 -0
  115. package/lib/types/dto.mjs +1 -0
  116. package/lib/x.d.mts +11 -0
  117. package/lib/x.mjs +21 -0
  118. package/lib/x_init.d.mts +1 -0
  119. package/lib/x_init.mjs +10 -0
  120. package/package.json +99 -43
  121. package/lib/_cjs/cli/api_generator.js +0 -438
  122. package/lib/_cjs/cli/build_util.js +0 -243
  123. package/lib/_cjs/cli/cli.js +0 -378
  124. package/lib/_cjs/cli/css_register.js +0 -7
  125. package/lib/_cjs/cli/deploy_util.js +0 -76
  126. package/lib/_cjs/cli/dev_util.js +0 -25
  127. package/lib/_cjs/cli/env_util.js +0 -252
  128. package/lib/_cjs/cli/esbuild_register.js +0 -7
  129. package/lib/_cjs/cli/template_util.js +0 -101
  130. package/lib/_cjs/cli/templates/crons.ts +0 -2
  131. package/lib/_cjs/cli/templates/handlers.ts +0 -3
  132. package/lib/_cjs/cli/templates/hooks.ts +0 -2
  133. package/lib/_cjs/cli/templates/models.ts +0 -123
  134. package/lib/_cjs/cli/templates/package.json +0 -3
  135. package/lib/_cjs/cli/templates/routes.ts +0 -68
  136. package/lib/_cjs/core/ctx_storage.js +0 -6
  137. package/lib/_cjs/core/define_bus.js +0 -31
  138. package/lib/_cjs/core/define_cron.js +0 -13
  139. package/lib/_cjs/core/define_handler.js +0 -56
  140. package/lib/_cjs/core/define_hook.js +0 -8
  141. package/lib/_cjs/core/define_server.js +0 -10
  142. package/lib/_cjs/core/define_task.js +0 -113
  143. package/lib/_cjs/core/get_handler_url.js +0 -11
  144. package/lib/_cjs/core/handler.js +0 -216
  145. package/lib/_cjs/core/http_error.js +0 -6
  146. package/lib/_cjs/core/http_header.js +0 -142
  147. package/lib/_cjs/core/http_method.js +0 -12
  148. package/lib/_cjs/core/http_redirect.js +0 -11
  149. package/lib/_cjs/core/server.js +0 -221
  150. package/lib/_cjs/core/types.js +0 -8
  151. package/lib/_cjs/exports.js +0 -273
  152. package/lib/_cjs/index.js +0 -15
  153. package/lib/_cjs/plugins/base.js +0 -3
  154. package/lib/_cjs/plugins/compress.js +0 -18
  155. package/lib/_cjs/plugins/cookie.js +0 -18
  156. package/lib/_cjs/plugins/cors.js +0 -38
  157. package/lib/_cjs/plugins/file_parser.js +0 -28
  158. package/lib/_cjs/plugins/form_body_parser.js +0 -18
  159. package/lib/_cjs/plugins/ws_parser.js +0 -18
  160. package/lib/_cjs/plugins/xml_parser.js +0 -48
  161. package/lib/_cjs/services/ai.js +0 -48
  162. package/lib/_cjs/services/base.js +0 -3
  163. package/lib/_cjs/services/cache.js +0 -400
  164. package/lib/_cjs/services/captcha.js +0 -78
  165. package/lib/_cjs/services/crypto.js +0 -175
  166. package/lib/_cjs/services/db_value.js +0 -77
  167. package/lib/_cjs/services/dingtalk.js +0 -51
  168. package/lib/_cjs/services/dispose.js +0 -23
  169. package/lib/_cjs/services/emoji.js +0 -2034
  170. package/lib/_cjs/services/file_store.js +0 -67
  171. package/lib/_cjs/services/html.js +0 -17
  172. package/lib/_cjs/services/jwt.js +0 -65
  173. package/lib/_cjs/services/log.js +0 -108
  174. package/lib/_cjs/services/mail.js +0 -31
  175. package/lib/_cjs/services/pay.js +0 -191
  176. package/lib/_cjs/services/random.js +0 -51
  177. package/lib/_cjs/services/rate_limit.js +0 -54
  178. package/lib/_cjs/services/redis.js +0 -12
  179. package/lib/_cjs/services/sensitive_words.js +0 -62
  180. package/lib/_cjs/services/sms.js +0 -84
  181. package/lib/_cjs/types/dto.js +0 -3
  182. package/lib/_cjs/x.js +0 -35
  183. package/lib/cli/api_generator.d.ts +0 -74
  184. package/lib/cli/api_generator.js +0 -432
  185. package/lib/cli/build_util.d.ts +0 -17
  186. package/lib/cli/build_util.js +0 -236
  187. package/lib/cli/cli.d.ts +0 -2
  188. package/lib/cli/cli.js +0 -374
  189. package/lib/cli/css_register.js +0 -5
  190. package/lib/cli/deploy_util.d.ts +0 -23
  191. package/lib/cli/deploy_util.js +0 -70
  192. package/lib/cli/dev_util.d.ts +0 -8
  193. package/lib/cli/dev_util.js +0 -19
  194. package/lib/cli/env_util.d.ts +0 -45
  195. package/lib/cli/env_util.js +0 -246
  196. package/lib/cli/esbuild_register.js +0 -5
  197. package/lib/cli/template_util.d.ts +0 -18
  198. package/lib/cli/template_util.js +0 -95
  199. package/lib/core/ctx_storage.d.ts +0 -3
  200. package/lib/core/ctx_storage.js +0 -2
  201. package/lib/core/define_bus.d.ts +0 -37
  202. package/lib/core/define_bus.js +0 -27
  203. package/lib/core/define_cron.js +0 -9
  204. package/lib/core/define_handler.js +0 -48
  205. package/lib/core/define_hook.d.ts +0 -2
  206. package/lib/core/define_hook.js +0 -4
  207. package/lib/core/define_server.d.ts +0 -3
  208. package/lib/core/define_server.js +0 -6
  209. package/lib/core/define_task.js +0 -107
  210. package/lib/core/get_handler_url.d.ts +0 -2
  211. package/lib/core/get_handler_url.js +0 -7
  212. package/lib/core/handler.d.ts +0 -16
  213. package/lib/core/handler.js +0 -209
  214. package/lib/core/http_error.d.ts +0 -2
  215. package/lib/core/http_error.js +0 -2
  216. package/lib/core/http_header.d.ts +0 -856
  217. package/lib/core/http_header.js +0 -139
  218. package/lib/core/http_method.d.ts +0 -3
  219. package/lib/core/http_method.js +0 -8
  220. package/lib/core/http_redirect.d.ts +0 -5
  221. package/lib/core/http_redirect.js +0 -6
  222. package/lib/core/server.d.ts +0 -20
  223. package/lib/core/server.js +0 -215
  224. package/lib/core/types.d.ts +0 -265
  225. package/lib/core/types.js +0 -4
  226. package/lib/exports.d.ts +0 -45
  227. package/lib/exports.js +0 -47
  228. package/lib/index.d.ts +0 -2
  229. package/lib/index.js +0 -3
  230. package/lib/plugins/base.d.ts +0 -4
  231. package/lib/plugins/base.js +0 -1
  232. package/lib/plugins/compress.d.ts +0 -13
  233. package/lib/plugins/compress.js +0 -12
  234. package/lib/plugins/cookie.d.ts +0 -13
  235. package/lib/plugins/cookie.js +0 -12
  236. package/lib/plugins/cors.d.ts +0 -22
  237. package/lib/plugins/cors.js +0 -33
  238. package/lib/plugins/file_parser.d.ts +0 -16
  239. package/lib/plugins/file_parser.js +0 -22
  240. package/lib/plugins/form_body_parser.d.ts +0 -13
  241. package/lib/plugins/form_body_parser.js +0 -12
  242. package/lib/plugins/ws_parser.d.ts +0 -13
  243. package/lib/plugins/ws_parser.js +0 -12
  244. package/lib/plugins/xml_parser.d.ts +0 -19
  245. package/lib/plugins/xml_parser.js +0 -43
  246. package/lib/services/ai.d.ts +0 -31
  247. package/lib/services/ai.js +0 -43
  248. package/lib/services/base.d.ts +0 -4
  249. package/lib/services/base.js +0 -1
  250. package/lib/services/cache.d.ts +0 -173
  251. package/lib/services/cache.js +0 -394
  252. package/lib/services/captcha.d.ts +0 -65
  253. package/lib/services/captcha.js +0 -72
  254. package/lib/services/crypto.d.ts +0 -110
  255. package/lib/services/db_value.d.ts +0 -60
  256. package/lib/services/db_value.js +0 -72
  257. package/lib/services/dingtalk.d.ts +0 -39
  258. package/lib/services/dingtalk.js +0 -45
  259. package/lib/services/dispose.d.ts +0 -17
  260. package/lib/services/dispose.js +0 -17
  261. package/lib/services/emoji.d.ts +0 -10
  262. package/lib/services/emoji.js +0 -2029
  263. package/lib/services/file_store.d.ts +0 -49
  264. package/lib/services/file_store.js +0 -61
  265. package/lib/services/html.d.ts +0 -11
  266. package/lib/services/html.js +0 -12
  267. package/lib/services/jwt.d.ts +0 -34
  268. package/lib/services/jwt.js +0 -59
  269. package/lib/services/log.d.ts +0 -37
  270. package/lib/services/log.js +0 -102
  271. package/lib/services/mail.d.ts +0 -23
  272. package/lib/services/mail.js +0 -25
  273. package/lib/services/pay.d.ts +0 -123
  274. package/lib/services/pay.js +0 -185
  275. package/lib/services/random.d.ts +0 -27
  276. package/lib/services/random.js +0 -45
  277. package/lib/services/rate_limit.d.ts +0 -37
  278. package/lib/services/rate_limit.js +0 -49
  279. package/lib/services/redis.d.ts +0 -12
  280. package/lib/services/redis.js +0 -7
  281. package/lib/services/sensitive_words.d.ts +0 -30
  282. package/lib/services/sensitive_words.js +0 -57
  283. package/lib/services/sms.d.ts +0 -40
  284. package/lib/services/sms.js +0 -78
  285. package/lib/types/dto.d.ts +0 -86
  286. package/lib/types/dto.js +0 -1
  287. package/lib/x.d.ts +0 -17
  288. package/lib/x.js +0 -30
  289. /package/lib/{cli/css_register.d.ts → core/types.mjs} +0 -0
  290. /package/lib/{cli/esbuild_register.d.ts → plugins/base.mjs} +0 -0
@@ -1,185 +0,0 @@
1
- import crypto from 'node:crypto';
2
- import AlipaySdk from 'alipay-sdk';
3
- import AlipayFormData from 'alipay-sdk/lib/form';
4
- import got from 'got';
5
- import { HttpError } from "../core/http_error";
6
- export class PayService {
7
- constructor(options) {
8
- this.options = options;
9
- this.serviceName = 'pay';
10
- this.alipaySdk = void 0;
11
- }
12
- async prepareAlipay(options) {
13
- if (!this.alipaySdk) {
14
- this.alipaySdk = new AlipaySdk({
15
- appId: this.options.alipay.appId,
16
- privateKey: this.options.alipay.privateKey,
17
- alipayPublicKey: this.options.alipay.publicKey
18
- });
19
- }
20
- const formData = new AlipayFormData();
21
- formData.setMethod('get');
22
- formData.addField('notifyUrl', options.notifyUrl);
23
- if (options.returnUrl) {
24
- formData.addField('returnUrl', options.returnUrl);
25
- }
26
- formData.addField('bizContent', {
27
- outTradeNo: options.tradeNumber,
28
- productCode: 'FAST_INSTANT_TRADE_PAY',
29
- totalAmount: options.totalMoney,
30
- subject: options.goodsName,
31
- goodsType: '0',
32
- passbackParams: 'alipay'
33
- });
34
- const payUrl = await this.alipaySdk.exec('alipay.trade.page.pay', {}, {
35
- formData: formData
36
- });
37
- return {
38
- payUrl: payUrl
39
- };
40
- }
41
- async prepareWepay(options) {
42
- const res = await this.wepayRequest('https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi', {
43
- appid: this.options.wepay.appId,
44
- mchid: this.options.wepay.merchantId,
45
- description: options.goodsName,
46
- out_trade_no: options.tradeNumber,
47
- attach: 'wepay',
48
- notify_url: options.notifyUrl,
49
- amount: {
50
- total: options.totalMoney * 100,
51
- currency: 'CNY'
52
- },
53
- payer: {
54
- openid: options.openid
55
- }
56
- });
57
- if (!res || !res.prepay_id) {
58
- const error = res && res.message || '支付错误';
59
- throw new Error(error);
60
- }
61
- const params = {
62
- appId: this.options.wepay.appId,
63
- timestamp: String(Math.round(Date.now() / 1000)),
64
- nonceStr: Math.random().toString().substr(2, 12),
65
- package: `prepay_id=${res.prepay_id}`,
66
- signType: 'RSA',
67
- paySign: ''
68
- };
69
- params.paySign = this.wepaySign([params.appId, params.timestamp, params.nonceStr, params.package]);
70
- return {
71
- payParams: params
72
- };
73
- }
74
- verifyNotifyData(data) {
75
- try {
76
- if (!data || typeof data !== 'object') {
77
- return false;
78
- }
79
-
80
- // 支付宝
81
- // https://opendocs.alipay.com/open/270/105902
82
- if (data.passback_params === 'alipay') {
83
- if (!this.alipaySdk?.checkNotifySign(data)) {
84
- return false;
85
- }
86
- return {
87
- channelOrderNo: data.trade_no
88
- };
89
- }
90
-
91
- // 微信支付
92
- // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_5.shtml
93
- if (data.resource) {
94
- const params = JSON.parse(this.wepayDecrypt(data.resource));
95
- if (params.attach === 'wepay') {
96
- return {
97
- channelOrderNo: params.transaction_id
98
- };
99
- }
100
- return false;
101
- }
102
- return false;
103
- } catch {
104
- return false;
105
- }
106
- }
107
- verifyNotifyDataOrFail(data, message) {
108
- const res = this.verifyNotifyData(data);
109
- if (!res) {
110
- throw new HttpError.BadRequest(message);
111
- }
112
- return res;
113
- }
114
- async getOrderInfo(payload) {
115
- // 微信支付
116
- // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_2.shtml
117
- if (payload.channel === 'wepay') {
118
- const res = await this.wepayRequest(payload.orderNo ? `https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/${payload.orderNo}?mchid=${this.options.wepay.merchantId}` : `https://api.mch.weixin.qq.com/v3/pay/transactions/id/${payload.channelOrderNo}?mchid=${this.options.wepay.merchantId}`);
119
- return {
120
- channelOrderNo: res.transaction_id,
121
- orderNo: res.out_trade_no,
122
- status: res.trade_state === 'SUCCESS' ? 'success' : 'fail'
123
- };
124
- }
125
-
126
- // 支付宝
127
- // https://opendocs.alipay.com/open/028woa?scene=common&pathHash=dbf247eb
128
- const res = await this.alipaySdk.exec('alipay.trade.query', {
129
- biz_content: payload.orderNo ? {
130
- out_trade_no: payload.orderNo
131
- } : {
132
- trade_no: payload.channelOrderNo
133
- }
134
- });
135
- return {
136
- channelOrderNo: res.trade_no,
137
- orderNo: res.out_trade_no,
138
- status: res.trade_status === 'TRADE_SUCCESS' || res.trade_status === 'TRADE_FINISHED' ? 'success' : 'fail'
139
- };
140
- }
141
- wepaySign(data) {
142
- return crypto.createSign('RSA-SHA256').update(data.map(v => `${v}\n`).join('')).sign(this.options.wepay.privateKey, 'base64');
143
- }
144
- wepayDecrypt(payload) {
145
- const ciphertextBuffer = Buffer.from(payload.ciphertext, 'base64');
146
- const authTag = ciphertextBuffer.slice(ciphertextBuffer.length - 16);
147
- const data = ciphertextBuffer.slice(0, ciphertextBuffer.length - 16);
148
- const decipherIv = crypto.createDecipheriv('aes-256-gcm', this.options.wepay.secretKey, payload.nonce);
149
- decipherIv.setAuthTag(Buffer.from(authTag));
150
- decipherIv.setAAD(Buffer.from(payload.associated_data));
151
- const decryptStr = decipherIv.update(data, undefined, 'utf8');
152
- decipherIv.final();
153
- return decryptStr;
154
- }
155
- async wepayRequest(url, data) {
156
- const path = url.replace(/^https?:\/\/[^/]+/, '');
157
- const method = data == null ? 'GET' : 'POST';
158
- const body = method === 'POST' ? JSON.stringify(data) : '';
159
- const params = {
160
- method: method,
161
- url: path,
162
- time: String(Math.round(Date.now() / 1000)),
163
- rand: Math.random().toString().substr(2, 12),
164
- body: body,
165
- signature: ''
166
- };
167
- params.signature = this.wepaySign([params.method, params.url, params.time, params.rand, params.body]);
168
- const Authorization = [`WECHATPAY2-SHA256-RSA2048 `, `mchid="${this.options.wepay.merchantId}",`, `nonce_str="${params.rand}",`, `signature="${params.signature}",`, `timestamp="${params.time}",`, `serial_no="${this.options.wepay.certificateSerialNumber}"`].join('');
169
- const res = method === 'POST' ? await got.post(url, {
170
- json: data,
171
- headers: {
172
- Authorization
173
- },
174
- responseType: 'json',
175
- resolveBodyOnly: true
176
- }) : await got.get(url, {
177
- headers: {
178
- Authorization
179
- },
180
- responseType: 'json',
181
- resolveBodyOnly: true
182
- });
183
- return res;
184
- }
185
- }
@@ -1,27 +0,0 @@
1
- import type { BaseService } from './base';
2
- export declare class RandomService implements BaseService {
3
- serviceName: string;
4
- /**
5
- * 24位。
6
- *
7
- * @see https://github.com/paralleldrive/cuid2
8
- */
9
- cuid2(): string;
10
- /**
11
- * [0-9 a-z A-Z]
12
- */
13
- generateAlphanumeric(length: number): string;
14
- /**
15
- * [a-z A-Z]
16
- */
17
- generateAlphabetic(length: number): string;
18
- /**
19
- * [0-9]
20
- */
21
- generateNumeric(length: number): string;
22
- }
23
- declare module '../x' {
24
- interface X {
25
- random: RandomService;
26
- }
27
- }
@@ -1,45 +0,0 @@
1
- import { createId as cuid2 } from '@paralleldrive/cuid2';
2
- import randomstring from 'randomstring';
3
- export class RandomService {
4
- constructor() {
5
- this.serviceName = 'random';
6
- }
7
- /**
8
- * 24位。
9
- *
10
- * @see https://github.com/paralleldrive/cuid2
11
- */
12
- cuid2() {
13
- return cuid2();
14
- }
15
-
16
- /**
17
- * [0-9 a-z A-Z]
18
- */
19
- generateAlphanumeric(length) {
20
- return randomstring.generate({
21
- charset: 'alphanumeric',
22
- length: length
23
- });
24
- }
25
-
26
- /**
27
- * [a-z A-Z]
28
- */
29
- generateAlphabetic(length) {
30
- return randomstring.generate({
31
- charset: 'alphabetic',
32
- length: length
33
- });
34
- }
35
-
36
- /**
37
- * [0-9]
38
- */
39
- generateNumeric(length) {
40
- return randomstring.generate({
41
- charset: 'numeric',
42
- length: length
43
- });
44
- }
45
- }
@@ -1,37 +0,0 @@
1
- import { MsValue } from 'vtils';
2
- import { BaseService } from './base';
3
- export interface RateLimitServiceLimitByCountOptions {
4
- key: string;
5
- ttl: MsValue;
6
- count: number;
7
- }
8
- export interface RateLimitServiceLimitByCountOrFailOptions extends RateLimitServiceLimitByCountOptions {
9
- message?: string;
10
- }
11
- export interface RateLimitServiceLimitByManyCountOptions {
12
- key: string;
13
- limits: Array<{
14
- ttl: MsValue;
15
- count: number;
16
- }>;
17
- }
18
- export interface RateLimitServiceLimitByManyCountOrFailOptions extends RateLimitServiceLimitByManyCountOptions {
19
- message?: string;
20
- limits: Array<{
21
- ttl: MsValue;
22
- count: number;
23
- message?: string;
24
- }>;
25
- }
26
- export declare class RateLimitService implements BaseService {
27
- serviceName: string;
28
- limitByCount(options: RateLimitServiceLimitByCountOptions): Promise<number>;
29
- limitByCountOrFail(options: RateLimitServiceLimitByCountOrFailOptions): Promise<number>;
30
- limitByManyCount(options: RateLimitServiceLimitByManyCountOptions): Promise<true | number>;
31
- limitByManyCountOrFail(options: RateLimitServiceLimitByManyCountOrFailOptions): Promise<void>;
32
- }
33
- declare module '../x' {
34
- interface X {
35
- rateLimit: RateLimitService;
36
- }
37
- }
@@ -1,49 +0,0 @@
1
- import { ms } from 'vtils';
2
- import { HttpError } from "../core/http_error";
3
- import { x } from "../x";
4
- export class RateLimitService {
5
- constructor() {
6
- this.serviceName = 'rateLimit';
7
- }
8
- async limitByCount(options) {
9
- const cacheKey = `rateLimit_${options.key}`;
10
- const remainingCount = await x.cache.get(cacheKey);
11
- if (remainingCount == null) {
12
- await x.cache.set(cacheKey, options.count, options.ttl);
13
- return options.count;
14
- }
15
- if (remainingCount === 0) {
16
- return 0;
17
- }
18
- await x.cache.decrease(cacheKey);
19
- return remainingCount - 1;
20
- }
21
- async limitByCountOrFail(options) {
22
- const count = await this.limitByCount(options);
23
- if (count === 0) {
24
- throw new HttpError.Forbidden(options.message);
25
- }
26
- return count;
27
- }
28
- async limitByManyCount(options) {
29
- for (let i = 0; i < options.limits.length; i++) {
30
- const item = options.limits[i];
31
- const ttl = ms(item.ttl);
32
- const remainingCount = await this.limitByCount({
33
- key: `${options.key}_${ttl}`,
34
- ttl: ttl,
35
- count: item.count
36
- });
37
- if (remainingCount === 0) {
38
- return i;
39
- }
40
- }
41
- return true;
42
- }
43
- async limitByManyCountOrFail(options) {
44
- const pass = await this.limitByManyCount(options);
45
- if (pass !== true) {
46
- throw new HttpError.Forbidden(options.limits[pass].message ?? options.message);
47
- }
48
- }
49
- }
@@ -1,12 +0,0 @@
1
- import { BaseService } from './base';
2
- import { Redis, RedisOptions } from 'ioredis';
3
- export interface RedisServiceOptions extends RedisOptions {
4
- }
5
- export declare class RedisService extends Redis implements BaseService {
6
- serviceName: string;
7
- }
8
- declare module '../x' {
9
- interface X {
10
- redis: RedisService;
11
- }
12
- }
@@ -1,7 +0,0 @@
1
- import { Redis } from 'ioredis';
2
- export class RedisService extends Redis {
3
- constructor(...args) {
4
- super(...args);
5
- this.serviceName = 'redis';
6
- }
7
- }
@@ -1,30 +0,0 @@
1
- import { BaseService } from './base';
2
- export interface SensitiveWordsServiceOptions {
3
- /** 敏感词列表 */
4
- words: string[];
5
- }
6
- /**
7
- * 敏感词服务。
8
- */
9
- export declare class SensitiveWordsService implements BaseService {
10
- private options;
11
- serviceName: string;
12
- private sensitiveWords;
13
- constructor(options: SensitiveWordsServiceOptions);
14
- /**
15
- * 文本转换。
16
- */
17
- private transform;
18
- /**
19
- * 验证文本是否包含敏感词。
20
- */
21
- validate(text: string, every?: boolean): Promise<{
22
- pass: boolean;
23
- words: string[];
24
- }>;
25
- }
26
- declare module '../x' {
27
- interface X {
28
- sensitiveWords: SensitiveWordsService;
29
- }
30
- }
@@ -1,57 +0,0 @@
1
- import { memoize, removeBlankChars, removeNonWordChars, toHalfWidthString, uniq } from 'vtils';
2
- import { phoneNumberRegExpBuilder } from 'vtils/regexp';
3
- const phoneNumberRegExp = phoneNumberRegExpBuilder.build();
4
- const toRegExp = memoize(re => new RegExp(re.substring(1, re.length - 1)), re => re);
5
-
6
- /**
7
- * 敏感词服务。
8
- */
9
- export class SensitiveWordsService {
10
- constructor(options) {
11
- this.options = options;
12
- this.serviceName = 'sensitiveWords';
13
- this.sensitiveWords = [];
14
- this.sensitiveWords = uniq(options.words.map(word => word.toLowerCase()));
15
- }
16
-
17
- /**
18
- * 文本转换。
19
- */
20
- transform(text) {
21
- return (
22
- // 移除空白字符
23
- removeBlankChars(
24
- // 移除非单词字符
25
- removeNonWordChars(
26
- // 全角转半角
27
- toHalfWidthString(text)))
28
- // 转小写
29
- .toLowerCase()
30
- // 叠词归一
31
- // 排除字母数字以支持qq、手机号等场景
32
- .replace(/([^a-zA-Z0-9])\1+/g, '$1')
33
- );
34
- }
35
-
36
- /**
37
- * 验证文本是否包含敏感词。
38
- */
39
- async validate(text, every) {
40
- text = this.transform(text);
41
- const words = [];
42
- for (const word of this.sensitiveWords) {
43
- if (
44
- // 支持 <手机号>
45
- word === '<手机号>' ? phoneNumberRegExp.test(text) :
46
- // 支持正则
47
- word[0] === '/' && word[word.length - 1] === '/' ? toRegExp(word).test(text) : text.includes(word)) {
48
- words.push(word);
49
- if (!every) break;
50
- }
51
- }
52
- return {
53
- pass: !words.length,
54
- words: words
55
- };
56
- }
57
- }
@@ -1,40 +0,0 @@
1
- import { BaseService } from './base';
2
- export type SmsServiceProvider = 'tencentCloud';
3
- export type SmsServiceOptions = {
4
- provider: 'tencentCloud';
5
- providerOptions: {
6
- appId: string;
7
- secretId: string;
8
- secretKey: string;
9
- };
10
- };
11
- export type SmsServiceSendPayload = {
12
- provider: SmsServiceProvider;
13
- signature: string;
14
- templateId: string;
15
- templateParamValues: string[];
16
- phoneNumber: string;
17
- };
18
- export type SmsServiceSendResult = {
19
- success: boolean;
20
- message: string;
21
- smsId: string;
22
- };
23
- export type SmsServiceErrorType = 'TEXT_INTERCEPTION' | 'PROVIDER_EXCEPTION' | 'RATE_LIMITATION' | 'NUMBER_EXCEPTION' | 'USER_REJECTION' | 'OTHERS';
24
- export declare class SmsService implements BaseService {
25
- private options;
26
- serviceName: string;
27
- constructor(options: SmsServiceOptions);
28
- send(payload: SmsServiceSendPayload): Promise<SmsServiceSendResult>;
29
- /**
30
- * 推断错误类型
31
- *
32
- * @param errMsg 错误信息
33
- */
34
- static inferErrorType(errMsg: string): SmsServiceErrorType;
35
- }
36
- declare module '../x' {
37
- interface X {
38
- sms: SmsService;
39
- }
40
- }