| Index: remoting/webapp/me2mom/log_to_server.js
|
| diff --git a/remoting/webapp/me2mom/log_to_server.js b/remoting/webapp/me2mom/log_to_server.js
|
| index 48f21b2b9e14e880e38863b99f15080047089069..e0cd4f7956bb71883068af9d649ad8b176e5db2a 100644
|
| --- a/remoting/webapp/me2mom/log_to_server.js
|
| +++ b/remoting/webapp/me2mom/log_to_server.js
|
| @@ -20,20 +20,29 @@ remoting.LogToServer = function() {
|
| this.pendingEntries = [];
|
| /** @type {remoting.StatsAccumulator} */
|
| this.statsAccumulator = new remoting.StatsAccumulator();
|
| + /** @type string */
|
| + this.sessionId = '';
|
| + /** @type number */
|
| + this.sessionIdGenerationTime = 0;
|
| };
|
|
|
| -// Local storage keys.
|
| +// Local storage key.
|
| /** @private */
|
| -remoting.LogToServer.prototype.KEY_ENABLED_ = 'remoting.LogToServer.enabled';
|
| -/** @private */
|
| -remoting.LogToServer.prototype.KEY_ID_ = 'remoting.LogToServer.id';
|
| +remoting.LogToServer.KEY_ENABLED_ = 'remoting.LogToServer.enabled';
|
|
|
| -// Constants used for generating an ID.
|
| +// Constants used for generating a session ID.
|
| /** @private */
|
| -remoting.LogToServer.prototype.ID_ALPHABET_ =
|
| +remoting.LogToServer.SESSION_ID_ALPHABET_ =
|
| 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
|
| /** @private */
|
| -remoting.LogToServer.prototype.ID_LEN_ = 20;
|
| +remoting.LogToServer.SESSION_ID_LEN_ = 20;
|
| +
|
| +// The maximum age of a session ID, in milliseconds.
|
| +remoting.LogToServer.MAX_SESSION_ID_AGE = 24 * 60 * 60 * 1000;
|
| +
|
| +// The time over which to accumulate connection statistics before logging them
|
| +// to the server, in milliseconds.
|
| +remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME = 60 * 1000;
|
|
|
| /**
|
| * Enables or disables logging.
|
| @@ -41,7 +50,8 @@ remoting.LogToServer.prototype.ID_LEN_ = 20;
|
| * @param {boolean} enabled whether logging is enabled
|
| */
|
| remoting.LogToServer.prototype.setEnabled = function(enabled) {
|
| - window.localStorage.setItem(this.KEY_ENABLED_, enabled ? 'true' : 'false');
|
| + window.localStorage.setItem(remoting.LogToServer.KEY_ENABLED_,
|
| + enabled ? 'true' : 'false');
|
| }
|
|
|
| /**
|
| @@ -52,16 +62,31 @@ remoting.LogToServer.prototype.setEnabled = function(enabled) {
|
| */
|
| remoting.LogToServer.prototype.logClientSessionStateChange =
|
| function(state, connectionError) {
|
| + this.maybeExpireSessionId();
|
| + // Maybe set the session ID.
|
| + if ((state == remoting.ClientSession.State.CONNECTING) ||
|
| + (state == remoting.ClientSession.State.INITIALIZING) ||
|
| + (state == remoting.ClientSession.State.CONNECTED)) {
|
| + if (this.sessionId == '') {
|
| + this.setSessionId();
|
| + }
|
| + }
|
| + // Log the session state change.
|
| var entry = remoting.ServerLogEntry.makeClientSessionStateChange(
|
| state, connectionError);
|
| entry.addHostFields();
|
| entry.addChromeVersionField();
|
| entry.addWebappVersionField();
|
| - entry.addIdField(this.getId());
|
| + entry.addSessionIdField(this.sessionId);
|
| this.log(entry);
|
| // Don't accumulate connection statistics across state changes.
|
| this.logAccumulatedStatistics();
|
| this.statsAccumulator.empty();
|
| + // Maybe clear the session ID.
|
| + if ((state == remoting.ClientSession.State.CLOSED) ||
|
| + (state == remoting.ClientSession.State.CONNECTION_FAILED)) {
|
| + this.clearSessionId();
|
| + }
|
| };
|
|
|
| /**
|
| @@ -69,11 +94,13 @@ remoting.LogToServer.prototype.logClientSessionStateChange =
|
| * @param {Object.<string, number>} stats the connection statistics
|
| */
|
| remoting.LogToServer.prototype.logStatistics = function(stats) {
|
| + this.maybeExpireSessionId();
|
| // Store the statistics.
|
| this.statsAccumulator.add(stats);
|
| // Send statistics to the server if they've been accumulating for at least
|
| // 60 seconds.
|
| - if (this.statsAccumulator.getTimeSinceFirstValue() >= 60 * 1000) {
|
| + if (this.statsAccumulator.getTimeSinceFirstValue() >=
|
| + remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME) {
|
| this.logAccumulatedStatistics();
|
| }
|
| };
|
| @@ -92,7 +119,7 @@ remoting.LogToServer.prototype.logAccumulatedStatistics = function() {
|
| entry.addHostFields();
|
| entry.addChromeVersionField();
|
| entry.addWebappVersionField();
|
| - entry.addIdField(this.getId());
|
| + entry.addSessionIdField(this.sessionId);
|
| this.log(entry);
|
| }
|
| this.statsAccumulator.empty();
|
| @@ -137,43 +164,66 @@ remoting.LogToServer.prototype.log = function(entry) {
|
| * @return {boolean} whether logging is enabled
|
| */
|
| remoting.LogToServer.prototype.isEnabled = function() {
|
| - var value = window.localStorage.getItem(this.KEY_ENABLED_);
|
| + var value = window.localStorage.getItem(remoting.LogToServer.KEY_ENABLED_);
|
| return (value == 'true');
|
| };
|
|
|
| /**
|
| - * Gets an ID from local storage.
|
| + * Sets the session ID to a random string.
|
| *
|
| - * This function returns the empty string if logging is disabled.
|
| - * If logging is enabled, and there is no ID in local storage, then this
|
| - * function will create and store an ID.
|
| + * @private
|
| + */
|
| +remoting.LogToServer.prototype.setSessionId = function() {
|
| + this.sessionId = remoting.LogToServer.generateSessionId();
|
| + this.sessionIdGenerationTime = new Date().getTime();
|
| +};
|
| +
|
| +/**
|
| + * Clears the session ID.
|
| *
|
| * @private
|
| - * @return {string} an ID, or the empty string
|
| */
|
| -remoting.LogToServer.prototype.getId = function() {
|
| - if (!this.isEnabled()) {
|
| - return '';
|
| - }
|
| - var id = window.localStorage.getItem(this.KEY_ID_);
|
| - if ((!id) || (typeof id != 'string')) {
|
| - id = this.generateId();
|
| - window.localStorage.setItem(this.KEY_ID_, id);
|
| +remoting.LogToServer.prototype.clearSessionId = function() {
|
| + this.sessionId = '';
|
| + this.sessionIdGenerationTime = 0;
|
| +};
|
| +
|
| +/**
|
| + * Sets a new session ID, if the current session ID has reached its maximum age.
|
| + *
|
| + * This method also logs the old and new session IDs to the server, in separate
|
| + * log entries.
|
| + *
|
| + * @private
|
| + */
|
| +remoting.LogToServer.prototype.maybeExpireSessionId = function() {
|
| + if ((this.sessionId != '') &&
|
| + (new Date().getTime() - this.sessionIdGenerationTime >=
|
| + remoting.LogToServer.MAX_SESSION_ID_AGE)) {
|
| + // Log the old session ID.
|
| + var entry = remoting.ServerLogEntry.makeSessionIdOld(this.sessionId);
|
| + this.log(entry);
|
| + // Generate a new session ID.
|
| + this.setSessionId();
|
| + // Log the new session ID.
|
| + entry = remoting.ServerLogEntry.makeSessionIdNew(this.sessionId);
|
| + this.log(entry);
|
| }
|
| - return id.toString();
|
| };
|
|
|
| /**
|
| - * Generates an ID.
|
| + * Generates a string that can be used as a session ID.
|
| *
|
| * @private
|
| - * @return {string} an ID
|
| + * @return {string} a session ID
|
| */
|
| -remoting.LogToServer.prototype.generateId = function() {
|
| +remoting.LogToServer.generateSessionId = function() {
|
| var idArray = [];
|
| - for (var i = 0; i < this.ID_LEN_; i++) {
|
| - var index = Math.random() * this.ID_ALPHABET_.length;
|
| - idArray.push(this.ID_ALPHABET_.slice(index, index + 1));
|
| + for (var i = 0; i < remoting.LogToServer.SESSION_ID_LEN_; i++) {
|
| + var index =
|
| + Math.random() * remoting.LogToServer.SESSION_ID_ALPHABET_.length;
|
| + idArray.push(
|
| + remoting.LogToServer.SESSION_ID_ALPHABET_.slice(index, index + 1));
|
| }
|
| return idArray.join('');
|
| };
|
|
|