diff --git a/src/misc.ts b/src/misc.ts index 22aba8a..c3224bd 100644 --- a/src/misc.ts +++ b/src/misc.ts @@ -338,6 +338,35 @@ export const promiseWithResolvers = () => { return { promise, resolve: resolve!, reject: reject! }; }; +export const promiseAllEnsureOrder = async (promises: T[]) => { + const results: Awaited[] = []; + const { promise, resolve, reject } = promiseWithResolvers(); + + const onValue = (value: Awaited, i: number) => { + if (results.length === i) { + results.push(value); + + if (results.length === promises.length) { + resolve(); + } + } else { + reject(new Error('Order violation')); + } + }; + + for (let i = 0; i < promises.length; i++) { + const value = promises[i]!; + if (value instanceof Promise) { + void value.then(x => onValue(x as Awaited, i)); + } else { + onValue(value as Awaited, i); + } + } + + await promise; + return results; +}; + export const removeItem = (arr: T[], item: T) => { const index = arr.indexOf(item); if (index !== -1) { diff --git a/test/browser/sample-cursor.test.ts b/test/browser/sample-cursor.test.ts index 98c5cb8..c2225db 100644 --- a/test/browser/sample-cursor.test.ts +++ b/test/browser/sample-cursor.test.ts @@ -10,36 +10,7 @@ import { VideoSampleCursor, } from '../../src/cursors.js'; import { AudioSample, VideoSample } from '../../src/sample.js'; -import { promiseIterateAll, promiseWithResolvers } from '../../src/misc.js'; - -const promiseAllEnsureOrder = async (promises: T[]) => { - const results: Awaited[] = []; - const { promise, resolve, reject } = promiseWithResolvers(); - - const onValue = (value: Awaited, i: number) => { - if (results.length === i) { - results.push(value); - - if (results.length === promises.length) { - resolve(); - } - } else { - reject(new Error('Order violation')); - } - }; - - for (let i = 0; i < promises.length; i++) { - const value = promises[i]!; - if (value instanceof Promise) { - void value.then(x => onValue(x as Awaited, i)); - } else { - onValue(value as Awaited, i); - } - } - - await promise; - return results; -}; +import { promiseAllEnsureOrder, promiseIterateAll } from '../../src/misc.js'; test('Sample cursor seeking', async () => { using input = new Input({ diff --git a/test/node/packet-cursor.test.ts b/test/node/packet-reading.test.ts similarity index 98% rename from test/node/packet-cursor.test.ts rename to test/node/packet-reading.test.ts index ee49491..62a4abf 100644 --- a/test/node/packet-cursor.test.ts +++ b/test/node/packet-reading.test.ts @@ -5,6 +5,7 @@ import path from 'node:path'; import fs from 'node:fs'; import { ALL_FORMATS } from '../../src/input-format.js'; import { PacketCursor, PacketReader } from '../../src/cursors.js'; +import { promiseAllEnsureOrder } from '../../src/misc.js'; const __dirname = new URL('.', import.meta.url).pathname; @@ -251,8 +252,7 @@ test('Command queuing', async () => { expect(commands.every(x => x instanceof Promise)).toBe(true); - // eslint-disable-next-line @typescript-eslint/await-thenable - const resolved = await Promise.all(commands); + const resolved = await promiseAllEnsureOrder(commands); expect(resolved[0]!.timestamp).toBe(0);