483 lines
15 KiB
JavaScript
483 lines
15 KiB
JavaScript
/**
|
|
* Common utility functions.
|
|
*/
|
|
(function(context,$) {
|
|
|
|
"use strict";
|
|
|
|
context.JK = context.JK || {};
|
|
var rest = context.JK.Rest();
|
|
var logger = context.JK.logger;
|
|
|
|
// types
|
|
var registrationTypes = {
|
|
native : "Native",
|
|
facebook : "Facebook"
|
|
};
|
|
|
|
var sessionCreationTypes = {
|
|
create : "Create",
|
|
join : "Join"
|
|
};
|
|
|
|
var sessionQualityTypes = {
|
|
good : "Good",
|
|
poor : "Poor"
|
|
};
|
|
|
|
var invitationTypes = {
|
|
email : "Email",
|
|
facebook : "Facebook",
|
|
google : "Google"
|
|
};
|
|
|
|
var friendConnectTypes = {
|
|
request : "Request",
|
|
accept : "Accept"
|
|
};
|
|
|
|
var recordingActions = {
|
|
make : "Make",
|
|
share : "Share"
|
|
};
|
|
|
|
var recordingShareTypes = {
|
|
facebook : "Facebook",
|
|
syndicationWidget : "SyndWidget",
|
|
syndicationUrl: "SyndURL"
|
|
};
|
|
|
|
var recordingPlayActions = {
|
|
website : "Website",
|
|
client : "Client",
|
|
facebook : "Facebook",
|
|
syndicationWidget : "SyndWidget",
|
|
syndicationUrl: "SyndURL"
|
|
};
|
|
|
|
var sessionPlayActions = {
|
|
website : "Website",
|
|
client : "Client",
|
|
facebook : "Facebook",
|
|
syndicationWidget : "SyndWidget",
|
|
syndicationUrl: "SyndURL"
|
|
};
|
|
|
|
var userLabels = {
|
|
registeredUser : "RegisteredUser",
|
|
visitor: "Visitor"
|
|
};
|
|
|
|
var bandActions = {
|
|
create : "Create",
|
|
join : "Join",
|
|
session : "Session",
|
|
recording : "Recording"
|
|
};
|
|
|
|
var jkSocialTargets = {
|
|
musician : 'Musician',
|
|
band : 'Band',
|
|
fan : 'Fan',
|
|
recording : 'Recording',
|
|
session : 'Session',
|
|
facebook: 'facebook',
|
|
twitter: 'twitter',
|
|
google: 'google',
|
|
};
|
|
|
|
var audioTestFailReasons = {
|
|
latency : 'Latency',
|
|
ioVariance : 'ioVariance',
|
|
ioTarget : 'ioTarget'
|
|
}
|
|
|
|
var audioTestDataReasons = {
|
|
pass : 'Pass',
|
|
latencyFail : 'LatencyFail',
|
|
ioVarianceFail : 'ioVarianceFail',
|
|
ioTargetFail : 'ioTargetFail'
|
|
}
|
|
|
|
var networkTestFailReasons = {
|
|
stun : 'STUN',
|
|
bandwidth : 'Bandwidth',
|
|
packetRate : 'PacketRate',
|
|
jitter : 'Jitter',
|
|
jamerror : 'ServiceError',
|
|
noNetwork : 'NoNetwork'
|
|
}
|
|
|
|
var categories = {
|
|
register : "Register",
|
|
download : "DownloadClient",
|
|
audioTest : "AudioTest",
|
|
audioTestData : 'AudioTestData',
|
|
trackConfig : "AudioTrackConfig",
|
|
networkTest : "NetworkTest",
|
|
sessionCount : "SessionCount",
|
|
sessionMusicians : "SessionMusicians",
|
|
sessionQuality : "SessionQuality",
|
|
invite : "Invite",
|
|
findSession : "FindSession",
|
|
friendConnect : "Connect",
|
|
recording : "Recording",
|
|
recordingPlay : "RecordingPlay",
|
|
sessionPlay : "SessionPlay",
|
|
band : "Band",
|
|
jkLike : 'jkLike',
|
|
jkFollow : 'jkFollow',
|
|
jkFavorite : 'jkFavorite',
|
|
jkComment : 'jkComment'
|
|
};
|
|
|
|
// JamTrack categories and actions:
|
|
var jamTrackAvailabilityTypes = {
|
|
worldwide: 'JamTrackGlobal',
|
|
usa: 'JamTrackUSA'
|
|
}
|
|
var jamTrackActions = {
|
|
isPublic: 'PublicPerformance',
|
|
isPrivate: 'PrivateUse'
|
|
}
|
|
var jamTrackSessionLabels = {
|
|
nonSession: 'NonSession',
|
|
inSession: 'InSession'
|
|
}
|
|
|
|
function translatePlatformForGA(platform) {
|
|
assertOneOf(platform, context.JK.OS);
|
|
|
|
if(platform == context.JK.OS.WIN32) {
|
|
return "Windows";
|
|
}
|
|
if(platform == context.JK.OS.OSX) {
|
|
return "Mac";
|
|
}
|
|
if(platform == context.JK.OS.UNIX) {
|
|
return "Unix";
|
|
}
|
|
}
|
|
|
|
function assertBoolean(value) {
|
|
if(typeof value != 'boolean') {
|
|
throw "value is not a boolean: " + JSON.stringify(value);
|
|
}
|
|
}
|
|
|
|
function assertNumber(value) {
|
|
if(typeof value != 'number') {
|
|
throw "value is not a number: " + JSON.stringify(value);
|
|
}
|
|
}
|
|
|
|
function assertOneOf(enumValue, enums){
|
|
var found = false;
|
|
for (var key in enums) {
|
|
if (enumValue == enums[key]) {
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if(!found) {
|
|
throw "unable to find enum: " + enumValue + " in: " + JSON.stringify(enums);
|
|
}
|
|
}
|
|
|
|
function trackRegister(asMusician, registrationType) {
|
|
assertBoolean(asMusician);
|
|
assertOneOf(registrationType, registrationTypes);
|
|
|
|
var action = asMusician ? "Musician" : "Fan";
|
|
|
|
context.ga('send', 'event', categories.register, action, registrationType);
|
|
}
|
|
|
|
function trackDownload(platform) {
|
|
var normalizedPlatform = translatePlatformForGA(platform);
|
|
|
|
context.ga('send', 'event', categories.download, normalizedPlatform);
|
|
}
|
|
|
|
function trackFTUECompletion(state, platform) {
|
|
var normalizedPlatform = translatePlatformForGA(platform);
|
|
|
|
context.ga('send', 'event', categories.audioTest, state, normalizedPlatform);
|
|
}
|
|
|
|
function trackSessionCount(musicianAccess, fanAccess, invitationCount) {
|
|
assertBoolean(musicianAccess);
|
|
assertBoolean(fanAccess);
|
|
assertNumber(invitationCount);
|
|
|
|
var gaMusicianAccess = musicianAccess ? "MusicianPublic" : "MusicianPrivate";
|
|
var gaFanAccess = fanAccess ? "FanPublic" : "FanPrivate";
|
|
|
|
context.ga('send', 'event', categories.sessionCount, gaMusicianAccess, gaFanAccess, invitationCount);
|
|
}
|
|
|
|
function trackSessionMusicians(joinOrCreate) {
|
|
assertOneOf(joinOrCreate, sessionCreationTypes);
|
|
|
|
context.ga('send', 'event', categories.sessionMusicians, joinOrCreate);
|
|
}
|
|
|
|
function trackSessionQuality(goodOrPoor) {
|
|
assertOneOf(goodOrPoor, sessionQualityTypes);
|
|
context.ga('send', 'event', categories.sessionQuality, goodOrPoor);
|
|
}
|
|
|
|
function trackServiceInvitations(invitationType, numInvited) {
|
|
assertOneOf(invitationType, invitationTypes);
|
|
assertNumber(numInvited);
|
|
|
|
context.ga('send', 'event', categories.invite, invitationType, numInvited);
|
|
}
|
|
|
|
function trackFindSessions(numSessionsFound) {
|
|
assertNumber(numSessionsFound);
|
|
|
|
var sessionCountRollup = "n/a";
|
|
if(numSessionsFound === 0) {
|
|
sessionCountRollup = "0";
|
|
}
|
|
else if(numSessionsFound >= 1 && numSessionsFound <= 5) {
|
|
sessionCountRollup = "1-5";
|
|
}
|
|
else if(numSessionsFound >= 6 && numSessionsFound <= 10) {
|
|
sessionCountRollup = "6-10";
|
|
}
|
|
else {
|
|
sessionCountRollup = "10+";
|
|
}
|
|
|
|
context.ga('send', 'event', categories.findSession, sessionCountRollup, numSessionsFound);
|
|
}
|
|
|
|
function trackJamTrackPlaySession(sessionId, inSession) {
|
|
rest.getSession(sessionId).done(function(session) {
|
|
if (session && session.jam_track ) {
|
|
rest.getJamTracks({id:session.jam_track.id}).done(function(response) {
|
|
if (response.jamtracks && response.jamtracks.length!=0) {
|
|
var jamtrack = response.jamtracks[0]
|
|
trackJamTrackPlay(
|
|
jamtrack.sales_region!=context.JK.AVAILABILITY_US,
|
|
session.participants.length > 1,
|
|
inSession);
|
|
}// if
|
|
})// rest.getJamTracks
|
|
}// if
|
|
})// rest.getSession
|
|
}
|
|
|
|
function trackJamTrackPlay(isGlobal, isPublic, inSession) {
|
|
assertBoolean(isGlobal)
|
|
assertBoolean(isPublic)
|
|
assertBoolean(inSession)
|
|
context.ga(
|
|
'send',
|
|
'event',
|
|
(isGlobal) ? jamTrackAvailabilityTypes.worldwide : jamTrackAvailabilityTypes.usa,
|
|
(isPublic) ? jamTrackActions.isPublic : jamTrackActions.isPrivate,
|
|
(inSession) ? jamTrackSessionLabels.inSession : jamTrackSessionLabels.nonSession
|
|
)
|
|
logger.debug("Tracked Jam Track Play")
|
|
}
|
|
|
|
function trackTiming(timing) {
|
|
|
|
if(!timing) {return}
|
|
|
|
try {
|
|
var computed = {
|
|
dns: timing.domainLookupEnd - timing.domainLookupStart,
|
|
connect: timing.connectEnd - timing.connectStart,
|
|
ttfb: timing.responseStart - timing.connectEnd,
|
|
basePage: timing.responseEnd - timing.responseStart,
|
|
frontEnd: timing.loadEventStart - timing.responseEnd,
|
|
domContentLoadedEvent: timing.domContentLoadedEventEnd - timing.domContentLoadedEventStart,
|
|
windowLoadEvent: timing.loadEventEnd - timing.loadEventStart,
|
|
domInteractive: timing.domInteractive - timing.domLoading,
|
|
domComplete: timing.domComplete - timing.domLoading,
|
|
domCompleteToOnload: timing.loadEventStart - timing.domComplete
|
|
};
|
|
|
|
logger.debug("page load time: " + computed.frontEnd)
|
|
context._.each(computed, function (value, key) {
|
|
if (value > 0 && value < 60000) {
|
|
context.ga("send", "timing", "NavigationTiming", key, value, null, {'page' : '/' + window.location.pathname});
|
|
}
|
|
})
|
|
//context.stats.write('web.timing.navigation', computed)
|
|
}
|
|
catch(e) {
|
|
logger.error("loading times failed in ga.js", e)
|
|
}
|
|
}
|
|
|
|
// if you want to pass in no title, either omit it from the arg list when u invoke virtualPageView, or pass in undefined, NOT null
|
|
function virtualPageView(page, title) {
|
|
|
|
context.ga('send', 'pageview', {
|
|
'page': page,
|
|
'title': title
|
|
});
|
|
}
|
|
|
|
function trackFriendConnect(friendConnectType) {
|
|
assertOneOf(friendConnectType, friendConnectTypes);
|
|
|
|
context.ga('send', 'event', categories.friendConnect, friendConnectType);
|
|
}
|
|
|
|
// when someone keeps a recording
|
|
function trackMakeRecording() {
|
|
context.ga('send', 'event', categories.recording, recordingActions.make);
|
|
}
|
|
|
|
// when someone shares a recording
|
|
function trackShareRecording(shareType) {
|
|
assertOneOf(shareType, recordingShareTypes);
|
|
|
|
context.ga('send', 'event', categories.recording, recordingActions.share, shareType);
|
|
}
|
|
|
|
function _defaultPlayAction() {
|
|
return !window.jamClient || ((typeof(FakeJamClient)!='undefined') && window.jamClient === FakeJamClient) ? 'Website' : 'Client';
|
|
}
|
|
|
|
// when someone plays a recording
|
|
function trackRecordingPlay(recording, recordingAction) {
|
|
|
|
if (!recordingAction) {
|
|
recordingAction = _defaultPlayAction();
|
|
}
|
|
assertOneOf(recordingAction, recordingPlayActions);
|
|
var label = JK.currentUserId ? userLabels.registeredUser : userLabels.visitor;
|
|
|
|
context.ga('send', 'event', categories.recordingPlay, recordingAction, label);
|
|
|
|
if (recording.jam_track) {
|
|
rest.getJamTracks({id:recording.jam_track_id}).done(function(response) {
|
|
if (response.jamtracks && response.jamtracks.length==1) {
|
|
var jamtrack = response.jamtracks[0]
|
|
trackJamTrackPlay(jamtrack.sales_region!=context.JK.AVAILABILITY_US, recording.fan_access, false);
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// when someone plays a live session broadcast
|
|
function trackSessionPlay(session, recordingAction) {
|
|
logger.debug("Tracking session play: ", session)
|
|
if (!recordingAction) {
|
|
recordingAction = _defaultPlayAction();
|
|
}
|
|
assertOneOf(recordingAction, sessionPlayActions);
|
|
var label = JK.currentUserId ? userLabels.registeredUser : userLabels.visitor;
|
|
|
|
context.ga('send', 'event', categories.sessionPlay, recordingAction, label);
|
|
}
|
|
|
|
function trackBand(bandAction) {
|
|
assertOneOf(bandAction, bandActions);
|
|
|
|
context.ga('send', 'event', categories.band, bandAction);
|
|
}
|
|
|
|
function trackJKSocial(category, target, data) {
|
|
assertOneOf(category, categories);
|
|
assertOneOf(target, jkSocialTargets);
|
|
|
|
context.ga('send', 'event', category, target, data);
|
|
}
|
|
|
|
function trackNetworkTest(platform, numUsers) {
|
|
var normalizedPlatform = translatePlatformForGA(platform);
|
|
|
|
context.ga('send', 'event', categories.networkTest, 'Passed', normalizedPlatform, numUsers);
|
|
}
|
|
|
|
function trackNetworkTestFailure(reason, data) {
|
|
assertOneOf(reason, networkTestFailReasons);
|
|
|
|
context.ga('send', 'event', categories.networkTest, 'Failed', reason, data);
|
|
}
|
|
|
|
function trackAudioTestCompletion(platform) {
|
|
var normalizedPlatform = translatePlatformForGA(platform);
|
|
|
|
context.ga('send', 'event', categories.audioTest, 'Passed', normalizedPlatform);
|
|
}
|
|
|
|
function trackAudioTestFailure(platform, reason, data) {
|
|
assertOneOf(reason, audioTestFailReasons);
|
|
|
|
var normalizedPlatform = translatePlatformForGA(platform);
|
|
|
|
if(normalizedPlatform == "Windows") {
|
|
var action = "FailedWin";
|
|
}
|
|
else if(normalizedPlatform == "Mac") {
|
|
var action = "FailedMac";
|
|
}
|
|
else {
|
|
var action = "FailedLinux";
|
|
}
|
|
|
|
context.ga('send', 'event', categories.audioTest, action, reason, data);
|
|
}
|
|
|
|
function trackConfigureTracksCompletion(platform) {
|
|
var normalizedPlatform = translatePlatformForGA(platform);
|
|
|
|
context.ga('send', 'event', categories.trackConfig, 'Passed', normalizedPlatform);
|
|
}
|
|
|
|
function trackAudioTestData(uniqueDeviceName, reason, data) {
|
|
assertOneOf(reason, audioTestDataReasons);
|
|
|
|
context.ga('send', 'event', categories.audioTestData, uniqueDeviceName, reason, data);
|
|
}
|
|
|
|
var GA = {};
|
|
GA.Categories = categories;
|
|
GA.SessionCreationTypes = sessionCreationTypes;
|
|
GA.SessionQualityTypes = sessionQualityTypes;
|
|
GA.InvitationTypes = invitationTypes;
|
|
GA.FriendConnectTypes = friendConnectTypes;
|
|
GA.RecordingActions = recordingActions;
|
|
GA.BandActions = bandActions;
|
|
GA.JKSocialTargets = jkSocialTargets;
|
|
GA.AudioTestFailReasons = audioTestFailReasons;
|
|
GA.AudioTestDataReasons = audioTestDataReasons;
|
|
GA.NetworkTestFailReasons = networkTestFailReasons;
|
|
GA.trackRegister = trackRegister;
|
|
GA.trackDownload = trackDownload;
|
|
GA.trackFTUECompletion = trackFTUECompletion;
|
|
GA.trackNetworkTest = trackNetworkTest;
|
|
GA.trackNetworkTestFailure = trackNetworkTestFailure;
|
|
GA.trackAudioTestCompletion = trackAudioTestCompletion;
|
|
GA.trackAudioTestFailure = trackAudioTestFailure;
|
|
GA.trackAudioTestData = trackAudioTestData;
|
|
GA.trackConfigureTracksCompletion = trackConfigureTracksCompletion;
|
|
GA.trackSessionCount = trackSessionCount;
|
|
GA.trackSessionMusicians = trackSessionMusicians;
|
|
GA.trackSessionQuality = trackSessionQuality;
|
|
GA.trackServiceInvitations = trackServiceInvitations;
|
|
GA.trackFindSessions = trackFindSessions;
|
|
GA.trackJamTrackPlay = trackJamTrackPlay;
|
|
GA.trackJamTrackPlaySession = trackJamTrackPlaySession;
|
|
GA.trackFriendConnect = trackFriendConnect;
|
|
GA.trackMakeRecording = trackMakeRecording;
|
|
GA.trackShareRecording = trackShareRecording;
|
|
GA.trackRecordingPlay = trackRecordingPlay;
|
|
GA.trackSessionPlay = trackSessionPlay;
|
|
GA.trackBand = trackBand;
|
|
GA.trackJKSocial = trackJKSocial;
|
|
GA.virtualPageView = virtualPageView;
|
|
GA.trackTiming = trackTiming;
|
|
|
|
context.JK.GA = GA;
|
|
|
|
})(window,jQuery); |