idbmap is no more

This commit is contained in:
wearrrrr 2024-10-12 16:40:59 -05:00
parent a1abb6c494
commit 207f01992b
5 changed files with 75 additions and 32 deletions

View file

@ -1,12 +1,10 @@
import IDBMap from "@webreflection/idb-map";
import { ScramjetConfig } from "../types";
import { Codec } from "../codecs";
import type { ScramjetClient } from "../client/client";
import { ScramjetFrame } from "./frame";
export class ScramjetController {
config: ScramjetConfig;
private store: IDBMap;
private store: IDBDatabase;
codec: Codec;
constructor(config: ScramjetConfig) {
@ -55,11 +53,8 @@ export class ScramjetController {
await import(/* webpackIgnore: true */ this.config.codecs);
this.codec = self.$scramjet.codecs[this.config.codec];
this.store = new IDBMap("config", {
prefix: "scramjet",
});
await this.#saveConfig();
await this.openIDB();
const reg = await navigator.serviceWorker.register(serviceWorkerPath);
dbg.log("service worker registered");
@ -80,8 +75,39 @@ export class ScramjetController {
return this.config.prefix + this.codec.encode(url);
}
async openIDB(): Promise<IDBDatabase> {
const db = indexedDB.open("$scramjet", 1);
return new Promise<IDBDatabase>((resolve, reject) => {
db.onsuccess = async () => {
this.store = db.result;
await this.#saveConfig();
resolve(db.result);
};
db.onupgradeneeded = () => {
const db2 = db.result;
if (!db2.objectStoreNames.contains("config")) {
db2.createObjectStore("config");
}
};
db.onerror = () => reject(db.error);
});
}
async #saveConfig() {
this.store.set("config", this.config);
if (!this.store) {
console.error("Store not ready!")
return
}
const tx = this.store.transaction("config", "readwrite");
const store = tx.objectStore("config");
const req = store.put(this.config, "config");
return new Promise((resolve, reject) => {
req.onsuccess = resolve;
req.onerror = reject;
});
}
async modifyConfig(config: ScramjetConfig) {

View file

@ -1,4 +1,4 @@
import { URLMeta, decodeUrl } from "./url";
import { URLMeta } from "./url";
// i am a cat. i like to be petted. i like to be fed. i like to be
import {

View file

@ -1,9 +1,8 @@
import IDBMap from "@webreflection/idb-map";
import { FakeServiceWorker } from "./fakesw";
import { swfetch } from "./fetch";
import { ScramjetThreadpool } from "./threadpool";
import type BareClient from "@mercuryworkshop/bare-mux";
import { rewriteWorkers } from "../shared";
import { ScramjetConfig } from "../types";
export class ScramjetServiceWorker extends EventTarget {
client: BareClient;
@ -23,6 +22,8 @@ export class ScramjetServiceWorker extends EventTarget {
this.threadpool = new ScramjetThreadpool();
this.cookieStore.load
addEventListener("message", ({ data }: { data: MessageC2W }) => {
if (!("scramjet$type" in data)) return;
@ -34,8 +35,6 @@ export class ScramjetServiceWorker extends EventTarget {
if (data.scramjet$type === "cookie") {
this.cookieStore.setCookies([data.cookie], new URL(data.url));
return;
}
});
}
@ -43,16 +42,42 @@ export class ScramjetServiceWorker extends EventTarget {
async loadConfig() {
if (this.config) return;
const store = new IDBMap("config", {
prefix: "scramjet",
});
// const store = new IDBMap("config", {
// prefix: "scramjet",
// });
if (store.has("config")) {
const config = await store.get("config");
this.config = config;
self.$scramjet.config = config;
self.$scramjet.codec = self.$scramjet.codecs[config.codec];
}
// if (store.has("config")) {
// const config = await store.get("config");
// this.config = config;
// self.$scramjet.config = config;
// self.$scramjet.codec = self.$scramjet.codecs[config.codec];
// }
// Recreate the above code using the stock IDB API
const request = indexedDB.open("$scramjet", 1);
return new Promise<void>((resolve, reject) => {
request.onsuccess = async () => {
const db = request.result;
const tx = db.transaction("config", "readonly");
const store = tx.objectStore("config");
const config = store.get("config")
config.onsuccess = () => {
this.config = config.result;
self.$scramjet.config = config.result;
self.$scramjet.codec = self.$scramjet.codecs[config.result.codec];
resolve();
};
config.onerror = () => reject(config.error);
};
request.onerror = () => reject(request.error);
});
}
route({ request }: FetchEvent) {
@ -68,6 +93,7 @@ export class ScramjetServiceWorker extends EventTarget {
}
}
// @ts-ignore
self.ScramjetServiceWorker = ScramjetServiceWorker;
type RegisterServiceWorkerMessage = {