On Wednesday, July 15, 2015 at 11:46:38 PM UTC, Massimo Di Pierro wrote:
>
> you may be right. Will check asap. Please open a ticket.
>
> I've never opened a ticket, where and how do I do that?
 

> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to