diff --git a/package.json b/package.json index 274d1e1..bc07127 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "type": "module", "dependencies": { "@mercuryworkshop/bare-mux": "^2.1.2", - "@webreflection/idb-map": "^0.3.2", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4e089c..dbd315c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: '@mercuryworkshop/bare-mux': specifier: ^2.1.2 version: 2.1.2 - '@webreflection/idb-map': - specifier: ^0.3.2 - version: 0.3.2 dom-serializer: specifier: ^2.0.0 version: 2.0.0 @@ -661,9 +658,6 @@ packages: '@webassemblyjs/wast-printer@1.12.1': resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - '@webreflection/idb-map@0.3.2': - resolution: {integrity: sha512-VLBTx6EUYF/dPdLyyjWWKxQmTWnVXTT1YJekrJUmfGxBcqEVL0Ih2EQptNG/JezkTYgJ0uSTb0yAum/THltBvQ==} - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -3374,8 +3368,6 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webreflection/idb-map@0.3.2': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} diff --git a/src/controller/index.ts b/src/controller/index.ts index 60ad814..eb7c835 100644 --- a/src/controller/index.ts +++ b/src/controller/index.ts @@ -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 { + const db = indexedDB.open("$scramjet", 1); + + return new Promise((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) { diff --git a/src/shared/rewriters/js.ts b/src/shared/rewriters/js.ts index a2dec43..aad5ce5 100644 --- a/src/shared/rewriters/js.ts +++ b/src/shared/rewriters/js.ts @@ -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 { diff --git a/src/worker/index.ts b/src/worker/index.ts index b60476b..67bcbf2 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -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((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 = {