diff --git a/deno.lock b/deno.lock index 58cef1e..258ef5f 100644 --- a/deno.lock +++ b/deno.lock @@ -25,13 +25,13 @@ "npm:@automerge/automerge@^3.0.0-beta.0", "npm:@js-temporal/polyfill@~0.5.1", "npm:@jsr/bradenmacdonald__s3-lite-client@0.9", + "npm:@jsr/okikio__transferables@^1.0.2", "npm:@jsr/std__media-types@^1.1.0", "npm:@okikio/sharedworker@^1.1.0", "npm:@orama/orama@^3.1.7", "npm:@orama/plugin-qps@^3.1.7", "npm:@phosphor-icons/web@^2.1.2", "npm:@picocss/pico@^2.1.1", - "npm:@remote-ui/rpc@^1.4.7", "npm:@tokenizer/http@~0.9.2", "npm:@tokenizer/range@0.13", "npm:@types/throttle-debounce@^5.0.2", @@ -39,6 +39,7 @@ "npm:astro-purgecss@^5.2.2", "npm:astro-scope@^3.0.1", "npm:astro@^5.7.4", + "npm:comlink@^4.4.2", "npm:fast-average-color@^9.5.0", "npm:iconoir@^7.11.0", "npm:idb-keyval@^6.2.1", diff --git a/package-lock.json b/package-lock.json index 8ad42b7..3561269 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,17 @@ "@bradenmacdonald/s3-lite-client": "npm:@jsr/bradenmacdonald__s3-lite-client@^0.9.0", "@js-temporal/polyfill": "^0.5.1", "@okikio/sharedworker": "^1.1.0", + "@okikio/transferables": "npm:@jsr/okikio__transferables@^1.0.2", "@orama/orama": "^3.1.7", "@orama/plugin-qps": "^3.1.7", "@phosphor-icons/web": "^2.1.2", "@picocss/pico": "^2.1.1", - "@remote-ui/rpc": "^1.4.7", "@std/media-types": "npm:@jsr/std__media-types@^1.1.0", "@tokenizer/http": "^0.9.2", "@tokenizer/range": "^0.13.0", "@web-applets/sdk": "https://gitpkg.vercel.app/unternet-co/web-applets/sdk?tokono.ma/experiment&scripts.postinstall=npm%20i%20%40types%2Fnode%20%26%26%20npx%20tsc", "98.css": "^0.1.21", + "comlink": "^4.4.2", "fast-average-color": "^9.5.0", "iconoir": "^7.11.0", "idb-keyval": "^6.2.1", @@ -1138,6 +1139,12 @@ "integrity": "sha512-Xj9TUWll9mhARsKu5DtlQCjRekfJfQ2E291ow6gmXIz+WuF6uJMH8ZmGhdRTx/ndOippHnm1j/vxXNjmR6JuXw==", "license": "MIT" }, + "node_modules/@okikio/transferables": { + "name": "@jsr/okikio__transferables", + "version": "1.0.2", + "resolved": "https://npm.jsr.io/~/11/@jsr/okikio__transferables/1.0.2.tgz", + "integrity": "sha512-xz7RmslHsTt/Cy7GPnDurV1aKuUuVaR3FOIcKtLMuY8e+yEMVnwkPqaFWvsO/WbfeUQQnygo5C7g1/oLURrPsA==" + }, "node_modules/@orama/orama": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.9.tgz", @@ -1485,12 +1492,6 @@ "integrity": "sha512-kIDugA7Ps4U+2BHxiNHmvgPIQDWPDU4IeU6TNRdvXQM1uZX+FibqDQT2xUOnnO2yq/LUHcwnGlu1hvf4KfXnMg==", "license": "MIT" }, - "node_modules/@remote-ui/rpc": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@remote-ui/rpc/-/rpc-1.4.7.tgz", - "integrity": "sha512-ORiaKsbVBSEi3Z4YWOj5Ucrp70NrkNktI1hdqqfBW7Z3o0YoxTX9MIqtLmsc6721IbjmExvLrLip5I5Y7uAbng==", - "license": "MIT" - }, "node_modules/@rollup/pluginutils": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", @@ -2946,6 +2947,12 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", diff --git a/package.json b/package.json index bb47119..f6c35fa 100644 --- a/package.json +++ b/package.json @@ -4,16 +4,17 @@ "@bradenmacdonald/s3-lite-client": "npm:@jsr/bradenmacdonald__s3-lite-client@^0.9.0", "@js-temporal/polyfill": "^0.5.1", "@okikio/sharedworker": "^1.1.0", + "@okikio/transferables": "npm:@jsr/okikio__transferables@^1.0.2", "@orama/orama": "^3.1.7", "@orama/plugin-qps": "^3.1.7", "@phosphor-icons/web": "^2.1.2", "@picocss/pico": "^2.1.1", - "@remote-ui/rpc": "^1.4.7", "@std/media-types": "npm:@jsr/std__media-types@^1.1.0", "@tokenizer/http": "^0.9.2", "@tokenizer/range": "^0.13.0", "@web-applets/sdk": "https://gitpkg.vercel.app/unternet-co/web-applets/sdk?tokono.ma/experiment&scripts.postinstall=npm%20i%20%40types%2Fnode%20%26%26%20npx%20tsc", "98.css": "^0.1.21", + "comlink": "^4.4.2", "fast-average-color": "^9.5.0", "iconoir": "^7.11.0", "idb-keyval": "^6.2.1", diff --git a/src/pages/configurator/input/_applet.astro b/src/pages/configurator/input/_applet.astro index 8a714a9..62afad8 100644 --- a/src/pages/configurator/input/_applet.astro +++ b/src/pages/configurator/input/_applet.astro @@ -91,7 +91,7 @@ }; const contextualize = async (tracks: Track[]) => { - const groups = await worker.call.groupTracks(tracks); + const groups = await worker.groupTracks(tracks); const promises = Object.entries(groups).map( async ([scheme, tracksGroup]: [string, Track[]]) => { if (!isSupportedScheme(scheme) || tracksGroup.length === 0) return; @@ -124,7 +124,7 @@ }; const list = async (cachedTracks: Track[] = []) => { - const groups = await worker.call.groupTracks(cachedTracks); + const groups = await worker.groupTracks(cachedTracks); const promises = Object.entries(groups).map( async ([scheme, cachedTracksGroup]: [string, Track[]]) => { diff --git a/src/pages/engine/queue/_applet.astro b/src/pages/engine/queue/_applet.astro index 41f5f6c..4a9144a 100644 --- a/src/pages/engine/queue/_applet.astro +++ b/src/pages/engine/queue/_applet.astro @@ -34,18 +34,18 @@ context.setActionHandler("unshift", unshift); async function add(items: Track[]) { - context.data = await worker.call.add(context.data, items); + context.data = await worker.add(context.data, items); } async function pool(items: Track[]) { - context.data = await worker.call.pool(context.data, items); + context.data = await worker.pool(context.data, items); } async function shift() { - context.data = await worker.call.shift(context.data); + context.data = await worker.shift(context.data); } async function unshift() { - context.data = await worker.call.unshift(context.data); + context.data = await worker.unshift(context.data); } diff --git a/src/pages/input/native-fs/_applet.astro b/src/pages/input/native-fs/_applet.astro index ace9b47..85db049 100644 --- a/src/pages/input/native-fs/_applet.astro +++ b/src/pages/input/native-fs/_applet.astro @@ -38,23 +38,23 @@ // ACTIONS //////////////////////////////////////////// const consult = async (fileUriOrScheme: string) => { - return await worker.call.consult(fileUriOrScheme); + return await worker.consult(fileUriOrScheme); }; const contextualize = async (cachedTracks: Track[]) => { - return await worker.call.contextualize(cachedTracks); + return await worker.contextualize(cachedTracks); }; const groupConsult = async (tracks: Track[]) => { - return await worker.call.groupConsult(tracks); + return await worker.groupConsult(tracks); }; const list = async (cachedTracks: Track[] = []) => { - return await worker.call.list(cachedTracks); + return await worker.list(cachedTracks); }; const resolve = async (args: { uri: string }) => { - return await worker.call.resolve(args); + return await worker.resolve(args); }; const mount = async () => { diff --git a/src/pages/input/opensubsonic/_applet.astro b/src/pages/input/opensubsonic/_applet.astro index ab06d43..869f2c3 100644 --- a/src/pages/input/opensubsonic/_applet.astro +++ b/src/pages/input/opensubsonic/_applet.astro @@ -39,24 +39,24 @@ // ACTIONS //////////////////////////////////////////// const consult = async (fileUriOrScheme: string) => { - return await worker.call.consult(fileUriOrScheme); + return await worker.consult(fileUriOrScheme); }; const contextualize = async (tracks: Track[]) => { - const s = await worker.call.contextualize(tracks); + const s = await worker.contextualize(tracks); ui?.setServers({ ...ui?.servers(), ...s }); }; const groupConsult = async (tracks: Track[]) => { - return await worker.call.groupConsult(tracks); + return await worker.groupConsult(tracks); }; const list = async (cachedTracks: Track[] = []) => { - return await worker.call.list(cachedTracks); + return await worker.list(cachedTracks); }; const resolve = async (args: { method: string; uri: string }) => { - return await worker.call.resolve(args); + return await worker.resolve(args); }; const mount = async () => {}; diff --git a/src/pages/input/s3/_applet.astro b/src/pages/input/s3/_applet.astro index 1da197a..2457a60 100644 --- a/src/pages/input/s3/_applet.astro +++ b/src/pages/input/s3/_applet.astro @@ -59,24 +59,24 @@ // ACTIONS //////////////////////////////////////////// const consult = async (fileUriOrScheme: string) => { - return await worker.call.consult(fileUriOrScheme); + return await worker.consult(fileUriOrScheme); }; const contextualize = async (tracks: Track[]) => { - const s = await worker.call.contextualize(tracks); + const s = await worker.contextualize(tracks); ui?.setBuckets({ ...ui?.buckets(), ...s }); }; const groupConsult = async (tracks: Track[]) => { - return await worker.call.groupConsult(tracks); + return await worker.groupConsult(tracks); }; const list = async (cachedTracks: Track[] = []) => { - return await worker.call.list(cachedTracks); + return await worker.list(cachedTracks); }; const resolve = async (args: { method: string; uri: string }) => { - return await worker.call.resolve(args); + return await worker.resolve(args); }; const mount = async () => {}; diff --git a/src/pages/output/indexed-db/_applet.astro b/src/pages/output/indexed-db/_applet.astro index a83c901..9924daa 100644 --- a/src/pages/output/indexed-db/_applet.astro +++ b/src/pages/output/indexed-db/_applet.astro @@ -25,11 +25,11 @@ context, tracks: { async get() { - return worker.call.getTracks(); + return worker.getTracks(); }, async put(tracks: Track[]) { - return worker.call.putTracks(tracks); + return worker.putTracks(tracks); }, }, }); diff --git a/src/pages/output/native-fs/_applet.astro b/src/pages/output/native-fs/_applet.astro index 863dd59..977bd8b 100644 --- a/src/pages/output/native-fs/_applet.astro +++ b/src/pages/output/native-fs/_applet.astro @@ -34,11 +34,11 @@ tracks: { async get() { - return worker.call.getTracks(); + return worker.getTracks(); }, async put(tracks: Track[]) { - return worker.call.putTracks(tracks); + return worker.putTracks(tracks); }, }, }); diff --git a/src/pages/processor/artwork/_applet.astro b/src/pages/processor/artwork/_applet.astro index d6751e6..12bfce9 100644 --- a/src/pages/processor/artwork/_applet.astro +++ b/src/pages/processor/artwork/_applet.astro @@ -20,11 +20,11 @@ // ACTIONS //////////////////////////////////////////// function artwork(request: ArtworkRequest) { - return worker.call.artwork(request); + return worker.artwork(request); } function supply(items: ArtworkRequest[]) { - return worker.call.supply(items); + return worker.supply(items); } context.setActionHandler("artwork", artwork); diff --git a/src/pages/processor/metadata/_applet.astro b/src/pages/processor/metadata/_applet.astro index 47e0b03..3eba92b 100644 --- a/src/pages/processor/metadata/_applet.astro +++ b/src/pages/processor/metadata/_applet.astro @@ -19,7 +19,7 @@ // ACTIONS //////////////////////////////////////////// const supply: Actions["supply"] = (...args: Parameters) => { - return worker.call.supply(...args); + return worker.supply(...args); }; context.setActionHandler("supply", supply); diff --git a/src/pages/processor/search/_applet.astro b/src/pages/processor/search/_applet.astro index eb64d3c..4c6213b 100644 --- a/src/pages/processor/search/_applet.astro +++ b/src/pages/processor/search/_applet.astro @@ -23,10 +23,10 @@ context.setActionHandler("supply", supply); async function search(term: string): Promise { - return worker.call.search(term); + return worker.search(term); } async function supply(tracks: Track[]) { - return worker.call.supply(tracks); + return worker.supply(tracks); } diff --git a/src/scripts/common.ts b/src/scripts/common.ts index 48fef03..83e7bbe 100644 --- a/src/scripts/common.ts +++ b/src/scripts/common.ts @@ -1,6 +1,7 @@ import * as Uint8 from "uint8arrays"; -import { createEndpoint, type MessageEndpoint } from "@remote-ui/rpc"; +import * as Comlink from "comlink"; import { xxh32 } from "xxh32"; +import { getTransferables } from "@okikio/transferables"; import type { Track } from "@applets/core/types"; @@ -46,8 +47,8 @@ export function comparable(value: unknown) { return xxh32(JSON.stringify(value)); } -export function endpoint>(ini: MessageEndpoint) { - const e = createEndpoint(ini); +export function endpoint>(ini: Comlink.Endpoint) { + const e = Comlink.wrap(ini); if ("start" in ini && typeof ini.start === "function") ini.start(); return e; } @@ -56,13 +57,13 @@ export function expose>(actions: T): T { if (globalThis.SharedWorkerGlobalScope && self instanceof SharedWorkerGlobalScope) { self.onconnect = (event: MessageEvent) => { const port = event.ports[0]; - createEndpoint(port).expose(actions); + Comlink.expose(actions, port); port.start(); }; (self as any).connected = true; } else { - createEndpoint(self).expose(actions); + Comlink.expose(actions, self); } return actions; @@ -99,3 +100,8 @@ export async function trackArtworkCacheId(track: Track): Promise { .digest("SHA-256", new TextEncoder().encode(track.uri)) .then((a) => Uint8.toString(new Uint8Array(a), "base64url")); } + +export function transfer(a: T) { + const b = getTransferables(a); + return Comlink.transfer(a, b); +}