diff --git a/mobile/src/transport/mobile-web-bundle-fetch-pipeline.test.ts b/mobile/src/transport/mobile-web-bundle-fetch-pipeline.test.ts index 93183fbef57..953a37838f8 100644 --- a/mobile/src/transport/mobile-web-bundle-fetch-pipeline.test.ts +++ b/mobile/src/transport/mobile-web-bundle-fetch-pipeline.test.ts @@ -118,7 +118,8 @@ function waveHost(files: Record, options: WaveHostOptions = {}) const settleMicrotasks = () => new Promise((resolve) => setTimeout(resolve, 0)) - /** Releases wave after wave until `done` settles; returns how many waves it took. */ + /** Releases wave after wave until `done` settles and returns how many waves that took, then keeps + * draining, so a read that should have been stopped is counted instead of left unreleased. */ const runWaves = async ( done: Promise, beforeWave?: (wave: number) => void @@ -138,6 +139,12 @@ function waveHost(files: Record, options: WaveHostOptions = {}) wave.forEach((release) => release()) await settleMicrotasks() } + while (waiting.length > 0) { + const wave = waiting + waiting = [] + wave.forEach((release) => release()) + await settleMicrotasks() + } return waves } diff --git a/mobile/src/transport/mobile-web-bundle-fetch.ts b/mobile/src/transport/mobile-web-bundle-fetch.ts index b36312b22cb..fec4d5e0d4f 100644 --- a/mobile/src/transport/mobile-web-bundle-fetch.ts +++ b/mobile/src/transport/mobile-web-bundle-fetch.ts @@ -200,24 +200,24 @@ function verifyReassembledAsset(asset: AssetReassembly): Uint8Array { * different build, and nothing else in the reply would say so. */ function assertWindowDescribesAsset( - window: MobileWebBundleWindowHeader, + reply: MobileWebBundleWindowHeader, asset: MobileWebBundleAssetRead, buildId: string, offset: number ): void { - if (window.buildId !== buildId) { + if (reply.buildId !== buildId) { throw new MobileWebBundleFetchError( 'build-changed-mid-fetch', - `bundle build changed mid-fetch: asked ${buildId}, served ${window.buildId}` + `bundle build changed mid-fetch: asked ${buildId}, served ${reply.buildId}` ) } - if (window.path !== asset.path || window.offset !== offset) { + if (reply.path !== asset.path || reply.offset !== offset) { throw new MobileWebBundleFetchError( 'chunk-misrouted', - `bundle window answered ${window.path} at ${window.offset}, not ${asset.path} at ${offset}` + `bundle window answered ${reply.path} at ${reply.offset}, not ${asset.path} at ${offset}` ) } - if (window.sha256 !== asset.sha256 || window.assetByteLength !== asset.byteLength) { + if (reply.sha256 !== asset.sha256 || reply.assetByteLength !== asset.byteLength) { throw new MobileWebBundleFetchError( 'asset-entry-changed', `bundle asset ${asset.path} no longer matches the manifest entry`