| 99 | } |
| 100 | |
| 101 | func (s *session) dispatch(msg Message) { |
| 102 | if msg.Type == MessageTypePing { |
| 103 | _ = s.send(context.Background(), Message{ID: msg.ID, Type: MessageTypePong}) |
| 104 | return |
| 105 | } |
| 106 | if value, ok := s.pending.Load(msg.ID); ok { |
| 107 | req := value.(*pendingRequest) |
| 108 | select { |
| 109 | case req.ch <- msg: |
| 110 | default: |
| 111 | } |
| 112 | if msg.Type == MessageTypeHTTPResp || msg.Type == MessageTypeError || msg.Type == MessageTypeStreamEnd { |
| 113 | if actual, loaded := s.pending.LoadAndDelete(msg.ID); loaded { |
| 114 | actual.(*pendingRequest).close() |
| 115 | } |
| 116 | } |
| 117 | return |
| 118 | } |
| 119 | if msg.Type == MessageTypeHTTPResp || msg.Type == MessageTypeError || msg.Type == MessageTypeStreamEnd { |
| 120 | s.manager.logDebugf("wsrelay: received terminal message for unknown id %s (provider=%s)", msg.ID, s.provider) |
| 121 | } |
| 122 | } |
| 123 | |
| 124 | func (s *session) send(ctx context.Context, msg Message) error { |
| 125 | select { |