-
Notifications
You must be signed in to change notification settings - Fork 55
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add support for setting protocol handlers with {.raises.}
annotation
#1064
Changes from 3 commits
14fee3b
417922c
302359b
69f18ec
843fb45
967c40c
71dbcef
3af3aa5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,5 +1,5 @@ | ||||||||||||||
# Nim-LibP2P | ||||||||||||||
# Copyright (c) 2023 Status Research & Development GmbH | ||||||||||||||
# Copyright (c) 2023-2024 Status Research & Development GmbH | ||||||||||||||
# Licensed under either of | ||||||||||||||
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) | ||||||||||||||
# * MIT license ([LICENSE-MIT](LICENSE-MIT)) | ||||||||||||||
|
@@ -19,14 +19,16 @@ const | |||||||||||||
|
||||||||||||||
type | ||||||||||||||
LPProtoHandler* = proc ( | ||||||||||||||
conn: Connection, | ||||||||||||||
proto: string): | ||||||||||||||
Future[void] | ||||||||||||||
{.gcsafe, raises: [].} | ||||||||||||||
conn: Connection, | ||||||||||||||
proto: string): Future[void] {.async.} | ||||||||||||||
|
||||||||||||||
LPProtoHandler2*[E] = proc ( | ||||||||||||||
conn: Connection, | ||||||||||||||
proto: string): InternalRaisesFuture[void, E] | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
this does not work? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nope, not on the proc, only on the result |
||||||||||||||
|
||||||||||||||
LPProtocol* = ref object of RootObj | ||||||||||||||
codecs*: seq[string] | ||||||||||||||
handler*: LPProtoHandler ## this handler gets invoked by the protocol negotiator | ||||||||||||||
handlerImpl: LPProtoHandler ## invoked by the protocol negotiator | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this rename breaks There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, that's what I mentioned above. It has to be renamed otherwise There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. breaks nimbus-eth2 though There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 1 liner to fix |
||||||||||||||
started*: bool | ||||||||||||||
maxIncomingStreams: Opt[int] | ||||||||||||||
|
||||||||||||||
|
@@ -41,23 +43,47 @@ proc `maxIncomingStreams=`*(p: LPProtocol, val: int) = | |||||||||||||
p.maxIncomingStreams = Opt.some(val) | ||||||||||||||
|
||||||||||||||
func codec*(p: LPProtocol): string = | ||||||||||||||
assert(p.codecs.len > 0, "Codecs sequence was empty!") | ||||||||||||||
doAssert(p.codecs.len > 0, "Codecs sequence was empty!") | ||||||||||||||
p.codecs[0] | ||||||||||||||
|
||||||||||||||
func `codec=`*(p: LPProtocol, codec: string) = | ||||||||||||||
# always insert as first codec | ||||||||||||||
# if we use this abstraction | ||||||||||||||
p.codecs.insert(codec, 0) | ||||||||||||||
|
||||||||||||||
template `handler`*(p: LPProtocol): LPProtoHandler = | ||||||||||||||
p.handlerImpl | ||||||||||||||
|
||||||||||||||
template `handler`*( | ||||||||||||||
p: LPProtocol, conn: Connection, proto: string): Future[void] = | ||||||||||||||
p.handlerImpl(conn, proto) | ||||||||||||||
|
||||||||||||||
func `handler=`*(p: LPProtocol, handler: LPProtoHandler) = | ||||||||||||||
p.handlerImpl = handler | ||||||||||||||
|
||||||||||||||
func `handler=`*(p: LPProtocol, handler: LPProtoHandler2) = | ||||||||||||||
proc wrap(conn: Connection, proto: string): Future[void] {.async.} = | ||||||||||||||
await handler(conn, proto) | ||||||||||||||
p.handlerImpl = wrap | ||||||||||||||
|
||||||||||||||
proc new*( | ||||||||||||||
T: type LPProtocol, | ||||||||||||||
codecs: seq[string], | ||||||||||||||
handler: LPProtoHandler, | ||||||||||||||
maxIncomingStreams: Opt[int] | int = Opt.none(int)): T = | ||||||||||||||
T: type LPProtocol, | ||||||||||||||
codecs: seq[string], | ||||||||||||||
handler: LPProtoHandler, | ||||||||||||||
maxIncomingStreams: Opt[int] | int = Opt.none(int)): T = | ||||||||||||||
T( | ||||||||||||||
codecs: codecs, | ||||||||||||||
handler: handler, | ||||||||||||||
handlerImpl: handler, | ||||||||||||||
maxIncomingStreams: | ||||||||||||||
when maxIncomingStreams is int: Opt.some(maxIncomingStreams) | ||||||||||||||
else: maxIncomingStreams | ||||||||||||||
) | ||||||||||||||
|
||||||||||||||
proc new*( | ||||||||||||||
T: type LPProtocol, | ||||||||||||||
codecs: seq[string], | ||||||||||||||
handler: LPProtoHandler2, | ||||||||||||||
maxIncomingStreams: Opt[int] | int = Opt.none(int)): T = | ||||||||||||||
proc wrap(conn: Connection, proto: string): Future[void] {.async.} = | ||||||||||||||
await handler(conn, proto) | ||||||||||||||
T.new(codec, wrap, maxIncomingStreams) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
does
lp2[E] = proc ...: Future[void].Raising(E)
work?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the
handler=
implementation worked for me.I tested it by changing
protocols/connectivity/relay/client.nim
toand
NIMFLAGS="--mm:refc" nimble test
still worked fine (refc because on orc it segfaults in metrics unrelated).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no, I mean you don't need to expose
InternalRaisesFuture
here (we can avoid it here too probably: #1050 (comment)):There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the
proc
takes parameters and is passed around, hose parts would have to be continuously repeated. putting the[E]
directly on theproc
doesn't work, only the result type can be done that way.Exposing
InternalRaisesFuture
in a single place seems like the lesser evil to me, it's trivial to adjust if necessaryThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMO adding any
*2
to the codebase isn't a good software engineering practice as it isn't sufficiently descriptive. Also, why is anIneternal*
type from another project referenced here?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The most used and popular api on earth does this, more or less: https://learn.microsoft.com/en-us/windows/win32/api/winver/nf-winver-getfileversioninfoexa (though they call it
Ex
instead of2
)I understand your concern, but sometimes, there just isn't any good naming solution and indeed, a comment might be the best option.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
They also have
Ex2
: https://learn.microsoft.com/en-us/windows/win32/api/vds/nf-vds-ivdsvolumemf3-formatex2There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
with a cherry on top for 3 in the interface name ;) in fact, com interfaces / all of .NET often versions itself this way
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I knew I'd regret the comment, but never worked with MS tho.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So .. thinking a bit more about this, the answer is actually simple: we can remove
LPProtocolHandler
/LPProtoHandler2
altogether and just useFuture[...].Raising(E)
explicitly in the wrapper, which ensures user code is not polluted with a name that we don't necessarily want to support.This makes sense also because there as limitations to how you can use aliases together with `` ie
var f: LPProtocolHandler[[ValueError]]
doesn't work because of macro instantiation order issues.