"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NetworkTrafficConfig = void 0;
const netModule = require("net");
const metrics_1 = require("../services/metrics");
const Debug = require("debug");
const meter_1 = require("../utils/metrics/meter");
const shimmer = require("shimmer");
const serviceManager_1 = require("../serviceManager");
class NetworkTrafficConfig {
}
exports.NetworkTrafficConfig = NetworkTrafficConfig;
const defaultConfig = {
upload: false,
download: false
};
const allEnabled = {
upload: true,
download: true
};
class NetworkMetric {
constructor() {
this.logger = Debug('axm:features:metrics:network');
}
init(config) {
if (config === false)
return;
if (config === true) {
config = allEnabled;
}
if (config === undefined) {
config = defaultConfig;
}
this.metricService = serviceManager_1.ServiceManager.get('metrics');
if (this.metricService === undefined) {
return this.logger(`Failed to load metric service`);
}
if (config.download === true) {
this.catchDownload();
}
if (config.upload === true) {
this.catchUpload();
}
this.logger('init');
}
destroy() {
if (this.timer !== undefined) {
clearTimeout(this.timer);
}
if (this.socketProto !== undefined && this.socketProto !== null) {
shimmer.unwrap(this.socketProto, 'read');
shimmer.unwrap(this.socketProto, 'write');
}
this.logger('destroy');
}
catchDownload() {
if (this.metricService === undefined)
return this.logger(`Failed to load metric service`);
const downloadMeter = new meter_1.default({});
this.metricService.registerMetric({
name: 'Network In',
id: 'internal/network/in',
historic: true,
type: metrics_1.MetricType.meter,
implementation: downloadMeter,
unit: 'kb/s',
handler: function () {
return Math.floor(this.implementation.val() / 1024 * 1000) / 1000;
}
});
setTimeout(() => {
const property = netModule.Socket.prototype.read;
const isWrapped = property && property.__wrapped === true;
if (isWrapped) {
return this.logger(`Already patched socket read, canceling`);
}
shimmer.wrap(netModule.Socket.prototype, 'read', function (original) {
return function () {
this.on('data', (data) => {
if (typeof data.length === 'number') {
downloadMeter.mark(data.length);
}
});
return original.apply(this, arguments);
};
});
}, 500);
}
catchUpload() {
if (this.metricService === undefined)
return this.logger(`Failed to load metric service`);
const uploadMeter = new meter_1.default();
this.metricService.registerMetric({
name: 'Network Out',
id: 'internal/network/out',
type: metrics_1.MetricType.meter,
historic: true,
implementation: uploadMeter,
unit: 'kb/s',
handler: function () {
return Math.floor(this.implementation.val() / 1024 * 1000) / 1000;
}
});
setTimeout(() => {
const property = netModule.Socket.prototype.write;
const isWrapped = property && property.__wrapped === true;
if (isWrapped) {
return this.logger(`Already patched socket write, canceling`);
}
shimmer.wrap(netModule.Socket.prototype, 'write', function (original) {
return function (data) {
if (typeof data.length === 'number') {
uploadMeter.mark(data.length);
}
return original.apply(this, arguments);
};
});
}, 500);
}
}
exports.default = NetworkMetric;
|