mirror of
https://github.com/logos-messaging/logos-delivery.git
synced 2026-07-22 04:29:42 +00:00
* change all usage of std.options.Option[T] to results.Opt[T] * fix broken apps and examples (to validate refactor) * removed all std/options code added for libp2p v2 migration * add broker Opt codec to persistency/backend_comm.nim * add a readValue overload for Opt[T] in tools/confutils/cli_args.nim * keep Option where required (Presto, confutils' config_file.nim) * Change generateRlnProof error handling * Fix imports
70 lines
2.1 KiB
Nim
70 lines
2.1 KiB
Nim
## Segmentation component for the Reliable Channel API.
|
|
##
|
|
## Splits large application payloads into transmittable segments and
|
|
## reassembles them on reception. Supports optional Reed-Solomon parity
|
|
## segments for loss recovery, as per the Reliable Channel API spec.
|
|
##
|
|
## For the skeleton everything fits in a single segment: real chunking
|
|
## and Reed-Solomon parity will be plugged in later.
|
|
##
|
|
## See: https://lip.logos.co/messaging/raw/reliable-channel-api.html
|
|
|
|
import results, ./segment_message_proto
|
|
import ./segmentation_persistence
|
|
|
|
export segment_message_proto, segmentation_persistence
|
|
|
|
const
|
|
DefaultSegmentSizeBytes* = 102_400
|
|
SegmentsParityRate* = 0.125
|
|
SegmentsReedSolomonMaxCount* = 256
|
|
|
|
type
|
|
SegmentationConfig* = object
|
|
segmentSizeBytes*: int
|
|
enableReedSolomon*: bool
|
|
persistence*: SegmentationPersistence
|
|
|
|
SegmentationHandler* = ref object
|
|
config*: SegmentationConfig
|
|
|
|
ReassemblyResult* = object
|
|
payload*: seq[byte]
|
|
entireMessageHash*: seq[byte]
|
|
|
|
proc new*(T: type SegmentationHandler, config: SegmentationConfig): T =
|
|
return T(config: config)
|
|
|
|
proc performSegmentation*(
|
|
self: SegmentationHandler, payload: seq[byte]
|
|
): seq[seq[byte]] =
|
|
## Skeleton behaviour: emit exactly one segment carrying the whole
|
|
## payload. Real chunking and Reed-Solomon parity will replace this.
|
|
let segment = SegmentMessageProto(
|
|
entireMessageHash: @[],
|
|
dataSegmentIndex: 0,
|
|
dataSegmentCount: 1,
|
|
payload: payload,
|
|
paritySegmentIndex: 0,
|
|
paritySegmentCount: 0,
|
|
isParity: false,
|
|
)
|
|
return @[segment.encode()]
|
|
|
|
proc handleIncomingSegment*(
|
|
self: SegmentationHandler, segmentBytes: seq[byte]
|
|
): Opt[ReassemblyResult] =
|
|
## Skeleton behaviour: every segment is already a complete message
|
|
## (since `performSegmentation` always emits one), so just hand the
|
|
## payload straight back.
|
|
let segment = SegmentMessageProto.decode(segmentBytes)
|
|
return Opt.some(
|
|
ReassemblyResult(
|
|
payload: segment.payload, entireMessageHash: segment.entireMessageHash
|
|
)
|
|
)
|
|
|
|
proc cleanupSegments*(self: SegmentationHandler) =
|
|
## Drop expired partial-reassembly state.
|
|
discard
|