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