Welcome to rjweb-server v2 š
Install
npm i rjweb-server
or
yarn add rjweb-server
or
pnpm add rjweb-server
Typescript
Importing
import * as webserver from "rjweb-server"
Interface for ctr Object
import { ctr } from "rjweb-server/interfaces"
const routes = new webserver.routeList()
routes.set(webserver.types.get, '/hello', async(ctr: ctr) => {
if (!ctr.queries.has("name")) return ctr.print('please supply the name queries!!')
return ctr.print(`Hello, ${ctr.queries.get("name")}! How are you doing?`)
})
Custom Properties in Ctr Object
(This also works in JavaScript, just remove the interface logic)
import * as webserver from "rjweb-server"
import { ctr as ctrPreset, ctrFile as ctrFilePreset } from "rjweb-server/interfaces"
interface Custom {
count: number
}
interface ctr<HasError = false, Body = any> extends ctrPreset<Custom, HasError, Body> {}
interface ctrFile<Body = any> extends ctrFilePreset<Custom, Body> {}
const routes = new webserver.routeList()
routes.set(webserver.types.get, '/hello', async(ctr: ctr) => {
if (!ctr.queries.has("name")) return ctr.print('please supply the name queries!!')
return ctr.print(`Hello, ${ctr.queries.get("name")}! You are Visit nr.${ctr['@'].count}`)
})
let count = 0
routes.event('request', async(ctr: ctr) => {
ctr.setCustom('count', ++count)
console.log(`request made to ${decodeURI(ctr.url.pathname)} by ${ctr.client.ip}`)
})
routes.event('error', async(ctr: ctr<true>) => {
console.log(`error on path ${decodeURI(ctr.url.pathname)}!!!`)
console.error(ctr.error.stack)
ctr.status(500)
ctr.print('server error')
})
webserver.start({
bind: '0.0.0.0',
port: 5000,
routes: routes
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
})
Function File
import * as webserver from "rjweb-server"
import { ctr as ctrPreset, ctrFile as ctrFilePreset } from "rjweb-server/interfaces"
interface Custom {
count: number
}
interface Body {
username?: string
}
interface ctr<HasError = false, Body = any> extends ctrPreset<Custom, HasError, Body> {}
interface ctrFile<Body = any> extends ctrFilePreset<Custom, Body> {}
export = {
method: webserver.types.post,
path: '/v2/account',
async code(ctr) {
if (!('username' in ctr.body)) return ctr.print('no username in body!!')
ctr.status(204).print(ctr.body.username)
}
} as ctrFile<Body>
Usage
Initialize Server
const webserver = require('rjweb-server')
const routes = new webserver.routeList()
routes.set(webserver.types.get, '/hello', async(ctr) => {
if (!ctr.queries.has("name")) return ctr.print('please supply the name Query!!')
return ctr.print(`Hello, ${ctr.queries.get("name")}! How are you doing?`)
})
routes.set(webserver.types.get, '/hello/:name', async(ctr) => {
return ctr.print(`Hello, ${ctr.params.get("name")}! How are you doing?`)
})
routes.set(webserver.types.post, '/post', async(ctr) => {
return ctr.print(`Hello, ${ctr.body}! How are you doing?`)
})
routes.set(webserver.types.get, '/profile/:user', async(ctr) => {
return ctr.printFile(`../images/profile/${ctr.params.get('user')}.png`, { addTypes: true })
})
webserver.start({
bind: '0.0.0.0',
body: 20,
cors: false,
port: 5000,
routes: routes,
proxy: true
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Print Promises
const webserver = require('rjweb-server')
const routes = new webserver.routeList()
const wait = require('timers/promises').setTimeout
const handleHello = async() => {
await wait(5000)
return 'You just waited 5 seconds !!'
}
routes.set(webserver.types.get, '/hello', async(ctr) => {
return ctr.print(handleHello)
})
webserver.start({
bind: '0.0.0.0',
body: 20,
cors: false,
port: 5000,
routes: routes,
proxy: true
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Serve Static Files
const webserver = require('rjweb-server')
const routes = new webserver.routeList()
routes.static('/', './html', {
preload: false,
remHTML: true
})
webserver.start({
bind: '0.0.0.0',
cors: false,
port: 5000,
routes: routes,
proxy: true
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Enable Dashboard
const routes = new webserver.routeList()
webserver.start({
bind: '0.0.0.0',
cors: false,
port: 5000,
routes: routes,
proxy: true,
dashboard: {
enabled: true,
path: '/dashboard'
}
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Custom Not Found / Server Error Page
const routes = new webserver.routeList()
routes.event('notfound', async(ctr) => {
ctr.status(404)
return ctr.print(`page "${ctr.url.pathname}" not found`)
})
routes.event('error', async(ctr) => {
ctr.status(500)
ctr.print(`ERROR!!! ${ctr.error.message}`)
return console.log(ctr.error)
})
webserver.start({
bind: '0.0.0.0',
cors: false,
port: port,
routes: routes,
proxy: true
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Custom Function on every request
const routes = new webserver.routeList()
routes.event('request', async(ctr) => {
return console.log(`request made to ${decodeURI(ctr.url.href)} by ${ctr.client.ip}`)
})
webserver.start({
bind: '0.0.0.0',
cors: false,
port: port,
routes: routes,
proxy: true
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Rate Limits
With Database (EXAMPLE, PLEASE EDIT)
webserver.start({
bind: '0.0.0.0',
cors: false,
port: port,
routes: routes,
proxy: true,
rateLimits: {
enabled: true,
message: 'You are being rate limited',
list: [
{
path: '/auth',
times: 5,
timeout: 10000
},
{
path: '/fetch',
times: 3,
timeout: 5000
}
], functions: {
set: async(key, value) => (await db.queries('update ratelimits set value = ? where key = ?;', [value, key])),
get: async(key) => ((await db.queries('select value from ratelimits where key = ?;', [key])).data.rows[0].value)
}
}
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
With Map
const rateLimits = new Map()
webserver.start({
bind: '0.0.0.0',
cors: false,
port: port,
routes: routes,
proxy: true,
rateLimits: {
enabled: true,
message: 'You are being rate limited',
list: [
{
path: '/auth',
times: 5,
timeout: 10000
},
{
path: '/fetch',
times: 3,
timeout: 5000
}
], functions: rateLimits
}
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Cleaning Up Functions
Load Functions from Directory
const webserver = require('rjweb-server')
const routes = new webserver.routeList()
routes.load('./functions')
webserver.start({
bind: '0.0.0.0',
cors: false,
port: 5000,
routes: routes,
proxy: true,
}).then((res) => {
console.log(`webserver started on port ${res.port}`)
}).catch((err) => {
console.log(err)
})
Making a function File
const webserver = require('rjweb-server')
module.exports = {
method: webserver.types.get,
path: '/say/:word',
async code(ctr) {
const word = ctr.params.get('word')
return ctr.print(`I will say it!!!\n${word}`)
}
}
Full Example
Javascript
https://replit.com/@RobertJansen/aous
Typescript
https://replit.com/@RobertJansen/aous-ts
Author
š¤ 0x4096
š¤ Contributing
Contributions, issues and feature requests are welcome!
Feel free to check issues page.
Show your support
Give a Star if this project helped you!
š License
Copyright Ā© 2023 0x4096.
This project is MIT licensed.