diff --git a/esm/nanoexpress.js b/esm/nanoexpress.js new file mode 100644 index 00000000..cbe13ac2 --- /dev/null +++ b/esm/nanoexpress.js @@ -0,0 +1,1582 @@ +import uWS from 'uWebSockets.js'; +import debugLog from 'debug'; +import queryParse from 'fast-query-parse'; +import { Readable } from 'stream'; +import { STATUS_CODES } from 'http'; +import EventsEmitter, { EventEmitter } from 'events'; +import { statSync, createReadStream } from 'fs'; +import { createBrotliCompress, createGzip, createDeflate } from 'zlib'; +import analyze from '@nanoexpress/route-syntax-parser'; +import fastDecodeURI from 'fast-decode-uri-component'; +import { pathToRegexp } from 'path-to-regexp'; + +const request = Symbol('NanoexpressHttpRequestInstance'); +const response = Symbol('NanoexpressHttpResponseInstance'); +const reqConfig = Symbol('NanoexpressHttpRequestConfig'); +const reqEvents = Symbol('NanoexpressHttpRequestEvents'); +const reqRequest = Symbol('NanoexpressHttpRequestRawInstance'); +const reqRawResponse = Symbol('NanoexpressHttpResponseRawInstance'); +const resHeaders = Symbol('NanoexpressHttpResponseHeaders'); +const resConfig = Symbol('NanoexpressHttpResponseConfig'); +const resEvents = Symbol('NanoexpressHttpResponseEvents'); +const resAbortHandler = Symbol('NanoexpressHttpResponseAbortHandler'); +const resAbortHandlerExpose = Symbol('NanoexpressHttpResponseAbortHandlerExpose'); +const appInstance = Symbol('NanoexpressAppInstance'); +const routerInstances = Symbol('NanoexpressRouterInstances'); +const wsInstances = Symbol('NanoexpressWebSocketInstances'); + +function _gc() { + try { + if (global.gc) { + global.gc(); + } + return true; + } + catch (e) { + return false; + } +} + +const debug = debugLog('nanoexpress'); +debugLog('nanoexpress:error'); +const warn = debugLog('nanoexpress:warn'); + +const lastDeps = []; +const callbacks = []; +let hookIndex = 0; +const register = (runValue = false, returnValue = false) => (callback, dependencies) => { + if (!dependencies || + !lastDeps[hookIndex] || + !lastDeps[hookIndex].every((dep, depIndex) => dep === dependencies[depIndex])) { + callbacks[hookIndex] = { + handler: runValue ? callback() : callback, + dependencies, + isEffect: runValue && !returnValue, + mounted: runValue + }; + lastDeps[hookIndex] = dependencies; + } + const _callback = callbacks[hookIndex].handler; + hookIndex += 1; + if (returnValue) { + return _callback; + } +}; +const unregister = () => { + callbacks.forEach((callback) => { + if (callback.isEffect && + callback.mounted && + typeof callback.handler === 'function') { + callback.handler(); + callback.mounted = false; + } + }); + hookIndex = 0; +}; + +const codesBetween = Array.from({ length: 500 }) + .fill(0) + .map((_, index) => 100 + index); +const httpCodes = codesBetween.reduce((codes, code) => { + const codeString = STATUS_CODES[code]; + if (codeString) { + codes[code] = `${code} ${codeString}`; + } + return codes; +}, {}); + +[ + 'get', + 'post', + 'put', + 'patch', + 'del', + 'any', + 'head', + 'options', + 'trace' +].map((m) => m.toUpperCase()); + +function invalid(message) { + throw new Error(message); +} + +var iterateBlocks = (blocks) => { + return [...new Set(blocks.map((block) => block.mode))]; +}; + +const mimes = { + '3gp': 'video/3gpp', + a: 'application/octet-stream', + ai: 'application/postscript', + aif: 'audio/x-aiff', + aiff: 'audio/x-aiff', + asc: 'application/pgp-signature', + asf: 'video/x-ms-asf', + asm: 'text/x-asm', + asx: 'video/x-ms-asf', + atom: 'application/atom+xml', + au: 'audio/basic', + avi: 'video/x-msvideo', + bat: 'application/x-msdownload', + bin: 'application/octet-stream', + bmp: 'image/bmp', + bz2: 'application/x-bzip2', + c: 'text/x-c', + cab: 'application/vnd.ms-cab-compressed', + cc: 'text/x-c', + chm: 'application/vnd.ms-htmlhelp', + class: 'application/octet-stream', + com: 'application/x-msdownload', + conf: 'text/plain', + cpp: 'text/x-c', + crt: 'application/x-x509-ca-cert', + css: 'text/css', + csv: 'text/csv', + cxx: 'text/x-c', + deb: 'application/x-debian-package', + der: 'application/x-x509-ca-cert', + diff: 'text/x-diff', + djv: 'image/vnd.djvu', + djvu: 'image/vnd.djvu', + dll: 'application/x-msdownload', + dmg: 'application/octet-stream', + doc: 'application/msword', + dot: 'application/msword', + dtd: 'application/xml-dtd', + dvi: 'application/x-dvi', + ear: 'application/java-archive', + eml: 'message/rfc822', + eps: 'application/postscript', + exe: 'application/x-msdownload', + f: 'text/x-fortran', + f77: 'text/x-fortran', + f90: 'text/x-fortran', + flv: 'video/x-flv', + for: 'text/x-fortran', + gem: 'application/octet-stream', + gemspec: 'text/x-script.ruby', + gif: 'image/gif', + gz: 'application/x-gzip', + h: 'text/x-c', + hh: 'text/x-c', + htm: 'text/html', + html: 'text/html', + ico: 'image/vnd.microsoft.icon', + ics: 'text/calendar', + ifb: 'text/calendar', + iso: 'application/octet-stream', + jar: 'application/java-archive', + java: 'text/x-java-source', + jnlp: 'application/x-java-jnlp-file', + jpeg: 'image/jpeg', + jpg: 'image/jpeg', + js: 'application/javascript', + json: 'application/json', + log: 'text/plain', + m3u: 'audio/x-mpegurl', + m4v: 'video/mp4', + man: 'text/troff', + mathml: 'application/mathml+xml', + mbox: 'application/mbox', + mdoc: 'text/troff', + me: 'text/troff', + mid: 'audio/midi', + midi: 'audio/midi', + mime: 'message/rfc822', + mjs: 'application/javascript', + mml: 'application/mathml+xml', + mng: 'video/x-mng', + mov: 'video/quicktime', + mp3: 'audio/mpeg', + mp4: 'video/mp4', + mp4v: 'video/mp4', + mpeg: 'video/mpeg', + mpg: 'video/mpeg', + ms: 'text/troff', + msi: 'application/x-msdownload', + odp: 'application/vnd.oasis.opendocument.presentation', + ods: 'application/vnd.oasis.opendocument.spreadsheet', + odt: 'application/vnd.oasis.opendocument.text', + ogg: 'application/ogg', + p: 'text/x-pascal', + pas: 'text/x-pascal', + pbm: 'image/x-portable-bitmap', + pdf: 'application/pdf', + pem: 'application/x-x509-ca-cert', + pgm: 'image/x-portable-graymap', + pgp: 'application/pgp-encrypted', + pkg: 'application/octet-stream', + pl: 'text/x-script.perl', + pm: 'text/x-script.perl-module', + png: 'image/png', + pnm: 'image/x-portable-anymap', + ppm: 'image/x-portable-pixmap', + pps: 'application/vnd.ms-powerpoint', + ppt: 'application/vnd.ms-powerpoint', + ps: 'application/postscript', + psd: 'image/vnd.adobe.photoshop', + py: 'text/x-script.python', + qt: 'video/quicktime', + ra: 'audio/x-pn-realaudio', + rake: 'text/x-script.ruby', + ram: 'audio/x-pn-realaudio', + rar: 'application/x-rar-compressed', + rb: 'text/x-script.ruby', + rdf: 'application/rdf+xml', + roff: 'text/troff', + rpm: 'application/x-redhat-package-manager', + rss: 'application/rss+xml', + rtf: 'application/rtf', + ru: 'text/x-script.ruby', + s: 'text/x-asm', + sgm: 'text/sgml', + sgml: 'text/sgml', + sh: 'application/x-sh', + sig: 'application/pgp-signature', + snd: 'audio/basic', + so: 'application/octet-stream', + svg: 'image/svg+xml', + svgz: 'image/svg+xml', + swf: 'application/x-shockwave-flash', + t: 'text/troff', + tar: 'application/x-tar', + tbz: 'application/x-bzip-compressed-tar', + tcl: 'application/x-tcl', + tex: 'application/x-tex', + texi: 'application/x-texinfo', + texinfo: 'application/x-texinfo', + text: 'text/plain', + tif: 'image/tiff', + tiff: 'image/tiff', + torrent: 'application/x-bittorrent', + tr: 'text/troff', + txt: 'text/plain', + vcf: 'text/x-vcard', + vcs: 'text/x-vcalendar', + vrml: 'model/vrml', + war: 'application/java-archive', + wav: 'audio/x-wav', + wma: 'audio/x-ms-wma', + wmv: 'video/x-ms-wmv', + wmx: 'video/x-ms-wmx', + wrl: 'model/vrml', + wsdl: 'application/wsdl+xml', + xbm: 'image/x-xbitmap', + xhtml: 'application/xhtml+xml', + xls: 'application/vnd.ms-excel', + xml: 'application/xml', + xpm: 'image/x-xpixmap', + xsl: 'application/xml', + xslt: 'application/xslt+xml', + yaml: 'text/yaml', + yml: 'text/yaml', + zip: 'application/zip', + default: 'text/html' +}; +const getMime = (path) => { + const i = Number(path.lastIndexOf('.')); + return mimes[path.substr(i + 1).toLowerCase()]; +}; + +var slashify = (path) => path !== '*' && + path.charAt(path.length - 1) !== '/' && + path.charAt(path.length - 1) !== '*' && + (path.lastIndexOf('.') === -1 || path.lastIndexOf('.') < path.length - 4) + ? `${path}/` + : path; + +var noop = () => { }; + +class HttpRequest { + constructor(options) { + this.query = null; + this.id = 0; + this[reqConfig] = options; + this.registered = false; + return this; + } + setRequest(req, res) { + const options = this[reqConfig]; + this[reqRequest] = req; + this[reqRawResponse] = res; + const query = req.getQuery(); + const url = req.getUrl(); + this.url = url; + this.originalUrl = this.url; + this.path = url; + this.baseUrl = ''; + this.method = req.getMethod().toUpperCase(); + this.headers = {}; + req.forEach((key, value) => { + this.headers[key] = value; + }); + if (url.charAt(url.length - 1) !== '/') { + this.url += '/'; + this.path += '/'; + this.originalUrl += '/'; + } + if (options.enableExpressCompatibility && query) { + this.originalUrl += `?${query}`; + } + this.query = queryParse(query); + if (this.method === 'POST' || this.method === 'PUT') { + this.stream = new Readable({ read() { } }); + this[reqEvents] = null; + this.registered = false; + } + this.id = Math.round(Math.random() * 1e5); + return this; + } + on(event, listener) { + const { stream } = this; + if (stream) { + stream.on(event, listener); + } + return this; + } + emit(event, ...args) { + const { stream } = this; + if (stream) { + stream.emit(event, ...args); + } + return this; + } + getHeader(key) { + return this.headers[key]; + } + hasHeader(key) { + return !!this.headers[key]; + } + getParameter(index) { + return this[reqRequest].getParameter(index); + } + pipe(destination) { + const { stream } = this; + if (stream.readableDidRead || stream.readableEnded) { + return invalid('Stream already used, cannot use one stream twice'); + } + if (stream) { + return stream.pipe(destination); + } + return invalid('Stream was not defined, something wrong, please check your code or method is not a POST or PUT'); + } + async *[Symbol.asyncIterator]() { + const { stream } = this; + if (stream) { + for await (const chunk of stream) { + yield chunk; + } + } + } +} + +class HttpResponse { + constructor(config) { + this._headersSet = false; + this.mode = 'queue'; + this.id = 0; + this[resConfig] = config; + this.done = false; + this.aborted = false; + this._headersSet = false; + this.registered = false; + this.streaming = false; + this[resEvents] = null; + this[resAbortHandler] = []; + this[resAbortHandlerExpose] = false; + this[request] = null; + this[response] = null; + this[resHeaders] = null; + this.mode = config.responseMode; + this.statusCode = 200; + } + registerEvents() { + const emitter = this[resEvents]; + if (emitter && !this.registered) { + this.exposeAborted(); + emitter + .on('pipe', (stream) => { + debug('stream.pipe(res)'); + this.streaming = true; + this.stream(stream); + }) + .on('data', () => { + debug('stream.pipe(res):data event'); + }) + .on('unpipe', () => { + debug('stream.unpipe(res)'); + this.aborted = true; + }) + .on('error', () => { + debug('stream.pipe(res) error'); + this.aborted = true; + this.end(); + }); + this.registered = true; + } + return this; + } + on(eventName, eventArgument) { + let emitter = this[resEvents]; + if (!emitter) { + this[resEvents] = new EventEmitter(); + } + emitter = this[resEvents]; + emitter.on(eventName, eventArgument); + debug('res.on(%s, handler)', eventName); + this.registerEvents(); + return this; + } + once(eventName, eventArgument) { + let emitter = this[resEvents]; + if (!emitter) { + this[resEvents] = new EventEmitter(); + } + emitter = this[resEvents]; + emitter.once(eventName, eventArgument); + debug('res.once(%s, handler)', eventName); + this.registerEvents(); + return this; + } + off(eventName, eventArgument) { + let emitter = this[resEvents]; + if (!emitter) { + return this; + } + emitter = this[resEvents]; + emitter.off(eventName, eventArgument); + debug('res.off(%s, handler)', eventName); + this.registerEvents(); + return this; + } + removeListener(eventName, eventArgument) { + let emitter = this[resEvents]; + if (!emitter) { + return this; + } + emitter = this[resEvents]; + emitter.removeListener(eventName, eventArgument); + debug('res.removeListener(%s, handler)', eventName); + this.registerEvents(); + return this; + } + emit(eventName, eventArgument) { + let emitter = this[resEvents]; + if (!emitter) { + this[resEvents] = new EventEmitter(); + } + debug('res.emit(%s, argument)', eventName); + emitter = this[resEvents]; + return emitter.emit(eventName, eventArgument); + } + setResponse(res, req) { + this[request] = req; + this[response] = res; + this.done = false; + this.aborted = res.aborted || false; + this._headersSet = false; + this.streaming = false; + this.registered = false; + this[resEvents] = null; + this[resAbortHandlerExpose] = false; + this[resAbortHandler].length = 0; + this[resHeaders] = null; + this.statusCode = 200; + this.id = Math.round(Math.random() * 1e5); + return this; + } + end(body, closeConnection) { + const { mode } = this; + const res = this[response]; + if (res && mode === 'cork') { + res.cork(() => { + this._end(body, closeConnection); + }); + return this; + } + return this._end(body, closeConnection); + } + sse(body) { + const { mode } = this; + const res = this[response]; + this.exposeAborted(); + if (res && mode === 'cork') { + res.cork(() => { + this._sse(body); + }); + return this; + } + return this._sse(body); + } + _sse(body) { + const { mode, statusCode, done, streaming, _headersSet, [resHeaders]: _headers } = this; + const res = this[response]; + if (!done && res && !streaming && !done) { + debug('res.sse(body) called with status %d and has headers', statusCode, _headersSet); + res.writeStatus(httpCodes[statusCode]); + if (mode !== 'immediate') { + if (_headersSet) { + for (const header in _headers) { + const value = _headers[header]; + if (value) { + res.writeHeader(header, value); + } + } + } + } + res.writeHeader('Content-Type', 'text/event-stream; charset=utf-8'); + res.writeHeader('Connection', 'keep-alive'); + res.writeHeader('Cache-Control', 'no-cache, no-store, no-transform'); + body.on('data', (data) => { + if (!this.aborted) { + res.write(data); + } + }); + this.streaming = true; + this[response] = null; + } + return this; + } + _end(body, closeConnection) { + const { mode, statusCode, done, streaming, _headersSet, [resHeaders]: _headers } = this; + const res = this[response]; + if (!done && res && !streaming) { + debug('res.end(body) called with status %d and has headers', statusCode, _headersSet); + res.writeStatus(httpCodes[statusCode]); + if (mode !== 'immediate') { + if (_headersSet) { + for (const header in _headers) { + const value = _headers[header]; + if (value) { + res.writeHeader(header, value); + } + } + } + } + res.end(body, closeConnection); + this.done = true; + this[response] = null; + } + return this; + } + status(code) { + debug('res.status(%d)', code); + this.statusCode = code; + return this; + } + writeHead(code, headers) { + if (typeof code === 'object' && !headers) { + headers = code; + code = 200; + } + if (code !== undefined && code !== 200) { + this.statusCode = code; + } + if (headers !== undefined) { + this.setHeaders(headers); + } + return this; + } + redirect(code, path) { + if (!path && typeof code === 'string') { + path = code; + code = 301; + } + if (path && path.indexOf('/') === -1) { + path = `/${path}`; + } + this.statusCode = code; + this.setHeader('Location', path); + return this.end(); + } + sendStatus(code) { + debug('res.sendStatus(%d)', code); + this.statusCode = code; + return this.end(); + } + send(data, closeConnection) { + const { done, compiledResponse } = this; + if (!done && this[response]) { + if (compiledResponse) { + return this.end(compiledResponse, closeConnection); + } + if (this.serialize) { + return this.end(this.serialize(data), closeConnection); + } + if (typeof data === 'object') { + this.setHeader('Content-Type', 'application/json; charset=utf-8'); + return this.end(JSON.stringify(data, this[resConfig].json_replacer, this[resConfig].json_spaces), closeConnection); + } + return this.end(data, closeConnection); + } + return this; + } + pipe(stream, size, compressed) { + debug('res.pipe(stream, %d, %j)', size, compressed); + return this.stream(stream, size, compressed); + } + stream(stream, size, compressed = false) { + const { mode, [request]: req, [response]: res } = this; + if (req && (!size || Number.isNaN(size)) && req.headers['content-length']) { + size = +req.headers['content-length']; + } + else if ((!size || Number.isNaN(size)) && stream.path) { + ({ size } = statSync(stream.path)); + } + if (res && mode === 'cork') { + res.cork(() => { + this._stream(stream, size, compressed); + }); + return this; + } + return this._stream(stream, size, compressed); + } + _stream(stream, size, compressed = false) { + if (!this.done && this[response] && this[response] !== null) { + const res = this[response]; + const config = this[resConfig]; + const { mode, statusCode, _headersSet, [resHeaders]: _headers } = this; + this.exposeAborted(); + let calledData = !config.enableExpressCompatibility; + if (compressed) { + const compressedStream = this.compressStream(stream); + if (compressedStream) { + stream = compressedStream; + } + } + const onclose = () => { + if (calledData) { + this.done = true; + this.streaming = false; + this.emit('close'); + } + else if (stream.path) { + stream.close(); + warn('res.stream(stream) data was not called, but mimicked by [nanoexpress], performance may be dropped and even can be stuck at responses, so please use official middlewares to avoid such errors'); + this.stream(createReadStream(stream.path), size, compressed); + } + }; + const onfinish = () => { + if (calledData) { + if (typeof stream.close === 'function') { + stream.close(); + } + else { + stream.emit('close'); + } + } + this.emit('finish'); + }; + res.writeStatus(httpCodes[statusCode]); + if (mode !== 'immediate') { + if (_headersSet) { + for (const header in _headers) { + const value = _headers[header]; + if (value) { + res.writeHeader(header, value); + } + } + } + } + if (compressed || !size || Number.isNaN(size)) { + debug('res.stream:compressed(stream, %d, %j)', size, compressed); + stream + .on('data', (buffer) => { + calledData = true; + if (this.aborted || this.done) { + return; + } + res.write(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength)); + }) + .on('close', onclose) + .on('finish', onfinish); + } + else { + debug('res.stream:uncompressed(stream, %d, %j)', size, compressed); + stream.on('data', (buffer) => { + calledData = true; + if (this.done || this.aborted) { + return; + } + buffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); + const lastOffset = res.getWriteOffset(); + const [ok, done] = res.tryEnd(buffer, size); + if (done) { + this.done = true; + } + else if (!ok) { + stream.pause(); + res.onWritable((offset) => { + if (this.done || this.aborted) { + return true; + } + const [writeOk, writeDone] = res.tryEnd(buffer.slice(offset - lastOffset), size); + if (writeDone) { + this.done = true; + } + else if (writeOk) { + stream.resume(); + } + return writeOk; + }); + } + }); + } + stream + .on('error', (error) => { + stream.destroy(error); + this.aborted = true; + this.emit('error', error); + }) + .on('close', onclose) + .on('finish', onfinish); + } + return this; + } + compressStream(stream, options, priority = ['gzip', 'br', 'deflate']) { + const req = this[request]; + if (!req) { + invalid('This method requires active `HttpRequest`. Please load required middleware'); + return null; + } + if (!req.headers) { + invalid('This method requires active `HttpRequest.headers`. Please load required middleware'); + return null; + } + const contentEncoding = req.headers['content-encoding']; + const encoding = priority.find((currentEncoding) => contentEncoding && contentEncoding.indexOf(currentEncoding) !== -1); + let compression = null; + if (encoding === 'br') { + compression = createBrotliCompress(options); + } + else if (encoding === 'gzip') { + compression = createGzip(options); + } + else if (encoding === 'deflare') { + compression = createDeflate(options); + } + if (compression && encoding) { + stream.pipe(compression); + this.setHeader('content-encoding', encoding); + } + return compression; + } + sendFile(path, lastModified = true, compressed = false) { + const req = this[request]; + const headers = req?.headers; + const stat = statSync(path); + let { size } = stat; + if (lastModified) { + const { mtime } = stat; + mtime.setMilliseconds(0); + const mtimeutc = mtime.toUTCString(); + if (headers && headers['if-modified-since']) { + if (new Date(headers['if-modified-since']) >= mtime) { + this.statusCode = 304; + return this.end(); + } + } + this.setHeader('last-modified', mtimeutc); + } + this.setHeader('content-type', getMime(path)); + let start = 0; + let end = 0; + if (headers && headers.range) { + [start, end] = headers.range + .substr(6) + .split('-') + .map((byte) => (byte ? parseInt(byte, 10) : undefined)); + if (end === undefined) { + end = size - 1; + } + if (start !== undefined) { + this.statusCode = 206; + this.setHeader('accept-ranges', 'bytes'); + this.setHeader('content-range', `bytes ${start}-${end}/${size}`); + size = end - start + 1; + } + } + if (end < 0) { + end = 0; + } + const createStreamInstance = end + ? createReadStream(path, { start, end }) + : createReadStream(path); + return this.stream(createStreamInstance, size, compressed); + } + write(chunk) { + const res = this[response]; + if (!this.done && res && !this.streaming) { + debug('res.write(%s)', chunk); + res.write(chunk); + return this; + } + return this; + } + exposeAborted() { + const res = this[response]; + if (!this[resAbortHandlerExpose] && res) { + debug('res.onAborted is exposed'); + res.onAborted(() => { + this.aborted = true; + warn('res.onAborted is called'); + this[resAbortHandler].forEach((callback) => callback()); + }); + this[resAbortHandlerExpose] = true; + } + return this; + } + onAborted(handler) { + this[resAbortHandler].push(handler); + return this; + } + getHeader(key) { + const headers = this[resHeaders]; + if (headers && headers[key]) { + debug("res.getHeader('%s')", key); + return headers[key]; + } + return null; + } + hasHeader(key) { + debug("res.hasHeader('%s')", key); + return this.getHeader(key) !== null; + } + setHeader(key, value) { + const { mode, [response]: res } = this; + debug("res.setHeader('%s', '%s')", key, value); + if (res && mode === 'immediate') { + res.writeHeader(key, value); + return this; + } + if (!this[resHeaders]) { + this[resHeaders] = {}; + } + this._headersSet = true; + const headers = this[resHeaders]; + headers[key] = value; + return this; + } + set(key, value) { + return this.setHeader(key, value); + } + setHeaders(headers) { + const { mode, [response]: res } = this; + if (res && mode === 'immediate') { + warn('res.setHeaders(headers) cannot be set due of immediate mode'); + return this; + } + debug('res.setHeaders(headers)'); + this._headersSet = true; + if (this[resHeaders]) { + Object.assign(this[resHeaders], headers); + } + else { + this[resHeaders] = headers; + } + return this; + } + removeHeader(key) { + const { mode, [response]: res } = this; + if (res && mode === 'immediate') { + warn("res.removeHeader('%s') cannot be set due of immediate mode", key); + return this; + } + debug("res.removeHeader('%s')", key); + const headers = this[resHeaders]; + if (headers && headers[key]) { + headers[key] = null; + } + return this; + } + type(contentType) { + debug('res.type(%s)', contentType); + return this.setHeader('content-type', contentType); + } +} + +var legacyUtil = (middleware) => { + warn('legacy middlewares is deprecated and in future we will remove express.js middlewares support'); + const httpHandler = function legacyMiddlewarePolyfillHandler(req, res) { + return new Promise((resolve, reject) => { + middleware(req, res, (err) => { + if (err) { + reject(err); + } + else { + resolve(); + } + }); + }); + }; + const displayName = middleware.name; + httpHandler.raw = middleware; + httpHandler.displayName = displayName; + return httpHandler; +}; + +class RouteEngine { + constructor(options) { + this.params = false; + this.headers = false; + this.cookies = false; + this.query = false; + this.body = false; + this.property = false; + this.options = options; + this.routes = []; + this.async = false; + this.await = false; + } + parse(incomingRoute) { + const { options: config } = this; + const route = { + ...incomingRoute, + all: false, + regex: false, + fetch_params: false, + async: false, + await: false, + legacy: false, + analyzeBlocks: [] + }; + if (typeof route.path === 'string') { + if (config.ignoreTrailingSlash) { + route.path = slashify(route.path); + route.originalUrl = slashify(route.originalUrl); + } + route.path = fastDecodeURI(route.path); + if (route.baseUrl === '*') { + route.all = true; + } + else if (route.path.indexOf(':') !== -1) { + route.fetch_params = true; + route.param_keys = []; + route.path = pathToRegexp(route.path, route.param_keys); + route.regex = true; + } + else if (route.path.indexOf('/*') !== -1) { + route.baseUrl = route.path.substr(0, route.path.indexOf('/*') + 1); + route.path = route.path.substr(route.baseUrl.length); + route.all = true; + } + else if (route.baseUrl.length > 1 && + route.baseUrl.indexOf('/*') !== -1) { + route.baseUrl = route.baseUrl.substring(0, route.baseUrl.indexOf('/*')); + route.originalUrl = route.originalUrl.substring(0, route.originalUrl.indexOf('/*') + 1); + route.all = true; + } + } + else if (route.path instanceof RegExp) { + route.regex = true; + } + route.async = route.handler.constructor.name === 'AsyncFunction'; + route.await = route.handler.toString().includes('await'); + route.legacy = route.handler.toString().includes('next('); + route.analyzeBlocks = analyze(route.handler); + const usedBlocks = iterateBlocks(route.analyzeBlocks); + if (route.legacy) { + if (config.enableExpressCompatibility) { + route.handler = legacyUtil(route.handler); + route.async = true; + route.await = true; + } + else { + invalid('Express.js compatibility mode is disabled, please enable before using *express.js* middlewares, but take care - performance will not be same as disabled'); + } + } + if (!this.params && route.fetch_params) { + this.params = true; + } + if (!this.async && route.async) { + this.async = true; + } + if (!this.await && route.await) { + this.await = true; + } + usedBlocks.forEach((blockName) => { + if (blockName === 'property') ; + else { + if (!this[blockName]) { + this[blockName] = true; + } + } + }); + debug('route registered [%s] baseurl(%s) path(%s) - originalurl(%s)', route.method, route.baseUrl, route.path, route.originalUrl); + return route; + } + on(method, path, handler, baseUrl, originalUrl) { + if (Array.isArray(method)) { + method.forEach((methodId) => { + this.on(methodId, path, handler, baseUrl, originalUrl); + }); + return this; + } + if (Array.isArray(path)) { + path.forEach((pathId) => { + this.on(method, pathId, handler, baseUrl, originalUrl); + }); + return this; + } + if (Array.isArray(handler)) { + handler.forEach((handlerId) => { + this.on(method, path, handlerId, baseUrl, originalUrl); + }); + return this; + } + this.routes.push(this.parse({ method, path, baseUrl, originalUrl, handler })); + _gc(); + return this; + } + off(method, path, handler, baseUrl, originalUrl) { + const parsed = this.parse({ method, path, baseUrl, originalUrl, handler }); + if (!handler) { + this.routes = this.routes.filter((route) => !(route.method === parsed.method && route.path === parsed.path)); + } + else { + this.routes = this.routes.filter((route) => !(route.method === parsed.method && + route.path === parsed.path && + route.handler === parsed.handler)); + } + _gc(); + return this; + } + async lookup(req, res) { + const { routes, options } = this; + let response; + for (let i = 0, len = routes.length; i < len; i += 1) { + const route = routes[i]; + if (res.done) { + debug('routes lookup early exit'); + return res; + } + if (route.method === 'ANY' || route.method === req.method) { + let found = false; + if (route.all) { + found = + route.path && route.path !== '*' + ? req.path.includes(route.path) + : route.originalUrl === '*' || + req.originalUrl.substr(route.originalUrl.length).length > 1; + } + else if (route.regex && route.path.test(req.path)) { + found = true; + } + else if (route.path === req.path && route.baseUrl === req.baseUrl) { + found = true; + } + else if (route.originalUrl === req.originalUrl) { + found = true; + } + if (found) { + if (route.fetch_params && route.param_keys) { + const exec = route.path.exec(req.path); + req.params = {}; + for (let p = 0, lenp = route.param_keys.length; exec && p < lenp; p += 1) { + const key = route.param_keys[p].name; + const value = exec[p + 1]; + req.params[key] = value; + } + } + if (options.enableExpressCompatibility && + route.baseUrl !== '' && + route.baseUrl !== '*' && + req.path.indexOf(route.baseUrl) === 0) { + req.baseUrl = route.baseUrl; + req.path = req.originalUrl.substr(req.baseUrl.length); + req.url = req.originalUrl.substr(req.baseUrl.length); + } + if (route.async || route.legacy) { + response = await route.handler(req, res); + } + else { + response = route.handler(req, res); + } + if (res.streaming || res.done || response === res) { + debug('routes lookup was done with HttpResponse'); + return res; + } + if (!res.streaming && !res.done && response) { + debug('routes lookup was done with async json result'); + return res.send(response); + } + debug('routes lookup was done without any match'); + } + else { + debug('routes lookup was not found without any match'); + } + } + } + } +} + +class Router { + constructor() { + this[routerInstances] = []; + this[wsInstances] = []; + this._basePath = ''; + return this; + } + on(method, path, handlers, baseUrl, originalUrl) { + const { _engine } = this; + if (_engine) { + _engine.on(method, path, handlers, baseUrl, originalUrl); + } + else if (Array.isArray(handlers)) { + handlers.forEach((handler) => { + this[routerInstances].push({ + method, + path, + baseUrl, + handler, + originalUrl + }); + }); + } + else { + this[routerInstances].push({ + method, + path, + baseUrl, + handler: handlers, + originalUrl + }); + } + return this; + } + use(path, ...middlewares) { + if (typeof path === 'function' || path instanceof Router) { + middlewares.unshift(path); + path = '*'; + } + if (Array.isArray(path)) { + if (path.every((routePath) => typeof routePath === 'function' || path instanceof Router)) { + return this.use('*', ...path); + } + } + middlewares.forEach((handler) => { + if (handler instanceof Router) { + const _routers = handler[routerInstances]; + const _ws = handler[wsInstances]; + handler[appInstance] = this; + handler._basePath = path; + _routers.forEach(({ method, path: routePath, handler: routeHandler, baseUrl }) => { + this.on(method, routePath, routeHandler, path, path + baseUrl + routePath); + }); + this[wsInstances].push(..._ws); + _routers.length = 0; + _ws.length = 0; + } + else if (Array.isArray(handler)) { + this.use(path, ...handler); + } + else { + this.on('ANY', '*', handler, path, this._basePath + path); + } + }); + _gc(); + return this; + } + get(path, ...handlers) { + return this.on('GET', path, handlers, this._basePath, ''); + } + post(path, ...handlers) { + return this.on('POST', path, handlers, this._basePath, ''); + } + put(path, ...handlers) { + return this.on('PUT', path, handlers, this._basePath, ''); + } + options(path, ...handlers) { + return this.on('OPTIONS', path, handlers, this._basePath, ''); + } + del(path, ...handlers) { + return this.on('DEL', path, handlers, this._basePath, ''); + } + delete(path, ...handlers) { + return this.del(path, ...handlers); + } + all(path, ...handlers) { + return this.on('ANY', path, handlers, this._basePath, ''); + } + ws(path, options) { + const normalisedPath = this._basePath === '*' + ? '*' + : path === '/' + ? this._basePath + : `${this._basePath}${path}`; + this[wsInstances].push({ + path: normalisedPath, + options + }); + return this; + } + publish(topic, message, isBinary, compress) { + const app = this[appInstance]; + if (app) { + return app.publish(topic, message, isBinary, compress); + } + invalid('nanoexpress [Router]: Please attach to `Application` before using publish'); + return false; + } +} + +class App extends Router { + constructor(options, app) { + super(); + this._options = options; + this._app = app; + this._engine = new RouteEngine(options); + this.defaultRoute = (_, res) => { + return res.status(404).send({ status: 'error', code: 404 }); + }; + this.errorRoute = (err, _, res) => { + return res.status(500).send({ + status: 'error', + message: err.message + }); + }; + this._ws = []; + this._requestPools = []; + this._responsePools = []; + this._poolsSize = options.poolSize || 10; + this.time = process.hrtime(); + this._separateServed = false; + this._ran = false; + this._instance = {}; + return this; + } + get https() { + return this._options.https !== undefined; + } + get _console() { + return this._options.console || console; + } + get raw() { + return this._app; + } + setNotFoundHandler(handler) { + this.defaultRoute = handler; + return this; + } + setErrorHandler(handler) { + this.errorRoute = handler; + return this; + } + handleError(error, req, res) { + if (res && !res.aborted && !res.done && !res.streaming && this.errorRoute) { + this.errorRoute(error, req, res); + } + return this; + } + ws(path, options) { + this._app.ws(path, options); + return this; + } + publish(topic, message, isBinary, compress) { + return this._app.publish(topic, message, isBinary, compress); + } + run() { + const { _app: app, _options: options, _ws, _requestPools, _responsePools, _poolsSize, _engine, _ran } = this; + if (!_ran) { + const handler = async (rawRes, rawReq) => { + let req; + let res; + let response; + if (_requestPools.length > 0) { + req = _requestPools.shift(); + req.setRequest(rawReq, rawRes); + } + else { + req = new HttpRequest(options); + req.setRequest(rawReq, rawRes); + } + if (_responsePools.length > 0) { + res = _responsePools.shift(); + res.setResponse(rawRes, req); + } + else { + res = new HttpResponse(options); + res.setResponse(rawRes, req); + } + if (options.ignoreTrailingSlash && + req.path.charAt(req.path.length - 1) !== '/' && + (req.path.lastIndexOf('.') === -1 || + req.path.lastIndexOf('.') < req.path.length - 4)) { + if (options.enableExpressCompatibility) { + debug('res.redirect called instead of fast quick-fix on route ending without "/" for express.js middlewares compatibility'); + res.redirect(`http://${req.headers.host}${req.originalUrl}/`); + return rawRes; + } + } + if (req.method === 'POST' || req.method === 'PUT') { + res.exposeAborted(); + rawRes.onData((arrayChunk, isLast) => { + req.stream.push(Buffer.from(arrayChunk.slice(0))); + if (isLast) { + req.stream.push(null); + } + }); + } + if (res.aborted || res.done || req.method === 'OPTIONS') { + debug('early returned ranning %o', { + aborted: res.aborted, + done: res.done, + method: req.method + }); + return; + } + if (_engine.async && _engine.await) { + res.exposeAborted(); + response = await _engine.lookup(req, res).catch((err) => { + this.handleError(err, req, res); + }); + if (res[resAbortHandler]) { + res.onAborted(unregister); + } + else { + unregister(); + } + if (_requestPools.length < _poolsSize) { + _requestPools.push(req); + } + if (_responsePools.length < _poolsSize) { + _responsePools.push(res); + } + return rawRes; + } + await _engine.lookup(req, res).catch((err) => { + this.handleError(err, req, res); + }); + if (res[resAbortHandler]) { + res.onAborted(unregister); + } + else { + unregister(); + } + if (_requestPools.length < _poolsSize) { + _requestPools.push(req); + } + if (_responsePools.length < _poolsSize) { + _responsePools.push(res); + } + if (res && + !res.done && + !res.streaming && + response === undefined && + this.defaultRoute !== null) { + debug('routes lookup was not found any route, fallback to not-found'); + const notFound = await this.defaultRoute(req, res); + if (notFound !== res) { + res.send(notFound); + } + } + return rawRes; + }; + app.any('/*', handler); + _ws.forEach(({ path, options: wsOptions }) => { + app.ws(path, wsOptions); + }); + _ws.length = 0; + _gc(); + this._ran = true; + } + return this; + } + listenSocket(port, host = 'localhost', is_ssl = false, handler = noop) { + const { _options: options } = this; + if ((port === 80 || port === 443) && + this.https && + options.https?.separateServer && + !this._separateServed) { + const httpsPort = typeof options.https.separateServer === 'number' + ? options.https.separateServer + : 443; + this._separateServed = true; + return Promise.all([ + this.listenSocket(port, host, false, handler), + this.listenSocket(httpsPort, host, true, handler) + ]); + } + return this._appApplyListen(host, port, is_ssl, handler); + } + listen(...args) { + let port = 8000; + let host = 'localhost'; + let ssl = false; + let handler = () => { }; + args.forEach((listenArg) => { + if (typeof +listenArg === 'number' && !Number.isNaN(+listenArg)) { + port = +listenArg; + } + else if (typeof listenArg === 'function') { + handler = listenArg; + } + else if (typeof listenArg === 'string' && + (listenArg === 'localhost' || listenArg.includes('.'))) { + host = listenArg; + } + else if (listenArg === true) { + ssl = true; + } + }); + this.run(); + return this.listenSocket(port, host, ssl, handler); + } + close(port, host = 'localhost') { + const id = `${host}:${port}`; + const token = this._instance[id]; + this._separateServed = false; + this.time[0] = 0; + this.time[1] = 0; + return this._close(token, id); + } + _appApplyListen(host, port, is_ssl = false, handler = noop) { + const { _console, _options: options, _app: app } = this; + const sslString = is_ssl ? 'HTTPS ' : is_ssl === false ? 'HTTP ' : ''; + return new Promise((resolve, reject) => { + if (port === undefined) { + const _errorContext = 'error' in _console ? _console : console; + _errorContext.error('[Server]: PORT is required'); + return undefined; + } + const id = `${host}:${port}`; + const onListenHandler = (token) => { + if (token) { + const _debugContext = 'debug' in _console ? _console : console; + const end = process.hrtime(this.time); + this._instance[id] = token; + _debugContext.debug(`[${sslString}Server]: started successfully at [${id}] in [${((Number(end[0]) * 1000 + Number(end[1])) / + 1000000).toFixed(2)}ms] on PID[${process.pid}]`); + _gc(); + handler(); + return resolve(token); + } + const _errorContext = 'error' in _console ? _console : console; + const err = new Error(this.https && + (!options.https || + !options.https.cert_file_name || + !options.https.key_file_name) + ? `[${sslString}Server]: SSL certificate was not defined or loaded` + : `[${sslString}Server]: failed to host at [${id}]`); + _errorContext.error(err.message); + _gc(); + return reject(err); + }; + if (host && host !== 'localhost') { + app.listen(host, port, onListenHandler); + } + else { + app.listen(port, onListenHandler); + } + }); + } + _close(token, id) { + const { _console } = this; + if (token) { + const _debugContext = 'debug' in _console ? _console : console; + uWS.us_listen_socket_close(token); + this._instance[id] = null; + _debugContext.debug('[Server]: stopped successfully'); + _gc(); + return true; + } + const _errorContext = 'error' in _console ? _console : console; + _errorContext.error('[Server]: Error, failed while stopping'); + _gc(); + return false; + } + disable(tag) { + warn(`[Server]: The tag [${tag}] cannot be disabled as not set, not supported and not available`); + return this; + } + set(key, value) { + this._options[key] = value; + return this; + } +} + +function exposeWebsocket(handler, options = {}) { + if (typeof options.open === 'function') { + return options; + } + return { + ...options, + open(ws) { + ws.emit('connection', ws); + }, + async upgrade(res, req, context) { + const secWsKey = req.getHeader('sec-websocket-key'); + const secWsProtocol = req.getHeader('sec-websocket-protocol'); + const secWsExtensions = req.getHeader('sec-websocket-extensions'); + const events = new EventsEmitter(); + res.on = events.on.bind(events); + res.once = events.once.bind(events); + res.off = events.off.bind(events); + res.emit = events.emit.bind(events); + let aborted = false; + res.onAborted(() => { + aborted = true; + events.emit('error', { aborted }); + }); + res.emit('upgrade', req, res); + try { + await handler(req, res); + } + catch (error) { + aborted = true; + events.emit('error', error); + } + if (!aborted) { + events.emit('willUpgrade', req); + res.upgrade({ req, ...res }, secWsKey, secWsProtocol, secWsExtensions, context); + events.emit('upgraded', req); + } + }, + message: (ws, message, isBinary) => { + ws.emit('message', message, isBinary); + }, + drain: (ws) => { + ws.emit('drain', ws.getBufferedAmount()); + }, + close: (ws, code, message) => { + ws.emit('close', code, message); + } + }; +} + +const useCallback = register(false, true); +const useEffect = register(true); +const useMemo = register(true, true); +const useState = (initialValue) => { + let value = useMemo(() => initialValue, []); + const setValue = (newValue) => { + value = newValue; + }; + return [value, setValue]; +}; +const useRef = (ref, dependencies) => useMemo(() => ({ current: ref ?? null }), dependencies); + +const nanoexpress = (options = { + ignoreTrailingSlash: true, + enableExpressCompatibility: false, + responseMode: 'cork' +}) => { + let app; + if (options.https) { + app = uWS.SSLApp(options.https); + } + else if (options.http) { + app = uWS.App(options.http); + } + else { + app = uWS.App(); + } + return new App(options, app); +}; +nanoexpress.Router = Router; +nanoexpress.App = App; +nanoexpress.exposeWebsocket = exposeWebsocket; + +export { nanoexpress as default, useCallback, useEffect, useMemo, useRef, useState }; +//# sourceMappingURL=nanoexpress.js.map diff --git a/esm/nanoexpress.js.map b/esm/nanoexpress.js.map new file mode 100644 index 00000000..c80981ce --- /dev/null +++ b/esm/nanoexpress.js.map @@ -0,0 +1 @@ +{"version":3,"file":"nanoexpress.js","sources":["../src/constants.ts","../src/helpers/gc.ts","../src/helpers/loggy.ts","../src/hooks/manager.ts","../src/helpers/http-codes.ts","../src/helpers/http-methods.ts","../src/helpers/invalid.ts","../src/helpers/iterate-blocks.ts","../src/helpers/mime.ts","../src/helpers/slashify.ts","../src/helpers/noop.ts","../src/polyfills/http-request.ts","../src/polyfills/http-response.ts","../src/utils/legacy.ts","../src/route-engine.ts","../src/router.ts","../src/app.ts","../src/exposes/websocket.ts","../src/hooks/index.ts","../src/nanoexpress.ts"],"sourcesContent":["// Http(Request/Response)\nexport const request: unique symbol = Symbol('NanoexpressHttpRequestInstance');\nexport const response: unique symbol = Symbol(\n 'NanoexpressHttpResponseInstance'\n);\n\n// HttpRequest symbols\n\nexport const reqConfig: unique symbol = Symbol('NanoexpressHttpRequestConfig');\nexport const reqEvents: unique symbol = Symbol('NanoexpressHttpRequestEvents');\nexport const reqRequest: unique symbol = Symbol(\n 'NanoexpressHttpRequestRawInstance'\n);\nexport const reqRawResponse: unique symbol = Symbol(\n 'NanoexpressHttpResponseRawInstance'\n);\n\n// HttpResponse symbols\nexport const resHeaders: unique symbol = Symbol(\n 'NanoexpressHttpResponseHeaders'\n);\nexport const resConfig: unique symbol = Symbol('NanoexpressHttpResponseConfig');\nexport const resEvents: unique symbol = Symbol('NanoexpressHttpResponseEvents');\nexport const resAbortHandler: unique symbol = Symbol(\n 'NanoexpressHttpResponseAbortHandler'\n);\nexport const resAbortHandlerExpose: unique symbol = Symbol(\n 'NanoexpressHttpResponseAbortHandlerExpose'\n);\n\nexport const appInstance: unique symbol = Symbol('NanoexpressAppInstance');\nexport const routerInstances: unique symbol = Symbol(\n 'NanoexpressRouterInstances'\n);\nexport const wsInstances: unique symbol = Symbol(\n 'NanoexpressWebSocketInstances'\n);\n","export default function _gc(): boolean {\n try {\n if (global.gc) {\n global.gc();\n }\n return true;\n } catch (e) {\n return false;\n }\n}\n","import debugLog from 'debug';\n\nexport const debug = debugLog('nanoexpress');\nexport const error = debugLog('nanoexpress:error');\n\nexport const warn = debugLog('nanoexpress:warn');\n","export type Dependencies = Array;\n\ninterface ICallbackState {\n handler: () => never;\n dependencies: Dependencies;\n isEffect: boolean;\n mounted: boolean;\n}\n\nconst lastDeps: Dependencies[] = [];\nconst callbacks: ICallbackState[] = [];\nlet hookIndex = 0;\n\nconst register =\n (runValue = false, returnValue = false) =>\n (\n callback: (...args: any[]) => any,\n dependencies: Dependencies\n ): (() => any) | any => {\n if (\n !dependencies ||\n !lastDeps[hookIndex] ||\n !lastDeps[hookIndex].every(\n (dep, depIndex) => dep === dependencies[depIndex]\n )\n ) {\n callbacks[hookIndex] = {\n handler: runValue ? callback() : callback,\n dependencies,\n isEffect: runValue && !returnValue,\n mounted: runValue\n };\n lastDeps[hookIndex] = dependencies;\n }\n\n const _callback = callbacks[hookIndex].handler;\n hookIndex += 1;\n\n if (returnValue) {\n return _callback;\n }\n };\nconst unregister = (): void => {\n callbacks.forEach((callback) => {\n if (\n callback.isEffect &&\n callback.mounted &&\n typeof callback.handler === 'function'\n ) {\n callback.handler();\n callback.mounted = false;\n }\n });\n hookIndex = 0;\n};\n\nexport { register, unregister };\n","import { STATUS_CODES } from 'http';\n\nconst codesBetween = Array.from({ length: 500 })\n .fill(0)\n .map((_, index) => 100 + index);\n\nconst httpCodes = codesBetween.reduce((codes, code) => {\n const codeString = STATUS_CODES[code];\n if (codeString) {\n codes[code] = `${code} ${codeString}`;\n }\n return codes;\n}, {} as Record);\n\nexport default httpCodes;\n","import { HttpMethod } from '../../types/nanoexpress';\n\nexport default [\n 'get',\n 'post',\n 'put',\n 'patch',\n 'del',\n 'any',\n 'head',\n 'options',\n 'trace'\n].map((m) => m.toUpperCase()) as HttpMethod[];\n","export default function invalid(message: string): void {\n throw new Error(message);\n}\n","import {\n BlockMode,\n IBlock\n} from '@nanoexpress/route-syntax-parser/types/interfaces';\n\nexport default (blocks: IBlock[]): BlockMode[] => {\n return [...new Set(blocks.map((block) => block.mode))];\n};\n","const mimes = {\n '3gp': 'video/3gpp',\n a: 'application/octet-stream',\n ai: 'application/postscript',\n aif: 'audio/x-aiff',\n aiff: 'audio/x-aiff',\n asc: 'application/pgp-signature',\n asf: 'video/x-ms-asf',\n asm: 'text/x-asm',\n asx: 'video/x-ms-asf',\n atom: 'application/atom+xml',\n au: 'audio/basic',\n avi: 'video/x-msvideo',\n bat: 'application/x-msdownload',\n bin: 'application/octet-stream',\n bmp: 'image/bmp',\n bz2: 'application/x-bzip2',\n c: 'text/x-c',\n cab: 'application/vnd.ms-cab-compressed',\n cc: 'text/x-c',\n chm: 'application/vnd.ms-htmlhelp',\n class: 'application/octet-stream',\n com: 'application/x-msdownload',\n conf: 'text/plain',\n cpp: 'text/x-c',\n crt: 'application/x-x509-ca-cert',\n css: 'text/css',\n csv: 'text/csv',\n cxx: 'text/x-c',\n deb: 'application/x-debian-package',\n der: 'application/x-x509-ca-cert',\n diff: 'text/x-diff',\n djv: 'image/vnd.djvu',\n djvu: 'image/vnd.djvu',\n dll: 'application/x-msdownload',\n dmg: 'application/octet-stream',\n doc: 'application/msword',\n dot: 'application/msword',\n dtd: 'application/xml-dtd',\n dvi: 'application/x-dvi',\n ear: 'application/java-archive',\n eml: 'message/rfc822',\n eps: 'application/postscript',\n exe: 'application/x-msdownload',\n f: 'text/x-fortran',\n f77: 'text/x-fortran',\n f90: 'text/x-fortran',\n flv: 'video/x-flv',\n for: 'text/x-fortran',\n gem: 'application/octet-stream',\n gemspec: 'text/x-script.ruby',\n gif: 'image/gif',\n gz: 'application/x-gzip',\n h: 'text/x-c',\n hh: 'text/x-c',\n htm: 'text/html',\n html: 'text/html',\n ico: 'image/vnd.microsoft.icon',\n ics: 'text/calendar',\n ifb: 'text/calendar',\n iso: 'application/octet-stream',\n jar: 'application/java-archive',\n java: 'text/x-java-source',\n jnlp: 'application/x-java-jnlp-file',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n js: 'application/javascript',\n json: 'application/json',\n log: 'text/plain',\n m3u: 'audio/x-mpegurl',\n m4v: 'video/mp4',\n man: 'text/troff',\n mathml: 'application/mathml+xml',\n mbox: 'application/mbox',\n mdoc: 'text/troff',\n me: 'text/troff',\n mid: 'audio/midi',\n midi: 'audio/midi',\n mime: 'message/rfc822',\n mjs: 'application/javascript',\n mml: 'application/mathml+xml',\n mng: 'video/x-mng',\n mov: 'video/quicktime',\n mp3: 'audio/mpeg',\n mp4: 'video/mp4',\n mp4v: 'video/mp4',\n mpeg: 'video/mpeg',\n mpg: 'video/mpeg',\n ms: 'text/troff',\n msi: 'application/x-msdownload',\n odp: 'application/vnd.oasis.opendocument.presentation',\n ods: 'application/vnd.oasis.opendocument.spreadsheet',\n odt: 'application/vnd.oasis.opendocument.text',\n ogg: 'application/ogg',\n p: 'text/x-pascal',\n pas: 'text/x-pascal',\n pbm: 'image/x-portable-bitmap',\n pdf: 'application/pdf',\n pem: 'application/x-x509-ca-cert',\n pgm: 'image/x-portable-graymap',\n pgp: 'application/pgp-encrypted',\n pkg: 'application/octet-stream',\n pl: 'text/x-script.perl',\n pm: 'text/x-script.perl-module',\n png: 'image/png',\n pnm: 'image/x-portable-anymap',\n ppm: 'image/x-portable-pixmap',\n pps: 'application/vnd.ms-powerpoint',\n ppt: 'application/vnd.ms-powerpoint',\n ps: 'application/postscript',\n psd: 'image/vnd.adobe.photoshop',\n py: 'text/x-script.python',\n qt: 'video/quicktime',\n ra: 'audio/x-pn-realaudio',\n rake: 'text/x-script.ruby',\n ram: 'audio/x-pn-realaudio',\n rar: 'application/x-rar-compressed',\n rb: 'text/x-script.ruby',\n rdf: 'application/rdf+xml',\n roff: 'text/troff',\n rpm: 'application/x-redhat-package-manager',\n rss: 'application/rss+xml',\n rtf: 'application/rtf',\n ru: 'text/x-script.ruby',\n s: 'text/x-asm',\n sgm: 'text/sgml',\n sgml: 'text/sgml',\n sh: 'application/x-sh',\n sig: 'application/pgp-signature',\n snd: 'audio/basic',\n so: 'application/octet-stream',\n svg: 'image/svg+xml',\n svgz: 'image/svg+xml',\n swf: 'application/x-shockwave-flash',\n t: 'text/troff',\n tar: 'application/x-tar',\n tbz: 'application/x-bzip-compressed-tar',\n tcl: 'application/x-tcl',\n tex: 'application/x-tex',\n texi: 'application/x-texinfo',\n texinfo: 'application/x-texinfo',\n text: 'text/plain',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n torrent: 'application/x-bittorrent',\n tr: 'text/troff',\n txt: 'text/plain',\n vcf: 'text/x-vcard',\n vcs: 'text/x-vcalendar',\n vrml: 'model/vrml',\n war: 'application/java-archive',\n wav: 'audio/x-wav',\n wma: 'audio/x-ms-wma',\n wmv: 'video/x-ms-wmv',\n wmx: 'video/x-ms-wmx',\n wrl: 'model/vrml',\n wsdl: 'application/wsdl+xml',\n xbm: 'image/x-xbitmap',\n xhtml: 'application/xhtml+xml',\n xls: 'application/vnd.ms-excel',\n xml: 'application/xml',\n xpm: 'image/x-xpixmap',\n xsl: 'application/xml',\n xslt: 'application/xslt+xml',\n yaml: 'text/yaml',\n yml: 'text/yaml',\n zip: 'application/zip',\n default: 'text/html'\n};\n\ntype valueof = T[keyof T];\n\nconst getMime = (path: string): valueof | undefined => {\n const i = Number(path.lastIndexOf('.'));\n return mimes[path.substr(i + 1).toLowerCase() as keyof typeof mimes];\n};\n\nexport { getMime, mimes };\n","export default (path: string): string =>\n path !== '*' &&\n path.charAt(path.length - 1) !== '/' &&\n path.charAt(path.length - 1) !== '*' &&\n (path.lastIndexOf('.') === -1 || path.lastIndexOf('.') < path.length - 4)\n ? `${path}/`\n : path;\n","export default (): void => {};\n","/* eslint-disable max-lines, max-lines-per-function */\nimport { EventEmitter } from 'events';\nimport queryParse from 'fast-query-parse';\nimport { Readable, Writable } from 'stream';\nimport {\n HttpRequest as uWS_HttpRequest,\n HttpResponse as uWS_HttpResponse\n} from 'uWebSockets.js';\nimport { RequestSchema, RequestSchemaWithBody } from '../../types/find-route';\nimport { HttpMethod, INanoexpressOptions } from '../../types/nanoexpress';\nimport { reqConfig, reqEvents, reqRawResponse, reqRequest } from '../constants';\nimport { invalid } from '../helpers';\n\nexport default class HttpRequest<\n THttpMethod = HttpMethod,\n THttpSchema extends RequestSchemaWithBody = RequestSchema\n> {\n protected [reqConfig]: INanoexpressOptions;\n\n protected [reqEvents]: EventEmitter | null;\n\n protected [reqRequest]: uWS_HttpRequest;\n\n protected [reqRawResponse]: uWS_HttpResponse;\n\n protected registered: boolean;\n\n baseUrl!: string;\n\n url!: string;\n\n originalUrl!: string;\n\n path!: string;\n\n method!: THttpMethod;\n\n headers!: THttpSchema['headers'];\n\n params?: THttpSchema['params'];\n\n body?: THttpSchema['body'];\n\n query: THttpSchema['query'] = null;\n\n stream!: Readable;\n\n id = 0;\n\n constructor(options: INanoexpressOptions) {\n this[reqConfig] = options;\n\n this.registered = false;\n\n return this;\n }\n\n setRequest(req: uWS_HttpRequest, res: uWS_HttpResponse): this {\n const options = this[reqConfig];\n\n this[reqRequest] = req;\n this[reqRawResponse] = res;\n\n const query = req.getQuery();\n const url = req.getUrl();\n\n this.url = url;\n this.originalUrl = this.url;\n this.path = url;\n this.baseUrl = '';\n\n this.method = req.getMethod().toUpperCase() as unknown as THttpMethod;\n\n this.headers = {};\n req.forEach((key, value) => {\n (this.headers as RequestSchema['headers'])[key] = value;\n });\n\n if (url.charAt(url.length - 1) !== '/') {\n this.url += '/';\n this.path += '/';\n this.originalUrl += '/';\n }\n\n if (options.enableExpressCompatibility && query) {\n this.originalUrl += `?${query}`;\n }\n this.query = queryParse(query);\n\n // @ts-ignore\n if (this.method === 'POST' || this.method === 'PUT') {\n // Imitiate some modes\n this.stream = new Readable({ read(): void {} });\n\n // Protected variables\n this[reqEvents] = null;\n this.registered = false;\n }\n\n // eslint-disable-next-line security-node/detect-insecure-randomness\n this.id = Math.round(Math.random() * 1e5);\n\n return this;\n }\n\n on(event: string, listener: (...args: any[]) => void): this {\n const { stream } = this;\n if (stream) {\n stream.on(event, listener);\n }\n return this;\n }\n\n emit(event: string, ...args: any[]): this {\n const { stream } = this;\n if (stream) {\n stream.emit(event, ...args);\n }\n return this;\n }\n\n getHeader(key: string): string {\n return this.headers[key];\n }\n\n hasHeader(key: string): boolean {\n return !!this.headers[key];\n }\n\n getParameter(index: number): string {\n return this[reqRequest].getParameter(index);\n }\n\n pipe(destination: Writable): Writable | void | Promise {\n const { stream } = this;\n\n if (stream.readableDidRead || stream.readableEnded) {\n return invalid('Stream already used, cannot use one stream twice');\n }\n\n if (stream) {\n return stream.pipe(destination);\n }\n return invalid(\n 'Stream was not defined, something wrong, please check your code or method is not a POST or PUT'\n );\n }\n\n async *[Symbol.asyncIterator](): any {\n const { stream } = this;\n\n if (stream) {\n for await (const chunk of stream) {\n yield chunk;\n }\n }\n }\n}\n","/* eslint-disable max-lines, max-lines-per-function, complexity, max-depth */\nimport { EventEmitter } from 'events';\nimport { createReadStream, ReadStream, statSync } from 'fs';\nimport uWS, { RecognizedString } from 'uWebSockets.js';\nimport {\n BrotliCompress,\n BrotliOptions,\n createBrotliCompress,\n createDeflate,\n createGzip,\n Deflate,\n Gzip,\n ZlibOptions\n} from 'zlib';\nimport { INanoexpressOptions } from '../../types/nanoexpress';\nimport {\n request as resRequest,\n resAbortHandler,\n resAbortHandlerExpose,\n resConfig,\n resEvents,\n resHeaders,\n response as resResponse\n} from '../constants';\nimport { debug, getMime, httpCodes, invalid, warn } from '../helpers';\nimport HttpRequest from './http-request';\n\n/**\n * HttpResponse class\n * @constructor\n * @class\n * @namespace nanoexpress.HttpResponse\n * @memberof nanoexpress\n * @example new HttpResponse().setResponse(uWS.HttpResponse)\n */\nclass HttpResponse {\n public [resRequest]: HttpRequest | null;\n\n public [resResponse]: uWS.HttpResponse | null;\n\n // Expose functionality properties\n protected [resHeaders]: Record | null;\n\n protected [resAbortHandler]: (() => void)[];\n\n protected [resAbortHandlerExpose]: boolean;\n\n protected [resConfig]: INanoexpressOptions;\n\n protected [resEvents]: EventEmitter | null;\n\n public done: boolean;\n\n public aborted: boolean;\n\n public streaming: boolean;\n\n protected _headersSet = false;\n\n protected registered: boolean;\n\n protected mode: 'immediate' | 'queue' | 'cork' = 'queue';\n\n public serialize?: (\n data: Record | string | number | boolean\n ) => string;\n\n public compiledResponse?: string;\n\n public statusCode: number;\n\n id = 0;\n\n constructor(config: INanoexpressOptions) {\n this[resConfig] = config;\n this.done = false;\n this.aborted = false;\n this._headersSet = false;\n this.registered = false;\n this.streaming = false;\n this[resEvents] = null;\n this[resAbortHandler] = [];\n this[resAbortHandlerExpose] = false;\n\n this[resRequest] = null;\n this[resResponse] = null;\n this[resHeaders] = null;\n\n this.mode = config.responseMode;\n\n this.statusCode = 200;\n }\n\n protected registerEvents(): this {\n const emitter = this[resEvents];\n\n if (emitter && !this.registered) {\n this.exposeAborted();\n\n emitter\n .on('pipe', (stream) => {\n debug('stream.pipe(res)');\n\n this.streaming = true;\n this.stream(stream);\n })\n .on('data', () => {\n debug('stream.pipe(res):data event');\n })\n\n .on('unpipe', () => {\n debug('stream.unpipe(res)');\n\n this.aborted = true;\n })\n .on('error', () => {\n debug('stream.pipe(res) error');\n this.aborted = true;\n this.end();\n });\n this.registered = true;\n }\n\n return this;\n }\n\n /**\n * Registers event to response\n * @param eventName Event name\n * @param eventArgument Any argument\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.on('end', (eventArgument) => {...})\n */\n on(\n eventName: string | symbol,\n eventArgument: (eventArgument?: unknown) => void\n ): this {\n let emitter = this[resEvents];\n\n if (!emitter) {\n this[resEvents] = new EventEmitter();\n }\n emitter = this[resEvents] as EventEmitter;\n emitter.on(eventName, eventArgument);\n\n debug('res.on(%s, handler)', eventName);\n\n this.registerEvents();\n\n return this;\n }\n\n /**\n * Registers event to response to be fired once\n * @param eventName Event name\n * @param eventArgument Any argument\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.once('end', (eventArgument) => {...})\n */\n once(\n eventName: string | symbol,\n eventArgument: (eventArgument?: unknown) => void\n ): this {\n let emitter = this[resEvents];\n\n if (!emitter) {\n this[resEvents] = new EventEmitter();\n }\n emitter = this[resEvents] as EventEmitter;\n emitter.once(eventName, eventArgument);\n\n debug('res.once(%s, handler)', eventName);\n\n this.registerEvents();\n\n return this;\n }\n\n /**\n * Removes event from response\n * @param eventName Event name\n * @param eventArgument Any argument\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.off('end', (eventArgument) => {...})\n */\n off(\n eventName: string | symbol,\n eventArgument: (eventArgument?: unknown) => void\n ): this {\n let emitter = this[resEvents];\n\n if (!emitter) {\n return this;\n }\n emitter = this[resEvents] as EventEmitter;\n emitter.off(eventName, eventArgument);\n\n debug('res.off(%s, handler)', eventName);\n\n this.registerEvents();\n\n return this;\n }\n\n /**\n * Removes listener from response\n * @param eventName Event name\n * @param eventArgument Any argument\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.removeListener('end', (eventArgument) => {...})\n */\n removeListener(\n eventName: string | symbol,\n eventArgument: (eventArgument?: unknown) => void\n ): this {\n let emitter = this[resEvents];\n\n if (!emitter) {\n return this;\n }\n emitter = this[resEvents] as EventEmitter;\n emitter.removeListener(eventName, eventArgument);\n\n debug('res.removeListener(%s, handler)', eventName);\n\n this.registerEvents();\n\n return this;\n }\n\n /**\n * Emits event to response\n * @param eventName Event name\n * @param eventArgument Any argument\n * @returns Emit response\n * @memberof nanoexpress.HttpResponse\n * @example res.emit('end', 1)\n */\n emit(eventName: string | symbol, eventArgument?: never): boolean {\n let emitter = this[resEvents];\n\n if (!emitter) {\n this[resEvents] = new EventEmitter();\n }\n debug('res.emit(%s, argument)', eventName);\n\n emitter = this[resEvents] as EventEmitter;\n return emitter.emit(eventName, eventArgument);\n }\n\n /**\n * Set new HttpResponse for current pool\n * @param res Native uWS.HttpResponse instance\n * @param req HttpResponse instance\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.setResponse(res, req)\n */\n setResponse(res: uWS.HttpResponse, req: HttpRequest): this {\n this[resRequest] = req;\n this[resResponse] = res;\n this.done = false;\n this.aborted = res.aborted || false;\n this._headersSet = false;\n this.streaming = false;\n this.registered = false;\n this[resEvents] = null;\n this[resAbortHandlerExpose] = false;\n this[resAbortHandler].length = 0;\n\n this[resHeaders] = null;\n this.statusCode = 200;\n\n // eslint-disable-next-line security-node/detect-insecure-randomness\n this.id = Math.round(Math.random() * 1e5);\n\n return this;\n }\n\n // Native methods re-implementing\n /**\n * Ends this response by copying the contents of body.\n * @param body Body content\n * @param closeConnection Gives boolean to connection statement\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.end('text');\n */\n end(body?: uWS.RecognizedString, closeConnection?: boolean): this {\n const { mode } = this;\n const res = this[resResponse];\n\n if (res && mode === 'cork') {\n res.cork(() => {\n this._end(body, closeConnection);\n });\n return this;\n }\n return this._end(body, closeConnection);\n }\n\n /**\n * Initializes Server-Side Events from your stream\n * @param body Writable stream or PassThrough\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.sse(sseStream);\n */\n sse(body: ReadStream): this {\n const { mode } = this;\n const res = this[resResponse];\n\n this.exposeAborted();\n\n if (res && mode === 'cork') {\n res.cork(() => {\n this._sse(body);\n });\n return this;\n }\n return this._sse(body);\n }\n\n protected _sse(body: ReadStream): this {\n const {\n mode,\n statusCode,\n done,\n streaming,\n _headersSet,\n [resHeaders]: _headers\n } = this;\n const res = this[resResponse];\n\n if (!done && res && !streaming && !done) {\n debug(\n 'res.sse(body) called with status %d and has headers',\n statusCode,\n _headersSet\n );\n\n res.writeStatus(httpCodes[statusCode]);\n if (mode !== 'immediate') {\n // headers\n if (_headersSet) {\n for (const header in _headers) {\n const value = _headers[header];\n if (value) {\n res.writeHeader(header, value);\n }\n }\n }\n }\n res.writeHeader('Content-Type', 'text/event-stream; charset=utf-8');\n res.writeHeader('Connection', 'keep-alive');\n res.writeHeader('Cache-Control', 'no-cache, no-store, no-transform');\n\n body.on('data', (data) => {\n if (!this.aborted) {\n res.write(data);\n }\n });\n this.streaming = true;\n this[resResponse] = null;\n }\n return this;\n }\n\n /**\n * @private\n * Ends this response by copying the contents of body.\n * @param body Body content\n * @param closeConnection Gives boolean to connection statement\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res._end('text');\n */\n protected _end(body?: uWS.RecognizedString, closeConnection?: boolean): this {\n const {\n mode,\n statusCode,\n done,\n streaming,\n _headersSet,\n [resHeaders]: _headers\n } = this;\n const res = this[resResponse];\n\n if (!done && res && !streaming) {\n debug(\n 'res.end(body) called with status %d and has headers',\n statusCode,\n _headersSet\n );\n\n res.writeStatus(httpCodes[statusCode]);\n if (mode !== 'immediate') {\n // headers\n if (_headersSet) {\n for (const header in _headers) {\n const value = _headers[header];\n if (value) {\n res.writeHeader(header, value);\n }\n }\n }\n }\n res.end(body, closeConnection);\n this.done = true;\n this[resResponse] = null;\n }\n return this;\n }\n\n /**\n * Sets response status\n * @deprecated Please use `res.statusCode` instead\n * @param code Status code\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.status(204);\n */\n\n status(code: number): this {\n debug('res.status(%d)', code);\n\n this.statusCode = code;\n\n return this;\n }\n\n /**\n * Combine of `res.status` and `res.setHeaders`\n * @param code Status code\n * @param headers Record object containing headers\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.writeHead(200, {'X-Header': 1234});\n */\n writeHead(\n code: number | Record,\n headers?: Record\n ): this {\n if (typeof code === 'object' && !headers) {\n headers = code;\n code = 200;\n }\n\n if (code !== undefined && code !== 200) {\n this.statusCode = code as number;\n }\n if (headers !== undefined) {\n this.setHeaders(headers);\n }\n\n return this;\n }\n\n /**\n * Redirect current locate to new\n * @param code Redirect code\n * @param path Path to be redirected\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.redirect('/foo');\n */\n redirect(code: number | string, path?: string): this {\n if (!path && typeof code === 'string') {\n path = code;\n code = 301;\n }\n if (path && path.indexOf('/') === -1) {\n path = `/${path}`;\n }\n\n this.statusCode = code as number;\n this.setHeader('Location', path as string);\n\n return this.end();\n }\n\n /**\n * Sends status with empty body\n * @param code Status code\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.sendStatus(204);\n */\n sendStatus(code: number): this {\n debug('res.sendStatus(%d)', code);\n\n this.statusCode = code;\n return this.end();\n }\n\n /**\n * Sends this response by copying the contents of body.\n * @param body Body content\n * @param closeConnection Gives boolean to connection statement\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.send({status: 'success'});\n */\n send(\n data: Record | string | number | boolean,\n closeConnection?: boolean\n ): this {\n const { done, compiledResponse } = this;\n if (!done && this[resResponse]) {\n if (compiledResponse) {\n return this.end(compiledResponse, closeConnection);\n }\n if (this.serialize) {\n return this.end(this.serialize(data), closeConnection);\n }\n if (typeof data === 'object') {\n this.setHeader('Content-Type', 'application/json; charset=utf-8');\n return this.end(\n JSON.stringify(\n data,\n this[resConfig].json_replacer,\n this[resConfig].json_spaces\n ),\n closeConnection\n );\n }\n\n return this.end(data as string, closeConnection);\n }\n return this;\n }\n\n /**\n * @deprecated Use `res.stream` instead of\n * Streams input stream to response output\n * @param stream Input stream\n * @param size Stream size\n * @param compressed Compressed status\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.pipe(readableStream)\n * @alias res.stream(readableStream)\n */\n pipe(stream: ReadStream, size?: number, compressed?: boolean): this {\n debug('res.pipe(stream, %d, %j)', size, compressed);\n\n return this.stream(stream, size, compressed);\n }\n\n /**\n * Streams input stream to response output\n * @param stream Input stream\n * @param size Stream size\n * @param compressed Compressed status\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.stream(readableStream)\n */\n stream(stream: ReadStream, size?: number, compressed = false): this {\n const { mode, [resRequest]: req, [resResponse]: res } = this;\n\n if (req && (!size || Number.isNaN(size)) && req.headers['content-length']) {\n size = +req.headers['content-length'];\n } else if ((!size || Number.isNaN(size)) && stream.path) {\n ({ size } = statSync(stream.path));\n }\n\n if (res && mode === 'cork') {\n res.cork(() => {\n this._stream(stream, size, compressed);\n });\n return this;\n }\n\n return this._stream(stream, size, compressed);\n }\n\n /**\n * @private\n * Streams input stream to response output\n * @param stream Input stream\n * @param size Stream size\n * @param compressed Compressed status\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res._stream(readableStream)\n */\n protected _stream(\n stream: ReadStream,\n size?: number,\n compressed = false\n ): this {\n if (!this.done && this[resResponse] && this[resResponse] !== null) {\n const res = this[resResponse] as uWS.HttpResponse;\n const config = this[resConfig];\n const { mode, statusCode, _headersSet, [resHeaders]: _headers } = this;\n\n this.exposeAborted();\n let calledData = !config.enableExpressCompatibility;\n\n if (compressed) {\n const compressedStream = this.compressStream(stream);\n\n if (compressedStream) {\n stream = compressedStream as unknown as ReadStream;\n }\n }\n\n const onclose = (): void => {\n if (calledData) {\n this.done = true;\n this.streaming = false;\n this.emit('close');\n } else if (stream.path) {\n stream.close();\n warn(\n 'res.stream(stream) data was not called, but mimicked by [nanoexpress], performance may be dropped and even can be stuck at responses, so please use official middlewares to avoid such errors'\n );\n this.stream(createReadStream(stream.path), size, compressed);\n }\n };\n const onfinish = (): void => {\n if (calledData) {\n if (typeof stream.close === 'function') {\n stream.close();\n } else {\n stream.emit('close');\n }\n }\n this.emit('finish');\n };\n\n res.writeStatus(httpCodes[statusCode]);\n if (mode !== 'immediate') {\n // headers\n if (_headersSet) {\n for (const header in _headers) {\n const value = _headers[header];\n if (value) {\n res.writeHeader(header, value);\n }\n }\n }\n }\n\n if (compressed || !size || Number.isNaN(size)) {\n debug('res.stream:compressed(stream, %d, %j)', size, compressed);\n stream\n .on('data', (buffer: Buffer): void => {\n calledData = true;\n\n if (this.aborted || this.done) {\n return;\n }\n res.write(\n buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength\n )\n );\n })\n .on('close', onclose)\n .on('finish', onfinish);\n } else {\n debug('res.stream:uncompressed(stream, %d, %j)', size, compressed);\n stream.on('data', (buffer: Buffer): void => {\n calledData = true;\n if (this.done || this.aborted) {\n return;\n }\n buffer = buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength\n ) as Buffer;\n\n const lastOffset = res.getWriteOffset();\n const [ok, done] = res.tryEnd(buffer, size as number);\n\n if (done) {\n this.done = true;\n } else if (!ok) {\n stream.pause();\n\n res.onWritable((offset: number): boolean => {\n if (this.done || this.aborted) {\n return true;\n }\n const [writeOk, writeDone] = res.tryEnd(\n buffer.slice(offset - lastOffset),\n size as number\n );\n if (writeDone) {\n this.done = true;\n } else if (writeOk) {\n stream.resume();\n }\n return writeOk;\n });\n }\n });\n }\n stream\n .on('error', (error) => {\n stream.destroy(error);\n this.aborted = true;\n this.emit('error', error as never);\n })\n .on('close', onclose)\n .on('finish', onfinish);\n }\n return this;\n }\n\n /**\n * Compress stream into compressed into\n * @param stream Readable stream\n * @param options One of compressions (BrotliCompress, ZlibOptions)\n * @param priority Compression picking priority\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.compressStream(writableStream)\n */\n compressStream(\n stream: ReadStream,\n options?: BrotliOptions | ZlibOptions,\n priority = ['gzip', 'br', 'deflate']\n ): BrotliCompress | Gzip | Deflate | null {\n const req = this[resRequest];\n\n if (!req) {\n invalid(\n 'This method requires active `HttpRequest`. Please load required middleware'\n );\n return null;\n }\n if (!req.headers) {\n invalid(\n 'This method requires active `HttpRequest.headers`. Please load required middleware'\n );\n return null;\n }\n const contentEncoding = req.headers['content-encoding'];\n const encoding = priority.find(\n (currentEncoding) =>\n contentEncoding && contentEncoding.indexOf(currentEncoding) !== -1\n );\n\n let compression = null;\n\n if (encoding === 'br') {\n compression = createBrotliCompress(options);\n } else if (encoding === 'gzip') {\n compression = createGzip(options);\n } else if (encoding === 'deflare') {\n compression = createDeflate(options);\n }\n\n if (compression && encoding) {\n stream.pipe(compression);\n this.setHeader('content-encoding', encoding);\n }\n\n return compression;\n }\n\n /**\n * Sends file to end user with efficient stream\n * @param path File absolute path\n * @param lastModified Sets `Last-Modified` header to prevent infinite re-loading\n * @param compressed Compresses file and saves bandwidth of user\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.sendFile('foo.mp4')\n */\n sendFile(path: string, lastModified = true, compressed = false): this {\n const req = this[resRequest];\n const headers = req?.headers;\n\n const stat = statSync(path);\n let { size } = stat;\n\n // handling last modified\n if (lastModified) {\n const { mtime } = stat;\n\n mtime.setMilliseconds(0);\n const mtimeutc = mtime.toUTCString();\n\n // Return 304 if last-modified\n if (headers && headers['if-modified-since']) {\n if (new Date(headers['if-modified-since']) >= mtime) {\n this.statusCode = 304;\n return this.end();\n }\n }\n this.setHeader('last-modified', mtimeutc);\n }\n this.setHeader('content-type', getMime(path) as string);\n\n let start: number | undefined = 0;\n let end: number | undefined = 0;\n\n if (headers && headers.range) {\n [start, end] = headers.range\n .substr(6)\n .split('-')\n .map((byte: string) => (byte ? parseInt(byte, 10) : undefined));\n\n // Chrome patch for work\n if (end === undefined) {\n end = size - 1;\n }\n\n if (start !== undefined) {\n this.statusCode = 206;\n this.setHeader('accept-ranges', 'bytes');\n this.setHeader('content-range', `bytes ${start}-${end}/${size}`);\n size = end - start + 1;\n }\n }\n\n // for size = 0\n if (end < 0) {\n end = 0;\n }\n\n const createStreamInstance = end\n ? createReadStream(path, { start, end })\n : createReadStream(path);\n\n return this.stream(createStreamInstance, size, compressed);\n }\n\n /**\n * Enters or continues chunked encoding mode. Writes part of the response. End with zero length write.\n * @param chunk Content response chunk\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.write(Buffer.from('Hi'));\n */\n write(chunk: uWS.RecognizedString | ArrayBuffer): this {\n const res = this[resResponse];\n if (!this.done && res && !this.streaming) {\n debug('res.write(%s)', chunk);\n res.write(chunk);\n return this;\n }\n return this;\n }\n\n /**\n *\n * Exposed methods\n */\n exposeAborted(): this {\n const res = this[resResponse];\n if (!this[resAbortHandlerExpose] && res) {\n debug('res.onAborted is exposed');\n res.onAborted(() => {\n this.aborted = true;\n warn('res.onAborted is called');\n\n this[resAbortHandler].forEach((callback) => callback());\n });\n this[resAbortHandlerExpose] = true;\n }\n\n return this;\n }\n\n onAborted(handler: () => void): this {\n this[resAbortHandler].push(handler);\n\n return this;\n }\n\n /**\n * Get response header value by key\n * @param key Header key\n * @returns Returns value of header got by key\n * @example res.getHeader('cookie');\n * @memberof nanoexpress.HttpResponse\n */\n getHeader(key: string): RecognizedString | null {\n const headers = this[resHeaders];\n if (headers && headers[key]) {\n debug(\"res.getHeader('%s')\", key);\n return headers[key];\n }\n return null;\n }\n\n /**\n * Checks response header value by key\n * @param key Header key\n * @returns Returns `true` if header exists whereas `false` in other cases\n * @example res.hasHeader('cookie');\n * @memberof nanoexpress.HttpResponse\n */\n hasHeader(key: string): boolean {\n debug(\"res.hasHeader('%s')\", key);\n return this.getHeader(key) !== null;\n }\n\n /**\n * Set response header value by key\n * @param key Header key\n * @param value Header value\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.setHeader('content-type', 'application/json');\n */\n setHeader(key: string, value: uWS.RecognizedString): this {\n const { mode, [resResponse]: res } = this;\n\n debug(\"res.setHeader('%s', '%s')\", key, value);\n\n if (res && mode === 'immediate') {\n res.writeHeader(key, value);\n return this;\n }\n\n if (!this[resHeaders]) {\n this[resHeaders] = {};\n }\n\n this._headersSet = true;\n const headers = this[resHeaders] as Record;\n headers[key] = value;\n\n return this;\n }\n\n /**\n * Set response header value by key\n * @param key Header key\n * @param value Header value\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.set('content-type', 'application/json');\n * @alias res.setHeader('content-type', 'application/json');\n */\n set(key: string, value: uWS.RecognizedString): this {\n return this.setHeader(key, value);\n }\n\n /**\n * Set response headers by Record dict\n * @param headers Header key/value record dict\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.setHeaders({'content-type':'application/json'});\n */\n setHeaders(headers: Record): this {\n const { mode, [resResponse]: res } = this;\n\n if (res && mode === 'immediate') {\n warn('res.setHeaders(headers) cannot be set due of immediate mode');\n return this;\n }\n\n debug('res.setHeaders(headers)');\n this._headersSet = true;\n\n if (this[resHeaders]) {\n Object.assign(this[resHeaders], headers);\n } else {\n this[resHeaders] = headers;\n }\n\n return this;\n }\n\n /**\n * Remove response header value by key\n * @param key Header key\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.removeHeader('cookie');\n */\n removeHeader(key: string): this {\n const { mode, [resResponse]: res } = this;\n\n if (res && mode === 'immediate') {\n warn(\"res.removeHeader('%s') cannot be set due of immediate mode\", key);\n return this;\n }\n\n debug(\"res.removeHeader('%s')\", key);\n\n const headers = this[resHeaders];\n if (headers && headers[key]) {\n headers[key] = null;\n }\n\n return this;\n }\n\n /**\n * Set response content type\n * @param contentType Content type\n * @returns nanoexpress.HttpResponse\n * @memberof nanoexpress.HttpResponse\n * @example res.type('application/json');\n */\n type(contentType: string): this {\n debug('res.type(%s)', contentType);\n return this.setHeader('content-type', contentType);\n }\n}\n\nexport default HttpResponse;\n","import { MiddlewareHandler } from '../../types/find-route';\nimport { HttpMethod } from '../../types/nanoexpress';\nimport { warn } from '../helpers/loggy';\nimport { HttpRequest, HttpResponse } from '../polyfills';\n\nexport type LegacyHttpHandler = (\n req: HttpRequest,\n res: HttpResponse,\n next: (err?: Error, done?: boolean) => void\n) =>\n | HttpResponse\n | string\n | Record\n | Promise | string>;\n\nexport default (\n middleware: LegacyHttpHandler\n): MiddlewareHandler => {\n warn(\n 'legacy middlewares is deprecated and in future we will remove express.js middlewares support'\n );\n const httpHandler = function legacyMiddlewarePolyfillHandler(\n req: HttpRequest,\n res: HttpResponse\n ): Promise {\n return new Promise((resolve, reject) => {\n middleware(req, res, (err) => {\n if (err) {\n reject(err);\n } else {\n // @ts-ignore\n resolve();\n }\n });\n });\n };\n const displayName = middleware.name;\n httpHandler.raw = middleware;\n httpHandler.displayName = displayName;\n return httpHandler;\n};\n","/* eslint-disable max-lines, max-lines-per-function, complexity, max-depth */\nimport analyze from '@nanoexpress/route-syntax-parser';\nimport fastDecodeURI from 'fast-decode-uri-component';\nimport { pathToRegexp } from 'path-to-regexp';\nimport {\n HttpHandler,\n PreparedRoute,\n UnpreparedRoute\n} from '../types/find-route';\nimport { HttpMethod, INanoexpressOptions } from '../types/nanoexpress';\nimport { debug, invalid, iterateBlocks, slashify, _gc } from './helpers';\nimport { HttpRequest, HttpResponse } from './polyfills';\nimport legacyUtil, { LegacyHttpHandler } from './utils/legacy';\n\nexport default class RouteEngine {\n protected options: INanoexpressOptions;\n\n protected routes: PreparedRoute[];\n\n public async: boolean;\n\n public await: boolean;\n\n public params = false;\n\n public headers = false;\n\n public cookies = false;\n\n public query = false;\n\n public body = false;\n\n public property = false;\n\n constructor(options: INanoexpressOptions) {\n this.options = options;\n this.routes = [];\n this.async = false;\n this.await = false;\n }\n\n parse(incomingRoute: UnpreparedRoute): PreparedRoute {\n const { options: config } = this;\n\n const route: PreparedRoute = {\n ...incomingRoute,\n all: false,\n regex: false,\n fetch_params: false,\n async: false,\n await: false,\n legacy: false,\n analyzeBlocks: []\n };\n\n if (typeof route.path === 'string') {\n if (config.ignoreTrailingSlash) {\n route.path = slashify(route.path);\n route.originalUrl = slashify(route.originalUrl);\n }\n\n route.path = fastDecodeURI(route.path);\n\n if (route.baseUrl === '*') {\n route.all = true;\n } else if (route.path.indexOf(':') !== -1) {\n route.fetch_params = true;\n route.param_keys = [];\n route.path = pathToRegexp(route.path, route.param_keys);\n route.regex = true;\n } else if (route.path.indexOf('/*') !== -1) {\n route.baseUrl = route.path.substr(0, route.path.indexOf('/*') + 1);\n route.path = route.path.substr(route.baseUrl.length);\n route.all = true;\n } else if (\n route.baseUrl.length > 1 &&\n route.baseUrl.indexOf('/*') !== -1\n ) {\n route.baseUrl = route.baseUrl.substring(0, route.baseUrl.indexOf('/*'));\n route.originalUrl = route.originalUrl.substring(\n 0,\n route.originalUrl.indexOf('/*') + 1\n );\n route.all = true;\n }\n } else if (route.path instanceof RegExp) {\n route.regex = true;\n }\n route.async = route.handler.constructor.name === 'AsyncFunction';\n route.await = route.handler.toString().includes('await');\n route.legacy = route.handler.toString().includes('next(');\n route.analyzeBlocks = analyze>(route.handler);\n const usedBlocks = iterateBlocks(route.analyzeBlocks);\n\n if (route.legacy) {\n if (config.enableExpressCompatibility) {\n route.handler = legacyUtil(\n route.handler as LegacyHttpHandler\n );\n route.async = true;\n route.await = true;\n } else {\n invalid(\n 'Express.js compatibility mode is disabled, please enable before using *express.js* middlewares, but take care - performance will not be same as disabled'\n );\n }\n }\n\n if (!this.params && route.fetch_params) {\n this.params = true;\n }\n if (!this.async && route.async) {\n this.async = true;\n }\n if (!this.await && route.await) {\n this.await = true;\n }\n\n usedBlocks.forEach((blockName): void => {\n if (blockName === 'property') {\n //\n } else {\n if (!this[blockName]) {\n this[blockName] = true;\n }\n }\n });\n\n debug(\n 'route registered [%s] baseurl(%s) path(%s) - originalurl(%s)',\n route.method,\n route.baseUrl,\n route.path,\n route.originalUrl\n );\n\n return route;\n }\n\n on(\n method: HttpMethod,\n path: string | RegExp | Array,\n handler: HttpHandler | HttpHandler[],\n baseUrl: string,\n originalUrl: string\n ): this {\n if (Array.isArray(method)) {\n method.forEach((methodId) => {\n this.on(methodId, path, handler, baseUrl, originalUrl);\n });\n return this;\n }\n if (Array.isArray(path)) {\n path.forEach((pathId) => {\n this.on(method, pathId, handler, baseUrl, originalUrl);\n });\n return this;\n }\n if (Array.isArray(handler)) {\n handler.forEach((handlerId) => {\n this.on(method, path, handlerId, baseUrl, originalUrl);\n });\n return this;\n }\n\n this.routes.push(\n this.parse({ method, path, baseUrl, originalUrl, handler })\n );\n\n _gc();\n\n return this;\n }\n\n off(\n method: HttpMethod,\n path: string,\n handler: HttpHandler,\n baseUrl: string,\n originalUrl: string\n ): this {\n const parsed = this.parse({ method, path, baseUrl, originalUrl, handler });\n\n if (!handler) {\n this.routes = this.routes.filter(\n (route) =>\n !(route.method === parsed.method && route.path === parsed.path)\n );\n } else {\n this.routes = this.routes.filter(\n (route) =>\n !(\n route.method === parsed.method &&\n route.path === parsed.path &&\n route.handler === parsed.handler\n )\n );\n }\n\n _gc();\n\n return this;\n }\n\n async lookup(\n req: HttpRequest,\n res: HttpResponse\n ): Promise {\n const { routes, options } = this;\n let response;\n\n for (let i = 0, len = routes.length; i < len; i += 1) {\n const route = routes[i];\n\n // Early return for performance reason\n if (res.done) {\n debug('routes lookup early exit');\n return res;\n }\n\n if (route.method === 'ANY' || route.method === req.method) {\n let found = false;\n\n if (route.all) {\n found =\n route.path && route.path !== '*'\n ? req.path.includes(route.path as string)\n : route.originalUrl === '*' ||\n req.originalUrl.substr(route.originalUrl.length).length > 1;\n } else if (route.regex && (route.path as RegExp).test(req.path)) {\n found = true;\n } else if (route.path === req.path && route.baseUrl === req.baseUrl) {\n found = true;\n } else if (route.originalUrl === req.originalUrl) {\n found = true;\n }\n\n if (found) {\n if (route.fetch_params && route.param_keys) {\n const exec = (route.path as RegExp).exec(req.path);\n\n req.params = {} as Record;\n for (\n let p = 0, lenp = route.param_keys.length;\n exec && p < lenp;\n p += 1\n ) {\n const key = route.param_keys[p].name;\n const value = exec[p + 1];\n\n req.params[key] = value;\n }\n }\n\n // Prepare url after found\n if (\n options.enableExpressCompatibility &&\n route.baseUrl !== '' &&\n route.baseUrl !== '*' &&\n req.path.indexOf(route.baseUrl) === 0\n ) {\n req.baseUrl = route.baseUrl;\n req.path = req.originalUrl.substr(req.baseUrl.length);\n req.url = req.originalUrl.substr(req.baseUrl.length);\n }\n\n if (route.async || route.legacy) {\n response = await route.handler(req, res);\n } else {\n response = route.handler(req, res);\n }\n\n if (res.streaming || res.done || response === res) {\n debug('routes lookup was done with HttpResponse');\n return res;\n }\n if (!res.streaming && !res.done && response) {\n debug('routes lookup was done with async json result');\n return res.send(response as string | Record);\n }\n\n debug('routes lookup was done without any match');\n } else {\n debug('routes lookup was not found without any match');\n }\n }\n }\n }\n}\n","/* eslint-disable max-lines, max-lines-per-function */\nimport { RecognizedString, WebSocketBehavior } from 'uWebSockets.js';\nimport {\n MiddlewareHandler,\n RequestSchema,\n RequestSchemaWithBody,\n RouteHandler,\n UnpreparedRoute\n} from '../types/find-route';\nimport { HttpMethod, IWebsocketRoute } from '../types/nanoexpress';\nimport App from './app';\nimport { appInstance, routerInstances, wsInstances } from './constants';\nimport { invalid, _gc } from './helpers';\nimport RouteEngine from './route-engine';\n\nexport default class Router {\n protected [appInstance]: App | Router;\n\n protected _engine?: RouteEngine;\n\n [routerInstances]: UnpreparedRoute[];\n\n [wsInstances]: IWebsocketRoute[];\n\n _basePath: string;\n\n constructor() {\n this[routerInstances] = [];\n this[wsInstances] = [];\n this._basePath = '';\n\n return this;\n }\n\n on(\n method: HttpMethod,\n path: string | RegExp,\n handlers:\n | MiddlewareHandler\n | MiddlewareHandler[]\n | RouteHandler\n | RouteHandler[],\n baseUrl: string,\n originalUrl: string\n ): this {\n const { _engine } = this;\n\n if (_engine) {\n _engine.on(method, path, handlers, baseUrl, originalUrl);\n } else if (Array.isArray(handlers)) {\n handlers.forEach((handler) => {\n this[routerInstances].push({\n method,\n path,\n baseUrl,\n handler,\n originalUrl\n });\n });\n } else {\n this[routerInstances].push({\n method,\n path,\n baseUrl,\n handler: handlers,\n originalUrl\n });\n }\n\n return this;\n }\n\n use(\n path: string | MiddlewareHandler | Router,\n ...middlewares: Array\n ): this {\n if (typeof path === 'function' || path instanceof Router) {\n middlewares.unshift(path);\n path = '*';\n }\n if (Array.isArray(path)) {\n if (\n path.every(\n (routePath) =>\n typeof routePath === 'function' || path instanceof Router\n )\n ) {\n return this.use('*', ...path);\n }\n }\n middlewares.forEach((handler: Router | MiddlewareHandler) => {\n if (handler instanceof Router) {\n const _routers = handler[routerInstances];\n const _ws = handler[wsInstances];\n\n handler[appInstance] = this;\n handler._basePath = path as string;\n\n _routers.forEach(\n ({ method, path: routePath, handler: routeHandler, baseUrl }) => {\n this.on(\n method,\n routePath as string,\n routeHandler,\n path as string,\n (path as string) + baseUrl + (routePath as string)\n );\n }\n );\n this[wsInstances].push(..._ws);\n\n _routers.length = 0;\n _ws.length = 0;\n } else if (Array.isArray(handler)) {\n this.use(path, ...handler);\n } else {\n this.on(\n 'ANY',\n '*',\n handler,\n path as string,\n this._basePath + (path as string)\n );\n }\n });\n\n _gc();\n\n return this;\n }\n\n get(\n path: string | RegExp,\n ...handlers: RouteHandler<'GET', T>[]\n ): this {\n return this.on(\n 'GET',\n path,\n handlers as RouteHandler[],\n this._basePath,\n ''\n );\n }\n\n post(\n path: string | RegExp,\n ...handlers: RouteHandler<'POST', T>[]\n ): this {\n return this.on(\n 'POST',\n path,\n handlers as RouteHandler[],\n this._basePath,\n ''\n );\n }\n\n put(\n path: string | RegExp,\n ...handlers: RouteHandler<'PUT', T>[]\n ): this {\n return this.on(\n 'PUT',\n path,\n handlers as RouteHandler[],\n this._basePath,\n ''\n );\n }\n\n options(\n path: string | RegExp,\n ...handlers: RouteHandler<'OPTIONS', T>[]\n ): this {\n return this.on(\n 'OPTIONS',\n path,\n handlers as RouteHandler[],\n this._basePath,\n ''\n );\n }\n\n del(\n path: string | RegExp,\n ...handlers: RouteHandler<'DEL', T>[]\n ): this {\n return this.on(\n 'DEL',\n path,\n handlers as RouteHandler[],\n this._basePath,\n ''\n );\n }\n\n /**\n *\n * @param path\n * @param handlers\n * @alias Router.del\n * @returns Router\n */\n delete(\n path: string | RegExp,\n ...handlers: RouteHandler<'DEL', T>[]\n ): this {\n return this.del(path, ...handlers);\n }\n\n /**\n * @param path The accessible path to be called route handler\n * @param handlers List of middlewares and/or routes\n * @returns Router\n */\n all(\n path: string | RegExp,\n ...handlers: RouteHandler<'ANY', T>[]\n ): this {\n return this.on(\n 'ANY',\n path,\n handlers as RouteHandler[],\n this._basePath,\n ''\n );\n }\n\n ws(path: RecognizedString, options?: WebSocketBehavior): this {\n const normalisedPath =\n this._basePath === '*'\n ? '*'\n : path === '/'\n ? this._basePath\n : `${this._basePath}${path}`;\n\n this[wsInstances].push({\n path: normalisedPath,\n options\n } as IWebsocketRoute);\n\n return this;\n }\n\n /**\n * @deprecated Use `app.publish()` for safety, this method will not work anymore\n * @param topic\n * @param message\n * @param isBinary\n * @param compress\n * @returns Status of publish\n */\n publish(\n topic: RecognizedString,\n message: RecognizedString,\n isBinary?: boolean,\n compress?: boolean\n ): boolean {\n const app = this[appInstance];\n if (app) {\n return app.publish(topic, message, isBinary, compress);\n }\n invalid(\n 'nanoexpress [Router]: Please attach to `Application` before using publish'\n );\n return false;\n }\n}\n","/* eslint-disable max-lines, max-lines-per-function, complexity, max-depth */\nimport { resAbortHandler } from './constants';\nimport uWS, {\n HttpRequest as uWS_HttpRequest,\n HttpResponse as uWS_HttpResponse,\n RecognizedString,\n TemplatedApp,\n us_listen_socket,\n WebSocketBehavior\n} from 'uWebSockets.js';\nimport { HttpHandler, RequestSchema } from '../types/find-route';\nimport {\n HttpMethod,\n INanoexpressOptions,\n IWebsocketRoute\n} from '../types/nanoexpress';\nimport _gc from './helpers/gc';\nimport { debug, warn } from './helpers/loggy';\nimport { unregister } from './hooks/manager';\nimport { HttpRequest, HttpResponse } from './polyfills';\nimport RouteEngine from './route-engine';\nimport RouterTemplate from './router';\nimport noop from './helpers/noop';\n\nclass App extends RouterTemplate {\n get https(): boolean {\n return this._options.https !== undefined;\n }\n\n get _console(): Console {\n return this._options.console || console;\n }\n\n get raw(): TemplatedApp {\n return this._app;\n }\n\n protected _app: TemplatedApp;\n\n protected _options: INanoexpressOptions;\n\n protected _engine: RouteEngine;\n\n protected _ws: IWebsocketRoute[];\n\n protected _requestPools: HttpRequest[];\n\n protected _responsePools: HttpResponse[];\n\n protected _poolsSize: number;\n\n protected time: [number, number];\n\n protected _separateServed: boolean;\n\n protected _ran: boolean;\n\n protected _instance: Record;\n\n protected defaultRoute: HttpHandler | null;\n\n protected errorRoute:\n | ((err: Error, req: HttpRequest, res: HttpResponse) => void)\n | null;\n\n constructor(options: INanoexpressOptions, app: TemplatedApp) {\n super();\n this._options = options;\n this._app = app;\n this._engine = new RouteEngine(options);\n\n this.defaultRoute = (_, res): HttpResponse => {\n return res.status(404).send({ status: 'error', code: 404 });\n };\n this.errorRoute = (err, _, res): HttpResponse => {\n return res.status(500).send({\n status: 'error',\n message: err.message\n });\n };\n\n this._ws = [];\n this._requestPools = [];\n this._responsePools = [];\n this._poolsSize = options.poolSize || 10;\n\n this.time = process.hrtime();\n this._separateServed = false;\n this._ran = false;\n\n this._instance = {};\n return this;\n }\n\n setNotFoundHandler(handler: HttpHandler): this {\n this.defaultRoute = handler;\n\n return this;\n }\n\n setErrorHandler(\n handler: (err: Error, req: HttpRequest, res: HttpResponse) => void\n ): this {\n this.errorRoute = handler;\n\n return this;\n }\n\n handleError(error: Error, req: HttpRequest, res: HttpResponse): this {\n if (res && !res.aborted && !res.done && !res.streaming && this.errorRoute) {\n this.errorRoute(error, req, res);\n }\n\n return this;\n }\n\n ws(path: RecognizedString, options: WebSocketBehavior): this {\n this._app.ws(path, options);\n\n return this;\n }\n\n publish(\n topic: RecognizedString,\n message: RecognizedString,\n isBinary?: boolean,\n compress?: boolean\n ): boolean {\n return this._app.publish(topic, message, isBinary, compress);\n }\n\n run(): this {\n const {\n _app: app,\n _options: options,\n _ws,\n _requestPools,\n _responsePools,\n _poolsSize,\n _engine,\n _ran\n } = this;\n\n if (!_ran) {\n const handler = async (\n rawRes: uWS_HttpResponse,\n rawReq: uWS_HttpRequest\n ): Promise => {\n let req: HttpRequest;\n let res: HttpResponse;\n let response;\n\n if (_requestPools.length > 0) {\n req = _requestPools.shift() as HttpRequest;\n req.setRequest(rawReq, rawRes);\n } else {\n req = new HttpRequest(options);\n req.setRequest(rawReq, rawRes);\n }\n if (_responsePools.length > 0) {\n res = _responsePools.shift() as HttpResponse;\n res.setResponse(rawRes, req);\n } else {\n res = new HttpResponse(options);\n res.setResponse(rawRes, req);\n }\n\n if (\n options.ignoreTrailingSlash &&\n req.path.charAt(req.path.length - 1) !== '/' &&\n (req.path.lastIndexOf('.') === -1 ||\n req.path.lastIndexOf('.') < req.path.length - 4)\n ) {\n if (options.enableExpressCompatibility) {\n debug(\n 'res.redirect called instead of fast quick-fix on route ending without \"/\" for express.js middlewares compatibility'\n );\n res.redirect(`http://${req.headers.host}${req.originalUrl}/`);\n return rawRes;\n }\n }\n\n if (req.method === 'POST' || req.method === 'PUT') {\n res.exposeAborted();\n\n rawRes.onData((arrayChunk: ArrayBuffer, isLast: boolean) => {\n req.stream.push(Buffer.from(arrayChunk.slice(0)));\n\n if (isLast) {\n req.stream.push(null);\n }\n });\n }\n\n if (res.aborted || res.done || req.method === 'OPTIONS') {\n debug('early returned ranning %o', {\n aborted: res.aborted,\n done: res.done,\n method: req.method\n });\n return;\n }\n\n if (_engine.async && _engine.await) {\n res.exposeAborted();\n response = await _engine.lookup(req, res).catch((err) => {\n this.handleError(err, req, res as HttpResponse);\n });\n if (res[resAbortHandler]) {\n res.onAborted(unregister);\n } else {\n unregister();\n }\n if (_requestPools.length < _poolsSize) {\n _requestPools.push(req);\n }\n if (_responsePools.length < _poolsSize) {\n _responsePools.push(res);\n }\n return rawRes;\n }\n\n await _engine.lookup(req, res).catch((err) => {\n this.handleError(err, req, res as HttpResponse);\n });\n if (res[resAbortHandler]) {\n res.onAborted(unregister);\n } else {\n unregister();\n }\n if (_requestPools.length < _poolsSize) {\n _requestPools.push(req);\n }\n if (_responsePools.length < _poolsSize) {\n _responsePools.push(res);\n }\n\n if (\n res &&\n !res.done &&\n !res.streaming &&\n response === undefined &&\n this.defaultRoute !== null\n ) {\n debug('routes lookup was not found any route, fallback to not-found');\n const notFound = await this.defaultRoute(req, res);\n\n if (notFound !== res) {\n res.send(notFound as string | Record);\n }\n }\n return rawRes;\n };\n\n app.any('/*', handler);\n\n _ws.forEach(({ path, options: wsOptions }) => {\n app.ws(path, wsOptions);\n });\n // Cleanup GC\n _ws.length = 0;\n _gc();\n\n this._ran = true;\n }\n\n return this;\n }\n\n listenSocket(\n port: number,\n host = 'localhost',\n is_ssl = false,\n handler: () => void = noop\n ): Promise {\n const { _options: options } = this;\n\n if (\n (port === 80 || port === 443) &&\n this.https &&\n options.https?.separateServer &&\n !this._separateServed\n ) {\n const httpsPort =\n typeof options.https.separateServer === 'number'\n ? options.https.separateServer\n : 443;\n this._separateServed = true;\n return Promise.all([\n this.listenSocket(port, host, false, handler),\n this.listenSocket(httpsPort, host, true, handler)\n ]);\n }\n\n return this._appApplyListen(host, port, is_ssl, handler);\n }\n\n listen(\n ...args: Array void)>\n ): Promise {\n let port = 8000;\n let host = 'localhost';\n let ssl = false;\n let handler: () => void = () => {};\n\n args.forEach((listenArg): void => {\n if (typeof +listenArg === 'number' && !Number.isNaN(+listenArg)) {\n port = +listenArg;\n } else if (typeof listenArg === 'function') {\n handler = listenArg;\n } else if (\n typeof listenArg === 'string' &&\n (listenArg === 'localhost' || listenArg.includes('.'))\n ) {\n host = listenArg;\n } else if (listenArg === true) {\n ssl = true;\n }\n });\n this.run();\n return this.listenSocket(port, host, ssl, handler);\n }\n\n close(port: number, host = 'localhost'): boolean {\n const id = `${host}:${port}`;\n const token = this._instance[id];\n\n this._separateServed = false;\n this.time[0] = 0;\n this.time[1] = 0;\n\n return this._close(token, id);\n }\n\n protected _appApplyListen(\n host: string,\n port: number,\n is_ssl = false,\n handler: () => void = noop\n ): Promise {\n const { _console, _options: options, _app: app } = this;\n const sslString = is_ssl ? 'HTTPS ' : is_ssl === false ? 'HTTP ' : '';\n\n return new Promise((resolve, reject): void => {\n if (port === undefined) {\n const _errorContext = 'error' in _console ? _console : console;\n\n _errorContext.error('[Server]: PORT is required');\n return undefined;\n }\n const id = `${host}:${port}`;\n\n const onListenHandler = (token: us_listen_socket): void => {\n if (token) {\n const _debugContext = 'debug' in _console ? _console : console;\n const end = process.hrtime(this.time);\n\n this._instance[id] = token;\n _debugContext.debug(\n `[${sslString}Server]: started successfully at [${id}] in [${(\n (Number(end[0]) * 1000 + Number(end[1])) /\n 1000000\n ).toFixed(2)}ms] on PID[${process.pid}]`\n );\n _gc();\n handler();\n return resolve(token);\n }\n const _errorContext = 'error' in _console ? _console : console;\n\n const err = new Error(\n this.https &&\n (!options.https ||\n !options.https.cert_file_name ||\n !options.https.key_file_name)\n ? `[${sslString}Server]: SSL certificate was not defined or loaded`\n : `[${sslString}Server]: failed to host at [${id}]`\n );\n _errorContext.error(err.message);\n _gc();\n return reject(err);\n };\n\n if (host && host !== 'localhost') {\n app.listen(host, port, onListenHandler);\n } else {\n app.listen(port, onListenHandler);\n }\n });\n }\n\n _close(token: us_listen_socket | null, id: string): boolean {\n const { _console } = this;\n\n if (token) {\n const _debugContext = 'debug' in _console ? _console : console;\n\n uWS.us_listen_socket_close(token);\n this._instance[id] = null;\n _debugContext.debug('[Server]: stopped successfully');\n _gc();\n\n return true;\n }\n\n const _errorContext = 'error' in _console ? _console : console;\n\n _errorContext.error('[Server]: Error, failed while stopping');\n _gc();\n\n return false;\n }\n\n /**\n * @deprecated There no way to disable these methods as they are not available by default\n */\n disable(tag: string): this {\n warn(\n `[Server]: The tag [${tag}] cannot be disabled as not set, not supported and not available`\n );\n return this;\n }\n\n /**\n * @deprecated Please use configuration at initialization such as `nanoexpress({json_spaces:2})` insteadof `app.set('json_spaces', 2)`\n */\n set(key: keyof INanoexpressOptions, value: string | number): this {\n // @ts-ignore\n this._options[key] = value;\n return this;\n }\n}\n\nexport default App;\n","import EventsEmitter from 'events';\nimport {\n HttpRequest,\n HttpResponse,\n us_socket_context_t,\n WebSocketBehavior\n} from 'uWebSockets.js';\nexport default function exposeWebsocket(\n handler: (req: HttpRequest, res: HttpResponse) => void | Promise,\n options = {}\n): WebSocketBehavior {\n if (typeof (options as WebSocketBehavior).open === 'function') {\n return options;\n }\n\n return {\n ...options,\n open(ws): void {\n ws.emit('connection', ws);\n },\n async upgrade(\n res: HttpResponse,\n req: HttpRequest,\n context: us_socket_context_t\n ): Promise {\n const secWsKey = req.getHeader('sec-websocket-key');\n const secWsProtocol = req.getHeader('sec-websocket-protocol');\n const secWsExtensions = req.getHeader('sec-websocket-extensions');\n\n const events = new EventsEmitter();\n\n res.on = events.on.bind(events);\n res.once = events.once.bind(events);\n res.off = events.off.bind(events);\n res.emit = events.emit.bind(events);\n\n let aborted = false;\n res.onAborted(() => {\n aborted = true;\n events.emit('error', { aborted });\n });\n\n res.emit('upgrade', req, res);\n\n try {\n await handler(req, res);\n } catch (error) {\n aborted = true;\n events.emit('error', error);\n }\n if (!aborted) {\n events.emit('willUpgrade', req);\n res.upgrade(\n { req, ...res },\n secWsKey,\n secWsProtocol,\n secWsExtensions,\n context\n );\n events.emit('upgraded', req);\n }\n },\n message: (ws, message, isBinary): void => {\n ws.emit('message', message, isBinary);\n },\n drain: (ws): void => {\n ws.emit('drain', ws.getBufferedAmount());\n },\n close: (ws, code, message): void => {\n ws.emit('close', code, message);\n }\n };\n}\n","import { Dependencies, register } from './manager';\n\nexport const useCallback = register(false, true);\n\nexport const useEffect = register(true);\nexport const useMemo = register(true, true);\nexport const useState = (initialValue: T): [T, (value: T) => void] => {\n let value = useMemo(() => initialValue, []) as T;\n\n const setValue = (newValue: T): void => {\n value = newValue;\n };\n\n return [value, setValue];\n};\nexport const useRef = (ref: T | null, dependencies: Dependencies): T =>\n useMemo(() => ({ current: ref ?? null }), dependencies);\n","import uWS from 'uWebSockets.js';\nimport { INanoexpressOptions } from '../types/nanoexpress';\nimport App from './app';\nimport { exposeWebsocket } from './exposes/index';\nimport { useCallback, useEffect, useMemo, useRef, useState } from './hooks';\nimport Router from './router';\n\n/**\n * Instance initializer for nanoexpress\n * @param options Instance options\n * @param options.enableExpressCompatibility Sets polyfill status\n * @param options.ignoreTrailingSlash Normalizes trailing slash on routes\n * @returns\n */\nconst nanoexpress = (\n options: INanoexpressOptions = {\n ignoreTrailingSlash: true,\n enableExpressCompatibility: false,\n responseMode: 'cork'\n }\n): App => {\n let app;\n\n if (options.https) {\n app = uWS.SSLApp(options.https);\n } else if (options.http) {\n app = uWS.App(options.http);\n } else {\n app = uWS.App();\n }\n\n return new App(options, app);\n};\n\nnanoexpress.Router = Router;\nnanoexpress.App = App;\n\n// Add exposes\nnanoexpress.exposeWebsocket = exposeWebsocket;\n\nexport {\n nanoexpress as default,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n};\n"],"names":["resRequest","resResponse","RouterTemplate"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 2527e742..36017a0f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@nanoexpress/ultimate", "type": "module", - "version": "1.3.0", + "version": "1.4.0", "description": "Ultimate solution based on nanoexpress and best-practices", "main": "cjs/nanoexpress.js", "module": "esm/nanoexpress.js", diff --git a/typings/app.d.ts b/typings/app.d.ts new file mode 100644 index 00000000..407a36aa --- /dev/null +++ b/typings/app.d.ts @@ -0,0 +1,41 @@ +/// +import { RecognizedString, TemplatedApp, us_listen_socket, WebSocketBehavior } from 'uWebSockets.js'; +import { HttpHandler, RequestSchema } from '../types/find-route'; +import { HttpMethod, INanoexpressOptions, IWebsocketRoute } from '../types/nanoexpress'; +import { HttpRequest, HttpResponse } from './polyfills'; +import RouteEngine from './route-engine'; +import RouterTemplate from './router'; +declare class App extends RouterTemplate { + get https(): boolean; + get _console(): Console; + get raw(): TemplatedApp; + protected _app: TemplatedApp; + protected _options: INanoexpressOptions; + protected _engine: RouteEngine; + protected _ws: IWebsocketRoute[]; + protected _requestPools: HttpRequest[]; + protected _responsePools: HttpResponse[]; + protected _poolsSize: number; + protected time: [number, number]; + protected _separateServed: boolean; + protected _ran: boolean; + protected _instance: Record; + protected defaultRoute: HttpHandler | null; + protected errorRoute: ((err: Error, req: HttpRequest, res: HttpResponse) => void) | null; + constructor(options: INanoexpressOptions, app: TemplatedApp); + setNotFoundHandler(handler: HttpHandler): this; + setErrorHandler(handler: (err: Error, req: HttpRequest, res: HttpResponse) => void): this; + handleError(error: Error, req: HttpRequest, res: HttpResponse): this; + ws(path: RecognizedString, options: WebSocketBehavior): this; + publish(topic: RecognizedString, message: RecognizedString, isBinary?: boolean, compress?: boolean): boolean; + run(): this; + listenSocket(port: number, host?: string, is_ssl?: boolean, handler?: () => void): Promise; + listen(...args: Array void)>): Promise; + close(port: number, host?: string): boolean; + protected _appApplyListen(host: string, port: number, is_ssl?: boolean, handler?: () => void): Promise; + _close(token: us_listen_socket | null, id: string): boolean; + disable(tag: string): this; + set(key: keyof INanoexpressOptions, value: string | number): this; +} +export default App; +//# sourceMappingURL=app.d.ts.map \ No newline at end of file diff --git a/typings/app.d.ts.map b/typings/app.d.ts.map new file mode 100644 index 00000000..1bcf4f6a --- /dev/null +++ b/typings/app.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/typings/constants.d.ts b/typings/constants.d.ts new file mode 100644 index 00000000..c40e928f --- /dev/null +++ b/typings/constants.d.ts @@ -0,0 +1,15 @@ +export declare const request: unique symbol; +export declare const response: unique symbol; +export declare const reqConfig: unique symbol; +export declare const reqEvents: unique symbol; +export declare const reqRequest: unique symbol; +export declare const reqRawResponse: unique symbol; +export declare const resHeaders: unique symbol; +export declare const resConfig: unique symbol; +export declare const resEvents: unique symbol; +export declare const resAbortHandler: unique symbol; +export declare const resAbortHandlerExpose: unique symbol; +export declare const appInstance: unique symbol; +export declare const routerInstances: unique symbol; +export declare const wsInstances: unique symbol; +//# sourceMappingURL=constants.d.ts.map \ No newline at end of file diff --git a/typings/constants.d.ts.map b/typings/constants.d.ts.map new file mode 100644 index 00000000..1b0976a3 --- /dev/null +++ b/typings/constants.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,EAAE,OAAO,MAAiD,CAAC;AAC/E,eAAO,MAAM,QAAQ,EAAE,OAAO,MAE7B,CAAC;AAIF,eAAO,MAAM,SAAS,EAAE,OAAO,MAA+C,CAAC;AAC/E,eAAO,MAAM,SAAS,EAAE,OAAO,MAA+C,CAAC;AAC/E,eAAO,MAAM,UAAU,EAAE,OAAO,MAE/B,CAAC;AACF,eAAO,MAAM,cAAc,EAAE,OAAO,MAEnC,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,OAAO,MAE/B,CAAC;AACF,eAAO,MAAM,SAAS,EAAE,OAAO,MAAgD,CAAC;AAChF,eAAO,MAAM,SAAS,EAAE,OAAO,MAAgD,CAAC;AAChF,eAAO,MAAM,eAAe,EAAE,OAAO,MAEpC,CAAC;AACF,eAAO,MAAM,qBAAqB,EAAE,OAAO,MAE1C,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAAO,MAAyC,CAAC;AAC3E,eAAO,MAAM,eAAe,EAAE,OAAO,MAEpC,CAAC;AACF,eAAO,MAAM,WAAW,EAAE,OAAO,MAEhC,CAAC"} \ No newline at end of file diff --git a/typings/exposes/index.d.ts b/typings/exposes/index.d.ts new file mode 100644 index 00000000..6af24ccb --- /dev/null +++ b/typings/exposes/index.d.ts @@ -0,0 +1,3 @@ +import exposeWebsocket from './websocket'; +export { exposeWebsocket }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/typings/exposes/index.d.ts.map b/typings/exposes/index.d.ts.map new file mode 100644 index 00000000..124d3929 --- /dev/null +++ b/typings/exposes/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exposes/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,CAAC"} \ No newline at end of file diff --git a/typings/exposes/websocket.d.ts b/typings/exposes/websocket.d.ts new file mode 100644 index 00000000..1249486c --- /dev/null +++ b/typings/exposes/websocket.d.ts @@ -0,0 +1,3 @@ +import { HttpRequest, HttpResponse, WebSocketBehavior } from 'uWebSockets.js'; +export default function exposeWebsocket(handler: (req: HttpRequest, res: HttpResponse) => void | Promise, options?: {}): WebSocketBehavior; +//# sourceMappingURL=websocket.d.ts.map \ No newline at end of file diff --git a/typings/exposes/websocket.d.ts.map b/typings/exposes/websocket.d.ts.map new file mode 100644 index 00000000..e6f154f9 --- /dev/null +++ b/typings/exposes/websocket.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/exposes/websocket.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,YAAY,EAEZ,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACtE,OAAO,KAAK,GACX,iBAAiB,CA8DnB"} \ No newline at end of file diff --git a/typings/helpers/gc.d.ts b/typings/helpers/gc.d.ts new file mode 100644 index 00000000..733b065e --- /dev/null +++ b/typings/helpers/gc.d.ts @@ -0,0 +1,2 @@ +export default function _gc(): boolean; +//# sourceMappingURL=gc.d.ts.map \ No newline at end of file diff --git a/typings/helpers/gc.d.ts.map b/typings/helpers/gc.d.ts.map new file mode 100644 index 00000000..82cf94a4 --- /dev/null +++ b/typings/helpers/gc.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../../src/helpers/gc.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,GAAG,IAAI,OAAO,CASrC"} \ No newline at end of file diff --git a/typings/helpers/http-codes.d.ts b/typings/helpers/http-codes.d.ts new file mode 100644 index 00000000..e7a773c0 --- /dev/null +++ b/typings/helpers/http-codes.d.ts @@ -0,0 +1,3 @@ +declare const httpCodes: Record; +export default httpCodes; +//# sourceMappingURL=http-codes.d.ts.map \ No newline at end of file diff --git a/typings/helpers/http-codes.d.ts.map b/typings/helpers/http-codes.d.ts.map new file mode 100644 index 00000000..40faab9c --- /dev/null +++ b/typings/helpers/http-codes.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"http-codes.d.ts","sourceRoot":"","sources":["../../src/helpers/http-codes.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,SAAS,wBAMiB,CAAC;AAEjC,eAAe,SAAS,CAAC"} \ No newline at end of file diff --git a/typings/helpers/http-methods.d.ts b/typings/helpers/http-methods.d.ts new file mode 100644 index 00000000..e7524e59 --- /dev/null +++ b/typings/helpers/http-methods.d.ts @@ -0,0 +1,4 @@ +import { HttpMethod } from '../../types/nanoexpress'; +declare const _default: HttpMethod[]; +export default _default; +//# sourceMappingURL=http-methods.d.ts.map \ No newline at end of file diff --git a/typings/helpers/http-methods.d.ts.map b/typings/helpers/http-methods.d.ts.map new file mode 100644 index 00000000..10f4df1c --- /dev/null +++ b/typings/helpers/http-methods.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"http-methods.d.ts","sourceRoot":"","sources":["../../src/helpers/http-methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;;AAErD,wBAU8C"} \ No newline at end of file diff --git a/typings/helpers/index.d.ts b/typings/helpers/index.d.ts new file mode 100644 index 00000000..2f3703af --- /dev/null +++ b/typings/helpers/index.d.ts @@ -0,0 +1,11 @@ +import _gc from './gc'; +import httpCodes from './http-codes'; +import httpMethods from './http-methods'; +import invalid from './invalid'; +import iterateBlocks from './iterate-blocks'; +import { getMime, mimes } from './mime'; +import slashify from './slashify'; +import noop from './noop'; +export * from './loggy'; +export { _gc, httpMethods, httpCodes, invalid, iterateBlocks, mimes, getMime, slashify, noop }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/typings/helpers/index.d.ts.map b/typings/helpers/index.d.ts.map new file mode 100644 index 00000000..e731db29 --- /dev/null +++ b/typings/helpers/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,MAAM,CAAC;AACvB,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,GAAG,EACH,WAAW,EACX,SAAS,EACT,OAAO,EACP,aAAa,EACb,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAI,EACL,CAAC"} \ No newline at end of file diff --git a/typings/helpers/invalid.d.ts b/typings/helpers/invalid.d.ts new file mode 100644 index 00000000..b60569ab --- /dev/null +++ b/typings/helpers/invalid.d.ts @@ -0,0 +1,2 @@ +export default function invalid(message: string): void; +//# sourceMappingURL=invalid.d.ts.map \ No newline at end of file diff --git a/typings/helpers/invalid.d.ts.map b/typings/helpers/invalid.d.ts.map new file mode 100644 index 00000000..2b1a731e --- /dev/null +++ b/typings/helpers/invalid.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"invalid.d.ts","sourceRoot":"","sources":["../../src/helpers/invalid.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD"} \ No newline at end of file diff --git a/typings/helpers/iterate-blocks.d.ts b/typings/helpers/iterate-blocks.d.ts new file mode 100644 index 00000000..f8eef141 --- /dev/null +++ b/typings/helpers/iterate-blocks.d.ts @@ -0,0 +1,4 @@ +import { BlockMode, IBlock } from '@nanoexpress/route-syntax-parser/types/interfaces'; +declare const _default: (blocks: IBlock[]) => BlockMode[]; +export default _default; +//# sourceMappingURL=iterate-blocks.d.ts.map \ No newline at end of file diff --git a/typings/helpers/iterate-blocks.d.ts.map b/typings/helpers/iterate-blocks.d.ts.map new file mode 100644 index 00000000..a886cbdf --- /dev/null +++ b/typings/helpers/iterate-blocks.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"iterate-blocks.d.ts","sourceRoot":"","sources":["../../src/helpers/iterate-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,MAAM,EACP,MAAM,mDAAmD,CAAC;iCAEnC,MAAM,EAAE,KAAG,SAAS,EAAE;AAA9C,wBAEE"} \ No newline at end of file diff --git a/typings/helpers/loggy.d.ts b/typings/helpers/loggy.d.ts new file mode 100644 index 00000000..86afb37b --- /dev/null +++ b/typings/helpers/loggy.d.ts @@ -0,0 +1,5 @@ +import debugLog from 'debug'; +export declare const debug: debugLog.Debugger; +export declare const error: debugLog.Debugger; +export declare const warn: debugLog.Debugger; +//# sourceMappingURL=loggy.d.ts.map \ No newline at end of file diff --git a/typings/helpers/loggy.d.ts.map b/typings/helpers/loggy.d.ts.map new file mode 100644 index 00000000..40edc78d --- /dev/null +++ b/typings/helpers/loggy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"loggy.d.ts","sourceRoot":"","sources":["../../src/helpers/loggy.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,OAAO,CAAC;AAE7B,eAAO,MAAM,KAAK,mBAA0B,CAAC;AAC7C,eAAO,MAAM,KAAK,mBAAgC,CAAC;AAEnD,eAAO,MAAM,IAAI,mBAA+B,CAAC"} \ No newline at end of file diff --git a/typings/helpers/mime.d.ts b/typings/helpers/mime.d.ts new file mode 100644 index 00000000..47d54948 --- /dev/null +++ b/typings/helpers/mime.d.ts @@ -0,0 +1,173 @@ +declare const mimes: { + '3gp': string; + a: string; + ai: string; + aif: string; + aiff: string; + asc: string; + asf: string; + asm: string; + asx: string; + atom: string; + au: string; + avi: string; + bat: string; + bin: string; + bmp: string; + bz2: string; + c: string; + cab: string; + cc: string; + chm: string; + class: string; + com: string; + conf: string; + cpp: string; + crt: string; + css: string; + csv: string; + cxx: string; + deb: string; + der: string; + diff: string; + djv: string; + djvu: string; + dll: string; + dmg: string; + doc: string; + dot: string; + dtd: string; + dvi: string; + ear: string; + eml: string; + eps: string; + exe: string; + f: string; + f77: string; + f90: string; + flv: string; + for: string; + gem: string; + gemspec: string; + gif: string; + gz: string; + h: string; + hh: string; + htm: string; + html: string; + ico: string; + ics: string; + ifb: string; + iso: string; + jar: string; + java: string; + jnlp: string; + jpeg: string; + jpg: string; + js: string; + json: string; + log: string; + m3u: string; + m4v: string; + man: string; + mathml: string; + mbox: string; + mdoc: string; + me: string; + mid: string; + midi: string; + mime: string; + mjs: string; + mml: string; + mng: string; + mov: string; + mp3: string; + mp4: string; + mp4v: string; + mpeg: string; + mpg: string; + ms: string; + msi: string; + odp: string; + ods: string; + odt: string; + ogg: string; + p: string; + pas: string; + pbm: string; + pdf: string; + pem: string; + pgm: string; + pgp: string; + pkg: string; + pl: string; + pm: string; + png: string; + pnm: string; + ppm: string; + pps: string; + ppt: string; + ps: string; + psd: string; + py: string; + qt: string; + ra: string; + rake: string; + ram: string; + rar: string; + rb: string; + rdf: string; + roff: string; + rpm: string; + rss: string; + rtf: string; + ru: string; + s: string; + sgm: string; + sgml: string; + sh: string; + sig: string; + snd: string; + so: string; + svg: string; + svgz: string; + swf: string; + t: string; + tar: string; + tbz: string; + tcl: string; + tex: string; + texi: string; + texinfo: string; + text: string; + tif: string; + tiff: string; + torrent: string; + tr: string; + txt: string; + vcf: string; + vcs: string; + vrml: string; + war: string; + wav: string; + wma: string; + wmv: string; + wmx: string; + wrl: string; + wsdl: string; + xbm: string; + xhtml: string; + xls: string; + xml: string; + xpm: string; + xsl: string; + xslt: string; + yaml: string; + yml: string; + zip: string; + default: string; +}; +declare type valueof = T[keyof T]; +declare const getMime: (path: string) => valueof | undefined; +export { getMime, mimes }; +//# sourceMappingURL=mime.d.ts.map \ No newline at end of file diff --git a/typings/helpers/mime.d.ts.map b/typings/helpers/mime.d.ts.map new file mode 100644 index 00000000..6b92ed1b --- /dev/null +++ b/typings/helpers/mime.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/helpers/mime.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwKV,CAAC;AAEF,aAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE7B,QAAA,MAAM,OAAO,SAAU,MAAM,KAAG,QAAQ,YAAY,CAAC,GAAG,SAGvD,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC"} \ No newline at end of file diff --git a/typings/helpers/noop.d.ts b/typings/helpers/noop.d.ts new file mode 100644 index 00000000..cecaf638 --- /dev/null +++ b/typings/helpers/noop.d.ts @@ -0,0 +1,3 @@ +declare const _default: () => void; +export default _default; +//# sourceMappingURL=noop.d.ts.map \ No newline at end of file diff --git a/typings/helpers/noop.d.ts.map b/typings/helpers/noop.d.ts.map new file mode 100644 index 00000000..f3728c1d --- /dev/null +++ b/typings/helpers/noop.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/helpers/noop.ts"],"names":[],"mappings":"8BAAmB,IAAI;AAAvB,wBAA8B"} \ No newline at end of file diff --git a/typings/helpers/slashify.d.ts b/typings/helpers/slashify.d.ts new file mode 100644 index 00000000..6a405374 --- /dev/null +++ b/typings/helpers/slashify.d.ts @@ -0,0 +1,3 @@ +declare const _default: (path: string) => string; +export default _default; +//# sourceMappingURL=slashify.d.ts.map \ No newline at end of file diff --git a/typings/helpers/slashify.d.ts.map b/typings/helpers/slashify.d.ts.map new file mode 100644 index 00000000..ee95ee99 --- /dev/null +++ b/typings/helpers/slashify.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"slashify.d.ts","sourceRoot":"","sources":["../../src/helpers/slashify.ts"],"names":[],"mappings":"+BAAsB,MAAM,KAAG,MAAM;AAArC,wBAMW"} \ No newline at end of file diff --git a/typings/hooks/index.d.ts b/typings/hooks/index.d.ts new file mode 100644 index 00000000..3da00942 --- /dev/null +++ b/typings/hooks/index.d.ts @@ -0,0 +1,7 @@ +import { Dependencies } from './manager'; +export declare const useCallback: (callback: (...args: any[]) => any, dependencies: Dependencies) => any; +export declare const useEffect: (callback: (...args: any[]) => any, dependencies: Dependencies) => any; +export declare const useMemo: (callback: (...args: any[]) => any, dependencies: Dependencies) => any; +export declare const useState: (initialValue: T) => [T, (value: T) => void]; +export declare const useRef: (ref: T | null, dependencies: Dependencies) => T; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/typings/hooks/index.d.ts.map b/typings/hooks/index.d.ts.map new file mode 100644 index 00000000..bea044fa --- /dev/null +++ b/typings/hooks/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAY,MAAM,WAAW,CAAC;AAEnD,eAAO,MAAM,WAAW,wEAAwB,CAAC;AAEjD,eAAO,MAAM,SAAS,wEAAiB,CAAC;AACxC,eAAO,MAAM,OAAO,wEAAuB,CAAC;AAC5C,eAAO,MAAM,QAAQ,4CAA2C,IAAI,CAQnE,CAAC;AACF,eAAO,MAAM,MAAM,qDACsC,CAAC"} \ No newline at end of file diff --git a/typings/hooks/manager.d.ts b/typings/hooks/manager.d.ts new file mode 100644 index 00000000..596fe2f6 --- /dev/null +++ b/typings/hooks/manager.d.ts @@ -0,0 +1,5 @@ +export declare type Dependencies = Array; +declare const register: (runValue?: boolean, returnValue?: boolean) => (callback: (...args: any[]) => any, dependencies: Dependencies) => (() => any) | any; +declare const unregister: () => void; +export { register, unregister }; +//# sourceMappingURL=manager.d.ts.map \ No newline at end of file diff --git a/typings/hooks/manager.d.ts.map b/typings/hooks/manager.d.ts.map new file mode 100644 index 00000000..cb921096 --- /dev/null +++ b/typings/hooks/manager.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/hooks/manager.ts"],"names":[],"mappings":"AAAA,oBAAY,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAa5D,QAAA,MAAM,QAAQ,sEAGU,GAAG,EAAE,KAAK,GAAG,iCAEhC,CAAC,MAAM,GAAG,CAAC,GAAG,GAuBhB,CAAC;AACJ,QAAA,MAAM,UAAU,QAAO,IAYtB,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC"} \ No newline at end of file diff --git a/typings/nanoexpress.d.ts b/typings/nanoexpress.d.ts new file mode 100644 index 00000000..8c67e96c --- /dev/null +++ b/typings/nanoexpress.d.ts @@ -0,0 +1,13 @@ +import { INanoexpressOptions } from '../types/nanoexpress'; +import App from './app'; +import { exposeWebsocket } from './exposes/index'; +import { useCallback, useEffect, useMemo, useRef, useState } from './hooks'; +import Router from './router'; +declare const nanoexpress: { + (options?: INanoexpressOptions): App; + Router: typeof Router; + App: typeof App; + exposeWebsocket: typeof exposeWebsocket; +}; +export { nanoexpress as default, useCallback, useEffect, useMemo, useRef, useState }; +//# sourceMappingURL=nanoexpress.d.ts.map \ No newline at end of file diff --git a/typings/nanoexpress.d.ts.map b/typings/nanoexpress.d.ts.map new file mode 100644 index 00000000..86b0dd7d --- /dev/null +++ b/typings/nanoexpress.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"nanoexpress.d.ts","sourceRoot":"","sources":["../src/nanoexpress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,MAAM,MAAM,UAAU,CAAC;AAS9B,QAAA,MAAM,WAAW;eACN,mBAAmB,GAK3B,GAAG;;;;CAYL,CAAC;AAQF,OAAO,EACL,WAAW,IAAI,OAAO,EACtB,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,EACT,CAAC"} \ No newline at end of file diff --git a/typings/polyfills/http-request.d.ts b/typings/polyfills/http-request.d.ts new file mode 100644 index 00000000..d1790b93 --- /dev/null +++ b/typings/polyfills/http-request.d.ts @@ -0,0 +1,35 @@ +/// +import { EventEmitter } from 'events'; +import { Readable, Writable } from 'stream'; +import { HttpRequest as uWS_HttpRequest, HttpResponse as uWS_HttpResponse } from 'uWebSockets.js'; +import { RequestSchema, RequestSchemaWithBody } from '../../types/find-route'; +import { HttpMethod, INanoexpressOptions } from '../../types/nanoexpress'; +import { reqConfig, reqEvents, reqRawResponse, reqRequest } from '../constants'; +export default class HttpRequest { + protected [reqConfig]: INanoexpressOptions; + protected [reqEvents]: EventEmitter | null; + protected [reqRequest]: uWS_HttpRequest; + protected [reqRawResponse]: uWS_HttpResponse; + protected registered: boolean; + baseUrl: string; + url: string; + originalUrl: string; + path: string; + method: THttpMethod; + headers: THttpSchema['headers']; + params?: THttpSchema['params']; + body?: THttpSchema['body']; + query: THttpSchema['query']; + stream: Readable; + id: number; + constructor(options: INanoexpressOptions); + setRequest(req: uWS_HttpRequest, res: uWS_HttpResponse): this; + on(event: string, listener: (...args: any[]) => void): this; + emit(event: string, ...args: any[]): this; + getHeader(key: string): string; + hasHeader(key: string): boolean; + getParameter(index: number): string; + pipe(destination: Writable): Writable | void | Promise; + [Symbol.asyncIterator](): any; +} +//# sourceMappingURL=http-request.d.ts.map \ No newline at end of file diff --git a/typings/polyfills/http-request.d.ts.map b/typings/polyfills/http-request.d.ts.map new file mode 100644 index 00000000..9f63c102 --- /dev/null +++ b/typings/polyfills/http-request.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"http-request.d.ts","sourceRoot":"","sources":["../../src/polyfills/http-request.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EACL,WAAW,IAAI,eAAe,EAC9B,YAAY,IAAI,gBAAgB,EACjC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGhF,MAAM,CAAC,OAAO,OAAO,WAAW,CAC9B,WAAW,GAAG,UAAU,EACxB,WAAW,SAAS,qBAAqB,GAAG,aAAa;IAEzD,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAE3C,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAE3C,SAAS,CAAC,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IAExC,SAAS,CAAC,CAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAE7C,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;IAE9B,OAAO,EAAG,MAAM,CAAC;IAEjB,GAAG,EAAG,MAAM,CAAC;IAEb,WAAW,EAAG,MAAM,CAAC;IAErB,IAAI,EAAG,MAAM,CAAC;IAEd,MAAM,EAAG,WAAW,CAAC;IAErB,OAAO,EAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEjC,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE/B,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAE3B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAQ;IAEnC,MAAM,EAAG,QAAQ,CAAC;IAElB,EAAE,SAAK;gBAEK,OAAO,EAAE,mBAAmB;IAQxC,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI;IAgD7D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;IAQ3D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQzC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI9B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI/B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAInC,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;IAetD,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,GAAG;CASrC"} \ No newline at end of file diff --git a/typings/polyfills/http-response.d.ts b/typings/polyfills/http-response.d.ts new file mode 100644 index 00000000..1ebd6208 --- /dev/null +++ b/typings/polyfills/http-response.d.ts @@ -0,0 +1,61 @@ +/// +import { EventEmitter } from 'events'; +import { ReadStream } from 'fs'; +import uWS, { RecognizedString } from 'uWebSockets.js'; +import { BrotliCompress, BrotliOptions, Deflate, Gzip, ZlibOptions } from 'zlib'; +import { INanoexpressOptions } from '../../types/nanoexpress'; +import { request as resRequest, resAbortHandler, resAbortHandlerExpose, resConfig, resEvents, resHeaders, response as resResponse } from '../constants'; +import HttpRequest from './http-request'; +declare class HttpResponse { + [resRequest]: HttpRequest | null; + [resResponse]: uWS.HttpResponse | null; + protected [resHeaders]: Record | null; + protected [resAbortHandler]: (() => void)[]; + protected [resAbortHandlerExpose]: boolean; + protected [resConfig]: INanoexpressOptions; + protected [resEvents]: EventEmitter | null; + done: boolean; + aborted: boolean; + streaming: boolean; + protected _headersSet: boolean; + protected registered: boolean; + protected mode: 'immediate' | 'queue' | 'cork'; + serialize?: (data: Record | string | number | boolean) => string; + compiledResponse?: string; + statusCode: number; + id: number; + constructor(config: INanoexpressOptions); + protected registerEvents(): this; + on(eventName: string | symbol, eventArgument: (eventArgument?: unknown) => void): this; + once(eventName: string | symbol, eventArgument: (eventArgument?: unknown) => void): this; + off(eventName: string | symbol, eventArgument: (eventArgument?: unknown) => void): this; + removeListener(eventName: string | symbol, eventArgument: (eventArgument?: unknown) => void): this; + emit(eventName: string | symbol, eventArgument?: never): boolean; + setResponse(res: uWS.HttpResponse, req: HttpRequest): this; + end(body?: uWS.RecognizedString, closeConnection?: boolean): this; + sse(body: ReadStream): this; + protected _sse(body: ReadStream): this; + protected _end(body?: uWS.RecognizedString, closeConnection?: boolean): this; + status(code: number): this; + writeHead(code: number | Record, headers?: Record): this; + redirect(code: number | string, path?: string): this; + sendStatus(code: number): this; + send(data: Record | string | number | boolean, closeConnection?: boolean): this; + pipe(stream: ReadStream, size?: number, compressed?: boolean): this; + stream(stream: ReadStream, size?: number, compressed?: boolean): this; + protected _stream(stream: ReadStream, size?: number, compressed?: boolean): this; + compressStream(stream: ReadStream, options?: BrotliOptions | ZlibOptions, priority?: string[]): BrotliCompress | Gzip | Deflate | null; + sendFile(path: string, lastModified?: boolean, compressed?: boolean): this; + write(chunk: uWS.RecognizedString | ArrayBuffer): this; + exposeAborted(): this; + onAborted(handler: () => void): this; + getHeader(key: string): RecognizedString | null; + hasHeader(key: string): boolean; + setHeader(key: string, value: uWS.RecognizedString): this; + set(key: string, value: uWS.RecognizedString): this; + setHeaders(headers: Record): this; + removeHeader(key: string): this; + type(contentType: string): this; +} +export default HttpResponse; +//# sourceMappingURL=http-response.d.ts.map \ No newline at end of file diff --git a/typings/polyfills/http-response.d.ts.map b/typings/polyfills/http-response.d.ts.map new file mode 100644 index 00000000..b2286661 --- /dev/null +++ b/typings/polyfills/http-response.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"http-response.d.ts","sourceRoot":"","sources":["../../src/polyfills/http-response.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/typings/polyfills/index.d.ts b/typings/polyfills/index.d.ts new file mode 100644 index 00000000..5ff3126d --- /dev/null +++ b/typings/polyfills/index.d.ts @@ -0,0 +1,3 @@ +export { default as HttpRequest } from './http-request'; +export { default as HttpResponse } from './http-response'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/typings/polyfills/index.d.ts.map b/typings/polyfills/index.d.ts.map new file mode 100644 index 00000000..33f0fbc9 --- /dev/null +++ b/typings/polyfills/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/polyfills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC"} \ No newline at end of file diff --git a/typings/route-engine.d.ts b/typings/route-engine.d.ts new file mode 100644 index 00000000..184db8d7 --- /dev/null +++ b/typings/route-engine.d.ts @@ -0,0 +1,21 @@ +import { HttpHandler, PreparedRoute, UnpreparedRoute } from '../types/find-route'; +import { HttpMethod, INanoexpressOptions } from '../types/nanoexpress'; +import { HttpRequest, HttpResponse } from './polyfills'; +export default class RouteEngine { + protected options: INanoexpressOptions; + protected routes: PreparedRoute[]; + async: boolean; + await: boolean; + params: boolean; + headers: boolean; + cookies: boolean; + query: boolean; + body: boolean; + property: boolean; + constructor(options: INanoexpressOptions); + parse(incomingRoute: UnpreparedRoute): PreparedRoute; + on(method: HttpMethod, path: string | RegExp | Array, handler: HttpHandler | HttpHandler[], baseUrl: string, originalUrl: string): this; + off(method: HttpMethod, path: string, handler: HttpHandler, baseUrl: string, originalUrl: string): this; + lookup(req: HttpRequest, res: HttpResponse): Promise; +} +//# sourceMappingURL=route-engine.d.ts.map \ No newline at end of file diff --git a/typings/route-engine.d.ts.map b/typings/route-engine.d.ts.map new file mode 100644 index 00000000..db02a109 --- /dev/null +++ b/typings/route-engine.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"route-engine.d.ts","sourceRoot":"","sources":["../src/route-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,aAAa,EACb,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,MAAM,CAAC,OAAO,OAAO,WAAW;IAC9B,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAEvC,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAE3B,KAAK,EAAE,OAAO,CAAC;IAEf,KAAK,EAAE,OAAO,CAAC;IAEf,MAAM,UAAS;IAEf,OAAO,UAAS;IAEhB,OAAO,UAAS;IAEhB,KAAK,UAAS;IAEd,IAAI,UAAS;IAEb,QAAQ,UAAS;gBAEZ,OAAO,EAAE,mBAAmB;IAOxC,KAAK,CAAC,aAAa,EAAE,eAAe,GAAG,aAAa;IAkGpD,EAAE,CACA,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,EAC9C,OAAO,EAAE,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EACtE,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,IAAI;IA6BP,GAAG,CACD,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,EACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,IAAI;IAwBD,MAAM,CACV,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC;CAiFzC"} \ No newline at end of file diff --git a/typings/router.d.ts b/typings/router.d.ts new file mode 100644 index 00000000..226cac43 --- /dev/null +++ b/typings/router.d.ts @@ -0,0 +1,26 @@ +import { RecognizedString, WebSocketBehavior } from 'uWebSockets.js'; +import { MiddlewareHandler, RequestSchema, RequestSchemaWithBody, RouteHandler, UnpreparedRoute } from '../types/find-route'; +import { HttpMethod, IWebsocketRoute } from '../types/nanoexpress'; +import App from './app'; +import { appInstance, routerInstances, wsInstances } from './constants'; +import RouteEngine from './route-engine'; +export default class Router { + protected [appInstance]: App | Router; + protected _engine?: RouteEngine; + [routerInstances]: UnpreparedRoute[]; + [wsInstances]: IWebsocketRoute[]; + _basePath: string; + constructor(); + on(method: HttpMethod, path: string | RegExp, handlers: MiddlewareHandler | MiddlewareHandler[] | RouteHandler | RouteHandler[], baseUrl: string, originalUrl: string): this; + use(path: string | MiddlewareHandler | Router, ...middlewares: Array): this; + get(path: string | RegExp, ...handlers: RouteHandler<'GET', T>[]): this; + post(path: string | RegExp, ...handlers: RouteHandler<'POST', T>[]): this; + put(path: string | RegExp, ...handlers: RouteHandler<'PUT', T>[]): this; + options(path: string | RegExp, ...handlers: RouteHandler<'OPTIONS', T>[]): this; + del(path: string | RegExp, ...handlers: RouteHandler<'DEL', T>[]): this; + delete(path: string | RegExp, ...handlers: RouteHandler<'DEL', T>[]): this; + all(path: string | RegExp, ...handlers: RouteHandler<'ANY', T>[]): this; + ws(path: RecognizedString, options?: WebSocketBehavior): this; + publish(topic: RecognizedString, message: RecognizedString, isBinary?: boolean, compress?: boolean): boolean; +} +//# sourceMappingURL=router.d.ts.map \ No newline at end of file diff --git a/typings/router.d.ts.map b/typings/router.d.ts.map new file mode 100644 index 00000000..e81dd24e --- /dev/null +++ b/typings/router.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/typings/utils/legacy.d.ts b/typings/utils/legacy.d.ts new file mode 100644 index 00000000..84997268 --- /dev/null +++ b/typings/utils/legacy.d.ts @@ -0,0 +1,7 @@ +import { MiddlewareHandler } from '../../types/find-route'; +import { HttpMethod } from '../../types/nanoexpress'; +import { HttpRequest, HttpResponse } from '../polyfills'; +export declare type LegacyHttpHandler = (req: HttpRequest, res: HttpResponse, next: (err?: Error, done?: boolean) => void) => HttpResponse | string | Record | Promise | string>; +declare const _default: (middleware: LegacyHttpHandler) => MiddlewareHandler; +export default _default; +//# sourceMappingURL=legacy.d.ts.map \ No newline at end of file diff --git a/typings/utils/legacy.d.ts.map b/typings/utils/legacy.d.ts.map new file mode 100644 index 00000000..378f4f23 --- /dev/null +++ b/typings/utils/legacy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/utils/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEzD,oBAAY,iBAAiB,CAAC,CAAC,IAAI,CACjC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EACnB,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,KAEzC,YAAY,GACZ,MAAM,GACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;qCAG/C,kBAAkB,UAAU,CAAC,KACxC,iBAAiB;AAFpB,wBAyBE"} \ No newline at end of file