idimensionz / sassy
Extensible websocket app server driven by 'self-processing' messages
Requires
- php: ^7.4||^8
- ext-json: *
- cboden/ratchet: ^0.4
- idimensionz/common: ^1.0
- symfony/config: ^6.0
- symfony/console: ^6.0
- symfony/dependency-injection: ^6.0
- symfony/event-dispatcher: ^6.0
- symfony/proxy-manager-bridge: ^6.0
- symfony/uid: ^6.0
- symfony/yaml: ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- phake/phake: ^3.1
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^7.5||^8||^9
This package is auto-updated.
Last update: 2024-11-09 21:42:39 UTC
README
Gitlab: https://gitlab.com/idimensionz/sassy
Requirements
- PHP 7.4 or higher
- Composer
Installation Instructions
- Clone the repository
- Run
composer install
to install the dependencies
Starting the websocket server
If you want to see debug output in the server console, set the SASSY_SERVER_DEBUG=1
export SASSY_SERVER_DEBUG=1
Run
php bin/websocket-server.php
Example client apps
From the web broweser JS console
You can test the websocket server right from a web browswer JS console by running the code below (i.e. from the dev console)
Note: You'll want to run this from at least 2 browser tabs/windows to be able to see messages flow between the 2 "clients".
var conn = new WebSocket('ws://localhost:8080'); conn.onopen = function(e) { console.log("Connection established!"); };
let jsonMessage = {messageType: "iDimensionz\AppServer\Message\Base\TextMessage",uniqId:1,message:"hello"};
conn.send(JSON.stringify(jsonMessage));
Try it out with our example chat client built in ReactJS
https://gitlab.com/idimensionz/sassy-example-chat
Design approaches
- Messages know how to "process themselves" via process message on server.
- "Service messages" can access functionality provided by a service class
- i.e. a Channel message allows a connection to call functions on the TopicService like creating a new topic or listing existing topics.
- Channel Manager built in (default "General" topic created when server starts)
- Extensible via events/subscribers to allow developers to easily "hook" into various parts of the server
Uses
Some ideas for ways this can be used ...
- Chat server
- Topics can be "channels".
- TextMessage can be used for basic text messages.
- New message types can be created for images, videos, emojis, etc.
- "Presence"
- Let connections indicate their status (i.e. DND, away, etc)
- Point-to-point communications (audio, video)
- Interactive game server (card games, board games and more)
- Create new message types for actions within a game
- Distributed processing
- Create client apps that can process data payloads sent from the server.
- Replace API's clients with websocket clients
- "Always on" connection could increase performance and enable new features like ...
- real-time analysis of popular pages/products
- "assisted shopping" by allowing customer service to interact with customers in real time
- lots more!
- "Always on" connection could increase performance and enable new features like ...
- and whatever interactive applications your imagination can dream up
Testing
Available via "make" targets in Makefile
- PhpStan - static analysis
- Unit tests
Why create such a thing (especially in PHP)?
- Wanted to create a basis for implementing some of the uses described above.
- To show PHP is ...
- a great language and a lot of the "issues" that people had with it in the past have been addressed in latest versions (especially 8+)
- a language that can be used to create high performance, professional server side applications