import importedFetch from 'node-fetch'; import { put } from './request/put'; import { post } from './request/post'; import { get } from './request/get'; import { head } from './request/head'; import { requestDelete } from './request/delete'; import { Configuration } from './configuration'; import { InstrumentationOverrides } from './types/internal'; import { TracingHeaders } from './types/tracing'; import { HttpRequest } from './types/request'; export class Base { public config: Configuration; public requestPost: Function; public requestPut: Function; public requestGet: Function; public requestHead: Function; public requestDelete: Function; public fetch: Function; public tracingHeaders: TracingHeaders; constructor(config: Configuration, { xRequestId, fetchOverride = importedFetch }: InstrumentationOverrides = {}) { this.config = config; // Tracing headers. this.tracingHeaders = { ...(xRequestId && { 'X-Request-Id': xRequestId }), 'X-Origin-System-Id': this.config.get('originSystemId'), }; this.requestPost = this.tracedRequest(post); this.requestPut = this.tracedRequest(put); this.requestGet = this.tracedRequest(get); this.requestHead = this.tracedRequest(head); this.requestDelete = this.tracedRequest(requestDelete); this.fetch = fetchOverride; } private tracedRequest(requestFunction: Function) { return async (originalArguments: HttpRequest) => { const tracedRequest = originalArguments; // Adding tracing headers tracedRequest.additionalHeaders = Object.assign({}, this.tracingHeaders, // Let additional headers override trace if needed. originalArguments.additionalHeaders ); return await requestFunction(tracedRequest, this.fetch); }; } public setOriginUser(userId: string) { this.tracingHeaders['X-Origin-User'] = userId; } }