-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathws-server.php
More file actions
95 lines (80 loc) · 2.71 KB
/
ws-server.php
File metadata and controls
95 lines (80 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
require __DIR__ . '/vendor/autoload.php';
use Conveyor\SocketHandlers\SocketChannelPersistenceTable;
use Conveyor\SocketHandlers\SocketListenerPersistenceTable;
use Conveyor\SocketHandlers\SocketMessageRouter;
use League\Plates\Engine;
use MyApp\Actions\ClosedConnectionAction;
use MyApp\Actions\NewConnectionAction;
use MyApp\Actions\SecondaryBroadcastAction;
use MyApp\Actions\WelcomeAction;
use Swoole\Http\Response;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
// -----------------------------------------------
// Dependencies
// -----------------------------------------------
$persistence = [
new SocketChannelPersistenceTable,
new SocketListenerPersistenceTable,
];
// -----------------------------------------------
// Helpers
// -----------------------------------------------
function processMessage(
string $data,
int $fd,
Server $server,
array $persistence
) {
$socketRouter = new SocketMessageRouter($persistence);
$socketRouter->add(new WelcomeAction);
$socketRouter->add(new SecondaryBroadcastAction);
$socketRouter->add(new NewConnectionAction);
$socketRouter->add(new ClosedConnectionAction);
$socketRouter($data, $fd, $server);
}
$server = new Server('0.0.0.0', 8585);
$server->on("start", function (Server $server) {
echo 'Websocket server started at http://127.0.0.1:' . $server->port . PHP_EOL;
});
$server->on('open', function (Server $server, Request $request) use ($persistence) {
echo 'Connection opened: ' . $request->fd . PHP_EOL;
processMessage(
json_encode(['action' => WelcomeAction::ACTION_NAME, 'data' => '']),
$request->fd,
$server,
$persistence
);
processMessage(
json_encode(['action' => NewConnectionAction::ACTION_NAME]),
$request->fd,
$server,
$persistence
);
});
$server->on('message', function (Server $server, Frame $frame) use ($persistence) {
echo 'Received message: ' . $frame->data . PHP_EOL;
processMessage($frame->data, $frame->fd, $server, $persistence);
});
$server->on('request', function (Request $request, Response $response) {
$templates = new Engine(__DIR__ . '/views');
$response->header("Content-Type", "text/html");
$response->end($templates->render('home'));
});
$server->on('close', function (Server $server, int $fd) use ($persistence) {
var_dump('closing connection...' . $fd);
processMessage(
json_encode(['action' => ClosedConnectionAction::ACTION_NAME]),
$fd,
$server,
$persistence
);
});
$server->set([
'document_root' => __DIR__ . '/public',
'enable_static_handler' => true,
'static_handler_locations' => ['/js'],
]);
$server->start();