Skip to content

Commit 03c2013

Browse files
committed
add native websocket
1 parent e47b8ee commit 03c2013

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<html>
2+
3+
<body style="padding:10px;">
4+
<input type="text" id="messageTxt" />
5+
<button type="button" id="sendBtn">Send</button>
6+
<div id="messages" style="width: 375px;margin:10px 0 0 0;border-top: 1px solid black;">
7+
</div>
8+
9+
<script type="text/javascript">
10+
let messageTxt = document.getElementById("messageTxt");
11+
let messages = document.getElementById("messages");
12+
let sendBtn = document.getElementById("sendBtn")
13+
14+
let w = new WebSocket("ws://localhost:9999/endpoint");
15+
w.onopen = function () {
16+
console.log("Websocket connection enstablished");
17+
};
18+
w.onclose = function () {
19+
appendMessage("<div style='text-align: center'><h3>Disconnected</h3></div>");
20+
};
21+
w.onmessage = function (message) {
22+
appendMessage("<div>" + message.data + "</div>");
23+
};
24+
25+
sendBtn.onclick = function () {
26+
let myText = messageTxt.value;
27+
messageTxt.value = "";
28+
29+
appendMessage("<div style='color: red'> me: " + myText + "</div>");
30+
w.send(myText);
31+
};
32+
33+
messageTxt.addEventListener("keyup", function (e) {
34+
if (e.code === 'Enter') {
35+
e.preventDefault();
36+
37+
sendBtn.click();
38+
}
39+
});
40+
41+
function appendMessage(messageDivHTML) {
42+
messages.insertAdjacentHTML('afterbegin', messageDivHTML);
43+
}
44+
</script>
45+
</body>
46+
47+
</html>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module neffos-native-messages
2+
3+
go 1.17
4+
5+
require github.com/kataras/neffos v0.0.18
6+
7+
require (
8+
github.com/gorilla/websocket v1.4.2 // indirect
9+
github.com/iris-contrib/go.uuid v2.0.0+incompatible // indirect
10+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
11+
)
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"net/http"
8+
"os"
9+
10+
"github.com/kataras/neffos"
11+
"github.com/kataras/neffos/gorilla"
12+
)
13+
14+
// HOW TO RUN
15+
//
16+
// $ go run native.go server
17+
// #
18+
// # open a browser tab and navigate to http://localhost:8080 and write something to the text input.
19+
// # in the same time you can also run the go client
20+
// # which is created using neffos but the standard go websocket library could be used instead as well.
21+
// #
22+
// $ go run native.go client
23+
func main() {
24+
args := os.Args[1:]
25+
if len(args) == 0 {
26+
panic("expected program to start with 'server' or 'client' argument")
27+
}
28+
side := args[0]
29+
30+
switch side {
31+
case "server":
32+
runServer()
33+
case "client":
34+
runClient()
35+
default:
36+
fmt.Printf("unexpected argument, expected 'server' or 'client' but got '%s'", side)
37+
os.Exit(1)
38+
}
39+
}
40+
41+
var pongMessage = []byte("pong")
42+
43+
var events = neffos.Events{
44+
neffos.OnNativeMessage: func(c *neffos.NSConn, msg neffos.Message) error {
45+
log.Printf("Got: %s", string(msg.Body))
46+
47+
if !c.Conn.IsClient() {
48+
return c.Conn.Socket().WriteText(pongMessage, 0)
49+
}
50+
51+
return nil
52+
},
53+
}
54+
55+
func runServer() {
56+
websocketServer := neffos.New(
57+
gorilla.DefaultUpgrader, events)
58+
59+
router := http.NewServeMux()
60+
router.Handle("/endpoint", websocketServer)
61+
router.Handle("/", http.FileServer(http.Dir("./browser")))
62+
63+
log.Println("Serving websockets on localhost:9999/endpoint")
64+
log.Fatal(http.ListenAndServe(":9999", router))
65+
}
66+
67+
func runClient() {
68+
ctx := context.Background()
69+
70+
client, err := neffos.Dial(ctx, gorilla.DefaultDialer, "ws://localhost:9999/endpoint", events)
71+
if err != nil {
72+
panic(err)
73+
}
74+
75+
// Connect does nothing at this case,
76+
// it just returns a connection to work with its methods.
77+
c, err := client.Connect(ctx, "")
78+
if err != nil {
79+
panic(err)
80+
}
81+
82+
c.Conn.Socket().WriteText([]byte("ping"), 0)
83+
84+
<-client.NotifyClose
85+
}

0 commit comments

Comments
 (0)