基于 webman + GatewayWorker 開發(fā)的一個(gè)推送服務(wù)應(yīng)用插件,客戶端基于訂閱模式 兼容 pusher。
下載源碼放入plugin目錄下,restart重啟webman。
訪問 http://127.0.0.1:8787/app/pusher 會(huì)自動(dòng)進(jìn)入安裝頁面,按照提示安裝組件,設(shè)置數(shù)據(jù)庫、Redis及Pusher配置信息。
安裝配置完成后 關(guān)閉重啟webman
,即可使用。
\plugin\pusher\app\service\Channel::publish(
'public', // channel
'message', // event
json_encode([1, 2, 3, 4, 5, 6, 7, 8, 9]), // data
null // exclude_socket_id
);
\plugin\pusher\app\service\Channel::list($type = null); // $type: public、private、presence
\plugin\pusher\app\service\Channel::info($channel);
// connect
var id = Math.ceil(Math.random() * 100);
var pusher = new Pusher("ac584d0fde81dedab1ec8dd1ac51c2db", {
forceTLS: false,
wsHost: '127.0.0.1',
wsPort: 8801,
channelAuthorization: {
endpoint: 'http://127.0.0.1:8787/app/pusher/connect/auth',
params: {
access_key: "ac584d0fde81dedab1ec8dd1ac51c2db",
user_id: id,
user_info: JSON.stringify({ 'name': '張三' + id })
}
}
})
// error
pusher.connection.bind("error", function (err) {
? ? console.log(JSON.stringify(err));
? ? // disconnect
? ? if (-1 === err.data.code) {
? ? ? ? pusher.connection.disconnect();
? ? }
});
// Public channels
var public = pusher.subscribe('public');
// Subscription succeeded
public.bind("pusher:subscription_succeeded", () => {
? ? console.log('public subscription_succeeded');
});
// custom event
public.bind('message', function (data) {
? ? console.log('public-message:' + JSON.stringify(data));
});
// Private channels
var private = pusher.subscribe('private-message');
// Subscription succeeded
private.bind("pusher:subscription_succeeded", () => {
? ? console.log('private subscription_succeeded');
});
// custom event
private.bind('client-message', function (data) {
? ? console.log('private-client-message:' + JSON.stringify(data));
});
// Private channels (Client push)
var client = pusher.subscribe('private-push');
// custom event
client.bind('message', function (data) {
? ? console.log('client-push-message:' + JSON.stringify(data));
? ? private.trigger('client-message', JSON.stringify(data));
});
// Presence channels
var presence = pusher.subscribe("presence-message");
// Subscription succeeded
presence.bind("pusher:subscription_succeeded", (data) => {
? ? console.log('presence subscription_succeeded:' + JSON.stringify(data));
});
// add member
presence.bind("pusher:member_added", (data) => {
? ? console.log('member_added:' + JSON.stringify(data));
});
// remove member
presence.bind("pusher:member_removed", (data) => {
? ? console.log('member_removed:' + JSON.stringify(data));
});
// custom event
presence.bind("message", (data) => {
? ? console.log('member_removed:' + JSON.stringify(data));
});
|Header|類型|說明|
|:---- ? ?|:----- |----- ? |
|x-pusher-signature |string |簽名 ?|
簽名:
hash_hmac('sha256', 請(qǐng)求數(shù)據(jù)包, 密鑰, false)
{
? "time_ms": 1661132991.891466,
? "events": {
? ? "channel_added": [
? ? ? {
? ? ? ? "type": "public",
? ? ? ? "channel": "public"
? ? ? },
? ? ? {
? ? ? ? "type": "private",
? ? ? ? "channel": "private-message"
? ? ? }
? ? ],
? ? "channel_removed": [
? ? ? {
? ? ? ? "type": "private",
? ? ? ? "channel": "private-push"
? ? ? },
? ? ? {
? ? ? ? "type": "presence",
? ? ? ? "channel": "presence-message"
? ? ? }
? ? ],
? ? "user_added": {
? ? ? "presence-message": [
? ? ? ? {
? ? ? ? ? "channel": "presence-message",
? ? ? ? ? "user_id": 49,
? ? ? ? ? "user_info": "{\"name\":\"張三49\"}"
? ? ? ? }
? ? ? ]
? ? },
? ? "user_removed": {
? ? ? "presence-message": [
? ? ? ? {
? ? ? ? ? "channel": "presence-message",
? ? ? ? ? "user_id": 37,
? ? ? ? ? "user_info": "{\"name\":\"張三37\"}"
? ? ? ? }
? ? ? ]
? ? }
? }
}
整個(gè)數(shù)據(jù)包為
JSON
數(shù)據(jù)
|參數(shù)名|類型|說明|
|:---- ? ?|:----- |----- ? |
|time_ms |string |毫秒時(shí)間戳 ? |
|events |array | 事件 ? ?|