@openhps/core
Version:
Open Hybrid Positioning System - Core component
61 lines • 1.72 kB
JavaScript
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
}
}
}
}
}