Refactoring

This commit is contained in:
Arnaud 2025-09-18 11:36:31 +02:00 committed by Eric
parent 6a4350d211
commit 3680b397cf
No known key found for this signature in database
3 changed files with 90 additions and 147 deletions

View File

@ -114,10 +114,6 @@ proc finalize(
return err("Stream error: " & $e.msg) return err("Stream error: " & $e.msg)
except CancelledError as e: except CancelledError as e:
return err("Operation cancelled") return err("Operation cancelled")
# except LPError as e:
# return err("Stream error: " & $e.msg)
# except CancelledError as e:
# return err("Operation cancelled")
try: try:
let res = await session.fut let res = await session.fut

View File

@ -5,6 +5,7 @@
################################################################################ ################################################################################
### Exported types ### Exported types
import results
type CodexCallback* = proc( type CodexCallback* = proc(
callerRet: cint, msg: ptr cchar, len: csize_t, userData: pointer callerRet: cint, msg: ptr cchar, len: csize_t, userData: pointer
@ -14,6 +15,31 @@ const RET_OK*: cint = 0
const RET_ERR*: cint = 1 const RET_ERR*: cint = 1
const RET_MISSING_CALLBACK*: cint = 2 const RET_MISSING_CALLBACK*: cint = 2
## Returns RET_OK as acknowledgment and call the callback
## with RET_OK code and the provided message.
proc success*(callback: CodexCallback, msg: string, userData: pointer): cint =
callback(RET_OK, cast[ptr cchar](msg), cast[csize_t](len(msg)), userData)
return RET_OK
## Returns RET_ERR as acknowledgment and call the callback
## with RET_ERR code and the provided message.
proc error*(callback: CodexCallback, msg: string, userData: pointer): cint =
let msg = "libcodex error: " & msg
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
## Returns RET_OK as acknowledgment if the result is ok.
## If not, return RET_ERR and call the callback with the error message.
proc okOrError*[T](
callback: CodexCallback, res: Result[T, string], userData: pointer
): cint =
if res.isOk:
return RET_OK
return callback.error($res.error, userData)
### End of exported types ### End of exported types
################################################################################ ################################################################################

View File

@ -76,6 +76,10 @@ proc initializeLibrary() {.exported.} =
locals = addr(locals) locals = addr(locals)
nimGC_setStackBottom(locals) nimGC_setStackBottom(locals)
template init(ctx, callback, userData) =
initializeLibrary()
checkLibcodexParams(ctx, callback, userData)
proc codex_new( proc codex_new(
configJson: cstring, callback: CodexCallback, userData: pointer configJson: cstring, callback: CodexCallback, userData: pointer
): pointer {.dynlib, exported.} = ): pointer {.dynlib, exported.} =
@ -107,98 +111,64 @@ proc codex_new(
proc codex_version( proc codex_version(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
callback(
RET_OK,
cast[ptr cchar](conf.codexVersion),
cast[csize_t](len(conf.codexVersion)),
userData,
)
return RET_OK return callback.success(conf.codexVersion, userData)
proc codex_revision( proc codex_revision(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
callback(
RET_OK,
cast[ptr cchar](conf.codexRevision),
cast[csize_t](len(conf.codexRevision)),
userData,
)
return RET_OK return callback.success(conf.codexRevision, userData)
proc codex_repo( proc codex_repo(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = NodeInfoRequest.createShared(NodeInfoMsgType.REPO) let reqContent = NodeInfoRequest.createShared(NodeInfoMsgType.REPO)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.INFO, reqContent, callback, userData ctx, RequestType.INFO, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_debug( proc codex_debug(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = NodeDebugRequest.createShared(NodeDebugMsgType.DEBUG) let reqContent = NodeDebugRequest.createShared(NodeDebugMsgType.DEBUG)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.DEBUG, reqContent, callback, userData ctx, RequestType.DEBUG, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_spr( proc codex_spr(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = NodeInfoRequest.createShared(NodeInfoMsgType.SPR) let reqContent = NodeInfoRequest.createShared(NodeInfoMsgType.SPR)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.INFO, reqContent, callback, userData ctx, RequestType.INFO, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_peer_id( proc codex_peer_id(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = NodeInfoRequest.createShared(NodeInfoMsgType.PEERID) let reqContent = NodeInfoRequest.createShared(NodeInfoMsgType.PEERID)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.INFO, reqContent, callback, userData ctx, RequestType.INFO, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
## Set the log level of the library at runtime. ## Set the log level of the library at runtime.
## It uses updateLogLevel which is a synchronous proc and ## It uses updateLogLevel which is a synchronous proc and
@ -206,19 +176,14 @@ proc codex_peer_id(
proc codex_log_level( proc codex_log_level(
ctx: ptr CodexContext, logLevel: cstring, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, logLevel: cstring, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
try: try:
updateLogLevel($logLevel) updateLogLevel($logLevel)
except ValueError as e: except ValueError as e:
let msg = "Cannot set log level: " & $e.msg return callback.error(e.msg, userData)
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
callback(RET_OK, cast[ptr cchar](""), cast[csize_t](len("")), userData) return callback.success("", userData)
return RET_OK
proc codex_connect( proc codex_connect(
ctx: ptr CodexContext, ctx: ptr CodexContext,
@ -228,8 +193,7 @@ proc codex_connect(
callback: CodexCallback, callback: CodexCallback,
userData: pointer, userData: pointer,
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
var peerAddresses = newSeq[cstring](peerAddressesLength) var peerAddresses = newSeq[cstring](peerAddressesLength)
let peers = cast[ptr UncheckedArray[cstring]](peerAddressesPtr) let peers = cast[ptr UncheckedArray[cstring]](peerAddressesPtr)
@ -239,48 +203,34 @@ proc codex_connect(
let reqContent = NodeP2PRequest.createShared( let reqContent = NodeP2PRequest.createShared(
NodeP2PMsgType.CONNECT, peerId = peerId, peerAddresses = peerAddresses NodeP2PMsgType.CONNECT, peerId = peerId, peerAddresses = peerAddresses
) )
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.P2P, reqContent, callback, userData ctx, RequestType.P2P, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_peer_debug( proc codex_peer_debug(
ctx: ptr CodexContext, peerId: cstring, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, peerId: cstring, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = NodeDebugRequest.createShared(NodeDebugMsgType.PEER, peerId = peerId) let reqContent = NodeDebugRequest.createShared(NodeDebugMsgType.PEER, peerId = peerId)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.DEBUG, reqContent, callback, userData ctx, RequestType.DEBUG, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_destroy( proc codex_destroy(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
codex_context.destroyCodexContext(ctx).isOkOr: let res = codex_context.destroyCodexContext(ctx)
let msg = "libcodex error: " & $error if res.isErr:
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) return callback.error(res.error, userData)
return RET_ERR
## always need to invoke the callback although we don't retrieve value to the caller return callback.success("", userData)
callback(RET_OK, nil, 0, userData)
return RET_OK
proc codex_upload_init( proc codex_upload_init(
ctx: ptr CodexContext, ctx: ptr CodexContext,
@ -289,21 +239,16 @@ proc codex_upload_init(
callback: CodexCallback, callback: CodexCallback,
userData: pointer, userData: pointer,
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = NodeUploadRequest.createShared( let reqContent = NodeUploadRequest.createShared(
NodeUploadMsgType.INIT, mimetype = mimetype, filename = filename NodeUploadMsgType.INIT, mimetype = mimetype, filename = filename
) )
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.UPLOAD, reqContent, callback, userData ctx, RequestType.UPLOAD, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_upload_chunk( proc codex_upload_chunk(
ctx: ptr CodexContext, ctx: ptr CodexContext,
@ -313,8 +258,7 @@ proc codex_upload_chunk(
callback: CodexCallback, callback: CodexCallback,
userData: pointer, userData: pointer,
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let chunk = newSeq[byte](len) let chunk = newSeq[byte](len)
copyMem(addr chunk[0], data, len) copyMem(addr chunk[0], data, len)
@ -322,15 +266,11 @@ proc codex_upload_chunk(
let reqContent = NodeUploadRequest.createShared( let reqContent = NodeUploadRequest.createShared(
NodeUploadMsgType.CHUNK, sessionId = sessionId, chunk = chunk NodeUploadMsgType.CHUNK, sessionId = sessionId, chunk = chunk
) )
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.UPLOAD, reqContent, callback, userData ctx, RequestType.UPLOAD, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_upload_finalize( proc codex_upload_finalize(
ctx: ptr CodexContext, ctx: ptr CodexContext,
@ -338,20 +278,15 @@ proc codex_upload_finalize(
callback: CodexCallback, callback: CodexCallback,
userData: pointer, userData: pointer,
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = let reqContent =
NodeUploadRequest.createShared(NodeUploadMsgType.FINALIZE, sessionId = sessionId) NodeUploadRequest.createShared(NodeUploadMsgType.FINALIZE, sessionId = sessionId)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.UPLOAD, reqContent, callback, userData ctx, RequestType.UPLOAD, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_upload_cancel( proc codex_upload_cancel(
ctx: ptr CodexContext, ctx: ptr CodexContext,
@ -359,56 +294,42 @@ proc codex_upload_cancel(
callback: CodexCallback, callback: CodexCallback,
userData: pointer, userData: pointer,
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent = let reqContent =
NodeUploadRequest.createShared(NodeUploadMsgType.CANCEL, sessionId = sessionId) NodeUploadRequest.createShared(NodeUploadMsgType.CANCEL, sessionId = sessionId)
codex_context.sendRequestToCodexThread( let res = codex_context.sendRequestToCodexThread(
ctx, RequestType.UPLOAD, reqContent, callback, userData ctx, RequestType.UPLOAD, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_start( proc codex_start(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent: ptr NodeLifecycleRequest = let reqContent: ptr NodeLifecycleRequest =
NodeLifecycleRequest.createShared(NodeLifecycleMsgType.START_NODE) NodeLifecycleRequest.createShared(NodeLifecycleMsgType.START_NODE)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.LIFECYCLE, reqContent, callback, userData ctx, RequestType.LIFECYCLE, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_stop( proc codex_stop(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer
): cint {.dynlib, exportc.} = ): cint {.dynlib, exportc.} =
initializeLibrary() init(ctx, callback, userData)
checkLibcodexParams(ctx, callback, userData)
let reqContent: ptr NodeLifecycleRequest = let reqContent: ptr NodeLifecycleRequest =
NodeLifecycleRequest.createShared(NodeLifecycleMsgType.STOP_NODE) NodeLifecycleRequest.createShared(NodeLifecycleMsgType.STOP_NODE)
let res = codex_context.sendRequestToCodexThread(
codex_context.sendRequestToCodexThread(
ctx, RequestType.LIFECYCLE, reqContent, callback, userData ctx, RequestType.LIFECYCLE, reqContent, callback, userData
).isOkOr: )
let msg = "libcodex error: " & $error
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
return RET_ERR
return RET_OK return callback.okOrError(res, userData)
proc codex_set_event_callback( proc codex_set_event_callback(
ctx: ptr CodexContext, callback: CodexCallback, userData: pointer ctx: ptr CodexContext, callback: CodexCallback, userData: pointer