UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

81 lines 2.82 kB
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)); }); } }