{"version":3,"file":"opra-angular.mjs","sources":["../../src/angular-backend.ts","../../src/angular-client.ts","../../src/constants.ts","../../src/client.module.ts","../../src/opra-angular.ts"],"sourcesContent":["// @ts-ignore\n// @ts-ignore\nimport * as Angular from '@angular/common/http';\nimport { HttpContext, HttpHeaders, HttpParams } from '@angular/common/http';\nimport typeIs from '@browsery/type-is';\nimport {\n  HttpBackend,\n  type HttpDownloadProgressEvent,\n  type HttpEvent,\n  HttpEventType,\n  HttpResponse,\n  type HttpResponseEvent,\n  type HttpResponseHeaderEvent,\n  type HttpSentEvent,\n  type HttpUploadProgressEvent,\n} from '@opra/client';\nimport { isBlob } from '@opra/common';\nimport { Observable } from 'rxjs';\nimport { isReadableStreamLike } from 'rxjs/internal/util/isReadableStreamLike';\nimport type { StrictOmit } from 'ts-gems';\n\n/**\n * Angular specific implementation of {@link HttpBackend} using Angular's HttpClient.\n *\n * @class AngularBackend\n */\nexport class AngularBackend extends HttpBackend {\n  /** Default request options */\n  defaults: AngularBackend.RequestDefaults;\n\n  /**\n   * Creates a new instance of AngularBackend.\n   *\n   * @param httpClient The Angular HttpClient instance.\n   * @param serviceUrl The base URL of the service.\n   * @param options Configuration options.\n   */\n  constructor(\n    readonly httpClient: Angular.HttpClient,\n    serviceUrl: string,\n    options?: AngularBackend.Options,\n  ) {\n    super(serviceUrl, options);\n    this.defaults = {\n      ...options?.defaults,\n      headers:\n        options?.defaults?.headers instanceof Headers\n          ? options?.defaults?.headers\n          : new Headers(options?.defaults?.headers),\n      params:\n        options?.defaults?.params instanceof URLSearchParams\n          ? options?.defaults?.params\n          : new URLSearchParams(options?.defaults?.params),\n    };\n  }\n\n  /**\n   * Handles the HTTP request using Angular's HttpClient.\n   *\n   * @param init The request initialization parameters.\n   * @returns An observable of {@link HttpEvent}.\n   */\n  handle(init: AngularBackend.RequestInit): Observable<HttpEvent> {\n    const requestInit = this.prepareRequest(init);\n    const request = new Angular.HttpRequest(\n      requestInit.method,\n      requestInit.url.toString(),\n      {\n        ...requestInit,\n        headers: new HttpHeaders(requestInit.headers),\n      },\n    );\n\n    const _this = this;\n    return new Observable<HttpEvent>(subscriber => {\n      // Send request\n      this.send(request).subscribe({\n        next(event) {\n          if (event.type === Angular.HttpEventType.Sent) {\n            // Emit 'Sent' event\n            subscriber.next({\n              type: HttpEventType.Sent,\n              request,\n            } satisfies HttpSentEvent);\n            return;\n          }\n\n          if (event.type === Angular.HttpEventType.ResponseHeader) {\n            // Emit 'ResponseHeader' event\n            const headersResponse = _this.createResponse({\n              url: request.url,\n              headers: requestInit.headers,\n              status: event.status,\n              statusText: event.statusText,\n              hasBody:\n                event.headers.has('Content-Type') ||\n                event.headers.has('Content-Length'),\n            }) as HttpResponse<never>;\n            subscriber.next({\n              request,\n              type: HttpEventType.ResponseHeader,\n              response: headersResponse,\n            } satisfies HttpResponseHeaderEvent);\n            return;\n          }\n\n          if (event.type === Angular.HttpEventType.DownloadProgress) {\n            // Emit 'DownloadProgress' event\n            subscriber.next({\n              request,\n              type: HttpEventType.DownloadProgress,\n              loaded: event.loaded,\n              total: event.total,\n            } satisfies HttpDownloadProgressEvent);\n          }\n\n          if (event.type === Angular.HttpEventType.UploadProgress) {\n            // Emit 'UploadProgress' event\n            subscriber.next({\n              request,\n              type: HttpEventType.UploadProgress,\n              loaded: event.loaded,\n              total: event.total,\n            } satisfies HttpUploadProgressEvent);\n          }\n\n          if (event.type === Angular.HttpEventType.Response) {\n            const headers = new Headers();\n            event.headers\n              .keys()\n              .forEach(k => headers.set(k, event.headers.get(k) || ''));\n            const response = _this.createResponse({\n              url: request.url,\n              headers,\n              status: event.status,\n              statusText: event.statusText,\n              hasBody: !!event.body,\n              body: event.body,\n            });\n            // Emit 'Response' event\n            subscriber.next({\n              type: HttpEventType.Response,\n              request,\n              response,\n            } satisfies HttpResponseEvent);\n          }\n        },\n        error(error) {\n          subscriber.error(error);\n        },\n        complete() {\n          subscriber.complete();\n        },\n      });\n    });\n  }\n\n  /**\n   * Sends the actual HTTP request.\n   *\n   * @param request The Angular HttpRequest instance.\n   * @protected\n   */\n  protected send(request: Angular.HttpRequest<any>) {\n    return this.httpClient.request(request);\n  }\n\n  /**\n   * Prepares the request by applying defaults and handling body content.\n   *\n   * @param init The initial request parameters.\n   * @returns The prepared request initialization parameters.\n   * @protected\n   */\n  protected prepareRequest(\n    init: AngularBackend.RequestInit,\n  ): AngularBackend.RequestInit {\n    const headers = init.headers || new Headers();\n    const requestInit: AngularBackend.RequestInit = {\n      ...init,\n      headers,\n    };\n    this.defaults.headers.forEach((val, key) => {\n      if (!headers.has(key)) headers.set(key, val);\n    });\n    const url = new URL(requestInit.url, this.serviceUrl);\n    if (this.defaults.params.size) {\n      this.defaults.params.forEach((val, key) => {\n        if (!url.searchParams.has(key)) url.searchParams.set(key, val);\n      });\n      requestInit.url = url.toString();\n    }\n    if (requestInit.body) {\n      let body: any;\n      let contentType: string;\n      if (\n        typeof requestInit.body === 'string' ||\n        typeof requestInit.body === 'number' ||\n        typeof requestInit.body === 'boolean'\n      ) {\n        contentType = 'text/plain; charset=UTF-8\"';\n        body = String(requestInit.body);\n        headers.delete('Content-Size');\n      } else if (isReadableStreamLike(requestInit.body)) {\n        contentType = 'application/octet-stream';\n        body = requestInit.body;\n      } else if (Buffer.isBuffer(requestInit.body)) {\n        contentType = 'application/octet-stream';\n        body = requestInit.body;\n        headers.set('Content-Size', String(requestInit.body.length));\n      } else if (isBlob(requestInit.body)) {\n        contentType = requestInit.body.type || 'application/octet-stream';\n        body = requestInit.body;\n        headers.set('Content-Size', String(requestInit.body.size));\n      } else {\n        contentType = 'application/json';\n        body = JSON.stringify(requestInit.body);\n        headers.delete('Content-Size');\n      }\n      if (!headers.has('Content-Type') && contentType)\n        headers.set('Content-Type', contentType);\n      requestInit.body = body;\n    }\n    return requestInit;\n  }\n\n  /**\n   * Creates a {@link HttpResponse} instance.\n   *\n   * @param init The response initiator parameters.\n   * @returns A new HttpResponse instance.\n   * @protected\n   */\n  protected createResponse(init: HttpResponse.Initiator): HttpResponse {\n    return new HttpResponse(init);\n  }\n\n  /**\n   * Parses the response body based on Content-Type.\n   *\n   * @param fetchResponse The response to parse.\n   * @returns The parsed body.\n   * @protected\n   */\n  protected async parseBody(fetchResponse: Response): Promise<any> {\n    let body: any;\n    const contentType = fetchResponse.headers.get('Content-Type') || '';\n    if (typeIs.is(contentType, ['json', 'application/*+json'])) {\n      body = await fetchResponse.json();\n      if (typeof body === 'string') body = JSON.parse(body);\n    } else if (typeIs.is(contentType, ['text']))\n      body = await fetchResponse.text();\n    else if (typeIs.is(contentType, ['multipart']))\n      body = await fetchResponse.formData();\n    else {\n      const buf = await fetchResponse.arrayBuffer();\n      if (buf.byteLength) body = buf;\n    }\n    return body;\n  }\n}\n\n/**\n * Namespace for {@link AngularBackend} related types and interfaces.\n *\n * @namespace AngularBackend\n */\nexport namespace AngularBackend {\n  /** Configuration options for AngularBackend */\n  export interface Options extends HttpBackend.Options {\n    /** Default request options */\n    defaults?: RequestDefaults;\n  }\n\n  /** Request initialization parameters for AngularBackend */\n  export interface RequestInit extends HttpBackend.RequestInit {\n    /** Angular HttpContext */\n    context?: HttpContext;\n    /** Whether to report progress events */\n    reportProgress?: boolean;\n    /** Angular HttpParams */\n    params?: HttpParams;\n    /** The expected response type */\n    responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';\n    /** Whether to send credentials with the request */\n    withCredentials?: boolean;\n  }\n\n  /** Request options subset for AngularBackend */\n  export interface RequestOptions extends Pick<\n    RequestInit,\n    'context' | 'reportProgress' | 'withCredentials'\n  > {}\n\n  /** Default request options for AngularBackend */\n  export type RequestDefaults = StrictOmit<RequestOptions, 'context'> & {\n    /** Default headers */\n    headers: Headers;\n    /** Default URL parameters */\n    params: URLSearchParams;\n  };\n}\n","// @ts-ignore\nimport { HttpClient } from '@angular/common/http';\nimport { HttpClientBase, kBackend } from '@opra/client';\nimport { AngularBackend } from './angular-backend.js';\n\n/**\n * Angular specific implementation of {@link HttpClientBase}.\n *\n * @class OpraAngularClient\n */\nexport class OpraAngularClient extends HttpClientBase<AngularBackend.RequestOptions> {\n  declare [kBackend]: AngularBackend;\n\n  /**\n   * Creates a new instance of OpraAngularClient.\n   *\n   * @param httpClient The Angular HttpClient instance.\n   * @param serviceUrl The base URL of the service.\n   * @param options Configuration options.\n   */\n  constructor(\n    httpClient: HttpClient,\n    serviceUrl: string,\n    options?: AngularBackend.Options,\n  ) {\n    super(new AngularBackend(httpClient, serviceUrl, options));\n  }\n\n  /**\n   * Gets the default request options from the backend.\n   */\n  get defaults(): AngularBackend.RequestDefaults {\n    return this[kBackend].defaults;\n  }\n}\n","export const OPRA_CLIENT_MODULE_OPTIONS = 'OPRA_CLIENT_MODULE_OPTIONS';\n","import { HttpClient } from '@angular/common/http';\nimport {\n  type ModuleWithProviders,\n  NgModule,\n  type Provider,\n  Type,\n} from '@angular/core';\nimport { kClient } from '@opra/client';\nimport { OpraAngularClient } from './angular-client.js';\nimport { OPRA_CLIENT_MODULE_OPTIONS } from './constants.js';\nimport type {\n  OpraClientModuleAsyncOptions,\n  OpraClientModuleOptions,\n} from './interfaces/module-options.interface.js';\n\n/**\n * Angular module for OPRA client.\n */\n@NgModule({})\nexport class OpraClientModule {\n  /**\n   * Registers a client provider.\n   *\n   * @param options Configuration options for the client.\n   * @returns A ModuleWithProviders instance.\n   */\n  public static registerClient(\n    options: OpraClientModuleOptions,\n  ): ModuleWithProviders<OpraClientModule> {\n    const CLIENT_TOKEN = options.token || OpraAngularClient;\n    return {\n      ngModule: OpraClientModule,\n      providers: [\n        {\n          provide: CLIENT_TOKEN,\n          deps: [HttpClient],\n          useFactory: (httpClient: HttpClient) =>\n            new OpraAngularClient(httpClient, options.serviceUrl, options),\n        },\n      ],\n    };\n  }\n\n  /**\n   * Registers a service provider.\n   *\n   * @param serviceClass The service class to register.\n   * @param options Configuration options for the service.\n   * @returns A ModuleWithProviders instance.\n   */\n  public static registerService<T>(\n    serviceClass: Type<T>,\n    options: OpraClientModuleOptions,\n  ): ModuleWithProviders<OpraClientModule> {\n    const SERVICE_TOKEN = options.token || serviceClass;\n    return {\n      ngModule: OpraClientModule,\n      providers: [\n        {\n          provide: SERVICE_TOKEN,\n          deps: [HttpClient],\n          useFactory: (httpClient: HttpClient) => {\n            const opraAngularClient = new OpraAngularClient(\n              httpClient,\n              options.serviceUrl,\n              options,\n            );\n            const service = new serviceClass(opraAngularClient);\n            service[kClient] = opraAngularClient;\n            return service;\n          },\n        },\n      ],\n    };\n  }\n\n  /**\n   * Registers a client provider asynchronously.\n   *\n   * @param options Asynchronous configuration options for the client.\n   * @returns A ModuleWithProviders instance.\n   */\n  public static registerClientAsync(\n    options: OpraClientModuleAsyncOptions,\n  ): ModuleWithProviders<OpraClientModule> {\n    const CLIENT_TOKEN = options.token || OpraAngularClient;\n    const asyncProviders = this._createAsyncProviders(options);\n    return {\n      ngModule: OpraClientModule,\n      providers: [\n        ...asyncProviders,\n        {\n          provide: CLIENT_TOKEN,\n          deps: [HttpClient, OPRA_CLIENT_MODULE_OPTIONS],\n          useFactory: (httpClient: HttpClient, opts: OpraClientModuleOptions) =>\n            new OpraAngularClient(httpClient, opts.serviceUrl, opts),\n        },\n      ],\n    };\n  }\n\n  /**\n   * Registers a service provider asynchronously.\n   *\n   * @param serviceClass The service class to register.\n   * @param options Asynchronous configuration options for the service.\n   * @returns A ModuleWithProviders instance.\n   */\n  public static registerServiceAsync<T>(\n    serviceClass: Type<T>,\n    options: OpraClientModuleAsyncOptions,\n  ): ModuleWithProviders<OpraClientModule> {\n    const SERVICE_TOKEN = options.token || serviceClass;\n    const asyncProviders = this._createAsyncProviders(options);\n    return {\n      ngModule: OpraClientModule,\n      providers: [\n        ...asyncProviders,\n        {\n          provide: SERVICE_TOKEN,\n          deps: [HttpClient, OPRA_CLIENT_MODULE_OPTIONS],\n          useFactory: (\n            httpClient: HttpClient,\n            opts: OpraClientModuleOptions,\n          ) => {\n            const opraAngularClient = new OpraAngularClient(\n              httpClient,\n              opts.serviceUrl,\n              opts,\n            );\n            const service = new serviceClass(opraAngularClient);\n            service[kClient] = opraAngularClient;\n            return service;\n          },\n        },\n      ],\n    };\n  }\n\n  private static _createAsyncProviders(\n    options: OpraClientModuleAsyncOptions,\n  ): Provider[] {\n    if (options.useExisting || options.useFactory)\n      return [this._createAsyncOptionsProvider(options)];\n\n    if (options.useClass) {\n      return [\n        this._createAsyncOptionsProvider(options),\n        {\n          provide: options.useClass,\n          useClass: options.useClass,\n        },\n      ];\n    }\n\n    throw new Error(\n      'Invalid configuration. Must provide useFactory, useClass or useExisting',\n    );\n  }\n\n  private static _createAsyncOptionsProvider(\n    options: OpraClientModuleAsyncOptions,\n  ): Provider {\n    if (options.useFactory) {\n      return {\n        provide: OPRA_CLIENT_MODULE_OPTIONS,\n        useFactory: options.useFactory,\n        deps: options.deps || [],\n      };\n    }\n    const useClass = options.useClass || options.useExisting;\n    if (useClass) {\n      return {\n        provide: OPRA_CLIENT_MODULE_OPTIONS,\n        useFactory: o => o,\n        deps: [useClass],\n      };\n    }\n    throw new Error(\n      'Invalid configuration. Must provide useFactory, useClass or useExisting',\n    );\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}