98 lines
3.8 KiB
JavaScript
98 lines
3.8 KiB
JavaScript
|
"use strict";
|
||
|
var Logging = require("./Logging");
|
||
|
var Channel = (function () {
|
||
|
function Channel(isDisabled, getBatchSize, getBatchIntervalMs, sender) {
|
||
|
this._buffer = [];
|
||
|
this._lastSend = 0;
|
||
|
this._isDisabled = isDisabled;
|
||
|
this._getBatchSize = getBatchSize;
|
||
|
this._getBatchIntervalMs = getBatchIntervalMs;
|
||
|
this._sender = sender;
|
||
|
}
|
||
|
/**
|
||
|
* Enable or disable disk-backed retry caching to cache events when client is offline (enabled by default)
|
||
|
* These cached events are stored in your system or user's temporary directory and access restricted to your user when possible.
|
||
|
* @param value if true events that occurred while client is offline will be cached on disk
|
||
|
* @param resendInterval The wait interval for resending cached events.
|
||
|
* @param maxBytesOnDisk The maximum size (in bytes) that the created temporary directory for cache events can grow to, before caching is disabled.
|
||
|
* @returns {Configuration} this class
|
||
|
*/
|
||
|
Channel.prototype.setUseDiskRetryCaching = function (value, resendInterval, maxBytesOnDisk) {
|
||
|
this._sender.setDiskRetryMode(value, resendInterval, maxBytesOnDisk);
|
||
|
};
|
||
|
/**
|
||
|
* Add a telemetry item to the send buffer
|
||
|
*/
|
||
|
Channel.prototype.send = function (envelope) {
|
||
|
var _this = this;
|
||
|
// if master off switch is set, don't send any data
|
||
|
if (this._isDisabled()) {
|
||
|
// Do not send/save data
|
||
|
return;
|
||
|
}
|
||
|
// validate input
|
||
|
if (!envelope) {
|
||
|
Logging.warn("Cannot send null/undefined telemetry");
|
||
|
return;
|
||
|
}
|
||
|
// check if the incoming payload is too large, truncate if necessary
|
||
|
var payload = this._stringify(envelope);
|
||
|
if (typeof payload !== "string") {
|
||
|
return;
|
||
|
}
|
||
|
// enqueue the payload
|
||
|
this._buffer.push(payload);
|
||
|
// flush if we would exceed the max-size limit by adding this item
|
||
|
if (this._buffer.length >= this._getBatchSize()) {
|
||
|
this.triggerSend(false);
|
||
|
return;
|
||
|
}
|
||
|
// ensure an invocation timeout is set if anything is in the buffer
|
||
|
if (!this._timeoutHandle && this._buffer.length > 0) {
|
||
|
this._timeoutHandle = setTimeout(function () {
|
||
|
_this._timeoutHandle = null;
|
||
|
_this.triggerSend(false);
|
||
|
}, this._getBatchIntervalMs());
|
||
|
}
|
||
|
};
|
||
|
/**
|
||
|
* Immediately send buffered data
|
||
|
*/
|
||
|
Channel.prototype.triggerSend = function (isNodeCrashing, callback) {
|
||
|
var bufferIsEmpty = this._buffer.length < 1;
|
||
|
if (!bufferIsEmpty) {
|
||
|
// compose an array of payloads
|
||
|
var batch = this._buffer.join("\n");
|
||
|
// invoke send
|
||
|
if (isNodeCrashing) {
|
||
|
this._sender.saveOnCrash(batch);
|
||
|
if (typeof callback === "function") {
|
||
|
callback("data saved on crash");
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
this._sender.send(Buffer.from ? Buffer.from(batch) : new Buffer(batch), callback);
|
||
|
}
|
||
|
}
|
||
|
// update lastSend time to enable throttling
|
||
|
this._lastSend = +new Date;
|
||
|
// clear buffer
|
||
|
this._buffer.length = 0;
|
||
|
clearTimeout(this._timeoutHandle);
|
||
|
this._timeoutHandle = null;
|
||
|
if (bufferIsEmpty && typeof callback === "function") {
|
||
|
callback("no data to send");
|
||
|
}
|
||
|
};
|
||
|
Channel.prototype._stringify = function (envelope) {
|
||
|
try {
|
||
|
return JSON.stringify(envelope);
|
||
|
}
|
||
|
catch (error) {
|
||
|
Logging.warn("Failed to serialize payload", error, envelope);
|
||
|
}
|
||
|
};
|
||
|
return Channel;
|
||
|
}());
|
||
|
module.exports = Channel;
|
||
|
//# sourceMappingURL=Channel.js.map
|