Refactor to make the maintanance simpler
- Fixed issue with webhooks
This commit is contained in:
@@ -0,0 +1,274 @@
|
||||
// Copyright 2014 Claudemiro Alves Feitosa Neto. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package events
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
log "github.com/golang/glog"
|
||||
|
||||
"ipe/subscription"
|
||||
)
|
||||
|
||||
// {
|
||||
// "event": "pusher:subscribe",
|
||||
// "data": {
|
||||
// "channel": "the channel",
|
||||
// "auth": "the auth",
|
||||
// "channelData": "extra data"
|
||||
// }
|
||||
// }
|
||||
type SubscribeData struct {
|
||||
Channel string `json:"channel"`
|
||||
Auth string `json:"auth,omitempty"`
|
||||
ChannelData string `json:"channel_data,omitempty"`
|
||||
}
|
||||
|
||||
type Subscribe struct {
|
||||
Event string `json:"event"`
|
||||
Data SubscribeData `json:"data"`
|
||||
}
|
||||
|
||||
// Create a new subscribe event with the specified channel and data
|
||||
func NewSubscribe(channel, auth, channelData string) Subscribe {
|
||||
data := SubscribeData{Channel: channel, Auth: auth, ChannelData: channelData}
|
||||
return Subscribe{Event: "pusher:subscribe", Data: data}
|
||||
}
|
||||
|
||||
type UnsubscribeData struct {
|
||||
Channel string `json:"channel"`
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "pusher:unsubscribe",
|
||||
// "data": {
|
||||
// "channel": "The channel"
|
||||
// }
|
||||
// }
|
||||
type Unsubscribe struct {
|
||||
Event string `json:"event"`
|
||||
Data UnsubscribeData `json:"data"`
|
||||
}
|
||||
|
||||
// Create a new unsubscribe event for the specified channel
|
||||
func NewUnsubscribe(channel string) Unsubscribe {
|
||||
data := UnsubscribeData{Channel: channel}
|
||||
return Unsubscribe{Event: "pusher:unsubscribe", Data: data}
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "pusher_internal:subscription_succeeded",
|
||||
// "channel": "the channel"
|
||||
// }
|
||||
type SubscriptionSucceeded struct {
|
||||
Event string `json:"event"`
|
||||
Channel string `json:"channel"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
// Create a new subscription succeed event for the specified channel
|
||||
func NewSubscriptionSucceeded(channel, data string) SubscriptionSucceeded {
|
||||
return SubscriptionSucceeded{Event: "pusher_internal:subscription_succeeded", Channel: channel, Data: data}
|
||||
}
|
||||
|
||||
// Data Subscription Succeed
|
||||
|
||||
// "{
|
||||
// \"presence\": {
|
||||
// \"ids\": [\"11814b369700141b222a3f3791cec2d9\",\"71dd6a29da2a4833336d2a964becf820\"],
|
||||
// \"hash\": {
|
||||
// \"11814b369700141b222a3f3791cec2d9\": {
|
||||
// \"name\":\"Phil Leggetter\",
|
||||
// \"twitter\": \"@leggetter\"
|
||||
// },
|
||||
// \"71dd6a29da2a4833336d2a964becf820\": {
|
||||
// \"name\":\"Max Williams\",
|
||||
// \"twitter\": \"@maxthelion\"
|
||||
// }
|
||||
// },
|
||||
// \"count\": 2
|
||||
// }
|
||||
// }"
|
||||
type SubscriptionSucceededPresenceData struct {
|
||||
Ids []string `json:"ids"`
|
||||
Hash map[string]interface{} `json:"hash"`
|
||||
Count int `json:"count"`
|
||||
}
|
||||
|
||||
func NewSubscriptionSucceedPresenceData(subscriptions map[string]*subscription.Subscription) SubscriptionSucceededPresenceData {
|
||||
event := SubscriptionSucceededPresenceData{}
|
||||
|
||||
var (
|
||||
ids []string
|
||||
hash = make(map[string]interface{}, len(subscriptions))
|
||||
)
|
||||
|
||||
for _, s := range subscriptions {
|
||||
// Do you have any other idea?
|
||||
var js interface{}
|
||||
if err := json.Unmarshal([]byte(s.Data), &js); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
hash[s.ID] = js
|
||||
ids = append(ids, s.ID)
|
||||
}
|
||||
|
||||
event.Ids = ids
|
||||
event.Hash = hash
|
||||
event.Count = len(subscriptions)
|
||||
|
||||
return event
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "pusher:pong",
|
||||
// "data": {}
|
||||
// }
|
||||
type Pong struct {
|
||||
Event string `json:"event"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
// Create a new pong event
|
||||
func NewPong() Pong {
|
||||
return Pong{Event: "pusher:pong", Data: "{}"}
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "pusher:ping",
|
||||
// "data": {}
|
||||
// }
|
||||
type Ping struct {
|
||||
Event string `json:"event"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
// Create a new ping event
|
||||
func NewPing() Ping {
|
||||
return Ping{Event: "pusher:ping", Data: "{}"}
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "pusher:error",
|
||||
// "data": {
|
||||
// "message": "A Message",
|
||||
// "code": 4000
|
||||
// }
|
||||
// }
|
||||
type Error struct {
|
||||
Event string `json:"event"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
||||
|
||||
// Create a new error event
|
||||
// Pusher protocol is very strange in some parts
|
||||
// It send null in some errors.
|
||||
func NewError(code int, message string) Error {
|
||||
var data = struct {
|
||||
Code *int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}{
|
||||
Message: message,
|
||||
}
|
||||
|
||||
if code == 0 {
|
||||
data.Code = nil
|
||||
} else {
|
||||
data.Code = &code
|
||||
}
|
||||
|
||||
return Error{Event: "pusher:error", Data: data}
|
||||
}
|
||||
|
||||
// {
|
||||
// "event" : "pusher:connection_established",
|
||||
// "data" : {
|
||||
// "socket_id" : "123456",
|
||||
// "activity_timeout" : 120
|
||||
// }
|
||||
// }
|
||||
type ConnectionEstablished struct {
|
||||
Event string `json:"event"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
// Create a new connection established event using the specified socketId
|
||||
func NewConnectionEstablished(socketID string) ConnectionEstablished {
|
||||
b, err := json.Marshal(struct {
|
||||
SocketID string `json:"socket_id"`
|
||||
ActivityTimeout int `json:"activity_timeout"`
|
||||
}{
|
||||
SocketID: socketID, ActivityTimeout: 120,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
panic("events: Could not Marshal json ConnectionEstablishedEvent")
|
||||
}
|
||||
|
||||
return ConnectionEstablished{Event: "pusher:connection_established", Data: string(b)}
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "pusher_internal:member_added",
|
||||
// "channel": "presence-example-channel",
|
||||
// "data": String
|
||||
// }
|
||||
type MemberAdded struct {
|
||||
Event string `json:"event"`
|
||||
Channel string `json:"channel"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
func NewMemberAdded(channel, data string) MemberAdded {
|
||||
return MemberAdded{Event: "pusher_internal:member_added", Channel: channel, Data: data}
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "pusher_internal:member_removed",
|
||||
// "channel": "presence-example-channel",
|
||||
// "data": String
|
||||
// }
|
||||
type MemberRemoved struct {
|
||||
Event string `json:"event"`
|
||||
Channel string `json:"channel"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
func NewMemberRemoved(channel string, userID string) MemberRemoved {
|
||||
data, err := json.Marshal(struct {
|
||||
UserID string `json:"user_id"`
|
||||
}{
|
||||
UserID: userID,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
|
||||
return MemberRemoved{Event: "pusher_internal:member_removed", Channel: channel, Data: string(data)}
|
||||
}
|
||||
|
||||
// {
|
||||
// "event": "client-?",
|
||||
// "channel": "The channel",
|
||||
// "data": {}
|
||||
// }
|
||||
type Raw struct {
|
||||
Event string `json:"event"`
|
||||
Channel string `json:"channel"`
|
||||
Data json.RawMessage `json:"data"`
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
Event string `json:"event"`
|
||||
Channel string `json:"channel"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
||||
|
||||
// The response event that is broadcasted to the client sockets
|
||||
func NewResponse(name, channel string, data interface{}) Response {
|
||||
return Response{Event: name, Channel: channel, Data: data}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package events
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test_newErrorEvent_with_invalid_code(t *testing.T) {
|
||||
event := NewError(0, "The error message")
|
||||
|
||||
data, _ := json.Marshal(event)
|
||||
expected := `{"event":"pusher:error","data":{"code":null,"message":"The error message"}}`
|
||||
|
||||
if bytes.Compare(data, []byte(expected)) != 0 {
|
||||
t.Errorf("%s != %s", string(data), expected)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_newErrorEvent_with_valid_code(t *testing.T) {
|
||||
event := NewError(4007, "Unsupported protocol version")
|
||||
|
||||
data, _ := json.Marshal(event)
|
||||
expected := `{"event":"pusher:error","data":{"code":4007,"message":"Unsupported protocol version"}}`
|
||||
|
||||
if bytes.Compare(data, []byte(expected)) != 0 {
|
||||
t.Errorf("%s != %s", string(data), expected)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user