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.

Reply via email to