blob: d55bb0130179e4b0e6c3f62d19ef99a92fa6e7e9 [file] [log] [blame]
#-------------------------------------------------------------------------------
# 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'
serviceManager = require './serviceManager'
WeinreClientEvents = null
WeinreTargetEvents = null
channelManager = null
#-------------------------------------------------------------------------------
utils.registerClass class ChannelManager
#---------------------------------------------------------------------------
constructor: () ->
@channels = {}
#---------------------------------------------------------------------------
initialize: ->
WeinreClientEvents = serviceManager.get 'WeinreClientEvents'
WeinreTargetEvents = serviceManager.get 'WeinreTargetEvents'
if !WeinreClientEvents
utils.exit 'WeinreClientEvents service not registered'
if !WeinreTargetEvents
utils.exit 'WeinreTargetEvents service not registered'
#---------------------------------------------------------------------------
created: (channel) ->
@channels[channel.name] = channel
#---------------------------------------------------------------------------
destroyed: (channel) ->
if channel.isClient
for connection in channel.connections
@disconnectChannels(channel, connection)
else
for connection in channel.connections
@disconnectChannels(connection, channel)
clients = @getClientChannels(channel.id)
if channel.isClient
WeinreClientEvents.clientUnregistered(clients, channel.name)
else
WeinreClientEvents.targetUnregistered(clients, channel.name)
delete @channels[channel.name]
#---------------------------------------------------------------------------
getChannel: (name, remoteAddress) ->
return null if !_.has(@channels, name)
channel = @channels[name]
return null if !channel
# if remoteAddress
# return null if channel.remoteAddress != remoteAddress
channel
#---------------------------------------------------------------------------
connectChannels: (client, target) ->
return if client.isClosed or target.isClosed
if client.connections.length
@disconnectChannels(client, client.connections[0])
client.connections.push target
target.connections.push client
clients = @getClientChannels(client.id)
WeinreClientEvents.connectionCreated(clients, client.name, target.name)
WeinreTargetEvents.connectionCreated(target, client.name, target.name)
#---------------------------------------------------------------------------
disconnectChannels: (client, target) ->
clients = @getClientChannels(client.id)
WeinreClientEvents.connectionDestroyed(clients, client.name, target.name)
WeinreTargetEvents.connectionDestroyed(target, client.name, target.name)
client.connections = _.without(client.connections, target)
target.connections = _.without(target.connections, client)
#---------------------------------------------------------------------------
getChannels: (id) ->
if id?
_.filter(@channels, (item) -> item.id == id)
else
_.values(@channels)
#---------------------------------------------------------------------------
getClientChannels: (id) ->
_.filter(@channels, (item) -> item.isClient && item.id == id)
#---------------------------------------------------------------------------
getTargetChannels: (id) ->
_.filter(@channels, (item) -> item.isTarget && item.id == id)
#-------------------------------------------------------------------------------
module.exports = new ChannelManager