2
0
mirror of https://github.com/frappe/books.git synced 2024-11-10 07:40:55 +00:00
books/src/telemetry/telemetry.ts

94 lines
2.4 KiB
TypeScript
Raw Normal View History

2022-03-10 10:31:55 +00:00
import config, { ConfigKeys, TelemetrySetting } from '@/config';
2022-03-09 11:20:48 +00:00
import frappe from 'frappe';
import { cloneDeep } from 'lodash';
import { getCounts, getDeviceId, getInstanceId, getLocale } from './helpers';
import { Noun, Telemetry, Verb } from './types';
class TelemetryManager {
#url: string = '';
#token: string = '';
#started = false;
#telemetryObject: Partial<Telemetry> = {};
start() {
this.#telemetryObject.locale = getLocale();
this.#telemetryObject.deviceId ||= getDeviceId();
this.#telemetryObject.instanceId ||= getInstanceId();
this.#telemetryObject.openTime ||= new Date().valueOf();
this.#telemetryObject.timeline ??= [];
2022-03-09 11:20:48 +00:00
this.#telemetryObject.errors ??= {};
this.#started = true;
}
getCanLog(): boolean {
const telemetrySetting = config.get(ConfigKeys.Telemetry) as string;
2022-03-10 10:31:55 +00:00
return telemetrySetting === TelemetrySetting.allow;
}
setCreds(url: string, token: string) {
this.#url ||= url;
this.#token ||= token;
}
log(verb: Verb, noun: Noun, more?: Record<string, unknown>) {
if (!this.#started) {
this.start();
}
if (!this.getCanLog()) {
return;
}
const time = new Date().valueOf();
if (this.#telemetryObject.timeline === undefined) {
this.#telemetryObject.timeline = [];
}
this.#telemetryObject.timeline.push({ time, verb, noun, more });
}
2022-03-09 11:20:48 +00:00
error(name: string) {
if (this.#telemetryObject.errors === undefined) {
this.#telemetryObject.errors = {};
}
this.#telemetryObject.errors[name] ??= 0;
this.#telemetryObject.errors[name] += 1;
}
async setCount() {
this.#telemetryObject.counts = this.getCanLog() ? await getCounts() : {};
}
stop() {
// Will set ids if not set.
this.start();
2022-03-09 11:20:48 +00:00
//@ts-ignore
this.#telemetryObject.version = frappe.store.appVersion ?? '';
this.#telemetryObject.closeTime = new Date().valueOf();
const telemetryObject = this.#telemetryObject;
this.#started = false;
this.#telemetryObject = {};
2022-03-10 10:31:55 +00:00
if (config.get(ConfigKeys.Telemetry) === TelemetrySetting.dontLogAnything) {
return '';
}
const data = JSON.stringify({
token: this.#token,
telemetryData: telemetryObject,
});
return { url: this.#url, data };
}
get telemetryObject(): Readonly<Partial<Telemetry>> {
return cloneDeep(this.#telemetryObject);
}
}
export default new TelemetryManager();