@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
1 lines • 18.3 kB
Source Map (JSON)
{"version":3,"file":"c8y-ngx-components-api.mjs","sources":["../../api/interceptor.model.ts","../../api/http-handler.model.ts","../../api/api.service.ts","../../api/data.module.ts","../../api/index.ts","../../api/c8y-ngx-components-api.ts"],"sourcesContent":["import { ApiCall } from './api.model';\nimport { Observable } from 'rxjs';\nimport { IFetchResponse } from '@c8y/client';\n\nexport interface HttpInterceptor {\n intercept(req: ApiCall, next: HttpHandler): Observable<IFetchResponse>;\n}\n\nexport abstract class HttpHandler {\n abstract handle(req: ApiCall): Observable<IFetchResponse>;\n}\n","import { ApiCall } from './api.model';\nimport { Observable, from } from 'rxjs';\nimport { FetchClient, IFetchResponse } from '@c8y/client';\nimport { HttpHandler, HttpInterceptor } from './interceptor.model';\n\nexport class HttpInterceptHandler extends HttpHandler {\n constructor(protected interceptor: HttpInterceptor, protected nextHandler: HttpHandler) {\n super();\n }\n\n handle(req: ApiCall): Observable<IFetchResponse> {\n return this.interceptor.intercept(req, this.nextHandler);\n }\n}\n\nexport interface RequestStartAndFinish {\n onStart(req: ApiCall): void;\n onFinish(res: ApiCall): void;\n}\n\nexport class HttpRequestHandler extends HttpHandler {\n constructor(protected fetch: FetchClient['fetch'], protected apiService?: RequestStartAndFinish) {\n super();\n }\n\n handle(req: ApiCall): Observable<IFetchResponse> {\n const { options, url } = req;\n const { method } = options;\n this.apiService?.onStart({ method, options, url });\n let fetchPromise = this.fetch(url, options);\n if (typeof options.responseInterceptor === 'function') {\n fetchPromise = fetchPromise.then(options.responseInterceptor);\n }\n fetchPromise.then(\n (response: IFetchResponse) => this.apiService?.onFinish({ method, options, url, response }),\n (response: IFetchResponse) => this.apiService?.onFinish({ method, options, url, response })\n );\n return from(fetchPromise);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FetchClient, IFetchOptions, IFetchResponse } from '@c8y/client';\nimport { MonoTypeOperatorFunction, Observable, Subject, pipe } from 'rxjs';\nimport { distinctUntilChanged, filter, map, scan, shareReplay } from 'rxjs/operators';\nimport { ApiCall, ApiCallOptions } from './api.model';\nimport {\n HttpInterceptHandler,\n HttpRequestHandler,\n RequestStartAndFinish\n} from './http-handler.model';\nimport { HttpHandler, HttpInterceptor } from './interceptor.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiService implements RequestStartAndFinish {\n calls: Observable<ApiCall>;\n isLoading$: Observable<boolean>;\n private callsSubject = new Subject<ApiCall>();\n private interceptors = new Map<string, HttpInterceptor>();\n private interceptorCounter = 0;\n\n constructor(private client: FetchClient) {\n this.calls = this.callsSubject.asObservable();\n this.hookIntoClientFetch();\n\n this.isLoading$ = this.calls.pipe(\n filter(({ url }) => !/notification\\/realtime/.test(url)),\n map(({ phase }) => (phase === 'start' ? 1 : -1)),\n scan((count, item) => count + item, 0),\n map(count => count > 0),\n distinctUntilChanged(),\n shareReplay(1)\n );\n }\n\n /**\n * Allows to hook into the responses received by the FetchClient.\n * This is meant to be used to react on the responses, not for manipulation of the responses.\n * @param hookFilter A filter function to filter for specific responses.\n * @returns An Observable of the filtered responses.\n */\n hookResponse(hookFilter: (call: ApiCall) => boolean): Observable<ApiCall> {\n return this.callsSubject.pipe(\n filter(({ phase }) => phase === 'finish'),\n filter(hookFilter)\n );\n }\n\n /**\n * Allows to hook into the requests performed by the FetchClient.\n * This is meant to be used to react on the requests, not for manipulation of the requests.\n * @param hookFilter A filter function to filter for specific requests.\n * @returns An Observable of the filtered requests.\n */\n hookRequest(hookFilter: (call: ApiCall) => boolean): Observable<ApiCall> {\n return this.callsSubject.pipe(\n filter(({ phase }) => phase === 'start'),\n filter(hookFilter)\n );\n }\n\n onFinish(call: ApiCall): void {\n this.callsSubject.next({ phase: 'finish', ...call });\n }\n\n onStart(call: ApiCall): void {\n this.callsSubject.next({ phase: 'start', ...call });\n }\n\n /**\n * Resolves data from an API call response.\n * @returns A Promise containing an object with resolved data, method, and URL.\n */\n resolveData<T = unknown>(call: ApiCall): Promise<{ data: T; method: string; url: string }> {\n const { response, method, url } = call;\n if ('data' in response) {\n return Promise.resolve({ data: response.data, method, url });\n } else {\n // No Content success status, for example DELETE request.\n if ((response as Response)?.status === 204) {\n return Promise.resolve({ data: null, method, url });\n }\n const cb = data => ({ data, method, url });\n return (response as Response).clone().json().then(cb, cb);\n }\n }\n\n /**\n * Can be added to a pipe to exclude any permission call. Permission calls are PUT\n * request with only an id in it, to verify if the user has access to this managed object.\n * @returns The operator to be added to a pipe.\n */\n excludePermissionCall(): MonoTypeOperatorFunction<ApiCall> {\n return pipe(\n filter(({ method, options }) => {\n if (method === 'PUT' && options.body && typeof options.body === 'string') {\n const parsedBody = JSON.parse(options.body as string);\n const bodyKeys = Object.keys(parsedBody);\n return !(bodyKeys.length === 1 && bodyKeys[0] === 'id');\n }\n return true;\n })\n );\n }\n\n /**\n * Allows to intercept requests performed via the FetchClient requests.\n * @param interceptor The interceptor to be added.\n * @param id An optional unique identifier for the interceptor. The chain of interceptors is ordered by this id. And it can be used to remove the interceptor later on.\n * @returns The id of the interceptor (same as provided id if one was provided, otherwise an id will be generated).\n */\n addInterceptor(interceptor: HttpInterceptor, id?: string): string {\n if (!id) {\n id = `${++this.interceptorCounter}`;\n }\n this.interceptors.set(id, interceptor);\n return id;\n }\n\n /**\n * Allows to remove a previously added interceptor by it's id.\n * @param id The id of the interceptor that should be removed.\n * @returns true if an interceptor existed and has been removed, or false if id does not exist.\n */\n removeInterceptor(id: string): boolean {\n return this.interceptors.delete(id);\n }\n\n /**\n * Checks if an interceptor with a given id exists.\n * @param id The id of the interceptor.\n * @returns - Returns true if an interceptor with the given id exists, otherwise false.\n */\n hasInterceptor(id: string): boolean {\n return this.interceptors.has(id);\n }\n\n private hookIntoClientFetch() {\n const fetch: FetchClient['fetch'] = this.client.fetch.bind(this.client);\n const requestHandler = new HttpRequestHandler(fetch, this);\n this.client.fetch = async (\n url,\n options: ApiCallOptions & IFetchOptions = { method: 'GET' }\n ) => {\n const { method } = options;\n return this.createInterceptorChain({ url, options, method }, requestHandler).toPromise();\n };\n }\n\n private createInterceptorChain(\n call: ApiCall,\n requestHandler: HttpRequestHandler\n ): Observable<IFetchResponse> {\n let handler: HttpHandler = requestHandler;\n // Do some sorting to always apply the interceptors in the specific order\n const sortedInterceptorIds = Array.from(this.interceptors.keys()).sort((a, b) =>\n b.localeCompare(a)\n );\n for (const interceptorId of sortedInterceptorIds) {\n handler = new HttpInterceptHandler(this.interceptors.get(interceptorId), handler);\n }\n return handler.handle(call);\n }\n}\n","import {\n inject,\n Injector,\n ModuleWithProviders,\n NgModule,\n Optional,\n Provider,\n runInInjectionContext,\n SkipSelf,\n Type,\n ValueProvider\n} from '@angular/core';\nimport { BasicAuth, FetchClient, Realtime, CookieAuth } from '@c8y/client';\nimport { ApiService } from './api.service';\nimport * as services from './services';\n\nfunction toProvider<T>(provide: Type<T>): Provider {\n let deps: Array<Type<FetchClient | Realtime | CookieAuth>> = [FetchClient, Realtime];\n if (provide === FetchClient) {\n deps = [CookieAuth];\n }\n if (provide === BasicAuth || provide === CookieAuth) {\n deps = [];\n }\n if (provide === Realtime) {\n deps = [FetchClient];\n }\n const depsWithExistingProvider = [\n [provide, new Optional(), new SkipSelf()], // let's see if we can find an existing provider (possibly null)\n ...deps\n ];\n return {\n provide,\n deps: depsWithExistingProvider,\n useFactory: (...args) => {\n // if there was an existing provider, it would be first in the list and we can return it\n if (args.length && args[0] !== null) {\n return args[0];\n }\n\n // otherwise we need to drop the first element as it would be null\n const providers = args.slice(1);\n // the other providers are the dependencies we need. They match the order of the deps array\n const existingProviders: ValueProvider[] = deps.map((dep, index) => {\n return { provide: dep, useValue: providers[index] };\n });\n\n // use this to dependency inject the dependencies and instantiate the class\n return runInInjectionContext(\n Injector.create({\n providers: [...existingProviders, { provide, useClass: provide, deps: deps }]\n }),\n () => {\n return inject(provide);\n }\n );\n }\n };\n}\n\nconst providers: Provider[] = Object.keys(services)\n .map(k => toProvider(services[k]))\n .concat([{ provide: ApiService, useClass: ApiService, deps: [FetchClient] }]);\n// @dynamic\n@NgModule({\n providers\n})\nexport class DataModule {\n static providers(): Provider[] {\n return providers;\n }\n static forRoot(): ModuleWithProviders<DataModule> {\n return {\n ngModule: DataModule,\n providers\n };\n }\n}\n","export * from './api.service';\nexport * from './api.model';\nexport * from './data.module';\nexport * from './services';\nexport * from './interceptor.model';\n// do not expose as it might confuse people on what to implement\n// export * from './http-handler.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}