Last active
October 12, 2015 14:28
-
-
Save Voronchuk/4040476 to your computer and use it in GitHub Desktop.
Websocket mixins for ExtJS 4 MVC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Facade to work with "Gimite web socket" library | |
# | |
# Copyright (coffee) 2009-2012 [Vyacheslav Voronchuk](mailto:[email protected]), [Web management software](http://wm-software.com) | |
# License: see project's LICENSE file | |
# Date: 08.08.12 | |
Ext.define 'SSP.view.mixin.Websockets' | |
# Websocket thread object | |
# * __var__ - WebSocket | |
ws: null | |
# Storage for Websocket listeners | |
# * __var__ - object | |
wsListeners: {} | |
# Connection params | |
# * __var__ object | |
conParams: {} | |
# Object factory for Websocket threads | |
# * __url__ - URL to connect | |
# * __port__ - port to connect | |
connect: (url, port) -> | |
# Connect and save settings | |
@ws = new WebSocket "ws://#{url}:#{port}/" | |
@conParams = { | |
url | |
port | |
} | |
# Install listener | |
self = @ | |
@ws.addEventListener 'message', | |
(event) -> | |
self.listen.call self, event | |
false | |
# Install error handler | |
@ws.addEventListener 'close', | |
(event) -> | |
if event.reason is "UserAuth failed: No free agents !" | |
SSP.app.getController('Chatbox').onClose() | |
else | |
self.onClose.call self, event | |
@ws.addEventListener 'error', (event) -> self.onClose.call self, event | |
@ws | |
# Handle Websocket responses from server | |
# * __event__ - websocket message event | |
listen: (event) -> | |
# Skip junk response | |
unless event.data then return | |
# Decode response | |
response = Ext.JSON.decode event.data | |
# Error handling | |
if SSP.app.status | |
unless response then SSP.app.status 'No response' | |
unless response.notify | |
if !response.result or response.reason or response.error | |
SSP.app.status(unless response.reason or response.error then 'Unknown error' else response.reason ? response.error) | |
# Proccess callback | |
if response.namespace then response.action = response.action + @getKeyFromOptions response.namespace | |
console.log 'Resp: ', response.action, response | |
Ext.getCmp('Connection')?.getEl()?.removeCls('send').addCls('recieve') | |
if @wsListeners[response.action] | |
@wsListeners[response.action].callback.call @wsListeners[response.action].scope, | |
response | |
@wsListeners[response.action].params ?= null | |
# Delegator for Websocket handlers | |
# * __eventname__ - name of action | |
# * __callback__ - callback function | |
# * __scope__ - scope in which callback will be called | |
# * __params__ - additional params | |
# * __namespace__ - (optional) options for namespaced events | |
addWsl: (eventname, callback, scope, params, namespace) -> | |
if namespace then eventname = @getKeyFromOptions namespace | |
@wsListeners[eventname] = | |
callback: callback | |
scope: scope ? @ | |
params: params ? null | |
# Websocket query | |
# * __data__ - transition data | |
# * __object__ - websocket instance | |
post: (obj) -> | |
console.log 'Req: ', obj.action, obj | |
Ext.getCmp('Connection')?.getEl()?.removeCls('recieve').addCls('send') | |
@ws.send Ext.JSON.encode obj | |
# Close Websocket thread | |
close: -> | |
@ws.close() | |
@onClose.call() | |
# Reconnect thread if closed | |
# * __event__ | |
onClose: (event) -> | |
# Clear auth information | |
SSP.auth = null | |
# Show error | |
if event?.reason?.length | |
Ext.Msg.alert 'Error', event.reason | |
if Ext.getCmp 'Login' then Ext.getCmp('Login').setLoading false | |
# Login timeout | |
else if Ext.getCmp 'Login' | |
if SSP.ws.ws.readyState == 1 or SSP.ws.ws.readyState == 3 then return | |
Ext.Msg.alert('Error', 'Can\'t connect!', (status) -> if status == 'ok' then SSP.app.getController('Auth').loginForm()).msgButtons[0].setText('Try once more') | |
Ext.getCmp('Login').setLoading false | |
# Close | |
SSP.ws.ws.ignore = true | |
if SSP.closed then return | |
# Go to login screen on critical error | |
if Ext.getCmp 'Business' | |
Ext.Msg.alert 'Error', | |
if event?.reason?.length then event?.reason else 'Connection was lost, press Ok to reconnect.' | |
-> document.location.reload() | |
# Create key string from passed options | |
# * __namespace__ - namespace keys | |
getKeyFromOptions: (namespace) -> | |
options = [] | |
options.push("#{key}:#{value}") for key, value of namespace | |
options.join ';' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Worker methods for store to load data from Websocket thread | |
# | |
# Copyright (coffee) 2009-2012 [Vyacheslav Voronchuk](mailto:[email protected]), [Web management software](http://wm-software.com) | |
# License: see project's LICENSE file | |
# Date: 08.08.12 | |
Ext.define 'SSP.view.mixin.WebsocketStorage' | |
# Last load settings | |
# * __object__ | |
storedOptions: {} | |
# Custom loader for websocket data | |
# * __parent__ - parent user for with children are loaded | |
loadByWs: (params, callback, scope, data) -> | |
# Save settings for reload | |
@storedOptions = { | |
params | |
callback | |
scope | |
data | |
} | |
# Bind callback if needed | |
if callback | |
SSP.ws.addWsl params.action, callback, scope ? @, data | |
SSP.ws.post params | |
# Reload store data by settings of previous call | |
reloadByWs: -> @loadByWs @storedOptions.params, @storedOptions.callback, @storedOptions.scope, @storedOptions.data |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment