checkCompatible method

CapabilityCheck checkCompatible(
  1. CapabilityHandshake other, {
  2. 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();
}