Skip to content

Commit d52d9fb

Browse files
committed
Merge branch 'main' into chore/test-coverage
2 parents 9627b54 + dfa71c9 commit d52d9fb

File tree

11 files changed

+95
-28
lines changed

11 files changed

+95
-28
lines changed

.github/workflows/supabase_flutter.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
fail-fast: false
3535
matrix:
3636
os: [ubuntu-latest]
37-
flutter-version: ['3.10.x', '3.x']
37+
flutter-version: ['3.19.x', '3.x']
3838

3939
defaults:
4040
run:

packages/functions_client/lib/src/types.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class FunctionResponse {
2626
});
2727
}
2828

29-
class FunctionException {
29+
class FunctionException implements Exception {
3030
final int status;
3131
final dynamic details;
3232
final String? reasonPhrase;
+22-13
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,37 @@
1+
import 'dart:async';
12
import 'dart:convert';
2-
import 'dart:html' as html;
3-
import 'dart:js_util' as js_util;
3+
import 'dart:js_interop';
44

55
import 'package:gotrue/src/types/types.dart';
66
import 'package:logging/logging.dart';
7+
import 'package:web/web.dart' as web;
78

89
final _log = Logger('supabase.auth');
910

1011
BroadcastChannel getBroadcastChannel(String broadcastKey) {
11-
final broadcast = html.BroadcastChannel(broadcastKey);
12-
return (
13-
onMessage: broadcast.onMessage.map((event) {
14-
final dataMap = js_util.dartify(event.data);
12+
final broadcast = web.BroadcastChannel(broadcastKey);
13+
final controller = StreamController<Map<String, dynamic>>();
14+
15+
broadcast.addEventListener(
16+
'message',
17+
(web.Event event) {
18+
if (event is web.MessageEvent) {
19+
final dataMap = event.data.dartify();
20+
controller.add(json.decode(json.encode(dataMap)));
21+
}
22+
} as web.EventListener,
23+
);
1524

16-
// some parts have the wrong map type. This is an easy workaround and
17-
// should be efficient enough for the small session and user data
18-
return json.decode(json.encode(dataMap));
19-
}),
25+
return (
26+
onMessage: controller.stream,
2027
postMessage: (message) {
2128
_log.finest('Broadcasting message: $message');
2229
_log.fine('Broadcasting event: ${message['event']}');
23-
final jsMessage = js_util.jsify(message);
24-
broadcast.postMessage(jsMessage);
30+
broadcast.postMessage(message.jsify() as JSAny);
31+
},
32+
close: () {
33+
broadcast.close();
34+
controller.close();
2535
},
26-
close: broadcast.close,
2736
);
2837
}

packages/gotrue/lib/src/gotrue_client.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import 'package:gotrue/src/types/auth_response.dart';
1111
import 'package:gotrue/src/types/fetch_options.dart';
1212
import 'package:http/http.dart';
1313
import 'package:jwt_decode/jwt_decode.dart';
14+
import 'package:logging/logging.dart';
1415
import 'package:meta/meta.dart';
1516
import 'package:retry/retry.dart';
1617
import 'package:rxdart/subjects.dart';
17-
import 'package:logging/logging.dart';
1818

19-
import 'broadcast_stub.dart' if (dart.library.html) './broadcast_web.dart'
19+
import 'broadcast_stub.dart' if (dart.library.js_interop) './broadcast_web.dart'
2020
as web;
2121
import 'version.dart';
2222

@@ -363,8 +363,8 @@ class GoTrueClient {
363363
),
364364
);
365365

366-
await _asyncStorage!
367-
.removeItem(key: '${Constants.defaultStorageKey}-code-verifier');
366+
await _asyncStorage.removeItem(
367+
key: '${Constants.defaultStorageKey}-code-verifier');
368368

369369
final authSessionUrlResponse = AuthSessionUrlResponse(
370370
session: Session.fromJson(response)!, redirectType: redirectType?.name);
@@ -1163,7 +1163,7 @@ class GoTrueClient {
11631163
}
11641164

11651165
void _mayStartBroadcastChannel() {
1166-
if (const bool.fromEnvironment('dart.library.html')) {
1166+
if (const bool.fromEnvironment('dart.library.js_interop')) {
11671167
// Used by the js library as well
11681168
final broadcastKey =
11691169
"sb-${Uri.parse(_url).host.split(".").first}-auth-token";

packages/gotrue/lib/src/types/auth_state.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class AuthState {
55
final AuthChangeEvent event;
66
final Session? session;
77

8-
/// Whether this state was broadcasted via `html.ChannelBroadcast` on web from
8+
/// Whether this state was broadcasted via `web.BroadcastChannel` on web from
99
/// another tab or window.
1010
final bool fromBroadcast;
1111

packages/gotrue/pubspec.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ repository: 'https://github.com/supabase/supabase-flutter/tree/main/packages/got
66
documentation: 'https://supabase.com/docs/reference/dart/auth-signup'
77

88
environment:
9-
sdk: '>=3.0.0 <4.0.0'
9+
sdk: '>=3.3.0 <4.0.0'
1010

1111
dependencies:
1212
collection: ^1.15.0
@@ -17,6 +17,7 @@ dependencies:
1717
rxdart: '>=0.27.7 <0.29.0'
1818
meta: ^1.7.0
1919
logging: ^1.2.0
20+
web: '>=0.5.0 <2.0.0'
2021

2122
dev_dependencies:
2223
dart_jsonwebtoken: ^2.4.1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
@TestOn('browser')
2+
import 'dart:async';
3+
4+
import 'package:gotrue/src/broadcast_web.dart';
5+
import 'package:gotrue/src/types/types.dart';
6+
import 'package:test/test.dart';
7+
8+
void main() {
9+
group('getBroadcastChannel', () {
10+
late BroadcastChannel channel1;
11+
late BroadcastChannel channel2;
12+
13+
setUp(() {
14+
channel1 = getBroadcastChannel('test-channel');
15+
channel2 = getBroadcastChannel('test-channel');
16+
});
17+
18+
tearDown(() {
19+
channel1.close();
20+
channel2.close();
21+
});
22+
23+
test('can send and receive messages between channels', () async {
24+
final completer = Completer<Map<String, dynamic>>();
25+
26+
// Listen for messages on channel2
27+
final subscription = channel2.onMessage.listen((message) {
28+
completer.complete(message);
29+
});
30+
31+
// Send message from channel1
32+
final testMessage = {
33+
'event': 'test-event',
34+
'data': {'foo': 'bar'}
35+
};
36+
channel1.postMessage(testMessage);
37+
38+
// Wait for the message to be received
39+
final receivedMessage = await completer.future;
40+
41+
expect(receivedMessage['event'], equals('test-event'));
42+
expect(receivedMessage['data']['foo'], equals('bar'));
43+
44+
await subscription.cancel();
45+
});
46+
47+
test('can close channels', () async {
48+
channel1.close();
49+
50+
// Verify that sending messages after closing throws
51+
expect(
52+
() => channel1.postMessage({'event': 'test'}),
53+
throwsA(anything),
54+
);
55+
});
56+
});
57+
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export 'websocket_stub.dart'
22
if (dart.library.io) 'websocket_io.dart'
3-
if (dart.library.html) 'websocket_web.dart';
3+
if (dart.library.js_interop) 'websocket_web.dart';

packages/supabase/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ repository: 'https://github.com/supabase/supabase-flutter/tree/main/packages/sup
66
documentation: 'https://supabase.com/docs/reference/dart/introduction'
77

88
environment:
9-
sdk: '>=3.0.0 <4.0.0'
9+
sdk: '>=3.3.0 <4.0.0'
1010

1111
dependencies:
1212
functions_client: 2.4.1

packages/supabase_flutter/lib/src/local_storage.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart';
66
import 'package:supabase_flutter/supabase_flutter.dart';
77

88
import './local_storage_stub.dart'
9-
if (dart.library.html) './local_storage_web.dart' as web;
9+
if (dart.library.js_interop) './local_storage_web.dart' as web;
1010

1111
/// Only used for migration from Hive to SharedPreferences. Not actually in use.
1212
const supabasePersistSessionKey = 'SUPABASE_PERSIST_SESSION_KEY';
@@ -70,7 +70,7 @@ class SharedPreferencesLocalStorage extends LocalStorage {
7070

7171
final String persistSessionKey;
7272
static const _useWebLocalStorage =
73-
kIsWeb && bool.fromEnvironment("dart.library.html");
73+
kIsWeb && bool.fromEnvironment("dart.library.js_interop");
7474

7575
@override
7676
Future<void> initialize() async {

packages/supabase_flutter/pubspec.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ repository: 'https://github.com/supabase/supabase-flutter/tree/main/packages/sup
66
documentation: 'https://supabase.com/docs/reference/dart/introduction'
77

88
environment:
9-
sdk: '>=3.0.0 <4.0.0'
10-
flutter: '>=3.0.0'
9+
sdk: '>=3.3.0 <4.0.0'
10+
flutter: '>=3.19.0'
1111

1212
dependencies:
1313
app_links: '>=3.5.0 <7.0.0'

0 commit comments

Comments
 (0)