@bbk47/toolbox 1.0.8 → 2.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 (90) hide show
  1. package/lib/deferred.d.ts +7 -0
  2. package/lib/deferred.d.ts.map +1 -0
  3. package/lib/deferred.js +8 -4
  4. package/lib/deferred.js.map +1 -0
  5. package/lib/encrypt.d.ts +19 -0
  6. package/lib/encrypt.d.ts.map +1 -0
  7. package/lib/encrypt.js +78 -79
  8. package/lib/encrypt.js.map +1 -0
  9. package/lib/index.d.ts +19 -0
  10. package/lib/index.d.ts.map +1 -0
  11. package/lib/index.js +58 -12
  12. package/lib/index.js.map +1 -0
  13. package/lib/logger.d.ts +11 -0
  14. package/lib/logger.d.ts.map +1 -0
  15. package/lib/logger.js +23 -14
  16. package/lib/logger.js.map +1 -0
  17. package/lib/md5.d.ts +2 -0
  18. package/lib/md5.d.ts.map +1 -0
  19. package/lib/md5.js +9 -6
  20. package/lib/md5.js.map +1 -0
  21. package/lib/merge.d.ts +2 -0
  22. package/lib/merge.d.ts.map +1 -0
  23. package/lib/merge.js +7 -8
  24. package/lib/merge.js.map +1 -0
  25. package/lib/proxy.d.ts +6 -0
  26. package/lib/proxy.d.ts.map +1 -0
  27. package/lib/proxy.js +23 -20
  28. package/lib/proxy.js.map +1 -0
  29. package/lib/retry.d.ts +6 -0
  30. package/lib/retry.d.ts.map +1 -0
  31. package/lib/retry.js +11 -13
  32. package/lib/retry.js.map +1 -0
  33. package/lib/server.d.ts +14 -0
  34. package/lib/server.d.ts.map +1 -0
  35. package/lib/server.js +36 -26
  36. package/lib/server.js.map +1 -0
  37. package/lib/socks5.d.ts +8 -0
  38. package/lib/socks5.d.ts.map +1 -0
  39. package/lib/socks5.js +24 -27
  40. package/lib/socks5.js.map +1 -0
  41. package/lib/timeout.d.ts +2 -0
  42. package/lib/timeout.d.ts.map +1 -0
  43. package/lib/timeout.js +6 -2
  44. package/lib/timeout.js.map +1 -0
  45. package/lib/transport/creater.d.ts +14 -0
  46. package/lib/transport/creater.d.ts.map +1 -0
  47. package/lib/transport/creater.js +45 -37
  48. package/lib/transport/creater.js.map +1 -0
  49. package/lib/transport/helper.d.ts +14 -0
  50. package/lib/transport/helper.d.ts.map +1 -0
  51. package/lib/transport/helper.js +27 -26
  52. package/lib/transport/helper.js.map +1 -0
  53. package/lib/transport/index.d.ts +6 -0
  54. package/lib/transport/index.d.ts.map +1 -0
  55. package/lib/transport/index.js +43 -11
  56. package/lib/transport/index.js.map +1 -0
  57. package/lib/transport/transport.d.ts +23 -0
  58. package/lib/transport/transport.d.ts.map +1 -0
  59. package/lib/transport/transport.js +18 -15
  60. package/lib/transport/transport.js.map +1 -0
  61. package/lib/uuid.d.ts +2 -0
  62. package/lib/uuid.d.ts.map +1 -0
  63. package/lib/uuid.js +14 -20
  64. package/lib/uuid.js.map +1 -0
  65. package/package.json +17 -4
  66. package/src/deferred.ts +14 -0
  67. package/src/encrypt.ts +119 -0
  68. package/src/index.ts +29 -0
  69. package/src/logger.ts +59 -0
  70. package/src/md5.ts +5 -0
  71. package/src/merge.ts +16 -0
  72. package/src/proxy.ts +65 -0
  73. package/src/retry.ts +32 -0
  74. package/src/server.ts +77 -0
  75. package/src/socks5.ts +46 -0
  76. package/src/timeout.ts +3 -0
  77. package/src/transport/creater.ts +88 -0
  78. package/src/transport/helper.ts +73 -0
  79. package/src/transport/index.ts +6 -0
  80. package/src/transport/transport.ts +54 -0
  81. package/src/uuid.ts +37 -0
  82. package/.github/workflows/test.yml +0 -30
  83. package/.prettierrc +0 -11
  84. package/test/deferred.js +0 -24
  85. package/test/encrypt.js +0 -25
  86. package/test/md5.js +0 -9
  87. package/test/merge.js +0 -11
  88. package/test/retry.js +0 -61
  89. package/test/socks5.js +0 -42
  90. package/test/uuid.js +0 -11
@@ -0,0 +1,88 @@
1
+ import WebSocket from 'ws';
2
+ import net from 'net';
3
+ import http2 from 'http2';
4
+ import tls from 'tls';
5
+ import { Transport, TransportConn } from './transport';
6
+
7
+ export interface TransportParams {
8
+ host: string;
9
+ port: number;
10
+ path?: string;
11
+ secure?: boolean;
12
+ }
13
+
14
+ export function createWebsocketTransport(
15
+ params: TransportParams,
16
+ onOpen: () => void
17
+ ): Transport {
18
+ const tunnelWsUrl = `${params.secure ? 'wss' : 'ws'}://${params.host}:${params.port}${params.path || ''}`;
19
+ const ws = new WebSocket(tunnelWsUrl, {
20
+ perMessageDeflate: false,
21
+ handshakeTimeout: 3000,
22
+ } as any);
23
+ const ts = new Transport({ type: 'ws', conn: ws as unknown as TransportConn });
24
+ ws.on('open', onOpen);
25
+ return ts;
26
+ }
27
+
28
+ export function createHttp2Transport(
29
+ params: TransportParams,
30
+ onOpen: () => void
31
+ ): Transport {
32
+ const http2Url = `https://${params.host}:${params.port}`;
33
+ const client = http2.connect(http2Url, {
34
+ rejectUnauthorized: false,
35
+ requestCert: true,
36
+ });
37
+ const http2stream = client.request({
38
+ ':method': 'POST',
39
+ ':path': params.path || '/',
40
+ 'Content-Type': 'octet-stream',
41
+ });
42
+ http2stream.on('response', onOpen);
43
+ const ts = new Transport({ type: 'h2', conn: http2stream as unknown as TransportConn });
44
+ return ts;
45
+ }
46
+
47
+ export function createTlsTransport(
48
+ params: TransportParams,
49
+ onOpen: () => void
50
+ ): Transport {
51
+ const tlsOpts: tls.ConnectionOptions = {
52
+ rejectUnauthorized: false,
53
+ host: params.host,
54
+ port: params.port,
55
+ };
56
+ const tlsConn = tls.connect(tlsOpts, function () {
57
+ onOpen();
58
+ });
59
+ const ts = new Transport({ type: 'tls', conn: tlsConn as unknown as TransportConn });
60
+ return ts;
61
+ }
62
+
63
+ export function createTcpTransport(
64
+ params: TransportParams,
65
+ onOpen: () => void
66
+ ): Transport {
67
+ const socket = new net.Socket();
68
+ socket.connect(params.port, params.host, function () {
69
+ onOpen();
70
+ });
71
+ return new Transport({ type: 'tcp', conn: socket as unknown as TransportConn });
72
+ }
73
+
74
+ export function createUnixsocketTransport(
75
+ params: TransportParams,
76
+ onOpen: () => void
77
+ ): Transport {
78
+ const socket = new net.Socket();
79
+ socket.connect(params.path || '', function () {
80
+ onOpen();
81
+ });
82
+ const ts = new Transport({ type: 'domainsocket', conn: socket as unknown as TransportConn });
83
+ return ts;
84
+ }
85
+
86
+ export function wrapSocket(type: string, conn: TransportConn): Transport {
87
+ return new Transport({ type: type as any, conn });
88
+ }
@@ -0,0 +1,73 @@
1
+ import WebSocket from 'ws';
2
+ import net from 'net';
3
+ import stream from 'stream';
4
+
5
+ export type DataCallback = (data: Buffer) => void;
6
+ export type ErrorCallback = (err: Error) => void;
7
+ export type CloseCallback = (code?: number) => void;
8
+
9
+ export function bindStreamSocket(
10
+ s: stream.Readable & { on: Function; destroy: Function },
11
+ onData: DataCallback,
12
+ onError: ErrorCallback,
13
+ onClose: CloseCallback
14
+ ): void {
15
+ let buffcache = Buffer.from([]);
16
+ s.on('data', function (data: Buffer) {
17
+ buffcache = Buffer.concat([buffcache, data]);
18
+ while (true) {
19
+ if (buffcache.length <= 2) {
20
+ return;
21
+ }
22
+ const datalen = buffcache[0] * 256 + buffcache[1];
23
+ if (buffcache.length < datalen + 2) {
24
+ return;
25
+ }
26
+ const pack = buffcache.slice(2, datalen + 2);
27
+ buffcache = buffcache.slice(datalen + 2);
28
+ onData(pack);
29
+ }
30
+ });
31
+ s.on('close', function (code?: number) {
32
+ onClose(code);
33
+ });
34
+ s.on('error', function (err: Error) {
35
+ (s as any).destroy();
36
+ onError(err);
37
+ });
38
+ }
39
+
40
+ export function bindWebsocket(
41
+ ws: WebSocket,
42
+ onData: DataCallback,
43
+ onError: ErrorCallback,
44
+ onClose: CloseCallback
45
+ ): void {
46
+ ws.on('message', onData);
47
+ ws.on('close', (code: number) => {
48
+ onClose(code);
49
+ });
50
+ ws.on('error', (err: Error) => {
51
+ ws.close();
52
+ onError(err);
53
+ });
54
+ }
55
+
56
+ export function tcpsocketSend(socket: net.Socket, data: Buffer): void {
57
+ const datalen = data.length;
58
+ if (socket.writable) {
59
+ socket.write(
60
+ Buffer.concat([Buffer.from([datalen >> 8, datalen % 256]), data])
61
+ );
62
+ } else {
63
+ throw new Error('socket cannot writeable!');
64
+ }
65
+ }
66
+
67
+ export function websocketSend(ws: WebSocket, data: Buffer): void {
68
+ if (ws.readyState === WebSocket.OPEN) {
69
+ ws.send(data, { binary: true });
70
+ } else {
71
+ throw new Error('ws socket not open!' + ws.readyState);
72
+ }
73
+ }
@@ -0,0 +1,6 @@
1
+ export { Transport } from './transport';
2
+ export type { TransportType, TransportConn } from './transport';
3
+ export * as creater from './creater';
4
+ export * as helper from './helper';
5
+
6
+ export { wrapSocket } from './creater';
@@ -0,0 +1,54 @@
1
+ import WebSocket from 'ws';
2
+ import net from 'net';
3
+ import { websocketSend, tcpsocketSend, bindWebsocket, bindStreamSocket } from './helper';
4
+ import type { DataCallback, ErrorCallback, CloseCallback } from './helper';
5
+
6
+ export type TransportType = 'ws' | 'h2' | 'tcp' | 'tls' | 'domainsocket';
7
+
8
+ export interface TransportConn {
9
+ close?: () => void;
10
+ destroy?: () => void;
11
+ writable?: boolean;
12
+ readyState?: number;
13
+ send?: Function;
14
+ on: (event: string, listener: Function) => any;
15
+ write?: (data: Buffer) => void;
16
+ }
17
+
18
+ export class Transport {
19
+ type: TransportType;
20
+ conn: TransportConn;
21
+
22
+ constructor(opts: { type: TransportType; conn: TransportConn }) {
23
+ this.type = opts.type;
24
+ this.conn = opts.conn;
25
+ }
26
+
27
+ sendPacket(binarydata: Buffer): void {
28
+ if (this.type === 'ws') {
29
+ websocketSend(this.conn as unknown as WebSocket, binarydata);
30
+ } else {
31
+ tcpsocketSend(this.conn as unknown as net.Socket, binarydata);
32
+ }
33
+ }
34
+
35
+ bindEvents(onData: DataCallback, onError: ErrorCallback, onClose: CloseCallback): void {
36
+ if (this.type === 'ws') {
37
+ bindWebsocket(this.conn as unknown as WebSocket, onData, onError, onClose);
38
+ } else {
39
+ bindStreamSocket(this.conn as any, onData, onError, onClose);
40
+ }
41
+ }
42
+
43
+ close(): void {
44
+ try {
45
+ if (this.type === 'ws' || this.type === 'h2') {
46
+ (this.conn as any).close();
47
+ } else {
48
+ (this.conn as any).destroy();
49
+ }
50
+ } catch (_err) {
51
+ // ignore
52
+ }
53
+ }
54
+ }
package/src/uuid.ts ADDED
@@ -0,0 +1,37 @@
1
+ const lut: string[] = [];
2
+ for (let i = 0; i < 256; i++) {
3
+ lut[i] = (i < 16 ? '0' : '') + i.toString(16);
4
+ }
5
+
6
+ function e7(): string {
7
+ const d0 = (Math.random() * 0xffffffff) | 0;
8
+ const d1 = (Math.random() * 0xffffffff) | 0;
9
+ const d2 = (Math.random() * 0xffffffff) | 0;
10
+ const d3 = (Math.random() * 0xffffffff) | 0;
11
+ return (
12
+ lut[d0 & 0xff] +
13
+ lut[(d0 >> 8) & 0xff] +
14
+ lut[(d0 >> 16) & 0xff] +
15
+ lut[(d0 >> 24) & 0xff] +
16
+ '-' +
17
+ lut[d1 & 0xff] +
18
+ lut[(d1 >> 8) & 0xff] +
19
+ '-' +
20
+ lut[((d1 >> 16) & 0x0f) | 0x40] +
21
+ lut[(d1 >> 24) & 0xff] +
22
+ '-' +
23
+ lut[(d2 & 0x3f) | 0x80] +
24
+ lut[(d2 >> 8) & 0xff] +
25
+ '-' +
26
+ lut[(d2 >> 16) & 0xff] +
27
+ lut[(d2 >> 24) & 0xff] +
28
+ lut[d3 & 0xff] +
29
+ lut[(d3 >> 8) & 0xff] +
30
+ lut[(d3 >> 16) & 0xff] +
31
+ lut[(d3 >> 24) & 0xff]
32
+ );
33
+ }
34
+
35
+ export default function uuid(): string {
36
+ return e7().replace(/-/g, '');
37
+ }
@@ -1,30 +0,0 @@
1
- # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
2
- # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
3
-
4
- name: test
5
-
6
- on:
7
- push:
8
- branches: [master]
9
- pull_request:
10
- branches: [master]
11
-
12
- jobs:
13
- build:
14
- runs-on: ubuntu-latest
15
-
16
- strategy:
17
- matrix:
18
- node-version: [10.x, 12.x, 14.x, 15.x]
19
- # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
20
-
21
- steps:
22
- - uses: actions/checkout@v2
23
- - name: Use Node.js ${{ matrix.node-version }}
24
- uses: actions/setup-node@v1
25
- with:
26
- node-version: ${{ matrix.node-version }}
27
- - uses: borales/actions-yarn@v2.0.0
28
- with:
29
- cmd: install # will run `yarn install` command
30
- - run: npm run test
package/.prettierrc DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "printWidth": 200,
3
- "semi": true,
4
- "singleQuote": true,
5
- "trailingComma": "all",
6
- "bracketSpacing": true,
7
- "jsxBracketSameLine": true,
8
- "arrowParens": "always",
9
- "tabWidth": 4,
10
- "useTabs": false
11
- }
package/test/deferred.js DELETED
@@ -1,24 +0,0 @@
1
- const assert = require('assert');
2
- const deferred = require('../lib/deferred');
3
- const { describe } = require('mocha');
4
-
5
- describe('deferred', function () {
6
- it('test deferred resolve', function () {
7
- var defer = deferred();
8
- setTimeout(() => {
9
- defer.resolve("okok")
10
- }, 10);
11
- return defer.promise.then(ret => {
12
- assert.equal(ret, "okok");
13
- });
14
- });
15
- it('test deferred reject', function () {
16
- var defer = deferred();
17
- setTimeout(() => {
18
- defer.reject("err111");
19
- }, 10);
20
- return defer.promise.catch(err => {
21
- assert.equal(err, "err111")
22
- });
23
- });
24
- });
package/test/encrypt.js DELETED
@@ -1,25 +0,0 @@
1
- const assert = require('assert');
2
- const { describe } = require('mocha');
3
- const encrypt = require('../lib/encrypt');
4
-
5
- describe('encrypt', function () {
6
- it('test encrypt example', function () {
7
- const worker = new encrypt.Encryptor('csii2019', 'aes-256-cfb');
8
-
9
- const result1 = worker.encrypt(Buffer.from('hello,world'));
10
- const result2 = worker.encrypt(Buffer.from('818c9ba2109b4c505155aebf6d3647a3'));
11
- const result3 = worker.encrypt(Buffer.from('818c9ba2109b4c505155aebf6d3647a2'));
12
-
13
- // console.log(result1.toString('hex'));
14
- // console.log(result2.toString('hex'));
15
- // console.log(result3.toString('hex'));
16
-
17
- const desret1 = worker.decrypt(result1).toString();
18
- const desret2 = worker.decrypt(result2).toString();
19
- const desret3 = worker.decrypt(result3).toString();
20
-
21
- assert.equal(desret1, 'hello,world', 'encrypt example1');
22
- assert.equal(desret2, '818c9ba2109b4c505155aebf6d3647a3');
23
- assert.equal(desret3, '818c9ba2109b4c505155aebf6d3647a2');
24
- });
25
- });
package/test/md5.js DELETED
@@ -1,9 +0,0 @@
1
- const assert = require('assert');
2
- const md5 = require('../lib/md5');
3
- const { describe } = require('mocha');
4
-
5
- describe('md5', function () {
6
- it('test md5 example', function () {
7
- assert.equal(md5('admin'), '21232f297a57a5a743894a0e4a801fc3');
8
- });
9
- });
package/test/merge.js DELETED
@@ -1,11 +0,0 @@
1
- const assert = require('assert');
2
- const merge = require('../lib/merge');
3
- const { describe } = require('mocha');
4
-
5
- describe('socks5', function () {
6
- it('test object merge', function () {
7
- var obj = merge({ sss: 1 }, { sss: 123 }, { bb: 456 }, { sss: null });
8
- assert.equal(obj.sss, 123);
9
- assert.equal(obj.bb, 456);
10
- });
11
- });
package/test/retry.js DELETED
@@ -1,61 +0,0 @@
1
- const assert = require('assert');
2
- const retry = require('../lib/retry');
3
- const { describe } = require('mocha');
4
-
5
- describe('retry', function () {
6
- it('test retry max count', function () {
7
- const awaitErrorTask = () => {
8
- return new Promise((s, reject) => reject('xxxxxx'));
9
- }
10
- return retry(awaitErrorTask).then(() => {
11
- throw Error("unexcept exec");
12
- }).catch(err => {
13
- assert.equal("expect retryCount 5 is attached!", err.message);
14
- });
15
-
16
- });
17
-
18
- it('test retry custom max count', function () {
19
- let maxcount = 10;
20
- const taskfn = () => {
21
- return new Promise((s, reject) => reject('err'));
22
- }
23
- return retry(taskfn, { times: maxcount }).then(() => {
24
- throw Error("unexcept exec");
25
- }).catch(err => {
26
- assert.equal("expect retryCount 10 is attached!", err.message);
27
- });
28
- });
29
-
30
- it('test retry errorcall', function () {
31
- let maxcount = 10;
32
- let start = 0;
33
- const taskfn = () => {
34
- start++;
35
- return new Promise((s, reject) => reject(Error('retryerr:' + start)));
36
- }
37
- return retry(taskfn, { times: maxcount }, function (err) {
38
- assert.equal("retryerr:" + start, err.message);
39
- }).then(() => {
40
- throw Error("unexcept exec");
41
- }).catch(err => {
42
- assert.equal("expect retryCount 10 is attached!", err.message);
43
- });
44
- });
45
-
46
- it('test retry interval args', function (done) {
47
- let start = 0;
48
- const taskfn = () => {
49
- start++;
50
- return new Promise((s, reject) => reject(Error('retryerr:' + start)));
51
- }
52
- let startTime =Date.now();
53
- retry(taskfn, { interval: 100 }, function (err) {
54
- assert.equal("retryerr:" + start, err.message);
55
- }).catch(err => {
56
- assert.equal(Date.now()-startTime > 5*100,true);
57
- assert.equal("expect retryCount 5 is attached!", err.message);
58
- done();
59
- });
60
- });
61
- });
package/test/socks5.js DELETED
@@ -1,42 +0,0 @@
1
- const assert = require('assert');
2
- const socks5 = require('../lib/socks5');
3
- const { describe } = require('mocha');
4
-
5
- describe('socks5', function () {
6
-
7
- it('test socks5 parse ip example', function () {
8
- const obj1 = socks5.parseSocks5Addr(Buffer.from('010102040822c3', 'hex'));
9
- assert.equal(obj1.dstAddr, '1.2.4.8');
10
- assert.equal(obj1.dstPort, 8899);
11
-
12
- const obj2 = socks5.parseSocks5Addr(Buffer.from('01b53abd171566', 'hex'));
13
- assert.equal(obj2.dstAddr, '181.58.189.23');
14
- assert.equal(obj2.dstPort, 5478);
15
- });
16
-
17
- it('test socks5 parse domain example', function () {
18
- const obj1 = socks5.parseSocks5Addr(Buffer.from('030d7777772e62616964752e636f6d044b', 'hex'));
19
- assert.equal(obj1.dstAddr, 'www.baidu.com');
20
- assert.equal(obj1.dstPort, 1099);
21
-
22
- const obj2 = socks5.parseSocks5Addr(Buffer.from('03196b6566646b612e313233312e6131323362616964752e636f6dfffe', 'hex'));
23
- assert.equal(obj2.dstAddr, 'kefdka.1231.a123baidu.com');
24
- assert.equal(obj2.dstPort, 65534);
25
- });
26
-
27
- it('test socks5 build ipv4 example', function () {
28
- const buf1 = socks5.buildSocks5Addr("1.2.4.8",8899);
29
- assert.equal(buf1.toString('hex'), '010102040822c3');
30
- const buf2 = socks5.buildSocks5Addr("181.58.189.23",5478);
31
- assert.equal(buf2.toString('hex'), '01b53abd171566');
32
- });
33
-
34
- it('test socks5 build domain example', function () {
35
- const buf1 = socks5.buildSocks5Addr("www.baidu.com",1099);
36
- assert.equal(buf1.toString('hex'), '030d7777772e62616964752e636f6d044b');
37
- const buf2 = socks5.buildSocks5Addr("kefdka.1231.a123baidu.com",65534);
38
- assert.equal(buf2.toString('hex'), '03196b6566646b612e313233312e6131323362616964752e636f6dfffe');
39
- });
40
-
41
-
42
- });
package/test/uuid.js DELETED
@@ -1,11 +0,0 @@
1
- const assert = require('assert');
2
- const uuid = require('../lib/uuid');
3
- const { describe } = require('mocha');
4
- const reg = /^(\{){0,1}[0-9a-fA-F]{8}[0-9a-fA-F]{4}[0-9a-fA-F]{4}[0-9a-fA-F]{4}[0-9a-fA-F]{12}(\}){0,1}$/;
5
-
6
- describe('uuid', function () {
7
- it('test uuid example', function () {
8
- const uid = uuid();
9
- assert.equal(reg.test(uid), true);
10
- });
11
- });