bus.js 1.8 KB

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