glide get github.com/gorilla/websocket
#1
func Handler(w http.ResponseWriter, r *http.Request) {
conn, err := Upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("failed to do websocket upgrade: %v", err)
return
}
connectionACK, err := json.Marshal(map[string]string{
"type": "connection_ack",
})
if err != nil {
log.Printf("failed to marshal ws connection ack: %v", err)
}
if err := conn.WriteMessage(websocket.TextMessage, connectionACK); err != nil {
log.Printf("failed to write to ws connection: %v", err)
return
}
#2
go func() {
for {
_, p, err := conn.ReadMessage()
if websocket.IsCloseError(err, websocket.CloseGoingAway) {
return
}
if err != nil {
log.Println("failed to read websocket message: %v", err)
return
}
var msg ConnectionACKMessage
if err := json.Unmarshal(p, &msg); err != nil {
log.Printf("failed to unmarshal: %v", err)
return
}
if msg.Type == "start" {
length := 0
Subscribers.Range(func(key, value interface{}) bool {
length++
return true
})
#3
var subscriber = Subscriber{
ID: length + 1,
Conn: conn,
RequestString: msg.Payload.Query,
OperationID: msg.OperationID,
}
#4
Subscribers.Store(subscriber.ID, &subscriber)
}
}
}()
}
// graphql subscriptions
http.HandleFunc("/subscriptions", subscriptions.Handler)
Subscription := graphql.NewObject(graphql.ObjectConfig{
Name: "Subscription",
Fields: graphql.Fields{
#1
"newHuman": &graphql.Field{
Type: graphql.NewList(types.HumanType),
#2
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
#3
return resolvers.HumanData, nil
},
},
},
})
subscription {
newHuman {
id
name
appearsIn
homePlanet
}
}
Mutation := graphql.NewObject(graphql.ObjectConfig{
Name: "Mutation",
Fields: graphql.Fields{
#1
"createHuman": &graphql.Field{
Type: types.HumanType,
Description: "Update existing human",
Args: graphql.FieldConfigArgument{
... args
},
#2
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
... more code
char := resolvers.CreatePerson(id, name, appearsin, homePlanet)
#3
HumanPublisher()
return char, nil
},
},
},
})
subscription {
newHuman {
id
name
appearsIn
homePlanet
}
}
mutation {
createHuman(
id: 1001
name: "Darth Vader"
appearsIn: [3,4,5]
homePlanet: "tatooni"
) {
id
name
appearsIn
homePlanet
}
}
Write your response...