{"version":3,"sources":["../../../src/gateway/gateway.ts"],"sourcesContent":["import { performanceNow, toQueryString, isPlainObject } from '../utils/index'\nimport { configs as defaultConfigs } from '../mappersmith'\nimport { Request } from '../request'\nimport { Response } from '../response'\nimport { isTimeoutError } from './timeout-error'\nimport type { GatewayConfiguration } from './types'\nimport type { Primitive } from '../types'\n\nconst REGEXP_EMULATE_HTTP = /^(delete|put|patch)/i\n\nexport class Gateway {\n  public request: Request\n  public configs: GatewayConfiguration\n  public successCallback: (res: Response) => void\n  public failCallback: (res: Response) => void\n\n  constructor(request: Request, configs: GatewayConfiguration) {\n    this.request = request\n    this.configs = configs\n    this.successCallback = function () {\n      return undefined\n    }\n    this.failCallback = function () {\n      return undefined\n    }\n  }\n\n  public get() {\n    throw new Error('Not implemented')\n  }\n\n  public head() {\n    throw new Error('Not implemented')\n  }\n\n  public post() {\n    throw new Error('Not implemented')\n  }\n\n  public put() {\n    throw new Error('Not implemented')\n  }\n\n  public patch() {\n    throw new Error('Not implemented')\n  }\n\n  public delete() {\n    throw new Error('Not implemented')\n  }\n\n  options() {\n    return this.configs\n  }\n\n  shouldEmulateHTTP() {\n    return this.options().emulateHTTP && REGEXP_EMULATE_HTTP.test(this.request.method())\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  call(): Promise<any> {\n    const timeStart = performanceNow()\n    if (!defaultConfigs.Promise) {\n      throw new Error('[Mappersmith] Promise not configured (configs.Promise)')\n    }\n    return new defaultConfigs.Promise((resolve, reject) => {\n      this.successCallback = (response) => {\n        response.timeElapsed = performanceNow() - timeStart\n        resolve(response)\n      }\n\n      this.failCallback = (response) => {\n        response.timeElapsed = performanceNow() - timeStart\n        reject(response)\n      }\n\n      try {\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        this[this.request.method()].apply(this, arguments) // eslint-disable-line prefer-spread,prefer-rest-params\n      } catch (e: unknown) {\n        const err: Error = e as Error\n        this.dispatchClientError(err.message, err)\n      }\n    })\n  }\n\n  dispatchResponse(response: Response) {\n    response.success() ? this.successCallback(response) : this.failCallback(response)\n  }\n\n  dispatchClientError(message: string, error: Error) {\n    if (isTimeoutError(error) && this.options().enableHTTP408OnTimeouts) {\n      this.failCallback(new Response(this.request, 408, message, {}, [error]))\n    } else {\n      this.failCallback(new Response(this.request, 400, message, {}, [error]))\n    }\n  }\n\n  prepareBody(method: string, headers: Record<string, Primitive>) {\n    let body = this.request.body()\n\n    if (this.shouldEmulateHTTP()) {\n      body = body || {}\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      isPlainObject(body) && ((body as any)['_method'] = method)\n      headers['x-http-method-override'] = method\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const bodyString = toQueryString(body as any)\n\n    if (bodyString) {\n      // If it's not simple, let the browser (or the user) set it\n      if (isPlainObject(body)) {\n        headers['content-type'] = 'application/x-www-form-urlencoded;charset=utf-8'\n      }\n    }\n\n    return bodyString\n  }\n}\n\nexport default Gateway\n"],"mappings":";AAAA,SAAS,gBAAgB,eAAe,qBAAqB;AAC7D,SAAS,WAAW,sBAAsB;AAE1C,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAI/B,IAAM,sBAAsB;AAErB,IAAM,UAAN,MAAc;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,SAAkB,SAA+B;AAC3D,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,kBAAkB,WAAY;AACjC,aAAO;AAAA,IACT;AACA,SAAK,eAAe,WAAY;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,MAAM;AACX,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEO,OAAO;AACZ,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEO,OAAO;AACZ,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEO,MAAM;AACX,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEO,QAAQ;AACb,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEO,SAAS;AACd,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,QAAQ,EAAE,eAAe,oBAAoB,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,EACrF;AAAA;AAAA,EAGA,OAAqB;AACnB,UAAM,YAAY,eAAe;AACjC,QAAI,CAAC,eAAe,SAAS;AAC3B,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AACA,WAAO,IAAI,eAAe,QAAQ,CAAC,SAAS,WAAW;AACrD,WAAK,kBAAkB,CAAC,aAAa;AACnC,iBAAS,cAAc,eAAe,IAAI;AAC1C,gBAAQ,QAAQ;AAAA,MAClB;AAEA,WAAK,eAAe,CAAC,aAAa;AAChC,iBAAS,cAAc,eAAe,IAAI;AAC1C,eAAO,QAAQ;AAAA,MACjB;AAEA,UAAI;AAGF,aAAK,KAAK,QAAQ,OAAO,CAAC,EAAE,MAAM,MAAM,SAAS;AAAA,MACnD,SAAS,GAAY;AACnB,cAAM,MAAa;AACnB,aAAK,oBAAoB,IAAI,SAAS,GAAG;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,UAAoB;AACnC,aAAS,QAAQ,IAAI,KAAK,gBAAgB,QAAQ,IAAI,KAAK,aAAa,QAAQ;AAAA,EAClF;AAAA,EAEA,oBAAoB,SAAiB,OAAc;AACjD,QAAI,eAAe,KAAK,KAAK,KAAK,QAAQ,EAAE,yBAAyB;AACnE,WAAK,aAAa,IAAI,SAAS,KAAK,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,IACzE,OAAO;AACL,WAAK,aAAa,IAAI,SAAS,KAAK,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,YAAY,QAAgB,SAAoC;AAC9D,QAAI,OAAO,KAAK,QAAQ,KAAK;AAE7B,QAAI,KAAK,kBAAkB,GAAG;AAC5B,aAAO,QAAQ,CAAC;AAEhB,oBAAc,IAAI,MAAO,KAAa,SAAS,IAAI;AACnD,cAAQ,wBAAwB,IAAI;AAAA,IACtC;AAGA,UAAM,aAAa,cAAc,IAAW;AAE5C,QAAI,YAAY;AAEd,UAAI,cAAc,IAAI,GAAG;AACvB,gBAAQ,cAAc,IAAI;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEA,IAAO,kBAAQ;","names":[]}