Files
notesnook/packages/core/api/index.js

149 lines
3.8 KiB
JavaScript
Raw Normal View History

2020-02-03 12:03:07 +05:00
import Notes from "../collections/notes";
2020-04-13 12:46:29 +05:00
import Storage from "../database/storage";
2020-02-04 18:27:32 +05:00
import Notebooks from "../collections/notebooks";
2020-02-06 16:46:23 +05:00
import Trash from "../collections/trash";
2020-02-21 21:39:27 +05:00
import Tags from "../collections/tags";
import User from "../models/user";
2020-02-11 16:28:28 +05:00
import Sync from "./sync";
import Vault from "./vault";
2020-03-09 12:39:49 +05:00
import Lookup from "./lookup";
2020-03-19 11:30:05 +05:00
import Content from "../collections/content";
2020-09-13 13:24:24 +05:00
import Backup from "../database/backup";
import Conflicts from "./sync/conflicts";
2020-05-14 13:51:48 +05:00
import Session from "./session";
import Constants from "../utils/constants";
2020-11-02 09:50:27 +05:00
import { EV } from "../common";
import Settings from "./settings";
import Migrations from "./migrations";
2020-02-03 12:03:07 +05:00
/**
* @type {EventSource}
*/
var NNEventSource;
class Database {
/**
*
* @param {any} context
* @param {EventSource} eventsource
*/
constructor(context, eventsource) {
2020-04-13 12:46:29 +05:00
this.context = new Storage(context);
NNEventSource = eventsource;
2020-11-02 09:50:27 +05:00
this._syncTimeout = 0;
2020-02-03 12:03:07 +05:00
}
async _validate() {
2020-05-14 13:51:48 +05:00
if (!(await this.session.valid())) {
throw new Error(
"Your system clock is not setup correctly. Please adjust your date and time and then retry."
);
}
await this.session.set();
}
async init() {
2020-11-02 09:50:27 +05:00
EV.subscribeMulti(
["user:loggedIn", "user:loggedOut", "user:tokenRefreshed", "user:synced"],
this._onUserStateChanged.bind(this)
);
2020-11-02 09:50:27 +05:00
EV.subscribe("db:write", this._onDBWrite.bind(this));
this.session = new Session(this.context);
await this._validate();
2020-05-14 13:51:48 +05:00
this.user = new User(this);
2020-02-11 16:28:28 +05:00
this.syncer = new Sync(this);
2020-04-16 02:36:09 +05:00
this.vault = new Vault(this);
2020-04-04 13:29:33 +05:00
this.conflicts = new Conflicts(this);
2020-04-16 02:14:53 +05:00
this.lookup = new Lookup(this);
2020-09-13 13:24:24 +05:00
this.backup = new Backup(this);
2020-11-25 15:04:39 +05:00
this.settings = new Settings(this);
this.migrations = new Migrations(this);
2020-04-16 02:14:53 +05:00
// collections
/** @type {Notes} */
2020-11-24 01:39:32 +05:00
this.notes = await Notes.new(this, "notes", true, true);
2020-04-16 02:14:53 +05:00
/** @type {Notebooks} */
this.notebooks = await Notebooks.new(this, "notebooks");
2020-04-16 02:14:53 +05:00
/** @type {Tags} */
this.tags = await Tags.new(this, "tags");
/** @type {Tags} */
this.colors = await Tags.new(this, "colors");
/** @type {Content} */
this.content = await Content.new(this, "content", false);
/** @type {Trash} */
this.trash = await Trash.new(this, "trash");
2020-11-25 15:04:39 +05:00
await this.settings.init();
await this.user.sync();
2020-12-05 15:33:40 +05:00
await this.migrations.init();
await this.migrations.migrate();
2020-08-24 11:14:16 +05:00
}
2020-08-24 11:33:37 +05:00
async _onUserStateChanged(user) {
if (!NNEventSource) return;
2020-08-24 11:14:16 +05:00
if (this.evtSource) {
this.evtSource.close();
}
if (!user) return;
if (!user.accessToken) {
user = await this.user.get();
}
2020-08-24 11:14:16 +05:00
2020-09-19 11:48:31 +05:00
this.evtSource = new NNEventSource(`${Constants.HOST}/events`, {
2020-08-24 11:14:16 +05:00
headers: { Authorization: `Bearer ${user.accessToken}` },
});
this.evtSource.onopen = function () {
2020-09-20 09:15:23 +05:00
console.log("SSE: opened channel successfully!");
};
this.evtSource.onerror = function (error) {
console.log("SSE: error:", error);
};
2020-08-24 11:14:16 +05:00
this.evtSource.onmessage = async (event) => {
2020-09-20 09:15:23 +05:00
try {
var { type, data } = JSON.parse(event.data);
} catch (e) {
console.log("SSE: Unsupported message. Message = ", event.data);
return;
}
2020-08-24 11:14:16 +05:00
switch (type) {
case "upgrade":
await this.user.set({
2020-10-28 12:11:18 +05:00
subscription: data,
2020-08-24 11:14:16 +05:00
});
2020-11-02 09:50:27 +05:00
EV.publish("user:upgraded", data);
2020-08-24 11:14:16 +05:00
break;
case "sync":
await this.syncer.eventMerge(data);
2020-11-02 09:50:27 +05:00
EV.publish("db:refresh");
2020-08-24 11:14:16 +05:00
break;
}
};
2020-02-11 16:28:28 +05:00
}
2020-11-02 09:50:27 +05:00
async _onDBWrite() {
clearTimeout(this._syncTimeout);
this._syncTimeout = setTimeout(() => {
EV.publish("db:sync");
}, 60 * 1000);
}
2020-02-11 16:28:28 +05:00
sync() {
return this.syncer.start();
2020-02-03 12:03:07 +05:00
}
2020-09-19 11:36:37 +05:00
host(host) {
if (process.env.NODE_ENV !== "production") {
2020-09-19 11:48:31 +05:00
Constants.HOST = host || Constants.HOST;
2020-09-19 11:36:37 +05:00
}
}
2020-02-03 12:03:07 +05:00
}
export default Database;