mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-10 12:46:15 -08:00
59 lines
1.3 KiB
TypeScript
59 lines
1.3 KiB
TypeScript
import type { Cleanup, Host } from './types'
|
|
|
|
export function report(error: unknown): void {
|
|
console.warn('Artplayer Ads:', error)
|
|
}
|
|
|
|
export function createResources(host: Pick<Host, 'on' | 'off'>) {
|
|
const cleaners: Cleanup[] = []
|
|
let closed = false
|
|
|
|
function install(add: Cleanup, remove: Cleanup): void {
|
|
if (closed)
|
|
return
|
|
cleaners.push(remove)
|
|
try {
|
|
add()
|
|
}
|
|
finally {
|
|
// A custom host/target can destroy the owner while registration is executing.
|
|
if (closed)
|
|
remove()
|
|
}
|
|
}
|
|
|
|
return {
|
|
on(name: string, callback: Cleanup) {
|
|
const listener = () => {
|
|
if (!closed)
|
|
callback()
|
|
}
|
|
install(() => {
|
|
host.on(name, listener)
|
|
}, () => {
|
|
host.off(name, listener)
|
|
})
|
|
},
|
|
dom(target: EventTarget, name: string, callback: Cleanup) {
|
|
const listener = () => {
|
|
if (!closed)
|
|
callback()
|
|
}
|
|
install(() => target.addEventListener(name, listener), () => target.removeEventListener(name, listener))
|
|
},
|
|
dispose() {
|
|
if (closed)
|
|
return
|
|
closed = true
|
|
for (const clean of cleaners.splice(0).reverse()) {
|
|
try {
|
|
clean()
|
|
}
|
|
catch (error) { report(error) }
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
export type Resources = ReturnType<typeof createResources>
|