(
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,
)
| 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}; |
nothing calls this directly
no test coverage detected