feat(live): add go live spaces beta foundations#2812
Conversation
This comment has been minimized.
This comment has been minimized.
NotThatKindOfDrLiz
left a comment
There was a problem hiding this comment.
Thanks for pushing this through. The overall layer split is thoughtful, and there is a lot of solid groundwork here across models, codec, repositories, tests, and UI scaffolding.
I do think we should hold merge on a few correctness/integration blockers before we stack more work on top of this.
- Live API integration is not wired to the approved backend contract yet.
The currentLiveApiServiceis still pointed at the genericAppConfig.backendBaseUrland sends plain JSON headers. The approved live-server contract for this feature is a dedicated control-plane service athttps://live.api.divine.video, and authenticated endpoints are expected to use NIP-98.
That means the current client implementation is not just incomplete stylistically; it is pointed at the wrong service boundary and is missing the auth mechanism the backend contract expects for:
POST /v1/live/roomsPOST /v1/live/rooms/:roomId/sessionsPOST /v1/live/rooms/:roomId/joinPOST /v1/live/rooms/:roomId/sessions/:sessionId/end
I think we should fix this in this PR by:
- adding dedicated live API config instead of deriving from
BACKEND_URL - wiring NIP-98 for authenticated live control-plane requests
- updating the tests around
LiveApiServiceto reflect the signed request contract
- Speaker promotion is missing the backend-authoritative role-grant call.
Right now host promote/demote actions update Nostr session state, but the approved backend design makes speaker publish permission server-authoritative. In other words, publishing a speaker roster change is not sufficient on its own to guarantee a promoted speaker can actually receive a publish-capable join token.
The live-server contract calls for:
PUT /v1/live/rooms/:roomId/participants/:pubkey/role
Without that follow-up, I think we risk a broken path where the UI and Nostr state say “speaker” but the backend still refuses to mint a publish-capable token.
I would like us to wire that host promote/demote flow before merge, or explicitly cut the feature scope so invited/published speakers are not presented as working yet.
- A few side-effecting bloc events need serialization/dropping rather than default concurrent handling.
I do not think every handler in the live blocs needs a transformer, but I do think some of the important ones do.
In particular, repeated taps / reconnect churn on these paths can duplicate network or media actions:
- room join / reconnect
- end session
- chat send
- camera/mic toggle actions
At minimum I think we should add explicit transformers or equivalent guards for the events that perform network/media side effects so we do not end up with overlapping joins, duplicate end-session calls, or out-of-order chat sends.
Everything else I noticed I would treat as follow-up debt, not a reason to block this PR by itself:
- Riverpod is still being used for new live feature wiring instead of moving fully to BLoC-oriented DI
- several live bloc states store
errorMessagestrings LiveRoomBlocis carrying some meaningful private mutable state that probably belongs in state over time- some widget-level business logic should migrate downward later
- raw pubkeys and magic live kind numbers should get cleaned up
- the docs in this PR include absolute local paths that should be scrubbed
But the three items above feel materially different: they affect whether this branch is aligned to the backend we said we are building and whether the core live flows behave correctly under real usage.
If you want, I’m happy to help split the follow-up debt out into separate issues after those blockers are addressed.
|
Foundations match the multi-doc plan: feature flags, LiveKit dep, Nostr live models + codec, repositories, Riverpod wiring, and Task-5 BLoCs (discovery, room, chat, host) with focused tests. CI is red on 4 of 8 test shards plus the umbrella Mobile CI job — that's broad enough to suggest a compile or shared-init failure, not a single bad test. Combined with the existing CHANGES_REQUESTED state, this needs a rebase + shard-level triage before another review pass. |
9b8036e to
5a26798
Compare
|
Codex seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account. You have signed the CLA already but the status is still pending? Let us recheck it. |
Mobile PR PreviewPreview refreshed for Last refresh:
|
Draft review notesThis is a broad and promising Live/Spaces foundation, but it should stay draft. The largest blockers are around session atomicity, routing/deep-link safety, moderation semantics, BLoC state conventions, and l10n/accessibility. Top findings
Security/privacy/accessibility notes
ReadinessBefore moving out of draft, I’d want: atomic live session creation, URL-safe routing/share links, reduced reliance on |
Closes #2813
Summary
Test Plan
Downloading packages...
_fe_analyzer_shared 91.0.0 (98.0.0 available)
_flutterfire_internals 1.3.66 (1.3.68 available)
alchemist 0.12.1 (0.14.0 available)
analyzer 8.4.0 (12.0.0 available)
analyzer_buffer 0.1.11 (0.3.1 available)
analyzer_plugin 0.13.10 (0.14.7 available)
! app_device_integrity 1.1.0 from path overrides/app_device_integrity-1.1.0 (overridden)
app_links 6.4.1 (7.0.0 available)
archive 4.0.7 (4.0.9 available)
async 2.13.0 (2.13.1 available)
audio_session 0.2.2 (0.2.3 available)
bip340 0.3.0 (0.3.1 available)
build 4.0.3 (4.0.5 available)
build_config 1.2.0 (1.3.0 available)
build_runner 2.10.4 (2.13.1 available)
built_value 8.12.1 (8.12.5 available)
cli_launcher 0.3.2+1 (0.3.3+1 available)
code_builder 4.11.0 (4.11.1 available)
! connectivity_plus 7.0.0 (overridden) (7.1.0 available)
connectivity_plus_platform_interface 2.0.1 (2.1.0 available)
cookie_jar 4.0.8 (4.0.9 available)
cross_file 0.3.5+1 (0.3.5+2 available)
! cryptography_flutter 2.3.2 from path overrides/cryptography_flutter-2.3.2 (overridden)
cupertino_icons 1.0.8 (1.0.9 available)
custom_lint_core 0.8.1 (0.8.2 available)
custom_lint_visitor 1.0.0+8.4.0 (1.0.0+9.0.0 available)
dart_style 3.1.3 (3.1.8 available)
dbus 0.7.11 (0.7.12 available)
dev_build 1.1.3+1 (1.1.5+2 available)
! device_info_plus 10.1.2 (overridden) (12.4.0 available)
dio 5.9.0 (5.9.2 available)
dio_cookie_manager 3.3.0 (3.4.0 available)
dio_web_adapter 2.1.1 (2.1.2 available)
drift 2.30.0 (2.32.1 available)
drift_dev 2.30.0 (2.32.1 available)
drift_flutter 0.2.8 (0.3.0 available)
ffi 2.1.5 (2.2.0 available)
file_picker 10.3.8 (11.0.1 available)
file_selector_android 0.5.2+4 (0.5.2+5 available)
firebase_analytics 12.1.2 (12.2.0 available)
firebase_analytics_platform_interface 5.0.6 (5.1.0 available)
firebase_analytics_web 0.6.1+2 (0.6.1+4 available)
firebase_core 4.4.0 (4.6.0 available)
firebase_core_platform_interface 6.0.2 (6.0.3 available)
firebase_core_web 3.4.0 (3.5.1 available)
firebase_crashlytics 5.0.7 (5.1.0 available)
firebase_crashlytics_platform_interface 3.8.17 (3.8.19 available)
firebase_performance 0.11.1+4 (0.11.2 available)
firebase_performance_platform_interface 0.1.6+4 (0.1.6+6 available)
firebase_performance_web 0.1.8+2 (0.1.8+4 available)
flutter_local_notifications 19.5.0 (21.0.0 available)
flutter_local_notifications_linux 6.0.0 (8.0.0 available)
flutter_local_notifications_platform_interface 9.1.0 (11.0.0 available)
flutter_local_notifications_windows 1.0.3 (3.0.0 available)
flutter_plugin_android_lifecycle 2.0.33 (2.0.34 available)
flutter_riverpod 3.0.3 (3.3.1 available)
flutter_secure_storage 9.2.4 (10.0.0 available)
flutter_secure_storage_linux 1.2.3 (3.0.0 available)
flutter_secure_storage_macos 3.1.3 (4.0.0 available)
flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available)
flutter_secure_storage_web 1.2.1 (2.1.0 available)
flutter_secure_storage_windows 3.1.2 (4.1.0 available)
flutter_svg 2.2.3 (2.2.4 available)
flutter_web_auth_2 4.1.0 (5.0.1 available)
flutter_web_auth_2_platform_interface 4.1.0 (5.0.0 available)
flutter_webrtc 1.2.0 (1.4.1 available)
freezed 3.2.3 (3.2.5 available)
go_router 16.3.0 (17.2.0 available)
golden_toolkit 0.15.0 (discontinued)
google_fonts 6.3.3 (8.0.2 available)
hive_ce 2.16.0 (2.19.3 available)
hive_ce_flutter 2.3.3 (2.3.4 available)
hive_ce_generator 1.10.0 (1.11.1 available)
image 4.7.2 (4.8.0 available)
image_picker_android 0.8.13+10 (0.8.13+16 available)
image_picker_ios 0.8.13+3 (0.8.13+6 available)
intl 0.19.0 (0.20.2 available)
isolate_channel 0.2.2+1 (0.6.1 available)
js 0.6.7 (0.7.2 available)
json_annotation 4.9.0 (4.11.0 available)
json_serializable 6.11.2 (6.13.1 available)
lints 6.0.0 (6.1.0 available)
livekit_client 2.5.3 (2.7.0 available)
melos 7.3.0 (7.5.1 available)
! meta 1.17.0 (overridden) (1.18.2 available)
mockito 5.6.1 (5.6.4 available)
mustache_template 2.0.2 (2.0.4 available)
package_info_plus 9.0.0 (9.0.1 available)
path_provider_android 2.2.22 (2.2.23 available)
path_provider_foundation 2.5.1 (2.6.0 available)
patrol 4.2.0 (4.5.0 available)
patrol_finders 3.1.0 (3.2.0 available)
patrol_log 0.7.1 (0.8.0 available)
petitparser 7.0.1 (7.0.2 available)
pointycastle 3.9.1 (4.0.0 available)
posix 6.0.3 (6.5.0 available)
pro_image_editor 12.0.13 (12.1.0 available)
process_run 1.2.4 (1.3.2 available)
protobuf 4.2.0 (6.0.0 available)
riverpod 3.0.3 (3.2.1 available)
riverpod_analyzer_utils 1.0.0-dev.7 (1.0.0-dev.9 available)
riverpod_annotation 3.0.3 (4.0.2 available)
riverpod_generator 3.0.3 (4.0.3 available)
! rxdart 0.28.0 (overridden)
share_plus 12.0.1 (12.0.2 available)
shared_preferences 2.5.4 (2.5.5 available)
shared_preferences_android 2.4.18 (2.4.23 available)
shared_preferences_platform_interface 2.4.1 (2.4.2 available)
shelf_web_socket 2.0.1 (3.0.0 available)
skeletonizer 2.1.2 (2.1.3 available)
source_gen 4.1.1 (4.2.2 available)
source_helper 1.3.8 (1.3.11 available)
source_span 1.10.1 (1.10.2 available)
sqflite_android 2.4.2+2 (2.4.2+3 available)
sqflite_common_ffi 2.3.6 (2.4.0+2 available)
sqflite_common_ffi_web 0.4.5+4 (1.1.1 available)
sqlite3 2.9.4 (3.3.0 available)
sqlite3_flutter_libs 0.5.41 (0.6.0+eol available)
sqlparser 0.42.1 (0.44.3 available)
test 1.30.0 (1.31.0 available)
test_api 0.7.10 (0.7.11 available)
test_core 0.6.16 (0.6.17 available)
timezone 0.10.1 (0.11.0 available)
unique_names_generator 3.0.0 (3.1.2 available)
url_launcher_android 6.3.28 (6.3.29 available)
url_launcher_ios 6.3.6 (6.4.1 available)
url_launcher_web 2.4.1 (2.4.2 available)
uuid 4.5.2 (4.5.3 available)
vector_graphics 1.1.19 (1.1.21 available)
vector_graphics_compiler 1.1.19 (1.2.0 available)
vector_math 2.2.0 (2.3.0 available)
video_player 2.10.1 (2.11.1 available)
video_player_android 2.9.1 (2.9.5 available)
video_player_avfoundation 2.8.8 (2.9.4 available)
wakelock_plus 1.4.0 (1.5.1 available)
wakelock_plus_platform_interface 1.3.0 (1.4.0 available)
watcher 1.2.0 (1.2.1 available)
webview_flutter_android 4.10.13 (4.10.15 available)
webview_flutter_platform_interface 2.14.0 (2.15.1 available)
webview_flutter_wkwebview 3.24.1 (3.24.2 available)
win32 5.15.0 (6.0.0 available)
win32_registry 1.1.5 (3.0.2 available)
yaml_edit 2.2.3 (2.2.4 available)
Got dependencies!
1 package is discontinued.
139 packages have newer versions incompatible with dependency constraints.
Try
flutter pub outdatedfor more information.Analyzing 8 items...
No issues found! (ran in 3.9s)
Downloading packages...
_fe_analyzer_shared 91.0.0 (98.0.0 available)
_flutterfire_internals 1.3.66 (1.3.68 available)
alchemist 0.12.1 (0.14.0 available)
analyzer 8.4.0 (12.0.0 available)
analyzer_buffer 0.1.11 (0.3.1 available)
analyzer_plugin 0.13.10 (0.14.7 available)
! app_device_integrity 1.1.0 from path overrides/app_device_integrity-1.1.0 (overridden)
app_links 6.4.1 (7.0.0 available)
archive 4.0.7 (4.0.9 available)
async 2.13.0 (2.13.1 available)
audio_session 0.2.2 (0.2.3 available)
bip340 0.3.0 (0.3.1 available)
build 4.0.3 (4.0.5 available)
build_config 1.2.0 (1.3.0 available)
build_runner 2.10.4 (2.13.1 available)
built_value 8.12.1 (8.12.5 available)
cli_launcher 0.3.2+1 (0.3.3+1 available)
code_builder 4.11.0 (4.11.1 available)
! connectivity_plus 7.0.0 (overridden) (7.1.0 available)
connectivity_plus_platform_interface 2.0.1 (2.1.0 available)
cookie_jar 4.0.8 (4.0.9 available)
cross_file 0.3.5+1 (0.3.5+2 available)
! cryptography_flutter 2.3.2 from path overrides/cryptography_flutter-2.3.2 (overridden)
cupertino_icons 1.0.8 (1.0.9 available)
custom_lint_core 0.8.1 (0.8.2 available)
custom_lint_visitor 1.0.0+8.4.0 (1.0.0+9.0.0 available)
dart_style 3.1.3 (3.1.8 available)
dbus 0.7.11 (0.7.12 available)
dev_build 1.1.3+1 (1.1.5+2 available)
! device_info_plus 10.1.2 (overridden) (12.4.0 available)
dio 5.9.0 (5.9.2 available)
dio_cookie_manager 3.3.0 (3.4.0 available)
dio_web_adapter 2.1.1 (2.1.2 available)
drift 2.30.0 (2.32.1 available)
drift_dev 2.30.0 (2.32.1 available)
drift_flutter 0.2.8 (0.3.0 available)
ffi 2.1.5 (2.2.0 available)
file_picker 10.3.8 (11.0.1 available)
file_selector_android 0.5.2+4 (0.5.2+5 available)
firebase_analytics 12.1.2 (12.2.0 available)
firebase_analytics_platform_interface 5.0.6 (5.1.0 available)
firebase_analytics_web 0.6.1+2 (0.6.1+4 available)
firebase_core 4.4.0 (4.6.0 available)
firebase_core_platform_interface 6.0.2 (6.0.3 available)
firebase_core_web 3.4.0 (3.5.1 available)
firebase_crashlytics 5.0.7 (5.1.0 available)
firebase_crashlytics_platform_interface 3.8.17 (3.8.19 available)
firebase_performance 0.11.1+4 (0.11.2 available)
firebase_performance_platform_interface 0.1.6+4 (0.1.6+6 available)
firebase_performance_web 0.1.8+2 (0.1.8+4 available)
flutter_local_notifications 19.5.0 (21.0.0 available)
flutter_local_notifications_linux 6.0.0 (8.0.0 available)
flutter_local_notifications_platform_interface 9.1.0 (11.0.0 available)
flutter_local_notifications_windows 1.0.3 (3.0.0 available)
flutter_plugin_android_lifecycle 2.0.33 (2.0.34 available)
flutter_riverpod 3.0.3 (3.3.1 available)
flutter_secure_storage 9.2.4 (10.0.0 available)
flutter_secure_storage_linux 1.2.3 (3.0.0 available)
flutter_secure_storage_macos 3.1.3 (4.0.0 available)
flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available)
flutter_secure_storage_web 1.2.1 (2.1.0 available)
flutter_secure_storage_windows 3.1.2 (4.1.0 available)
flutter_svg 2.2.3 (2.2.4 available)
flutter_web_auth_2 4.1.0 (5.0.1 available)
flutter_web_auth_2_platform_interface 4.1.0 (5.0.0 available)
flutter_webrtc 1.2.0 (1.4.1 available)
freezed 3.2.3 (3.2.5 available)
go_router 16.3.0 (17.2.0 available)
golden_toolkit 0.15.0 (discontinued)
google_fonts 6.3.3 (8.0.2 available)
hive_ce 2.16.0 (2.19.3 available)
hive_ce_flutter 2.3.3 (2.3.4 available)
hive_ce_generator 1.10.0 (1.11.1 available)
image 4.7.2 (4.8.0 available)
image_picker_android 0.8.13+10 (0.8.13+16 available)
image_picker_ios 0.8.13+3 (0.8.13+6 available)
intl 0.19.0 (0.20.2 available)
isolate_channel 0.2.2+1 (0.6.1 available)
js 0.6.7 (0.7.2 available)
json_annotation 4.9.0 (4.11.0 available)
json_serializable 6.11.2 (6.13.1 available)
lints 6.0.0 (6.1.0 available)
livekit_client 2.5.3 (2.7.0 available)
melos 7.3.0 (7.5.1 available)
! meta 1.17.0 (overridden) (1.18.2 available)
mockito 5.6.1 (5.6.4 available)
mustache_template 2.0.2 (2.0.4 available)
package_info_plus 9.0.0 (9.0.1 available)
path_provider_android 2.2.22 (2.2.23 available)
path_provider_foundation 2.5.1 (2.6.0 available)
patrol 4.2.0 (4.5.0 available)
patrol_finders 3.1.0 (3.2.0 available)
patrol_log 0.7.1 (0.8.0 available)
petitparser 7.0.1 (7.0.2 available)
pointycastle 3.9.1 (4.0.0 available)
posix 6.0.3 (6.5.0 available)
pro_image_editor 12.0.13 (12.1.0 available)
process_run 1.2.4 (1.3.2 available)
protobuf 4.2.0 (6.0.0 available)
riverpod 3.0.3 (3.2.1 available)
riverpod_analyzer_utils 1.0.0-dev.7 (1.0.0-dev.9 available)
riverpod_annotation 3.0.3 (4.0.2 available)
riverpod_generator 3.0.3 (4.0.3 available)
! rxdart 0.28.0 (overridden)
share_plus 12.0.1 (12.0.2 available)
shared_preferences 2.5.4 (2.5.5 available)
shared_preferences_android 2.4.18 (2.4.23 available)
shared_preferences_platform_interface 2.4.1 (2.4.2 available)
shelf_web_socket 2.0.1 (3.0.0 available)
skeletonizer 2.1.2 (2.1.3 available)
source_gen 4.1.1 (4.2.2 available)
source_helper 1.3.8 (1.3.11 available)
source_span 1.10.1 (1.10.2 available)
sqflite_android 2.4.2+2 (2.4.2+3 available)
sqflite_common_ffi 2.3.6 (2.4.0+2 available)
sqflite_common_ffi_web 0.4.5+4 (1.1.1 available)
sqlite3 2.9.4 (3.3.0 available)
sqlite3_flutter_libs 0.5.41 (0.6.0+eol available)
sqlparser 0.42.1 (0.44.3 available)
test 1.30.0 (1.31.0 available)
test_api 0.7.10 (0.7.11 available)
test_core 0.6.16 (0.6.17 available)
timezone 0.10.1 (0.11.0 available)
unique_names_generator 3.0.0 (3.1.2 available)
url_launcher_android 6.3.28 (6.3.29 available)
url_launcher_ios 6.3.6 (6.4.1 available)
url_launcher_web 2.4.1 (2.4.2 available)
uuid 4.5.2 (4.5.3 available)
vector_graphics 1.1.19 (1.1.21 available)
vector_graphics_compiler 1.1.19 (1.2.0 available)
vector_math 2.2.0 (2.3.0 available)
video_player 2.10.1 (2.11.1 available)
video_player_android 2.9.1 (2.9.5 available)
video_player_avfoundation 2.8.8 (2.9.4 available)
wakelock_plus 1.4.0 (1.5.1 available)
wakelock_plus_platform_interface 1.3.0 (1.4.0 available)
watcher 1.2.0 (1.2.1 available)
webview_flutter_android 4.10.13 (4.10.15 available)
webview_flutter_platform_interface 2.14.0 (2.15.1 available)
webview_flutter_wkwebview 3.24.1 (3.24.2 available)
win32 5.15.0 (6.0.0 available)
win32_registry 1.1.5 (3.0.2 available)
yaml_edit 2.2.3 (2.2.4 available)
Got dependencies!
1 package is discontinued.
139 packages have newer versions incompatible with dependency constraints.
Try
flutter pub outdatedfor more information.00:00 +0: loading /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart
00:00 +0: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then success with active and upcoming rooms grouped by session status
00:00 +1: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then failure when the repository throws
00:00 +2: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc start subscribes to chat updates and exposes ready state
00:00 +3: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc send request trims content and publishes the message
00:00 +4: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc (setUpAll)
00:00 +4: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request watches room state, fetches a token, and exposes host speaker state
00:00 +5: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request emits failure when token fetch fails
00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc (tearDownAll)
00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (setUpAll)
00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit title updates drive form validity
00:00 +7: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit validates the title before creating a room
00:00 +8: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit creates a room draft, publishes the room and session, and marks success
00:00 +9: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (tearDownAll)
00:00 +9: All tests passed!
🔀 Checking for merge conflicts with main...
✅ No merge conflicts with main
📁 Changed files:
mobile/lib/blocs/go_live/go_live_cubit.dart
mobile/lib/blocs/go_live/go_live_state.dart
mobile/lib/blocs/live_chat/live_chat_bloc.dart
mobile/lib/blocs/live_chat/live_chat_event.dart
mobile/lib/blocs/live_chat/live_chat_state.dart
mobile/lib/blocs/live_discovery/live_discovery_bloc.dart
mobile/lib/blocs/live_discovery/live_discovery_event.dart
mobile/lib/blocs/live_discovery/live_discovery_state.dart
mobile/lib/blocs/live_room/live_room_bloc.dart
mobile/lib/blocs/live_room/live_room_event.dart
... and 32 more
🧬 Verifying generated files...
✅ Generated files OK
🧪 Running tests for changed files:
test/blocs/go_live/go_live_cubit_test.dart
test/blocs/live_chat/live_chat_bloc_test.dart
test/blocs/live_discovery/live_discovery_bloc_test.dart
test/blocs/live_room/live_room_bloc_test.dart
test/core/feature_flag_test.dart
... and 11 more test files
🏃 Executing tests...
Resolving dependencies...
Downloading packages...
_fe_analyzer_shared 91.0.0 (98.0.0 available)
_flutterfire_internals 1.3.66 (1.3.68 available)
alchemist 0.12.1 (0.14.0 available)
analyzer 8.4.0 (12.0.0 available)
analyzer_buffer 0.1.11 (0.3.1 available)
analyzer_plugin 0.13.10 (0.14.7 available)
! app_device_integrity 1.1.0 from path overrides/app_device_integrity-1.1.0 (overridden)
app_links 6.4.1 (7.0.0 available)
archive 4.0.7 (4.0.9 available)
async 2.13.0 (2.13.1 available)
audio_session 0.2.2 (0.2.3 available)
bip340 0.3.0 (0.3.1 available)
build 4.0.3 (4.0.5 available)
build_config 1.2.0 (1.3.0 available)
build_runner 2.10.4 (2.13.1 available)
built_value 8.12.1 (8.12.5 available)
cli_launcher 0.3.2+1 (0.3.3+1 available)
code_builder 4.11.0 (4.11.1 available)
! connectivity_plus 7.0.0 (overridden) (7.1.0 available)
connectivity_plus_platform_interface 2.0.1 (2.1.0 available)
cookie_jar 4.0.8 (4.0.9 available)
cross_file 0.3.5+1 (0.3.5+2 available)
! cryptography_flutter 2.3.2 from path overrides/cryptography_flutter-2.3.2 (overridden)
cupertino_icons 1.0.8 (1.0.9 available)
custom_lint_core 0.8.1 (0.8.2 available)
custom_lint_visitor 1.0.0+8.4.0 (1.0.0+9.0.0 available)
dart_style 3.1.3 (3.1.8 available)
dbus 0.7.11 (0.7.12 available)
dev_build 1.1.3+1 (1.1.5+2 available)
! device_info_plus 10.1.2 (overridden) (12.4.0 available)
dio 5.9.0 (5.9.2 available)
dio_cookie_manager 3.3.0 (3.4.0 available)
dio_web_adapter 2.1.1 (2.1.2 available)
drift 2.30.0 (2.32.1 available)
drift_dev 2.30.0 (2.32.1 available)
drift_flutter 0.2.8 (0.3.0 available)
ffi 2.1.5 (2.2.0 available)
file_picker 10.3.8 (11.0.1 available)
file_selector_android 0.5.2+4 (0.5.2+5 available)
firebase_analytics 12.1.2 (12.2.0 available)
firebase_analytics_platform_interface 5.0.6 (5.1.0 available)
firebase_analytics_web 0.6.1+2 (0.6.1+4 available)
firebase_core 4.4.0 (4.6.0 available)
firebase_core_platform_interface 6.0.2 (6.0.3 available)
firebase_core_web 3.4.0 (3.5.1 available)
firebase_crashlytics 5.0.7 (5.1.0 available)
firebase_crashlytics_platform_interface 3.8.17 (3.8.19 available)
firebase_performance 0.11.1+4 (0.11.2 available)
firebase_performance_platform_interface 0.1.6+4 (0.1.6+6 available)
firebase_performance_web 0.1.8+2 (0.1.8+4 available)
flutter_local_notifications 19.5.0 (21.0.0 available)
flutter_local_notifications_linux 6.0.0 (8.0.0 available)
flutter_local_notifications_platform_interface 9.1.0 (11.0.0 available)
flutter_local_notifications_windows 1.0.3 (3.0.0 available)
flutter_plugin_android_lifecycle 2.0.33 (2.0.34 available)
flutter_riverpod 3.0.3 (3.3.1 available)
flutter_secure_storage 9.2.4 (10.0.0 available)
flutter_secure_storage_linux 1.2.3 (3.0.0 available)
flutter_secure_storage_macos 3.1.3 (4.0.0 available)
flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available)
flutter_secure_storage_web 1.2.1 (2.1.0 available)
flutter_secure_storage_windows 3.1.2 (4.1.0 available)
flutter_svg 2.2.3 (2.2.4 available)
flutter_web_auth_2 4.1.0 (5.0.1 available)
flutter_web_auth_2_platform_interface 4.1.0 (5.0.0 available)
flutter_webrtc 1.2.0 (1.4.1 available)
freezed 3.2.3 (3.2.5 available)
go_router 16.3.0 (17.2.0 available)
golden_toolkit 0.15.0 (discontinued)
google_fonts 6.3.3 (8.0.2 available)
hive_ce 2.16.0 (2.19.3 available)
hive_ce_flutter 2.3.3 (2.3.4 available)
hive_ce_generator 1.10.0 (1.11.1 available)
image 4.7.2 (4.8.0 available)
image_picker_android 0.8.13+10 (0.8.13+16 available)
image_picker_ios 0.8.13+3 (0.8.13+6 available)
intl 0.19.0 (0.20.2 available)
isolate_channel 0.2.2+1 (0.6.1 available)
js 0.6.7 (0.7.2 available)
json_annotation 4.9.0 (4.11.0 available)
json_serializable 6.11.2 (6.13.1 available)
lints 6.0.0 (6.1.0 available)
livekit_client 2.5.3 (2.7.0 available)
melos 7.3.0 (7.5.1 available)
! meta 1.17.0 (overridden) (1.18.2 available)
mockito 5.6.1 (5.6.4 available)
mustache_template 2.0.2 (2.0.4 available)
package_info_plus 9.0.0 (9.0.1 available)
path_provider_android 2.2.22 (2.2.23 available)
path_provider_foundation 2.5.1 (2.6.0 available)
patrol 4.2.0 (4.5.0 available)
patrol_finders 3.1.0 (3.2.0 available)
patrol_log 0.7.1 (0.8.0 available)
petitparser 7.0.1 (7.0.2 available)
pointycastle 3.9.1 (4.0.0 available)
posix 6.0.3 (6.5.0 available)
pro_image_editor 12.0.13 (12.1.0 available)
process_run 1.2.4 (1.3.2 available)
protobuf 4.2.0 (6.0.0 available)
riverpod 3.0.3 (3.2.1 available)
riverpod_analyzer_utils 1.0.0-dev.7 (1.0.0-dev.9 available)
riverpod_annotation 3.0.3 (4.0.2 available)
riverpod_generator 3.0.3 (4.0.3 available)
! rxdart 0.28.0 (overridden)
share_plus 12.0.1 (12.0.2 available)
shared_preferences 2.5.4 (2.5.5 available)
shared_preferences_android 2.4.18 (2.4.23 available)
shared_preferences_platform_interface 2.4.1 (2.4.2 available)
shelf_web_socket 2.0.1 (3.0.0 available)
skeletonizer 2.1.2 (2.1.3 available)
source_gen 4.1.1 (4.2.2 available)
source_helper 1.3.8 (1.3.11 available)
source_span 1.10.1 (1.10.2 available)
sqflite_android 2.4.2+2 (2.4.2+3 available)
sqflite_common_ffi 2.3.6 (2.4.0+2 available)
sqflite_common_ffi_web 0.4.5+4 (1.1.1 available)
sqlite3 2.9.4 (3.3.0 available)
sqlite3_flutter_libs 0.5.41 (0.6.0+eol available)
sqlparser 0.42.1 (0.44.3 available)
test 1.30.0 (1.31.0 available)
test_api 0.7.10 (0.7.11 available)
test_core 0.6.16 (0.6.17 available)
timezone 0.10.1 (0.11.0 available)
unique_names_generator 3.0.0 (3.1.2 available)
url_launcher_android 6.3.28 (6.3.29 available)
url_launcher_ios 6.3.6 (6.4.1 available)
url_launcher_web 2.4.1 (2.4.2 available)
uuid 4.5.2 (4.5.3 available)
vector_graphics 1.1.19 (1.1.21 available)
vector_graphics_compiler 1.1.19 (1.2.0 available)
vector_math 2.2.0 (2.3.0 available)
video_player 2.10.1 (2.11.1 available)
video_player_android 2.9.1 (2.9.5 available)
video_player_avfoundation 2.8.8 (2.9.4 available)
wakelock_plus 1.4.0 (1.5.1 available)
wakelock_plus_platform_interface 1.3.0 (1.4.0 available)
watcher 1.2.0 (1.2.1 available)
webview_flutter_android 4.10.13 (4.10.15 available)
webview_flutter_platform_interface 2.14.0 (2.15.1 available)
webview_flutter_wkwebview 3.24.1 (3.24.2 available)
win32 5.15.0 (6.0.0 available)
win32_registry 1.1.5 (3.0.2 available)
yaml_edit 2.2.3 (2.2.4 available)
Got dependencies!
1 package is discontinued.
139 packages have newer versions incompatible with dependency constraints.
Try
flutter pub outdatedfor more information.00:00 +0: loading /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart
00:00 +0: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc start subscribes to chat updates and exposes ready state
00:00 +1: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc send request trims content and publishes the message
00:00 +2: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then success with active and upcoming rooms grouped by session status
00:00 +3: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then failure when the repository throws
00:00 +4: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_chat_message_test.dart: LiveChatMessage extracts the session id from a session address
00:00 +5: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_presence_test.dart: LivePresence maps coarse Nostr roles to stage and audience permissions
00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_presence_test.dart: LivePresence keeps audience hand-raise state separate from publish ability
00:00 +7: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (setUpAll)
00:00 +7: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit title updates drive form validity
00:00 +8: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit validates the title before creating a room
00:00 +9: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit creates a room draft, publishes the room and session, and marks success
00:00 +10: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (tearDownAll)
00:00 +10: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc (setUpAll)
00:00 +10: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_room_test.dart: LiveRoom builds an addressable room identifier from host pubkey and room id
00:00 +11: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request watches room state, fetches a token, and exposes host speaker state
00:00 +12: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request watches room state, fetches a token, and exposes host speaker state
00:00 +13: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request emits failure when token fetch fails
00:00 +14: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/core/feature_flag_test.dart: FeatureFlag enum should have display names
00:00 +15: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +16: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +17: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +18: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +19: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +20: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +21: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/core/feature_flag_test.dart: FeatureFlag enum integratedApps flag should have correct metadata
00:00 +22: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession parses session status values case-insensitively
00:00 +23: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/core/feature_flag_test.dart: FeatureFlag enum should provide meaningful descriptions
00:01 +24: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository (setUpAll)
00:01 +24: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository watchChatMessages emits queried messages and live chat updates for a session
00:01 +25: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository publishMessage signs with the client signer and publishes the chat event
00:01 +26: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository (tearDownAll)
00:01 +26: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/providers/live_providers_test.dart: live providers (setUpAll)
00:01 +26: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/providers/live_providers_test.dart: live providers exposes live services and repositories from the dedicated provider file
00:01 +27: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/providers/live_providers_test.dart: live providers (tearDownAll)
00:01 +27: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository (setUpAll)
00:01 +27: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository watchPublicRooms emits the queried rooms and live subscription updates
00:01 +28: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository watchSessions filters by room address and emits live updates
00:01 +29: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository publishRoom signs with the client signer and sends the event
00:01 +30: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository publishSession and publishPresence route through the codec and Nostr client
00:01 +31: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository (tearDownAll)
00:01 +31: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live room event from kind 30312
00:01 +32: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses NIP-53 room tags when title is published as room
00:01 +33: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec builds a signed room event from a live room model
00:01 +34: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live session event from kind 30313
00:02 +35: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live presence event from kind 10312
00:02 +36: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live chat message from kind 1311
00:02 +37: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should read from environment variables
00:02 +38: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should provide defaults when env vars not set
00:02 +39: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should have debug tools enabled by default in debug builds
00:02 +40: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should provide all flags with defaults
00:02 +41: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should return consistent values
00:02 +42: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should provide environment variable key mapping
00:02 +43: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration integratedApps should default to false
00:02 +44: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration integratedApps should map to FF_INTEGRATED_APPS env var
00:02 +45: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_api_service_test.dart: (setUpAll)
00:02 +45: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_api_service_test.dart: LiveApiService createRoomDraft posts room metadata and parses the response
00:02 +46: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +47: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +48: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +49: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +50: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +51: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService publishLocalTracks delegates camera and microphone toggles
00:02 +52: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService switchCamera delegates to the room client
00:02 +53: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService disconnect resets the state to disconnected
00:02 +54: All tests passed!
✅ All tests passed!
branch 'codex/live-spaces-v1' set up to track 'origin/codex/live-spaces-v1'. (pre-push hook reran the changed live/model/repository/service/feature-flag tests and passed)