call method

Future<Res> call(
  1. String endpoint, {
  2. NawahQuery? query,
  3. Res? doc,
  4. bool awaitAuth = false,
})

Implementation

Future<Res> call(
  String endpoint, {
  NawahQuery? query,
  Res? doc,
  bool awaitAuth = false,
}) {
  Res callArgs = {
    'endpoint': endpoint,
    'query': query ?? NawahQuery(),
    'doc': doc ?? {},
    'awaitAuth': awaitAuth,
    'call_id': null,
  };

  final completer = Completer<Res>();

  // ignore: non_constant_identifier_names
  String call_id = generateRandomString(7);
  callArgs['call_id'] = call_id;
  _listeners[NawahListenerKey.message]!.add(
    NawahMessageListener(
      filter: (res) => res['args']['call_id'] == call_id,
      callable: (nawah, res) {
        NawahDI.get<INawahLogger>()?.log(
          this,
          'message received from observer on call_id: $call_id, $res',
        );
        if (res['status'] != 200) return completer.completeError(res);

        completer.complete(res);
      },
      once: true,
    ),
  );

  final isConnected = connState == ConnState.connected;
  final isAuthed = callArgs['awaitAuth'] && authState == AuthState.authed || !callArgs['awaitAuth'];

  if (isConnected && isAuthed) {
    _sendCall(
      callArgs: callArgs,
      completer: completer,
    );

    return completer.future;
  }

  NawahDI.get<INawahLogger>()?.warn(
    this,
    'Connection not yet established, or require Authed status. Queuing call: $callArgs',
  );

  if (callArgs['awaitAuth']) {
    NawahDI.get<INawahLogger>()?.warn(this, 'Queuing in auth queue');
    _queue[NawahQueueKey.auth]!.add({
      'callArgs': callArgs,
      'completer': completer,
    });
  } else {
    NawahDI.get<INawahLogger>()?.warn(this, 'Queuing in noAuth queue');
    _queue[NawahQueueKey.noAuth]!.add({
      'callArgs': callArgs,
      'completer': completer,
    });
  }

  return completer.future;
}