bump, add /info endpoint, cleanup
This commit is contained in:
parent
0ceb0b61b4
commit
da82475262
4 changed files with 74 additions and 12 deletions
8
server/.gitignore
vendored
8
server/.gitignore
vendored
|
@ -37,4 +37,10 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
||||||
bun.lock*
|
bun.lock*
|
||||||
|
|
||||||
# Files
|
# Files
|
||||||
serve/
|
serve/
|
||||||
|
|
||||||
|
# db
|
||||||
|
dev.db
|
||||||
|
|
||||||
|
# config
|
||||||
|
config/config.ts
|
25
server/config/config.example.ts
Normal file
25
server/config/config.example.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
export const config: Config = {
|
||||||
|
name: "Example Server", // what your server should be named in BeeSrv
|
||||||
|
author: "example", // who owns this server?
|
||||||
|
channelLink: "https://t.me/example", // telegram channel link
|
||||||
|
|
||||||
|
currentBox: {
|
||||||
|
enabled: true, // if you want to serve the box, set to true
|
||||||
|
name: "Example Beebox", // what your box should be named in BeeSrv
|
||||||
|
originalAuthor: "Author", // who originally shared the beebox, if applicable
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// don't change this
|
||||||
|
export interface Config {
|
||||||
|
name: string
|
||||||
|
author: string
|
||||||
|
channelLink: string
|
||||||
|
currentBox: {
|
||||||
|
enabled: boolean
|
||||||
|
name: string
|
||||||
|
originalAuthor: string
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,17 +8,17 @@
|
||||||
"start": "bun run src/index.ts"
|
"start": "bun run src/index.ts"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/bun": "^1.2.9",
|
"@types/bun": "^1.2.18",
|
||||||
"drizzle-kit": "^0.30.6"
|
"drizzle-kit": "^0.30.6"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"typescript": "^5.8.3"
|
"typescript": "^5.8.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/express": "^5.0.1",
|
"@types/express": "^5.0.3",
|
||||||
"better-sqlite3": "^11.9.1",
|
"better-sqlite3": "^11.10.0",
|
||||||
"chalk": "^5.4.1",
|
"chalk": "^5.4.1",
|
||||||
"dotenv": "^16.5.0",
|
"dotenv": "^16.6.1",
|
||||||
"drizzle-orm": "^0.41.0",
|
"drizzle-orm": "^0.41.0",
|
||||||
"express": "^5.1.0"
|
"express": "^5.1.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { eq, and, gte } from "drizzle-orm"
|
||||||
import chalk from "chalk"
|
import chalk from "chalk"
|
||||||
import * as schema from './db/schema'
|
import * as schema from './db/schema'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
import { config } from '../config/config'
|
||||||
|
|
||||||
const app = express()
|
const app = express()
|
||||||
const sqlite = new Database(process.env.DB_FILE_NAME || 'dev.db')
|
const sqlite = new Database(process.env.DB_FILE_NAME || 'dev.db')
|
||||||
|
@ -29,20 +30,50 @@ enum ReqStatus {
|
||||||
function checkRateLimit(email: string): boolean {
|
function checkRateLimit(email: string): boolean {
|
||||||
const now = Date.now()
|
const now = Date.now()
|
||||||
const userLimit = rateLimitMap.get(email)
|
const userLimit = rateLimitMap.get(email)
|
||||||
|
|
||||||
if (!userLimit || now > userLimit.resetTime) {
|
if (!userLimit || now > userLimit.resetTime) {
|
||||||
rateLimitMap.set(email, { count: 1, resetTime: now + RATE_LIMIT_WINDOW_MS })
|
rateLimitMap.set(email, { count: 1, resetTime: now + RATE_LIMIT_WINDOW_MS })
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userLimit.count >= MAX_REQUESTS_PER_WINDOW) {
|
if (userLimit.count >= MAX_REQUESTS_PER_WINDOW) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
userLimit.count++
|
userLimit.count++
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.get("/info", (async (req, res) => {
|
||||||
|
const info: Record<string, any> = {
|
||||||
|
name: config.name,
|
||||||
|
author: config.author,
|
||||||
|
channelLink: config.channelLink,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (config.currentBox.enabled) {
|
||||||
|
info.currentBox = config.currentBox;
|
||||||
|
try {
|
||||||
|
const beebox = await Bun.file(path.join(__dirname, '../serve/beebox.xml'))
|
||||||
|
const bbxContent = await beebox.text()
|
||||||
|
if (!bbxContent) {
|
||||||
|
console.log(chalk.red(`[INFO]`) + ` Error reading beebox file`)
|
||||||
|
info.error = "Unable to find beebox file on server"
|
||||||
|
} else {
|
||||||
|
const hasher = new Bun.CryptoHasher("sha256")
|
||||||
|
const bbxHash = await hasher.update(bbxContent).digest()
|
||||||
|
const bbxHashHex = bbxHash.toString('hex')
|
||||||
|
info.currentBox.hash = bbxHashHex
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(chalk.red(`[INFO]`) + ` Error reading beebox file`)
|
||||||
|
info.error = "Unable to find beebox file on server"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json(info);
|
||||||
|
}) as RequestHandler)
|
||||||
|
|
||||||
app.post("/bee-req", (async (req, res) => {
|
app.post("/bee-req", (async (req, res) => {
|
||||||
const { deviceID, version, email } = req.body
|
const { deviceID, version, email } = req.body
|
||||||
const requestID = randomUUID()
|
const requestID = randomUUID()
|
||||||
|
@ -75,7 +106,7 @@ app.post("/bee-req", (async (req, res) => {
|
||||||
console.log(chalk.yellow(`[REQ | ${requestID}]`) + ` Existing user: ${existingUser ? "true" : "false"}`)
|
console.log(chalk.yellow(`[REQ | ${requestID}]`) + ` Existing user: ${existingUser ? "true" : "false"}`)
|
||||||
|
|
||||||
let userId: string;
|
let userId: string;
|
||||||
|
|
||||||
if (!existingUser) {
|
if (!existingUser) {
|
||||||
try {
|
try {
|
||||||
// Create new user
|
// Create new user
|
||||||
|
@ -83,11 +114,11 @@ app.post("/bee-req", (async (req, res) => {
|
||||||
id: randomUUID(),
|
id: randomUUID(),
|
||||||
email: email as string,
|
email: email as string,
|
||||||
}).returning()
|
}).returning()
|
||||||
|
|
||||||
if (!newUser[0]) {
|
if (!newUser[0]) {
|
||||||
throw new Error("Failed to create user")
|
throw new Error("Failed to create user")
|
||||||
}
|
}
|
||||||
|
|
||||||
userId = newUser[0].id
|
userId = newUser[0].id
|
||||||
console.log(chalk.green(`[REQ | ${requestID}]`) + ` Created new user for request: ${userId}`)
|
console.log(chalk.green(`[REQ | ${requestID}]`) + ` Created new user for request: ${userId}`)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -165,6 +196,6 @@ app.listen(process.env.PORT || 3000, async () => {
|
||||||
const pkgJson = Bun.file(path.join(__dirname, '../package.json'))
|
const pkgJson = Bun.file(path.join(__dirname, '../package.json'))
|
||||||
const version = JSON.parse(await pkgJson.text()).version
|
const version = JSON.parse(await pkgJson.text()).version
|
||||||
console.log(chalk.bgBlue("BEESRV") + " v" + version + "\n")
|
console.log(chalk.bgBlue("BEESRV") + " v" + version + "\n")
|
||||||
|
|
||||||
console.log(chalk.green(`[SERVER] `) + `Running on port ${process.env.PORT || 3000}`)
|
console.log(chalk.green(`[SERVER] `) + `Running on port ${process.env.PORT || 3000}`)
|
||||||
})
|
})
|
Loading…
Add table
Add a link
Reference in a new issue