Browse Source
feat: add websocket (#33)
feat: add websocket (#33)
* feat: add auto-update Login QR Code * feat: remove unused code * feat: trigger when pair success * feat: move WebSocket to independent package * feat: simply codepull/34/head
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 189 additions and 18 deletions
-
23src/cmd/root.go
-
3src/go.mod
-
12src/go.sum
-
13src/internal/rest/helpers/common.go
-
0src/internal/rest/send_rest.go
-
0src/internal/rest/user_rest.go
-
105src/internal/websocket/websocket.go
-
7src/utils/whatsapp.go
-
44src/views/index.html
@ -0,0 +1,13 @@ |
|||
package helpers |
|||
|
|||
import ( |
|||
"fmt" |
|||
"github.com/aldinokemal/go-whatsapp-web-multidevice/config" |
|||
"net/http" |
|||
"time" |
|||
) |
|||
|
|||
func SetAutoConnectAfterBooting() { |
|||
time.Sleep(2 * time.Second) |
|||
_, _ = http.Get(fmt.Sprintf("http://localhost:%s/app/reconnect", config.AppPort)) |
|||
} |
|||
@ -0,0 +1,105 @@ |
|||
package websocket |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"github.com/gofiber/fiber/v2" |
|||
"github.com/gofiber/websocket/v2" |
|||
"log" |
|||
) |
|||
|
|||
type client struct{} // Add more data to this type if needed
|
|||
type BroadcastMessage struct { |
|||
Code string `json:"code"` |
|||
Message string `json:"message"` |
|||
} |
|||
|
|||
var Clients = make(map[*websocket.Conn]client) // Note: although large maps with pointer-like types (e.g. strings) as keys are slow, using pointers themselves as keys is acceptable and fast
|
|||
var Register = make(chan *websocket.Conn) |
|||
var Broadcast = make(chan BroadcastMessage) |
|||
var Unregister = make(chan *websocket.Conn) |
|||
|
|||
func RunHub() { |
|||
for { |
|||
select { |
|||
case connection := <-Register: |
|||
Clients[connection] = client{} |
|||
log.Println("connection registered") |
|||
|
|||
case message := <-Broadcast: |
|||
log.Println("message received:", message) |
|||
marshalMessage, err := json.Marshal(message) |
|||
if err != nil { |
|||
log.Println("write error:", err) |
|||
return |
|||
} |
|||
|
|||
// Send the message to all clients
|
|||
for connection := range Clients { |
|||
if err := connection.WriteMessage(websocket.TextMessage, marshalMessage); err != nil { |
|||
log.Println("write error:", err) |
|||
|
|||
err := connection.WriteMessage(websocket.CloseMessage, []byte{}) |
|||
if err != nil { |
|||
log.Println("write message close error:", err) |
|||
return |
|||
} |
|||
err = connection.Close() |
|||
if err != nil { |
|||
log.Println("close error:", err) |
|||
return |
|||
} |
|||
delete(Clients, connection) |
|||
} |
|||
} |
|||
|
|||
case connection := <-Unregister: |
|||
// Remove the client from the hub
|
|||
delete(Clients, connection) |
|||
|
|||
log.Println("connection unregistered") |
|||
} |
|||
} |
|||
} |
|||
|
|||
func RegisterRoutes(app *fiber.App) { |
|||
app.Use("/ws", func(c *fiber.Ctx) error { |
|||
if websocket.IsWebSocketUpgrade(c) { // Returns true if the client requested upgrade to the WebSocket protocol
|
|||
return c.Next() |
|||
} |
|||
return c.SendStatus(fiber.StatusUpgradeRequired) |
|||
}) |
|||
|
|||
app.Get("/ws", websocket.New(func(c *websocket.Conn) { |
|||
// When the function returns, unregister the client and close the connection
|
|||
defer func() { |
|||
Unregister <- c |
|||
_ = c.Close() |
|||
}() |
|||
|
|||
// Register the client
|
|||
Register <- c |
|||
|
|||
for { |
|||
messageType, message, err := c.ReadMessage() |
|||
if err != nil { |
|||
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { |
|||
log.Println("read error:", err) |
|||
} |
|||
return // Calls the deferred function, i.e. closes the connection on error
|
|||
} |
|||
|
|||
if messageType == websocket.TextMessage { |
|||
// Broadcast the received message
|
|||
var messageData BroadcastMessage |
|||
err := json.Unmarshal(message, &messageData) |
|||
if err != nil { |
|||
log.Println("error unmarshal message:", err) |
|||
return |
|||
} |
|||
Broadcast <- messageData |
|||
} else { |
|||
log.Println("websocket message received of type", messageType) |
|||
} |
|||
} |
|||
})) |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue