const DefaultRPCPath … const DefaultDebugPath … var typeOfError … type methodType … type service … type Request … type Response … type Server … // NewServer returns a new [Server]. func NewServer() *Server { … } var DefaultServer … // Is this type exported or a builtin? func isExportedOrBuiltinType(t reflect.Type) bool { … } // Register publishes in the server the set of methods of the // receiver value that satisfy the following conditions: // - exported method of exported type // - two arguments, both of exported type // - the second argument is a pointer // - one return value, of type error // // It returns an error if the receiver is not an exported type or has // no suitable methods. It also logs the error using package log. // The client accesses each method using a string of the form "Type.Method", // where Type is the receiver's concrete type. func (server *Server) Register(rcvr any) error { … } // RegisterName is like [Register] but uses the provided name for the type // instead of the receiver's concrete type. func (server *Server) RegisterName(name string, rcvr any) error { … } const logRegisterError … func (server *Server) register(rcvr any, name string, useName bool) error { … } // suitableMethods returns suitable Rpc methods of typ. It will log // errors if logErr is true. func suitableMethods(typ reflect.Type, logErr bool) map[string]*methodType { … } var invalidRequest … func (server *Server) sendResponse(sending *sync.Mutex, req *Request, reply any, codec ServerCodec, errmsg string) { … } func (m *methodType) NumCalls() (n uint) { … } func (s *service) call(server *Server, sending *sync.Mutex, wg *sync.WaitGroup, mtype *methodType, req *Request, argv, replyv reflect.Value, codec ServerCodec) { … } type gobServerCodec … func (c *gobServerCodec) ReadRequestHeader(r *Request) error { … } func (c *gobServerCodec) ReadRequestBody(body any) error { … } func (c *gobServerCodec) WriteResponse(r *Response, body any) (err error) { … } func (c *gobServerCodec) Close() error { … } // ServeConn runs the server on a single connection. // ServeConn blocks, serving the connection until the client hangs up. // The caller typically invokes ServeConn in a go statement. // ServeConn uses the gob wire format (see package gob) on the // connection. To use an alternate codec, use [ServeCodec]. // See [NewClient]'s comment for information about concurrent access. func (server *Server) ServeConn(conn io.ReadWriteCloser) { … } // ServeCodec is like [ServeConn] but uses the specified codec to // decode requests and encode responses. func (server *Server) ServeCodec(codec ServerCodec) { … } // ServeRequest is like [ServeCodec] but synchronously serves a single request. // It does not close the codec upon completion. func (server *Server) ServeRequest(codec ServerCodec) error { … } func (server *Server) getRequest() *Request { … } func (server *Server) freeRequest(req *Request) { … } func (server *Server) getResponse() *Response { … } func (server *Server) freeResponse(resp *Response) { … } func (server *Server) readRequest(codec ServerCodec) (service *service, mtype *methodType, req *Request, argv, replyv reflect.Value, keepReading bool, err error) { … } func (server *Server) readRequestHeader(codec ServerCodec) (svc *service, mtype *methodType, req *Request, keepReading bool, err error) { … } // Accept accepts connections on the listener and serves requests // for each incoming connection. Accept blocks until the listener // returns a non-nil error. The caller typically invokes Accept in a // go statement. func (server *Server) Accept(lis net.Listener) { … } // Register publishes the receiver's methods in the [DefaultServer]. func Register(rcvr any) error { … } // RegisterName is like [Register] but uses the provided name for the type // instead of the receiver's concrete type. func RegisterName(name string, rcvr any) error { … } type ServerCodec … // ServeConn runs the [DefaultServer] on a single connection. // ServeConn blocks, serving the connection until the client hangs up. // The caller typically invokes ServeConn in a go statement. // ServeConn uses the gob wire format (see package gob) on the // connection. To use an alternate codec, use [ServeCodec]. // See [NewClient]'s comment for information about concurrent access. func ServeConn(conn io.ReadWriteCloser) { … } // ServeCodec is like [ServeConn] but uses the specified codec to // decode requests and encode responses. func ServeCodec(codec ServerCodec) { … } // ServeRequest is like [ServeCodec] but synchronously serves a single request. // It does not close the codec upon completion. func ServeRequest(codec ServerCodec) error { … } // Accept accepts connections on the listener and serves requests // to [DefaultServer] for each incoming connection. // Accept blocks; the caller typically invokes it in a go statement. func Accept(lis net.Listener) { … } var connected … // ServeHTTP implements an [http.Handler] that answers RPC requests. func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { … } // HandleHTTP registers an HTTP handler for RPC messages on rpcPath, // and a debugging handler on debugPath. // It is still necessary to invoke [http.Serve](), typically in a go statement. func (server *Server) HandleHTTP(rpcPath, debugPath string) { … } // HandleHTTP registers an HTTP handler for RPC messages to [DefaultServer] // on [DefaultRPCPath] and a debugging handler on [DefaultDebugPath]. // It is still necessary to invoke [http.Serve](), typically in a go statement. func HandleHTTP() { … }