@ngx-grpc/core
Version:
Angular gRPC framework: core package
1 lines • 20.3 kB
Source Map (JSON)
{"version":3,"file":"ngx-grpc-core.mjs","sources":["../../../packages/core/src/lib/injection-tokens.ts","../../../packages/core/src/lib/grpc-handler.ts","../../../packages/core/src/lib/grpc-core.module.ts","../../../packages/core/src/lib/grpc-logger-interceptor.ts","../../../packages/core/src/lib/grpc-logger.module.ts","../../../packages/core/src/lib/grpc-rx-operators.ts","../../../packages/core/src/ngx-grpc-core.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Use this injection token to register the GrpcClientFactory\n *\n * Example:\n *\n * ```\n * providers: [\n * { provide: GRPC_CLIENT_FACTORY, useClass: MyClientFactory },\n * ]\n * ```\n */\nexport const GRPC_CLIENT_FACTORY = new InjectionToken('GRPC_CLIENT_FACTORY');\n\n/**\n * Use this injection token to add interceptors\n *\n * Example:\n *\n * ```\n * providers: [\n * { provide: GRPC_INTERCEPTORS, useClass: MyInterceptor, multi: true },\n * ]\n * ```\n */\nexport const GRPC_INTERCEPTORS = new InjectionToken('GRPC_INTERCEPTORS');\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { GrpcCallType, GrpcEvent, GrpcMessage, GrpcRequest } from '@ngx-grpc/common';\nimport { isObservable, Observable } from 'rxjs';\nimport { GrpcInterceptor } from './grpc-interceptor';\nimport { GRPC_INTERCEPTORS } from './injection-tokens';\n\n/**\n * Core gRPC transport class. Implements creation and binding of RPCs to the clients.\n * There is a root GrpcHandler that handles all initial requests;\n * however for every interception a new instance of GrpcHandler is created and passed to the interceptor\n */\n@Injectable()\nexport class GrpcHandler {\n\n private interceptors: GrpcInterceptor[];\n\n constructor(\n @Optional() @Inject(GRPC_INTERCEPTORS) configuredInterceptors: GrpcInterceptor | GrpcInterceptor[],\n ) {\n this.interceptors = !configuredInterceptors ? [] : Array.isArray(configuredInterceptors) ? configuredInterceptors : [configuredInterceptors];\n }\n\n /**\n * Handles the gRPC request passing it through the interceptors array\n * Recursively calls all interceptors with a new instance of the GrpcHandler\n *\n * @param request a GrpcRequest to execute\n * @returns Observable of events returned by the GrpcClient implementation\n */\n handle<Q extends GrpcMessage, S extends GrpcMessage>(request: GrpcRequest<Q, S>): Observable<GrpcEvent<S>> {\n const interceptors = (this.interceptors || []).slice();\n const interceptor = interceptors.shift();\n\n if (interceptor) {\n return interceptor.intercept(request, new GrpcHandler(interceptors));\n }\n\n switch (request.type) {\n case GrpcCallType.unary: return request.client.unary(\n request.path,\n this.message(request.requestData),\n request.requestMetadata,\n request.requestClass,\n request.responseClass,\n );\n case GrpcCallType.serverStream: return request.client.serverStream(\n request.path,\n this.message(request.requestData),\n request.requestMetadata,\n request.requestClass,\n request.responseClass,\n );\n case GrpcCallType.clientStream: return request.client.clientStream(\n request.path,\n this.stream(request.requestData),\n request.requestMetadata,\n request.requestClass,\n request.responseClass,\n );\n case GrpcCallType.bidiStream: return request.client.bidiStream(\n request.path,\n this.stream(request.requestData),\n request.requestMetadata,\n request.requestClass,\n request.responseClass,\n );\n }\n }\n\n private message<Q extends GrpcMessage>(p: Q | Observable<Q>): Q {\n if (!isObservable(p)) {\n return p;\n }\n\n throw new Error('Expected Message, got Observable');\n }\n\n private stream<Q extends GrpcMessage>(p: Q | Observable<Q>): Observable<Q> {\n if (isObservable(p)) {\n return p;\n }\n\n throw new Error('Expected Observable, got message');\n }\n\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { GrpcHandler } from './grpc-handler';\n\n@NgModule()\nexport class GrpcCoreModule {\n\n /**\n * Create GrpcCoreModule for using in AppModule (application root module)\n */\n public static forRoot(): ModuleWithProviders<GrpcCoreModule> {\n return {\n ngModule: GrpcCoreModule,\n providers: [\n GrpcHandler,\n ],\n };\n }\n\n /**\n * Create GrpcCoreModule for using in children modules (incl. lazy modules)\n */\n public static forChild(): ModuleWithProviders<GrpcCoreModule> {\n return {\n ngModule: GrpcCoreModule,\n providers: [\n GrpcHandler,\n ],\n };\n }\n\n}\n","import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { GrpcDataEvent, GrpcEvent, GrpcMessage, GrpcRequest } from '@ngx-grpc/common';\nimport { isObservable, Observable, of } from 'rxjs';\nimport { share, tap } from 'rxjs/operators';\nimport { GrpcHandler } from './grpc-handler';\nimport { GrpcInterceptor } from './grpc-interceptor';\n\n/**\n * A configuration for GrpcLoggerInterceptor\n *\n * Example:\n *\n * ```\n * providers: [\n * { provide: GRPC_LOGGER_SETTINGS, useValue: { enabled: true } },\n * ]\n * ```\n *\n * or more complex:\n *\n * ```\n * providers: [\n * { provide: GRPC_LOGGER_SETTINGS, useFactory: () => { enabled: localStorage.getItem('GRPC_LOGGER_SETTINGS') === 'true' || !environment.prod } },\n * ]\n * ```\n */\nexport const GRPC_LOGGER_SETTINGS = new InjectionToken('GRPC_LOGGER_SETTINGS');\n\n\n/**\n * A configuration definition for GrpcLoggerInterceptor\n */\nexport interface GrpcLoggerSettings {\n /**\n * Enables / disables the output, default true\n */\n enabled?: boolean;\n /**\n * Includes client settings into the logs, default true\n */\n logClientSettings?: boolean;\n /**\n * Includes request metadata into the logs, default true\n */\n logMetadata?: boolean;\n /**\n * Logs events with status code OK (0), default false\n */\n logStatusCodeOk?: boolean;\n /**\n * Request mapper function, defines what output is generated for the given message.\n * The default implementation is `(msg) => msg.toObject()`.\n * According to your preferences you might choose e.g. `(msg) => msg.toProtobufJSON()` instead.\n */\n requestMapper?: (msg: GrpcMessage) => any;\n /**\n * Response mapper function, defines what output is generated for the given message.\n * The default implementation is `(msg) => msg.toObject()`.\n * According to your preferences you might choose e.g. `(msg) => msg.toProtobufJSON()` instead.\n */\n responseMapper?: (msg: GrpcMessage) => any;\n}\n\n/**\n * Interceptor that implements logging of every request to the browser console\n *\n * Can be enabled / disabled by GRPC_LOGGER_ENABLED injection token\n */\n@Injectable()\nexport class GrpcLoggerInterceptor implements GrpcInterceptor {\n\n private static requestId = 0;\n\n private clientDataStyle = 'color: #eb0edc;';\n private dataStyle = 'color: #5c7ced;';\n private errorStyle = 'color: #f00505;';\n private statusOkStyle = 'color: #0ffcf5;';\n\n private settings: GrpcLoggerSettings;\n\n constructor(@Optional() @Inject(GRPC_LOGGER_SETTINGS) settings: GrpcLoggerSettings = {}) {\n this.settings = {\n enabled: settings.enabled ?? true,\n logClientSettings: settings.logClientSettings ?? true,\n logMetadata: settings.logMetadata ?? true,\n logStatusCodeOk: settings.logStatusCodeOk ?? false,\n requestMapper: settings.requestMapper ?? ((msg: GrpcMessage) => msg.toObject()),\n responseMapper: settings.responseMapper ?? ((msg: GrpcMessage) => msg.toObject()),\n };\n }\n\n intercept<Q extends GrpcMessage, S extends GrpcMessage>(request: GrpcRequest<Q, S>, next: GrpcHandler): Observable<GrpcEvent<S>> {\n if (this.settings.enabled) {\n const id = ++GrpcLoggerInterceptor.requestId;\n const start = Date.now();\n\n // check if client streaming, then push each value separately\n if (isObservable(request.requestData)) {\n request.requestData = request.requestData.pipe(\n tap(msg => {\n console.groupCollapsed(`%c#${id}: ${Date.now() - start}ms -> ${request.path}`, this.clientDataStyle);\n console.log('%c>>', this.clientDataStyle, this.settings.requestMapper(msg));\n console.groupEnd();\n }),\n );\n }\n\n // handle unary calls and server streaming in the same manner\n return next.handle(request).pipe(\n tap(event => {\n const style = event instanceof GrpcDataEvent ? this.dataStyle : event.statusCode !== 0 ? this.errorStyle : this.statusOkStyle;\n\n const openGroup = () => console.groupCollapsed(`%c#${id}: ${Date.now() - start}ms -> ${request.path}`, style);\n\n const printSettings = () => {\n if (this.settings.logClientSettings) {\n console.log('%csc', style, request.client.getSettings());\n }\n };\n\n const printMetadata = () => {\n if (this.settings.logMetadata) {\n console.log('%c**', style, request.requestMetadata.toObject());\n }\n };\n\n const printRequest = () => console.log('%c>>', style, isObservable(request.requestData) ? '<see above>' : this.settings.requestMapper(request.requestData));\n\n const closeGroup = () => console.groupEnd();\n\n if (event instanceof GrpcDataEvent) {\n openGroup();\n printSettings();\n printRequest();\n printMetadata();\n console.log('%c<<', style, this.settings.responseMapper(event.data));\n closeGroup();\n } else if (event.statusCode !== 0) {\n openGroup();\n printSettings();\n printRequest();\n printMetadata();\n console.log('%c<<', style, event);\n closeGroup();\n } else if (event.statusCode === 0 && this.settings.logStatusCodeOk) {\n openGroup();\n printSettings();\n printRequest();\n printMetadata();\n console.log('%c<<', style, event);\n closeGroup();\n }\n }),\n );\n }\n\n return next.handle(request);\n }\n\n}\n","import { ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { GrpcLoggerInterceptor, GrpcLoggerSettings, GRPC_LOGGER_SETTINGS } from './grpc-logger-interceptor';\nimport { GRPC_INTERCEPTORS } from './injection-tokens';\n\nexport interface GrpcLoggerRootOptions {\n settings: GrpcLoggerSettings;\n}\n\nexport interface GrpcLoggerChildOptions {\n settings: GrpcLoggerSettings;\n}\n\n@NgModule()\nexport class GrpcLoggerModule {\n\n /**\n * Create GrpcLoggerModule for using in AppModule (application root module)\n * You can provide the options here instead of injecting corresponding tokens separately\n */\n public static forRoot(options?: GrpcLoggerRootOptions): ModuleWithProviders<GrpcLoggerModule> {\n const providers: Provider[] = [{ provide: GRPC_INTERCEPTORS, useClass: GrpcLoggerInterceptor, multi: true }];\n\n if (options?.settings) {\n providers.push({ provide: GRPC_LOGGER_SETTINGS, useValue: options.settings });\n }\n\n return { ngModule: GrpcLoggerModule, providers };\n }\n\n /**\n * Create GrpcCoreModule for using in children modules (incl. lazy modules)\n * You can provide the options here instead of injecting corresponding tokens separately\n */\n public static forChild(options?: GrpcLoggerChildOptions): ModuleWithProviders<GrpcLoggerModule> {\n const providers: Provider[] = [{ provide: GRPC_INTERCEPTORS, useClass: GrpcLoggerInterceptor, multi: true }];\n\n if (options?.settings) {\n providers.push({ provide: GRPC_LOGGER_SETTINGS, useValue: options.settings });\n }\n\n return { ngModule: GrpcLoggerModule, providers };\n }\n\n}\n","import { GrpcDataEvent, GrpcEvent, GrpcMessage, GrpcStatusEvent } from '@ngx-grpc/common';\nimport { Observable, of, throwError } from 'rxjs';\nimport { filter, map, switchMap } from 'rxjs/operators';\n\n/**\n * RxJS operator\n * When applied to gRPC events emits error for status events with a non-zero code (includes throwStatusErrors)\n *\n * @return Observable of gRPC events\n */\nexport function throwStatusErrors<T extends GrpcMessage>() {\n return (source$: Observable<GrpcEvent<T>>) => source$.pipe(\n switchMap(event => event instanceof GrpcStatusEvent && event.statusCode ? throwError(event) : of(event)),\n );\n}\n\n/**\n * RxJS operator\n * When applied to gRPC events stream extracts and returns only messages\n *\n * @return Observable of messages\n */\nexport function takeMessages<T extends GrpcMessage>() {\n return (source$: Observable<GrpcEvent<T>>) => source$.pipe(\n filter(event => event instanceof GrpcDataEvent),\n map((event: GrpcDataEvent<T>) => event.data),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}