From 619781a4ad567b6def0add82e8a9fcf9cb48f83a Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 21 Oct 2020 13:50:11 +0300 Subject: [PATCH] Handle user & project channels --- app/init.php | 9 +++++---- app/realtime.php | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/app/init.php b/app/init.php index c6a578eba..7f5fe1e3d 100644 --- a/app/init.php +++ b/app/init.php @@ -380,10 +380,10 @@ App::setResource('user', function($mode, $project, $console, $request, $response $request->getHeader('x-appwrite-key', '')))); // Get API Key // Get fallback session from clients who block 3rd-party cookies - $response->addHeader('X-Debug-Fallback', 'false'); + if($response) $response->addHeader('X-Debug-Fallback', 'false'); if(empty($session['id']) && empty($session['secret'])) { - $response->addHeader('X-Debug-Fallback', 'true'); + if($response) $response->addHeader('X-Debug-Fallback', 'true'); $fallback = $request->getHeader('x-fallback-cookies', ''); $fallback = \json_decode($fallback, true); $session = Auth::decodeSession(((isset($fallback[Auth::$cookieName])) ? $fallback[Auth::$cookieName] : '')); @@ -397,7 +397,7 @@ App::setResource('user', function($mode, $project, $console, $request, $response } else { $user = $consoleDB->getDocument(Auth::$unique); - + $user ->setAttribute('$id', 'admin-'.$user->getAttribute('$id')) ; @@ -412,7 +412,8 @@ App::setResource('user', function($mode, $project, $console, $request, $response if (APP_MODE_ADMIN === $mode) { if (!empty($user->search('teamId', $project->getAttribute('teamId'), $user->getAttribute('memberships')))) { Authorization::setDefaultStatus(false); // Cancel security segmentation for admin users. - } else { + } + else { $user = new Document(['$id' => '', '$collection' => Database::SYSTEM_COLLECTION_USERS]); } } diff --git a/app/realtime.php b/app/realtime.php index cbe1da219..497d71a8e 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -1,7 +1,9 @@ on("workerStart", function ($server, $workerId) use (&$connections) { Console::success('Worker '.++$workerId.' started succefully'); @@ -71,7 +74,7 @@ $server->on("workerStart", function ($server, $workerId) use (&$connections) { SWOOLE_WEBSOCKET_FLAG_FIN | SWOOLE_WEBSOCKET_FLAG_COMPRESS); } else { - $server->close($fd); + $server->close($fd); } } }); @@ -106,11 +109,43 @@ $server->on('open', function(Server $server, Request $request) use (&$connection Console::info("Connection open (user: {$request->fd}, worker: {$server->getWorkerId()})"); Console::info('Total connections: '.count($connections)); + $connection = $request->fd; $app = new App('Asia/Tel_Aviv'); + $request = new SwooleRequest($request); - var_dump($app->getResource('user')); + App::setResource('request', function () use ($request) { + return $request; + }); - $server->push($request->fd, json_encode(["hello", count($connections)])); + App::setResource('response', function () { + return null; + }); + + $user = App::getResource('user'); + $project = App::getResource('project'); + + /** @var Appwrite\Database\Document $user */ + /** @var Appwrite\Database\Document $project */ + + var_dump($project->getId()); + var_dump($project->getAttribute('name')); + var_dump($user->getId()); + var_dump($user->getAttribute('name')); + + if(!isset($subscriptions[$project->getId()])) { // Init Project + $subscriptions[$project->getId()] = []; + } + + if(isset($subscriptions[$project->getId()][$user->getId()])) { // Close previous connection + $server->close($subscriptions[$project->getId()][$user->getId()]['connection']); + } + + $subscriptions[$project->getId()][$user->getId()] = [ + 'channels' => [], + 'connection' => $connection, + ]; + + $server->push($connection, json_encode(["hello", count($connections)])); }); $server->on('message', function(Server $server, Frame $frame) {