Files
ThirdParty-6/ParaView-5.0.1/VTK/Web/JavaScript/Lib/vtkweb.launcher.js

251 lines
8.2 KiB
JavaScript

/**
* vtkWeb JavaScript Library.
*
* This module allow the Web client to start a remote vtkWeb session and
* retreive all the connection information needed to properly connect to that
* newly created session.
*
* @class vtkWeb.launcher
*
* {@img paraview/ParaViewWeb-multiuser.png alt Focus on the communication between the client and the front-end that manage the vtkWeb processes}
*/
(function (GLOBAL, $) {
// Internal field used to store all connection objects
var Connections = [], module = {}, console = GLOBAL.console;
function generateSecretKey() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < 10; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
/**
* @class vtkWeb.Connection
* This class provides all the informations needed to connect to the session
* manager web service.
*/
/**
* @member vtkWeb.Connection
* @property {String} sessionManagerURL
* The service URL that will respond to the REST request to start or stop
* a visualization session.
*
* MANDATORY
*/
/**
* @member vtkWeb.Connection
* @property {String} name
* The name given for the visualization.
*
* RECOMMENDED/OPTIONAL
*/
/**
* @member vtkWeb.Connection
* @property {String} application
* The name of the application that should be started on the server side.
*
* MANDATORY
*/
/**
* @member vtkWeb.Connection
* @property {String|Number} __Any_Name__
* Any property that we want to provide to the session that will be created.
* Such property is not necessary used by the session manager but will be
* returned if a connection information is requested from a session.
*
* OPTIONAL
*/
/**
* @member vtkWeb.Connection
* @property {String} secret
* Password that should be used to protect remote session access.
*
* This property is used by the launcher to secure the process that it start
* but it is also used by the client to authenticate itself against
* the remote process.
*
* This can be provided by the client or by the server depending who
* generate it. In both case, the client will use it for its authentication.
* If missing, then the client will use the default secret key.
*
* OPTIONAL
*/
/**
* @member vtkWeb.Connection
* @property {Number} generate-secret
* Property used to specify where the generation of the secret key should be
* made.
* 0: We use the default secret key. (No dynamic one)
* 1: The JavaScript client generate the key and its the responsability of
* the server to provide the generated key to the vtkWeb process.
* 2: The launcher process generate that key when it start the vtkWeb
* process. That given secret key must be returned to the client within
* the connection object.
*
* OPTIONAL
*/
//=========================================================================
/**
* @member vtkWeb.Connection
* @property {String} sessionURL
* The websocket URL that should be used to connect to the running
* visualization session.
* This field is provided within the response.
*/
/**
* @member vtkWeb.Connection
* @property {String} id
* The session identifier.
* This field is provided within the response.
*/
/**
* @member vtkWeb.Connection
* @property {vtkWeb.Session} session
* The session object will be automatically added to the connection once the
* connection is properly established by calling:
*
* vtkWeb.connect(connection, success, error);
*
* This field is provided within the response.
*/
//=========================================================================
/**
* Start a new vtkWeb process on the server side.
* This method will make a JSON POST request to config.sessionManagerURL URL.
*
* @member vtkWeb.launcher
*
* @param {vtkWeb.ConnectionConfig} config
* Session creation parameters. (sessionManagerURL, name, application).
*
* @param {Function} successCallback
* The function will be called once the connection is successfully performed.
* The argument of the callback will be a {@link vtkWeb.Connection}.
*
* @param {Function} errorCallback
* The function will be called if anything bad happened and an explanation
* message will be provided as argument.
*/
function start(config, successFunction, errorFunction) {
if(!config.hasOwnProperty("secret") && config.hasOwnProperty("generate-secret") && config["generate-secret"] === 1) {
config.secret = generateSecretKey();
}
var okCallback = successFunction,
koCallback = errorFunction,
arg = {
url: config.sessionManagerURL,
type: "POST",
dataType: "json",
data: (JSON.stringify(config)),
success: function (reply) {
Connections.push(reply);
if (okCallback) {
okCallback(reply);
}
},
error: function (errMsg) {
if (koCallback) {
koCallback(errMsg);
}
}
};
return $.ajax(arg);
}
/**
* Query the Session Manager in order to retreive connection informations
* based on a session id.
*
* @member vtkWeb.launcher
*
* @param {String} sessionManagerURL
* Same as ConnectionConfig.sessionManagerURL value.
*
* @param {String} sessionId
* The unique identifier of a session.
*
* @return {vtkWeb.Connection} if the session is found.
*/
function fetchConnection(sessionManagerURL, sessionId) {
var config = {
url: sessionManagerURL + '/' + sessionId,
dataType: "json"
};
return $.ajax(config);
}
/**
* Stop a remote running visualization session.
*
* @member vtkWeb.launcher
*
* @param {vtkWeb.ConnectionConfig} connection
*/
function stop(connection) {
var config = {
url: connection.sessionManagerURL + "/" + connection.id,
type: "DELETE",
dataType: "json",
success: function (reply) {
console.log(reply);
},
error: function (errMsg) {
console.log("Error while trying to close service");
}
};
return $.ajax(config);
}
// ----------------------------------------------------------------------
// Init vtkWeb module if needed
// ----------------------------------------------------------------------
if (GLOBAL.hasOwnProperty("vtkWeb")) {
module = GLOBAL.vtkWeb || {};
} else {
GLOBAL.vtkWeb = module;
}
// ----------------------------------------------------------------------
// Export internal methods to the vtkWeb module
// ----------------------------------------------------------------------
module.start = function (config, successFunction, errorFunction) {
return start(config, successFunction, errorFunction);
};
module.stop = function (connection) {
return stop(connection);
};
module.fetchConnection = function (serviceUrl, sessionId) {
return fetchConnection(serviceUrl, sessionId);
};
/**
* Return all the session connections created in that JavaScript context.
* @member vtkWeb.launcher
* @return {vtkWeb.Connection[]}
*/
module.getConnections = function () {
return Connections;
};
// ----------------------------------------------------------------------
// Local module registration
// ----------------------------------------------------------------------
try {
// Tests for presence of jQuery, then registers this module
if ($ !== undefined) {
module.registerModule('vtkweb-launcher');
}
} catch(err) {
console.error('jQuery is missing: ' + err.message);
}
}(window, jQuery));