1*8d307f52SEvan Baconimport { CacheObject } from 'cacache';
2*8d307f52SEvan Baconimport { BodyInit, Response, ResponseInit } from 'node-fetch';
3*8d307f52SEvan Bacon
4*8d307f52SEvan Baconconst responseInternalSymbol = Object.getOwnPropertySymbols(new Response())[1];
5*8d307f52SEvan Bacon
6*8d307f52SEvan Baconexport class NFCResponse extends Response {
7*8d307f52SEvan Bacon  constructor(
8*8d307f52SEvan Bacon    bodyStream?: BodyInit,
9*8d307f52SEvan Bacon    metaData?: ResponseInit,
10*8d307f52SEvan Bacon    public ejectFromCache: () => Promise<[CacheObject, CacheObject]> = function ejectFromCache(
11*8d307f52SEvan Bacon      this: any
12*8d307f52SEvan Bacon    ) {
13*8d307f52SEvan Bacon      return this.ejectSelfFromCache();
14*8d307f52SEvan Bacon    },
15*8d307f52SEvan Bacon    public fromCache: boolean = false
16*8d307f52SEvan Bacon  ) {
17*8d307f52SEvan Bacon    super(bodyStream, metaData);
18*8d307f52SEvan Bacon  }
19*8d307f52SEvan Bacon
20*8d307f52SEvan Bacon  static serializeMetaFromNodeFetchResponse(res: Response) {
21*8d307f52SEvan Bacon    const metaData = {
22*8d307f52SEvan Bacon      url: res.url,
23*8d307f52SEvan Bacon      status: res.status,
24*8d307f52SEvan Bacon      statusText: res.statusText,
25*8d307f52SEvan Bacon      headers: res.headers.raw(),
26*8d307f52SEvan Bacon      size: res.size,
27*8d307f52SEvan Bacon      timeout: res.timeout,
28*8d307f52SEvan Bacon      // @ts-ignore
29*8d307f52SEvan Bacon      counter: res[responseInternalSymbol].counter,
30*8d307f52SEvan Bacon    };
31*8d307f52SEvan Bacon
32*8d307f52SEvan Bacon    return metaData;
33*8d307f52SEvan Bacon  }
34*8d307f52SEvan Bacon}
35