checkCompatible method
CapabilityCheck
checkCompatible(
- CapabilityHandshake other, {
- Iterable<
String> requiredFeatures = const [],
Structured compatibility check. Returns the offending field (and reason)
on mismatch so a caller can produce a clean fail-closed diagnostic —
mirrors lazily-js::SessionHandshake.checkCompatible.
requiredFeatures are checked against the other peer's offered set: if
this peer requires a feature the other does not offer, the handshake fails
closed on features.
Implementation
CapabilityCheck checkCompatible(
CapabilityHandshake other, {
Iterable<String> requiredFeatures = const [],
}) {
if (protocolId != kProtocolId) {
return const CapabilityCheck.fail(
'protocol_id', 'local protocol_id != lazily-ipc');
}
if (other.protocolId != kProtocolId) {
return const CapabilityCheck.fail(
'protocol_id', 'remote protocol_id != lazily-ipc');
}
if (protocolMajorVersion != kProtocolMajorVersion) {
return CapabilityCheck.fail('protocol_major_version',
'local major != $kProtocolMajorVersion');
}
if (other.protocolMajorVersion != kProtocolMajorVersion) {
return CapabilityCheck.fail('protocol_major_version',
'remote major != $kProtocolMajorVersion');
}
if (protocolMajorVersion != other.protocolMajorVersion) {
return const CapabilityCheck.fail(
'protocol_major_version', 'major version mismatch');
}
if (codec != other.codec) {
return CapabilityCheck.fail(
'codec', 'codec mismatch ($codec vs ${other.codec})');
}
if (!orderedReliable || !other.orderedReliable) {
return const CapabilityCheck.fail('ordered_reliable',
'both peers must require ordered-reliable delivery');
}
final offered = other.features.toSet();
for (final required in requiredFeatures) {
if (!offered.contains(required)) {
return CapabilityCheck.fail(
'features', 'required feature "$required" not offered by peer');
}
}
return const CapabilityCheck.ok();
}