UNPKG

hjs-message

Version:
768 lines (696 loc) 29.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageHandler = exports.Messenger = exports.BlockingRunnable = exports.Runnable = exports.Callback = undefined; var _promise = require("babel-runtime/core-js/promise"); var _promise2 = _interopRequireDefault(_promise); var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn"); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require("babel-runtime/helpers/inherits"); var _inherits3 = _interopRequireDefault(_inherits2); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _message = require("./message"); var _queue = require("./queue"); var _broadcast = require("./broadcast"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Callback = exports.Callback = function () { function Callback() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$handleMessage = _ref.handleMessage, handleMessage = _ref$handleMessage === undefined ? null : _ref$handleMessage; (0, _classCallCheck3.default)(this, Callback); if (handleMessage !== null) { this.handleMessage = handleMessage; } } (0, _createClass3.default)(Callback, [{ key: "handleMessage", value: function handleMessage(handler, message) { return false; } }]); return Callback; }(); /** @babel */ var Runnable = exports.Runnable = function () { function Runnable() { var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$run = _ref2.run, run = _ref2$run === undefined ? null : _ref2$run; (0, _classCallCheck3.default)(this, Runnable); if (run !== null) { this.run = run; } } (0, _createClass3.default)(Runnable, [{ key: "run", value: function run(handler) { var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return true; } }]); return Runnable; }(); var BlockingRunnable = exports.BlockingRunnable = function (_Runnable) { (0, _inherits3.default)(BlockingRunnable, _Runnable); function BlockingRunnable(task) { (0, _classCallCheck3.default)(this, BlockingRunnable); var _this = (0, _possibleConstructorReturn3.default)(this, (BlockingRunnable.__proto__ || (0, _getPrototypeOf2.default)(BlockingRunnable)).call(this)); _this.reset(task); return _this; } (0, _createClass3.default)(BlockingRunnable, [{ key: "isDone", value: function isDone() { return this.mDone; } }, { key: "isTimeout", value: function isTimeout() { return this.mIsTimeout; } }, { key: "notifyAll", value: function notifyAll(msg) { this.mDone = true; this.mHandler.removeCallbacks(this); if (this.mIsTimeout) { msg.arg1 = BlockingRunnable.TIMEOUT; } this.mHandler.sendMessage(msg); } }, { key: "onWait", value: function onWait(expirationTime) { if (this.mMode === 0) { clearTimeout(this.mId); this.mId = -1; } if (!this.mDone) { if (!this.wait(expirationTime)) { this.mIsTimeout = true; } } else { if (this.mMode === 1) { clearInterval(this.mId); this.mId = -1; } } } }, { key: "postAndWait", value: function postAndWait(handler) { var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity; var scheduleTime = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : NaN; var token = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; this.mHandler = handler; this.mTimeout = timeout; this.mScheduleTime = scheduleTime; return this.mHandler.post(this, token); } }, { key: "reset", value: function reset(task) { if (this.mId !== null) { if (this.mMode === 0) { clearTimeout(this.mId); } else { clearInterval(this.mId); } } this.mTask = task; this.mId = -1; this.mMode = -1; this.mToken = null; this.mDone = false; this.mTimeout = Infinity; this.mScheduleTime = NaN; this.mIsTimeout = false; this.mHandler = null; } }, { key: "run", value: function run(handler) { var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; try { this.mToken = token; return (this.mMode = this.mTimeout !== Infinity && this.mTimeout > 0 ? 0 : 1) === 0 ? this.wait(Date.now() + this.mTimeout) : this.wait(isNaN(this.mScheduleTime) ? handler.getScheduleTime() : this.mScheduleTime); } catch (e) { this.mIsTimeout = true; this.notifyAll(this.mHandler.obtainMessage({ what: BlockingRunnable.ERROR, obj: e })); } return false; } }, { key: "runTask", value: function runTask() { if (!this.mDone || !this.mIsTimeout) { this.mTask.run(this, this.mToken); } } }, { key: "wait", value: function wait() { var _this2 = this; var expirationTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; if (!this.mDone) { if (this.mMode === 0) { var delay = expirationTime - Date.now(); if (delay <= 0) { return false; } this.runTask(); this.mId = setTimeout(function (expirationTime) { _this2.onWait(expirationTime); }, delay, expirationTime); } else { if (this.mId === -1) { this.mId = setInterval(function (expirationTime) { _this2.runTask(); _this2.onWait(expirationTime); }, expirationTime, expirationTime); } } } return true; } }]); return BlockingRunnable; }(Runnable); BlockingRunnable.ERROR = 0x00000000; BlockingRunnable.TIMEOUT = 0xffffffff; var Messenger = exports.Messenger = function () { function Messenger() { var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$binder = _ref3.binder, binder = _ref3$binder === undefined ? null : _ref3$binder, _ref3$sendMessage = _ref3.sendMessage, sendMessage = _ref3$sendMessage === undefined ? null : _ref3$sendMessage; (0, _classCallCheck3.default)(this, Messenger); this.handler = binder; if (sendMessage) { this.sendMessage = sendMessage; } } (0, _createClass3.default)(Messenger, [{ key: "getBinder", value: function getBinder() { return this.handler; } }, { key: "publish", value: function publish(msg) { if (this.handler) { if (!msg.replyTo) { msg.replyTo = this.handler; } this.handler.publish(msg); } } }, { key: "sendMessage", value: function sendMessage(msg) { if (this.handler) { this.handler.sendMessage(msg); } } }, { key: "sendMessageTo", value: function sendMessageTo(msg) { if (this.handler) { var h = msg.target; if (h !== this.handler) { var m = _message.Message.obtain(); m.copyFrom(msg); m.replyTo = this.handler; h.sendMessage(m); } else { this.sendMessage(msg); } } } }, { key: "setBinder", value: function setBinder(binder) { this.handler = binder; } }, { key: "subscribe", value: function subscribe(senderWhat, targetWhat) { if (this.handler) { this.handler.subscribe(senderWhat, targetWhat); } } }, { key: "unsubscribe", value: function unsubscribe(senderWhat, targetWhat) { if (this.handler) { this.handler.unsubscribe(senderWhat, targetWhat); } } }]); return Messenger; }(); var SCHEDULE_TIME = 200; var createPromiseCallback = function createPromiseCallback(execute, resolve, reject) { return { run: function run(handler) { var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; try { execute({ resolve: resolve, reject: reject, handler: handler, token: token }); return true; } catch (e) { reject(e); return false; } } }; }; var MessageHandler = exports.MessageHandler = function () { function MessageHandler() { var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref4$callback = _ref4.callback, callback = _ref4$callback === undefined ? null : _ref4$callback, _ref4$asynchronous = _ref4.asynchronous, asynchronous = _ref4$asynchronous === undefined ? true : _ref4$asynchronous, _ref4$queue = _ref4.queue, queue = _ref4$queue === undefined ? new _queue.MessageQueue() : _ref4$queue, _ref4$messenger = _ref4.messenger, messenger = _ref4$messenger === undefined ? new Messenger() : _ref4$messenger, _ref4$handleMessage = _ref4.handleMessage, handleMessage = _ref4$handleMessage === undefined ? null : _ref4$handleMessage, _ref4$unHandleMessage = _ref4.unHandleMessage, unHandleMessage = _ref4$unHandleMessage === undefined ? null : _ref4$unHandleMessage, _ref4$scheduleTime = _ref4.scheduleTime, scheduleTime = _ref4$scheduleTime === undefined ? SCHEDULE_TIME : _ref4$scheduleTime; (0, _classCallCheck3.default)(this, MessageHandler); if (handleMessage) { this.handleMessage = handleMessage; } if (unHandleMessage) { this.unHandleMessage = unHandleMessage; } this.mQueue = queue; this.mCallback = callback; this.mScheduleTime = scheduleTime; this.mAsynchronous = asynchronous; this.setMessenger(messenger); } (0, _createClass3.default)(MessageHandler, [{ key: "dispatchMessage", value: function dispatchMessage(message) { if (message) { return message.callback ? this.handleCallback(message) : this.mCallback ? this.mCallback.handleMessage(this, message) : this.handleMessage(message); } return false; } }, { key: "enqueueMessage", value: function enqueueMessage(queue, msg) { var uptimeMillis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var atFront = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; msg.target = this; msg.setAsynchronous(atFront ? false : this.mAsynchronous); return queue.enqueueMessage(msg, uptimeMillis); } }, { key: "getBroadcaster", value: function getBroadcaster() { return _broadcast.MessageBroadcaster.getInstance(); } }, { key: "getMessageName", value: function getMessageName(message) { if (message.callback) { return message.callback.constructor.name; } return "0x" + message.what.toString(16); } }, { key: "getMessenger", value: function getMessenger() { return this.mMessenger; } }, { key: "getMessageQueue", value: function getMessageQueue() { return this.mQueue; } }, { key: "getPostMessage", value: function getPostMessage() { var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref5$when = _ref5.when, when = _ref5$when === undefined ? 0 : _ref5$when, _ref5$what = _ref5.what, what = _ref5$what === undefined ? 0 : _ref5$what, _ref5$arg = _ref5.arg1, arg1 = _ref5$arg === undefined ? 0 : _ref5$arg, _ref5$arg2 = _ref5.arg2, arg2 = _ref5$arg2 === undefined ? 0 : _ref5$arg2, _ref5$data = _ref5.data, data = _ref5$data === undefined ? null : _ref5$data, _ref5$obj = _ref5.obj, obj = _ref5$obj === undefined ? null : _ref5$obj, _ref5$replyTo = _ref5.replyTo, replyTo = _ref5$replyTo === undefined ? null : _ref5$replyTo, _ref5$target = _ref5.target, target = _ref5$target === undefined ? null : _ref5$target, _ref5$callback = _ref5.callback, callback = _ref5$callback === undefined ? null : _ref5$callback; return _message.Message.obtain({ when: when, what: what, arg1: arg1, arg2: arg2, data: data, obj: obj, replyTo: replyTo, target: target, callback: callback }); } }, { key: "getScheduleTime", value: function getScheduleTime() { return this.mScheduleTime; } }, { key: "handleCallback", value: function handleCallback(msg) { if (msg && msg.callback) { return msg.callback.run(this, msg.obj); } return false; } }, { key: "handleMessage", value: function handleMessage(msg) { return true; } }, { key: "hasCallbacks", value: function hasCallbacks(callback) { return this.mQueue.hasMessages(this, callback, null); } }, { key: "hasMessages", value: function hasMessages(what) { var object = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return this.mQueue.hasMessages(this, what, object); } }, { key: "obtainMessage", value: function obtainMessage() { var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref6$when = _ref6.when, when = _ref6$when === undefined ? 0 : _ref6$when, _ref6$state = _ref6.state, state = _ref6$state === undefined ? 0 : _ref6$state, _ref6$what = _ref6.what, what = _ref6$what === undefined ? 0 : _ref6$what, _ref6$arg = _ref6.arg1, arg1 = _ref6$arg === undefined ? 0 : _ref6$arg, _ref6$arg2 = _ref6.arg2, arg2 = _ref6$arg2 === undefined ? 0 : _ref6$arg2, _ref6$data = _ref6.data, data = _ref6$data === undefined ? null : _ref6$data, _ref6$obj = _ref6.obj, obj = _ref6$obj === undefined ? null : _ref6$obj, _ref6$replyTo = _ref6.replyTo, replyTo = _ref6$replyTo === undefined ? null : _ref6$replyTo, _ref6$target = _ref6.target, target = _ref6$target === undefined ? null : _ref6$target, _ref6$callback = _ref6.callback, callback = _ref6$callback === undefined ? null : _ref6$callback; if (!target) { target = this; } return _message.Message.obtain({ when: when, state: state, what: what, arg1: arg1, arg2: arg2, data: data, obj: obj, replyTo: replyTo, target: target, callback: callback }); } }, { key: "post", value: function post(callback) { var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return this.sendMessageDelayed(this.getPostMessage({ callback: callback, obj: token }), 0); } }, { key: "postAtFrontOfQueue", value: function postAtFrontOfQueue(callback) { var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return this.sendMessageAtFrontOfQueue(this.getPostMessage({ callback: callback, obj: token })); } }, { key: "postAtTime", value: function postAtTime(callback) { var uptimeMillis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var token = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; return this.sendMessageAtTime(this.getPostMessage({ callback: callback, obj: token }), uptimeMillis); } }, { key: "postDelayed", value: function postDelayed(callback) { var delayMillis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var token = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; return this.sendMessageDelayed(this.getPostMessage({ callback: callback, obj: token }), delayMillis); } }, { key: "promise", value: function promise() { var _this3 = this; var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, execute = _ref7.execute, _ref7$complete = _ref7.complete, complete = _ref7$complete === undefined ? null : _ref7$complete, _ref7$token = _ref7.token, token = _ref7$token === undefined ? null : _ref7$token; var p = new _promise2.default(function (resolve, reject) { _this3.post(createPromiseCallback(execute, resolve, reject), token); }); if (handleResult) { p.then(complete).catch(complete); } return p; } }, { key: "promiseAtFrontOfQueue", value: function promiseAtFrontOfQueue() { var _this4 = this; var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, execute = _ref8.execute, _ref8$complete = _ref8.complete, complete = _ref8$complete === undefined ? null : _ref8$complete, _ref8$token = _ref8.token, token = _ref8$token === undefined ? null : _ref8$token; var p = new _promise2.default(function (resolve, reject) { _this4.postAtFrontOfQueue(createPromiseCallback(execute, resolve, reject), token); }); if (complete) { p.then(complete).catch(complete); } return p; } }, { key: "promiseAtTime", value: function promiseAtTime() { var _this5 = this; var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, execute = _ref9.execute, _ref9$complete = _ref9.complete, complete = _ref9$complete === undefined ? null : _ref9$complete, _ref9$uptimeMillis = _ref9.uptimeMillis, uptimeMillis = _ref9$uptimeMillis === undefined ? 0 : _ref9$uptimeMillis, _ref9$token = _ref9.token, token = _ref9$token === undefined ? null : _ref9$token; var p = new _promise2.default(function (resolve, reject) { _this5.postAtTime(createPromiseCallback(execute, resolve, reject), uptimeMillis, token); }); if (complete) { p.then(complete).catch(complete); } return p; } }, { key: "promiseDelayed", value: function promiseDelayed() { var _this6 = this; var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, execute = _ref10.execute, _ref10$complete = _ref10.complete, complete = _ref10$complete === undefined ? null : _ref10$complete, _ref10$delayMillis = _ref10.delayMillis, delayMillis = _ref10$delayMillis === undefined ? 0 : _ref10$delayMillis, _ref10$token = _ref10.token, token = _ref10$token === undefined ? null : _ref10$token; var p = new _promise2.default(function (resolve, reject) { _this6.postDelayed(createPromiseCallback(execute, resolve, reject), delayMillis, token); }); if (complete) { p.then(complete).catch(complete); } return p; } }, { key: "publish", value: function publish(msg) { this.getBroadcaster().publish(msg); } }, { key: "removeCallbacks", value: function removeCallbacks(callback) { var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; this.mQueue.removeMessages(this, callback, token); } }, { key: "removeCallbacksAndMessages", value: function removeCallbacksAndMessages(token) { this.mQueue.removeCallbacksAndMessages(this, token); } }, { key: "removeMessages", value: function removeMessages() { var what = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var object = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; this.mQueue.removeMessages(this, what, object, true); } }, { key: "runWithScissors", value: function runWithScissors(callback) { var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity; var scheduleTime = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : SCHEDULE_TIME; var token = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; if (!callback) { throw new ReferenceError("IllegalArgumentException runnable must not be null"); } var asynchronous = !isNaN(timeout); if (asynchronous && timeout < 0) { throw new RangeError("IllegalArgumentException timeout must be non-negative"); } if (!asynchronous) { try { callback.run(this, token); return true; } catch (e) { return false; } } var br = new BlockingRunnable(callback); return br.postAndWait(this, timeout, scheduleTime, token); } }, { key: "sendEmptyMessage", value: function sendEmptyMessage(what) { return this.sendEmptyMessageDelayed(what, 0); } }, { key: "sendEmptyMessageAtFrontOfQueue", value: function sendEmptyMessageAtFrontOfQueue(what) { var msg = _message.Message.obtain({ what: what }); return this.sendMessageAtFrontOfQueue(msg); } }, { key: "sendEmptyMessageAtTime", value: function sendEmptyMessageAtTime(what) { var uptimeMillis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var msg = _message.Message.obtain({ what: what }); return this.sendMessageAtTime(msg, uptimeMillis); } }, { key: "sendEmptyMessageDelayed", value: function sendEmptyMessageDelayed(what) { var delayMillis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var msg = _message.Message.obtain({ what: what }); return this.sendMessageDelayed(msg, delayMillis); } }, { key: "sendMessage", value: function sendMessage(msg) { return this.sendMessageDelayed(msg, 0); } }, { key: "sendMessageAtFrontOfQueue", value: function sendMessageAtFrontOfQueue(msg) { var queue = this.mQueue; if (!queue) { console.error(this + " sendMessageAtFrontOfQueue() called with no mQueue"); return false; } return this.enqueueMessage(queue, msg, 0, true); } }, { key: "sendMessageAtTime", value: function sendMessageAtTime(msg) { var uptimeMillis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var queue = this.mQueue; if (!queue) { console.error(this + " sendMessageAtTime() called with no mQueue"); return false; } return this.enqueueMessage(queue, msg, uptimeMillis); } }, { key: "sendMessageDelayed", value: function sendMessageDelayed(msg) { var delayMillis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; if (delayMillis < 0) { delayMillis = 0; } return this.sendMessageAtTime(msg, Date.now() + delayMillis); } }, { key: "setMessenger", value: function setMessenger(messenger) { if (messenger !== null) { this.mMessenger = messenger; messenger.setBinder(this); } } }, { key: "setScheduleTime", value: function setScheduleTime(interval) { this.mScheduleTime = interval; } }, { key: "subscribe", value: function subscribe(senderWhat, targetWhat) { this.getBroadcaster().subscribe(senderWhat, this, targetWhat); } }, { key: "toString", value: function toString() { return "\n Handler (" + this.constructor.name + ") {}\n "; } }, { key: "unHandleMessage", value: function unHandleMessage(msg) {} }, { key: "unsubscribe", value: function unsubscribe(senderWhat, targetWhat) { this.getBroadcaster().unsubscribe(senderWhat, this, targetWhat); } }], [{ key: "create", value: function create() { var _ref11 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref11$callback = _ref11.callback, callback = _ref11$callback === undefined ? null : _ref11$callback, _ref11$asynchronous = _ref11.asynchronous, asynchronous = _ref11$asynchronous === undefined ? true : _ref11$asynchronous, _ref11$queue = _ref11.queue, queue = _ref11$queue === undefined ? new _queue.MessageQueue() : _ref11$queue, _ref11$messenger = _ref11.messenger, messenger = _ref11$messenger === undefined ? new Messenger() : _ref11$messenger, _ref11$handleMessage = _ref11.handleMessage, handleMessage = _ref11$handleMessage === undefined ? null : _ref11$handleMessage, _ref11$unHandleMessag = _ref11.unHandleMessage, unHandleMessage = _ref11$unHandleMessag === undefined ? null : _ref11$unHandleMessag, _ref11$scheduleTime = _ref11.scheduleTime, scheduleTime = _ref11$scheduleTime === undefined ? SCHEDULE_TIME : _ref11$scheduleTime; return new MessageHandler({ callback: callback, asynchronous: asynchronous, queue: queue, messenger: messenger, handleMessage: handleMessage, unHandleMessage: unHandleMessage, scheduleTime: scheduleTime }); } }, { key: "setSchedulerTime", value: function setSchedulerTime(scheduleTime) { SCHEDULE_TIME = scheduleTime; } }]); return MessageHandler; }();