diff --git a/packages/core/api/index.js b/packages/core/api/index.js index 70ba616f3..bbd72fa70 100644 --- a/packages/core/api/index.js +++ b/packages/core/api/index.js @@ -17,7 +17,7 @@ class Database { } async init() { - this.user = new User(this.context); + this.user = new User(this); this.syncer = new Sync(this); this.vault = new Vault(this); this.conflicts = new Conflicts(this); diff --git a/packages/core/collections/collection.js b/packages/core/collections/collection.js index cf9bd4d01..d64a56191 100644 --- a/packages/core/collections/collection.js +++ b/packages/core/collections/collection.js @@ -5,7 +5,11 @@ class Collection { static async new(db, name = undefined, cached = true) { const collection = new this(db, name || this.name.toLowerCase(), cached); await collection._collection.init(); + if (collection.init) await collection.init(); + if (collection.clear) + this._db.ev.subscribe("clear", collection._collection.clear); + return collection; } diff --git a/packages/core/database/cached-collection.js b/packages/core/database/cached-collection.js index 3a7031458..33f854674 100644 --- a/packages/core/database/cached-collection.js +++ b/packages/core/database/cached-collection.js @@ -14,6 +14,10 @@ export default class CachedCollection { if (data.length > 0) this.map = new Map(data); } + clear = () => { + this.map.clear(); + }; + /** * * @param {Promise} ops @@ -54,7 +58,7 @@ export default class CachedCollection { id, deleted: true, dateEdited: Date.now(), - dateCreated: Date.now() + dateCreated: Date.now(), }; await this.indexer.write(id, deletedItem); this.map.set(id, deletedItem); @@ -72,9 +76,9 @@ export default class CachedCollection { return Array.from(this.map.values()); } - getAllItems(sortFn = u => u.dateCreated) { + getAllItems(sortFn = (u) => u.dateCreated) { let items = []; - this.map.forEach(value => { + this.map.forEach((value) => { if (value.deleted) return; items[items.length] = value; }); diff --git a/packages/core/models/user.js b/packages/core/models/user.js index 0606674a0..aa22e7d2d 100644 --- a/packages/core/models/user.js +++ b/packages/core/models/user.js @@ -1,17 +1,17 @@ import { HOST, HEADERS } from "../utils/constants"; -import StorageInterface from "../database/storage"; export default class User { /** * - * @param {StorageInterface} context + * @param {import("../api").default} db */ - constructor(context) { - this.context = context; + constructor(db) { + this._db = db; + this._context = db._context; } get() { - return this.context.read("user"); + return this._context.read("user"); } async key() { @@ -22,7 +22,7 @@ export default class User { async set(user) { if (!user) return; user = { ...(await this.get()), ...user }; - await this.context.write("user", user); + await this._context.write("user", user); } async login(username, password) { @@ -31,16 +31,16 @@ export default class User { password, grant_type: "password", }); - const key = await this.context.deriveKey(password, response.payload.salt); + const key = await this._context.deriveKey(password, response.payload.salt); let user = userFromResponse(response, key); - await this.context.write("user", user); + await this._context.write("user", user); } async token() { let user = await this.get(); if (!user) return; if (!user.accessToken) { - return await this.context.remove("user"); + return await this._context.remove("user"); } if (user.expiry > Date.now()) { return user.accessToken; @@ -56,11 +56,12 @@ export default class User { refreshToken: response.refresh_token, expiry: Date.now() + response.expiry * 100, }; - await this.context.write("user", user); + await this._context.write("user", user); } logout() { - return this.context.clear(); + this._db.ev.publish("clear"); + return this._context.clear(); } async signup(username, email, password) { @@ -69,9 +70,9 @@ export default class User { password, email, }); - const key = await this.context.deriveKey(password, response.payload.salt); + const key = await this._context.deriveKey(password, response.payload.salt); let user = userFromResponse(response, key); - await this.context.write("user", user); + await this._context.write("user", user); } }