kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
Add web worker communication for offloading the main thread
rodzic
aba816e8bf
commit
15f5056a59
|
@ -45,7 +45,7 @@ export default (props: PlayOptionsProps) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
const filterableArtist = computed(() => props.track?.artist ?? props.album?.artist ?? props.artist)
|
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 { $npgettext } = useGettext()
|
||||||
const addMessage = (tracks: Track[]) => {
|
const addMessage = (tracks: Track[]) => {
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
import { createMessageChannel } from '#/communication'
|
||||||
|
|
||||||
|
export default (channel: string) => {
|
||||||
|
return createMessageChannel(channel)
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
import { registerMainThread } from '#/communication'
|
||||||
|
|
||||||
|
import Worker from '~/worker/webworker?worker'
|
||||||
|
|
||||||
|
export const worker = new Worker()
|
||||||
|
registerMainThread(worker)
|
|
@ -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
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,4 @@
|
||||||
|
import { registerWorkerThread } from '#/communication'
|
||||||
|
registerWorkerThread()
|
||||||
|
|
||||||
|
import.meta.glob('./modules/*.ts', { eager: true })
|
|
@ -14,6 +14,7 @@
|
||||||
"vite-plugin-pwa/client"
|
"vite-plugin-pwa/client"
|
||||||
],
|
],
|
||||||
"paths": {
|
"paths": {
|
||||||
|
"#/*": ["src/worker/*"],
|
||||||
"?/*": ["test/*"],
|
"?/*": ["test/*"],
|
||||||
"~/*": ["src/*"]
|
"~/*": ["src/*"]
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,7 @@ export default defineConfig(({ mode }) => ({
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
|
'#': resolve(__dirname, './src/worker'),
|
||||||
'?': resolve(__dirname, './test'),
|
'?': resolve(__dirname, './test'),
|
||||||
'~': resolve(__dirname, './src')
|
'~': resolve(__dirname, './src')
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue