diff --git a/package.json b/package.json new file mode 100644 index 0000000..ea69169 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "pi-door-unified", + "version": "1.0.0", + "type": "module", + "scripts": { + "start": "node dist/server.js", + "build": "tsc" + }, + "dependencies": { + "express": "^4.18.2", + "ws": "^8.16.0", + "node-fetch": "^3.3.2" + } +} diff --git a/src/src/monitor.ts b/src/src/monitor.ts new file mode 100644 index 0000000..ea640f1 --- /dev/null +++ b/src/src/monitor.ts @@ -0,0 +1,29 @@ +import fetch from 'node-fetch' +import { LedgerEvent } from './types.js' + +const HORIZON = 'https://api.mainnet.minepi.com' + +export function startMonitor( + onUpdate: (e: LedgerEvent) => void +) { + let last = 0 + + setInterval(async () => { + try { + const r = await fetch(`${HORIZON}/ledgers?order=desc&limit=1`) + const j = await r.json() + const l = j._embedded.records[0] + + if (l.sequence !== last) { + last = l.sequence + onUpdate({ + ledger: l.sequence, + txCount: l.transaction_count, + closeTime: Date.parse(l.closed_at) + }) + } + } catch (e) { + console.error('monitor error', e) + } + }, 3000) +} diff --git a/src/src/src/server.ts b/src/src/src/server.ts new file mode 100644 index 0000000..b1b9f78 --- /dev/null +++ b/src/src/src/server.ts @@ -0,0 +1,32 @@ +import express from 'express' +import { createServer } from 'http' +import { WebSocketServer } from 'ws' +import { startMonitor } from './monitor.js' + +const app = express() +const server = createServer(app) +const wss = new WebSocketServer({ server }) + +// Serve frontend +app.use(express.static('web')) + +// WebSocket +function broadcast(data: any) { + wss.clients.forEach(c => { + if (c.readyState === 1) { + c.send(JSON.stringify(data)) + } + }) +} + +// Start monitor +startMonitor(event => { + broadcast({ + type: 'LEDGER_UPDATE', + payload: event + }) +}) + +server.listen(8080, () => + console.log('🚪 Pi Door Unified running :8080') +) diff --git a/src/src/src/web/index.html b/src/src/src/web/index.html new file mode 100644 index 0000000..0f26cd4 --- /dev/null +++ b/src/src/src/web/index.html @@ -0,0 +1,36 @@ + + + + Pi Door Live + + + +
+

Pi Network Live Monitor

+

Ledger: {{ ledger }}

+

Tx Count: {{ tx }}

+

Last Close: {{ time }}

+
+ + + + diff --git a/src/src/src/web/refactor: migrate to unified monorepo architecture b/src/src/src/web/refactor: migrate to unified monorepo architecture new file mode 100644 index 0000000..f3dff5c --- /dev/null +++ b/src/src/src/web/refactor: migrate to unified monorepo architecture @@ -0,0 +1,11 @@ +door-unified/ +├── src/ +│ ├── server.ts # HTTP + WS server +│ ├── monitor.ts # Ledger polling +│ ├── analyzer.ts # TPS & anomaly +│ └── types.ts +├── web/ +│ ├── index.html +│ └── main.js # Vue 3 app (CDN / Vite optional) +├── package.json +└── tsconfig.json diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..9cbf8ac --- /dev/null +++ b/src/types.ts @@ -0,0 +1,5 @@ +export interface LedgerEvent { + ledger: number + txCount: number + closeTime: number +}