Giter Site home page Giter Site logo

yii-node-socket's Introduction

Yii Node Socket

Join the chat at https://gitter.im/oncesk/yii-node-socket

Connect php, javascript, nodejs in one Yii application.

####Yii1

Hi, if you need work with yii1 you can do it from (https://github.com/oncesk/yii-node-socket/tree/2.0.0)

####What you can do:

  • send event(s) to all clients or in concrete room or in concrete channel
  • now you can send events to single (concrete user) by user id!
  • call some function or object method in window context
  • you can change DOM model with jquery from php
  • ability to set up data and get it in your javascript application
  • send events from javascript for all clients or clients in concrete room or channel

##Changes

  • Updated for Yii 2.0
  • Added Namespacing Updated for Yii 2.0
  • Commposer settings updated to work with yii extension updates

##Requirements

  • linux/unix/windows
  • git
  • vps or dedicated server (for nodejs process)
  • curl has to be installed or enabled

#Installation

Install nodejs, if not installed see http://nodejs.org/
Install extension

  • Composer
{
        "require" : {
                "oncesk/yii-node-socket" : "2.0.4"
        }
}
  • Using git clone
$> git clone https://github.com/oncesk/yii-node-socket.git

Now go to the folder where you install extension application.ext.yii-node-socket and execute

$> git submodule init
$> git submodule update

Yii configuration

  • Configure console command in (console/config/main.php). You can use config below:
    'controllerMap' => [
        'node-socket' => '\YiiNodeSocket\NodeSocketCommand',
    ],
  • Register Yii component, need to add into frontend/config/main.php in your frontend application:
		'nodeSocket' => [
		    'class' => '\YiiNodeSocket\NodeSocket',
		    'host' => 'localhost',
		    'allowedServerAddresses' => [
		        "localhost",
		        "127.0.0.1"
		    ],
		    'origin' => '*:*',
		    'sessionVarName' => 'PHPSESSID',
		    'port' => 3001,
		    'socketLogFile' => '/var/log/node-socket.log',
		],

Notice: host should be a domain name like in you virtual host configuration or server ip address if you request page using ip address

  • Configure aliases in the common config in (common/config/main.php).
  • The first is for Yii to find the PHP Namespace and the second is to find the JS assets.
  • You can use config below:
    'aliases' => [
        '@YiiNodeSocket' => '@vendor/oncesk/yii-node-socket/lib/php',
        '@nodeWeb' => '@vendor/oncesk/yii-node-socket/lib/js'
    ],

Notice: if you will be use behaviors or node-socket models, you need to add nodeSocket component in preload components list

    'bootstrap' => ['log', 'nodeSocket'],

Install nodejs components in application.ext.yii-node-socket.lib.js.server:

$> npm install

If you get errors issuing this command try the following:

$> npm install --no-bin-links

Congratulation, installation completed!

Notice: if the name of the component will not be nodeSocket, your need to use special key in console command --componentName=component_name

###Console command actions

Use (./yiic node-socket)

$> ./yiic help node-socket # show help
$> ./yiic node-socket/start # start server
$> ./yiic node-socket/stop # stop server
$> ./yiic node-socket/restart # restart server
$> ./yiic node-socket/getPid # show pid of nodejs process

##Definitions

  • Frame - data package for nodejs server wrapped into Class. Per one request to nodejs server you can send only 1 frame. For send several frames at a time use Multiple frame.
  • room - one or more clients in concrete namespace: every client can create room, other clients can join into concrete room, any client in room can send event in this room.

##Javascript

Before use in javascript, register client stripts like here Depricated in Yii 2.0 - The Asset Manager registers the files on demand.

public function actionIndex() {
	// register node socket scripts
	// No longer needed - Yii::app()->nodeSocket->registerClientScripts();
}

###Events

###Work in javascript

Use YiiNodeSocket class

####Start work

// create object
var socket = new YiiNodeSocket();

// enable debug mode
socket.debug(true);

socket.onConnect(function () {
	// fire when connection established
});

socket.onDisconnect(function () {
	// fire when connection close or lost
});

socket.onConnecting(function () {
	// fire when the socket is attempting to connect with the server
});

socket.onReconnect(function () {
	// fire when successfully reconnected to the server
});

####Catch Events

Now events can be created only on PHP side. All data transmitted in json format. Into callback function data was pasted as javascript native object (or string, integer, depends of your PHP Frame config)

// add event listener
socket.on('updateBoard', function (data) {
	// do any action
});

####Rooms

socket.onConnect(function () {
	socket.room('testRoom').join(function (success, numberOfRoomSubscribers) {
		// success - boolean, numberOfRoomSubscribers - number of room members
		// if error occurred then success = false, and numberOfRoomSubscribers - contains error message
		if (success) {
			console.log(numberOfRoomSubscribers + ' clients in room: ' + roomId);
			// do something
			
			// bind events
			this.on('join', function (newMembersCount) {
				// fire on client join
			});
			
			this.on('data', function (data) {
				// fire when server send frame into this room with 'data' event
			});
		} else {
			// numberOfRoomSubscribers - error message
			alert(numberOfRoomSubscribers);
		}
	});
});

####Channels

Channel is very similar to the room, but you can controll access to channel for clients

// join to channel, join needed when you try subscribe to channel from javascript, if you subscribed to channel in php you can bind events without join
socket.onConnect(function () {
	var testChannel = socket.channel('test').join(function (success) {
		// success - boolean
		if (success) {
			// fore getting channel attributes
			console.log(this.getAttributes());
			
			// bind event listeners
			this.on('some_event', function (data) {
				// fire when server send frame into this room with 'data' event
			});
		} else {
			console.log(this.getError());
		}
	});
	
	// you can bind events handlers for some events without join
	// in this case you should be subscribed to `test` channel
	socket.channel('test').on('some_event', function (data) {
	});

});

####Emit events

You can emit event to:

  • all clients (including the event sender)
  • all clients (excluding the event sender - broadcasting. Only javascript currently supports broadcasting. PHP broadcasting coming soon)
  • clients in concrete room

Global events:

socket.emit('global.event', {
	message : {
		id : 12,
		title : 'This is a test message to all including sender'
	}
});

socket.broadcast.emit('global.event', {
	message : {
		id : 12,
		title : 'This is a test message to all excluding sender'
	}
});

socket.on('global.event', function (data) {
	console.log(data.message.title); // you will see in console `This is a test message`
});

Room event:

socket.onConnect(function () {
	var testRoom = socket.room('testRoom').join(function (success, numberOfRoomSubscribers) {
		// success - boolean, numberOfRoomSubscribers - number of room members
		// if error occurred then success = false, and numberOfRoomSubscribers - contains error message
		if (success) {
			console.log(numberOfRoomSubscribers + ' clients in room: ' + roomId);
			// do something
			
			// bind events
			this.on('message', function (message) {
				console.log(message);
			});
			
			this.on('ping', function () {
				console.log('Ping!');
			});
			
			this.emit('ping'); // emit ping event
		} else {
			// numberOfRoomSubscribers - error message
			alert(numberOfRoomSubscribers);
		}
	});
	
	// emit message event
	testRoom.emit('message', {
		message : {
			id : 12,
			title : 'This is a test message'
		}
	});
});

####Shared Public Data

You can set shared data only from PHP using PublicData Frame (see below into PHP section). To access data you can use getPublicData(string key, callback fn) method

socket.getPublicData('error.strings', function (strings) {
	// you need to check if strings exists, because strings can be not setted or expired,
	if (strings) {
		// do something
	}
});

##PHP

####Behaviors

  • YiiNodeSocket\Behaviors\ArChannel - can be used for create new channel. Example: You can attach this behavior to User, in result any user will have own channel, and other user can subscribe to events of concrete user.
  • YiiNodeSocket\Behaviors\ArSubscriber - should be attached to object which can subscribe to some channel. Example: model User at a time can be channel and subscriber.
/**
 *
 * @method \YiiNodeSocket\Models\Channel getChannel()
 * @method \YiiNodeSocket\Frames\Event|null createEvent($name)
 */
class User extends CActiveRecord {

...

	public function behaviors() {
		return array(
			// attach channel behavior
			'channel' => array(
				'class' => '\YiiNodeSocket\Behaviors\ArChannel',
				'updateOnSave' => true
			),
			// attach subscriber behavior
			'subscriber' => array(
				'class' => '\YiiNodeSocket\Behaviors\ArSubscriber'
			)
		);
	}
	
...
	
}

// Example of subscribe

$user1 = new User();
$user1->setAttributes($attributes);
if ($user1->save()) {
	// imagine that $user1->id == 122
	// user channel was created and sent to nodejs server
	// subscriber was created and sent to nodejs server
	
	// create second user
	$user2 = User::model()->findByPk(121);
	
	// now we can subscribe one user to second user
	$user1->subscribe($user2);
	// and $user2 can catch events from $user1 channel like in twitter
	
	
}


// Example of emit event in concrete channel

$user = User::model()->findByPk(122);
if ($user) {

	// First method
	$event = $user->createEvent('test_event');
	if ($event) {
		// set event data
		$event->setData(array(
			'black', 'red', 'white'
		));
		// send event to user channel
		$event->send();
	}
	
	// Second method with getting channel
	$channel = $user->getChannel();
	if ($channel) {
		$event = $channel->createEvent('test_event');
		// set event data
		$event->setData(array(
			'black', 'red', 'white'
		));
		// send event to user channel
		$event->send();
	}
}


// Example of unsubscribe

$user1 = User::model()->findByPk(122);
$user2 = User::model()->findByPk(121);

$user1->unSubscribe($user2); // now $user2 can not catch events in channel of $user1

####Client authorization

For authorizing client you need send special Authentication frame, you can do it in your user component in afterLogin event

protected function afterLogin($fromCookie) {
	parent::afterLogin($fromCookie);
	
	$frame = Yii::app()->nodeSocket->getFrameFactory()->createAuthenticationFrame();
	$frame->setUserId($this->getId());
	$frame->send();
}

After that, this user can receive events only for him. See example below, send event only for single (concrete) $user

// $user - the user model, which can receive this event

$event = Yii::app()->nodeSocket->getFrameFactory()->createUserEventFrame();
$event->setUserId($user->id);
$event->setEventName('message');
$event['text'] = 'Hello, how are you?';
$event->send();

and your javascript

var socket = new YiiNodeSocket();
socket.on('message', function (message) {
	console.log(message.text);
	// render message
});

####Client scripts registration

public function actionIndex() {
	...

	Yii::app()->nodeSocket->registerClientScripts();
	
	...
}

####Event frame

...

// create event frame
$frame = Yii::app()->nodeSocket->getFrameFactory()->createEventFrame();

// set event name
$frame->setEventName('updateBoard');

// set data using ArrayAccess interface
$frame['boardId'] = 25;
$frame['boardData'] = $html;

// or you can use setData(array $data) method
// setData overwrite data setted before

$frame->send();

...

####Set up shared data

You can set expiration using setLifeTime(integer $lifetime) method of class PublicData

...

// create frame
$frame = Yii::app()->nodeSocket->getFrameFactory()->createPublicDataFrame();

// set key in storage
$frame->setKey('error.strings');

// set data
$frame->setData($errorStrings);

// you can set data via ArrayAccess interface
// $frame['empty_name'] = 'Please enter name';

// set data lifetime
$frame->setLifeTime(3600*2);	// after two hours data will be deleted from storage

// send
$frame->send();

...

####Room events

...

// create frame
$frame = Yii::app()->nodeSocket->getFrameFactory()->createEventFrame();

// set event name
$frame->setEventName('updateBoard');

// set room name
$frame->setRoom('testRoom');

// set data
$frame['key'] = $value;

// send
$frame->send();

...

Only member of testRoom can catch this event

####Invoke client function or method

In your PHP application you can invoke javascript function or method of object in window context.

$invokeFrame = Yii::app()->nodeSocket->getFrameFactory()->createInvokeFrame();
$invokeFrame->invokeFunction('alert', array('Hello world'));
$invokeFrame->send();	// alert will be showed on all clients

Extends from Event frame => you can send it into specific room

####DOM manipulations with jquery

Task: you need update price on client side after price update in each product

...

$product = Product::model()->findByPk($productId);
if ($product) {
	$product->price = $newPrice;
	if ($product->save()) {
		$jFrame = Yii::app()->nodeSocket->getFrameFactory()->createJQueryFrame();
		$jFrame
			->createQuery('#product' . $product->id)
			->find('span.price')
			->text($product->price);
		$jFrame->send();
		// and all connected clients will can see updated price
	}
}

...

####Send more than one frame per a time

Example 1:

$multipleFrame = Yii::app()->nodeSocket->getFrameFactory()->createMultipleFrame();

$eventFrame = Yii::app()->nodeSocket->getFrameFactory()->createEventFrame();

$eventFrame->setEventName('updateBoard');
$eventFrame['boardId'] = 25;
$eventFrame['boardData'] = $html;

$dataEvent = Yii::app()->nodeSocket->getFrameFactory()->createPublicDataFrame();

$dataEvent->setKey('error.strings');
$dataEvent['key'] = $value;

$multipleFrame->addFrame($eventFrame);
$multipleFrame->addFrame($dataEvent);
$multipleFrame->send();

Example 2:

$multipleFrame = Yii::app()->nodeSocket->getFrameFactory()->createMultipleFrame();

$eventFrame = $multipleFrame->createEventFrame();

$eventFrame->setEventName('updateBoard');
$eventFrame['boardId'] = 25;
$eventFrame['boardData'] = $html;

$dataEvent = $multipleFrame->createPublicDataFrame();

$dataEvent->setKey('error.strings');
$dataEvent['key'] = $value;

$multipleFrame->send();

##PS

Sorry for my english :)

yii-node-socket's People

Contributors

doublehops avatar fourteenmeister avatar gitter-badger avatar hackmushroom avatar marcinmisiak avatar oncesk avatar pashkinz92 avatar xakki avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

yii-node-socket's Issues

Небольшой баг, "ошибка синтаксиса"

Нашел еще такую вещь
файл client.js, строка 211

                    if (chain.break === true) {
                        logger.log('Handler of event: ' + event + ' break event chain');
                        break;
                    }

вот на этом chain.break сафари падает у меня, потому что break - ключевое слово. Я у себя заменил на chain['break']

Call to undefined method ElephantIO\Client::setHandshakeTimeout()

Install went great. Started server without a problem. Trying to send event and this is the result. I checked ElephantIO/Client. It doesn't have a method SetHandshakeTimeout or createFrame() & endPoint().

Call to undefined method ElephantIO\Client::setHandshakeTimeout()

  1. in /var/www/sites/chat/vendor/oncesk/yii-node-socket/lib/php/frames/AFrame.php at line 166
protected function emit() {
    $client = $this->createClient();
    $client->origin = $this->_nodeSocket->getOrigin();
    $client->sendCookie = true;
    $client->cookie = implode('; ', array(
        'PHPSESSID=' . \Yii::$app->session->id,
        'expires=' . (time() + $this->_nodeSocket->cookieLifeTime)
    ));
    $client->setHandshakeTimeout($this->_nodeSocket->handshakeTimeout);
    $client->init();

    $client
        ->createFrame()
        ->endPoint('/server')
        ->emit($this->getType(), $this->getFrame());

    $client->close();
}

Installed using composer. Do I have an outdated file or am I doing something wrong? Here's what's in my controller Action.

    // create event frame
    $frame = Yii::$app->nodeSocket->getFrameFactory()->createEventFrame();

    // set event name
    $frame->setEventName('updateBoard');

    // set data using ArrayAccess interface
    $frame['boardId'] = 25;
    $frame['boardData'] = 'TEST MESSAGE';

    // or you can use setData(array $data) method
    // setData overwrite data setted before

    $frame->send(); 

Сокет не работает при открытии ище одной вкладки

Авторизация клиента на сервере

$frame = Yii::app()->nodeSocket->getFrameFactory()->createAuthenticationFrame();
$frame->setUserId($this->getId());
$frame->send();

И отправляем сообщению этому пользователю

$event = \Yii::app()->nodeSocket->getFrameFactory()->createUserEventFrame();
$event->setUserId($this->to_uid);
$event->setEventName('message');
$event['message'] = 'some mess';
$event->send();

Суть проблемы - при открытии дополнительной вкладки, предыдущая вкладка перестает принимать сообщения.
пс / в логах ошибок нет

Create AuthenticationFrame

For authentication client socket, php sends session id, client javascript too. Need associate php session id with client session id.

Loadbalancing

I have one issue when using load balancing. Please help me

fwrite(): send of 7 bytes failed with errno=32 Broken pipe

/var/www/vtvdigital/dungdetienroi.vtv.vn/moneydrop_node/protected/extensions/yii-node-socket/lib/vendor/elephant.io/lib/ElephantIO/Client.php(244)

232 * @return boolean
233 /
234 public function close() {
235 if ($this->fd) {
236 $this->write($this->encode(self::TYPE_DISCONNECT, Payload::OPCODE_CLOSE), false);
237 fclose($this->fd);
238 return true;
239 }
240 return false;
241 }
242
243 protected function write($data, $sleep = true) {
244 fwrite($this->getSocket(), $data);
245 // wait 100ms before closing connexion
246 if ($sleep) {
247 usleep(100 * 1000);
248 }
249 return $this;
250 }
251
252 /
*
253 * @return mixed
254 * @throws \RuntimeException
255 */
256 private function getSocket() {

Как сохранять данные из сокетов?

Допустим, есть задача реализовать чат. И есть необходимость сохранять сообщения в БД. Как это можно сделать, используя ваше расширение?

проблема с nohup

Здравствуйте!
Не могу понять, что не так.
при запуске сервера (yiic node-socket start) - сервер не запускается.
В лог-файле (socket-transport.server.log) следующее:
"nohup" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Просматривая файл NodeSocketCommand.php наткнулся
на функцию отвечающую за старт сервера:
$command = 'nohup ' . $this->makeCommand() . ' > ' . $this->getLogFile() . ' 2>&1 & echo $!';
убрав команду 'nohup' - сервер запустился (но уже не в фоновом режиме).
Погуглив убедился, что 'nohup' отвечает за запуск в фоновом режиме.
Но не нашёл решения своей проблемы.
Вопрос: что я делаю не так и есть ли решение данной проблемы?
Заранее спасибо!

Unknown command "node-socket"

I am building a site with Yii2 - Basic and have installed yii-node-socket but I get an error when I try ./yii node-socket that says Unknown command "node-socket".

I have added the required config into config/console.php (also tried config/web.php). I have installed the package via Composer. I'm at a loss at what else I can try.

Edit: Typing just ./yii will list node-socket as an available command so I feel that I've configured correctly.

handshake error PHPSESSID

Hello,
thank you for your work!

Anyway I got an error when I try the example, like :

$event = Yii::$app->nodeSocket->getFrameFactory()->createEventFrame();
        $event->setEventName('event.example');
        $event['data'] = array(
            1,
            array(
                'red',
                'black',
                'white'
            )
        );
        $event->send();

I got:

debug: client authorized
info: handshake authorized 6kKMCtN5oVddD8pirJYT
debug: setting request GET /socket.io/1/websocket/6kKMCtN5oVddD8pirJYT
debug: set heartbeat interval for client 6kKMCtN5oVddD8pirJYT
debug: client authorized for 
debug: websocket writing 1::
debug: client unauthorized for /server
warn: handshake error PHPSESSID is undefined for /server
debug: websocket writing 7::/server:undefined
info: transport end (undefined)
debug: set close timeout for client 6kKMCtN5oVddD8pirJYT
debug: cleared close timeout for client 6kKMCtN5oVddD8pirJYT
debug: cleared heartbeat interval for client 6kKMCtN5oVddD8pirJYT
debug: discarding transport

I tried to debug server.js and it seems that the variable data.cookie.PHPSESSID is empty, I also checked the header and it have the PHPSESSID.

I have no problem on js side.

Can you help me please?

Вопросы безопасности

Добрый день) Решил отдельно поднять эту тему, начало в конце #22. Под капотом посмотреть не могу так как о node js только слышал.
1)Как можно подключиться к комнате для прослушки чата третьим лицом?
2)Комната как-то привязана к сессии или создает отдельные каналы с каждым участником? Так как простым изменинием js на клиенте, ивент получить не удалось

Connection refused

Hi! The extension works good in my virtual machine. But there's a problem on the product server. When I emit an event in js, it works good, but events, which are sent from controller cause an error:
Error:

Exception

Failed to connect to hoo.dev.vintagedev.com.ua port 8081: Connection refused (/var/www/hoo/vendor/oncesk/yii-node-socket/lib/vendor/elephant.io/lib/ElephantIO/Client.php:372)

#0 /var/www/hoo/vendor/oncesk/yii-node-socket/lib/vendor/elephant.io/lib/ElephantIO/Client.php(66): ElephantIO\Client->handshake()
#1 /var/www/hoo/vendor/oncesk/yii-node-socket/lib/php/frames/AFrame.php(167): ElephantIO\Client->init()
#2 /var/www/hoo/vendor/oncesk/yii-node-socket/lib/php/frames/AFrame.php(76): YiiNodeSocket\Frames\AFrame->emit()
#3 /var/www/hoo/frontend/modules/user/controllers/PmController.php(134): YiiNodeSocket\Frames\AFrame->send()

Please, can you say what cause the error?

Переполнение памяти

Есть проблема. Использую на сайте твое расширение. При каждом переходе по сайту заново происходит подключение по сокетам. Это не страшно. Проблема в том, что все предыдущие клиенты, скорей всего, не убрались из памяти сервера. Так вот, когда таких переходов много - сокет кричит ошибку, типа превысило время подключения. Я так предполагаю, что надо удалять старые соединения, но вот где это делать - вопрос серьезный.

Yii 2

the idea behind this ext is great I think if you have any idea to port it for yii 2?
you can count on me if you need any help.

Incomplete configuration instructions?

Hi, first off THANK YOU for making this extension, it seems incredibly useful.

Unfortunately I have run into an issue getting it running.

I followed your installation and configuration instructions, I cloned the repository, added the necessary changes to my console.local and main.local config files and installed the node.js components successfully.

Now I go to start node-socket and get an error that seems to be related to namespaces:

./yiic node-socket start

PHP Fatal error: Class 'YiiNodeSocket\Frame\Event' not found in //protected/extensions/yii-node-socket/lib/php/frames/ChannelEvent.php on line 4

I tried using Yii::setPathOfAlias in the console.php file but couldn't see to get past this.

Please help me (and the other devs who may encounter this issue).

Thank you!

Проблема с настройкой алиаса

Привет!
Спасибо за extension!
Хотел попробовать его, но при установке столкнулся с проблемой.
Сделал все как в описании, прописал все алиасы, прописал controllerMap, но при попытке выполнить yii node-socket - говорит : Error: Unknown command "node-socket".

Problem with installation

Hi,
I am using basic Yii2 template and can't get command ./yii node-socket/start to run. I am getting error
Exception 'yii\base\InvalidConfigException' with message 'Unknown component ID: nodeSocket'. I placed nodeSocket in the components section of the project/config/web.php like

bootstrap' => ['log','nodeSocket'],
'components' => [
'nodeSocket' => [
'class' => '\YiiNodeSocket\NodeSocket',
'host' => 'localhost',
'allowedServerAddresses' => [
"localhost",
"127.0.0.1"
],
'origin' => ':',
'sessionVarName' => 'PHPSESSID',
'port' => 3001,
'socketLogFile' => '/var/log/node-socket.log',
],
],
'aliases' => [
'@YiiNodeSocket' => '@vendor/oncesk/yii-node-socket/lib/php',
'@nodeweb' => '@vendor/oncesk/yii-node-socket/lib/js'
],

in project/config/console I added
'controllerMap' => [
'node-socket' => '\YiiNodeSocket\NodeSocketCommand',
],

What could be the problem?

Unable to get the plugin to work on real server

I did exactly the same setting as what I did in my localhost, however the codes does not seem to run well in the server but runs in the server. This are the steps taken:

  1. Client page javascript code:
    var socket = new YiiNodeSocket(); // create object and connect to web socket server
    socket.debug(true);
    socket.onConnect(function () {
    socket.room('test').join(function (isConnected, numberOfRoomClients) {
        if (isConnected) {
            var event_name = "event";
            this.on(event_name, function (data) {
                 alert("Hahaha");
            });
        }  
     });
    });

Client console shows that it has been connected to the test room.

  1. The code to invoke the event is
public function actionTesttwo(){
        $event = Yii::app()->nodeSocket->getFrameFactory()->createEventFrame();
        $event->setRoom('test');
        $event->setEventName('event');
        $event['type_string'] = 'hello world';
        $event['type_array'] = array(1, 2, 3);
        $event['type_object'] = array('one' => 1, 'two' => 2);
        $event['type_bool'] = true;
        $event->send();
}

When i invoke TestTwo function, the client will alert with an "Hahaha" message. This happens when I do it in the localhost server using xampp. However, when i do the same, at a live server, the ialert message does appear.

  1. Here is my server.config.js settings
module.exports = {
        host : 'dev.helloworld.com',
        port : parseInt('3001'),
        origin : 'dev.helloworld.com:*',
        allowedServers : ["128.1xx.1xx.xx"],
        dbOptions : {"driver":"dummy","config":[]},
        checkClientOrigin : 1,
        sessionVarName : 'PHPSESSID'
};

I am denoting my ip address with x.
dev.helloworld.com is a subdomain of www.helloworld.com

  1. Here is the log file:
info: socket.io started
Listening dev.helloworld.com:3001
Set origin: dev.helloworld.com:*
debug: client authorized
info: handshake authorized xI89zWDdHo4F37Fd3zID
debug: setting request GET /socket.io/1/websocket/xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: client authorized for 
debug: websocket writing 1::
debug: client authorized for /client
debug: websocket writing 1::/client
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
debug: websocket writing 2::
debug: set heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: got heartbeat packet
debug: cleared heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
debug: websocket writing 2::
debug: set heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: got heartbeat packet
debug: cleared heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: served static content /socket.io.js
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
debug: websocket writing 2::
debug: set heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: got heartbeat packet
debug: cleared heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: served static content /socket.io.js
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
debug: websocket writing 2::
debug: set heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: got heartbeat packet
debug: cleared heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
debug: websocket writing 2::
debug: set heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: got heartbeat packet
debug: cleared heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
debug: websocket writing 2::
debug: set heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: got heartbeat packet
debug: cleared heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
debug: websocket writing 2::
debug: set heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: got heartbeat packet
debug: cleared heartbeat timeout for client xI89zWDdHo4F37Fd3zID
debug: set heartbeat interval for client xI89zWDdHo4F37Fd3zID
debug: emitting heartbeat for client xI89zWDdHo4F37Fd3zID
  1. My config file:
 'nodeSocket' => array(
            'class' => 'application.extensions.yii-node-socket.lib.php.NodeSocket',
            'host' => 'dev.helloworld.com',  
            'port' => 3001,      // default is 3001, should be integer
            'allowedServerAddresses'=>array('128.1xx.1xx.xx')
        )

I am not sure why the same code is not invoked in my live server. Alert "hahahaha" is not shown in the client when the event occurs in the server. Localhost server and live server has the same node version and it is:
v0.10.25

I have been stuck for three days and please help.

PostgreSQL database option

Is it possible to replace the fixed MySql dependency with more flexible database options?

It will be so nice to have options for PostgreSql or Redis or Memcached and maybe Mongo.

Типа каналов

  1. Публичный канал

Все пользователи равноправны, создавать события и подключаться к каналу можно как из php так и из javascript

  1. Публичный ограниченный

Событие может создаваться только из php, подключение к каналу также из php

  1. Приватный канал

Только владелец канала может публиковать (создавать) события из php и javascript

  1. Тоже что и приватный только события создавать можно из php

Missing js class YiiNodeSocket

Hello,

Where do you define the YiiNodeSocket javascript class?

I cannot find it anywhere on the files. I get
ReferenceError: YiiNodeSocket is not defined
when I try
var socket = new YiiNodeSocket();

I have called
Yii::app()->nodeSocket->registerClientScripts();
but it does not find client.js and I had to manually install socket.io (it wasn't in your instructions).

Do you know where it could come from or do you need any additional info?

Thanks

Setup With Multi-domain WebApp

Hello,

First off, excellent work on the extension, does exactly what i was looking for. But i am having trouble setting this up on my current app. It supports wildcard sub-domains for users. Meaning it would create a sub-domain for each user when he/she signs up. I am using Yii 1 currently that goes with your tag 2.0.0.
The problem is that a socket is connecting, the log shown below gives details that its not sending expected cookie with the request.

info: socket.io started
Listening site.dev:3001
Set origin: site.dev:* *:*
debug: served static content /socket.io.js
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized tl2FmZm168Sw6OAJOevM
debug: setting request GET /socket.io/1/websocket/tl2FmZm168Sw6OAJOevM
debug: set heartbeat interval for client tl2FmZm168Sw6OAJOevM
debug: client authorized for 
debug: websocket writing 1::
debug: client unauthorized for /client
warn: handshake error NO COOKIE TRANSMITTED for /client
debug: websocket writing 7::/client:undefined
debug: emitting heartbeat for client tl2FmZm168Sw6OAJOevM
debug: websocket writing 2::
debug: set heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: got heartbeat packet
debug: cleared heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: set heartbeat interval for client tl2FmZm168Sw6OAJOevM
debug: emitting heartbeat for client tl2FmZm168Sw6OAJOevM
debug: websocket writing 2::
debug: set heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: got heartbeat packet
debug: cleared heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: set heartbeat interval for client tl2FmZm168Sw6OAJOevM
debug: emitting heartbeat for client tl2FmZm168Sw6OAJOevM
debug: websocket writing 2::
debug: set heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: got heartbeat packet
debug: cleared heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: set heartbeat interval for client tl2FmZm168Sw6OAJOevM
debug: emitting heartbeat for client tl2FmZm168Sw6OAJOevM
debug: websocket writing 2::
debug: set heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: got heartbeat packet
debug: cleared heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: set heartbeat interval for client tl2FmZm168Sw6OAJOevM
debug: emitting heartbeat for client tl2FmZm168Sw6OAJOevM
debug: websocket writing 2::
debug: set heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: got heartbeat packet
debug: cleared heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: set heartbeat interval for client tl2FmZm168Sw6OAJOevM
debug: emitting heartbeat for client tl2FmZm168Sw6OAJOevM
debug: websocket writing 2::
debug: set heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: got heartbeat packet
debug: cleared heartbeat timeout for client tl2FmZm168Sw6OAJOevM
debug: set heartbeat interval for client tl2FmZm168Sw6OAJOevM
debug: emitting heartbeat for client tl2FmZm168Sw6OAJOevM

console config:-

'nodeSocket' => array(
            'class' => 'application.extensions.yii-node-socket.lib.php.NodeSocket',
            'host' => 'site.dev',
            'port' => 3001,
            'origin' => '*:*',
        )

client config:-

'nodeSocket' => array(
            'class' => 'application.extensions.yii-node-socket.lib.php.NodeSocket',
            'host' => 'demo.site.dev',
            'port' => 3001,
            'origin' => '*:*',
        ),

the console shows that socket is trying to connect, but there is no connection.
screenshot_9

If i change my client config to

'host' => 'demo.site.dev',

it works perfectly. But since the domain part will be dynamic i would like this to work on multiple domains with host as site.dev. i guess the socket is not authorizing and hence no connection, any suggestions?

ReferenceError: io is not defined client.js:647

Добрый вечер. Наткнулся на проблему. использовал метериалы демки в папке examples/events.
Выдает ошибку при открытии http://127.0.0.1/nsEventExample/eventListener
ReferenceError: io is not defined client.js:647
Скрипт http://localhost:3001/socket.io/socket.io.js не грузится с сервера, вот и io не видит.

Ставил все по инструкции, только скачивал через composer и запускаю все на виртуалке с помощью vagrant(там дополнительно прокинул 3001 порт)
$ php yiic node-socket start запускается и пишет все отлично.
лог:

info: socket.io started
Listening localhost:3001
Set origin: localhost:*

На самой виртуалке
wget -O - http://localhost:3001 выдает

Распознаётся localhost... ::1, 127.0.0.1
Устанавливается соединение с localhost|::1|:3001... сбой: В соединении отказано.
Устанавливается соединение с localhost|127.0.0.1|:3001... соединение установлено.
Запрос HTTP послан, ожидается ответ... 404 Not Found
то есть, дело не п портах

nodejs я как понимаю почему то не запустился. Нужна помощь)

Unable to autostart node-socket/

Hey guys,

Has anyone worked out how to autostart

./yii node-socket/start

I've installed Forever but not having much luck.
Sorry if this is not the right place for the post.

Problem with Elephant.io - usleep

Библиотека Elephant.io использует не хороший фикс в методе \ElephantIO\Client::write

usleep(100 * 1000);

При каждой передаче сообщения используется задержка в 100mc - и в моем случае получилось так что я в разных местах отправляю сообщения через сокет (не через MultipleFrame) и эти таймауты накладываются(
Если отключить sleep, то больше 50% сообщений не доходят.
Как решить эту проблему нормально?

пс / Пока буду копать в сторону других библиотек.

Not receiving messages and client not connecting to testRoom

SOLUTION FOR NOT RECEIVING MESSAGES: had to enable/install curl in php5 to be able to send messages

First of all, thanks for your excellent extension. If I can get it to work, it would be adding a great touch to my website!
I'm trying for two days to get everything to work. I got the server running and the client gets these messages about socket.io:

1393438028372: Creating new event emitter with scope global client.js:37
1393438028378: Attach event listener for event: invoke client.js:37
1393438028379: Compiled event name: system:invoke client.js:37
1393438028379: Attach event listener for event: jquery client.js:37
1393438028379: Compiled event name: system:jquery client.js:37
1393438028380: Attach event listener for event: updateBoard client.js:37
1393438028380: Compiled event name: global:updateBoard client.js:37
1393438028380: Attach event listener for event: global.event client.js:37
1393438028380: Compiled event name: global:global.event client.js:37
1393438028381: Creating new event emitter with scope room:testRoom client.js:37
1393438028381: Attach event listener for event: invoke client.js:37
1393438028381: Compiled event name: system:invoke client.js:37
1393438028381: Attach event listener for event: jquery client.js:37
1393438028382: Compiled event name: system:jquery client.js:37
1393438028382: Attach event listener for event: system:update.members_count client.js:37
1393438028382: Compiled event name: room:testRoom:system:update.members_count client.js:37
1393438028382: Tying to join in room testRoom 

It does seem that the client never connects to the testRoom (the socket.room('testRoom').join()-function never triggers).

Also, it is not clear to me how to send messages to my clients. Should it be included in a controller action like this?

public function actionSend() {
        //Yii::app()->nodeSocket->registerClientScripts();
        $invokeFrame = Yii::app()->nodeSocket->getFrameFactory()->createInvokeFrame();
        $invokeFrame->invokeFunction('alert', array('Hello world'));
        $invokeFrame->send();
}

My log looks like this:

info: socket.io started
Listening 192.168.77.128:3001
Set origin: 192.168.77.128:*
debug: served static content /socket.io.js
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized _GDIpa0-ovcU12yEUa6l
debug: setting request GET /socket.io/1/websocket/_GDIpa0-ovcU12yEUa6l
debug: set heartbeat interval for client _GDIpa0-ovcU12yEUa6l
debug: client authorized for 
debug: websocket writing 1::
debug: client authorized for /client
debug: websocket writing 1::/client
debug: emitting heartbeat for client _GDIpa0-ovcU12yEUa6l
debug: websocket writing 2::
debug: set heartbeat timeout for client _GDIpa0-ovcU12yEUa6l
debug: got heartbeat packet
.... (and more)

NodeSocket and its behaviors do not have a method or closure named "createEventFrame".

Hi,
I very happy when I did find your extension. I need especially a solution like this.
I did everithing above, git clone what needed and I also extend the config files.
After that the npm install finishes its work in the .../server folder, So, everithing is done.

But when I try to start the server in the console by yiic node-socket start, it do nothing, only:

C:\xampp\htdocs\myapp\framework>yiic node-socket
Yii command runner (based on Yii v1.1.14)
Usage: C:\xampp\htdocs\myapp\framework\yiic [parameters...]

The following commands are available:

  • message
  • migrate
  • shell
  • webapp

To see individual command help, use the following:
C:\xampp\htdocs\myapp\framework\yiic help

And when I try to
http://localhost/myapp/nsEventExample/sendEvent

it writes NodeSocket and its behaviors do not have a method or closure named "createEventFrame".

Could you help me in this?

How to register NodeSocketAssets?

Как правильно добавить скрипты в Yii2?
Прочитал Depricated in Yii 2.0 - The Asset Manager registers the files on demand. Но не совсем понятно на этом этапе.

Имеется ввиду, что нужно добавить в контроллер view
use app\assets\NodeJsAsset;
NodeJsAsset::register($this); ?

Doens't work on YII2

Hello,
all channel models doens't work on yii2 so we cannot subscribe/use channel.

Не происходит вход в комнату

Уже всю голову себе сломал.
WIndows 7
yii-node-socket 0.1

на клиенте

1395751430205: Creating new event emitter with scope global
nodeSo...ient.js (строка 37)
GET http://findaflat.dev:2002/socket.io/1/?t=1395751430208

200 OK
2ms
socket.js (строка 1659)
1395751430211: Attach event listener for event: invoke
nodeSo...ient.js (строка 37)
1395751430213: Compiled event name: system:invoke
nodeSo...ient.js (строка 37)
1395751430214: Attach event listener for event: jquery
nodeSo...ient.js (строка 37)
1395751430215: Compiled event name: system:jquery
nodeSo...ient.js (строка 37)
GET http://findaflat.dev:2002/socket.io/1/xhr-polling/9H9Sdib16e8MR29_Op2h?t=1395751430327

200 OK

1395751430354: Creating new event emitter with scope room:chat_1244_48_42
nodeSo...ient.js (строка 37)
1395751430355: Attach event listener for event: system:update.members_count
nodeSo...ient.js (строка 37)
1395751430356: Compiled event name: room:chat_1244_48_42:system:update.members_count
nodeSo...ient.js (строка 37)
1395751430357: Trying to join in room chat_1244_48_42

и после этого все. причем emit работает вроде бы, но события в клиент не приходят!

содержимое socket-transport.server.log

debug: setting request GET /socket.io/1/xhr-polling/2pajTMzIFCZmkgHyOp2f?t=1395751120154
debug: setting poll timeout
debug: client authorized for
debug: clearing poll timeout
debug: xhr-polling writing 1::
debug: set close timeout for client 2pajTMzIFCZmkgHyOp2f
debug: xhr-polling received data packet 5:1+::{"name":"room_join","args":["chat_1244_48_42"]}
debug: setting request GET /socket.io/1/xhr-polling/2pajTMzIFCZmkgHyOp2f?t=1395751120219
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 2pajTMzIFCZmkgHyOp2f
debug: xhr-polling received data packet 5:::{"name":"event:emit","args":[{"event":"newMessage","scope":{"type":"room","id":"chat_1244_48_42"},"data":{"text":"sadsa","direction":0,"status":0,"date_time":"25 марта 2014","tms":1395751137,"is_special":false}}]}
debug: clearing poll timeout
debug: xhr-polling writing 8::
debug: set close timeout for client 2pajTMzIFCZmkgHyOp2f
debug: xhr-polling closed due to exceeded duration
debug: setting request GET /socket.io/1/xhr-polling/2pajTMzIFCZmkgHyOp2f?t=1395751140262

Problem with Client Connection

Very interesting solution, but I have a problem to make it run "can not get the connection of socket.io client web server." You can add more examples for this.

Working only locally

I put the project to operate according to specifications.
But only works localhost when I try to access another machine not working.
He tries to read files on http: // localhost: 3001 ... and can not find the files.
What is wrong?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.