I believe this is a bug. Please confirm what I'm thinking or correct me if I'm wrong. The web2py_websocket function in web2py.js takes 4 parameters (2 optional, onopen and onclose) web2py_websocket: function (url, onmessage, onopen, onclose) { if("WebSocket" in window) { var ws = new WebSocket(url); ws.onopen = onopen ? onopen : (function () {}); ws.onmessage = onmessage; ws.onclose = onclose ? onclose : (function () {}); return true; /* supported */ } else return false; /* not supported */ },
I used all 4 parameters but only 3 behave how I expect them except to. url, onmessage, and onopen. the url connects the client to the websocket, onmessage executes when a message is sent, onopen if specified executes when the socket is opened. I expect that onclose would execute if specified, when the socket is closed (client disconnects). for some reason, when the client disconnects, the function doesn't execute. I've already asked leading questions in other threads but I think this should sum up my exact problem. *default/home.html* <script> $(document).ready(function(){ var data; $.web2py.web2py_websocket('ws://127.0.0.1:8888/realtime/home', function(e){data=eval('('+e.data+')')}, function(){ajax('someone_online',[],'');}, function(){ajax('{{='someone_offline/%s' % auth.user.id}}',[],'');}); }); </script> *default.py* @auth.requires_login() def someone_online(): if not db(db.online_users.user_id==auth.user.id).select(): db.online_users.insert(user_id=auth.user.id) script2="""$('#userStatus').prepend('<div>%s just came online</div>').fadeIn('slow').slideDown('slow')""" % auth.user.full_name websocket_send('http://127.0.0.1:8888', script2, 'somekey', 'home') script1="""$('#usersOnline').html($('<span>%s</span>').fadeIn('slow').slideDown('slow'))""" % len(db().select(db.online_users.user_id)) websocket_send('http://127.0.0.1:8888', script1, 'somekey', 'home') @auth.requires_login() def someone_offline(): db(db.online_users.user_id==request.args(0)).delete() script2="""$('#userStatus').append('<div>%s just went offline</div>').fadeIn('slow').slideDown('slow')""" % db(db.auth_user.id==request.args(0)).select().first().full_name websocket_send('http://127.0.0.1:8888', script2, 'somekey', 'home') script1="""$('#usersOnline').html($('<span>%s</span>').fadeIn('slow').slideDown('slow'))""" % len(db().select(db.online_users.user_id)) websocket_send('http://127.0.0.1:8888', script1, 'somekey', 'home') Scenario for the code above. when someone opens home.html, the page will connect to the websocket server because of the ws:// url on the page. because the onopen parameter has been specified, that function would execute immediately after the connection is established, which is to call the someone_online method in default.py via ajax. the someone_online method then via websocket_send updates the page with the statement "<user> just came online". This so far works just as expected. 1436999804.04:CONNECT to home 1436999804.41:MESSAGE to home:$('#userStatus').prepend('<div>saso just came online</div>').fadeIn('slow').slideDown('slow') 1436999804.41:MESSAGE to home:$('#usersOnline').html($('<span>2</span>').fadeIn('slow').slideDown('slow')) The part that doesn't work is, when the page is closed, i expect that other people who have that same page opened will get the update "<user> just went offline". the onclose function doesn't seem to be executed at all, or at least it doesn't do what I'm expecting. For example, when i refresh the page, it disconnects and reconnects without sending the offline message. 1436999803.66:DISCONNECT from home 1436999804.04:CONNECT to home 1436999804.41:MESSAGE to home:$('#userStatus').prepend('<div>saso just came online</div>').fadeIn('slow').slideDown('slow') 1436999804.41:MESSAGE to home:$('#usersOnline').html($('<span>2</span>').fadeIn('slow').slideDown('slow')) What I have tried: I tried starting the websocket server with the token option -t. When this is in play, somehow due to unregistered tokens I believe, the connection opens and closes immediately due to this code in the websocket_messaging.py script. if DistributeHandler.tokens: if not self.token in tokens or not token[self.token] is None: self.close() else: tokens[self.token] = self When the connection closes because of this code above checking for tokens, the "onclose" function somehow executes 1436999086.05:CONNECT to home 1436999086.05:DISCONNECT from home 1436999086.57:MESSAGE to home:$('#userStatus').prepend('<div>saso just came online</div>').fadeIn('slow').slideDown('slow') 1436999086.6:MESSAGE to home:$('#usersOnline').html($('<span>2</span>').fadeIn('slow').slideDown('slow')) 1436999087.49:MESSAGE to home:$('#userStatus').append('<div>saso just went offline</div>').fadeIn('slow').slideDown('slow') 1436999087.49:MESSAGE to home:$('#usersOnline').html($('<span>1</span>').fadeIn('slow').slideDown('slow')) but because the disconnection has already happened, other tabs/clients/browsers that have opened the home.html page do not get updated. How can I get the onclose function to work as expected, or how do I achieve what I want properly? Please help. -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.