@@ -5,7 +5,7 @@ const fs = require('fs');
55const semver = require ( 'semver' ) ;
66const express = require ( 'express' ) ;
77const jayson = require ( 'jayson' ) ;
8- const logger = require ( '../logger' ) ;
8+ const logger = require ( '../logger' ) ( 'CLIENT' ) ;
99const BlockchainNode = require ( '../node' ) ;
1010const P2pServer = require ( '../server' ) ;
1111const ChainUtil = require ( '../chain-util' ) ;
@@ -14,11 +14,10 @@ const { ConsensusStatus } = require('../consensus/constants');
1414const CURRENT_PROTOCOL_VERSION = require ( '../package.json' ) . version ;
1515
1616const MAX_BLOCKS = 20 ;
17- const CLIENT_PREFIX = 'CLIENT' ;
1817
1918// NOTE(seo): This is very useful when the server dies without any logs.
2019process . on ( 'uncaughtException' , function ( err ) {
21- logger . error ( `[ ${ CLIENT_PREFIX } ]` + err ) ;
20+ logger . error ( err ) ;
2221} ) ;
2322
2423process . on ( 'SIGINT' , _ => {
@@ -34,17 +33,9 @@ if (!semver.valid(CURRENT_PROTOCOL_VERSION)) {
3433 throw Error ( "Wrong version format is specified in package.json" ) ;
3534}
3635const VERSION_LIST = JSON . parse ( fs . readFileSync ( PROTOCOL_VERSIONS ) ) ;
37- const MAJOR_MINOR_VERSION =
38- `${ semver . major ( CURRENT_PROTOCOL_VERSION ) } .${ semver . minor ( CURRENT_PROTOCOL_VERSION ) } ` ;
39- if ( ! semver . valid ( semver . coerce ( MAJOR_MINOR_VERSION ) ) ) {
40- throw Error ( "Given major and minor version does not correctly setup" ) ;
41- }
42- if ( ! VERSION_LIST [ MAJOR_MINOR_VERSION ] ) {
43- throw Error ( "Current protocol version doesn't exist in the protocol versions file" ) ;
44- }
45- const minProtocolVersion =
46- VERSION_LIST [ MAJOR_MINOR_VERSION ] . min || CURRENT_PROTOCOL_VERSION ;
47- const maxProtocolVersion = VERSION_LIST [ MAJOR_MINOR_VERSION ] . max ;
36+ const { min, max } = matchVersions ( CURRENT_PROTOCOL_VERSION ) ;
37+ const minProtocolVersion = min === undefined ? CURRENT_PROTOCOL_VERSION : min ;
38+ const maxProtocolVersion = max ;
4839
4940const app = express ( ) ;
5041app . use ( express . json ( ) ) ; // support json encoded bodies
@@ -326,6 +317,14 @@ app.get('/get_address', (req, res, next) => {
326317 . end ( ) ;
327318} ) ;
328319
320+ app . get ( '/get_sharding' , ( req , res , next ) => {
321+ const result = node . getSharding ( ) ;
322+ res . status ( 200 )
323+ . set ( 'Content-Type' , 'application/json' )
324+ . send ( { code : result !== null ? 0 : 1 , result} )
325+ . end ( ) ;
326+ } ) ;
327+
329328app . get ( '/get_raw_consensus_state' , ( req , res ) => {
330329 const result = p2pServer . consensus . getRawState ( ) ;
331330 res . status ( 200 )
@@ -345,8 +344,8 @@ app.get('/get_consensus_state', (req, res) => {
345344// We will want changes in ports and the database to be broadcast across
346345// all instances so lets pass this info into the p2p server
347346const server = app . listen ( PORT , ( ) => {
348- logger . info ( `[ ${ CLIENT_PREFIX } ] App listening on port ${ PORT } ` ) ;
349- logger . info ( `[ ${ CLIENT_PREFIX } ] Press Ctrl+C to quit.` ) ;
347+ logger . info ( `App listening on port ${ PORT } ` ) ;
348+ logger . info ( `Press Ctrl+C to quit.` ) ;
350349} ) ;
351350
352351server . keepAliveTimeout = 620 * 1000 ; // 620 seconds
@@ -410,13 +409,37 @@ function checkIfTransactionShouldBeNonced(input) {
410409 return input . is_nonced_transaction !== undefined ? input . is_nonced_transaction : true ;
411410}
412411
412+ function isValidVersionMatch ( ver ) {
413+ return ver && semver . valid ( semver . coerce ( ver . min ) ) &&
414+ ( ! ver . max || semver . valid ( semver . coerce ( ver . max ) ) ) ;
415+ }
416+
417+ function matchVersions ( ver ) {
418+ let match = VERSION_LIST [ ver ] ;
419+ if ( isValidVersionMatch ( match ) ) {
420+ return match ;
421+ }
422+ const majorVer = semver . major ( ver ) ;
423+ const majorMinorVer = `${ majorVer } .${ semver . minor ( ver ) } ` ;
424+ match = VERSION_LIST [ majorMinorVer ] ;
425+ if ( isValidVersionMatch ( match ) ) {
426+ return match ;
427+ }
428+ match = VERSION_LIST [ majorVer ] ;
429+ if ( isValidVersionMatch ( match ) ) {
430+ return match ;
431+ }
432+ return { } ;
433+ }
434+
413435function validateVersion ( req , res , next ) {
414436 let version = null ;
415437 if ( req . query . protoVer ) {
416438 version = req . query . protoVer ;
417439 } else if ( req . body . params ) {
418440 version = req . body . params . protoVer ;
419441 }
442+ const coercedVer = semver . coerce ( version ) ;
420443 if ( req . body . method === 'ain_getProtocolVersion' ||
421444 req . body . method === 'ain_checkProtocolVersion' ) {
422445 next ( ) ;
@@ -426,14 +449,14 @@ function validateVersion(req, res, next) {
426449 . send ( { code : 1 , message : "Protocol version not specified." ,
427450 protoVer : CURRENT_PROTOCOL_VERSION } )
428451 . end ( ) ;
429- } else if ( ! semver . valid ( version ) ) {
452+ } else if ( ! semver . valid ( coercedVer ) ) {
430453 res . status ( 200 )
431454 . set ( 'Content-Type' , 'application/json' )
432455 . send ( { code : 1 , message : "Invalid protocol version." ,
433456 protoVer : CURRENT_PROTOCOL_VERSION } )
434457 . end ( ) ;
435- } else if ( semver . gt ( minProtocolVersion , version ) ||
436- ( maxProtocolVersion && semver . lt ( maxProtocolVersion , version ) ) ) {
458+ } else if ( semver . lt ( coercedVer , minProtocolVersion ) ||
459+ ( maxProtocolVersion && semver . gt ( coercedVer , maxProtocolVersion ) ) ) {
437460 res . status ( 200 )
438461 . set ( 'Content-Type' , 'application/json' )
439462 . send ( { code : 1 , message : "Incompatible protocol version." ,
0 commit comments