mirror of
https://github.com/logos-storage/logos-storage-nim.git
synced 2026-07-24 10:33:16 +00:00
81 lines
2.3 KiB
Nim
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])
|