update stream card, update leaderboards on match finished webhook

This commit is contained in:
2025-04-24 00:58:22 +02:00
parent 002fdd4c6d
commit 68540ee136
9 changed files with 362 additions and 63 deletions

56
src/lib/events.ts Normal file
View File

@@ -0,0 +1,56 @@
import { EventEmitter } from 'node:events'
export const globalEmitter = new EventEmitter()
export function createEventIterator<T>(
emitter: EventEmitter,
eventName: string,
opts?: { signal?: AbortSignal }
): AsyncIterableIterator<[T]> {
const events: [T][] = []
let resolvePromise: (() => void) | null = null
let done = false
const push = (data: T) => {
events.push([data])
if (resolvePromise) {
resolvePromise()
resolvePromise = null
}
}
const cleanup = () => {
done = true
emitter.off(eventName, push)
if (resolvePromise) {
resolvePromise()
}
}
emitter.on(eventName, push)
opts?.signal?.addEventListener('abort', cleanup)
return {
[Symbol.asyncIterator]() {
return this
},
async next() {
if (events.length > 0) {
return { value: events.shift()!, done: false }
}
if (done) {
return { value: undefined, done: true }
}
await new Promise<void>((resolve) => {
resolvePromise = resolve
})
return this.next()
},
async return() {
cleanup()
return { value: undefined, done: true }
},
async throw(error) {
cleanup()
throw error
},
}
}