Skip to content

Instantly share code, notes, and snippets.

@Voronchuk
Last active October 12, 2015 14:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Voronchuk/4040476 to your computer and use it in GitHub Desktop.
Save Voronchuk/4040476 to your computer and use it in GitHub Desktop.
Websocket mixins for ExtJS 4 MVC
# Facade to work with "Gimite web socket" library
#
# Copyright (coffee) 2009-2012 [Vyacheslav Voronchuk](mailto:voronchuk@gmail.com), [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 ';'
# Worker methods for store to load data from Websocket thread
#
# Copyright (coffee) 2009-2012 [Vyacheslav Voronchuk](mailto:voronchuk@gmail.com), [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