you may be right. Will check asap. Please open a ticket. On Wednesday, 15 July 2015 18:17:00 UTC-5, Samuel Sowah wrote: > > 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. > 1437002425.12:DISCONNECT from home > 1437002425.52:CONNECT to home > 1437002425.98:MESSAGE to home:$('#userStatus').prepend('<div>saso just > came online</div>').fadeIn('slow').slideDown('slow') > 1437002425.98: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.