From d47aa0cd23ec5c996c5637647e16fdb3e5f54070 Mon Sep 17 00:00:00 2001 From: ThaUnknown <6506529+ThaUnknown@users.noreply.github.com> Date: Sat, 10 Feb 2024 22:11:21 +0100 Subject: [PATCH] wip: abandoned as capacitor doesn't support transfering messagechannels which are required for callbacks this is doable by exposing on both ends, but that's too much work for now --- .eslintrc | 3 + capacitor/src/capacitor.js | 2 - capacitor/src/ipc.js | 57 +++++-- capacitor/src/main.js | 40 +++-- common/App.svelte | 8 +- common/components/Navbar.svelte | 4 +- common/components/Sidebar.svelte | 4 +- common/jsconfig.json | 8 +- common/modules/ipc.js | 4 +- common/modules/parser.js | 9 +- common/modules/providers/tosho.js | 11 +- common/modules/settings.js | 3 +- common/modules/subtitles.js | 17 +- common/modules/torrent.js | 84 ++++------ common/modules/webtorrent.js | 155 ++++++++---------- common/views/IspBlock.svelte | 4 +- common/views/Player/MediaHandler.svelte | 2 +- common/views/Player/Player.svelte | 19 +-- common/views/Settings/AppSettings.svelte | 2 +- .../Settings/HomeSectionsSettings.svelte | 24 +-- .../views/Settings/InterfaceSettings.svelte | 2 +- common/views/Settings/Settings.svelte | 28 ++-- common/views/Settings/TorrentSettings.svelte | 4 +- common/views/ViewAnime/Controls.svelte | 5 +- common/views/ViewAnime/Following.svelte | 2 +- common/views/ViewAnime/ViewAnime.svelte | 5 +- common/views/WatchTogether/Lobby.svelte | 2 +- .../views/WatchTogether/WatchTogether.svelte | 9 +- electron/package.json | 5 +- electron/src/background/background.js | 8 +- electron/src/main/discord.js | 21 ++- electron/src/main/main.js | 79 +++++---- electron/src/main/protocol.js | 39 +++-- electron/src/main/updater.js | 36 ++-- electron/src/main/util.js | 113 ++++++++----- electron/src/preload/preload.js | 46 ++---- electron/src/renderer/ipc.js | 5 + electron/webpack.config.cjs | 6 +- jsconfig.json | 8 +- package.json | 1 + pnpm-lock.yaml | 20 ++- web/jsconfig.json | 8 +- web/tsconfig.json | 29 ---- 43 files changed, 509 insertions(+), 432 deletions(-) create mode 100644 electron/src/renderer/ipc.js delete mode 100644 web/tsconfig.json diff --git a/.eslintrc b/.eslintrc index e4c3485..8e9403a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -15,6 +15,9 @@ "node": true, "serviceworker": true }, + "rules": { + "n/no-callback-literal": 0 + }, "extends": ["plugin:svelte/recommended", "standard"], "plugins": ["svelte"], "parser": "@typescript-eslint/parser", diff --git a/capacitor/src/capacitor.js b/capacitor/src/capacitor.js index 57a34e4..b2662af 100644 --- a/capacitor/src/capacitor.js +++ b/capacitor/src/capacitor.js @@ -5,8 +5,6 @@ import { App } from '@capacitor/app' import { Browser } from '@capacitor/browser' import IPC from './ipc.js' -IPC.on('open', url => Browser.open({ url })) - App.addListener('appUrlOpen', ({ url }) => handleProtocol(url)) // schema: miru://key/value diff --git a/capacitor/src/ipc.js b/capacitor/src/ipc.js index 08461d6..fe8184b 100644 --- a/capacitor/src/ipc.js +++ b/capacitor/src/ipc.js @@ -1,25 +1,52 @@ -import { NodeJS } from 'capacitor-nodejs' import EventEmitter from 'events' +import { NodeJS } from 'capacitor-nodejs' +import { wrap } from 'comlink' const ready = NodeJS.whenReady() -const main = new EventEmitter() - -export default main - -main.on('portRequest', async () => { - globalThis.port = { - onmessage: cb => { - NodeJS.addListener('ipc', ({ args }) => cb(args[0])) +function capacitorEndpoint (nep) { + const listeners = new WeakMap() + return { + postMessage: async (...args) => { + await ready + nep.send({ eventName: 'message', args }) }, - postMessage: (data, b) => { - NodeJS.send({ eventName: 'ipc', args: [{ data }] }) + addEventListener: (_, eh) => { + const l = (data) => { + if ('handleEvent' in eh) { + eh.handleEvent({ data }) + } else { + eh({ data }) + } + } + const handle = nep.addListener('message', ({ args }) => l(...args)) + listeners.set(eh, handle) + }, + removeEventListener: (_, eh) => { + const l = listeners.get(eh) + if (!l) return + nep.removeListener(l) + listeners.delete(eh) } } - await ready - NodeJS.send({ eventName: 'port-init', args: [localStorage.getItem('settings')] }) - main.emit('port') -}) +} +export default { + discord: { + on () {}, + handleDiscordStatus () {}, + showDiscordStatus () {} + }, + protocol: new EventEmitter(), + updater: new EventEmitter(), + close () {}, + open () {}, + doh () {}, + angle () {}, + dialog () {}, + async version () {} +} + +export const TorrentClient = wrap(capacitorEndpoint(NodeJS)) const [_platform, arch] = navigator.platform.split(' ') diff --git a/capacitor/src/main.js b/capacitor/src/main.js index 832e837..32a01e3 100644 --- a/capacitor/src/main.js +++ b/capacitor/src/main.js @@ -2,6 +2,7 @@ import TorrentClient from 'common/modules/webtorrent.js' import { channel } from 'bridge' import { env } from 'node:process' import { statfs } from 'fs/promises' +import { expose } from 'comlink' async function storageQuota (directory) { const { bsize, bavail } = await statfs(directory) @@ -16,19 +17,34 @@ if (typeof localStorage === 'undefined') { } } -channel.on('port-init', data => { - localStorage.setItem('settings', data) - const port = { - onmessage: _ => {}, - postMessage: data => { - channel.send('ipc', { data }) +// localStorage.setItem('settings', data) + +function capacitorEndpoint (nep) { + const listeners = new WeakMap() + return { + postMessage: (...args) => { + nep.send('message', ...args) + }, + addEventListener: (_, eh) => { + const l = (data) => { + if ('handleEvent' in eh) { + eh.handleEvent({ data }) + } else { + eh({ data }) + } + } + nep.on('message', l) + listeners.set(eh, l) + }, + removeEventListener: (_, eh) => { + const l = listeners.get(eh) + if (!l) return + nep.removeListener('message', l) + listeners.delete(eh) } } +} - channel.on('ipc', a => port.onmessage(a)) - channel.emit('port', ({ - ports: [port] - })) -}) +globalThis.client = new TorrentClient(storageQuota, 'node', { torrentPath: env.TMPDIR }) -globalThis.client = new TorrentClient(channel, storageQuota, 'node', { torrentPath: env.TMPDIR }) +expose(globalThis.client, capacitorEndpoint(channel)) diff --git a/common/App.svelte b/common/App.svelte index cd34e06..1b20d9c 100644 --- a/common/App.svelte +++ b/common/App.svelte @@ -1,6 +1,7 @@ diff --git a/common/views/Settings/HomeSectionsSettings.svelte b/common/views/Settings/HomeSectionsSettings.svelte index aeaa547..fbf6cdc 100644 --- a/common/views/Settings/HomeSectionsSettings.svelte +++ b/common/views/Settings/HomeSectionsSettings.svelte @@ -75,18 +75,18 @@ diff --git a/common/views/Settings/InterfaceSettings.svelte b/common/views/Settings/InterfaceSettings.svelte index ffbe647..26d7ce3 100644 --- a/common/views/Settings/InterfaceSettings.svelte +++ b/common/views/Settings/InterfaceSettings.svelte @@ -6,7 +6,7 @@ import SettingCard from './SettingCard.svelte' import { SUPPORTS } from '@/modules/support.js' function updateAngle () { - IPC.emit('angle', settings.value.angle) + IPC.angle(settings.value.angle) } export let settings diff --git a/common/views/Settings/Settings.svelte b/common/views/Settings/Settings.svelte index bd1b765..64749e4 100644 --- a/common/views/Settings/Settings.svelte +++ b/common/views/Settings/Settings.svelte @@ -1,10 +1,11 @@ @@ -96,7 +88,7 @@ {/each} -
IPC.emit('open', 'https://github.com/sponsors/ThaUnknown/')}> +
IPC.open('https://github.com/sponsors/ThaUnknown/')}>
favorite
Donate
diff --git a/common/views/Settings/TorrentSettings.svelte b/common/views/Settings/TorrentSettings.svelte index 02dfb5a..d03a4c0 100644 --- a/common/views/Settings/TorrentSettings.svelte +++ b/common/views/Settings/TorrentSettings.svelte @@ -7,7 +7,9 @@ export let settings function handleFolder () { - IPC.emit('dialog') + IPC.dialog().then(data => { + settings.torrentPath = data + }) } diff --git a/common/views/ViewAnime/Controls.svelte b/common/views/ViewAnime/Controls.svelte index 14243e0..23d3a5a 100644 --- a/common/views/ViewAnime/Controls.svelte +++ b/common/views/ViewAnime/Controls.svelte @@ -66,9 +66,6 @@ duration: '5000' }) } - function openInBrowser (url) { - IPC.emit('open', url) - } function getPlayText (media) { if (media.mediaListEntry) { const { status, progress } = media.mediaListEntry @@ -136,7 +133,7 @@ {/if}
- diff --git a/common/views/ViewAnime/Following.svelte b/common/views/ViewAnime/Following.svelte index 9407b83..c19f096 100644 --- a/common/views/ViewAnime/Following.svelte +++ b/common/views/ViewAnime/Following.svelte @@ -23,7 +23,7 @@ avatar {friend.user.name} {friend.status.toLowerCase()} - IPC.emit('open', 'https://anilist.co/user/' + friend.user.name)}> open_in_new + IPC.open('https://anilist.co/user/' + friend.user.name)}> open_in_new
{/each}
diff --git a/common/views/ViewAnime/ViewAnime.svelte b/common/views/ViewAnime/ViewAnime.svelte index 3add7a0..ea12a97 100644 --- a/common/views/ViewAnime/ViewAnime.svelte +++ b/common/views/ViewAnime/ViewAnime.svelte @@ -63,9 +63,6 @@ duration: 5000 }) } - function openInBrowser (url) { - IPC.emit('open', url) - } let episodeOrder = true @@ -134,7 +131,7 @@ -
diff --git a/common/views/WatchTogether/Lobby.svelte b/common/views/WatchTogether/Lobby.svelte index 1ac9bf5..32ee84b 100644 --- a/common/views/WatchTogether/Lobby.svelte +++ b/common/views/WatchTogether/Lobby.svelte @@ -21,7 +21,7 @@ {/if}

{peer.user?.name || 'Anonymous'}

{#if peer.user?.name} - IPC.emit('open', 'https://anilist.co/user/' + peer.user?.name)}> open_in_new + IPC.open('https://anilist.co/user/' + peer.user?.name)}> open_in_new {/if}