Chrysostomos Nanakos 673823d600
refactor(protobuf): migrate to protobuf serde (#1485)
Signed-off-by: Chrysostomos Nanakos <chris@include.gr>
2026-07-14 14:09:12 +00:00

81 lines
2.3 KiB
Nim

## Logos Storage
## Copyright (c) 2026 Status Research & Development GmbH
## Licensed under either of
## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
## * MIT license ([LICENSE-MIT](LICENSE-MIT))
## at your option.
## This file may not be copied, modified, or distributed except according to
## those terms.
{.push raises: [].}
import pkg/chronos
import pkg/libp2p_mix
import pkg/protobuf_serialization
import pkg/protobuf_serialization/std/enums
import pkg/protobuf_serialization/pkg/results
import ../logutils
import ../utils/protobuf/serializer
const DhtProxyCodec* = "/storage/dht-proxy/1.0.0"
const DefaultMaxInFlightLookups* = 100
const DhtProxyRequestReadTimeout* = 5.seconds
let MaxLookupRequestBytes* = getMaxMessageSizeForCodec(DhtProxyCodec, 1).expect(
"DhtProxyCodec framing leaves no room for a Sphinx forward payload"
)
let MaxLookupResponseBytes* = getMaxMessageSizeForCodec(DhtProxyCodec, 0).expect(
"DhtProxyCodec framing leaves no room for a Sphinx reply payload"
)
type
QueryType* {.pure.} = enum
FindProviders = 0
LookupCode* {.pure.} = enum
Ok = 0
NotFound = 1
ErrDecodeFailed = 100
ErrInvalidCid = 101
ErrInternal = 200
ErrResponseTooLarge = 201
ErrTooBusy = 202
LookupRequest* {.proto2.} = object
queryType* {.fieldNumber: 1, required, ext.}: QueryType
queryBytes* {.fieldNumber: 2, required.}: seq[byte]
LookupResponse* {.proto2.} = object
code* {.fieldNumber: 1, required, ext.}: LookupCode
providers* {.fieldNumber: 2.}: seq[seq[byte]]
Protobuf.serializerForResult([LookupRequest, LookupResponse])
proc packProviders*(
providers: seq[seq[byte]], budget_bytes: int
): Result[seq[seq[byte]], LookupCode] =
if providers.len == 0:
error "packProviders called with no providers"
return err(LookupCode.ErrInternal)
let single = LookupResponse(code: LookupCode.Ok, providers: providers[0 ..< 1])
if single.encode().len > budget_bytes:
return err(LookupCode.ErrResponseTooLarge)
var
lo = 1
hi = providers.len
while lo < hi:
let
mid = (lo + hi + 1) div 2
test = LookupResponse(code: LookupCode.Ok, providers: providers[0 ..< mid])
if test.encode().len <= budget_bytes:
lo = mid
else:
hi = mid - 1
ok(providers[0 ..< lo])