Skip to content

Commit 538db34

Browse files
Provide ease-of-use record syntax
1 parent 3001639 commit 538db34

File tree

2 files changed

+32
-17
lines changed

2 files changed

+32
-17
lines changed

src/Node/Http2/Server.purs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Node.Http2.Server
22
( toTlsServer
33
, createSecureServer
4+
, createSecureServer'
45
, checkContinueHandle
56
, requestHandle
67
, sessionHandle
@@ -22,21 +23,39 @@ import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, mkEffectFn2, mkEffec
2223
import Node.EventEmitter (EventHandle(..))
2324
import Node.EventEmitter.UtilTypes (EventHandle1, EventHandle2, EventHandle4, EventHandle0)
2425
import Node.Http2.Types (Headers, Http2CreateSecureServerOptions, Http2SecureServer, Http2ServerRequest, Http2ServerResponse, Http2Session, Http2Stream, Settings)
25-
import Node.Net.Types (NewServerOptions)
26+
import Node.Net.Types as NetTypes
27+
import Node.Net.Types (NewServerOptions, TCP)
2628
import Node.Stream (Duplex)
27-
import Node.TLS.Types (Server, TlsCreateServerOptions, TlsServer, CreateSecureContextOptions)
29+
import Node.TLS.Server as TlsServer
30+
import Node.TLS.Types (CreateSecureContextOptions, Server, TlsCreateServerOptions, TlsServer)
2831
import Prim.Row as Row
2932
import Unsafe.Coerce (unsafeCoerce)
3033

3134
toTlsServer :: Http2SecureServer -> TlsServer
3235
toTlsServer = unsafeCoerce
3336

37+
-- | Same as `createSecureServer` but provides the value as each of its subclasses via record syntax
38+
-- | for ease of use.
3439
createSecureServer
40+
:: forall rec trash
41+
. Row.Union rec trash (Http2CreateSecureServerOptions (TlsCreateServerOptions Server (CreateSecureContextOptions (NewServerOptions ()))))
42+
=> { | rec }
43+
-> Effect { http2 :: Http2SecureServer, tls :: TlsServer, net :: NetTypes.Server TCP }
44+
createSecureServer options = (runEffectFn1 createSecureServerImpl options) <#> \http2 -> do
45+
let
46+
tls = toTlsServer http2
47+
net = TlsServer.toNetServer tls
48+
{ http2
49+
, tls
50+
, net
51+
}
52+
53+
createSecureServer'
3554
:: forall rec trash
3655
. Row.Union rec trash (Http2CreateSecureServerOptions (TlsCreateServerOptions Server (CreateSecureContextOptions (NewServerOptions ()))))
3756
=> { | rec }
3857
-> Effect Http2SecureServer
39-
createSecureServer options = runEffectFn1 createSecureServerImpl options
58+
createSecureServer' options = runEffectFn1 createSecureServerImpl options
4059

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

test/Test/Main.purs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import Node.Http2.Types (Http2Session)
2424
import Node.Net.Server as NServer
2525
import Node.Path as Path
2626
import Node.Stream as Stream
27-
import Node.TLS.Server as TServer
2827
import Unsafe.Coerce (unsafeCoerce)
2928

3029
unsafeToImmutableBuffer :: Buffer.Buffer -> Effect ImmutableBuffer
@@ -44,23 +43,20 @@ main = do
4443
{ key: [ privateKey ]
4544
, cert: [ cert ]
4645
}
47-
let
48-
tlsServer = Server.toTlsServer server
49-
netServer = TServer.toNetServer tlsServer
50-
on Server.checkContinueHandle server \req res -> do
46+
on Server.checkContinueHandle server.http2 \req res -> do
5147
log "server - onCheckContinue"
52-
on NServer.connectionHandle netServer \duplex -> do
48+
on NServer.connectionHandle server.net \duplex -> do
5349
log "server - onConnection"
54-
on Server.sessionHandle server \session -> do
50+
on Server.sessionHandle server.http2 \session -> do
5551
log "server - onSession"
5652
log "Testing properties for any thrown errors"
5753
printHttp2SessionState session
5854

59-
on Server.sessionErrorHandle server \err session -> do
55+
on Server.sessionErrorHandle server.http2 \err session -> do
6056
log "server - onSessionError"
6157
log (unsafeCoerce err)
6258
printHttp2SessionState session
63-
on Server.streamHandle server \stream headers flags rawHeaders -> do
59+
on Server.streamHandle server.http2 \stream headers flags rawHeaders -> do
6460
streamId <- H2Stream.id stream
6561
log $ "server - onStream for id: " <> show streamId
6662
forWithIndex_ (unsafeCoerce headers :: Object String) \k v ->
@@ -79,17 +75,17 @@ main = do
7975
log $ "server - onStream - closing for id: " <> show streamId
8076
H2Stream.close stream NGHTTP2.noError
8177

82-
on Server.timeoutHandle tlsServer do
78+
on Server.timeoutHandle server.tls do
8379
log "onTimeout"
84-
on Server.unknownProtocolHandle server \duplex -> do
80+
on Server.unknownProtocolHandle server.http2 \duplex -> do
8581
log "onUnknownProtocol"
8682
-- https://stackoverflow.com/a/63173619
8783
-- "In UNIX-like systems, non-root users are unable to bind to ports lower than 1024."
8884
let httpsPort = 8443
89-
NServer.listenTcp netServer
85+
NServer.listenTcp server.net
9086
{ port: httpsPort
9187
}
92-
on NServer.listeningHandle netServer do
88+
on NServer.listeningHandle server.net do
9389
log "server listening"
9490
session <- Client.connect' ("https://localhost:" <> show httpsPort)
9591
{ ca: [ cert ]
@@ -119,7 +115,7 @@ main = do
119115
log $ "client - onResponse body: " <> show str
120116
H2Stream.close stream NGHTTP2.noError
121117
Session.destroy session
122-
NServer.close netServer
118+
NServer.close server.net
123119

124120
printHttp2SessionState :: forall endpoint. Http2Session endpoint -> Effect Unit
125121
printHttp2SessionState session = do

0 commit comments

Comments
 (0)