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 }