github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/tcp_negotiation.go (about) 1 package ravendb 2 3 import ( 4 "encoding/json" 5 "io" 6 "strconv" 7 ) 8 9 const ( 10 outOfRangeStatus = -1 11 dropStatus = -2 12 ) 13 14 func negotiateProtocolVersion(stream io.Writer, parameters *tcpNegotiateParameters) (*supportedFeatures, error) { 15 v := parameters.version 16 currentRef := &v 17 for { 18 sendTcpVersionInfo(stream, parameters, *currentRef) 19 version := parameters.readResponseAndGetVersionCallback(parameters.destinationUrl) 20 21 /* 22 if (logger.isInfoEnabled()) { 23 logger.info("Read response from " + ObjectUtils.firstNonNull(parameters.getSourceNodeTag(), parameters.getDestinationUrl()) + " for " + parameters.getOperation() + ", received version is '" + version + "'"); 24 } 25 */ 26 27 if version == *currentRef { 28 break 29 } 30 31 //In this case we usually throw internally but for completeness we better handle it 32 if version == dropStatus { 33 return getSupportedFeaturesFor(operationDrop, dropBaseLine), nil 34 } 35 36 status := operationVersionSupported(parameters.operation, version, currentRef) 37 38 if status == supportedStatus_OUT_OF_RANGE { 39 sendTcpVersionInfo(stream, parameters, outOfRangeStatus) 40 return nil, newIllegalArgumentError("The " + parameters.operation + " version " + strconv.Itoa(parameters.version) + " is out of range, out lowest version is " + strconv.Itoa(*currentRef)) 41 } 42 43 /* 44 if (logger.isInfoEnabled()) { 45 logger.info("The version " + version + " is " + status + ", will try to agree on '" 46 + currentRef.value + "' for " + parameters.getOperation() + " with " 47 + ObjectUtils.firstNonNull(parameters.getDestinationNodeTag(), parameters.getDestinationUrl())); 48 } 49 */ 50 } 51 /* 52 if (logger.isInfoEnabled()) { 53 logger.info(ObjectUtils.firstNonNull(parameters.getDestinationNodeTag(), parameters.getDestinationUrl()) + " agreed on version " + currentRef.value + " for " + parameters.getOperation()); 54 } 55 */ 56 return getSupportedFeaturesFor(parameters.operation, *currentRef), nil 57 } 58 59 func sendTcpVersionInfo(stream io.Writer, parameters *tcpNegotiateParameters, currentVersion int) error { 60 /* 61 if (logger.isInfoEnabled()) { 62 logger.info("Send negotiation for " + parameters.getOperation() + " in version " + currentVersion); 63 } 64 */ 65 m := map[string]interface{}{ 66 "DatabaseName": parameters.database, 67 "Operation": parameters.operation, 68 "SourceNodeTag": parameters.sourceNodeTag, 69 "OperationVersion": currentVersion, 70 } 71 enc := json.NewEncoder(stream) 72 return enc.Encode(m) 73 }