diff options
| author | Adam Soltys <[email protected]> | 2023-02-06 16:48:13 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-02-06 16:48:13 -0800 |
| commit | 9c667055c6367e1b2e239686e72f52995679a47e (patch) | |
| tree | 0b1d4aee51ec2d4e92d08a9d1404ba4e2ecd462a /lib/rates.js | |
| parent | 15294844dbc8e73b4d1e92008a7eebc6b86b9ec5 (diff) | |
| parent | 6f5602d112b68adb7452abf3047f20c32e7725b6 (diff) | |
| download | coinos-server-9c667055c6367e1b2e239686e72f52995679a47e.tar.gz coinos-server-9c667055c6367e1b2e239686e72f52995679a47e.zip | |
Merge branch 'master' into test
Diffstat (limited to 'lib/rates.js')
| -rw-r--r-- | lib/rates.js | 108 |
1 files changed, 50 insertions, 58 deletions
diff --git a/lib/rates.js b/lib/rates.js index e896c8cc..362aaa98 100644 --- a/lib/rates.js +++ b/lib/rates.js @@ -1,73 +1,65 @@ -import app from "$app"; -import axios from "axios"; +import got from "got"; import config from "$config"; -import fs from "fs"; -import binance from "./binance"; -import { broadcast } from "./sockets"; -import store from "./store"; +import { broadcast } from "$lib/sockets"; +import store from "$lib/store"; import { err, warn } from "$lib/logging"; +import { g, s } from "$lib/db"; +import { sleep } from "$lib/utils"; +import WebSocket from "ws"; -let b = binance(); -setInterval(() => { - b.terminate(); - b = binance(); -}, 360000); +let last; +let ws; +let connect = async () => { + if (ws && ws.readyState === 1 && Date.now() - last < 5000) return; + if (ws) ws.terminate() && (await sleep(Math.round(Math.random() * 1000))); -let fetchRates; -(fetchRates = async () => { - let date, fx; + ws = new WebSocket("wss://stream.binance.com:9443/ws/btcusdt@ticker"); - try { - ({ date, fx } = JSON.parse(fs.readFileSync("fx"))); - } catch (e) { - warn("Failed to read fx file"); - } + ws.onmessage = async function(event) { + try { + let msg = JSON.parse(event.data); - let today = JSON.stringify(new Date()) - .replace(/T.*/, "") - .replace(/"/, ""); + Object.keys(store.fx).map(symbol => { + store.rates[symbol] = msg.c * store.fx[symbol]; + }); - if (date !== today) { - try { - let { - data: { rates: fx } - } = await axios.get( - `https://api.exchangerate.host/latest?base=USD&v={(new Date()).toISOString().split('T')[0]}` - ); - fs.writeFileSync("fx", JSON.stringify({ date, fx })); + store.last = msg.c; + last = Date.now(); } catch (e) { - try { - let { - data: { rates: fx } - } = await axios.get( - `http://data.fixer.io/api/latest?access_key=${config.fixer}` - ); + console.log(e); + err("binance message error", e.message); + } + }; - let USD = fx["USD"]; - Object.keys(fx).map(k => { - fx[k] = parseFloat((fx[k] / fx["USD"]).toFixed(6)); - }); + ws.onerror = async function(error) { + err("binance socket error", error.message); + }; - fs.writeFileSync("fx", JSON.stringify({ date, fx })); - } catch (e) { - err("error fetching rates", e.message); - } - } - } + return ws; +}; - store.fx = fx; +export let sendRates = () => broadcast("rate", store.last); +export let getRates = async () => { + connect(); - setTimeout(fetchRates, 7200000); -})(); + let date = 0, + fx; + let rates = await g("rates"); + if (rates) ({ date, fx } = rates); -app.get("/rate", async (req, res, next) => { - res.send(store.last); -}); + if (Date.now() - date > 24 * 60 * 60 * 1000) { + date = Date.now(); + try { + let { rates: fx } = await got( + `https://api.exchangerate.host/latest?base=USD&v={(new Date()).toISOString().split('T')[0]}` + ).json(); + await s("rates", { date, fx }); + } catch (e) { + err("error fetching rates", e.message); + } + } -app.get("/rates", async (req, res, next) => { - res.send(store.rates); -}); + store.fx = fx; -setInterval(() => { - broadcast("rate", store.last); -}, 1000); + setTimeout(getRates, 30000); +}; |
