mirror of
https://github.com/codex-storage/nim-codex.git
synced 2025-01-12 05:54:22 +00:00
4c51dca299
* convert EthersError to MarketError * change `canReserveSlot` and `reserveSlot` parameters Parameters for `canReserveSlot` and `reserveSlot` were changed from `SlotId` to `RequestId` and `UInt256 slotIndex`. * Add SaleSlotReserving Adds a new state, SaleSlotReserving, that attempts to reserve a slot before downloading. If the slot cannot be reserved, the state moves to SaleIgnored. On error, the state moves to SaleErrored. SaleIgnored is also updated to pass in `reprocessSlot` and `returnBytes`, controlling the behaviour in the Sales module after the slot is ignored. This is because previously it was assumed that SaleIgnored was only reached when there was no Availability. This is no longer the case, since SaleIgnored can now be reached when a slot cannot be reserved. * Update SalePreparing Specify `reprocessSlot` and `returnBytes` when moving to `SaleIgnored` from `SalePreparing`. Update tests to include test for a raised CatchableError. * Fix unit test * Modify `canReserveSlot` and `reverseSlot` params after rebase * Update MockMarket with new `canReserveSlot` and `reserveSlot` params * fix after rebase also bump codex-contracts-eth to master
62 lines
1.7 KiB
Nim
62 lines
1.7 KiB
Nim
import pkg/questionable
|
|
import pkg/questionable/results
|
|
import pkg/metrics
|
|
|
|
import ../../logutils
|
|
import ../../market
|
|
import ../salesagent
|
|
import ../statemachine
|
|
import ./errorhandling
|
|
import ./cancelled
|
|
import ./failed
|
|
import ./filled
|
|
import ./ignored
|
|
import ./downloading
|
|
import ./errored
|
|
|
|
type
|
|
SaleSlotReserving* = ref object of ErrorHandlingState
|
|
|
|
logScope:
|
|
topics = "marketplace sales reserving"
|
|
|
|
method `$`*(state: SaleSlotReserving): string = "SaleSlotReserving"
|
|
|
|
method onCancelled*(state: SaleSlotReserving, request: StorageRequest): ?State =
|
|
return some State(SaleCancelled())
|
|
|
|
method onFailed*(state: SaleSlotReserving, request: StorageRequest): ?State =
|
|
return some State(SaleFailed())
|
|
|
|
method onSlotFilled*(state: SaleSlotReserving, requestId: RequestId,
|
|
slotIndex: UInt256): ?State =
|
|
return some State(SaleFilled())
|
|
|
|
method run*(state: SaleSlotReserving, machine: Machine): Future[?State] {.async.} =
|
|
let agent = SalesAgent(machine)
|
|
let data = agent.data
|
|
let context = agent.context
|
|
let market = context.market
|
|
|
|
logScope:
|
|
requestId = data.requestId
|
|
slotIndex = data.slotIndex
|
|
|
|
let canReserve = await market.canReserveSlot(data.requestId, data.slotIndex)
|
|
if canReserve:
|
|
try:
|
|
trace "Reserving slot"
|
|
await market.reserveSlot(data.requestId, data.slotIndex)
|
|
except MarketError as e:
|
|
return some State( SaleErrored(error: e) )
|
|
|
|
trace "Slot successfully reserved"
|
|
return some State( SaleDownloading() )
|
|
|
|
else:
|
|
# do not re-add this slot to the queue, and return bytes from Reservation to
|
|
# the Availability
|
|
debug "Slot cannot be reserved, ignoring"
|
|
return some State( SaleIgnored(reprocessSlot: false, returnBytes: true) )
|
|
|