| 930 | } |
| 931 | |
| 932 | func (s *SSEAgentReinitReceiver) Receive(ctx context.Context) (*ReinitializationEvent, error) { |
| 933 | nextEvent := codersdk.ServerSentEventReader(ctx, s.r) |
| 934 | for { |
| 935 | select { |
| 936 | case <-ctx.Done(): |
| 937 | return nil, ctx.Err() |
| 938 | default: |
| 939 | } |
| 940 | |
| 941 | sse, err := nextEvent() |
| 942 | switch { |
| 943 | case err != nil: |
| 944 | return nil, xerrors.Errorf("failed to read server-sent event: %w", err) |
| 945 | case sse.Type == codersdk.ServerSentEventTypeError: |
| 946 | return nil, xerrors.Errorf("unexpected server sent event type error") |
| 947 | case sse.Type == codersdk.ServerSentEventTypePing: |
| 948 | continue |
| 949 | case sse.Type != codersdk.ServerSentEventTypeData: |
| 950 | return nil, xerrors.Errorf("unexpected server sent event type: %s", sse.Type) |
| 951 | } |
| 952 | |
| 953 | // At this point we know that the sent event is of type codersdk.ServerSentEventTypeData |
| 954 | var reinitEvent ReinitializationEvent |
| 955 | b, ok := sse.Data.([]byte) |
| 956 | if !ok { |
| 957 | return nil, xerrors.Errorf("expected data as []byte, got %T", sse.Data) |
| 958 | } |
| 959 | err = json.Unmarshal(b, &reinitEvent) |
| 960 | if err != nil { |
| 961 | return nil, xerrors.Errorf("unmarshal reinit response: %w", err) |
| 962 | } |
| 963 | return &reinitEvent, nil |
| 964 | } |
| 965 | } |
| 966 | |
| 967 | // AddChatContextRequest is the request body for adding chat context. |
| 968 | type AddChatContextRequest struct { |