Skip to content

Commit 0cc4568

Browse files
authored
feat(utils): add RPC API utils for SFU and Go SDK (#1215)
* feat(utils): add RPC API utils for SFU and Go SDK * rename with data channel prefix * cleanup
1 parent 641bae4 commit 0cc4568

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

utils/data_channel_rpc.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package utils
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"github.com/livekit/psrpc"
8+
)
9+
10+
type DataChannelRpcErrorCode uint32
11+
12+
const (
13+
DataChannelRpcApplicationError DataChannelRpcErrorCode = 1500 + iota
14+
DataChannelRpcConnectionTimeout
15+
DataChannelRpcResponseTimeout
16+
DataChannelRpcRecipientDisconnected
17+
DataChannelRpcResponsePayloadTooLarge
18+
DataChannelRpcSendFailed
19+
)
20+
21+
const (
22+
DataChannelRpcUnsupportedMethod DataChannelRpcErrorCode = 1400 + iota
23+
DataChannelRpcRecipientNotFound
24+
DataChannelRpcRequestPayloadTooLarge
25+
DataChannelRpcUnsupportedServer
26+
DataChannelRpcUnsupportedVersion
27+
)
28+
29+
const (
30+
DataChannelRpcMaxRoundTripLatency = 2000 * time.Millisecond
31+
DataChannelRpcMaxMessageBytes = 256
32+
DataChannelRpcMaxDataBytes = 15360 // 15KiB
33+
DataChannelRpcMaxPayloadBytes = 15360 // 15KiB
34+
DataChannelRpcDefaultResponseTimeout = 10000 * time.Millisecond
35+
)
36+
37+
var dataChannelRpcErrorMessages = map[DataChannelRpcErrorCode]string{
38+
DataChannelRpcApplicationError: "Application error in method handler",
39+
DataChannelRpcConnectionTimeout: "Connection timeout",
40+
DataChannelRpcResponseTimeout: "Response timeout",
41+
DataChannelRpcRecipientDisconnected: "Recipient disconnected",
42+
DataChannelRpcResponsePayloadTooLarge: "Response payload too large",
43+
DataChannelRpcSendFailed: "Failed to send",
44+
45+
DataChannelRpcUnsupportedMethod: "Method not supported at destination",
46+
DataChannelRpcRecipientNotFound: "Recipient not found",
47+
DataChannelRpcRequestPayloadTooLarge: "Request payload too large",
48+
DataChannelRpcUnsupportedServer: "RPC not supported by server",
49+
DataChannelRpcUnsupportedVersion: "Unsupported RPC version",
50+
}
51+
52+
type DataChannelRpcError struct {
53+
Code DataChannelRpcErrorCode
54+
Message string
55+
Data string
56+
}
57+
58+
func (e *DataChannelRpcError) Error() string {
59+
return fmt.Sprintf("RpcError %d: %s", e.Code, e.Message)
60+
}
61+
62+
func (e *DataChannelRpcError) PsrpcError() psrpc.Error {
63+
switch e.Code {
64+
case DataChannelRpcApplicationError:
65+
return psrpc.NewErrorf(psrpc.Internal, e.Message, "data", e.Data)
66+
case DataChannelRpcConnectionTimeout:
67+
return psrpc.NewErrorf(psrpc.DeadlineExceeded, e.Message, "data", e.Data)
68+
case DataChannelRpcResponseTimeout:
69+
return psrpc.NewErrorf(psrpc.DeadlineExceeded, e.Message, "data", e.Data)
70+
case DataChannelRpcRecipientDisconnected:
71+
return psrpc.NewErrorf(psrpc.Unavailable, e.Message, "data", e.Data)
72+
case DataChannelRpcResponsePayloadTooLarge:
73+
return psrpc.NewErrorf(psrpc.MalformedResponse, e.Message, "data", e.Data)
74+
case DataChannelRpcSendFailed:
75+
return psrpc.NewErrorf(psrpc.Internal, e.Message, "data", e.Data)
76+
case DataChannelRpcUnsupportedMethod:
77+
return psrpc.NewErrorf(psrpc.InvalidArgument, e.Message, "data", e.Data)
78+
case DataChannelRpcRecipientNotFound:
79+
return psrpc.NewErrorf(psrpc.NotFound, e.Message, "data", e.Data)
80+
case DataChannelRpcRequestPayloadTooLarge:
81+
return psrpc.NewErrorf(psrpc.MalformedRequest, e.Message, "data", e.Data)
82+
case DataChannelRpcUnsupportedServer:
83+
return psrpc.NewErrorf(psrpc.Unimplemented, e.Message, "data", e.Data)
84+
case DataChannelRpcUnsupportedVersion:
85+
return psrpc.NewErrorf(psrpc.Unimplemented, e.Message, "data", e.Data)
86+
default:
87+
return psrpc.NewErrorf(psrpc.Internal, e.Message, "data", e.Data)
88+
}
89+
}
90+
91+
func DataChannelRpcErrorFromBuiltInCodes(code DataChannelRpcErrorCode, data *string) *DataChannelRpcError {
92+
return &DataChannelRpcError{Code: code, Message: dataChannelRpcErrorMessages[code], Data: *data}
93+
}
94+
95+
type DataChannelRpcPendingAckHandler struct {
96+
Resolve func()
97+
ParticipantIdentity string
98+
}
99+
100+
type DataChannelRpcPendingResponseHandler struct {
101+
Resolve func(payload string, err *DataChannelRpcError)
102+
ParticipantIdentity string
103+
}

0 commit comments

Comments
 (0)