Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ConnectionTriggerCollection extends Std
- [$this, self] = [@::$this, @::self]
- @::private
- iterator: 0
- prefix: 'Resource#'
- constructor: ->
- @callbacks = []
- flushIterator: ->
- $this.iterator = 0
- push: (cb) ->
- id = $this.prefix + (++$this.iterator)
- @callbacks[id] = cb
- return {
- id: id,
- status: true
- remove: =>
- @remove(id)
- @status = false
- }
- call: (args) ->
- @callbacks[i](args) for i of @callbacks
- remove: (id) ->
- if typeof @callbacks[id] is "function"
- delete @callbacks[id]
- return true
- throw new Exception("Can not find trigger #{id}")
- return false
- window.ConnectionTriggerCollection = ConnectionTriggerCollection
- ###
- Класс соединения с сервером
- ###
- class Connection
- # Время реконнекта при обрыве соединения
- @RECONNECT_TIMEOUT = if App.config.develop then 1 else 60000
- # Отображать ли логи сокета
- @SHOW_LOGS = true
- ###
- Сообщения логов
- @string: Logs
- ###
- @LOG_CREATE = 'Создание соединения:'
- @LOG_OPEN = 'Выполнено подключение к сокету.'
- @LOG_CLOSE = 'Отклюение сокета.'
- @LOG_ERROR = 'Сервер не отвечает.'
- @LOG_RECONNECT = 'Переподключение к серверу после ' + @RECONNECT_TIMEOUT + ' миллисекунд.'
- @LOG_INPUT_MESSAGE = 'Ответ сокета:'
- @LOG_OUTPUT_MESSAGE = 'Отправка сообщения:'
- @LOG_SET_TIMEOUT = 'Смена таймаута переподключения к серверу: '
- ###
- Ошибки
- ###
- @ERR_MESSAGE_SEND = 'Невозможно отправить сообщение. Нет подключения к серверу.'
- @ERR_SOCKET_CLOSE = 'Невозможно закрыть соединение. Соединение отсутствует.'
- ###
- Статусы сокета
- @string: Status
- ###
- @STATUS_CLOSED = 'STATUS_CLOSED'
- @STATUS_CONNECTED = 'STATUS_CONNECTED'
- ###
- Создание нового соединения
- @string host: Адрес соединения
- @string id: Идентификатор соединения
- @return object Connection
- ###
- constructor: (host, id = undefined) ->
- # Кодировать ли данные сокета
- @encode = true
- #
- # ID соединения
- @id = if id is undefined then id = Utils.uniqueId('', 4) else id
- # Хост (адрес) соединения
- @host = host
- # Объект соединения
- @channel = {}
- # Триггеры
- @triggers =
- onopen: new ConnectionTriggerCollection # открытие
- onclose: new ConnectionTriggerCollection # закрытие
- onmessage: new ConnectionTriggerCollection # входящее сообщение
- onreconnect: new ConnectionTriggerCollection
- # Одноразовые триггеры (срабатывают один раз)
- @onceTriggers =
- onopen: [] # открытие
- onclose: [] # закрытие
- onmessage:[] # входящее сообщение
- onreconnect: []
- # Текущий статус соединения
- @status = Connection.STATUS_CLOSED
- setReconnectTimeout: (time) ->
- @log(Connection.LOG_SET_TIMEOUT, time)
- Connection.RECONNECT_TIMEOUT = time
- ###
- Подключение к серверу
- @callable cb: Коллбек на откртие
- ###
- connect: (cb = (->))->
- @log(Connection.LOG_CREATE, @host)
- delete @channel
- @channel = new WebSocket(@host)
- @channel.onopen = (event) =>
- @log(Connection.LOG_OPEN, event)
- @status = Connection.STATUS_CONNECTED
- cb()
- @triggers.onopen.call event
- @onceTriggers.onopen.each (foo) -> foo(event)
- @onceTriggers.onopen = []
- @channel.onmessage = (event) =>
- message = if @encode then Utils.decodeData(event.data.replace(/\n/g, '')) else event.data
- @log(Connection.LOG_INPUT_MESSAGE, message)
- @triggers.onmessage.call message
- @onceTriggers.onmessage.each (foo) -> foo(message)
- @onceTriggers.onmessage = []
- @channel.onclose = (event) =>
- @log(Connection.LOG_CLOSE, event)
- @status = Connection.STATUS_CLOSED
- @triggers.onclose.call event
- @onceTriggers.onclose.each (foo) -> foo(event)
- @onceTriggers.onclose = []
- # RECONNECT
- @log(Connection.LOG_RECONNECT, @host)
- if @reconnectTimeout then clearTimeout(@reconnectTimeout)
- @reconnectTimeout = setTimeout =>
- delete @reconnectTimeout
- @reconnect(event)
- , Connection.RECONNECT_TIMEOUT
- ###
- Переподключение соединения
- @return $this
- ###
- reconnect: (event) ->
- if @status is Connection.STATUS_CONNECTED
- @channel.close()
- else
- @connect()
- @waitOpen =>
- @triggers.onreconnect.call event
- @onceTriggers.onreconnect.each (foo) -> foo(event)
- @onceTriggers.onreconnect = []
- return @
- ###
- Добавление триггера на открытие соединения
- @callable trigger: Коллбэк
- @return $this
- ###
- onopen: (trigger) ->
- return @triggers.onopen.push trigger
- # @alias onopen: Срабатывает только один раз
- waitOpen: (trigger) ->
- @onceTriggers.onopen.push trigger
- return @
- ###
- Добавление триггера на переподключение соединения
- @callable trigger: Коллбэк
- @return $this
- ###
- onreconnect: (trigger) ->
- return @triggers.onreconnect.push trigger
- # @alias onopen: Срабатывает только один раз
- waitReconnect: (trigger) ->
- @onceTriggers.onreconnect.push trigger
- return @
- ###
- Добавление триггера на закрытие соединения
- @callable trigger: Коллбэк
- @return $this
- ###
- onclose: (trigger) ->
- return @triggers.onclose.push trigger
- # @alias onclose: Срабатывает один раз
- waitClose: (trigger) ->
- @onceTriggers.onclose.push trigger
- return @
- ###
- Добавление триггера на входящие сообщения
- @callable trigger: Коллбэк
- @return $this
- ###
- onmessage: (trigger) ->
- return @triggers.onmessage.push trigger
- # @alias onmessage: Срабатывает один раз
- waitMessage: (trigger) ->
- @onceTriggers.onmessage.push trigger
- return @
- ###
- Отправка сообщения в открытый сокет
- @string || @object message: Данные для отправки
- @return $this
- ###
- send: (message, encode = @encode) ->
- if @status is Connection.STATUS_CONNECTED
- @log(Connection.LOG_OUTPUT_MESSAGE, message)
- if encode then message = Utils.encodeData(message)
- @channel.send message
- else
- @log(Connection.ERR_MESSAGE_SEND, "status: #{@status}")
- return @
- ###
- Закрытие соединения
- @return $this
- ###
- close: ->
- if @status is Connection.STATUS_CONNECTED
- @channel.close()
- else
- @log(Connection.ERR_SOCKET_CLOSE, "status: #{@status}")
- return @
- ###
- Логгирование сокета
- @string logName: Сообщение лога
- @mixed data: Данные описания лога
- ###
- log: (logName, data) =>
- if Connection.SHOW_LOGS then p "WebSocket [#{@id}]: #{logName}", data
- class Server
- constructor: ->
- @corruption = new Connection(App.config.websocket, 'Corruption')
- @chat = new Connection(App.config.chatWebsocket, 'Chat')
- ###
- Методы соединения с сокетом
- добавляем в объект сервера
- ###
- onopen: (trigger) -> @corruption.onopen trigger
- onclose: (trigger) -> @corruption.onclose trigger
- onmessage: (trigger) -> @corruption.onmessage trigger
- close: -> @corruption.close()
- send: (message) -> @corruption.send message
- ###
- Отправка get запроса на сервер
- @string path: Путь
- @object data: Данные
- @callable cb: Коллбек
- @return $this
- ###
- get: (path = '', data = {}, cb = (->), fail = (->)) ->
- p 'GET: ', path
- $.get(App.config.url + '/' + path + '?cache=' + Utils.uniqueId(), data, (j) ->
- cb(Server.alaxDecorate(path, j))
- ).fail => fail()
- return @
- ###
- Отправка post запроса на сервер
- @string path: Путь
- @object data: Данные
- @callable cb: Коллбек
- @return $this
- ###
- post: (path = '', data = {}, cb = (->), fail = (->)) ->
- p 'POST: ', path
- $.post(App.config.url + '/' + path + '?cache=' + Utils.uniqueId(), data, (j) ->
- cb(Server.alaxDecorate(path, j))
- ).fail => fail()
- return @
- ###
- Отправка put запроса на сервер
- @string path: Путь
- @object data: Данные
- @callable cb: Коллбек
- @return $this
- ###
- put: (path = '', data = {}, cb = (->), fail = (->)) ->
- p 'PUT: ', path
- $.ajax(
- url: App.config.url + '/' + path
- type: 'PUT'
- cache: false
- data: data
- success: (response) =>
- cb(response)
- ).fail => fail()
- return @
- ###
- * Преобразование json строки в объект при ошибке хедеров сервера
- * Установка стандартных значений для запросов, возвращаюх ошибку доступа
- @string name: Название json файла
- @object data:
- ###
- @alaxDecorate: (name, data) ->
- data = if typeof data is 'object' then data else JSON.parse(data)
- if data.status && data.message && data.status is "failed"
- switch name
- when "account.json"
- return {}
- when "account/properties.json"
- return {blocks:{},buildings:[],expenses:0,items:{},missions:{},perks:{}}
- when "blocks.json"
- return {blocks:[]}
- when "collisions.json"
- return {targets:[]}
- when "chains/members.json"
- return {followers:[],followings:[]}
- when "hitlists.json"
- return {targets:[]}
- when "perks/shop.json"
- return {perks:[], talants_price:[]}
- when "perks.json"
- return {achievements:[],avaliable_slots:0,discounts:{items:0,buildings:0},fake_friends:0,purchased:[]}
- when "activities.json"
- return {}
- else throw new Error('Необработанный json ответ сервера')
- console.log("JSON Error: Для " + name + " вернулся ответ ошибки доступа")
- else
- return data
- window.Server = Server
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement