Skip to content

Commit 6a8f450

Browse files
author
Lapp
committed
project: refactoring, change id on UUID
1 parent 93f489c commit 6a8f450

File tree

8 files changed

+71
-41
lines changed

8 files changed

+71
-41
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Чат
2-
[![Release](https://img.shields.io/badge/release-v1.1.0-blue)](https://github.com/Lapp-coder/websocket-chat/releases)
2+
[![Release](https://img.shields.io/badge/release-v1.1.1-blue)](https://github.com/Lapp-coder/websocket-chat/releases)
33

44
### При создании этого приложения были использованны следующие технологии:
55
* Go 1.16.6

cmd/app/client/main.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ package main
33
import (
44
"bufio"
55
"fmt"
6-
"github.com/Lapp-coder/websocket-chat/pkg/jrpc"
7-
"github.com/gorilla/websocket"
8-
"github.com/sirupsen/logrus"
96
"net/rpc"
107
"net/rpc/jsonrpc"
118
"os"
129
"strings"
10+
11+
"github.com/Lapp-coder/websocket-chat/internal/jrpc"
12+
"github.com/gorilla/websocket"
13+
"github.com/sirupsen/logrus"
1314
)
1415

1516
const (
@@ -60,7 +61,7 @@ func main() {
6061
continue
6162
}
6263

63-
args := jrpc.SendMessageArgs{ID: id, Ids: sending[0], Message: sending[1]}
64+
args := jrpc.SendMessageArgs{ID: id, IDs: sending[0], Message: sending[1]}
6465
if err = client.Call("Handler.SendMessage", args, nil); err != nil {
6566
logrus.Fatal(err)
6667
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/Lapp-coder/websocket-chat
33
go 1.16
44

55
require (
6+
github.com/google/uuid v1.3.0
67
github.com/gorilla/websocket v1.4.2
78
github.com/sirupsen/logrus v1.8.1
89
)

go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
12
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
4+
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
25
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
36
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
7+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
48
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
59
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
610
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
11+
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
712
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
813
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
914
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

internal/app/server/errors.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package server
2+
3+
import "errors"
4+
5+
var (
6+
errIDsIsEmpty = errors.New("ids is empty")
7+
)

internal/app/server/handler.go

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package server
22

33
import (
4-
"errors"
54
"fmt"
6-
"github.com/Lapp-coder/websocket-chat/pkg/jrpc"
7-
"github.com/gorilla/websocket"
85
"net/http"
96
"net/rpc/jsonrpc"
10-
"strconv"
117
"strings"
8+
9+
"github.com/Lapp-coder/websocket-chat/internal/jrpc"
10+
"github.com/google/uuid"
11+
"github.com/gorilla/websocket"
1212
)
1313

1414
type Handler struct {
@@ -23,13 +23,10 @@ func (h *Handler) InitRoutes() {
2323
http.HandleFunc("/chat", h.chat)
2424
}
2525

26-
var (
27-
upgrader = websocket.Upgrader{
28-
ReadBufferSize: 1024,
29-
WriteBufferSize: 1024,
30-
}
31-
uniqueId int
32-
)
26+
var upgrader = websocket.Upgrader{
27+
ReadBufferSize: 1024,
28+
WriteBufferSize: 1024,
29+
}
3330

3431
func (h *Handler) chat(w http.ResponseWriter, r *http.Request) {
3532
ws, err := upgrader.Upgrade(w, r, nil)
@@ -38,8 +35,7 @@ func (h *Handler) chat(w http.ResponseWriter, r *http.Request) {
3835
}
3936
defer ws.Close()
4037

41-
uniqueId++
42-
id := strconv.Itoa(uniqueId)
38+
id := uuid.NewString()
4339
if err = ws.WriteMessage(websocket.TextMessage, []byte(id)); err != nil {
4440
return
4541
}
@@ -56,23 +52,23 @@ func (h *Handler) chat(w http.ResponseWriter, r *http.Request) {
5652
}
5753

5854
func (h *Handler) SendMessage(args *jrpc.SendMessageArgs, result *string) error {
59-
switch args.Ids {
55+
switch args.IDs {
6056
case "*":
6157
h.hub.broadcast <- []byte(fmt.Sprintf("%s: %s", args.ID, args.Message))
6258
case "echo":
63-
conn, ok := h.hub.connections[args.ID]
64-
if ok {
59+
conn, exists := h.hub.Connection(args.ID)
60+
if exists {
6561
conn.send <- []byte(args.Message)
6662
}
6763
default:
68-
ids := strings.Split(args.Ids, ", ")
64+
ids := strings.Split(args.IDs, ", ")
6965
if len(ids) == 0 {
70-
return errors.New("ids is empty")
66+
return errIDsIsEmpty
7167
}
7268

7369
for _, id := range ids {
74-
conn, ok := h.hub.connections[id]
75-
if ok {
70+
conn, exists := h.hub.Connection(id)
71+
if exists {
7672
conn.send <- []byte(fmt.Sprintf("%s: %s", args.ID, args.Message))
7773
}
7874
}

internal/app/server/hub.go

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package server
22

3-
// Hub является центральным узлом (чатом), который обрабатывает все соединения
3+
// Hub является центральным узлом (чатом), который обрабатывает все соединения.
44
type Hub struct {
55
connections map[string]*connection
66
broadcast chan []byte
@@ -17,26 +17,46 @@ func NewHub() *Hub {
1717
}
1818
}
1919

20-
// Listen прослушивает новые соединения, закрытые соединения и сообщения из канала broadcast
20+
// Connection возращает ссылку на соединения и булево значение о том,
21+
// существует ли такое соединение в Hub.
22+
func (h Hub) Connection(id string) (conn *connection, exists bool) {
23+
conn, exists = h.connections[id]
24+
return
25+
}
26+
27+
// Listen прослушивает сигнал на создание нового соеднинения, закрытия соединения,
28+
// а также сообщения из канала broadcast, куда попадают все публичные сообщения.
2129
func (h *Hub) Listen() {
2230
for {
2331
select {
2432
case conn := <-h.register:
25-
h.connections[conn.id] = conn
33+
h.registerConn(conn)
2634
case conn := <-h.unregister:
27-
if _, ok := h.connections[conn.id]; ok {
28-
delete(h.connections, conn.id)
29-
close(conn.send)
30-
}
35+
h.unregisterConn(conn)
3136
case message := <-h.broadcast:
32-
for _, conn := range h.connections {
33-
select {
34-
case conn.send <- message:
35-
default:
36-
delete(h.connections, conn.id)
37-
close(conn.send)
38-
}
39-
}
37+
h.sendMessageAllConnections(message)
38+
}
39+
}
40+
}
41+
42+
func (h *Hub) registerConn(conn *connection) {
43+
h.connections[conn.id] = conn
44+
}
45+
46+
func (h *Hub) unregisterConn(conn *connection) {
47+
if _, ok := h.connections[conn.id]; ok {
48+
delete(h.connections, conn.id)
49+
close(conn.send)
50+
}
51+
}
52+
53+
func (h *Hub) sendMessageAllConnections(message []byte) {
54+
for _, conn := range h.connections {
55+
select {
56+
case conn.send <- message:
57+
default:
58+
delete(h.connections, conn.id)
59+
close(conn.send)
4060
}
4161
}
4262
}

pkg/jrpc/args.go renamed to internal/jrpc/args.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package jrpc
22

33
type SendMessageArgs struct {
44
ID string
5-
Ids string
5+
IDs string
66
Message string
77
}
88

0 commit comments

Comments
 (0)