diff --git a/bin/quickstart.sh b/bin/quickstart.sh index 9ae8a9f3..36293e1c 100755 --- a/bin/quickstart.sh +++ b/bin/quickstart.sh @@ -1,83 +1,83 @@ #!/bin/bash set -e function die() { echo "$1" exit 1 } rpm -qv composer >/dev/null 2>&1 || \ test ! -z "$(which composer 2>/dev/null)" || \ die "Is composer installed?" rpm -qv docker-compose >/dev/null 2>&1 || \ test ! -z "$(which docker-compose 2>/dev/null)" || \ die "Is docker-compose installed?" rpm -qv npm >/dev/null 2>&1 || \ test ! -z "$(which npm 2>/dev/null)" || \ die "Is npm installed?" rpm -qv php >/dev/null 2>&1 || \ test ! -z "$(which php 2>/dev/null)" || \ die "Is php installed?" rpm -qv php-ldap >/dev/null 2>&1 || \ test ! -z "$(php --ini | grep ldap)" || \ die "Is php-ldap installed?" rpm -qv php-mysqlnd >/dev/null 2>&1 || \ test ! -z "$(php --ini | grep mysql)" || \ die "Is php-mysqlnd installed?" base_dir=$(dirname $(dirname $0)) bin/regen-certs docker pull kolab/centos7:latest docker-compose down docker-compose build docker-compose up -d kolab mariadb redis pushd ${base_dir}/src/ cp .env.example .env if [ -f ".env.local" ]; then # Ensure there's a line ending echo "" >> .env cat .env.local >> .env fi rm -rf vendor/ composer.lock php -dmemory_limit=-1 /bin/composer install npm install find bootstrap/cache/ -type f ! -name ".gitignore" -delete ./artisan key:generate ./artisan jwt:secret -f ./artisan clear-compiled ./artisan cache:clear if [ ! -z "$(rpm -qv chromium 2>/dev/null)" ]; then chver=$(rpmquery --queryformat="%{VERSION}" chromium | awk -F'.' '{print $1}') ./artisan dusk:chrome-driver ${chver} fi if [ ! -f 'resources/countries.php' ]; then ./artisan data:countries fi npm run dev popd docker-compose up -d worker pushd ${base_dir}/src/ rm -rf database/database.sqlite ./artisan db:ping --wait php -dmemory_limit=512M ./artisan migrate:refresh --seed -./artisan serve +./artisan swoole:http start popd diff --git a/docker/swoole/Dockerfile b/docker/swoole/Dockerfile new file mode 100644 index 00000000..a2a0f3b1 --- /dev/null +++ b/docker/swoole/Dockerfile @@ -0,0 +1,67 @@ +FROM fedora:31 + +MAINTAINER Jeroen van Meeuwen + +LABEL io.k8s.description="Platform for serving PHP applications under Swoole" \ + io.k8s.display-name="Swoole 4.4.x" \ + io.openshift.expose-services="8000:http" \ + io.openshift.tags="builder,php,swoole" + +ENV SWOOLE_VERSION=4.4.x \ + HOME=/opt/app-root/src + +RUN dnf -y install \ + composer \ + diffutils \ + file \ + git \ + make \ + npm \ + openssl-devel \ + php-cli \ + php-common \ + php-devel \ + php-ldap \ + php-opcache \ + php-pecl-apcu \ + php-mysqlnd \ + re2c && \ + git clone -b v4.4.x https://github.com/swoole/swoole-src.git/ /swoole-src.git/ && \ + cd /swoole-src.git/ && \ + git clean -d -f -x && \ + phpize --clean && \ + phpize && \ + ./configure \ + --enable-sockets \ + --disable-mysqlnd \ + --enable-http2 \ + --enable-openssl \ + --enable-debug \ + --enable-debug-log \ + --enable-trace-log && \ + make -j4 && \ + make install && \ + cd / && \ + rm -rf /swoole-src.git/ && \ + dnf -y remove \ + diffutils \ + file \ + make \ + openssl-devel \ + php-devel \ + re2c && \ + dnf clean all && \ + echo "extension=swoole.so" >> /etc/php.d/swoole.ini && \ + php -m 2>&1 | grep -q swoole + +RUN id default || (groupadd -g 1001 default && useradd -d /opt/app-root/ -u 1001 -g 1001 default) + +USER 1001 + +WORKDIR ${HOME} + +COPY /rootfs / + +EXPOSE 8000 + +CMD [ "/usr/local/bin/usage" ] diff --git a/docker/swoole/do-it-again.sh b/docker/swoole/do-it-again.sh new file mode 100755 index 00000000..46892d1b --- /dev/null +++ b/docker/swoole/do-it-again.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +export APP_DEBUG="true" +export APP_KEY= +export APP_PUBLIC_URL=http://127.0.0.1:8000/ +export APP_SRC=src/ +export APP_URL=http://127.0.0.1:8000/ +export CACHE_DRIVER="array" +export COMPOSER_ARGS="--no-dev" +export DB_CONNECTION="sqlite" +export DB_DATABASE=":memory:" +export GIT_URI=https://git.kolab.org/source/kolab.git +export LARAVEL_ENV=production +export LOG_CHANNEL="stderr" +export MAIL_DRIVER="array" +export QUEUE_CONNECTION="sync" +export SESSION_DRIVER="array" +export SWOOLE_HTTP_HOST=0.0.0.0 +export SWOOLE_HTTP_PORT=8000 +export SWOOLE_HTTP_REACTOR_NUM=6 +export SWOOLE_HTTP_WORKER_NUM=6 + +docker build -t swoole . + +docker kill swoole + +docker rm swoole + +docker_opts="\ + -e APP_DEBUG=${APP_DEBUG} \ + -e APP_KEY=${APP_KEY} \ + -e APP_PUBLIC_URL=${APP_PUBLIC_URL} \ + -e APP_SRC=${APP_SRC} \ + -e APP_URL=${APP_URL} \ + -e CACHE_DRIVER=${CACHE_DRIVER} \ + -e COMPOSER_ARGS=${COMPOSER_ARGS} \ + -e DB_CONNECTION=${DB_CONNECTION} \ + -e DB_DATABASE=${DB_DATABASE} \ + -e GIT_URI=${GIT_URI} \ + -e LARAVEL_ENV=${LARAVEL_ENV} \ + -e LOG_CHANNEL=${LOG_CHANNEL} \ + -e MAIL_DRIVER=${MAIL_DRIVER} \ + -e QUEUE_CONNECTION=${QUEUE_CONNECTION} \ + -e SESSION_DRIVER=${SESSION_DRIVER} \ + -e SWOOLE_HTTP_HOST=${SWOOLE_HTTP_HOST} \ + -e SWOOLE_HTTP_PORT=${SWOOLE_HTTP_PORT} \ + -e SWOOLE_HTTP_REACTOR_NUM=${SWOOLE_HTTP_REACTOR_NUM} \ + -e SWOOLE_HTTP_WORKER_NUM=${SWOOLE_HTTP_WORKER_NUM}" + +docker run -it \ + ${docker_opts} \ + --name swoole swoole /usr/local/bin/build-image + +docker commit swoole swoole-s2i + +docker kill swoole-s2i + +docker rm swoole-s2i + +docker run -it -p 8000:8000 \ + ${docker_opts} \ + --name swoole-s2i swoole-s2i /usr/local/bin/run-container diff --git a/docker/swoole/rootfs/usr/local/bin/build-image b/docker/swoole/rootfs/usr/local/bin/build-image new file mode 100755 index 00000000..78f0f37b --- /dev/null +++ b/docker/swoole/rootfs/usr/local/bin/build-image @@ -0,0 +1,34 @@ +#!/bin/bash + +set -x + +set -e + +pwd + +if [ -z "${GIT_URI}" ]; then + echo "No GIT_URI specified. Exiting." + exit 1 +fi + +git clone -b ${GIT_BRANCH:-master} ${GIT_URI} + +cd $(basename ${GIT_URI} .git) + +if [ ! -z "${APP_SRC}" ]; then + cd ${APP_SRC} +fi + +if [ -f "composer.json" ]; then + echo "Detected composer.json, running install" + php -dmemory_limit=${COMPOSER_MEMORY_LIMIT:--1} /usr/bin/composer install ${COMPOSER_ARGS} + rm -rf ~/.cache/composer/ +fi + +if [ -z "${LARAVEL_ENV}" ]; then + LARAVEL_ENV=prod +fi + +npm install + +npm run ${LARAVEL_ENV} && rm -rf ~/.npm/ diff --git a/docker/swoole/rootfs/usr/local/bin/run-container b/docker/swoole/rootfs/usr/local/bin/run-container new file mode 100755 index 00000000..8e6df328 --- /dev/null +++ b/docker/swoole/rootfs/usr/local/bin/run-container @@ -0,0 +1,42 @@ +#!/bin/bash + +set -x + +set -e + +if [ -z "$@" ]; then + cd $(basename ${GIT_URI} .git) + + if [ ! -z "${APP_SRC}" ]; then + cd ${APP_SRC} + fi + + if [ ! -f ".env" -a -f ".env.example" ]; then + mv .env.example .env + fi + + if [ -z "${APP_KEY}" ]; then + ./artisan key:generate + unset APP_KEY + fi + + if [ -z "${JWT_SECRET}" ]; then + ./artisan jwt:secret -f + fi + + ./artisan clear-compiled + + # This should not occur in production + #./artisan cache:clear + + # A standalone environment doesn't have anything to ping + #timeout 10m ./artisan db:ping --wait + + ./artisan migrate + + env + + exec ./artisan swoole:http start +else + exec $@ +fi diff --git a/src/.env.example b/src/.env.example index 746928dc..355c7c5a 100644 --- a/src/.env.example +++ b/src/.env.example @@ -1,117 +1,123 @@ APP_NAME=Kolab APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://127.0.0.1:8000 APP_PUBLIC_URL= APP_DOMAIN=kolabnow.com ASSET_URL=http://127.0.0.1:8000 SUPPORT_URL= LOG_CHANNEL=stack DB_CONNECTION=mysql DB_DATABASE=kolabdev DB_HOST=127.0.0.1 DB_PASSWORD=kolab DB_PORT=3306 DB_USERNAME=kolabdev -BROADCAST_DRIVER=log +BROADCAST_DRIVER=redis CACHE_DRIVER=redis QUEUE_CONNECTION=redis SESSION_DRIVER=file SESSION_LIFETIME=120 MFA_DSN=mysql://roundcube:Welcome2KolabSystems@127.0.0.1/roundcube MFA_TOTP_DIGITS=6 MFA_TOTP_INTERVAL=30 MFA_TOTP_DIGEST=sha1 IMAP_URI=ssl://127.0.0.1:993 IMAP_ADMIN_LOGIN=cyrus-admin IMAP_ADMIN_PASSWORD=Welcome2KolabSystems IMAP_VERIFY_HOST=false IMAP_VERIFY_PEER=false LDAP_BASE_DN="dc=mgmt,dc=com" LDAP_DOMAIN_BASE_DN="ou=Domains,dc=mgmt,dc=com" LDAP_HOSTS=127.0.0.1 LDAP_PORT=389 LDAP_SERVICE_BIND_DN="uid=kolab-service,ou=Special Users,dc=mgmt,dc=com" LDAP_SERVICE_BIND_PW="Welcome2KolabSystems" LDAP_USE_SSL=false LDAP_USE_TLS=false # Administrative LDAP_ADMIN_BIND_DN="cn=Directory Manager" LDAP_ADMIN_BIND_PW="Welcome2KolabSystems" LDAP_ADMIN_ROOT_DN="dc=mgmt,dc=com" # Hosted (public registration) LDAP_HOSTED_BIND_DN="uid=hosted-kolab-service,ou=Special Users,dc=mgmt,dc=com" LDAP_HOSTED_BIND_PW="Welcome2KolabSystems" LDAP_HOSTED_ROOT_DN="dc=hosted,dc=com" REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 +SWOOLE_HOT_RELOAD_ENABLE=true +SWOOLE_HTTP_ACCESS_LOG=true SWOOLE_HTTP_HOST=127.0.0.1 SWOOLE_HTTP_PORT=8000 +SWOOLE_HTTP_REACTOR_NUM=1 +SWOOLE_HTTP_WEBSOCKET=true +SWOOLE_HTTP_WORKER_NUM=1 +SWOOLE_OB_OUTPUT=true PAYMENT_PROVIDER= MOLLIE_KEY= STRIPE_KEY= STRIPE_PUBLIC_KEY= STRIPE_WEBHOOK_SECRET= MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="noreply@example.com" MAIL_FROM_NAME="Example.com" MAIL_REPLYTO_ADDRESS=null MAIL_REPLYTO_NAME=null DNS_TTL=3600 DNS_SPF="v=spf1 mx -all" DNS_STATIC="%s. MX 10 ext-mx01.mykolab.com." DNS_COPY_FROM=null AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_ASSET_PATH= MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" JWT_SECRET= JWT_TTL=60 COMPANY_NAME= COMPANY_ADDRESS= COMPANY_DETAILS= COMPANY_EMAIL= COMPANY_LOGO= COMPANY_FOOTER= VAT_COUNTRIES=CH,LI VAT_RATE=7.7 KB_ACCOUNT_DELETE= KB_ACCOUNT_SUSPENDED= diff --git a/src/.s2i/bin/assemble b/src/.s2i/bin/assemble index 88aad3a5..5713672a 100755 --- a/src/.s2i/bin/assemble +++ b/src/.s2i/bin/assemble @@ -1,33 +1,43 @@ #!/bin/bash +set -x set -e +function composer_install () { + echo "--->> Detected composer.json, running install" + php -dmemory_limit=${COMPOSER_MEMORY_LIMIT:--1} /usr/bin/composer install ${COMPOSER_ARGS} + rm -rf ~/.cache/composer/ +} + shopt -s dotglob echo "--->> $(rm -vrf vendor/ composer.lock)" +echo "---> Installing application source..." +rm -fR /tmp/src/.git +mv /tmp/src/* ./ + +pushd /opt/app-root/src + +fix-permissions ./ + if [ -f ".env.local" ]; then # Ensure there's a line ending echo "---->> Append .env.local" echo "" >> .env cat .env.local >> .env fi -#env +env -/usr/libexec/s2i/assemble - -#cat >> /opt/app-root/etc/conf.d/99-loglevel.conf << EOF -#LogLevel warn mod_rewrite.c:trace4 -#EOF - -# Won't work due to: -# Cannot install, php_dir for channel "pecl.php.net" is not writeable by the current user -#pecl channel-update pecl.php.net -#pecl install swoole +if [ -f "composer.json" ]; then + echo "--->> Detected composer.json, running install" + composer_install +fi -pushd /opt/app-root/src +pwd echo "---->> Run npm run prod" -npm install cross-env -npm run prod +npm install +npm run ${LARAVEL_ENV:=prod} && rm -rf ~/.npm/ +fix-permissions ./ diff --git a/src/.s2i/bin/run b/src/.s2i/bin/run index 7c021ea9..6d72aa35 100755 --- a/src/.s2i/bin/run +++ b/src/.s2i/bin/run @@ -1,60 +1,68 @@ #!/bin/bash shopt -s dotglob pushd /opt/app-root/src echo "----> Remove bootstrap cache" find bootstrap/cache/ -type f ! -name ".gitignore" -delete if [ -z ${APP_KEY} ]; then echo "----> Run artisan key:generate" ./artisan key:generate + unset APP_KEY fi if [ -z ${JWT_SECRET} ]; then echo "----> Run artisan jwt:secret" ./artisan jwt:secret --always-no fi echo "----> Run artisan clear-compiled" ./artisan clear-compiled -echo "----> Run artisan cache:clear" -./artisan ${ARTISAN_VERBOSITY} cache:clear || true +if [[ "${LARAVEL_ENV}" != "production" || "$LARAVEL_ENV{}" != "prod" ]]; then + echo "----> Run artisan cache:clear" + ./artisan ${ARTISAN_VERBOSITY} cache:clear || true +fi # rpm -qv chromium # if [ ! -z "$(rpm -qv chromium 2>/dev/null)" ]; then # echo "---- Run artisan dusk:chrome-driver" # chver=$(rpmquery --queryformat="%{VERSION}" chromium | awk -F'.' '{print $1}') # ./artisan dusk:chrome-driver ${chver} # fi if [ ! -f 'resources/countries.php' ]; then echo "----> Run artisan data:countries" ./artisan data:countries fi rm -rvf bootstrap/cache/ mkdir -vp bootstrap/cache/ chown default bootstrap/cache ./artisan db:ping --wait || exit 1 ./artisan migrate --force || : #./artisan db:seed --force || : +env + case ${HKCCP_APP} in worker|WORKER ) echo "----> Running worker " - ./artisan queue:work;; + exec ./artisan queue:work;; server|SERVER ) echo "----> Running server " - ./artisan serve;; + exec ./artisan serve;; apache|APACHE|httpd|HTTPD ) echo "----> Starting httpd " /usr/libexec/s2i/run 2>&1;; + swoole|SWOOLE ) + echo "----> Running swoole" + exec ./artisan swoole:http start;; * ) echo "----> Sleeping" - sleep 10000;; + exec sleep 10000;; esac diff --git a/src/app/Http/Controllers/WebsocketController.php b/src/app/Http/Controllers/WebsocketController.php new file mode 100644 index 00000000..cd75d811 --- /dev/null +++ b/src/app/Http/Controllers/WebsocketController.php @@ -0,0 +1,18 @@ +emit("message", $data); + } + + public function ping($websocket, $data) + { + $websocket->emit("pong", $data); + } +} diff --git a/src/app/Http/Middleware/RequestLogger.php b/src/app/Http/Middleware/RequestLogger.php index a9a6a802..59d30556 100644 --- a/src/app/Http/Middleware/RequestLogger.php +++ b/src/app/Http/Middleware/RequestLogger.php @@ -1,25 +1,31 @@ fullUrl(); $method = $request->getMethod(); - $time = microtime(true) - LARAVEL_START; $mem = round(memory_get_peak_usage() / 1024 / 1024, 1); + $time = microtime(true) - self::$start; \Log::debug(sprintf("C: %s %s [%sM]: %.4f sec.", $method, $url, $mem, $time)); } } } diff --git a/src/config/swoole_http.php b/src/config/swoole_http.php index f73a2c59..27a27ace 100644 --- a/src/config/swoole_http.php +++ b/src/config/swoole_http.php @@ -1,137 +1,139 @@ [ 'host' => env('SWOOLE_HTTP_HOST', '127.0.0.1'), 'port' => env('SWOOLE_HTTP_PORT', '1215'), 'public_path' => base_path('public'), // Determine if to use swoole to respond request for static files 'handle_static_files' => env('SWOOLE_HANDLE_STATIC', true), 'access_log' => env('SWOOLE_HTTP_ACCESS_LOG', false), // You must add --enable-openssl while compiling Swoole // Put `SWOOLE_SOCK_TCP | SWOOLE_SSL` if you want to enable SSL 'socket_type' => SWOOLE_SOCK_TCP, 'process_type' => SWOOLE_PROCESS, 'options' => [ 'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')), 'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')), 'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', false), // Normally this value should be 1~4 times larger according to your cpu cores. 'reactor_num' => env('SWOOLE_HTTP_REACTOR_NUM', swoole_cpu_num()), 'worker_num' => env('SWOOLE_HTTP_WORKER_NUM', swoole_cpu_num()), 'task_worker_num' => env('SWOOLE_HTTP_TASK_WORKER_NUM', swoole_cpu_num()), // The data to receive can't be larger than buffer_output_size. 'package_max_length' => 20 * 1024 * 1024, // The data to send can't be larger than buffer_output_size. 'buffer_output_size' => 10 * 1024 * 1024, // Max buffer size for socket connections 'socket_buffer_size' => 128 * 1024 * 1024, // Worker will restart after processing this number of requests 'max_request' => 3000, // Enable coroutine send 'send_yield' => true, // You must add --enable-openssl while compiling Swoole 'ssl_cert_file' => null, 'ssl_key_file' => null, ], ], /* |-------------------------------------------------------------------------- | Enable to turn on websocket server. |-------------------------------------------------------------------------- */ 'websocket' => [ 'enabled' => env('SWOOLE_HTTP_WEBSOCKET', false), ], /* |-------------------------------------------------------------------------- | Hot reload configuration |-------------------------------------------------------------------------- */ 'hot_reload' => [ 'enabled' => env('SWOOLE_HOT_RELOAD_ENABLE', false), 'recursively' => env('SWOOLE_HOT_RELOAD_RECURSIVELY', true), 'directory' => env('SWOOLE_HOT_RELOAD_DIRECTORY', base_path()), 'log' => env('SWOOLE_HOT_RELOAD_LOG', true), 'filter' => env('SWOOLE_HOT_RELOAD_FILTER', '.php'), ], /* |-------------------------------------------------------------------------- | Console output will be transferred to response content if enabled. |-------------------------------------------------------------------------- */ 'ob_output' => env('SWOOLE_OB_OUTPUT', true), /* |-------------------------------------------------------------------------- | Pre-resolved instances here will be resolved when sandbox created. |-------------------------------------------------------------------------- */ 'pre_resolved' => [ 'view', 'files', 'session', 'session.store', 'routes', 'db', 'db.factory', 'cache', 'cache.store', 'config', 'cookie', 'encrypter', 'hash', 'router', 'translator', 'url', 'log', ], /* |-------------------------------------------------------------------------- | Instances here will be cleared on every request. |-------------------------------------------------------------------------- */ 'instances' => [ - // + 'auth', ], /* |-------------------------------------------------------------------------- | Providers here will be registered on every request. |-------------------------------------------------------------------------- */ 'providers' => [ Illuminate\Pagination\PaginationServiceProvider::class, + App\Providers\AuthServiceProvider::class, + Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ], /* |-------------------------------------------------------------------------- | Resetters for sandbox app. |-------------------------------------------------------------------------- */ 'resetters' => [ SwooleTW\Http\Server\Resetters\ResetConfig::class, SwooleTW\Http\Server\Resetters\ResetSession::class, SwooleTW\Http\Server\Resetters\ResetCookie::class, SwooleTW\Http\Server\Resetters\ClearInstances::class, SwooleTW\Http\Server\Resetters\BindRequest::class, SwooleTW\Http\Server\Resetters\RebindKernelContainer::class, SwooleTW\Http\Server\Resetters\RebindRouterContainer::class, SwooleTW\Http\Server\Resetters\RebindViewContainer::class, SwooleTW\Http\Server\Resetters\ResetProviders::class, ], /* |-------------------------------------------------------------------------- | Define your swoole tables here. | | @see https://www.swoole.co.uk/docs/modules/swoole-table |-------------------------------------------------------------------------- */ 'tables' => [ // 'table_name' => [ // 'size' => 1024, // 'columns' => [ // ['name' => 'column_name', 'type' => Table::TYPE_STRING, 'size' => 1024], // ] // ], ], ]; diff --git a/src/config/swoole_websocket.php b/src/config/swoole_websocket.php index 867b9df8..4208912f 100644 --- a/src/config/swoole_websocket.php +++ b/src/config/swoole_websocket.php @@ -1,107 +1,107 @@ SwooleTW\Http\Websocket\SocketIO\WebsocketHandler::class, /* |-------------------------------------------------------------------------- | Default frame parser | Replace it if you want to customize your websocket payload |-------------------------------------------------------------------------- */ 'parser' => SwooleTW\Http\Websocket\SocketIO\SocketIOParser::class, /* |-------------------------------------------------------------------------- | Websocket route file path |-------------------------------------------------------------------------- */ 'route_file' => base_path('routes/websocket.php'), /* |-------------------------------------------------------------------------- | Default middleware for on connect request |-------------------------------------------------------------------------- */ 'middleware' => [ - // SwooleTW\Http\Websocket\Middleware\DecryptCookies::class, - // SwooleTW\Http\Websocket\Middleware\StartSession::class, - // SwooleTW\Http\Websocket\Middleware\Authenticate::class, + SwooleTW\Http\Websocket\Middleware\DecryptCookies::class, + SwooleTW\Http\Websocket\Middleware\StartSession::class, + SwooleTW\Http\Websocket\Middleware\Authenticate::class, ], /* |-------------------------------------------------------------------------- | Websocket handler for customized onHandShake callback |-------------------------------------------------------------------------- */ 'handshake' => [ 'enabled' => false, 'handler' => SwooleTW\Http\Websocket\HandShakeHandler::class, ], /* |-------------------------------------------------------------------------- | Default websocket driver |-------------------------------------------------------------------------- */ 'default' => 'table', /* |-------------------------------------------------------------------------- | Websocket client's heartbeat interval (ms) |-------------------------------------------------------------------------- */ 'ping_interval' => 25000, /* |-------------------------------------------------------------------------- | Websocket client's heartbeat interval timeout (ms) |-------------------------------------------------------------------------- */ 'ping_timeout' => 60000, /* |-------------------------------------------------------------------------- | Room drivers mapping |-------------------------------------------------------------------------- */ 'drivers' => [ 'table' => SwooleTW\Http\Websocket\Rooms\TableRoom::class, 'redis' => SwooleTW\Http\Websocket\Rooms\RedisRoom::class, ], /* |-------------------------------------------------------------------------- | Room drivers settings |-------------------------------------------------------------------------- */ 'settings' => [ 'table' => [ 'room_rows' => 4096, 'room_size' => 2048, 'client_rows' => 8192, 'client_size' => 2048, ], 'redis' => [ 'server' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, 'persistent' => true, ], 'options' => [ // ], 'prefix' => 'swoole:', ], ], ]; diff --git a/src/resources/views/layouts/app.blade.php b/src/resources/views/layouts/app.blade.php index ab6e2cc7..98984212 100644 --- a/src/resources/views/layouts/app.blade.php +++ b/src/resources/views/layouts/app.blade.php @@ -1,23 +1,23 @@ {{ config('app.name') }} -- @yield('title') {{-- TODO: PWA disabled for now: @laravelPWA --}} - +
@yield('content')
- + diff --git a/src/routes/websocket.php b/src/routes/websocket.php index ddebfe14..64240f04 100644 --- a/src/routes/websocket.php +++ b/src/routes/websocket.php @@ -1,26 +1,41 @@ emit( + 'message', + 'welcome' + ); + } +); + +Websocket::on( + 'open', + function ($websocket, Request $request) { + \Log::debug("socket opened"); + } +); -Websocket::on('disconnect', function ($websocket) { - // called while socket on disconnect -}); +Websocket::on( + 'disconnect', + function ($websocket) { + \Log::debug("someone disconnected"); + } +); -Websocket::on('example', function ($websocket, $data) { - $websocket->emit('message', $data); -}); +Websocket::on('message', 'App\Http\Controllers\WebsocketController@message'); +Websocket::on('ping', 'App\Http\Controllers\WebsocketController@ping');