digitv/yii2sockets

Node.js web-sockets 支持

安装: 606

依赖: 0

建议: 0

安全: 0

星标: 5

关注者: 4

分支: 4

开放问题: 1

语言:JavaScript

类型:yii2-extension

1.0.7 2022-09-20 10:09 UTC

This package is auto-updated.

Last update: 2024-09-20 15:31:08 UTC


README

Node.js 服务器集成模块(web-sockets)

使用 composer 安装

composer require digitv/yii2sockets:1.*

将控制命令控制器添加到配置(controllerMap 部分

'controllerMap' => [
    ...
    'node-sockets' => '\digitv\yii2sockets\commands\YiiNodeSocketsController',
    ...
],

将会话组件添加到主配置的 'components' 部分

'components' => [
    ...
        'session' => [
            'class' => 'digitv\yii2sockets\YiiNodeSocketSession',
            'keyPrefix' => 'sess_preffix_',
            'timeout' => 600,
        ],
    ...
]

它使用 Redis 数据库连接来与 Node.js 服务器共享会话数据。当然,您必须使用 Redis 组件来连接 Redis 数据库。在两个配置(web 和主)中添加它。

'components' => [
    ...
        'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => 'localhost',
            'port' => 6379,
            'database' => 0,
        ],
    ...
]

并将组件添加到这些配置中(https 尚未实现

'components' => [
    ...
        'nodeSockets' => [
            'class' => 'digitv\yii2sockets\YiiNodeSocket',
            'nodeJsHost' => 'localhost',
            'nodeJsPort' => 3001,
            'nodeJsScheme' => 'http',
            'nodeJsHostClient' => 'your-site.com',
            'serviceKey' => 'serviceKeyUsedForCommunication',
            'sessionKeyPrefix' => 'sess_preffix_',
            'channelsByPermissions' => [
                'channel_name' => 'permission',
                'channel_name_2' => [
                    'permission' => '@',
                    'url' => '/chat/index',     //URL on which users can connect to channel
                ],
            ],
        ],
    ...
]

参数 channelsByPermissions 是一个包含频道名称和权限的数组。如果 Yii::$app->user->can('permission') 返回 TRUE,则频道 channel_name 将自动添加到用户。它在组件初始化时运行。

配置就绪后,使用控制台命令构建 Node.js 配置文件

./yii node-sockets/init

Node.js 服务器

服务器位于 server 子目录中。在首次运行之前,您必须安装所有 Node.js 模块。转到 server 目录,并使用以下命令安装它们:

npm install

现在您可以运行服务器

node app.js

您可以使用环境变量来覆盖配置选项。例如

NODE_ENV=production node app.js

在这种情况下,它以禁用调试信息的生产模式运行。

消息

有 3 种消息类(我称之为帧)

  1. 基本(YiiNodeSocketFrameBasic)用于基本消息。

  2. jQuery(YiiNodeSocketFrameJQuery)用于 jQuery DOM 操作。

  3. 通知(YiiNodeSocketFrameGrowl)使用 kartik-v/yii2-widget-growl 向用户显示消息。

  4. 警报(YiiNodeSocketFrameAlert)向用户播放音频警报。

示例

向频道 test_channel 发送具有数组 [] 体部的消息。在前端将使用 JavaScript 回调 jsCallbackName

Yii::$app->nodeSockets->newMessage()
    ->setBody([
        'id' => $model->id,
        'message' => Yii::t('app', 'You have new incoming call'),
    ])
    ->setChannel('test_channel')
    ->setCallback('jsCallbackName')
    ->send();

向此套接字发送消息(示例用于 AJAX 请求)。

Yii::$app->nodeSockets->newNotify()
    ->setText('Hello world')
    ->sendToThis();

向用户 ID 1 发送 jQuery 帧以删除具有选择器 #element_selector 的元素。

Yii::$app->nodeSockets->newJQuery()
    ->remove('#element_selector')
    ->setUser(1)
    ->send();

向所有浏览器窗口(包括非活动窗口)的频道 test_channel 发送警报帧

Yii::$app->nodeSockets->newAlert()
    ->setAudioId('audio_element_id')
    ->setChannel('test_channel')
    ->onlyActiveWindow(false)
    ->send();

请注意,您需要渲染包含 <audio> 元素的块才能播放它。

还包括示例 YiiNodeSocketFrameChat 帧类型,该类型根据其内容发送消息

  1. recipient_idauthor_id,如果对象包含这两个属性;
  2. 否则,到自动组合的 channel。您可以在帧源中查看详细信息。
$message = new ChatMessage([
    'recipient_id' => 4,
    'author_id' => 1,
    'message' => 'test text message',
]);

Yii::$app->nodeSockets->newChat()
    ->setMessage($message)
    ->send();

JavaScript 回调示例

YiiNodeSockets.callbacks.jsCallbackName = function (message, _socket) {
    console.log(message.body);
};