58 lines
959 B
TypeScript
58 lines
959 B
TypeScript
export class Queue {
|
|
timeout?: number
|
|
messages: any[] = []
|
|
|
|
clear() {
|
|
this.messages = []
|
|
}
|
|
|
|
push(message: any) {
|
|
this.messages.push(message)
|
|
this.enqueueWork()
|
|
}
|
|
|
|
handle(message: any) {
|
|
throw new Error("Not implemented")
|
|
}
|
|
|
|
shouldSend(message: any) {
|
|
return true
|
|
}
|
|
|
|
doWork() {
|
|
for (let i = 0; i < 10; i++) {
|
|
if (this.messages.length === 0) {
|
|
break
|
|
}
|
|
|
|
// Pop the messages one at a time so handle can modify the queue
|
|
const [message] = this.messages.splice(0, 1)
|
|
|
|
if (this.shouldSend(message)) {
|
|
this.handle(message)
|
|
} else {
|
|
this.messages.push(message)
|
|
}
|
|
}
|
|
|
|
this.timeout = undefined
|
|
this.enqueueWork()
|
|
}
|
|
|
|
enqueueWork() {
|
|
if (this.timeout) {
|
|
return
|
|
}
|
|
|
|
if (this.messages.length === 0) {
|
|
return
|
|
}
|
|
|
|
this.timeout = setTimeout(() => this.doWork(), 100)
|
|
}
|
|
|
|
stop() {
|
|
clearTimeout(this.timeout)
|
|
}
|
|
}
|