rjweb-server
Version:
Easy and Robust Way to create a Web Server with Many Easy-to-use Features in NodeJS
151 lines (150 loc) • 5.34 kB
JavaScript
import Cookie from "../Cookie";
import parseKV from "../../functions/parseKV";
import { as, network } from "@rjweb/utils";
export default class Base {
/**
* Initializes a new Instance of a Web Context
* @since 7.0.0
*/ constructor(context) {
/**
* Context Variables that are available everywhere in the requests lifespan
* @since 1.2.1
*/ this['@'] = {};
this.context = context;
this.global = context.global;
this.params = as(context.params);
this.headers = context.headers;
this.headers['modifyFn'] = (event, key, data) => {
switch (event) {
case "set": {
context.response.headers.set(key, data);
return;
}
case "delete": {
context.response.headers.delete(key);
return;
}
case "clear": {
let keys = 0;
for (const cKey in context.response.headers) {
if (!key.includes(cKey)) {
context.response.headers.delete(key);
keys++;
}
}
return keys;
}
}
};
this.cookies['modifyFn'] = (event, key, data) => {
switch (event) {
case "set": {
context.response.cookies.set(key, data);
return;
}
case "delete": {
context.response.cookies.set(key, new Cookie('remove', { expires: 0 }));
return;
}
case "clear": {
let keys = 0;
for (const [cKey] of this.cookies) {
if (!key.includes(cKey)) {
context.response.cookies.set(cKey, new Cookie('remove', { expires: 0 }));
keys++;
}
}
return keys;
}
}
};
let ip = null;
this.client = {
userAgent: context.headers.get('user-agent', ''),
port: context.ip.port,
get ip() {
if (ip)
return ip;
ip = new network.IPAddress(context.ip.value);
return ip;
}
};
this.url = context.url;
}
/**
* A Collection of all Client Cookies
* @example
* ```
* import { Cookie } from "rjweb-server"
*
* if (ctr.cookies.has('theme')) console.log('Theme Cookie is present')
*
* console.log(ctr.cookies.get('theme')) // Will print undefined if not present
* console.log(ctr.cookies.get('theme', 'light')) // Will print 'light' if not present
*
* ctr.cookies.set('session', new Cookie(Math.random(), {
* path: '/'
* }))
* ```
* @since 2.0.0
*/ get cookies() {
if (this.context.cookies)
return this.context.cookies;
this.context.cookies = as(parseKV('ValueCollection', this.headers.get('cookie', ''), '=', ';'));
this.context.cookies['modifyFn'] = (event, key, data) => {
switch (event) {
case "set": {
this.context.response.cookies.set(key, data);
return;
}
case "delete": {
this.context.response.cookies.set(key, new Cookie('remove', { expires: 0 }));
return;
}
case "clear": {
let keys = 0;
for (const [cKey] of this.cookies) {
if (!key.includes(cKey)) {
this.context.response.cookies.set(cKey, new Cookie('remove', { expires: 0 }));
keys++;
}
}
return keys;
}
}
};
return this.context.cookies;
}
/**
* A Collection of all URL Queries
* @example
* ```
* if (ctr.queries.has('user')) console.log('User Query is present')
*
* console.log(ctr.queries.get('user')) // Will print undefined if not present
* console.log(ctr.queries.get('user', 'default')) // Will print 'default' if not present
* ```
* @since 2.0.0
*/ get queries() {
if (this.context.queries)
return this.context.queries;
this.context.queries = parseKV('ValueCollection', this.url.query);
return this.context.queries;
}
/**
* A Collection of all URL Fragments
* @example
* ```
* if (ctr.fragments.has('user')) console.log('User Fragment is present')
*
* console.log(ctr.fragments.get('user')) // Will print undefined if not present
* console.log(ctr.fragments.get('user', 'default')) // Will print 'default' if not present
* ```
* @since 7.0.0
*/ get fragments() {
if (this.context.fragments)
return this.context.fragments;
this.context.fragments = parseKV('ValueCollection', this.url.fragments);
return this.context.fragments;
}
}