@maiyunnet/kebab 3.1.6 → 3.1.8
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/index.d.ts +1 -1
- package/index.js +2 -2
- package/lib/captcha.js +2 -2
- package/lib/consistent.js +1 -1
- package/lib/core.d.ts +4 -4
- package/lib/core.js +9 -10
- package/lib/cron.js +5 -5
- package/lib/crypto.js +2 -2
- package/lib/db.d.ts +2 -2
- package/lib/db.js +5 -5
- package/lib/dns.d.ts +1 -1
- package/lib/dns.js +5 -5
- package/lib/jwt.d.ts +3 -3
- package/lib/jwt.js +4 -4
- package/lib/kv.d.ts +2 -2
- package/lib/kv.js +3 -3
- package/lib/lan.js +1 -1
- package/lib/net/formdata.js +2 -2
- package/lib/net/request.d.ts +1 -1
- package/lib/net/request.js +1 -1
- package/lib/net/response.d.ts +1 -1
- package/lib/net.d.ts +5 -5
- package/lib/net.js +9 -11
- package/lib/s3.d.ts +1 -1
- package/lib/s3.js +2 -2
- package/lib/scan.d.ts +3 -3
- package/lib/scan.js +6 -6
- package/lib/session.d.ts +3 -3
- package/lib/session.js +6 -6
- package/lib/sql.d.ts +2 -2
- package/lib/sql.js +3 -3
- package/lib/ssh/sftp.js +2 -2
- package/lib/ssh/shell.js +1 -1
- package/lib/text.d.ts +8 -4
- package/lib/text.js +23 -5
- package/lib/time.d.ts +1 -1
- package/lib/time.js +1 -1
- package/lib/turnstile.d.ts +1 -1
- package/lib/turnstile.js +2 -2
- package/lib/ws.d.ts +3 -3
- package/lib/ws.js +2 -2
- package/lib/zip.js +1 -1
- package/package.json +2 -2
- package/sys/child.js +6 -6
- package/sys/cmd.js +6 -6
- package/sys/ctr.d.ts +7 -5
- package/sys/ctr.js +10 -8
- package/sys/master.js +8 -8
- package/sys/mod.d.ts +6 -6
- package/sys/mod.js +7 -7
- package/sys/route.d.ts +9 -5
- package/sys/route.js +52 -45
- package/www/example/ctr/main.d.ts +1 -1
- package/www/example/ctr/main.js +1 -1
- package/www/example/ctr/middle.d.ts +3 -2
- package/www/example/ctr/middle.js +10 -1
- package/www/example/ctr/test.d.ts +2 -2
- package/www/example/ctr/test.js +24 -24
- package/www/example/mod/test.d.ts +2 -2
- package/www/example/mod/test.js +2 -2
- package/www/example/mod/testdata.d.ts +1 -1
- package/www/example/mod/testdata.js +1 -1
- package/www/example/ws/mproxy.d.ts +1 -1
- package/www/example/ws/mproxy.js +3 -3
- package/www/example/ws/rproxy.d.ts +1 -1
- package/www/example/ws/rproxy.js +3 -3
- package/www/example/ws/rsocket.d.ts +1 -1
- package/www/example/ws/rsocket.js +3 -3
- package/www/example/ws/test.d.ts +1 -1
- package/www/example/ws/test.js +3 -3
- package/tsconfig.json +0 -26
package/lib/text.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Date: 2019-5-15 16:49:39
|
|
4
4
|
* Last: 2020-04-06 20:51:06, 2022-9-29 15:18:16, 2022-12-29 00:01:30, 2024-3-6 17:53:14, 2024-5-31 17:29:52, 2025-6-13 15:47:02, 2025-9-23 12:51:49
|
|
5
5
|
*/
|
|
6
|
-
import * as kebab from '#index.js';
|
|
6
|
+
import * as kebab from '#kebab/index.js';
|
|
7
7
|
import * as lFs from './fs.js';
|
|
8
8
|
/**
|
|
9
9
|
* --- 将文件大小格式化为带单位的字符串 ---
|
|
@@ -339,7 +339,6 @@ export function isIdCardCN(idcard) {
|
|
|
339
339
|
return false;
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
|
-
// --- 以下 Mutton: false, Kebab: true ---
|
|
343
342
|
/**
|
|
344
343
|
* --- 将对象转换为 query string ---
|
|
345
344
|
* @param query 要转换的对象
|
|
@@ -430,7 +429,7 @@ export function getFilename(path) {
|
|
|
430
429
|
return path.slice(lio + 1);
|
|
431
430
|
}
|
|
432
431
|
/**
|
|
433
|
-
* --- 将普通的返回 JSON
|
|
432
|
+
* --- 将普通的返回 JSON 对象序列化为字符串 ---
|
|
434
433
|
* @param o 返回 JSON 对象
|
|
435
434
|
*/
|
|
436
435
|
export function stringifyResult(rtn) {
|
|
@@ -469,7 +468,7 @@ export function stringifyResult(rtn) {
|
|
|
469
468
|
return JSON.stringify(rtn);
|
|
470
469
|
}
|
|
471
470
|
/**
|
|
472
|
-
* --- 将字符串解析为对象,返回 false 代表解析失败,支持 BigInt
|
|
471
|
+
* --- 将字符串解析为对象,返回 false 代表解析失败,支持 BigInt ---
|
|
473
472
|
* @param str 要解析的 json 字符串
|
|
474
473
|
*/
|
|
475
474
|
export function parseJson(str) {
|
|
@@ -497,7 +496,7 @@ export function parseJson(str) {
|
|
|
497
496
|
}
|
|
498
497
|
}
|
|
499
498
|
/**
|
|
500
|
-
* --- 将对象转换为 json 字符串,返回 false 代表解析失败,支持 BigInt
|
|
499
|
+
* --- 将对象转换为 json 字符串,返回 false 代表解析失败,支持 BigInt ---
|
|
501
500
|
* @param obj 要转换的 json 对象
|
|
502
501
|
* @param space 美化方式
|
|
503
502
|
*/
|
|
@@ -517,6 +516,25 @@ export function stringifyBuffer(buf) {
|
|
|
517
516
|
const arr = buf.toString('hex').match(/.{1,2}/g);
|
|
518
517
|
return `<Buffer ${arr ? arr.join(' ') : ''}>`;
|
|
519
518
|
}
|
|
519
|
+
/**
|
|
520
|
+
* --- 递归删除 json 中的字符串首尾空格,会返回一个新的对象 ---
|
|
521
|
+
*/
|
|
522
|
+
export function trimJson(json) {
|
|
523
|
+
json = Object.assign({}, json);
|
|
524
|
+
trimJsonRecursion(json);
|
|
525
|
+
return json;
|
|
526
|
+
}
|
|
527
|
+
function trimJsonRecursion(json) {
|
|
528
|
+
for (const key in json) {
|
|
529
|
+
const val = json[key];
|
|
530
|
+
if (typeof val === 'string') {
|
|
531
|
+
json[key] = val.trim();
|
|
532
|
+
}
|
|
533
|
+
else if (typeof val === 'object') {
|
|
534
|
+
trimJsonRecursion(val);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
520
538
|
/**
|
|
521
539
|
* --- 判断一个值是否是虚假的(为 null/undefined/空字符串/false/0) ---
|
|
522
540
|
* @param val 要判断的值
|
package/lib/time.d.ts
CHANGED
package/lib/time.js
CHANGED
package/lib/turnstile.d.ts
CHANGED
package/lib/turnstile.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as tc from 'tencentcloud-sdk-nodejs';
|
|
7
7
|
// --- 库和定义 ---
|
|
8
|
-
import * as lNet from '#lib/net.js';
|
|
9
|
-
import * as lText from '#lib/text.js';
|
|
8
|
+
import * as lNet from '#kebab/lib/net.js';
|
|
9
|
+
import * as lText from '#kebab/lib/text.js';
|
|
10
10
|
/**
|
|
11
11
|
* 0. CloudFlare:https://developers.cloudflare.com/turnstile/get-started/server-side-validation/
|
|
12
12
|
* 1. 腾讯云:https://cloud.tencent.com/document/product/1110/36926
|
package/lib/ws.d.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as http from 'http';
|
|
7
7
|
import * as net from 'net';
|
|
8
|
-
import * as kebab from '#index.js';
|
|
9
|
-
import * as lNet from '#lib/net.js';
|
|
10
|
-
import * as sCtr from '#sys/ctr.js';
|
|
8
|
+
import * as kebab from '#kebab/index.js';
|
|
9
|
+
import * as lNet from '#kebab/lib/net.js';
|
|
10
|
+
import * as sCtr from '#kebab/sys/ctr.js';
|
|
11
11
|
/** --- 一般用 SIMPLE --- */
|
|
12
12
|
export declare enum EFrameReceiveMode {
|
|
13
13
|
STANDARD = 0,
|
package/lib/ws.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as net from 'net';
|
|
2
2
|
// --- 第三方 ---
|
|
3
3
|
import * as liws from '@litert/websocket';
|
|
4
|
-
import * as lText from '#lib/text.js';
|
|
5
|
-
import * as lNet from '#lib/net.js';
|
|
4
|
+
import * as lText from '#kebab/lib/text.js';
|
|
5
|
+
import * as lNet from '#kebab/lib/net.js';
|
|
6
6
|
/** --- 一般用 SIMPLE --- */
|
|
7
7
|
export var EFrameReceiveMode;
|
|
8
8
|
(function (EFrameReceiveMode) {
|
package/lib/zip.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maiyunnet/kebab",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "Simple, easy-to-use, and fully-featured Node.js framework that is ready-to-use out of the box.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"kebab": "./bin/kebab.js"
|
|
17
17
|
},
|
|
18
18
|
"imports": {
|
|
19
|
-
"
|
|
19
|
+
"#kebab/*": "./*"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@aws-sdk/client-s3": "^3.894.0",
|
package/sys/child.js
CHANGED
|
@@ -8,13 +8,13 @@ import * as tls from 'tls';
|
|
|
8
8
|
import * as http from 'http';
|
|
9
9
|
import * as crypto from 'crypto';
|
|
10
10
|
// --- 库 ---
|
|
11
|
-
import * as fs from '#lib/fs.js';
|
|
12
|
-
import * as lCore from '#lib/core.js';
|
|
13
|
-
import * as lText from '#lib/text.js';
|
|
14
|
-
import * as sCtr from '#sys/ctr.js';
|
|
15
|
-
import * as kebab from '#index.js';
|
|
11
|
+
import * as fs from '#kebab/lib/fs.js';
|
|
12
|
+
import * as lCore from '#kebab/lib/core.js';
|
|
13
|
+
import * as lText from '#kebab/lib/text.js';
|
|
14
|
+
import * as sCtr from '#kebab/sys/ctr.js';
|
|
15
|
+
import * as kebab from '#kebab/index.js';
|
|
16
16
|
// --- 初始化 ---
|
|
17
|
-
import * as sRoute from '#sys/route.js';
|
|
17
|
+
import * as sRoute from '#kebab/sys/route.js';
|
|
18
18
|
/** --- 10 秒往主线程发送一次心跳的 Timer --- */
|
|
19
19
|
const hbTimer = setInterval(function () {
|
|
20
20
|
if (!process.connected || !process.send) {
|
package/sys/cmd.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Last: 2020-3-7 23:51:18, 2022-07-22 14:14:09, 2022-9-27 14:52:19, 2023-5-23 21:42:46, 2024-7-2 15:12:28
|
|
5
5
|
*/
|
|
6
6
|
import * as http from 'http';
|
|
7
|
-
import * as lFs from '#lib/fs.js';
|
|
8
|
-
import * as lText from '#lib/text.js';
|
|
9
|
-
import * as lTime from '#lib/time.js';
|
|
10
|
-
import * as lCore from '#lib/core.js';
|
|
11
|
-
import * as lCrypto from '#lib/crypto.js';
|
|
12
|
-
import * as kebab from '#index.js';
|
|
7
|
+
import * as lFs from '#kebab/lib/fs.js';
|
|
8
|
+
import * as lText from '#kebab/lib/text.js';
|
|
9
|
+
import * as lTime from '#kebab/lib/time.js';
|
|
10
|
+
import * as lCore from '#kebab/lib/core.js';
|
|
11
|
+
import * as lCrypto from '#kebab/lib/crypto.js';
|
|
12
|
+
import * as kebab from '#kebab/index.js';
|
|
13
13
|
/** --- 解析命令 --- */
|
|
14
14
|
const cmds = process.argv.slice(2);
|
|
15
15
|
/** --- 批量创建目录 --- */
|
package/sys/ctr.d.ts
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as http from 'http';
|
|
7
7
|
import * as http2 from 'http2';
|
|
8
|
-
import * as kebab from '#index.js';
|
|
9
|
-
import * as lSession from '#lib/session.js';
|
|
10
|
-
import * as lDb from '#lib/db.js';
|
|
11
|
-
import * as lKv from '#lib/kv.js';
|
|
12
|
-
import * as lWs from '#lib/ws.js';
|
|
8
|
+
import * as kebab from '#kebab/index.js';
|
|
9
|
+
import * as lSession from '#kebab/lib/session.js';
|
|
10
|
+
import * as lDb from '#kebab/lib/db.js';
|
|
11
|
+
import * as lKv from '#kebab/lib/kv.js';
|
|
12
|
+
import * as lWs from '#kebab/lib/ws.js';
|
|
13
13
|
/**
|
|
14
14
|
* --- 清除已经加载的 data 与语言包文件缓存 ---
|
|
15
15
|
*/
|
|
@@ -124,6 +124,8 @@ export declare class Ctr {
|
|
|
124
124
|
* --- WebSocket 下连接被终止后会自动被调用的事件,可重写此方法 ---
|
|
125
125
|
*/
|
|
126
126
|
onClose(): void | Promise<void>;
|
|
127
|
+
/** --- 请求发送开始时调用,返回 false 则框架不会自动获取任何 post 内容(仅会在 middle 内触发) --- */
|
|
128
|
+
onReqStart(): boolean | Promise<boolean>;
|
|
127
129
|
/**
|
|
128
130
|
* --- 获取截止当前时间的总运行时间 ---
|
|
129
131
|
* @param ms 为 true 为毫秒,否则为秒
|
package/sys/ctr.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as ejs from 'ejs';
|
|
2
|
-
import * as lCore from '#lib/core.js';
|
|
3
|
-
import * as lFs from '#lib/fs.js';
|
|
4
|
-
import * as lCrypto from '#lib/crypto.js';
|
|
5
|
-
import * as lSession from '#lib/session.js';
|
|
6
|
-
import * as lText from '#lib/text.js';
|
|
7
|
-
import * as sRoute from '#sys/route.js';
|
|
2
|
+
import * as lCore from '#kebab/lib/core.js';
|
|
3
|
+
import * as lFs from '#kebab/lib/fs.js';
|
|
4
|
+
import * as lCrypto from '#kebab/lib/crypto.js';
|
|
5
|
+
import * as lSession from '#kebab/lib/session.js';
|
|
6
|
+
import * as lText from '#kebab/lib/text.js';
|
|
7
|
+
import * as sRoute from '#kebab/sys/route.js';
|
|
8
8
|
/** --- 已加载的 DATA 数据缓存(不是语言包)-- */
|
|
9
9
|
let loadedData = {};
|
|
10
10
|
/** --- 已加载的语言文件列表 --- */
|
|
@@ -47,7 +47,6 @@ export class Ctr {
|
|
|
47
47
|
this._xsrf = '';
|
|
48
48
|
/** --- 自定义 http code --- */
|
|
49
49
|
this._httpCode = 0;
|
|
50
|
-
// --- Kebab: true,Mutton: false,全局常量等对象 ---
|
|
51
50
|
/** --- 当前语言名 --- */
|
|
52
51
|
this._locale = 'en';
|
|
53
52
|
/** --- 本 ctr 已加载的语言文件列表 --- */
|
|
@@ -164,6 +163,10 @@ export class Ctr {
|
|
|
164
163
|
onClose() {
|
|
165
164
|
return;
|
|
166
165
|
}
|
|
166
|
+
/** --- 请求发送开始时调用,返回 false 则框架不会自动获取任何 post 内容(仅会在 middle 内触发) --- */
|
|
167
|
+
onReqStart() {
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
167
170
|
/**
|
|
168
171
|
* --- 获取截止当前时间的总运行时间 ---
|
|
169
172
|
* @param ms 为 true 为毫秒,否则为秒
|
|
@@ -658,7 +661,6 @@ export class Ctr {
|
|
|
658
661
|
}
|
|
659
662
|
return true;
|
|
660
663
|
}
|
|
661
|
-
// --- 以下:Mutton: false, Kebab: true ---
|
|
662
664
|
/**
|
|
663
665
|
* --- 获取语言包值 ---
|
|
664
666
|
* @param key
|
package/sys/master.js
CHANGED
|
@@ -7,14 +7,14 @@ import * as os from 'os';
|
|
|
7
7
|
import * as cluster from 'cluster';
|
|
8
8
|
import * as http from 'http';
|
|
9
9
|
// --- 库和定义 ---
|
|
10
|
-
import * as kebab from '#index.js';
|
|
11
|
-
import * as sRoute from '#sys/route.js';
|
|
12
|
-
import * as lCore from '#lib/core.js';
|
|
13
|
-
import * as lFs from '#lib/fs.js';
|
|
14
|
-
import * as lText from '#lib/text.js';
|
|
15
|
-
import * as lCrypto from '#lib/crypto.js';
|
|
16
|
-
import * as lTime from '#lib/time.js';
|
|
17
|
-
import * as lZip from '#lib/zip.js';
|
|
10
|
+
import * as kebab from '#kebab/index.js';
|
|
11
|
+
import * as sRoute from '#kebab/sys/route.js';
|
|
12
|
+
import * as lCore from '#kebab/lib/core.js';
|
|
13
|
+
import * as lFs from '#kebab/lib/fs.js';
|
|
14
|
+
import * as lText from '#kebab/lib/text.js';
|
|
15
|
+
import * as lCrypto from '#kebab/lib/crypto.js';
|
|
16
|
+
import * as lTime from '#kebab/lib/time.js';
|
|
17
|
+
import * as lZip from '#kebab/lib/zip.js';
|
|
18
18
|
/** --- 当前运行中的子进程列表 --- */
|
|
19
19
|
const workerList = {};
|
|
20
20
|
/**
|
package/sys/mod.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project:
|
|
2
|
+
* Project: Kebab, User: JianSuoQiYue
|
|
3
3
|
* Date: 2019-6-4 21:35
|
|
4
4
|
* Last: 2020-4-14 13:33:51, 2022-07-23 16:01:34, 2022-09-06 22:59:26, 2023-5-24 19:11:37, 2023-6-13 21:47:58, 2023-7-10 18:54:03, 2023-8-23 17:03:16, 2023-12-11 15:21:22, 2023-12-20 23:12:03, 2024-3-8 16:05:29, 2024-3-20 19:58:15, 2024-8-11 21:14:54, 2024-10-5 14:00:22, 2024-12-14 19:58:34, 2025-9-23 11:01:36
|
|
5
5
|
*/
|
|
6
|
-
import * as lSql from '#lib/sql.js';
|
|
7
|
-
import * as lDb from '#lib/db.js';
|
|
8
|
-
import * as sCtr from '#sys/ctr.js';
|
|
9
|
-
import * as kebab from '#index.js';
|
|
6
|
+
import * as lSql from '#kebab/lib/sql.js';
|
|
7
|
+
import * as lDb from '#kebab/lib/db.js';
|
|
8
|
+
import * as sCtr from '#kebab/sys/ctr.js';
|
|
9
|
+
import * as kebab from '#kebab/index.js';
|
|
10
10
|
/** --- 只获取变量 --- */
|
|
11
11
|
type TOnlyProperties<T> = {
|
|
12
12
|
[K in keyof T as T[K] extends (...args: any[]) => any ? never : K]: T[K];
|
|
@@ -58,7 +58,7 @@ export default class Mod {
|
|
|
58
58
|
protected _db: lDb.Pool | lDb.Transaction;
|
|
59
59
|
/** --- Sql 对象 --- */
|
|
60
60
|
protected _sql: lSql.Sql;
|
|
61
|
-
/** --- ctr
|
|
61
|
+
/** --- ctr 对象 --- */
|
|
62
62
|
protected _ctr?: sCtr.Ctr;
|
|
63
63
|
/**
|
|
64
64
|
* --- 构造函数 ---
|
package/sys/mod.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project:
|
|
2
|
+
* Project: Kebab, User: JianSuoQiYue
|
|
3
3
|
* Date: 2019-6-4 21:35
|
|
4
4
|
* Last: 2020-4-14 13:33:51, 2022-07-23 16:01:34, 2022-09-06 22:59:26, 2023-5-24 19:11:37, 2023-6-13 21:47:58, 2023-7-10 18:54:03, 2023-8-23 17:03:16, 2023-12-11 15:21:22, 2023-12-20 23:12:03, 2024-3-8 16:05:29, 2024-3-20 19:58:15, 2024-8-11 21:14:54, 2024-10-5 14:00:22, 2024-12-14 19:58:34, 2025-9-23 11:01:36
|
|
5
5
|
*/
|
|
6
|
-
import * as lSql from '#lib/sql.js';
|
|
7
|
-
import * as lTime from '#lib/time.js';
|
|
8
|
-
import * as lCore from '#lib/core.js';
|
|
9
|
-
import * as lText from '#lib/text.js';
|
|
10
|
-
import * as sCtr from '#sys/ctr.js';
|
|
6
|
+
import * as lSql from '#kebab/lib/sql.js';
|
|
7
|
+
import * as lTime from '#kebab/lib/time.js';
|
|
8
|
+
import * as lCore from '#kebab/lib/core.js';
|
|
9
|
+
import * as lText from '#kebab/lib/text.js';
|
|
10
|
+
import * as sCtr from '#kebab/sys/ctr.js';
|
|
11
11
|
/** --- 条数列表 --- */
|
|
12
12
|
class Rows {
|
|
13
13
|
constructor(initialItems = []) {
|
|
@@ -89,7 +89,7 @@ class Mod {
|
|
|
89
89
|
this._contain = null;
|
|
90
90
|
/** --- 已算出的 total --- */
|
|
91
91
|
this._total = [];
|
|
92
|
-
/** --- ctr
|
|
92
|
+
/** --- ctr 对象 --- */
|
|
93
93
|
this._ctr = undefined;
|
|
94
94
|
/** --- 设置的 limit --- */
|
|
95
95
|
this._limit = [0, 0];
|
package/sys/route.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import * as http from 'http';
|
|
|
7
7
|
import * as http2 from 'http2';
|
|
8
8
|
import * as net from 'net';
|
|
9
9
|
import * as sCtr from './ctr.js';
|
|
10
|
-
import * as kebab from '#index.js';
|
|
10
|
+
import * as kebab from '#kebab/index.js';
|
|
11
11
|
/**
|
|
12
12
|
* --- 清除已经加载的虚拟主机配置文件 ---
|
|
13
13
|
*/
|
|
@@ -35,7 +35,7 @@ export declare function run(data: {
|
|
|
35
35
|
};
|
|
36
36
|
}): Promise<boolean>;
|
|
37
37
|
/**
|
|
38
|
-
* ---
|
|
38
|
+
* --- 删除本次请求所有已上传的临时文件 ---
|
|
39
39
|
* @param cctr Ctr 对象 或 files
|
|
40
40
|
*/
|
|
41
41
|
export declare function unlinkUploadFiles(cctr: sCtr.Ctr | Record<string, kebab.IPostFile | kebab.IPostFile[]>): Promise<void>;
|
|
@@ -46,10 +46,14 @@ export declare function unlinkUploadFiles(cctr: sCtr.Ctr | Record<string, kebab.
|
|
|
46
46
|
*/
|
|
47
47
|
export declare function waitCtr(cctr: sCtr.Ctr): Promise<void>;
|
|
48
48
|
/**
|
|
49
|
-
* ---
|
|
50
|
-
* @param
|
|
49
|
+
* --- 获取 post 对象(通常已自动获取),如果是文件上传(formdata)的情况则不获取 ---
|
|
50
|
+
* @param req 请求对象
|
|
51
51
|
*/
|
|
52
|
-
export declare function
|
|
52
|
+
export declare function getPost(req: http2.Http2ServerRequest | http.IncomingMessage): Promise<{
|
|
53
|
+
'input': string;
|
|
54
|
+
'raw': Record<string, any>;
|
|
55
|
+
'post': Record<string, any>;
|
|
56
|
+
}>;
|
|
53
57
|
/**
|
|
54
58
|
* --- 获取 formdata 的 post ---
|
|
55
59
|
* @param req 请求头
|
package/sys/route.js
CHANGED
|
@@ -8,16 +8,16 @@ import * as stream from 'stream';
|
|
|
8
8
|
// --- 第三方 ---
|
|
9
9
|
import * as ws from '@litert/websocket';
|
|
10
10
|
// --- 库和定义 ---
|
|
11
|
-
import * as lFs from '#lib/fs.js';
|
|
12
|
-
import * as lZlib from '#lib/zlib.js';
|
|
13
|
-
import * as lCore from '#lib/core.js';
|
|
14
|
-
import * as lText from '#lib/text.js';
|
|
15
|
-
import * as lTime from '#lib/time.js';
|
|
16
|
-
import * as lResponse from '#lib/net/response.js';
|
|
17
|
-
import * as lWs from '#lib/ws.js';
|
|
18
|
-
import * as lLang from '#lib/lang.js';
|
|
11
|
+
import * as lFs from '#kebab/lib/fs.js';
|
|
12
|
+
import * as lZlib from '#kebab/lib/zlib.js';
|
|
13
|
+
import * as lCore from '#kebab/lib/core.js';
|
|
14
|
+
import * as lText from '#kebab/lib/text.js';
|
|
15
|
+
import * as lTime from '#kebab/lib/time.js';
|
|
16
|
+
import * as lResponse from '#kebab/lib/net/response.js';
|
|
17
|
+
import * as lWs from '#kebab/lib/ws.js';
|
|
18
|
+
import * as lLang from '#kebab/lib/lang.js';
|
|
19
19
|
import * as sCtr from './ctr.js';
|
|
20
|
-
import * as kebab from '#index.js';
|
|
20
|
+
import * as kebab from '#kebab/index.js';
|
|
21
21
|
/** --- 动态层 kebab.json 缓存(文件路径: 最终合并值) --- */
|
|
22
22
|
let kebabConfigs = {};
|
|
23
23
|
/**
|
|
@@ -365,18 +365,18 @@ export async function run(data) {
|
|
|
365
365
|
middle.setPrototype('_action', pathRight);
|
|
366
366
|
middle.setPrototype('_headers', headers);
|
|
367
367
|
middle.setPrototype('_get', get);
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
368
|
+
/** --- 是否让框架自动获取 post,true 为自动(默认) --- */
|
|
369
|
+
const reqStartRtn = await middle.onReqStart();
|
|
370
|
+
if (reqStartRtn) {
|
|
371
|
+
const rawPost = await getPost(data.req);
|
|
372
|
+
// --- 原始 POST ---
|
|
373
|
+
middle.setPrototype('_rawPost', rawPost.raw);
|
|
374
|
+
// --- 原始 input ---
|
|
375
|
+
middle.setPrototype('_input', rawPost.input);
|
|
376
|
+
// --- 处理后的 post ---
|
|
377
|
+
middle.setPrototype('_post', rawPost.post);
|
|
378
|
+
// --- form data 格式交由用户自行获取,可以直接获取文件流,然后做他想做的事情 ---
|
|
379
|
+
}
|
|
380
380
|
// --- 执行中间控制器的 onLoad ---
|
|
381
381
|
try {
|
|
382
382
|
rtn = await middle.onLoad();
|
|
@@ -717,7 +717,7 @@ function getPathLeftRight(path) {
|
|
|
717
717
|
return [path.slice(0, pathLio), right === '' ? 'index' : right];
|
|
718
718
|
}
|
|
719
719
|
/**
|
|
720
|
-
* --- 根据 path 获取 ws
|
|
720
|
+
* --- 根据 path 获取 ws 的控制器类名 ---
|
|
721
721
|
* @param path 路径
|
|
722
722
|
*/
|
|
723
723
|
function getWsCtrName(path) {
|
|
@@ -728,7 +728,7 @@ function getWsCtrName(path) {
|
|
|
728
728
|
return path.slice(pathLio + 1).toLowerCase();
|
|
729
729
|
}
|
|
730
730
|
/**
|
|
731
|
-
* ---
|
|
731
|
+
* --- 删除本次请求所有已上传的临时文件 ---
|
|
732
732
|
* @param cctr Ctr 对象 或 files
|
|
733
733
|
*/
|
|
734
734
|
export async function unlinkUploadFiles(cctr) {
|
|
@@ -765,29 +765,18 @@ export async function waitCtr(cctr) {
|
|
|
765
765
|
await unlinkUploadFiles(cctr);
|
|
766
766
|
}
|
|
767
767
|
/**
|
|
768
|
-
* ---
|
|
769
|
-
* @param post
|
|
770
|
-
*/
|
|
771
|
-
export function trimPost(post) {
|
|
772
|
-
for (const key in post) {
|
|
773
|
-
const val = post[key];
|
|
774
|
-
if (typeof val === 'string') {
|
|
775
|
-
post[key] = post[key].trim();
|
|
776
|
-
}
|
|
777
|
-
else if (typeof val === 'object') {
|
|
778
|
-
trimPost(post[key]);
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
/**
|
|
783
|
-
* --- 内部使用,获取 post 对象,如果是文件上传(formdata)的情况则不获取 ---
|
|
768
|
+
* --- 获取 post 对象(通常已自动获取),如果是文件上传(formdata)的情况则不获取 ---
|
|
784
769
|
* @param req 请求对象
|
|
785
770
|
*/
|
|
786
|
-
function getPost(req) {
|
|
771
|
+
export function getPost(req) {
|
|
787
772
|
return new Promise(function (resolve) {
|
|
788
773
|
const ct = req.headers['content-type'] ?? '';
|
|
789
774
|
if (ct.includes('form-data')) {
|
|
790
|
-
resolve(
|
|
775
|
+
resolve({
|
|
776
|
+
'input': '',
|
|
777
|
+
'raw': {},
|
|
778
|
+
'post': {},
|
|
779
|
+
});
|
|
791
780
|
return;
|
|
792
781
|
}
|
|
793
782
|
// --- json 或普通 post ---
|
|
@@ -798,20 +787,38 @@ function getPost(req) {
|
|
|
798
787
|
req.on('end', function () {
|
|
799
788
|
const s = buffer.toString();
|
|
800
789
|
if (!s) {
|
|
801
|
-
resolve(
|
|
790
|
+
resolve({
|
|
791
|
+
'input': '',
|
|
792
|
+
'raw': {},
|
|
793
|
+
'post': {},
|
|
794
|
+
});
|
|
802
795
|
return;
|
|
803
796
|
}
|
|
804
797
|
// --- 判断 json 还是普通 ---
|
|
805
798
|
if (ct.includes('json')) {
|
|
806
799
|
try {
|
|
807
|
-
|
|
800
|
+
const raw = lText.parseJson(s);
|
|
801
|
+
resolve({
|
|
802
|
+
'input': s,
|
|
803
|
+
'raw': raw,
|
|
804
|
+
'post': lText.trimJson(raw),
|
|
805
|
+
});
|
|
808
806
|
}
|
|
809
807
|
catch {
|
|
810
|
-
resolve(
|
|
808
|
+
resolve({
|
|
809
|
+
'input': '',
|
|
810
|
+
'raw': {},
|
|
811
|
+
'post': {},
|
|
812
|
+
});
|
|
811
813
|
}
|
|
812
814
|
return;
|
|
813
815
|
}
|
|
814
|
-
|
|
816
|
+
const raw = lText.queryParse(s);
|
|
817
|
+
resolve({
|
|
818
|
+
'input': s,
|
|
819
|
+
'raw': raw,
|
|
820
|
+
'post': lText.trimJson(raw),
|
|
821
|
+
});
|
|
815
822
|
});
|
|
816
823
|
});
|
|
817
824
|
}
|
package/www/example/ctr/main.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import * as kebab from '#index.js';
|
|
2
|
-
import * as sCtr from '#sys/ctr.js';
|
|
1
|
+
import * as kebab from '#kebab/index.js';
|
|
2
|
+
import * as sCtr from '#kebab/sys/ctr.js';
|
|
3
3
|
export default class extends sCtr.Ctr {
|
|
4
|
+
onReqStart(): boolean;
|
|
4
5
|
onLoad(): string | boolean;
|
|
5
6
|
onUnload(rtn: string | boolean | kebab.DbValue[]): string | boolean | kebab.DbValue[];
|
|
6
7
|
}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
import * as sCtr from '#sys/ctr.js';
|
|
1
|
+
import * as sCtr from '#kebab/sys/ctr.js';
|
|
2
2
|
export default class extends sCtr.Ctr {
|
|
3
|
+
onReqStart() {
|
|
4
|
+
if (this._config.const.path === 'test/net-mproxy1') {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
if (this._config.const.path.startsWith('test/net-rproxy/')) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
3
12
|
onLoad() {
|
|
4
13
|
if (this._config.const.path !== 'test/middle') {
|
|
5
14
|
return true;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
|
-
import * as kebab from '#index.js';
|
|
3
|
-
import * as sCtr from '#sys/ctr.js';
|
|
2
|
+
import * as kebab from '#kebab/index.js';
|
|
3
|
+
import * as sCtr from '#kebab/sys/ctr.js';
|
|
4
4
|
export default class extends sCtr.Ctr {
|
|
5
5
|
private _internalUrl;
|
|
6
6
|
onLoad(): Array<string | number> | boolean;
|