diff --git a/packages/nocodb/package.json b/packages/nocodb/package.json index a9333a9ce4..1e1d6515d9 100644 --- a/packages/nocodb/package.json +++ b/packages/nocodb/package.json @@ -64,6 +64,7 @@ "@nestjs/serve-static": "^4.0.0", "@nestjs/throttler": "^4.2.1", "@nestjs/websockets": "^10.2.1", + "@ntegral/nestjs-sentry": "^4.0.0", "@sentry/node": "^6.3.5", "@techpass/passport-openidconnect": "^0.3.3", "@types/chai": "^4.2.12", diff --git a/packages/nocodb/src/Noco.ts b/packages/nocodb/src/Noco.ts index 994d732dfc..a10c00647d 100644 --- a/packages/nocodb/src/Noco.ts +++ b/packages/nocodb/src/Noco.ts @@ -1,6 +1,4 @@ import path from 'path'; -import * as Sentry from '@sentry/node'; -import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import clear from 'clear'; import * as express from 'express'; @@ -11,11 +9,10 @@ import dotenv from 'dotenv'; import { IoAdapter } from '@nestjs/platform-socket.io'; import requestIp from 'request-ip'; import cookieParser from 'cookie-parser'; +import { Logger } from '@nestjs/common'; import type { MetaService } from '~/meta/meta.service'; import type { IEventEmitter } from '~/modules/event-emitter/event-emitter.interface'; import type { Express } from 'express'; -// import type * as http from 'http'; - import type http from 'http'; import { MetaTable } from '~/utils/globals'; import { AppModule } from '~/app.module'; @@ -100,10 +97,7 @@ export default class Noco { } static async init(param: any, httpServer: http.Server, server: Express) { - const nestApp = await NestFactory.create( - AppModule, - // new ExpressAdapter(server), - ); + const nestApp = await NestFactory.create(AppModule); if (process.env.NC_WORKER_CONTAINER === 'true') { if (!process.env.NC_REDIS_URL) { @@ -121,8 +115,6 @@ export default class Noco { nestApp.use(requestIp.mw()); nestApp.use(cookieParser()); - this.initSentry(nestApp); - nestApp.useWebSocketAdapter(new IoAdapter(httpServer)); nestApp.use( @@ -139,8 +131,6 @@ export default class Noco { server.get('/', (_req, res) => res.redirect(dashboardPath)); } - this.initSentryErrorHandler(server); - return nestApp.getHttpAdapter().getInstance(); } } @@ -189,19 +179,4 @@ export default class Noco { } process.env.NC_SERVER_UUID = serverId; } - - private static initSentryErrorHandler(router) { - if (process.env.NC_SENTRY_DSN) { - router.use(Sentry.Handlers.errorHandler()); - } - } - - private static initSentry(router) { - if (process.env.NC_SENTRY_DSN) { - Sentry.init({ dsn: process.env.NC_SENTRY_DSN }); - - // The request handler must be the first middleware on the app - router.use(Sentry.Handlers.requestHandler()); - } - } } diff --git a/packages/nocodb/src/app.module.ts b/packages/nocodb/src/app.module.ts index 1a944c37f1..b36bf4988b 100644 --- a/packages/nocodb/src/app.module.ts +++ b/packages/nocodb/src/app.module.ts @@ -3,6 +3,7 @@ import { APP_FILTER, APP_GUARD } from '@nestjs/core'; // @ts-ignore import { ConfigModule } from '@nestjs/config'; import { EventEmitterModule as NestJsEventEmitter } from '@nestjs/event-emitter'; +import { SentryModule } from '@ntegral/nestjs-sentry'; import type { MiddlewareConsumer } from '@nestjs/common'; import { GlobalExceptionFilter } from '~/filters/global-exception/global-exception.filter'; import { GlobalMiddleware } from '~/middlewares/global/global.middleware'; @@ -24,6 +25,7 @@ import { HookHandlerService } from '~/services/hook-handler.service'; import { BasicStrategy } from '~/strategies/basic.strategy/basic.strategy'; import { UsersModule } from '~/modules/users/users.module'; import { AuthModule } from '~/modules/auth/auth.module'; +import { packageInfo } from '~/utils/packageVersion'; export const ceModuleConfig = { imports: [ @@ -39,6 +41,17 @@ export const ceModuleConfig = { load: [() => appConfig], isGlobal: true, }), + ...(process.env.NC_SENTRY_DSN + ? [ + SentryModule.forRoot({ + dsn: process.env.NC_SENTRY_DSN, + debug: false, + environment: process.env.NODE_ENV, + release: packageInfo.version, // must create a release in sentry.io dashboard + logLevels: ['debug'], //based on sentry.io loglevel // + }), + ] + : []), ], providers: [ AuthService, diff --git a/packages/nocodb/src/filters/global-exception/global-exception.filter.ts b/packages/nocodb/src/filters/global-exception/global-exception.filter.ts index f1576cfa9d..1d2d2f940f 100644 --- a/packages/nocodb/src/filters/global-exception/global-exception.filter.ts +++ b/packages/nocodb/src/filters/global-exception/global-exception.filter.ts @@ -1,6 +1,8 @@ -import { Catch, Logger, NotFoundException } from '@nestjs/common'; +import { Catch, Logger, NotFoundException, Optional } from '@nestjs/common'; +import { InjectSentry, SentryService } from '@ntegral/nestjs-sentry'; +import { ThrottlerException } from '@nestjs/throttler'; import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; -import type { Response } from 'express'; +import type { Request, Response } from 'express'; import { AjvError, BadRequest, @@ -15,11 +17,16 @@ import { @Catch() export class GlobalExceptionFilter implements ExceptionFilter { + constructor( + @Optional() @InjectSentry() private readonly sentryClient: SentryService, + ) {} + private logger = new Logger(GlobalExceptionFilter.name); catch(exception: any, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); + const request = ctx.getRequest(); // skip unnecessary error logging if ( @@ -32,11 +39,20 @@ export class GlobalExceptionFilter implements ExceptionFilter { exception instanceof NotFound || exception instanceof NotImplemented || exception instanceof UnprocessableEntity || - exception instanceof NotFoundException + exception instanceof NotFoundException || + exception instanceof ThrottlerException ) ) this.logger.error(exception.message, exception.stack); + if (exception instanceof ThrottlerException) { + this.logger.log( + `${exception.message}, Path : ${request.path}, Workspace ID : ${ + (request as any).ncWorkspaceId + }, Project ID : ${(request as any).ncProjectId}`, + ); + } + // API not found if (exception instanceof NotFoundException) { this.logger.debug(exception.message, exception.stack); @@ -90,6 +106,8 @@ export class GlobalExceptionFilter implements ExceptionFilter { if (exception.getStatus?.()) { response.status(exception.getStatus()).json(exception.getResponse()); } else { + this.sentryClient?.instance().captureException(exception); + // todo: change the response code response.status(400).json({ msg: exception.message, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77b4e58856..9d7917ed4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -436,6 +436,9 @@ importers: '@nestjs/websockets': specifier: ^10.2.1 version: 10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(@nestjs/platform-socket.io@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@ntegral/nestjs-sentry': + specifier: ^4.0.0 + version: 4.0.0(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(@sentry/hub@7.74.1)(@sentry/node@6.3.5)(graphql@15.3.0)(reflect-metadata@0.1.13)(rimraf@3.0.2)(rxjs@7.2.0) '@sentry/node': specifier: ^6.3.5 version: 6.3.5 @@ -4184,6 +4187,18 @@ packages: tslib: 2.0.3 dev: false + /@graphql-tools/merge@8.3.18(graphql@15.3.0): + resolution: {integrity: sha512-R8nBglvRWPAyLpZL/f3lxsY7wjnAeE0l056zHhcO/CgpvK76KYUt9oEkR05i8Hmt8DLRycBN0FiotJ0yDQWTVA==} + requiresBuild: true + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/utils': 9.2.1(graphql@15.3.0) + graphql: 15.3.0 + tslib: 2.6.2 + dev: false + optional: true + /@graphql-tools/schema@6.0.12(graphql@15.3.0): resolution: {integrity: sha512-XUmKJ+ipENaxuXIX4GapsLAUl1dFQBUg+S4ZbgtKVlwrPhZJ9bkjIqnUHk3wg4S4VXqzLX97ol1e4g9N6XLkYg==} peerDependencies: @@ -4194,6 +4209,20 @@ packages: tslib: 2.0.3 dev: false + /@graphql-tools/schema@9.0.16(graphql@15.3.0): + resolution: {integrity: sha512-kF+tbYPPf/6K2aHG3e1SWIbapDLQaqnIHVRG6ow3onkFoowwtKszvUyOASL6Krcv2x9bIMvd1UkvRf9OaoROQQ==} + requiresBuild: true + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-tools/merge': 8.3.18(graphql@15.3.0) + '@graphql-tools/utils': 9.2.1(graphql@15.3.0) + graphql: 15.3.0 + tslib: 2.6.2 + value-or-promise: 1.0.12 + dev: false + optional: true + /@graphql-tools/utils@6.0.12(graphql@15.3.0): resolution: {integrity: sha512-MuFSkxXCe2QoD5QJPJ/1WIm0YnBzzXpkq9d/XznVAWptHFRwtwIbZ1xcREjYquFvoZ7ddsjZfyvUN/5ulmHhhg==} peerDependencies: @@ -4204,6 +4233,28 @@ packages: graphql: 15.3.0 dev: false + /@graphql-tools/utils@9.2.1(graphql@15.3.0): + resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==} + requiresBuild: true + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@15.3.0) + graphql: 15.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@graphql-typed-document-node/core@3.2.0(graphql@15.3.0): + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + requiresBuild: true + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 15.3.0 + dev: false + optional: true + /@humanwhocodes/config-array@0.11.10: resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} engines: {node: '>=10.10.0'} @@ -5161,6 +5212,52 @@ packages: reflect-metadata: 0.1.13 dev: false + /@nestjs/graphql@10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(graphql@15.3.0)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-FBzYTymT4oopiGMpej7GTRyhz1BgJxLlXZPUueamC5J9u1WxCwJyETkzBI/zeUkUydlklF/xd5zDd/Md6//hEw==} + requiresBuild: true + peerDependencies: + '@apollo/subgraph': ^0.1.5 || ^0.3.0 || ^0.4.0 || ^2.0.0 + '@nestjs/common': ^8.2.3 || ^9.0.0 + '@nestjs/core': ^8.2.3 || ^9.0.0 + class-transformer: '*' + class-validator: '*' + graphql: ^15.8.0 || ^16.0.0 + reflect-metadata: ^0.1.13 + ts-morph: ^13.0.2 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + peerDependenciesMeta: + '@apollo/subgraph': + optional: true + class-transformer: + optional: true + class-validator: + optional: true + ts-morph: + optional: true + dependencies: + '@graphql-tools/merge': 8.3.18(graphql@15.3.0) + '@graphql-tools/schema': 9.0.16(graphql@15.3.0) + '@graphql-tools/utils': 9.2.1(graphql@15.3.0) + '@nestjs/common': 10.2.1(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(@nestjs/platform-express@10.2.1)(@nestjs/websockets@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/mapped-types': 1.2.2(@nestjs/common@10.2.1)(reflect-metadata@0.1.13) + chokidar: 3.5.3 + fast-glob: 3.2.12 + graphql: 15.3.0 + graphql-tag: 2.12.6(graphql@15.3.0) + graphql-ws: 5.11.3(graphql@15.3.0) + lodash: 4.17.21 + normalize-path: 3.0.0 + reflect-metadata: 0.1.13 + subscriptions-transport-ws: 0.11.0(graphql@15.3.0) + tslib: 2.5.0 + uuid: 9.0.0 + ws: 8.12.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + optional: true + /@nestjs/jwt@10.1.0(@nestjs/common@10.2.1): resolution: {integrity: sha512-iLwCGS25ybUxGS7i5j/Mwuyzvp/WxJftHlm8aLEBv5GV92apz6L1QVjxLdZrqXbzo++C8gdJauhzil8qitY+6w==} peerDependencies: @@ -5171,6 +5268,25 @@ packages: jsonwebtoken: 9.0.0 dev: false + /@nestjs/mapped-types@1.2.2(@nestjs/common@10.2.1)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-3dHxLXs3M0GPiriAcCFFJQHoDFUuzTD5w6JDhE7TyfT89YKpe6tcCCIqOZWdXmt9AZjjK30RkHRSFF+QEnWFQg==} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^7.0.8 || ^8.0.0 || ^9.0.0 + class-transformer: ^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0 + class-validator: ^0.11.1 || ^0.12.0 || ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 10.2.1(reflect-metadata@0.1.13)(rxjs@7.2.0) + reflect-metadata: 0.1.13 + dev: false + optional: true + /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.1)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: @@ -5464,6 +5580,36 @@ packages: - debug dev: true + /@ntegral/nestjs-sentry@4.0.0(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(@sentry/hub@7.74.1)(@sentry/node@6.3.5)(graphql@15.3.0)(reflect-metadata@0.1.13)(rimraf@3.0.2)(rxjs@7.2.0): + resolution: {integrity: sha512-6WHZcK7NLeg7ue1y3Z61msEBzCGZeXQ0hWhliH1ddQH0kPbZ6lXLxduGMWYb0N/fPjXAX1Astz8urqnoTOZBQw==} + peerDependencies: + '@nestjs/common': ^9.0.4 + '@nestjs/core': ^9.0.4 + '@sentry/hub': ^7.7.0 + '@sentry/node': ^7.7.0 + reflect-metadata: ^0.1.13 + rimraf: ^3.0.2 + rxjs: ^7.2.0 + dependencies: + '@nestjs/common': 10.2.1(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(@nestjs/platform-express@10.2.1)(@nestjs/websockets@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@sentry/hub': 7.74.1 + '@sentry/node': 6.3.5 + reflect-metadata: 0.1.13 + rimraf: 3.0.2 + rxjs: 7.2.0 + optionalDependencies: + '@nestjs/graphql': 10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(graphql@15.3.0)(reflect-metadata@0.1.13) + transitivePeerDependencies: + - '@apollo/subgraph' + - bufferutil + - class-transformer + - class-validator + - graphql + - ts-morph + - utf-8-validate + dev: false + /@nuxt/devalue@2.0.2: resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} dev: true @@ -6327,6 +6473,15 @@ packages: tslib: 1.14.1 dev: false + /@sentry/core@7.74.1: + resolution: {integrity: sha512-LvEhOSfdIvwkr+PdlrT/aA/iOLhkXrSkvjqAQyogE4ddCWeYfS0NoirxNt1EaxMBAWKhYZRqzkA7WA4LDLbzlA==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 + tslib: 2.6.2 + dev: false + /@sentry/hub@6.3.5: resolution: {integrity: sha512-ZYFo7VYKwdPVjuV9BDFiYn+MpANn6eZMz5QDBfZ2dugIvIVbuOyOOLx8PSa3ZXJoVTZZ7s2wD2fi/ZxKjNjZOQ==} engines: {node: '>=6'} @@ -6336,6 +6491,16 @@ packages: tslib: 1.14.1 dev: false + /@sentry/hub@7.74.1: + resolution: {integrity: sha512-f/71NfZdYYiXjhdXlQnZhZRbWTRUfdrh7rr5KiHgNsyNj6z/rRNa0OiKEDxKubscUqiccnWRZM06/RglRJp5Ew==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.74.1 + '@sentry/types': 7.74.1 + '@sentry/utils': 7.74.1 + tslib: 2.6.2 + dev: false + /@sentry/minimal@6.3.5: resolution: {integrity: sha512-4RqIGAU0+8iI/1sw0GYPTr4SUA88/i2+JPjFJ+qloh5ANVaNwhFPRChw+Ys9xpre8LV9JZrEsEf8AvQr4fkNbA==} engines: {node: '>=6'} @@ -6378,6 +6543,11 @@ packages: engines: {node: '>=6'} dev: false + /@sentry/types@7.74.1: + resolution: {integrity: sha512-2jIuPc+YKvXqZETwr2E8VYnsH1zsSUR/wkIvg1uTVeVNyoowJv+YsOtCdeGyL2AwiotUBSPKu7O1Lz0kq5rMOQ==} + engines: {node: '>=8'} + dev: false + /@sentry/utils@6.3.5: resolution: {integrity: sha512-kHUcZ37QYlNzz7c9LVdApITXHaNmQK7+sw/If3M/qpff1fd5XoecA8laLfcYuz+Cw5mRhVmdhPcCRM3Xi1IGXg==} engines: {node: '>=6'} @@ -6386,6 +6556,14 @@ packages: tslib: 1.14.1 dev: false + /@sentry/utils@7.74.1: + resolution: {integrity: sha512-qUsqufuHYcy5gFhLZslLxA5kcEOkkODITXW3c7D+x+8iP/AJqa8v8CeUCVNS7RetHCuIeWAbbTClC4c411EwQg==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.74.1 + tslib: 2.6.2 + dev: false + /@sigstore/bundle@1.1.0: resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -9995,6 +10173,12 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) dev: true + /backo2@1.0.2: + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + requiresBuild: true + dev: false + optional: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -13156,6 +13340,12 @@ packages: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} dev: false + /eventemitter3@3.1.2: + resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} + requiresBuild: true + dev: false + optional: true + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -13424,6 +13614,19 @@ packages: dev: true optional: true + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + requiresBuild: true + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + optional: true + /fast-glob@3.2.7: resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} engines: {node: '>=8'} @@ -14404,6 +14607,18 @@ packages: graphql: 15.3.0 dev: false + /graphql-tag@2.12.6(graphql@15.3.0): + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + graphql: 15.3.0 + tslib: 2.6.2 + dev: false + optional: true + /graphql-type-json@0.3.2(graphql@15.3.0): resolution: {integrity: sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==} peerDependencies: @@ -14412,6 +14627,17 @@ packages: graphql: 15.3.0 dev: false + /graphql-ws@5.11.3(graphql@15.3.0): + resolution: {integrity: sha512-fU8zwSgAX2noXAsuFiCZ8BtXeXZOzXyK5u1LloCdacsVth4skdBMPO74EG51lBoWSIZ8beUocdpV8+cQHBODnQ==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + graphql: '>=0.11 <=16' + dependencies: + graphql: 15.3.0 + dev: false + optional: true + /graphql@15.3.0: resolution: {integrity: sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w==} engines: {node: '>= 10.x'} @@ -15616,6 +15842,12 @@ packages: engines: {node: '>=8.0.0'} dev: true + /iterall@1.3.0: + resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} + requiresBuild: true + dev: false + optional: true + /iterare@1.2.1: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} @@ -21482,6 +21714,25 @@ packages: postcss-selector-parser: 6.0.13 dev: true + /subscriptions-transport-ws@0.11.0(graphql@15.3.0): + resolution: {integrity: sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==} + deprecated: The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md + requiresBuild: true + peerDependencies: + graphql: ^15.7.2 || ^16.0.0 + dependencies: + backo2: 1.0.2 + eventemitter3: 3.1.2 + graphql: 15.3.0 + iterall: 1.3.0 + symbol-observable: 1.2.0 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + optional: true + /superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} @@ -21559,6 +21810,13 @@ packages: picocolors: 1.0.0 dev: true + /symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + /symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} @@ -22178,6 +22436,12 @@ packages: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: false + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + requiresBuild: true + dev: false + optional: true + /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} @@ -22908,6 +23172,13 @@ packages: engines: {node: '>= 0.10'} dev: false + /value-or-promise@1.0.12: + resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} + engines: {node: '>=12'} + requiresBuild: true + dev: false + optional: true + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -24002,6 +24273,21 @@ packages: write-json-file: 3.2.0 dev: true + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + requiresBuild: true + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + optional: true + /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} @@ -24014,6 +24300,21 @@ packages: utf-8-validate: optional: true + /ws@8.12.0: + resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} + engines: {node: '>=10.0.0'} + requiresBuild: true + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + optional: true + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'}