veyron.io/wspr: Adding support for addName and removeName requests
to a server in wspr.
New IPC server API prohibits calling serve multiple times and instead
exposes addName and removeName to be used for publishing mutiple times.
This CL brings that functionality to wspr so that the JS API (separate CL)
can change to include addName and removeName as well.
Change-Id: If0d25008ae023521730b6dddfb8bce63f70d90aa
diff --git a/services/wsprd/app/app.go b/services/wsprd/app/app.go
index 1ac1363..9acd92b 100644
--- a/services/wsprd/app/app.go
+++ b/services/wsprd/app/app.go
@@ -73,12 +73,16 @@
IsStreaming bool
}
-// A request javascript to serve undern a particular name
type serveRequest struct {
Name string
ServerId uint64
}
+type addRemoveNameRequest struct {
+ Name string
+ ServerId uint64
+}
+
type jsonCaveatValidator struct {
Type string `json:"_type"`
Data json.RawMessage
@@ -566,6 +570,65 @@
}
}
+// HandleAddNameRequest takes a request to add a new name to a server
+func (c *Controller) HandleAddNameRequest(data string, w lib.ClientWriter) {
+ var request addRemoveNameRequest
+ if err := json.Unmarshal([]byte(data), &request); err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ // Create a server for the websocket pipe, if it does not exist already
+ server, err := c.maybeCreateServer(request.ServerId)
+ if err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ // Add name
+ if err := server.AddName(request.Name); err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ // Send true to indicate request has finished without error
+ if err := w.Send(lib.ResponseFinal, true); err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+}
+
+// HandleRemoveNameRequest takes a request to remove a name from a server
+func (c *Controller) HandleRemoveNameRequest(data string, w lib.ClientWriter) {
+ var request addRemoveNameRequest
+ if err := json.Unmarshal([]byte(data), &request); err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ // Create a server for the websocket pipe, if it does not exist already
+ server, err := c.maybeCreateServer(request.ServerId)
+ if err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ // Remove name
+ if err := server.RemoveName(request.Name); err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ // Remove name from signature cache as well
+ c.signatureManager.FlushCacheEntry(request.Name)
+
+ // Send true to indicate request has finished without error
+ if err := w.Send(lib.ResponseFinal, true); err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+}
+
// HandleServerResponse handles the completion of outstanding calls to JavaScript services
// by filling the corresponding channel with the result from JavaScript.
func (c *Controller) HandleServerResponse(id int64, data string) {