wait method
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);
}