Skip to content

Commit

Permalink
fix(FEC-8202): Session ID isn't sent when reporting analytics (#118)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dan Ziv authored and OrenMe committed May 9, 2018
1 parent dd0fff5 commit 72c4b4e
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 33 deletions.
61 changes: 39 additions & 22 deletions src/common/utils/kaltura-params.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,55 +8,70 @@ const CLIENT_TAG = 'clientTag=html5:v';

/**
* @param {Player} player - player
* @param {PartialKalturaPlayerOptionsObject} playerConfig - player config
* @return {void}
* @public
*/
function handleSessionId(player: Player): void {
function handleSessionId(player: Player, playerConfig: PartialKalturaPlayerOptionsObject): void {
if (player.config.session && player.config.session.id) { // on change media
updateSessionId(player);
updateSessionId(player, playerConfig);
} else { // on first playback
addSessionId(player);
addSessionId(playerConfig);
}
}

/**
* @param {Player} player - player
* @param {PartialKalturaPlayerOptionsObject} playerConfig - player config
* @return {void}
* @private
*/
function addSessionId(player: Player): void {
function addSessionId(playerConfig: PartialKalturaPlayerOptionsObject): void {
let primaryGUID = Utils.Generator.guid();
let secondGUID = Utils.Generator.guid();
player.sessionId = primaryGUID + ':' + secondGUID;
setSessionId(playerConfig, primaryGUID + ':' + secondGUID);
}

/**
* @param {Player} player - player
* @param {PartialKalturaPlayerOptionsObject} playerConfig - player config
* @return {void}
* @private
*/
function updateSessionId(player: Player): void {
function updateSessionId(player: Player, playerConfig: PartialKalturaPlayerOptionsObject): void {
let secondGuidInSessionIdRegex = /:((?:[a-z0-9]|-)*)/i;
let secondGuidInSessionId = secondGuidInSessionIdRegex.exec(player.config.session.id);
if (secondGuidInSessionId && secondGuidInSessionId[1]) {
player.sessionId = player.config.session.id.replace(secondGuidInSessionId[1], Utils.Generator.guid());
setSessionId(playerConfig, player.config.session.id.replace(secondGuidInSessionId[1], Utils.Generator.guid()));
}
}

/**
* @param {PartialKalturaPlayerOptionsObject} playerConfig - player config
* @param {string} sessionId - the session id
* @return {void}
* @private
*/
function setSessionId(playerConfig: PartialKalturaPlayerOptionsObject, sessionId: string): void {
playerConfig.session = playerConfig.session || {};
playerConfig.session.id = sessionId;
}

/**
* @param {PKMediaSourceObject} source - PKMediaSourceObject
* @param {string} sessionId - session id
* @return {void}
* @private
*/
function updateSessionIdInUrl(source: Object = {}, sessionId: string): void {
let sessionIdInUrlRegex = new RegExp(PLAY_SESSION_ID + '((?:[a-z0-9]|-)*:(?:[a-z0-9]|-)*)', 'i');
let sessionIdInUrl = sessionIdInUrlRegex.exec(source.url);
if (sessionIdInUrl && sessionIdInUrl[1]) { // this url has session id (has already been played)
source.url = source.url.replace(sessionIdInUrl[1], sessionId);
} else {
let delimiter = source.url.indexOf('?') === -1 ? '?' : '&';
source.url += delimiter + PLAY_SESSION_ID + sessionId;
function updateSessionIdInUrl(source: Object = {}, sessionId: ?string): void {
if (sessionId) {
let sessionIdInUrlRegex = new RegExp(PLAY_SESSION_ID + '((?:[a-z0-9]|-)*:(?:[a-z0-9]|-)*)', 'i');
let sessionIdInUrl = sessionIdInUrlRegex.exec(source.url);
if (sessionIdInUrl && sessionIdInUrl[1]) { // this url has session id (has already been played)
source.url = source.url.replace(sessionIdInUrl[1], sessionId);
} else {
let delimiter = source.url.indexOf('?') === -1 ? '?' : '&';
source.url += delimiter + PLAY_SESSION_ID + sessionId;
}
}
}

Expand All @@ -65,7 +80,7 @@ function updateSessionIdInUrl(source: Object = {}, sessionId: string): void {
* @return {void}
* @private
*/
function addReferrer(source: PKMediaSourceObject) {
function addReferrer(source: PKMediaSourceObject): void {
if (source.url.indexOf(REFERRER) === -1) {
let delimiter = source.url.indexOf('?') === -1 ? '?' : '&';
source.url += delimiter + REFERRER + btoa(document.referrer || document.URL);
Expand All @@ -77,27 +92,29 @@ function addReferrer(source: PKMediaSourceObject) {
* @return {void}
* @private
*/
function addClientTag(source: PKMediaSourceObject) {
function addClientTag(source: PKMediaSourceObject): void {
if (source.url.indexOf(CLIENT_TAG) === -1) {
let delimiter = source.url.indexOf('?') === -1 ? '?' : '&';
source.url += delimiter + CLIENT_TAG + __VERSION__;
}
}

/**
* @param {PKSourcesConfigObject} sources - player sources
* Adding Kaltura specific params to player config and player sources.
* @param {Player} player - player
* @param {PartialKalturaPlayerOptionsObject} playerConfig - player config
* @return {void}
* @private
*/
function addKalturaParams(sources: PKSourcesConfigObject, player: Player): void {
handleSessionId(player);
function addKalturaParams(player: Player, playerConfig: PartialKalturaPlayerOptionsObject): void {
handleSessionId(player, playerConfig);
const sources = playerConfig.sources;
Object.values(StreamType).forEach(key => {
// $FlowFixMe
if (sources[key]) {
sources[key].forEach((source) => {
if (typeof source.url === 'string' && source.url.toLowerCase().indexOf(PLAY_MANIFEST) > -1 && !source.localSource) {
updateSessionIdInUrl(source, player.config.session.id);
updateSessionIdInUrl(source, playerConfig.session && playerConfig.session.id);
addReferrer(source);
addClientTag(source);
}
Expand Down
18 changes: 18 additions & 0 deletions src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,28 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<title>Title</title>
<link rel="stylesheet" type="text/css" href="./style.css"/>
<script src="./kaltura-ovp-player.js" type="text/javascript"></script>
</head>
<body>
<div id="player-placeholder"></div>
<script>
var config = {
targetId: 'player-placeholder',
provider: {
partnerId: 1091,
env: {
cdnUrl: "http://qa-apache-php7.dev.kaltura.com/",
serviceUrl: "http://qa-apache-php7.dev.kaltura.com/api_v3"
}
}
};

try {
var kalturaPlayer = KalturaPlayer.setup(config);
kalturaPlayer.loadMedia({entryId: '0_wifqaipd'});
} catch (e) {
console.error(e.message)
}
</script>
</body>
</html>
4 changes: 2 additions & 2 deletions src/kaltura-player.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ export default class KalturaPlayer {
Utils.Object.mergeDeep(playerConfig.plugins, this._player.config.plugins);
Utils.Object.mergeDeep(playerConfig.session, this._player.config.session);
addKalturaPoster(playerConfig.sources, mediaConfig.sources, this._player.dimensions);
this._uiWrapper.setSeekbarConfig(mediaConfig);
addKalturaParams(playerConfig.sources, this._player);
addKalturaParams(this._player, playerConfig);
evaluatePluginsConfig(playerConfig);
this._uiWrapper.setSeekbarConfig(mediaConfig);
this._player.configure(playerConfig);
}

Expand Down
18 changes: 9 additions & 9 deletions test/src/common/utils/kaltura-params.spec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import {
addClientTag,
addKalturaParams,
handleSessionId,
updateSessionIdInUrl,
addReferrer,
addClientTag
handleSessionId,
updateSessionIdInUrl
} from '../../../../src/common/utils/kaltura-params'

class Player {
Expand All @@ -20,7 +20,7 @@ describe('addKalturaParams', function () {
let source1 = {url: 'a/b/c/playmanifest/source'};
let source2 = {url: 'd/e/f/playmanifest/source?a'};
player.config = {session: {}, sources: {progressive: [source1, source2]}};
addKalturaParams(player.config.sources, player);
addKalturaParams(player, player.config);
source1.url.should.be.equal('a/b/c/playmanifest/source?playSessionId=' + player.config.session.id + '&referrer=' + btoa(document.referrer) + '&clientTag=html5:v' + __VERSION__);
source2.url.should.be.equal('d/e/f/playmanifest/source?a&playSessionId=' + player.config.session.id + '&referrer=' + btoa(document.referrer) + '&clientTag=html5:v' + __VERSION__);
});
Expand All @@ -29,22 +29,22 @@ describe('addKalturaParams', function () {
let source1 = {url: 'a/b/c/PLAYMANIFEST/source'};
let source2 = {url: 'd/e/f/PLAYMANIFEST/source?a'};
player.config = {session: {}, sources: {progressive: [source1, source2]}};
addKalturaParams(player.config.sources, player);
addKalturaParams(player, player.config);
source1.url.should.be.equal('a/b/c/PLAYMANIFEST/source?playSessionId=' + player.config.session.id + '&referrer=' + btoa(document.referrer) + '&clientTag=html5:v' + __VERSION__);
source2.url.should.be.equal('d/e/f/PLAYMANIFEST/source?a&playSessionId=' + player.config.session.id + '&referrer=' + btoa(document.referrer) + '&clientTag=html5:v' + __VERSION__);
});

it('should add nothing for no playManifest source', function () {
let source1 = {url: 'a/b/c'};
addKalturaParams({progressive: [source1]}, player);
addKalturaParams(player, {sources: {progressive: [source1]}});
player.config.session.id.should.be.exist;
source1.url.should.be.equal('a/b/c');
});

it('should add nothing for no playManifest source', function () {
let source1 = {url: 'a/b/c/PLAYMANIFEST/source'};
source1.localSource = true;
addKalturaParams({dash: [source1]}, player);
addKalturaParams(player, {sources: {dash: [source1]}});
player.config.session.id.should.be.exist;
source1.url.should.be.equal('a/b/c/PLAYMANIFEST/source');
});
Expand All @@ -54,13 +54,13 @@ describe('handleSessionId', function () {
let sessionIdRegex = /(?:[a-z0-9]|-)*:(?:[a-z0-9]|-)*/i;
it('should add the player session id', function () {
player.config = {session: {}};
handleSessionId(player);
handleSessionId(player, player.config);
sessionIdRegex.test(player.config.session.id).should.be.true;
});

it('should update the player session id', function () {
player.config = {session: {id: "5cc03aa6-c58f-3220-b548-2a698aa54830:33e6d80e-63b3-108a-091d-ccc15998f85b"}};
handleSessionId(player);
handleSessionId(player, player.config);
sessionIdRegex.test(player.config.session.id).should.be.true;
(player.config.session.id.indexOf("5cc03aa6-c58f-3220-b548-2a698aa54830:") > -1).should.be.true;
(player.config.session.id.indexOf("33e6d80e-63b3-108a-091d-ccc15998f85b") > -1).should.be.false;
Expand Down

0 comments on commit 72c4b4e

Please sign in to comment.