@orbit/core
Version:
Core library for Orbit - a flexible data access and synchronization layer.
163 lines • 19.2 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { Orbit } from './main';
import { evented } from './evented';
import { NotLoggedException, OutOfRangeException } from './exception';
const { assert } = Orbit;
/**
* Logs track a series of unique events that have occurred. Each event is
* tracked based on its unique id. The log only tracks the ids but currently
* does not track any details.
*
* Logs can automatically be persisted by assigning them a bucket.
*/
let Log = class Log {
constructor(options = {}) {
this._data = [];
this._name = options.name;
this._bucket = options.bucket;
if (this._bucket) {
assert('Log requires a name if it has a bucket', !!this._name);
}
this._reify(options.data);
}
get name() {
return this._name;
}
get bucket() {
return this._bucket;
}
get head() {
return this._data[this._data.length - 1];
}
get entries() {
return this._data;
}
get length() {
return this._data.length;
}
append(...ids) {
return this.reified
.then(() => {
Array.prototype.push.apply(this._data, ids);
return this._persist();
})
.then(() => {
this.emit('append', ids);
});
}
before(id, relativePosition = 0) {
const index = this._data.indexOf(id);
if (index === -1) {
throw new NotLoggedException(id);
}
const position = index + relativePosition;
if (position < 0 || position >= this._data.length) {
throw new OutOfRangeException(position);
}
return this._data.slice(0, position);
}
after(id, relativePosition = 0) {
const index = this._data.indexOf(id);
if (index === -1) {
throw new NotLoggedException(id);
}
const position = index + 1 + relativePosition;
if (position < 0 || position > this._data.length) {
throw new OutOfRangeException(position);
}
return this._data.slice(position);
}
truncate(id, relativePosition = 0) {
let removed;
return this.reified
.then(() => {
const index = this._data.indexOf(id);
if (index === -1) {
throw new NotLoggedException(id);
}
const position = index + relativePosition;
if (position < 0 || position > this._data.length) {
throw new OutOfRangeException(position);
}
if (position === this._data.length) {
removed = this._data;
this._data = [];
}
else {
removed = this._data.slice(0, position);
this._data = this._data.slice(position);
}
return this._persist();
})
.then(() => {
this.emit('truncate', id, relativePosition, removed);
});
}
rollback(id, relativePosition = 0) {
let removed;
return this.reified
.then(() => {
const index = this._data.indexOf(id);
if (index === -1) {
throw new NotLoggedException(id);
}
const position = index + 1 + relativePosition;
if (position < 0 || position > this._data.length) {
throw new OutOfRangeException(position);
}
removed = this._data.slice(position);
this._data = this._data.slice(0, position);
return this._persist();
})
.then(() => {
this.emit('rollback', id, relativePosition, removed);
});
}
clear() {
let clearedData;
return this.reified
.then(() => {
clearedData = this._data;
this._data = [];
return this._persist();
})
.then(() => this.emit('clear', clearedData));
}
contains(id) {
return this._data.indexOf(id) > -1;
}
async _persist() {
this.emit('change');
if (this._bucket && this._name) {
await this._bucket.setItem(this._name, this._data);
}
}
_reify(data) {
if (data) {
this._initData(data);
this.reified = Promise.resolve();
}
else {
this.reified = this._loadDataFromBucket().then((bucketData) => this._initData(bucketData));
}
return this.reified;
}
async _loadDataFromBucket() {
if (this._bucket && this._name) {
return (await this._bucket.getItem(this._name));
}
}
_initData(data) {
this._data = data !== null && data !== void 0 ? data : [];
}
};
Log = __decorate([
evented
], Log);
export { Log };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQVcsTUFBTSxXQUFXLENBQUM7QUFFN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFZekI7Ozs7OztHQU1HO0FBRUgsSUFBYSxHQUFHLEdBQWhCLE1BQWEsR0FBRztJQU9kLFlBQVksVUFBc0IsRUFBRTtRQUo1QixVQUFLLEdBQWEsRUFBRSxDQUFDO1FBSzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyx3Q0FBd0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lB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LENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNsQzthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUM1RCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUMzQixDQUFDO1NBQ0g7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDOUIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUF5QixDQUFDO1NBQ3pFO0lBQ0gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFlO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7Q0FDRixDQUFBO0FBakxZLEdBQUc7SUFEZixPQUFPO0dBQ0ssR0FBRyxDQWlMZjtTQWpMWSxHQUFHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JiaXQgfSBmcm9tICcuL21haW4nO1xuaW1wb3J0IHsgZXZlbnRlZCwgRXZlbnRlZCB9IGZyb20gJy4vZXZlbnRlZCc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICcuL2J1Y2tldCc7XG5pbXBvcnQgeyBOb3RMb2dnZWRFeGNlcHRpb24sIE91dE9mUmFuZ2VFeGNlcHRpb24gfSBmcm9tICcuL2V4Y2VwdGlvbic7XG5cbmNvbnN0IHsgYXNzZXJ0IH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dPcHRpb25zIHtcbiAgbmFtZT86IHN0cmluZztcbiAgZGF0YT86IHN0cmluZ1tdO1xuICBidWNrZXQ/OiBCdWNrZXQ8c3RyaW5nW10+O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBMb2dcbiAgZXh0ZW5kcyBFdmVudGVkPCdhcHBlbmQnIHwgJ3RydW5jYXRlJyB8ICdyb2xsYmFjaycgfCAnY2xlYXInIHwgJ2NoYW5nZSc+IHt9XG5cbi8qKlxuICogTG9ncyB0cmFjayBhIHNlcmllcyBvZiB1bmlxdWUgZXZlbnRzIHRoYXQgaGF2ZSBvY2N1cnJlZC4gRWFjaCBldmVudCBpc1xuICogdHJhY2tlZCBiYXNlZCBvbiBpdHMgdW5pcXVlIGlkLiBUaGUgbG9nIG9ubHkgdHJhY2tzIHRoZSBpZHMgYnV0IGN1cnJlbnRseVxuICogZG9lcyBub3QgdHJhY2sgYW55IGRldGFpbHMuXG4gKlxuICogTG9ncyBjYW4gYXV0b21hdGljYWxseSBiZSBwZXJzaXN0ZWQgYnkgYXNzaWduaW5nIHRoZW0gYSBidWNrZXQuXG4gKi9cbkBldmVudGVkXG5leHBvcnQgY2xhc3MgTG9nIHtcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfYnVja2V0PzogQnVja2V0PHN0cmluZ1tdPjtcbiAgcHJpdmF0ZSBfZGF0YTogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgcmVpZmllZCE6IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTG9nT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5fbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB0aGlzLl9idWNrZXQgPSBvcHRpb25zLmJ1Y2tldDtcblxuICAgIGlmICh0aGlzLl9idWNrZXQpIHtcbiAgICAgIGFzc2VydCgnTG9nIHJlcXVpcmVzIGEgbmFtZSBpZiBpdCBoYXMgYSBidWNrZXQnLCAhIXRoaXMuX25hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlaWZ5KG9wdGlvbnMuZGF0YSk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgZ2V0IGJ1Y2tldCgpOiBCdWNrZXQ8c3RyaW5nW10+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0O1xuICB9XG5cbiAgZ2V0IGhlYWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgZ2V0IGVudHJpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmxlbmd0aDtcbiAgfVxuXG4gIGFwcGVuZCguLi5pZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVpZmllZFxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLl9kYXRhLCBpZHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGVyc2lzdCgpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KCdhcHBlbmQnLCBpZHMpO1xuICAgICAgfSk7XG4gIH1cblxuICBiZWZvcmUoaWQ6IHN0cmluZywgcmVsYXRpdmVQb3NpdGlvbiA9IDApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kYXRhLmluZGV4T2YoaWQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBOb3RMb2dnZWRFeGNlcHRpb24oaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZlJhbmdlRXhjZXB0aW9uKHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zbGljZSgwLCBwb3NpdGlvbik7XG4gIH1cblxuICBhZnRlcihpZDogc3RyaW5nLCByZWxhdGl2ZVBvc2l0aW9uID0gMCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2RhdGEuaW5kZXhPZihpZCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IE5vdExvZ2dlZEV4Y2VwdGlvbihpZCk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb24gPSBpbmRleCArIDEgKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPiB0aGlzLl9kYXRhLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFeGNlcHRpb24ocG9zaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNsaWNlKHBvc2l0aW9uKTtcbiAgfVxuXG4gIHRydW5jYXRlKGlkOiBzdHJpbmcsIHJlbGF0aXZlUG9zaXRpb24gPSAwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlbW92ZWQ6IHN0cmluZ1tdO1xuXG4gICAgcmV0dXJuIHRoaXMucmVpZmllZFxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2RhdGEuaW5kZXhPZihpZCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90TG9nZ2VkRXhjZXB0aW9uKGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUV4Y2VwdGlvbihwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IHRoaXMuX2RhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgcmVtb3ZlZCA9IHRoaXMuX2RhdGE7XG4gICAgICAgICAgdGhpcy5fZGF0YSA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZWQgPSB0aGlzLl9kYXRhLnNsaWNlKDAsIHBvc2l0aW9uKTtcbiAgICAgICAgICB0aGlzLl9kYXRhID0gdGhpcy5fZGF0YS5zbGljZShwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fcGVyc2lzdCgpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KCd0cnVuY2F0ZScsIGlkLCByZWxhdGl2ZVBvc2l0aW9uLCByZW1vdmVkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcm9sbGJhY2soaWQ6IHN0cmluZywgcmVsYXRpdmVQb3NpdGlvbiA9IDApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcmVtb3ZlZDogc3RyaW5nW107XG5cbiAgICByZXR1cm4gdGhpcy5yZWlmaWVkXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGF0YS5pbmRleE9mKGlkKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RMb2dnZWRFeGNlcHRpb24oaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBpbmRleCArIDEgKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUV4Y2VwdGlvbihwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZW1vdmVkID0gdGhpcy5fZGF0YS5zbGljZShwb3NpdGlvbik7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhLnNsaWNlKDAsIHBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcGVyc2lzdCgpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KCdyb2xsYmFjaycsIGlkLCByZWxhdGl2ZVBvc2l0aW9uLCByZW1vdmVkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNsZWFyZWREYXRhOiBzdHJpbmdbXTtcblxuICAgIHJldHVybiB0aGlzLnJlaWZpZWRcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgY2xlYXJlZERhdGEgPSB0aGlzLl9kYXRhO1xuICAgICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJzaXN0KCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5lbWl0KCdjbGVhcicsIGNsZWFyZWREYXRhKSk7XG4gIH1cblxuICBjb250YWlucyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuaW5kZXhPZihpZCkgPiAtMTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BlcnNpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnKTtcbiAgICBpZiAodGhpcy5fYnVja2V0ICYmIHRoaXMuX25hbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2J1Y2tldC5zZXRJdGVtKHRoaXMuX25hbWUsIHRoaXMuX2RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlaWZ5KGRhdGE/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLl9pbml0RGF0YShkYXRhKTtcbiAgICAgIHRoaXMucmVpZmllZCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlaWZpZWQgPSB0aGlzLl9sb2FkRGF0YUZyb21CdWNrZXQoKS50aGVuKChidWNrZXREYXRhKSA9PlxuICAgICAgICB0aGlzLl9pbml0RGF0YShidWNrZXREYXRhKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWlmaWVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfbG9hZERhdGFGcm9tQnVja2V0KCk6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5fYnVja2V0ICYmIHRoaXMuX25hbWUpIHtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5fYnVja2V0LmdldEl0ZW0odGhpcy5fbmFtZSkpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2luaXREYXRhKGRhdGE/OiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSBkYXRhID8/IFtdO1xuICB9XG59XG4iXX0=