127 lines
4.6 KiB
CoffeeScript
127 lines
4.6 KiB
CoffeeScript
#-------------------------------------------------------------------------------
|
|
# 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
|