Files
Superalgos/UI/Data-Files/src/DailyFiles.js
T

299 lines
10 KiB
JavaScript

function newDailyFiles() {
const MODULE_NAME = 'Daily Files'
const ERROR_LOG = true
const logger = newWebDebugLog()
let thisObject = {
eventHandler: undefined,
getFileCursor: getFileCursor,
setDatetime: setDatetime,
setTimeFrame: setTimeFrame,
getExpectedFiles: getExpectedFiles,
getFilesLoaded: getFilesLoaded,
initialize: initialize,
finalize: finalize
}
let filesLoaded = 0
let expectedFiles = 0
let fileCloud
let fileCursors = new Map()
let callBackWhenFileReceived
thisObject.eventHandler = newEventHandler()
return thisObject
function finalize() {
try {
thisObject.eventHandler.finalize()
thisObject.eventHandler = undefined
filesLoaded = undefined
expectedFiles = undefined
fileCloud = undefined
fileCursors.forEach(finalizeEach)
function finalizeEach(item, key, mapObj) {
item.finalize()
}
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] finalize -> err = ' + err.stack) }
}
}
function initialize(pMine, pBot, pSession, pProduct, pDataset, pExchange, pMarket, pDatetime, pTimeFrame, pHost, pPort, pEventsServerClient, callBackFunction) {
try {
callBackWhenFileReceived = callBackFunction
let exchange = pExchange
let beginDateRange
let endDateRange
let timeFrames
fileCloud = newFileCloud()
fileCloud.initialize(pBot, pHost, pPort)
/* Config Validations */
if (pDataset.config.validTimeFrames === undefined) {
if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err = Can not initialize Daily Files for bot ' + pBot.name) }
if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err = You need to define validTimeFrames at the Dataset config. ') }
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
return
}
getDataRangeFile()
function getDataRangeFile() {
/* First we will get the Data Range */
fileCloud.getFile(pMine, pBot, pSession, pProduct, pDataset, exchange, pMarket, undefined, undefined, undefined, true, undefined, onDataRangeReceived)
function onDataRangeReceived(err, pFile) {
switch (err.result) {
case GLOBAL.DEFAULT_OK_RESPONSE.result: {
beginDateRange = pFile.begin
endDateRange = pFile.end
break
}
case GLOBAL.DEFAULT_FAIL_RESPONSE.result: {
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
return
}
case GLOBAL.CUSTOM_FAIL_RESPONSE.result: {
if (err.message === 'File does not exist.') {
beginDateRange = new Date()
endDateRange = new Date()
break
}
if (err.message === 'Missing Configuration.') {
if (ERROR_LOG === true) { logger.write('[WARN] initialize -> onFileReceived -> The needed configuration for the dateRange at the dataSet of the product was not found.') }
if (ERROR_LOG === true) { logger.write('[WARN] initialize -> onFileReceived -> maxDate will be set to current datetime.') }
endDateRange = new Date()
break
}
callBackFunction(err)
return
}
default: {
callBackFunction(err)
return
}
}
getTimeFramesFile()
}
}
function getTimeFramesFile() {
/* First we will get the Data Range */
fileCloud.getFile(pMine, pBot, pSession, pProduct, pDataset, exchange, pMarket, undefined, undefined, undefined, undefined, true, onTimeFramesReceived)
function onTimeFramesReceived(err, pFile) {
switch (err.result) {
case GLOBAL.DEFAULT_OK_RESPONSE.result: {
timeFrames = pFile
break
}
case GLOBAL.DEFAULT_FAIL_RESPONSE.result: {
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
return
}
case GLOBAL.CUSTOM_FAIL_RESPONSE.result: {
if (err.message === 'File does not exist.') {
/* It is ok, we will deal with this later */
break
}
if (err.message === 'Configured to not Support This.') {
/* It is ok, we will deal with this later */
break
}
if (err.message === 'Missing Configuration.') {
if (ERROR_LOG === true) { logger.write('[WARN] initialize -> onFileReceived -> The needed configuration to locate the timeFrames is missing at the dataSet.') }
if (ERROR_LOG === true) { logger.write('[WARN] initialize -> onFileReceived -> Time Frames Filters will be ignored -> Product = ' + pProduct.config.codeName) }
break
}
callBackFunction(err)
return
}
default: {
callBackFunction(err)
return
}
}
createFileCursors()
}
}
function createFileCursors() {
try {
/* Now we will get the daily files */
for (let i = 0; i < dailyTimeFramesArray.length; i++) {
let periodTime = dailyTimeFramesArray[i][0]
let timeFrameLabel = dailyTimeFramesArray[i][1]
if (pDataset.config.validTimeFrames.includes(timeFrameLabel) === false) {
continue
}
if (timeFrames !== undefined) {
if (timeFrames.includes(timeFrameLabel) === false) {
continue
}
}
let fileCursor = newFileCursor()
fileCursor.eventHandler = thisObject.eventHandler // We share our event handler with each file cursor, so that they can raise events there when files are changed.s
fileCursor.initialize(fileCloud, pMine, pBot, pSession, pProduct, pDataset, exchange, pMarket, timeFrameLabel, periodTime, pDatetime, pTimeFrame, beginDateRange, endDateRange, pEventsServerClient, onInitialized)
function onInitialized(err) {
try {
switch (err.result) {
case GLOBAL.DEFAULT_OK_RESPONSE.result: {
break
}
case GLOBAL.DEFAULT_FAIL_RESPONSE.result: {
callBackWhenFileReceived(GLOBAL.DEFAULT_FAIL_RESPONSE)
return
}
default: {
callBackWhenFileReceived(err)
return
}
}
fileCursors.set(periodTime, fileCursor)
expectedFiles = expectedFiles + fileCursor.getExpectedFiles()
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> onFileReceived -> onInitialized -> err = ' + err.stack) }
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
}
loadThemAll()
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> createFileCursors -> err = ' + err.stack) }
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
function loadThemAll() {
try {
for (let i = 0; i < dailyTimeFramesArray.length; i++) {
let periodTime = dailyTimeFramesArray[i][0]
let timeFrameLabel = dailyTimeFramesArray[i][1]
if (pDataset.config.validTimeFrames.includes(timeFrameLabel) === true) {
let fileCursor = fileCursors.get(periodTime)
if (fileCursor !== undefined) {
fileCursor.reload(onFileReceived)
}
}
}
callBackWhenFileReceived(GLOBAL.DEFAULT_OK_RESPONSE, thisObject)
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> loadThemAll -> err = ' + err.stack) }
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err = ' + err.stack) }
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
function onFileReceived(err) {
try {
switch (err.result) {
case GLOBAL.DEFAULT_OK_RESPONSE.result: {
break
}
case GLOBAL.DEFAULT_FAIL_RESPONSE.result: {
callBackWhenFileReceived(GLOBAL.DEFAULT_FAIL_RESPONSE)
return
}
case GLOBAL.CUSTOM_FAIL_RESPONSE.result: {
callBackWhenFileReceived(err)
return
}
default: {
callBackWhenFileReceived(err)
return
}
}
filesLoaded++
callBackWhenFileReceived(GLOBAL.DEFAULT_OK_RESPONSE, thisObject) // Note that the call back is called for every file loaded at each cursor.
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] onFileReceived -> err = ' + err.stack) }
callBackWhenFileReceived(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
function getFileCursor(pPeriod) {
try {
return fileCursors.get(pPeriod)
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] getFileCursor -> err = ' + err.stack) }
}
}
function setDatetime(pDatetime) {
try {
filesLoaded = 0
expectedFiles = 0
fileCursors.forEach(setDatetimeToEach)
function setDatetimeToEach(fileCursor, key, map) {
fileCursor.setDatetime(pDatetime)
expectedFiles = expectedFiles + fileCursor.getExpectedFiles()
fileCursor.reload(onFileReceived)
}
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] setDatetime -> err = ' + err.stack) }
}
}
function setTimeFrame(pTimeFrame, pDatetime) {
try {
filesLoaded = 0
expectedFiles = 0
fileCursors.forEach(setTimeFrameToEach)
function setTimeFrameToEach(fileCursor, key, map) {
fileCursor.setTimeFrame(pTimeFrame, pDatetime)
expectedFiles = expectedFiles + fileCursor.getExpectedFiles()
fileCursor.reload(onFileReceived)
}
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] setTimeFrame -> err = ' + err.stack) }
}
}
function getExpectedFiles() {
return expectedFiles
}
function getFilesLoaded() {
return filesLoaded
}
}