2014-11-25 15:51:45 +00:00

99 lines
2.5 KiB
CoffeeScript

_ = require "underscore"
Connector = require '../connector'
#
# A trivial Connector that simulates network delay.
#
class TestConnector extends Connector
#
# @param id {String} Some unique id
# @param user_connectors {Array<TestConnector>} List of TestConnectors instances
#
constructor: (@id)->
super()
# If you think of operations, this will mirror the
# execiton order of operations (when a message is send, or received it is put into this)
@execution_order = []
# The messages are buffered under the name of teh sending user.
@receive_buffer = {}
@connections = {}
@whenReceiving (user, message)=>
@execution_order.push message
@is_synced = true
# join another user connector
join: (conn)->
@_addConnection conn.id, conn
for cid,c of conn.connections
@_addConnection cid, c
for comp in @compute_when_synced
comp[0].apply @, comp[1..]
#
# @private
# This is a helper function that is only related to the peerjs connector.
# Connect to another peer.
_addConnection: (id, user_connector)->
if not @connections[id]? and id isnt @id
data = null
user_data = null
for i in [0...@sync_process_order.length]
data_ = @sync_process_order[i].call @, user_data
user_data = user_connector.sync_process_order[i].call user_connector, data
data = data_
@connections[id]=user_connector
user_connector.connections[@id] = @
#
# Get the ops in the execution order.
#
getOpsInExecutionOrder: ()->
@execution_order
#
# Send a message to another peer
# @param {Operation} o The operation that was executed.
#
_send: (uid, message)->
rb = @connections[uid].receive_buffer
rb[@id] ?= []
rb[@id].push message
#
# Flush one operation from the line of a specific user.
#
flushOne: (uid)->
if @receive_buffer[uid]?.length > 0
message = @receive_buffer[uid].shift()
for f in @receive_handlers
f uid, message
#
# Flush one operation on a random line.
#
flushOneRandom: ()->
connlist = for cid,c of @receive_buffer
cid
@flushOne connlist[(_.random 0, (connlist.length-1))]
#
# Flush all operations on every line.
#
flushAll: ()->
for n,messages of @receive_buffer
for message in messages
for f in @receive_handlers
f n, message
@receive_buffer = {}
if window?
window.TestConnector = TestConnector
if module?
module.exports = TestConnector