There is no reason to export this functions and this types.

This commit is contained in:
claudemiro
2015-01-31 15:12:54 -03:00
parent d74426127c
commit 201cba86a9
14 changed files with 193 additions and 195 deletions
+22 -22
View File
@@ -14,7 +14,7 @@ import (
)
// An App
type App struct {
type app struct {
sync.Mutex
Name string
@@ -27,22 +27,22 @@ type App struct {
WebHooks bool
URLWebHook string
Channels map[string]*Channel `json:"-"`
Connections map[string]*Connection `json:"-"`
Channels map[string]*channel `json:"-"`
Connections map[string]*connection `json:"-"`
Stats *expvar.Map `json:"-"`
}
// Alloc memory for Connections and Channels
func (a *App) Init() {
a.Connections = make(map[string]*Connection)
a.Channels = make(map[string]*Channel)
func (a *app) Init() {
a.Connections = make(map[string]*connection)
a.Channels = make(map[string]*channel)
a.Stats = expvar.NewMap(fmt.Sprintf("%s (%s)", a.Name, a.AppID))
}
// Only Presence channels
func (a *App) PresenceChannels() []*Channel {
var channels []*Channel
func (a *app) PresenceChannels() []*channel {
var channels []*channel
for _, c := range a.Channels {
if c.IsPresence() {
@@ -54,8 +54,8 @@ func (a *App) PresenceChannels() []*Channel {
}
// Only Private channels
func (a *App) PrivateChannels() []*Channel {
var channels []*Channel
func (a *app) PrivateChannels() []*channel {
var channels []*channel
for _, c := range a.Channels {
if c.IsPrivate() {
@@ -67,8 +67,8 @@ func (a *App) PrivateChannels() []*Channel {
}
// Only Public channels
func (a *App) PublicChannels() []*Channel {
var channels []*Channel
func (a *app) PublicChannels() []*channel {
var channels []*channel
for _, c := range a.Channels {
if c.IsPublic() {
@@ -80,7 +80,7 @@ func (a *App) PublicChannels() []*Channel {
}
// Disconnect Socket
func (a *App) Disconnect(socketID string) {
func (a *app) Disconnect(socketID string) {
log.Infof("Disconnecting socket %+v", socketID)
conn, err := a.FindConnection(socketID)
@@ -113,7 +113,7 @@ func (a *App) Disconnect(socketID string) {
}
// Connect a new Subscriber
func (a *App) Connect(conn *Connection) {
func (a *app) Connect(conn *connection) {
log.Infof("Adding a new Connection %s to app %s", conn.SocketID, a.Name)
a.Lock()
defer a.Unlock()
@@ -124,7 +124,7 @@ func (a *App) Connect(conn *Connection) {
}
// Find a Connection on this app
func (a *App) FindConnection(socketID string) (*Connection, error) {
func (a *app) FindConnection(socketID string) (*connection, error) {
conn, exists := a.Connections[socketID]
if exists {
@@ -135,7 +135,7 @@ func (a *App) FindConnection(socketID string) (*Connection, error) {
}
// DeleteChannel removes the channel from app
func (a *App) RemoveChannel(c *Channel) {
func (a *app) RemoveChannel(c *channel) {
log.Infof("Remove the channel %s from app %s", c.ChannelID, a.Name)
a.Lock()
defer a.Unlock()
@@ -158,7 +158,7 @@ func (a *App) RemoveChannel(c *Channel) {
}
// Add a new Channel to this APP
func (a *App) AddChannel(c *Channel) {
func (a *app) AddChannel(c *channel) {
log.Infof("Adding a new channel %s to app %s", c.ChannelID, a.Name)
a.Lock()
@@ -183,7 +183,7 @@ func (a *App) AddChannel(c *Channel) {
// Returns a Channel from this app
// If not found then the channel is created and added to this app
func (a *App) FindOrCreateChannelByChannelID(n string) *Channel {
func (a *app) FindOrCreateChannelByChannelID(n string) *channel {
c, err := a.FindChannelByChannelID(n)
if err != nil {
@@ -195,7 +195,7 @@ func (a *App) FindOrCreateChannelByChannelID(n string) *Channel {
}
// Find the channel by channel ID
func (a *App) FindChannelByChannelID(n string) (*Channel, error) {
func (a *app) FindChannelByChannelID(n string) (*channel, error) {
c, exists := a.Channels[n]
if exists {
@@ -205,16 +205,16 @@ func (a *App) FindChannelByChannelID(n string) (*Channel, error) {
return nil, errors.New("Channel does not exists")
}
func (a *App) Publish(c *Channel, event RawEvent, ignore string) error {
func (a *app) Publish(c *channel, event rawEvent, ignore string) error {
a.Stats.Add("TotalUniqueMessages", 1)
return c.Publish(a, event, ignore)
}
func (a *App) Unsubscribe(c *Channel, conn *Connection) error {
func (a *app) Unsubscribe(c *channel, conn *connection) error {
return c.Unsubscribe(a, conn)
}
func (a *App) Subscribe(c *Channel, conn *Connection, data string) error {
func (a *app) Subscribe(c *channel, conn *connection, data string) error {
return c.Subscribe(a, conn, data)
}
+2 -2
View File
@@ -11,9 +11,9 @@ import (
var id = 0
func newApp() *App {
func newApp() *app {
a := App{Name: "Test", AppID: strconv.Itoa(id), Key: "123", Secret: "123", OnlySSL: false, ApplicationDisabled: false, UserEvents: true}
a := app{Name: "Test", AppID: strconv.Itoa(id), Key: "123", Secret: "123", OnlySSL: false, ApplicationDisabled: false, UserEvents: true}
a.Init()
id++
+18 -18
View File
@@ -15,46 +15,46 @@ import (
)
// A Channel
type Channel struct {
type channel struct {
sync.Mutex
CreatedAt time.Time
ChannelID string
Subscriptions map[string]*Subscription
Subscriptions map[string]*subscription
}
// Return true if the channel has at least one subscriber
func (c *Channel) IsOccupied() bool {
func (c *channel) IsOccupied() bool {
return c.TotalSubscriptions() > 0
}
// Check if the type of the channel is presence or is private
func (c *Channel) IsPresenceOrPrivate() bool {
func (c *channel) IsPresenceOrPrivate() bool {
return c.IsPresence() || c.IsPrivate()
}
// Check if the type of the channel is public
func (c *Channel) IsPublic() bool {
func (c *channel) IsPublic() bool {
return !c.IsPresenceOrPrivate()
}
// Check if the type of the channel is presence
func (c *Channel) IsPresence() bool {
func (c *channel) IsPresence() bool {
return strings.HasPrefix(c.ChannelID, "presence-")
}
// Check if the type of the channel is private
func (c *Channel) IsPrivate() bool {
func (c *channel) IsPrivate() bool {
return strings.HasPrefix(c.ChannelID, "private-")
}
// Get the total of subscribers
func (c *Channel) TotalSubscriptions() int {
func (c *channel) TotalSubscriptions() int {
return len(c.Subscriptions)
}
// Get the total of users.
func (c *Channel) TotalUsers() int {
func (c *channel) TotalUsers() int {
total := make(map[string]int)
for _, s := range c.Subscriptions {
@@ -65,7 +65,7 @@ func (c *Channel) TotalUsers() int {
}
// Add a new subscriber to the channel
func (c *Channel) Subscribe(a *App, conn *Connection, channelData string) error {
func (c *channel) Subscribe(a *app, conn *connection, channelData string) error {
log.Infof("Subscribing %s to channel %s", conn.SocketID, c.ChannelID)
c.Lock()
@@ -105,7 +105,7 @@ func (c *Channel) Subscribe(a *App, conn *Connection, channelData string) error
a.TriggerMemberAddedHook(c, subscription)
// pusher_internal:subscription_succeeded
data := make(map[string]SubscriptionSucceeedEventPresenceData)
data := make(map[string]subscriptionSucceeedEventPresenceData)
data["presence"] = newSubscriptionSucceedEventPresenceData(c)
js, err = json.Marshal(data)
@@ -129,14 +129,14 @@ func (c *Channel) Subscribe(a *App, conn *Connection, channelData string) error
}
// IsSubscribed check if the user is subscribed
func (c *Channel) IsSubscribed(conn *Connection) bool {
func (c *channel) IsSubscribed(conn *connection) bool {
_, exists := c.Subscriptions[conn.SocketID]
return exists
}
// Remove the subscriber from the channel
// It destroy the channel if the channels does not have any subscribers.
func (c *Channel) Unsubscribe(a *App, conn *Connection) error {
func (c *channel) Unsubscribe(a *app, conn *connection) error {
log.Infof("Unsubscribing %s from channel %s", conn.SocketID, c.ChannelID)
c.Lock()
@@ -169,14 +169,14 @@ func (c *Channel) Unsubscribe(a *App, conn *Connection) error {
}
// Create a new Channel
func newChannel(channelID string) *Channel {
func newChannel(channelID string) *channel {
log.Infof("Creating a new channel: %s", channelID)
return &Channel{ChannelID: channelID, CreatedAt: time.Now(), Subscriptions: make(map[string]*Subscription)}
return &channel{ChannelID: channelID, CreatedAt: time.Now(), Subscriptions: make(map[string]*subscription)}
}
// Publish a MemberAddedEvent to all subscriptions
func (c *Channel) PublishMemberAddedEvent(a *App, data string, subscription *Subscription) {
func (c *channel) PublishMemberAddedEvent(a *app, data string, subscription *subscription) {
for _, subs := range c.Subscriptions {
if subs != subscription {
subs.Connection.Publish(newMemberAddedEvent(c.ChannelID, data))
@@ -185,7 +185,7 @@ func (c *Channel) PublishMemberAddedEvent(a *App, data string, subscription *Sub
}
// Publish a MemberRemovedEvent to all subscriptions
func (c *Channel) PublishMemberRemovedEvent(a *App, subscription *Subscription) {
func (c *channel) PublishMemberRemovedEvent(a *app, subscription *subscription) {
for _, subs := range c.Subscriptions {
if subs != subscription {
subs.Connection.Publish(newMemberRemovedEvent(c.ChannelID, subscription))
@@ -194,7 +194,7 @@ func (c *Channel) PublishMemberRemovedEvent(a *App, subscription *Subscription)
}
// Publish messages to all Subscribers
func (c *Channel) Publish(a *App, event RawEvent, ignore string) error {
func (c *channel) Publish(a *app, event rawEvent, ignore string) error {
b, err := event.Data.MarshalJSON()
if err != nil {
+14 -14
View File
@@ -10,44 +10,44 @@ import (
)
// The config file
type ConfigFile struct {
type configFile struct {
Host string // The host, eg: :8080 will start on 0.0.0.0:8080
Expvar bool
User string
Password string
Apps []*App
Apps []*app
}
// Error for App not found
var AppNotFoundError = errors.New("App not found")
// Initialize Apps
func (c *ConfigFile) Init() {
func (c *configFile) Init() {
for _, app := range c.Apps {
app.Init()
}
}
func (c *ConfigFile) WasProvidedUserAndPassword() bool {
func (c *configFile) WasProvidedUserAndPassword() bool {
return len(strings.TrimSpace(c.User)) > 0 && len(strings.TrimSpace(c.Password)) > 0
}
// Returns an App with by appID
func (c *ConfigFile) GetAppByAppID(appID string) (*App, error) {
for _, app := range c.Apps {
if app.AppID == appID {
return app, nil
func (c *configFile) GetAppByAppID(appID string) (*app, error) {
for _, a := range c.Apps {
if a.AppID == appID {
return a, nil
}
}
return &App{}, AppNotFoundError
return &app{}, AppNotFoundError
}
// Returns an App with by key
func (c *ConfigFile) GetAppByKey(key string) (*App, error) {
for _, app := range c.Apps {
if app.Key == key {
return app, nil
func (c *configFile) GetAppByKey(key string) (*app, error) {
for _, a := range c.Apps {
if a.Key == key {
return a, nil
}
}
return &App{}, AppNotFoundError
return &app{}, AppNotFoundError
}
+4 -4
View File
@@ -10,20 +10,20 @@ import (
)
// An User Connection
type Connection struct {
type connection struct {
SocketID string
Socket *websocket.Conn
}
// Create a new Subscriber
func newConnection(socketID string, s *websocket.Conn) *Connection {
func newConnection(socketID string, s *websocket.Conn) *connection {
log.Infof("Creating a new Subscriber %+v", socketID)
return &Connection{SocketID: socketID, Socket: s}
return &connection{SocketID: socketID, Socket: s}
}
// Publish the message to websocket atached to this client
func (conn *Connection) Publish(m interface{}) {
func (conn *connection) Publish(m interface{}) {
go func() {
if err := conn.Socket.WriteJSON(m); err != nil {
log.Errorf("Error publishing message to connection %+v, %s", conn, err)
+44 -44
View File
@@ -5,114 +5,114 @@
package ipe
// Base interface
type WebsocketError interface {
type websocketError interface {
GetCode() int
GetMsg() string
}
// Base struct
type BaseWebsocketError struct {
type baseWebsocketError struct {
Code int
Msg string
}
func (e BaseWebsocketError) GetCode() int {
func (e baseWebsocketError) GetCode() int {
return e.Code
}
func (e BaseWebsocketError) GetMsg() string {
func (e baseWebsocketError) GetMsg() string {
return e.Msg
}
// Unsupprted protocol version
type UnsupportedProtocolVersionError struct {
BaseWebsocketError
type unsupportedProtocolVersionError struct {
baseWebsocketError
}
func newUnsupportedProtocolVersionError() UnsupportedProtocolVersionError {
return UnsupportedProtocolVersionError{
BaseWebsocketError{Code: UNSUPPORTED_PROTOCOL_VERSION, Msg: "Unsupported protocol version"},
func newUnsupportedProtocolVersionError() unsupportedProtocolVersionError {
return unsupportedProtocolVersionError{
baseWebsocketError{Code: UNSUPPORTED_PROTOCOL_VERSION, Msg: "Unsupported protocol version"},
}
}
// The application does not exists
// See the configuration file
type ApplicationDoesNotExistsError struct {
BaseWebsocketError
type applicationDoesNotExistsError struct {
baseWebsocketError
}
func newApplicationDoesNotExistsError() ApplicationDoesNotExistsError {
return ApplicationDoesNotExistsError{
BaseWebsocketError{Code: APPLICATION_DOES_NOT_EXISTS, Msg: "Could not found an app with the given key"},
func newApplicationDoesNotExistsError() applicationDoesNotExistsError {
return applicationDoesNotExistsError{
baseWebsocketError{Code: APPLICATION_DOES_NOT_EXISTS, Msg: "Could not found an app with the given key"},
}
}
// The user did not send the protocol version
type NoProtocolVersionSuppliedError struct {
BaseWebsocketError
type noProtocolVersionSuppliedError struct {
baseWebsocketError
}
func newNoProtocolVersionSuppliedError() NoProtocolVersionSuppliedError {
return NoProtocolVersionSuppliedError{
BaseWebsocketError{Code: NO_PROTOCOL_VERSION_SUPPLIED, Msg: "No protocol version supplied"},
func newNoProtocolVersionSuppliedError() noProtocolVersionSuppliedError {
return noProtocolVersionSuppliedError{
baseWebsocketError{Code: NO_PROTOCOL_VERSION_SUPPLIED, Msg: "No protocol version supplied"},
}
}
// When the application is disabled.
// See the configuration file
type ApplicationDisabledError struct {
BaseWebsocketError
type applicationDisabledError struct {
baseWebsocketError
}
func newApplicationDisabledError() NoProtocolVersionSuppliedError {
return NoProtocolVersionSuppliedError{
BaseWebsocketError{Code: APPLICATION_DISABLED, Msg: "Application disabled"},
func newApplicationDisabledError() noProtocolVersionSuppliedError {
return noProtocolVersionSuppliedError{
baseWebsocketError{Code: APPLICATION_DISABLED, Msg: "Application disabled"},
}
}
// When the application only accepts SSL connections
type ApplicationOnlyAccepsSSLError struct {
BaseWebsocketError
type applicationOnlyAccepsSSLError struct {
baseWebsocketError
}
func newApplicationOnlyAccepsSSLError() ApplicationOnlyAccepsSSLError {
return ApplicationOnlyAccepsSSLError{
BaseWebsocketError{Code: APPLICATION_ONLY_ACCEPTS_SSL, Msg: "Application only accepts SSL connections, reconnect using wss://"},
func newApplicationOnlyAccepsSSLError() applicationOnlyAccepsSSLError {
return applicationOnlyAccepsSSLError{
baseWebsocketError{Code: APPLICATION_ONLY_ACCEPTS_SSL, Msg: "Application only accepts SSL connections, reconnect using wss://"},
}
}
// When the user send an invalid version
type InvalidVersionStringFormatError struct {
BaseWebsocketError
type invalidVersionStringFormatError struct {
baseWebsocketError
}
func newInvalidVersionStringFormatError() InvalidVersionStringFormatError {
return InvalidVersionStringFormatError{
BaseWebsocketError{Code: INVALID_VERSION_STRING_FORMAT, Msg: "Invalid version string format"},
func newInvalidVersionStringFormatError() invalidVersionStringFormatError {
return invalidVersionStringFormatError{
baseWebsocketError{Code: INVALID_VERSION_STRING_FORMAT, Msg: "Invalid version string format"},
}
}
// Used when the error was internal
// * Decoding json
// * Writing to output
type GenericReconnectImmediatelyError struct {
BaseWebsocketError
type genericReconnectImmediatelyError struct {
baseWebsocketError
}
func newGenericReconnectImmediatelyError() GenericReconnectImmediatelyError {
return GenericReconnectImmediatelyError{
BaseWebsocketError{Code: GENERIC_RECONNECT_IMMEDIATELY, Msg: "Generic reconnect immediately"},
func newGenericReconnectImmediatelyError() genericReconnectImmediatelyError {
return genericReconnectImmediatelyError{
baseWebsocketError{Code: GENERIC_RECONNECT_IMMEDIATELY, Msg: "Generic reconnect immediately"},
}
}
// When pusher wants to send an Generic error, it only send the message, the code become nil
// Currently I do not know how to send nil, so I send GENERIC_ERROR
type GenericError struct {
BaseWebsocketError
type genericError struct {
baseWebsocketError
}
func newGenericError(msg string) GenericError {
return GenericError{
BaseWebsocketError{Code: GENERIC_ERROR, Msg: msg},
func newGenericError(msg string) genericError {
return genericError{
baseWebsocketError{Code: GENERIC_ERROR, Msg: msg},
}
}
+42 -42
View File
@@ -18,24 +18,24 @@ import (
// "channelData": "extra data"
// }
// }
type SubscribeEventData struct {
type subscribeEventData struct {
Channel string `json:"channel"`
Auth string `json:"auth,omitempty"`
ChannelData string `json:"channel_data,omitempty"`
}
type SubscribeEvent struct {
type subscribeEvent struct {
Event string `json:"event"`
Data SubscribeEventData `json:"data"`
Data subscribeEventData `json:"data"`
}
// Create a new subscribe event with the specified channel and data
func newSubscribeEvent(channel, auth, channelData string) SubscribeEvent {
data := SubscribeEventData{Channel: channel, Auth: auth, ChannelData: channelData}
return SubscribeEvent{Event: "pusher:subscribe", Data: data}
func newSubscribeEvent(channel, auth, channelData string) subscribeEvent {
data := subscribeEventData{Channel: channel, Auth: auth, ChannelData: channelData}
return subscribeEvent{Event: "pusher:subscribe", Data: data}
}
type UnsubscribeEventData struct {
type unsubscribeEventData struct {
Channel string `json:"channel"`
}
@@ -45,30 +45,30 @@ type UnsubscribeEventData struct {
// "channel": "The channel"
// }
// }
type UnsubscribeEvent struct {
type unsubscribeEvent struct {
Event string `json:"event"`
Data UnsubscribeEventData `json:"data"`
Data unsubscribeEventData `json:"data"`
}
// Create a new unsubscribe event for the specified channel
func newUnsubscribeEvent(channel string) UnsubscribeEvent {
data := UnsubscribeEventData{Channel: channel}
return UnsubscribeEvent{Event: "pusher:unsubscribe", Data: data}
func newUnsubscribeEvent(channel string) unsubscribeEvent {
data := unsubscribeEventData{Channel: channel}
return unsubscribeEvent{Event: "pusher:unsubscribe", Data: data}
}
// {
// "event": "pusher_internal:subscription_succeeded",
// "channel": "the channel"
// }
type SubscriptionSucceededEvent struct {
type subscriptionSucceededEvent struct {
Event string `json:"event"`
Channel string `json:"channel"`
Data string `json:"data"`
}
// Create a new subscription succeed event for the specified channel
func newSubscriptionSucceededEvent(channel, data string) SubscriptionSucceededEvent {
return SubscriptionSucceededEvent{Event: "pusher_internal:subscription_succeeded", Channel: channel, Data: data}
func newSubscriptionSucceededEvent(channel, data string) subscriptionSucceededEvent {
return subscriptionSucceededEvent{Event: "pusher_internal:subscription_succeeded", Channel: channel, Data: data}
}
// Data Subscription Succeed
@@ -89,14 +89,14 @@ func newSubscriptionSucceededEvent(channel, data string) SubscriptionSucceededEv
// \"count\": 2
// }
// }"
type SubscriptionSucceeedEventPresenceData struct {
type subscriptionSucceeedEventPresenceData struct {
Ids []string `json:"ids"`
Hash map[string]interface{} `json:"hash"`
Count int `json:"count"`
}
func newSubscriptionSucceedEventPresenceData(c *Channel) SubscriptionSucceeedEventPresenceData {
event := SubscriptionSucceeedEventPresenceData{}
func newSubscriptionSucceedEventPresenceData(c *channel) subscriptionSucceeedEventPresenceData {
event := subscriptionSucceeedEventPresenceData{}
var ids []string
hash := make(map[string]interface{}, c.TotalSubscriptions())
@@ -121,28 +121,28 @@ func newSubscriptionSucceedEventPresenceData(c *Channel) SubscriptionSucceeedEve
// "event": "pusher:pong",
// "data": {}
// }
type PongEvent struct {
type pongEvent struct {
Event string `json:"event"`
Data string `json:"data"`
}
// Create a new pong event
func newPongEvent() PongEvent {
return PongEvent{Event: "pusher:pong", Data: "{}"}
func newPongEvent() pongEvent {
return pongEvent{Event: "pusher:pong", Data: "{}"}
}
// {
// "event": "pusher:ping",
// "data": {}
// }
type PingEvent struct {
type pingEvent struct {
Event string `json:"event"`
Data string `json:"data"`
}
// Create a new ping event
func newPingEvent() PingEvent {
return PingEvent{Event: "pusher:ping", Data: "{}"}
func newPingEvent() pingEvent {
return pingEvent{Event: "pusher:ping", Data: "{}"}
}
// {
@@ -152,7 +152,7 @@ func newPingEvent() PingEvent {
// "code": 4000
// }
// }
type ErrorEvent struct {
type errorEvent struct {
Event string `json:"event"`
Data interface{} `json:"data"`
}
@@ -161,7 +161,7 @@ type ErrorEvent struct {
// Pusher protocol is very strange in some parts
// It send null in some errors.
// So I created this GENERIC_ERROR thing, just to verify if the json must have null on the error code
func newErrorEvent(code int, message string) ErrorEvent {
func newErrorEvent(code int, message string) errorEvent {
var data interface{}
if code == GENERIC_ERROR {
@@ -182,7 +182,7 @@ func newErrorEvent(code int, message string) ErrorEvent {
}
}
return ErrorEvent{Event: "pusher:error", Data: data}
return errorEvent{Event: "pusher:error", Data: data}
}
// {
@@ -192,19 +192,19 @@ func newErrorEvent(code int, message string) ErrorEvent {
// "activity_timeout" : 120
// }
// }
type ConnectionEstablishedEventData struct {
type connectionEstablishedEventData struct {
SocketId string `json:"socket_id"`
ActivityTimeout int `json:"activity_timeout"`
}
type ConnectionEstablishedEvent struct {
type connectionEstablishedEvent struct {
Event string `json:"event"`
Data string `json:"data"`
}
// Create a new connection established event using the specified socketId
func newConnectionEstablishedEvent(socketId string) ConnectionEstablishedEvent {
data := ConnectionEstablishedEventData{SocketId: socketId, ActivityTimeout: 120}
func newConnectionEstablishedEvent(socketId string) connectionEstablishedEvent {
data := connectionEstablishedEventData{SocketId: socketId, ActivityTimeout: 120}
b, err := json.Marshal(data)
@@ -212,7 +212,7 @@ func newConnectionEstablishedEvent(socketId string) ConnectionEstablishedEvent {
panic("events: Could not Marshal json ConnectionEstablishedEvent")
}
return ConnectionEstablishedEvent{Event: "pusher:connection_established", Data: string(b)}
return connectionEstablishedEvent{Event: "pusher:connection_established", Data: string(b)}
}
// {
@@ -220,14 +220,14 @@ func newConnectionEstablishedEvent(socketId string) ConnectionEstablishedEvent {
// "channel": "presence-example-channel",
// "data": String
// }
type MemberAddedEvent struct {
type memberAddedEvent struct {
Event string `json:"event"`
Channel string `json:"channel"`
Data string `json:"data"`
}
func newMemberAddedEvent(channel, data string) MemberAddedEvent {
return MemberAddedEvent{Event: "pusher_internal:member_added", Channel: channel, Data: data}
func newMemberAddedEvent(channel, data string) memberAddedEvent {
return memberAddedEvent{Event: "pusher_internal:member_added", Channel: channel, Data: data}
}
// {
@@ -235,13 +235,13 @@ func newMemberAddedEvent(channel, data string) MemberAddedEvent {
// "channel": "presence-example-channel",
// "data": String
// }
type MemberRemovedEvent struct {
type memberRemovedEvent struct {
Event string `json:"event"`
Channel string `json:"channel"`
Data string `json:"data"`
}
func newMemberRemovedEvent(channel string, s *Subscription) MemberRemovedEvent {
func newMemberRemovedEvent(channel string, s *subscription) memberRemovedEvent {
data, err := json.Marshal(struct {
UserID string `json:"user_id"`
}{
@@ -252,7 +252,7 @@ func newMemberRemovedEvent(channel string, s *Subscription) MemberRemovedEvent {
log.Error(err)
}
return MemberRemovedEvent{Event: "pusher_internal:member_removed", Channel: channel, Data: string(data)}
return memberRemovedEvent{Event: "pusher_internal:member_removed", Channel: channel, Data: string(data)}
}
// {
@@ -260,19 +260,19 @@ func newMemberRemovedEvent(channel string, s *Subscription) MemberRemovedEvent {
// "channel": "The channel",
// "data": {}
// }
type RawEvent struct {
type rawEvent struct {
Event string `json:"event"`
Channel string `json:"channel"`
Data json.RawMessage `json:"data"`
}
type ResponseEvent struct {
type responseEvent struct {
Event string `json:"event"`
Channel string `json:"channel"`
Data interface{} `json:"data"`
}
// The response event that is broadcasted to the client sockets
func newResponseEvent(name, channel string, data interface{}) ResponseEvent {
return ResponseEvent{Event: name, Channel: channel, Data: data}
func newResponseEvent(name, channel string, data interface{}) responseEvent {
return responseEvent{Event: name, Channel: channel, Data: data}
}
+2 -2
View File
@@ -11,7 +11,7 @@ import (
)
// Conf holds the global configuration state
var Conf ConfigFile
var Conf configFile
// Start Parse the configuration file and starts the ipe server
func Start(configfile string) error {
@@ -26,7 +26,7 @@ func Start(configfile string) error {
}
Conf.Init()
router := NewRouter()
router := newRouter()
if err := http.ListenAndServe(Conf.Host, router); err != nil {
return err
+1 -1
View File
@@ -68,7 +68,7 @@ func postEvents(w http.ResponseWriter, r *http.Request) {
for _, c := range input.Channels {
channel := app.FindOrCreateChannelByChannelID(c)
app.Publish(channel, RawEvent{Event: input.Name, Channel: c, Data: input.Data}, input.SocketID)
app.Publish(channel, rawEvent{Event: input.Name, Channel: c, Data: input.Data}, input.SocketID)
}
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
+1 -1
View File
@@ -14,7 +14,7 @@ import (
// NewRouter is a function that returns a new configured Router
// It add the necessary middlewares
func NewRouter() *mux.Router {
func newRouter() *mux.Router {
router := mux.NewRouter().StrictSlash(true)
if Conf.Expvar {
+7 -9
View File
@@ -9,7 +9,7 @@ import (
)
// A route
type Route struct {
type route struct {
Name string
Method string
Pattern string
@@ -17,38 +17,36 @@ type Route struct {
RequiresRestAuth bool
}
type Routes []Route
var routes = Routes{
Route{
var routes = []route{
route{
"PostEvents",
"POST",
"/apps/{app_id}/events",
postEvents,
true,
},
Route{
route{
"GetChannels",
"GET",
"/apps/{app_id}/channels",
getChannels,
true,
},
Route{
route{
"GetChannel",
"GET",
"/apps/{app_id}/channels/{channel_name}",
getChannel,
true,
},
Route{
route{
"GetChannelUsers",
"GET",
"/apps/{app_id}/channels/{channel_name}/users",
getChannelUsers,
true,
},
Route{
route{
"Websocket",
"GET",
"/app/{key}",
+4 -4
View File
@@ -5,13 +5,13 @@
package ipe
// A Channel Subscription
type Subscription struct {
Connection *Connection
type subscription struct {
Connection *connection
Id string
Data string
}
// Create a new Subscription
func newSubscription(conn *Connection, data string) *Subscription {
return &Subscription{Connection: conn, Data: data}
func newSubscription(conn *connection, data string) *subscription {
return &subscription{Connection: conn, Data: data}
}
+25 -25
View File
@@ -33,12 +33,12 @@ import (
//
// X-Pusher-Key: A Pusher app may have multiple tokens. The oldest active token will be used, identified by this key.
// X-Pusher-Signature: A HMAC SHA256 hex digest formed by signing the POST payload (body) with the tokens secret.
type WebHook struct {
type webHook struct {
TimeMs int64 `json:"time_ms"`
Events []HookEvent `json:"events"`
Events []hookEvent `json:"events"`
}
type HookEvent struct {
type hookEvent struct {
Name string `json:"name"`
Channel string `json:"channel"`
Event string `json:"event,omitempty"`
@@ -47,36 +47,36 @@ type HookEvent struct {
UserId string `json:"user_id,omitempty"`
}
func newChannelOcuppiedHook(channel *Channel) HookEvent {
return HookEvent{Name: "channel_occupied", Channel: channel.ChannelID}
func newChannelOcuppiedHook(channel *channel) hookEvent {
return hookEvent{Name: "channel_occupied", Channel: channel.ChannelID}
}
func newChannelVacatedHook(channel *Channel) HookEvent {
return HookEvent{Name: "channel_vacated", Channel: channel.ChannelID}
func newChannelVacatedHook(channel *channel) hookEvent {
return hookEvent{Name: "channel_vacated", Channel: channel.ChannelID}
}
func newMemberAddedHook(channel *Channel, s *Subscription) HookEvent {
return HookEvent{Name: "member_added", Channel: channel.ChannelID, UserId: s.Id}
func newMemberAddedHook(channel *channel, s *subscription) hookEvent {
return hookEvent{Name: "member_added", Channel: channel.ChannelID, UserId: s.Id}
}
func newMemberRemovedHook(channel *Channel, s *Subscription) HookEvent {
return HookEvent{Name: "member_removed", Channel: channel.ChannelID, UserId: s.Id}
func newMemberRemovedHook(channel *channel, s *subscription) hookEvent {
return hookEvent{Name: "member_removed", Channel: channel.ChannelID, UserId: s.Id}
}
func newClientHook(channel *Channel, s *Subscription, event string, data interface{}) HookEvent {
return HookEvent{Name: "client_event", Channel: channel.ChannelID, Event: event, Data: data, SocketID: s.Connection.SocketID}
func newClientHook(channel *channel, s *subscription, event string, data interface{}) hookEvent {
return hookEvent{Name: "client_event", Channel: channel.ChannelID, Event: event, Data: data, SocketID: s.Connection.SocketID}
}
// channel_occupied
// { "name": "channel_occupied", "channel": "test_channel" }
func (a *App) TriggerChannelOccupiedHook(c *Channel) {
func (a *app) TriggerChannelOccupiedHook(c *channel) {
event := newChannelOcuppiedHook(c)
triggerHook(event.Name, a, c, event)
}
// channel_vacated
// { "name": "channel_vacated", "channel": "test_channel" }
func (a *App) TriggerChannelVacatedHook(c *Channel) {
func (a *app) TriggerChannelVacatedHook(c *channel) {
event := newChannelVacatedHook(c)
triggerHook(event.Name, a, c, event)
}
@@ -89,7 +89,7 @@ func (a *App) TriggerChannelVacatedHook(c *Channel) {
// "socket_id": "socket_id of the sending socket",
// "user_id": "user_id associated with the sending socket" # Only for presence channels
// }
func (a *App) TriggerClientEventHook(c *Channel, s *Subscription, client_event string, data interface{}) {
func (a *app) TriggerClientEventHook(c *channel, s *subscription, client_event string, data interface{}) {
event := newClientHook(c, s, client_event, data)
if c.IsPresence() {
@@ -104,7 +104,7 @@ func (a *App) TriggerClientEventHook(c *Channel, s *Subscription, client_event s
// "channel": "presence-your_channel_name",
// "user_id": "a_user_id"
// }
func (a *App) TriggerMemberAddedHook(c *Channel, s *Subscription) {
func (a *app) TriggerMemberAddedHook(c *channel, s *subscription) {
event := newMemberAddedHook(c, s)
triggerHook(event.Name, a, c, event)
}
@@ -114,21 +114,21 @@ func (a *App) TriggerMemberAddedHook(c *Channel, s *Subscription) {
// "channel": "presence-your_channel_name",
// "user_id": "a_user_id"
// }
func (a *App) TriggerMemberRemovedHook(c *Channel, s *Subscription) {
func (a *app) TriggerMemberRemovedHook(c *channel, s *subscription) {
event := newMemberRemovedHook(c, s)
triggerHook(event.Name, a, c, event)
}
func triggerHook(name string, app *App, c *Channel, event HookEvent) {
if !app.WebHooks {
log.Infof("Webhooks are not enabled for app: %s", app.Name)
func triggerHook(name string, a *app, c *channel, event hookEvent) {
if !a.WebHooks {
log.Infof("Webhooks are not enabled for app: %s", a.Name)
return
}
go func() {
log.Infof("Triggering %s event", name)
hook := WebHook{TimeMs: time.Now().Unix()}
hook := webHook{TimeMs: time.Now().Unix()}
hook.Events = append(hook.Events, event)
@@ -144,15 +144,15 @@ func triggerHook(name string, app *App, c *Channel, event HookEvent) {
var req *http.Request
req, err = http.NewRequest("POST", app.URLWebHook, bytes.NewReader(js))
req, err = http.NewRequest("POST", a.URLWebHook, bytes.NewReader(js))
if err != nil {
log.Errorf("Error creating request: %+v", err)
return
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Pusher-Key", app.Key)
req.Header.Set("X-Pusher-Signature", utils.HashMAC(js, []byte(app.Secret)))
req.Header.Set("X-Pusher-Key", a.Key)
req.Header.Set("X-Pusher-Signature", utils.HashMAC(js, []byte(a.Secret)))
log.V(1).Infof("%+v", req.Header)
log.V(1).Infof("%+v", string(js))
+7 -7
View File
@@ -26,7 +26,7 @@ var upgrader = websocket.Upgrader{
}
// Handle open Subscriber.
func onOpen(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, sessionID string, app *App) WebsocketError {
func onOpen(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, sessionID string, app *app) websocketError {
params := r.URL.Query()
p := params.Get("protocol")
@@ -62,7 +62,7 @@ func onOpen(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, sessio
}
// Handle the close event
func onClose(sessionID string, app *App) {
func onClose(sessionID string, app *app) {
app.Disconnect(sessionID)
}
@@ -70,7 +70,7 @@ func onClose(sessionID string, app *App) {
//
// If there is an unrecoverable error then break the loop,
// otherwise just keep going.
func onMessage(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, sessionID string, app *App) {
func onMessage(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, sessionID string, app *app) {
var event struct {
Event string `json:"event"`
}
@@ -102,7 +102,7 @@ func onMessage(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, ses
emitWSError(newGenericReconnectImmediatelyError(), conn)
}
case "pusher:subscribe":
subscribeEvent := SubscribeEvent{}
subscribeEvent := subscribeEvent{}
if err := json.Unmarshal(message, &subscribeEvent); err != nil {
emitWSError(newGenericReconnectImmediatelyError(), conn)
@@ -142,7 +142,7 @@ func onMessage(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, ses
emitWSError(newGenericReconnectImmediatelyError(), conn)
}
case "pusher:unsubscribe":
unsubscribeEvent := UnsubscribeEvent{}
unsubscribeEvent := unsubscribeEvent{}
if err := json.Unmarshal(message, &unsubscribeEvent); err != nil {
emitWSError(newGenericReconnectImmediatelyError(), conn)
@@ -171,7 +171,7 @@ func onMessage(conn *websocket.Conn, w http.ResponseWriter, r *http.Request, ses
emitWSError(newGenericError("To send client events, you must enable this feature in the Settings."), conn)
}
clientEvent := RawEvent{}
clientEvent := rawEvent{}
if err := json.Unmarshal(message, &clientEvent); err != nil {
log.Error(err)
@@ -237,7 +237,7 @@ func wsHandler(w http.ResponseWriter, r *http.Request) {
}
// Emit an Websocket ErrorEvent
func emitWSError(err WebsocketError, conn *websocket.Conn) {
func emitWSError(err websocketError, conn *websocket.Conn) {
event := newErrorEvent(err.GetCode(), err.GetMsg())