@openhps/core
Version:
Open Hybrid Positioning System - Core component
81 lines • 2.82 kB
JavaScript
import { DataObject } from '../data';
import { ProcessingNode } from './ProcessingNode';
/**
* Processing node that processes each {@link DataObject} in a {@link DataFrame} individually
*
* ## Usage
*
* ### Creating an ObjectProcessingNode
* Extended on a {@link ProcessingNode} is an object processing node that processes individual objects in each frame.
* ```typescript
* import { DataFrame, DataObject, ObjectProcessingNode } from '@openhps/core';
*
* export class CustomObjectProcessingNode<InOut extends DataFrame> extends ObjectProcessingNode<InOut> {
* // ...
* public processObject(object: DataObject, frame?: DataFrame): Promise<DataObject> {
* return new Promise<DataObject>((resolve, reject) => {
* // Manipulate the object
* object.displayName = "test";
* resolve(object);
* });
* }
* }
* ```
* @category Processing node
*/
export class ObjectProcessingNode extends ProcessingNode {
constructor(options) {
super(options);
this.options.objectFilter = this.options.objectFilter || (() => true);
}
process(frame, options) {
return new Promise((resolve, reject) => {
const processObjectPromises = [];
const uids = [];
const sourceUID = frame.source ? frame.source.uid : undefined;
frame.getObjects().filter(value => this.options.objectFilter(value, frame)).forEach(object => {
uids.push(object.uid);
processObjectPromises.push(this.processObject(object, frame, options));
});
Promise.all(processObjectPromises).then(objects => {
objects.forEach((object, index) => {
const oldUID = uids[index];
frame.removeObject(oldUID);
frame.removeObject(object.uid);
});
objects.forEach((object, index) => {
const oldUID = uids[index];
frame.addObject(object);
if (oldUID === sourceUID) {
frame.source = object;
}
});
resolve(frame);
}).catch(reject);
});
}
/**
* Find an object by its uid
* @param {string} uid Unique identifier of object to find
* @param {DataFrame} dataFrame Optional data frame to look in
* @param {string} type Optional type of the object to find
* @returns {Promise<DataObject>} Data object promise if found
*/
findObjectByUID(uid, dataFrame, type) {
if (dataFrame !== undefined) {
if (dataFrame.hasObject(new DataObject(uid))) {
return new Promise(resolve => {
resolve(dataFrame.getObjectByUID(uid));
});
}
}
let service;
if (type !== undefined) {
service = this.model.findDataService(type);
}
service = service || this.model.findDataService(DataObject);
return new Promise(resolve => {
service.findByUID(uid).then(resolve).catch(() => resolve(undefined));
});
}
}