Index: third_party/mojo/src/mojo/public/go/bindings/stub.go |
diff --git a/third_party/mojo/src/mojo/public/go/bindings/stub.go b/third_party/mojo/src/mojo/public/go/bindings/stub.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b2b3120a08c0fe68c979b9657d4e95b399f9a755 |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/go/bindings/stub.go |
@@ -0,0 +1,47 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package bindings |
+ |
+// MessageReceiver can receive |Message| objects. |
+type MessageReceiver interface { |
+ // Accept receives a |Message|. Returns a error if the message was not |
+ // handled. |
+ Accept(message *Message) error |
+} |
+ |
+// Stub is a base implementation of Stub. Stubs receives messages from message |
+// pipe, deserialize the payload and call the appropriate method in the |
+// implementation. If the method returns result, the stub serializes the |
+// response and sends it back. |
+type Stub struct { |
+ connector *Connector |
+ receiver MessageReceiver |
+} |
+ |
+// NewStub returns a new Stub instance using provided |Connector| to send and |
+// receive messages. Incoming messages are handled by the provided |receiver|. |
+func NewStub(connector *Connector, receiver MessageReceiver) *Stub { |
+ return &Stub{connector, receiver} |
+} |
+ |
+// ServeRequest synchronously serves one request from the message pipe: the |
+// |Stub| waits on its underlying message pipe for a message and handles it. |
+// Can be called from multiple goroutines. Each calling goroutine will receive |
+// a different message or an error. |
+func (s *Stub) ServeRequest() error { |
+ message, err := s.connector.ReadMessage() |
+ if err != nil { |
+ return err |
+ } |
+ return s.receiver.Accept(message) |
+} |
+ |
+// Close immediately closes the |Stub| and its underlying message pipe. If the |
+// |Stub| is waiting on its message pipe handle the wait process is interrupted. |
+// All goroutines trying to serve will start returning errors as the underlying |
+// message pipe becomes invalid. |
+func (s *Stub) Close() { |
+ s.connector.Close() |
+} |