diff --git a/src/octoprint/static/js/app/client/connection.js b/src/octoprint/static/js/app/client/connection.js new file mode 100644 index 00000000..7179b727 --- /dev/null +++ b/src/octoprint/static/js/app/client/connection.js @@ -0,0 +1,41 @@ +OctoPrint.connection = (function() { + var self = {}; + + self.getSettings = function(opts) { + opts = opts || {}; + + var params = $.extend({}, opts); + params.url = "api/connection"; + + return OctoPrint.getJson(params); + }; + + self.connect = function(data, opts) { + data = data || {}; + + return self.issueCommand("connect", data, opts); + }; + + self.disconnect = function(opts) { + return self.issueCommand("disconnect", {}, opts); + }; + + self.fakeAck = function(opts) { + return self.issueCommand("fake_ack", {}, opts); + }; + + self.issueCommand = function(command, data, opts) { + opts = opts || {}; + data = data || {}; + + var payload = $.extend({}, data); + payload.command = command; + + var params = $.extend({}, opts); + params.url = "api/connection"; + + return OctoPrint.postJson(payload, params); + }; + + return self; +})($, _); diff --git a/src/octoprint/static/js/app/client/files.js b/src/octoprint/static/js/app/client/files.js index 39c5384a..7fbe4788 100644 --- a/src/octoprint/static/js/app/client/files.js +++ b/src/octoprint/static/js/app/client/files.js @@ -1,21 +1,89 @@ OctoPrint.files = (function($, _) { - var self = {}; + var exports = {}; - self.get = function(opts) { - var url = "api/files"; - var origin = opts.origin || ""; + exports.get = function(opts) { + opts = opts || {}; - if (origin && _.contains(["local", "sdcard"], origin)) { - url += origin + "/" + var path = "api/files"; + var location = opts.location || ""; + + if (location && _.contains(["local", "sdcard"], location)) { + path += "/" + location; } - OctoPrint.get_json({ - url: url, - success: opts.success, - error: opts.error, - complete: opts.complete - }) + var params = _.extend({}, opts); + params.url = path; + + return OctoPrint.getJson(params); }; - return self; + exports.listAll = function(opts) { + opts = opts || {}; + + if (opts.location) { + opts.location = undefined; + } + + return exports.get(opts); + }; + + exports.listAllForLocation = function(location, opts) { + opts = opts || {}; + opts.location = location; + + return exports.get(opts); + }; + + exports.getInfoForFile = function(location, filename, opts) { + opts = opts || {}; + + var params = $.extend({}, opts); + params.url = exports.resourceForFile(location, filename); + + return OctoPrint.getJson(params); + }; + + exports.selectFile = function(location, filename, print, opts) { + print = print || false; + + var data = { + print: print + }; + + return exports.issueFileCommand(location, filename, "select", data, opts); + }; + + exports.sliceFile = function(location, filename, parameters, opts) { + parameters = parameters || {}; + + return exports.issueFileCommand(location, filename, "slice", parameters, opts); + }; + + exports.issueFileCommand = function(location, filename, command, data, opts) { + opts = opts || {}; + data = data || {}; + + var payload = $.extend({}, data); + payload.command = command; + + var params = $.extend({}, opts); + params.url = exports.resourceForFile(location, filename); + + return OctoPrint.postJson(payload, params); + }; + + exports.deleteFile = function(location, filename, opts) { + opts = opts || {}; + + var params = $.extend({}, opts); + params.url = exports.resourceForFile(location, filename); + + return OctoPrint.delete(opts); + }; + + exports.resourceForFile = function(location, filename) { + return "api/files/" + location + "/" + filename; + }; + + return exports; })($, _); diff --git a/src/octoprint/static/js/app/client/octoprint.js b/src/octoprint/static/js/app/client/octoprint.js index 362c4910..d2432308 100644 --- a/src/octoprint/static/js/app/client/octoprint.js +++ b/src/octoprint/static/js/app/client/octoprint.js @@ -1,65 +1,80 @@ -var OctoPrint = (function($) { - var self = {}; +var OctoPrint = (function($, _) { + var exports = {}; - self.options = { + exports.options = { "baseurl": undefined, "apikey": undefined }; - self.ajax = function(opts) { - var url = self.options.baseurl + opts.url; + exports.ajax = function(opts) { + opts = opts || {}; + + var url = exports.options.baseurl; + if (!_.endsWith(url, "/")) { + url = url + "/"; + } + url += opts.url; + var headers = $.extend({}, opts.headers || {}); - headers["X-Api-Key"] = self.options.apikey; + headers["X-Api-Key"] = exports.options.apikey; var params = $.extend({}, opts); params.url = url; + params.headers = headers; - $.ajax(params); + return $.ajax(params); }; - self.get = function(opts) { + exports.get = function(opts) { + opts = opts || {}; + var params = $.extend({}, opts); params.type = "GET"; - self.ajax(params); + return exports.ajax(params); }; - self.post = function(opts) { + exports.post = function(data, opts) { + opts = opts || {}; + var headers = $.extend({}, opts.headers || {}); headers["Cache-Control"] = "no-cache"; var params = $.extend({}, opts); params.type = "POST"; - params.data = JSON.stringify(data); + params.data = data; params.headers = headers; - self.ajax(params); + return exports.ajax(params); }; - self.delete = function(opts) { + exports.delete = function(opts) { + opts = opts || {}; + var params = $.extend({}, opts); params.type = "DELETE"; - self.ajax(params); + return exports.ajax(params); }; - self.get_json = function(opts) { + exports.getJson = function(opts) { + opts = opts || {}; + var params = $.extend({}, opts); params.dataType = "json"; - self.get(params); + return exports.get(params); }; - self.post_json = function(opts) { - var data = opts.data || {}; + exports.postJson = function(data, opts) { + opts = opts || {}; var params = $.extend({}, opts); params.contentType = "application/json; charset=UTF-8"; params.dataType = "json"; - params.data = JSON.stringify(data); - self.post(params); + return exports.post(JSON.stringify(data), params); }; - return self; -})($); + return exports; +})($, _); diff --git a/src/octoprint/static/js/app/client/socket.js b/src/octoprint/static/js/app/client/socket.js new file mode 100644 index 00000000..3156fa86 --- /dev/null +++ b/src/octoprint/static/js/app/client/socket.js @@ -0,0 +1,119 @@ +OctoPrint.socket = (function($, _, SockJS) { + var exports = {}; + + exports.options = { + timeouts: [0, 1, 1, 2, 3, 5, 8, 13, 20, 40, 100] + }; + + var normalClose = 1000; + + var socket = undefined; + var reconnecting = false; + var reconnectTrial = 0; + + var onOpen = function() { + reconnecting = false; + reconnectTrial = 0; + }; + + var onClose = function(e) { + if (e.code == normalClose) { + return; + } + + if (exports.onReconnectAttempt(reconnectTrial)) { + return; + } + + if (reconnectTrial < exports.options.timeouts.length) { + var timeout = exports.options.timeouts[reconnectTrial]; + setTimeout(exports.reconnect, timeout * 1000); + reconnectTrial++; + } else { + exports.onReconnectFailed(); + } + }; + + var onMessage = function(msg) { + for (var prop in msg.data) { + if (!msg.data.hasOwnProperty(prop)) { + continue; + } + + var data = msg.data[prop]; + + switch (prop) { + case "connected": { + exports.onConnected(data); + break; + } + case "history": { + exports.onHistoryData(data); + break; + } + case "current": { + exports.onCurrentData(data); + break; + } + case "event": { + var event = data["type"]; + var payload = data["payload"]; + exports.onEvent(event, payload); + break; + } + case "plugin": { + exports.onPluginMessage(data.plugin, data.data); + break; + } + case "timelapse": { + exports.onTimelapseSettings(data); + break; + } + case "slicingProgress": { + exports.onSlicingProgress(data.slicer, data.model_path, data.machinecode_path, data.progress); + break; + } + } + } + }; + + exports.connect = function(opts) { + opts = opts || {}; + + exports.disconnect(); + + var url = OctoPrint.options.baseurl; + if (!_.endsWith(url, "/")) { + url += "/"; + } + + socket = new SockJS(url + "sockjs", undefined, opts); + socket.onopen = onOpen; + socket.onclose = onClose; + socket.onmessage = onMessage; + }; + + exports.reconnect = function() { + exports.disconnect(); + socket = undefined; + exports.connect(); + }; + + exports.disconnect = function() { + if (socket != undefined) { + socket.close(); + } + }; + + exports.onConnected = function(data) {}; + exports.onCurrentData = function(data) {}; + exports.onHistoryData = function(data) {}; + exports.onEvent = function(event, data) {}; + exports.onPluginMessage = function(plugin, message) {}; + exports.onTimelapseSettings = function(data) {}; + exports.onSlicingProgress = function(slicer, modelPath, machinecodePath, progress) {}; + exports.onReconnectAttempt = function(trial) {}; + exports.onReconnectFailed = function() {}; + + return exports; +})($, _, SockJS);