@orbit/core
Version:
Core library for Orbit - a flexible data access and synchronization layer.
166 lines • 19.3 kB
JavaScript
"use strict";
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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Log = void 0;
const main_1 = require("./main");
const evented_1 = require("./evented");
const exception_1 = require("./exception");
const { assert } = main_1.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 exception_1.NotLoggedException(id);
}
const position = index + relativePosition;
if (position < 0 || position >= this._data.length) {
throw new exception_1.OutOfRangeException(position);
}
return this._data.slice(0, position);
}
after(id, relativePosition = 0) {
const index = this._data.indexOf(id);
if (index === -1) {
throw new exception_1.NotLoggedException(id);
}
const position = index + 1 + relativePosition;
if (position < 0 || position > this._data.length) {
throw new exception_1.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 exception_1.NotLoggedException(id);
}
const position = index + relativePosition;
if (position < 0 || position > this._data.length) {
throw new exception_1.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 exception_1.NotLoggedException(id);
}
const position = index + 1 + relativePosition;
if (position < 0 || position > this._data.length) {
throw new exception_1.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_1.evented
], Log);
exports.Log = Log;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxpQ0FBK0I7QUFDL0IsdUNBQTZDO0FBRTdDLDJDQUFzRTtBQUV0RSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsWUFBSyxDQUFDO0FBWXpCOzs7Ozs7R0FNRztBQUVILElBQWEsR0FBRyxHQUFoQixNQUFhLEdBQUc7SUFPZCxZQUFZLFVBQXNCLEVBQUU7UUFKNUIsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUszQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRTlCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixNQUFNLENBQUMsd0NBQXdDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoRTtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLEdBQWE7UUFDckIs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QUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FDM0IsQ0FBQztTQUNIO1FBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBeUIsQ0FBQztTQUN6RTtJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsSUFBZTtRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0YsQ0FBQTtBQWpMWSxHQUFHO0lBRGYsaUJBQU87R0FDSyxHQUFHLENBaUxmO0FBakxZLGtCQUFHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JiaXQgfSBmcm9tICcuL21haW4nO1xuaW1wb3J0IHsgZXZlbnRlZCwgRXZlbnRlZCB9IGZyb20gJy4vZXZlbnRlZCc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICcuL2J1Y2tldCc7XG5pbXBvcnQgeyBOb3RMb2dnZWRFeGNlcHRpb24sIE91dE9mUmFuZ2VFeGNlcHRpb24gfSBmcm9tICcuL2V4Y2VwdGlvbic7XG5cbmNvbnN0IHsgYXNzZXJ0IH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dPcHRpb25zIHtcbiAgbmFtZT86IHN0cmluZztcbiAgZGF0YT86IHN0cmluZ1tdO1xuICBidWNrZXQ/OiBCdWNrZXQ8c3RyaW5nW10+O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBMb2dcbiAgZXh0ZW5kcyBFdmVudGVkPCdhcHBlbmQnIHwgJ3RydW5jYXRlJyB8ICdyb2xsYmFjaycgfCAnY2xlYXInIHwgJ2NoYW5nZSc+IHt9XG5cbi8qKlxuICogTG9ncyB0cmFjayBhIHNlcmllcyBvZiB1bmlxdWUgZXZlbnRzIHRoYXQgaGF2ZSBvY2N1cnJlZC4gRWFjaCBldmVudCBpc1xuICogdHJhY2tlZCBiYXNlZCBvbiBpdHMgdW5pcXVlIGlkLiBUaGUgbG9nIG9ubHkgdHJhY2tzIHRoZSBpZHMgYnV0IGN1cnJlbnRseVxuICogZG9lcyBub3QgdHJhY2sgYW55IGRldGFpbHMuXG4gKlxuICogTG9ncyBjYW4gYXV0b21hdGljYWxseSBiZSBwZXJzaXN0ZWQgYnkgYXNzaWduaW5nIHRoZW0gYSBidWNrZXQuXG4gKi9cbkBldmVudGVkXG5leHBvcnQgY2xhc3MgTG9nIHtcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfYnVja2V0PzogQnVja2V0PHN0cmluZ1tdPjtcbiAgcHJpdmF0ZSBfZGF0YTogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgcmVpZmllZCE6IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTG9nT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5fbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB0aGlzLl9idWNrZXQgPSBvcHRpb25zLmJ1Y2tldDtcblxuICAgIGlmICh0aGlzLl9idWNrZXQpIHtcbiAgICAgIGFzc2VydCgnTG9nIHJlcXVpcmVzIGEgbmFtZSBpZiBpdCBoYXMgYSBidWNrZXQnLCAhIXRoaXMuX25hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuX3JlaWZ5KG9wdGlvbnMuZGF0YSk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgZ2V0IGJ1Y2tldCgpOiBCdWNrZXQ8c3RyaW5nW10+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0O1xuICB9XG5cbiAgZ2V0IGhlYWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgZ2V0IGVudHJpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmxlbmd0aDtcbiAgfVxuXG4gIGFwcGVuZCguLi5pZHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVpZmllZFxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLl9kYXRhLCBpZHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGVyc2lzdCgpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KCdhcHBlbmQnLCBpZHMpO1xuICAgICAgfSk7XG4gIH1cblxuICBiZWZvcmUoaWQ6IHN0cmluZywgcmVsYXRpdmVQb3NpdGlvbiA9IDApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kYXRhLmluZGV4T2YoaWQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBOb3RMb2dnZWRFeGNlcHRpb24oaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZlJhbmdlRXhjZXB0aW9uKHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zbGljZSgwLCBwb3NpdGlvbik7XG4gIH1cblxuICBhZnRlcihpZDogc3RyaW5nLCByZWxhdGl2ZVBvc2l0aW9uID0gMCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2RhdGEuaW5kZXhPZihpZCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IE5vdExvZ2dlZEV4Y2VwdGlvbihpZCk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb24gPSBpbmRleCArIDEgKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPiB0aGlzLl9kYXRhLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFeGNlcHRpb24ocG9zaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNsaWNlKHBvc2l0aW9uKTtcbiAgfVxuXG4gIHRydW5jYXRlKGlkOiBzdHJpbmcsIHJlbGF0aXZlUG9zaXRpb24gPSAwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlbW92ZWQ6IHN0cmluZ1tdO1xuXG4gICAgcmV0dXJuIHRoaXMucmVpZmllZFxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2RhdGEuaW5kZXhPZihpZCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90TG9nZ2VkRXhjZXB0aW9uKGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUV4Y2VwdGlvbihwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IHRoaXMuX2RhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgcmVtb3ZlZCA9IHRoaXMuX2RhdGE7XG4gICAgICAgICAgdGhpcy5fZGF0YSA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZWQgPSB0aGlzLl9kYXRhLnNsaWNlKDAsIHBvc2l0aW9uKTtcbiAgICAgICAgICB0aGlzLl9kYXRhID0gdGhpcy5fZGF0YS5zbGljZShwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fcGVyc2lzdCgpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KCd0cnVuY2F0ZScsIGlkLCByZWxhdGl2ZVBvc2l0aW9uLCByZW1vdmVkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcm9sbGJhY2soaWQ6IHN0cmluZywgcmVsYXRpdmVQb3NpdGlvbiA9IDApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcmVtb3ZlZDogc3RyaW5nW107XG5cbiAgICByZXR1cm4gdGhpcy5yZWlmaWVkXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZGF0YS5pbmRleE9mKGlkKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RMb2dnZWRFeGNlcHRpb24oaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBpbmRleCArIDEgKyByZWxhdGl2ZVBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUV4Y2VwdGlvbihwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZW1vdmVkID0gdGhpcy5fZGF0YS5zbGljZShwb3NpdGlvbik7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhLnNsaWNlKDAsIHBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcGVyc2lzdCgpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KCdyb2xsYmFjaycsIGlkLCByZWxhdGl2ZVBvc2l0aW9uLCByZW1vdmVkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNsZWFyZWREYXRhOiBzdHJpbmdbXTtcblxuICAgIHJldHVybiB0aGlzLnJlaWZpZWRcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgY2xlYXJlZERhdGEgPSB0aGlzLl9kYXRhO1xuICAgICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJzaXN0KCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5lbWl0KCdjbGVhcicsIGNsZWFyZWREYXRhKSk7XG4gIH1cblxuICBjb250YWlucyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuaW5kZXhPZihpZCkgPiAtMTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BlcnNpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnKTtcbiAgICBpZiAodGhpcy5fYnVja2V0ICYmIHRoaXMuX25hbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2J1Y2tldC5zZXRJdGVtKHRoaXMuX25hbWUsIHRoaXMuX2RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlaWZ5KGRhdGE/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLl9pbml0RGF0YShkYXRhKTtcbiAgICAgIHRoaXMucmVpZmllZCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlaWZpZWQgPSB0aGlzLl9sb2FkRGF0YUZyb21CdWNrZXQoKS50aGVuKChidWNrZXREYXRhKSA9PlxuICAgICAgICB0aGlzLl9pbml0RGF0YShidWNrZXREYXRhKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWlmaWVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfbG9hZERhdGFGcm9tQnVja2V0KCk6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5fYnVja2V0ICYmIHRoaXMuX25hbWUpIHtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5fYnVja2V0LmdldEl0ZW0odGhpcy5fbmFtZSkpIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2luaXREYXRhKGRhdGE/OiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSBkYXRhID8/IFtdO1xuICB9XG59XG4iXX0=