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