whatap 0.4.98 → 0.5.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.
- package/lib/conf/config-default.js +10 -3
- package/lib/conf/configure.js +12 -3
- package/lib/conf/log-config-default.js +37 -0
- package/lib/control/control-handler.js +19 -6
- package/lib/core/agent.js +10 -8
- package/lib/core/shimmer.js +98 -0
- package/lib/counter/task/agentinfo.js +1 -1
- package/lib/data/datapack-sender.js +17 -0
- package/lib/data/zipprofile.js +2 -2
- package/lib/logger.js +25 -1
- package/lib/logsink/line-log-util.js +87 -0
- package/lib/logsink/line-log.js +12 -0
- package/lib/logsink/log-sender.js +78 -0
- package/lib/logsink/log-tracer.js +40 -0
- package/lib/logsink/sender-util.js +51 -0
- package/lib/logsink/zip/zip-send.js +177 -0
- package/lib/net/paramdef.js +1 -0
- package/lib/net/security-master.js +1 -1
- package/lib/observers/global-observer.js +200 -0
- package/lib/observers/grpc-observer.js +336 -0
- package/lib/observers/http-observer.js +11 -8
- package/lib/observers/process-observer.js +55 -8
- package/lib/observers/redis-observer.js +74 -11
- package/lib/observers/socket.io-observer.js +76 -67
- package/lib/pack/event-pack.js +1 -1
- package/lib/pack/log-sink-pack.js +139 -0
- package/lib/pack/packenum.js +3 -1
- package/lib/pack/zip-pack.js +0 -1
- package/lib/topology/link.js +63 -0
- package/lib/topology/nodeinfo.js +123 -0
- package/lib/topology/status-detector.js +111 -0
- package/lib/util/compare-util.js +131 -0
- package/lib/util/linkedset.js +278 -0
- package/lib/util/oidutil.js +4 -1
- package/package.json +2 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var conf = require('../conf/configure');
|
|
2
|
+
var SecurityMaster = require('../net/security-master');
|
|
3
|
+
var LogSinkPack = require('../pack/log-sink-pack');
|
|
4
|
+
var DataPackSender = require('../data/datapack-sender');
|
|
5
|
+
var DateUtil = require('../util/dateutil')
|
|
6
|
+
var ZipSend = require('./zip/zip-send');
|
|
7
|
+
|
|
8
|
+
function SenderUtil() {
|
|
9
|
+
this.conf = conf;
|
|
10
|
+
this.secu = SecurityMaster;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
SenderUtil.prototype.send = function (log) {
|
|
14
|
+
const p = new LogSinkPack();
|
|
15
|
+
p.time = log.time;
|
|
16
|
+
if (!p.time) {
|
|
17
|
+
p.time = DateUtil.currentTime();
|
|
18
|
+
}
|
|
19
|
+
p.category = log.category;
|
|
20
|
+
|
|
21
|
+
if (this.secu.ONAME) {
|
|
22
|
+
p.tags.putString('oname', this.secu.ONAME);
|
|
23
|
+
}
|
|
24
|
+
if (this.conf.OKIND) {
|
|
25
|
+
p.tags.putString('okindName', this.conf.OKIND_NAME);
|
|
26
|
+
}
|
|
27
|
+
if (this.conf.ONODE) {
|
|
28
|
+
p.tags.putString('onodeName', this.conf.ONODE_NAME);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (log.tags != null) {
|
|
32
|
+
p.tags.putAllMapValue(log.tags);
|
|
33
|
+
}
|
|
34
|
+
if (log.fields != null) {
|
|
35
|
+
if (p.fields == null) {
|
|
36
|
+
p.fields = log.fields;
|
|
37
|
+
} else {
|
|
38
|
+
p.fields.putAllMapValue(log.fields);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
p.content = log.content;
|
|
43
|
+
|
|
44
|
+
if(conf.getProperty('logsink_zip_enabled', false)){
|
|
45
|
+
ZipSend.getInstance().add(p);
|
|
46
|
+
}else{
|
|
47
|
+
DataPackSender.sendLogSinkPack(p)
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
module.exports = SenderUtil;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2016 the WHATAP project authors. All rights reserved.
|
|
3
|
+
* Use of this source code is governed by a license that
|
|
4
|
+
* can be found in the LICENSE file.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
var conf = require('../../conf/configure'),
|
|
8
|
+
DateUtil = require('../../util/dateutil'),
|
|
9
|
+
RequestQueue = require('../../util/request-queue'),
|
|
10
|
+
DataPackSender = require('../../data/datapack-sender'),
|
|
11
|
+
DataOutputX = require('../../io/data-outputx'),
|
|
12
|
+
ZipPack = require('../../pack/zip-pack'),
|
|
13
|
+
Logger = require('../../logger');
|
|
14
|
+
var zlib = require('zlib');
|
|
15
|
+
|
|
16
|
+
var logsink_enabled = conf.getProperty('logsink_enabled', false);
|
|
17
|
+
var logsink_zip_enabled = conf.getProperty('logsink_zip_enabled', false);
|
|
18
|
+
var logsink_max_buffer_size = conf.getProperty('logsink_max_buffer_size', 1024*64);
|
|
19
|
+
var profile_zip_min_size = conf.getProperty('profile_zip_min_size', 100)
|
|
20
|
+
var logsink_queue_size = conf.getProperty('logsink_queue_size', 500);
|
|
21
|
+
var logsink_max_wait_time = conf.getProperty('logsink_max_wait_time', 2000);
|
|
22
|
+
conf.on('logsink_enabled', function(newProperty) {
|
|
23
|
+
logsink_enabled = newProperty;
|
|
24
|
+
if (logsink_enabled && logsink_zip_enabled) {
|
|
25
|
+
ZipSend.getInstance().startProcessQueue();
|
|
26
|
+
} else {
|
|
27
|
+
ZipSend.getInstance().stopProcessQueue();
|
|
28
|
+
ZipSend.resetInstance();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
conf.on('logsink_zip_enabled', function(newProperty) {
|
|
32
|
+
logsink_zip_enabled = newProperty;
|
|
33
|
+
if (logsink_enabled && logsink_zip_enabled) {
|
|
34
|
+
ZipSend.getInstance().startProcessQueue();
|
|
35
|
+
} else {
|
|
36
|
+
ZipSend.getInstance().stopProcessQueue();
|
|
37
|
+
ZipSend.resetInstance();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
class ZipSend {
|
|
42
|
+
constructor() {
|
|
43
|
+
if (ZipSend.instance) {
|
|
44
|
+
return ZipSend.instance;
|
|
45
|
+
}
|
|
46
|
+
this.queue = new RequestQueue(logsink_queue_size);
|
|
47
|
+
this.buffer = Buffer.alloc(0);
|
|
48
|
+
this.packCount = 0;
|
|
49
|
+
this.first_time = null;
|
|
50
|
+
this.isProcessing = false;
|
|
51
|
+
ZipSend.instance = this;
|
|
52
|
+
|
|
53
|
+
if (logsink_enabled && logsink_zip_enabled) {
|
|
54
|
+
this.startProcessQueue();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static getInstance() {
|
|
59
|
+
if (!ZipSend.instance) {
|
|
60
|
+
ZipSend.instance = new ZipSend();
|
|
61
|
+
}
|
|
62
|
+
return ZipSend.instance;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static resetInstance() {
|
|
66
|
+
if(ZipSend.instance){
|
|
67
|
+
ZipSend.instance = null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
add(p){
|
|
72
|
+
var ok = this.queue.put(p);
|
|
73
|
+
if(!ok){
|
|
74
|
+
DataPackSender.sendLogSinkPack(p);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// async addWait(p, waitTimeForFull) {
|
|
79
|
+
// var ok = this.queue.put(p);
|
|
80
|
+
// if (ok === false){
|
|
81
|
+
// if(waitTimeForFull > 0){
|
|
82
|
+
// while(this.queue.put(p) === false){
|
|
83
|
+
// await new Promise(resolve => setTimeout(resolve, waitTimeForFull));
|
|
84
|
+
// }
|
|
85
|
+
// }
|
|
86
|
+
// }
|
|
87
|
+
// }
|
|
88
|
+
|
|
89
|
+
async processQueue() {
|
|
90
|
+
this.isProcessing = true;
|
|
91
|
+
while (this.isProcessing) {
|
|
92
|
+
if(!logsink_enabled || !logsink_zip_enabled) {
|
|
93
|
+
this.isProcessing = false;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const p = await this.queue.getByTimeout(logsink_max_wait_time);
|
|
98
|
+
if(p) {
|
|
99
|
+
await this.append(p);
|
|
100
|
+
}else{
|
|
101
|
+
await this.sendAndClear();
|
|
102
|
+
}
|
|
103
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async append(p) {
|
|
108
|
+
var b = DataOutputX.toBytesPack(p);
|
|
109
|
+
this.packCount++;
|
|
110
|
+
this.buffer = Buffer.concat([this.buffer, b]);
|
|
111
|
+
|
|
112
|
+
if(!this.first_time){
|
|
113
|
+
this.first_time = p.time;
|
|
114
|
+
if (this.buffer.length >= logsink_max_buffer_size) {
|
|
115
|
+
await this.sendAndClear();
|
|
116
|
+
}
|
|
117
|
+
}else{
|
|
118
|
+
if(this.buffer.length >= logsink_max_buffer_size || (p.time - this.first_time) >= conf.getProperty('logsink_max_wait_time', 2000)){
|
|
119
|
+
await this.sendAndClear();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async sendAndClear() {
|
|
125
|
+
if(this.buffer.length === 0){ return; }
|
|
126
|
+
|
|
127
|
+
var p = new ZipPack();
|
|
128
|
+
p.time = DateUtil.currentTime();
|
|
129
|
+
p.recordCount = this.packCount;
|
|
130
|
+
p.records = this.buffer;
|
|
131
|
+
|
|
132
|
+
await this.doZip(p);
|
|
133
|
+
if(conf.getProperty('debug_logsink_zip_enabled', false)){
|
|
134
|
+
Logger.print('WHATAP-703', `zip status=${p.status} records=${p.recordCount} | ${this.buffer.length} => ${p.records.length}`);
|
|
135
|
+
}
|
|
136
|
+
DataPackSender.sendLogSinkPack(p);
|
|
137
|
+
|
|
138
|
+
this.buffer = Buffer.alloc(0);
|
|
139
|
+
this.first_time = 0;
|
|
140
|
+
this.packCount = 0;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async doZip(p){
|
|
144
|
+
if(p.status !== 0){ return; }
|
|
145
|
+
if(p.records.length < profile_zip_min_size){ return; }
|
|
146
|
+
p.status = 1;
|
|
147
|
+
|
|
148
|
+
try{
|
|
149
|
+
p.records = await this._doZip(p.records);
|
|
150
|
+
}catch (error) {
|
|
151
|
+
Logger.print('WHATAP-701', 'Error occurred during compression.' + error, false);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
_doZip(data) {
|
|
156
|
+
return new Promise((resolve, reject) => {
|
|
157
|
+
zlib.gzip(data, (err, buffer) => {
|
|
158
|
+
if (err) {
|
|
159
|
+
reject(err);
|
|
160
|
+
} else {
|
|
161
|
+
resolve(buffer);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
startProcessQueue() {
|
|
168
|
+
if (!this.isProcessing) {
|
|
169
|
+
this.processQueue()
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
stopProcessQueue() {
|
|
173
|
+
this.isProcessing = false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
module.exports = ZipSend;
|
package/lib/net/paramdef.js
CHANGED
|
@@ -105,7 +105,7 @@ var SecurityMaster = {
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
//OidUtil.setCmd(Configuration.getProperty("sun.java.command"));
|
|
108
|
-
this.ONAME = OidUtil.mkOname(Configuration.getProperty("whatap.name", name_pattern));
|
|
108
|
+
this.ONAME = OidUtil.mkOname(Configuration.getProperty("whatap.name", name_pattern), port);
|
|
109
109
|
this.OID = OidUtil.mkOid(this.ONAME);
|
|
110
110
|
|
|
111
111
|
if (lastOid != this.OID) {
|
|
@@ -7,11 +7,28 @@
|
|
|
7
7
|
var TraceContextManager = require('../trace/trace-context-manager'),
|
|
8
8
|
Logger = require('../logger');
|
|
9
9
|
|
|
10
|
+
var HttpStepX = require('../step/http-stepx');
|
|
11
|
+
const Hexa32 = require("../util/hexa32");
|
|
12
|
+
const SecurityMaster = require("../net/security-master");
|
|
13
|
+
const conf = require("../conf/configure");
|
|
14
|
+
const KeyGen = require("../util/keygen");
|
|
15
|
+
const HashUtil = require("../util/hashutil");
|
|
16
|
+
const DataTextAgent = require("../data/datatext-agent");
|
|
17
|
+
const shimmer = require('../core/shimmer');
|
|
18
|
+
const StatError = require("../stat/stat-error");
|
|
19
|
+
const TextTypes = require("../lang/text-types");
|
|
20
|
+
const URLPatternDetector = require('../trace/serviceurl-pattern-detector').Detector;
|
|
21
|
+
|
|
10
22
|
var GlobalObserver = function (agent) {
|
|
11
23
|
this.agent = agent;
|
|
12
24
|
this.packages = ['global'];
|
|
13
25
|
}
|
|
14
26
|
|
|
27
|
+
var transaction_status_error_enable = conf.getProperty('transaction_status_error_enable', true);
|
|
28
|
+
conf.on('transaction_status_error_enable', function (newProps) {
|
|
29
|
+
transaction_status_error_enable = newProps;
|
|
30
|
+
})
|
|
31
|
+
|
|
15
32
|
GlobalObserver.prototype.inject = function (mod, moduleName) {
|
|
16
33
|
var self = this;
|
|
17
34
|
|
|
@@ -26,6 +43,189 @@ GlobalObserver.prototype.inject = function (mod, moduleName) {
|
|
|
26
43
|
});
|
|
27
44
|
});
|
|
28
45
|
});
|
|
46
|
+
|
|
47
|
+
shimmer.wrap(mod, 'fetch', function(original) {
|
|
48
|
+
return async function(...args) {
|
|
49
|
+
var info = args[1] ? args[1] : {};
|
|
50
|
+
var ctx = TraceContextManager._asyncLocalStorage.getStore();
|
|
51
|
+
|
|
52
|
+
if (ctx) {
|
|
53
|
+
interTxTraceAutoOn(ctx);
|
|
54
|
+
|
|
55
|
+
if (conf.mtrace_enabled) {
|
|
56
|
+
addTraceHeaders(info, ctx);
|
|
57
|
+
args[1] = info;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const response = await original.apply(this, args);
|
|
63
|
+
handleResponse(ctx, args, response);
|
|
64
|
+
return response;
|
|
65
|
+
} catch (e) {
|
|
66
|
+
handleError(ctx, args, e);
|
|
67
|
+
throw e;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
});
|
|
29
71
|
};
|
|
30
72
|
|
|
73
|
+
function addTraceHeaders(info, ctx) {
|
|
74
|
+
if (info.headers) {
|
|
75
|
+
info.headers['x-wtap-po'] = transferPOID(ctx);
|
|
76
|
+
} else {
|
|
77
|
+
info.headers = {
|
|
78
|
+
'x-wtap-po': transferPOID(ctx)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (conf.stat_mtrace_enabled) {
|
|
82
|
+
info.headers[conf._trace_mtrace_spec_key1] = transferSPEC_URL(ctx);
|
|
83
|
+
}
|
|
84
|
+
if (conf.mtid_mtrace_enabled && ctx.mtid.isZero() === false) {
|
|
85
|
+
info.headers[conf._trace_mtrace_caller_key] = transferMTID_CALLERTX(ctx);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function handleResponse(ctx, args, response) {
|
|
90
|
+
if (!ctx || !args[0]) return;
|
|
91
|
+
|
|
92
|
+
const url = new URL(args[0]);
|
|
93
|
+
setupContext(ctx, url);
|
|
94
|
+
|
|
95
|
+
var step = createStep(ctx, url);
|
|
96
|
+
|
|
97
|
+
if (!response.ok && transaction_status_error_enable) {
|
|
98
|
+
recordError(ctx, step, response);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
ctx.profile.push(step);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function handleError(ctx, args, error) {
|
|
105
|
+
if (!ctx || !args[0]) return;
|
|
106
|
+
|
|
107
|
+
const url = new URL(args[0]);
|
|
108
|
+
setupContext(ctx, url);
|
|
109
|
+
|
|
110
|
+
var step = createStep(ctx, url);
|
|
111
|
+
|
|
112
|
+
if (transaction_status_error_enable) {
|
|
113
|
+
recordError(ctx, step, error);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
ctx.profile.push(step);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function setupContext(ctx, url) {
|
|
120
|
+
ctx.httpc_host = url.hostname;
|
|
121
|
+
ctx.httpc_url = url.pathname;
|
|
122
|
+
ctx.httpc_port = url.port || (url.protocol === 'https:' ? 443 : 80);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function createStep(ctx, url) {
|
|
126
|
+
var step = new HttpStepX();
|
|
127
|
+
step.start_time = ctx.getElapsedTime();
|
|
128
|
+
step.url = HashUtil.hashFromString(ctx.httpc_url);
|
|
129
|
+
DataTextAgent.HTTPC_URL.add(step.url, ctx.httpc_url);
|
|
130
|
+
step.host = HashUtil.hashFromString(ctx.httpc_host);
|
|
131
|
+
DataTextAgent.HTTPC_HOST.add(step.host, ctx.httpc_host);
|
|
132
|
+
step.port = ctx.httpc_port;
|
|
133
|
+
return step;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function recordError(ctx, step, response) {
|
|
137
|
+
if (step.error.isZero()) {
|
|
138
|
+
var cleanUrl = ctx.httpc_url.split('?')[0];
|
|
139
|
+
ctx.service_name = URLPatternDetector.normalize(cleanUrl);
|
|
140
|
+
ctx.service_hash = HashUtil.hashFromString(ctx.service_name);
|
|
141
|
+
|
|
142
|
+
const errorMessage = response.statusText || (response.cause ? response.cause.message : '') || response.message || 'Unknown error';
|
|
143
|
+
step.error = StatError.addError(response.status || null, errorMessage, ctx.service_hash, TextTypes.HTTPC_URL, step.url);
|
|
144
|
+
|
|
145
|
+
if (ctx.error.isZero()) {
|
|
146
|
+
ctx.error = step.error;
|
|
147
|
+
ctx.statusCode = response.status || null;
|
|
148
|
+
ctx.statusMessage = errorMessage;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
var transfer_poid;
|
|
154
|
+
function transferPOID(ctx) {
|
|
155
|
+
if (transfer_poid)
|
|
156
|
+
return transfer_poid;
|
|
157
|
+
transfer_poid = Hexa32.toString32(SecurityMaster.PCODE) + ','
|
|
158
|
+
+ Hexa32.toString32(SecurityMaster.OKIND) + ',' + Hexa32.toString32(SecurityMaster.OID);
|
|
159
|
+
return transfer_poid;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function transferMTID_CALLERTX(ctx) {
|
|
163
|
+
if (ctx.transfer_id)
|
|
164
|
+
return ctx.transfer_id;
|
|
165
|
+
var x = Hexa32.toString32(ctx.mtid) + ',' + (ctx.mdepth + 1) + ',' + Hexa32.toString32(ctx.txid);
|
|
166
|
+
ctx.transfer_id = x;
|
|
167
|
+
return ctx.transfer_id;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function transferSPEC_URL(ctx) {
|
|
171
|
+
if (ctx.transfer_info)
|
|
172
|
+
return ctx.transfer_info;
|
|
173
|
+
var x = conf.mtrace_spec + ',' + ctx.service_hash;
|
|
174
|
+
ctx.transfer_info = x;
|
|
175
|
+
return ctx.transfer_info;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
var check_seq = 1;
|
|
179
|
+
function interTxTraceAutoOn(ctx) {
|
|
180
|
+
if (conf.mtrace_enabled == false || ctx.httpc_checked || ctx.mtid.isZero() === false)
|
|
181
|
+
return;
|
|
182
|
+
ctx.httpc_checked = true;
|
|
183
|
+
if (conf.mtrace_rate >= 100) {
|
|
184
|
+
ctx.mtid = KeyGen.next();
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
check_seq++;
|
|
188
|
+
switch (Math.floor(conf.mtrace_rate / 10)) {
|
|
189
|
+
case 10:
|
|
190
|
+
ctx.mtid = KeyGen.next();
|
|
191
|
+
break;
|
|
192
|
+
case 9:
|
|
193
|
+
if (check_seq % 10 !== 0)
|
|
194
|
+
ctx.mtid = KeyGen.next();
|
|
195
|
+
break;
|
|
196
|
+
case 8:
|
|
197
|
+
if (check_seq % 5 !== 0)
|
|
198
|
+
ctx.mtid = KeyGen.next();
|
|
199
|
+
break;
|
|
200
|
+
case 7:
|
|
201
|
+
if (check_seq % 4 !== 0)
|
|
202
|
+
ctx.mtid = KeyGen.next();
|
|
203
|
+
break;
|
|
204
|
+
case 6:
|
|
205
|
+
if (check_seq % 3 !== 0)
|
|
206
|
+
ctx.mtid = KeyGen.next();
|
|
207
|
+
break;
|
|
208
|
+
case 5:
|
|
209
|
+
if (check_seq % 2 === 0)
|
|
210
|
+
ctx.mtid = KeyGen.next();
|
|
211
|
+
break;
|
|
212
|
+
case 4:
|
|
213
|
+
if (check_seq % 3 === 0 || check_seq % 5 === 0)
|
|
214
|
+
ctx.mtid = KeyGen.next();
|
|
215
|
+
break;
|
|
216
|
+
case 3:
|
|
217
|
+
if (check_seq % 4 === 0 || check_seq % 5 === 0)
|
|
218
|
+
ctx.mtid = KeyGen.next();
|
|
219
|
+
break;
|
|
220
|
+
case 2:
|
|
221
|
+
if (check_seq % 5 === 0)
|
|
222
|
+
ctx.mtid = KeyGen.next();
|
|
223
|
+
break;
|
|
224
|
+
case 1:
|
|
225
|
+
if (check_seq % 10 === 0)
|
|
226
|
+
ctx.mtid = KeyGen.next();
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
31
231
|
exports.GlobalObserver = GlobalObserver;
|