@coderbuzz/ken 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/dist/LICENSE +21 -0
- package/dist/README.md +41 -0
- package/dist/bun-GUK26ACN.js +281 -0
- package/dist/bun-GUK26ACN.js.map +1 -0
- package/dist/chunk-2BOPD5H7.js +34 -0
- package/dist/chunk-2BOPD5H7.js.map +1 -0
- package/dist/chunk-2MK26YDD.js +269 -0
- package/dist/chunk-2MK26YDD.js.map +1 -0
- package/dist/chunk-DPU3PBLP.js +815 -0
- package/dist/chunk-DPU3PBLP.js.map +1 -0
- package/dist/chunk-WTV4URUZ.js +122 -0
- package/dist/chunk-WTV4URUZ.js.map +1 -0
- package/dist/deno-LZU5JBGL.js +250 -0
- package/dist/deno-LZU5JBGL.js.map +1 -0
- package/dist/index.d.ts +2783 -0
- package/dist/index.js +2728 -0
- package/dist/index.js.map +1 -0
- package/dist/node-JLUTIPEN.js +816 -0
- package/dist/node-JLUTIPEN.js.map +1 -0
- package/dist/package.json +13 -0
- package/dist/uws-VNY2LPIZ.js +622 -0
- package/dist/uws-VNY2LPIZ.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/uws.ts","../src/ws/uws.ts","../src/runtime/uws.ts"],"sourcesContent":["/**\n * Ken Framework - uWebSockets.js Context\n * Uses HttpRequest/HttpResponse directly for maximum performance\n * \n * CRITICAL: HttpRequest is only valid during initial callback\n * All data must be read synchronously in constructor\n * \n * MIT License - Copyright (c) 2025 Indra Gunawan\n */\n\nimport type { HttpRequest, HttpResponse } from 'uWebSockets.js';\nimport { BaseContext, type HeadersLike } from './base';\nimport {\n type Schema,\n type GetRemoteInfo,\n type InferObject,\n type InferValidator,\n EMPTY_PARAMS,\n} from './types';\n\n/**\n * UwsContext - For uWebSockets.js runtime\n * \n * IMPORTANT: uWebSockets.js HttpRequest is only valid during the initial callback.\n * All request data must be read synchronously in the constructor.\n * \n * @template S - Schema type for validation\n * @template Path - Route path string for param extraction\n * @template TState - Accumulated state from middleware\n */\nexport class UwsContext<S extends Schema = {}, Path extends string = string, TState = {}>\n extends BaseContext<S, Path, TState> {\n\n public readonly res: HttpResponse;\n\n // Pre-read values (must be read sync during callback)\n private readonly _method: string;\n private readonly _url: string;\n private readonly _rawQuery: string;\n private readonly _headersMap: Map<string, string>;\n private _bodyBuffer: Buffer | null = null;\n\n /**\n * Constructor - MUST read all request data synchronously.\n * uWs HttpRequest becomes invalid after callback returns.\n */\n constructor(\n req: HttpRequest,\n res: HttpResponse,\n params: Record<string, string> = EMPTY_PARAMS,\n getRemoteInfo: GetRemoteInfo,\n schema?: S\n ) {\n super(params, getRemoteInfo, schema);\n this.res = res;\n\n // Must read these immediately - req is only valid during this callback\n this._method = req.getMethod().toUpperCase();\n this._url = req.getUrl();\n this._rawQuery = req.getQuery();\n\n // Pre-read all headers\n this._headersMap = new Map();\n req.forEach((key, value) => {\n this._headersMap.set(key.toLowerCase(), value);\n });\n }\n\n get url(): string {\n // Reconstruct full URL with query\n return this._rawQuery ? `${this._url}?${this._rawQuery}` : this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get body(): null {\n // uWs doesn't expose body as stream directly\n // Use json/text/form getters instead\n return null;\n }\n\n protected _getRawHeaders(): HeadersLike {\n // Create a HeadersLike wrapper for the Map\n return {\n get: (key: string) => this._headersMap.get(key.toLowerCase()) ?? null,\n };\n }\n\n protected _getRawUrl(): string {\n return this.url;\n }\n\n /**\n * Lazily parses and validates headers.\n */\n get headers(): InferObject<S['headers'], Record<string, string>> {\n let cached = this._headers;\n if (cached !== null) return cached;\n\n const schema = this._schema?.headers;\n if (schema !== undefined) {\n const result: any = {};\n for (const key in schema) {\n const validator = schema[key];\n result[key] = validator(this._headersMap.get(key.toLowerCase()) || '');\n }\n this._headers = result;\n return result;\n }\n\n const h: Record<string, string> = {};\n this._headersMap.forEach((v, k) => h[k] = v);\n this._headers = h;\n return h as any;\n }\n\n /**\n * Read body buffer from uWs response\n */\n private _readBody(): Promise<Buffer> {\n if (this._bodyBuffer !== null) return Promise.resolve(this._bodyBuffer);\n\n return new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n this.res.onData((chunk, isLast) => {\n // chunk is ArrayBuffer, convert to Buffer\n chunks.push(Buffer.from(chunk));\n\n if (isLast) {\n this._bodyBuffer = Buffer.concat(chunks);\n resolve(this._bodyBuffer);\n }\n });\n\n this.res.onAborted(() => {\n reject(new Error('Request aborted'));\n });\n });\n }\n\n /**\n * Lazily parses and validates JSON body.\n */\n get json(): Promise<InferValidator<S['json'], any>> {\n if (this._json) return this._json;\n\n const validator = this._schema?.json;\n if (validator) {\n this._json = (async () => {\n const buffer = await this._readBody();\n const data = JSON.parse(buffer.toString('utf8'));\n try {\n return validator(data);\n } catch (err: any) {\n throw new Error(`JSON Body validation failed: ${err.message}`);\n }\n })();\n } else {\n this._json = (async () => {\n try {\n const buffer = await this._readBody();\n return JSON.parse(buffer.toString('utf8'));\n } catch {\n return null;\n }\n })();\n }\n return this._json;\n }\n\n /**\n * Lazily parses and validates text body.\n */\n get text(): Promise<InferValidator<S['text'], string>> {\n if (this._text) return this._text;\n\n const validator = this._schema?.text;\n if (validator) {\n this._text = (async () => {\n const buffer = await this._readBody();\n const data = buffer.toString('utf8');\n try {\n return validator(data);\n } catch (err: any) {\n throw new Error(`Text Body validation failed: ${err.message}`);\n }\n })();\n } else {\n this._text = (async () => {\n const buffer = await this._readBody();\n return buffer.toString('utf8');\n })();\n }\n return this._text;\n }\n\n /**\n * Lazily parses and validates form body.\n * Supports both application/x-www-form-urlencoded and multipart/form-data\n */\n get form(): Promise<InferObject<S['form'], FormData>> {\n if (this._form) return this._form;\n\n const schema = this._schema?.form;\n this._form = (async () => {\n const buffer = await this._readBody();\n const contentType = this._headersMap.get('content-type') || '';\n\n // Check if multipart/form-data\n if (contentType.startsWith('multipart/form-data')) {\n // Use Web Request API for multipart parsing\n // Construct a full URL for the Request object\n const fullUrl = `http://localhost${this.url}`;\n\n const headers = new Headers();\n this._headersMap.forEach((value, key) => {\n headers.set(key, value);\n });\n\n const request = new Request(fullUrl, {\n method: this.method,\n headers,\n body: new Uint8Array(buffer),\n // @ts-ignore - duplex is needed for streaming\n duplex: 'half'\n });\n\n const formData = await request.formData();\n\n if (schema) {\n const result: any = {};\n for (const key in schema) {\n try {\n result[key] = schema[key](formData.get(key));\n } catch (err: any) {\n throw new Error(`Form Body validation failed for \"${key}\": ${err.message}`);\n }\n }\n return result;\n }\n\n return formData as any;\n }\n\n // URL-encoded form data\n const text = buffer.toString('utf8');\n const formData = new Map<string, string>();\n const pairs = text.split('&');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key) {\n formData.set(\n decodeURIComponent(key),\n value ? decodeURIComponent(value.replace(/\\+/g, ' ')) : ''\n );\n }\n }\n\n if (schema) {\n const result: any = {};\n for (const key in schema) {\n try {\n result[key] = schema[key](formData.get(key) ?? null);\n } catch (err: any) {\n throw new Error(`Form Body validation failed for \"${key}\": ${err.message}`);\n }\n }\n return result;\n }\n\n return Object.fromEntries(formData) as any;\n })();\n\n return this._form;\n }\n}\n","/**\n * Ken Framework - uWebSockets.js WebSocket Adapter\n * Uses uWS native WebSocket support for maximum performance\n * \n * uWS has built-in pub/sub, compression, ping/pong, and backpressure — \n * we leverage all native features.\n * \n * MIT License - Copyright (c) 2025 Indra Gunawan\n */\n\nimport {\n type WsPeer,\n type WsHandler,\n type WsOptions,\n type WsMessageData,\n type WsReadyStateValue,\n WsReadyState,\n WS_DEFAULTS,\n} from './types';\nimport { type PubSubPeer } from './pubsub';\n\n// ==================== uWS WebSocket Types ====================\n\ninterface UwsWebSocket<T> {\n send(message: string | ArrayBuffer | Uint8Array, isBinary?: boolean, compress?: boolean): number;\n close(): void;\n end(code?: number, shortMessage?: string): void;\n subscribe(topic: string | ArrayBuffer): boolean;\n unsubscribe(topic: string | ArrayBuffer): boolean;\n publish(topic: string | ArrayBuffer, message: string | ArrayBuffer | Uint8Array, isBinary?: boolean, compress?: boolean): boolean;\n isSubscribed(topic: string | ArrayBuffer): boolean;\n ping(message?: string | ArrayBuffer | Uint8Array): number;\n getRemoteAddressAsText(): ArrayBuffer;\n getUserData(): T;\n}\n\n// Text decoder for IP address\nconst textDecoder = new TextDecoder();\n\n// ==================== UwsWsPeer ====================\n\n/**\n * uWS WebSocket peer.\n * Thin wrapper that delegates directly to uWS native WebSocket.\n */\nclass UwsWsPeer<T> implements WsPeer<T>, PubSubPeer {\n private ws: UwsWebSocket<{ userData: T; }>;\n private _remoteAddress: string | null = null;\n public readyState: WsReadyStateValue = WsReadyState.OPEN;\n\n constructor(ws: UwsWebSocket<{ userData: T; }>) {\n this.ws = ws;\n }\n\n get data(): T {\n return this.ws.getUserData().userData;\n }\n\n set data(value: T) {\n this.ws.getUserData().userData = value;\n }\n\n get remoteAddress(): string {\n if (this._remoteAddress === null) {\n this._remoteAddress = textDecoder.decode(this.ws.getRemoteAddressAsText());\n }\n return this._remoteAddress;\n }\n\n send(data: WsMessageData, compress?: boolean): number {\n const isBinary = typeof data !== 'string';\n return this.ws.send(data as any, isBinary, compress);\n }\n\n close(code?: number, reason?: string): void {\n this.ws.end(code, reason);\n }\n\n subscribe(topic: string): void {\n this.ws.subscribe(topic);\n }\n\n unsubscribe(topic: string): void {\n this.ws.unsubscribe(topic);\n }\n\n publish(topic: string, data: WsMessageData, compress?: boolean): void {\n const isBinary = typeof data !== 'string';\n this.ws.publish(topic, data as any, isBinary, compress);\n }\n\n isSubscribed(topic: string): boolean {\n return this.ws.isSubscribed(topic);\n }\n\n ping(data?: WsMessageData): void {\n this.ws.ping(data as any);\n }\n\n pong(_data?: WsMessageData): void {\n // uWS handles pong automatically\n }\n}\n\n// ==================== uWS WebSocket Config Builder ====================\n\n/**\n * Build uWS-native WebSocket behavior config from Ken's WsHandler.\n * Used by the uWS runtime adapter.\n */\nexport function createUwsWsConfig<T>(\n handler: WsHandler<T>,\n options: WsOptions = {},\n): {\n behavior: {\n upgrade?: (res: any, req: any, context: any) => void;\n open: (ws: UwsWebSocket<{ userData: T; }>) => void;\n message: (ws: UwsWebSocket<{ userData: T; }>, message: ArrayBuffer, isBinary: boolean) => void;\n close: (ws: UwsWebSocket<{ userData: T; }>, code: number, message: ArrayBuffer) => void;\n ping?: (ws: UwsWebSocket<{ userData: T; }>, message: ArrayBuffer) => void;\n pong?: (ws: UwsWebSocket<{ userData: T; }>, message: ArrayBuffer) => void;\n compression?: number;\n maxPayloadLength?: number;\n maxBackpressure?: number;\n idleTimeout?: number;\n sendPingsAutomatically?: boolean;\n };\n} {\n const opts: Required<WsOptions> = { ...WS_DEFAULTS, ...options };\n\n // Peer lookup: native ws -> KenPeer\n const peerMap = new WeakMap<UwsWebSocket<{ userData: T; }>, UwsWsPeer<T>>();\n\n function getPeer(ws: UwsWebSocket<{ userData: T; }>): UwsWsPeer<T> {\n let peer = peerMap.get(ws);\n if (!peer) {\n peer = new UwsWsPeer<T>(ws);\n peerMap.set(ws, peer);\n }\n return peer;\n }\n\n const behavior = {\n maxPayloadLength: opts.maxPayloadLength,\n maxBackpressure: opts.backpressureLimit,\n idleTimeout: opts.idleTimeout,\n sendPingsAutomatically: opts.pingInterval > 0,\n compression: opts.perMessageDeflate ? 1 : 0, // SHARED_COMPRESSOR\n\n upgrade: handler.upgrade ? async (res: any, req: any, context: any) => {\n // Capture headers before they're invalidated\n const headers = new Headers();\n req.forEach((key: string, value: string) => {\n headers.set(key, value);\n });\n const query = req.getQuery();\n const url = `http://localhost${req.getUrl()}${query ? '?' + query : ''}`;\n const request = new Request(url, { method: req.getMethod().toUpperCase(), headers });\n\n // Mark as not aborted\n let aborted = false;\n res.onAborted(() => { aborted = true; });\n\n try {\n const result = await handler.upgrade!(request);\n\n if (aborted) return;\n\n if (result instanceof Response) {\n // Reject upgrade\n res.cork(() => {\n res.writeStatus(`${result.status}`);\n result.headers.forEach((v: string, k: string) => {\n res.writeHeader(k, v);\n });\n res.end();\n });\n return;\n }\n\n // Accept upgrade\n res.cork(() => {\n res.upgrade(\n { userData: result },\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context,\n );\n });\n } catch {\n if (!aborted) {\n res.cork(() => {\n res.writeStatus('500').end();\n });\n }\n }\n } : undefined,\n\n open(ws: UwsWebSocket<{ userData: T; }>): void {\n const peer = getPeer(ws);\n try {\n handler.open?.(peer);\n } catch { /* ignore */ }\n },\n\n message(ws: UwsWebSocket<{ userData: T; }>, message: ArrayBuffer, isBinary: boolean): void {\n const peer = getPeer(ws);\n try {\n const data: WsMessageData = isBinary ? message : new TextDecoder().decode(message);\n handler.message(peer, data);\n } catch { /* ignore */ }\n },\n\n close(ws: UwsWebSocket<{ userData: T; }>, code: number, message: ArrayBuffer): void {\n const peer = getPeer(ws);\n peer.readyState = WsReadyState.CLOSED;\n peerMap.delete(ws);\n const reason = message.byteLength > 0 ? new TextDecoder().decode(message) : '';\n try {\n handler.close?.(peer, code, reason);\n } catch { /* ignore */ }\n },\n\n ping: handler.ping ? (ws: UwsWebSocket<{ userData: T; }>, message: ArrayBuffer): void => {\n const peer = getPeer(ws);\n try {\n handler.ping!(peer, message);\n } catch { /* ignore */ }\n } : undefined,\n\n pong: handler.pong ? (ws: UwsWebSocket<{ userData: T; }>, message: ArrayBuffer): void => {\n const peer = getPeer(ws);\n try {\n handler.pong!(peer, message);\n } catch { /* ignore */ }\n } : undefined,\n };\n\n return { behavior };\n}\n","/**\n * Ken Framework - uWebSockets.js Runtime\n * Uses uWS native APIs without Web conversion\n * Native routing with .get()/.post() methods\n * \n * MIT License - Copyright (c) 2025 Indra Gunawan\n */\n\nimport { Router } from '../core/router';\nimport { UwsContext } from '../context/uws';\nimport { type Schema, type GetRemoteInfo } from '../context/types';\nimport { createExecutor, createNotFoundExecutor, type ContextFactory } from './compiler';\nimport { toResponse } from '../utils/response';\nimport { canUseNativeRoute } from '../utils/pathname';\nimport { type WsRoute } from '../ws/types';\nimport { createUwsWsConfig } from '../ws/uws';\n\n// uWebSockets.js type declarations\ntype RecognizedString = string | ArrayBuffer | Uint8Array;\n\ninterface HttpResponse {\n writeStatus(status: RecognizedString): HttpResponse;\n writeHeader(key: RecognizedString, value: RecognizedString): HttpResponse;\n write(chunk: RecognizedString): boolean;\n end(body?: RecognizedString, closeConnection?: boolean): HttpResponse;\n getRemoteAddressAsText(): ArrayBuffer;\n onAborted(handler: () => void): HttpResponse;\n onData(handler: (chunk: ArrayBuffer, isLast: boolean) => void): HttpResponse;\n cork(callback: () => void): HttpResponse;\n}\n\ninterface HttpRequest {\n getMethod(): string;\n getUrl(): string;\n getQuery(): string;\n getQuery(key: string): string | undefined;\n getHeader(name: string): string;\n getParameter(index: number): string;\n forEach(callback: (key: string, value: string) => void): void;\n}\n\ninterface ListenSocket {\n close(): void;\n}\n\ninterface TemplatedApp {\n get(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n post(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n put(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n del(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n patch(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n options(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n head(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n any(pattern: string, handler: (res: HttpResponse, req: HttpRequest) => void | Promise<void>): TemplatedApp;\n ws(pattern: string, behavior: any): TemplatedApp;\n listen(port: number, callback: (listenSocket: ListenSocket | false) => void): TemplatedApp;\n listen(host: string, port: number, callback: (listenSocket: ListenSocket | false) => void): TemplatedApp;\n}\n\n// Text decoder for IP address\nconst textDecoder = new TextDecoder();\n\n/**\n * Convert Web Response to uWS HttpResponse\n */\nasync function sendUwsResponse(uwsRes: HttpResponse, response: Response, aborted: { value: boolean; }): Promise<void> {\n if (aborted.value) return;\n\n const status = `${response.status} ${response.statusText || 'OK'}`;\n const body = response.body;\n\n uwsRes.cork(() => {\n uwsRes.writeStatus(status);\n\n response.headers.forEach((value, key) => {\n uwsRes.writeHeader(key, value);\n });\n\n if (!body) {\n uwsRes.end();\n }\n });\n\n if (body && !aborted.value) {\n const reader = body.getReader();\n try {\n while (!aborted.value) {\n const { done, value } = await reader.read();\n if (done) break;\n uwsRes.cork(() => {\n uwsRes.write(value);\n });\n }\n } finally {\n reader.releaseLock();\n if (!aborted.value) {\n uwsRes.cork(() => {\n uwsRes.end();\n });\n }\n }\n }\n}\n\n/**\n * Get remote address from uWS response\n */\nfunction getRemoteInfoFromUws(res: HttpResponse): GetRemoteInfo {\n return () => {\n const addressBuffer = res.getRemoteAddressAsText();\n const address = textDecoder.decode(addressBuffer);\n return {\n address,\n port: 0, // uWS doesn't provide port\n };\n };\n}\n\n/**\n * Convert Ken path to uWS pattern\n * Ken: /users/:id -> uWS: /users/:id\n * Ken: /files/* -> uWS: /files/*\n */\nfunction toUwsPattern(kenPath: string): string {\n // uWS uses same pattern syntax as Ken for :params\n // For wildcards, uWS uses /*\n return kenPath;\n}\n\n/**\n * Extract params from uWS request based on pattern\n */\nfunction extractUwsParams(req: HttpRequest, pattern: string): Record<string, string> {\n const paramNames: string[] = [];\n const parts = pattern.split('/');\n\n for (const part of parts) {\n if (part.startsWith(':')) {\n paramNames.push(part.slice(1).replace('?', '')); // Remove ? for optional\n }\n }\n\n if (paramNames.length === 0) {\n return {};\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < paramNames.length; i++) {\n const value = req.getParameter(i);\n if (value) {\n params[paramNames[i]] = value;\n }\n }\n return params;\n}\n\n/**\n * UwsContext factory for uWS runtime\n */\nconst uwsContextFactory: ContextFactory<{ req: HttpRequest; res: HttpResponse; }, UwsContext> = (\n { req, res },\n params: Record<string, string>,\n getRemoteInfo: GetRemoteInfo,\n schema?: Schema\n) => new UwsContext(req as any, res as any, params, getRemoteInfo, schema);\n\nexport function server({ port, hostname, router }: {\n port?: number;\n hostname?: string;\n router: Router;\n}) {\n let listenSocket: ListenSocket | undefined = undefined;\n\n // Import uWS dynamically\n const getUws = async (): Promise<{ App: () => TemplatedApp; }> => {\n try {\n const uws = await import('uWebSockets.js');\n return uws as any;\n } catch {\n throw new Error('uWebSockets.js is required for uWS runtime. Install with: npm install uWebSockets.js');\n }\n };\n\n return {\n async run(): Promise<{ hostname: string; port: number; }> {\n if (listenSocket) {\n listenSocket.close();\n }\n\n const uws = await getUws();\n const app = uws.App();\n\n // Register WebSocket routes\n const wsRoutes: WsRoute<any>[] = (router as any).wsRoutes || [];\n for (const wsRoute of wsRoutes) {\n const wsConfig = createUwsWsConfig(wsRoute.handler, wsRoute.options);\n app.ws(wsRoute.path, wsConfig.behavior);\n }\n\n // Group routes by whether they can use native routing\n const nativeRoutes: Array<{ method: string; pattern: string; handler?: any; schema?: Schema; staticValue?: unknown; }> = [];\n const fallbackRoutes: typeof router.routes = [];\n\n for (const route of router.routes) {\n // Get merged schema\n let mergedSchema = route.schema;\n if (typeof (router as any).matchMiddleware === 'function' && typeof (router as any).mergeSchemas === 'function') {\n const matchedMiddleware = (router as any).matchMiddleware(route.path);\n mergedSchema = (router as any).mergeSchemas(matchedMiddleware, route.schema);\n }\n\n if (canUseNativeRoute(route.path)) {\n nativeRoutes.push({\n method: route.method,\n pattern: route.path,\n handler: route.handler,\n schema: mergedSchema,\n staticValue: route.staticValue,\n });\n } else {\n fallbackRoutes.push({ ...route, schema: mergedSchema });\n }\n }\n\n // Register native routes\n for (const route of nativeRoutes) {\n const uwsPattern = toUwsPattern(route.pattern);\n const methodLower = route.method.toLowerCase();\n const registerMethod = methodLower === 'delete' ? 'del' : methodLower;\n\n if (route.staticValue !== undefined) {\n // Static value - cache response\n const cachedResponse = toResponse(route.staticValue);\n const status = `${cachedResponse.status} ${cachedResponse.statusText || 'OK'}`;\n const headers: Array<[string, string]> = [];\n cachedResponse.headers.forEach((v, k) => headers.push([k, v]));\n\n // Pre-extract body for sync response\n cachedResponse.text().then(body => {\n const headerCount = headers.length;\n\n if (headerCount === 1) {\n // Fast path: single header (most common for JSON static values)\n const [hk, hv] = headers[0];\n (app as any)[registerMethod](uwsPattern, (res: HttpResponse) => {\n res.cork(() => {\n res.writeStatus(status);\n res.writeHeader(hk, hv);\n res.end(body);\n });\n });\n } else {\n // Multi-header path\n (app as any)[registerMethod](uwsPattern, (res: HttpResponse) => {\n res.cork(() => {\n res.writeStatus(status);\n for (let i = 0; i < headerCount; i++) {\n res.writeHeader(headers[i][0], headers[i][1]);\n }\n res.end(body);\n });\n });\n }\n });\n } else if (route.handler) {\n // Dynamic handler with middleware execution\n const executor = createExecutor(uwsContextFactory, route.handler, route.schema);\n const pattern = route.pattern;\n\n (app as any)[registerMethod](uwsPattern, async (res: HttpResponse, req: HttpRequest) => {\n const aborted = { value: false };\n res.onAborted(() => { aborted.value = true; });\n\n const params = extractUwsParams(req, pattern);\n const getRemoteInfo = getRemoteInfoFromUws(res);\n\n try {\n const result = await executor({ req, res }, params, getRemoteInfo);\n if (!aborted.value) {\n const response = toResponse(result);\n await sendUwsResponse(res, response, aborted);\n }\n } catch (error) {\n if (!aborted.value) {\n const errResponse = error instanceof Response\n ? error\n : new Response(error instanceof Error ? error.message : String(error), { status: 500 });\n await sendUwsResponse(res, errResponse, aborted);\n }\n }\n });\n }\n }\n\n // Register fallback router for optional params and wildcards\n const fallbackRouter = new Router();\n let match: ((method: string, pathname: string) => any) | null = null;\n\n if (fallbackRoutes.length > 0) {\n for (const route of fallbackRoutes) {\n if (route.handler) {\n const executor = createExecutor(uwsContextFactory, route.handler, route.schema);\n fallbackRouter.registerCompiled(route.method, route.path, executor as any, route.schema);\n } else if (route.staticValue !== undefined) {\n // For static values, create a simple handler\n const staticValue = route.staticValue;\n fallbackRouter.registerCompiled(route.method, route.path, () => staticValue, route.schema, toResponse(staticValue));\n }\n }\n // Hoist matcher for non-native routes\n match = fallbackRouter.matcher();\n }\n\n // Pre-compile 404 handler with global middleware (outside fallback block)\n const notFoundExecutor = createNotFoundExecutor(router, uwsContextFactory);\n\n // Always register catch-all handler for fallback routes and 404s\n app.any('/*', async (res: HttpResponse, req: HttpRequest) => {\n const aborted = { value: false };\n res.onAborted(() => { aborted.value = true; });\n\n const method = req.getMethod().toUpperCase();\n const pathname = req.getUrl();\n\n // Try fallback router first (if it exists)\n const matchResult = match ? match(method, pathname) : undefined;\n\n if (matchResult !== undefined) {\n const getRemoteInfo = getRemoteInfoFromUws(res);\n\n try {\n // Check if it's a cached static response\n if (matchResult.response !== undefined) {\n await sendUwsResponse(res, matchResult.response.clone(), aborted);\n } else {\n const result = await matchResult.handler({ req, res }, matchResult.params, getRemoteInfo);\n if (!aborted.value) {\n const response = toResponse(result);\n await sendUwsResponse(res, response, aborted);\n }\n }\n } catch (error) {\n if (!aborted.value) {\n const errResponse = error instanceof Response\n ? error\n : new Response(error instanceof Error ? error.message : String(error), { status: 500 });\n await sendUwsResponse(res, errResponse, aborted);\n }\n }\n } else {\n // Execute 404 with middleware if available\n if (notFoundExecutor) {\n const getRemoteInfo = getRemoteInfoFromUws(res);\n try {\n const result = await notFoundExecutor({ req, res }, getRemoteInfo, pathname);\n if (!aborted.value) {\n const response = toResponse(result);\n await sendUwsResponse(res, response, aborted);\n }\n } catch (error) {\n if (!aborted.value) {\n const errResponse = error instanceof Response\n ? error\n : new Response(error instanceof Error ? error.message : String(error), { status: 500 });\n await sendUwsResponse(res, errResponse, aborted);\n }\n }\n } else {\n // 404 Not Found\n res.cork(() => {\n res.writeStatus('404').end('Not Found');\n });\n }\n }\n });\n\n return new Promise((resolve, reject) => {\n const listenPort = port || 3000;\n const listenHost = hostname || '0.0.0.0';\n\n app.listen(listenHost, listenPort, (token) => {\n if (token) {\n listenSocket = token;\n resolve({ hostname: listenHost, port: listenPort });\n } else {\n reject(new Error(`Failed to listen on ${listenHost}:${listenPort}`));\n }\n });\n });\n },\n\n stop() {\n if (listenSocket) {\n listenSocket.close();\n listenSocket = undefined;\n }\n }\n };\n}\n\n// console.log('uWS runtime module loaded.');"],"mappings":"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","names":["formData","textDecoder"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@coderbuzz/ken",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup --config tsup.config.ts && bun ../../scripts/post-build.ts .",
|
|
23
|
+
"dev": "tsup --config tsup.config.ts --watch",
|
|
24
|
+
"test": "bun test",
|
|
25
|
+
"prepublishOnly": "bun run build"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@coderbuzz/kyo": "workspace:*",
|
|
29
|
+
"@types/bun": "^1.2.12",
|
|
30
|
+
"@types/node": "^25.9.0",
|
|
31
|
+
"tsx": "^4.22.3",
|
|
32
|
+
"uWebSockets.js": "unetworking/uWebSockets.js#v20.66.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {}
|
|
35
|
+
}
|