MCPcopy Index your code
hub / github.com/coder/coder / ServerSentEventReader

Function ServerSentEventReader

codersdk/serversentevents.go:28–95  ·  view source on GitHub ↗
(ctx context.Context, rc io.ReadCloser)

Source from the content-addressed store, hash-verified

26)
27
28func ServerSentEventReader(ctx context.Context, rc io.ReadCloser) func() (*ServerSentEvent, error) {
29 _, span := tracing.StartSpan(ctx)
30 defer span.End()
31
32 reader := bufio.NewReader(rc)
33 nextLineValue := func(prefix string) ([]byte, error) {
34 var (
35 line string
36 err error
37 )
38 for {
39 line, err = reader.ReadString('\n')
40 if err != nil {
41 return nil, xerrors.Errorf("reading next string: %w", err)
42 }
43 if strings.TrimSpace(line) != "" {
44 break
45 }
46 }
47
48 if !strings.HasPrefix(line, fmt.Sprintf("%s: ", prefix)) {
49 return nil, xerrors.Errorf("expecting %s prefix, got: %s", prefix, line)
50 }
51 s := strings.TrimPrefix(line, fmt.Sprintf("%s: ", prefix))
52 s = strings.TrimSpace(s)
53 return []byte(s), nil
54 }
55
56 nextEvent := func() (*ServerSentEvent, error) {
57 for {
58 t, err := nextLineValue("event")
59 if err != nil {
60 return nil, xerrors.Errorf("reading next line value: %w", err)
61 }
62
63 switch ServerSentEventType(t) {
64 case ServerSentEventTypePing:
65 return &ServerSentEvent{
66 Type: ServerSentEventTypePing,
67 }, nil
68 case ServerSentEventTypeData:
69 d, err := nextLineValue("data")
70 if err != nil {
71 return nil, xerrors.Errorf("reading next line value: %w", err)
72 }
73
74 return &ServerSentEvent{
75 Type: ServerSentEventTypeData,
76 Data: d,
77 }, nil
78 case ServerSentEventTypeError:
79 d, err := nextLineValue("data")
80 if err != nil {
81 return nil, xerrors.Errorf("reading next line value: %w", err)
82 }
83
84 return &ServerSentEvent{
85 Type: ServerSentEventTypeError,

Callers 3

ReceiveMethod · 0.92
WatchWorkspaceMethod · 0.85

Calls 4

StartSpanFunction · 0.92
ServerSentEventTypeTypeAlias · 0.85
ReadStringMethod · 0.80
ErrorfMethod · 0.45

Tested by

no test coverage detected