forked from mirror/gin
Adds realtime-chat example code
This commit is contained in:
parent
470b7e1010
commit
15b0c49da5
|
@ -0,0 +1,58 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
router := gin.Default()
|
||||
router.SetHTMLTemplate(html)
|
||||
|
||||
router.GET("/room/:roomid", roomGET)
|
||||
router.POST("/room/:roomid", roomPOST)
|
||||
router.DELETE("/room/:roomid", roomDELETE)
|
||||
router.GET("/stream/:roomid", stream)
|
||||
|
||||
router.Run(":8080")
|
||||
}
|
||||
|
||||
func stream(c *gin.Context) {
|
||||
roomid := c.ParamValue("roomid")
|
||||
listener := openListener(roomid)
|
||||
defer closeListener(roomid, listener)
|
||||
|
||||
c.Stream(func(w io.Writer) bool {
|
||||
c.SSEvent("message", <-listener)
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
func roomGET(c *gin.Context) {
|
||||
roomid := c.ParamValue("roomid")
|
||||
userid := fmt.Sprint(rand.Int31())
|
||||
c.HTML(200, "chat_room", gin.H{
|
||||
"roomid": roomid,
|
||||
"userid": userid,
|
||||
})
|
||||
}
|
||||
|
||||
func roomPOST(c *gin.Context) {
|
||||
roomid := c.ParamValue("roomid")
|
||||
userid := c.PostFormValue("user")
|
||||
message := c.PostFormValue("message")
|
||||
room(roomid).Submit(userid + ": " + message)
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"status": "success",
|
||||
"message": message,
|
||||
})
|
||||
}
|
||||
|
||||
func roomDELETE(c *gin.Context) {
|
||||
roomid := c.ParamValue("roomid")
|
||||
deleteBroadcast(roomid)
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package main
|
||||
|
||||
import "github.com/dustin/go-broadcast"
|
||||
|
||||
var roomChannels = make(map[string]broadcast.Broadcaster)
|
||||
|
||||
func openListener(roomid string) chan interface{} {
|
||||
listener := make(chan interface{})
|
||||
room(roomid).Register(listener)
|
||||
return listener
|
||||
}
|
||||
|
||||
func closeListener(roomid string, listener chan interface{}) {
|
||||
room(roomid).Unregister(listener)
|
||||
close(listener)
|
||||
}
|
||||
|
||||
func deleteBroadcast(roomid string) {
|
||||
b, ok := roomChannels[roomid]
|
||||
if ok {
|
||||
b.Close()
|
||||
delete(roomChannels, roomid)
|
||||
}
|
||||
}
|
||||
|
||||
func room(roomid string) broadcast.Broadcaster {
|
||||
b, ok := roomChannels[roomid]
|
||||
if !ok {
|
||||
b = broadcast.NewBroadcaster(10)
|
||||
roomChannels[roomid] = b
|
||||
}
|
||||
return b
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package main
|
||||
|
||||
import "html/template"
|
||||
|
||||
var html = template.Must(template.New("chat_room").Parse(`
|
||||
<html>
|
||||
<head>
|
||||
<title>{{.roomid}}</title>
|
||||
<link rel="stylesheet" type="text/css" href="http://meyerweb.com/eric/tools/css/reset/reset.css"/>
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
|
||||
<script src="http://malsup.github.com/jquery.form.js"></script>
|
||||
<script>
|
||||
$('#message_form').focus();
|
||||
$(document).ready(function() {
|
||||
// bind 'myForm' and provide a simple callback function
|
||||
$('#myForm').ajaxForm(function() {
|
||||
$('#message_form').val('');
|
||||
$('#message_form').focus();
|
||||
});
|
||||
|
||||
if (!!window.EventSource) {
|
||||
var source = new EventSource('/stream/{{.roomid}}');
|
||||
source.addEventListener('message', function(e) {
|
||||
$('#messages').append(e.data + "</br>");
|
||||
$('html, body').animate({scrollTop:$(document).height()}, 'slow');
|
||||
|
||||
}, false);
|
||||
} else {
|
||||
alert("NOT SUPPORTED");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Welcome to {{.roomid}} room</h1>
|
||||
<div id="messages"></div>
|
||||
<form id="myForm" action="/room/{{.roomid}}" method="post">
|
||||
User: <input id="user_form" name="user" value="{{.userid}}"></input>
|
||||
Message: <input id="message_form" name="message"></input>
|
||||
<input type="submit" value="Submit" />
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
`))
|
Loading…
Reference in New Issue