remove map to prevent leak
This commit is contained in:
parent
b2b9fe8db5
commit
d3a78eb758
|
|
@ -30,9 +30,9 @@ import { pipeline } from 'stream/promises';
|
||||||
import { Transform } from 'stream';
|
import { Transform } from 'stream';
|
||||||
|
|
||||||
type InterceptorResult =
|
type InterceptorResult =
|
||||||
| { result: 'continue', guid: string, overrides?: NormalizedContinueOverrides }
|
| { result: 'continue', request: Request, overrides?: NormalizedContinueOverrides }
|
||||||
| { result: 'abort', guid: string, errorCode: string }
|
| { result: 'abort', request: Request, errorCode: string }
|
||||||
| { result: 'fulfill', guid: string, response: NormalizedFulfillResponse };
|
| { result: 'fulfill', request: Request, response: NormalizedFulfillResponse };
|
||||||
|
|
||||||
interface EventDelegate {
|
interface EventDelegate {
|
||||||
onRequest(request: Request): void;
|
onRequest(request: Request): void;
|
||||||
|
|
@ -44,7 +44,6 @@ interface EventDelegate {
|
||||||
|
|
||||||
export class ServerInterceptionRegistry extends SdkObject implements RequestContext {
|
export class ServerInterceptionRegistry extends SdkObject implements RequestContext {
|
||||||
private _eventDelegate: EventDelegate;
|
private _eventDelegate: EventDelegate;
|
||||||
private readonly _requests = new Map<string, Request>(); // TODO: dont memory leak requests
|
|
||||||
fetchRequest: APIRequestContext;
|
fetchRequest: APIRequestContext;
|
||||||
private _matches?: (url: string) => boolean;
|
private _matches?: (url: string) => boolean;
|
||||||
|
|
||||||
|
|
@ -63,22 +62,19 @@ export class ServerInterceptionRegistry extends SdkObject implements RequestCont
|
||||||
request.setRawRequestHeaders(headers);
|
request.setRawRequestHeaders(headers);
|
||||||
this._eventDelegate.onRequest(request);
|
this._eventDelegate.onRequest(request);
|
||||||
|
|
||||||
const guid = request.guid;
|
|
||||||
this._requests.set(guid, request);
|
|
||||||
|
|
||||||
if (!this._matches?.(url))
|
if (!this._matches?.(url))
|
||||||
return Promise.resolve({ result: 'continue', guid });
|
return Promise.resolve({ result: 'continue', request });
|
||||||
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
const route = new Route(request, {
|
const route = new Route(request, {
|
||||||
async abort(errorCode) {
|
async abort(errorCode) {
|
||||||
resolve({ result: 'abort', guid, errorCode });
|
resolve({ result: 'abort', request, errorCode });
|
||||||
},
|
},
|
||||||
async continue(overrides) {
|
async continue(overrides) {
|
||||||
resolve({ result: 'continue', guid, overrides });
|
resolve({ result: 'continue', request, overrides });
|
||||||
},
|
},
|
||||||
async fulfill(response) {
|
async fulfill(response) {
|
||||||
resolve({ result: 'fulfill', guid, response });
|
resolve({ result: 'fulfill', request, response });
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -86,18 +82,12 @@ export class ServerInterceptionRegistry extends SdkObject implements RequestCont
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
failed(guid: string, error: string) {
|
failed(request: Request, error: string) {
|
||||||
const request = this._requests.get(guid);
|
|
||||||
if (!request)
|
|
||||||
throw new Error('Internal error: missing request for response');
|
|
||||||
request._setFailureText(error);
|
request._setFailureText(error);
|
||||||
this._eventDelegate.onRequestFailed(request);
|
this._eventDelegate.onRequestFailed(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
response(guid: string, status: number, statusText: string, headers: HeadersArray, body: () => Promise<Buffer>, httpVersion: string, timing: ResourceTiming, securityDetails: SecurityDetails | undefined, serverAddr: RemoteAddr | undefined) {
|
response(request: Request, status: number, statusText: string, headers: HeadersArray, body: () => Promise<Buffer>, httpVersion: string, timing: ResourceTiming, securityDetails: SecurityDetails | undefined, serverAddr: RemoteAddr | undefined) {
|
||||||
const request = this._requests.get(guid);
|
|
||||||
if (!request)
|
|
||||||
throw new Error('Internal error: missing request for response');
|
|
||||||
const response = new Response(request, status, statusText, headers, timing, body, false, httpVersion);
|
const response = new Response(request, status, statusText, headers, timing, body, false, httpVersion);
|
||||||
response.setRawResponseHeaders(headers);
|
response.setRawResponseHeaders(headers);
|
||||||
response._securityDetailsFinished(securityDetails);
|
response._securityDetailsFinished(securityDetails);
|
||||||
|
|
@ -236,7 +226,7 @@ export class MockingProxy {
|
||||||
const address = socket.address() as AddressInfo;
|
const address = socket.address() as AddressInfo;
|
||||||
const responseBodyPromise = new ManualPromise<Buffer>();
|
const responseBodyPromise = new ManualPromise<Buffer>();
|
||||||
const response = this._registry.response(
|
const response = this._registry.response(
|
||||||
result.guid,
|
result.request,
|
||||||
proxyRes.statusCode!,
|
proxyRes.statusCode!,
|
||||||
proxyRes.statusMessage!, headersArray(proxyRes),
|
proxyRes.statusMessage!, headersArray(proxyRes),
|
||||||
() => responseBodyPromise,
|
() => responseBodyPromise,
|
||||||
|
|
@ -270,13 +260,13 @@ export class MockingProxy {
|
||||||
);
|
);
|
||||||
resolve();
|
resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this._registry.failed(result.guid, error.toString());
|
this._registry.failed(result.request, error.toString());
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
proxyReq.on('error', error => {
|
proxyReq.on('error', error => {
|
||||||
this._registry.failed(result.guid, error.toString());
|
this._registry.failed(result.request, error.toString());
|
||||||
res.statusCode = 502;
|
res.statusCode = 502;
|
||||||
res.end(resolve);
|
res.end(resolve);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue