/
response.go
99 lines (81 loc) · 2.05 KB
/
response.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package resolve
import (
"io"
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/lexer/literal"
)
type GraphQLSubscription struct {
Trigger GraphQLSubscriptionTrigger
Response *GraphQLResponse
}
type GraphQLSubscriptionTrigger struct {
Input []byte
InputTemplate InputTemplate
Variables Variables
Source SubscriptionDataSource
PostProcessing PostProcessingConfiguration
}
type GraphQLResponse struct {
Data *Object
RenameTypeNames []RenameTypeName
Info *GraphQLResponseInfo
}
type GraphQLResponseInfo struct {
OperationType ast.OperationType
}
type RenameTypeName struct {
From, To []byte
}
type ResponseWriter interface {
io.Writer
}
type SubscriptionResponseWriter interface {
ResponseWriter
Flush() error
Complete()
}
func writeGraphqlResponse(buf *BufPair, writer io.Writer, ignoreData bool) (err error) {
hasErrors := buf.Errors.Len() != 0
hasData := buf.Data.Len() != 0 && !ignoreData
err = writeSafe(err, writer, lBrace)
if hasErrors {
err = writeSafe(err, writer, quote)
err = writeSafe(err, writer, literalErrors)
err = writeSafe(err, writer, quote)
err = writeSafe(err, writer, colon)
err = writeSafe(err, writer, lBrack)
err = writeSafe(err, writer, buf.Errors.Bytes())
err = writeSafe(err, writer, rBrack)
err = writeSafe(err, writer, comma)
}
err = writeSafe(err, writer, quote)
err = writeSafe(err, writer, literalData)
err = writeSafe(err, writer, quote)
err = writeSafe(err, writer, colon)
if hasData {
_, err = writer.Write(buf.Data.Bytes())
} else {
err = writeSafe(err, writer, literal.NULL)
}
err = writeSafe(err, writer, rBrace)
return err
}
func writeSafe(err error, writer io.Writer, data []byte) error {
if err != nil {
return err
}
_, err = writer.Write(data)
return err
}
func writeFlushComplete(writer SubscriptionResponseWriter, msg []byte) error {
_, err := writer.Write(msg)
if err != nil {
return err
}
err = writer.Flush()
if err != nil {
return err
}
writer.Complete()
return nil
}