Skip to content

Release embed updates: AUTO checkbox, lanes to the seek bar, Load on mobile, cached tracks - #876

Merged
nulltask merged 10 commits into
mainfrom
devel
Oct 31, 2026
Merged

nulltask merged 10 commits into
mainfrom
devel

Conversation

@nulltask

Copy link
Copy Markdown
Owner

Summary

🤖 Generated with Claude Code

The picture is a Pause button too, so the HUD-wide locator matched two elements and failed in strict mode.
Fix the embed play-mode e2e spec's ambiguous Pause locator
… of downloading them again

/__url-load-proxy answered no-store and dropped the upstream's validators, so every embed ?track= (and player ?music=) load from another origin downloaded the whole archive. Move the proxy into url-load-proxy.ts, answer no-cache, and pass ETag / Last-Modified and If-None-Match / If-Modified-Since through, so an unchanged archive comes back as a 304.
Cache proxied embed tracks until the archive changes
…?mode=

be-music-preview-select and be-music-preview-start gain an autoPlay property that shows an AUTO checkbox (the list's header, under the play button) and emits auto-play-change. The embed starts it from ?mode= and switches its mode on a change; under the play button it loads the play again in the other mode.
…r it

On a phone held upright the lanes stopped well above the controls, and on a phone held sideways (SP or DP) the judgement line sat under the seek bar. Keep clear only the controls' 54 CSS px as tall as they get on a 320 px phone and a 16 px gap (previewJudgementInset), in both orientations. The preview HUD puts the controls along the bottom of the screen rather than the stage, so a DP chart letterboxed on a phone held upright keeps them off its lanes.
… on a phone

A phone or tablet (or a browser asking to save data) no longer downloads the track as soon as the embed opens. It shows a Load button (be-music-preview-start's new load mode and caption) with the file name and the size a HEAD request reports; /__url-load-proxy now answers HEAD with the upstream's Content-Length.
Embed: AUTO checkbox, lanes down to the seek bar, and Load before downloading on a phone
@github-actions

Copy link
Copy Markdown
Contributor

Exports Benchmark

🔴 3 regressions · 1 improvement · 15 within noise · 882 compared

46764827 → 1f6eb113 · 3 runs base / 3 runs head · a regression or improvement is a change past ±8% whose runs do not overlap · times are per call (median)

Regressions (3)

API Base Head Change Run spread (base / head)
player-ui.resolvePreviewPortrait 13.3 ns 48.2 ns 262.7% slower ±0.3% / ±3.5%
chart-editor.deleteNote 5.07 µs 6.77 µs 33.5% slower ±1.2% / ±16.0%
player-ui.resolvePreviewInfoBox 11.7 ns 15.0 ns 27.9% slower ±2.1% / ±0.6%

Improvements (1)

API Base Head Change Run spread (base / head)
player-engine.resolveChartRulesetFacts 42.5 µs 38.0 µs 10.6% faster ±2.4% / ±13.9%

Changed packages

app-play, player-browser, player-ui, player-ui-react, player-ui-vue, worker-play: 113 cases compared, median ±0.0%.

All 113 cases
API Base Head Change Run spread (base / head)
player-browser.alignAudioChunk 6.23 ns 6.24 ns 0.1% slower ±2.0% / ±1.6%
player-browser.applySilentModePlayback 14.2 ns 14.2 ns 0.4% faster ±1.5% / ±1.1%
player-browser.applySystemAudioSessionType 13.0 ns 12.9 ns 0.2% faster ±1.5% / ±1.1%
player-browser.asLoadedBytes 7.78 ns 7.78 ns ±0.0% ±3.2% / ±2.8%
player-browser.blendCodeToPixi 6.37 ns 6.36 ns 0.1% faster ±2.3% / ±2.2%
player-browser.BrowserChartCollectionStore 327 µs 311 µs 4.7% faster ±0.5% / ±4.2%
player-browser.buildAudioBus 1.81 µs 1.78 µs 1.8% faster ±4.7% / ±29.1%
player-browser.chartPlayVariantForBeatorajaVariant 6.29 ns 6.29 ns 0.1% slower ±2.4% / ±1.7%
player-browser.ChartPreviewEngine 223 ns 226 ns 1.8% slower ±3.0% / ±3.6%
player-browser.computeChartFileHashes 61.9 µs 57.6 µs 6.9% faster ±5.8% / ±1.5%
player-browser.computeChartFileSHA256 52.0 µs 52.0 µs ±0.0% ±2.8% / ±0.9%
player-browser.computeSHA256Hex 50.3 µs 46.6 µs 7.3% faster ±5.2% / ±1.4%
player-browser.CourseMaker 5.32 µs 5.34 µs 0.5% slower ±0.2% / ±0.5%
player-browser.createAudioService 6.66 µs 6.71 µs 0.8% slower ±2.8% / ±0.4%
player-browser.createBeatorajaSceneKitCaches 85.6 ns 69.5 ns 18.7% faster · ±1.7% / ±12.9%
player-browser.createBeatorajaSkinLoadContext 175 ns 177 ns 1.1% slower ±1.4% / ±5.3%
player-browser.createBeMusicSkinRegistry 1.07 µs 1.07 µs 0.5% slower ±0.8% / ±1.0%
player-browser.createChartHashLookup 147 ns 140 ns 4.6% faster ±1.7% / ±3.2%
player-browser.createCourseChartRecord 1.56 µs 1.58 µs 1.3% slower ±2.3% / ±2.0%
player-browser.createCroppedBeatorajaTexture 6.94 ns 6.92 ns 0.3% faster ±3.5% / ±2.4%
player-browser.createDecideScene 305 µs 299 µs 2.1% faster ±4.9% / ±4.0%
player-browser.createEagerDropPathPredicate 992 ns 985 ns 0.7% faster ±1.0% / ±1.3%
player-browser.createNewCourseEntry 10.1 ns 9.99 ns 1.4% faster ±1.2% / ±0.9%
player-browser.createNonstopAssets 46.8 µs 46.8 µs 0.1% slower ±1.1% / ±0.5%
player-browser.createPlayScene 163 µs 163 µs 0.1% faster ±3.7% / ±1.7%
player-browser.createRandomCourseEntry 1.54 µs 1.54 µs ±0.0% ±1.9% / ±2.4%
player-browser.createRandomMixChart 128 ns 129 ns 0.5% slower ±0.2% / ±0.8%
player-browser.createResultScene 62.4 µs 76.3 µs 22.3% slower · ±2.7% / ±42.5%
player-browser.createSelectController 14.2 µs 14.0 µs 1.6% faster ±0.6% / ±0.8%
player-browser.createSelectScene 45.3 µs 44.5 µs 1.8% faster ±2.8% / ±1.9%
player-browser.createSkinFamilyRegistry 196 ns 190 ns 3.0% faster ±2.2% / ±1.5%
player-browser.defaultBeatorajaSkinConfig 42.4 ns 42.4 ns 0.1% slower ±1.6% / ±0.5%
player-browser.defaultBrowserWorkerCount 6.25 ns 6.20 ns 0.9% faster ±2.0% / ±1.9%
player-browser.DeferredDroppedFile 2.61 µs 2.61 µs 0.4% slower ±1.0% / ±0.8%
player-browser.describeChartCollection 8.20 ns 8.25 ns 0.5% slower ±2.4% / ±3.2%
player-browser.describeRecordingFormat 6.64 ns 6.66 ns 0.2% slower ±3.1% / ±2.2%
player-browser.drawBrowserRandomCourse 5.12 µs 5.08 µs 0.8% faster ±0.7% / ±1.2%
player-browser.executeBrowserTask 9.79 µs 9.76 µs 0.3% faster ±1.7% / ±2.8%
player-browser.findBeatorajaThemeBGM 2.98 µs 2.98 µs 0.1% faster ±0.8% / ±0.5%
player-browser.flipRectToPixi 6.25 ns 6.22 ns 0.5% faster ±2.4% / ±1.8%
player-browser.getBrowserWorkerCount 6.46 ns 6.43 ns 0.5% faster ±3.2% / ±2.4%
player-browser.getMasterVolume 6.47 ns 6.47 ns 0.1% slower ±3.5% / ±2.0%
player-browser.getSystemAudioSession 7.57 ns 7.59 ns 0.3% slower ±3.0% / ±3.0%
player-browser.isBeatorajaLuaSkinFilePath 41.0 ns 41.0 ns ±0.0% ±0.8% / ±2.3%
player-browser.isBeatorajaSkinIndicator 135 ns 136 ns 0.6% slower ±1.1% / ±0.6%
player-browser.isChartFilePath 35.5 ns 35.8 ns 0.9% slower ±0.1% / ±2.1%
player-browser.isCourseFilePath 483 ns 477 ns 1.3% faster ±0.3% / ±0.3%
player-browser.isLR2SkinFilePath 41.1 ns 41.7 ns 1.7% slower ±0.2% / ±1.6%
player-browser.loadAssetBytes 237 ns 234 ns 1.5% faster ±0.7% / ±0.5%
player-browser.loadBeatorajaChartImages 569 ns 562 ns 1.2% faster ±1.6% / ±1.1%
player-browser.loadBeatorajaFonts 630 ns 637 ns 1.2% slower ±1.3% / ±1.5%
player-browser.loadBeatorajaSceneKit 11.2 µs 11.2 µs 0.6% slower ±0.7% / ±1.2%
player-browser.loadBeatorajaTexturesFromBundle 346 ns 331 ns 4.2% faster ±0.8% / ±2.0%
player-browser.loadBeatorajaThemeFromFiles 612 ns 580 ns 5.2% faster ±2.0% / ±0.6%
player-browser.loadChartCollectionFromDrop 130 µs 127 µs 2.0% faster ±3.7% / ±3.2%
player-browser.loadChartCollectionFromFiles 116 µs 117 µs 0.4% slower ±4.8% / ±1.2%
player-browser.logger 10.9 ns 10.9 ns 0.1% faster ±1.1% / ±1.2%
player-browser.masterOutput 13.2 ns 13.1 ns 0.5% faster ±1.0% / ±0.6%
player-browser.materializeDroppedFiles 1.90 µs 1.90 µs ±0.0% ±0.8% / ±1.4%
player-browser.md5HexOfBytes 737 ns 756 ns 2.6% slower ±2.3% / ±1.5%
player-browser.mergeCompressorParams 109 ns 110 ns 0.5% slower ±2.0% / ±2.1%
player-browser.normalizeBrowserWorkerCount 6.12 ns 6.18 ns 1.0% slower ±2.2% / ±1.6%
player-browser.parseCompressorMode 18.1 ns 18.1 ns 0.1% slower ±0.2% / ±0.6%
player-browser.pickBeatorajaPlayableSkinVariant 20.1 ns 20.4 ns 1.5% slower ±1.4% / ±0.9%
player-browser.pickBeatorajaPlayableVariant 6.16 ns 6.09 ns 1.0% faster ±2.1% / ±1.2%
player-browser.pickRecorderMIMEType 797 ns 800 ns 0.3% slower ±1.6% / ±1.7%
player-browser.PlayOptionMismatchError 2.33 µs 2.36 µs 1.4% slower ±0.6% / ±0.5%
player-browser.readCourseFile 4.59 µs 4.62 µs 0.5% slower ±0.5% / ±0.6%
player-browser.readDroppedFiles 244 ns 243 ns 0.4% faster ±2.3% / ±0.7%
player-browser.readFilesIntoBytesMap 4.70 µs 4.67 µs 0.5% faster (I/O) ±1.5% / ±1.2%
player-browser.recorderMIMECandidates 1.90 µs 1.89 µs 0.4% faster ±1.1% / ±0.9%
player-browser.recordingAudioCodecs 6.09 ns 6.10 ns 0.3% slower ±2.4% / ±2.5%
player-browser.recordingFileExtension 35.0 ns 34.9 ns 0.3% faster ±0.3% / ±0.1%
player-browser.recordingVideoCodecs 53.7 ns 48.6 ns 9.5% faster · ±0.5% / ±7.8%
player-browser.Rectangle 6.15 ns 6.20 ns 0.8% slower ±2.0% / ±2.2%
player-browser.releaseBeatorajaSceneKitAssets 133 ns 125 ns 5.9% faster ±0.3% / ±7.7%
player-browser.resolveBeatorajaChartImage 6.21 ns 6.18 ns 0.5% faster ±1.3% / ±2.0%
player-browser.resolveBeatorajaSkinConfig 137 ns 138 ns 0.5% slower ±0.9% / ±1.7%
player-browser.resolveCaptureSize 6.25 ns 6.31 ns 0.9% slower ±2.3% / ±3.0%
player-browser.resolveChartAsset 2.54 µs 2.54 µs 0.3% slower ±0.2% / ±0.2%
player-browser.resolveChartAudioAsset 10.9 µs 11.0 µs 0.8% slower ±1.1% / ±0.4%
player-browser.resolveChartBGAAsset 49.5 µs 49.8 µs 0.5% slower ±0.8% / ±0.2%
player-browser.resolveChartImageAsset 5.44 µs 5.47 µs 0.6% slower ±0.3% / ±0.7%
player-browser.resolveChartSource 8.80 ns 8.83 ns 0.4% slower ±2.5% / ±2.7%
player-browser.resolveCourseEntry 64.8 ns 64.9 ns ±0.0% ±0.1% / ±0.2%
player-browser.resolveCourseFolders 185 ns 183 ns 1.0% faster ±1.9% / ±1.0%
player-browser.resolveCourseMakerFolders 836 ns 810 ns 3.1% faster ±2.6% / ±3.0%
player-browser.resolveDropFilePath 197 ns 197 ns 0.1% slower ±0.1% / ±0.5%
player-browser.resolveFrameTimestamp 6.21 ns 6.18 ns 0.4% faster ±2.4% / ±2.4%
player-browser.resolveRendererPreference 149 ns 146 ns 1.9% faster ±3.9% / ±0.9%
player-browser.resolveRenderResolution 193 ns 194 ns 0.8% slower ±1.6% / ±0.8%
player-browser.resolveSelectListWindow 11.3 ns 11.4 ns 0.4% slower ±0.2% / ±0.5%
player-browser.resolveSilentModeAudioSessionType 6.16 ns 6.16 ns 0.1% slower ±2.3% / ±0.9%
player-browser.runBrowserTask 21.9 µs 21.8 µs 0.3% faster ±4.5% / ±4.2%
player-browser.sanitizeBusVolume 6.49 ns 6.49 ns ±0.0% ±2.0% / ±2.3%
player-browser.sanitizeMasterVolume 6.58 ns 6.61 ns 0.5% slower ±2.7% / ±2.6%
player-browser.SessionScene 577 ns 573 ns 0.7% faster ±0.8% / ±1.9%
player-browser.setMasterVolume 571 µs 641 µs 12.2% slower · ±10.7% / ±58.5%
player-browser.shouldCaptureFrame 6.19 ns 6.25 ns 1.0% slower ±2.2% / ±2.0%
player-browser.splitDroppedChartAndThemeFiles 2.64 µs 2.65 µs 0.4% slower ±0.2% / ±1.0%
player-browser.summarizeBeatorajaPlaySkins 121 ns 121 ns 0.1% faster ±0.2% / ±0.7%
player-browser.summarizeBrowserCompat 67.9 ns 66.7 ns 1.8% faster ±0.3% / ±0.3%
player-browser.supportsSystemAudioSession 8.02 ns 8.06 ns 0.5% slower ±2.5% / ±2.5%
player-browser.supportsWebCodecsRecording 11.1 ns 11.2 ns 1.2% slower ±0.6% / ±12.4%
player-ui.defineBeMusicElements 643 ns 600 ns 6.6% faster ±3.4% / ±2.0%
player-ui.formatPlaybackTime 43.5 ns 43.2 ns 0.6% faster ±6.4% / ±0.6%
player-ui.paintPlayfieldParts 59.3 µs 59.0 µs 0.4% faster ±0.2% / ±0.2%
player-ui.previewContentBottom 7.26 ns 7.25 ns 0.1% faster ±3.5% / ±3.0%
player-ui.resolvePlayfieldParts 2.26 µs 2.23 µs 1.1% faster ±0.9% / ±0.5%
player-ui.resolvePreviewInfoBox 11.7 ns 15.0 ns 27.9% slower 🔴 ±2.1% / ±0.6%
player-ui.resolvePreviewPortrait 13.3 ns 48.2 ns 262.7% slower 🔴 ±0.3% / ±3.5%
player-ui.resolveSeekTarget 6.16 ns 6.21 ns 0.8% slower ±2.1% / ±2.6%
player-ui.setBeMusicTheme 19.3 ns 19.3 ns 0.1% faster ±2.5% / ±0.7%

New exports (1)

API Head
player-ui.previewJudgementInset 7.62 ns
Within noise (15): past the threshold, but the runs overlap
API Base Head Change Run spread (base / head)
skin-beatoraja.scene.createBeatorajaJudgeStateGraph 4.84 µs 2.06 µs 57.5% faster ±65.6% / ±7.6%
player-node-audio.audio-sink.createBrowserAudioSink 2.90 µs 4.63 µs 59.5% slower ±18.9% / ±6.3%
chart-parser.resolveBMSControlFlow 7.14 µs 5.78 µs 19.1% faster ±3.2% / ±12.4%
shared-utils.workerize.invokeWorkerizedFunction 840 ns 680 ns 19.0% faster ±9.8% / ±13.2%
player-browser.createBeatorajaSceneKitCaches 85.6 ns 69.5 ns 18.7% faster ±1.7% / ±12.9%
chart-model.getPlayModeLayouts 10.0 ns 12.7 ns 26.5% slower ±6.9% / ±7.7%
player-browser.createResultScene 62.4 µs 76.3 µs 22.3% slower ±2.7% / ±42.5%
chart-writer.stringifyBMS 50.4 µs 44.5 µs 11.6% faster ±1.9% / ±6.7%
player-scene-model.HiSpeedTransition 11.3 ns 13.0 ns 14.7% slower ±9.5% / ±7.8%
player-engine.replay.resolveRulesetResultLamp 40.6 ns 46.2 ns 13.9% slower ±6.5% / ±5.8%
player-browser.setMasterVolume 571 µs 641 µs 12.2% slower ±10.7% / ±58.5%
player-browser.recordingVideoCodecs 53.7 ns 48.6 ns 9.5% faster ±0.5% / ±7.8%

…and 3 more.

I/O-bound, not judged (19)

These cases touch the filesystem, so their time follows the OS cache and the disk more than the code.

API Base Head Change Run spread (base / head)
chart-audio-renderer.renderChartFile 6.33 ms 6.91 ms 9.3% slower ±5.0% / ±3.5%
chart-audio-renderer.renderJSON 4.08 ms 4.21 ms 3.1% slower ±2.5% / ±1.0%
chart-audio-renderer.renderSingleSample 8.02 µs 8.23 µs 2.5% slower ±1.5% / ±0.4%
chart-audio-renderer.writeAudioFile 187 µs 229 µs 22.5% slower ±11.9% / ±6.7%
chart-editor.exportChart 204 µs 239 µs 17.3% slower ±2.5% / ±6.8%
chart-editor.importChart 125 µs 131 µs 4.6% slower ±6.8% / ±4.7%
chart-editor.loadJSONFile 149 µs 145 µs 2.6% faster ±4.9% / ±0.7%
chart-editor.saveJSONFile 209 µs 218 µs 4.7% slower ±3.5% / ±4.4%
chart-parser.parseChartFile 127 µs 135 µs 7.0% slower ±1.1% / ±5.0%
player-browser.readFilesIntoBytesMap 4.70 µs 4.67 µs 0.5% faster ±1.5% / ±1.2%
player-terminal.createBgaANSIRenderer 3.36 µs 3.37 µs 0.5% slower ±2.4% / ±1.1%
player-terminal.loadStageFileANSIImage 101 ns 101 ns 0.8% slower ±1.0% / ±11.2%
player-terminal.loadStageFileANSILines 164 ns 164 ns 0.3% faster ±0.6% / ±2.0%
player-terminal.loadTerminalANSIImage 1.12 ms 1.15 ms 2.2% slower ±2.0% / ±3.1%
shared-utils.createFileLogger 218 µs 214 µs 1.8% faster ±2.9% / ±2.8%
shared-utils.readFilesIntoEntryMap 2.37 µs 2.35 µs 0.7% faster ±1.7% / ±1.9%
shared-utils.resolveFirstExistingPath 99.0 µs 99.7 µs 0.7% slower ±2.6% / ±6.4%
shared-utils.workerize.workerize 11.1 ms 11.4 ms 2.6% slower ±1.6% / ±1.5%
skin-beatoraja.readFilesIntoBytesMap 19.3 µs 19.3 µs ±0.0% ±0.9% / ±1.5%
Excluded: too fast to time (80)

A timed sample lasted 1 µs or less on at least one side (usually a base commit from before calls were batched), so its time is timer noise and no change is shown.

API Base Head
chart-model.createMeasureBoundariesBeats 76.0 ns 74.0 ns
chart-model.mirrorBeatAtTempoReversal 6.29 ns 6.42 ns
chart-model.parseBmsARGB 264 ns 264 ns
chart-model.parseBMSExBMP 624 ns 608 ns
chart-model.resolveChartMainBPM 109 ns 107 ns
player-browser.applyBeatorajaStretchRect 30.5 ns 31.3 ns
player-browser.checkBrowserCompat 162 ns 163 ns
player-browser.createDrawnRandomMixEntry 18.7 ns 17.5 ns
player-browser.createRandomMixEntry 13.7 ns 14.2 ns
player-browser.destinationToSpriteProps 87.1 ns 85.6 ns
player-browser.GameplayRecorder 82.4 ns 157 ns
player-browser.SceneController 256 ns 256 ns

…and 68 more.

Run details
Measure Value
Median change (all compared cases) -0.08%
Mean change -0.10%
Overall verdict (median vs. threshold) unchanged
Compared / within noise / I/O-bound / unchanged 882 / 15 / 19 / 844
Benchmarked / skipped (head) 963 / 38
Time / warmup per case 50 ms / 25 ms
Node / platform v26.12.1 / linux

@nulltask
nulltask merged commit 95687ef into main Oct 31, 2026
19 checks passed

This branch was successfully deployed

1 active deployment
preview — 1f6eb113 Deployed Oct 31, 2026 by nulltask via deploy #156
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant