MCPcopy
hub / github.com/angular/angular / constructor

Method constructor

packages/core/src/resource/resource.ts:203–345  ·  view source on GitHub ↗
(
    request: (ctx: ResourceParamsContext) => R,
    private readonly loaderFn: ResourceStreamingLoader<T, R>,
    defaultValue: T,
    private readonly equal: ValueEqualityFn<T> | undefined,
    private readonly debugName: string | undefined,
    injector: Injector,
    private transferCacheKey: StateKey<T> | undefined,
    getInitialStream?: (request: R) => Signal<ResourceStreamItem<T>> | undefined,
  )

Source from the content-addressed store, hash-verified

201 private readonly transferState: TransferState | undefined;
202
203 constructor(
204 request: (ctx: ResourceParamsContext) => R,
205 private readonly loaderFn: ResourceStreamingLoader<T, R>,
206 defaultValue: T,
207 private readonly equal: ValueEqualityFn<T> | undefined,
208 private readonly debugName: string | undefined,
209 injector: Injector,
210 private transferCacheKey: StateKey<T> | undefined,
211 getInitialStream?: (request: R) => Signal<ResourceStreamItem<T>> | undefined,
212 ) {
213 if (isInParamsFunction()) {
214 throw invalidResourceCreationInParams();
215 }
216
217 super(
218 // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a
219 // `WritableSignal` that delegates to `ResourceImpl.set`.
220 computed(
221 () => {
222 const streamValue = this.state().stream?.();
223
224 if (!streamValue) {
225 return defaultValue;
226 }
227
228 // Prevents `hasValue()` from throwing an error when a reload happened in the error state
229 if (this.state().status === 'loading' && this.error()) {
230 return defaultValue;
231 }
232
233 if (!isResolved(streamValue)) {
234 throw new ResourceValueError(this.error()!);
235 }
236
237 return streamValue.value;
238 },
239 {equal, ...(ngDevMode ? createDebugNameObject(debugName, 'value') : undefined)},
240 ),
241 debugName,
242 );
243
244 const cacheState = injector.get(CACHE_ACTIVE, undefined, {optional: true}) ?? {isActive: false};
245
246 this.transferState = injector.get(TransferState, undefined, {optional: true}) ?? undefined;
247
248 this.extRequest = linkedSignal<WrappedRequest>(
249 () => {
250 try {
251 setInParamsFunction(true);
252 return {request: request(paramsContext), reload: 0};
253 } catch (error) {
254 rethrowFatalErrors(error);
255 if (error === ResourceParamsStatus.IDLE) {
256 return {status: 'idle', reload: 0};
257 } else if (error === ResourceParamsStatus.LOADING) {
258 return {status: 'loading', reload: 0};
259 }
260 return {error: error as Error, reload: 0};

Callers

nothing calls this directly

Calls 15

destroyMethod · 0.95
computedFunction · 0.90
linkedSignalFunction · 0.90
signalFunction · 0.90
effectFunction · 0.90
isInParamsFunctionFunction · 0.85
isResolvedFunction · 0.85
setInParamsFunctionFunction · 0.85
requestFunction · 0.85
rethrowFatalErrorsFunction · 0.85
encapsulateResourceErrorFunction · 0.85

Tested by

no test coverage detected