2021-10-08 12:03:37 -07:00
/* eslint-disable no-unused-vars */
2021-10-05 06:52:17 -07:00
/ * *
* Pricecaster Service .
*
2021-10-08 12:03:37 -07:00
* Main program file .
2021-10-05 06:52:17 -07:00
*
* ( c ) 2021 Randlabs , Inc .
* /
2021-10-07 10:41:19 -07:00
import { PythPriceFetcher } from './PythPriceFetcher'
import { StdAlgoPublisher } from './publisher/StdAlgoPublisher'
import { StrategyLastPrice } from './strategy/strategyLastPrice'
2021-10-08 12:03:37 -07:00
import { IPriceFetcher } from './IPriceFetcher'
import { IPublisher , PublishInfo } from './IPublisher'
import { PriceTicker } from './PriceTicker'
import { StatusCode } from './statusCodes'
import Status from 'algosdk/dist/types/src/client/v2/algod/status'
2021-10-07 10:41:19 -07:00
const settings = require ( '../settings' )
const algosdk = require ( 'algosdk' )
2021-10-08 12:03:37 -07:00
const charm = require ( 'charm' ) ( )
2021-10-05 06:52:17 -07:00
2021-10-08 12:03:37 -07:00
export function sleep ( ms : number ) {
return new Promise ( ( resolve ) = > {
setTimeout ( resolve , ms )
} )
}
2021-10-07 10:41:19 -07:00
2021-10-08 12:03:37 -07:00
type WorkerRoutineStatus = {
status : StatusCode ,
reason? : string ,
tick? : PriceTicker ,
pub? : PublishInfo
}
2021-10-07 10:41:19 -07:00
2021-10-08 12:03:37 -07:00
async function workerRoutine ( fetcher : IPriceFetcher , publisher : IPublisher ) : Promise < WorkerRoutineStatus > {
const tick = fetcher . queryTicker ( )
if ( tick === undefined ) {
return { status : StatusCode.NO_TICKER }
}
const pub = await publisher . publish ( tick )
return { status : pub.status , reason : pub.reason , tick , pub }
2021-10-07 10:41:19 -07:00
}
2021-10-08 12:03:37 -07:00
( async ( ) = > {
charm . pipe ( process . stdout )
charm . reset ( )
console . log ( 'Pricecaster Service Fetcher -- (c) 2021 Randlabs.io\n' )
const params = settings . params
console . log ( ` Setting up fetcher/publisher for ${ params . symbol } for PriceKeeper App ${ params . priceKeeperAppId } , interval ${ params . publishIntervalSecs } secs ` )
const publisher = new StdAlgoPublisher ( params . symbol ,
params . priceKeeperAppId ,
params . validator ,
( algosdk . mnemonicToSecretKey ( params . mnemo ) ) . sk
)
const fetcher = new PythPriceFetcher ( params . symbol , new StrategyLastPrice ( params . bufferSize ) )
await fetcher . start ( )
console . log ( 'Waiting for fetcher to boot...' )
while ( ! fetcher . hasData ( ) ) {
await sleep ( 250 )
}
console . log ( 'Waiting for publisher to boot...' )
await publisher . start ( )
console . log ( 'Starting worker.' )
2021-10-07 10:41:19 -07:00
2021-10-08 12:03:37 -07:00
let active = true
charm . on ( '^C' , ( ) = > {
console . log ( 'CTRL+C: Aborted by user.' )
active = false
} )
// eslint-disable-next-line no-unmodified-loop-condition
let pubCount = 0
while ( active ) {
const wrs = await workerRoutine ( fetcher , publisher )
switch ( wrs . status ) {
case StatusCode . OK :
console . log ( ` [PUB ${ pubCount ++ } ] ${ wrs . tick ! . price } ± ${ wrs . tick ! . confidence } t: ${ wrs . tick ! . networkTime } TXID: ${ wrs . pub ! . txid } ) ` )
break
case StatusCode . NO_TICKER :
console . log ( 'No ticker available from fetcher data source' )
break
default :
console . log ( 'Error. Reason: ' + wrs . reason )
}
await sleep ( params . publishIntervalSecs * 1000 )
}
} ) ( )