func LogMessages(log Logger) ConnOpt {
	return func(c *Conn) {
		// Remember reqs we have received so we can helpfully show the
		// request method in OnSend for responses.
		var (
			mu         sync.Mutex
			reqMethods = map[ID]string{}
		)

		OnRecv(func(req *Request, resp *Response) {
			switch {
			case req != nil && resp == nil:
				mu.Lock()
				reqMethods[req.ID] = req.Method
				mu.Unlock()

				params, _ := json.Marshal(req.Params)
				if req.Notif {
					log.Printf("--> notif: %s: %s", req.Method, params)
				} else {
					log.Printf("--> request #%s: %s: %s", req.ID, req.Method, params)
				}

			case resp != nil:
				var method string
				if req != nil {
					method = req.Method
				} else {
					method = "(no matching request)"
				}
				switch {
				case resp.Result != nil:
					result, _ := json.Marshal(resp.Result)
					log.Printf("--> result #%s: %s: %s", resp.ID, method, result)
				case resp.Error != nil:
					err, _ := json.Marshal(resp.Error)
					log.Printf("--> error #%s: %s: %s", resp.ID, method, err)
				}
			}
		})(c)
		OnSend(func(req *Request, resp *Response) {
			switch {
			case req != nil:
				params, _ := json.Marshal(req.Params)
				if req.Notif {
					log.Printf("<-- notif: %s: %s", req.Method, params)
				} else {
					log.Printf("<-- request #%s: %s: %s", req.ID, req.Method, params)
				}

			case resp != nil:
				mu.Lock()
				method := reqMethods[resp.ID]
				delete(reqMethods, resp.ID)
				mu.Unlock()
				if method == "" {
					method = "(no previous request)"
				}

				if resp.Result != nil {
					result, _ := json.Marshal(resp.Result)
					log.Printf("<-- result #%s: %s: %s", resp.ID, method, result)
				} else {
					err, _ := json.Marshal(resp.Error)
					log.Printf("<-- error #%s: %s: %s", resp.ID, method, err)
				}
			}
		})(c)
	}
}
func LogMessages(log Logger) ConnOpt {
	return func(c *Conn) {
		
		
		var (
			mu         sync.Mutex
			reqMethods = map[ID]string{}
		)

		OnRecv(func(req *Request, resp *Response) {
			switch {
			case req != nil && resp == nil:
				mu.Lock()
				reqMethods[req.ID] = req.Method
				mu.Unlock()

				params, _ := json.Marshal(req.Params)
				if req.Notif {
					log.Printf("--> notif: %s: %s", req.Method, params)
				} else {
					log.Printf("--> request #%s: %s: %s", req.ID, req.Method, params)
				}

			case resp != nil:
				var method string
				if req != nil {
					method = req.Method
				} else {
					method = "(no matching request)"
				}
				switch {
				case resp.Result != nil:
					result, _ := json.Marshal(resp.Result)
					log.Printf("--> result #%s: %s: %s", resp.ID, method, result)
				case resp.Error != nil:
					err, _ := json.Marshal(resp.Error)
					log.Printf("--> error #%s: %s: %s", resp.ID, method, err)
				}
			}
		})(c)
		OnSend(func(req *Request, resp *Response) {
			switch {
			case req != nil:
				params, _ := json.Marshal(req.Params)
				if req.Notif {
					log.Printf("<-- notif: %s: %s", req.Method, params)
				} else {
					log.Printf("<-- request #%s: %s: %s", req.ID, req.Method, params)
				}

			case resp != nil:
				mu.Lock()
				method := reqMethods[resp.ID]
				delete(reqMethods, resp.ID)
				mu.Unlock()
				if method == "" {
					method = "(no previous request)"
				}

				if resp.Result != nil {
					result, _ := json.Marshal(resp.Result)
					log.Printf("<-- result #%s: %s: %s", resp.ID, method, result)
				} else {
					err, _ := json.Marshal(resp.Error)
					log.Printf("<-- error #%s: %s: %s", resp.ID, method, err)
				}
			}
		})(c)
	}
}
func LogMessages ( log Logger ) ConnOpt { return func ( c * Conn ) { // Remember reqs we have received so we can helpfully show the // request method in OnSend for responses. var ( mu sync . Mutex reqMethods = map [ ID ] string { } ) OnRecv ( func ( req * Request , resp * Response ) { switch { case req != nil && resp == nil : mu . Lock ( ) reqMethods [ req . ID ] = req . Method mu . Unlock ( ) params , _ := json . Marshal ( req . Params ) if req . Notif { log . Printf ( " " , req . Method , params ) } else { log . Printf ( " " , req . ID , req . Method , params ) } case resp != nil : var method string if req != nil { method = req . Method } else { method = " " } switch { case resp . Result != nil : result , _ := json . Marshal ( resp . Result ) log . Printf ( " " , resp . ID , method , result ) case resp . Error != nil : err , _ := json . Marshal ( resp . Error ) log . Printf ( " " , resp . ID , method , err ) } } } ) ( c ) OnSend ( func ( req * Request , resp * Response ) { switch { case req != nil : params , _ := json . Marshal ( req . Params ) if req . Notif { log . Printf ( " " , req . Method , params ) } else { log . Printf ( " " , req . ID , req . Method , params ) } case resp != nil : mu . Lock ( ) method := reqMethods [ resp . ID ] delete ( reqMethods , resp . ID ) mu . Unlock ( ) if method == " " { method = " " } if resp . Result != nil { result , _ := json . Marshal ( resp . Result ) log . Printf ( " " , resp . ID , method , result ) } else { err , _ := json . Marshal ( resp . Error ) log . Printf ( " " , resp . ID , method , err ) } } } ) ( c ) } }
// LogMessages causes all messages sent and received on conn to be
// logged using the provided logger.
LogMessages causes all messages sent and received on conn to be logged using the provided logger .