OpenHPS/openhps-core

View on GitHub
src/nodes/source/HistorySourceNode.ts

Summary

Maintainability
A
1 hr
Test Coverage
import { DataObject } from '../../data';
import { DataFrame } from '../../data/DataFrame';
import { PullOptions } from '../../graph/options';
import { SourceNode, SourceNodeOptions } from '../SourceNode';

/**
 * @category Source node
 */
export class HistorySourceNode<Out extends DataFrame> extends SourceNode<Out> {
    constructor(options?: SourceNodeOptions) {
        super(options);
    }

    public onPull(options: PullOptions = { requestedObjects: [] }): Promise<Out> {
        return new Promise<Out>((resolve, reject) => {
            const service = this.model.findDataService(DataObject);
            const requestPromises: Array<Promise<DataObject>> = [];
            options.requestedObjects.forEach((uid) => {
                requestPromises.push(
                    new Promise((resolve) => {
                        service
                            .findByUID(uid)
                            .then((object) => {
                                resolve(object);
                            })
                            .catch(() => {
                                // Ignore
                                resolve(undefined);
                            });
                    }),
                );
            });

            // Complete service requests
            Promise.all(requestPromises)
                .then((objects) => {
                    // Create a new dataframe from these objects
                    const frame = new DataFrame(this.source);
                    objects.forEach((object) => {
                        if (object) {
                            frame.addObject(object);
                        }
                    });
                    resolve(frame as Out);
                })
                .catch(reject);
        });
    }
}