{"version":3,"file":"deejayy-api-caller.mjs","sources":["../../../projects/api-caller/src/lib/helper/short-hash.ts","../../../projects/api-caller/src/lib/model/api-caller-config.ts","../../../projects/api-caller/src/lib/model/api-state-id.ts","../../../projects/api-caller/src/lib/store/api.actions.ts","../../../projects/api-caller/src/lib/store/api.state.ts","../../../projects/api-caller/src/lib/store/api.selectors.ts","../../../projects/api-caller/src/lib/service/api-connector.ts","../../../projects/api-caller/src/lib/service/api-caller.service.ts","../../../projects/api-caller/src/lib/helper/produce-on.ts","../../../projects/api-caller/src/lib/store/api.reducer.ts","../../../projects/api-caller/src/lib/store/api.effects.ts","../../../projects/api-caller/src/lib/api-caller.module.ts","../../../projects/api-caller/src/public-api.ts","../../../projects/api-caller/src/deejayy-api-caller.ts"],"sourcesContent":["/**\n * Deterministic, non-cryptographic short hash (FNV-1a, 32-bit) of a string, rendered as 8 hex chars.\n *\n * Deterministic is mandatory: the same input always yields the same output across tabs and time.\n * This is NOT a security measure (the raw token already lives in memory); its only purpose is\n * key separation for the identity-scoped cache. The raw input is never stored — only this\n * fingerprint appears, and only inside cache keys.\n */\nexport const shortHash = (input: string): string => {\n  if (!input) {\n    return '';\n  }\n\n  const FNV_OFFSET_BASIS = 0x811c9dc5;\n  const FNV_PRIME = 0x01000193;\n  const HEX_RADIX = 16;\n  const HEX_LENGTH = 8;\n\n  let hash = FNV_OFFSET_BASIS;\n  for (let i = 0; i < input.length; i++) {\n    hash ^= input.charCodeAt(i);\n    // 32-bit FNV prime multiplication using Math.imul to stay within 32 bits.\n    hash = Math.imul(hash, FNV_PRIME);\n  }\n\n  // Convert to unsigned 32-bit and pad to a fixed-width hex string.\n  return (hash >>> 0).toString(HEX_RADIX).padStart(HEX_LENGTH, '0');\n};\n","import { InjectionToken } from '@angular/core';\n\nexport interface ApiCallerConfig {\n  /**\n   * When true, needsAuth cache entries are keyed by an identity fingerprint derived from\n   * ApiConnector.tokenData$. A different identity naturally reads/writes different keys and can\n   * never observe the previous identity's data. Non-auth entries remain identity-independent\n   * (public cache survives identity changes untouched).\n   *\n   * Default false (behavior identical to previous versions).\n   */\n  identityScopedCache?: boolean;\n}\n\nexport const API_CALLER_CONFIG = new InjectionToken<Required<ApiCallerConfig>>('API_CALLER_CONFIG');\n\nexport const DEFAULT_API_CALLER_CONFIG: Required<ApiCallerConfig> = {\n  identityScopedCache: false,\n};\n","export const apiStateId: string = '@deejayy/api-caller';\n","import { createAction, props } from '@ngrx/store';\n\nimport { ApiCallItem, ApiInterface } from '../model/api-call-item.model';\nimport { Payload } from '../helper/payload.model';\n\nexport class ApiActions {\n  public static ApiGet = createAction('[API] Get', props<Payload<ApiCallItem>>());\n  public static ApiGetCancel = createAction('[API] Get Cancel', props<Payload<ApiCallItem>>());\n  public static ApiGetSuccess = createAction('[API] Get Success', props<ApiInterface>());\n  public static ApiGetFail = createAction('[API] Get Fail', props<ApiInterface>());\n  public static ApiGetFromCache = createAction('[API] Get From Cache', props<Payload<ApiCallItem>>());\n  public static ApiClearState = createAction('[API] Clear State', props<Payload<ApiCallItem>>());\n  public static ApiClearAllState = createAction('[API] Clear Full State');\n  public static ApiClearAuthenticatedState = createAction('[API] Clear Authenticated State');\n  public static ApiClearIdentityState = createAction('[API] Clear Identity State', props<{ identity: string }>());\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nexport interface ApiState {\n  loading: boolean;\n  success: boolean;\n  error: boolean;\n  data: any;\n  headers: Record<string, string>;\n  errorData: HttpErrorResponse;\n  fired: Date | undefined;\n  returned: Date | undefined;\n  /** Present/true only for entries created by a needsAuth request. Absence === non-auth. */\n  needsAuth?: boolean;\n}\n\nexport type GlobalApiState = Record<string, ApiState>;\n\nexport interface ApiResultState<T = any> {\n  loading$: Observable<boolean>;\n  success$: Observable<boolean>;\n  error$: Observable<boolean>;\n  finished$: Observable<boolean>;\n  data$: Observable<T>;\n  headers$: Observable<Record<string, string>>;\n  errorData$: Observable<HttpErrorResponse>;\n}\n\nexport const initialApiCallerGlobalState: GlobalApiState = {};\n\nexport const initialApiCallerState: ApiState = {\n  loading: false,\n  success: false,\n  error: false,\n  data: null,\n  headers: {},\n  errorData: new HttpErrorResponse({}),\n  fired: undefined,\n  returned: undefined,\n};\n","import { createFeatureSelector, createSelector } from '@ngrx/store';\n\nimport { ApiCallItem } from '../model/api-call-item.model';\nimport { apiStateId } from '../model/api-state-id';\nimport { ApiState, GlobalApiState, initialApiCallerState } from './api.state';\n\n/**\n * Builds the cache key for a call.\n *\n * `identity` prefixes ONLY authenticated (`needsAuth`) entries, and only when it is non-empty\n * (i.e. identity-scoped cache is enabled AND a token is present). When `identity` is `''`\n * (the default, and always the case when scoping is off), the key is byte-identical to previous\n * versions, so non-auth entries stay identity-independent and existing consumers are unaffected.\n */\nexport const getStateId = (payload: ApiCallItem, identity = ''): string =>\n  `${payload.needsAuth && identity ? `${identity}|` : ''}${payload.api ?? ''}${payload.idOverride ?? payload.path}`;\n\nconst getApiState = createFeatureSelector<GlobalApiState>(apiStateId);\nconst getApiSubState = (stateId: string) =>\n  createSelector(getApiState, (state: GlobalApiState) =>\n    state?.[stateId] ? state[stateId] ?? initialApiCallerState : initialApiCallerState,\n  );\n\nexport class ApiSelectors {\n  public static isLoading = (stateId: string) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => state.loading);\n\n  public static getResponse = (stateId: string) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => state.data);\n\n  public static getHeaders = (stateId: string) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => state.headers);\n\n  public static getErrorData = (stateId: string) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => state.errorData);\n\n  public static isFailed = (stateId: string) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => state.error);\n\n  public static isSucceeded = (stateId: string) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => state.success);\n\n  public static isFinished = (stateId: string) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => state.success || state.error);\n\n  public static isCached = (stateId: string, cacheTimeout?: number) =>\n    createSelector(getApiSubState(stateId), (state: ApiState) => {\n      if (state.returned && cacheTimeout) {\n        if (new Date().getTime() - state.returned.getTime() > cacheTimeout) {\n          return false;\n        }\n      }\n      return state.data !== undefined && state.data !== null;\n    });\n}\n","import { Observable } from 'rxjs';\nimport { ApiInterface } from '../model/api-call-item.model';\n\nexport class ApiConnector {\n  public tokenData$!: Observable<string>;\n  public defaultApiUrl!: string;\n  public errorHandler!: (payload: ApiInterface) => void;\n}\n","import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Store, select } from '@ngrx/store';\nimport { Observable, of } from 'rxjs';\nimport { distinctUntilChanged, map, mergeMap, switchMap, take } from 'rxjs/operators';\n\nimport { InternalApiCallItem } from '../helper/internal-api-call-item.model';\nimport { Payload } from '../helper/payload.model';\nimport { shortHash } from '../helper/short-hash';\nimport {\n  API_CALLER_CONFIG,\n  ApiCallerConfig,\n  DEFAULT_API_CALLER_CONFIG,\n} from '../model/api-caller-config';\nimport { ApiCallItem, ApiInterface, SimplifiedHttpOptions } from '../model/api-call-item.model';\nimport { apiStateId } from '../model/api-state-id';\nimport { ApiActions } from '../store/api.actions';\nimport { ApiSelectors, getStateId } from '../store/api.selectors';\nimport { ApiResultState, ApiState } from '../store/api.state';\nimport { ApiConnector } from './api-connector';\n\n@Injectable()\nexport class ApiCallerService {\n  public tokenData$: Observable<string> = of(\n    `[${apiStateId}] Can't send requests with authorization, token provider not found`,\n  );\n\n  public defaultApiUrl: string = '/';\n  public errorHandler: (payload: ApiInterface) => void = (payload: ApiInterface) => {\n    console.warn(`[${apiStateId}] Unhandled API error occurred, code: ${payload.response.status}`);\n  };\n\n  private config: Required<ApiCallerConfig>;\n\n  /** Latest identity fingerprint, kept synchronously readable so getApiCallPayload stays sync. */\n  private identityFingerprint = '';\n\n  constructor(\n    private http: HttpClient,\n    private store: Store<ApiState>,\n    @Optional() private apiConnector?: ApiConnector,\n    @Optional() @Inject(API_CALLER_CONFIG) config?: Required<ApiCallerConfig>,\n  ) {\n    this.config = config ?? DEFAULT_API_CALLER_CONFIG;\n\n    if (!this.apiConnector) {\n      console.warn(`[${apiStateId}] apiConnector not provided, check README.md`);\n    } else {\n      this.tokenData$ = this.getTokenData();\n      this.defaultApiUrl = this.getDefaultApiUrl();\n      this.errorHandler = this.getErrorHandler();\n    }\n\n    if (this.config.identityScopedCache) {\n      // App-singleton service: a lifetime subscription is fine. Cache the current fingerprint so\n      // dispatch-time keying stays synchronous.\n      this.identity$().subscribe((fingerprint) => {\n        this.identityFingerprint = fingerprint;\n      });\n    }\n  }\n\n  /** Whether identity-scoped cache is enabled. */\n  public isIdentityScopedCache(): boolean {\n    return this.config.identityScopedCache;\n  }\n\n  /** Derived, distinct stream of the current identity fingerprint ('' when scoping off/no token). */\n  public identity$(): Observable<string> {\n    return this.getTokenData().pipe(\n      map((token) => (this.config.identityScopedCache && token ? shortHash(token) : '')),\n      distinctUntilChanged(),\n    );\n  }\n\n  public getDefaultApiUrl(): string {\n    return this.apiConnector?.defaultApiUrl ?? this.defaultApiUrl;\n  }\n\n  public getTokenData(): Observable<string> {\n    return this.apiConnector?.tokenData$ ?? this.tokenData$;\n  }\n\n  public getErrorHandler(): (payload: ApiInterface) => void {\n    return this.apiConnector?.errorHandler ?? this.errorHandler;\n  }\n\n  public handleError(payload: ApiInterface) {\n    if (!payload.request?.localErrorHandling) {\n      return this.getErrorHandler()(payload);\n    }\n\n    return 'Handled locally';\n  }\n\n  public getApiCallPayload(apiCallItem: ApiCallItem): Payload<ApiCallItem> {\n    const payload: InternalApiCallItem = {\n      ...apiCallItem,\n      api: apiCallItem.api ?? this.getDefaultApiUrl(),\n    };\n\n    // Only carry the identity fingerprint when it is non-empty (scoping enabled + token present),\n    // so that with scoping off the payload is byte-identical to previous versions.\n    if (this.identityFingerprint) {\n      payload.__identity = this.identityFingerprint;\n    }\n\n    return { payload };\n  }\n\n  public callApi<ResponseType>(apiCallItem: ApiCallItem): ApiResultState<ResponseType> {\n    // Workaround to avoid \"TypeError: Cannot freeze\" error, native primitives (like FileList) cannot be passed to the state manager\n    // See: https://stackoverflow.com/a/53092520\n    if (apiCallItem.binaryUpload) {\n      apiCallItem.payload =\n        apiCallItem.payload && apiCallItem.payload.length > 0 ? { ...apiCallItem.payload } : undefined;\n    }\n    this.store.dispatch(ApiActions.ApiGet(this.getApiCallPayload(apiCallItem)));\n    return this.createApiResults<ResponseType>(apiCallItem);\n  }\n\n  public resetApi(apiCallItem: ApiCallItem) {\n    this.store.dispatch(ApiActions.ApiClearState(this.getApiCallPayload(apiCallItem)));\n  }\n\n  public cancelRequest(apiCallItem: ApiCallItem) {\n    this.store.dispatch(ApiActions.ApiGetCancel(this.getApiCallPayload(apiCallItem)));\n  }\n\n  public resetAllApi() {\n    this.store.dispatch(ApiActions.ApiClearAllState());\n  }\n\n  /**\n   * Evicts every cache entry that was created with `needsAuth`, leaving all public (non-auth)\n   * entries intact. Useful to imperatively flush identity-bound cache without enumerating endpoints.\n   */\n  public resetAuthenticatedApi(): void {\n    this.store.dispatch(ApiActions.ApiClearAuthenticatedState());\n  }\n\n  public createApiResults<ResponseType>(apiCallItem: ApiCallItem): ApiResultState<ResponseType> {\n    if (!this.config.identityScopedCache) {\n      const stateId = getStateId(this.getApiCallPayload(apiCallItem).payload);\n      return {\n        loading$: this.store.pipe(select(ApiSelectors.isLoading(stateId))),\n        data$: this.store.pipe(select(ApiSelectors.getResponse(stateId))),\n        errorData$: this.store.pipe(select(ApiSelectors.getErrorData(stateId))),\n        error$: this.store.pipe(select(ApiSelectors.isFailed(stateId))),\n        success$: this.store.pipe(select(ApiSelectors.isSucceeded(stateId))),\n        finished$: this.store.pipe(select(ApiSelectors.isFinished(stateId))),\n        headers$: this.store.pipe(select(ApiSelectors.getHeaders(stateId))),\n      };\n    }\n\n    // Scoped path: re-target the selectors whenever the identity changes so a component rebinds to\n    // the new identity's (initially empty) entry instead of leaking the previous identity's data.\n    const identity$ = this.identity$();\n    const payload = this.getApiCallPayload(apiCallItem).payload;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const results$ = <T>(selectorFactory: (stateId: string, ...rest: any[]) => any): Observable<T> =>\n      identity$.pipe(\n        switchMap((identity) =>\n          this.store.pipe(select(selectorFactory(getStateId(payload, identity)))),\n        ),\n      );\n\n    return {\n      loading$: results$(ApiSelectors.isLoading),\n      data$: results$(ApiSelectors.getResponse),\n      errorData$: results$(ApiSelectors.getErrorData),\n      error$: results$(ApiSelectors.isFailed),\n      success$: results$(ApiSelectors.isSucceeded),\n      finished$: results$(ApiSelectors.isFinished),\n      headers$: results$(ApiSelectors.getHeaders),\n    };\n  }\n\n  // eslint-disable-next-line complexity\n  public makeHeaders(call: ApiCallItem, options: SimplifiedHttpOptions) {\n    let headers = new HttpHeaders();\n\n    if (call.binaryUpload) {\n      if (call.payload) {\n        const formData: FormData = new FormData();\n        formData.append(call.binaryUpload, call.payload[0] as Blob);\n        options.body = formData;\n      } else {\n        console.warn(`[${apiStateId}] No file selected for upload but binaryUpload field name is set`);\n      }\n    }\n\n    if (call.payloadType === 'urlEncoded') {\n      headers = headers.append('Content-Type', 'application/x-www-form-urlencoded');\n      const encodedData = Object.keys(call.payload as Record<string, unknown>)\n        .map(\n          (key) =>\n            `${encodeURIComponent(key)}=${encodeURIComponent(\n              (call.payload as Record<string, unknown>)[key] as string,\n            )}`,\n        )\n        .join('&');\n      options.body = encodedData;\n    }\n\n    if (call.payloadType === 'formData') {\n      const formData = new FormData();\n      Object.keys(call.payload as Record<string, unknown>).forEach((key) =>\n        formData.append(key, (call.payload as Record<string, unknown>)[key] as string),\n      );\n      options.body = formData;\n    }\n\n    if (call.extraHeaders && Object.keys(call.extraHeaders).length > 0) {\n      Object.keys(call.extraHeaders).forEach((key) => {\n        if (call.extraHeaders?.[key] !== undefined) {\n          headers.append(key, call.extraHeaders[key]!);\n        }\n      });\n    }\n\n    return headers;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any, complexity\n  public makeRequest(call: ApiCallItem): Observable<HttpResponse<any>> {\n    const method = call.method ?? (call.payload ? 'POST' : 'GET');\n    const { api } = call;\n    const url = `${api ?? ''}${call.path}`;\n    const options: SimplifiedHttpOptions = { body: call.payload, observe: 'response' };\n    const headers = this.makeHeaders(call, options);\n\n    if (call.binaryResponse) {\n      options.responseType = 'blob';\n    }\n\n    if (call.sendCookies) {\n      options.withCredentials = true;\n    }\n\n    if (call.needsAuth) {\n      return this.getTokenData().pipe(\n        take(1),\n        mergeMap((token) => {\n          options.headers = headers.set('Authorization', `Bearer ${token}`);\n          return this.http.request(method, url, options);\n        }),\n      );\n    }\n\n    return this.http.request(method, url, options);\n  }\n}\n","import { Draft, produce, enableMapSet } from 'immer';\nimport { ActionCreator, ActionType, on, ReducerTypes, Creator } from '@ngrx/store';\n\nenableMapSet();\n\nexport const produceOn = <C1 extends ActionCreator, S>(\n  actionType: C1,\n  callback: (draft: Draft<S>, action: ActionType<C1>) => void,\n): ReducerTypes<S, ActionCreator<string, Creator<C1[]>>[]> =>\n  on(actionType, (state, action) => produce(state, (draft: Draft<S>) => callback(draft, action)));\n","import { HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { createReducer } from '@ngrx/store';\nimport { Draft } from 'immer';\n\nimport { InternalApiCallItem } from '../helper/internal-api-call-item.model';\nimport { Payload } from '../helper/payload.model';\nimport { produceOn } from '../helper/produce-on';\nimport { ApiCallItem, ApiInterface } from '../model/api-call-item.model';\nimport { ApiActions } from './api.actions';\nimport { getStateId } from './api.selectors';\nimport { GlobalApiState, initialApiCallerGlobalState, initialApiCallerState } from './api.state';\n\nexport const apiGet = (draft: Draft<GlobalApiState>, action: Payload<ApiCallItem>) => {\n  const payload = action.payload as InternalApiCallItem;\n  const stateId = getStateId(payload, payload.__identity);\n  draft[stateId] = {\n    ...(draft[stateId] ?? initialApiCallerState),\n    // Persist whether this entry was created by an authenticated request so that\n    // resetAuthenticatedApi() can evict exactly the needsAuth entries. Only set when truthy so\n    // non-auth entries stay free of the flag (absence === non-auth) and remain byte-identical to\n    // previous versions.\n    ...(payload.needsAuth ? { needsAuth: true } : {}),\n    loading: true,\n    error: false,\n    success: false,\n    fired: new Date(),\n  };\n};\n\nexport const apiGetSuccess = (draft: Draft<GlobalApiState>, action: ApiInterface) => {\n  const request = action.request as InternalApiCallItem;\n  const stateId = getStateId(request, request.__identity);\n  draft[stateId] = {\n    ...(draft[stateId] ?? initialApiCallerState),\n    loading: false,\n    error: false,\n    success: true,\n    returned: new Date(),\n    headers: action.headers,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    data: (action.response as HttpResponse<any>)?.body,\n  };\n};\n\nexport const apiGetFail = (draft: Draft<GlobalApiState>, action: ApiInterface) => {\n  const request = action.request as InternalApiCallItem;\n  const stateId = getStateId(request, request.__identity);\n  draft[stateId] = {\n    ...(draft[stateId] ?? initialApiCallerState),\n    loading: false,\n    error: true,\n    success: false,\n    returned: new Date(),\n    headers: action.headers,\n    errorData: action.response as HttpErrorResponse,\n  };\n};\n\nexport const apiGetFromCache = (draft: Draft<GlobalApiState>, action: Payload<ApiCallItem>) => {\n  const payload = action.payload as InternalApiCallItem;\n  const stateId = getStateId(payload, payload.__identity);\n  draft[stateId] = {\n    ...(draft[stateId] ?? initialApiCallerState),\n    loading: false,\n    error: false,\n    success: true,\n  };\n};\n\nexport const apiClearState = (draft: Draft<GlobalApiState>, action: Payload<ApiCallItem>) => {\n  const payload = action.payload as InternalApiCallItem;\n  const stateId = getStateId(payload, payload.__identity);\n  draft[stateId] = initialApiCallerState;\n};\n\nexport const apiClearAllState = () => ({});\n\n/**\n * Evicts every cache entry that was created with `needsAuth`, leaving all public (non-auth)\n * entries intact. Mutates the immer draft in place (routed through produceOn like every other\n * handler) to keep the reducer uniformly immer-based and its output correctly frozen.\n *\n * Rehydrated/persisted entries saved before this version lack `needsAuth` and are therefore treated\n * as non-auth (not evicted). The next ApiGet for such a key backfills the flag.\n */\nexport const apiClearAuthenticatedState = (draft: Draft<GlobalApiState>) => {\n  Object.keys(draft).forEach((stateId) => {\n    if (draft[stateId]?.needsAuth) {\n      delete draft[stateId];\n    }\n  });\n};\n\n/**\n * Memory hygiene for the identity-scoped cache: drops keys prefixed with a given (stale) identity\n * fingerprint. Correctness does not depend on this (selectors already read the new key); it only\n * bounds memory. Never runs when scoping is off. Mutates the immer draft in place.\n */\nexport const apiClearIdentityState = (draft: Draft<GlobalApiState>, action: { identity: string }) => {\n  if (!action.identity) {\n    return;\n  }\n  const prefix = `${action.identity}|`;\n  Object.keys(draft).forEach((stateId) => {\n    if (stateId.startsWith(prefix)) {\n      delete draft[stateId];\n    }\n  });\n};\n\nexport const apiReducer = createReducer(\n  initialApiCallerGlobalState,\n  produceOn(ApiActions.ApiGet, apiGet),\n  produceOn(ApiActions.ApiGetSuccess, apiGetSuccess),\n  produceOn(ApiActions.ApiGetFail, apiGetFail),\n  produceOn(ApiActions.ApiGetFromCache, apiGetFromCache),\n  produceOn(ApiActions.ApiClearState, apiClearState),\n  produceOn(ApiActions.ApiClearAllState, apiClearAllState),\n  produceOn(ApiActions.ApiClearAuthenticatedState, apiClearAuthenticatedState),\n  produceOn(ApiActions.ApiClearIdentityState, apiClearIdentityState),\n);\n","import { HttpResponse, HttpResponseBase } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport { select, Store } from '@ngrx/store';\nimport { Observable, of } from 'rxjs';\nimport { catchError, filter, map, mergeMap, pairwise, take, takeUntil } from 'rxjs/operators';\n\nimport { InternalApiCallItem } from '../helper/internal-api-call-item.model';\nimport { ApiCallItem } from '../model/api-call-item.model';\nimport { ApiCallerService } from '../service/api-caller.service';\nimport { ApiActions } from './api.actions';\nimport { ApiSelectors, getStateId } from './api.selectors';\nimport { ApiState } from './api.state';\n\n@Injectable()\nexport class ApiEffects {\n  private parseHeaders(response: HttpResponseBase): Record<string, string> {\n    return response?.headers\n      ?.keys()\n      .map((key) => {\n        return { [key]: response.headers.get(key) ?? '' };\n      })\n      .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n  }\n\n  public handleSuccess(request: ApiCallItem) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return (response: HttpResponse<any>) => {\n      return ApiActions.ApiGetSuccess({ request, response, headers: this.parseHeaders(response) });\n    };\n  }\n\n  public handleError(request: ApiCallItem) {\n    return (response: HttpResponseBase) =>\n      of(ApiActions.ApiGetFail({ request, response, headers: this.parseHeaders(response) }));\n  }\n\n  public mergeWithCache(request: ApiCallItem) {\n    return (isCached: boolean) => {\n      return request.useCache && isCached\n        ? of(ApiActions.ApiGetFromCache({ payload: request }))\n        : this.apiService\n            .makeRequest(request)\n            .pipe(\n              takeUntil(\n                this.actions$.pipe(\n                  ofType(ApiActions.ApiGetCancel),\n                  filter(\n                    (cancelledRequest) =>\n                      getStateId(\n                        cancelledRequest.payload,\n                        (cancelledRequest.payload as InternalApiCallItem).__identity,\n                      ) === getStateId(request, (request as InternalApiCallItem).__identity),\n                  ),\n                ),\n              ),\n            )\n            .pipe(map(this.handleSuccess(request)), catchError(this.handleError(request)));\n    };\n  }\n\n  public getApiEffect = ({ payload }: { payload: ApiCallItem }) => {\n    const stateId = getStateId(payload, (payload as InternalApiCallItem).__identity);\n    return this.store\n      .pipe(select(ApiSelectors.isCached(stateId, payload.cacheTimeout)))\n      .pipe(take(1), mergeMap(this.mergeWithCache(payload)));\n  };\n\n  public getApi$: Observable<ApiActions> = createEffect(() =>\n    this.actions$.pipe(ofType(ApiActions.ApiGet), mergeMap(this.getApiEffect)),\n  );\n\n  public getApiFail$: Observable<void | string> = createEffect(\n    () =>\n      this.actions$.pipe(\n        ofType(ApiActions.ApiGetFail),\n        map((action) => this.apiService.handleError(action)),\n      ),\n    { dispatch: false },\n  );\n\n  /**\n   * Optional GC of stale-identity keys. On identity change, drops the previous identity's keys.\n   * Correctness does not depend on this; it only bounds memory.\n   *\n   * When scoping is off, `identity$()` emits a single constant `''` (collapsed by\n   * distinctUntilChanged), so `pairwise` never emits and this effect is a natural no-op — no\n   * dispatches, no work. This avoids returning the shared RxJS `EMPTY` singleton, which must never\n   * be returned from an effect: NgRx tags each effect's source observable with a\n   * `__@ngrx/effects_create__` marker, and tagging the global `EMPTY` singleton collides with any\n   * other effect that also returns `EMPTY`, surfacing as\n   * \"Cannot redefine property: __@ngrx/effects_create__\".\n   */\n  public clearStaleIdentity$: Observable<ApiActions> = createEffect(() =>\n    this.apiService.identity$().pipe(\n      pairwise(),\n      filter(([previous, current]) => !!previous && previous !== current),\n      map(([previous]) => ApiActions.ApiClearIdentityState({ identity: previous })),\n    ),\n  );\n\n  constructor(private actions$: Actions, private apiService: ApiCallerService, private store: Store<ApiState>) {}\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { StoreModule } from '@ngrx/store';\nimport { EffectsModule } from '@ngrx/effects';\nimport { apiReducer } from './store/api.reducer';\nimport { ApiEffects } from './store/api.effects';\nimport { ApiCallerService } from './service/api-caller.service';\nimport { apiStateId } from './model/api-state-id';\nimport { API_CALLER_CONFIG, ApiCallerConfig, DEFAULT_API_CALLER_CONFIG } from './model/api-caller-config';\n\n@NgModule({\n  declarations: [],\n  imports: [\n    CommonModule,\n    HttpClientModule,\n    StoreModule.forFeature(apiStateId, apiReducer),\n    EffectsModule.forFeature([ApiEffects]),\n  ],\n  providers: [ApiCallerService, { provide: API_CALLER_CONFIG, useValue: DEFAULT_API_CALLER_CONFIG }],\n})\nexport class ApiCallerModule {\n  /**\n   * Optional configuration entry point. Importing `ApiCallerModule` directly (without `forRoot`)\n   * still registers the feature store, effects, service, and the default config token, so existing\n   * consumers are unaffected. `forRoot` only replaces the config token value.\n   */\n  public static forRoot(config?: ApiCallerConfig): ModuleWithProviders<ApiCallerModule> {\n    return {\n      ngModule: ApiCallerModule,\n      providers: [\n        { provide: API_CALLER_CONFIG, useValue: { ...DEFAULT_API_CALLER_CONFIG, ...config } },\n      ],\n    };\n  }\n}\n","/*\n * Public API Surface of api-caller\n */\n\nexport * from './lib/service/api-caller.service';\nexport * from './lib/api-caller.module';\nexport * from './lib/model/api-call-item.model';\nexport * from './lib/model/api-caller-config';\nexport * from './lib/store/api.state';\nexport * from './lib/service/api-connector';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.ApiCallerService","i3","i2"],"mappings":"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"}