WebsocketRpc dispose() update; client disconnect fix
authorDarren <darren@darrenwhitlen.com>
Tue, 27 Aug 2013 20:04:55 +0000 (21:04 +0100)
committerDarren <darren@darrenwhitlen.com>
Sun, 1 Sep 2013 13:18:19 +0000 (14:18 +0100)
client/assets/libs/websocketrpc.js
server/client.js
server/httphandler.js
server/weblistener.js
server/websocketrpc.js

index 11d0c0706a30b9a2f51a9c12542f99643191eb22..e0a49f03c1a8706e88eddb9870ed3352d89beb83 100644 (file)
@@ -9,9 +9,6 @@ function WebsocketRpc(eio_socket) {
     this._callbacks = {};
     this._socket = eio_socket;
 
-    this._root_namespace = this;
-    this._namespaces = new Object(null);
-
     this._mixinEmitter();
     this._bindSocketListeners();
 }
@@ -31,20 +28,14 @@ WebsocketRpc.prototype._bindSocketListeners = function() {
 
 WebsocketRpc.prototype.dispose = function() {
     if (this._onMessageProxy) {
-        this._socket.off('message', this._onMessageProxy);
+        this._socket.removeListener('message', this._onMessageProxy);
         delete this._onMessageProxy;
     }
 
-    this.disposeNamespaces();
+    this.removeAllListeners();
 };
 
 
-WebsocketRpc.prototype.disposeNamespaces = function() {
-    for (var namespace in this._namespaces) {
-        this._namespaces[namespace].dispose();
-        this._namespaces[namespace] = null;
-    }
-};
 
 
 /**
@@ -78,21 +69,6 @@ WebsocketRpc.prototype._isResponse = function(packet) {
 
 
 
-WebsocketRpc.prototype.namespace = function(namespace) {
-    // Does this namespace already exist?
-    if (this._namespaces[namespace]) {
-        return this._namespaces[namespace];
-    }
-
-    var ns = new WebsocketRpcNamespace(this, namespace);
-    ns._root_namespace = this._root_namespace;
-console.log('Created namespace', namespace);
-    this._namespaces[namespace] = ns;
-
-    return ns;
-};
-
-
 /**
  * Make an RPC call
  * First argument must be the method name to call
@@ -173,89 +149,14 @@ WebsocketRpc.prototype._onMessage = function(message_raw) {
         } else {
             returnFn = function noop(){};
         }
-console.log(packet.method);
-        this.emit.apply(this, [packet.method, returnFn].concat(packet.params));
 
-        // Forward the call on to any matching namespaces
-        this._forwardCall(packet, returnFn);
-    }
-};
-
-
-/**
- * Take a call and forward it on to any matching namespaces
- */
-WebsocketRpc.prototype._forwardCall = function(packet, returnFn) {
-    var ns;
-
-    for (var namespace in this._namespaces) {
-        ns = this._namespaces[namespace];
-
-        // If the method name is in this namespace, strip the namespace string off
-        // and emit the remaining method on the namespace object
-        // (namespace.api.method_name() becomes method_name())
-        if (packet.method.indexOf(namespace) === 0) {
-            ns.emit.apply(ns, [packet.method.replace(namespace + '.', ''), returnFn].concat(packet.params));
-            ns._forwardCall(packet, returnFn);
-        }
+        this.emit.apply(this, [packet.method, returnFn].concat(packet.params));
     }
 };
 
 
 
 
-
-function WebsocketRpcNamespace(parent_rpc, new_namespace) {
-    var self = this,
-        to_bind, i;
-
-    this._namespaces = new Object(null);
-
-    this._parent = parent_rpc;
-    this._namespace = new_namespace;
-
-    if (this._namespace.substr(-1) !== '.')
-        this._namespace += '.';
-
-    // Proxy these functions from _parent, appending our namespace in the first argument
-    to_bind = ['namespace', 'on', 'once', 'off', 'removeListener', 'removeAllListeners', 'emit', 'listeners', 'hasListeners'];
-    for (i=0; i<to_bind.length; i++)
-        this.bindFnOverride(to_bind[i], true);
-
-    this.bindFnOverride('call', false, this._parent);
-
-    // Proxy these functions from _parent
-    to_bind = ['disposeNamespaces', '_forwardCall'];
-    for (i=0; i<to_bind.length; i++)
-        this[to_bind[i]] = this._parent[to_bind[i]];
-}
-
-
-WebsocketRpcNamespace.prototype.bindFnOverride = function(fn_name, append_first_arg, context) {
-    var self = this;
-
-    this[fn_name] = function appendNamespaceFnOverrideBound() {
-        var args;
-
-        if (append_first_arg) {
-            args = Array.prototype.slice.call(arguments, 0, arguments.length);
-            args[0] = self._namespace + args[0];
-        }
-
-        return self._parent[fn_name].apply(context || self, args || arguments);
-    };
-};
-
-
-WebsocketRpcNamespace.prototype.dispose = function() {
-    this.disposeNamespaces();
-    this.call = this.on = this.off = this.namespace = this.disposeNamespaces = null;
-    this._parent = null;
-    this.off();
-};
-
-
-
 // If running a node module, set the exports
 if (typeof module === 'object' && typeof module.exports !== 'undefined') {
     module.exports = WebsocketRpc;
index 707ca54052936cd98a69c23ce16218118df7a24c..d2d76f05c3d0968f926b7920153f9af9235ab398 100755 (executable)
@@ -72,6 +72,7 @@ Client.prototype.sendKiwiCommand = function (command, data, callback) {
 
 Client.prototype.dispose = function () {
     this.disposed = true;
+    this.rpc.dispose();
     this.emit('dispose');
     this.removeAllListeners();
 };
index 9e83ccc07814674216f7728a24218a0044d88a63..f04dca945b9242bb6e176a32fa6deecc1e970bc5 100644 (file)
@@ -51,7 +51,6 @@ HttpHandler.prototype.serve = function (request, response) {
 
     // Any asset request to head into the asset dir
     request.url = request.url.replace(base_path + '/assets/', '/assets/');
-console.log('request url:', request.url);
 
     // Any requests for /client to load the index file
     if (request.url.match(new RegExp('^' + base_path_regex + '([/$]|$)', 'i'))) {
index ed307474a72b05015f6c9b55c74d7aed4ee74156..f3af63d05fecae7bd1fa9346c9c5a1bc797bdd0d 100644 (file)
@@ -26,7 +26,7 @@ rehash.on('rehashed', function (files) {
 var http_handler;
 
 
-var WebListener = function (web_config, transports) {
+var WebListener = module.exports = function (web_config, transports) {
     var hs, opts, ws_opts,
         that = this;
 
@@ -82,15 +82,8 @@ var WebListener = function (web_config, transports) {
         transports: ['websocket', 'polling', 'flashsocket'],
         path: (global.config.http_base_path || '') + '/transport'
     });
-    console.log((global.config.http_base_path || '') + '/transport');
-
-    //this.ws.enable('browser client minification');
-    //this.ws.enable('browser client etag');
-    //this.ws.set('transports', transports);
-    //this.ws.set('resource', (global.config.http_base_path || '') + '/transport');
 
     this.ws.on('connection', function(socket) {
-        console.log('Connection!');
         initialiseSocket(socket, function(err, authorised) {
             var client;
 
@@ -113,12 +106,7 @@ util.inherits(WebListener, events.EventEmitter);
 
 
 function handleHttpRequest(request, response) {
-    var uri = url.parse(request.url, true);
-
-    // If this isn't a socket.io request, pass it onto the http handler
-    if (uri.pathname.substr(0, 10) !== '/socket.io') {
-        http_handler.serve(request, response);
-    }
+    http_handler.serve(request, response);
 }
 
 function rangeCheck(addr, range) {
@@ -185,9 +173,3 @@ function initialiseSocket(socket, callback) {
         callback(null, true);
     }
 }
-
-
-
-
-
-module.exports = WebListener;
index 1fc58153de976646cfb4d982d06c18a3cc753a47..e0a49f03c1a8706e88eddb9870ed3352d89beb83 100644 (file)
@@ -28,9 +28,11 @@ WebsocketRpc.prototype._bindSocketListeners = function() {
 
 WebsocketRpc.prototype.dispose = function() {
     if (this._onMessageProxy) {
-        this._socket.off('message', this._onMessageProxy);
+        this._socket.removeListener('message', this._onMessageProxy);
         delete this._onMessageProxy;
     }
+
+    this.removeAllListeners();
 };