{"version":3,"sources":["../../../../src/channels/A-Http/A-Http.channel.ts"],"names":[],"mappings":"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","file":"A-Http.channel.mjs","sourcesContent":["import { A_ServerError } from \"@adaas/a-server/server/A-Server.error\";\nimport { A_HTTPChannelError } from \"./A-Http.channel.error\";\nimport { A_SERVER_TYPES__HttpChannelRequestConfig, A_SERVER_TYPES__HttpChannelRequestParams } from \"./A-Http.channel.types\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_Channel, A_ChannelRequest } from '@adaas/a-utils/a-channel'\nimport { A_Inject, A_Scope } from \"@adaas/a-concept\";\n\n\nexport class A_HTTPChannel extends A_Channel {\n\n    protected baseUrl?: string;\n\n    async onBeforeRequest(\n        @A_Inject(A_ChannelRequest) context: A_ChannelRequest<A_SERVER_TYPES__HttpChannelRequestParams>,\n        @A_Inject(A_Scope) scope: A_Scope,\n    ): Promise<void> {\n        const { method, url, data, config } = context.params;\n\n        const fullUrl = this.buildURL(url, config?.params);\n\n        const route = new A_ServerRoute(fullUrl, method);\n        scope.register(route);\n\n        context.params.config = context.params.config || {};\n\n        context.params.config.headers = {\n            \"Content-Type\": \"application/json\",\n            ...config?.headers,\n        };\n    }\n\n    async onRequest(\n        @A_Inject(A_ChannelRequest) context: A_ChannelRequest<A_SERVER_TYPES__HttpChannelRequestParams>,\n        @A_Inject(A_ServerRoute) route: A_ServerRoute,\n    ): Promise<void> {\n        const options: RequestInit = {\n            method: route.method,\n            headers: context.params.config?.headers || {\n            },\n        };\n\n        if (context.params.data && route.method !== 'GET') {\n            options.body = JSON.stringify(context.params.data);\n        }\n\n        const response = await fetch(route.url, options);\n\n        if (!response.ok) {\n            throw new A_ServerError({\n                status: response.status,\n                title: response.statusText,\n                description: `HTTP request to ${route.url} failed with status ${response.status}`,\n            });\n        }\n\n\n        switch (context.params.config?.params?.responseType) {\n            case \"text\":\n                context.succeed({\n                    data: await response.text()\n                });\n                break;\n            case \"blob\":\n                context.succeed(await response.blob());\n                break;\n            default:\n                context.succeed(await response.json());\n                break;\n        }\n    }\n\n\n    async post<T extends Record<string, any> = any, M extends Record<string, any> = any>(\n        url: string,\n        body?: any,\n        config?: Partial<A_SERVER_TYPES__HttpChannelRequestConfig>,\n    ): Promise<A_ChannelRequest<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>> {\n        return this.request<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>({\n            method: 'POST',\n            url,\n            data: body,\n            config,\n        });\n    }\n\n    async get<T extends Record<string, any> = any, M extends Record<string, any> = any>(\n        url: string,\n        params?: any,\n        config?: Partial<A_SERVER_TYPES__HttpChannelRequestConfig>,\n    ): Promise<A_ChannelRequest<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>> {\n        return this.request<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>({\n            method: 'GET',\n            url,\n            config: {\n                ...config,\n                params,\n            }\n        });\n    }\n\n    async put<T extends Record<string, any> = any, M extends Record<string, any> = any>(\n        url: string,\n        body?: any,\n        config?: Partial<A_SERVER_TYPES__HttpChannelRequestConfig>,\n    ): Promise<A_ChannelRequest<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>> {\n        return this.request<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>({\n            method: 'PUT',\n            url,\n            data: body,\n            config,\n        });\n    }\n\n    async delete<T extends Record<string, any> = any, M extends Record<string, any> = any>(\n        url: string,\n        params?: any,\n        config?: Partial<A_SERVER_TYPES__HttpChannelRequestConfig>,\n    ): Promise<A_ChannelRequest<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>> {\n        return this.request<A_SERVER_TYPES__HttpChannelRequestParams<M>, T>({\n            method: 'DELETE',\n            url,\n            data: params,\n            config,\n        });\n    }\n\n\n    protected buildURL(path: string = '', params: Record<string, any> = {}): string {\n        if (!this.baseUrl)\n            throw new A_HTTPChannelError(\n                A_HTTPChannelError.HttpRequestError,\n                \"Base URL is not set for HTTP Channel\"\n            );\n\n        const url = new URL(`${this.baseUrl}${path.startsWith('/') ? path : `/${path}`}`);\n\n        Object.keys(params).forEach(key => {\n            if (params[key] !== undefined && params[key] !== null) {\n                url.searchParams.append(key, params[key]);\n            }\n        });\n\n        return url.toString()\n    }\n}\n"]}