@@ -44,11 +44,23 @@ func optionToOpt[T](o: Option[T]): Opt[T] =
44
44
else :
45
45
Opt .none (T)
46
46
47
- proc run (
48
- config: PortalConf
49
- ): (PortalNode , Opt [MetricsHttpServerRef ], Opt [RpcHttpServer ], Opt [RpcWebSocketServer ]) {.
50
- raises : [CatchableError ]
51
- .} =
47
+ type
48
+ FluffyStatus = enum
49
+ Starting
50
+ Running
51
+ Stopping
52
+
53
+ Fluffy = ref object
54
+ status: FluffyStatus
55
+ portalNode: PortalNode
56
+ metricsServer: Opt [MetricsHttpServerRef ]
57
+ rpcHttpServer: Opt [RpcHttpServer ]
58
+ rpcWsServer: Opt [RpcWebSocketServer ]
59
+
60
+ proc init (T: type Fluffy ): T =
61
+ Fluffy (status: FluffyStatus .Starting )
62
+
63
+ proc run (fluffy: Fluffy , config: PortalConf ) {.raises : [CatchableError ].} =
52
64
setupLogging (config.logLevel, config.logStdout, none (OutFile ))
53
65
54
66
notice " Launching Fluffy" , version = fullVersionStr, cmdParams = commandLineParams ()
@@ -110,7 +122,7 @@ proc run(
110
122
else :
111
123
Opt .none (enr.Record )
112
124
113
- var bootstrapRecords: seq [Record ]
125
+ var bootstrapRecords: seq [enr. Record ]
114
126
loadBootstrapFile (string config.bootstrapNodesFile, bootstrapRecords)
115
127
bootstrapRecords.add (config.bootstrapNodes)
116
128
@@ -320,7 +332,38 @@ proc run(
320
332
else :
321
333
Opt .none (RpcWebSocketServer )
322
334
323
- return (node, metricsServer, rpcHttpServer, rpcWsServer)
335
+ fluffy.status = FluffyStatus .Running
336
+ fluffy.portalNode = node
337
+ fluffy.metricsServer = metricsServer
338
+ fluffy.rpcHttpServer = rpcHttpServer
339
+ fluffy.rpcWsServer = rpcWsServer
340
+
341
+ proc stop (f: Fluffy ) {.async : (raises: []).} =
342
+ if f.rpcWsServer.isSome ():
343
+ let server = f.rpcWsServer.get ()
344
+ try :
345
+ server.stop ()
346
+ await server.closeWait ()
347
+ except CatchableError as e:
348
+ warn " Failed to stop rpc WS server" , exc = e.name, err = e.msg
349
+
350
+ if f.rpcHttpServer.isSome ():
351
+ let server = f.rpcHttpServer.get ()
352
+ try :
353
+ await server.stop ()
354
+ await server.closeWait ()
355
+ except CatchableError as e:
356
+ warn " Failed to stop rpc HTTP server" , exc = e.name, err = e.msg
357
+
358
+ if f.metricsServer.isSome ():
359
+ let server = f.metricsServer.get ()
360
+ try :
361
+ await server.stop ()
362
+ await server.close ()
363
+ except CatchableError as e:
364
+ warn " Failed to stop metrics HTTP server" , exc = e.name, err = e.msg
365
+
366
+ await f.portalNode.stop ()
324
367
325
368
when isMainModule :
326
369
{.pop .}
@@ -330,10 +373,10 @@ when isMainModule:
330
373
)
331
374
{.push raises : [].}
332
375
333
- let (node, metricsServer, rpcHttpServer, rpcWsServer) =
334
- case config.cmd
335
- of PortalCmd .noCommand:
336
- run (config)
376
+ let fluffy = Fluffy . init ()
377
+ case config.cmd
378
+ of PortalCmd .noCommand:
379
+ fluffy. run (config)
337
380
338
381
# Ctrl+C handling
339
382
proc controlCHandler () {.noconv .} =
@@ -345,41 +388,17 @@ when isMainModule:
345
388
raiseAssert exc.msg # shouldn't happen
346
389
347
390
notice " Shutting down after having received SIGINT"
348
- node .status = PortalNodeStatus .Stopping
391
+ fluffy .status = FluffyStatus .Stopping
349
392
350
393
try :
351
394
setControlCHook (controlCHandler)
352
395
except Exception as exc: # TODO Exception
353
396
warn " Cannot set ctrl-c handler" , msg = exc.msg
354
397
355
- while node .status == PortalNodeStatus .Running :
398
+ while fluffy .status == FluffyStatus .Running :
356
399
try :
357
400
poll ()
358
401
except CatchableError as e:
359
402
warn " Exception in poll()" , exc = e.name, err = e.msg
360
403
361
- if rpcWsServer.isSome ():
362
- let server = rpcWsServer.get ()
363
- try :
364
- server.stop ()
365
- waitFor server.closeWait ()
366
- except CatchableError as e:
367
- warn " Failed to stop rpc WS server" , exc = e.name, err = e.msg
368
-
369
- if rpcHttpServer.isSome ():
370
- let server = rpcHttpServer.get ()
371
- try :
372
- waitFor server.stop ()
373
- waitFor server.closeWait ()
374
- except CatchableError as e:
375
- warn " Failed to stop rpc HTTP server" , exc = e.name, err = e.msg
376
-
377
- if metricsServer.isSome ():
378
- let server = metricsServer.get ()
379
- try :
380
- waitFor server.stop ()
381
- waitFor server.close ()
382
- except CatchableError as e:
383
- warn " Failed to stop metrics HTTP server" , exc = e.name, err = e.msg
384
-
385
- waitFor node.stop ()
404
+ waitFor fluffy.stop ()
0 commit comments