diff --git a/app/AppKernel.php b/app/AppKernel.php
index e26e942..f71a268 100644
--- a/app/AppKernel.php
+++ b/app/AppKernel.php
@@ -21,6 +21,8 @@ class AppKernel extends Kernel
new FOS\UserBundle\FOSUserBundle(),
new Gos\Bundle\WebSocketBundle\GosWebSocketBundle(),
new Gos\Bundle\PubSubRouterBundle\GosPubSubRouterBundle(),
+ new Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
+ new Snc\RedisBundle\SncRedisBundle(),
new Jotunheimr\AdminBundle\JotunheimrAdminBundle(),
new Jotunheimr\UserBundle\JotunheimrUserBundle(),
diff --git a/app/config/config.yml b/app/config/config.yml
index 6bdfc76..3b5108c 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -29,7 +29,8 @@ framework:
trusted_proxies: ~
session:
# http://symfony.com/doc/current/reference/configuration/framework.html#handler-id
- handler_id: session.handler.native_file
+# handler_id: session.handler.native_file
+ handler_id: session.handler.pdo
save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%"
fragments: ~
http_method_override: true
diff --git a/app/config/security.yml b/app/config/security.yml
index 3ce5722..698018c 100644
--- a/app/config/security.yml
+++ b/app/config/security.yml
@@ -8,7 +8,7 @@ security:
providers:
fos_userbundle:
- id: fos_user.user_provider.username
+ id: fos_user.user_provider.username_email
firewalls:
main:
@@ -17,8 +17,6 @@ security:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
default_target_path: /admin
- # if you are using Symfony < 2.8, use the following config instead:
- # csrf_provider: form.csrf_provider
logout: true
anonymous: true
@@ -28,3 +26,4 @@ security:
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, role: ROLE_SUPER_ADMIN }
+# - { path: ^/, role: ROLE_SUPER_ADMIN }
diff --git a/composer.json b/composer.json
index 1fc9f66..dac4c5b 100644
--- a/composer.json
+++ b/composer.json
@@ -21,7 +21,7 @@
"symfony/symfony": "3.1.*",
"doctrine/orm": "^2.5",
"doctrine/doctrine-bundle": "^1.6",
- "doctrine/doctrine-cache-bundle": "^1.2",
+ "doctrine/doctrine-cache-bundle": "^1.3",
"symfony/swiftmailer-bundle": "^2.3",
"symfony/monolog-bundle": "^2.8",
"symfony/polyfill-apcu": "^1.0",
@@ -31,7 +31,9 @@
"gos/web-socket-bundle": "^1.8",
"friendsofsymfony/user-bundle": "~2.0@dev",
"doctrine/doctrine-migrations-bundle": "^1.0",
- "symfony/assetic-bundle": "^2.8"
+ "symfony/assetic-bundle": "^2.8",
+ "predis/predis": "^1.0",
+ "snc/redis-bundle": "^2.0"
},
"require-dev": {
"sensio/generator-bundle": "^3.0",
diff --git a/composer.lock b/composer.lock
index e1a9ebf..5f03e00 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "c2ead293f3b494da909a8b7dceff7c40",
- "content-hash": "267bd32d13cbb40c3078bde5258afa5b",
+ "hash": "7c1e046373c318178e58c9617d9c6931",
+ "content-hash": "b09b605e8d336a4e0bf774ce6f486957",
"packages": [
{
"name": "doctrine/annotations",
@@ -961,12 +961,12 @@
"source": {
"type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSUserBundle.git",
- "reference": "9c64d6fa7ae264828b2ec98aca847840b200bd56"
+ "reference": "4393a98891a03fb7628c546aee4e5ced699c83de"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/9c64d6fa7ae264828b2ec98aca847840b200bd56",
- "reference": "9c64d6fa7ae264828b2ec98aca847840b200bd56",
+ "url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/4393a98891a03fb7628c546aee4e5ced699c83de",
+ "reference": "4393a98891a03fb7628c546aee4e5ced699c83de",
"shasum": ""
},
"require": {
@@ -1030,7 +1030,7 @@
"keywords": [
"User management"
],
- "time": "2016-10-14 20:44:45"
+ "time": "2016-10-17 07:51:36"
},
{
"name": "gos/pnctl-event-loop-emitter",
@@ -1929,16 +1929,16 @@
},
{
"name": "paragonie/random_compat",
- "version": "v2.0.2",
+ "version": "v2.0.3",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
- "reference": "088c04e2f261c33bed6ca5245491cfca69195ccf"
+ "reference": "c0125896dbb151380ab47e96c621741e79623beb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/088c04e2f261c33bed6ca5245491cfca69195ccf",
- "reference": "088c04e2f261c33bed6ca5245491cfca69195ccf",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c0125896dbb151380ab47e96c621741e79623beb",
+ "reference": "c0125896dbb151380ab47e96c621741e79623beb",
"shasum": ""
},
"require": {
@@ -1973,7 +1973,57 @@
"pseudorandom",
"random"
],
- "time": "2016-04-03 06:00:07"
+ "time": "2016-10-17 15:23:22"
+ },
+ {
+ "name": "predis/predis",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nrk/predis.git",
+ "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1",
+ "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "suggest": {
+ "ext-curl": "Allows access to Webdis when paired with phpiredis",
+ "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Predis\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniele Alessandri",
+ "email": "suppakilla@gmail.com",
+ "homepage": "http://clorophilla.net"
+ }
+ ],
+ "description": "Flexible and feature-complete Redis client for PHP and HHVM",
+ "homepage": "http://github.com/nrk/predis",
+ "keywords": [
+ "nosql",
+ "predis",
+ "redis"
+ ],
+ "time": "2016-06-16 16:22:20"
},
{
"name": "psr/cache",
@@ -2355,6 +2405,71 @@
"description": "A security checker for your composer.lock",
"time": "2016-09-23 18:09:57"
},
+ {
+ "name": "snc/redis-bundle",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/snc/SncRedisBundle.git",
+ "reference": "b8aa1a966b32c4fba6b7dac4532d5eeb1d890afb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/snc/SncRedisBundle/zipball/b8aa1a966b32c4fba6b7dac4532d5eeb1d890afb",
+ "reference": "b8aa1a966b32c4fba6b7dac4532d5eeb1d890afb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/framework-bundle": "^2.7 || ^3.0",
+ "symfony/yaml": "^2.7 || ^3.0"
+ },
+ "require-dev": {
+ "doctrine/cache": "1.*",
+ "phpunit/phpunit": "4.8.*",
+ "predis/predis": "^1.0",
+ "symfony/console": "^2.7 || ^3.0",
+ "symfony/phpunit-bridge": "^2.7 || ^3.0"
+ },
+ "suggest": {
+ "monolog/monolog": "If you want to use the monolog redis handler.",
+ "predis/predis": "If you want to use predis.",
+ "symfony/console": "If you want to use commands to interact with the redis database"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Snc\\RedisBundle\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Henrik Westphal",
+ "email": "henrik.westphal@gmail.com"
+ },
+ {
+ "name": "Community contributors",
+ "homepage": "https://github.com/snc/SncRedisBundle/contributors"
+ }
+ ],
+ "description": "A Redis bundle for Symfony",
+ "homepage": "https://github.com/snc/SncRedisBundle",
+ "keywords": [
+ "nosql",
+ "redis",
+ "symfony"
+ ],
+ "time": "2016-06-17 11:50:26"
+ },
{
"name": "swiftmailer/swiftmailer",
"version": "v5.4.3",
diff --git a/src/Mine/SeekerBundle/EventListener/AcmeClientEventListener.php b/src/Mine/SeekerBundle/EventListener/AcmeClientEventListener.php
new file mode 100644
index 0000000..fc82ae1
--- /dev/null
+++ b/src/Mine/SeekerBundle/EventListener/AcmeClientEventListener.php
@@ -0,0 +1,72 @@
+getConnection();
+
+ echo $conn->resourceId . " connected" . PHP_EOL;
+ }
+
+ /**
+ * Called whenever a client disconnects
+ *
+ * @param ClientEvent $event
+ */
+ public function onClientDisconnect(ClientEvent $event)
+ {
+ $conn = $event->getConnection();
+
+ echo $conn->resourceId . " disconnected" . PHP_EOL;
+ }
+
+ /**
+ * Called whenever a client errors
+ *
+ * @param ClientErrorEvent $event
+ */
+ public function onClientError(ClientErrorEvent $event)
+ {
+ $conn = $event->getConnection();
+ $e = $event->getException();
+
+ echo "connection error occurred: " . $e->getMessage() . PHP_EOL;
+ }
+
+ /**
+ * Called whenever server start
+ *
+ * @param ServerEvent $event
+ */
+ public function onServerStart(ServerEvent $event)
+ {
+ $event = $event->getEventLoop();
+
+ echo 'Server was successfully started !' . PHP_EOL;
+ }
+
+ /**
+ * Called whenever client is rejected by application
+ *
+ * @param ClientRejectedEvent $event
+ */
+ public function onClientRejected(ClientRejectedEvent $event)
+ {
+ $origin = $event->getOrigin;
+
+ echo 'connection rejected from ' . $origin . PHP_EOL;
+ }
+}
\ No newline at end of file
diff --git a/src/Mine/SeekerBundle/Resources/config/config.yml b/src/Mine/SeekerBundle/Resources/config/config.yml
index 56a5a99..136454a 100644
--- a/src/Mine/SeekerBundle/Resources/config/config.yml
+++ b/src/Mine/SeekerBundle/Resources/config/config.yml
@@ -1,24 +1,44 @@
+# PDO Session Handler Configuration !!!!! --> moved to main config.yml
+#framework:
+# session:
+# handler_id: session.handler.pdo
+
+# Doctrine cache
+doctrine_cache:
+ providers:
+ redis_cache:
+ redis:
+ host: localhost
+ port: 6379
+ database: 3
+ websocket_cache_client:
+ type: redis
+ alias: gos_web_socket.client_storage.driver.redis
+
+# SNC
+snc_redis:
+ clients:
+ cache:
+ type: predis
+ alias: cache
+ dsn: redis://localhost/2
+ logging: "%kernel.debug%"
+ options:
+ profile: 2.2
+ connection_timeout: 10
+ read_write_timeout: 30
+
# Web Socket Configuration
gos_web_socket:
- # for user ex.: var _WS_URI = "ws://{{ gos_web_socket_server_host }}:{{ gos_web_socket_server_port }}";
- shared_config: false
server:
- port: 8080 # The port the socket server will listen on
- host: 127.0.0.1 # The host IP to bind to
+ host: 0.0.0.0
+ port: 8080
router:
resources:
- "@MineSeekerBundle/Resources/config/pubsub/routing.yml"
client:
- firewall: secured_area # Can be an array of firewalls
+ firewall: main
session_handler: "@session.handler.pdo"
-# storage:
-# driver: "@gos_web_socket.client_storage.driver.predis"
-# driver: "@gos_web_socket.server.in_memory.client_storage.driver"
-# ttl: 28800 # (optionally) time to live if you use redis driver
-# prefix: client # (optionally) prefix if you use redis driver, create key "client:1" instead key "1"
-
-# PDO Session Handler Configuration
-framework:
- session:
- handler_id: session.handler.pdo
-#
+ storage:
+ driver: "@gos_web_socket.client_storage.driver.predis"
+ decorator: "@gos_web_socket.client_storage.doctrine.decorator"
diff --git a/src/Mine/SeekerBundle/Resources/config/services.yml b/src/Mine/SeekerBundle/Resources/config/services.yml
index 31b4824..8be8a6c 100644
--- a/src/Mine/SeekerBundle/Resources/config/services.yml
+++ b/src/Mine/SeekerBundle/Resources/config/services.yml
@@ -1,27 +1,48 @@
services:
-# mine_seeker.example:
-# class: Mine\SeekerBundle\Example
-# arguments: ["@service_id", "plain_value", %parameter%]
+
+ pdo:
+ class: PDO
+ arguments:
+ dsn: "mysql:host=%database_host%;dbname=%database_name%"
+ user: "%database_user%"
+ passwd: "%database_password%"
+ calls:
+ - [ setAttribute, [3, 2] ] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION
session.handler.pdo:
class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
- arguments:
- - "mysql:dbname=%database_name%"
- - { db_table: sessions, db_username: myuser, db_password: mypassword }
+ public: false
+ arguments: ["@pdo", {lock_mode: 0}]
-# gos_web_scocket.client_storage.driver.predis:
-# class: Gos\Bundle\WebSocketBundle\Client\Driver\PredisDriver
-# arguments:
-# - "@cache.adapter.redis"
+# config.yml --> gos_web_socket > storage > client > driver
+ gos_web_socket.client_storage.driver.predis:
+ class: Gos\Bundle\WebSocketBundle\Client\Driver\PredisDriver
+ arguments:
+ - "@snc_redis.cache"
+
+# config.yml --> gos_web_socket > storage > client > decorator
+ gos_web_socket.client_storage.doctrine.decorator:
+ class: Gos\Bundle\WebSocketBundle\Client\Driver\DoctrineCacheDriverDecorator
+ arguments:
+ - "@doctrine_cache.providers.doctrine.orm.default_result_cache"
acme_hello.topic_sample_service:
class: Mine\SeekerBundle\Topic\AcmeTopic
tags:
- { name: gos_web_socket.topic }
-# arguments:
-# - { clientManipulator: "@gos_web_socket.websocket.client_manipulator" }
+ arguments:
+ clientManipulator: "@gos_web_socket.websocket.client_manipulator"
acme_hello.rpc_sample_service:
class: Mine\SeekerBundle\Rpc\AcmeRpc
tags:
- { name: gos_web_socket.rpc }
+
+ gos_web_socket_server.client_event.listener:
+ class: Mine\SeekerBundle\EventListener\AcmeClientEventListener
+ tags:
+ - { name: kernel.event_listener, event: 'gos_web_socket.client_connected', method: onClientConnect }
+ - { name: kernel.event_listener, event: 'gos_web_socket.client_disconnected', method: onClientDisconnect }
+ - { name: kernel.event_listener, event: 'gos_web_socket.client_error', method: onClientError }
+ - { name: kernel.event_listener, event: 'gos_web_socket.server_launched', method: onServerStart }
+ - { name: kernel.event_listener, event: 'gos_web_socket.client_rejected', method: onClientRejected }
diff --git a/src/Mine/SeekerBundle/Resources/public/js/mine-seeker/app.js b/src/Mine/SeekerBundle/Resources/public/js/mine-seeker/app.js
index 446f9dd..71fe5b6 100644
--- a/src/Mine/SeekerBundle/Resources/public/js/mine-seeker/app.js
+++ b/src/Mine/SeekerBundle/Resources/public/js/mine-seeker/app.js
@@ -4,7 +4,7 @@ import GridControl from './grid/grid-control';
class MineSeeker extends React.Component {
/** after rendering */
componentDidMount() {
- var websocket = WS.connect("ws://127.0.0.1:8080");
+ var websocket = WS.connect("ws://mine.dev:8080");
/** session is an Autobahn JS WAMP session. */
websocket.on("socket/connect", function (session) {
@@ -46,7 +46,8 @@ class MineSeeker extends React.Component {
render() {
return (
-