UNPKG

nxkit

Version:

This is a collection of tools, independent of any other libraries

107 lines (106 loc) 4.37 kB
"use strict"; /* ***** BEGIN LICENSE BLOCK ***** * Distributed under the BSD license: * * Copyright (c) 2015, xuewen.chu * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of xuewen.chu nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL xuewen.chu BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ***** END LICENSE BLOCK ***** */ Object.defineProperty(exports, "__esModule", { value: true }); const util_1 = require("./util"); const errno_1 = require("./errno"); function clear(self) { clearTimeout(self.m_timeout_id); self.m_running_id = 0; self.m_timeout_id = 0; self.m_run_loop = null; } class Monitor { constructor(interval = 1e3, maxDuration = -1) { this.m_running_id = 0; this.m_timeout_id = 0; this.m_run_loop = null; this.m_run_starttime = 0; this.m_interval = interval; this.m_maxDuration = maxDuration; } get interval() { return this.m_interval; } set interval(val) { this.m_interval = val; } get maxDuration() { return this.m_maxDuration; } set maxDuration(val) { this.m_maxDuration = val; } start(run) { return new Promise(async (resolve, reject) => { if (this.m_running_id) { reject(Error.new(errno_1.default.ERR_MONITOR_BEEN_STARTED)); } else { var id = util_1.default.id; this.m_running_id = id; this.m_run_starttime = Date.now(); var run_loop = async () => { var r = null; if (id == this.m_running_id) { try { r = await run(this); if (id == this.m_running_id) { if (this.m_maxDuration == -1 || this.m_maxDuration > (Date.now() - this.m_run_starttime)) { this.m_timeout_id = setTimeout(run_loop, this.m_interval); return; } } } catch (e) { clear(this); reject(e); return; } } clear(this); resolve(r); // end }; this.m_run_loop = run_loop; run_loop(); } }); } stop() { util_1.default.assert(this.m_running_id, errno_1.default.ERR_MONITOR_NOT_BEEN_STARTED); clearTimeout(this.m_timeout_id); this.m_running_id = 0; this.m_timeout_id = 0; var run_loop = this.m_run_loop; if (run_loop) { util_1.default.nextTick(() => { if (run_loop === this.m_run_loop) run_loop(); }); } } get running() { return !!this.m_running_id; } } exports.Monitor = Monitor;