aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rates.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rates.js')
-rw-r--r--lib/rates.js108
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);
+};