beaver-logger
Version:
Client side logger.
247 lines (244 loc) • 7.59 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { ZalgoPromise } from 'zalgo-promise/src';
import { isBrowser, promiseDebounce, noop, safeInterval, objFilter } from 'belter/src';
import { DEFAULT_LOG_LEVEL, LOG_LEVEL_PRIORITY, AUTO_FLUSH_LEVEL, FLUSH_INTERVAL, AMPLITUDE_URL } from './config';
import { LOG_LEVEL, PROTOCOL } from './constants';
import { extendIfDefined } from './util';
import { getHTTPTransport } from './http';
// eslint-disable-line no-use-before-define
// eslint-disable-line no-use-before-define
// eslint-disable-line no-use-before-define
export function Logger(_ref) {
var url = _ref.url,
prefix = _ref.prefix,
_ref$logLevel = _ref.logLevel,
logLevel = _ref$logLevel === void 0 ? DEFAULT_LOG_LEVEL : _ref$logLevel,
_ref$transport = _ref.transport,
transport = _ref$transport === void 0 ? getHTTPTransport() : _ref$transport,
amplitudeApiKey = _ref.amplitudeApiKey,
_ref$flushInterval = _ref.flushInterval,
flushInterval = _ref$flushInterval === void 0 ? FLUSH_INTERVAL : _ref$flushInterval,
_ref$enableSendBeacon = _ref.enableSendBeacon,
enableSendBeacon = _ref$enableSendBeacon === void 0 ? false : _ref$enableSendBeacon;
var events = [];
var tracking = [];
var payloadBuilders = [];
var metaBuilders = [];
var trackingBuilders = [];
var headerBuilders = [];
function print(level, event, payload) {
if (!isBrowser() || !window.console || !window.console.log) {
return;
}
if (LOG_LEVEL_PRIORITY.indexOf(level) > LOG_LEVEL_PRIORITY.indexOf(logLevel)) {
return;
}
var args = [event];
args.push(payload);
if (payload.error || payload.warning) {
args.push('\n\n', payload.error || payload.warning);
}
try {
if (window.console[level] && window.console[level].apply) {
window.console[level].apply(window.console, args);
} else if (window.console.log && window.console.log.apply) {
window.console.log.apply(window.console, args);
}
} catch (err) {
// pass
}
}
function immediateFlush() {
return ZalgoPromise.try(function () {
if (!isBrowser() || window.location.protocol === PROTOCOL.FILE) {
return;
}
if (!events.length && !tracking.length) {
return;
}
var meta = {};
for (var _i2 = 0; _i2 < metaBuilders.length; _i2++) {
var builder = metaBuilders[_i2];
extendIfDefined(meta, builder(meta));
}
var headers = {};
for (var _i4 = 0; _i4 < headerBuilders.length; _i4++) {
var _builder = headerBuilders[_i4];
extendIfDefined(headers, _builder(headers));
}
var res;
if (url) {
res = transport({
method: 'POST',
url: url,
headers: headers,
json: {
events: events,
meta: meta,
tracking: tracking
},
enableSendBeacon: enableSendBeacon
}).catch(noop);
}
if (amplitudeApiKey) {
transport({
method: 'POST',
url: AMPLITUDE_URL,
headers: {},
json: {
api_key: amplitudeApiKey,
events: tracking.map(function (payload) {
// $FlowFixMe
return _extends({
event_type: payload.transition_name || 'event',
event_properties: payload
}, payload);
})
},
enableSendBeacon: enableSendBeacon
}).catch(noop);
}
events = [];
tracking = [];
return ZalgoPromise.resolve(res).then(noop);
});
}
var flush = promiseDebounce(immediateFlush);
function enqueue(level, event, payload) {
events.push({
level: level,
event: event,
payload: payload
});
if (AUTO_FLUSH_LEVEL.indexOf(level) !== -1) {
flush();
}
}
function log(level, event, payload) {
if (payload === void 0) {
payload = {};
}
if (!isBrowser()) {
return logger; // eslint-disable-line no-use-before-define
}
if (prefix) {
event = prefix + "_" + event;
}
var logPayload = _extends({}, objFilter(payload, function (value) {
return value !== null && value !== undefined;
}), {
timestamp: Date.now().toString()
});
for (var _i6 = 0; _i6 < payloadBuilders.length; _i6++) {
var builder = payloadBuilders[_i6];
extendIfDefined(logPayload, builder(logPayload));
}
enqueue(level, event, logPayload);
print(level, event, logPayload);
return logger; // eslint-disable-line no-use-before-define
}
function addBuilder(builders, builder) {
builders.push(builder);
return logger; // eslint-disable-line no-use-before-define
}
function addPayloadBuilder(builder) {
return addBuilder(payloadBuilders, builder);
}
function addMetaBuilder(builder) {
return addBuilder(metaBuilders, builder);
}
function addTrackingBuilder(builder) {
return addBuilder(trackingBuilders, builder);
}
function addHeaderBuilder(builder) {
return addBuilder(headerBuilders, builder);
}
function debug(event, payload) {
return log(LOG_LEVEL.DEBUG, event, payload);
}
function info(event, payload) {
return log(LOG_LEVEL.INFO, event, payload);
}
function warn(event, payload) {
return log(LOG_LEVEL.WARN, event, payload);
}
function error(event, payload) {
return log(LOG_LEVEL.ERROR, event, payload);
}
function track(payload) {
if (payload === void 0) {
payload = {};
}
if (!isBrowser()) {
return logger; // eslint-disable-line no-use-before-define
}
var trackingPayload = objFilter(payload, function (value) {
return value !== null && value !== undefined;
});
for (var _i8 = 0; _i8 < trackingBuilders.length; _i8++) {
var builder = trackingBuilders[_i8];
extendIfDefined(trackingPayload, builder(trackingPayload));
}
print(LOG_LEVEL.DEBUG, 'track', trackingPayload);
tracking.push(trackingPayload);
return logger; // eslint-disable-line no-use-before-define
}
function setTransport(newTransport) {
transport = newTransport;
return logger; // eslint-disable-line no-use-before-define
}
function configure(opts) {
if (opts.url) {
url = opts.url;
}
if (opts.prefix) {
prefix = opts.prefix;
}
if (opts.logLevel) {
logLevel = opts.logLevel;
}
if (opts.transport) {
transport = opts.transport;
}
if (opts.amplitudeApiKey) {
amplitudeApiKey = opts.amplitudeApiKey;
}
if (opts.flushInterval) {
flushInterval = opts.flushInterval;
}
if (opts.enableSendBeacon) {
enableSendBeacon = opts.enableSendBeacon;
}
return logger; // eslint-disable-line no-use-before-define
}
if (isBrowser()) {
safeInterval(flush, flushInterval);
}
if (typeof window === 'object') {
window.addEventListener('beforeunload', function () {
immediateFlush();
});
window.addEventListener('unload', function () {
immediateFlush();
});
window.addEventListener('pagehide', function () {
immediateFlush();
});
}
var logger = {
debug: debug,
info: info,
warn: warn,
error: error,
track: track,
flush: flush,
immediateFlush: immediateFlush,
addPayloadBuilder: addPayloadBuilder,
addMetaBuilder: addMetaBuilder,
addTrackingBuilder: addTrackingBuilder,
addHeaderBuilder: addHeaderBuilder,
setTransport: setTransport,
configure: configure
};
return logger;
}