6
6
7
7
use Amp \Future ;
8
8
use Amp \Http \Server \Driver \HttpDriver ;
9
- use Amp \Http \Server \HttpErrorException ;
10
- use Amp \Http \Server \Request ;
11
- use Amp \Http \Server \RequestHandler \ClosureRequestHandler ;
12
- use Amp \Http \Server \Response ;
9
+ use Amp \Http \Server \RequestHandler ;
13
10
use Luzrain \PHPStreamServer \Internal \MasterProcess ;
14
11
use Luzrain \PHPStreamServer \Plugin \PluginInterface ;
15
12
use Luzrain \PHPStreamServer \WorkerProcess ;
16
13
use function Amp \async ;
17
14
18
15
final readonly class HttpServer implements PluginInterface
19
16
{
17
+ /**
18
+ * @param Listen|string|array<Listen> $listen
19
+ * @param \Closure(WorkerProcess): RequestHandler $onStart
20
+ */
20
21
public function __construct (
21
- private Listen |array $ listen ,
22
+ private Listen |string |array $ listen ,
23
+ private \Closure $ onStart ,
22
24
private string $ name = 'HTTP Server ' ,
23
25
private int $ count = 1 ,
24
26
private bool $ reloadable = true ,
@@ -44,16 +46,18 @@ public function start(MasterProcess $masterProcess): void
44
46
user: $ this ->user ,
45
47
group: $ this ->group ,
46
48
onStart: function (WorkerProcess $ worker ) {
47
- $ requestHandler = new ClosureRequestHandler (function (Request $ request ) : Response {
48
- return match ($ request ->getUri ()->getPath ()) {
49
- '/ ' => new Response (body: 'Hello world1 ' ),
50
- '/ping ' => new Response (body: 'pong2 ' ),
51
- default => throw new HttpErrorException (404 ),
52
- };
53
- });
49
+ $ requestHandler = ($ this ->onStart )($ worker );
50
+
51
+ if (!$ requestHandler instanceof RequestHandler) {
52
+ throw new \RuntimeException (sprintf (
53
+ 'onStart() closure: Return value must be of type %s, %s returned ' ,
54
+ RequestHandler::class,
55
+ \get_debug_type ($ requestHandler )),
56
+ );
57
+ }
54
58
55
59
$ worker ->startWorkerModule (new HttpServerModule (
56
- listen: $ this ->listen ,
60
+ listen: self :: createListenList ( $ this ->listen ) ,
57
61
requestHandler: $ requestHandler ,
58
62
middleware: $ this ->middleware ,
59
63
connectionLimit: $ this ->connectionLimit ,
@@ -72,4 +76,24 @@ public function stop(): Future
72
76
{
73
77
return async (static fn () => null );
74
78
}
79
+
80
+ /**
81
+ * @return list<Listen>
82
+ */
83
+ public static function createListenList (self |string |array $ listen ): array
84
+ {
85
+ $ listen = \is_array ($ listen ) ? $ listen : [$ listen ];
86
+ $ ret = [];
87
+ foreach ($ listen as $ listenItem ) {
88
+ if ($ listenItem instanceof Listen) {
89
+ $ ret [] = $ listenItem ;
90
+ } elseif (\is_string ($ listenItem )) {
91
+ $ ret [] = new Listen ($ listenItem );
92
+ } else {
93
+ throw new \InvalidArgumentException ('Invalid listen ' );
94
+ }
95
+ }
96
+
97
+ return $ ret ;
98
+ }
75
99
}
0 commit comments