iosignal 1.6.1 → 1.7.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 (51) hide show
  1. package/README.md +254 -247
  2. package/auth_file.json +13 -13
  3. package/auth_file.mjs +23 -23
  4. package/dist/iosignal.cjs +2 -2
  5. package/dist/iosignal.esm.js.map +1 -1
  6. package/dist/iosignal.min.js.map +1 -1
  7. package/index.js +19 -19
  8. package/indexWebBrowser.js +13 -13
  9. package/package.json +60 -59
  10. package/rollup.config.js +69 -69
  11. package/src/api/RedisAPI.js +65 -68
  12. package/src/api/api_constant.js +7 -7
  13. package/src/api/api_reply.js +31 -34
  14. package/src/api/api_sudo.js +91 -96
  15. package/src/auth/Auth_Env.js +76 -78
  16. package/src/auth/Auth_File.js +71 -75
  17. package/src/auth/Auth_Redis.js +44 -50
  18. package/src/auth/BohoAuth.js +164 -168
  19. package/src/client/CongPacket.js +141 -150
  20. package/src/client/IOCongSocket.js +81 -88
  21. package/src/client/IOCore.js +822 -851
  22. package/src/client/IOWS.js +80 -81
  23. package/src/client/IOWebSocket.js +111 -112
  24. package/src/common/constants.js +148 -159
  25. package/src/common/payload.js +81 -82
  26. package/src/common/quotaTable.js +68 -68
  27. package/src/common/util.js +61 -61
  28. package/src/server/FileLogger.js +30 -30
  29. package/src/server/Manager.js +433 -449
  30. package/src/server/Metric.js +155 -154
  31. package/src/server/Remote.js +207 -0
  32. package/src/server/{ServerRemoteCore.js → RemoteCore.js} +439 -467
  33. package/src/server/Server.js +163 -166
  34. package/src/server/serverOption.js +56 -56
  35. package/test-browser/favicon.ico +0 -0
  36. package/test-browser/index.html +96 -93
  37. package/test-browser/server.js +11 -11
  38. package/test-client-nodejs/client.cjs +17 -17
  39. package/test-client-nodejs/client.mjs +17 -17
  40. package/test-client-nodejs/client_api_reply.mjs +15 -15
  41. package/test-client-nodejs/stateChange.mjs +19 -19
  42. package/test-server/server-Auth_Env.js +19 -19
  43. package/test-server/server-Auth_File.js +12 -12
  44. package/test-server/server-api_reply.js +6 -6
  45. package/test-server/server-api_sudo.js +7 -7
  46. package/test-server/server-commonjs.cjs +8 -8
  47. package/test-server/server-esm.mjs +20 -19
  48. package/test-server/simple-server.mjs +11 -11
  49. package/test-signal-payloadType/signalPack.js +34 -34
  50. package/test-signal-payloadType/signaling.js +60 -60
  51. package/src/server/ServerRemote.js +0 -227
@@ -1,159 +1,148 @@
1
-
2
- // IOclient state
3
- export const STATES = {
4
- OPENING: 0,
5
- OPEN: 1,
6
- CLOSING: 2,
7
- CLOSED: 3,
8
- SERVER_READY: 4,
9
- AUTH_FAIL: 5,
10
- AUTH_READY: 6,
11
- READY: 7,
12
- REDIRECTING: 8
13
- }
14
- for (let c in STATES) { STATES[STATES[c]] = c }
15
-
16
- // server side client state
17
- export const CLIENT_STATE = {
18
- INIT: 0,
19
- SENT_SERVER_READY: 1,
20
- RECV_AUTH_REQ: 2,
21
- SENT_SERVER_NONCE: 3,
22
- RECV_AUTH_HMAC: 4,
23
- AUTH_FAIL: 5,
24
- AUTH_READY: 6,
25
- CID_READY: 7
26
- }
27
- for (let c in CLIENT_STATE) { CLIENT_STATE[CLIENT_STATE[c]] = c }
28
-
29
- export let ENC_MODE = {
30
- NO: 0,
31
- YES: 1,
32
- AUTO: 2
33
- }
34
-
35
- for (let c in ENC_MODE) { ENC_MODE[ENC_MODE[c]] = c }
36
-
37
-
38
- export const SIZE_LIMIT = {
39
- TAG_LEN1: 255,
40
- TAG_LEN2: 65535,
41
- CONNECTION_CHECKER_PERIOD: 3000,
42
- PROMISE_TIMEOUT: 5000,
43
- DID: 8,
44
- CID: 12
45
- }
46
-
47
- export let PAYLOAD_TYPE = {
48
- EMPTY: 0,
49
- TEXT: 1,
50
- BINARY: 2,
51
- OBJECT: 3, // one stringify able object. no buffer.
52
- MJSON: 4, // multiple stringify able obejct. JSON string. with top levle array , no buffer
53
- MBA: 5 // "meta_buffer_arguments" arbitary types. buffer included.
54
- }
55
- for (let c in PAYLOAD_TYPE) { PAYLOAD_TYPE[PAYLOAD_TYPE[c]] = c }
56
- // console.log( PAYLOAD_TYPE )
57
-
58
- // MJSON: multiple arguments
59
- // accepet only string, number, root depth js primittive object,
60
- // unpack and will send to receiver handler with multiple params.
61
-
62
- // MBA: buffer pack of multiple arguments. check "meta-buffer-pack" module.
63
- // MBA: when armuents includes raw Buffer( TypedArray )
64
-
65
- // IO message pack one byte header.
66
- export let IOMsg = {
67
-
68
- /*
69
- * 0~127dec. reserved. for text stream.
70
- * 0~31: control code
71
- * 32~126: ascii charactor
72
- * 127: DEL
73
- */
74
-
75
- // ADMIN_REQ: 0xA0,
76
-
77
- // DO NOT USE: 0xB0~ 0xBF
78
- // Boho module using this numbers.
79
- // AUTH_REQ : 0xB0,
80
- // AUTH_NONCE: 0xB1,
81
- // AUTH_HMAC: 0xB2,
82
- // AUTH_ACK: 0xB3,
83
- // AUTH_FAIL: 0xB4,
84
- // AUTH_EXT: 0xB5,
85
- // ENC_PACK : 0xB6,
86
- // ENC_E2E : 0xB7,
87
- // ENC_488 : 0xB8
88
- // reserved ~0xBF
89
-
90
- // C. IO status contorl.
91
- SERVER_READY: 0xC0,
92
- CID_REQ: 0xC1,
93
- CID_RES: 0xC2,
94
- QUOTA_LEVEL: 0xC3,
95
- SERVER_CLEAR_AUTH: 0xC4,
96
- SERVER_REDIRECT: 0xC5,
97
-
98
- // ..
99
- LOOP: 0xCB,
100
- ECHO: 0xCC,
101
- PING: 0xCD,
102
- PONG: 0xCE,
103
- CLOSE: 0xCF,
104
- // ~CF
105
-
106
-
107
- // D. IO data signaling
108
- SIGNAL: 0xD0,
109
- SIGNAL_REQ: 0xD1,
110
- SIGNAL_E2E: 0xD2,
111
- SUBSCRIBE: 0xD3,
112
- SUBSCRIBE_REQ: 0xD4,
113
- UNSUBSCRIBE: 0xD5,
114
- SERVER_SIGNAL: 0xD6,
115
-
116
- // ..
117
- IAM: 0xD9,
118
- IAM_RES: 0xDA,
119
-
120
- //..
121
- SET: 0xDB, //
122
- RESPONSE_CODE: 0xDC,
123
- RESPONSE_MBP: 0xDD,
124
-
125
- REQUEST: 0xDE, //client public
126
- RESPONSE: 0xDF,
127
- // ~DF
128
-
129
-
130
- // F. Framing Flow control related framing protocol.(CongPacket)
131
- FLOW_MODE: 0xF0,
132
- WAIT: 0xF1,
133
- RESUME: 0xF2,
134
- //..
135
- TIME_OUT: 0xFD,
136
- OVER_SIZE: 0xFE,
137
- OVER_FLOW: 0xFF
138
-
139
- }
140
-
141
- for (let c in IOMsg) { IOMsg[IOMsg[c]] = c }
142
-
143
- // console.log( IOMsg );
144
-
145
-
146
- export const API_TYPE = {
147
- 'REQUEST_RESPONSE': 'requet_response',
148
- 'ONE_WAY': 'one_way'
149
- }
150
-
151
-
152
-
153
- // api response status code
154
- export const STATUS = {
155
- OK: 0,
156
- //0~127: success
157
- //128~255: fail
158
- ERROR: 255
159
- }
1
+
2
+ // Client STATES: name and number
3
+ export const STATES = {
4
+ OPENING: 0,
5
+ OPEN: 1,
6
+ CLOSING: 2,
7
+ CLOSED: 3,
8
+ SERVER_READY: 4,
9
+ AUTH_FAIL: 5,
10
+ AUTH_READY: 6,
11
+ READY: 7,
12
+ REDIRECTING: 8
13
+ }
14
+ for (let c in STATES) { STATES[STATES[c]] = c }
15
+
16
+ // server side client state
17
+ export const CLIENT_STATE = {
18
+ INIT: 0,
19
+ SENT_SERVER_READY: 1,
20
+ RECV_AUTH_REQ: 2,
21
+ SENT_SERVER_NONCE: 3,
22
+ RECV_AUTH_HMAC: 4,
23
+ AUTH_FAIL: 5,
24
+ AUTH_READY: 6,
25
+ CID_READY: 7
26
+ }
27
+ for (let c in CLIENT_STATE) { CLIENT_STATE[CLIENT_STATE[c]] = c }
28
+
29
+ export let ENC_MODE = {
30
+ NO: 0,
31
+ YES: 1,
32
+ AUTO: 2
33
+ }
34
+
35
+ for (let c in ENC_MODE) { ENC_MODE[ENC_MODE[c]] = c }
36
+
37
+
38
+ export const SIZE_LIMIT = {
39
+ TAG_LEN1: 255,
40
+ TAG_LEN2: 65535,
41
+ CONNECTION_CHECKER_PERIOD: 3000,
42
+ PROMISE_TIMEOUT: 5000,
43
+ DID: 8,
44
+ CID: 12
45
+ }
46
+
47
+ export let PAYLOAD_TYPE = {
48
+ EMPTY: 0,
49
+ TEXT: 1,
50
+ BINARY: 2,
51
+ OBJECT: 3, // one stringifiable object. it's string.
52
+ MJSON: 4, // multiple stringifiable obejct. it's top-level array JSON string.
53
+ MBA: 5 // "meta_buffer_arguments" arbitary types. it's meta-buffer-pack.
54
+ }
55
+ for (let c in PAYLOAD_TYPE) { PAYLOAD_TYPE[PAYLOAD_TYPE[c]] = c }
56
+
57
+
58
+ // IO message's one-byte headers.
59
+ export let IOMsg = {
60
+
61
+ /*
62
+ * 0~127dec. reserved. for text stream.
63
+ * 0~31: control code
64
+ * 32~126: ascii charactor
65
+ * 127: DEL
66
+ */
67
+
68
+ // ADMIN_REQ: 0xA0,
69
+
70
+ // DO NOT USE: 0xB0~ 0xBF
71
+ // Boho module using this numbers.
72
+ // AUTH_REQ : 0xB0,
73
+ // AUTH_NONCE: 0xB1,
74
+ // AUTH_HMAC: 0xB2,
75
+ // AUTH_ACK: 0xB3,
76
+ // AUTH_FAIL: 0xB4,
77
+ // AUTH_EXT: 0xB5,
78
+ // ENC_PACK : 0xB6,
79
+ // ENC_E2E : 0xB7,
80
+ // ENC_488 : 0xB8
81
+ // reserved ~0xBF
82
+
83
+ // C. IO status contorl.
84
+ SERVER_READY: 0xC0,
85
+ CID_REQ: 0xC1,
86
+ CID_RES: 0xC2,
87
+ QUOTA_LEVEL: 0xC3,
88
+ SERVER_CLEAR_AUTH: 0xC4,
89
+ SERVER_REDIRECT: 0xC5,
90
+
91
+ // ..
92
+ LOOP: 0xCB,
93
+ ECHO: 0xCC,
94
+ PING: 0xCD,
95
+ PONG: 0xCE,
96
+ CLOSE: 0xCF,
97
+ // ~CF
98
+
99
+
100
+ // D. IO data signaling
101
+ SIGNAL: 0xD0,
102
+ SIGNAL_REQ: 0xD1,
103
+ SIGNAL_E2E: 0xD2,
104
+ SUBSCRIBE: 0xD3,
105
+ SUBSCRIBE_REQ: 0xD4,
106
+ UNSUBSCRIBE: 0xD5,
107
+ SERVER_SIGNAL: 0xD6,
108
+
109
+ // ..
110
+ IAM: 0xD9,
111
+ IAM_RES: 0xDA,
112
+
113
+ //..
114
+ SET: 0xDB, //
115
+ RESPONSE_CODE: 0xDC,
116
+ RESPONSE_MBP: 0xDD,
117
+
118
+ REQUEST: 0xDE, //client public
119
+ RESPONSE: 0xDF,
120
+ // ~DF
121
+
122
+
123
+ // F. Framing Flow control related framing protocol.(CongPacket)
124
+ FLOW_MODE: 0xF0,
125
+ WAIT: 0xF1,
126
+ RESUME: 0xF2,
127
+ //..
128
+ TIME_OUT: 0xFD,
129
+ OVER_SIZE: 0xFE,
130
+ OVER_FLOW: 0xFF
131
+
132
+ }
133
+
134
+ for (let c in IOMsg) { IOMsg[IOMsg[c]] = c }
135
+ // console.log( IOMsg );
136
+
137
+ export const API_TYPE = {
138
+ 'REQUEST_RESPONSE': 'requet_response',
139
+ 'ONE_WAY': 'one_way'
140
+ }
141
+
142
+ // api response status code
143
+ export const STATUS = {
144
+ OK: 0,
145
+ //0~127: success
146
+ //128~255: fail
147
+ ERROR: 255
148
+ }
@@ -1,83 +1,82 @@
1
- import { MBP } from 'meta-buffer-pack'
2
- import { PAYLOAD_TYPE, IOMsg } from "./constants.js";
3
- const encoder = new TextEncoder()
4
-
5
-
6
- export function getSignalPack( tag, ...args ){
7
- if( typeof tag !== 'string') throw TypeError('tag should be string.')
8
- let tagEncoded = encoder.encode( tag)
9
- let payload = parsePayload( args )
10
-
11
- let sigPack;
12
- if( payload.type == PAYLOAD_TYPE.EMPTY ){
13
- sigPack = MBP.pack(
14
- MBP.MB('#MsgType','8', IOMsg.SIGNAL) ,
15
- MBP.MB('#tagLen','8', tagEncoded.byteLength),
16
- MBP.MB('#tag', tagEncoded),
17
- MBP.MB('#payloadType', '8', payload.type )
18
- )
19
- }else if( payload.type == PAYLOAD_TYPE.MBA ){
20
- let mbaBuffer = MBP.pack( MBP.MBA(...args))
21
- sigPack = MBP.pack(
22
- MBP.MB('#MsgType','8', IOMsg.SIGNAL) ,
23
- MBP.MB('#tagLen','8', tagEncoded.byteLength),
24
- MBP.MB('#tag', tagEncoded),
25
- MBP.MB('#payloadType', '8', payload.type ),
26
- MBP.MB('#mbaBuffer', mbaBuffer )
27
- )
28
- }else {
29
- sigPack = MBP.pack(
30
- MBP.MB('#MsgType','8', IOMsg.SIGNAL) ,
31
- MBP.MB('#tagLen','8', tagEncoded.byteLength),
32
- MBP.MB('#tag', tagEncoded),
33
- MBP.MB('#payloadType', '8', payload.type ),
34
- MBP.MB('#payload', payload.buffer )
35
- )
36
- }
37
- return sigPack
38
- }
39
-
40
-
41
- export function parsePayload( args){
42
- let type, pack;
43
- if( args.length == 0){
44
- type = PAYLOAD_TYPE.EMPTY
45
- pack = null
46
- }else if( args.length == 1){
47
- if( typeof args[0] === 'string' || typeof args[0] === 'number'){
48
- type = PAYLOAD_TYPE.TEXT
49
- pack = encoder.encode( args[0] + ".") // add null area.
50
- pack[pack.byteLength - 1 ] = 0 // set null.
51
-
52
- }else if( ArrayBuffer.isView( args[0]) || args[0] instanceof ArrayBuffer ){ //one buffer
53
- type = PAYLOAD_TYPE.BINARY
54
- pack = MBP.B8( args[0 ] )
55
- }else if(typeof args[0] === 'object'){
56
- type = PAYLOAD_TYPE.OBJECT
57
- pack = encoder.encode( JSON.stringify( args[0]) )
58
- }else{
59
- throw new Error('unknown payload arguments')
60
- }
61
- }else{ // args 2 and more
62
- let containsBuffer = false
63
- args.forEach( item =>{
64
- if( ArrayBuffer.isView( item ) || item instanceof ArrayBuffer ) containsBuffer = true;
65
- })
66
-
67
- if( containsBuffer ){
68
- type = PAYLOAD_TYPE.MBA;
69
- }else{
70
- type = PAYLOAD_TYPE.MJSON;
71
- // args is array
72
- pack = encoder.encode( JSON.stringify( args ) )
73
- }
74
-
75
- }
76
-
77
- return { type: type, buffer: pack }
78
- }
79
-
80
- export function getPayloadFromSignalPack( signalPack ){
81
- let tagLen = signalPack.readUint8(1)
82
- return signalPack.subarray(3 + tagLen)
1
+ import { MBP } from 'meta-buffer-pack'
2
+ import { PAYLOAD_TYPE, IOMsg } from "./constants.js";
3
+ const encoder = new TextEncoder()
4
+
5
+
6
+ export function getSignalPack(tag, ...args) {
7
+ if (typeof tag !== 'string') throw TypeError('tag should be string.')
8
+ let tagEncoded = encoder.encode(tag)
9
+ let payload = parsePayload(args)
10
+
11
+ let sigPack;
12
+ if (payload.type == PAYLOAD_TYPE.EMPTY) {
13
+ sigPack = MBP.pack(
14
+ MBP.MB('#MsgType', '8', IOMsg.SIGNAL),
15
+ MBP.MB('#tagLen', '8', tagEncoded.byteLength),
16
+ MBP.MB('#tag', tagEncoded),
17
+ MBP.MB('#payloadType', '8', payload.type)
18
+ )
19
+ } else if (payload.type == PAYLOAD_TYPE.MBA) {
20
+ let mbaBuffer = MBP.pack(MBP.MBA(...args))
21
+ sigPack = MBP.pack(
22
+ MBP.MB('#MsgType', '8', IOMsg.SIGNAL),
23
+ MBP.MB('#tagLen', '8', tagEncoded.byteLength),
24
+ MBP.MB('#tag', tagEncoded),
25
+ MBP.MB('#payloadType', '8', payload.type),
26
+ MBP.MB('#mbaBuffer', mbaBuffer)
27
+ )
28
+ } else {
29
+ sigPack = MBP.pack(
30
+ MBP.MB('#MsgType', '8', IOMsg.SIGNAL),
31
+ MBP.MB('#tagLen', '8', tagEncoded.byteLength),
32
+ MBP.MB('#tag', tagEncoded),
33
+ MBP.MB('#payloadType', '8', payload.type),
34
+ MBP.MB('#payload', payload.buffer)
35
+ )
36
+ }
37
+ return sigPack
38
+ }
39
+
40
+
41
+ export function parsePayload(args) {
42
+ let type, pack;
43
+ if (args.length == 0) {
44
+ type = PAYLOAD_TYPE.EMPTY
45
+ pack = null
46
+ } else if (args.length == 1) {
47
+ if (typeof args[0] === 'string' || typeof args[0] === 'number') {
48
+ type = PAYLOAD_TYPE.TEXT
49
+ pack = encoder.encode(args[0] + ".") // add null byte area.
50
+ pack[pack.byteLength - 1] = 0 // set byte-zero : '\0' in C/C++
51
+
52
+ } else if (ArrayBuffer.isView(args[0]) || args[0] instanceof ArrayBuffer) {
53
+ type = PAYLOAD_TYPE.BINARY
54
+ pack = MBP.B8(args[0])
55
+ } else if (typeof args[0] === 'object') {
56
+ type = PAYLOAD_TYPE.OBJECT
57
+ pack = encoder.encode(JSON.stringify(args[0]))
58
+ } else {
59
+ throw new Error('unknown payload arguments')
60
+ }
61
+ } else { // two or more arguments.
62
+ let containsBuffer = false
63
+ args.forEach(item => {
64
+ if (ArrayBuffer.isView(item) || item instanceof ArrayBuffer) containsBuffer = true;
65
+ })
66
+
67
+ if (containsBuffer) {
68
+ type = PAYLOAD_TYPE.MBA;
69
+ } else {
70
+ type = PAYLOAD_TYPE.MJSON;
71
+ pack = encoder.encode(JSON.stringify(args))
72
+ }
73
+
74
+ }
75
+
76
+ return { type: type, buffer: pack }
77
+ }
78
+
79
+ export function getPayloadFromSignalPack(signalPack) {
80
+ let tagLen = signalPack.readUint8(1)
81
+ return signalPack.subarray(3 + tagLen)
83
82
  }
@@ -1,68 +1,68 @@
1
- // table index related with:
2
- // - AUTH database level
3
- // - serverOption.defaultQuotaIndex
4
-
5
- // quota example
6
- // index range: 0~255.
7
- export let quotaTable = {
8
- // CongSocket
9
- 0: { // default. anonymouse:
10
- signalSize: 1500,
11
- publishCounter: 10,
12
- trafficRate: 10000
13
- },
14
- 1: { // auth_ultralight: eg. Arduino Uno.
15
- signalSize: 255,
16
- publishCounter: 10,
17
- trafficRate: 100000
18
- },
19
- 2: { // auth_light: eg. authorized ESP.
20
- signalSize: 65535,
21
- publishCounter: 10,
22
- trafficRate: 1048576
23
- },
24
-
25
- // WebSocket (browser and node app)
26
- 3: { // authorized basic.
27
- signalSize: 1048576,
28
- publishCounter: 10,
29
- trafficRate: 1048576 * 20
30
- },
31
-
32
- // WebSocket (browser and node app)
33
- 10: { // anonymouse
34
- signalSize: 1500,
35
- publishCounter: 5,
36
- trafficRate: 1048576 * 20
37
- },
38
-
39
- 11: { // authorized basic.
40
- signalSize: 65535,
41
- publishCounter: 10,
42
- trafficRate: 1048576 * 20
43
- },
44
-
45
- 12: { // authorized power.
46
- signalSize: 1048576,
47
- publishCounter: 100,
48
- trafficRate: 1048576 * 20
49
- },
50
-
51
- // you can add your custom quota level.
52
-
53
- // Remote service node
54
- // High Quota, No root permission.
55
- 200: {
56
- signalSize: 1048576 * 20,
57
- publishCounter: 10000,
58
- trafficRate: 1048576 * 100
59
- },
60
- // super admin or root user.
61
- // to monitor, metric, sudo command, db acess
62
- 255: {
63
- signalSize: 1048576 * 20,
64
- publishCounter: 10000,
65
- trafficRate: 1048576 * 100
66
- }
67
- }
68
-
1
+ // table index related with:
2
+ // - AUTH database level
3
+ // - serverOption.defaultQuotaIndex
4
+
5
+ // quota example
6
+ // index range: 0~255.
7
+ export let quotaTable = {
8
+ // CongSocket
9
+ 0: { // default. anonymouse:
10
+ signalSize: 1500,
11
+ publishCounter: 10,
12
+ trafficRate: 10000
13
+ },
14
+ 1: { // auth_ultralight: eg. Arduino Uno.
15
+ signalSize: 255,
16
+ publishCounter: 10,
17
+ trafficRate: 100000
18
+ },
19
+ 2: { // auth_light: eg. authorized ESP.
20
+ signalSize: 65535,
21
+ publishCounter: 10,
22
+ trafficRate: 1048576
23
+ },
24
+
25
+ // WebSocket (browser and node app)
26
+ 3: { // authorized basic.
27
+ signalSize: 1048576,
28
+ publishCounter: 10,
29
+ trafficRate: 1048576 * 20
30
+ },
31
+
32
+ // WebSocket (browser and node app)
33
+ 10: { // anonymouse
34
+ signalSize: 1500,
35
+ publishCounter: 5,
36
+ trafficRate: 1048576 * 20
37
+ },
38
+
39
+ 11: { // authorized basic.
40
+ signalSize: 65535,
41
+ publishCounter: 10,
42
+ trafficRate: 1048576 * 20
43
+ },
44
+
45
+ 12: { // authorized power.
46
+ signalSize: 1048576,
47
+ publishCounter: 100,
48
+ trafficRate: 1048576 * 20
49
+ },
50
+
51
+ // you can add your custom quota levels.
52
+
53
+ // Remote service node
54
+ // High Quota, No root permission.
55
+ 200: {
56
+ signalSize: 1048576 * 20,
57
+ publishCounter: 10000,
58
+ trafficRate: 1048576 * 100
59
+ },
60
+ // super admin or root user.
61
+ // to monitor, metric, sudo command, db access.
62
+ 255: {
63
+ signalSize: 1048576 * 20,
64
+ publishCounter: 10000,
65
+ trafficRate: 1048576 * 100
66
+ }
67
+ }
68
+