mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-12 22:10:01 -04:00
idbmap is no more
This commit is contained in:
parent
a1abb6c494
commit
207f01992b
5 changed files with 75 additions and 32 deletions
|
@ -51,7 +51,6 @@
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mercuryworkshop/bare-mux": "^2.1.2",
|
"@mercuryworkshop/bare-mux": "^2.1.2",
|
||||||
"@webreflection/idb-map": "^0.3.2",
|
|
||||||
"dom-serializer": "^2.0.0",
|
"dom-serializer": "^2.0.0",
|
||||||
"domhandler": "^5.0.3",
|
"domhandler": "^5.0.3",
|
||||||
"domutils": "^3.1.0",
|
"domutils": "^3.1.0",
|
||||||
|
|
8
pnpm-lock.yaml
generated
8
pnpm-lock.yaml
generated
|
@ -11,9 +11,6 @@ importers:
|
||||||
'@mercuryworkshop/bare-mux':
|
'@mercuryworkshop/bare-mux':
|
||||||
specifier: ^2.1.2
|
specifier: ^2.1.2
|
||||||
version: 2.1.2
|
version: 2.1.2
|
||||||
'@webreflection/idb-map':
|
|
||||||
specifier: ^0.3.2
|
|
||||||
version: 0.3.2
|
|
||||||
dom-serializer:
|
dom-serializer:
|
||||||
specifier: ^2.0.0
|
specifier: ^2.0.0
|
||||||
version: 2.0.0
|
version: 2.0.0
|
||||||
|
@ -661,9 +658,6 @@ packages:
|
||||||
'@webassemblyjs/wast-printer@1.12.1':
|
'@webassemblyjs/wast-printer@1.12.1':
|
||||||
resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==}
|
resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==}
|
||||||
|
|
||||||
'@webreflection/idb-map@0.3.2':
|
|
||||||
resolution: {integrity: sha512-VLBTx6EUYF/dPdLyyjWWKxQmTWnVXTT1YJekrJUmfGxBcqEVL0Ih2EQptNG/JezkTYgJ0uSTb0yAum/THltBvQ==}
|
|
||||||
|
|
||||||
'@xtuc/ieee754@1.2.0':
|
'@xtuc/ieee754@1.2.0':
|
||||||
resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
|
resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
|
||||||
|
|
||||||
|
@ -3374,8 +3368,6 @@ snapshots:
|
||||||
'@webassemblyjs/ast': 1.12.1
|
'@webassemblyjs/ast': 1.12.1
|
||||||
'@xtuc/long': 4.2.2
|
'@xtuc/long': 4.2.2
|
||||||
|
|
||||||
'@webreflection/idb-map@0.3.2': {}
|
|
||||||
|
|
||||||
'@xtuc/ieee754@1.2.0': {}
|
'@xtuc/ieee754@1.2.0': {}
|
||||||
|
|
||||||
'@xtuc/long@4.2.2': {}
|
'@xtuc/long@4.2.2': {}
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
import IDBMap from "@webreflection/idb-map";
|
|
||||||
import { ScramjetConfig } from "../types";
|
import { ScramjetConfig } from "../types";
|
||||||
import { Codec } from "../codecs";
|
import { Codec } from "../codecs";
|
||||||
import type { ScramjetClient } from "../client/client";
|
|
||||||
import { ScramjetFrame } from "./frame";
|
import { ScramjetFrame } from "./frame";
|
||||||
|
|
||||||
export class ScramjetController {
|
export class ScramjetController {
|
||||||
config: ScramjetConfig;
|
config: ScramjetConfig;
|
||||||
private store: IDBMap;
|
private store: IDBDatabase;
|
||||||
codec: Codec;
|
codec: Codec;
|
||||||
|
|
||||||
constructor(config: ScramjetConfig) {
|
constructor(config: ScramjetConfig) {
|
||||||
|
@ -55,10 +53,7 @@ export class ScramjetController {
|
||||||
await import(/* webpackIgnore: true */ this.config.codecs);
|
await import(/* webpackIgnore: true */ this.config.codecs);
|
||||||
this.codec = self.$scramjet.codecs[this.config.codec];
|
this.codec = self.$scramjet.codecs[this.config.codec];
|
||||||
|
|
||||||
this.store = new IDBMap("config", {
|
await this.openIDB();
|
||||||
prefix: "scramjet",
|
|
||||||
});
|
|
||||||
await this.#saveConfig();
|
|
||||||
|
|
||||||
const reg = await navigator.serviceWorker.register(serviceWorkerPath);
|
const reg = await navigator.serviceWorker.register(serviceWorkerPath);
|
||||||
dbg.log("service worker registered");
|
dbg.log("service worker registered");
|
||||||
|
@ -80,8 +75,39 @@ export class ScramjetController {
|
||||||
return this.config.prefix + this.codec.encode(url);
|
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() {
|
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) {
|
async modifyConfig(config: ScramjetConfig) {
|
||||||
|
|
|
@ -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
|
// i am a cat. i like to be petted. i like to be fed. i like to be
|
||||||
import {
|
import {
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
import IDBMap from "@webreflection/idb-map";
|
|
||||||
import { FakeServiceWorker } from "./fakesw";
|
import { FakeServiceWorker } from "./fakesw";
|
||||||
import { swfetch } from "./fetch";
|
import { swfetch } from "./fetch";
|
||||||
import { ScramjetThreadpool } from "./threadpool";
|
import { ScramjetThreadpool } from "./threadpool";
|
||||||
import type BareClient from "@mercuryworkshop/bare-mux";
|
import type BareClient from "@mercuryworkshop/bare-mux";
|
||||||
import { rewriteWorkers } from "../shared";
|
import { ScramjetConfig } from "../types";
|
||||||
|
|
||||||
export class ScramjetServiceWorker extends EventTarget {
|
export class ScramjetServiceWorker extends EventTarget {
|
||||||
client: BareClient;
|
client: BareClient;
|
||||||
|
@ -23,6 +22,8 @@ export class ScramjetServiceWorker extends EventTarget {
|
||||||
|
|
||||||
this.threadpool = new ScramjetThreadpool();
|
this.threadpool = new ScramjetThreadpool();
|
||||||
|
|
||||||
|
this.cookieStore.load
|
||||||
|
|
||||||
addEventListener("message", ({ data }: { data: MessageC2W }) => {
|
addEventListener("message", ({ data }: { data: MessageC2W }) => {
|
||||||
if (!("scramjet$type" in data)) return;
|
if (!("scramjet$type" in data)) return;
|
||||||
|
|
||||||
|
@ -34,8 +35,6 @@ export class ScramjetServiceWorker extends EventTarget {
|
||||||
|
|
||||||
if (data.scramjet$type === "cookie") {
|
if (data.scramjet$type === "cookie") {
|
||||||
this.cookieStore.setCookies([data.cookie], new URL(data.url));
|
this.cookieStore.setCookies([data.cookie], new URL(data.url));
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -43,16 +42,42 @@ export class ScramjetServiceWorker extends EventTarget {
|
||||||
async loadConfig() {
|
async loadConfig() {
|
||||||
if (this.config) return;
|
if (this.config) return;
|
||||||
|
|
||||||
const store = new IDBMap("config", {
|
// const store = new IDBMap("config", {
|
||||||
prefix: "scramjet",
|
// 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];
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 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);
|
||||||
});
|
});
|
||||||
|
|
||||||
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];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
route({ request }: FetchEvent) {
|
route({ request }: FetchEvent) {
|
||||||
|
@ -68,6 +93,7 @@ export class ScramjetServiceWorker extends EventTarget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
self.ScramjetServiceWorker = ScramjetServiceWorker;
|
self.ScramjetServiceWorker = ScramjetServiceWorker;
|
||||||
|
|
||||||
type RegisterServiceWorkerMessage = {
|
type RegisterServiceWorkerMessage = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue