diff --git a/src/octoprint/static/js/app/client.js b/src/octoprint/static/js/app/client.js new file mode 100644 index 00000000..803635af --- /dev/null +++ b/src/octoprint/static/js/app/client.js @@ -0,0 +1,79 @@ +var OctoPrint = (function($, _, SockJS) { + var self = { + options: { + socketReconnectTimeouts: [0, 1, 1, 2, 3, 5, 8, 13, 20, 40, 100], + socketDebug: false, + socketNormalClose: 1000 + } + }; + + var _socket = undefined; + var _socketAddress = undefined; + var _socketReconnecting = false; + var _socketReconnectTrial = 0; + var _socketIgnoreReconnects = 1; + + function callCallback(callback, arguments) { + if (!_.isFunction(self.options[callback])) { + throw Error("No such callback: " + callback); + } + + self.options[callback].bind(arguments); + } + + function connect(socketAddress) { + var address = socketAddress || _socketAddress; + if (address == undefined) { + return; + } + + var socketOptions = { + debug: options.socketDebug || false + }; + + if (_socket != undefined) { + self._socket.close(); + delete self._socket; + } + + _socketAddress = address; + _socket = new SockJS(address, undefined, socketOptions); + _socket.onopen = onSocketOpen; + _socket.onclose = onSocketClose; + _socket.onmessage = onSocketMessage; + } + + function onSocketOpen() { + _socketReconnecting = false; + _socketReconnectTrial = 0; + } + + function onSocketClose(error) { + if (error.code == options.socketNormalClose) { + return; + } + + if (_socketReconnectTrial >= _socketIgnoreReconnects) { + if (options.onAttemptingReconnect) { + options.onAttemptingReconnect(_socketReconnectTrial); + } + } + + if (_socketReconnectTrial < options.socketReconnectTimeouts.length) { + var timeout = options.socketReconnectTimeouts[_socketReconnectTrial]; + log.info("Reconnect trial #" + self._autoReconnectTrial + ", waiting " + timeout + "s"); + setTimeout(connect, timeout * 1000); + _socketReconnectTrial++; + } else { + if (options.onReconnectFailed) { + options.onReconnectFailed(); + } + } + } + + function onSocketMessage(data) { + } + + return self; + +}(jQuery, _, SockJS)); diff --git a/src/octoprint/static/js/app/client/files.js b/src/octoprint/static/js/app/client/files.js new file mode 100644 index 00000000..39c5384a --- /dev/null +++ b/src/octoprint/static/js/app/client/files.js @@ -0,0 +1,21 @@ +OctoPrint.files = (function($, _) { + var self = {}; + + self.get = function(opts) { + var url = "api/files"; + var origin = opts.origin || ""; + + if (origin && _.contains(["local", "sdcard"], origin)) { + url += origin + "/" + } + + OctoPrint.get_json({ + url: url, + success: opts.success, + error: opts.error, + complete: opts.complete + }) + }; + + return self; +})($, _); diff --git a/src/octoprint/static/js/app/client/octoprint.js b/src/octoprint/static/js/app/client/octoprint.js new file mode 100644 index 00000000..362c4910 --- /dev/null +++ b/src/octoprint/static/js/app/client/octoprint.js @@ -0,0 +1,65 @@ +var OctoPrint = (function($) { + var self = {}; + + self.options = { + "baseurl": undefined, + "apikey": undefined + }; + + self.ajax = function(opts) { + var url = self.options.baseurl + opts.url; + var headers = $.extend({}, opts.headers || {}); + headers["X-Api-Key"] = self.options.apikey; + + var params = $.extend({}, opts); + params.url = url; + + $.ajax(params); + }; + + self.get = function(opts) { + var params = $.extend({}, opts); + params.type = "GET"; + + self.ajax(params); + }; + + self.post = function(opts) { + var headers = $.extend({}, opts.headers || {}); + headers["Cache-Control"] = "no-cache"; + + var params = $.extend({}, opts); + params.type = "POST"; + params.data = JSON.stringify(data); + params.headers = headers; + + self.ajax(params); + }; + + self.delete = function(opts) { + var params = $.extend({}, opts); + params.type = "DELETE"; + + self.ajax(params); + }; + + self.get_json = function(opts) { + var params = $.extend({}, opts); + params.dataType = "json"; + + self.get(params); + }; + + self.post_json = function(opts) { + var data = opts.data || {}; + + var params = $.extend({}, opts); + params.contentType = "application/json; charset=UTF-8"; + params.dataType = "json"; + params.data = JSON.stringify(data); + + self.post(params); + }; + + return self; +})($);