Complete redo of content indexing and querying (#517)

Complete redo of data store
Introduces live queries and live templates
This commit is contained in:
Zef Hemel
2023-10-03 14:16:33 +02:00
committed by GitHub
parent 7af98e7c7b
commit 0313565610
200 changed files with 4675 additions and 4363 deletions
+17 -27
View File
@@ -1,8 +1,7 @@
import Dexie from "https://esm.sh/v120/dexie@3.2.2/dist/dexie.js";
import type { FileContent } from "../common/spaces/indexeddb_space_primitives.ts";
import type { FileContent } from "../common/spaces/datastore_space_primitives.ts";
import { simpleHash } from "../common/crypto.ts";
import { FileMeta } from "$sb/types.ts";
import { DataStore } from "../plugos/lib/datastore.ts";
import { IndexedDBKvPrimitives } from "../plugos/lib/indexeddb_kv_primitives.ts";
const CACHE_NAME = "{{CACHE_NAME}}";
@@ -61,9 +60,9 @@ self.addEventListener("activate", (event: any) => {
);
});
let db: Dexie | undefined;
let fileContentTable: Dexie.Table<FileContent, string> | undefined;
let fileMetatable: Dexie.Table<FileMeta, string> | undefined;
let ds: DataStore | undefined;
const filesMetaPrefix = ["file", "meta"];
const filesContentPrefix = ["file", "content"];
self.addEventListener("fetch", (event: any) => {
const url = new URL(event.request.url);
@@ -89,7 +88,7 @@ self.addEventListener("fetch", (event: any) => {
return cachedResponse;
}
if (!fileContentTable) {
if (!ds) {
// Not initialzed yet, or in thin client mode, let's just proxy
return fetch(request);
}
@@ -124,18 +123,14 @@ async function handleLocalFileRequest(
request: Request,
pathname: string,
): Promise<Response> {
if (!db?.isOpen()) {
console.log("Detected that the DB was closed, reopening");
await db!.open();
}
// if (!db?.isOpen()) {
// console.log("Detected that the DB was closed, reopening");
// await db!.open();
// }
const path = decodeURIComponent(pathname.slice(1));
const data = await fileContentTable!.get(path);
const data = await ds?.get<FileContent>([...filesContentPrefix, path]);
if (data) {
// console.log("Serving from space", path);
if (!data.meta) {
// Legacy database not fully synced yet
data.meta = (await fileMetatable!.get(path))!;
}
return new Response(
data.data,
{
@@ -177,7 +172,7 @@ self.addEventListener("message", (event: any) => {
caches.delete(CACHE_NAME)
.then(() => {
console.log("[Service worker]", "Cache deleted");
db?.close();
// ds?.close();
event.source.postMessage({ type: "cacheFlushed" });
});
}
@@ -186,15 +181,10 @@ self.addEventListener("message", (event: any) => {
const dbPrefix = "" + simpleHash(spaceFolderPath);
// Setup space
db = new Dexie(`${dbPrefix}_space`, {
indexedDB: globalThis.indexedDB,
const kv = new IndexedDBKvPrimitives(`${dbPrefix}_synced_space`);
kv.init().then(() => {
ds = new DataStore(kv);
console.log("Datastore in service worker initialized...");
});
db.version(1).stores({
fileMeta: "name",
fileContent: "name",
});
fileContentTable = db.table<FileContent, string>("fileContent");
fileMetatable = db.table<FileMeta, string>("fileMeta");
}
});