SandboXP
1"use strict";2
3var Bus = {};4
5/** @constructor */
6function BusConnector()7{
8this.listeners = {};9this.pair = undefined;10}
11
12/**
13* @param {string} name
14* @param {function(?)} fn
15* @param {Object} this_value
16*/
17BusConnector.prototype.register = function(name, fn, this_value)18{
19var listeners = this.listeners[name];20
21if(listeners === undefined)22{23listeners = this.listeners[name] = [];24}25
26listeners.push({27fn: fn,28this_value: this_value,29});30};31
32/**
33* Unregister one message with the given name and callback
34*
35* @param {string} name
36* @param {function()} fn
37*/
38BusConnector.prototype.unregister = function(name, fn)39{
40var listeners = this.listeners[name];41
42if(listeners === undefined)43{44return;45}46
47this.listeners[name] = listeners.filter(function(l)48{49return l.fn !== fn;50});51};52
53/**
54* Send ("emit") a message
55*
56* @param {string} name
57* @param {*=} value
58* @param {*=} unused_transfer
59*/
60BusConnector.prototype.send = function(name, value, unused_transfer)61{
62if(!this.pair)63{64return;65}66
67var listeners = this.pair.listeners[name];68
69if(listeners === undefined)70{71return;72}73
74for(var i = 0; i < listeners.length; i++)75{76var listener = listeners[i];77listener.fn.call(listener.this_value, value);78}79};80
81/**
82* Send a message, guaranteeing that it is received asynchronously
83*
84* @param {string} name
85* @param {Object=} value
86*/
87BusConnector.prototype.send_async = function(name, value)88{
89dbg_assert(arguments.length === 1 || arguments.length === 2);90
91setTimeout(this.send.bind(this, name, value), 0);92};93
94Bus.create = function()95{
96var c0 = new BusConnector();97var c1 = new BusConnector();98
99c0.pair = c1;100c1.pair = c0;101
102return [c0, c1];103};104
105