UNPKG

futoin-asyncsteps

Version:

Mimic traditional threads in single threaded event loop

245 lines (233 loc) 8.59 kB
'use strict'; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var _require = require('../Errors'), InternalError = _require.InternalError, LoopCont = _require.LoopCont, LoopBreak = _require.LoopBreak; //--- var makeSym = typeof Symbol === 'undefined' ? function (name) { return name; } : function (name) { return Symbol(name); }; //--- var LOOP_TERM_LABEL = makeSym('_loop_term_label'); var loop_error = function loop_error(as, err, outer_as, state, label) { if (err === LoopCont) { var term_label = state[LOOP_TERM_LABEL]; if (!term_label || term_label === label) { state.last_exception = null; // Continue to next iteration as._root._handle_success(); } } else if (err === LoopBreak) { var _term_label = state[LOOP_TERM_LABEL]; if (!_term_label || _term_label === label) { state.last_exception = null; outer_as._queue.length = 0; as._root._handle_success(); } } }; var loop = function loop(asi, root, func, label, end_cond) { if (end_cond && end_cond()) { return; } asi.add(function (outer_as) { var state = outer_as.state; var exec_stack = root._exec_stack; var es_len = exec_stack.length; var step1 = [func, function (as, err) { loop_error(as, err, outer_as, state, label); }]; var step2 = [function (as) { if (!end_cond || !end_cond()) { exec_stack.length = es_len; // truncate iteration create_iteration(); } }, null]; var create_iteration = function create_iteration() { outer_as._queue = [step1, step2]; }; create_iteration(); }); }; //--- var repeat = function repeat(asi, root, count, func, label) { var i = 0; var c = count; loop(asi, root, function (as) { func(as, i++); }, label, function () { return i >= c; }); }; //--- var forEach = function forEach(asi, root, map_or_list, func, label) { if (Array.isArray(map_or_list)) { var arr = map_or_list; repeat(asi, root, arr.length, function (as, i) { func(as, i, arr[i]); }, label); } else if (typeof Map !== 'undefined' && map_or_list instanceof Map) { var iter = map_or_list.entries(); loop(asi, root, function (as) { var next = iter.next(); if (next.done) { as["break"](); } var _next$value = _slicedToArray(next.value, 2), key = _next$value[0], value = _next$value[1]; func(as, key, value); }, label); } else { var obj = map_or_list; var keys = Object.keys(obj); repeat(asi, root, keys.length, function (as, i) { func(as, keys[i], obj[keys[i]]); }, label); } }; //--- var await_async_error = function await_async_error(asi, root, reason) { var state = asi.state; if (state) { var default_error = 'PromiseReject'; asi._on_cancel = null; if (reason instanceof Error) { state.last_exception = reason; state.error_info = undefined; root._handle_error(default_error); } else { var err = reason || default_error; state.last_exception = new Error(err); state.error_info = undefined; root._handle_error(err); } } }; var as_await = function as_await(asi, root, promise, onerror) { var step_as; var complete; // Attach handlers on the same tick promise.then(function (result) { if (step_as) { if (step_as.state) { root._burst_success([result]); } } else { complete = function complete() { root._handle_success([result]); }; } }, function (reason) { if (step_as) { await_async_error(step_as, root, reason); } else { // prevent cancel logic step_as = null; if (reason instanceof Error) { complete = function complete() { throw reason; }; } else { complete = function complete(asi) { asi.error(reason || 'PromiseReject'); }; } } }); asi.add(function (as) { if (complete) { complete(as); } else { step_as = as; as._on_cancel = function () { if (step_as) { step_as = null; try { // BlueBird cancellation promise.cancel(); } catch (_unused) { // ignore } } }; } }, onerror); }; //--- var prev_queue = function prev_queue(root) { var stack = root._stack; var stack_len = stack.length; return stack_len > 1 ? stack[stack_len - 2]._queue : root._queue; }; //--- var EMPTY_ARRAY = []; Object.freeze(EMPTY_ARRAY); //--- var noop = function noop() {}; //--- module.exports = exports = { noop: noop, makeSym: makeSym, loop: loop, repeat: repeat, forEach: forEach, LOOP_TERM_LABEL: LOOP_TERM_LABEL, as_await: as_await, EMPTY_ARRAY: EMPTY_ARRAY, prev_queue: prev_queue }; if (process.env.NODE_ENV === 'production') { exports.isProduction = true; exports.checkFunc = noop; exports.checkOnError = noop; var fake_exec_stack = new (/*#__PURE__*/function () { function _class() { _classCallCheck(this, _class); } return _createClass(_class, [{ key: "push", value: function push() {} }, { key: "length", get: function get() { return 0; }, set: function set(l) {} }]); }())(); Object.freeze(fake_exec_stack); exports.newExecStack = function () { return fake_exec_stack; }; } else { exports.isProduction = false; exports.checkFunc = function (asi, func) { if (func.length < 1) { asi.error(InternalError, "Step function must expect at least AsyncStep interface"); } }; exports.checkOnError = function (asi, onerror) { if (onerror && onerror.length !== 2) { asi.error(InternalError, "Error handler must take exactly two arguments"); } }; exports.newExecStack = function () { return []; }; } //# sourceMappingURL=common.js.map