Skip to content
This repository was archived by the owner on Jun 19, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .hackcambridge/hc-post-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,14 @@ fi
echo "Completed database migration."
echo "--------------------"


# Migrate Database (force to skip confirmation prompt).
nohup php artisan websocket:init > websocket.log &
if [ $? -ne 0 ]; then
>&2 echo "Websockets start failed."
exit 1;
fi
echo "Completed websockets start."
echo "--------------------"

# Restart Apache.
sudo /opt/bitnami/ctlscript.sh restart apache
Expand Down
54 changes: 54 additions & 0 deletions app/Console/Commands/WebSocketServer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use App\Http\Controllers\WebSocket;

class WebSocketServer extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'websocket:init';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Initializing Websocket server to receive and manage connections';

/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$server = IoServer::factory(
new HttpServer(
new WsServer(
new WebSocket()
)
),
8080
);
$server->run();
}
}
87 changes: 87 additions & 0 deletions app/Http/Controllers/WebSocket.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

namespace App\Http\Controllers;

use App\Models\Application;
use Illuminate\Support\Facades\Auth;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class WebSocket extends Controller implements MessageComponentInterface
{

private $connections = [];

/**
* When a new connection is opened it will be passed to this method
* @param ConnectionInterface $conn The socket/connection that just connected to your application
* @throws \Exception
*/
function onOpen(ConnectionInterface $conn)
{
// $application = Application::where("user_id", "=", Auth::user()->id)->first();
// $application->checkin = 1;
// $application->save();
$this->connections[$conn->resourceId] = compact('conn') + ['user_id' => null];
error_log(var_dump($conn), 3, "/tmp/test_websocket");
}

/**
* This is called before or after a socket is closed (depends on how it's closed). SendMessage to $conn will not result in an error if it has already been closed.
* @param ConnectionInterface $conn The socket/connection that is closing/closed
* @throws \Exception
*/
function onClose(ConnectionInterface $conn)
{
$disconnectedId = $conn->resourceId;
unset($this->connections[$disconnectedId]);
// $application = Application::where("user_id", "=", Auth::user()->id)->first();
// $application->checkin = 1;
// $application->save();
error_log("Closed connection! ({$conn->resourceId})\n", 3, "/tmp/test_websocket");
}

/**
* If there is an error with one of the sockets, or somewhere in the application where an Exception is thrown,
* the Exception is sent back down the stack, handled by the Server and bubbled back up the application through this method
* @param ConnectionInterface $conn
* @param \Exception $e
* @throws \Exception
*/
function onError(ConnectionInterface $conn, \Exception $e)
{
$userId = $this->connections[$conn->resourceId]['user_id'];
echo "An error has occurred with user $userId: {$e->getMessage()}\n";
unset($this->connections[$conn->resourceId]);
$conn->close();
}

/**
* Triggered when a client sends data through the socket
* @param \Ratchet\ConnectionInterface $conn The socket/connection that sent the message to your application
* @param string $msg The message received
* @throws \Exception
*/
function onMessage(ConnectionInterface $conn, $msg)
{
if (is_null($this->connections[$conn->resourceId]['user_id'])) {
$this->connections[$conn->resourceId]['user_id'] = $msg;
$onlineUsers = [];
foreach ($this->connections as $resourceId => &$connection) {
// $connection['conn']->send(json_encode([$conn->resourceId => $msg]));
if ($conn->resourceId != $resourceId)
$onlineUsers[$resourceId] = $connection['user_id'];
}
$conn->send(json_encode(['online_users' => $onlineUsers]));
}
// else {
// $fromUserId = $this->connections[$conn->resourceId]['user_id'];
// $msg = json_decode($msg, true);
// $this->connections[$msg['to']]['conn']->send(json_encode([
// 'msg' => $msg['content'],
// 'from_user_id' => $fromUserId,
// 'from_resource_id' => $conn->resourceId
// ]));
// }
}
}
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"php": "^7.1.3",
"auth0/login": "~5.0",
"bogardo/mailgun": "^5.2",
"cboden/ratchet": "^0.4.3",
"doctrine/dbal": "^2.9",
"fideloper/proxy": "^4.0",
"guzzlehttp/guzzle": "^6.5",
Expand Down Expand Up @@ -65,4 +66,4 @@
"@php artisan key:generate --ansi"
]
}
}
}
Loading