Add web worker communication for offloading the main thread

environments/review-docs-renov-b1i8ag/deployments/15025
wvffle 2022-10-20 14:46:58 +00:00 zatwierdzone przez Georg Krause
rodzic aba816e8bf
commit 15f5056a59
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 2970D504B2183D22
8 zmienionych plików z 101 dodań i 1 usunięć

Wyświetl plik

@ -45,7 +45,7 @@ export default (props: PlayOptionsProps) => {
})
const filterableArtist = computed(() => props.track?.artist ?? props.album?.artist ?? props.artist)
const filterArtist = () => store.dispatch('moderation/hide', { type: 'artist', target: filterableArtist.value })
const filterArtist = async () => store.dispatch('moderation/hide', { type: 'artist', target: filterableArtist.value })
const { $npgettext } = useGettext()
const addMessage = (tracks: Track[]) => {

Wyświetl plik

@ -0,0 +1,5 @@
import { createMessageChannel } from '#/communication'
export default (channel: string) => {
return createMessageChannel(channel)
}

Wyświetl plik

@ -0,0 +1,6 @@
import { registerMainThread } from '#/communication'
import Worker from '~/worker/webworker?worker'
export const worker = new Worker()
registerMainThread(worker)

Wyświetl plik

@ -0,0 +1,53 @@
import type { EventHook, EventHookOn } from '@vueuse/core'
import { createEventHook } from '@vueuse/core'
interface MessageChannel {
hook: EventHook
post: (data: unknown) => void
onMessageReceived: EventHookOn
}
let postMessageFn: typeof postMessage | typeof Worker.prototype.postMessage = () => {
throw new Error('Thread is unregistered')
}
const onMessageFn = (event: MessageEvent) => {
const { channel, data } = JSON.parse(event.data)
messageChannels.get(channel)?.hook.trigger(data)
}
export const registerMainThread = (worker: Worker) => {
worker.onmessage = onMessageFn
postMessageFn = (message: string) => {
worker.postMessage(message)
}
}
export const registerWorkerThread = () => {
onmessage = onMessageFn
postMessageFn = (message: string) => {
postMessage(message)
}
}
const messageChannels = new Map<string, MessageChannel>()
export const createMessageChannel = (channel: string): MessageChannel => {
if (messageChannels.has(channel)) {
const messageChannel = messageChannels.get(channel)
if (messageChannel) return messageChannel
}
const hook = createEventHook()
const messageChannel: MessageChannel = {
hook,
onMessageReceived: hook.on,
post: (data: unknown) => postMessageFn(JSON.stringify({
channel,
data
}))
}
messageChannels.set(channel, messageChannel)
return messageChannel
}

Wyświetl plik

@ -0,0 +1,30 @@
import type { Track } from '~/types'
import { createMessageChannel } from '#/communication'
const { onMessageReceived, post } = createMessageChannel('queue')
const queue: Track[] = []
onMessageReceived((data) => {
switch (data.type) {
case 'queue':
queue.length = 0
queue.push(...data.tracks)
break
case 'enqueue':
queue.push(...data.tracks)
post({ type: 'queue', tracks: queue })
break
case 'shuffle':
// TODO: Shuffle queue
post({ type: 'queue', tracks: [] })
break
case 'unshuffle':
post({ type: 'queue', tracks: queue })
break
}
})

Wyświetl plik

@ -0,0 +1,4 @@
import { registerWorkerThread } from '#/communication'
registerWorkerThread()
import.meta.glob('./modules/*.ts', { eager: true })

Wyświetl plik

@ -14,6 +14,7 @@
"vite-plugin-pwa/client"
],
"paths": {
"#/*": ["src/worker/*"],
"?/*": ["test/*"],
"~/*": ["src/*"]
}

Wyświetl plik

@ -86,6 +86,7 @@ export default defineConfig(({ mode }) => ({
},
resolve: {
alias: {
'#': resolve(__dirname, './src/worker'),
'?': resolve(__dirname, './test'),
'~': resolve(__dirname, './src')
}