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/sni.js DELETED
@@ -1,66 +0,0 @@
1
- 'use strict';
2
-
3
- const titbit = require('../lib/titbit.js');
4
- const fs = require('fs');
5
- const tls = require('tls');
6
-
7
- var certs = {
8
- 'daojian.w3xm.top' : {
9
- cert : fs.readFileSync('../tmp/daojian.w3xm.top.pem'),
10
- key : fs.readFileSync('../tmp/daojian.w3xm.top.key')
11
- },
12
-
13
- 'www.w3xm.top' : {
14
- cert : fs.readFileSync('../tmp/www.w3xm.top.pem'),
15
- key : fs.readFileSync('../tmp/www.w3xm.top.key')
16
- }
17
- };
18
-
19
- var app = new titbit({
20
- debug: true,
21
- showLoadInfo: false,
22
- http2: true,
23
- https: true,
24
- server : {
25
- SNICallback : (servername, cb) => {
26
- return cb(null, tls.createSecureContext(certs[servername]));
27
- }
28
- },
29
- pidFile: '/tmp/mymaster.pid'
30
- });
31
-
32
- var {router} = app;
33
-
34
- app.use(async (ctx, next) => {
35
- console.log('mid');
36
- await next(ctx);
37
- });
38
-
39
- app.use(async (c, next) => {
40
- if (!c.getFile('image')) {
41
- c.res.body = 'image not found';
42
- return ;
43
- }
44
- await next(c);
45
- }, {method:'POST', group: 'upload'});
46
-
47
- router.get('/', async c => {
48
- c.res.body = 'ok';
49
- });
50
-
51
- router.post('/p', async c => {
52
- c.res.body = c.body;
53
- });
54
-
55
- router.post('/upload', async c => {
56
- try {
57
- c.res.body = await c.moveFile(c.getFile('image'), {
58
- path: process.env.HOME + '/tmp/buffer'
59
- });
60
- } catch (err) {
61
- c.res.body = err.message;
62
- }
63
- }, '@upload');
64
-
65
- app.daemon(1990);
66
-
Binary file
package/images/titbit.png DELETED
Binary file
package/tmp/buff-code DELETED
@@ -1,134 +0,0 @@
1
- /* let code = 0
2
- let isEncode = false
3
- let encodeCheck = 0
4
- let lastPos = 0
5
- let pairStart = 0
6
- let buf = ''
7
- //let arr = []
8
- let out = []
9
- let seenSep = false
10
-
11
- for (let i = 0; i < search.length; i++) {
12
- code = search.charCodeAt(i)
13
-
14
- if (code === CHAR_AMPERSAND) {
15
- //arr.push(search.slice(lastPos, i))
16
- //lastPos = i + 1
17
- if (pairStart === i) {
18
- //空的匹配,比如&&连续
19
- lastPos = pairStart = i + 1
20
- continue
21
- }
22
-
23
- if (lastPos < i)
24
- buf += search.slice(lastPos, i)
25
-
26
- if (isEncode) {
27
- try {
28
- buf = decodeURIComponent(buf)
29
- } catch (err){
30
-
31
- }
32
- }
33
-
34
- out.push(buf)
35
-
36
- // If `buf` is the key, add an empty value.
37
- !seenSep && out.push('')
38
-
39
- seenSep = false
40
- buf = ''
41
- isEncode = false;
42
- encodeCheck = 0
43
- lastPos = pairStart = i + 1
44
- continue
45
- }
46
-
47
- // Try matching key/value separator (e.g. '=') if we haven't already
48
- if (!seenSep && code === CHAR_EQUAL) {
49
- // Key/value separator match!
50
- if (lastPos < i) buf += search.slice(lastPos, i)
51
- if (isEncode) {
52
- try {
53
- buf = decodeURIComponent(buf)
54
- } catch(err){}
55
- }
56
-
57
- out.push(buf)
58
-
59
- seenSep = true
60
- buf = ''
61
- isEncode = false
62
- encodeCheck = 0
63
- lastPos = i + 1
64
- continue
65
- }
66
-
67
- if (!isEncode) {
68
- // Try to match an (valid) encoded byte (once) to minimize unnecessary
69
- // calls to string decoding functions
70
- if (code === CHAR_PERCENT) {
71
- encodeCheck = 1
72
- } else if (encodeCheck > 0) {
73
- if (isHexTable[code] === 1) {
74
- if (++encodeCheck === 3) {
75
- isEncode = true
76
- }
77
- } else {
78
- encodeCheck = 0
79
- }
80
- }
81
- }
82
-
83
-
84
- }
85
-
86
- urlobj.query = out
87
- return urlobj */
88
-
89
- /*
90
- let name_start = 0
91
- let name_end = 0
92
- let value_start = 0
93
- let value_end = 0
94
- let cur_name = ''
95
- let query = urlobj.query
96
-
97
- for (let i = 0; i < send; i++) {
98
- switch (search[i]) {
99
- case '=':
100
- value_start = i + 1
101
- name_end = i
102
- cur_name = search.slice(name_start, name_end)
103
- break
104
-
105
- case '&':
106
- value_end = i
107
- name_start = i + 1
108
- org_val = search.slice(value_start, value_end)
109
-
110
- if (autoDecode && is_encoded(org_val)) {
111
- try {
112
- val = decodeURIComponent(org_val)
113
- } catch (err) {
114
- val = org_val
115
- }
116
- } else {
117
- val = org_val
118
- }
119
-
120
- if (query[cur_name] === undefined || fastMode) {
121
- query[cur_name] = val
122
- } else {
123
- if (!Array.isArray(query[cur_name])) {
124
- query[cur_name] = [query[cur_name]]
125
- }
126
- query[cur_name].push(val)
127
- }
128
- break
129
-
130
- }
131
- }
132
-
133
- return urlobj
134
- */
package/tmp/devplan DELETED
@@ -1,9 +0,0 @@
1
- context1.js sendHeader实现检测是否已经发送消息头并发送。
2
-
3
- helper.uuid 实现部分自增序列。
4
-
5
- helper 增加根据文件mime类型查找扩展名的函数。
6
-
7
- helper 增加mime逆查找的函数。
8
-
9
- context是否加入user项,默认为null。
package/tmp/evt-test.js DELETED
@@ -1,34 +0,0 @@
1
- 'use strict';
2
-
3
- const titbit = require('../main')
4
-
5
- const cluster = require('cluster')
6
-
7
- const app = new titbit({
8
- debug : true,
9
- //loadInfoType: '--null',
10
- loadMonitor: false,
11
- })
12
-
13
- app.setMsgEvent('testmsg', (w, msg) => {
14
- console.log(w.id, msg)
15
- w.send({
16
- id: w.id,
17
- rand: Math.random()
18
- })
19
- })
20
-
21
- cluster.isWorker
22
- &&
23
- setInterval(() => {
24
-
25
- app.send('testmsg', `${Date.now()}`)
26
-
27
- }, 3000)
28
-
29
- app.workerMsg((msg) => {
30
- console.log(msg)
31
- })
32
-
33
- app.daemon(1235)
34
-
@@ -1,302 +0,0 @@
1
- 'use strict'
2
-
3
- /**
4
- *
5
- * 此函数是专门为了解析请求的路径和查询字符串部分而设计,因为url.parse在后续版本要抛弃,而URL解析后的searchParams无法和之前的程序兼容。
6
- *
7
- *
8
- * 通过maxArgs控制最大解析的参数个数。
9
- *
10
- * 为了更快的处理,fpqs和fpurl以两个独立函数的方式编写,虽然有很多代码的逻辑重复。
11
- *
12
- * fpqs主要是针对content-type为application/x-www-form-urlencoded这种格式提供的。
13
- *
14
- */
15
-
16
- let http_url_preg = /^https?:\/\//
17
-
18
- let chararr = [
19
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
20
- 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd',
21
- 'e', 'f'
22
- ]
23
-
24
- let charMap = {}
25
- chararr.forEach(x => {
26
- charMap[x] = true
27
- })
28
-
29
- //这个函数没有对状态使用单独的变量标记
30
- let is_encoded = (str) => {
31
- let i = 0
32
- let state = 0
33
-
34
- for (i=0; i < str.length; ++i) {
35
- //如果计数超过2说明是16进制的数字
36
- if (state > 2) return true
37
-
38
- if (state > 0) {
39
- if (charMap[str[i]]) {
40
- state++
41
- continue
42
- }
43
- else state = 0
44
- }
45
-
46
- if (str[i] === '%') {
47
- state = 1
48
- } else {
49
- state = 0
50
- }
51
- }
52
-
53
- return false
54
- }
55
-
56
- function fpqs (search, obj, autoDecode=true, maxArgs=0) {
57
- let ind = 0
58
- let and_ind = 0
59
- let last_ind = 0
60
- let val
61
- let org_val
62
- let t
63
- let count = 0
64
- let send = search.length
65
-
66
- while (and_ind < send) {
67
- and_ind = search.indexOf('&', last_ind)
68
-
69
- if (and_ind < 0) and_ind = send
70
-
71
- if (maxArgs > 0 && count >= maxArgs) {
72
- return
73
- }
74
-
75
- if (and_ind === last_ind) {
76
- last_ind++
77
- continue
78
- }
79
-
80
- ind = last_ind
81
-
82
- while (ind < and_ind && search[ind] !== '=') ind++
83
-
84
- if (last_ind >= ind) {
85
- last_ind = and_ind + 1
86
- continue
87
- }
88
-
89
- t = search.substring(last_ind, ind)
90
-
91
- org_val = ind < and_ind ? search.substring(ind+1, and_ind) : ''
92
-
93
- if (autoDecode) {
94
- if (org_val.length > 2 && is_encoded(org_val)) {
95
- try {
96
- val = decodeURIComponent(org_val)
97
- } catch (err) {
98
- val = org_val
99
- }
100
- } else {
101
- val = org_val
102
- }
103
- } else {
104
- val = org_val
105
- }
106
-
107
- if (Array.isArray(obj[t])) {
108
- obj[ t ].push(val)
109
- } else {
110
- if (obj[ t ] !== undefined) {
111
- obj[ t ] = [ obj[ t ], val ]
112
- } else {
113
- count++
114
- obj[ t ] = val
115
- }
116
- }
117
-
118
- last_ind = and_ind + 1
119
- }
120
-
121
- }
122
-
123
- /**
124
- *
125
- * @param {string} org_url
126
- * url可能是完整的格式,一般来说是/开始的路径,这两种都是协议允许的格式。
127
- *
128
- * */
129
-
130
- let httpchar = ['', '', '', '', '', '']
131
-
132
- function fpurl (org_url, autoDecode=false, fastMode=true, maxArgs=0) {
133
- let urlobj = {
134
- path : '/',
135
- query : {},
136
- hash : ''
137
- }
138
-
139
- let oend = org_url.length
140
- let start_ind = 0
141
- let path_start = -1
142
- let path_end = -1
143
- let search_start = -1
144
- let hash_start = -1
145
- let search_end = -1
146
-
147
- let http_mode = 0
148
- let protocol = ''
149
- let protocol_slash = false
150
-
151
- let ch
152
- for (let i=0; i < oend; i++) {
153
- ch = org_url[i]
154
- switch (ch) {
155
- case '/':
156
- ;(path_start < 0) && (path_start = i);
157
- break
158
-
159
- case '?':
160
- ;(path_end < 0) && (path_end = i);
161
- ;(search_start < 0) && (search_start = i + 1);
162
- let sind = i + 1
163
- while (sind < oend && org_url[sind] !== '#') sind++
164
- ;(search_end < 0) && (search_end = sind);
165
- i = sind-1
166
-
167
- /*
168
- let sind = i+1
169
- let name_start = 0
170
- let name_end = 0
171
- let value_start = 0
172
- let value_end = 0
173
- let cur_name = ''
174
- let org_val = ''
175
- let val = ''
176
- let query = urlobj.query
177
-
178
- for (; sind < oend; sind++) {
179
- if (org_url[sind] === '#') break
180
-
181
- switch (org_url[sind]) {
182
- case '=':
183
- value_start = sind + 1
184
- name_end = sind
185
- cur_name = org_url.slice(name_start, name_end)
186
- break
187
-
188
- case '&':
189
- value_end = sind
190
- name_start = sind + 1
191
- org_val = org_url.slice(value_start, value_end)
192
-
193
- if (autoDecode && is_encoded(org_val)) {
194
- try {
195
- val = decodeURIComponent(org_val)
196
- } catch (err) {
197
- val = org_val
198
- }
199
- } else {
200
- val = org_val
201
- }
202
-
203
- if (query[cur_name] === undefined || fastMode) {
204
- query[cur_name] = val
205
- } else {
206
- if (!Array.isArray(query[cur_name])) {
207
- query[cur_name] = [query[cur_name]]
208
- }
209
- query[cur_name].push(val)
210
- }
211
- break
212
-
213
- }
214
- }
215
- i = sind-1
216
- */
217
- break
218
-
219
- case '#':
220
- ;(path_end < 0) && (path_end = i);
221
- urlobj.hash = org_url.slice(i+1, oend)
222
- i = oend
223
- break
224
- }
225
- }
226
-
227
- if (path_start >= 0) {
228
- urlobj.path = org_url.slice(path_start, path_end < 0 ? oend : path_end)
229
- }
230
-
231
- if (search_start < 0) return urlobj
232
-
233
- let search = org_url.slice(search_start, search_end < 0 ? oend : search_end)
234
-
235
- let query = urlobj.query
236
-
237
- let and_ind = 0
238
- let last_ind = 0
239
- let val
240
- let org_val
241
- let t
242
- let ind = 0
243
- let send = search.length
244
- let count = 0
245
-
246
- while (and_ind < send) {
247
- and_ind = search.indexOf('&', last_ind)
248
- if (and_ind < 0) and_ind = send
249
-
250
- if (maxArgs > 0 && count >= maxArgs) {
251
- break
252
- }
253
-
254
- if (and_ind === last_ind) {
255
- last_ind++
256
- continue
257
- }
258
-
259
- ind = last_ind
260
-
261
- while (ind < and_ind && search[ind] !== '=') ind++
262
-
263
- if (last_ind >= ind) {
264
- last_ind = and_ind + 1
265
- continue
266
- }
267
-
268
- t = search.substring(last_ind, ind)
269
-
270
- org_val = search.slice(ind+1, and_ind)
271
-
272
- if (autoDecode && is_encoded(org_val)) {
273
- try {
274
- val = decodeURIComponent(org_val)
275
- } catch (err) {
276
- val = org_val
277
- }
278
- } else {
279
- val = org_val
280
- }
281
-
282
- if (query[t] === undefined || fastMode) {
283
- query[t] = val
284
- count++
285
- } else {
286
- if (!Array.isArray(query[t])) {
287
- query[t] = [ query[t] ]
288
- }
289
- query[t].push(val)
290
- }
291
-
292
- last_ind = and_ind + 1
293
- }
294
-
295
- return urlobj
296
- }
297
-
298
- module.exports = {
299
- fpurl,
300
- fpqs
301
- }
302
-