ddan-js 2.8.1 → 2.8.2

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.
@@ -69,36 +69,40 @@ function radian2degree(radians) {
69
69
  function degree2radian(degrees) {
70
70
  return degrees / radiansToAngles;
71
71
  }
72
- function formatMemory(mem) {
73
- let _mem = mem;
72
+ function calcDataSize(data) {
74
73
  const result = {
75
- g: 0,
76
- m: 0,
74
+ gb: 0,
75
+ mb: 0,
77
76
  kb: 0,
78
77
  b: 0,
78
+ total: data,
79
79
  desc: '',
80
80
  };
81
- if (_mem >= 1 << 30) {
82
- result.g = Math.floor(_mem / (1 << 30));
83
- _mem = _mem % (1 << 30);
81
+ const units = [
82
+ { name: 'gb', divisor: 1 << 30 },
83
+ { name: 'mb', divisor: 1 << 20 },
84
+ { name: 'kb', divisor: 1 << 10 },
85
+ { name: 'b', divisor: 1 },
86
+ ];
87
+ // 计算每个单位的数量
88
+ for (const unit of units) {
89
+ const value = Math.floor(data / unit.divisor);
90
+ result[unit.name] = value;
91
+ data -= value * unit.divisor;
84
92
  }
85
- if (_mem >= 1 << 20) {
86
- result.m = Math.floor(_mem / (1 << 20));
87
- _mem = _mem % (1 << 20);
93
+ // 计算简洁的描述
94
+ if (result.gb > 0) {
95
+ result.desc = (result.gb + result.mb / 1024).toFixed(2) + 'GB';
88
96
  }
89
- if (_mem >= 1 << 10) {
90
- result.kb = Math.floor(_mem / (1 << 10));
91
- _mem = _mem % (1 << 10);
97
+ else if (result.mb > 0) {
98
+ result.desc = (result.mb + result.kb / 1024).toFixed(2) + 'MB';
99
+ }
100
+ else if (result.kb > 0) {
101
+ result.desc = (result.kb + result.b / 1024).toFixed(2) + 'KB';
102
+ }
103
+ else {
104
+ result.desc = result.b + 'B';
92
105
  }
93
- result.b = _mem;
94
- if (mem >= 1 << 30)
95
- result.desc = (mem / (1 << 30)).toFixed(2) + 'G';
96
- else if (mem >= 1 << 20)
97
- result.desc = (mem / (1 << 20)).toFixed(2) + 'M';
98
- else if (mem >= 1 << 10)
99
- result.desc = (mem / (1 << 10)).toFixed(2) + 'KB';
100
- else
101
- result.desc = mem + 'B';
102
106
  return result;
103
107
  }
104
108
  exports.default = {
@@ -110,5 +114,5 @@ exports.default = {
110
114
  float,
111
115
  radian2degree,
112
116
  degree2radian,
113
- formatMemory,
117
+ calcDataSize,
114
118
  };
@@ -23,6 +23,8 @@ class Socks5 {
23
23
  __event;
24
24
  __pipeline;
25
25
  __logger;
26
+ __totalReceived = 0;
27
+ __totalSent = 0;
26
28
  constructor(upstreamProxy, allowedDomains = ['*'], debug = false, logger) {
27
29
  this.__event = new event_1.default();
28
30
  this.upstreamProxy = upstreamProxy;
@@ -43,6 +45,12 @@ class Socks5 {
43
45
  return '';
44
46
  return `socks5://127.0.0.1:${this.__port}`;
45
47
  }
48
+ get totalReceived() {
49
+ return this.__totalReceived;
50
+ }
51
+ get totalSent() {
52
+ return this.__totalSent;
53
+ }
46
54
  validateProxyConfig(proxyConfig = this.upstreamProxy) {
47
55
  const { ipaddress, port, userId, password } = proxyConfig || {};
48
56
  if (!ipaddress || typeof ipaddress !== 'string') {
@@ -146,19 +154,19 @@ class Socks5 {
146
154
  // 走上游代理
147
155
  const upstreamSocket = await this.connectToUpstreamProxy(destination);
148
156
  this.__logger?.info(`[socks5] handle connection upstream`, addrport);
149
- this.setupDataForwarding(clientSocket, upstreamSocket);
157
+ this.setupDataForwarding(clientSocket, upstreamSocket, 'upstream');
150
158
  }
151
159
  else if (this.useSystemProxy && this.systemProxy && !index_1.default.isLocalIpAddress(addr)) {
152
160
  // 走系统代理
153
161
  const systemSocket = await this.connectToSystemProxy(destination);
154
162
  this.__debug && console.info(`[socks5] handle connection system`, addrport);
155
- this.setupDataForwarding(clientSocket, systemSocket);
163
+ this.setupDataForwarding(clientSocket, systemSocket, 'system');
156
164
  }
157
165
  else {
158
166
  this.__debug && console.info(`[socks5] handle connection local`, addrport);
159
167
  // 本地连接
160
168
  const localSocket = await this.connectToLocal(destination);
161
- this.setupDataForwarding(clientSocket, localSocket);
169
+ this.setupDataForwarding(clientSocket, localSocket, 'local');
162
170
  }
163
171
  }
164
172
  catch (err) {
@@ -281,12 +289,20 @@ class Socks5 {
281
289
  });
282
290
  });
283
291
  }
284
- setupDataForwarding(clientSocket, targetSocket) {
292
+ setupDataForwarding(clientSocket, targetSocket, type = 'local') {
285
293
  clientSocket.write(new Uint8Array([0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]));
286
294
  clientSocket.pipe(targetSocket);
287
295
  targetSocket.pipe(clientSocket);
288
296
  const addrPort = `${targetSocket.localAddress}:${targetSocket.localPort}`;
289
297
  this.__debug && console.info(`[socks5] setupDataForwarding ${addrPort}`);
298
+ if (type === 'upstream') {
299
+ targetSocket.on('data', (buf) => {
300
+ this.__totalSent += buf.length;
301
+ });
302
+ clientSocket.on('data', (buf) => {
303
+ this.__totalReceived += buf.length;
304
+ });
305
+ }
290
306
  clientSocket.on('close', () => {
291
307
  this.__debug && console.info('[socks5] client socket close', addrPort);
292
308
  targetSocket.end();
@@ -348,6 +364,10 @@ class Socks5 {
348
364
  return;
349
365
  this.__event.off(name, listener);
350
366
  }
367
+ resetStatistics() {
368
+ this.__totalReceived = 0;
369
+ this.__totalSent = 0;
370
+ }
351
371
  _emit(name, ...args) {
352
372
  try {
353
373
  if (!name)
@@ -125,11 +125,12 @@ declare const dUtil: {
125
125
  }) => number;
126
126
  radian2degree: (radians: number) => number;
127
127
  degree2radian: (degrees: number) => number;
128
- formatMemory: (mem: number) => {
129
- g: number;
130
- m: number;
128
+ calcDataSize: (data: number) => {
129
+ gb: number;
130
+ mb: number;
131
131
  kb: number;
132
132
  b: number;
133
+ total: number;
133
134
  desc: string;
134
135
  };
135
136
  };
@@ -286,6 +287,25 @@ declare const dHook: {
286
287
  readonly Instance: T;
287
288
  readonly I: T;
288
289
  };
290
+ random: (max: number) => number;
291
+ randomRange: (min: number, max: number) => number;
292
+ lerp: (start: number, end: number, t: number) => number;
293
+ randoms: (max: number, count?: number, repeat?: boolean) => number[];
294
+ strip: (num: string | number, digits?: number) => number;
295
+ float: (num: string | number, { digits, fixed }?: {
296
+ digits?: number | undefined;
297
+ fixed?: boolean | undefined;
298
+ }) => number;
299
+ radian2degree: (radians: number) => number;
300
+ degree2radian: (degrees: number) => number;
301
+ calcDataSize: (data: number) => {
302
+ gb: number;
303
+ mb: number;
304
+ kb: number;
305
+ b: number;
306
+ total: number;
307
+ desc: string;
308
+ };
289
309
  toString: (value: any) => any;
290
310
  startCase: (string: any) => any;
291
311
  snakeCase: (string: any) => any;
@@ -317,10 +337,12 @@ declare const dHook: {
317
337
  logParse: (logStr: string) => string;
318
338
  logRString: (data: any) => Promise<string>;
319
339
  logRParse: (logStr: string) => Promise<string>;
320
- to: <T_2 = any, U extends object = any>(promise: Promise<T_2>, errorExt?: object | undefined) => Promise<[null, T_2] | [U, undefined]>;
321
- go: <T_3 = any>(task?: import("./typings").Ddan.PFunction<T_3> | undefined) => Promise<[any, undefined] | [null, T_3]>;
340
+ to: <T_2 = any, U extends object = any>(promise: Promise<T_2>, errorExt?: object | undefined, fn?: import("./typings").Ddan.noop | undefined) => Promise<[null, T_2] | [U, undefined]>;
341
+ go: <T_3 = any>(task?: import("./typings").Ddan.PFunction<T_3> | undefined, fn?: import("./typings").Ddan.noop | undefined) => Promise<[any, undefined] | [null, T_3]>;
322
342
  delay: (ms?: number) => Promise<unknown>;
323
- safeRun: <T_4 = any>(func: any) => Promise<[any, undefined] | [null, T_4]>;
343
+ safeRun: <T_4 = any>(func: any, fn?: import("./typings").Ddan.noop | undefined) => Promise<[any, undefined] | [null, T_4]>;
344
+ toError: (value: any) => any;
345
+ timeout: <T_5 = any>(task?: import("./typings").Ddan.PFunction<T_5> | undefined, ms?: number, desc?: string) => Promise<[any, undefined] | [null, T_5]>;
324
346
  base64: {
325
347
  encode: (input: string) => string;
326
348
  decode: (base64Str: string) => string;
@@ -699,10 +721,12 @@ declare const _default: {
699
721
  logParse: (logStr: string) => string;
700
722
  logRString: (data: any) => Promise<string>;
701
723
  logRParse: (logStr: string) => Promise<string>;
702
- to: <T_1 = any, U extends object = any>(promise: Promise<T_1>, errorExt?: object | undefined) => Promise<[null, T_1] | [U, undefined]>;
703
- go: <T_2 = any>(task?: import("./typings").Ddan.PFunction<T_2> | undefined) => Promise<[any, undefined] | [null, T_2]>;
724
+ to: <T_1 = any, U extends object = any>(promise: Promise<T_1>, errorExt?: object | undefined, fn?: import("./typings").Ddan.noop | undefined) => Promise<[null, T_1] | [U, undefined]>;
725
+ go: <T_2 = any>(task?: import("./typings").Ddan.PFunction<T_2> | undefined, fn?: import("./typings").Ddan.noop | undefined) => Promise<[any, undefined] | [null, T_2]>;
704
726
  delay: (ms?: number) => Promise<unknown>;
705
- safeRun: <T_3 = any>(func: any) => Promise<[any, undefined] | [null, T_3]>;
727
+ safeRun: <T_3 = any>(func: any, fn?: import("./typings").Ddan.noop | undefined) => Promise<[any, undefined] | [null, T_3]>;
728
+ toError: (value: any) => any;
729
+ timeout: <T_4 = any>(task?: import("./typings").Ddan.PFunction<T_4> | undefined, ms?: number, desc?: string) => Promise<[any, undefined] | [null, T_4]>;
706
730
  };
707
731
  math: {
708
732
  random: (max: number) => number;
@@ -716,24 +740,25 @@ declare const _default: {
716
740
  }) => number;
717
741
  radian2degree: (radians: number) => number;
718
742
  degree2radian: (degrees: number) => number;
719
- formatMemory: (mem: number) => {
720
- g: number;
721
- m: number;
743
+ calcDataSize: (data: number) => {
744
+ gb: number;
745
+ mb: number;
722
746
  kb: number;
723
747
  b: number;
748
+ total: number;
724
749
  desc: string;
725
750
  };
726
751
  };
727
752
  util: {
728
753
  includes: typeof import("./util/includes").default;
729
754
  forof: (source: any, cb: (key: any, val: any) => void) => void;
730
- singleton: <T_4>() => {
755
+ singleton: <T_5>() => {
731
756
  new (): {};
732
757
  __instance__: any;
733
- readonly Instance: T_4;
734
- readonly I: T_4;
758
+ readonly Instance: T_5;
759
+ readonly I: T_5;
735
760
  };
736
- getset: <T_5 = any>(t?: T_5 | undefined) => import("./typings").Ddan.IGetset<T_5>;
761
+ getset: <T_6 = any>(t?: T_6 | undefined) => import("./typings").Ddan.IGetset<T_6>;
737
762
  copy: (source: any, options?: {
738
763
  fields?: string[] | undefined;
739
764
  camel?: boolean | undefined;
@@ -746,7 +771,7 @@ declare const _default: {
746
771
  number?: boolean | undefined;
747
772
  boolean?: boolean | undefined;
748
773
  }) => any;
749
- cloneClass: <T_6>(source: T_6) => T_6;
774
+ cloneClass: <T_7>(source: T_7) => T_7;
750
775
  combine: (target: any, source: any, options?: import("./typings").Ddan.IIgnoreParams) => any;
751
776
  combines: (objs: any[], options?: import("./typings").Ddan.IIgnoreParams) => {};
752
777
  observe: (obj: any, key: any, watchFun: any, owner: any, deep?: boolean) => void;
@@ -778,16 +803,16 @@ declare const _default: {
778
803
  isArrayBuffer: (data: any) => boolean;
779
804
  };
780
805
  list: {
781
- stepAction: <T_7>(list: T_7[], func: import("./typings").Ddan.Task<T_7, void>, stepCount?: number) => void;
782
- skip: <T_8>(list: T_8[], count: number) => T_8[];
783
- take: <T_9>(list: T_9[], count: number, skip?: number) => T_9[];
784
- distinct: <T_10>(list: T_10[]) => T_10[];
785
- randoms: <T_11>(list: T_11[], count?: number, repeat?: boolean) => T_11[];
806
+ stepAction: <T_8>(list: T_8[], func: import("./typings").Ddan.Task<T_8, void>, stepCount?: number) => void;
807
+ skip: <T_9>(list: T_9[], count: number) => T_9[];
808
+ take: <T_10>(list: T_10[], count: number, skip?: number) => T_10[];
809
+ distinct: <T_11>(list: T_11[]) => T_11[];
810
+ randoms: <T_12>(list: T_12[], count?: number, repeat?: boolean) => T_12[];
786
811
  toKV: (list: import("./typings").Ddan.KV<any>[], key: string, value: string) => import("./typings").Ddan.KV<any>;
787
- groupBy: <T_12>(list: T_12[], key: string) => Record<string, T_12[]>;
788
- first: <T_13>(list: T_13[]) => T_13 | undefined;
789
- last: <T_14>(list: T_14[]) => T_14 | undefined;
790
- toList: <T_15>(val: T_15 | T_15[]) => T_15[];
812
+ groupBy: <T_13>(list: T_13[], key: string) => Record<string, T_13[]>;
813
+ first: <T_14>(list: T_14[]) => T_14 | undefined;
814
+ last: <T_15>(list: T_15[]) => T_15 | undefined;
815
+ toList: <T_16>(val: T_16 | T_16[]) => T_16[];
791
816
  };
792
817
  string: {
793
818
  toString: (value: any) => any;
@@ -820,7 +845,7 @@ declare const _default: {
820
845
  number?: boolean | undefined;
821
846
  boolean?: boolean | undefined;
822
847
  }) => any;
823
- cloneClass: <T_6>(source: T_6) => T_6;
848
+ cloneClass: <T_7>(source: T_7) => T_7;
824
849
  combine: (target: any, source: any, options?: import("./typings").Ddan.IIgnoreParams) => any;
825
850
  combines: (objs: any[], options?: import("./typings").Ddan.IIgnoreParams) => {};
826
851
  observe: (obj: any, key: any, watchFun: any, owner: any, deep?: boolean) => void;
@@ -1,9 +1,11 @@
1
1
  import { Ddan } from '../../typings';
2
- declare function to<T = any, U extends object = any>(promise: Promise<T>, errorExt?: object): Promise<[null, T] | [U, undefined]>;
2
+ declare function to<T = any, U extends object = any>(promise: Promise<T>, errorExt?: object, fn?: Ddan.noop): Promise<[null, T] | [U, undefined]>;
3
3
  declare const _default: {
4
4
  to: typeof to;
5
- go: <T = any>(task?: Ddan.PFunction<T> | undefined) => Promise<[any, undefined] | [null, T]>;
5
+ go: <T = any>(task?: Ddan.PFunction<T> | undefined, fn?: Ddan.noop | undefined) => Promise<[any, undefined] | [null, T]>;
6
6
  delay: (ms?: number) => Promise<unknown>;
7
- safeRun: <T_1 = any>(func: any) => Promise<[null, T_1] | [any, undefined]>;
7
+ safeRun: <T_1 = any>(func: any, fn?: Ddan.noop | undefined) => Promise<[null, T_1] | [any, undefined]>;
8
+ toError: (value: any) => any;
9
+ timeout: <T_2 = any>(task?: Ddan.PFunction<T_2> | undefined, ms?: number, desc?: string) => Promise<[any, undefined] | [null, T_2]>;
8
10
  };
9
11
  export default _default;
@@ -29,9 +29,11 @@ declare const _default: {
29
29
  logParse: (logStr: string) => string;
30
30
  logRString: (data: any) => Promise<string>;
31
31
  logRParse: (logStr: string) => Promise<string>;
32
- to: <T = any, U extends object = any>(promise: Promise<T>, errorExt?: object | undefined) => Promise<[null, T] | [U, undefined]>;
33
- go: <T_1 = any>(task?: Ddan.PFunction<T_1> | undefined) => Promise<[any, undefined] | [null, T_1]>;
32
+ to: <T = any, U extends object = any>(promise: Promise<T>, errorExt?: object | undefined, fn?: Ddan.noop | undefined) => Promise<[null, T] | [U, undefined]>;
33
+ go: <T_1 = any>(task?: Ddan.PFunction<T_1> | undefined, fn?: Ddan.noop | undefined) => Promise<[any, undefined] | [null, T_1]>;
34
34
  delay: (ms?: number) => Promise<unknown>;
35
- safeRun: <T_2 = any>(func: any) => Promise<[null, T_2] | [any, undefined]>;
35
+ safeRun: <T_2 = any>(func: any, fn?: Ddan.noop | undefined) => Promise<[null, T_2] | [any, undefined]>;
36
+ toError: (value: any) => any;
37
+ timeout: <T_3 = any>(task?: Ddan.PFunction<T_3> | undefined, ms?: number, desc?: string) => Promise<[any, undefined] | [null, T_3]>;
36
38
  };
37
39
  export default _default;
@@ -34,11 +34,12 @@ declare function radian2degree(radians: number): number;
34
34
  * @returns
35
35
  */
36
36
  declare function degree2radian(degrees: number): number;
37
- declare function formatMemory(mem: number): {
38
- g: number;
39
- m: number;
37
+ declare function calcDataSize(data: number): {
38
+ gb: number;
39
+ mb: number;
40
40
  kb: number;
41
41
  b: number;
42
+ total: number;
42
43
  desc: string;
43
44
  };
44
45
  declare const _default: {
@@ -50,6 +51,6 @@ declare const _default: {
50
51
  float: typeof float;
51
52
  radian2degree: typeof radian2degree;
52
53
  degree2radian: typeof degree2radian;
53
- formatMemory: typeof formatMemory;
54
+ calcDataSize: typeof calcDataSize;
54
55
  };
55
56
  export default _default;
@@ -30,10 +30,14 @@ export declare class Socks5 {
30
30
  __event: DEvent;
31
31
  __pipeline: DPipeline;
32
32
  __logger: ILogger;
33
+ __totalReceived: number;
34
+ __totalSent: number;
33
35
  constructor(upstreamProxy: IProxyConfig, allowedDomains?: string[] | ['*'], debug?: boolean, logger?: ILogger);
34
36
  get id(): string;
35
37
  get port(): number;
36
38
  get url(): string;
39
+ get totalReceived(): number;
40
+ get totalSent(): number;
37
41
  validateProxyConfig(proxyConfig?: IProxyConfig): "" | "无效的上游代理 IP 地址" | "无效的上游代理端口" | "无效的上游代理用户名" | "无效的上游代理密码";
38
42
  start(startPort?: number): Promise<number>;
39
43
  setUpstreamProxy(upstreamProxy: IProxyConfig): boolean;
@@ -83,6 +87,7 @@ export declare class Socks5 {
83
87
  close(): void;
84
88
  on(name: Socks5EventType, listener: (...args: any[]) => void): void;
85
89
  off(name: Socks5EventType, listener: (...args: any[]) => void): void;
90
+ resetStatistics(): void;
86
91
  private _emit;
87
92
  }
88
93
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ddan-js",
3
- "version": "2.8.1",
3
+ "version": "2.8.2",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "ddan-js",