97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
package api
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/microsoft/typescript-go/internal/json"
|
|
"github.com/microsoft/typescript-go/internal/jsonrpc"
|
|
)
|
|
|
|
// JSONRPCProtocol implements the Protocol interface using JSON-RPC 2.0
|
|
// with the LSP base protocol framing (Content-Length headers).
|
|
type JSONRPCProtocol struct {
|
|
reader *jsonrpc.Reader
|
|
writer *jsonrpc.Writer
|
|
}
|
|
|
|
var _ Protocol = (*JSONRPCProtocol)(nil)
|
|
|
|
// NewJSONRPCProtocol creates a new JSON-RPC protocol handler.
|
|
func NewJSONRPCProtocol(rw io.ReadWriter) *JSONRPCProtocol {
|
|
return &JSONRPCProtocol{
|
|
reader: jsonrpc.NewReader(rw),
|
|
writer: jsonrpc.NewWriter(rw),
|
|
}
|
|
}
|
|
|
|
// ReadMessage implements Protocol.
|
|
func (p *JSONRPCProtocol) ReadMessage() (*Message, error) {
|
|
data, err := p.reader.Read()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var msg Message
|
|
if err := json.Unmarshal(data, &msg); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &msg, nil
|
|
}
|
|
|
|
// WriteRequest implements Protocol.
|
|
func (p *JSONRPCProtocol) WriteRequest(id *jsonrpc.ID, method string, params any) error {
|
|
msg := jsonrpc.RequestMessage{
|
|
ID: id,
|
|
Method: method,
|
|
Params: params,
|
|
}
|
|
data, err := json.Marshal(msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return p.writer.Write(data)
|
|
}
|
|
|
|
// WriteNotification implements Protocol.
|
|
func (p *JSONRPCProtocol) WriteNotification(method string, params any) error {
|
|
msg := jsonrpc.RequestMessage{
|
|
Method: method,
|
|
Params: params,
|
|
}
|
|
data, err := json.Marshal(msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return p.writer.Write(data)
|
|
}
|
|
|
|
// WriteResponse implements Protocol.
|
|
func (p *JSONRPCProtocol) WriteResponse(id *jsonrpc.ID, result any) error {
|
|
if result == nil {
|
|
result = json.Value("null")
|
|
}
|
|
msg := jsonrpc.ResponseMessage{
|
|
ID: id,
|
|
Result: result,
|
|
}
|
|
data, err := json.Marshal(msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return p.writer.Write(data)
|
|
}
|
|
|
|
// WriteError implements Protocol.
|
|
func (p *JSONRPCProtocol) WriteError(id *jsonrpc.ID, respErr *jsonrpc.ResponseError) error {
|
|
msg := jsonrpc.ResponseMessage{
|
|
ID: id,
|
|
Error: respErr,
|
|
}
|
|
data, err := json.Marshal(msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return p.writer.Write(data)
|
|
}
|