| #------------------------------------------------------------------------------- |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| #------------------------------------------------------------------------------- |
| |
| _ = require 'underscore' |
| |
| utils = require './utils' |
| channelManager = require './channelManager' |
| messageHandler = require './messageHandler' |
| MessageQueue = require './MessageQueue' |
| |
| AnonymousId = 'anonymous' |
| |
| #------------------------------------------------------------------------------- |
| module.exports = utils.registerClass class Channel |
| |
| #--------------------------------------------------------------------------- |
| constructor: (@pathPrefix, @id, @remoteAddress, @isClient) -> |
| prefix = if @isClient then 'c-' else 't-' |
| @name = "#{prefix}#{utils.getNextSequenceNumber()}" |
| @messageQueue = new MessageQueue |
| @isClosed = false |
| @connections = [] |
| @isTarget = !@isClient |
| @readTimeout = utils.options.readTimeout * 1000 |
| |
| @id = AnonymousId if !@id |
| |
| @description = |
| channel: @name |
| id: @id |
| hostName: @remoteAddress |
| remoteAddress: @remoteAddress |
| |
| @updateLastRead() |
| |
| channelManager.created @ |
| |
| #--------------------------------------------------------------------------- |
| close: () -> |
| return if @isClosed |
| |
| channelManager.destroyed @ |
| |
| @isClosed = true |
| @messageQueue.shutdown() |
| |
| #--------------------------------------------------------------------------- |
| sendCallback: (intfName, callbackId, args...) -> |
| return if !callbackId |
| |
| args.unshift callbackId |
| |
| @sendMessage intfName, 'sendCallback', args... |
| |
| #--------------------------------------------------------------------------- |
| sendMessage: (intfName, method, args...) -> |
| |
| message = genJSON |
| interface: intfName |
| method: method |
| args: args |
| |
| @messageQueue.push message |
| |
| #--------------------------------------------------------------------------- |
| handleMessages: (messages) -> |
| |
| for message in messages |
| message = parseJSON(message) |
| continue if !message |
| |
| messageHandler.handleMessage @, message |
| |
| #--------------------------------------------------------------------------- |
| getMessages: (callback) -> |
| @updateLastRead() |
| return callback.call(null, null) if @isClosed |
| |
| @messageQueue.pullAll @readTimeout, callback |
| |
| #--------------------------------------------------------------------------- |
| updateLastRead: () -> |
| @lastRead = (new Date).valueOf() |
| |
| #--------------------------------------------------------------------------- |
| toString: () -> |
| connections = _.map(@connections, (val) -> val.name).join(',') |
| "Channel(#{@name}, closed:#{@isClosed}, connections:[#{connections}])" |
| |
| #------------------------------------------------------------------------------- |
| parseJSON = (message) -> |
| try |
| return JSON.parse(message) |
| catch e |
| return null |
| |
| #------------------------------------------------------------------------------- |
| genJSON = (message) -> |
| try |
| return JSON.stringify(message) |
| catch e |
| return null |