MCPcopy Index your code
hub / github.com/angular/angular / HttpResourceImpl

Class HttpResourceImpl

packages/common/http/src/resource.ts:336–463  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

334 );
335}
336class HttpResourceImpl<T>
337 extends ResourceImpl<T, HttpRequest<unknown> | undefined>
338 implements HttpResourceRef<T>
339{
340 private client!: HttpClient;
341 private _headers = linkedSignal({
342 source: this.extRequest,
343 computation: () => undefined as HttpHeaders | undefined,
344 });
345 private _progress = linkedSignal({
346 source: this.extRequest,
347 computation: () => undefined as HttpProgressEvent | undefined,
348 });
349 private _statusCode = linkedSignal({
350 source: this.extRequest,
351 computation: () => undefined as number | undefined,
352 });
353
354 readonly headers = computed(() =>
355 this.status() === 'resolved' || this.status() === 'error' ? this._headers() : undefined,
356 );
357 readonly progress = this._progress.asReadonly();
358 readonly statusCode = this._statusCode.asReadonly();
359
360 constructor(
361 injector: Injector,
362 request: (ctx: ResourceParamsContext) => HttpRequest<T> | undefined,
363 defaultValue: T,
364 debugName?: string,
365 parse?: (value: unknown) => T,
366 equal?: ValueEqualityFn<unknown>,
367 getInitialStream?: (
368 request: HttpRequest<unknown> | undefined,
369 ) => Signal<ResourceStreamItem<T>> | undefined,
370 ) {
371 super(
372 request,
373 ({params: request, abortSignal}) => {
374 let sub: Subscription | undefined;
375 // In the unlikely case the request returns synchronously we want to make sure the observable
376 // is subscribe even if it isn't initialized yet.
377 let aborted = false;
378
379 // Track the abort listener so it can be removed if the Observable completes (as a memory
380 // optimization).
381 const onAbort = () => {
382 aborted = true;
383 sub?.unsubscribe();
384 };
385 abortSignal.addEventListener('abort', onAbort);
386
387 // Start off stream as undefined.
388 const stream = signal<ResourceStreamItem<T>>({value: undefined as T});
389 let resolve: ((value: Signal<ResourceStreamItem<T>>) => void) | undefined;
390 const promise = new Promise<Signal<ResourceStreamItem<T>>>((r) => (resolve = r));
391
392 const send = (value: ResourceStreamItem<T>): void => {
393 stream.set(value);

Callers

nothing calls this directly

Calls 4

linkedSignalFunction · 0.90
computedFunction · 0.90
asReadonlyMethod · 0.65
statusMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…