Compare commits

..

5 Commits

Author SHA1 Message Date
tim
bd37554b7d maxmind fix 2025-12-18 20:59:31 -04:00
tim
0a9b0cc631 maxmind fix 2025-12-18 20:47:59 -04:00
tim
eca99567d8 put app back on app.dexorder.com and corp site on dexorder.com with www redirecting to apex 2025-05-19 15:19:20 -04:00
tim
c95c26afd7 yarn upgrade 2025-05-06 22:27:38 -04:00
tim
008b6793d1 redis pub/sub fix 2025-05-06 22:27:14 -04:00
10 changed files with 427 additions and 375 deletions

View File

@@ -1,12 +1,19 @@
import {createClient} from "redis"; import {createClient} from "redis";
export const redis = createClient({
url: process.env.DEXORDER_REDIS_URL || 'redis://localhost:6379',
returnBuffers: false,
})
redis.on('error', (err) => console.log('Redis Client Error', err)); async function createRedisClient() {
await redis.connect(); const client = createClient({
url: process.env.DEXORDER_REDIS_URL || 'redis://localhost:6379',
returnBuffers: false,
})
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();
return client
}
export const redis = await createRedisClient()
export const redisSubscriber = await createRedisClient()
export class CacheSet { export class CacheSet {

View File

@@ -5,11 +5,15 @@ export const chainInfo = JSON.parse(fs.readFileSync('../contract/version.json'))
console.log('chainInfo', chainInfo) console.log('chainInfo', chainInfo)
export async function joinChain( socket, chainId ) { export async function joinChain( socket, chainId ) {
if (socket.chainId) try {
socket.leave(socket.chainId) if (socket.chainId)
socket.join(chainId) socket.leave(socket.chainId)
socket.chainId = chainId socket.join(chainId)
const items = await marks.items(chainId); socket.chainId = chainId
for (let [token,mark] of items) const items = await marks.items(chainId);
socket.emit('mark.usd', chainId, token, mark) for (let [token, mark] of items)
socket.emit('mark.usd', chainId, token, mark)
} catch (e) {
console.error('joinChain', e)
}
} }

View File

@@ -6,6 +6,16 @@ import {metadata} from "./metadata.js";
export async function gib( chainId, owner, vault, tokenAmounts ) { export async function gib( chainId, owner, vault, tokenAmounts ) {
try {
return await doGib( chainId, owner, vault, tokenAmounts )
}
catch (e) {
console.error('gib failed', e)
}
}
export async function doGib( chainId, owner, vault, tokenAmounts ) {
if (!owner || !vault) return if (!owner || !vault) return
if (chainId === 421614) { if (chainId === 421614) {
// Arbitrum-Sepolia // Arbitrum-Sepolia

11
init.js Normal file
View File

@@ -0,0 +1,11 @@
export function initLog(app) {
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
process.exit(1); // Exit with code 1
});
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
process.exit(1); // Exit with code 1
});
}

10
io.js
View File

@@ -1,7 +1,7 @@
import {createServer} from "http"; import {createServer} from "http";
import {Server} from "socket.io"; import {Server} from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter"; import { createAdapter } from "@socket.io/redis-adapter";
import {redis} from "./cache.js"; import {redis, redisSubscriber} from "./cache.js";
import {fileURLToPath} from "url"; import {fileURLToPath} from "url";
import path from "path"; import path from "path";
import express from "express"; import express from "express";
@@ -29,12 +29,14 @@ app.set('views', path.join(__dirname, 'views')); // Set the views directory
app.use(express.static(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public')));
app.use(cors()) app.use(cors())
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something went wrong!');
});
initSnapShare(app) initSnapShare(app)
export const httpServer = createServer(app) export const httpServer = createServer(app)
export const io = new Server(httpServer, socketIoOptions) export const io = new Server(httpServer, socketIoOptions)
const pubClient = redis.duplicate(); const adapter = createAdapter(redis, redisSubscriber, {/*key:'socket.io'*/})
await pubClient.connect()
const adapter = createAdapter(pubClient, redis, {/*key:'socket.io'*/})
io.adapter(adapter) io.adapter(adapter)

View File

@@ -1,8 +1,10 @@
import 'dotenv/config' import 'dotenv/config'
import {httpServer} from "./io.js"; import {httpServer} from "./io.js";
import {initIO} from "./route.js"; import {initIO} from "./route.js";
import {initLog} from "./init.js";
initLog();
initIO(); initIO();
const port = parseInt(process.env.DEXORDER_PORT) || 3001; const port = parseInt(process.env.DEXORDER_PORT) || 3001;

View File

@@ -3,6 +3,8 @@ import path from 'path';
import {extract} from "tar"; import {extract} from "tar";
import {Reader} from '@maxmind/geoip2-node'; import {Reader} from '@maxmind/geoip2-node';
const ENABLE_MAXMIND=false
let ipdb = null let ipdb = null
function setDbFile(file) { function setDbFile(file) {
const dbBuffer = fs.readFileSync(file); const dbBuffer = fs.readFileSync(file);
@@ -112,6 +114,11 @@ async function downloadAndExtractMaxmindData(url, outputDir, tempDir, username,
* @return {Promise<void>} Resolves when the data check and optional update process is completed. * @return {Promise<void>} Resolves when the data check and optional update process is completed.
*/ */
async function checkAndUpdateMaxmindData(outputDir, tempDir, url, username, password) { async function checkAndUpdateMaxmindData(outputDir, tempDir, url, username, password) {
if (username === '' || password === '') {
console.log('No MaxMind credentials provided. Skipping MaxMind database update.');
return
}
console.log('Checking for MaxMind database updates.'); console.log('Checking for MaxMind database updates.');
// Ensure the output directory exists // Ensure the output directory exists
@@ -146,21 +153,25 @@ async function checkAndUpdateMaxmindData(outputDir, tempDir, url, username, pass
const url = 'https://download.maxmind.com/geoip/databases/GeoIP2-Country/download?suffix=tar.gz'; const url = 'https://download.maxmind.com/geoip/databases/GeoIP2-Country/download?suffix=tar.gz';
const outputDirectory = './maxmind'; const outputDirectory = './maxmind';
const username = '1102431'; // const username = '1102431';
const password = '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'; // const password = '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';
// const username = process.env.MAXMIND_ACCOUNT_NUMBER; const username = process.env.MAXMIND_ACCOUNT_NUMBER;
// const password = process.env.MAXMIND_LICENSE_KEY; const password = process.env.MAXMIND_LICENSE_KEY;
await checkAndUpdateMaxmindData(outputDirectory, '/tmp', url, username, password); if( ENABLE_MAXMIND ) {
await checkAndUpdateMaxmindData(outputDirectory, '/tmp', url, username, password);
setInterval(async () => { setInterval(async () => {
try { try {
await checkAndUpdateMaxmindData(outputDirectory, '/tmp', url, username, password); await checkAndUpdateMaxmindData(outputDirectory, '/tmp', url, username, password);
} catch (error) { } catch (error) {
console.error('Error during MaxMind database update:', error); console.error('Error during MaxMind database update:', error);
} }
}, 24 * 60 * 60 * 1000 + 1000); // 1 day + 1 second }, 24 * 60 * 60 * 1000 + 1000); // 1 day + 1 second
}
export function countryForIP(ipAddress) { export function countryForIP(ipAddress) {

25
pool.js
View File

@@ -19,17 +19,22 @@ export function unsubPools( socket, chainId, addresses ) {
export async function subOHLCs( socket, chainId, poolPeriods) { export async function subOHLCs( socket, chainId, poolPeriods) {
console.log('subOHLCs', chainId, poolPeriods) try {
for(const key of poolPeriods) { console.log('subOHLCs', chainId, poolPeriods)
const room = `${chainId}|${key}`; for (const key of poolPeriods) {
socket.join(room) const room = `${chainId}|${key}`;
let ohlc = await ohlcs.get(chainId,key); socket.join(room)
console.log('got ohlc', ohlc) let ohlc = await ohlcs.get(chainId, key);
if (typeof(ohlc)==='string') { console.log('got ohlc', ohlc)
ohlc = JSON.parse(ohlc) if (typeof (ohlc) === 'string') {
ohlc = JSON.parse(ohlc)
}
socket.emit('ohlc', chainId, key, ohlc)
console.log('joined room', room)
} }
socket.emit('ohlc', chainId, key, ohlc) }
console.log('joined room', room) catch (e) {
console.error('subOHLCs', e)
} }
} }

View File

@@ -4,7 +4,7 @@
<meta property="og:title" content="Dexorder Trade Setup"> <meta property="og:title" content="Dexorder Trade Setup">
<meta property="og:description" content="Trade this setup on Dexorder"> <meta property="og:description" content="Trade this setup on Dexorder">
<meta property="og:image" content="{{{imageUrl}}}"> <meta property="og:image" content="{{{imageUrl}}}">
<meta property="og:url" content="https://dexorder.com/"> <meta property="og:url" content="https://app.dexorder.com/">
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">

670
yarn.lock

File diff suppressed because it is too large Load Diff