topbit 2.0.0 → 3.0.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 (72) hide show
  1. package/README.cn.md +132 -177
  2. package/README.md +801 -592
  3. package/bin/new-ctl.js +7 -3
  4. package/demo/allow.js +13 -13
  5. package/demo/controller/api.js +15 -0
  6. package/demo/extends.js +5 -0
  7. package/demo/http2.js +34 -0
  8. package/demo/http2_proxy_backend.js +45 -0
  9. package/demo/http2proxy.js +48 -0
  10. package/demo/http_proxy_backend.js +44 -0
  11. package/demo/httpproxy.js +47 -0
  12. package/demo/loader.js +27 -0
  13. package/demo/log.js +1 -1
  14. package/demo/memlimit.js +1 -1
  15. package/demo/min.js +1 -1
  16. package/demo/serv.js +1 -1
  17. package/images/topbit-middleware.webp +0 -0
  18. package/images/topbit.png +0 -0
  19. package/package.json +7 -6
  20. package/src/_loadExtends.js +21 -0
  21. package/src/bodyparser.js +1 -1
  22. package/src/context1.js +19 -19
  23. package/src/context2.js +11 -8
  24. package/src/ctxpool.js +1 -0
  25. package/src/extends/Http2Pool.js +365 -0
  26. package/src/extends/__randstring.js +24 -0
  27. package/src/extends/cookie.js +44 -0
  28. package/src/extends/cors.js +334 -0
  29. package/src/extends/errorlog.js +252 -0
  30. package/src/extends/http2limit.js +126 -0
  31. package/src/extends/http2proxy.js +691 -0
  32. package/src/extends/jwt.js +217 -0
  33. package/src/extends/mixlogger.js +63 -0
  34. package/src/extends/paramcheck.js +266 -0
  35. package/src/extends/proxy.js +662 -0
  36. package/src/extends/realip.js +34 -0
  37. package/src/extends/referer.js +68 -0
  38. package/src/extends/resource.js +398 -0
  39. package/src/extends/session.js +174 -0
  40. package/src/extends/setfinal.js +50 -0
  41. package/src/extends/sni.js +48 -0
  42. package/src/extends/sse.js +293 -0
  43. package/src/extends/timing.js +111 -0
  44. package/src/extends/tofile.js +123 -0
  45. package/src/http1.js +15 -16
  46. package/src/http2.js +5 -5
  47. package/src/httpc.js +3 -3
  48. package/src/lib/npargv.js +354 -0
  49. package/src/lib/zipdata.js +45 -0
  50. package/src/middleware1.js +15 -16
  51. package/src/middleware2.js +4 -9
  52. package/src/token/token.js +4 -5
  53. package/src/topbit.js +13 -11
  54. package/test/{test-helper.js → test-ext.js} +1 -1
  55. package/test/test-route.js +1 -1
  56. package/cache/allow.js +0 -130
  57. package/cache/errserv.js +0 -45
  58. package/cache/minserv.js +0 -167
  59. package/cache/router.js +0 -84
  60. package/cache/servsock.js +0 -286
  61. package/cache/sni.js +0 -66
  62. package/images/titbit-middleware.png +0 -0
  63. package/images/titbit.png +0 -0
  64. package/tmp/buff-code +0 -134
  65. package/tmp/devplan +0 -9
  66. package/tmp/evt-test.js +0 -34
  67. package/tmp/fastParseUrl.js +0 -302
  68. package/tmp/router-rule.js +0 -559
  69. package/tmp/test-cdps.js +0 -122
  70. package/tmp/titbit.js +0 -1286
  71. /package/{cache/rsa → demo/cert}/localhost-cert.pem +0 -0
  72. /package/{cache/rsa → demo/cert}/localhost-privkey.pem +0 -0
package/cache/allow.js DELETED
@@ -1,130 +0,0 @@
1
- 'use strict';
2
-
3
- const titbit = require('../lib/titbit.js');
4
-
5
- const app = new titbit({
6
- debug : true,
7
- /*
8
- allow : {
9
- '127.0.0.1': 1
10
- },
11
- */
12
- allow: (ip) => {
13
- if (parseInt(Math.random() * 10) > 5) {
14
- return false;
15
- }
16
- return true;
17
- },
18
- maxIPRequest: 5,
19
- unitTime: 10,
20
- useLimit: true,
21
- maxConn: 20,
22
- http2: false,
23
- cert : './rsa/localhost-cert.pem',
24
- key : './rsa/localhost-privkey.pem',
25
- showLoadInfo: true,
26
- loadInfoType : 'text',
27
- globalLog : true,
28
- logType: 'stdio',
29
- loadInfoFile : '/tmp/loadinfo.log'
30
- });
31
-
32
- app.use(async (c, next) => {
33
- console.log('hook running');
34
- console.log(c.group, c.name, c.method, '\n');
35
- console.log(c.box);
36
- await next();
37
-
38
- }, {pre : true});
39
-
40
- app.use(async (c, next) => {
41
- console.log('middleware 1');
42
- await next();
43
- console.log('middleware 1 end');
44
- }, 'home');
45
-
46
- app.use(async (c, next) => {
47
- console.log('middleware 2');
48
- c.body.say = '你好';
49
- await next();
50
- console.log('middleware 2 end');
51
- }, {group: 'test', method: 'POST'});
52
-
53
- app.use(async (c, next) => {
54
- console.log('middleware 3');
55
- if (c.query.say == 'hey') {
56
- c.send('你好,test 接口 GET请求结束。');
57
- } else {
58
- await next();
59
- }
60
- console.log('middleware 3 end');
61
- }, {group: 'test', method : 'GET'});
62
-
63
- app.use(async (c, next) => {
64
- console.log('set body size');
65
- c.maxBody = 24;
66
- await next();
67
- }, {name: 'test-post', pre: true});
68
-
69
- app.use(async (c, next) => {
70
- console.log('middleware 4');
71
- c.body.x = 12;
72
- await next();
73
- console.log('middleware 4 end');
74
- }, 'test-post');
75
-
76
- app.get('', async c => {
77
- console.log(c.headers);
78
- c.send('ok');
79
- }, 'home');
80
-
81
- app.get('/test', async c => {
82
- c.send(c.name);
83
- }, {group: 'test', name : 'test'});
84
-
85
- app.post('/test', async c => {
86
- c.send(c.body);
87
- }, {group: 'test', name : 'test-post'});
88
-
89
- app.post('/transmit', async c => {
90
- c.send('ok');
91
- }, 'transmit');
92
-
93
- app.use(async (c, next) => {
94
- let total = 0;
95
-
96
- if (c.http2) {
97
- c.box.dataHandle = (data) => {
98
- total += data.length;
99
- if (total > 32) {
100
-
101
- c.status(413);
102
- c.stream.respond(c.res.headers);
103
- c.stream.close();
104
- //c.response.end('太多了,限制32字节以内');
105
- return ;
106
- }
107
- };
108
- } else {
109
- c.box.dataHandle = (data) => {
110
- total += data.length;
111
- if (total > 32) {
112
- c.status(413);
113
- c.response.end('太多了,限制32字节以内');
114
- return ;
115
- }
116
- };
117
- }
118
-
119
- await next();
120
-
121
- console.log(total, 'bytes');
122
-
123
- }, {pre: true, method: 'POST', name: 'transmit'});
124
-
125
-
126
- if (process.argv.indexOf('-c') > 0) {
127
- app.daemon(1234, 2)
128
- } else {
129
- app.run(1234)
130
- }
package/cache/errserv.js DELETED
@@ -1,45 +0,0 @@
1
- 'use strict';
2
-
3
- const titbit = require('../lib/titbit.js');
4
-
5
- var app = new titbit({
6
- debug : true,
7
- maxIPRequest: 5,
8
- peerTime: 10,
9
- useLimit: true,
10
- maxConn: 20,
11
- //http2: true,
12
- cert : './rsa/localhost-cert.pem',
13
- key : './rsa/localhost-privkey.pem',
14
- showLoadInfo: true,
15
- loadInfoType : 'text',
16
- globalLog : true,
17
- logType: 'stdio',
18
- loadInfoFile : '/tmp/loadinfo.log',
19
- /* errorHandle: (err, errname) => {
20
- console.log('self error log', err)
21
- } */
22
- });
23
-
24
- app.get('', async c => {
25
- console.log(c.headers)
26
- c.send('ok')
27
- }, 'home')
28
-
29
- app.get('/test', async c => {
30
- c.send(c.name);
31
- }, {group: 'test', name : 'test'})
32
-
33
- app.get('/randerr', async c => {
34
- let n = parseInt(Math.random() * 100)
35
- if (n < 50) {
36
- throw new Error(`error code ${n}`)
37
- }
38
- c.send(n)
39
- })
40
-
41
- if (process.argv.indexOf('-c') > 0) {
42
- app.daemon(1234, 2)
43
- } else {
44
- app.run(1234)
45
- }
package/cache/minserv.js DELETED
@@ -1,167 +0,0 @@
1
- 'use strict';
2
-
3
- const titbit = require('../lib/titbit.js')
4
- const cluster = require('cluster');
5
-
6
- let http2_on = false
7
-
8
- if (process.argv.indexOf('--http2') > 0) {
9
- http2_on = true
10
- }
11
-
12
- const app = new titbit({
13
- debug: true,
14
- globalLog: true,
15
- useLimit: true,
16
- maxIPRequest: 10,
17
- unitTime: 12,
18
- maxpool : 5000,
19
- timeout : 3000,
20
- maxQuery: 8,
21
- //fastParseQuery: true,
22
- //loadInfoFile : '--mem'
23
- keepAlive: 12000,
24
- strong: true,
25
- http2: http2_on,
26
- })
27
-
28
- /*
29
- const v8 = require('v8');
30
- setInterval(() => {
31
- console.log(v8.getHeapStatistics())
32
- }, 2000)
33
- */
34
-
35
- async function delay(tm) {
36
- await new Promise((rv, rj) => {
37
- setTimeout(() => {
38
- rv()
39
- }, tm)
40
- })
41
- return true
42
- }
43
-
44
- app.get('/', async c => {
45
- await new Promise((rv, rj) => {
46
- setTimeout(() => {
47
- rv()
48
- }, parseInt(Math.random() * 25) + 40)
49
- })
50
-
51
- c.send({
52
- query: c.query
53
- })
54
-
55
- })
56
-
57
- app.get('/null', async c => {
58
- c.res.body = null
59
- })
60
-
61
- app.get('/emit-error', async c => {})
62
-
63
- app.get('errcode', async c => {
64
- c.send('not found', 404)
65
- })
66
-
67
- app.post('/data', async c => {
68
- c.send(c.body)
69
- })
70
-
71
- app.post('/upload', async c => {
72
- c.send(c.files)
73
- })
74
-
75
- app.get('/ok', async c => {
76
- await new Promise((rv, rj) => {
77
- setTimeout(() => {
78
- rv()
79
- }, 10)
80
- })
81
-
82
- c.send('ok')
83
- })
84
-
85
- app.get('/error', async c => {
86
- let r = parseInt(Math.random() * 11)
87
-
88
- if (r > 5) {
89
- console.log('abort')
90
- c.request.emit('aborted')
91
- } else {
92
- console.log('error')
93
- c.request.emit('error', new Error('eee'))
94
- c.response.emit('error')
95
- }
96
-
97
- c.send('ok')
98
-
99
- })
100
-
101
- app.get('/timeout', async c => {
102
-
103
- await delay(400)
104
-
105
- c.reply.write('123')
106
-
107
- await delay(2000)
108
-
109
- c.reply.write('234')
110
-
111
-
112
- await delay(2000)
113
-
114
- c.reply.write('234')
115
-
116
- //await delay(26000)
117
-
118
- c.send('out')
119
- })
120
-
121
- /*
122
- if (cluster.isWorker) {
123
- setInterval(() => {
124
- process.send({
125
- type : 'get-load-info'
126
- })
127
- }, 1000)
128
-
129
- process.on('message', msg => {
130
- console.log(process.pid, '\n')
131
- console.log(msg)
132
- })
133
-
134
- } else {
135
- app.setMsgEvent('get-load-info', (w, msg) => {
136
- w.send(app.monitor.loadCache)
137
- })
138
- }
139
- */
140
-
141
- if (process.argv.indexOf('-c') > 0) {
142
- app.autoWorker(4)
143
- app.daemon(1234, 2)
144
- //app.daemon(1235, 3)
145
- } else {
146
- app.run(1234)
147
- setInterval(() => {
148
-
149
- app.server.getConnections((err, conn) => {
150
- console.log(conn)
151
- })
152
-
153
- }, 3000)
154
-
155
- app.server.requestTimeout = 50
156
- app.server.maxHeadersCount = 80
157
-
158
- }
159
-
160
- /* if (cluster.isMaster) {
161
- setTimeout(() => {
162
- for (let k in cluster.workers) {
163
- cluster.workers[k].emit('error', new Error('test err'))
164
- }
165
- }, 1600)
166
- }
167
- */
package/cache/router.js DELETED
@@ -1,84 +0,0 @@
1
- 'use strict';
2
-
3
- const titbit = require('../lib/titbit.js');
4
-
5
- var app = new titbit({
6
- //daemon: true,
7
- maxBody: 2500000,
8
- debug: true,
9
- useLimit: true,
10
- //deny : ['10.7.10.149'],
11
- maxIPRequest: 480,
12
- peerTime: 1,
13
- showLoadInfo: false,
14
- globalLog: true,
15
- logType: 'stdio',
16
- loadInfoFile: '/tmp/loadinfo.log',
17
- pageNotFound: `<!DOCTYPE html>
18
- <html>
19
- <head>
20
- <meta charset="utf-8">
21
- <meta name="viewport" content="width=device-width">
22
- <title>titbit - not found</title>
23
- </head>
24
- <body>
25
- <div style="margin-top:3.8rem;text-align:center;color:#565758;">
26
- <h1>404 : page not found</h1>
27
- </div>
28
- </body>
29
- </html>
30
- `,
31
- });
32
-
33
- var {router} = app;
34
-
35
- router.options('/*', async c => {
36
- console.log(c.param.starPath);
37
- c.setHeader('Access-control-allow-origin', '*');
38
- c.setHeader('Access-control-allow-methods', app.router.methods);
39
- }, 'options-check');
40
-
41
- router.get('/', async ctx => {
42
- ctx.res.body = 'ok';
43
- });
44
-
45
- router.post('/p', async ctx => {
46
- ctx.res.body = ctx.body;
47
- }, '@post');
48
-
49
- router.post('/pt', async ctx => {
50
- ctx.res.body = ctx.body;
51
- }, {name: 'post-test2', group: 'post'});
52
-
53
- app.use(async (ctx, next) => {
54
- var start_time = Date.now();
55
- await next(ctx);
56
- var end_time = Date.now();
57
- var timing = end_time-start_time;
58
- console.log(process.pid,ctx.path, `: ${timing}ms`);
59
- });
60
-
61
- router.get('/err', async ctx => {
62
- ctx.res.body = '500 error';
63
- ctx.status(500);
64
- });
65
-
66
- router.get('/a/:a/:b/', async c => {
67
- c.res.body = c.param;
68
- });
69
-
70
- router.get('x/*', async c => {
71
- c.res.body = c.param.starPath;
72
- });
73
-
74
- router.get('/:name/:id/:age', async c => {
75
- c.res.body = c.param;
76
- });
77
-
78
- //放在最后不会和/err冲突
79
- router.get('/:name', async c => {
80
- c.send(c.param.name)
81
- })
82
-
83
- app.run(2023);
84
-
package/cache/servsock.js DELETED
@@ -1,286 +0,0 @@
1
- 'use strict';
2
-
3
- const titbit = require('../lib/titbit.js');
4
- const zlib = require('zlib');
5
- const fs = require('fs');
6
- const cluster = require('cluster');
7
-
8
- var app = new titbit({
9
- //daemon: true,
10
- maxBody: 1500000000,
11
- debug: true,
12
- useLimit: true,
13
- //deny : ['192.168.3.4'],
14
- maxIPRequest: 500,
15
- peerTime: 2,
16
- //cert : '../rsa/localhost-cert.pem',
17
- //key : '../rsa/localhost-privkey.pem',
18
- //http2: true,
19
- //showLoadInfo: true,
20
- loadInfoType : 'text',
21
- loadInfoFile : '/tmp/titbit-load.log',
22
- globalLog: true,
23
- //loadInfoFile: '/tmp/loadinfo.log',
24
- pageNotFound: `<!DOCTYPE html>
25
- <html>
26
- <head>
27
- <meta charset="utf-8">
28
- <meta name="viewport" content="width=device-width">
29
- <title>titbit - not found</title>
30
- </head>
31
- <body>
32
- <div style="margin-top:3.8rem;text-align:center;color:#565758;">
33
- <h1>404 : page not found</h1>
34
- </div>
35
- </body>
36
- </html>
37
- `,
38
- });
39
-
40
- let sockpath = '/tmp/titbit.sock';
41
- try {
42
- fs.accessSync(sockpath);
43
- fs.unlinkSync(sockpath);
44
- } catch (err) {
45
- }
46
-
47
- app.service.router = app.router;
48
-
49
- var {router} = app;
50
- /*
51
- app.addHook(async (c, next) => {
52
- c.maxBody = 8;
53
-
54
- await next(c);
55
- }, {method : ['POST','PUT']});
56
- */
57
-
58
- var _userAgentCache = {};
59
-
60
- app.use(async (c, next) => {
61
- if (c.headers['user-agent'] === undefined) {
62
- c.headers['user-agent'] = 'default-agent';
63
- }
64
-
65
- let ua = c.headers['user-agent'];
66
-
67
- let key = `${ua}:${c.ip}`;
68
-
69
- if (_userAgentCache[key] === undefined) {
70
- _userAgentCache[key] = {
71
- time : Date.now(),
72
- count : 1
73
- };
74
- }
75
-
76
- let uak = _userAgentCache[key];
77
-
78
- let tm = Date.now();
79
- if (tm - uak.time > 10000) {
80
- uak.count = 1;
81
- uak.time = tm;
82
- }
83
-
84
- if (uak.count > 150) {
85
- c.status(503);
86
- c.res.body = 'too many request';
87
- return ;
88
- }
89
-
90
- uak.count += 1;
91
-
92
- await next(c);
93
-
94
- });
95
-
96
- router.options('/*', async c => {
97
- console.log(c.param.starPath);
98
- c.setHeader('Access-control-allow-origin', '*');
99
- c.setHeader('Access-control-allow-methods', app.router.methods);
100
- }, 'options-check');
101
-
102
- router.get('/', async ctx => {
103
- let rsock = ctx.request.socket;
104
- console.log(ctx.headers, rsock.remoteFamily);
105
- ctx.send('ok');
106
- });
107
-
108
- router.get('/test', async ctx => {
109
- let delay = parseInt(Math.random() * 300);
110
-
111
- await new Promise((rv, rj) => {
112
- setTimeout(() => {
113
- rv();
114
- }, delay);
115
- });
116
-
117
- ctx.send(Buffer.from(`我是中国人${delay}\n`));
118
- });
119
-
120
- router.post('/p', async ctx => {
121
- ctx.res.body = ctx.body;
122
- }, '@post');
123
-
124
- router.post('/pt', async ctx => {
125
- ctx.res.body = ctx.body;
126
- }, {name: 'post-test2', group: 'post'});
127
-
128
- app.get('/html', async c => {
129
- c.html(`<!DOCTYPE html><html>
130
- <head>
131
- <meta charset="utf-8">
132
- </head>
133
- <body>
134
- <div style="color:#676869;font-size:125%;text-align:center;">Great</div>
135
- </body>
136
- </html>`);
137
- });
138
-
139
- app.use(async (ctx, next) => {
140
- var start_time = Date.now();
141
- await next(ctx);
142
- var end_time = Date.now();
143
- var timing = end_time-start_time;
144
- console.log(process.pid,ctx.path, `: ${timing}ms`);
145
- });
146
-
147
-
148
- /*
149
- app.use(async (ctx, next) => {
150
- console.log('middleware for POST/PUT');
151
- await next(ctx);
152
- console.log('middleware for POST/PUT -- ');
153
- }, {method: ['POST','PUT']});
154
-
155
- app.use(async (ctx, next) => {
156
- console.log('a1');
157
- await next(ctx);
158
- console.log('a1');
159
- });
160
-
161
- app.use(async (ctx, next) => {
162
- console.log('a2');
163
- await next(ctx);
164
- console.log('a2');
165
- });
166
-
167
- app.use(async (ctx, next) => {
168
- console.log('a3');
169
- await next(ctx);
170
- console.log('a3');
171
- }, {group: 'post'});
172
- */
173
-
174
- app.use(async (ctx, next) => {
175
- console.log('checking file');
176
- if (!ctx.isUpload) {
177
- return ;
178
- }
179
- if (!ctx.getFile('image')) {
180
- ctx.String('file not found, please upload with name "image" ');
181
- return ;
182
- }
183
- await next(ctx);
184
- }, {name: 'upload-image'});
185
-
186
- router.post('/upload', async c => {
187
- try {
188
- console.log(c.files);
189
- let results = [];
190
- let tmp = '';
191
- let fname = '';
192
- let images = c.getFile('image', -1);
193
-
194
- for(let i=0; i<images.length; i++) {
195
- fname = `${process.env.HOME}/tmp/a/${c.helper.makeName(images[i].filename)}`;
196
- tmp = await c.moveFile(images[i], fname);
197
- results.push(tmp);
198
- }
199
- c.res.body = results;
200
- } catch (err) {
201
- console.log(err);
202
- c.send(err.message);
203
- }
204
- }, {name: 'upload-image', group: 'upload'});
205
-
206
- app.use(async (c, next) => {
207
- if (c.getFile('file') === null) {
208
- c.send('file not found -> c.files.file');
209
- return ;
210
- }
211
- await next(c);
212
-
213
- }, 'upload-file');
214
-
215
- router.put('/upload', async c => {
216
- try {
217
- console.log(c.files);
218
- console.log(c.body);
219
- let files = c.getFile('file', -1);
220
- let results = [];
221
- let tmp = '';
222
- for(let i=0; i<files.length; i++) {
223
- try {
224
- tmp = await c.moveFile(files[i], {
225
- path: process.env.HOME+'/tmp/a'
226
- });
227
- results.push(tmp);
228
- //console.log('not move');
229
- } catch (err) {
230
- console.log(err);
231
- }
232
- }
233
- c.res.body = results;
234
- } catch (err) {
235
- c.res.body = err.message;
236
- }
237
- }, {name:'upload-file', group:'upload'});
238
-
239
- router.get('/err', async ctx => {
240
- throw 'Error: test';
241
- });
242
-
243
- router.get('/app', async c => {
244
- c.send(c.service.router.group());
245
- });
246
-
247
- app.use(async (c, next) => {
248
- c.cache = true;
249
- c.setHeader('content-encoding', 'gzip');
250
- c.setHeader('content-type', 'text/plain; charset=utf-8');
251
- await next(c);
252
- c.resBody = await new Promise((rv, rj) => {
253
- zlib.gzip(c.resBody, {encoding:'utf8'}, (err, data) => {
254
- if (err) {rj (err);}
255
- rv(data);
256
- });
257
- });
258
- }, {name: 'gzip-test'});
259
-
260
- router.get('/quantum', async c => {
261
- let data = await new Promise((rv, rj) => {
262
- fs.readFile('../tmp/quantum', {encoding:'utf8'}, (err, data) => {
263
- if (err) { rj(err); }
264
- rv(data);
265
- });
266
- });
267
- c.send(data);
268
- }, 'gzip-test');
269
-
270
- router.get('/router', async c => {
271
- c.res.body = [
272
- c.service.router.routeTable(),
273
- c.service.router.group()
274
- ];
275
- });
276
-
277
- /*
278
- if (cluster.isWorker) {
279
- setTimeout(() => {
280
- process.exit(2);
281
- }, 150);
282
- }
283
- */
284
-
285
- app.daemon(sockpath, 1);
286
-