summaryrefslogtreecommitdiff
path: root/viewer/loader.ts
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-04-01 16:03:53 +0200
committermetamuffin <metamuffin@disroot.org>2025-04-01 16:03:53 +0200
commita231b309dcf2839a0fdd0651fe84af8694f38c4d (patch)
treeeddb93b2bd651ae05b5cafa012895ce6bd99bc10 /viewer/loader.ts
parentb3cc7d7dbc6f9f28d91acab77a65f976a3c996a9 (diff)
downloadwearemapping-master.tar
wearemapping-master.tar.bz2
wearemapping-master.tar.zst
websocket loaderHEADmaster
Diffstat (limited to 'viewer/loader.ts')
-rw-r--r--viewer/loader.ts71
1 files changed, 71 insertions, 0 deletions
diff --git a/viewer/loader.ts b/viewer/loader.ts
new file mode 100644
index 0000000..487102f
--- /dev/null
+++ b/viewer/loader.ts
@@ -0,0 +1,71 @@
+import { Resource, RespackEntry } from "./resources.ts";
+
+export abstract class Loader {
+ num_loading: number = 0
+ abstract download(res: Resource<undefined>): Promise<Uint8Array>
+ abstract get_entry(): Promise<Resource<RespackEntry>>;
+ abstract wait_ready(): Promise<void>
+}
+
+export class HTTPLoader extends Loader {
+ constructor() {
+ super();
+ }
+ // deno-lint-ignore require-await
+ async wait_ready(): Promise<void> {
+ return
+ }
+ async download<T>(res: Resource<T>): Promise<Uint8Array> {
+ this.num_loading += 1
+ const resp = await fetch(`http://127.0.0.1:28556/${res.toString()}`)
+ if (!resp.ok) throw new Error("aaaa");
+ const buf = await resp.bytes()
+ this.num_loading -= 1
+ return buf
+ }
+ async get_entry(): Promise<Resource<RespackEntry>> {
+ const resp = await fetch("http://127.0.0.1:28556/entry")
+ if (!resp.ok) throw new Error("aaaa");
+ return new Resource(await resp.bytes())
+ }
+}
+export class WSLoader extends Loader {
+ ws: WebSocket
+ queue: ((r: Uint8Array) => void)[] = []
+ constructor() {
+ super()
+ this.ws = new WebSocket(`http://127.0.0.1:28557/`)
+ this.ws.onopen = () => console.log("open");
+ this.ws.onclose = () => console.log("close");
+ this.ws.onmessage = m => {
+ if (typeof m.data == "string") throw new Error(m.data);
+ if (m.data instanceof Blob) {
+ const h = this.queue.shift()!
+ m.data.arrayBuffer()
+ .then(b => new Uint8Array(b))
+ .then(h)
+ .then(() => this.num_loading -= 1)
+ }
+ }
+ }
+ wait_ready(): Promise<void> {
+ return new Promise(resolve => {
+ if (this.ws.readyState == this.ws.OPEN) return resolve()
+ else this.ws.addEventListener("open", () => resolve())
+ })
+ }
+ download<T>(res: Resource<T>): Promise<Uint8Array> {
+ return new Promise(resolve => {
+ this.num_loading += 1
+ this.queue.push(resolve)
+ this.ws.send(res.hash)
+ })
+ }
+ get_entry(): Promise<Resource<RespackEntry>> {
+ return new Promise(resolve => {
+ this.num_loading += 1
+ this.queue.push(buf => resolve(new Resource(buf)))
+ this.ws.send("entry")
+ })
+ }
+}