5
5
use Exception ;
6
6
use Swoole \Websocket \Frame ;
7
7
use Swoole \Websocket \Server ;
8
+ use Illuminate \Pipeline \Pipeline ;
8
9
use SwooleTW \Http \Server \Request ;
9
10
use SwooleTW \Http \Websocket \Parser ;
11
+ use Illuminate \Support \Facades \Facade ;
10
12
use SwooleTW \Http \Websocket \Websocket ;
11
13
use SwooleTW \Http \Websocket \HandlerContract ;
12
14
use SwooleTW \Http \Websocket \Rooms \RoomContract ;
@@ -57,12 +59,13 @@ public function onOpen(Server $server, $swooleRequest)
57
59
58
60
try {
59
61
// check if socket.io connection established
60
- if ($ this ->websocketHandler ->onOpen ($ swooleRequest ->fd , $ illuminateRequest )) {
61
- $ this ->websocket ->reset (true )->setSender ($ swooleRequest ->fd );
62
- // trigger 'connect' websocket event
63
- if ($ this ->websocket ->eventExists ('connect ' )) {
64
- $ this ->websocket ->call ('connect ' , $ illuminateRequest );
65
- }
62
+ if (! $ this ->websocketHandler ->onOpen ($ swooleRequest ->fd , $ illuminateRequest )) {
63
+ return ;
64
+ }
65
+ $ this ->websocket ->reset (true )->setSender ($ swooleRequest ->fd );
66
+ // trigger 'connect' websocket event
67
+ if ($ this ->websocket ->eventExists ('connect ' )) {
68
+ $ this ->callOnConnect ($ illuminateRequest );
66
69
}
67
70
} catch (Exception $ e ) {
68
71
$ this ->logServerError ($ e );
@@ -80,16 +83,17 @@ public function onMessage(Server $server, Frame $frame)
80
83
$ data = $ frame ->data ;
81
84
82
85
try {
83
- $ skip = $ this ->parser ->execute ($ server , $ frame );
84
-
85
- if ($ skip ) {
86
+ // execute parser strategies and skip non-message packet
87
+ if ($ this ->parser ->execute ($ server , $ frame )) {
86
88
return ;
87
89
}
88
90
91
+ // decode raw message via parser
89
92
$ payload = $ this ->parser ->decode ($ frame );
90
93
91
94
$ this ->websocket ->reset (true )->setSender ($ frame ->fd );
92
95
96
+ // dispatch message to registered event callback
93
97
if ($ this ->websocket ->eventExists ($ payload ['event ' ])) {
94
98
$ this ->websocket ->call ($ payload ['event ' ], $ payload ['data ' ]);
95
99
} else {
@@ -241,7 +245,7 @@ protected function bindRoom()
241
245
protected function bindWebsocket ()
242
246
{
243
247
$ this ->app ->singleton (Websocket::class, function ($ app ) {
244
- return $ this ->websocket = new Websocket ($ app ['swoole.room ' ]);
248
+ return $ this ->websocket = new Websocket ($ app ['swoole.room ' ], new Pipeline );
245
249
});
246
250
$ this ->app ->alias (Websocket::class, 'swoole.websocket ' );
247
251
}
@@ -275,4 +279,27 @@ protected function normalizePushData(array $data)
275
279
276
280
return [$ opcode , $ sender , $ fds , $ broadcast , $ assigned , $ event , $ message ];
277
281
}
282
+
283
+ /**
284
+ * Call on connect event callback .
285
+ */
286
+ protected function callOnConnect ($ illuminateRequest )
287
+ {
288
+ $ application = $ this ->sandbox ->getLaravelApp ();
289
+
290
+ // bind illuminate request to laravel/lumen
291
+ $ application ->instance ('request ' , $ illuminateRequest );
292
+ Facade::clearResolvedInstance ('request ' );
293
+
294
+ // reset session
295
+ if (isset ($ application ['session ' ])) {
296
+ $ application ['session ' ]->flush ();
297
+ }
298
+
299
+ // set sandbox container to websocket pipeline
300
+ $ this ->websocket ->setContainer ($ application );
301
+ $ this ->sandbox ->enable ();
302
+ $ this ->websocket ->call ('connect ' , $ illuminateRequest );
303
+ $ this ->sandbox ->disable ();
304
+ }
278
305
}
0 commit comments