wsprd: Vom encode the args/results of ipc messages to JS.
We can't yet vom encode the JS parts of the IPC layer because there is
nothing we can decode a vom2 stream into that can be encoded in vom1.
Change-Id: Ifb01d088eeaad8ceab4cd3570b991d44ad599419
diff --git a/services/wsprd/ipc/server/server.go b/services/wsprd/ipc/server/server.go
index 70bbfdc..c9c5d07 100644
--- a/services/wsprd/ipc/server/server.go
+++ b/services/wsprd/ipc/server/server.go
@@ -3,6 +3,8 @@
package server
import (
+ "bytes"
+ "encoding/hex"
"encoding/json"
"sync"
"time"
@@ -16,6 +18,7 @@
"veyron.io/veyron/veyron2/security"
"veyron.io/veyron/veyron2/verror2"
"veyron.io/veyron/veyron2/vlog"
+ "veyron.io/veyron/veyron2/vom2"
)
type Flow struct {
@@ -28,7 +31,7 @@
ServerId uint64
Handle int64
Method string
- Args []interface{}
+ Args string
Context serverRPCRequestContext
}
@@ -157,23 +160,36 @@
RemoteBlessingStrings: call.RemoteBlessings().ForContext(call),
}
- // Send a invocation request to JavaScript
- message := serverRPCRequest{
- ServerId: s.id,
- Handle: handle,
- Method: lib.LowercaseFirstCharacter(methodName),
- Args: args,
- Context: context,
- }
-
- if err := flow.Writer.Send(lib.ResponseServerRequest, message); err != nil {
- // Error in marshaling, pass the error through the channel immediately
+ errHandler := func(err error) <-chan *serverRPCReply {
if ch := s.popServerRequest(flow.ID); ch != nil {
stdErr := verror2.Convert(verror2.Internal, call, err).(verror2.Standard)
ch <- &serverRPCReply{nil, &stdErr}
s.helper.CleanupFlow(flow.ID)
}
return replyChan
+
+ }
+ var buf bytes.Buffer
+ encoder, err := vom2.NewBinaryEncoder(&buf)
+ if err != nil {
+ return errHandler(err)
+ }
+
+ if err := encoder.Encode(args); err != nil {
+ return errHandler(err)
+ }
+
+ // Send a invocation request to JavaScript
+ message := serverRPCRequest{
+ ServerId: s.id,
+ Handle: handle,
+ Method: lib.LowercaseFirstCharacter(methodName),
+ Args: hex.EncodeToString(buf.Bytes()),
+ Context: context,
+ }
+
+ if err := flow.Writer.Send(lib.ResponseServerRequest, message); err != nil {
+ return errHandler(err)
}
s.helper.GetLogger().VI(3).Infof("request received to call method %q on "+
@@ -205,7 +221,19 @@
func proxyStream(stream ipc.Stream, w lib.ClientWriter, logger vlog.Logger) {
var item interface{}
for err := stream.Recv(&item); err == nil; err = stream.Recv(&item) {
- if err := w.Send(lib.ResponseStream, item); err != nil {
+ var buf bytes.Buffer
+ encoder, err := vom2.NewBinaryEncoder(&buf)
+ if err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ if err := encoder.Encode(item); err != nil {
+ w.Error(verror2.Convert(verror2.Internal, nil, err))
+ return
+ }
+
+ if err := w.Send(lib.ResponseStream, hex.EncodeToString(buf.Bytes())); err != nil {
w.Error(verror2.Convert(verror2.Internal, nil, err))
return
}