nyusocket

package module
v1.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 22, 2021 License: MIT Imports: 9 Imported by: 0

README

NyuSocket

go get github.com/Nyura95/nyusocket

Next step of development

  • Change the creation of events to make it more 'user frendly'

Basic usage

Sending Message

Server

package main

import "fmt"
import "os"
import "github.com/Nyura95/nyusocket"
import "context"

func main() {
  events := socket.NewEvents()
	defer events.Close()

	events.CreateClientMessageEvent()
	go socket.Start(context.Background(), socket.Options{Addr: "127.0.0.1:3000"})
	for {
		select {
		case clientMessage := <-events.ClientMessage:
			for _, other := range clientMessage.Client.GetOthersClients() {
				other.Send(nyusocket.NewMessage("message", clientMessage.Message, "message").Send())
			}
		}
	}
}
Event before a login user
package main

import "fmt"
import "os"
import "context"
import "github.com/Nyura95/nyusocket"

type storeClient struct {
	token string
}

func main() {
  events := nyusocket.NewEvents()
	defer events.Close()

	events.CreateClientMessageEvent()
	events.CreateAuthorizationEvent()
	go nyusocket.Start(context.Background(), events, nyusocket.Options{Addr: "127.0.0.1:3000"})
	for {
		select {
		case authorization := <-events.Authorization:
			// authorize only one 'token' (check the client for pass the query)
			authorization.Client.Store = storeClient{
				token: authorization.Client.Query["token"][0],
			}
			authorization.Client.Hash = authorization.Client.Query["token"][0]
			authorization.Authorize <- !nyusocket.Infos.Alive(authorization.Client) // chan authorization.Authorize return an boolean, if false the client is unregister
		case clientMessage := <-events.ClientMessage:
			storeClient := clientMessage.Client.Store.(storeClient) // get store client
			for _, other := range clientMessage.Client.GetOthersClients() { // get all other clients actually registered
				other.Send(nyusocket.NewMessage("message", fmt.Sprintf("%s: %s", storeClient.token, clientMessage.Message), "message").Send()) // send customer's message to others
			}
		}
	}
}
Event on the new client login
package main

import "fmt"
import "os"
import "context"
import "github.com/Nyura95/nyusocket"

func main() {
  events := nyusocket.NewEvents()
	defer events.Close()

	events.CreateClientMessageEvent()
	events.CreateRegisterEvent()
	go nyusocket.Start(context.Background(), events, nyusocket.Options{Addr: "127.0.0.1:3000"})
	for {
		select {
		case clientMessage := <-events.ClientMessage:
			for _, other := range clientMessage.Client.GetOthersClients() {
				other.Send(nyusocket.NewMessage("message", clientMessage.Message, "message").Send())
			}
		case client := <-events.Register: // new client registered
			client.Send(nyusocket.NewMessage("register", "Hello there!", "new_register").Send()) // send a message to the client
			for _, other := range client.GetOthersClients() {
				other.Send(nyusocket.NewMessage("register", "New client", "new_register").Send()) // tell others that a new customer is registered
			}
		}
	}
}
Event on the client logout
package main

import "fmt"
import "os"
import "context"
import "github.com/Nyura95/nyusocket"

func main() {
  events := nyusocket.NewEvents()
	defer events.Close()

	events.CreateClientMessageEvent()
	events.CreateUnregisterEvent()
	go nyusocket.Start(context.Background(), events, nyusocket.Options{Addr: "127.0.0.1:3000"})
	for {
		select {
		case clientMessage := <-events.ClientMessage:
			for _, other := range clientMessage.Client.GetOthersClients() {
				other.Send(nyusocket.NewMessage("message", clientMessage.Message, "message").Send())
			}
    case unregister := <-events.Unregister:
      // unregister.Store (you can access to the store client if needed)
			for _, other := range unregister.Hub.GetClients() {
				other.Send(nyusocket.NewMessage("unregister", "Client unregister", "new_unregister").Send()) // tell others that a new customer is logout
			}
		}
	}
}
Stop server
package main

import "fmt"
import "os"
import "time"
import "github.com/Nyura95/nyusocket"
import "context"

func main() {
  events := nyusocket.NewEvents()
	defer events.Close()

	events.CreateClientMessageEvent()

	ctx, cancel := context.WithCancel(context.Background())

	go func() {
		time.Sleep(5 * time.Second)
		cancel()
	}()

	nyusocket.Start(ctx, nyusocket.Options{Addr: "127.0.0.1:3000"})
	log.Println("server closed")
}

Client side

Message server example
{ Action: string, Message: string, Key: string, Created: Date }
Who to use ? (see client.html)
var states = {
  [WebSocket.CONNECTING]: "CONNECTING",
  [WebSocket.OPEN]: "OPEN",
  [WebSocket.CLOSING]: "CLOSING",
  [WebSocket.CLOSED]: "CLOSED",
};
var _messages = [];

var client = new WebSocket("ws://...");
client.onopen = function (event) {
  console.log(event);
  document.getElementById("state").innerHTML =
    "state: " + states[client.readyState];
};
client.onmessage = function (msg) {
  console.log("New message: ", msg);
  var messages = msg.data.split("\n");
  for (let i = 0; i < messages.length; i++) {
    var message = messages[i];
    try {
      message = JSON.parse(message);
    } catch (err) {
      console.log(err);
    }
    _messages.push(message);
    var tchat = document.getElementById("messages");
    tchat.value = _messages
      .map(function (x) {
        return "Action: " + x.Action + " | " + x.Message;
      })
      .join("\r\n");
    tchat.scrollTo({ top: tchat.scrollHeight });
  }
};

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Start

func Start(ctx context.Context, events *Events, options Options) error

Start the socket server

Types

type BeforeUpgrade

type BeforeUpgrade struct {
	Authorize chan bool
	Client    *Client
}

BeforeUpgrade ...

type Client

type Client struct {
	Store *Store
	// contains filtered or unexported fields
}

Client is a middleman between the websocket connection and the hub.

func (*Client) Close

func (c *Client) Close()

Close disconnect the client

func (*Client) GetAllClients

func (c *Client) GetAllClients() []*Client

GetAllClients ...

func (*Client) GetHash

func (c *Client) GetHash() string

GetHash ...

func (*Client) GetOthersClients

func (c *Client) GetOthersClients() []*Client

GetOthersClients ...

func (*Client) GetPath

func (c *Client) GetPath() string

GetPath return the path client

func (*Client) GetQuery

func (c *Client) GetQuery(key string) ([]string, error)

GetQuery return query client

func (*Client) Send

func (c *Client) Send(message []byte) error

Send a message

type ClientMessage

type ClientMessage struct {
	Message string
	Client  *Client
}

ClientMessage ...

type Events

type Events struct {
	BeforeUpgrade chan BeforeUpgrade
	Register      chan *Client
	Unregister    chan Unregister
	ClientMessage chan ClientMessage
}

Events ...

func NewEvents

func NewEvents() *Events

NewEvents ...

func (*Events) Close

func (e *Events) Close()

Close all chan event

func (*Events) CreateAllEvents

func (e *Events) CreateAllEvents()

CreateAllEvents ...

func (*Events) CreateBeforeUpgradeEvent

func (e *Events) CreateBeforeUpgradeEvent()

CreateBeforeUpgradeEvent ...

func (*Events) CreateClientMessageEvent

func (e *Events) CreateClientMessageEvent()

CreateClientMessageEvent ...

func (*Events) CreateRegisterEvent

func (e *Events) CreateRegisterEvent()

CreateRegisterEvent ...

func (*Events) CreateUnregisterEvent

func (e *Events) CreateUnregisterEvent()

CreateUnregisterEvent ...

type Hub

type Hub struct {
	// contains filtered or unexported fields
}

Hub of the clients

func (*Hub) GetClients

func (h *Hub) GetClients() []*Client

GetClients return all clients connected

func (Hub) GetInfo added in v1.3.0

func (h Hub) GetInfo() Info

func (*Hub) SendToAllClients

func (h *Hub) SendToAllClients(message *Message)

SendToAllClients ...

type Info added in v1.3.0

type Info struct {
	List []string
}

func (*Info) Alive added in v1.3.0

func (i *Info) Alive(client client) bool

func (*Info) NbAlive added in v1.3.0

func (i *Info) NbAlive() int

type Message

type Message struct {
	Action  string
	Message string
	Key     string
	Created time.Time
}

Message action front

func NewMessage

func NewMessage(action, message, key string) *Message

NewMessage create a new instance of message

func (*Message) Send

func (n *Message) Send() []byte

Send to the front

type NewClient

type NewClient struct {
	Query map[string][]string
	Path  string
	Store *Store
	Hash  string
}

NewClient ...

type Options

type Options struct {
	Addr string
}

Options module

type Store

type Store struct {
	// contains filtered or unexported fields
}

Store save the data client...

func NewStore

func NewStore() *Store

NewStore create a new store

func (*Store) GetData

func (s *Store) GetData(key string) (interface{}, error)

GetData get data into the store

func (*Store) SetData

func (s *Store) SetData(key string, value interface{})

SetData set a new value into the store

type Unregister

type Unregister struct {
	Store *Store
	Hub   *Hub
	Hash  string
}

Unregister ...

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL