// Copyright 2011 Google Inc. All rights reserved. // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. /* Package channel implements the server side of App Engine's Channel API. Create creates a new channel associated with the given clientID, which must be unique to the client that will use the returned token. token, err := channel.Create(c, "player1") if err != nil { // handle error } // return token to the client in an HTTP response Send sends a message to the client over the channel identified by clientID. channel.Send(c, "player1", "Game over!") Deprecated: The Channel API feature has been deprecated and is going to be removed. See the Channel API Turndown document for details and timetable. https://cloud.google.com/appengine/docs/deprecations/channel */ package channel // import "google.golang.org/appengine/channel" import ( "encoding/json" "golang.org/x/net/context" "google.golang.org/appengine" "google.golang.org/appengine/internal" basepb "google.golang.org/appengine/internal/base" pb "google.golang.org/appengine/internal/channel" ) // Create creates a channel and returns a token for use by the client. // The clientID is an application-provided string used to identify the client. func Create(c context.Context, clientID string) (token string, err error) { req := &pb.CreateChannelRequest{ ApplicationKey: &clientID, } resp := &pb.CreateChannelResponse{} err = internal.Call(c, service, "CreateChannel", req, resp) token = resp.GetToken() return token, remapError(err) } // Send sends a message on the channel associated with clientID. func Send(c context.Context, clientID, message string) error { req := &pb.SendMessageRequest{ ApplicationKey: &clientID, Message: &message, } resp := &basepb.VoidProto{} return remapError(internal.Call(c, service, "SendChannelMessage", req, resp)) } // SendJSON is a helper function that sends a JSON-encoded value // on the channel associated with clientID. func SendJSON(c context.Context, clientID string, value interface{}) error { m, err := json.Marshal(value) if err != nil { return err } return Send(c, clientID, string(m)) } // remapError fixes any APIError referencing "xmpp" into one referencing "channel". func remapError(err error) error { if e, ok := err.(*internal.APIError); ok { if e.Service == "xmpp" { e.Service = "channel" } } return err } var service = "xmpp" // prod func init() { if appengine.IsDevAppServer() { service = "channel" // dev } internal.RegisterErrorCodeMap("channel", pb.ChannelServiceError_ErrorCode_name) }