UNPKG

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
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; } }