|
| 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