@equinor/fusion-framework-module-http 2.0.4 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/esm/configurator.js +1 -1
  3. package/dist/esm/configurator.js.map +1 -1
  4. package/dist/esm/index.js +0 -3
  5. package/dist/esm/index.js.map +1 -1
  6. package/dist/esm/{client-msal.js → lib/client/client-msal.js} +0 -0
  7. package/dist/esm/lib/client/client-msal.js.map +1 -0
  8. package/dist/esm/{client.js → lib/client/client.js} +5 -13
  9. package/dist/esm/lib/client/client.js.map +1 -0
  10. package/dist/esm/lib/client/index.js +4 -0
  11. package/dist/esm/lib/client/index.js.map +1 -0
  12. package/dist/esm/lib/client/types.js +2 -0
  13. package/dist/esm/lib/client/types.js.map +1 -0
  14. package/dist/esm/lib/index.js +4 -0
  15. package/dist/esm/lib/index.js.map +1 -0
  16. package/dist/esm/lib/operators/http-request-handler.js +10 -0
  17. package/dist/esm/lib/operators/http-request-handler.js.map +1 -0
  18. package/dist/esm/lib/operators/http-response-handler.js +5 -0
  19. package/dist/esm/lib/operators/http-response-handler.js.map +1 -0
  20. package/dist/esm/lib/operators/index.js +5 -0
  21. package/dist/esm/lib/operators/index.js.map +1 -0
  22. package/dist/esm/{process-operators.js → lib/operators/process-operators.js} +0 -0
  23. package/dist/esm/lib/operators/process-operators.js.map +1 -0
  24. package/dist/esm/lib/operators/request-operator-header.js +7 -0
  25. package/dist/esm/lib/operators/request-operator-header.js.map +1 -0
  26. package/dist/esm/lib/operators/types.js +2 -0
  27. package/dist/esm/lib/operators/types.js.map +1 -0
  28. package/dist/esm/lib/selectors/index.js +2 -0
  29. package/dist/esm/lib/selectors/index.js.map +1 -0
  30. package/dist/esm/{selector.js → lib/selectors/json-selector.js} +2 -1
  31. package/dist/esm/lib/selectors/json-selector.js.map +1 -0
  32. package/dist/esm/module.js +1 -1
  33. package/dist/esm/module.js.map +1 -1
  34. package/dist/esm/provider.js.map +1 -1
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/dist/types/configurator.d.ts +9 -7
  37. package/dist/types/index.d.ts +1 -3
  38. package/dist/types/{client-msal.d.ts → lib/client/client-msal.d.ts} +2 -1
  39. package/dist/types/lib/client/client.d.ts +32 -0
  40. package/dist/types/lib/client/index.d.ts +3 -0
  41. package/dist/types/lib/client/types.d.ts +27 -0
  42. package/dist/types/lib/index.d.ts +3 -0
  43. package/dist/types/lib/operators/http-request-handler.d.ts +6 -0
  44. package/dist/types/lib/operators/http-response-handler.d.ts +4 -0
  45. package/dist/types/lib/operators/index.d.ts +4 -0
  46. package/dist/types/{process-operators.d.ts → lib/operators/process-operators.d.ts} +2 -2
  47. package/dist/types/lib/operators/request-operator-header.d.ts +4 -0
  48. package/dist/types/lib/operators/types.d.ts +14 -0
  49. package/dist/types/lib/selectors/index.d.ts +1 -0
  50. package/dist/types/{selector.d.ts → lib/selectors/json-selector.d.ts} +1 -0
  51. package/dist/types/module.d.ts +2 -2
  52. package/dist/types/provider.d.ts +5 -3
  53. package/package.json +24 -5
  54. package/src/configurator.ts +10 -7
  55. package/src/index.ts +2 -4
  56. package/src/{client-msal.ts → lib/client/client-msal.ts} +2 -1
  57. package/src/lib/client/client.ts +161 -0
  58. package/src/lib/client/index.ts +4 -0
  59. package/src/lib/client/types.ts +145 -0
  60. package/src/lib/index.ts +3 -0
  61. package/src/lib/operators/http-request-handler.ts +21 -0
  62. package/src/lib/operators/http-response-handler.ts +5 -0
  63. package/src/lib/operators/index.ts +5 -0
  64. package/src/{process-operators.ts → lib/operators/process-operators.ts} +2 -19
  65. package/src/lib/operators/request-operator-header.ts +12 -0
  66. package/src/lib/operators/types.ts +42 -0
  67. package/src/lib/selectors/index.ts +1 -0
  68. package/src/{selector.ts → lib/selectors/json-selector.ts} +2 -0
  69. package/src/module.ts +2 -2
  70. package/src/provider.ts +6 -3
  71. package/dist/esm/client-msal.js.map +0 -1
  72. package/dist/esm/client.js.map +0 -1
  73. package/dist/esm/process-operators.js.map +0 -1
  74. package/dist/esm/selector.js.map +0 -1
  75. package/dist/types/client.d.ts +0 -54
  76. package/src/client.ts +0 -286
package/src/provider.ts CHANGED
@@ -1,10 +1,13 @@
1
- import { HttpClient, HttpRequestHandler, IHttpClient } from './client';
1
+ import { HttpClient } from './lib/client';
2
2
  import {
3
3
  HttpClientOptions,
4
4
  HttpClientRequestInitType,
5
5
  IHttpClientConfigurator,
6
6
  } from './configurator';
7
7
 
8
+ import type { IHttpRequestHandler } from './lib/operators';
9
+ import type { IHttpClient } from './lib/client';
10
+
8
11
  export class ClientNotFoundException extends Error {
9
12
  constructor(message: string) {
10
13
  super(message);
@@ -12,7 +15,7 @@ export class ClientNotFoundException extends Error {
12
15
  }
13
16
 
14
17
  export interface IHttpClientProvider<TClient extends IHttpClient = IHttpClient> {
15
- readonly defaultHttpRequestHandler: HttpRequestHandler<HttpClientRequestInitType<TClient>>;
18
+ readonly defaultHttpRequestHandler: IHttpRequestHandler<HttpClientRequestInitType<TClient>>;
16
19
  /** check if a client is configured */
17
20
  hasClient(key: string): boolean;
18
21
  /** create a new http client */
@@ -46,7 +49,7 @@ const isURL = (url: string) => {
46
49
  export class HttpClientProvider<TClient extends IHttpClient = IHttpClient>
47
50
  implements IHttpClientProvider<TClient>
48
51
  {
49
- get defaultHttpRequestHandler(): HttpRequestHandler<HttpClientRequestInitType<TClient>> {
52
+ get defaultHttpRequestHandler(): IHttpRequestHandler<HttpClientRequestInitType<TClient>> {
50
53
  return this.config.defaultHttpRequestHandler;
51
54
  }
52
55
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-msal.js","sourceRoot":"","sources":["../../src/client-msal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkC,MAAM,UAAU,CAAC;AAWtE,MAAM,OAAO,cAGX,SAAQ,UAA+B;IAE9B,aAAa,GAAa,EAAE,CAAC;IAGpC,MAAM,CACF,IAAY,EACZ,IAAmD;QAEnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;SACxD,CAA6C,CAAC;QAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;CACJ;AAED,eAAe,cAAc,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-operators.js","sourceRoot":"","sources":["../../src/process-operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAEhC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAQjD,MAAM,OAAO,gBAAgB;IACf,UAAU,GAAuC,EAAE,CAAC;IAK9D,GAAG,CAAC,GAAW,EAAE,QAA4B;QACzC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC1C,MAAM,KAAK,CAAC,aAAa,GAAG,mBAAmB,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAKD,GAAG,CAAC,GAAW,EAAE,QAA4B;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;QAChC,OAAO,IAAI,CAAC;IAChB,CAAC;IAKD,GAAG,CAAC,GAAW;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAKD,OAAO,CAAC,OAAU;QACd,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEjD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YACnB,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;SACtB;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAC5C,SAAS,CAEL,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,EAE7E,OAAO,EAEP,CAAC,CACJ,EAED,IAAI,EAAE,CACT,CAAC;IACN,CAAC;CACJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/selector.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CACxB,QAAmB,EACL,EAAE;IAChB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;KAClD;IACD,IAAI;QACA,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;KAC1B;IAAC,OAAO,GAAG,EAAE;QACV,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;KAC3C;AACL,CAAC,CAAC"}
@@ -1,54 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import type { Observable, ObservableInput } from 'rxjs';
3
- import { ProcessOperators } from './process-operators';
4
- export declare type FetchRequest = RequestInit & {
5
- uri: string;
6
- path: string;
7
- };
8
- export declare type FetchRequestInit<TReturn = unknown, TRequest = FetchRequest, TResponse = Response> = Omit<TRequest, 'uri' | 'path'> & {
9
- selector?: (response: TResponse) => ObservableInput<TReturn>;
10
- };
11
- export declare class HttpRequestHandler<T extends FetchRequest = FetchRequest> extends ProcessOperators<T> {
12
- setHeader(key: string, value: string): HttpRequestHandler<T>;
13
- }
14
- export declare class HttpResponseHandler<T = Response> extends ProcessOperators<T> {
15
- }
16
- export declare type HttpClientCreateOptions<TRequest extends FetchRequest = FetchRequest, TResponse = Response> = {
17
- requestHandler: HttpRequestHandler<TRequest>;
18
- responseHandler: HttpResponseHandler<TResponse>;
19
- };
20
- export interface IHttpClient<TRequest extends FetchRequest = FetchRequest, TResponse = Response> {
21
- uri: string;
22
- readonly requestHandler: HttpRequestHandler<TRequest>;
23
- readonly responseHandler: HttpResponseHandler<TResponse>;
24
- request$: Observable<TRequest>;
25
- response$: Observable<TResponse>;
26
- fetch$<T = TResponse>(path: string, init?: FetchRequestInit<T, TRequest, TResponse>): Observable<T>;
27
- fetch<T = TResponse>(path: string, init?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
28
- json$<T = TResponse>(path: string, init?: FetchRequestInit<T, TRequest, TResponse>): Observable<T>;
29
- json<T = TResponse>(path: string, init?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
30
- abort(): void;
31
- }
32
- export declare class HttpClient<TRequest extends FetchRequest = FetchRequest, TResponse = Response> implements IHttpClient<TRequest, TResponse> {
33
- uri: string;
34
- readonly requestHandler: HttpRequestHandler<TRequest>;
35
- readonly responseHandler: HttpResponseHandler<TResponse>;
36
- protected _request$: Subject<TRequest>;
37
- protected _response$: Subject<TResponse>;
38
- protected _abort$: Subject<void>;
39
- get request$(): Observable<TRequest>;
40
- get response$(): Observable<TResponse>;
41
- constructor(uri: string, options?: Partial<HttpClientCreateOptions<TRequest, TResponse>>);
42
- protected _init(): void;
43
- fetch$<T = TResponse>(path: string, args?: FetchRequestInit<T, TRequest, TResponse>): Observable<T>;
44
- fetch<T = TResponse>(path: string, args?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
45
- fetchAsync<T = TResponse>(path: string, args?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
46
- json$<T = TResponse>(path: string, args?: FetchRequestInit<T, TRequest, TResponse>): Observable<T>;
47
- json<T = TResponse>(path: string, args?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
48
- jsonAsync<T = TResponse>(path: string, args?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
49
- abort(): void;
50
- protected _fetch$<T = TResponse>(path: string, args?: FetchRequestInit<T, TRequest, TResponse>): Observable<T>;
51
- protected _prepareRequest(init: TRequest): ObservableInput<TRequest>;
52
- protected _prepareResponse(response: TResponse): ObservableInput<TResponse>;
53
- protected _resolveUrl(path: string): string;
54
- }
package/src/client.ts DELETED
@@ -1,286 +0,0 @@
1
- import { firstValueFrom, of, Subject } from 'rxjs';
2
- import { switchMap, takeUntil, tap } from 'rxjs/operators';
3
- import { fromFetch } from 'rxjs/fetch';
4
-
5
- import type { Observable, ObservableInput } from 'rxjs';
6
-
7
- import { ProcessOperators } from './process-operators';
8
- import { jsonSelector } from './selector';
9
-
10
- export type FetchRequest = RequestInit & {
11
- uri: string;
12
- path: string;
13
- };
14
-
15
- export type FetchRequestInit<
16
- TReturn = unknown,
17
- TRequest = FetchRequest,
18
- TResponse = Response
19
- > = Omit<TRequest, 'uri' | 'path'> & {
20
- selector?: (response: TResponse) => ObservableInput<TReturn>;
21
- };
22
-
23
- /**
24
- * Extends @see {ProcessOperators} for pre-processing requests.
25
- */
26
- export class HttpRequestHandler<T extends FetchRequest = FetchRequest> extends ProcessOperators<T> {
27
- /**
28
- * Set header that will apply on all requests done by consumer @see {HttpClient}
29
- * @param key - name of header
30
- * @param value - header value
31
- */
32
- setHeader(key: string, value: string): HttpRequestHandler<T> {
33
- return this.set('header-' + key, (request) => {
34
- const headers = new Headers(request.headers);
35
- headers.append(key, value);
36
- return { ...request, headers };
37
- }) as unknown as HttpRequestHandler<T>;
38
- }
39
- }
40
-
41
- export class HttpResponseHandler<T = Response> extends ProcessOperators<T> {}
42
-
43
- export type HttpClientCreateOptions<
44
- TRequest extends FetchRequest = FetchRequest,
45
- TResponse = Response
46
- > = {
47
- requestHandler: HttpRequestHandler<TRequest>;
48
- responseHandler: HttpResponseHandler<TResponse>;
49
- };
50
-
51
- // export type HttpResponseHandler<T> = (response: Response) => Promise<T>;
52
-
53
- /**
54
- * @template TRequest request arguments @see {@link https://developer.mozilla.org/en-US/docs/Web/API/request|request}
55
- * @template TResponse request arguments @see {@link https://developer.mozilla.org/en-US/docs/Web/API/response|response}
56
- */
57
- export interface IHttpClient<TRequest extends FetchRequest = FetchRequest, TResponse = Response> {
58
- uri: string;
59
- /** pre-processor of requests */
60
- readonly requestHandler: HttpRequestHandler<TRequest>;
61
- /** post-processor of requests */
62
- readonly responseHandler: HttpResponseHandler<TResponse>;
63
-
64
- /** Observable stream of request */
65
- request$: Observable<TRequest>;
66
-
67
- /** Observable stream of responses */
68
- response$: Observable<TResponse>;
69
-
70
- /**
71
- * Observable request.
72
- * Simplifies execution of request and
73
- * note: request will not be executed until subscribe!
74
- *
75
- * @see {@link https://rxjs.dev/api/fetch/fromFetch|RXJS}
76
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch|fetch}
77
- * @example
78
- * ```ts
79
- * // Observer changes of a input field
80
- * const client = modules.http.createClient('my-client');
81
- * const input$ = fromEvent(document.getElementById('input'), 'input');
82
- * input$.pipe(
83
- * // only call after no key input in .5s
84
- * debounceTime(500),
85
- * // extract value from event
86
- * map(x => x.currentTarget.value),
87
- * // only search when text longer than 2 characters
88
- * filter(x => x.length >=3),
89
- * // query api with input value
90
- * switchMap(x => client.fetch(`api/foo?q=${x}`).pipe(
91
- * // retry 2 times
92
- * retry(2)
93
- * // cancel request if new input
94
- * takeUntil(input$)
95
- * )),
96
- * // extract data from response
97
- * switchMap(x => x.json()),
98
- * // process error
99
- * catchError(x => of({error: e.message}))
100
- * // write result to pre element
101
- * ).subscribe(console.log);
102
- * ```
103
- */
104
- fetch$<T = TResponse>(
105
- path: string,
106
- init?: FetchRequestInit<T, TRequest, TResponse>
107
- ): Observable<T>;
108
-
109
- /**
110
- * Fetch a resource as an promise
111
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch|fetch}
112
- * @example
113
- * ```ts
114
- * let controller: AbortController;
115
- * const client = window.Fusion.createClient('my-client');
116
- * const input = document.getElementById('input');
117
- * input.addEventlistener('input', (e) => {
118
- * try{
119
- * // if a controller is defined, request might be ongoing
120
- * controller && controller.abort();
121
- * // create a new abort controller
122
- * controller = new AbortController();
123
- * // query api with
124
- * const response = await client.fetch({
125
- * path: `api/foo?q=${e.currentTarget.value}`,
126
- * signal: controller.signal,
127
- * });
128
- * const json = await response.json();
129
- * result.innerText = JSON.stringify(json, null, 2)
130
- * } catch(err){
131
- * result.innerText = 'an error occurred'
132
- * } finally{
133
- * delete controller;
134
- * }
135
- * });
136
- * ```
137
- */
138
- fetch<T = TResponse>(path: string, init?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
139
-
140
- json$<T = TResponse>(
141
- path: string,
142
- init?: FetchRequestInit<T, TRequest, TResponse>
143
- ): Observable<T>;
144
-
145
- json<T = TResponse>(path: string, init?: FetchRequestInit<T, TRequest, TResponse>): Promise<T>;
146
-
147
- /**
148
- * Abort all ongoing request for current client
149
- */
150
- abort(): void;
151
- }
152
-
153
- /** Base http client for executing requests */
154
- export class HttpClient<TRequest extends FetchRequest = FetchRequest, TResponse = Response>
155
- implements IHttpClient<TRequest, TResponse>
156
- {
157
- readonly requestHandler: HttpRequestHandler<TRequest>;
158
-
159
- readonly responseHandler: HttpResponseHandler<TResponse>;
160
-
161
- /** stream of requests that are about to be executed */
162
- protected _request$ = new Subject<TRequest>();
163
-
164
- /** stream of request responses */
165
- protected _response$ = new Subject<TResponse>();
166
-
167
- protected _abort$ = new Subject<void>();
168
-
169
- public get request$(): Observable<TRequest> {
170
- return this._request$.asObservable();
171
- }
172
-
173
- public get response$(): Observable<TResponse> {
174
- return this._response$.asObservable();
175
- }
176
-
177
- constructor(
178
- public uri: string,
179
- options?: Partial<HttpClientCreateOptions<TRequest, TResponse>>
180
- ) {
181
- this.requestHandler = options?.requestHandler ?? new HttpRequestHandler<TRequest>();
182
- this.responseHandler = options?.responseHandler ?? new HttpResponseHandler<TResponse>();
183
- this._init();
184
- }
185
-
186
- /** internal abstract method, for overriding instead of overriding constructor */
187
- protected _init(): void {
188
- // called by children for constructor setup
189
- }
190
-
191
- public fetch$<T = TResponse>(
192
- path: string,
193
- args?: FetchRequestInit<T, TRequest, TResponse>
194
- ): Observable<T> {
195
- return this._fetch$(path, args);
196
- }
197
-
198
- public fetch<T = TResponse>(
199
- path: string,
200
- args?: FetchRequestInit<T, TRequest, TResponse>
201
- ): Promise<T> {
202
- return firstValueFrom(this.fetch$<T>(path, args));
203
- }
204
-
205
- /** @deprecated */
206
- public fetchAsync<T = TResponse>(
207
- path: string,
208
- args?: FetchRequestInit<T, TRequest, TResponse>
209
- ): Promise<T> {
210
- return this.fetch(path, args);
211
- }
212
-
213
- public json$<T = TResponse>(
214
- path: string,
215
- args?: FetchRequestInit<T, TRequest, TResponse>
216
- ): Observable<T> {
217
- const body = typeof args?.body === 'object' ? JSON.stringify(args?.body) : args?.body;
218
- const selector = args?.selector ?? jsonSelector;
219
- const header = new Headers(args?.headers);
220
- header.append('Content-Type', 'application/json');
221
- return this.fetch$(path, {
222
- ...args,
223
- body,
224
- selector,
225
- } as FetchRequestInit<T, TRequest, TResponse>);
226
- }
227
-
228
- public json<T = TResponse>(
229
- path: string,
230
- args?: FetchRequestInit<T, TRequest, TResponse>
231
- ): Promise<T> {
232
- return firstValueFrom(this.json$<T>(path, args));
233
- }
234
-
235
- /** @deprecated */
236
- public jsonAsync<T = TResponse>(
237
- path: string,
238
- args?: FetchRequestInit<T, TRequest, TResponse>
239
- ): Promise<T> {
240
- return this.json(path, args);
241
- }
242
-
243
- public abort(): void {
244
- this._abort$.next();
245
- }
246
-
247
- protected _fetch$<T = TResponse>(
248
- path: string,
249
- args?: FetchRequestInit<T, TRequest, TResponse>
250
- ): Observable<T> {
251
- const { selector, ...options } = args || {};
252
- const response$ = of({
253
- ...options,
254
- uri: this._resolveUrl(path),
255
- } as TRequest).pipe(
256
- /** prepare request, allow extensions to modify request */
257
- switchMap((x) => this._prepareRequest(x)),
258
- /** push request to event buss */
259
- tap((x) => this._request$.next(x)),
260
- /** execute request */
261
- switchMap(({ uri, path: _path, ...init }) => fromFetch(uri, init)),
262
- /** prepare response, allow extensions to modify response */
263
- switchMap((x) => this._prepareResponse(x as unknown as TResponse)),
264
- /** push response to event buss */
265
- tap((x) => this._response$.next(x)),
266
-
267
- switchMap((x) => (selector ? selector(x) : Promise.resolve(x))),
268
- /** cancel request on abort signal */
269
- takeUntil(this._abort$)
270
- );
271
- return response$ as unknown as Observable<T>;
272
- }
273
-
274
- protected _prepareRequest(init: TRequest): ObservableInput<TRequest> {
275
- return this.requestHandler.process(init);
276
- }
277
-
278
- protected _prepareResponse(response: TResponse): ObservableInput<TResponse> {
279
- return this.responseHandler.process(response);
280
- }
281
-
282
- protected _resolveUrl(path: string): string {
283
- const baseUrl = this.uri || window.location.origin;
284
- return new URL(path, baseUrl).href;
285
- }
286
- }