UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

127 lines 5.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TrajectoryService = void 0; const tslib_1 = require("tslib"); const DataObject_1 = require("../data/object/DataObject"); const DataService_1 = require("./DataService"); /** * A trajectory service stores the position of a data object * in a continuous trajectory. */ class TrajectoryService extends DataService_1.DataService { constructor(dataServiceDriver, options) { var _a; super(dataServiceDriver); this.options = options || {}; this.options.autoBind = this.options.autoBind === undefined ? true : this.options.autoBind; this.options.dataService = this.options.dataService || DataObject_1.DataObject; this.options.defaultUID = (_a = this.options.defaultUID) !== null && _a !== void 0 ? _a : ((object) => object.uid); if (this.options.autoBind) { this.once('build', this._bindService.bind(this)); } } _bindService() { return new Promise((resolve, reject) => { if (!this.model) { // No model return resolve(); } const dataObjectService = this.model.findDataService(this.options.dataService); if (dataObjectService) { dataObjectService.on('insert', (_, object) => tslib_1.__awaiter(this, void 0, void 0, function* () { yield this.appendPosition(object); })); resolve(); } else { reject(new Error(`Data object service not found for '${this.options.dataService}'`)); } }); } /** * Find the latest trajectory * @param {DataObject | string} object Data object to get trajectories for * @returns {Promise<Trajectory>} Trajectory promise if found */ findCurrentTrajectory(object) { return new Promise((resolve, reject) => { this.findOne({ objectUID: object instanceof DataObject_1.DataObject ? object.uid : object, }, { sort: [['createdTimestamp', -1]], }) .then(resolve) .catch(reject); }); } /** * Find the trajectory of an object from start to end date * @param {DataObject | string} object Data object to get trajectory for * @param {Date | number} start Start time or date * @param {Date | number} end End time or date * @returns {Trajectory} Trajectory match */ findTrajectoryByRange(object, start, end) { return new Promise((resolve, reject) => { this.findOne({ objectUID: object instanceof DataObject_1.DataObject ? object.uid : object, positions: { $elemMatch: { timestamp: { $lte: end ? (end instanceof Date ? end.getTime() : end) : Number.MAX_VALUE, $gte: start ? (start instanceof Date ? start.getTime() : start) : -1, }, }, }, }) .then((trajectory) => { resolve(trajectory); }) .catch(reject); }); } /** * Find all trajectories of an object * @param {DataObject | string} object Data object to get trajectories for * @returns {Promise<string[]>} List of trajectory UIDs */ findTrajectories(object) { return new Promise((resolve) => { this.findAll({ objectUID: object instanceof DataObject_1.DataObject ? object.uid : object, }).then((trajectories) => { resolve(trajectories.map((trajectory) => trajectory.uid)); }); }); } /** * Append a position to the trajectory service * @param {DataObject} object Data object to store * @param {string} uid Trajectory uid * @returns {Promise<Trajectory>} Stored trajectory */ appendPosition(object, uid) { return new Promise((resolve, reject) => { const position = object.getPosition(); if (position) { Promise.resolve(uid ? this.findOne({ uid }) : this.findCurrentTrajectory(object)) .then((trajectory) => { if (!trajectory) { trajectory = new this.driver.dataType(); trajectory.objectUID = object.uid; trajectory.uid = uid !== null && uid !== void 0 ? uid : this.options.defaultUID(object); } trajectory.positions.push(object.position); return this.insert(trajectory.uid, trajectory); }) .then(resolve) .catch(reject); } else { return reject(); } }); } } exports.TrajectoryService = TrajectoryService; //# sourceMappingURL=TrajectoryService.js.map