Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
f393a32
chore(quest): claim quest/m1/socket/py.md
kixelated Nov 4, 2026
91fc333
feat(ffi): expose socket endpoints across language bindings
kixelated Nov 4, 2026
0fb96bf
bench(py): warm socket cases and measure repeated sessions
kixelated Nov 4, 2026
f1606d2
test(ffi): require the deliberate reset when a group is released
kixelated Nov 4, 2026
c22b17e
docs(py): format socket examples and benchmark guidance
kixelated Nov 4, 2026
17cc8f1
fix(net): preserve initial socket bursts across IETF joins
kixelated Nov 4, 2026
109af07
test(socket): retain both halves until the peer finishes
kixelated Nov 4, 2026
8998db6
docs(quest): plan deterministic IETF wider-fill coverage
kixelated Nov 4, 2026
2a23e3f
test(net): request the live group explicitly and name flake investiga…
kixelated Nov 4, 2026
0ffffbc
test(net): keep widening fixture on its intended live group
kixelated Nov 4, 2026
12c4c28
Merge origin/main before final socket validation
kixelated Nov 4, 2026
c76d2be
test(net): retain the absolute prefix through delayed IETF answers
kixelated Nov 4, 2026
d1646ec
test(socket): assert endpoint reset without promising its scheduling-…
kixelated Nov 4, 2026
a140590
test(py): type the generated socket reset exception base
kixelated Nov 4, 2026
554da56
test(net): require absolute range delivery on every IETF draft
kixelated Nov 4, 2026
988f183
refactor(net): share unrestricted update range resolution
kixelated Nov 4, 2026
2217e33
Merge origin/main quest updates before draft publication
kixelated Nov 4, 2026
ccd2d45
Merge remote-tracking branch 'origin/main' into t3/d23b5f6d
kixelated Nov 4, 2026
0433e47
fix(net): keep filterless IETF subscriptions live
kixelated Nov 4, 2026
fbc4c8d
Merge origin/main into quest/m1/socket/py
kixelated Nov 4, 2026
5a556b5
fix(ffi): adapt socket handles to separate datagram tracks
kixelated Nov 4, 2026
594080f
Merge remote-tracking branch 'origin/main' into t3/d23b5f6d
kixelated Nov 4, 2026
00144ce
feat(ffi): await group capacity with MoqGroupProducer::ready
kixelated Nov 4, 2026
5b4625e
test(ffi): settle the paced writer on the ambient clock
kixelated Nov 4, 2026
a8c23b8
Merge remote-tracking branch 'origin/main' into t3/d23b5f6d
kixelated Nov 4, 2026
a0390ac
fix(ffi): wake every concurrent ready call
kixelated Nov 4, 2026
bf79aa0
Merge remote-tracking branch 'origin/main' into t3/d23b5f6d
kixelated Nov 4, 2026
51e96b0
docs(net): escape LOCATION_FILTER in MIGRATE notes
pullfrog[bot] Nov 5, 2026
4a0d771
Merge remote-tracking branch 'origin/main' into t3/dd6fb126
kixelated Nov 5, 2026
3a9d1a7
fix(ffi): defer group wakes until the group producer unlocks
kixelated Nov 5, 2026
702620a
fix(js): keep absolute IETF subscriptions open-ended
kixelated Nov 5, 2026
e13fa8b
test(py): pace the socket ready test with a barrier, not a timer
kixelated Nov 5, 2026
8a7a2c0
docs: ready waits for the fastest reader only; pin lite-07 in the Pyt…
kixelated Nov 5, 2026
c5cb51a
style(py): format the socket ready test
kixelated Nov 5, 2026
2a552c1
Merge remote-tracking branch 'origin/main' into t3/dd6fb126
kixelated Nov 5, 2026
b50a403
Merge main and preserve socket and benchmark-lock documentation
kixelated Nov 5, 2026
0c115b0
fix(net): join a group-0 IETF start live and fetch the rest
kixelated Nov 5, 2026
24e13c3
Merge remote-tracking branch 'origin/main' into HEAD
kixelated Nov 5, 2026
0e00a67
test(socket): run the burst test and Python socket lane over lite only
kixelated Nov 5, 2026
ee26f96
Merge remote-tracking branch 'origin/main' into HEAD
kixelated Nov 5, 2026
774a914
fix(socket): join a tcp half live; document skipped track messages
kixelated Nov 5, 2026
620aca1
style(socket): rustfmt
kixelated Nov 5, 2026
5bdb3b2
Merge origin/main; drop a group-0 join's cut Largest group
kixelated Nov 5, 2026
daa02fd
fmt
kixelated Nov 5, 2026
0fc1257
clippy: collapse the if
kixelated Nov 5, 2026
187296d
Keep a headless group whose stream claims FIRST_OBJECT
kixelated Nov 5, 2026
e3f1c8c
Merge origin/main into quest/m1/socket/py
kixelated Nov 5, 2026
2880a12
Drop a refused headless group, and mark Largest at object 0 headless
kixelated Nov 5, 2026
ddc0cc9
Format the regression
kixelated Nov 5, 2026
2db1866
Drop a headless group on the ObjectIdGap path too
kixelated Nov 5, 2026
66da6e5
Merge origin/main into quest/m1/socket/py
kixelated Nov 5, 2026
6e67125
Merge origin/main into quest/m1/socket/py
kixelated Nov 5, 2026
5d43aca
Merge origin/main into quest/m1/socket/py
kixelated Nov 5, 2026
2770d60
test(py): open the forged socket broadcast through a route
kixelated Nov 5, 2026
d7c6ac7
test(net): open the IETF warm-relay fixture through a route
kixelated Nov 6, 2026
eb987d5
quest land: merge tested base
Nov 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions bench/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -970,3 +970,12 @@ OOM kill does too, even inside a Quest scope: each worker watches `local.py`
through a pidfd and stops once it exits. macOS has no pidfd, so there killing
`local.py` with SIGKILL frees the lock while its workers keep measuring until
their own gates exit, an accepted gap. Stop it with Ctrl-C or SIGTERM instead.

### Python socket sessions

The Python binding runner also sweeps both TCP and track sockets over 1, 4,
and 16 accepting endpoints and 1, 4, and 16 concurrent sessions per endpoint.
Each session sends a checked payload and finishes both halves. The
`socket/<protocol>/endpoints=N/sessions=M` entries report complete sessions per
second, including handshake, FFI calls, reads, and teardown. Run with
`just py bench`; Nightly's binding lane runs the same sweep.
4 changes: 4 additions & 0 deletions c/moq/MIGRATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ How to update your code for each breaking change, newest first.

## Unreleased

### Socket sessions

The generated socket endpoint, incoming dial, and stream handles now expose TCP group halves and reliably subscribed track halves beside origin. Regenerate bindings and rebuild the matching native library together. Existing callers need no migration. Socket endpoints require lite-07 or moq-transport on every hop; there is no wire change.

### Publishing goes through one `moq_route` handle

`moq_origin_producer_create_broadcast(origin, path, &publication)` is `moq_origin_producer_route(origin, path, &options, &route)`, and `moq_origin_producer_requests(origin, prefix, &requests)` is `moq_origin_producer_route_prefix(origin, prefix, &options, &route)`; start `options` from `moq_route_options_default()`. A `moq_route` replaces `moq_publication`, `moq_origin_requests`, and `moq_broadcast_prepared`:
Expand Down
6 changes: 6 additions & 0 deletions cpp/moq/MIGRATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

## Unreleased

### Socket sessions

The generated SocketEndpoint, SocketIncomingTcp, SocketIncomingTrack, SocketTcpStream, and SocketTrackStream handles now expose TCP group halves and reliably subscribed track halves beside origin. Regenerate bindings and rebuild the matching native library together. Existing callers need no migration. Socket endpoints require lite-07 or moq-transport on every hop; there is no wire change.

`moq::GroupProducer::ready(size)` is a new async call that completes once a frame of `size` bytes fits a window ahead of the fastest reader. `co_await` it before each `write_frame` so the writer waits for its fastest reader instead of evicting it, though not for slower readers; a TCP socket stream's producer needs it to behave like TCP. Existing writers are unchanged.

### `Following::available()` reports the path going offline ([#7678](https://github.com/moq-dev/moq/pull/7678))

`moq::Following::available()` resolves to a null `std::shared_ptr<moq::BroadcastConsumer>` once the path goes offline (or, for a follow pinned to an instance, once another instance takes it over), then the next broadcast when something serves the path again. The first call is never null. Check for null before using a later result, and treat it like the previous instance ending.
Expand Down
6 changes: 6 additions & 0 deletions dart/moq/MIGRATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ How to update your code for each breaking change, newest first.

## Unreleased

### Socket sessions

package:moq/socket.dart now exposes TCP group halves and reliably subscribed track halves beside origin. Regenerate bindings and rebuild the matching native library together. Existing callers need no migration. Socket endpoints require lite-07 or moq-transport on every hop; there is no wire change.

`GroupProducer.ready(size)` is a new `Future` that completes once a frame of `size` bytes fits a window ahead of the fastest reader. Await it before each `writeFrame` so the writer waits for its fastest reader instead of evicting it, though not for slower readers; a TCP socket stream's producer needs it to behave like TCP. Existing writers are unchanged.

### `Following.available()` returns null once the path goes offline

`await following.available()` returns `BroadcastConsumer?`.
Expand Down
19 changes: 19 additions & 0 deletions dart/moq/lib/socket.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/// Point-to-point socket endpoints and sessions.
library;

import 'package:moq_ffi/moq_ffi.dart';

/// Announces one hidden endpoint and dials or accepts sessions.
typedef Endpoint = MoqSocketEndpoint;

/// An incoming TCP dial, consumed by accepting or rejecting it.
typedef IncomingTcp = MoqSocketIncomingTcp;

/// An incoming track dial, consumed by accepting or rejecting it.
typedef IncomingTrack = MoqSocketIncomingTrack;

/// A TCP session with group producer and consumer halves.
typedef TcpStream = MoqSocketTcpStream;

/// A track session with producer and reliably subscribed consumer halves.
typedef TrackStream = MoqSocketTrackStream;
Loading
Loading