Skip to content
Snippets Groups Projects
Select Git revision
  • b7cb280feeb4657ae6022da8aa18f3710c34a347
  • release default protected
  • 11-22-implement-kv-interface-defined-in-collectiveversionedkvgo
  • hotfix/TestHostPool_UpdateNdf_AddFilter
  • XX-4719/announcementChannels
  • xx-4717/logLevel
  • jonah/noob-channel
  • master protected
  • XX-4707/tagDiskJson
  • xx-4698/notification-retry
  • hotfix/notifylockup
  • syncNodes
  • hotfix/localCB
  • XX-4677/NewChanManagerMobile
  • XX-4689/DmSync
  • duplicatePrefix
  • XX-4601/HavenInvites
  • finalizedUICallbacks
  • XX-4673/AdminKeySync
  • debugNotifID
  • anne/test
  • v4.7.5
  • v4.7.4
  • v4.7.3
  • v4.7.2
  • v4.7.1
  • v4.6.3
  • v4.6.1
  • v4.5.0
  • v4.4.4
  • v4.3.11
  • v4.3.8
  • v4.3.7
  • v4.3.6
  • v4.3.5
  • v4.2.0
  • v4.3.0
  • v4.3.4
  • v4.3.3
  • v4.3.2
  • v4.3.1
41 results

services.go

Blame
  • request.go 2.96 KiB
    ////////////////////////////////////////////////////////////////////////////////
    // Copyright © 2022 Privategrity Corporation                                   /
    //                                                                             /
    // All rights reserved.                                                        /
    ////////////////////////////////////////////////////////////////////////////////
    
    package connect
    
    import (
    	jww "github.com/spf13/jwalterweatherman"
    	"gitlab.com/elixxir/client/catalog"
    	"gitlab.com/elixxir/client/connect"
    	"gitlab.com/elixxir/client/e2e"
    	"gitlab.com/elixxir/client/restlike"
    	"gitlab.com/elixxir/crypto/cyclic"
    	"gitlab.com/xx_network/crypto/csprng"
    	"google.golang.org/protobuf/proto"
    )
    
    // Request allows for making REST-like requests to a RestServer using connect.Connection
    // Can be used as stateful or declared inline without state
    type Request struct {
    	Net    connect.Connection
    	Rng    csprng.Source
    	E2eGrp *cyclic.Group
    }
    
    // Request provides several Method of sending Data to the given URI
    // and blocks until the Message is returned
    func (s *Request) Request(method restlike.Method, path restlike.URI,
    	content restlike.Data, headers *restlike.Headers, e2eParams e2e.Params) (*restlike.Message, error) {
    	// Build the Message
    	newMessage := &restlike.Message{
    		Content: content,
    		Headers: headers,
    		Method:  uint32(method),
    		Uri:     string(path),
    	}
    	msg, err := proto.Marshal(newMessage)
    	if err != nil {
    		return nil, err
    	}
    
    	// Build callback for the response
    	signalChannel := make(chan *restlike.Message, 1)
    	cb := func(msg *restlike.Message) {
    		signalChannel <- msg
    	}
    	s.Net.RegisterListener(catalog.XxMessage, &response{responseCallback: cb})
    
    	// Transmit the Message
    	// fixme: should this use the key residue?
    	_, _, _, _, err = s.Net.SendE2E(catalog.XxMessage, msg, e2eParams)
    	if err != nil {
    		return nil, err
    	}
    
    	// Block waiting for single-use response
    	jww.DEBUG.Printf("Restlike waiting for connect response from %s...",
    		s.Net.GetPartner().PartnerId().String())
    	newResponse := <-signalChannel
    	jww.DEBUG.Printf("Restlike connect response received from %s",
    		s.Net.GetPartner().PartnerId().String())
    
    	return newResponse, nil
    }
    
    // AsyncRequest provides several Method of sending Data to the given URI
    // and will return the Message to the given Callback when received
    func (s *Request) AsyncRequest(method restlike.Method, path restlike.URI,
    	content restlike.Data, headers *restlike.Headers, cb restlike.RequestCallback, e2eParams e2e.Params) error {
    	// Build the Message
    	newMessage := &restlike.Message{
    		Content: content,
    		Headers: headers,
    		Method:  uint32(method),
    		Uri:     string(path),
    	}
    	msg, err := proto.Marshal(newMessage)
    	if err != nil {
    		return err
    	}
    
    	// Build callback for the response
    	s.Net.RegisterListener(catalog.XxMessage, &response{responseCallback: cb})
    
    	// Transmit the Message
    	// fixme: should this use the key residue?
    	_, _, _, _, err = s.Net.SendE2E(catalog.XxMessage, msg, e2eParams)
    	return err
    }