Desktop Analytics

pull/512/head
Ryan Tharp 6 years ago
parent 3152637cdc
commit 88b44390bf

@ -230,6 +230,8 @@
window.feeds = []; window.feeds = [];
window.lokiMessageAPI = new window.LokiMessageAPI(ourKey); window.lokiMessageAPI = new window.LokiMessageAPI(ourKey);
window.lokiPublicChatAPI = new window.LokiPublicChatAPI(ourKey); window.lokiPublicChatAPI = new window.LokiPublicChatAPI(ourKey);
window.mixpanel = new window.LokiMixpanelAPI();
// window.mixpanel.track("Desktop boot");
window.lokiP2pAPI = new window.LokiP2pAPI(ourKey); window.lokiP2pAPI = new window.LokiP2pAPI(ourKey);
window.lokiP2pAPI.on('pingContact', pubKey => { window.lokiP2pAPI.on('pingContact', pubKey => {
const isPing = true; const isPing = true;

@ -4,6 +4,9 @@
const _ = require('lodash'); const _ = require('lodash');
const { rpc } = require('./loki_rpc'); const { rpc } = require('./loki_rpc');
const LokiMixpanelAPI = require('./loki_mixpanel.js');
const Mixpanel = new LokiMixpanelAPI();
const DEFAULT_CONNECTIONS = 3; const DEFAULT_CONNECTIONS = 3;
const MAX_ACCEPTABLE_FAILURES = 1; const MAX_ACCEPTABLE_FAILURES = 1;
@ -178,6 +181,7 @@ class LokiMessageAPI {
try { try {
// eslint-disable-next-line more/no-then // eslint-disable-next-line more/no-then
success = await firstTrue(promises); success = await firstTrue(promises);
Mixpanel.track('Sent Message Using Swarm API');
} catch (e) { } catch (e) {
if (e instanceof textsecure.WrongDifficultyError) { if (e instanceof textsecure.WrongDifficultyError) {
// Force nonce recalculation // Force nonce recalculation
@ -191,6 +195,7 @@ class LokiMessageAPI {
throw e; throw e;
} }
if (!success) { if (!success) {
Mixpanel.track('Failed to Send Message Using Swarm API');
throw new window.textsecure.EmptySwarmError( throw new window.textsecure.EmptySwarmError(
pubKey, pubKey,
'Ran out of swarm nodes to query' 'Ran out of swarm nodes to query'
@ -255,6 +260,7 @@ class LokiMessageAPI {
} catch (e) { } catch (e) {
log.warn('Loki send message:', e); log.warn('Loki send message:', e);
if (e instanceof textsecure.WrongSwarmError) { if (e instanceof textsecure.WrongSwarmError) {
Mixpanel.track('Migrated Snode');
const { newSwarm } = e; const { newSwarm } = e;
await lokiSnodeAPI.updateSwarmNodes(params.pubKey, newSwarm); await lokiSnodeAPI.updateSwarmNodes(params.pubKey, newSwarm);
this.sendingData[params.timestamp].swarm = newSwarm; this.sendingData[params.timestamp].swarm = newSwarm;

@ -0,0 +1,17 @@
/* eslint-disable class-methods-use-this */
const EventEmitter = require('events');
const Mixpanel = require('mixpanel');
// require('setimmediate');
class LokiMixpanelAPI extends EventEmitter {
constructor() {
super();
this.mixpanel = Mixpanel.init('736cd9a854a157591153efacd1164e9a');
}
track(label) {
this.mixpanel.track(label);
}
}
module.exports = LokiMixpanelAPI;

@ -3,6 +3,9 @@ clearTimeout, MessageController */
const EventEmitter = require('events'); const EventEmitter = require('events');
const nodeFetch = require('node-fetch'); const nodeFetch = require('node-fetch');
const { URL, URLSearchParams } = require('url'); const { URL, URLSearchParams } = require('url');
const LokiMixpanelAPI = require('./loki_mixpanel.js');
const Mixpanel = new LokiMixpanelAPI();
// Can't be less than 1200 if we have unauth'd requests // Can't be less than 1200 if we have unauth'd requests
const PUBLICCHAT_MSG_POLL_EVERY = 1.5 * 1000; // 1.5s const PUBLICCHAT_MSG_POLL_EVERY = 1.5 * 1000; // 1.5s
@ -663,8 +666,12 @@ class LokiPublicChannelAPI {
objBody: payload, objBody: payload,
}); });
if (!res.err && res.response) { if (!res.err && res.response) {
Mixpanel.track('Public Message Sent');
return res.response.data.id; return res.response.data.id;
} }
// there's no retry on desktop
// this is supposed to be after retries
Mixpanel.track('Failed to Send Public Message');
return false; return false;
} }
} }

@ -6,6 +6,9 @@ const dns = require('dns');
const process = require('process'); const process = require('process');
const { rpc } = require('./loki_rpc'); const { rpc } = require('./loki_rpc');
const natUpnp = require('nat-upnp'); const natUpnp = require('nat-upnp');
const LokiMixpanelAPI = require('./loki_mixpanel.js');
const Mixpanel = new LokiMixpanelAPI();
const resolve4 = url => const resolve4 = url =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
@ -118,6 +121,7 @@ class LokiSnodeAPI {
port: snode.storage_port, port: snode.storage_port,
})); }));
} catch (e) { } catch (e) {
Mixpanel.track('Seed Node Failed');
if (seedNodes.length === 0) { if (seedNodes.length === 0) {
throw new window.textsecure.SeedNodeError( throw new window.textsecure.SeedNodeError(
'Failed to contact seed node' 'Failed to contact seed node'
@ -133,6 +137,7 @@ class LokiSnodeAPI {
const filteredNodes = swarmNodes.filter( const filteredNodes = swarmNodes.filter(
node => node.address !== nodeUrl && node.ip !== nodeUrl node => node.address !== nodeUrl && node.ip !== nodeUrl
); );
Mixpanel.track('Unreachable Snode');
await conversation.updateSwarmNodes(filteredNodes); await conversation.updateSwarmNodes(filteredNodes);
} }

@ -302,6 +302,15 @@
} }
if (conversation) { if (conversation) {
if (conversation.isRss()) {
window.mixpanel.track('RSS Feed Opened');
}
if (conversation.isPublic()) {
window.mixpanel.track('Loki Public Chat Opened');
}
if (conversation.isPrivate()) {
window.mixpanel.track('Conversation Opened');
}
conversation.updateProfileName(); conversation.updateProfileName();
} }

@ -27,6 +27,8 @@
function AccountManager(username, password) { function AccountManager(username, password) {
// this.server = window.WebAPI.connect({ username, password }); // this.server = window.WebAPI.connect({ username, password });
this.pending = Promise.resolve(); this.pending = Promise.resolve();
// set up mixpanel
window.mixpanel = new window.LokiMixpanelAPI();
} }
function getNumber(numberId) { function getNumber(numberId) {
@ -136,8 +138,10 @@
).toArrayBuffer(); ).toArrayBuffer();
return libsignal.Curve.async.createKeyPair(privKey); return libsignal.Curve.async.createKeyPair(privKey);
}; };
window.mixpanel.track('Seed Restored');
} else { } else {
generateKeypair = libsignal.KeyHelper.generateIdentityKeyPair; generateKeypair = libsignal.KeyHelper.generateIdentityKeyPair;
window.mixpanel.track('Seed Created');
} }
return this.queueTask(() => return this.queueTask(() =>
generateKeypair().then(async identityKeyPair => generateKeypair().then(async identityKeyPair =>

@ -85,6 +85,7 @@
"libsodium-wrappers": "^0.7.4", "libsodium-wrappers": "^0.7.4",
"linkify-it": "2.0.3", "linkify-it": "2.0.3",
"lodash": "4.17.11", "lodash": "4.17.11",
"mixpanel": "^0.10.2",
"mkdirp": "0.5.1", "mkdirp": "0.5.1",
"moment": "2.21.0", "moment": "2.21.0",
"mustache": "2.3.0", "mustache": "2.3.0",

@ -328,6 +328,8 @@ window.LokiPublicChatAPI = require('./js/modules/loki_public_chat_api');
window.LokiRssAPI = require('./js/modules/loki_rss_api'); window.LokiRssAPI = require('./js/modules/loki_rss_api');
window.LokiMixpanelAPI = require('./js/modules/loki_mixpanel.js');
window.LocalLokiServer = require('./libloki/modules/local_loki_server'); window.LocalLokiServer = require('./libloki/modules/local_loki_server');
window.localServerPort = config.localServerPort; window.localServerPort = config.localServerPort;

@ -11,6 +11,8 @@ import { StartNewConversation } from './StartNewConversation';
import { LocalizerType } from '../types/Util'; import { LocalizerType } from '../types/Util';
declare var mixpanel: any;
export type PropsData = { export type PropsData = {
contacts: Array<ConversationListItemPropsType>; contacts: Array<ConversationListItemPropsType>;
friends: Array<ConversationListItemPropsType>; friends: Array<ConversationListItemPropsType>;
@ -36,7 +38,7 @@ type Props = PropsData & PropsHousekeeping;
export class SearchResults extends React.Component<Props> { export class SearchResults extends React.Component<Props> {
public handleStartNewConversation = () => { public handleStartNewConversation = () => {
const { regionCode, searchTerm, startNewConversation } = this.props; const { regionCode, searchTerm, startNewConversation } = this.props;
mixpanel.track('New Conversation Started');
startNewConversation(searchTerm, { regionCode }); startNewConversation(searchTerm, { regionCode });
}; };

@ -4466,7 +4466,7 @@ https-browserify@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
https-proxy-agent@^2.2.1: https-proxy-agent@2.2.1, https-proxy-agent@^2.2.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
@ -6022,6 +6022,13 @@ mixin-deep@^1.2.0:
for-in "^1.0.2" for-in "^1.0.2"
is-extendable "^1.0.1" is-extendable "^1.0.1"
mixpanel@^0.10.2:
version "0.10.2"
resolved "https://registry.yarnpkg.com/mixpanel/-/mixpanel-0.10.2.tgz#10ff6cd76034b262d469094ad3d8c99039345376"
integrity sha512-+zbBQGd/Q5LLRooqJ2iyEDzKz2/ly4TipH5tE9te0BDMJpROxUMGffPulyHbh4FtMcbJuPmIUSIfy//JhhnlnA==
dependencies:
https-proxy-agent "2.2.1"
mkdirp@0.5.0: mkdirp@0.5.0:
version "0.5.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"

Loading…
Cancel
Save