diff --git a/www/scripts/apps/admin/tasks-manager/app.js b/www/scripts/apps/admin/tasks-manager/app.js index b2ddbbfab3..051f04972b 100644 --- a/www/scripts/apps/admin/tasks-manager/app.js +++ b/www/scripts/apps/admin/tasks-manager/app.js @@ -27,7 +27,6 @@ define([ $pingView : $(".ping-view", this.$scope), $refreshView : $(".refresh-view", this.$scope), eventAggregator: _.extend({}, Backbone.Events), - wsuri: "ws://dev.phrasea.net:9090/websockets", wstopic: "http://phraseanet.com/topics/admin/task-manager" }; @@ -57,18 +56,14 @@ define([ TaskManagerApp.tasksView.render(); TaskManagerApp.schedulerView.render(); - // Sets connection to the web socket - var ws = WSConnection.getInstance(TaskManagerApp.wsuri); - ws.connect(); - - ws.subscribe(TaskManagerApp.wstopic, function(topic, msg) { + WSConnection.subscribe(TaskManagerApp.wstopic, function(topic, msg) { // double encoded string var msg = JSON.parse(JSON.parse(msg)); - TaskManagerApp.eventAggregator.trigger("ws:"+msg.event, msg); + WSConnection.trigger("ws:"+msg.event, msg); }); // On ticks re-render ping view, update tasks & scheduler model - TaskManagerApp.eventAggregator.on("ws:manager-tick", function(response) { + WSConnection.on("ws:manager-tick", function(response) { TaskManagerApp.pingView.render(); TaskManagerApp.Scheduler.set({"actual": "started", "process-id": response.message.manager["process-id"]}); _.each(response.message.jobs, function(data, id) { diff --git a/www/scripts/common/websockets/connection.js b/www/scripts/common/websockets/connection.js index b270d6b58b..5e982a8e2e 100644 --- a/www/scripts/common/websockets/connection.js +++ b/www/scripts/common/websockets/connection.js @@ -2,70 +2,52 @@ define([ "underscore", "backbone" ], function (_, Backbone) { - var instance; + var activeSession = null; - function init(url) { - var activeSession = null; - - return _.extend({ - connect: function() { - if (this.hasSession()) { - return; - } - var $this = this; - // autobahn js is defined as a global object there is no way to load - // it as a UMD module - ab.connect(url, function (session) { - $this.setSession(session); - $this.trigger("ws:connect", activeSession); - }, - function (code, reason) { - $this.trigger("ws:session-gone", code, reason); + return _.extend({ + connect: function(url) { + if (this.hasSession()) { + throw "Connection is already active"; + } + var that = this; + // autobahn js is defined as a global object there is no way to load + // it as a UMD module + ab.connect(url, function (session) { + that.setSession(session); + that.trigger("ws:connect", activeSession); + }, + function (code, reason) { + that.trigger("ws:session-gone", code, reason); + }); + }, + close: function() { + if (false === this.hasSession()) { + return; + } + this.getSession().close(); + this.setSession(null); + this.trigger("ws:session-close"); + }, + hasSession: function() { + return this.getSession() !== null; + }, + subscribe: function(topic, callback) { + if (false === this.hasSession()) { + this.on("ws:connect", function(session) { + session.subscribe(topic, callback); + this.trigger("ws:session-subscribe", topic); }); - }, - close: function() { - if (false === this.hasSession()) { - return; - } - this.getSession().close(); - this.setSession(null); - this.trigger("ws:session-close"); - }, - hasSession: function() { - return this.getSession() !== null; - }, - getSession: function() { - return activeSession; - }, - setSession: function(session) { - activeSession = session; - }, - subscribe: function(topic, callback) { - if (false === this.hasSession()) { - this.on("ws:connect", function(session) { - session.subscribe(topic, callback); - }); - return; - } - this.getSession().subscribe(topic, callback); - this.trigger("ws:session-subscribe", topic); - }, - unsubscribe: function(topic, callback) { - if (false === this.hasSession()) { - return; - } - this.getSession().unsubscribe(topic, callback); - this.trigger("ws:session-unsubscribe", topic); + return; } - }, Backbone.Events); - } - - return { - getInstance: function(url) { - if (!instance) { - instance = init(url); + this.getSession().subscribe(topic, callback); + this.trigger("ws:session-subscribe", topic); + }, + unsubscribe: function(topic, callback) { + if (false === this.hasSession()) { + return; } - return instance; + this.getSession().unsubscribe(topic, callback); + this.trigger("ws:session-unsubscribe", topic); } - }; + }, Backbone.Events); }); diff --git a/www/scripts/tests/specs/websockets/connection.js b/www/scripts/tests/specs/websockets/connection.js index 7b326361a6..2c01148b2c 100644 --- a/www/scripts/tests/specs/websockets/connection.js +++ b/www/scripts/tests/specs/websockets/connection.js @@ -17,7 +17,7 @@ define([ this.session.subscribe = sinon.spy(); this.session.unsubscribe = sinon.spy(); - this.wsConnection = connection.getInstance(); + this.wsConnection = connection; var $this = this; var cbSuccess = function (session) { $this.wsConnection.setSession($this.session); @@ -29,6 +29,10 @@ define([ } }); + afterEach(function () { + this.wsConnection.close(); + }); + it("should have a session", function () { this.wsConnection.connect(); assert.ok(this.wsConnection.hasSession()); @@ -48,12 +52,15 @@ define([ }); it("should not connect anymore after first connect", function () { + var throws = false; this.wsConnection.connect(); - ab.connect = sinon.spy(); - this.wsConnection.connect(); - this.wsConnection.connect(); - this.wsConnection.connect(); - expect(ab.connect.should.have.callCount(0)).to.be.ok; + try { + this.wsConnection.connect(); + } catch (e) { + throws = true; + } + + assert.ok(throws); }); it("should call session subscribe once", function () {