|
| 1 | +import 'dart:async'; |
1 | 2 | import 'dart:convert';
|
2 |
| -import 'dart:html' as html; |
3 |
| -import 'dart:js_util' as js_util; |
| 3 | +import 'dart:js_interop'; |
4 | 4 |
|
5 | 5 | import 'package:gotrue/src/types/types.dart';
|
6 | 6 | import 'package:logging/logging.dart';
|
| 7 | +import 'package:web/web.dart' as web; |
7 | 8 |
|
8 | 9 | final _log = Logger('supabase.auth');
|
9 | 10 |
|
10 | 11 | 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 | + ); |
15 | 24 |
|
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, |
20 | 27 | postMessage: (message) {
|
21 | 28 | _log.finest('Broadcasting message: $message');
|
22 | 29 | _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(); |
25 | 35 | },
|
26 |
| - close: broadcast.close, |
27 | 36 | );
|
28 | 37 | }
|
0 commit comments