-
Notifications
You must be signed in to change notification settings - Fork 2k
feat: bring desktop Studio UI and local playback to web #2312
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
richiemcilroy
wants to merge
575
commits into
main
Choose a base branch
from
feature/web-editor-desktop-parity
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+136,427
−5,723
Open
Changes from all commits
Commits
Show all changes
575 commits
Select commit
Hold shift + click to select a range
27cf7f6
fix(media-server): detect MP4 and MOV inputs by their format class
richiemcilroy 2b92e58
chore(web): drop comments that restate the editor bar
richiemcilroy e601016
feat(web): the share link tab offers a link to the current moment, li…
richiemcilroy d77274b
feat(web): report a Save rendering in the owner's browser as rendering
richiemcilroy af06d68
feat(web): the editor reports a browser Save's progress while it rend…
richiemcilroy 6428188
feat(web): share page and Cap card show a browser Save rendering and …
richiemcilroy a622390
feat(web): open the share page beside a Save rendering in the tab ins…
richiemcilroy 6c0dac0
feat(web): the share page publishes a new recording when nothing else…
richiemcilroy e7a9ea3
feat(web): a back to dashboard link on the share page for signed-in v…
richiemcilroy 053e5d5
fix(web): send a browser Save's progress reports in order
richiemcilroy e70acd4
feat(editor): Presets with a one-click default that new web recording…
richiemcilroy a8e9b8c
fix(editor): let the recording title use the header's width
richiemcilroy 15beaef
fix(web): save editor preferences for accounts whose preferences are …
richiemcilroy 7f68665
feat(web): recorder opens the share link, keeps a dimmed camera and c…
richiemcilroy ec49986
refactor(web): drop the editor's arrival-from-recorder handling
richiemcilroy 9e1180e
feat(media-server): make a thumbnail and preview GIF from a published…
richiemcilroy ead3a16
fix(web): remake the thumbnail and preview GIF when a render replaces…
richiemcilroy 32d743e
fix(media-server): take a processing slot for preview assets
richiemcilroy 892f116
fix(web): only retry a preview refresh while the media server is busy
richiemcilroy 106ef75
fix(web): mark a browser Save finished and judge its freshness on the…
richiemcilroy e681ccb
fix(web): keep the recording publish alive through share page refreshes
richiemcilroy ce844d4
fix(web): recorder's share link keeps the publish and a restart promp…
richiemcilroy e69db90
fix(web): keep the editor bar light on the always-light share page
richiemcilroy 391aa00
feat(web): recorder offers a screen beside the camera and explains ho…
richiemcilroy 0270f2a
feat(web): show the hidden camera preview anyway, like the screen pre…
richiemcilroy 22e4b7a
fix(web): light editor bar in the editor, an Editor tab icon and Edit…
richiemcilroy fdddafb
fix(web): a shown camera preview hides again for the next take
richiemcilroy b35ad32
feat(web): serve a Save rendering in the browser as an HLS stream
richiemcilroy 35867d3
feat(web): take a browser Save's chunks as it renders and clear them …
richiemcilroy 69d63d9
feat(web): report a browser Save playable once two chunks are up
richiemcilroy b95d3d6
feat(editor): stream a browser Save's fragments while it renders
richiemcilroy 0f5ac68
feat(web): upload a browser Save's chunks from the editor as they render
richiemcilroy 5a965e9
fix(web): serve only the current Save's chunks
richiemcilroy 6dbefd7
fix(web): take down a browser Save's chunks when it doesn't publish o…
richiemcilroy d67f5a4
chore: drop comments that restate the Save chunk code
richiemcilroy e8d520b
fix(web): keep serving the last published Save's chunks while another…
richiemcilroy 278638a
fix(web): only clear browser Save chunks an hour after they were uplo…
richiemcilroy 085be0e
fix(web): mark the Save that finished as published, not whichever is …
richiemcilroy 8b4582b
fix(web): finish only the Save named, in the same update that checks it
richiemcilroy 6d57af8
perf(web): read a recording's duration from its last fragment instead…
richiemcilroy 98f5560
chore(editor): add opt-in timing for editor load stages and frames
richiemcilroy 6e12994
perf(editor): hand decoded frames straight to the renderer and decode…
richiemcilroy c9187a7
perf(editor): decode clip thumbnails from the open recording and cach…
richiemcilroy 472a155
perf(editor): stream waveform audio once instead of refetching ranges
richiemcilroy 84ec513
fix(editor): fail an export that runs out of storage instead of trunc…
richiemcilroy a37d3f4
perf(editor): decode export audio in blocks as it mixes instead of wh…
richiemcilroy a1a0dfa
perf(editor): build Save chunks from the encoders' packets instead of…
richiemcilroy 43b602d
perf(web): upload browser Save chunks in parallel and list them in order
richiemcilroy 29443f6
fix(editor): let Safari's encoder emit each frame so browser exports …
richiemcilroy ac367a0
fix(web): measure a fragmented recording's end before trusting its de…
richiemcilroy fc90742
fix(web): list every uploaded chunk before a published browser Save f…
richiemcilroy 5536446
fix(editor): show hours in timecodes for recordings an hour or longer
richiemcilroy e5c610b
feat(editor): open long recordings in full and zoom the timeline by f…
richiemcilroy 2098175
perf(editor): draw tiny timeline segments as runs and skip per-segmen…
richiemcilroy 49de4a9
perf(editor): update only the transcript words entering or leaving th…
richiemcilroy 9aa9e94
perf(editor): binary search the active caption during playback
richiemcilroy db975b3
feat(editor): zoom in on a run of compact segments when it's pressed
richiemcilroy 7df2952
chore(editor): drop comments that restate the caption lookups
richiemcilroy f2f779b
perf(editor): move the timeline playhead only when it visibly moves a…
richiemcilroy 55120d5
perf(web): let the editor share its reads with the duration probe and…
richiemcilroy e1a48a7
perf(editor): read recordings through one shared ranged reader and se…
richiemcilroy 6dcf64f
perf(editor): stop sliders observing the whole document and memo the …
richiemcilroy 291b42a
fix(editor): fetch an export's sources fresh instead of reusing the e…
richiemcilroy 9fb5c4c
fix(editor): dispose idle decoded inputs when the editor is torn down
richiemcilroy fbd5ec5
chore(editor): drop comments that restate source renewal, teardown an…
richiemcilroy 500096b
fix(rendering): keep zoom blur centered on the zoom target
richiemcilroy cd4743b
fix(editor): default zooms to manual without recorded cursor data
richiemcilroy 58a5486
test(extension): drop comment restating the error status assertion
richiemcilroy 5049c61
feat(web): report the published video revision from render status
richiemcilroy 90a2e56
fix(web): show the latest Save on an open share page
richiemcilroy 6891487
feat(web): announce published Saves to open share pages
richiemcilroy ee7368d
fix(web): report the new revision when render status publishes a farm…
richiemcilroy c2e200c
fix(web): watch for Saves on every share page a web editor Save can r…
richiemcilroy 423ceb9
feat(web): let an editor source carry an import's own audio
richiemcilroy 9c7a898
feat(web): register a browser-readable import upload as its editor so…
richiemcilroy ab7139d
feat(web): open dashboard imports in the editor as soon as they upload
richiemcilroy 26850b1
refactor(web): check the import container by format class
richiemcilroy c18e1d7
fix(editor): read whole probe windows when locating far fragments
richiemcilroy fa97c42
perf(editor): skip redrawing repeated source frames during playback
richiemcilroy 822d1fd
fix(editor): show the error screen when the preview can't start
richiemcilroy 2309610
fix(web): drop the studio mode icon from the recorder's start button
richiemcilroy 045b34f
feat(web): add a microphone-only recorder
richiemcilroy 4a6da59
feat(web): offer microphone-only recording and confirm camera-only takes
richiemcilroy 7621a96
fix(web): remember whether camera-only takes should add the screen
richiemcilroy 1837111
fix(web): stop microphone takes at the shareable length and drop fail…
richiemcilroy 663151e
perf(editor): read only the audio when building a video's waveform
richiemcilroy f8efb78
perf(editor): refresh the playing time readout at 10 Hz
richiemcilroy 5f885f1
perf(editor): move the playhead on its own layer
richiemcilroy 21ab294
chore(web): drop comments that restate recorder declarations
richiemcilroy 5c8a828
perf(editor): let the compositor move the playhead during playback
richiemcilroy afa6f88
perf(media-server): interleave share video audio in one second runs
richiemcilroy 125d917
perf(editor): rebuild the preview style only when active style segmen…
richiemcilroy 9e08389
perf(editor): recompute the preview size only when its dimensions change
richiemcilroy c5f4933
perf(editor): redraw the clip waveform in steps while the timeline fo…
richiemcilroy 003931a
perf(editor): skip unchanged audio element writes each frame
richiemcilroy 351f2a0
perf(editor): cache parsed source URLs for frame reads
richiemcilroy c44130f
fix(web): stop the share page upload tracker re-rendering in a loop
richiemcilroy 65543aa
fix(web): send upload progress from the committed render and test the…
richiemcilroy c228108
chore(editor): drop a comment restating the clip thumbnail lookup
richiemcilroy ece7b25
Merge origin/main into feature/web-editor-desktop-parity
richiemcilroy 9d44d95
perf(editor): lay out the following timeline in steps and shift it be…
richiemcilroy 2e1a3f6
perf(web): keep the Effect runtime out of the shareable link limit ov…
richiemcilroy d6d94bd
perf(web): load the render view and hls.js only while a Save renders
richiemcilroy ff7081c
perf(web): start share playback on Cap's own storage without a probe …
richiemcilroy 5e7c38e
fix(web): keep relative times from breaking share page hydration
richiemcilroy 6f23c87
perf(editor): feed the browser export's encoder directly instead of t…
richiemcilroy f6a33c5
chore(web): quote the tab audio option without escapes
richiemcilroy f30eea3
fix(media-server): give WebM validation as long as a transcode of it …
richiemcilroy 2634000
perf(editor): reuse the browser renderer's texture limit and present …
richiemcilroy 011c2c8
chore(editor): drop a comment restating the present bind group cache
richiemcilroy 5fa49e3
perf(web): load the embed's HLS player and upload tracker only when n…
richiemcilroy 76a0bbc
perf(web): prefetch the dashboard from share pages on hover instead o…
richiemcilroy 529d105
fix(web): seek a lazily loaded HLS embed to its start time
richiemcilroy 201aa83
chore(web): drop comments restating the hover prefetch prop
richiemcilroy 52d0b5d
chore: exclude generated export renderer bindings from Biome
richiemcilroy 9f538c8
fix(web): log camera upload failures when finalizing a paired recording
richiemcilroy 6e3249d
test(web): expect streaming MP4 and multipart uploads in the paired r…
richiemcilroy 75ca44d
test(extension): match recording uploads to the browser's streaming M…
richiemcilroy 9e9026d
fix(editor): keep EXIF-rotated and oversized backgrounds on the nativ…
richiemcilroy c6b305a
fix(editor): send the export worker a plain copy of the project config
richiemcilroy e70ee03
fix(editor): hide the loading skeleton from assistive tech during the…
richiemcilroy 1ac5c0c
test(editor): follow decoded frames and preview sizing in the composi…
richiemcilroy f9a73a9
test(media-server): follow the web editor's Download header and rende…
richiemcilroy 623f10d
test(media-server): detect Firefox VideoFrame rendering through textu…
richiemcilroy f70e792
test(media-server): record folder import alerts in the page instead o…
richiemcilroy c654182
fix(recorder): recover unwritten spool chunks when the backup store n…
richiemcilroy a479fad
fix(web): keep a take when its final backup write fails and fall back…
richiemcilroy a934f94
test(web): replay paired capture on a persistent profile and cover an…
richiemcilroy 95376ea
fix(web): keep transcript words when the stored duration is shorter t…
richiemcilroy fc91b04
fix(web): say no speech was detected instead of no audio track
richiemcilroy f88d81a
fix(web): keep locale dates in the editor recordings list out of hydr…
richiemcilroy 0377a4b
fix(web): retry preview assets when the media server lacks the route yet
richiemcilroy 799af8f
fix(web): stop requesting a preview GIF that a new render has not mad…
richiemcilroy aa39572
fix(editor): show caption generation errors in the captions panel
richiemcilroy 54e022f
feat(editor): say when an export renders on Cap's servers
richiemcilroy 1a5cdb8
fix(editor): keep the default timeline and unchanged pauses out of un…
richiemcilroy 274eda0
fix(editor): clamp the playhead and hover time when the timeline gets…
richiemcilroy 70ac3d2
fix(editor): draw the web zoom preview from a decoded frame and back …
richiemcilroy 3ba9e7b
fix(editor): size the Quarter preview below Half on small canvases
richiemcilroy d728a78
fix(web): check a share tab for updates the first time it returns aft…
richiemcilroy 9817729
fix(web): keep relative cap dates out of hydration checks
richiemcilroy ba9c700
fix(media-server): make editor session capacity configurable and recl…
richiemcilroy dcf1df6
fix(web): show when editor servers are busy and preview on a worker w…
richiemcilroy 761301c
test(media-server): keep a background export alive by polling it with…
richiemcilroy 5b89292
fix(web): drop the one-off recording publish flag as soon as the shar…
richiemcilroy 8884c0a
fix(web): fall back to the uploaded video when a render ends without …
richiemcilroy eebad95
fix(web): back off render status polling and stop after an hour
richiemcilroy 1835d56
fix(media-server): install from the workspace root so the editor bund…
richiemcilroy 1a85334
fix(web): keep polling a render that is still running after an hour
richiemcilroy fc70b53
fix(editor): show zoom preview unavailable instead of a stale frame
richiemcilroy b55b094
fix(editor): lock browser export files and remove the ones no tab sti…
richiemcilroy 7a0dd5a
fix(editor): decode Chrome export frames in software so colours match…
richiemcilroy 2040994
fix(web): stop treating a render as running once its status stops ans…
richiemcilroy 978371d
fix(editor): remove day-old export files when Web Locks are unavailable
richiemcilroy e138394
perf(editor): step the preview down after a couple of very slow frames
richiemcilroy 5005472
perf(rendering): scissor browser card draws and skip the motion blur …
richiemcilroy 3736f95
fix(editor): undo Chrome's display gamma on hardware-decoded preview …
richiemcilroy 4aa1937
refactor(editor): expose the timeline a recording without one opens with
richiemcilroy f36a51e
refactor(export): move web editor preparation into the export library
richiemcilroy c058242
feat(render-farm): prepare web recordings in the render engine
richiemcilroy 8ecf5c3
feat(web): start farm renders without an editor worker when the farm …
richiemcilroy b6ba5ca
perf(editor): feed waveform audio packets straight to the decoder
richiemcilroy 17e8736
fix(web): ask the farm to fill session defaults only for never-edited…
richiemcilroy 30d66e1
fix(render-farm): render saved projects as saved when preparing
richiemcilroy c14e191
perf(editor): size the preview once at open instead of after layout s…
richiemcilroy 8ecdec9
perf(editor): wait for layout before the first web preview frame and …
richiemcilroy 1724438
fix(web): keep checking an unreachable render rarely instead of givin…
richiemcilroy 80f2450
fix(rendering): split the scissor guard so clippy accepts it
richiemcilroy 18c46b5
fix(editor): match the preview box during resize and step down on ren…
richiemcilroy ef9da12
fix(editor): mount the preview without waiting for colour calibration
richiemcilroy f0b5a69
fix(render-farm): publish exports without padding and keep decoder re…
richiemcilroy ecc6b1c
feat(render-farm): prepare web recordings on the farm and download so…
richiemcilroy 9901683
fix(render-farm): rewrite browser WebM in process instead of calling …
richiemcilroy 75b2c5f
chore(web): drop render farm helper comments that restate the code
richiemcilroy 60eaeee
feat(rendering): convert browser NV12 planes to RGBA with an exact BT…
richiemcilroy eb6547c
perf(editor): feed Safari preview frames to the renderer as NV12 planes
richiemcilroy 469e246
docs(render-farm): drop test and helper comments that restate the code
richiemcilroy 8dc3f26
fix(render-farm): join prepared file keys with slashes on every OS
richiemcilroy 7d6dbf8
fix(web): prepare on a worker when the farm lacks a library track the…
richiemcilroy 5585f84
fix(render-farm): count landed source ranges as transcode progress
richiemcilroy ad76ae4
Merge origin/main into feature/web-editor-desktop-parity
richiemcilroy df2a321
feat(render-farm): run cursor reconstruction jobs
richiemcilroy cc88b6a
feat(web): replace a browser recording's cursor from a farm reconstru…
richiemcilroy 46dae24
feat(editor): add an experimental cursor replacement toggle on web
richiemcilroy 02b1b6a
fix(render-farm): keep a cursor task alive while its bundle downloads
richiemcilroy 53502fd
fix(web): expire abandoned cursor runs and start one at a time
richiemcilroy e1ff3f2
fix(editor): reload onto the cursor sources whenever they change
richiemcilroy 44f18b9
fix(web): store cursor reconstructions in the render folder the farm …
richiemcilroy 5875dc0
fix(editor): only hold back a repeated cursor reload toward the same …
richiemcilroy d6fdf1d
fix(render-farm): refuse a chunk whose stash upload failed
richiemcilroy 05beb51
fix(render-farm): keep a cursor task alive while it uploads its outputs
richiemcilroy 67b78a9
fix(web): tie cursor runs to their exact display and the farm's own s…
richiemcilroy 6bff342
fix(editor): leave frames tagged with other matrices to the browser's…
richiemcilroy f46016d
fix(render-farm): fail a cursor transfer that outlasts its limit
richiemcilroy 21bba36
fix(web): let a cursor run for a replaced display be started again
richiemcilroy 8734183
fix(web): keep cursor runs recorded before source identity working
richiemcilroy f2d9f58
feat(render-farm): let an S3 upload be cancelled
richiemcilroy 6003035
fix(render-farm): cancel a cursor upload past its limit before failin…
richiemcilroy 37a86cd
fix(web): start a cursor run only for the display the request read
richiemcilroy 9dcbbcc
fix(render-farm): give multipart upload cleanup its own deadline
richiemcilroy a908da4
test(render-farm): time out a hanging multipart cleanup
richiemcilroy 921a45f
chore(editor): drop comments that narrate the code below them
richiemcilroy 78b4cf5
fix(editor): apply the colour correction between frames and expose wh…
richiemcilroy c7bb034
test(editor): wait for the colour check before comparing compositor f…
richiemcilroy 56bc723
test(media-server): report editor state when browser-only playback ne…
richiemcilroy c8a4b8b
test(media-server): bound the playback failure diagnostics so the fai…
richiemcilroy 1a3ce9d
perf(editor): read further ahead only while scrubbing
richiemcilroy 730429c
perf(editor): show key frames while scrubbing and the exact frame onc…
richiemcilroy a7e0554
chore(editor): drop comments that restate the scrub thresholds
richiemcilroy ed3e329
feat(render-farm): index fragmented MP4 recordings from their fragmen…
richiemcilroy 7a591b3
perf(render-farm): render remuxable recordings in place instead of tr…
richiemcilroy ed64288
perf(editor): cap mediabunny read-ahead so it stops evicting the next…
richiemcilroy ec6cae7
fix(editor): name the skip to start button
richiemcilroy 60a63b9
test(media-server): start the full-quality playback check from the be…
richiemcilroy 6a41cb3
fix(render-farm): only dispatch prefixed tasks to workers that can re…
richiemcilroy 2f4da86
perf(web): start recording renders from the upload request instead of…
richiemcilroy b51a28f
perf(web): poll a render the page is showing every second, faster onc…
richiemcilroy 8e6d92a
fix(web): keep the recording render start helpers out of the workflow…
richiemcilroy 10c2584
perf(editor): read signed media ranges without Chrome's one-request-p…
richiemcilroy 9f8db6d
perf(editor): resume playback at the preview resolution the last play…
richiemcilroy cf7d366
fix(web): pass the video id to render start logs as an argument, not …
richiemcilroy b52e379
chore: drop comments that restate the render start helpers and segmen…
richiemcilroy 513a483
refactor(editor): use a kebab-case filename for the web cursor replac…
richiemcilroy 20b8ab1
fix(render-farm): count a worker as able to serve a task only if disp…
richiemcilroy 5cf7247
perf(web): look up the studio video and edits alongside the sign-in c…
richiemcilroy 45ce544
perf(editor): open WebM audio with small reads instead of video-sized…
richiemcilroy 278a96d
fix(render-farm): decode only each audio section's window when a trac…
richiemcilroy 4a93fa7
perf(render-farm): free a render slot while its finished chunk waits …
richiemcilroy 8122ead
fix(editor): read further back for a WebM seek point when the last cl…
richiemcilroy 6de407d
chore(editor): keep only the why in the playback scale comments
richiemcilroy ec8b834
fix(editor): wait for a loaded video's frame by readiness, not a load…
richiemcilroy 8043a7d
chore(editor): drop the WebM fixture file's header comment
richiemcilroy 84da68d
chore(editor): remove the web cursor replacement toggle for now
richiemcilroy 522d5fd
chore(editor): hide the keyboard tab and track in the web editor
richiemcilroy a17647d
fix(web): play a video that is still rendering in the share player, n…
richiemcilroy cbfec85
feat(rendering): interpolate chroma when converting browser NV12 plan…
richiemcilroy 3630e0e
perf(editor): export from NV12 planes in Safari with five second keyf…
richiemcilroy 98ca273
fix(web): serve a browser Save's playlist as a variant so playback re…
richiemcilroy da2fedc
fix(editor): count a web recording's pointer input as recorded cursor…
richiemcilroy 145283a
fix(editor): keep BT.601 retagged frames off the Safari export's NV12…
richiemcilroy f4962c0
fix(editor): stay ready once the first frame has shown while the prev…
richiemcilroy de15bc7
feat(editor): add a focus mode that gives the web preview and timelin…
richiemcilroy c330429
fix(editor): leave focus mode when asked to mid-transition
richiemcilroy ccb76d1
chore(editor): drop comments that describe focus mode
richiemcilroy 9019a75
fix(web): generate web editor captions from the share transcript with…
richiemcilroy 02d6012
fix(editor): carry a caption edit from the timeline onto its source c…
richiemcilroy ae1f78a
fix(editor): burn captions into a browser Save only when export with …
richiemcilroy 3f2a11d
chore(editor): drop comments that restate the browser export entry po…
richiemcilroy 4a51b57
fix(editor): rewrite only the edited piece of a caption a cut split
richiemcilroy 7363476
fix(web): take a worker session when web captions come to need one mi…
richiemcilroy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,164 @@ | ||
| name: Docker Build Editor Worker | ||
|
|
||
| on: | ||
| pull_request: | ||
| paths: | ||
| - "apps/media-server/**" | ||
| - "apps/web/lib/editor-caption-access.ts" | ||
| - "apps/web/lib/editor-caption-transport.ts" | ||
| - "apps/web/lib/editor-recording-title.ts" | ||
| - "apps/desktop/src/assets/music/**" | ||
| - "apps/desktop/src-tauri/assets/backgrounds/**" | ||
| - "crates/**" | ||
| - "packages/editor-cap-bundle/**" | ||
| - "packages/editor-solid-web/**" | ||
| - "vendor/**" | ||
| - "Cargo.toml" | ||
| - "Cargo.lock" | ||
| - "package.json" | ||
| - "bun.lock" | ||
| - "bunfig.toml" | ||
| - ".github/workflows/docker-build-editor-worker.yml" | ||
| push: | ||
| branches: | ||
| - main | ||
| paths: | ||
| - "apps/media-server/**" | ||
| - "apps/web/lib/editor-caption-access.ts" | ||
| - "apps/web/lib/editor-caption-transport.ts" | ||
| - "apps/web/lib/editor-recording-title.ts" | ||
| - "apps/desktop/src/assets/music/**" | ||
| - "apps/desktop/src-tauri/assets/backgrounds/**" | ||
| - "crates/**" | ||
| - "packages/editor-cap-bundle/**" | ||
| - "packages/editor-solid-web/**" | ||
| - "vendor/**" | ||
| - "Cargo.toml" | ||
| - "Cargo.lock" | ||
| - "package.json" | ||
| - "bun.lock" | ||
| - "bunfig.toml" | ||
| - ".github/workflows/docker-build-editor-worker.yml" | ||
|
|
||
| permissions: {} | ||
|
|
||
| jobs: | ||
| build: | ||
| name: Build and test editor worker (${{ matrix.platform }}) | ||
| runs-on: ${{ matrix.runner }} | ||
| timeout-minutes: 30 | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| include: | ||
| - platform: amd64 | ||
| runner: ubuntu-24.04 | ||
| - platform: arm64 | ||
| runner: ubuntu-24.04-arm | ||
| permissions: | ||
| contents: read | ||
| steps: | ||
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | ||
| with: | ||
| persist-credentials: false | ||
| - name: Set up Docker Buildx v3.12.0 | ||
| uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f | ||
| - name: Build editor worker image with Docker v6.19.2 | ||
| uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 | ||
| with: | ||
| context: . | ||
| file: apps/media-server/Dockerfile.editor | ||
| platforms: linux/${{ matrix.platform }} | ||
| load: true | ||
| tags: cap-editor-worker:verification | ||
| cache-from: type=gha,scope=editor-worker-${{ matrix.platform }} | ||
| cache-to: type=gha,mode=max,scope=editor-worker-${{ matrix.platform }} | ||
| - name: Check native worker readiness | ||
| run: | | ||
| docker run --rm --network none \ | ||
| -e CAP_WEB_EDITOR_PUBLIC_ORIGIN=http://127.0.0.1:3457 \ | ||
| -e MEDIA_SERVER_WEBHOOK_SECRET=test \ | ||
| --entrypoint bun cap-editor-worker:verification \ | ||
| -e 'import app from "./src/editor-worker-app.ts"; const response = await app.request("/health"); if (!response.ok) process.exit(1)' | ||
| - name: Exercise paired native editor routes | ||
| run: | | ||
| docker run --rm --network none --cpus 4 --memory 4g \ | ||
| -e MEDIA_SERVER_WEBHOOK_SECRET=test \ | ||
| --entrypoint bun cap-editor-worker:verification test \ | ||
| src/__tests__/editor-worker-app.test.ts \ | ||
| src/__tests__/lib/editor-assets.test.ts \ | ||
| src/__tests__/lib/editor-clip-thumbnails.test.ts \ | ||
| src/__tests__/lib/editor-config-paths.test.ts \ | ||
| src/__tests__/lib/editor-image-assets.test.ts \ | ||
| src/__tests__/lib/editor-security.test.ts \ | ||
| src/__tests__/lib/editor-wallpapers.test.ts \ | ||
| src/__tests__/routes/editor-clips.test.ts \ | ||
| src/__tests__/routes/editor.test.ts | ||
| - name: Verify editor subprocess credential isolation | ||
| run: | | ||
| docker run --rm --network none \ | ||
| -e MEDIA_SERVER_WEBHOOK_SECRET=test \ | ||
| -e AWS_SECRET_ACCESS_KEY=test \ | ||
| --entrypoint bun cap-editor-worker:verification \ | ||
| src/__tests__/lib/editor-process-env-replay.ts | ||
| - name: Verify cursor-only MOV export | ||
| run: | | ||
| docker run --rm --network none --cpus 4 --memory 4g \ | ||
| --entrypoint bun cap-editor-worker:verification \ | ||
| src/__tests__/routes/editor-cursor-mov-replay.ts | ||
| - name: Replay browser-only Studio and worker exports | ||
| if: matrix.platform == 'amd64' | ||
| run: | | ||
| docker run --rm --cpus 4 --memory 8g --ipc host \ | ||
| -v "${{ github.workspace }}:/source" \ | ||
| -w /source/apps/media-server \ | ||
| cap-editor-worker:verification \ | ||
| bash -e -u -o pipefail -c ' | ||
| cd /source | ||
| bun install --frozen-lockfile | ||
| bunx playwright install --with-deps chromium webkit firefox | ||
| apt-get install -y --no-install-recommends xauth | ||
| bun run --filter @cap/editor-solid-web build | ||
| cd /source/apps/media-server | ||
| export CAP_EDITOR_UI_PARITY_ARTIFACT_DIR=/source/cap-editor-parity-artifacts | ||
| run_browser_only_studio() { | ||
| case "$CAP_EDITOR_UI_BROWSER" in | ||
| firefox|webkit) CAP_EDITOR_UI_HEADED=1 xvfb-run -a bun src/__tests__/routes/editor-solid-browser-only-replay.ts ;; | ||
| *) bun src/__tests__/routes/editor-solid-browser-only-replay.ts ;; | ||
| esac | ||
| } | ||
| run_worker_studio() { | ||
| case "$CAP_EDITOR_UI_BROWSER" in | ||
| firefox|webkit) CAP_EDITOR_UI_HEADED=1 xvfb-run -a bun run test:native-editor-ui ;; | ||
| *) bun run test:native-editor-ui ;; | ||
| esac | ||
| } | ||
| browser_replay_failed=0 | ||
| for browser in chromium firefox webkit; do | ||
| if ! CAP_EDITOR_UI_PARITY_ARTIFACT_DIR=/source/cap-editor-parity-artifacts CAP_EDITOR_UI_BROWSER="$browser" run_browser_only_studio; then | ||
| browser_replay_failed=1 | ||
| fi | ||
| done | ||
| for browser in chromium webkit firefox; do | ||
| for pro in 0 1; do | ||
| CAP_EDITOR_UI_SHARE_REPLAY=1 CAP_EDITOR_UI_BROWSER="$browser" CAP_EDITOR_UI_PRO_CAPTIONS="$pro" run_worker_studio | ||
| done | ||
| done | ||
| for repeat in 2 3; do | ||
| printf "WebKit Free replay %s\n" "$repeat" | ||
| CAP_EDITOR_UI_SHARE_REPLAY=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio | ||
| done | ||
| CAP_EDITOR_UI_CURSOR_MOV=1 CAP_EDITOR_UI_BROWSER=chromium CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio | ||
| CAP_EDITOR_UI_CURSOR_MOV=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=1 run_worker_studio | ||
| CAP_EDITOR_UI_CANVAS_FALLBACK=1 CAP_EDITOR_UI_BROWSER=chromium CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio | ||
| CAP_EDITOR_UI_CANVAS_FALLBACK=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=1 run_worker_studio | ||
| bun src/__tests__/routes/editor-presets-browser-replay.ts | ||
| if [ "$browser_replay_failed" -ne 0 ]; then exit 1; fi | ||
| ' | ||
| - name: Upload Studio parity diagnostics | ||
| if: failure() && matrix.platform == 'amd64' | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: web-studio-parity-diagnostics | ||
| path: cap-editor-parity-artifacts | ||
| if-no-files-found: ignore | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.