diff --git a/packages/supabase/lib/src/constants.dart b/packages/supabase/lib/src/constants.dart index bd464c1d..ab0e7105 100644 --- a/packages/supabase/lib/src/constants.dart +++ b/packages/supabase/lib/src/constants.dart @@ -1,7 +1,21 @@ import 'package:supabase/src/version.dart'; +import 'dart:io' show Platform; + +const bool kIsWeb = bool.fromEnvironment('dart.library.js_util'); class Constants { - static const Map defaultHeaders = { + static String? get platform { + return kIsWeb ? null : Platform.operatingSystem; + } + + static String? get platformVersion { + return kIsWeb ? null : Platform.operatingSystemVersion; + } + + static final Map defaultHeaders = { 'X-Client-Info': 'supabase-dart/$version', + if (platform != null) 'X-Supabase-Client-Platform': platform!, + if (platformVersion != null) + 'X-Supabase-Client-Platform-Version': platformVersion!, }; } diff --git a/packages/supabase/test/client_test.dart b/packages/supabase/test/client_test.dart index 36f0c03d..7db3f47c 100644 --- a/packages/supabase/test/client_test.dart +++ b/packages/supabase/test/client_test.dart @@ -35,6 +35,51 @@ void main() { await supabase.dispose(); }); + test('X-Supabase-Client-Platform header is set properly', () { + expect(supabase.headers['X-Supabase-Client-Platform'], + Platform.operatingSystem); + expect(supabase.headers['X-Supabase-Client-Platform-Version'], + Platform.operatingSystemVersion); + }); + test('X-Supabase-Client-Platform header is set properly on auth', () { + expect(supabase.auth.headers['X-Supabase-Client-Platform'], + Platform.operatingSystem); + expect(supabase.auth.headers['X-Supabase-Client-Platform-Version'], + Platform.operatingSystemVersion); + }); + + test('X-Supabase-Client-Platform header is set properly on storage', () { + expect(supabase.storage.headers['X-Supabase-Client-Platform'], + Platform.operatingSystem); + expect(supabase.storage.headers['X-Supabase-Client-Platform-Version'], + Platform.operatingSystemVersion); + }); + + test('X-Supabase-Client-Platform header is set properly on functions', () { + expect(supabase.functions.headers['X-Supabase-Client-Platform'], + Platform.operatingSystem); + expect(supabase.functions.headers['X-Supabase-Client-Platform-Version'], + Platform.operatingSystemVersion); + }); + + test('X-Supabase-Client-Platform header is set properly on rest', () { + expect(supabase.rest.headers['X-Supabase-Client-Platform'], + Platform.operatingSystem); + expect(supabase.rest.headers['X-Supabase-Client-Platform-Version'], + Platform.operatingSystemVersion); + }); + + test('X-Supabase-Client-Platform header is set properly on realtime', + () async { + final request = await getRealtimeRequest( + server: mockServer, + supabaseClient: supabase, + ); + expect(request.headers['X-Supabase-Client-Platform']?.first, + Platform.operatingSystem); + expect(request.headers['X-Supabase-Client-Platform-Version']?.first, + Platform.operatingSystemVersion); + }); test('X-Client-Info header is set properly on realtime', () async { final request = await getRealtimeRequest( server: mockServer,