frontend/src/routes/stock-screener/[strategyId]/workers/downloadWorker.ts
2024-09-10 13:00:43 +02:00

89 lines
2.3 KiB
TypeScript

// Cache to store previous requests
let cache = new Map();
const getStockScreenerData = async (rules, apiKey, apiURL) => {
console.log("Checking cache and fetching new data if needed");
// Extract the rule names
let getRuleOfList = rules?.map((rule) => rule.name) || [];
// Define the EMA parameters to check
const emaParameters = [
"sma20",
"sma50",
"sma100",
"sma200",
"ema20",
"ema50",
"ema100",
"ema200",
];
// Function to check and add missing EMA parameters
const ensureAllEmaParameters = (params) => {
const includedEmaParameters = params.filter((param) =>
emaParameters.includes(param)
);
if (includedEmaParameters.length > 0) {
emaParameters.forEach((param) => {
if (!params.includes(param)) {
params.push(param);
}
});
}
};
// Ensure all required EMA parameters are included
ensureAllEmaParameters(getRuleOfList);
// Convert the rule set into a string key for the cache
const ruleKey = JSON.stringify(getRuleOfList);
// Check if data for this rule set is already in the cache
if (cache.has(ruleKey)) {
console.log("Returning cached data");
return cache.get(ruleKey);
}
// Fetch new data if it's not in the cache
const postData = { ruleOfList: getRuleOfList };
const response = await fetch(apiURL + "/stock-screener-data", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify(postData),
});
const output = await response.json();
// Store the new data in the cache
cache.set(ruleKey, output);
return output;
};
onmessage = async (event) => {
const { ruleOfList, apiKey, apiURL } = event.data || {};
console.log(event.data);
const output = await getStockScreenerData(ruleOfList, apiKey, apiURL);
const stockScreenerData = output?.filter((item) =>
Object?.values(item)?.every(
(value) =>
value !== null &&
value !== undefined &&
(typeof value !== "object" ||
Object.values(value)?.every(
(subValue) => subValue !== null && subValue !== undefined
))
)
);
postMessage({ message: "success", stockScreenerData });
};
export {};