1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const Debug = require("debug");
|
4 | const lodash = require("lodash");
|
5 | const helper_1 = require("./helper");
|
6 | const uuid_1 = require("./utils/uuid");
|
7 | const debug = Debug('ionic:lib:telemetry');
|
8 | const GA_CODE = 'UA-44023830-30';
|
9 | let _gaTracker;
|
10 | class Telemetry {
|
11 | constructor({ config, client, getInfo, ctx, project, session }) {
|
12 | this.client = client;
|
13 | this.config = config;
|
14 | this.getInfo = getInfo;
|
15 | this.ctx = ctx;
|
16 | this.project = project;
|
17 | this.session = session;
|
18 | }
|
19 | async sendCommand(command, args) {
|
20 | debug('Sending telemetry for command: %O %O', command, args);
|
21 | await helper_1.sendMessage({ config: this.config, ctx: this.ctx }, { type: 'telemetry', data: { command, args } });
|
22 | }
|
23 | }
|
24 | exports.Telemetry = Telemetry;
|
25 | async function getLeek({ config, version }) {
|
26 | if (!_gaTracker) {
|
27 | const Leek = await Promise.resolve().then(() => require('leek'));
|
28 | let telemetryToken = config.get('tokens.telemetry');
|
29 | if (!telemetryToken) {
|
30 | telemetryToken = uuid_1.generateUUID();
|
31 | config.set('tokens.telemetry', telemetryToken);
|
32 | debug(`setting telemetry token to ${telemetryToken}`);
|
33 | }
|
34 | _gaTracker = new Leek({
|
35 | name: telemetryToken,
|
36 | trackingCode: GA_CODE,
|
37 | globalName: 'ionic',
|
38 | version,
|
39 | silent: !config.get('telemetry'),
|
40 | });
|
41 | }
|
42 | return _gaTracker;
|
43 | }
|
44 | async function sendCommand({ config, client, getInfo, ctx, session, project }, command, args) {
|
45 | const messageList = [];
|
46 | const name = 'command execution';
|
47 | const prettyArgs = args.map(a => a.includes(' ') ? `"${a}"` : a);
|
48 | const message = messageList.concat([command], prettyArgs).join(' ');
|
49 | await Promise.all([
|
50 | (async () => {
|
51 | const leek = await getLeek({ config, version: ctx.version });
|
52 | try {
|
53 | await leek.track({ name, message });
|
54 | }
|
55 | catch (e) {
|
56 | debug(`leek track error: ${e.stack ? e.stack : e}`);
|
57 | }
|
58 | })(),
|
59 | (async () => {
|
60 | const now = new Date().toISOString();
|
61 | const appflowId = project ? project.config.get('id') : undefined;
|
62 | const info = await getInfo();
|
63 | const results = info.map(r => r.key ? { [r.key]: r.value } : undefined).filter(r => !!r);
|
64 | const { req } = await client.make('POST', '/events/metrics');
|
65 | const metric = {
|
66 | 'name': 'cli_command_metrics',
|
67 | 'timestamp': now,
|
68 | 'session_id': config.get('tokens.telemetry'),
|
69 | 'source': 'cli',
|
70 | 'value': {
|
71 | 'command': command,
|
72 | 'arguments': prettyArgs.join(' '),
|
73 | 'app_id': appflowId,
|
74 | 'backend': 'pro',
|
75 | ...lodash.extend({}, ...results),
|
76 | },
|
77 | };
|
78 | const isLoggedIn = session.isLoggedIn();
|
79 | if (isLoggedIn) {
|
80 | const token = session.getUserToken();
|
81 | req.set('Authorization', `Bearer ${token}`);
|
82 | }
|
83 | debug('metric: %o', metric);
|
84 | req.send({
|
85 | 'metrics': [metric],
|
86 | 'sent_at': now,
|
87 | });
|
88 | try {
|
89 | await client.do(req);
|
90 | }
|
91 | catch (e) {
|
92 | debug(`metric send error: ${e.stack ? e.stack : e}`);
|
93 | }
|
94 | })(),
|
95 | ]);
|
96 | }
|
97 | exports.sendCommand = sendCommand;
|