UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

61 lines 1.72 kB
import { PushPromise } from '../../graph/PushPromise'; import { Node } from '../../Node'; /** * @category Flow shape */ export class BalanceNode extends Node { constructor() { super(...arguments); this._busyNodes = []; this._queue = []; } push(frame) { return new PushPromise((resolve, reject) => { this.logger('debug', `Received a data frame in the balance node ${this.uid}`, frame); let assigned = false; for (const outlet of this.outlets) { if (this._busyNodes.indexOf(outlet) === -1) { // Node is not busy - perform push this._busyNodes.push(outlet); assigned = true; outlet.push(frame).then(() => { this._busyNodes.splice(this._busyNodes.indexOf(outlet), 1); this._updateQueue(); resolve(); }).catch(ex => { this._updateQueue(); reject(ex); }); break; // Stop Assigning } } if (!assigned) { // Add to queue this._queue.push({ frame, resolve, reject }); } }); } _updateQueue() { if (this._queue.length !== 0) { for (const outlet of this.outlets) { if (this._busyNodes.indexOf(outlet) === -1) { // Node is not busy - perform push const queue = this._queue.pop(); outlet.push(queue.frame).then(() => { this._busyNodes.splice(this._busyNodes.indexOf(outlet), 1); this._updateQueue(); queue.resolve(); }).catch(ex => { this._updateQueue(); queue.reject(ex); }); break; // Stop Assigning } } } } }