Skip to content

Commit

Permalink
Provide ease-of-use record syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
JordanMartinez committed Jun 15, 2023
1 parent 3001639 commit 538db34
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 17 deletions.
25 changes: 22 additions & 3 deletions src/Node/Http2/Server.purs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Node.Http2.Server
( toTlsServer
, createSecureServer
, createSecureServer'
, checkContinueHandle
, requestHandle
, sessionHandle
Expand All @@ -22,21 +23,39 @@ import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, mkEffectFn2, mkEffec
import Node.EventEmitter (EventHandle(..))
import Node.EventEmitter.UtilTypes (EventHandle1, EventHandle2, EventHandle4, EventHandle0)
import Node.Http2.Types (Headers, Http2CreateSecureServerOptions, Http2SecureServer, Http2ServerRequest, Http2ServerResponse, Http2Session, Http2Stream, Settings)
import Node.Net.Types (NewServerOptions)
import Node.Net.Types as NetTypes
import Node.Net.Types (NewServerOptions, TCP)
import Node.Stream (Duplex)
import Node.TLS.Types (Server, TlsCreateServerOptions, TlsServer, CreateSecureContextOptions)
import Node.TLS.Server as TlsServer
import Node.TLS.Types (CreateSecureContextOptions, Server, TlsCreateServerOptions, TlsServer)
import Prim.Row as Row
import Unsafe.Coerce (unsafeCoerce)

toTlsServer :: Http2SecureServer -> TlsServer
toTlsServer = unsafeCoerce

-- | Same as `createSecureServer` but provides the value as each of its subclasses via record syntax
-- | for ease of use.
createSecureServer
:: forall rec trash
. Row.Union rec trash (Http2CreateSecureServerOptions (TlsCreateServerOptions Server (CreateSecureContextOptions (NewServerOptions ()))))
=> { | rec }
-> Effect { http2 :: Http2SecureServer, tls :: TlsServer, net :: NetTypes.Server TCP }
createSecureServer options = (runEffectFn1 createSecureServerImpl options) <#> \http2 -> do
let
tls = toTlsServer http2
net = TlsServer.toNetServer tls
{ http2
, tls
, net
}

createSecureServer'
:: forall rec trash
. Row.Union rec trash (Http2CreateSecureServerOptions (TlsCreateServerOptions Server (CreateSecureContextOptions (NewServerOptions ()))))
=> { | rec }
-> Effect Http2SecureServer
createSecureServer options = runEffectFn1 createSecureServerImpl options
createSecureServer' options = runEffectFn1 createSecureServerImpl options

foreign import createSecureServerImpl :: forall r. EffectFn1 { | r } (Http2SecureServer)

Expand Down
24 changes: 10 additions & 14 deletions test/Test/Main.purs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import Node.Http2.Types (Http2Session)
import Node.Net.Server as NServer
import Node.Path as Path
import Node.Stream as Stream
import Node.TLS.Server as TServer
import Unsafe.Coerce (unsafeCoerce)

unsafeToImmutableBuffer :: Buffer.Buffer -> Effect ImmutableBuffer
Expand All @@ -44,23 +43,20 @@ main = do
{ key: [ privateKey ]
, cert: [ cert ]
}
let
tlsServer = Server.toTlsServer server
netServer = TServer.toNetServer tlsServer
on Server.checkContinueHandle server \req res -> do
on Server.checkContinueHandle server.http2 \req res -> do
log "server - onCheckContinue"
on NServer.connectionHandle netServer \duplex -> do
on NServer.connectionHandle server.net \duplex -> do
log "server - onConnection"
on Server.sessionHandle server \session -> do
on Server.sessionHandle server.http2 \session -> do
log "server - onSession"
log "Testing properties for any thrown errors"
printHttp2SessionState session

on Server.sessionErrorHandle server \err session -> do
on Server.sessionErrorHandle server.http2 \err session -> do
log "server - onSessionError"
log (unsafeCoerce err)
printHttp2SessionState session
on Server.streamHandle server \stream headers flags rawHeaders -> do
on Server.streamHandle server.http2 \stream headers flags rawHeaders -> do
streamId <- H2Stream.id stream
log $ "server - onStream for id: " <> show streamId
forWithIndex_ (unsafeCoerce headers :: Object String) \k v ->
Expand All @@ -79,17 +75,17 @@ main = do
log $ "server - onStream - closing for id: " <> show streamId
H2Stream.close stream NGHTTP2.noError

on Server.timeoutHandle tlsServer do
on Server.timeoutHandle server.tls do
log "onTimeout"
on Server.unknownProtocolHandle server \duplex -> do
on Server.unknownProtocolHandle server.http2 \duplex -> do
log "onUnknownProtocol"
-- https://stackoverflow.com/a/63173619
-- "In UNIX-like systems, non-root users are unable to bind to ports lower than 1024."
let httpsPort = 8443
NServer.listenTcp netServer
NServer.listenTcp server.net
{ port: httpsPort
}
on NServer.listeningHandle netServer do
on NServer.listeningHandle server.net do
log "server listening"
session <- Client.connect' ("https://localhost:" <> show httpsPort)
{ ca: [ cert ]
Expand Down Expand Up @@ -119,7 +115,7 @@ main = do
log $ "client - onResponse body: " <> show str
H2Stream.close stream NGHTTP2.noError
Session.destroy session
NServer.close netServer
NServer.close server.net

printHttp2SessionState :: forall endpoint. Http2Session endpoint -> Effect Unit
printHttp2SessionState session = do
Expand Down

0 comments on commit 538db34

Please sign in to comment.