authenticateViaPopup method

  1. @override
Stream<String> authenticateViaPopup(
  1. String url, {
  2. String eventName = 'token',
  3. String? errorMessage,
})
override

Opens the url in a new window, and returns a Stream that will fire a JWT on successful authentication.

Implementation

@override
Stream<String> authenticateViaPopup(
  String url, {
  String eventName = 'token',
  String? errorMessage,
}) {
  var ctrl = StreamController<String>();
  var wnd = window.open(url, 'angel_client_auth_popup');

  //Timer t;
  //StreamSubscription<Event>? sub;
  Timer.periodic(Duration(milliseconds: 500), (timer) {
    if (!ctrl.isClosed) {
      if (wnd != null && wnd.closed) {
        ctrl.addError(
          AngelHttpException.notAuthenticated(
            message:
                errorMessage ?? 'Authentication via popup window failed.',
          ),
        );
        ctrl.close();
        timer.cancel();
        //sub?.cancel();
      }
    } else {
      timer.cancel();
    }
  });

  // TODO: This need to be fixed
  EventListener? sub;
  window.addEventListener(
    eventName,
    (e) {
      if (!ctrl.isClosed) {
        ctrl.add((e as CustomEvent).detail.toString());
        //t.cancel();
        ctrl.close();
        //sub?.cancel();
        window.removeEventListener(eventName, sub);
      }
    }.toJS,
  );
  /* With dart:html
  sub = window.on[eventName].listen((e) {
    if (!ctrl.isClosed) {
      ctrl.add((e as CustomEvent).detail.toString());
      t.cancel();
      ctrl.close();
      sub?.cancel();
    }
  });
  */

  return ctrl.stream;
}