diff --git a/dist/graphql.interceptor.js.map b/dist/graphql.interceptor.js.map index c5b0c57..4efcaad 100644 --- a/dist/graphql.interceptor.js.map +++ b/dist/graphql.interceptor.js.map @@ -1 +1 @@ -{"version":3,"file":"graphql.interceptor.js","sourceRoot":"/","sources":["graphql.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA8D;AAK9D,uCAAwC;AACxC,wBAAsC;AAEtC,IAAI,mBAAwB,CAAC;AAC7B,IAAI;IACF,CAAC,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;CACxD;AAAC,OAAO,CAAC,EAAE,GAAE;AAId,IAAa,kBAAkB,GAA/B,MAAa,kBAAmB,SAAQ,oBAAiB;IAE3C,gBAAgB,CAAC,OAAyB,EAAE,KAAY,EAAE,SAAc;QAC9E,IAAI,OAAO,CAAC,OAAO,EAAkB,KAAK,SAAS,EAAE;YACjD,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;SACvF;aAAM;YACH,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;SACrD;IACL,CAAC;IAEO,uBAAuB,CAAC,KAAY,EAAE,UAAsC,EAAE,SAAc;QAChG,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAA;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;QAEvC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAE5C,IAAI,OAAO,CAAC,GAAG,EAAE;YAEb,MAAM,IAAI,GAAG,eAAQ,CAAC,YAAY,CAAM,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAE7D,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,IAAI;gBAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACJ,CAAA;AA5BY,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;GACA,kBAAkB,CA4B9B;AA5BY,gDAAkB","sourcesContent":["import { ExecutionContext, Injectable } from \"@nestjs/common\";\nimport type { GqlContextType } from '@nestjs/graphql';\n\n// Sentry imports\nimport { Scope } from '@sentry/hub';\nimport { Handlers } from '@sentry/node';\nimport { SentryInterceptor } from \".\";\n\nlet GqlExecutionContext: any;\ntry {\n ({ GqlExecutionContext } = require('@nestjs/graphql'));\n} catch (e) {}\n\n\n@Injectable()\nexport class GraphqlInterceptor extends SentryInterceptor {\n\n protected captureException(context: ExecutionContext, scope: Scope, exception: any) {\n if (context.getType() === 'graphql') {\n this.captureGraphqlException(scope, GqlExecutionContext.create(context), exception);\n } else {\n super.captureException(context, scope, exception);\n }\n }\n\n private captureGraphqlException(scope: Scope, gqlContext: typeof GqlExecutionContext, exception: any): void {\n const info = gqlContext.getInfo()\n const context = gqlContext.getContext()\n\n scope.setExtra('type', info.parentType.name)\n\n if (context.req) {\n // req within graphql context needs modification in \n const data = Handlers.parseRequest({}, context.req, {});\n\n scope.setExtra('req', data.request);\n\n if (data.extra) scope.setExtras(data.extra);\n if (data.user) scope.setUser(data.user);\n }\n\n this.client.instance().captureException(exception);\n }\n}"]} \ No newline at end of file +{"version":3,"file":"graphql.interceptor.js","sourceRoot":"/","sources":["graphql.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA8D;AAK9D,uCAAwC;AACxC,wBAAsC;AAEtC,IAAI,mBAAwB,CAAC;AAC7B,IAAI;IACF,CAAC,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;CACxD;AAAC,OAAO,CAAC,EAAE,GAAE;AAIP,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,oBAAiB;IAE3C,gBAAgB,CAAC,OAAyB,EAAE,KAAY,EAAE,SAAc;QAC9E,IAAI,OAAO,CAAC,OAAO,EAAkB,KAAK,SAAS,EAAE;YACjD,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;SACvF;aAAM;YACH,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;SACrD;IACL,CAAC;IAEO,uBAAuB,CAAC,KAAY,EAAE,UAAsC,EAAE,SAAc;QAChG,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAA;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,CAAA;QAEvC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAE5C,IAAI,OAAO,CAAC,GAAG,EAAE;YAEb,MAAM,IAAI,GAAG,eAAQ,CAAC,YAAY,CAAM,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAE7D,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,IAAI;gBAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACJ,CAAA;AA5BY,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;GACA,kBAAkB,CA4B9B;AA5BY,gDAAkB","sourcesContent":["import { ExecutionContext, Injectable } from \"@nestjs/common\";\nimport type { GqlContextType } from '@nestjs/graphql';\n\n// Sentry imports\nimport { Scope } from '@sentry/hub';\nimport { Handlers } from '@sentry/node';\nimport { SentryInterceptor } from \".\";\n\nlet GqlExecutionContext: any;\ntry {\n ({ GqlExecutionContext } = require('@nestjs/graphql'));\n} catch (e) {}\n\n\n@Injectable()\nexport class GraphqlInterceptor extends SentryInterceptor {\n\n protected captureException(context: ExecutionContext, scope: Scope, exception: any) {\n if (context.getType() === 'graphql') {\n this.captureGraphqlException(scope, GqlExecutionContext.create(context), exception);\n } else {\n super.captureException(context, scope, exception);\n }\n }\n\n private captureGraphqlException(scope: Scope, gqlContext: typeof GqlExecutionContext, exception: any): void {\n const info = gqlContext.getInfo()\n const context = gqlContext.getContext()\n\n scope.setExtra('type', info.parentType.name)\n\n if (context.req) {\n // req within graphql context needs modification in \n const data = Handlers.parseRequest({}, context.req, {});\n\n scope.setExtra('req', data.request);\n\n if (data.extra) scope.setExtras(data.extra);\n if (data.user) scope.setUser(data.user);\n }\n\n this.client.instance().captureException(exception);\n }\n}"]} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 385f9fb..1d5a043 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,7 +1,11 @@ "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; diff --git a/dist/index.js.map b/dist/index.js.map index 7d97fee..430e411 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uDAAqC;AACrC,qDAAmC;AACnC,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC;AACpC,kDAAgC;AAChC,qDAAmC;AACnC,mDAAiC;AACjC,wDAAsC","sourcesContent":["export * from './sentry-core.module';\nexport * from './sentry.constants';\nexport * from './sentry.decorator';\nexport * from './sentry.interceptor';\nexport * from './sentry.interfaces';\nexport * from './sentry.module';\nexport * from './sentry.providers';\nexport * from './sentry.service';\nexport * from './graphql.interceptor';\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,qDAAmC;AACnC,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC;AACpC,kDAAgC;AAChC,qDAAmC;AACnC,mDAAiC;AACjC,wDAAsC","sourcesContent":["export * from './sentry-core.module';\nexport * from './sentry.constants';\nexport * from './sentry.decorator';\nexport * from './sentry.interceptor';\nexport * from './sentry.interfaces';\nexport * from './sentry.module';\nexport * from './sentry.providers';\nexport * from './sentry.service';\nexport * from './graphql.interceptor';\n"]} \ No newline at end of file diff --git a/dist/sentry-core.module.js.map b/dist/sentry-core.module.js.map index 9a6d77c..6e09eb4 100644 --- a/dist/sentry-core.module.js.map +++ b/dist/sentry-core.module.js.map @@ -1 +1 @@ -{"version":3,"file":"sentry-core.module.js","sourceRoot":"/","sources":["sentry-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,2CAMwB;AAMxB,yDAG4B;AAC5B,qDAAiD;AACjD,yDAA2D;AAI3D,IAAa,gBAAgB,wBAA7B,MAAa,gBAAgB;IAElB,MAAM,CAAC,OAAO,CAAC,OAA4B;QAC9C,MAAM,QAAQ,GAAG,IAAA,wCAAqB,EAAC,OAAO,CAAC,CAAC;QAEhD,OAAO;YACH,OAAO,EAAE,CAAC,QAAQ,EAAE,8BAAa,CAAC;YAClC,MAAM,EAAE,kBAAgB;YACxB,SAAS,EAAE,CAAC,QAAQ,EAAE,8BAAa,CAAC;SACvC,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,YAAY,CACtB,OAAiC;QAEjC,MAAM,QAAQ,GAAa;YACvB,MAAM,EAAE,CAAC,wCAAqB,CAAC;YAC/B,OAAO,EAAE,+BAAY;YACrB,UAAU,EAAE,CAAC,OAA4B,EAAE,EAAE,CAAC,IAAI,8BAAa,CAAC,OAAO,CAAC;SAC3E,CAAC;QAEF,OAAO;YACH,OAAO,EAAE,CAAC,QAAQ,EAAE,8BAAa,CAAC;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,kBAAgB;YACxB,SAAS,EAAE;gBACP,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBACrC,QAAQ;gBACR,8BAAa;aAChB;SACJ,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAC/B,OAAiC;QAEjC,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE;YAC7C,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAsC,CAAC;QAChE,OAAO;YACL,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;YACxC;gBACE,OAAO,EAAE,QAAQ;gBACjB,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,0BAA0B,CACvC,OAAiC;QAEjC,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,OAAO;gBACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;gBAC5B,OAAO,EAAE,wCAAqB;gBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC;SACH;QACD,MAAM,MAAM,GAAG;YACb,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,CAA+B;SACxE,CAAC;QACF,OAAO;YACL,OAAO,EAAE,wCAAqB;YAC9B,UAAU,EAAE,CAAO,cAAoC,EAAE,EAAE,gDACzD,OAAA,MAAM,cAAc,CAAC,yBAAyB,EAAE,CAAA,GAAA;YAClD,MAAM;SACP,CAAC;IACJ,CAAC;CACN,CAAA;AArEY,gBAAgB;IAF5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gBAAgB,CAqE5B;AArEY,4CAAgB","sourcesContent":["import {\n Module,\n Global,\n Provider,\n Type,\n DynamicModule,\n} from '@nestjs/common';\nimport {\n SentryModuleAsyncOptions,\n SentryOptionsFactory,\n SentryModuleOptions,\n} from './sentry.interfaces';\nimport {\n SENTRY_MODULE_OPTIONS,\n SENTRY_TOKEN,\n} from './sentry.constants';\nimport { SentryService } from './sentry.service';\nimport { createSentryProviders } from './sentry.providers';\n\n@Global()\n@Module({})\nexport class SentryCoreModule {\n\n public static forRoot(options: SentryModuleOptions): DynamicModule {\n const provider = createSentryProviders(options);\n\n return {\n exports: [provider, SentryService],\n module: SentryCoreModule,\n providers: [provider, SentryService],\n };\n }\n\n public static forRootAsync(\n options: SentryModuleAsyncOptions,\n ): DynamicModule {\n const provider: Provider = {\n inject: [SENTRY_MODULE_OPTIONS],\n provide: SENTRY_TOKEN,\n useFactory: (options: SentryModuleOptions) => new SentryService(options),\n };\n\n return {\n exports: [provider, SentryService],\n imports: options.imports,\n module: SentryCoreModule,\n providers: [\n ...this.createAsyncProviders(options),\n provider,\n SentryService,\n ],\n };\n }\n\n private static createAsyncProviders(\n options: SentryModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n const useClass = options.useClass as Type;\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: useClass,\n useClass,\n },\n ];\n }\n \n private static createAsyncOptionsProvider(\n options: SentryModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n inject: options.inject || [],\n provide: SENTRY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n };\n }\n const inject = [\n (options.useClass || options.useExisting) as Type,\n ];\n return {\n provide: SENTRY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: SentryOptionsFactory) =>\n await optionsFactory.createSentryModuleOptions(),\n inject,\n };\n }\n}"]} \ No newline at end of file +{"version":3,"file":"sentry-core.module.js","sourceRoot":"/","sources":["sentry-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,2CAMwB;AAMxB,yDAG4B;AAC5B,qDAAiD;AACjD,yDAA2D;AAIpD,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAElB,MAAM,CAAC,OAAO,CAAC,OAA4B;QAC9C,MAAM,QAAQ,GAAG,IAAA,wCAAqB,EAAC,OAAO,CAAC,CAAC;QAEhD,OAAO;YACH,OAAO,EAAE,CAAC,QAAQ,EAAE,8BAAa,CAAC;YAClC,MAAM,EAAE,kBAAgB;YACxB,SAAS,EAAE,CAAC,QAAQ,EAAE,8BAAa,CAAC;SACvC,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,YAAY,CACtB,OAAiC;QAEjC,MAAM,QAAQ,GAAa;YACvB,MAAM,EAAE,CAAC,wCAAqB,CAAC;YAC/B,OAAO,EAAE,+BAAY;YACrB,UAAU,EAAE,CAAC,OAA4B,EAAE,EAAE,CAAC,IAAI,8BAAa,CAAC,OAAO,CAAC;SAC3E,CAAC;QAEF,OAAO;YACH,OAAO,EAAE,CAAC,QAAQ,EAAE,8BAAa,CAAC;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,kBAAgB;YACxB,SAAS,EAAE;gBACP,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBACrC,QAAQ;gBACR,8BAAa;aAChB;SACJ,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAC/B,OAAiC;QAEjC,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE;YAC7C,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAsC,CAAC;QAChE,OAAO;YACL,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;YACxC;gBACE,OAAO,EAAE,QAAQ;gBACjB,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,0BAA0B,CACvC,OAAiC;QAEjC,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,OAAO;gBACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;gBAC5B,OAAO,EAAE,wCAAqB;gBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC;SACH;QACD,MAAM,MAAM,GAAG;YACb,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,CAA+B;SACxE,CAAC;QACF,OAAO;YACL,OAAO,EAAE,wCAAqB;YAC9B,UAAU,EAAE,CAAO,cAAoC,EAAE,EAAE,gDACzD,OAAA,MAAM,cAAc,CAAC,yBAAyB,EAAE,CAAA,GAAA;YAClD,MAAM;SACP,CAAC;IACJ,CAAC;CACN,CAAA;AArEY,gBAAgB;IAF5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gBAAgB,CAqE5B;AArEY,4CAAgB","sourcesContent":["import {\n Module,\n Global,\n Provider,\n Type,\n DynamicModule,\n} from '@nestjs/common';\nimport {\n SentryModuleAsyncOptions,\n SentryOptionsFactory,\n SentryModuleOptions,\n} from './sentry.interfaces';\nimport {\n SENTRY_MODULE_OPTIONS,\n SENTRY_TOKEN,\n} from './sentry.constants';\nimport { SentryService } from './sentry.service';\nimport { createSentryProviders } from './sentry.providers';\n\n@Global()\n@Module({})\nexport class SentryCoreModule {\n\n public static forRoot(options: SentryModuleOptions): DynamicModule {\n const provider = createSentryProviders(options);\n\n return {\n exports: [provider, SentryService],\n module: SentryCoreModule,\n providers: [provider, SentryService],\n };\n }\n\n public static forRootAsync(\n options: SentryModuleAsyncOptions,\n ): DynamicModule {\n const provider: Provider = {\n inject: [SENTRY_MODULE_OPTIONS],\n provide: SENTRY_TOKEN,\n useFactory: (options: SentryModuleOptions) => new SentryService(options),\n };\n\n return {\n exports: [provider, SentryService],\n imports: options.imports,\n module: SentryCoreModule,\n providers: [\n ...this.createAsyncProviders(options),\n provider,\n SentryService,\n ],\n };\n }\n\n private static createAsyncProviders(\n options: SentryModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n const useClass = options.useClass as Type;\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: useClass,\n useClass,\n },\n ];\n }\n \n private static createAsyncOptionsProvider(\n options: SentryModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n inject: options.inject || [],\n provide: SENTRY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n };\n }\n const inject = [\n (options.useClass || options.useExisting) as Type,\n ];\n return {\n provide: SENTRY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: SentryOptionsFactory) =>\n await optionsFactory.createSentryModuleOptions(),\n inject,\n };\n }\n}"]} \ No newline at end of file diff --git a/dist/sentry.interceptor.d.ts b/dist/sentry.interceptor.d.ts index ff69b12..d58815a 100644 --- a/dist/sentry.interceptor.d.ts +++ b/dist/sentry.interceptor.d.ts @@ -1,4 +1,4 @@ -import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common'; +import { CallHandler, ExecutionContext, HttpException, NestInterceptor } from '@nestjs/common'; import { Observable } from 'rxjs'; import { Scope } from '@sentry/hub'; import { SentryService } from './sentry.service'; @@ -8,7 +8,7 @@ export declare class SentryInterceptor implements NestInterceptor { protected readonly client: SentryService; constructor(options?: SentryInterceptorOptions | undefined); intercept(context: ExecutionContext, next: CallHandler): Observable; - protected captureException(context: ExecutionContext, scope: Scope, exception: any): void; + protected captureException(context: ExecutionContext, scope: Scope, exception: HttpException): void; private captureHttpException; private captureRpcException; private captureWsException; diff --git a/dist/sentry.interceptor.js b/dist/sentry.interceptor.js index f92f9c9..bf15678 100644 --- a/dist/sentry.interceptor.js +++ b/dist/sentry.interceptor.js @@ -23,7 +23,7 @@ let SentryInterceptor = class SentryInterceptor { return next.handle().pipe((0, operators_1.tap)(null, (exception) => { if (this.shouldReport(exception)) { this.client.instance().withScope((scope) => { - this.captureException(context, scope, exception); + return this.captureException(context, scope, exception); }); } })); @@ -63,7 +63,7 @@ let SentryInterceptor = class SentryInterceptor { const opts = this.options; if (opts.filters) { let filters = opts.filters; - return filters.every(({ type, filter }) => { + return filters.some(({ type, filter }) => { return !(exception instanceof type && (!filter || filter(exception))); }); } diff --git a/dist/sentry.interceptor.js.map b/dist/sentry.interceptor.js.map index f18e754..d479051 100644 --- a/dist/sentry.interceptor.js.map +++ b/dist/sentry.interceptor.js.map @@ -1 +1 @@ -{"version":3,"file":"sentry.interceptor.js","sourceRoot":"/","sources":["sentry.interceptor.ts"],"names":[],"mappings":"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","sourcesContent":["// Nestjs imports\nimport {\n CallHandler,\n ExecutionContext,\n Injectable,\n NestInterceptor\n} from '@nestjs/common';\nimport { \n HttpArgumentsHost,\n WsArgumentsHost,\n RpcArgumentsHost,\n ContextType\n} from '@nestjs/common/interfaces';\n// Rxjs imports\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n// Sentry imports\nimport { Scope } from '@sentry/hub';\nimport { Handlers } from '@sentry/node';\n\nimport { SentryService } from './sentry.service';\nimport { SentryInterceptorOptions, SentryInterceptorOptionsFilter } from './sentry.interfaces';\n\n\n@Injectable()\nexport class SentryInterceptor implements NestInterceptor {\n\n protected readonly client: SentryService = SentryService.SentryServiceInstance()\n constructor(\n private readonly options?: SentryInterceptorOptions\n ) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable {\n // first param would be for events, second is for errors\n return next.handle().pipe(\n tap(null, (exception) => {\n if(this.shouldReport(exception)) {\n this.client.instance().withScope((scope) => {\n this.captureException(context, scope, exception);\n })\n }\n })\n );\n }\n\n protected captureException(context: ExecutionContext, scope: Scope, exception: any) {\n switch (context.getType()) {\n case 'http':\n return this.captureHttpException(\n scope, \n context.switchToHttp(), \n exception\n );\n case 'rpc':\n return this.captureRpcException(\n scope,\n context.switchToRpc(),\n exception,\n );\n case 'ws':\n return this.captureWsException(\n scope,\n context.switchToWs(),\n exception,\n );\n }\n }\n\n private captureHttpException(scope: Scope, http: HttpArgumentsHost, exception: any): void {\n const data = Handlers.parseRequest({},http.getRequest(), this.options);\n\n scope.setExtra('req', data.request);\n \n if (data.extra) scope.setExtras(data.extra);\n if (data.user) scope.setUser(data.user);\n\n this.client.instance().captureException(exception);\n }\n\n private captureRpcException(\n scope: Scope,\n rpc: RpcArgumentsHost,\n exception: any,\n ): void {\n scope.setExtra('rpc_data', rpc.getData());\n\n this.client.instance().captureException(exception);\n }\n\n private captureWsException(\n scope: Scope,\n ws: WsArgumentsHost,\n exception: any,\n ): void {\n scope.setExtra('ws_client', ws.getClient());\n scope.setExtra('ws_data', ws.getData());\n\n this.client.instance().captureException(exception);\n }\n\n private shouldReport(exception: any) {\n if (this.options && !this.options.filters) return true;\n\n // If all filters pass, then we do not report\n if (this.options) {\n const opts: SentryInterceptorOptions = this.options as {}\n if (opts.filters) {\n let filters: SentryInterceptorOptionsFilter[] = opts.filters\n return filters.every(({ type, filter }) => {\n return !(exception instanceof type && (!filter || filter(exception)));\n });\n }\n } else {\n return true;\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"sentry.interceptor.js","sourceRoot":"/","sources":["sentry.interceptor.ts"],"names":[],"mappings":"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","sourcesContent":["// Nestjs imports\nimport {\n CallHandler,\n ExecutionContext,\n HttpException,\n Injectable,\n NestInterceptor\n} from '@nestjs/common';\nimport { \n HttpArgumentsHost,\n WsArgumentsHost,\n RpcArgumentsHost,\n ContextType\n} from '@nestjs/common/interfaces';\n// Rxjs imports\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n// Sentry imports\nimport { Scope } from '@sentry/hub';\nimport { Handlers } from '@sentry/node';\n\nimport { SentryService } from './sentry.service';\nimport { SentryInterceptorOptions, SentryInterceptorOptionsFilter } from './sentry.interfaces';\n\n\n@Injectable()\nexport class SentryInterceptor implements NestInterceptor {\n\n protected readonly client: SentryService = SentryService.SentryServiceInstance()\n constructor(\n private readonly options?: SentryInterceptorOptions\n ) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable {\n // first param would be for events, second is for errors\n return next.handle().pipe(\n tap(null, (exception : HttpException) => {\n if(this.shouldReport(exception)) {\n this.client.instance().withScope((scope) => {\n return this.captureException(context, scope, exception);\n })\n }\n })\n );\n }\n\n protected captureException(context: ExecutionContext, scope: Scope, exception: HttpException) {\n switch (context.getType()) {\n case 'http':\n return this.captureHttpException(\n scope, \n context.switchToHttp(), \n exception\n );\n case 'rpc':\n return this.captureRpcException(\n scope,\n context.switchToRpc(),\n exception,\n );\n case 'ws':\n return this.captureWsException(\n scope,\n context.switchToWs(),\n exception,\n );\n }\n }\n\n private captureHttpException(scope: Scope, http: HttpArgumentsHost, exception: HttpException): void {\n const data = Handlers.parseRequest({},http.getRequest(), this.options);\n\n scope.setExtra('req', data.request);\n \n if (data.extra) scope.setExtras(data.extra);\n if (data.user) scope.setUser(data.user);\n\n this.client.instance().captureException(exception);\n }\n\n private captureRpcException(\n scope: Scope,\n rpc: RpcArgumentsHost,\n exception: any,\n ): void {\n scope.setExtra('rpc_data', rpc.getData());\n\n this.client.instance().captureException(exception);\n }\n\n private captureWsException(\n scope: Scope,\n ws: WsArgumentsHost,\n exception: any,\n ): void {\n scope.setExtra('ws_client', ws.getClient());\n scope.setExtra('ws_data', ws.getData());\n\n this.client.instance().captureException(exception);\n }\n\n private shouldReport(exception: any) {\n if (this.options && !this.options.filters) return true;\n\n // If any filter passes, then we do not report\n if (this.options) {\n const opts: SentryInterceptorOptions = this.options as {}\n if (opts.filters) {\n let filters: SentryInterceptorOptionsFilter[] = opts.filters\n return filters.some(({ type, filter }) => {\n return !(exception instanceof type && (!filter || filter(exception)));\n });\n }\n } else {\n return true;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/dist/sentry.interfaces.d.ts b/dist/sentry.interfaces.d.ts index 296e8b7..09dbcfa 100644 --- a/dist/sentry.interfaces.d.ts +++ b/dist/sentry.interfaces.d.ts @@ -1,7 +1,7 @@ import { ModuleMetadata, Type } from "@nestjs/common/interfaces"; import { Integration, Options } from '@sentry/types'; -import { Severity } from "@sentry/node"; import { ConsoleLoggerOptions } from "@nestjs/common"; +import { SeverityLevel } from "@sentry/node"; export interface SentryCloseOptions { enabled: boolean; timeout?: number; @@ -9,6 +9,7 @@ export interface SentryCloseOptions { export declare type SentryModuleOptions = Omit & { integrations?: Integration[]; close?: SentryCloseOptions; + prefix?: string; } & ConsoleLoggerOptions; export interface SentryOptionsFactory { createSentryModuleOptions(): Promise | SentryModuleOptions; @@ -36,7 +37,7 @@ export interface SentryInterceptorOptions { [key: string]: any; }; fingerprint?: string[]; - level?: Severity; + level?: SeverityLevel; request?: boolean; serverName?: boolean; transaction?: boolean | 'path' | 'methodPath' | 'handler'; diff --git a/dist/sentry.interfaces.js.map b/dist/sentry.interfaces.js.map index 3708cbc..3d36a82 100644 --- a/dist/sentry.interfaces.js.map +++ b/dist/sentry.interfaces.js.map @@ -1 +1 @@ -{"version":3,"file":"sentry.interfaces.js","sourceRoot":"/","sources":["sentry.interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { ModuleMetadata, Type } from \"@nestjs/common/interfaces\";\nimport { Integration, Options } from '@sentry/types';\nimport { Severity } from \"@sentry/node\";\nimport { ConsoleLoggerOptions } from \"@nestjs/common\";\n\nexport interface SentryCloseOptions {\n enabled: boolean;\n // timeout – Maximum time in ms the client should wait until closing forcefully\n timeout?: number;\n}\n\nexport type SentryModuleOptions = Omit & {\n integrations?: Integration[];\n close?: SentryCloseOptions\n} & ConsoleLoggerOptions;\n\nexport interface SentryOptionsFactory {\n createSentryModuleOptions(): Promise | SentryModuleOptions;\n}\n\nexport interface SentryModuleAsyncOptions extends Pick {\n inject?: any[];\n useClass?: Type;\n useExisting?: Type;\n useFactory?: (...args: any[]) => Promise | SentryModuleOptions;\n}\n\nexport type SentryTransaction = boolean | 'path' | 'methodPath' | 'handler';\n\nexport interface SentryFilterFunction {\n (exception:any): boolean\n}\n\nexport interface SentryInterceptorOptionsFilter {\n type: any;\n filter?: SentryFilterFunction;\n}\n\nexport interface SentryInterceptorOptions {\n filters?: SentryInterceptorOptionsFilter[];\n tags?: { [key: string]: string };\n extra?: { [key: string]: any };\n fingerprint?: string[];\n level?: Severity;\n\n // https://github.com/getsentry/sentry-javascript/blob/master/packages/node/src/handlers.ts#L163\n request?: boolean;\n serverName?: boolean;\n transaction?: boolean | 'path' | 'methodPath' | 'handler'; // https://github.com/getsentry/sentry-javascript/blob/master/packages/node/src/handlers.ts#L16\n user?: boolean | string[];\n version?: boolean;\n}"]} \ No newline at end of file +{"version":3,"file":"sentry.interfaces.js","sourceRoot":"/","sources":["sentry.interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import { ModuleMetadata, Type } from \"@nestjs/common/interfaces\";\nimport { Integration, Options } from '@sentry/types';\nimport { ConsoleLoggerOptions, HttpException } from \"@nestjs/common\";\nimport { SeverityLevel } from \"@sentry/node\";\n\nexport interface SentryCloseOptions {\n enabled: boolean;\n // timeout – Maximum time in ms the client should wait until closing forcefully\n timeout?: number;\n}\n\nexport type SentryModuleOptions = Omit & {\n integrations?: Integration[];\n close?: SentryCloseOptions;\n prefix?: string;\n} & ConsoleLoggerOptions;\n\nexport interface SentryOptionsFactory {\n createSentryModuleOptions(): Promise | SentryModuleOptions;\n}\n\nexport interface SentryModuleAsyncOptions extends Pick {\n inject?: any[];\n useClass?: Type;\n useExisting?: Type;\n useFactory?: (...args: any[]) => Promise | SentryModuleOptions;\n}\n\nexport type SentryTransaction = boolean | 'path' | 'methodPath' | 'handler';\n\nexport interface SentryFilterFunction {\n (exception:any): boolean\n}\n\nexport interface SentryInterceptorOptionsFilter {\n type: any;\n filter?: SentryFilterFunction;\n}\n\nexport interface SentryInterceptorOptions {\n filters?: SentryInterceptorOptionsFilter[];\n tags?: { [key: string]: string };\n extra?: { [key: string]: any };\n fingerprint?: string[];\n level?: SeverityLevel;\n\n // https://github.com/getsentry/sentry-javascript/blob/master/packages/node/src/handlers.ts#L163\n request?: boolean;\n serverName?: boolean;\n transaction?: boolean | 'path' | 'methodPath' | 'handler'; // https://github.com/getsentry/sentry-javascript/blob/master/packages/node/src/handlers.ts#L16\n user?: boolean | string[];\n version?: boolean;\n}"]} \ No newline at end of file diff --git a/dist/sentry.module.js.map b/dist/sentry.module.js.map index e246a4b..aa178db 100644 --- a/dist/sentry.module.js.map +++ b/dist/sentry.module.js.map @@ -1 +1 @@ -{"version":3,"file":"sentry.module.js","sourceRoot":"/","sources":["sentry.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,6DAAwD;AAIxD,IAAa,YAAY,oBAAzB,MAAa,YAAY;IAChB,MAAM,CAAC,OAAO,CAAC,OAA4B;QAChD,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,qCAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,OAAiC;QAC1D,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,qCAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAClD,CAAC;IACJ,CAAC;CACF,CAAA;AAdY,YAAY;IADxB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,YAAY,CAcxB;AAdY,oCAAY","sourcesContent":["import { Module, DynamicModule } from '@nestjs/common';\nimport { SentryCoreModule } from './sentry-core.module';\nimport { SentryModuleOptions, SentryModuleAsyncOptions } from './sentry.interfaces';\n\n@Module({})\nexport class SentryModule {\n public static forRoot(options: SentryModuleOptions): DynamicModule {\n return {\n module: SentryModule,\n imports: [SentryCoreModule.forRoot(options)],\n };\n }\n\n public static forRootAsync(options: SentryModuleAsyncOptions): DynamicModule {\n return {\n module: SentryModule,\n imports: [SentryCoreModule.forRootAsync(options)],\n };\n }\n}"]} \ No newline at end of file +{"version":3,"file":"sentry.module.js","sourceRoot":"/","sources":["sentry.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,6DAAwD;AAIjD,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAChB,MAAM,CAAC,OAAO,CAAC,OAA4B;QAChD,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,qCAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,OAAiC;QAC1D,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE,CAAC,qCAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAClD,CAAC;IACJ,CAAC;CACF,CAAA;AAdY,YAAY;IADxB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,YAAY,CAcxB;AAdY,oCAAY","sourcesContent":["import { Module, DynamicModule } from '@nestjs/common';\nimport { SentryCoreModule } from './sentry-core.module';\nimport { SentryModuleOptions, SentryModuleAsyncOptions } from './sentry.interfaces';\n\n@Module({})\nexport class SentryModule {\n public static forRoot(options: SentryModuleOptions): DynamicModule {\n return {\n module: SentryModule,\n imports: [SentryCoreModule.forRoot(options)],\n };\n }\n\n public static forRootAsync(options: SentryModuleAsyncOptions): DynamicModule {\n return {\n module: SentryModule,\n imports: [SentryCoreModule.forRootAsync(options)],\n };\n }\n}"]} \ No newline at end of file diff --git a/dist/sentry.service.d.ts b/dist/sentry.service.d.ts index da0426b..6e56a48 100644 --- a/dist/sentry.service.d.ts +++ b/dist/sentry.service.d.ts @@ -4,7 +4,6 @@ import * as Sentry from '@sentry/node'; import { SentryModuleOptions } from './sentry.interfaces'; export declare class SentryService extends ConsoleLogger implements OnApplicationShutdown { readonly opts?: SentryModuleOptions | undefined; - app: string; private static serviceInstance; constructor(opts?: SentryModuleOptions | undefined); static SentryServiceInstance(): SentryService; diff --git a/dist/sentry.service.js b/dist/sentry.service.js index 84c255b..4219e3a 100644 --- a/dist/sentry.service.js +++ b/dist/sentry.service.js @@ -41,7 +41,6 @@ let SentryService = SentryService_1 = class SentryService extends common_1.Conso constructor(opts) { super(); this.opts = opts; - this.app = '@ntegral/nestjs-sentry: '; if (!(opts && opts.dsn)) { return; } @@ -69,74 +68,89 @@ let SentryService = SentryService_1 = class SentryService extends common_1.Conso return SentryService_1.serviceInstance; } log(message, context, asBreadcrumb) { - message = `${this.app} ${message}`; + var _a, _b; + if ((_a = this.opts) === null || _a === void 0 ? void 0 : _a.prefix) { + message = `${(_b = this.opts) === null || _b === void 0 ? void 0 : _b.prefix} ${message}`; + } try { super.log(message, context); asBreadcrumb ? Sentry.addBreadcrumb({ message, - level: Sentry.Severity.Log, + level: 'log', data: { context } }) : - Sentry.captureMessage(message, Sentry.Severity.Log); + Sentry.captureMessage(message, 'log'); } catch (err) { } } error(message, trace, context) { - message = `${this.app} ${message}`; + var _a, _b; + if ((_a = this.opts) === null || _a === void 0 ? void 0 : _a.prefix) { + message = `${(_b = this.opts) === null || _b === void 0 ? void 0 : _b.prefix} ${message}`; + } try { super.error(message, trace, context); - Sentry.captureMessage(message, Sentry.Severity.Error); + Sentry.captureMessage(message, 'error'); } catch (err) { } } warn(message, context, asBreadcrumb) { - message = `${this.app} ${message}`; + var _a, _b; + if ((_a = this.opts) === null || _a === void 0 ? void 0 : _a.prefix) { + message = `${(_b = this.opts) === null || _b === void 0 ? void 0 : _b.prefix} ${message}`; + } try { super.warn(message, context); asBreadcrumb ? Sentry.addBreadcrumb({ message, - level: Sentry.Severity.Warning, + level: 'warning', data: { context } }) : - Sentry.captureMessage(message, Sentry.Severity.Warning); + Sentry.captureMessage(message, 'warning'); } catch (err) { } } debug(message, context, asBreadcrumb) { - message = `${this.app} ${message}`; + var _a, _b; + if ((_a = this.opts) === null || _a === void 0 ? void 0 : _a.prefix) { + message = `${(_b = this.opts) === null || _b === void 0 ? void 0 : _b.prefix} ${message}`; + } try { super.debug(message, context); asBreadcrumb ? Sentry.addBreadcrumb({ message, - level: Sentry.Severity.Debug, + level: 'debug', data: { context } }) : - Sentry.captureMessage(message, Sentry.Severity.Debug); + Sentry.captureMessage(message, 'debug'); } catch (err) { } } verbose(message, context, asBreadcrumb) { - message = `${this.app} ${message}`; + var _a, _b; + if ((_a = this.opts) === null || _a === void 0 ? void 0 : _a.prefix) { + message = `${(_b = this.opts) === null || _b === void 0 ? void 0 : _b.prefix} ${message}`; + } try { super.verbose(message, context); asBreadcrumb ? Sentry.addBreadcrumb({ message, - level: Sentry.Severity.Info, + level: 'info', data: { context } }) : - Sentry.captureMessage(message, Sentry.Severity.Info); + Sentry.captureMessage(message, 'info'); } catch (err) { } } diff --git a/dist/sentry.service.js.map b/dist/sentry.service.js.map index 86e7106..5008e40 100644 --- a/dist/sentry.service.js.map +++ b/dist/sentry.service.js.map @@ -1 +1 @@ -{"version":3,"file":"sentry.service.js","sourceRoot":"/","sources":["sentry.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable, ConsoleLogger } from '@nestjs/common';\nimport { OnApplicationShutdown } from '@nestjs/common';\nimport { Options, Client } from '@sentry/types';\nimport * as Sentry from '@sentry/node';\nimport { SENTRY_MODULE_OPTIONS } from './sentry.constants';\nimport { SentryModuleOptions } from './sentry.interfaces';\n\n@Injectable()\nexport class SentryService extends ConsoleLogger implements OnApplicationShutdown {\n app = '@ntegral/nestjs-sentry: ';\n private static serviceInstance: SentryService;\n constructor(\n @Inject(SENTRY_MODULE_OPTIONS)\n readonly opts?: SentryModuleOptions,\n ) {\n super();\n if (!(opts && opts.dsn)) {\n // console.log('options not found. Did you use SentryModule.forRoot?');\n return;\n }\n const { debug, integrations = [], ...sentryOptions } = opts;\n Sentry.init({\n ...sentryOptions,\n integrations: [\n new Sentry.Integrations.OnUncaughtException({\n onFatalError: async (err) => {\n // console.error('uncaughtException, not cool!')\n // console.error(err);\n if (err.name === 'SentryError') {\n console.log(err);\n } else {\n (\n Sentry.getCurrentHub().getClient<\n Client\n >() as Client\n ).captureException(err);\n process.exit(1);\n }\n },\n }),\n new Sentry.Integrations.OnUnhandledRejection({ mode: 'warn' }),\n ...integrations,\n ],\n });\n }\n\n public static SentryServiceInstance(): SentryService {\n if (!SentryService.serviceInstance) {\n SentryService.serviceInstance = new SentryService();\n }\n return SentryService.serviceInstance;\n }\n\n log(message: string, context?: string, asBreadcrumb?: boolean) {\n message = `${this.app} ${message}`;\n try {\n super.log(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: Sentry.Severity.Log,\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, Sentry.Severity.Log);\n } catch (err) {}\n }\n\n error(message: string, trace?: string, context?: string) {\n message = `${this.app} ${message}`;\n try {\n super.error(message, trace, context);\n Sentry.captureMessage(message, Sentry.Severity.Error);\n } catch (err) {}\n }\n\n warn(message: string, context?: string, asBreadcrumb?: boolean) {\n message = `${this.app} ${message}`;\n try {\n super.warn(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: Sentry.Severity.Warning,\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, Sentry.Severity.Warning);\n } catch (err) {}\n }\n\n debug(message: string, context?: string, asBreadcrumb?: boolean) {\n message = `${this.app} ${message}`;\n try {\n super.debug(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: Sentry.Severity.Debug,\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, Sentry.Severity.Debug);\n } catch (err) {}\n }\n\n verbose(message: string, context?: string, asBreadcrumb?: boolean) {\n message = `${this.app} ${message}`;\n try {\n super.verbose(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: Sentry.Severity.Info,\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, Sentry.Severity.Info);\n } catch (err) {}\n }\n\n instance() {\n return Sentry;\n }\n\n async onApplicationShutdown(signal?: string) {\n if (this.opts?.close?.enabled === true) {\n await Sentry.close(this.opts?.close.timeout);\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"sentry.service.js","sourceRoot":"/","sources":["sentry.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAmE;AAGnE,uCAAuC;AACvC,yDAA2D;AAIpD,IAAM,aAAa,qBAAnB,MAAM,aAAc,SAAQ,sBAAa;IAE9C,YAEW,IAA0B;QAEnC,KAAK,EAAE,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAsB;QAGnC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;YAEvB,OAAO;SACR;QACD,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,EAAE,KAAuB,IAAI,EAAtB,aAAa,UAAK,IAAI,EAArD,yBAA8C,CAAO,CAAC;QAC5D,MAAM,CAAC,IAAI,iCACN,aAAa,KAChB,YAAY,EAAE;gBACZ,IAAI,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC;oBAC1C,YAAY,EAAE,CAAO,GAAG,EAAE,EAAE;wBAG1B,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE;4BAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;yBAClB;6BAAM;4BAEH,MAAM,CAAC,aAAa,EAAE,CAAC,SAAS,EAGjC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;4BACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;yBACjB;oBACH,CAAC,CAAA;iBACF,CAAC;gBACF,IAAI,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAC9D,GAAG,YAAY;aAChB,IACD,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,qBAAqB;QACjC,IAAI,CAAC,eAAa,CAAC,eAAe,EAAE;YAClC,eAAa,CAAC,eAAe,GAAG,IAAI,eAAa,EAAE,CAAC;SACrD;QACD,OAAO,eAAa,CAAC,eAAe,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,OAAe,EAAE,OAAgB,EAAE,YAAsB;;QAC3D,IAAI,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,EAAE;YACrB,OAAO,GAAG,GAAG,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,IAAI,OAAO,EAAE,CAAC;SAC7C;QACD,IAAI;YACF,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5B,YAAY,CAAC,CAAC;gBACd,MAAM,CAAC,aAAa,CAAC;oBACnB,OAAO;oBACP,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF,CAAC,CAAC,CAAC;gBACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACvC;QAAC,OAAO,GAAG,EAAE,GAAE;IAClB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAc,EAAE,OAAgB;;QACrD,IAAI,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,EAAE;YACrB,OAAO,GAAG,GAAG,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,IAAI,OAAO,EAAE,CAAC;SAC7C;QACD,IAAI;YACF,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACzC;QAAC,OAAO,GAAG,EAAE,GAAE;IAClB,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAgB,EAAE,YAAsB;;QAC5D,IAAI,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,EAAE;YACrB,OAAO,GAAG,GAAG,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,IAAI,OAAO,EAAE,CAAC;SAC7C;QACD,IAAI;YACF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,YAAY,CAAC,CAAC;gBACd,MAAM,CAAC,aAAa,CAAC;oBACnB,OAAO;oBACP,KAAK,EAAE,SAAS;oBAChB,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF,CAAC,CAAC,CAAC;gBACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;SAC3C;QAAC,OAAO,GAAG,EAAE,GAAE;IAClB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAgB,EAAE,YAAsB;;QAC7D,IAAI,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,EAAE;YACrB,OAAO,GAAG,GAAG,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,IAAI,OAAO,EAAE,CAAC;SAC7C;QACD,IAAI;YACF,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,YAAY,CAAC,CAAC;gBACd,MAAM,CAAC,aAAa,CAAC;oBACnB,OAAO;oBACP,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF,CAAC,CAAC,CAAC;gBACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACzC;QAAC,OAAO,GAAG,EAAE,GAAE;IAClB,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,OAAgB,EAAE,YAAsB;;QAC/D,IAAI,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,EAAE;YACrB,OAAO,GAAG,GAAG,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,IAAI,OAAO,EAAE,CAAC;SAC7C;QACD,IAAI;YACF,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,YAAY,CAAC,CAAC;gBACd,MAAM,CAAC,aAAa,CAAC;oBACnB,OAAO;oBACP,KAAK,EAAE,MAAM;oBACb,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF,CAAC,CAAC,CAAC;gBACJ,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;SACxC;QAAC,OAAO,GAAG,EAAE,GAAE;IAClB,CAAC;IAED,QAAQ;QACN,OAAO,MAAM,CAAC;IAChB,CAAC;IAEK,qBAAqB,CAAC,MAAe;;;YACzC,IAAI,CAAA,MAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,KAAK,0CAAE,OAAO,MAAK,IAAI,EAAE;gBACtC,MAAM,MAAM,CAAC,KAAK,CAAC,MAAA,IAAI,CAAC,IAAI,0CAAE,KAAK,CAAC,OAAO,CAAC,CAAC;aAC9C;;KACF;CACF,CAAA;AAvIY,aAAa;IADzB,IAAA,mBAAU,GAAE;IAIR,WAAA,IAAA,eAAM,EAAC,wCAAqB,CAAC,CAAA;;GAHrB,aAAa,CAuIzB;AAvIY,sCAAa","sourcesContent":["import { Inject, Injectable, ConsoleLogger } from '@nestjs/common';\nimport { OnApplicationShutdown } from '@nestjs/common';\nimport { ClientOptions, Client } from '@sentry/types';\nimport * as Sentry from '@sentry/node';\nimport { SENTRY_MODULE_OPTIONS } from './sentry.constants';\nimport { SentryModuleOptions } from './sentry.interfaces';\n\n@Injectable()\nexport class SentryService extends ConsoleLogger implements OnApplicationShutdown {\n private static serviceInstance: SentryService;\n constructor(\n @Inject(SENTRY_MODULE_OPTIONS)\n readonly opts?: SentryModuleOptions,\n ) {\n super();\n if (!(opts && opts.dsn)) {\n // console.log('options not found. Did you use SentryModule.forRoot?');\n return;\n }\n const { debug, integrations = [], ...sentryOptions } = opts;\n Sentry.init({\n ...sentryOptions,\n integrations: [\n new Sentry.Integrations.OnUncaughtException({\n onFatalError: async (err) => {\n // console.error('uncaughtException, not cool!')\n // console.error(err);\n if (err.name === 'SentryError') {\n console.log(err);\n } else {\n (\n Sentry.getCurrentHub().getClient<\n Client\n >() as Client\n ).captureException(err);\n process.exit(1);\n }\n },\n }),\n new Sentry.Integrations.OnUnhandledRejection({ mode: 'warn' }),\n ...integrations,\n ],\n });\n }\n\n public static SentryServiceInstance(): SentryService {\n if (!SentryService.serviceInstance) {\n SentryService.serviceInstance = new SentryService();\n }\n return SentryService.serviceInstance;\n }\n\n log(message: string, context?: string, asBreadcrumb?: boolean) {\n if (this.opts?.prefix) {\n message = `${this.opts?.prefix} ${message}`;\n }\n try {\n super.log(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: 'log',\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, 'log');\n } catch (err) {}\n }\n\n error(message: string, trace?: string, context?: string) {\n if (this.opts?.prefix) {\n message = `${this.opts?.prefix} ${message}`;\n }\n try {\n super.error(message, trace, context);\n Sentry.captureMessage(message, 'error');\n } catch (err) {}\n }\n\n warn(message: string, context?: string, asBreadcrumb?: boolean) {\n if (this.opts?.prefix) {\n message = `${this.opts?.prefix} ${message}`;\n }\n try {\n super.warn(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: 'warning',\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, 'warning');\n } catch (err) {}\n }\n\n debug(message: string, context?: string, asBreadcrumb?: boolean) {\n if (this.opts?.prefix) {\n message = `${this.opts?.prefix} ${message}`;\n }\n try {\n super.debug(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: 'debug',\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, 'debug');\n } catch (err) {}\n }\n\n verbose(message: string, context?: string, asBreadcrumb?: boolean) {\n if (this.opts?.prefix) {\n message = `${this.opts?.prefix} ${message}`;\n }\n try {\n super.verbose(message, context);\n asBreadcrumb ?\n Sentry.addBreadcrumb({\n message,\n level: 'info',\n data: {\n context\n }\n }) :\n Sentry.captureMessage(message, 'info');\n } catch (err) {}\n }\n\n instance() {\n return Sentry;\n }\n\n async onApplicationShutdown(signal?: string) {\n if (this.opts?.close?.enabled === true) {\n await Sentry.close(this.opts?.close.timeout);\n }\n }\n}\n"]} \ No newline at end of file diff --git a/lib/sentry.interfaces.ts b/lib/sentry.interfaces.ts index 4410406..cb4685f 100644 --- a/lib/sentry.interfaces.ts +++ b/lib/sentry.interfaces.ts @@ -11,7 +11,8 @@ export interface SentryCloseOptions { export type SentryModuleOptions = Omit & { integrations?: Integration[]; - close?: SentryCloseOptions + close?: SentryCloseOptions; + prefix?: string; } & ConsoleLoggerOptions; export interface SentryOptionsFactory { diff --git a/lib/sentry.service.ts b/lib/sentry.service.ts index c193d1a..704c216 100644 --- a/lib/sentry.service.ts +++ b/lib/sentry.service.ts @@ -7,7 +7,6 @@ import { SentryModuleOptions } from './sentry.interfaces'; @Injectable() export class SentryService extends ConsoleLogger implements OnApplicationShutdown { - app = '@ntegral/nestjs-sentry: '; private static serviceInstance: SentryService; constructor( @Inject(SENTRY_MODULE_OPTIONS) @@ -52,7 +51,9 @@ export class SentryService extends ConsoleLogger implements OnApplicationShutdow } log(message: string, context?: string, asBreadcrumb?: boolean) { - message = `${this.app} ${message}`; + if (this.opts?.prefix) { + message = `${this.opts?.prefix} ${message}`; + } try { super.log(message, context); asBreadcrumb ? @@ -68,7 +69,9 @@ export class SentryService extends ConsoleLogger implements OnApplicationShutdow } error(message: string, trace?: string, context?: string) { - message = `${this.app} ${message}`; + if (this.opts?.prefix) { + message = `${this.opts?.prefix} ${message}`; + } try { super.error(message, trace, context); Sentry.captureMessage(message, 'error'); @@ -76,7 +79,9 @@ export class SentryService extends ConsoleLogger implements OnApplicationShutdow } warn(message: string, context?: string, asBreadcrumb?: boolean) { - message = `${this.app} ${message}`; + if (this.opts?.prefix) { + message = `${this.opts?.prefix} ${message}`; + } try { super.warn(message, context); asBreadcrumb ? @@ -92,7 +97,9 @@ export class SentryService extends ConsoleLogger implements OnApplicationShutdow } debug(message: string, context?: string, asBreadcrumb?: boolean) { - message = `${this.app} ${message}`; + if (this.opts?.prefix) { + message = `${this.opts?.prefix} ${message}`; + } try { super.debug(message, context); asBreadcrumb ? @@ -108,7 +115,9 @@ export class SentryService extends ConsoleLogger implements OnApplicationShutdow } verbose(message: string, context?: string, asBreadcrumb?: boolean) { - message = `${this.app} ${message}`; + if (this.opts?.prefix) { + message = `${this.opts?.prefix} ${message}`; + } try { super.verbose(message, context); asBreadcrumb ?