@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
@@ -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 { type MsValue } from 'vtils';
2
- import type { 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 { Redis, type RedisOptions } from 'ioredis';
2
- import type { BaseService } from './base';
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,29 +0,0 @@
1
- import type { BaseService } from './base';
2
- export interface SensitiveWordsServiceOptions {
3
- /** 敏感词列表 */
4
- words: string[];
5
- }
6
- /**
7
- * 敏感词服务。
8
- */
9
- export declare class SensitiveWordsService implements BaseService {
10
- serviceName: string;
11
- private sensitiveWords;
12
- constructor(options: SensitiveWordsServiceOptions);
13
- /**
14
- * 文本转换。
15
- */
16
- private transform;
17
- /**
18
- * 验证文本是否包含敏感词。
19
- */
20
- validate(text: string, every?: boolean): Promise<{
21
- pass: boolean;
22
- words: string[];
23
- }>;
24
- }
25
- declare module '../x' {
26
- interface X {
27
- sensitiveWords: SensitiveWordsService;
28
- }
29
- }
@@ -1,56 +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.serviceName = 'sensitiveWords';
12
- this.sensitiveWords = [];
13
- this.sensitiveWords = uniq(options.words.map(word => word.toLowerCase()));
14
- }
15
-
16
- /**
17
- * 文本转换。
18
- */
19
- transform(text) {
20
- return (
21
- // 移除空白字符
22
- removeBlankChars(
23
- // 移除非单词字符
24
- removeNonWordChars(
25
- // 全角转半角
26
- toHalfWidthString(text)))
27
- // 转小写
28
- .toLowerCase()
29
- // 叠词归一
30
- // 排除字母数字以支持qq、手机号等场景
31
- .replace(/([^a-zA-Z0-9])\1+/g, '$1')
32
- );
33
- }
34
-
35
- /**
36
- * 验证文本是否包含敏感词。
37
- */
38
- async validate(text, every) {
39
- text = this.transform(text);
40
- const words = [];
41
- for (const word of this.sensitiveWords) {
42
- if (
43
- // 支持 <手机号>
44
- word === '<手机号>' ? phoneNumberRegExp.test(text) :
45
- // 支持正则
46
- word[0] === '/' && word[word.length - 1] === '/' ? toRegExp(word).test(text) : text.includes(word)) {
47
- words.push(word);
48
- if (!every) break;
49
- }
50
- }
51
- return {
52
- pass: !words.length,
53
- words: words
54
- };
55
- }
56
- }
@@ -1,40 +0,0 @@
1
- import type { 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
- }