commit 84ebc0d8df234da914834b2357d7a7222f19e318 Author: Lalit Mohan Kalpasi Date: Tue Jun 17 09:51:25 2025 +0000 code update recorded at: 17/06/25 09:51:25 diff --git a/handler.js b/handler.js new file mode 100644 index 0000000..19b91b1 --- /dev/null +++ b/handler.js @@ -0,0 +1,133 @@ +// === Handler === +export const postHandler = async (req, res) => { + try { + const modified = processPostRequest(req.body?.response); + return res.status(200).json(modified); + } catch (err) { + return handleError(err, res); + } +}; + +// === Core Processing === +function processPostRequest(response) { + if (!response || typeof response !== 'object') { + throw new InvalidJsonContentTypeError('Missing or invalid response body', 400); + } + + const modified = postRequestHandlerWrapper(response); + return modified; +} + +// === Unified Error Handler === +function handleError(err, res) { + const isJsonTypeError = err instanceof InvalidJsonContentTypeError || + err?.message?.includes('Body content-type is not valid JSON'); + + const status = isJsonTypeError ? err.statusCode || 415 : 500; + + return res.status(status).json({ + error: err.name || 'InternalServerError', + message: err.message || 'Unexpected error occurred', + ...(err.details && { details: err.details }), + }); +} +let currentResponse = null; +let postContext = null; + +function createPostContext() { + return { + addedHeaders: {}, + removedHeaders: [], + modifiedBody: null, + modifiedStatus: null, + }; +} + +export function postRequestHandlerWrapper(response) { + postContext = createPostContext(); + currentResponse = response; + postRequestHandler(); + const ctx = postContext; + postContext = null; + currentResponse = null; + return ctx; +} + +export function postRequestHandler() { + setHeader('x-post-transform', 'applied'); + removeHeader('x-unwanted-header'); + + const body = getJsonBody(); + if (body) { + body.modifiedAt = new Date().toISOString(); + body.transformed = "transformed***********"; + setJsonBody(body); + } + + setStatus(202); +} +export function setHeader(key, value) { + if (!currentResponse?.headers) currentResponse.headers = {}; + currentResponse.headers[key.toLowerCase()] = value; + postContext?.addedHeaders && (postContext.addedHeaders[key.toLowerCase()] = value); +} + +export function removeHeader(key) { + if (currentResponse?.headers?.[key.toLowerCase()] !== undefined) { + delete currentResponse.headers[key.toLowerCase()]; + postContext?.removedHeaders?.push(key.toLowerCase()); + } +} + +export function getHeader(key) { + if (!currentResponse?.headers) return null; + return currentResponse.headers[key.toLowerCase()] || null; +} + +export function getJsonBody() { + if (!currentResponse?.body) return null; + + const contentType = currentResponse.contentType || currentResponse.headers?.['content-type'] || ''; + + if (!contentType.includes('application/json')) { + throw new InvalidJsonContentTypeError(); + } + + try { + return typeof currentResponse.body === 'string' + ? JSON.parse(currentResponse.body) + : currentResponse.body; + } catch (err) { + throw new InvalidJsonContentTypeError('Failed to parse JSON body', 415, { originalError: err }); + } +} + +export function setJsonBody(json) { + const contentType = currentResponse.contentType || currentResponse.headers?.['content-type'] || ''; + + if (!contentType.includes('application/json')) { + throw new InvalidJsonContentTypeError(); + } + + try { + currentResponse.body = JSON.stringify(json); + postContext && (postContext.modifiedBody = json); + } catch (err) { + throw new InvalidJsonContentTypeError('Failed to stringify JSON body', 415, { originalError: err }); + } +} + +export function setStatus(statusCode) { + if (typeof statusCode === 'number') { + currentResponse.status = statusCode; + postContext && (postContext.modifiedStatus = statusCode); + } +} +export class InvalidJsonContentTypeError extends Error { + constructor(message = 'Body content-type is not valid JSON', statusCode = 415, details = {}) { + super(message); + this.name = 'InvalidJsonContentTypeError'; + this.statusCode = statusCode; + this.details = details; + } +}