diff --git a/.github/workflows/validate-capabilities.yml b/.github/workflows/validate-capabilities.yml index 152cdb935..7039fc2c4 100644 --- a/.github/workflows/validate-capabilities.yml +++ b/.github/workflows/validate-capabilities.yml @@ -3,6 +3,8 @@ name: SDK Compliance on: workflow_dispatch: pull_request: + branches: + - main permissions: contents: read diff --git a/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart b/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart index 30c960e80..1cbdde54a 100644 --- a/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart +++ b/packages/gotrue/lib/src/gotrue_admin_oauth_api.dart @@ -40,9 +40,9 @@ class OAuthClientListResponse { .map((e) => OAuthClient.fromJson(e as Map)) .toList(), aud: json['aud'] as String?, - nextPage: json['nextPage'] as int?, - lastPage: json['lastPage'] as int?, - total: json['total'] as int? ?? 0, + nextPage: (json['nextPage'] as num?)?.toInt(), + lastPage: (json['lastPage'] as num?)?.toInt(), + total: (json['total'] as num?)?.toInt() ?? 0, ); } } diff --git a/packages/gotrue/lib/src/types/jwt.dart b/packages/gotrue/lib/src/types/jwt.dart index 80f87648d..9514f51eb 100644 --- a/packages/gotrue/lib/src/types/jwt.dart +++ b/packages/gotrue/lib/src/types/jwt.dart @@ -79,9 +79,9 @@ class JwtPayload { iss: json['iss'] as String?, sub: json['sub'] as String?, aud: json['aud'], - exp: json['exp'] as int?, - nbf: json['nbf'] as int?, - iat: json['iat'] as int?, + exp: (json['exp'] as num?)?.toInt(), + nbf: (json['nbf'] as num?)?.toInt(), + iat: (json['iat'] as num?)?.toInt(), jti: json['jti'] as String?, claims: Map.of(json), ); diff --git a/packages/gotrue/lib/src/types/session.dart b/packages/gotrue/lib/src/types/session.dart index 7ef93b027..c957708b2 100644 --- a/packages/gotrue/lib/src/types/session.dart +++ b/packages/gotrue/lib/src/types/session.dart @@ -46,7 +46,7 @@ class Session { } return Session( accessToken: json['access_token'] as String, - expiresIn: json['expires_in'] as int?, + expiresIn: (json['expires_in'] as num?)?.toInt(), refreshToken: json['refresh_token'] as String?, tokenType: json['token_type'] as String, providerToken: json['provider_token'] as String?, diff --git a/packages/gotrue/test/src/helper_test.dart b/packages/gotrue/test/src/helper_test.dart index 3f8c864fe..dd3df8f7f 100644 --- a/packages/gotrue/test/src/helper_test.dart +++ b/packages/gotrue/test/src/helper_test.dart @@ -1,4 +1,5 @@ import 'package:gotrue/src/helper.dart'; +import 'package:gotrue/src/types/jwt.dart'; import 'package:test/test.dart'; void main() { @@ -330,4 +331,19 @@ void main() { }); }); }); + + group('JwtPayload', () { + test('fromJson accepts double exp, nbf, and iat', () { + final payload = JwtPayload.fromJson({ + 'sub': '1234567890', + 'exp': 1700000000.0, + 'nbf': 1600000000.0, + 'iat': 1650000000.0, + }); + + expect(payload.exp, equals(1700000000)); + expect(payload.nbf, equals(1600000000)); + expect(payload.iat, equals(1650000000)); + }); + }); } diff --git a/packages/gotrue/test/src/types/session_test.dart b/packages/gotrue/test/src/types/session_test.dart index d18d0eb53..890d13301 100644 --- a/packages/gotrue/test/src/types/session_test.dart +++ b/packages/gotrue/test/src/types/session_test.dart @@ -109,6 +109,26 @@ void main() { ); expect(session.user.id, equals('123')); }); + + test('accepts a double expires_in, as sent by a BroadcastChannel', () { + final json = { + 'access_token': 'test-access-token', + 'expires_in': 3600.0, + 'token_type': 'bearer', + 'user': { + 'id': '123', + 'app_metadata': {}, + 'user_metadata': {}, + 'aud': 'authenticated', + 'created_at': '2023-01-01T00:00:00Z', + }, + }; + + final session = Session.fromJson(json); + + expect(session, isNotNull); + expect(session!.expiresIn, equals(3600)); + }); }); group('toJson', () { diff --git a/packages/storage_client/lib/src/storage_client.dart b/packages/storage_client/lib/src/storage_client.dart index 3640e8128..9fe70d1ed 100644 --- a/packages/storage_client/lib/src/storage_client.dart +++ b/packages/storage_client/lib/src/storage_client.dart @@ -42,6 +42,7 @@ class SupabaseStorageClient extends StorageBucketApi { /// only if your project has the dedicated storage host enabled; otherwise /// every storage request will fail with an `Invalid Storage request` error. /// Defaults to `false` (opt-in). + // ignore: use_super_parameters SupabaseStorageClient( String url, Map headers, { diff --git a/packages/supabase_flutter/example/android/app/build.gradle b/packages/supabase_flutter/example/android/app/build.gradle index b5511a9a3..9933a4063 100644 --- a/packages/supabase_flutter/example/android/app/build.gradle +++ b/packages/supabase_flutter/example/android/app/build.gradle @@ -11,12 +11,8 @@ android { ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } defaultConfig { @@ -39,6 +35,12 @@ android { } } +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + flutter { source = "../.." } diff --git a/packages/supabase_flutter/example/android/gradle.properties b/packages/supabase_flutter/example/android/gradle.properties index 5c9bff134..f0e9122fb 100644 --- a/packages/supabase_flutter/example/android/gradle.properties +++ b/packages/supabase_flutter/example/android/gradle.properties @@ -1,4 +1,7 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true -android.enableJetifier=true -kotlin.version=2.1.20 +# This newDsl flag was added by the Flutter template +android.newDsl=false +# This builtInKotlin flag was added by the Flutter template +android.builtInKotlin=false +kotlin.version=2.4.0 diff --git a/packages/supabase_flutter/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/supabase_flutter/example/android/gradle/wrapper/gradle-wrapper.properties index ae4378fe9..b0ed1e31d 100644 --- a/packages/supabase_flutter/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/supabase_flutter/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip \ No newline at end of file diff --git a/packages/supabase_flutter/example/android/settings.gradle b/packages/supabase_flutter/example/android/settings.gradle index 6c34fad02..d92e8276a 100644 --- a/packages/supabase_flutter/example/android/settings.gradle +++ b/packages/supabase_flutter/example/android/settings.gradle @@ -18,8 +18,8 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.13.1' apply false - id "org.jetbrains.kotlin.android" version "2.1.20" apply false + id "com.android.application" version "9.1.0" apply false + id "org.jetbrains.kotlin.android" version "2.4.0" apply false } include ":app"