// Copyright (c) IPython Development Team. // Distributed under the terms of the Modified BSD License. define([ 'base/js/namespace', 'jquery', 'base/js/utils', 'services/kernels/js/kernel', ], function(IPython, $, utils, kernel) { "use strict"; var Session = function (options) { this.id = null; this.notebook = { name: options.notebook_name, path: options.notebook_path }; this.kernel = { name: options.kernel_name }; this.base_url = options.base_url; this.ws_url = options.ws_url; this.sessions_url = utils.url_join_encode(this.base_url, 'api/sessions'); this.notebook_obj = options.notebook; this.events = options.events; }; /** * GET /api/sessions */ Session.prototype.list = function (success, error) { $.ajax(this.sessions_url, { processData: false, cache: false, type: "GET", dataType: "json", success: success, error: this._on_error(error) }); }; /** * POST /api/sessions */ Session.prototype.start = function (success, error) { var that = this; var on_success = function (data, status, xhr) { var kernel_service_url = utils.url_path_join(that.base_url, "api/kernels"); that.kernel = new kernel.Kernel(kernel_service_url, that.ws_url, that.notebook_obj, that.kernel_name); that.kernel._kernel_started(data.kernel); if (success) { success(data, status, xhr); } }; var on_error = function (xhr, status, err) { that.events.trigger('status_dead.Kernel'); if (error) { error(xhr, status, err); } }; $.ajax(this.sessions_url, { processData: false, cache: false, type: "POST", data: JSON.stringify(this._get_model()), dataType: "json", success: this._on_success(on_success), error: this._on_error(on_error) }); }; /** * GET /api/sessions/[:session_id] */ Session.prototype.get_info = function (success, error) { var url = utils.url_join_encode(this.sessions_url, this.id); $.ajax(url, { processData: false, cache: false, type: "GET", dataType: "json", success: this._on_success(success), error: this._on_error(error) }); }; /** * PATCH /api/sessions/[:session_id] */ Session.prototype.change = function (notebook_name, notebook_path, kernel_name, success, error) { this.notebook.name = notebook_name; this.notebook.path = notebook_path; this.kernel.name = kernel_name; var url = utils.url_join_encode(this.sessions_url, this.id); $.ajax(url, { processData: false, cache: false, type: "PATCH", data: JSON.stringify(this._get_model()), dataType : "json", success: this._on_success(success), error: this._on_error(error) }); }; Session.prototype.rename_notebook = function (name, path, success, error) { this.change(name, path, this.kernel.name, success, error); }; /** * DELETE /api/sessions/[:session_id] */ Session.prototype.kill = function (success, error) { if (this.kernel) { this.kernel.running = false; this.kernel.stop_channels(); } var url = utils.url_join_encode(this.sessions_url, this.id); $.ajax(url, { processData: false, cache: false, type: "DELETE", dataType: "json", success: this._on_success(success), error: this._on_error(error) }); }; Session.prototype._get_model = function () { return { notebook: this.notebook, kernel: this.kernel }; }; Session.prototype._update_model = function (data) { this.id = data.id; if (data.notebook) { this.notebook.name = data.notebook.name; this.notebook.path = data.notebook.path; } if (data.kernel) { this.kernel.name = data.kernel.name; } }; Session.prototype._on_success = function (success) { var that = this; return function (data, status, xhr) { that._update_model(data); if (success) { success(data, status, xhr); } }; }; Session.prototype._on_error = function (error) { return function (xhr, status, err) { utils.log_ajax_error(xhr, status, err); if (error) { error(xhr, status, err); } }; }; var SessionAlreadyStarting = function (message) { this.name = "SessionAlreadyStarting"; this.message = (message || ""); }; SessionAlreadyStarting.prototype = Error.prototype; // For backwards compatability. IPython.Session = Session; return { Session: Session, SessionAlreadyStarting: SessionAlreadyStarting }; });