wait method

Future<PatchbayInvocation> wait(
  1. PatchbayUiWaitRequest request, {
  2. String? requestId,
})

Implementation

Future<PatchbayInvocation> wait(
  PatchbayUiWaitRequest request, {
  String? requestId,
}) async {
  final String id = requestId ?? _newRequestId();
  final DateTime started = DateTime.now();
  final DateTime deadline = started.add(request.timeout);
  final _Timed<PatchbayGateRejection?> gated = await _beforeDeadline(
    _gates.evaluate(const <String>{}),
    deadline,
  );
  if (!gated.completed) return _timeout(id, request, started, null);
  final PatchbayGateRejection? gate = gated.value;
  if (gate != null) {
    return PatchbayInvocation.rejected(
      requestId: id,
      rejection: PatchbayRejection(
        code: gate.code,
        notice: gate.notice,
        details: <String, Object?>{'gateId': gate.gateId},
      ),
    );
  }

  _WaitProbe? last;
  while (DateTime.now().isBefore(deadline)) {
    if (!_isAppResumed()) {
      return _rejected(
        id,
        'uiWaitLifecycleNotResumed',
        details: patchbayLifecycleDetails(_lifecycleState),
      );
    }
    final _Timed<_WaitProbe> observed = await _beforeDeadline(
      _probe(request),
      deadline,
    );
    if (!observed.completed) break;
    last = observed.value!;
    if (last.rejectionCode != null) {
      return _rejected(
        id,
        last.rejectionCode!,
        details: last.rejectionDetails,
      );
    }
    if (last.satisfied) {
      return PatchbayInvocation.accepted(
        requestId: id,
        payload: PatchbayUiWaitResultWire(
          outcome: 'observed',
          source: PatchbayFactSourceWire.uiObserved,
          condition: request.condition.wire,
          elapsedMs: DateTime.now().difference(started).inMilliseconds,
          semanticsIdentifier: request.semanticsIdentifier,
          nodeId: last.nodeId,
          generation: last.generation,
          value: last.value,
          destinationId: last.destinationId,
          navigationRevision: last.navigationRevision,
          treeRevision: last.treeRevision,
          frameRevision: _frames.revision,
        ).toJson(),
      );
    }
    if (!await _frames.nextFrameBefore(deadline)) break;
  }
  return _timeout(id, request, started, last);
}