/* Simple asynchronous queue. To make `get` blocking, we create a new promise and store its `resolve` function in `resolvers`. The next time an item is added to the queue, it will be resolved. */ export default function() { return { items: [], resolvers: [], put(item) { this.items.push(item); let resolver = this.resolvers.shift(); if (resolver) { resolver(); } }, async get() { if (this.items.length === 0) { await new Promise((resolve, reject) => { this.resolvers.push(resolve); }) } return this.items.shift(); }, } }