hjs-message
Version:
Messaging API
174 lines (160 loc) • 5.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MessageBroadcaster = exports.Registration = undefined;
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _message = require("./message");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Registration = exports.Registration = function Registration() {
(0, _classCallCheck3.default)(this, Registration);
this.targets = [];
this.targetWhats = [];
this.targetWhats = null;
this.senderWhat = 0;
this.targets = null;
this.next = null;
this.prev = null;
}; /** @babel */
var INSTANCE = null;
var MessageBroadcaster = exports.MessageBroadcaster = function () {
function MessageBroadcaster() {
(0, _classCallCheck3.default)(this, MessageBroadcaster);
this.mReg = null;
}
(0, _createClass3.default)(MessageBroadcaster, [{
key: "dumpRegistrations",
value: function dumpRegistrations() {
var start = this.mReg;
console.log("MessageBroadcaster " + this + " {");
if (start !== null) {
var r = start;
var s = "";
var n = 0;
do {
s += " senderWhat=" + r.senderWhat;
n = r.targets.length;
for (var i = 0; i < n; i++) {
s += " [" + r.targetWhats[i] + "] " + r.targets[i] + "/n";
}
r = r.next;
} while (r !== start);
s += "}";
console.log(s);
}
}
}, {
key: "publish",
value: function publish(msg) {
if (this.mReg === null) {
return;
}
var senderWhat = msg.what;
var start = this.mReg;
var r = start;
do {
if (r.senderWhat >= senderWhat) {
break;
}
r = r.next;
} while (r !== start);
if (r.senderWhat === senderWhat) {
var targets = r.targets;
var whats = r.targetWhats;
var n = targets.length;
var t = null;
var m = null;
for (var i = 0; i < n; i++) {
t = targets[i];
m = _message.Message.obtain();
m.copyFrom(msg);
m.what = whats[i];
t.sendMessage(m);
}
}
}
}, {
key: "subscribe",
value: function subscribe(senderWhat, handler, targetWhat) {
var r = null;
if (!this.mReg) {
r = new Registration();
r.senderWhat = senderWhat;
r.targets = [handler];
r.targetWhats = [targetWhat];
this.mReg = r;
r.next = r;
r.prev = r;
} else {
var start = this.mReg;
var n = 0;
r = start;
do {
if (r.senderWhat >= senderWhat) {
break;
}
r = r.next;
} while (r !== start);
if (r.senderWhat !== senderWhat) {
var reg = new Registration();
reg.senderWhat = senderWhat;
reg.targets = new Array(1);
reg.targetWhats = new Array(1);
reg.next = r;
reg.prev = r.prev;
r.prev.next = reg;
r.prev = reg;
if (r === this.mReg && r.senderWhat > reg.senderWhat) {
this.mReg = reg;
}
r = reg;
} else {
n = r.targets.length - 1;
}
r.targets[n] = handler;
r.targetWhats[n] = targetWhat;
}
}
}, {
key: "unsubscribe",
value: function unsubscribe(senderWhat, handler, targetWhat) {
var start = this.mReg;
var r = start;
if (this.mReg === null) {
return;
}
do {
if (r.senderWhat >= senderWhat) {
break;
}
r = r.next;
} while (r !== start);
if (r.senderWhat === senderWhat) {
var targets = r.targets;
var whats = r.targetWhats;
var oldLen = targets.length;
for (var i = 0; i < oldLen; i++) {
if (targets[i] === handler && whats[i] === targetWhat) {
r.targets.splice(i, 1);
console.log(r.targets);
r.targetWhats.splice(oldLen - 1, 1);
console.log(r.targetWhats);
break;
}
}
}
}
}], [{
key: "getInstance",
value: function getInstance() {
if (!INSTANCE) {
INSTANCE = new MessageBroadcaster();
}
return INSTANCE;
}
}]);
return MessageBroadcaster;
}();