Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
9c975aa
chore: point LiveKitUniFFI to local build for data tracks development
pblazej Apr 24, 2026
aff6fa2
feat(data-tracks): integrate UniFFI data track managers into Swift SDK
pblazej Apr 24, 2026
bce07cf
fix(data-tracks): fix signal forwarding and test race conditions
pblazej Apr 24, 2026
17a41e5
fix(data-tracks): adapt to split UniFFI signal handler API
pblazej Apr 30, 2026
6c21122
fix(data-tracks): handle PushFrameErrorReason associated values
pblazej Jun 25, 2026
03092ce
refactor(data-tracks): tidy data track manager wiring
pblazej Jun 26, 2026
f4ac550
feat(data-tracks): wire E2EE, attach remote tracks to participants, a…
pblazej Jun 26, 2026
4a9f68f
refactor(data-tracks): merge cryptor, add manager handleReconnect, dr…
pblazej Jun 29, 2026
1dc057b
refactor(data-tracks): hold session state in a synchronized DataTrack…
pblazej Jun 29, 2026
4c93a0b
feat(data-tracks): expose a public data track API
pblazej Jun 29, 2026
d4dc998
test(data-tracks): cover the public data track API from Objective-C
pblazej Jun 29, 2026
ee76995
refactor(data-tracks): mark wrapper types with an FFIBridged protocol
pblazej Jun 29, 2026
82fdff0
refactor(data-tracks): serialize signal sends, don't block the callba…
pblazej Jun 29, 2026
1970444
refactor(data-tracks): rename DataTrackPushError to DataTrackPushFram…
pblazej Jun 29, 2026
c02d671
refactor(data-tracks): pass participant in delegate callbacks, type t…
pblazej Jun 29, 2026
e422b76
test(data-tracks): tighten assertions and parameterize publish/receive
pblazej Jun 29, 2026
4bd86c4
test(data-tracks): cover send(contentsOf:), participant attachment, u…
pblazej Jun 29, 2026
891558e
test(data-tracks): add parameterized multi-track concurrent push stre…
pblazej Jun 29, 2026
04de2c6
test(data-tracks): cover queryDataTracks
pblazej Jun 30, 2026
a298fb6
refactor(data-tracks): encapsulate subsystem behind a DataTracks coor…
pblazej Jun 30, 2026
a021017
fix(data-tracks): make the data track subsystem session-scoped
pblazej Jun 30, 2026
b4a681a
feat(data-tracks): wire join + sync-state APIs, drop queryDataTracks
pblazej Jul 1, 2026
dde55d0
test(data-tracks): TODO for a quick-reconnect sync-state test
pblazej Jul 1, 2026
3e3043e
feat(data-tracks): retain publications so callers needn't hold the ha…
pblazej Jul 1, 2026
5cd8813
test(data-tracks): cover the quick-reconnect sync-state path
pblazej Jul 1, 2026
24cf786
feat(data-tracks): expose subscribe buffer size
pblazej Jul 1, 2026
583cddd
feat(data-tracks): emit publish/unpublish events on room and particip…
pblazej Jul 1, 2026
c787515
test(data-tracks): cover publish/unpublish events on all delegates
pblazej Jul 1, 2026
369b553
fix(data-tracks): unpublish remote data tracks when publisher disconn…
pblazej Jul 1, 2026
8b524f5
Merge remote-tracking branch 'origin/main' into blaze/datatracks-inte…
pblazej Aug 4, 2026
9a25c54
chore(data-tracks): adopt released livekit-uniffi-xcframework 0.1.8
pblazej Aug 4, 2026
3c02c8d
fix(data-tracks): follow SID reassignment after a publisher's full re…
pblazej Aug 4, 2026
4cf4514
test(data-tracks): honor watcher timeouts; assert SID-reassignment co…
pblazej Aug 4, 2026
12dab43
test(data-tracks): split oversized suite; adopt ObjC connect helper
pblazej Aug 4, 2026
1f6c1b1
Update Sources/LiveKit/Participant/RemoteParticipant.swift
pblazej Aug 4, 2026
be8738f
fix(e2ee): keep the data packet cryptor across a full reconnect
pblazej Aug 5, 2026
3350bfc
fix(data-tracks): reattach remote tracks after a local full reconnect
pblazej Aug 5, 2026
6697a67
fix(data-tracks): address review round two
pblazej Aug 5, 2026
c725f34
fix(data-tracks): typed DataTrack.Sid; atomic unpublish snapshot
pblazej Aug 5, 2026
fc55877
test(data-tracks): close the waitForDataTrack registration race
pblazej Aug 5, 2026
fa5bbed
fix(data-tracks): retry orphaned track attachment; reuse received sig…
pblazej Aug 5, 2026
fc3e045
fix(data-tracks): honor the E2EE toggle at connect for data track pub…
pblazej Aug 5, 2026
afba1bc
fix(data-tracks): serialize inbound raw responses; encrypt under lega…
pblazej Aug 5, 2026
f03747c
fix(data-tracks): establish the publisher transport before publishing
pblazej Aug 5, 2026
2be48cc
test(data-tracks): bound each test with a five-minute time limit
pblazej Aug 5, 2026
3770590
test(data-tracks): annotate suites for timeLimit availability
pblazej Aug 5, 2026
37ccc82
Revert data-track test time limits
pblazej Aug 5, 2026
b25e424
fix(data-tracks): honor EncryptionType.none; drop stale buffered resp…
pblazej Aug 5, 2026
c879d00
test(data-tracks): use StateSync in the delegate recorder
pblazej Aug 6, 2026
91e9203
feat(data-tracks): meter outbound frames with a drop-oldest drain
pblazej Aug 6, 2026
981f204
fix(data-tracks): end send(contentsOf:) quietly when unpublished mid-…
pblazej Aug 6, 2026
d489d82
Merge remote-tracking branch 'origin/main' into blaze/datatracks-inte…
pblazej Aug 13, 2026
e9bd008
revert(data-tracks): publications follow the handle again (RAII)
pblazej Aug 13, 2026
e0cff9f
fix(data-tracks): re-arm the publisher-open gate across full reconnects
pblazej Aug 13, 2026
d97a83e
refactor(data-tracks): drop the unused FFIBridged marker
pblazej Aug 13, 2026
94bb35b
feat(data-tracks): surface error messages via LocalizedError
pblazej Aug 13, 2026
ab733d0
fix(data-tracks): throw .disconnected when publishing unconnected
pblazej Aug 13, 2026
a622939
feat(data-tracks): add RemoteDataTrack.waitForUnpublish; type publish…
pblazej Aug 13, 2026
861aff8
feat(data-tracks): expose schema and frameEncoding on DataTrackInfo
pblazej Aug 13, 2026
27f7111
feat(data-tracks): make DataTrackStream an AsyncSequence
pblazej Aug 13, 2026
930bf97
feat(data-tracks): key participant dataTracks by name; store in parti…
pblazej Aug 13, 2026
a989f26
test(data-tracks): cover the no-E2EE path and AsyncCompleter.rearm
pblazej Aug 13, 2026
4f83e0b
docs(data-tracks): document multi-subscribe semantics
pblazej Aug 13, 2026
22268d2
feat(data-tracks): publish options with schema and frame encoding; Ob…
pblazej Aug 13, 2026
dc524b7
refactor(data-tracks): scope the raw-response stream to the connection
pblazej Aug 13, 2026
9078cdf
chore: fix lint findings; raise app-size budget to measured 16.3 MB
pblazej Aug 13, 2026
02fcaaf
fix(data-tracks): map publish-gate failures to DataTrackPublishError
pblazej Aug 14, 2026
6e42769
chore: add data tracks changeset
pblazej Aug 14, 2026
406133b
perf(data-tracks): forward only the signal responses the managers con…
pblazej Aug 14, 2026
c15ead8
fix(data-tracks): carry declared schema and frame encoding to subscri…
pblazej Aug 14, 2026
fb29d7c
fix(data-tracks): compare frames and track info by value
pblazej Aug 14, 2026
9659a5f
feat(data-tracks): add DataTrackFrame.durationSinceTimestamp
pblazej Aug 14, 2026
49ba415
perf(data-tracks): cache the stable identifiers on RemoteDataTrack
pblazej Aug 14, 2026
ae28f8d
fix(data-tracks): don't report an unpublish for tracks that survive a…
pblazej Aug 14, 2026
a92546a
fix(data-tracks): surface a typed error when a push is rejected
pblazej Aug 14, 2026
c639b90
feat(data-tracks): hand the rejected frame back on a full send queue
pblazej Aug 14, 2026
41cdf01
perf(data-tracks): drain outbound packets from a Deque
pblazej Aug 14, 2026
369d731
ci: raise the app size budget to 16.5 MB
pblazej Aug 14, 2026
8e0fbc1
test(data-tracks): cover publication lifetime, push errors and room m…
pblazej Aug 14, 2026
d91cd23
fix(data-tracks): capture the encryption setting at first publish
pblazej Aug 14, 2026
0a4b89d
feat(data-tracks): define and resolve data track schema definitions
pblazej Aug 14, 2026
d0a55b4
fix(data-tracks): don't fail a data blob request on a non-failure reason
pblazej Aug 14, 2026
674d209
test(data-tracks): make the queue-full policy deterministic
pblazej Aug 14, 2026
f083b01
fix(data-tracks): resolve the E2EE manager per call, not at connect
pblazej Aug 14, 2026
e09c487
test(data-tracks): bound stream reads; split out delegate-event tests
pblazej Aug 14, 2026
063fd10
test(data-tracks): extract the shared publish/subscribe fixture
pblazej Aug 14, 2026
c68369e
fix(data-tracks): report an unpublish even while the track is detached
pblazej Aug 14, 2026
a5e8265
docs(data-tracks): align public API docs with rust-sdks
pblazej Aug 17, 2026
3a57db6
Merge remote-tracking branch 'origin/main' into blaze/datatracks-inte…
pblazej Aug 17, 2026
da72781
refactor(data-tracks): hand the managers the bytes as received
pblazej Aug 17, 2026
95ab27c
docs(data-tracks): say what handing the frame back does and doesn't p…
pblazej Aug 17, 2026
3d05b70
fix(signal): order the paired notifications without blocking the queue
pblazej Aug 17, 2026
a6c4858
refactor(data-tracks): move the Room lifecycle hooks to their own file
pblazej Aug 17, 2026
eb49f7f
fix(data-tracks): let a cancelled publish surface as a cancellation
pblazej Aug 17, 2026
d90dbf9
fix(data-tracks): stop double-reporting unpublishes on a room move
pblazej Aug 17, 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
1 change: 1 addition & 0 deletions .changes/data-tracks
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
minor type="added" "Data tracks: publish and subscribe to ordered frame streams over a dedicated unreliable channel, with optional schema and frame-encoding metadata"
8 changes: 6 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,11 @@ jobs:
uses: livekit/dev-server-action@61e2b4dcb170dd3591e0c9b0db3c3fe5db93b500
with:
github-token: ${{ github.token }}
config: 'room: { departure_timeout: 1 }'
config: |
room:
departure_timeout: 1
# Data track schema definitions are stored as participant data blobs.
enable_participant_data_blob: true

- uses: maxim-lobanov/setup-xcode@v1
with:
Expand Down Expand Up @@ -243,7 +247,7 @@ jobs:
# Hard budget for the SDK's uncompressed .app delta, in MB — no tolerance
# band. Move it deliberately, in the same commit as the change that needs
# it (the job summary reports the measured value).
SIZE_BASELINE_MB: "16"
SIZE_BASELINE_MB: "16.5"
steps:
- uses: actions/checkout@v7
with:
Expand Down
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ Platform destinations: `macOS`, `macOS,variant=Mac Catalyst`, `iOS Simulator`, `
# Build
xcodebuild build -scheme LiveKit -destination 'platform=macOS'

# Run tests (requires local server: livekit-server --dev, install via brew install livekit)
# Run tests (requires local server, install via brew install livekit). Data track schema tests
# need participant data blobs, which --dev alone leaves off:
# printf 'enable_participant_data_blob: true\n' > lk.yaml && livekit-server --dev --config lk.yaml
xcodebuild test -scheme LiveKit -only-testing LiveKitCoreTests -destination 'platform=macOS'

# Build benchmarks
Expand Down
2 changes: 1 addition & 1 deletion LiveKitClient.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Pod::Spec.new do |spec|
spec.pod_target_xcconfig = {"SWIFT_PACKAGE_NAME" => "livekit_client_sdk_swift"}

spec.dependency("LiveKitWebRTC", "= 144.7559.13")
spec.dependency("LiveKitUniFFI", "= 0.0.6")
spec.dependency("LiveKitUniFFI", "= 0.1.8")

spec.resource_bundles = {"Privacy" => ["Sources/LiveKit/PrivacyInfo.xcprivacy"]}
end
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ let package = Package(
dependencies: [
// LK-Prefixed Dynamic WebRTC XCFramework
.package(url: "https://github.com/livekit/webrtc-xcframework.git", exact: "144.7559.13"),
.package(url: "https://github.com/livekit/livekit-uniffi-xcframework.git", exact: "0.0.6"),
.package(url: "https://github.com/livekit/livekit-uniffi-xcframework.git", exact: "0.1.8"),
// Test-only: conformance oracle for the nanopb facades.
.package(url: "https://github.com/apple/swift-protobuf.git", from: "1.31.0"),
// Only used for DocC generation
Expand Down
2 changes: 1 addition & 1 deletion Package@swift-6.2.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ let package = Package(
dependencies: [
// LK-Prefixed Dynamic WebRTC XCFramework
.package(url: "https://github.com/livekit/webrtc-xcframework.git", exact: "144.7559.13"),
.package(url: "https://github.com/livekit/livekit-uniffi-xcframework.git", exact: "0.0.6"),
.package(url: "https://github.com/livekit/livekit-uniffi-xcframework.git", exact: "0.1.8"),
// Test-only: conformance oracle for the nanopb facades.
.package(url: "https://github.com/apple/swift-protobuf.git", from: "1.31.0"),
// Only used for DocC generation
Expand Down
15 changes: 12 additions & 3 deletions Sources/CLiveKitProto/include/livekit_metrics.pb.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ typedef struct _livekit_MetricsRecordingHeader {
struct _livekit_MetricsRecordingHeader_RoomTagsEntry *room_tags;
char *room_name;
struct _google_protobuf_Timestamp *room_start_time;
char *job_id;
bool *simulated; /* session is a simulation; the collector skips PII redaction for it unless redaction_enabled is set */
bool *redaction_enabled; /* force PII redaction on for this session (only ever enables, never disables) */
} livekit_MetricsRecordingHeader;

typedef struct _livekit_MetricsRecordingHeader_RoomTagsEntry {
Expand Down Expand Up @@ -121,13 +124,13 @@ extern "C" {
#define livekit_TimeSeriesMetric_init_default {NULL, NULL, NULL, 0, NULL, NULL}
#define livekit_MetricSample_init_default {NULL, NULL, NULL}
#define livekit_EventMetric_init_default {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
#define livekit_MetricsRecordingHeader_init_default {NULL, NULL, NULL, 0, NULL, NULL, NULL}
#define livekit_MetricsRecordingHeader_init_default {NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL}
#define livekit_MetricsRecordingHeader_RoomTagsEntry_init_default {NULL, NULL}
#define livekit_MetricsBatch_init_zero {NULL, NULL, 0, NULL, 0, NULL, 0, NULL}
#define livekit_TimeSeriesMetric_init_zero {NULL, NULL, NULL, 0, NULL, NULL}
#define livekit_MetricSample_init_zero {NULL, NULL, NULL}
#define livekit_EventMetric_init_zero {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
#define livekit_MetricsRecordingHeader_init_zero {NULL, NULL, NULL, 0, NULL, NULL, NULL}
#define livekit_MetricsRecordingHeader_init_zero {NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL}
#define livekit_MetricsRecordingHeader_RoomTagsEntry_init_zero {NULL, NULL}

/* Field tags (for use in manual encoding/decoding) */
Expand Down Expand Up @@ -159,6 +162,9 @@ extern "C" {
#define livekit_MetricsRecordingHeader_room_tags_tag 5
#define livekit_MetricsRecordingHeader_room_name_tag 6
#define livekit_MetricsRecordingHeader_room_start_time_tag 7
#define livekit_MetricsRecordingHeader_job_id_tag 8
#define livekit_MetricsRecordingHeader_simulated_tag 9
#define livekit_MetricsRecordingHeader_redaction_enabled_tag 10
#define livekit_MetricsRecordingHeader_RoomTagsEntry_key_tag 1
#define livekit_MetricsRecordingHeader_RoomTagsEntry_value_tag 2

Expand Down Expand Up @@ -214,7 +220,10 @@ X(a, POINTER, SINGULAR, UINT64, duration, 3) \
X(a, POINTER, OPTIONAL, MESSAGE, start_time, 4) \
X(a, POINTER, REPEATED, MESSAGE, room_tags, 5) \
X(a, POINTER, SINGULAR, STRING, room_name, 6) \
X(a, POINTER, OPTIONAL, MESSAGE, room_start_time, 7)
X(a, POINTER, OPTIONAL, MESSAGE, room_start_time, 7) \
X(a, POINTER, SINGULAR, STRING, job_id, 8) \
X(a, POINTER, SINGULAR, BOOL, simulated, 9) \
X(a, POINTER, SINGULAR, BOOL, redaction_enabled, 10)
#define livekit_MetricsRecordingHeader_CALLBACK NULL
#define livekit_MetricsRecordingHeader_DEFAULT NULL
#define livekit_MetricsRecordingHeader_start_time_MSGTYPE google_protobuf_Timestamp
Expand Down
Loading
Loading