Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
608d0de
feat(clerk_auth): refactor persistor into platform-specific implement…
Silfalion Mar 10, 2026
00f9bd4
chore(clerk_auth): update API, telemetry, and misc internals for web …
Silfalion Mar 10, 2026
67e0852
feat(clerk_flutter): split caching persistor for web with IndexedDB
Silfalion Mar 10, 2026
32be14e
fix(clerk_flutter): update widgets for web compatibility
Silfalion Mar 10, 2026
81a5c47
chore(clerk_flutter): update dependencies and example app
Silfalion Mar 10, 2026
25d7ecc
test(clerk_flutter): add web caching persistor tests
Silfalion Mar 10, 2026
e55e780
fix(clerk_flutter): address PR review feedback
Silfalion Mar 10, 2026
d1fb1d3
chore(clerk_flutter): upgrade app_links version in example [#373]
MarkOSullivan94 Mar 23, 2026
b2ea20d
fix(clerk_flutter): example index.html for wasm [#373]
MarkOSullivan94 Mar 23, 2026
f00274a
refactor(clerk_flutter): remove DefaultPersistor and DirectoryGetter …
MarkOSullivan94 Mar 23, 2026
fd6ead8
feat(clerk_flutter): added passkeys web js bundle
MarkOSullivan94 Mar 23, 2026
b067fb5
fix(clerk_flutter): platform safe platform check
MarkOSullivan94 Mar 30, 2026
c0073a0
fix(clerk_flutter): etag null check
MarkOSullivan94 Mar 30, 2026
7b0e316
feat: upgrade flutter to support web/wasm [#237]
shinyford Mar 30, 2026
19aae58
fix: stop cached images flickering [#237]
shinyford Mar 30, 2026
6f923b9
fix: improve passkeys on web [#237]
shinyford Mar 30, 2026
06c9761
feat(clerk_auth): global isWeb platform check [#237]
MarkOSullivan94 Mar 30, 2026
ab63dc2
refactor(clerk_auth): renamed persistor files and moved inside packag…
MarkOSullivan94 Mar 30, 2026
4c041c1
refactor: formatting [#237]
MarkOSullivan94 Mar 30, 2026
37df739
refactor(clerk_flutter): renamed get_cache_directory and added to pac…
MarkOSullivan94 Mar 30, 2026
c1a9cae
refactor(clerk_flutter): renamed default_caching_persistor and added …
MarkOSullivan94 Mar 30, 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
2 changes: 1 addition & 1 deletion .fvmrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"flutter": "3.27.4"
"flutter": "3.41.6"
}
2 changes: 1 addition & 1 deletion packages/clerk_auth/lib/clerk_auth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export 'src/clerk_auth/auth.dart';
export 'src/clerk_auth/auth_config.dart';
export 'src/clerk_auth/clerk_error.dart';
export 'src/clerk_auth/http_service.dart';
export 'src/clerk_auth/persistor.dart';
export 'src/clerk_auth/persistor/persistor.dart';
export 'src/clerk_auth/sdk_flags.dart';
export 'src/clerk_constants.dart';
export 'src/models/api/api_response.dart';
Expand Down
6 changes: 6 additions & 0 deletions packages/clerk_auth/lib/clerk_auth_persistor_web.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Separate entry point for the web DefaultPersistor.
//
// This file cannot be exported from `clerk_auth.dart` because it depends on
// `package:web`, which is unavailable on native platforms. Web-only consumers
// (e.g. `default_caching_persistor_web.dart`) import this directly.
export 'src/clerk_auth/persistor/default_persistor_web.dart';
24 changes: 14 additions & 10 deletions packages/clerk_auth/lib/src/clerk_api/api.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io' show File, HttpHeaders, HttpStatus, SocketException;
import 'dart:typed_data';

import 'package:clerk_auth/src/clerk_api/token_cache.dart';
import 'package:universal_io/universal_io.dart';
import 'package:clerk_auth/src/clerk_auth/auth_config.dart';
import 'package:clerk_auth/src/clerk_auth/clerk_error.dart';
import 'package:clerk_auth/src/clerk_auth/http_service.dart';
Expand Down Expand Up @@ -158,7 +159,7 @@ class Api with Logging {
headers: headers,
withSession: requiresSessionId,
);
if (resp.statusCode == 200) {
if (resp.statusCode == HttpStatus.ok) {
_tokenCache.clear();
return true;
} else {
Expand Down Expand Up @@ -540,10 +541,10 @@ class Api with Logging {

/// Update the current [User]'s avatar
///
Future<ApiResponse> updateAvatar(File file) async {
Future<ApiResponse> updateAvatar(Uint8List bytes) async {
final queryParams = _queryParams(HttpMethod.post, withSession: true);
final uri = _uri('/me/profile_image', params: queryParams);
return await _uploadFile(HttpMethod.post, uri, file);
return await _uploadFile(HttpMethod.post, uri, bytes);
}

/// Delete the current [User]'s avatar
Expand Down Expand Up @@ -814,11 +815,11 @@ class Api with Logging {
);
}

/// Update the current [User]'s avatar
/// Update an [Organization]'s logo
///
Future<ApiResponse> updateOrganizationLogo(
Organization org, {
required File logo,
required Uint8List logo,
Session? session,
}) async {
final params = _multiSessionMode && session is Session
Expand Down Expand Up @@ -905,15 +906,18 @@ class Api with Logging {

// Internal

Future<ApiResponse> _uploadFile(HttpMethod method, Uri uri, File file) async {
Future<ApiResponse> _uploadFile(
HttpMethod method,
Uri uri,
Uint8List bytes,
) async {
try {
final length = await file.length();
final stream = http.ByteStream(file.openRead());
final stream = http.ByteStream(Stream.fromIterable([bytes]));
final resp = await config.httpService.sendByteStream(
method,
uri,
stream,
length,
bytes.length,
_headers(method: method),
);
return _processResponse(resp);
Expand Down
2 changes: 1 addition & 1 deletion packages/clerk_auth/lib/src/clerk_api/telemetry.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:clerk_auth/clerk_auth.dart';
import 'package:clerk_auth/src/models/telemetry/telemetric_event.dart';
import 'package:universal_io/universal_io.dart';

/// Telemetry
///
Expand Down
2 changes: 1 addition & 1 deletion packages/clerk_auth/lib/src/clerk_api/token_cache.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'dart:convert';
import 'dart:io';

import 'package:clerk_auth/clerk_auth.dart';
import 'package:http/http.dart' as http;
import 'package:universal_io/universal_io.dart';

/// A store for authentication tokens and IDs from the
/// Clerk back end
Expand Down
22 changes: 11 additions & 11 deletions packages/clerk_auth/lib/src/clerk_auth/auth.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:clerk_auth/clerk_auth.dart';
import 'package:clerk_auth/src/clerk_api/api.dart';
Expand Down Expand Up @@ -903,7 +903,7 @@ class Auth {
Future<void> createOrganization({
required String name,
String? slug,
File? logo,
Uint8List? logo,
}) async {
await _api.createOrganization(name).then(_housekeeping);

Expand All @@ -913,7 +913,7 @@ class Auth {
.updateOrganization(org, slug: slug, session: session)
.then(_housekeeping);
}
if (logo case File logo) {
if (logo case Uint8List logo) {
await _api
.updateOrganizationLogo(org, logo: logo, session: session)
.then(_housekeeping);
Expand All @@ -928,17 +928,17 @@ class Auth {
Future<void> updateOrganization({
required Organization organization,
String? name,
File? logo,
Uint8List? logo,
}) async {
final hasName =
name is String && name.isNotEmpty && name != organization.name;
if (hasName || logo is File) {
if (hasName || logo is Uint8List) {
if (hasName) {
await _api
.updateOrganization(organization, name: name, session: session)
.then(_housekeeping);
}
if (logo case File logo) {
if (logo case Uint8List logo) {
await _api
.updateOrganizationLogo(organization, logo: logo, session: session)
.then(_housekeeping);
Expand Down Expand Up @@ -1062,7 +1062,7 @@ class Auth {
String? primaryPhoneNumberId,
String? primaryWeb3WalletId,
Map<String, dynamic>? metadata,
File? avatar,
Uint8List? avatar,
}) async {
final config = env.config;
if (user case User user) {
Expand All @@ -1082,7 +1082,7 @@ class Auth {
(primaryWeb3WalletId is String &&
primaryWeb3WalletId != user.primaryWeb3WalletId) ||
(metadata?.isNotEmpty == true);
if (needsUpdate || avatar is File) {
if (needsUpdate || avatar is Uint8List) {
if (needsUpdate) {
await _api
.updateUser(
Expand All @@ -1096,7 +1096,7 @@ class Auth {
)
.then(_housekeeping);
}
if (avatar case File avatar) {
if (avatar case Uint8List avatar) {
await _api.updateAvatar(avatar).then(_housekeeping);
}
update();
Expand Down Expand Up @@ -1157,8 +1157,8 @@ class Auth {

/// Update the avatar of the current [User]
///
Future<void> updateUserImage(File file) async {
await _api.updateAvatar(file).then(_housekeeping);
Future<void> updateUserImage(Uint8List bytes) async {
await _api.updateAvatar(bytes).then(_housekeeping);
update();
}

Expand Down
2 changes: 1 addition & 1 deletion packages/clerk_auth/lib/src/clerk_auth/auth_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import 'package:clerk_auth/src/clerk_auth/auth.dart';
import 'package:clerk_auth/src/clerk_auth/http_service.dart';
import 'package:clerk_auth/src/clerk_auth/persistor.dart';
import 'package:clerk_auth/src/clerk_auth/persistor/persistor.dart';
import 'package:clerk_auth/src/clerk_auth/sdk_flags.dart';
// ignore: deprecated_member_use_from_same_package
import 'package:clerk_auth/src/models/enums.dart' show SessionTokenPollMode;
Expand Down
1 change: 0 additions & 1 deletion packages/clerk_auth/lib/src/clerk_auth/http_service.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'dart:async';
import 'dart:io';

import 'package:clerk_auth/src/utils/extensions.dart';
import 'package:http/http.dart' as http;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export 'default_persistor_native.dart'
if (dart.library.js_interop) 'default_persistor_web.dart';
Loading
Loading