From 52fa0d20efaad5b0c8532a2f661c9bf425e78b62 Mon Sep 17 00:00:00 2001 From: npub12wpjffj7q5qjsky5jvk4ldwlxmse5xll3d8gytk4wqd0c5y7jvwspg37n6 <538324a65e0501285894932d5fb5df36e19a1bff8b4e822ed5701afc509e931d@buzz.block.builderlab.xyz> Date: Sat, 1 Aug 2026 16:21:37 -0700 Subject: [PATCH] fix(mobile/ios): configure push gateway URL Co-authored-by: Tom Brow Signed-off-by: Tom Brow --- mobile/.env.json.example | 1 + mobile/ios/Runner/AppDelegate.swift | 5 ++- .../push/debug_push_lease_bootstrap.dart | 2 +- mobile/lib/shared/push/push_bridge.dart | 7 +++- mobile/lib/shared/relay/relay_provider.dart | 7 +++- mobile/test/shared/push/push_bridge_test.dart | 39 ++++++++++++++++--- 6 files changed, 50 insertions(+), 11 deletions(-) diff --git a/mobile/.env.json.example b/mobile/.env.json.example index 7960d5bf12..248ccda1b6 100644 --- a/mobile/.env.json.example +++ b/mobile/.env.json.example @@ -1,4 +1,5 @@ { "BUZZ_RELAY_URL": "http://localhost:3000", + "BUZZ_PUSH_GATEWAY_URL": "http://localhost:8080", "BUZZ_DEV_PUBKEY": "" } diff --git a/mobile/ios/Runner/AppDelegate.swift b/mobile/ios/Runner/AppDelegate.swift index 32727d5f84..53e001d18c 100644 --- a/mobile/ios/Runner/AppDelegate.swift +++ b/mobile/ios/Runner/AppDelegate.swift @@ -252,12 +252,13 @@ import UserNotifications guard let arguments = call.arguments as? [String: Any], let relayText = arguments["relayUrl"] as? String, let relayURL = URL(string: relayText), - let gatewayURL = URL(string: "http://localhost:8080") + let gatewayText = arguments["gatewayUrl"] as? String, + let gatewayURL = URL(string: gatewayText) else { result( FlutterError( code: "invalid_arguments", - message: "Development push enrollment requires relayUrl.", + message: "Development push enrollment requires relayUrl and gatewayUrl.", details: nil ) ) diff --git a/mobile/lib/shared/push/debug_push_lease_bootstrap.dart b/mobile/lib/shared/push/debug_push_lease_bootstrap.dart index 8b7ceeb3d6..deff8a9bd7 100644 --- a/mobile/lib/shared/push/debug_push_lease_bootstrap.dart +++ b/mobile/lib/shared/push/debug_push_lease_bootstrap.dart @@ -57,7 +57,7 @@ class DebugPushLeaseBootstrap extends HookConsumerWidget { SignedEventRelay relay, ) async { final descriptor = await fetchBuzzPushLeaseDescriptor(config.baseUrl); - final grant = await enrollBuzzDevPush(config.wsUrl); + final grant = await enrollBuzzDevPush(config.wsUrl, Env.pushGatewayUrl); if (grant.relayOrigin != descriptor.origin) { throw StateError( 'Endpoint grant origin ${grant.relayOrigin} does not match descriptor origin ${descriptor.origin}', diff --git a/mobile/lib/shared/push/push_bridge.dart b/mobile/lib/shared/push/push_bridge.dart index 5c49f00dc3..2cdd5015b8 100644 --- a/mobile/lib/shared/push/push_bridge.dart +++ b/mobile/lib/shared/push/push_bridge.dart @@ -83,7 +83,10 @@ Future> readBuzzPushEndpointGrants() async { } } -Future enrollBuzzDevPush(String relayUrl) async { +Future enrollBuzzDevPush( + String relayUrl, + String gatewayUrl, +) async { if (!kDebugMode) { throw UnsupportedError( 'Development push enrollment is unavailable outside debug builds.', @@ -91,7 +94,7 @@ Future enrollBuzzDevPush(String relayUrl) async { } final raw = await _channel.invokeMapMethod( 'devEnrollPush', - {'relayUrl': relayUrl}, + {'relayUrl': relayUrl, 'gatewayUrl': gatewayUrl}, ); if (raw == null) { throw StateError('Native development push enrollment returned no grant.'); diff --git a/mobile/lib/shared/relay/relay_provider.dart b/mobile/lib/shared/relay/relay_provider.dart index 061dd6cb38..4ad9e9fa35 100644 --- a/mobile/lib/shared/relay/relay_provider.dart +++ b/mobile/lib/shared/relay/relay_provider.dart @@ -62,7 +62,8 @@ class RelayConfig { /// Compile-time environment config via --dart-define. /// /// Run with: -/// flutter run --dart-define=BUZZ_RELAY_URL=http://localhost:3000 +/// flutter run --dart-define=BUZZ_RELAY_URL=http://localhost:3000 \ +/// --dart-define=BUZZ_PUSH_GATEWAY_URL=http://localhost:8080 /// /// Or create a `.env.json` and use --dart-define-from-file=.env.json class Env { @@ -70,6 +71,10 @@ class Env { 'BUZZ_RELAY_URL', defaultValue: 'http://localhost:3000', ); + static const pushGatewayUrl = String.fromEnvironment( + 'BUZZ_PUSH_GATEWAY_URL', + defaultValue: 'http://localhost:8080', + ); } class RelayConfigNotifier extends Notifier { diff --git a/mobile/test/shared/push/push_bridge_test.dart b/mobile/test/shared/push/push_bridge_test.dart index de56f61d03..eeb2b9ac0f 100644 --- a/mobile/test/shared/push/push_bridge_test.dart +++ b/mobile/test/shared/push/push_bridge_test.dart @@ -1,4 +1,5 @@ import 'package:buzz/shared/push/push_bridge.dart'; +import 'package:buzz/shared/relay/relay_provider.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -63,16 +64,17 @@ void main() { }); test( - 'debug enrollment invokes native driver then refreshes grants', + 'debug enrollment carries the configured relay and gateway URLs', () async { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; final methods = []; + final enrollmentArguments = []; final messenger = TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger; messenger.setMockMethodCallHandler(_channel, (call) async { methods.add(call.method); if (call.method == 'devEnrollPush') { - expect(call.arguments, {'relayUrl': 'wss://relay.example/'}); + enrollmentArguments.add(call.arguments); return _grantMap('new-grant'); } if (call.method == 'endpointGrants') { @@ -81,14 +83,41 @@ void main() { fail('Unexpected method ${call.method}'); }); - final grant = await enrollBuzzDevPush('wss://relay.example/'); + final firstGrant = await enrollBuzzDevPush( + 'wss://relay.example/', + 'https://gateway-one.example/', + ); + final secondGrant = await enrollBuzzDevPush( + 'wss://relay.example/', + 'https://gateway-two.example/', + ); - expect(grant.endpointGrant, 'new-grant'); - expect(methods, ['devEnrollPush', 'endpointGrants']); + expect(firstGrant.endpointGrant, 'new-grant'); + expect(secondGrant.endpointGrant, 'new-grant'); + expect(enrollmentArguments, [ + { + 'relayUrl': 'wss://relay.example/', + 'gatewayUrl': 'https://gateway-one.example/', + }, + { + 'relayUrl': 'wss://relay.example/', + 'gatewayUrl': 'https://gateway-two.example/', + }, + ]); + expect(methods, [ + 'devEnrollPush', + 'endpointGrants', + 'devEnrollPush', + 'endpointGrants', + ]); expect(pushEndpointGrants.value.single.endpointGrant, 'new-grant'); }, ); + test('development push gateway uses the localhost compiled default', () { + expect(Env.pushGatewayUrl, 'http://localhost:8080'); + }); + test('persists the acknowledged push lease generation', () async { debugDefaultTargetPlatformOverride = TargetPlatform.iOS; final methods = [];