UNPKG

@hasan-akbari/advanced-http-client

Version:

Advanced Angular HttpClient with cache, inflight dedup, rate limit, debounce, queueing, batching, retry/backoff, timeout, logging.

1 lines 27.9 kB
{"version":3,"file":"hasan-akbari-advanced-http-client.mjs","sources":["../../../projects/advanced-http-client/src/lib/request-cache.ts","../../../projects/advanced-http-client/src/lib/request-queue.ts","../../../projects/advanced-http-client/src/lib/request-batcher.ts","../../../projects/advanced-http-client/src/lib/utils.ts","../../../projects/advanced-http-client/src/lib/advanced-http-client.service.ts","../../../projects/advanced-http-client/src/lib/advanced-http-client.component.ts","../../../projects/advanced-http-client/src/public-api.ts","../../../projects/advanced-http-client/src/hasan-akbari-advanced-http-client.ts"],"sourcesContent":["export class MemoryCache<T>{\n private map=new Map<string,{value:T;expiresAt:number}>();\n set(key:string,value:T,durationMs:number){this.map.set(key,{value,expiresAt:Date.now()+durationMs});}\n get(key:string){const e=this.map.get(key);if(!e)return undefined;if(e.expiresAt<=Date.now()){this.map.delete(key);return undefined;}return e.value;}\n delete(key:string){this.map.delete(key);} \n clear(){this.map.clear();}\n cleanup(){const now=Date.now();for(const [k,e] of this.map.entries())if(e.expiresAt<=now)this.map.delete(k);} \n keys(){return Array.from(this.map.keys());}\n}\n\nexport function stableStringify(obj:any):string{\n if(obj===null||obj===undefined)return String(obj);\n if(typeof obj!=='object')return JSON.stringify(obj);\n if(Array.isArray(obj))return `[${obj.map(stableStringify).join(',')}]`;\n const keys=Object.keys(obj).sort();\n return `{${keys.map(k=>`\"${k}\":${stableStringify(obj[k])}`).join(',')}}`;\n}","import { Observable, defer, from } from 'rxjs';\nimport { switchMap, finalize } from 'rxjs/operators';\n\nexport class RequestQueue{\n private active=0;\n private waiting:Array<{pr:number;resolve:()=>void}>=[];\n constructor(private concurrency:number=4){}\n private priorityToNumber(p:'high'|'normal'|'low'='normal'){return p==='high'?3:p==='normal'?2:1;}\n private acquire(priority:'high'|'normal'|'low'='normal'):Promise<void>{\n if(this.active<this.concurrency){this.active++;return Promise.resolve();}\n return new Promise<void>(resolve=>{this.waiting.push({pr:this.priorityToNumber(priority),resolve});this.waiting.sort((a,b)=>b.pr-a.pr);});\n }\n private release(){if(this.waiting.length>0){const next=this.waiting.shift();next?.resolve();}else{this.active=Math.max(0,this.active-1);}}\n execute<T>(factory:()=>Observable<T>,priority:'high'|'normal'|'low'='normal',concurrency?:number):Observable<T>{\n if(concurrency&&concurrency!==this.concurrency)this.concurrency=concurrency;\n return defer(()=>from(this.acquire(priority)).pipe(switchMap(()=>factory().pipe(finalize(()=>this.release())))));\n }\n}","import { ReplaySubject, Observable } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\n\ninterface BatchBufferItem { payload:any; sub: ReplaySubject<any>; }\ninterface BatchBuffer { items: BatchBufferItem[]; timer?: any; opts: any; }\n\nexport class RequestBatcher{\n private buffers=new Map<string,BatchBuffer>();\n enqueue<T>(key:string,payload:any,options:any,perform:(combined:any,endpoint:string)=>Observable<any>,endpoint:string):Observable<T>{\n const buf=this.buffers.get(key)??{items:[],opts:{...options}};\n this.buffers.set(key,buf);\n const pKey=JSON.stringify(payload);\n const existing=buf.items.find(i=>JSON.stringify(i.payload)===pKey);\n if(existing)return existing.sub.asObservable();\n\n const sub=new ReplaySubject<T>(1);\n buf.items.push({payload,sub});\n\n const size=options.size??10;\n const intervalMs=options.intervalMs??50;\n const flush=()=>{const items=buf.items.splice(0,buf.items.length);clearTimeout((buf as any).timer);(buf as any).timer=undefined;\n const payloads=items.map(i=>i.payload);\n const combined=(options.combine??((arr:any[])=>arr))(payloads);\n const ep=options.endpoint??endpoint;\n perform(combined,ep).pipe(\n catchError(err=>{items.forEach(i=>i.sub.error(err));throw err;})\n ).subscribe(resp=>{\n items.forEach((i,idx)=>{const selector=options.selector??((r:any,_p:any,ix:number)=>Array.isArray(r)?r[ix]:r);\n try{i.sub.next(selector(resp,i.payload,idx));i.sub.complete();}catch(e){i.sub.error(e);}\n });\n });\n };\n const anyBuf=buf as any;\n if(buf.items.length>=size)flush();else{if(anyBuf.timer)clearTimeout(anyBuf.timer);anyBuf.timer=setTimeout(flush,intervalMs);} \n return sub.asObservable();\n }\n}","import { HttpHeaders, HttpParams } from '@angular/common/http';\n\nexport function toHeaders(h?:Record<string,string>|HttpHeaders):HttpHeaders|undefined{\n if(!h)return undefined;return h instanceof HttpHeaders?h:new HttpHeaders(h);\n}\nexport function toParams(p?:Record<string,any>|HttpParams):HttpParams|undefined{\n if(!p)return undefined;if(p instanceof HttpParams)return p;let hp=new HttpParams();Object.entries(p).forEach(([k,v])=>{if(v===null||v===undefined)return;hp=hp.set(k,String(v));});return hp;\n}\nexport function backoffDelay(attempt:number,base:number,type:'linear'|'exponential'|'jitter',max?:number):number{\n let d=base;if(type==='linear')d=base*attempt;else if(type==='exponential')d=base*Math.pow(2,attempt-1);else d=base*Math.pow(2,attempt-1)+Math.floor(Math.random()*base);\n return max?Math.min(d,max):d;\n}","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, of, throwError, timer } from 'rxjs';\nimport { catchError, delay, finalize, retryWhen, scan, shareReplay, switchMap, timeout, tap } from 'rxjs/operators';\nimport { MemoryCache, stableStringify } from './request-cache';\nimport { RequestQueue } from './request-queue';\nimport { RequestBatcher } from './request-batcher';\nimport { toHeaders, toParams, backoffDelay } from './utils';\nimport { SendOptions, HttpMethod } from './types';\n\n@Injectable({providedIn:'root'})\nexport class AdvancedHttpClientService{\n private cache=new MemoryCache<any>();\n private inflight=new Map<string,Observable<any>>();\n private lastSent=new Map<string,number>();\n private queue=new RequestQueue(4);\n private batcher=new RequestBatcher();\n private cleanupHandle=setInterval(()=>this.cache.cleanup(),60000);\n constructor(private http:HttpClient){}\n\n send<T=any>(endpoint:string,payload?:any,options:SendOptions<T>={}):Observable<T>{\n const method:HttpMethod=options.method??'GET';\n const body=options.body??(method==='GET'||method==='HEAD'||method==='OPTIONS'?undefined:payload);\n const paramsObj=options.params??{}; const params=toParams(paramsObj); const headers=toHeaders(options.headers);\n const cacheKey=`${method} ${endpoint} :: ${stableStringify({params:paramsObj,body})}`;\n const raw=!!options.raw;\n const inflightKey=!raw ? (options.batch?.enabled?`${cacheKey} :: payload=${stableStringify(payload)}`:cacheKey) : undefined;\n\n if(options.cacheDurationMs&&options.cacheDurationMs>0){const c=this.cache.get(cacheKey);if(c!==undefined)return of(c as T);} \n if(!raw){const ex=this.inflight.get(inflightKey!);if(ex)return ex as Observable<T>;}\n\n const logEnabled=!!options.log?.enabled;const logLevel=options.log?.level??'basic';\n const log:any=logEnabled?{key:inflightKey??cacheKey,method,endpoint,startedAt:Date.now()}:undefined;\n\n let stream=this.http.request<T>(method,endpoint,{body,headers,params,observe:'body',responseType:'json'});\n if(options.timeoutMs){stream=stream.pipe(timeout(options.timeoutMs));}\n if(options.retry?.attempts){\n stream=stream.pipe(retryWhen(errs=>errs.pipe(\n scan((acc,err)=>{const attempts=options.retry?.attempts??0;const should=options.retry?.shouldRetry?.(err)??true;if(!should||acc>=attempts)throw err;return acc+1;},0),\n switchMap(attempt=>timer(backoffDelay(attempt,options.retry?.baseDelayMs??250,options.retry?.backoff??'exponential',options.retry?.maxDelayMs)))\n )));\n }\n stream=stream.pipe(\n tap(res=>{if(options.cacheDurationMs&&options.cacheDurationMs>0)this.cache.set(cacheKey,res,options.cacheDurationMs);\n if(logEnabled&&logLevel!=='none'){log.status='ok';log.finishedAt=Date.now();if(logLevel==='verbose')log.meta={size:JSON.stringify(res).length};options.log?.sendToServer?.(log);if(options.debug)console.debug('[HTTP]',log);} }),\n catchError(err=>{if(options.retry?.fallbackValue!==undefined){const fv=typeof options.retry.fallbackValue==='function'?(options.retry.fallbackValue as any)():options.retry.fallbackValue;return of(fv as T);} \n if(logEnabled&&logLevel!=='none'){log.status='error';log.finishedAt=Date.now();log.error=err;options.log?.sendToServer?.(log);if(options.debug)console.error('[HTTP]',log);} return throwError(()=>err);} ),\n finalize(()=>{if(!raw&&inflightKey)this.inflight.delete(inflightKey);if(!raw)this.lastSent.set(cacheKey,Date.now());})\n );\n if(!raw){stream=stream.pipe(shareReplay({bufferSize:1,refCount:true}));}\n\n const debounceMs=options.debounceMs??0;const minIntervalMs=options.rateLimitMs??0;\n const last=this.lastSent.get(cacheKey)??0;const needDelay=minIntervalMs>0?Math.max(0,minIntervalMs-(Date.now()-last)):0;\n const totalDelay=Math.max(debounceMs,needDelay);\n\n const exec$=(options.queue?.enabled)?this.queue.execute(()=>stream,options.queue.priority??'normal',options.queue.concurrency??(options.queue.mode==='parallel'?4:1)):stream;\n let scheduled$:Observable<T>;\n if(totalDelay>0){\n scheduled$=timer(totalDelay).pipe(switchMap(()=>exec$ as Observable<T>));\n }else{scheduled$=exec$;}\n\n let out$:Observable<T>;\n if(options.batch?.enabled && !raw){\n const bKey=options.batch.key??`${method}:${endpoint}`;\n let batchStream = this.batcher.enqueue<T>(bKey,payload,options.batch,(combined,ep)=>{\n const epWithQuery=(method==='GET'||method==='HEAD'||method==='OPTIONS')&&Array.isArray(combined)\n ? `${ep}?${combined.map((v:any)=>`id=${encodeURIComponent(v)}`).join('&')}`\n : ep;\n const bodyForMethod=(method==='GET'||method==='HEAD'||method==='OPTIONS')?undefined:combined;\n return this.http.request<T>(method,epWithQuery,{body:bodyForMethod,headers,params,observe:'body',responseType:'json'});\n },endpoint);\n if(options.timeoutMs){batchStream=batchStream.pipe(timeout(options.timeoutMs));}\n out$=batchStream.pipe(shareReplay({bufferSize:1,refCount:true}));\n }else{out$=scheduled$;}\n\n if(!raw&&inflightKey){this.inflight.set(inflightKey,out$);} \n return out$;\n }\n\n get<T>(endpoint:string,params?:Record<string,any>,options:Omit<SendOptions<T>,'method'|'params'>={}){return this.send<T>(endpoint,undefined,{...options,method:'GET',params});}\n post<T>(endpoint:string,body?:any,options:Omit<SendOptions<T>,'method'|'body'>={}){return this.send<T>(endpoint,body,{...options,method:'POST',body});}\n put<T>(endpoint:string,body?:any,options:Omit<SendOptions<T>,'method'|'body'>={}){return this.send<T>(endpoint,body,{...options,method:'PUT',body});}\n patch<T>(endpoint:string,body?:any,options:Omit<SendOptions<T>,'method'|'body'>={}){return this.send<T>(endpoint,body,{...options,method:'PATCH',body});}\n delete<T>(endpoint:string,body?:any,options:Omit<SendOptions<T>,'method'|'body'>={}){return this.send<T>(endpoint,body,{...options,method:'DELETE',body});}\n head<T>(endpoint:string,params?:Record<string,any>,options:Omit<SendOptions<T>,'method'|'params'|'body'>={}){return this.send<T>(endpoint,undefined,{...options,method:'HEAD',params});}\n options<T>(endpoint:string,params?:Record<string,any>,options:Omit<SendOptions<T>,'method'|'params'|'body'>={}){return this.send<T>(endpoint,undefined,{...options,method:'OPTIONS',params});}\n\n clearCacheByKey(method:HttpMethod,endpoint:string,paramsOrBody?:any){const key=`${method} ${endpoint} :: ${stableStringify(paramsOrBody??{})}`;this.cache.delete(key);} \n clearCacheByEndpoint(endpoint:string){for(const k of this.cache.keys())if(k.includes(` ${endpoint} :: `))this.cache.delete(k);} \n clearAllCache(){this.cache.clear();}\n ngOnDestroy(){clearInterval(this.cleanupHandle);} \n}","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-advanced-http-client',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <p>\r\n advanced-http-client works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class AdvancedHttpClientComponent {\r\n\r\n}\r\n","/*\r\n * Public API Surface of advanced-http-client\r\n */\r\n\r\nexport * from './lib/advanced-http-client.service';\r\nexport * from './lib/advanced-http-client.component';\r\nexport * from './lib/types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}