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
 		}