From b9109a99ddf998c69d47f4127b0c5b021cb8437a Mon Sep 17 00:00:00 2001 From: Dominique Padiou <5765435+dpad85@users.noreply.github.com> Date: Thu, 21 Nov 2024 11:46:54 +0100 Subject: [PATCH] Add code with fallback and unknown message codec --- .../acinq/eclair/wire/LightningMessageCodecs.scala | 14 +++++++++++--- .../acinq/eclair/wire/LightningMessageTypes.scala | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala index 86e8acb54..769845094 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageCodecs.scala @@ -23,7 +23,7 @@ import fr.acinq.eclair.wire.Monitoring.{Metrics, Tags} import fr.acinq.eclair.{Features, KamonExt, wire} import scodec.bits.{BitVector, ByteVector} import scodec.codecs._ -import scodec.{Attempt, Codec} +import scodec.{Attempt, Codec, DecodeResult, SizeBound} import scodec.bits._ /** @@ -370,6 +370,11 @@ object LightningMessageCodecs { val phoenixAndroidLegacyMigrateResponseCodec: Codec[PhoenixAndroidLegacyMigrateResponse] = ("newNodeId" | publicKey).as[PhoenixAndroidLegacyMigrateResponse] + val unknownMessageCodec: Codec[UnknownMessage] = ( + ("tag" | uint16) :: + ("message" | bytes) + ).as[UnknownMessage] + val lightningMessageCodec = discriminated[LightningMessage].by(uint16) .typecase(16, initCodec) .typecase(17, errorCodec) @@ -421,12 +426,15 @@ object LightningMessageCodecs { .typecase(35025, phoenixAndroidLegacyMigrateCodec) .typecase(35027, phoenixAndroidLegacyMigrateResponseCodec) + val lightningMessageCodecWithFallback: Codec[LightningMessage] = + discriminatorWithDefault(lightningMessageCodec, unknownMessageCodec.upcast) + val meteredLightningMessageCodec = Codec[LightningMessage]( - (msg: LightningMessage) => KamonExt.time(Metrics.EncodeDuration.withTag(Tags.MessageType, msg.getClass.getSimpleName))(lightningMessageCodec.encode(msg)), + (msg: LightningMessage) => KamonExt.time(Metrics.EncodeDuration.withTag(Tags.MessageType, msg.getClass.getSimpleName))(lightningMessageCodecWithFallback.encode(msg)), (bits: BitVector) => { // this is a bit more involved, because we don't know beforehand what the type of the message will be val begin = System.nanoTime() - val res = lightningMessageCodec.decode(bits) + val res = lightningMessageCodecWithFallback.decode(bits) val end = System.nanoTime() val messageType = res match { case Attempt.Successful(decoded) => decoded.value.getClass.getSimpleName diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala index e38bbadae..6b5e6e379 100644 --- a/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala +++ b/eclair-core/src/main/scala/fr/acinq/eclair/wire/LightningMessageTypes.scala @@ -380,3 +380,5 @@ case object UnsetFCMToken extends LightningMessage // case class PhoenixAndroidLegacyMigrate(newNodeId: PublicKey) extends LightningMessage case class PhoenixAndroidLegacyMigrateResponse(newNodeId: PublicKey) extends LightningMessage + +case class UnknownMessage(tag: Int, data: ByteVector) extends LightningMessage