github.com/gagliardetto/solana-go@v1.11.0/rpc/ws/subscription.go (about)

     1  // Copyright 2021 github.com/gagliardetto
     2  // This file has been modified by github.com/gagliardetto
     3  //
     4  // Copyright 2020 dfuse Platform Inc.
     5  //
     6  // Licensed under the Apache License, Version 2.0 (the "License");
     7  // you may not use this file except in compliance with the License.
     8  // You may obtain a copy of the License at
     9  //
    10  //      http://www.apache.org/licenses/LICENSE-2.0
    11  //
    12  // Unless required by applicable law or agreed to in writing, software
    13  // distributed under the License is distributed on an "AS IS" BASIS,
    14  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15  // See the License for the specific language governing permissions and
    16  // limitations under the License.
    17  
    18  package ws
    19  
    20  type Subscription struct {
    21  	req               *request
    22  	subID             uint64
    23  	stream            chan result
    24  	err               chan error
    25  	closeFunc         func(err error)
    26  	closed            bool
    27  	unsubscribeMethod string
    28  	decoderFunc       decoderFunc
    29  }
    30  
    31  type decoderFunc func([]byte) (interface{}, error)
    32  
    33  func newSubscription(
    34  	req *request,
    35  	closeFunc func(err error),
    36  	unsubscribeMethod string,
    37  	decoderFunc decoderFunc,
    38  ) *Subscription {
    39  	return &Subscription{
    40  		req:               req,
    41  		subID:             0,
    42  		stream:            make(chan result, 200_000),
    43  		err:               make(chan error, 100_000),
    44  		closeFunc:         closeFunc,
    45  		unsubscribeMethod: unsubscribeMethod,
    46  		decoderFunc:       decoderFunc,
    47  	}
    48  }
    49  
    50  func (s *Subscription) Recv() (interface{}, error) {
    51  	select {
    52  	case d := <-s.stream:
    53  		return d, nil
    54  	case err := <-s.err:
    55  		return nil, err
    56  	}
    57  }
    58  
    59  func (s *Subscription) Unsubscribe() {
    60  	s.unsubscribe(nil)
    61  }
    62  
    63  func (s *Subscription) unsubscribe(err error) {
    64  	s.closeFunc(err)
    65  	s.closed = true
    66  	close(s.stream)
    67  	close(s.err)
    68  }