UNPKG

@ortoo/angular-resource

Version:

Magical CRUD resource management for angular

110 lines 12 kB
import { isObject } from 'lodash'; import { EventEmitter } from '../../emitter'; import { Database } from '../../types'; import { uuid } from '../../utils'; // These are the operators nedb supports const simpleOperators = { $and: true, $exists: true, $gt: true, $gte: true, $in: true, $lt: true, $lte: true, $ne: true, $nin: true, $not: true, $or: true, $regex: true, $size: true, }; export function createWebWorkerDbFactory(worker) { let workerEmitter = new EventEmitter(); worker.onmessage = (event) => { workerEmitter.emit('message', event); }; class WebWorkerDb extends Database { constructor() { super(); this.worker = worker; this.cbMaps = {}; this.dbid = uuid(); workerEmitter.addListener('message', (event) => { let data = event.data.data; let error = event.data.error; let id = event.data.id; let cb = this.cbMaps[id]; if (cb) { cb(error, data); } }); } update(res) { if (res.$deleted) { return this.runWorkerFunction('remove', res.$id); } else { let doc = res.$toObject(); // Stick on the internal id doc.$id = res.$id; return this.runWorkerFunction('update', doc); } } query(qry) { return this.runWorkerFunction('query', qry); } qryIsSimple(qry) { let simple = true; if (Array.isArray(qry)) { qry.forEach(val => { let kosher = this.qryIsSimple(val); if (!kosher) { simple = false; return false; } }); } else if (isObject(qry)) { for (let key of Object.keys(qry)) { let val = qry[key]; // The key is fine if it doesn't begin with $ or is a simple operator let kosherKey = (key[0] !== '$') || simpleOperators[key]; if (!kosherKey) { simple = false; break; } let valKosher = this.qryIsSimple(val); if (!valKosher) { simple = false; break; } } } return simple; } runWorkerFunction(fnName, ...args) { return new Promise((resolve, reject) => { let id = uuid(); this.worker.postMessage({ fnName, id, dbid: this.dbid, args, }); this.cbMaps[id] = (err, resp) => { delete this.cbMaps[id]; if (err) { reject(err); } else { resolve(resp); } }; }); } } return () => { return new WebWorkerDb(); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiL0BvcnRvby9hbmd1bGFyLXJlc291cmNlLyIsInNvdXJjZXMiOlsiZGJzL3dlYndvcmtlci9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBYyxNQUFNLGFBQWEsQ0FBQztBQUNuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5DLHdDQUF3QztBQUN4QyxNQUFNLGVBQWUsR0FBRztJQUN0QixJQUFJLEVBQUUsSUFBSTtJQUNWLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLElBQUk7SUFDVCxJQUFJLEVBQUUsSUFBSTtJQUNWLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxJQUFJLEVBQUUsSUFBSTtJQUNWLEdBQUcsRUFBRSxJQUFJO0lBQ1QsSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsSUFBSTtJQUNWLEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFNRixNQUFNLG1DQUFtQyxNQUFjO0lBQ3JELElBQUksYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFdkMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQW1CO1FBQ3JDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQztJQUVGLGlCQUFrQixTQUFRLFFBQVE7UUFLaEM7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUVSLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJ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TSxDQUFDLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRU8saUJBQWlCLENBQUMsTUFBYyxFQUFFLEdBQUcsSUFBVztZQUN0RCxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTTtnQkFDakMsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO29CQUN0QixNQUFNO29CQUNOLEVBQUU7b0JBQ0YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNmLElBQUk7aUJBQ0wsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSTtvQkFDMUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN2QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDZCxDQUFDO29CQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDaEIsQ0FBQztnQkFDSCxDQUFDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRjtJQUVELE1BQU0sQ0FBQztRQUNMLE1BQU0sQ0FBQyxJQUFJLFdBQVcsRUFBYyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2VtaXR0ZXInO1xuaW1wb3J0IHsgRGF0YWJhc2UsIExvY2FsTW9kZWwgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG4vLyBUaGVzZSBhcmUgdGhlIG9wZXJhdG9ycyBuZWRiIHN1cHBvcnRzXG5jb25zdCBzaW1wbGVPcGVyYXRvcnMgPSB7XG4gICRhbmQ6IHRydWUsXG4gICRleGlzdHM6IHRydWUsXG4gICRndDogdHJ1ZSxcbiAgJGd0ZTogdHJ1ZSxcbiAgJGluOiB0cnVlLFxuICAkbHQ6IHRydWUsXG4gICRsdGU6IHRydWUsXG4gICRuZTogdHJ1ZSxcbiAgJG5pbjogdHJ1ZSxcbiAgJG5vdDogdHJ1ZSxcbiAgJG9yOiB0cnVlLFxuICAkcmVnZXg6IHRydWUsXG4gICRzaXplOiB0cnVlLFxufTtcblxuaW50ZXJmYWNlIENhbGxiYWNrIHtcbiAgKGVycj86IEVycm9yLCBkYXRhPzogYW55KTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYldvcmtlckRiRmFjdG9yeSh3b3JrZXI6IFdvcmtlcikge1xuICBsZXQgd29ya2VyRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICB3b3JrZXIub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICB3b3JrZXJFbWl0dGVyLmVtaXQoJ21lc3NhZ2UnLCBldmVudCk7XG4gIH07XG5cbiAgY2xhc3MgV2ViV29ya2VyRGIgZXh0ZW5kcyBEYXRhYmFzZSB7XG4gICAgcHJpdmF0ZSB3b3JrZXI6IFdvcmtlcjtcbiAgICBwcml2YXRlIGNiTWFwczoge1tpZDogc3RyaW5nXTogQ2FsbGJhY2t9O1xuICAgIHByaXZhdGUgZGJpZDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcigpO1xuXG4gICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgIHRoaXMuY2JNYXBzID0ge307XG4gICAgICB0aGlzLmRiaWQgPSB1dWlkKCk7XG5cbiAgICAgIHdvcmtlckVtaXR0ZXIuYWRkTGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTtcbiAgICAgICAgbGV0IGVycm9yID0gZXZlbnQuZGF0YS5lcnJvcjtcbiAgICAgICAgbGV0IGlkID0gZXZlbnQuZGF0YS5pZDtcbiAgICAgICAgbGV0IGNiID0gdGhpcy5jYk1hcHNbaWRdO1xuXG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgIGNiKGVycm9yLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShyZXM6IExvY2FsTW9kZWwpIHtcbiAgICAgIGlmIChyZXMuJGRlbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuV29ya2VyRnVuY3Rpb24oJ3JlbW92ZScsIHJlcy4kaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGRvYyA9IHJlcy4kdG9PYmplY3QoKTtcbiAgICAgICAgLy8gU3RpY2sgb24gdGhlIGludGVybmFsIGlkXG4gICAgICAgIGRvYy4kaWQgPSByZXMuJGlkO1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5Xb3JrZXJGdW5jdGlvbigndXBkYXRlJywgZG9jKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcXVlcnkocXJ5OiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bldvcmtlckZ1bmN0aW9uKCdxdWVyeScsIHFyeSkgYXMgUHJvbWlzZTxzdHJpbmdbXT47XG4gICAgfVxuXG4gICAgcHVibGljIHFyeUlzU2ltcGxlKHFyeTogYW55KTogYm9vbGVhbiB7XG4gICAgICBsZXQgc2ltcGxlID0gdHJ1ZTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocXJ5KSkge1xuICAgICAgICBxcnkuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgIGxldCBrb3NoZXIgPSB0aGlzLnFyeUlzU2ltcGxlKHZhbCk7XG4gICAgICAgICAgaWYgKCFrb3NoZXIpIHtcbiAgICAgICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHFyeSkpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHFyeSkpIHtcbiAgICAgICAgICBsZXQgdmFsID0gcXJ5W2tleV07XG4gICAgICAgICAgLy8gVGhlIGtleSBpcyBmaW5lIGlmIGl0IGRvZXNuJ3QgYmVnaW4gd2l0aCAkIG9yIGlzIGEgc2ltcGxlIG9wZXJhdG9yXG4gICAgICAgICAgbGV0IGtvc2hlcktleSA9IChrZXlbMF0gIT09ICckJykgfHwgc2ltcGxlT3BlcmF0b3JzW2tleV07XG5cbiAgICAgICAgICBpZiAoIWtvc2hlcktleSkge1xuICAgICAgICAgICAgc2ltcGxlID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdmFsS29zaGVyID0gdGhpcy5xcnlJc1NpbXBsZSh2YWwpO1xuXG4gICAgICAgICAgaWYgKCF2YWxLb3NoZXIpIHtcbiAgICAgICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzaW1wbGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Xb3JrZXJGdW5jdGlvbihmbk5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBpZCA9IHV1aWQoKTtcbiAgICAgICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIGZuTmFtZSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBkYmlkOiB0aGlzLmRiaWQsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYk1hcHNbaWRdID0gKGVyciwgcmVzcCkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmNiTWFwc1tpZF07XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICByZXR1cm4gbmV3IFdlYldvcmtlckRiKCkgYXMgRGF0YWJhc2U7XG4gIH07XG59XG4iXX0=