@maiyunnet/kebab 3.2.6 → 3.2.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 +1 -1
- package/lib/crypto.d.ts +7 -3
- package/lib/crypto.js +15 -11
- package/lib/ws.js +4 -1
- package/package.json +1 -1
- package/sys/ctr.d.ts +5 -2
- package/www/example/ctr/test.js +3 -0
- package/www/example/ws/test.js +4 -4
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* --- 本文件用来定义每个目录实体地址的常量 ---
|
|
7
7
|
*/
|
|
8
8
|
/** --- 当前系统版本号 --- */
|
|
9
|
-
export const VER = '3.2.
|
|
9
|
+
export const VER = '3.2.8';
|
|
10
10
|
// --- 服务端用的路径 ---
|
|
11
11
|
const imu = decodeURIComponent(import.meta.url).replace('file://', '').replace(/^\/(\w:)/, '$1');
|
|
12
12
|
/** --- /xxx/xxx --- */
|
package/lib/crypto.d.ts
CHANGED
|
@@ -58,9 +58,13 @@ export declare function publicDecrypt(key: crypto.RsaPublicKey | crypto.RsaPriva
|
|
|
58
58
|
* @param buffer 数据
|
|
59
59
|
*/
|
|
60
60
|
export declare function privateDecrypt(key: crypto.RsaPrivateKey | crypto.KeyLike, buffer: NodeJS.ArrayBufferView | string): Buffer;
|
|
61
|
+
/** --- 勿使用,无 iv 默认,但勿使用 --- */
|
|
61
62
|
export declare const AES_256_ECB = "aes-256-ecb";
|
|
63
|
+
/** --- 一般不用,兼容性场景下用 --- */
|
|
62
64
|
export declare const AES_256_CBC = "aes-256-cbc";
|
|
63
|
-
|
|
65
|
+
/** --- 设置 iv 会自动切换为 CTR,流式下使用,非流直接使用 GCM --- */
|
|
66
|
+
export declare const AES_256_CTR = "aes-256-ctr";
|
|
67
|
+
/** --- 非流直接使用 GCM --- */
|
|
64
68
|
export declare const AES_256_GCM = "aes-256-gcm";
|
|
65
69
|
export declare const SM4_ECB = "sm4-ecb";
|
|
66
70
|
export declare const SM4_CBC = "sm4-cbc";
|
|
@@ -69,7 +73,7 @@ export declare const SM4_CFB = "sm4-cfb";
|
|
|
69
73
|
* --- cipher 加密,强烈不建议使用 AES_256_ECB ---
|
|
70
74
|
* @param original 原始字符串
|
|
71
75
|
* @param key 密钥 32 个英文字母和数字
|
|
72
|
-
* @param iv 向量 16(
|
|
76
|
+
* @param iv 向量 16(CTR) 或 12(GCM) 个英文字母和数字
|
|
73
77
|
* @param method 加密方法
|
|
74
78
|
*/
|
|
75
79
|
export declare function cipherEncrypt(original: string | Buffer, key: crypto.CipherKey, iv?: string, method?: string, output?: 'base64' | 'buffer'): string | Buffer | false;
|
|
@@ -83,7 +87,7 @@ export declare function sm4Encrypt(original: string | Buffer, key: crypto.Cipher
|
|
|
83
87
|
* --- cipher 解密 ---
|
|
84
88
|
* @param encrypt 需解密的字符串
|
|
85
89
|
* @param key 密钥 32 个英文字母和数字
|
|
86
|
-
* @param iv 向量 16(
|
|
90
|
+
* @param iv 向量 16(CTR) 或 12(GCM) 个英文字母和数字
|
|
87
91
|
* @param method 加密方法
|
|
88
92
|
*/
|
|
89
93
|
export declare function cipherDecrypt(encrypt: string | Buffer, key: crypto.CipherKey, iv?: string, method?: string, output?: 'binary' | 'buffer'): string | Buffer | false;
|
package/lib/crypto.js
CHANGED
|
@@ -96,10 +96,14 @@ export function privateDecrypt(key, buffer) {
|
|
|
96
96
|
return crypto.privateDecrypt(key, buffer);
|
|
97
97
|
}
|
|
98
98
|
// --- Cipher (AES/SM4...) 加/解密 ---
|
|
99
|
-
|
|
99
|
+
/** --- 勿使用,无 iv 默认,但勿使用 --- */
|
|
100
|
+
export const AES_256_ECB = 'aes-256-ecb';
|
|
101
|
+
/** --- 一般不用,兼容性场景下用 --- */
|
|
100
102
|
export const AES_256_CBC = 'aes-256-cbc';
|
|
101
|
-
|
|
102
|
-
export const
|
|
103
|
+
/** --- 设置 iv 会自动切换为 CTR,流式下使用,非流直接使用 GCM --- */
|
|
104
|
+
export const AES_256_CTR = 'aes-256-ctr';
|
|
105
|
+
/** --- 非流直接使用 GCM --- */
|
|
106
|
+
export const AES_256_GCM = 'aes-256-gcm';
|
|
103
107
|
export const SM4_ECB = 'sm4-ecb'; // --- SM4 如果未设置 iv,则默认这个 ---
|
|
104
108
|
export const SM4_CBC = 'sm4-cbc';
|
|
105
109
|
export const SM4_CFB = 'sm4-cfb'; // --- SM4 一般用这个,设置 iv,自动就切换成了这个 ---
|
|
@@ -107,7 +111,7 @@ export const SM4_CFB = 'sm4-cfb'; // --- SM4 一般用这个,设置 iv,自
|
|
|
107
111
|
* --- cipher 加密,强烈不建议使用 AES_256_ECB ---
|
|
108
112
|
* @param original 原始字符串
|
|
109
113
|
* @param key 密钥 32 个英文字母和数字
|
|
110
|
-
* @param iv 向量 16(
|
|
114
|
+
* @param iv 向量 16(CTR) 或 12(GCM) 个英文字母和数字
|
|
111
115
|
* @param method 加密方法
|
|
112
116
|
*/
|
|
113
117
|
export function cipherEncrypt(original, key, iv = '', method = AES_256_ECB, output = 'base64') {
|
|
@@ -116,7 +120,7 @@ export function cipherEncrypt(original, key, iv = '', method = AES_256_ECB, outp
|
|
|
116
120
|
key = hashHmac('md5', key, 'MaiyunSalt');
|
|
117
121
|
}
|
|
118
122
|
if (iv) {
|
|
119
|
-
if (method ===
|
|
123
|
+
if (method === AES_256_CTR) {
|
|
120
124
|
if (iv.length !== 16) {
|
|
121
125
|
return false;
|
|
122
126
|
}
|
|
@@ -165,13 +169,13 @@ export function cipherEncrypt(original, key, iv = '', method = AES_256_ECB, outp
|
|
|
165
169
|
* --- AES 加密 ---
|
|
166
170
|
* @param original 原始字符串
|
|
167
171
|
* @param key 密钥尽量 32 个英文字母和数字,不是 32 个系统会自动处理
|
|
168
|
-
* @param iv 向量 16 个英文字母和数字
|
|
172
|
+
* @param iv 向量 16(CTR) 或 12(GCM) 个英文字母和数字
|
|
169
173
|
* @param method 加密方法
|
|
170
174
|
* @param output 输出类型
|
|
171
175
|
*/
|
|
172
176
|
export function aesEncrypt(original, key, iv = '', method = AES_256_ECB, output = 'base64') {
|
|
173
177
|
if (iv !== '') {
|
|
174
|
-
method = method === AES_256_ECB ?
|
|
178
|
+
method = method === AES_256_ECB ? AES_256_CTR : method;
|
|
175
179
|
}
|
|
176
180
|
return cipherEncrypt(original, key, iv, method, output);
|
|
177
181
|
}
|
|
@@ -206,7 +210,7 @@ export function sm4Encrypt(original, key, iv = '', method = SM4_ECB, output = 'b
|
|
|
206
210
|
* --- cipher 解密 ---
|
|
207
211
|
* @param encrypt 需解密的字符串
|
|
208
212
|
* @param key 密钥 32 个英文字母和数字
|
|
209
|
-
* @param iv 向量 16(
|
|
213
|
+
* @param iv 向量 16(CTR) 或 12(GCM) 个英文字母和数字
|
|
210
214
|
* @param method 加密方法
|
|
211
215
|
*/
|
|
212
216
|
export function cipherDecrypt(encrypt, key, iv = '', method = AES_256_ECB, output = 'binary') {
|
|
@@ -215,7 +219,7 @@ export function cipherDecrypt(encrypt, key, iv = '', method = AES_256_ECB, outpu
|
|
|
215
219
|
key = hashHmac('md5', key, 'MaiyunSalt');
|
|
216
220
|
}
|
|
217
221
|
if (iv) {
|
|
218
|
-
if (method ===
|
|
222
|
+
if (method === AES_256_CTR) {
|
|
219
223
|
if (iv.length !== 16) {
|
|
220
224
|
return false;
|
|
221
225
|
}
|
|
@@ -268,12 +272,12 @@ export function cipherDecrypt(encrypt, key, iv = '', method = AES_256_ECB, outpu
|
|
|
268
272
|
* --- AES 解密 ---
|
|
269
273
|
* @param encrypt 需解密的字符串
|
|
270
274
|
* @param key 密钥 32 个英文字母和数字
|
|
271
|
-
* @param iv 向量 16 个英文字母和数字
|
|
275
|
+
* @param iv 向量 16(CTR) 或 12(GCM) 个英文字母和数字
|
|
272
276
|
* @param method 加密方法
|
|
273
277
|
*/
|
|
274
278
|
export function aesDecrypt(encrypt, key, iv = '', method = AES_256_ECB, output = 'binary') {
|
|
275
279
|
if (iv !== '') {
|
|
276
|
-
method = method === AES_256_ECB ?
|
|
280
|
+
method = method === AES_256_ECB ? AES_256_CTR : method;
|
|
277
281
|
}
|
|
278
282
|
return cipherDecrypt(encrypt, key, iv, method, output);
|
|
279
283
|
}
|
package/lib/ws.js
CHANGED
|
@@ -177,11 +177,14 @@ export class Socket {
|
|
|
177
177
|
break;
|
|
178
178
|
}
|
|
179
179
|
case 'end': {
|
|
180
|
+
if (!this._ws.ended) {
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
180
183
|
cb();
|
|
181
184
|
break;
|
|
182
185
|
}
|
|
183
186
|
default: {
|
|
184
|
-
// --- close ---
|
|
187
|
+
// --- drain, close ---
|
|
185
188
|
if (!this._close) {
|
|
186
189
|
break;
|
|
187
190
|
}
|
package/package.json
CHANGED
package/sys/ctr.d.ts
CHANGED
|
@@ -111,11 +111,14 @@ export declare class Ctr {
|
|
|
111
111
|
'timeout'?: number;
|
|
112
112
|
};
|
|
113
113
|
/**
|
|
114
|
-
* --- WebSocket 下当收到数据时会自动被调用的事件,即只文本和二进制数据,返回内容会被发送给 socket
|
|
114
|
+
* --- WebSocket 下当收到数据时会自动被调用的事件,即只文本和二进制数据,返回内容会被发送给 socket ---
|
|
115
|
+
* --- 但返回 false 连接会被中断,什么都不返回则什么都不做 ---
|
|
115
116
|
*/
|
|
116
117
|
onData(data: Buffer | string, opcode: lWs.EOpcode): kebab.Json;
|
|
117
118
|
/**
|
|
118
|
-
* --- 包含所有 opcode 的消息,若要发送数据需自行调用 write 方法,data 恒定为原始 buffer
|
|
119
|
+
* --- 包含所有 opcode 的消息,若要发送数据需自行调用 write 方法,data 恒定为原始 buffer ---
|
|
120
|
+
* --- 返回 false 则不会执行默认方法,一般请什么都不要返回 ---
|
|
121
|
+
* --- 返回 false 链接也不会中断 ---
|
|
119
122
|
* @param data 数据
|
|
120
123
|
* @param opcode opcode
|
|
121
124
|
*/
|
package/www/example/ctr/test.js
CHANGED
|
@@ -2790,6 +2790,9 @@ setInterval(() => {
|
|
|
2790
2790
|
ws.on('message', (frame) => {
|
|
2791
2791
|
echo.push('<div>Server: ' + frame.data.toString() + '.</div>');
|
|
2792
2792
|
});
|
|
2793
|
+
ws.on('end', () => {
|
|
2794
|
+
lCore.display('CLIENT onEnd');
|
|
2795
|
+
});
|
|
2793
2796
|
ws.on('close', () => {
|
|
2794
2797
|
resolve();
|
|
2795
2798
|
});
|
package/www/example/ws/test.js
CHANGED
|
@@ -7,13 +7,13 @@ export default class extends sCtr.Ctr {
|
|
|
7
7
|
this._nick = '';
|
|
8
8
|
}
|
|
9
9
|
onUpgrade() {
|
|
10
|
-
lCore.
|
|
10
|
+
lCore.display('[/test] WebSocket test onUpgrade.');
|
|
11
11
|
return {
|
|
12
12
|
'timeout': 60_000 * 2,
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
onLoad() {
|
|
16
|
-
lCore.
|
|
16
|
+
lCore.display('[/test] WebSocket test onLoad.');
|
|
17
17
|
setTimeout(() => {
|
|
18
18
|
if (!this._nick) {
|
|
19
19
|
return;
|
|
@@ -32,11 +32,11 @@ export default class extends sCtr.Ctr {
|
|
|
32
32
|
}
|
|
33
33
|
// --- 用户消息 ---
|
|
34
34
|
const date = new Date();
|
|
35
|
-
lCore.
|
|
35
|
+
lCore.display('[/test] [' + date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0') + ':' + date.getSeconds().toString().padStart(2, '0') + '] WebSocket test onData, data: ' + data);
|
|
36
36
|
return '<b>' + this._nick + ':</b> ' + data;
|
|
37
37
|
}
|
|
38
38
|
onClose() {
|
|
39
|
-
lCore.
|
|
39
|
+
lCore.display('[/test] WebSocket test onClose, nick: ' + this._nick);
|
|
40
40
|
this._nick = '';
|
|
41
41
|
}
|
|
42
42
|
}
|