( req: IncomingMessage, res: ServerResponse, next: () => void, )
| 74 | * it back to the client. |
| 75 | */ |
| 76 | export function proxyResponse( |
| 77 | req: IncomingMessage, |
| 78 | res: ServerResponse, |
| 79 | next: () => void, |
| 80 | ): ServerResponse { |
| 81 | const proxiedRes = new ServerResponse(req); |
| 82 | // Object to store the original response methods |
| 83 | const buffer: [ |
| 84 | string, |
| 85 | Parameters<ServerResponse["write" | "setHeader" | "removeHeader" | "writeHead" | "end"]>, |
| 86 | ][] = []; |
| 87 | |
| 88 | // Proxy the response methods |
| 89 | // The apply handler is called when the method e.g. write, setHeader, etc. is called |
| 90 | // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler/apply |
| 91 | // The target is the original method |
| 92 | // The thisArg is the proxied response |
| 93 | // The args are the arguments passed to the method |
| 94 | proxiedRes.write = new Proxy(proxiedRes.write.bind(proxiedRes), { |
| 95 | apply: ( |
| 96 | target: ServerResponse["write"], |
| 97 | thisArg: ServerResponse, |
| 98 | args: Parameters<ServerResponse["write"]>, |
| 99 | ) => { |
| 100 | // call the original write method on the proxied response |
| 101 | target.call(thisArg, ...args); |
| 102 | // store the method call in the buffer |
| 103 | buffer.push(["write", args]); |
| 104 | }, |
| 105 | }); |
| 106 | |
| 107 | proxiedRes.setHeader = new Proxy(proxiedRes.setHeader.bind(proxiedRes), { |
| 108 | apply: ( |
| 109 | target: ServerResponse["setHeader"], |
| 110 | thisArg: ServerResponse, |
| 111 | args: Parameters<ServerResponse["setHeader"]>, |
| 112 | ) => { |
| 113 | target.call(thisArg, ...args); |
| 114 | buffer.push(["setHeader", args]); |
| 115 | }, |
| 116 | }); |
| 117 | proxiedRes.removeHeader = new Proxy(proxiedRes.removeHeader.bind(proxiedRes), { |
| 118 | apply: ( |
| 119 | target: ServerResponse["removeHeader"], |
| 120 | thisArg: ServerResponse, |
| 121 | args: Parameters<ServerResponse["removeHeader"]>, |
| 122 | ) => { |
| 123 | target.call(thisArg, ...args); |
| 124 | buffer.push(["removeHeader", args]); |
| 125 | }, |
| 126 | }); |
| 127 | proxiedRes.writeHead = new Proxy(proxiedRes.writeHead.bind(proxiedRes), { |
| 128 | apply: ( |
| 129 | target: ServerResponse["writeHead"], |
| 130 | thisArg: ServerResponse, |
| 131 | args: Parameters<ServerResponse["writeHead"]>, |
| 132 | ) => { |
| 133 | target.call(thisArg, ...args); |
no test coverage detected
searching dependent graphs…