rjweb-server
Advanced tools
Comparing version 1.2.5 to 1.2.6
@@ -43,2 +43,1 @@ import { types as typesInterface } from "../interfaces/types"; | ||
export {}; | ||
//# sourceMappingURL=routeList.d.ts.map |
@@ -1,113 +0,1 @@ | ||
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}); | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const getAllFiles_1 = require("../misc/getAllFiles"); | ||
const types_1 = __importDefault(require("../misc/types")); | ||
const path = __importStar(require("path")); | ||
const fs = __importStar(require("fs")); | ||
class routeList { | ||
/** List of Routes */ | ||
constructor( | ||
/** | ||
* Routes to Import | ||
* @default [] | ||
*/ routes) { | ||
routes = routes ?? []; | ||
this.urls = routes; | ||
} | ||
/** Set A Route Manually */ | ||
set( | ||
/** The Request Type */ type, | ||
/** The Path on which this will be available */ path, | ||
/** The Async Code to run on a Request */ code) { | ||
if (!types_1.default.includes(type)) | ||
throw TypeError(`No Valid Request Type: ${type}\nPossible Values: ${types_1.default.join(', ')}`); | ||
this.urls[type + path] = { | ||
array: path.split('/'), | ||
addTypes: false, | ||
path, | ||
type, | ||
code | ||
}; | ||
} | ||
/** Serve Static Files */ | ||
static( | ||
/** The Path to serve the Files on */ path, | ||
/** The Location of the Folder to load from */ folder, | ||
/** Additional Options */ options) { | ||
const preload = options?.preload ?? false; | ||
const remHTML = options?.remHTML ?? false; | ||
const addTypes = options?.addTypes ?? true; | ||
for (const file of (0, getAllFiles_1.getAllFiles)(folder)) { | ||
const fileName = file.replace(folder, ''); | ||
let urlName = ''; | ||
if (fileName.replace('/', '') === 'index.html' && remHTML) | ||
urlName = path.replace('//', '/'); | ||
else if (fileName.replace('/', '').endsWith('.html') && remHTML) | ||
urlName = (path + fileName).replace('//', '/').replace('.html', ''); | ||
else | ||
urlName = (path + fileName).replace('//', '/'); | ||
this.urls['GET' + urlName] = { | ||
file, | ||
array: urlName.split('/'), | ||
addTypes, | ||
path: urlName, | ||
type: 'STATIC' | ||
}; | ||
if (preload) | ||
this.urls['GET' + urlName].content = fs.readFileSync(file); | ||
} | ||
} | ||
/** Load External Function Files */ | ||
load( | ||
/** The Location of the Folder to load from */ folder) { | ||
const files = (0, getAllFiles_1.getAllFilesFilter)(folder, '.js'); | ||
for (const file of files) { | ||
const route = require(path.resolve(file)); | ||
if (!('path' in route) || | ||
!('type' in route) || | ||
!('code' in route)) | ||
continue; | ||
if (!types_1.default.includes(route.type)) | ||
throw TypeError(`No Valid Request Type: ${route.type}\nPossible Values: ${types_1.default.toString()}`); | ||
this.urls[route.type + route.path] = { | ||
array: route.path.split('/'), | ||
addTypes: false, | ||
path: route.path, | ||
type: route.type, | ||
code: route.code | ||
}; | ||
} | ||
} | ||
/** Internal Function to access all URLs as Array */ | ||
list() { | ||
return this.urls; | ||
} | ||
} | ||
exports.default = routeList; | ||
//# sourceMappingURL=routeList.js.map | ||
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var l=Object.getOwnPropertyDescriptor(t,r);l&&!("get"in l?!t.__esModule:l.writable||l.configurable)||(l={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,l)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const getAllFiles_1=require("../misc/getAllFiles"),types_1=__importDefault(require("../misc/types")),path=__importStar(require("path")),fs=__importStar(require("fs"));class routeList{constructor(e){e=e??[],this.urls=e}set(e,t,r){if(!types_1.default.includes(e))throw TypeError(`No Valid Request Type: ${e}\nPossible Values: ${types_1.default.join(", ")}`);this.urls[e+t]={array:t.split("/"),addTypes:!1,path:t,type:e,code:r}}static(e,t,r){const i=r?.preload??!1,l=r?.remHTML??!1,s=r?.addTypes??!0;for(const r of(0,getAllFiles_1.getAllFiles)(t)){const a=r.replace(t,"");let o="";o="index.html"===a.replace("/","")&&l?e.replace("//","/"):a.replace("/","").endsWith(".html")&&l?(e+a).replace("//","/").replace(".html",""):(e+a).replace("//","/"),this.urls["GET"+o]={file:r,array:o.split("/"),addTypes:s,path:o,type:"STATIC"},i&&(this.urls["GET"+o].content=fs.readFileSync(r))}}load(e){const t=(0,getAllFiles_1.getAllFilesFilter)(e,".js");for(const e of t){const t=require(path.resolve(e));if("path"in t&&"type"in t&&"code"in t){if(!types_1.default.includes(t.type))throw TypeError(`No Valid Request Type: ${t.type}\nPossible Values: ${types_1.default.toString()}`);this.urls[t.type+t.path]={array:t.path.split("/"),addTypes:!1,path:t.path,type:t.type,code:t.code}}}}list(){return this.urls}}exports.default=routeList; |
@@ -70,2 +70,1 @@ /// <reference types="node" /> | ||
export = _default; | ||
//# sourceMappingURL=index.d.ts.map |
391
lib/index.js
@@ -1,390 +0,1 @@ | ||
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}); | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
const routeList_1 = __importDefault(require("./classes/routeList")); | ||
const types_1 = __importDefault(require("./interfaces/types")); | ||
const types_2 = __importDefault(require("./misc/types")); | ||
const path = __importStar(require("path")); | ||
const http = __importStar(require("http")); | ||
const url = __importStar(require("url")); | ||
const fs = __importStar(require("fs")); | ||
module.exports = { | ||
// Misc | ||
routeList: routeList_1.default, | ||
types: types_1.default, | ||
// Start | ||
async start( | ||
/** Required Options */ options) { | ||
const pages = options?.pages ?? {}; | ||
const events = options?.events ?? {}; | ||
const urls = options?.urls.list() ?? []; | ||
const proxy = options?.proxy ?? false; | ||
const rateLimits = options?.rateLimits ?? { enabled: false, list: [] }; | ||
const bind = options?.bind ?? '0.0.0.0'; | ||
const cors = options?.cors ?? false; | ||
const port = options?.port ?? 5002; | ||
const body = options?.body ?? 20; | ||
const server = http.createServer(async (req, res) => { | ||
let reqBody = ''; | ||
if (!!req.headers['content-length']) { | ||
const bodySize = parseInt(req.headers['content-length']); | ||
if (bodySize >= (body * 1e6)) { | ||
res.statusCode = 413; | ||
res.write('Payload Too Large'); | ||
return res.end(); | ||
} | ||
} | ||
req.on('data', (data) => { | ||
reqBody += data; | ||
}).on('end', async () => { | ||
let reqUrl = { ...url.parse(req.url), method: req.method }; | ||
if (reqUrl.path.endsWith('/')) | ||
reqUrl.path = reqUrl.path.slice(0, -1); | ||
let executeUrl = ''; | ||
// Parse Request Body | ||
try { | ||
reqBody = JSON.parse(reqBody); | ||
} | ||
catch (e) { } | ||
// Cors Stuff | ||
if (cors) { | ||
res.setHeader('Access-Control-Allow-Headers', '*'); | ||
res.setHeader('Access-Control-Allow-Origin', '*'); | ||
res.setHeader('Access-Control-Request-Method', '*'); | ||
res.setHeader('Access-Control-Allow-Methods', types_2.default.join(',')); | ||
if (req.method === 'OPTIONS') | ||
return res.end(''); | ||
} | ||
// Check if URL exists | ||
let params = new Map(); | ||
let exists, isStatic = false; | ||
const actualUrl = reqUrl.pathname.split('/'); | ||
if (actualUrl[actualUrl.length - 1] === '') | ||
actualUrl.pop(); | ||
for (const elementName in urls) { | ||
if (elementName in urls && elementName.replace(req.method, '') === reqUrl.pathname && urls[elementName].type === req.method) { | ||
executeUrl = req.method + reqUrl.pathname; | ||
isStatic = false; | ||
exists = true; | ||
break; | ||
} | ||
; | ||
if (elementName in urls && elementName.replace(req.method, '') === reqUrl.pathname && urls[elementName].type === 'STATIC') { | ||
executeUrl = req.method + reqUrl.pathname; | ||
isStatic = true; | ||
exists = true; | ||
break; | ||
} | ||
const element = urls[elementName]; | ||
if (element.type !== req.method) | ||
continue; | ||
if (element.array.length !== actualUrl.length) | ||
continue; | ||
if (exists && element.array.join('/') !== executeUrl) | ||
break; | ||
let urlCount = 0; | ||
for (const urlPart of element.array) { | ||
const urlParam = element.array[urlCount]; | ||
const reqParam = actualUrl[urlCount]; | ||
urlCount++; | ||
if (!urlParam.startsWith(':') && reqParam !== urlParam) | ||
break; | ||
if (urlParam === reqParam) { | ||
continue; | ||
} | ||
else if (urlParam.startsWith(':')) { | ||
params.set(urlParam.replace(':', ''), decodeURIComponent(reqParam)); | ||
executeUrl = req.method + element.array.join('/'); | ||
exists = true; | ||
continue; | ||
} | ||
continue; | ||
} | ||
continue; | ||
} | ||
// Get Correct Host IP | ||
let hostIp; | ||
if (proxy && req.headers['x-forwarded-for']) | ||
hostIp = req.headers['x-forwarded-for']; | ||
else | ||
hostIp = req.socket.remoteAddress; | ||
// Create Answer Object | ||
const headers = new Map(); | ||
Object.keys(req.headers).forEach((header) => { | ||
headers.set(header, req.headers[header]); | ||
}); | ||
headers.delete('cookie'); | ||
const queries = new Map(); | ||
for (const [query, value] of new URLSearchParams(reqUrl.search)) { | ||
queries.set(query, value); | ||
} | ||
; | ||
const cookies = new Map(); | ||
if (req.headers.cookie) { | ||
req.headers.cookie.split(';').forEach((cookie) => { | ||
let [name, ...rest] = cookie.split('='); | ||
name = name?.trim(); | ||
if (!name) | ||
return; | ||
const value = rest.join('=').trim(); | ||
if (!value) | ||
return; | ||
cookies.set(name, decodeURIComponent(value)); | ||
}); | ||
} | ||
res.setHeader('X-Powered-By', 'rjweb-server'); | ||
let ctr = { | ||
// Properties | ||
header: headers, | ||
cookie: cookies, | ||
param: params, | ||
query: queries, | ||
// Variables | ||
hostPort: req.socket.remotePort, | ||
hostIp, | ||
reqBody, | ||
reqUrl, | ||
// Raw Values | ||
rawServer: server, | ||
rawReq: req, | ||
rawRes: res, | ||
// Custom Variables | ||
'@': {}, | ||
// Functions | ||
setHeader(name, value) { | ||
res.setHeader(name, value); | ||
return ctr; | ||
}, setCustom(name, value) { | ||
ctr['@'][name] = value; | ||
return ctr; | ||
}, print(msg, options) { | ||
const niceJSON = options?.niceJSON ?? false; | ||
switch (typeof msg) { | ||
case 'object': | ||
res.setHeader('Content-Type', 'application/json'); | ||
if (niceJSON) | ||
res.write(JSON.stringify(msg, undefined, 1)); | ||
else | ||
res.write(JSON.stringify(msg)); | ||
break; | ||
case 'bigint': | ||
case 'number': | ||
case 'boolean': | ||
res.write(msg.toString()); | ||
break; | ||
case 'function': | ||
res.write(msg()); | ||
break; | ||
case 'undefined': | ||
res.write(''); | ||
break; | ||
default: | ||
try { | ||
res.write(msg); | ||
} | ||
catch (e) { | ||
if ('reqError' in pages) { | ||
ctr.error = e; | ||
Promise.resolve(pages.reqError(ctr)).catch((e) => { | ||
console.log(e); | ||
res.statusCode = 500; | ||
res.write(e); | ||
res.end(); | ||
}).then(() => res.end()); | ||
errorStop = true; | ||
} | ||
else { | ||
errorStop = true; | ||
console.log(e); | ||
res.statusCode = 500; | ||
res.end(); | ||
} | ||
} | ||
} | ||
; | ||
return ctr; | ||
}, status(code) { | ||
res.statusCode = code; | ||
return ctr; | ||
}, printFile(file) { | ||
const content = fs.readFileSync(file); | ||
res.write(content, 'binary'); | ||
return ctr; | ||
} | ||
}; | ||
// Execute Custom Run Function | ||
let errorStop = false; | ||
if ('request' in events) { | ||
await events.request(ctr).catch((e) => { | ||
if ('reqError' in pages) { | ||
ctr.error = e; | ||
Promise.resolve(pages.reqError(ctr)).catch((e) => { | ||
console.log(e); | ||
res.statusCode = 500; | ||
res.write(e); | ||
res.end(); | ||
}).then(() => res.end()); | ||
errorStop = true; | ||
} | ||
else { | ||
errorStop = true; | ||
console.log(e); | ||
res.statusCode = 500; | ||
return res.end(); | ||
} | ||
}); | ||
} | ||
; | ||
if (errorStop) | ||
return; | ||
// Rate Limiting | ||
if (rateLimits.enabled) { | ||
for (const rule of rateLimits.list) { | ||
if (reqUrl.path.startsWith(rule.path)) { | ||
res.setHeader('X-RateLimit-Limit', rule.times); | ||
res.setHeader('X-RateLimit-Remaining', rule.times - (await rateLimits.functions.get(hostIp + rule.path) ?? 0)); | ||
res.setHeader('X-RateLimit-Reset-Every', rule.timeout); | ||
await rateLimits.functions.set(hostIp + rule.path, (await rateLimits.functions.get(hostIp + rule.path) ?? 0) + 1); | ||
setTimeout(async () => { await rateLimits.functions.set(hostIp + rule.path, (await rateLimits.functions.get(hostIp + rule.path) ?? 0) - 1); }, rule.timeout); | ||
if (await rateLimits.functions.get(hostIp + rule.path) > rule.times) { | ||
res.statusCode = 429; | ||
ctr.print(rateLimits.message ?? 'Rate Limited'); | ||
return res.end(); | ||
} | ||
} | ||
} | ||
} | ||
// Execute Page | ||
if (exists) { | ||
if (!isStatic) { | ||
Promise.resolve(urls[executeUrl].code(ctr)).catch((e) => { | ||
if ('reqError' in pages) { | ||
ctr.error = e; | ||
Promise.resolve(pages.reqError(ctr)).catch((e) => { | ||
console.log(e); | ||
res.statusCode = 500; | ||
res.write(e); | ||
res.end(); | ||
}).then(() => res.end()); | ||
} | ||
else { | ||
console.log(e); | ||
res.statusCode = 500; | ||
res.write(e); | ||
res.end(); | ||
} | ||
}).then(() => res.end()); | ||
} | ||
else { | ||
// Add Content Types | ||
if (urls[executeUrl].addTypes) { | ||
if (urls[executeUrl].path.endsWith('.pdf')) | ||
ctr.setHeader('Content-Type', 'application/pdf'); | ||
if (urls[executeUrl].path.endsWith('.js')) | ||
ctr.setHeader('Content-Type', 'text/javascript'); | ||
if (urls[executeUrl].path.endsWith('.html')) | ||
ctr.setHeader('Content-Type', 'text/html'); | ||
if (urls[executeUrl].path.endsWith('.css')) | ||
ctr.setHeader('Content-Type', 'text/css'); | ||
if (urls[executeUrl].path.endsWith('.csv')) | ||
ctr.setHeader('Content-Type', 'text/csv'); | ||
if (urls[executeUrl].path.endsWith('.mpeg')) | ||
ctr.setHeader('Content-Type', 'video/mpeg'); | ||
if (urls[executeUrl].path.endsWith('.mp4')) | ||
ctr.setHeader('Content-Type', 'video/mp4'); | ||
if (urls[executeUrl].path.endsWith('.webm')) | ||
ctr.setHeader('Content-Type', 'video/webm'); | ||
if (urls[executeUrl].path.endsWith('.bmp')) | ||
ctr.setHeader('Content-Type', 'image/bmp'); | ||
} | ||
// Read Content | ||
if (!('content' in urls[executeUrl])) { | ||
let content; | ||
const filePath = path.resolve(urls[executeUrl].file); | ||
try { | ||
content = fs.readFileSync(filePath); | ||
} | ||
catch (e) { | ||
console.log(e); | ||
return res.end(); | ||
} | ||
res.write(content, 'binary'); | ||
return res.end(); | ||
} | ||
res.write(urls[executeUrl].content, 'binary'); | ||
return res.end(); | ||
} | ||
} | ||
else { | ||
if ('notFound' in pages) { | ||
Promise.resolve(pages.notFound(ctr)).catch((e) => { | ||
if ('reqError' in pages) { | ||
ctr.error = e; | ||
pages.reqError(ctr).catch((e) => { | ||
console.log(e); | ||
res.statusCode = 500; | ||
res.write(e); | ||
res.end(); | ||
}).then(() => res.end()); | ||
} | ||
else { | ||
console.log(e); | ||
res.statusCode = 500; | ||
res.write(e); | ||
res.end(); | ||
} | ||
}).then(() => res.end()); | ||
} | ||
else { | ||
let pageDisplay = ''; | ||
for (const rawUrl in urls) { | ||
const url = urls[rawUrl]; | ||
const type = (url.type === 'STATIC' ? 'GET' : url.type); | ||
pageDisplay += `[-] [${type}] ${url.path}\n`; | ||
} | ||
res.statusCode = 404; | ||
res.write(`[!] COULDNT FIND ${reqUrl.pathname.toUpperCase()}\n[i] AVAILABLE PAGES:\n\n${pageDisplay}`); | ||
res.end(); | ||
} | ||
} | ||
}); | ||
}); | ||
server.on('upgrade', (req, socket, head) => { | ||
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' + | ||
'Upgrade: WebSocket\r\n' + | ||
'Connection: Upgrade\r\n' + | ||
'\r\n'); | ||
socket.pipe(socket); | ||
}); | ||
server.listen(port, bind); | ||
return new Promise((resolve, reject) => { | ||
server.once('listening', () => resolve({ success: true, port, message: 'WEBSERVER STARTED', rawServer: server })); | ||
server.once('error', (error) => reject({ success: false, error, message: 'WEBSERVER ERRORED' })); | ||
}); | ||
} | ||
}; | ||
//# sourceMappingURL=index.js.map | ||
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,n)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};const routeList_1=__importDefault(require("./classes/routeList")),types_1=__importDefault(require("./interfaces/types")),types_2=__importDefault(require("./misc/types")),path=__importStar(require("path")),http=__importStar(require("http")),url=__importStar(require("url")),fs=__importStar(require("fs"));module.exports={routeList:routeList_1.default,types:types_1.default,async start(e){const t=e?.pages??{},r=e?.events??{},o=e?.urls.list()??[],n=e?.proxy??!1,s=e?.rateLimits??{enabled:!1,list:[]},a=e?.bind??"0.0.0.0",i=e?.cors??!1,d=e?.port??5002,c=e?.body??20,p=http.createServer((async(e,a)=>{let d="";if(e.headers["content-length"]){if(parseInt(e.headers["content-length"])>=1e6*c)return a.statusCode=413,a.write("Payload Too Large"),a.end()}e.on("data",(e=>{d+=e})).on("end",(async()=>{let c={...url.parse(e.url),method:e.method};c.path.endsWith("/")&&(c.path=c.path.slice(0,-1));let l="";try{d=JSON.parse(d)}catch(e){}if(i&&(a.setHeader("Access-Control-Allow-Headers","*"),a.setHeader("Access-Control-Allow-Origin","*"),a.setHeader("Access-Control-Request-Method","*"),a.setHeader("Access-Control-Allow-Methods",types_2.default.join(",")),"OPTIONS"===e.method))return a.end("");let h,u=new Map,f=!1;const m=c.pathname.split("/");""===m[m.length-1]&&m.pop();for(const t in o){if(t in o&&t.replace(e.method,"")===c.pathname&&o[t].type===e.method){l=e.method+c.pathname,f=!1,h=!0;break}if(t in o&&t.replace(e.method,"")===c.pathname&&"STATIC"===o[t].type){l=e.method+c.pathname,f=!0,h=!0;break}const r=o[t];if(r.type!==e.method)continue;if(r.array.length!==m.length)continue;if(h&&r.array.join("/")!==l)break;let n=0;for(const t of r.array){const t=r.array[n],o=m[n];if(n++,!t.startsWith(":")&&o!==t)break;t!==o&&(t.startsWith(":")&&(u.set(t.replace(":",""),decodeURIComponent(o)),l=e.method+r.array.join("/"),h=!0))}}let y;y=n&&e.headers["x-forwarded-for"]?e.headers["x-forwarded-for"]:e.socket.remoteAddress;const w=new Map;Object.keys(e.headers).forEach((t=>{w.set(t,e.headers[t])})),w.delete("cookie");const _=new Map;for(const[e,t]of new URLSearchParams(c.search))_.set(e,t);const g=new Map;e.headers.cookie&&e.headers.cookie.split(";").forEach((e=>{let[t,...r]=e.split("=");if(t=t?.trim(),!t)return;const o=r.join("=").trim();o&&g.set(t,decodeURIComponent(o))})),a.setHeader("X-Powered-By","rjweb-server");let b={header:w,cookie:g,param:u,query:_,hostPort:e.socket.remotePort,hostIp:y,reqBody:d,reqUrl:c,rawServer:p,rawReq:e,rawRes:a,"@":{},setHeader:(e,t)=>(a.setHeader(e,t),b),setCustom:(e,t)=>(b["@"][e]=t,b),print(e,r){const o=r?.niceJSON??!1;switch(typeof e){case"object":a.setHeader("Content-Type","application/json"),o?a.write(JSON.stringify(e,void 0,1)):a.write(JSON.stringify(e));break;case"bigint":case"number":case"boolean":a.write(e.toString());break;case"function":a.write(e());break;case"undefined":a.write("");break;default:try{a.write(e)}catch(e){"reqError"in t?(b.error=e,Promise.resolve(t.reqError(b)).catch((e=>{console.log(e),a.statusCode=500,a.write(e),a.end()})).then((()=>a.end())),C=!0):(C=!0,console.log(e),a.statusCode=500,a.end())}}return b},status:e=>(a.statusCode=e,b),printFile(e){const t=fs.readFileSync(e);return a.write(t,"binary"),b}},C=!1;if("request"in r&&await r.request(b).catch((e=>{if(!("reqError"in t))return C=!0,console.log(e),a.statusCode=500,a.end();b.error=e,Promise.resolve(t.reqError(b)).catch((e=>{console.log(e),a.statusCode=500,a.write(e),a.end()})).then((()=>a.end())),C=!0})),!C){if(s.enabled)for(const e of s.list)if(c.path.startsWith(e.path)&&(a.setHeader("X-RateLimit-Limit",e.times),a.setHeader("X-RateLimit-Remaining",e.times-(await s.functions.get(y+e.path)??0)),a.setHeader("X-RateLimit-Reset-Every",e.timeout),await s.functions.set(y+e.path,(await s.functions.get(y+e.path)??0)+1),setTimeout((async()=>{await s.functions.set(y+e.path,(await s.functions.get(y+e.path)??0)-1)}),e.timeout),await s.functions.get(y+e.path)>e.times))return a.statusCode=429,b.print(s.message??"Rate Limited"),a.end();if(h){if(f){if(o[l].addTypes&&(o[l].path.endsWith(".pdf")&&b.setHeader("Content-Type","application/pdf"),o[l].path.endsWith(".js")&&b.setHeader("Content-Type","text/javascript"),o[l].path.endsWith(".html")&&b.setHeader("Content-Type","text/html"),o[l].path.endsWith(".css")&&b.setHeader("Content-Type","text/css"),o[l].path.endsWith(".csv")&&b.setHeader("Content-Type","text/csv"),o[l].path.endsWith(".mpeg")&&b.setHeader("Content-Type","video/mpeg"),o[l].path.endsWith(".mp4")&&b.setHeader("Content-Type","video/mp4"),o[l].path.endsWith(".webm")&&b.setHeader("Content-Type","video/webm"),o[l].path.endsWith(".bmp")&&b.setHeader("Content-Type","image/bmp")),!("content"in o[l])){let e;const t=path.resolve(o[l].file);try{e=fs.readFileSync(t)}catch(e){return console.log(e),a.end()}return a.write(e,"binary"),a.end()}return a.write(o[l].content,"binary"),a.end()}Promise.resolve(o[l].code(b)).catch((e=>{"reqError"in t?(b.error=e,Promise.resolve(t.reqError(b)).catch((e=>{console.log(e),a.statusCode=500,a.write(e),a.end()})).then((()=>a.end()))):(console.log(e),a.statusCode=500,a.write(e),a.end())})).then((()=>a.end()))}else if("notFound"in t)Promise.resolve(t.notFound(b)).catch((e=>{"reqError"in t?(b.error=e,t.reqError(b).catch((e=>{console.log(e),a.statusCode=500,a.write(e),a.end()})).then((()=>a.end()))):(console.log(e),a.statusCode=500,a.write(e),a.end())})).then((()=>a.end()));else{let e="";for(const t in o){const r=o[t];e+=`[-] [${"STATIC"===r.type?"GET":r.type}] ${r.path}\n`}a.statusCode=404,a.write(`[!] COULDNT FIND ${c.pathname.toUpperCase()}\n[i] AVAILABLE PAGES:\n\n${e}`),a.end()}}}))}));return p.on("upgrade",((e,t,r)=>{t.write("HTTP/1.1 101 Web Socket Protocol Handshake\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\n\r\n"),t.pipe(t)})),p.listen(d,a),new Promise(((e,t)=>{p.once("listening",(()=>e({success:!0,port:d,message:"WEBSERVER STARTED",rawServer:p}))),p.once("error",(e=>t({success:!1,error:e,message:"WEBSERVER ERRORED"})))}))}}; |
@@ -35,2 +35,1 @@ /// <reference types="node" /> | ||
export {}; | ||
//# sourceMappingURL=ctr.d.ts.map |
@@ -1,3 +0,1 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=ctr.js.map | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}); |
@@ -12,2 +12,1 @@ /// <reference types="node" /> | ||
} | ||
//# sourceMappingURL=page.d.ts.map |
@@ -1,3 +0,1 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=page.js.map | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}); |
@@ -6,2 +6,1 @@ export default interface rateLimitRule { | ||
} | ||
//# sourceMappingURL=ratelimitRule.d.ts.map |
@@ -1,3 +0,1 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=ratelimitRule.js.map | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}); |
@@ -12,2 +12,1 @@ declare enum HTTPtypes { | ||
export type types = 'OPTIONS' | 'DELETE' | 'PATCH' | 'POST' | 'PUT' | 'GET' | 'STATIC'; | ||
//# sourceMappingURL=types.d.ts.map |
@@ -1,14 +0,1 @@ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var HTTPtypes; | ||
(function (HTTPtypes) { | ||
/** HTTP Request Type */ HTTPtypes["options"] = "OPTIONS"; | ||
/** HTTP Request Type */ HTTPtypes["delete"] = "DELETE"; | ||
/** HTTP Request Type */ HTTPtypes["patch"] = "PATCH"; | ||
/** HTTP Request Type */ HTTPtypes["post"] = "POST"; | ||
/** HTTP Request Type */ HTTPtypes["put"] = "PUT"; | ||
/** HTTP Request Type */ HTTPtypes["get"] = "GET"; | ||
/** Internal Request Type */ HTTPtypes["static"] = "STATIC"; | ||
})(HTTPtypes || (HTTPtypes = {})); | ||
exports.default = HTTPtypes; | ||
//# sourceMappingURL=types.js.map | ||
"use strict";var HTTPtypes;Object.defineProperty(exports,"__esModule",{value:!0}),function(t){t.options="OPTIONS",t.delete="DELETE",t.patch="PATCH",t.post="POST",t.put="PUT",t.get="GET",t.static="STATIC"}(HTTPtypes||(HTTPtypes={})),exports.default=HTTPtypes; |
export declare const getAllFiles: (dirPath: string, arrayOfFiles?: string[]) => string[]; | ||
export declare const getAllFilesFilter: (dirPath: string, suffix: string, arrayOfFiles?: string[]) => string[]; | ||
//# sourceMappingURL=getAllFiles.d.ts.map |
@@ -1,49 +0,1 @@ | ||
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}); | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.getAllFilesFilter = exports.getAllFiles = void 0; | ||
const fs = __importStar(require("fs")); | ||
const getAllFiles = (dirPath, arrayOfFiles) => { | ||
arrayOfFiles = arrayOfFiles || []; | ||
const files = fs.readdirSync(dirPath); | ||
files.forEach((file) => { | ||
if (fs.statSync(dirPath + '/' + file).isDirectory()) { | ||
arrayOfFiles = (0, exports.getAllFiles)(dirPath + '/' + file, arrayOfFiles); | ||
} | ||
else { | ||
let filePath = dirPath + '/' + file; | ||
arrayOfFiles.push(filePath); | ||
} | ||
}); | ||
return arrayOfFiles; | ||
}; | ||
exports.getAllFiles = getAllFiles; | ||
const getAllFilesFilter = (dirPath, suffix, arrayOfFiles) => { | ||
arrayOfFiles = arrayOfFiles || []; | ||
arrayOfFiles = (0, exports.getAllFiles)(dirPath, arrayOfFiles).filter((file) => file.endsWith(suffix)); | ||
return arrayOfFiles; | ||
}; | ||
exports.getAllFilesFilter = getAllFilesFilter; | ||
//# sourceMappingURL=getAllFiles.js.map | ||
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,l){void 0===l&&(l=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,l,i)}:function(e,t,r,l){void 0===l&&(l=r),e[l]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getAllFilesFilter=exports.getAllFiles=void 0;const fs=__importStar(require("fs")),getAllFiles=(e,t)=>{t=t||[];return fs.readdirSync(e).forEach((r=>{if(fs.statSync(e+"/"+r).isDirectory())t=(0,exports.getAllFiles)(e+"/"+r,t);else{let l=e+"/"+r;t.push(l)}})),t};exports.getAllFiles=getAllFiles;const getAllFilesFilter=(e,t,r)=>(r=r||[],r=(0,exports.getAllFiles)(e,r).filter((e=>e.endsWith(t))));exports.getAllFilesFilter=getAllFilesFilter; |
declare const _default: string[]; | ||
export = _default; | ||
//# sourceMappingURL=types.d.ts.map |
@@ -1,11 +0,1 @@ | ||
"use strict"; | ||
module.exports = [ | ||
'OPTIONS', | ||
'DELETE', | ||
'PATCH', | ||
'STATIC', | ||
'POST', | ||
'PUT', | ||
'GET' | ||
]; | ||
//# sourceMappingURL=types.js.map | ||
"use strict";module.exports=["OPTIONS","DELETE","PATCH","STATIC","POST","PUT","GET"]; |
{ | ||
"name": "rjweb-server", | ||
"version": "1.2.5", | ||
"version": "1.2.6", | ||
"description": "Easy and Lightweight Way to create a Web Server in Node.js", | ||
"main": "lib/index.js", | ||
"scripts": { | ||
"build": "rm -r lib && tsc --pretty false" | ||
"build": "rm -r lib && tsc --pretty false && uglifyjs-folder ./lib -e -x .js -o lib > /dev/null" | ||
}, "repository": { | ||
@@ -30,4 +30,5 @@ "type": "git", | ||
"@types/node": "^18.11.18", | ||
"typescript": "^4.9.4" | ||
"typescript": "^4.9.4", | ||
"uglifyjs-folder": "^3.2.0" | ||
} | ||
} |
@@ -77,3 +77,3 @@ <h1 align="center">Welcome to rjweb-server 👋</h1> | ||
events: { | ||
request: { | ||
request: async(ctr: ctr) { | ||
ctr.setCustom('count', ++count) | ||
@@ -225,4 +225,3 @@ | ||
set: async(key, value) => (await db.query('update ratelimits set value = ? where key = ?;', [value, key])), | ||
get: async(key) => ((await db.query('select value from ratelimits where key = ?;', [key])).data.rows[0].value), | ||
del: async(key, value) => (await db.query('delete from ratelimits where key = ?;', [key])) | ||
get: async(key) => ((await db.query('select value from ratelimits where key = ?;', [key])).data.rows[0].value) | ||
} | ||
@@ -330,3 +329,3 @@ } | ||
Copyright © 2022 [0x4096](https://github.com/rotvproHD).<br /> | ||
This project is ISC licensed. | ||
Copyright © 2023 [0x4096](https://github.com/rotvproHD).<br /> | ||
This project is MIT licensed. |
@@ -6,12 +6,10 @@ { | ||
"declaration": true, | ||
"declarationMap": true, | ||
"declarationMap": false, | ||
"target": "ES2020", | ||
"moduleResolution": "node", | ||
"esModuleInterop": true, | ||
"sourceMap": true, | ||
"sourceMap": false, | ||
"outDir": "lib", | ||
"downlevelIteration": true, | ||
"baseUrl": "src", | ||
}, | ||
"include": ["src/**/*"] | ||
}, "include": ["src/**/*"] | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
27629
3
21
192
3
329
2