Skip to content

Add ruby_event_store-browser-swimlane extension gem#1955

Open
pjurewicz wants to merge 1 commit into
masterfrom
browser-swimlane-extension
Open

Add ruby_event_store-browser-swimlane extension gem#1955
pjurewicz wants to merge 1 commit into
masterfrom
browser-swimlane-extension

Conversation

@pjurewicz

@pjurewicz pjurewicz commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Summary

A browser extension gem (contrib/ruby_event_store-browser-swimlane) comparing several streams side by side: their events merged into one newest-first timeline table, one column per stream, with infinite scroll and a created-at/valid-at sort toggle. An event linked into several compared streams renders once, as a link in each matching column.

  • Data layer: each page is composed from existing single-stream reads — one time-ordered (as_at/as_of) read per compared stream, k-way merged by event time. Count is the read depth per stream, not the page size: a page emits everything above the completeness horizon (the highest chunk end among the streams whose read was cut), so nothing provably complete is thrown away and a page carries between count and count × streams events. The shared cursor is that horizon timestamp; a chunk cut exactly at it has the rest of that timestamp's group drained with between(t..t), so the next page asks for strictly older events and nothing is dropped or repeated. A mass of identical timestamps renders as one long page.
  • Built entirely on the extension API: /compare and /compare/more via register_routes (json + render_partial), an entry link on every stream page via stream_links, its own Stimulus controllers via scripts (a separate Stimulus application importing the vendored stimulus module; timezone display synced with the core selector through the shared localStorage key). No core changes.
  • CI wired via support/ci/generate (test / mutate / coverage workflows).

Relies on #1954 (in-memory repository: limit after time filters) and #1950 (Sequel: time sort on backward reads) — both already merged.

Supersedes the in-repo approach of #1949.

Test plan

  • 36 specs: reader unit coverage (merge, cursors, timestamp groups, linked events, both sort axes) and web coverage through Browser::App.for(extensions:) behind Rack::Lint
  • Mutation testing — 100% (428 mutations)

@pjurewicz
pjurewicz force-pushed the browser-swimlane-extension branch 4 times, most recently from 7cc58dd to 4b033eb Compare July 17, 2026 16:37
A browser extension comparing several streams side by side: their
events merged into one newest-first timeline table, one column per
stream, with infinite scroll and a created-at/valid-at sort toggle. An
event linked into several compared streams renders once, as a link in
each matching column.

Each page is composed from existing single-stream reads - one time
ordered read per compared stream, k-way merged by event time. Count is
the read depth per stream, not the page size: a page emits everything
above the completeness horizon (the highest chunk end among the
streams whose read was cut), so nothing provably complete is thrown
away. The shared cursor is that horizon timestamp and the next page
asks for strictly older events - nothing is dropped or repeated.

Built entirely on the browser extension API: routes and json responses
via register_routes, an entry link via stream_links, its own stimulus
controllers via scripts.
@pjurewicz
pjurewicz force-pushed the browser-swimlane-extension branch from 4b033eb to 5793f2d Compare July 17, 2026 17:12
@pjurewicz
pjurewicz marked this pull request as ready for review July 17, 2026 17:46
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