blob: 605bae7511953191c8255d20851826ea4ca1af1d [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// `7MM"""Mq. `7MM
// MM `MM. MM
// MM ,M9 .gP"Ya ,6"Yb. ,M""bMM `7MMpMMMb.pMMMb. .gP"Ya
// MMmmdM9 ,M' Yb 8) MM ,AP MM MM MM MM ,M' Yb
// MM YM. 8M"""""" ,pm9MM 8MI MM MM MM MM 8M""""""
// MM `Mb.YM. , 8M MM `Mb MM MM MM MM YM. ,
// .JMML. .JMM.`Mbmmd' `Moo9^Yo.`Wbmd"MML..JMML JMML JMML.`Mbmmd'
//
// This file defines a JavaScript struct that corresponds to
// logs/proto/chromoting/chromoting_extensions.proto
//
// Please keep the two files in sync!
//
/** @suppress {duplicate} */
var remoting = remoting || {};
(function() {
'use strict';
/**
* The members in this struct is used as the JSON payload in outgoing XHRs
* so they must match the member definitions in chromoting_extensions.proto.
*
* @param {remoting.ChromotingEvent.Type} type
*
* @constructor
* @struct
*/
remoting.ChromotingEvent = function(type) {
/** @type {remoting.ChromotingEvent.Type} */
this.type = type;
/** @private {remoting.ChromotingEvent.Os} */
this.os;
/** @private {string} */
this.os_version;
/** @private {string} */
this.browser_version;
/** @private {string} */
this.webapp_version;
/** @type {remoting.ChromotingEvent.Os} */
this.host_os;
/** @type {string} */
this.host_os_version;
/** @type {string} */
this.host_version;
/** @private {string} */
this.cpu;
/** @type {remoting.ChromotingEvent.SessionState} */
this.session_state;
/** @type {remoting.ChromotingEvent.SessionState} */
this.previous_session_state;
/** @type {remoting.ChromotingEvent.ConnectionType} */
this.connection_type;
/** @private {string} */
this.application_id;
/** @type {string} */
this.session_id;
/** @type {remoting.ChromotingEvent.Role} */
this.role;
/** @type {remoting.ChromotingEvent.ConnectionError} */
this.connection_error;
/** @type {number} */
this.session_duration;
/** @type {number} */
this.video_bandwidth;
/** @type {number} */
this.capture_latency;
/** @type {number} */
this.encode_latency;
/** @type {number} */
this.decode_latency;
/** @type {number} */
this.render_latency;
/** @type {number} */
this.roundtrip_latency;
/** @type {number} */
this.max_capture_latency;
/** @type {number} */
this.max_encode_latency;
/** @type {number} */
this.max_decode_latency;
/** @type {number} */
this.max_render_latency;
/** @type {number} */
this.max_roundtrip_latency;
/** @type {remoting.ChromotingEvent.Mode} */
this.mode;
/** @type {remoting.ChromotingEvent.SignalStrategyType} */
this.signal_strategy_type;
/** @type {remoting.ChromotingEvent.SignalStrategyProgress} */
this.signal_strategy_progress;
/** @type {?remoting.ChromotingEvent.XmppError} */
this.xmpp_error;
/** @type {remoting.ChromotingEvent.SessionEntryPoint} */
this.session_entry_point;
/**
* Elapsed time since last host list refresh in milliseconds.
* @type {number}
*/
this.host_status_update_elapsed_time;
/** @type {remoting.ChromotingEvent.AuthMethod} */
this.auth_method;
/** @type {string} */
this.raw_plugin_error;
/** @type {remoting.ChromotingEvent.SessionSummary} */
this.previous_session;
/**
* Elapsed time since the last host heartbeat in milliseconds.
* @type {number}
*/
this.host_last_heartbeat_elapsed_time;
/**
* To track features like number of ESC key press in a session.
* @type {remoting.ChromotingEvent.FeatureTracker}
*/
this.feature_tracker;
/** @type {remoting.ChromotingEvent.ScreenResolution} */
this.host_all_screens_size;
/** @type {remoting.ChromotingEvent.ScreenResolution} */
this.client_video_size;
/** @type {remoting.ChromotingEvent.ScreenResolution} */
this.client_window_size;
/** @type {boolean} */
this.client_fullscreen;
/** @type {remoting.ChromotingEvent.ChromotingDotComMigration} */
this.chromoting_dot_com_migration;
/** @type {number} */
this.number_of_network_interfaces;
this.init_();
};
/** @private */
remoting.ChromotingEvent.prototype.init_ = function() {
// System Info.
var systemInfo = remoting.getSystemInfo();
this.cpu = systemInfo.cpu;
this.os_version = systemInfo.osVersion;
if (systemInfo.osName === remoting.Os.WINDOWS) {
this.os = remoting.ChromotingEvent.Os.WINDOWS;
} else if (systemInfo.osName === remoting.Os.LINUX) {
this.os = remoting.ChromotingEvent.Os.LINUX;
} else if (systemInfo.osName === remoting.Os.MAC) {
this.os = remoting.ChromotingEvent.Os.MAC;
} else if (systemInfo.osName === remoting.Os.CHROMEOS) {
this.os = remoting.ChromotingEvent.Os.CHROMEOS;
}
this.browser_version = systemInfo.chromeVersion;
// App Info.
this.webapp_version = chrome.runtime.getManifest().version;
this.application_id = chrome.runtime.id;
};
/**
* Populates the corresponding fields in the logEntry based on |error|.
*
* @param {remoting.Error} error
*/
remoting.ChromotingEvent.prototype.setError = function(error) {
var Tag = remoting.Error.Tag;
var detail = /** @type {string} */ (error.getDetail());
switch (error.getTag()) {
case Tag.HOST_IS_OFFLINE:
if (detail) {
this.xmpp_error = new remoting.ChromotingEvent.XmppError(detail);
}
break;
case Tag.MISSING_PLUGIN:
console.assert(detail, 'Missing PNaCl plugin last error string.');
this.raw_plugin_error = detail;
}
this.connection_error = error.toConnectionError();
};
/**
* @param {remoting.ChromotingEvent} event
* @return {boolean}
*/
remoting.ChromotingEvent.isEndOfSession = function(event) {
if (event.type !== remoting.ChromotingEvent.Type.SESSION_STATE) {
return false;
}
var endStates = [
remoting.ChromotingEvent.SessionState.CLOSED,
remoting.ChromotingEvent.SessionState.CONNECTION_DROPPED,
remoting.ChromotingEvent.SessionState.CONNECTION_FAILED,
remoting.ChromotingEvent.SessionState.CONNECTION_CANCELED
];
return endStates.indexOf(event.session_state) !== -1;
};
/**
* This is declared as a separate structure to match the proto format
* on the cloud. The cloud will parse the raw stanza for more detailed
* fields, e.g. error condition, error type, jingle action, etc.
*
* @param {string} stanza
* @struct
* @constructor
*/
remoting.ChromotingEvent.XmppError = function(stanza) {
/** @type {string} */
this.raw_stanza = stanza;
};
/**
* See class comments on logs/proto/chromoting/chromoting_extensions.proto.
*
* @struct
* @constructor
*/
remoting.ChromotingEvent.SessionSummary = function() {
/** @type {string} */
this.session_id;
/** @type {remoting.ChromotingEvent.SessionState} */
this.last_state;
/** @type {remoting.ChromotingEvent.ConnectionError} */
this.last_error;
/** @type {number} */
this.duration;
/** @type {number} */
this.session_end_elapsed_time;
/** @type {remoting.ChromotingEvent.SessionEntryPoint} */
this.entry_point;
};
/**
* For tracking features like keypress count.
* All counting fields will be initialized to 0.
* @constructor
*/
remoting.ChromotingEvent.FeatureTracker = function() {
/** @type {number} */
this.fullscreen_esc_count = 0;
};
/**
* Client or host screen resolution.
*
* @param {number} width
* @param {number} height
* @param {number} dpi
* @struct
* @constructor
*/
remoting.ChromotingEvent.ScreenResolution = function(width, height, dpi) {
/** @type {number} */
this.width = width;
/** @type {number} */
this.height = height;
/** @type {number} */
this.dpi = dpi;
};
/**
* Event for Chromoting.com migration.
*
* @param {!remoting.ChromotingEvent.ChromotingDotComMigration.Event} event
* @param {!remoting.ChromotingEvent.ChromotingDotComMigration.Phase} phase
* @struct
* @constructor
*/
remoting.ChromotingEvent.ChromotingDotComMigration = function(event, phase) {
/** @type {!remoting.ChromotingEvent.ChromotingDotComMigration.Event} */
this.event_type = event;
/** @type {!remoting.ChromotingEvent.ChromotingDotComMigration.Phase} */
this.phase = phase;
};
/** @enum {number} */
remoting.ChromotingEvent.ChromotingDotComMigration.Event = {
// Unspecified migration event.
UNSPECIFIED_MIGRATION_EVENT: 0,
// The deprecation notice is shown in the Chrome App.
DEPRECATION_NOTICE_IMPRESSION: 1,
// The deprecation notice is dismissed in the Chrome App.
DEPRECATION_NOTICE_DISMISSAL: 2,
// The deprecation notice is clicked in the Chrome App.
DEPRECATION_NOTICE_CLICKED: 3,
// The user settings are migrated in Chromoting.com.
USER_OPTIONS_MIGRATION: 4,
// The extension upsell is shown in Chromoting.com.
COMPANION_EXTENSION_UPSELL_IMPRESSION: 5,
// The extension upsell is clicked in Chromoting.com.
COMPANION_EXTENSION_UPSELL_CLICKED: 6,
};
/** @enum {number} */
remoting.ChromotingEvent.ChromotingDotComMigration.Phase = {
// Unspecified phase.
UNSPECIFIED_PHASE: 0,
// Chromoting.com is available for early adopters.
BETA: 1,
// Chromoting.com is available for the general public.
STABLE: 2,
// Chrome App deprecation is announced.
DEPRECATION_1: 3,
// Chrome App is deprecated.
DEPRECATION_2: 4,
};
/**
* @enum {number}
*/
remoting.ChromotingEvent.Type = {
SESSION_STATE: 1,
CONNECTION_STATISTICS: 2,
SESSION_ID_OLD: 3,
SESSION_ID_NEW: 4,
HEARTBEAT: 5,
HEARTBEAT_REJECTED: 6,
RESTART: 7,
HOST_STATUS: 8,
SIGNAL_STRATEGY_PROGRESS: 9,
FEATURE_TRACKING: 10,
SCREEN_RESOLUTIONS: 11,
CHROMOTING_DOT_COM_MIGRATION: 12,
};
/** @enum {number} */
remoting.ChromotingEvent.Role = {
CLIENT: 0,
HOST: 1
};
/** @enum {number} */
remoting.ChromotingEvent.Os = {
LINUX: 1,
CHROMEOS: 2,
MAC: 3,
WINDOWS: 4,
OTHER: 5,
ANDROID: 6,
IOS: 7
};
/**
* Convert the OS type String into the enum value.
*
* @param {string} type
* @return {remoting.ChromotingEvent.Os}
*/
remoting.ChromotingEvent.toOs = function(type) {
type = type.toLowerCase();
switch (type) {
case 'linux':
return remoting.ChromotingEvent.Os.LINUX;
case 'chromeos':
return remoting.ChromotingEvent.Os.CHROMEOS;
case 'mac':
return remoting.ChromotingEvent.Os.MAC
case 'windows':
return remoting.ChromotingEvent.Os.WINDOWS;
case 'android':
return remoting.ChromotingEvent.Os.ANDROID;
case 'ios':
return remoting.ChromotingEvent.Os.IOS;
default:
return remoting.ChromotingEvent.Os.OTHER;
}
};
/** @enum {number} */
remoting.ChromotingEvent.SessionState = {
UNKNOWN: 1, // deprecated.
CREATED: 2, // deprecated.
BAD_PLUGIN_VERSION: 3, // deprecated.
UNKNOWN_PLUGIN_ERROR: 4, // deprecated.
CONNECTING: 5,
INITIALIZING: 6, // deprecated.
CONNECTED: 7,
CLOSED: 8,
CONNECTION_FAILED: 9,
UNDEFINED: 10,
PLUGIN_DISABLED: 11, // deprecated.
CONNECTION_DROPPED: 12,
CONNECTION_CANCELED: 13,
AUTHENTICATED: 14,
STARTED: 15,
SIGNALING: 16,
CREATING_PLUGIN: 17,
VIDEO_STREAM_STARTED: 18,
};
/** @enum {number} */
remoting.ChromotingEvent.SessionEntryPoint = {
CONNECT_BUTTON: 1,
RECONNECT_BUTTON: 2,
AUTO_RECONNECT_ON_CONNECTION_DROPPED: 3,
AUTO_RECONNECT_ON_HOST_OFFLINE: 4
};
/** @enum {number} */
remoting.ChromotingEvent.ConnectionType = {
DIRECT: 1,
STUN: 2,
RELAY: 3
};
/** @enum {number} */
remoting.ChromotingEvent.ConnectionError = {
NONE: 1,
HOST_OFFLINE: 2,
SESSION_REJECTED: 3,
INCOMPATIBLE_PROTOCOL: 4,
NETWORK_FAILURE: 5,
UNKNOWN_ERROR: 6,
INVALID_ACCESS_CODE: 7,
MISSING_PLUGIN: 8,
AUTHENTICATION_FAILED: 9,
BAD_VERSION: 10,
HOST_OVERLOAD: 11,
P2P_FAILURE: 12,
UNEXPECTED: 13,
CLIENT_SUSPENDED: 14,
NACL_DISABLED: 15,
MAX_SESSION_LENGTH: 16,
HOST_CONFIGURATION_ERROR: 17,
NACL_PLUGIN_CRASHED: 18,
INVALID_ACCOUNT: 19,
};
/** @enum {number} */
remoting.ChromotingEvent.Mode = {
IT2ME: 1,
ME2ME: 2,
LGAPP: 3
};
/** @enum {number} */
remoting.ChromotingEvent.SignalStrategyType = {
XMPP: 1,
WCS: 2,
LCS: 3,
FTL: 4,
};
/** @enum {number} */
remoting.ChromotingEvent.SignalStrategyProgress = {
SUCCEEDED: 1,
FAILED: 2,
TIMED_OUT: 3,
SUCCEEDED_LATE: 4,
FAILED_LATE: 5
};
/** @enum {number} */
remoting.ChromotingEvent.AuthMethod = {
PIN: 1,
ACCESS_CODE: 2,
PINLESS: 3,
THIRD_PARTY: 4,
};
})();