diff options
| author | Adam Soltys <[email protected]> | 2024-08-26 21:17:43 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2024-08-26 21:17:43 -0700 |
| commit | fe62cadd6fb4a7e49f7d59401fc74ae0411e32a7 (patch) | |
| tree | aa8f34e1692bd2d638a2c996eeadb58671d07aea /lib/rates.ts | |
| parent | 00e43ddc0bf3d6dd719fc9295d156567fa2fecfb (diff) | |
| download | coinos-server-fe62cadd6fb4a7e49f7d59401fc74ae0411e32a7.tar.gz coinos-server-fe62cadd6fb4a7e49f7d59401fc74ae0411e32a7.zip | |
typescript
Diffstat (limited to 'lib/rates.ts')
| -rw-r--r-- | lib/rates.ts | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lib/rates.ts b/lib/rates.ts new file mode 100644 index 00000000..fe942453 --- /dev/null +++ b/lib/rates.ts @@ -0,0 +1,71 @@ +import got from "got"; +import config from "$config"; +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 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))); + + ws = new WebSocket("wss://stream.binance.com:9443/ws/btcusdt@ticker"); + + ws.onmessage = async function (event) { + try { + let msg = JSON.parse(event.data); + let rates = await g("rates"); + let fx = await g("fx"); + if (fx) ({ fx } = fx); + + Object.keys(fx).map((symbol) => { + rates[symbol] = msg.c * fx[symbol]; + }); + + s("rate", msg.c); + s("rates", rates); + last = Date.now(); + } catch (e) { + console.log(e); + err("binance message error", e.message); + } + }; + + ws.onerror = async function (error) { + err("binance socket error", error.message); + }; + + return ws; +}; + +export let getFx = async () => { + connect(); + + let date = 0, + fx = await g("fx"); + if (fx) ({ date, fx } = fx); + + if (Date.now() - date > 24 * 60 * 60 * 1000) { + date = Date.now(); + try { + let r = await got( + `http://data.fixer.io/api/latest?access_key=${config.fixer}`, + ).json(); + let { rates: fx } = r; + let USD = fx["USD"]; + + Object.keys(fx).map((k) => { + fx[k] = fx[k] / USD; + }); + + await s("fx", { date, fx }); + } catch (e) { + err("error fetching rates", e.message); + } + } + + setTimeout(getFx, 30000); +}; |
