runCodeMieSsoCliFlow function

Future<CodeMieSsoCredentials?> runCodeMieSsoCliFlow({
  1. required String codeMieUrl,
  2. required void onStatus(
    1. String
    ),
  3. Future<bool> openBrowserFn(
    1. String
    ) = openBrowser,
})

Runs the CodeMie SSO login: starts the callback server, opens (or prints) the organization's login URL, waits for the token, and decodes it into CodeMieSsoCredentials. Returns null on cancel/timeout/failure.

Implementation

Future<CodeMieSsoCredentials?> runCodeMieSsoCliFlow({
  required String codeMieUrl,
  required void Function(String) onStatus,
  Future<bool> Function(String) openBrowserFn = openBrowser,
}) async {
  final server = CodeMieSsoCallbackServer();
  final port = await server.start();
  final ssoUrl = buildCodeMieSsoUrl(codeMieUrl, port);
  onStatus('listening for the CodeMie SSO callback on port $port');
  if (await openBrowserFn(ssoUrl)) {
    onStatus('browser opened; complete the CodeMie sign-in');
  } else {
    onStatus('could not open browser automatically');
    onStatus('open this URL manually: $ssoUrl');
  }
  final token = await server.waitForToken();
  if (token == null) {
    onStatus('no SSO callback received (timeout or cancelled)');
    return null;
  }
  try {
    final cookies = decodeCodeMieSsoToken(token);
    final credentials = CodeMieSsoCredentials(
      cookies: cookies,
      apiUrl: codeMieApiBase(codeMieUrl),
      expiresAt: deriveCodeMieExpiresAt(cookies),
    );
    if (credentials.authToken.isEmpty) {
      onStatus('CodeMie SSO callback carried no cookies');
      return null;
    }
    onStatus('CodeMie authorized');
    return credentials;
  } on FormatException catch (error) {
    onStatus('CodeMie SSO failed: ${error.message}');
    return null;
  }
}