Skip to content

Commit f70070e

Browse files
committed
fix: Use web package to access web APIs
1 parent 79edb81 commit f70070e

File tree

3 files changed

+80
-13
lines changed

3 files changed

+80
-13
lines changed
Lines changed: 22 additions & 13 deletions
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/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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: ^1.0.0
2021

2122
dev_dependencies:
2223
dart_jsonwebtoken: ^2.4.1
Lines changed: 57 additions & 0 deletions
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+
}

0 commit comments

Comments
 (0)