diff --git a/packages/erc20-watcher/package.json b/packages/erc20-watcher/package.json index 40a8795d..6d39c9d8 100644 --- a/packages/erc20-watcher/package.json +++ b/packages/erc20-watcher/package.json @@ -54,6 +54,7 @@ "express": "^4.17.1", "graphql-import-node": "^0.0.4", "graphql-request": "^3.4.0", + "graphql-subscriptions": "^2.0.0", "json-bigint": "^1.0.0", "lodash": "^4.17.21", "reflect-metadata": "^0.1.13", diff --git a/packages/erc20-watcher/src/events.ts b/packages/erc20-watcher/src/events.ts index 1b04af39..aabad080 100644 --- a/packages/erc20-watcher/src/events.ts +++ b/packages/erc20-watcher/src/events.ts @@ -4,7 +4,7 @@ import assert from 'assert'; import debug from 'debug'; -import { PubSub } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import { QUEUE_BLOCK_PROCESSING, diff --git a/packages/erc20-watcher/src/fill.ts b/packages/erc20-watcher/src/fill.ts index 15206c96..9fe04b3e 100644 --- a/packages/erc20-watcher/src/fill.ts +++ b/packages/erc20-watcher/src/fill.ts @@ -7,7 +7,7 @@ import 'reflect-metadata'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; -import { PubSub } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import { DEFAULT_CONFIG_PATH } from '@cerc-io/util'; import { EthClient } from '@cerc-io/ipld-eth-client'; diff --git a/packages/erc20-watcher/src/server.ts b/packages/erc20-watcher/src/server.ts index b1fefd81..0b8df3fd 100644 --- a/packages/erc20-watcher/src/server.ts +++ b/packages/erc20-watcher/src/server.ts @@ -5,7 +5,8 @@ import assert from 'assert'; import 'reflect-metadata'; import express, { Application } from 'express'; -import { ApolloServer, PubSub } from 'apollo-server-express'; +import { ApolloServer } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; diff --git a/packages/uni-info-watcher/environments/local.toml b/packages/uni-info-watcher/environments/local.toml index 0b2f11d6..742e4936 100644 --- a/packages/uni-info-watcher/environments/local.toml +++ b/packages/uni-info-watcher/environments/local.toml @@ -27,6 +27,20 @@ # Boolean to load GQL query nested entity relations sequentially. loadRelationsSequential = false + # Max GQL API requests to process simultaneously (defaults to 1). + maxSimultaneousRequests = 50 + + # GQL cache settings + [server.gqlCache] + enabled = true + + # Max in-memory cache size (in bytes) (default 8 MB) + # maxCacheSize + + # GQL cache-control max-age settings (in seconds) + maxAge = 15 + timeTravelMaxAge = 86400 # 1 day + [metrics] host = "127.0.0.1" port = 9004 @@ -44,6 +58,10 @@ logging = false maxQueryExecutionTime = 100 + [database.extra] + # maximum number of clients the pool should contain + max = 20 + [upstream] [upstream.ethServer] gqlApiEndpoint = "http://127.0.0.1:8082/graphql" diff --git a/packages/uni-info-watcher/package.json b/packages/uni-info-watcher/package.json index 03ce0c37..a70f8a19 100644 --- a/packages/uni-info-watcher/package.json +++ b/packages/uni-info-watcher/package.json @@ -6,14 +6,18 @@ "private": true, "dependencies": { "@apollo/client": "^3.3.19", - "@types/lodash": "^4.14.168", + "@apollo/utils.keyvaluecache": "^1.0.1", + "@graphql-tools/schema": "^9.0.10", "@ipld/dag-cbor": "^6.0.12", + "@types/lodash": "^4.14.168", "@vulcanize/cache": "^0.1.0", "@vulcanize/erc20-watcher": "^0.1.0", "@vulcanize/ipld-eth-client": "^0.1.0", "@vulcanize/uni-watcher": "^0.1.0", "@vulcanize/util": "^0.1.0", - "apollo-server-express": "^2.25.0", + "apollo-server-core": "^3.11.1", + "apollo-server-express": "^3.11.1", + "apollo-server-plugin-response-cache": "^3.8.1", "apollo-type-bigint": "^0.1.3", "debug": "^4.3.1", "express": "^4.17.1", @@ -21,10 +25,13 @@ "graphql": "^15.5.0", "graphql-import-node": "^0.0.4", "graphql-request": "^3.4.0", + "graphql-subscriptions": "^2.0.0", + "graphql-ws": "^5.11.2", "json-bigint": "^1.0.0", + "lodash": "^4.17.21", "reflect-metadata": "^0.1.13", "typeorm": "^0.2.32", - "lodash": "^4.17.21", + "ws": "^7.4.6", "yargs": "^17.0.1" }, "scripts": { @@ -62,6 +69,7 @@ "devDependencies": { "@types/chance": "^1.1.2", "@types/express": "^4.17.11", + "@types/ws": "^7.4.4", "@typescript-eslint/eslint-plugin": "^4.25.0", "@typescript-eslint/parser": "^4.25.0", "@uniswap/v3-core": "1.0.0", diff --git a/packages/uni-info-watcher/src/cli/import-state.ts b/packages/uni-info-watcher/src/cli/import-state.ts index ddd618a9..0ddc3438 100644 --- a/packages/uni-info-watcher/src/cli/import-state.ts +++ b/packages/uni-info-watcher/src/cli/import-state.ts @@ -7,7 +7,7 @@ import 'reflect-metadata'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; -import { PubSub } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import fs from 'fs'; import path from 'path'; diff --git a/packages/uni-info-watcher/src/database.ts b/packages/uni-info-watcher/src/database.ts index b3b2738f..904599eb 100644 --- a/packages/uni-info-watcher/src/database.ts +++ b/packages/uni-info-watcher/src/database.ts @@ -18,7 +18,6 @@ import { import path from 'path'; import { SelectionNode } from 'graphql'; import debug from 'debug'; -import _ from 'lodash'; import { StateKind, diff --git a/packages/uni-info-watcher/src/events.ts b/packages/uni-info-watcher/src/events.ts index 5aaa96d8..60e650bd 100644 --- a/packages/uni-info-watcher/src/events.ts +++ b/packages/uni-info-watcher/src/events.ts @@ -4,7 +4,7 @@ import assert from 'assert'; import debug from 'debug'; -import { PubSub } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import { EthClient } from '@vulcanize/ipld-eth-client'; import { QUEUE_BLOCK_PROCESSING, QUEUE_EVENT_PROCESSING } from '@cerc-io/util'; diff --git a/packages/uni-info-watcher/src/fill.ts b/packages/uni-info-watcher/src/fill.ts index fefd55d8..9fc8204a 100644 --- a/packages/uni-info-watcher/src/fill.ts +++ b/packages/uni-info-watcher/src/fill.ts @@ -7,6 +7,7 @@ import 'reflect-metadata'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; +import { PubSub } from 'graphql-subscriptions'; import { getCache } from '@vulcanize/cache'; import { DEFAULT_CONFIG_PATH } from '@cerc-io/util'; @@ -16,7 +17,6 @@ import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; import { EthClient } from '@cerc-io/ipld-eth-client'; import { Database } from './database'; -import { PubSub } from 'apollo-server-express'; import { Indexer } from './indexer'; import { EventWatcher } from './events'; import { fillState } from './cli/fill-state'; diff --git a/packages/uni-info-watcher/src/resolvers.ts b/packages/uni-info-watcher/src/resolvers.ts index a0c94885..fce21db3 100644 --- a/packages/uni-info-watcher/src/resolvers.ts +++ b/packages/uni-info-watcher/src/resolvers.ts @@ -9,7 +9,7 @@ import { GraphQLResolveInfo, GraphQLScalarType } from 'graphql'; import JSONbig from 'json-bigint'; import { gqlQueryCount, gqlTotalQueryCount, GraphDecimal } from '@vulcanize/util'; -import { BlockHeight, OrderDirection, getResultState } from '@cerc-io/util'; +import { BlockHeight, OrderDirection, getResultState, setGQLCacheHints } from '@cerc-io/util'; import { Indexer } from './indexer'; import { Burn } from './entity/Burn'; @@ -43,6 +43,8 @@ export { BlockHeight }; export const createResolvers = async (indexer: Indexer, customIndexer: CustomIndexer, eventWatcher: EventWatcher): Promise => { assert(indexer); + const gqlCacheConfig = indexer.serverConfig.gqlCache; + return { BigInt: new BigInt('bigInt'), @@ -74,18 +76,25 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd Query: { bundle: async ( _: any, - { id, block = {} }: { id: string, block: BlockHeight } + { id, block = {} }: { id: string, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo ) => { log('bundle', JSONbig.stringify({ id, block })); gqlTotalQueryCount.inc(1); gqlQueryCount.labels('bundle').inc(1); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getBundle(id, block); }, bundles: async ( _: any, - { block = {}, first, skip, where = {} }: { first: number, skip: number, block: BlockHeight, where: { [key: string]: any } } + { block = {}, first, skip, where = {} }: { first: number, skip: number, block: BlockHeight, where: { [key: string]: any } }, + __: any, + info: GraphQLResolveInfo ) => { log('bundles', JSONbig.stringify({ block, first, skip })); gqlTotalQueryCount.inc(1); @@ -96,6 +105,11 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd where = { id: BUNDLE_ID }; } + // NOTE: If queries for same type with & without block are fired in a single GQL query, + // cache-control might not be set as desired + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities(Bundle, block, where, { limit: first, skip }); }, @@ -110,6 +124,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('burns').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( Burn, block, @@ -121,7 +138,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd factories: async ( _: any, - { block = {}, first, skip }: { first: number, skip: number, block: BlockHeight } + { block = {}, first, skip }: { first: number, skip: number, block: BlockHeight }, + __: any, + info: GraphQLResolveInfo ) => { log('factories', JSONbig.stringify({ block, first, skip })); gqlTotalQueryCount.inc(1); @@ -133,6 +152,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd where = { id: FACTORY_ADDRESS }; } + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities(Factory, block, where, { limit: first, skip }); }, @@ -147,6 +169,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('mints').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( Mint, block, @@ -167,6 +192,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('pool').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getPool(id, block, info.fieldNodes[0].selectionSet.selections); }, @@ -181,6 +209,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('poolDayDatas').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( PoolDayData, block, @@ -201,6 +232,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('poolHourDatas').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities( PoolHourData, block, @@ -221,6 +255,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('pools').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( Pool, block, @@ -241,6 +278,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('swaps').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( Swap, block, @@ -261,6 +301,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('ticks').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( Tick, block, @@ -281,6 +324,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('token').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getToken(id, block, info.fieldNodes[0].selectionSet.selections); }, @@ -295,6 +341,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('tokens').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( Token, block, @@ -315,6 +364,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('tokenDayDatas').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( TokenDayData, block, @@ -335,6 +387,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('tokenHourDatas').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( TokenHourData, block, @@ -355,6 +410,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('transactions').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( Transaction, block, @@ -375,6 +433,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('uniswapDayDatas').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return customIndexer.getEntities( UniswapDayData, block, @@ -395,6 +456,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('positions').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities( Position, block, @@ -415,6 +479,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('positionSnapshots').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities( PositionSnapshot, block, @@ -435,6 +502,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('tickDayDatas').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities( TickDayData, block, @@ -455,6 +525,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('tickHourDatas').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities( TickHourData, block, @@ -475,6 +548,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('flashes').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities( Flash, block, @@ -495,6 +571,9 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd gqlQueryCount.labels('collects').inc(1); assert(info.fieldNodes[0].selectionSet); + // Set cache-control hints + setGQLCacheHints(info, block, gqlCacheConfig); + return indexer.getEntities( Collect, block, @@ -504,11 +583,19 @@ export const createResolvers = async (indexer: Indexer, customIndexer: CustomInd ); }, - blocks: async (_: any, { first, orderBy, orderDirection, where }: { first: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } }) => { + blocks: async ( + _: any, + { first, orderBy, orderDirection, where }: { first: number, orderBy: string, orderDirection: OrderDirection, where: { [key: string]: any } }, + __: any, + info: GraphQLResolveInfo + ) => { log('blocks', JSONbig.stringify({ first, orderBy, orderDirection, where })); gqlTotalQueryCount.inc(1); gqlQueryCount.labels('blocks').inc(1); + // Set cache-control hints + setGQLCacheHints(info, {}, gqlCacheConfig); + return indexer.getBlockEntities(where, { limit: first, orderBy, orderDirection }); }, diff --git a/packages/uni-info-watcher/src/schema.ts b/packages/uni-info-watcher/src/schema.ts index e4e8d59f..413d056e 100644 --- a/packages/uni-info-watcher/src/schema.ts +++ b/packages/uni-info-watcher/src/schema.ts @@ -5,6 +5,17 @@ import { gql } from '@apollo/client/core'; export default gql` +enum CacheControlScope { + PUBLIC + PRIVATE +} + +directive @cacheControl( + maxAge: Int + scope: CacheControlScope + inheritMaxAge: Boolean +) on FIELD_DEFINITION | OBJECT | INTERFACE | UNION + scalar BigDecimal scalar BigInt @@ -33,9 +44,9 @@ type Pool { liquidity: BigInt! sqrtPrice: BigInt! tick: BigInt - token0: Token! + token0: Token! @cacheControl(inheritMaxAge: true) token0Price: BigDecimal! - token1: Token! + token1: Token! @cacheControl(inheritMaxAge: true) token1Price: BigDecimal! totalValueLockedToken0: BigDecimal! totalValueLockedToken1: BigDecimal! @@ -67,7 +78,7 @@ type PoolDayData { tvlUSD: BigDecimal! volumeUSD: BigDecimal! feesUSD: BigDecimal! - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) liquidity: BigInt! sqrtPrice: BigInt! token0Price: BigDecimal! @@ -89,7 +100,7 @@ type PoolDayData { type PoolHourData { id: ID! periodStartUnix: Int! - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) high: BigDecimal! low: BigDecimal! open: BigDecimal! @@ -119,7 +130,7 @@ type Tick { price1: BigDecimal! tickIdx: BigInt! poolAddress: String - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) volumeToken0: BigDecimal! volumeToken1: BigDecimal! volumeUSD: BigDecimal! @@ -138,8 +149,8 @@ type Tick { type TickDayData { id: ID! date: Int! - pool: Pool! - tick: Tick! + pool: Pool! @cacheControl(inheritMaxAge: true) + tick: Tick! @cacheControl(inheritMaxAge: true) liquidityGross: BigInt! liquidityNet: BigInt! volumeToken0: BigDecimal! @@ -152,8 +163,8 @@ type TickDayData { type TickHourData { id: ID! - pool: Pool! - tick: Tick! + pool: Pool! @cacheControl(inheritMaxAge: true) + tick: Tick! @cacheControl(inheritMaxAge: true) liquidityGross: BigInt! liquidityNet: BigInt! periodStartUnix: Int! @@ -170,12 +181,12 @@ type Mint { id: ID! origin: Bytes! owner: Bytes! - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) sender: Bytes timestamp: BigInt! - transaction: Transaction! - token0: Token! - token1: Token! + transaction: Transaction! @cacheControl(inheritMaxAge: true) + token0: Token! @cacheControl(inheritMaxAge: true) + token1: Token! @cacheControl(inheritMaxAge: true) amount: BigInt! tickLower: BigInt! tickUpper: BigInt! @@ -188,11 +199,11 @@ type Swap { amountUSD: BigDecimal! id: ID! origin: Bytes! - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) timestamp: BigInt! - transaction: Transaction! - token0: Token! - token1: Token! + transaction: Transaction! @cacheControl(inheritMaxAge: true) + token0: Token! @cacheControl(inheritMaxAge: true) + token1: Token! @cacheControl(inheritMaxAge: true) sender: Bytes! recipient: Bytes! sqrtPriceX96: BigInt! @@ -207,11 +218,11 @@ type Burn { id: ID! origin: Bytes! owner: Bytes - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) timestamp: BigInt! - transaction: Transaction! - token0: Token! - token1: Token! + transaction: Transaction! @cacheControl(inheritMaxAge: true) + token0: Token! @cacheControl(inheritMaxAge: true) + token1: Token! @cacheControl(inheritMaxAge: true) amount: BigInt! tickLower: BigInt! tickUpper: BigInt! @@ -220,9 +231,9 @@ type Burn { type Collect { id: ID! - transaction: Transaction! + transaction: Transaction! @cacheControl(inheritMaxAge: true) timestamp: BigInt! - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) owner: Bytes! amount0: BigDecimal! amount1: BigDecimal! @@ -234,9 +245,9 @@ type Collect { type Flash { id: ID! - transaction: Transaction! + transaction: Transaction! @cacheControl(inheritMaxAge: true) timestamp: BigInt! - pool: Pool! + pool: Pool! @cacheControl(inheritMaxAge: true) sender: Bytes! recipient: Bytes! amount0: BigDecimal! @@ -275,10 +286,10 @@ type Factory { } type Transaction { - burns(skip: Int = 0, first: Int = 100, orderBy: Burn_orderBy, orderDirection: OrderDirection, where: Burn_filter): [Burn]! + burns(skip: Int = 0, first: Int = 100, orderBy: Burn_orderBy, orderDirection: OrderDirection, where: Burn_filter): [Burn]! @cacheControl(inheritMaxAge: true) id: ID! - mints(skip: Int = 0, first: Int = 100, orderBy: Mint_orderBy, orderDirection: OrderDirection, where: Mint_filter): [Mint]! - swaps(skip: Int = 0, first: Int = 100, orderBy: Swap_orderBy, orderDirection: OrderDirection, where: Swap_filter): [Swap]! + mints(skip: Int = 0, first: Int = 100, orderBy: Mint_orderBy, orderDirection: OrderDirection, where: Mint_filter): [Mint]! @cacheControl(inheritMaxAge: true) + swaps(skip: Int = 0, first: Int = 100, orderBy: Swap_orderBy, orderDirection: OrderDirection, where: Swap_filter): [Swap]! @cacheControl(inheritMaxAge: true) timestamp: BigInt! blockNumber: BigInt! gasUsed: BigInt! @@ -297,7 +308,7 @@ type Token { txCount: BigInt! volume: BigDecimal! volumeUSD: BigDecimal! - whitelistPools: [Pool] + whitelistPools: [Pool] @cacheControl(inheritMaxAge: true) totalSupply: BigInt! untrackedVolumeUSD: BigDecimal! poolCount: BigInt! @@ -309,7 +320,7 @@ type TokenDayData { id: ID! totalValueLockedUSD: BigDecimal! volumeUSD: BigDecimal! - token: Token! + token: Token! @cacheControl(inheritMaxAge: true) volume: BigDecimal! untrackedVolumeUSD: BigDecimal! totalValueLocked: BigDecimal! @@ -333,7 +344,7 @@ type TokenHourData { low: BigDecimal! open: BigDecimal! periodStartUnix: Int! - token: Token! + token: Token! @cacheControl(inheritMaxAge: true) volume: BigDecimal! volumeUSD: BigDecimal! untrackedVolumeUSD: BigDecimal! @@ -345,12 +356,12 @@ type TokenHourData { type Position { id: ID! - pool: Pool! - token0: Token! - token1: Token! - tickLower: Tick! - tickUpper: Tick! - transaction: Transaction! + pool: Pool! @cacheControl(inheritMaxAge: true) + token0: Token! @cacheControl(inheritMaxAge: true) + token1: Token! @cacheControl(inheritMaxAge: true) + tickLower: Tick! @cacheControl(inheritMaxAge: true) + tickUpper: Tick! @cacheControl(inheritMaxAge: true) + transaction: Transaction! @cacheControl(inheritMaxAge: true) liquidity: BigInt! depositedToken0: BigDecimal! depositedToken1: BigDecimal! @@ -376,10 +387,10 @@ type PositionSnapshot { withdrawnToken1: BigDecimal! collectedFeesToken0: BigDecimal! collectedFeesToken1: BigDecimal! - pool: Pool! - position: Position! + pool: Pool! @cacheControl(inheritMaxAge: true) + position: Position! @cacheControl(inheritMaxAge: true) blockNumber: BigInt! - transaction: Transaction! + transaction: Transaction! @cacheControl(inheritMaxAge: true) } type Block { diff --git a/packages/uni-info-watcher/src/server.ts b/packages/uni-info-watcher/src/server.ts index 49bb29d1..df42064a 100644 --- a/packages/uni-info-watcher/src/server.ts +++ b/packages/uni-info-watcher/src/server.ts @@ -5,7 +5,14 @@ import assert from 'assert'; import 'reflect-metadata'; import express, { Application } from 'express'; -import { ApolloServer, PubSub } from 'apollo-server-express'; +import { ApolloServer } from 'apollo-server-express'; +import WebSocket from 'ws'; +import { makeExecutableSchema } from '@graphql-tools/schema'; +import { useServer } from 'graphql-ws/lib/use/ws'; +import { ApolloServerPluginDrainHttpServer } from 'apollo-server-core'; +import { PubSub } from 'graphql-subscriptions'; +import responseCachePlugin from 'apollo-server-plugin-response-cache'; +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; @@ -15,7 +22,7 @@ import queue from 'express-queue'; import { Client as ERC20Client } from '@vulcanize/erc20-watcher'; import { Client as UniClient } from '@vulcanize/uni-watcher'; -import { DEFAULT_CONFIG_PATH } from '@cerc-io/util'; +import { DEFAULT_CONFIG_PATH, DEFAULT_MAX_GQL_CACHE_SIZE } from '@cerc-io/util'; import { getConfig, getCustomProvider, JobQueue, startGQLMetricsServer } from '@vulcanize/util'; import { getCache } from '@vulcanize/cache'; @@ -47,7 +54,7 @@ export const main = async (): Promise => { assert(config.server, 'Missing server config'); - const { host, port, maxSimultaneousRequests, maxRequestQueueLimit } = config.server; + const { host, port, maxSimultaneousRequests, maxRequestQueueLimit, gqlCache: gqlCacheConfig } = config.server; const { upstream, database: dbConfig, jobQueue: jobQueueConfig } = config; @@ -98,22 +105,51 @@ export const main = async (): Promise => { const customIndexer = new CustomIndexer(config, db, indexer); const resolvers = process.env.MOCK ? await createMockResolvers() : await createResolvers(indexer, customIndexer, eventWatcher); + // Create an Express app and HTTP server const app: Application = express(); app.use(queue({ activeLimit: maxSimultaneousRequests || 1, queuedLimit: maxRequestQueueLimit || -1 })); + const httpServer = createServer(app); - const server = new ApolloServer({ - typeDefs, - resolvers + // Create the schema + const schema = makeExecutableSchema({ typeDefs, resolvers }); + + // Create our WebSocket server using the HTTP server we just set up. + const wsServer = new WebSocket.Server({ + server: httpServer, + path: '/graphql' }); + const serverCleanup = useServer({ schema }, wsServer); + + let gqlCache; + if (gqlCacheConfig && gqlCacheConfig.enabled) { + const maxSize = gqlCacheConfig.maxCacheSize ? gqlCacheConfig.maxCacheSize : DEFAULT_MAX_GQL_CACHE_SIZE; + gqlCache = new InMemoryLRUCache({ maxSize }); + } + const server = new ApolloServer({ + schema, + csrfPrevention: true, + cache: gqlCache, + plugins: [ + // Proper shutdown for the HTTP server + ApolloServerPluginDrainHttpServer({ httpServer }), + // Proper shutdown for the WebSocket server + { + async serverWillStart () { + return { + async drainServer () { + await serverCleanup.dispose(); + } + }; + } + }, + responseCachePlugin()] + }); await server.start(); server.applyMiddleware({ app }); - const httpServer = createServer(app); - server.installSubscriptionHandlers(httpServer); - httpServer.listen(port, host, () => { - log(`Server is listening on host ${host} port ${port}`); + log(`Server is listening on ${host}:${port}${server.graphqlPath}`); }); await startGQLMetricsServer(config); diff --git a/packages/uni-watcher/package.json b/packages/uni-watcher/package.json index 1e0ce476..c4d4e714 100644 --- a/packages/uni-watcher/package.json +++ b/packages/uni-watcher/package.json @@ -49,6 +49,7 @@ "express": "^4.17.1", "graphql-import-node": "^0.0.4", "graphql-request": "^3.4.0", + "graphql-subscriptions": "^2.0.0", "json-bigint": "^1.0.0", "lodash": "^4.17.21", "reflect-metadata": "^0.1.13", diff --git a/packages/uni-watcher/src/events.ts b/packages/uni-watcher/src/events.ts index 9ec92142..0dd6c811 100644 --- a/packages/uni-watcher/src/events.ts +++ b/packages/uni-watcher/src/events.ts @@ -4,7 +4,7 @@ import assert from 'assert'; import debug from 'debug'; -import { PubSub } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import { EthClient } from '@vulcanize/ipld-eth-client'; import { QUEUE_BLOCK_PROCESSING, QUEUE_EVENT_PROCESSING, UNKNOWN_EVENT_NAME } from '@cerc-io/util'; diff --git a/packages/uni-watcher/src/fill.ts b/packages/uni-watcher/src/fill.ts index 581328ba..675b3ecf 100644 --- a/packages/uni-watcher/src/fill.ts +++ b/packages/uni-watcher/src/fill.ts @@ -7,7 +7,7 @@ import 'reflect-metadata'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; -import { PubSub } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import { getCache } from '@vulcanize/cache'; import { EthClient } from '@cerc-io/ipld-eth-client'; diff --git a/packages/uni-watcher/src/server.ts b/packages/uni-watcher/src/server.ts index ff4afe2f..110531cd 100644 --- a/packages/uni-watcher/src/server.ts +++ b/packages/uni-watcher/src/server.ts @@ -5,7 +5,8 @@ import assert from 'assert'; import 'reflect-metadata'; import express, { Application } from 'express'; -import { ApolloServer, PubSub } from 'apollo-server-express'; +import { ApolloServer } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import debug from 'debug'; diff --git a/packages/util/package.json b/packages/util/package.json index 1d24b860..d6fd88de 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -11,6 +11,7 @@ "ethers": "^5.2.0", "express": "^4.17.1", "fs-extra": "^10.0.0", + "graphql-subscriptions": "^2.0.0", "lodash": "^4.17.21", "node-fetch": "2", "pg-boss": "^6.1.0", diff --git a/packages/util/src/events.ts b/packages/util/src/events.ts index 1f6e2556..a018919f 100644 --- a/packages/util/src/events.ts +++ b/packages/util/src/events.ts @@ -4,7 +4,7 @@ import assert from 'assert'; import debug from 'debug'; -import { PubSub } from 'apollo-server-express'; +import { PubSub } from 'graphql-subscriptions'; import { EthClient } from '@vulcanize/ipld-eth-client'; import { diff --git a/yarn.lock b/yarn.lock index 54868189..77c3ab47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,11 +40,87 @@ "@types/node" "^10.1.0" long "^4.0.0" +"@apollo/protobufjs@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.6.tgz#d601e65211e06ae1432bf5993a1a0105f2862f27" + integrity sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@apollo/utils.dropunuseddefinitions@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz#02b04006442eaf037f4c4624146b12775d70d929" + integrity sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg== + +"@apollo/utils.keyvaluecache@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz#46f310f859067efe9fa126156c6954f8381080d2" + integrity sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA== + dependencies: + "@apollo/utils.logger" "^1.0.0" + lru-cache "^7.10.1" + +"@apollo/utils.logger@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-1.0.1.tgz#aea0d1bb7ceb237f506c6bbf38f10a555b99a695" + integrity sha512-XdlzoY7fYNK4OIcvMD2G94RoFZbzTQaNP0jozmqqMudmaGo2I/2Jx71xlDJ801mWA/mbYRihyaw6KJii7k5RVA== + +"@apollo/utils.printwithreducedwhitespace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz#c466299a4766eef8577a2a64c8f27712e8bd7e30" + integrity sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q== + +"@apollo/utils.removealiases@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz#75f6d83098af1fcae2d3beb4f515ad4a8452a8c1" + integrity sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A== + +"@apollo/utils.sortast@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz#93218c7008daf3e2a0725196085a33f5aab5ad07" + integrity sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA== + dependencies: + lodash.sortby "^4.7.0" + +"@apollo/utils.stripsensitiveliterals@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz#4920651f36beee8e260e12031a0c5863ad0c7b28" + integrity sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w== + +"@apollo/utils.usagereporting@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.0.tgz#b81df180f4ca78b91a22cb49105174a7f070db1e" + integrity sha512-5PL7hJMkTPmdo3oxPtigRrIyPxDk/ddrUryHPDaezL1lSFExpNzsDd2f1j0XJoHOg350GRd3LyD64caLA2PU1w== + dependencies: + "@apollo/utils.dropunuseddefinitions" "^1.1.0" + "@apollo/utils.printwithreducedwhitespace" "^1.1.0" + "@apollo/utils.removealiases" "1.0.0" + "@apollo/utils.sortast" "^1.1.0" + "@apollo/utils.stripsensitiveliterals" "^1.2.0" + apollo-reporting-protobuf "^3.3.1" + "@apollographql/apollo-tools@^0.5.0": version "0.5.1" resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz#f0baef739ff7e2fafcb8b98ad29f6ac817e53e32" integrity sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA== +"@apollographql/apollo-tools@^0.5.3": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz#cb3998c6cf12e494b90c733f44dd9935e2d8196c" + integrity sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw== + "@apollographql/graphql-playground-html@1.6.27": version "1.6.27" resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz#bc9ab60e9445aa2a8813b4e94f152fa72b756335" @@ -52,6 +128,13 @@ dependencies: xss "^1.0.8" +"@apollographql/graphql-playground-html@1.6.29": + version "1.6.29" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" + integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== + dependencies: + xss "^1.0.8" + "@apollographql/graphql-upload-8-fork@^8.1.3": version "8.1.3" resolved "https://registry.yarnpkg.com/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz#a0d4e0d5cec8e126d78bd915c264d6b90f5784bc" @@ -642,6 +725,91 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@graphql-tools/merge@8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" + integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== + dependencies: + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + +"@graphql-tools/merge@8.3.11": + version "8.3.11" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.11.tgz#f5eab764e8d7032c1b7e32d5dc6dea5b2f5bb21e" + integrity sha512-IpZh8r8e8FycXaUv04xe5HQH9siD1tkS8MvaO8Wb2FaPXv15XSYP+Wsb2MUStpIqGfQxa6xY/+eEuxv+VqwXyg== + dependencies: + "@graphql-tools/utils" "9.1.0" + tslib "^2.4.0" + +"@graphql-tools/merge@8.3.12": + version "8.3.12" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.12.tgz#e3f2e5d8a7b34fb689cda66799d845cbc919e464" + integrity sha512-BFL8r4+FrqecPnIW0H8UJCBRQ4Y8Ep60aujw9c/sQuFmQTiqgWgpphswMGfaosP2zUinDE3ojU5wwcS2IJnumA== + dependencies: + "@graphql-tools/utils" "9.1.1" + tslib "^2.4.0" + +"@graphql-tools/mock@^8.1.2": + version "8.7.11" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.11.tgz#6471b4221c3d8e6a29517811dac6b785f849846e" + integrity sha512-4AAQvqRo6xglcBNOS52UQVaP8J4FAu8WPekB4s7zMp5PDHmx8wYVKYfXQ5fLVGxhBt740bL3IMykMFocsP/4EA== + dependencies: + "@graphql-tools/schema" "9.0.9" + "@graphql-tools/utils" "9.1.0" + fast-json-stable-stringify "^2.1.0" + tslib "^2.4.0" + +"@graphql-tools/schema@9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.9.tgz#aa24869a2231039dcd9b6b882a5c5cb186d1116e" + integrity sha512-hwg8trUytO5ayQ8bzL3+sAyXcu2rhKt5pLXpLO0/TMTN2nXd3DBO4mqx+Ra4Er2mE/msInGQ5EmZbxVBPv+hSg== + dependencies: + "@graphql-tools/merge" "8.3.11" + "@graphql-tools/utils" "9.1.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/schema@^8.0.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" + integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== + dependencies: + "@graphql-tools/merge" "8.3.1" + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/schema@^9.0.10": + version "9.0.10" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.10.tgz#77ba3dfab241f0232dc0d3ba03201663b63714e2" + integrity sha512-lV0o4df9SpPiaeeDAzgdCJ2o2N9Wvsp0SMHlF2qDbh9aFCFQRsXuksgiDm2yTgT3TG5OtUes/t0D6uPjPZFUbQ== + dependencies: + "@graphql-tools/merge" "8.3.12" + "@graphql-tools/utils" "9.1.1" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/utils@8.9.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" + integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/utils@9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.1.0.tgz#c33893e0aa9cbd3760d94f1771477e722adb4e54" + integrity sha512-4Ketxo98IwKA/56LP6cI6PgQBwUCujszQcTNkzjq7liJPa2mLjKnmVOJ0bauMwKcEazeYuZagceljb0POmEGvQ== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/utils@9.1.1": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.1.1.tgz#b47ea8f0d18c038c5c1c429e72caa5c25039fbab" + integrity sha512-DXKLIEDbihK24fktR2hwp/BNIVwULIHaSTNTNhXS+19vgT50eX9wndx1bPxGwHnVBOONcwjXy0roQac49vdt/w== + dependencies: + tslib "^2.4.0" + "@graphql-typed-document-node/core@^3.0.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" @@ -1765,6 +1933,14 @@ "@types/connect" "*" "@types/node" "*" +"@types/body-parser@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/chai@*", "@types/chai@^4.2.18": version "4.2.18" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" @@ -1802,6 +1978,11 @@ resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4" integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ== +"@types/cors@2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + "@types/debug@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" @@ -1829,6 +2010,15 @@ "@types/qs" "*" "@types/range-parser" "*" +"@types/express-serve-static-core@4.17.31": + version "4.17.31" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" + integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/express-serve-static-core@^4.17.18": version "4.17.20" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.20.tgz#44caee029f2c26c46711da5e845cdc12167ad72d" @@ -1858,6 +2048,16 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@4.17.14": + version "4.17.14" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" + integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/fs-capacitor@*": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" @@ -2525,6 +2725,14 @@ apollo-datasource@^0.9.0: apollo-server-caching "^0.7.0" apollo-server-env "^3.1.0" +apollo-datasource@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" + integrity sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + apollo-server-env "^4.2.1" + apollo-graphql@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.9.3.tgz#1ca6f625322ae10a66f57a39642849a07a7a5dc9" @@ -2551,6 +2759,13 @@ apollo-reporting-protobuf@^0.8.0: dependencies: "@apollo/protobufjs" "1.2.2" +apollo-reporting-protobuf@^3.3.1, apollo-reporting-protobuf@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.3.tgz#df2b7ff73422cd682af3f1805d32301aefdd9e89" + integrity sha512-L3+DdClhLMaRZWVmMbBcwl4Ic77CnEBPXLW53F7hkYhkaZD88ivbCVB1w/x5gunO6ZHrdzhjq0FHmTsBvPo7aQ== + dependencies: + "@apollo/protobufjs" "1.2.6" + apollo-server-caching@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz#e6d1e68e3bb571cba63a61f60b434fb771c6ff39" @@ -2589,6 +2804,35 @@ apollo-server-core@^2.25.1: subscriptions-transport-ws "^0.9.19" uuid "^8.0.0" +apollo-server-core@^3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.11.1.tgz#89d83aeaa71a59f760ebfa35bb0cbd31e15474ca" + integrity sha512-t/eCKrRFK1lYZlc5pHD99iG7Np7CEm3SmbDiONA7fckR3EaB/pdsEdIkIwQ5QBBpT5JLp/nwvrZRVwhaWmaRvw== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + "@apollo/utils.logger" "^1.0.0" + "@apollo/utils.usagereporting" "^1.0.0" + "@apollographql/apollo-tools" "^0.5.3" + "@apollographql/graphql-playground-html" "1.6.29" + "@graphql-tools/mock" "^8.1.2" + "@graphql-tools/schema" "^8.0.0" + "@josephg/resolvable" "^1.0.0" + apollo-datasource "^3.3.2" + apollo-reporting-protobuf "^3.3.3" + apollo-server-env "^4.2.1" + apollo-server-errors "^3.3.1" + apollo-server-plugin-base "^3.7.1" + apollo-server-types "^3.7.1" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.1.0" + graphql-tag "^2.11.0" + loglevel "^1.6.8" + lru-cache "^6.0.0" + node-abort-controller "^3.0.1" + sha.js "^2.4.11" + uuid "^9.0.0" + whatwg-mimetype "^3.0.0" + apollo-server-env@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.1.0.tgz#0733c2ef50aea596cc90cf40a53f6ea2ad402cd0" @@ -2597,11 +2841,23 @@ apollo-server-env@^3.1.0: node-fetch "^2.6.1" util.promisify "^1.0.0" +apollo-server-env@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" + integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== + dependencies: + node-fetch "^2.6.7" + apollo-server-errors@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz#5d1024117c7496a2979e3e34908b5685fe112b68" integrity sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA== +apollo-server-errors@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" + integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== + apollo-server-express@^2.25.0: version "2.25.1" resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.25.1.tgz#d02914cb348819b08c7a476cd012b6731c3fb5d2" @@ -2625,6 +2881,23 @@ apollo-server-express@^2.25.0: subscriptions-transport-ws "^0.9.19" type-is "^1.6.16" +apollo-server-express@^3.11.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.11.1.tgz#f46d2f2f8db3d99ede6c0c144fea02f24b73cb78" + integrity sha512-x9ngcpXbBlt4naCXTwNtBFb/mOd9OU0wtFXvJkObHF26NsRazu3DxDfEuekA6V1NFOocD+A9jmVMQeQWug5MgA== + dependencies: + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.19.2" + "@types/cors" "2.8.12" + "@types/express" "4.17.14" + "@types/express-serve-static-core" "4.17.31" + accepts "^1.3.5" + apollo-server-core "^3.11.1" + apollo-server-types "^3.7.1" + body-parser "^1.19.0" + cors "^2.8.5" + parseurl "^1.3.3" + apollo-server-plugin-base@^0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz#3f85751a420d3c4625355b6cb3fbdd2acbe71f13" @@ -2632,6 +2905,22 @@ apollo-server-plugin-base@^0.13.0: dependencies: apollo-server-types "^0.9.0" +apollo-server-plugin-base@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.1.tgz#aa78ef49bd114e35906ca9cf7493fed2664cbde8" + integrity sha512-g3vJStmQtQvjGI289UkLMfThmOEOddpVgHLHT2bNj0sCD/bbisj4xKbBHETqaURokteqSWyyd4RDTUe0wAUDNQ== + dependencies: + apollo-server-types "^3.7.1" + +apollo-server-plugin-response-cache@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-response-cache/-/apollo-server-plugin-response-cache-3.8.1.tgz#2d9559fe9951812dcda77fc2658422028f060af8" + integrity sha512-c6bkrZjzX8Ac44CF7a4m9ans2QFV2C0XVUUDnuSWAX3G9ZWbs55NC+H3YtcFhAPoX7gv92RAu88ipMahd8NiUQ== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + apollo-server-plugin-base "^3.7.1" + apollo-server-types "^3.7.1" + apollo-server-types@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.9.0.tgz#ccf550b33b07c48c72f104fbe2876232b404848b" @@ -2641,6 +2930,16 @@ apollo-server-types@^0.9.0: apollo-server-caching "^0.7.0" apollo-server-env "^3.1.0" +apollo-server-types@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.7.1.tgz#87adfcb52ec0893999a9cfafd5474bfda7ab0798" + integrity sha512-aE9RDVplmkaOj/OduNmGa+0a1B5RIWI0o3zC1zLvBTVWMKTpo0ifVf11TyMkLCY+T7cnZqVqwyShziOyC3FyUw== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + "@apollo/utils.logger" "^1.0.0" + apollo-reporting-protobuf "^3.3.3" + apollo-server-env "^4.2.1" + apollo-tracing@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.15.0.tgz#237fbbbf669aee4370b7e9081b685eabaa8ce84a" @@ -2947,6 +3246,24 @@ body-parser@1.19.0, body-parser@^1.18.3: raw-body "2.4.0" type-is "~1.6.17" +body-parser@^1.19.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + boxen@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" @@ -3079,6 +3396,11 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + cacache@^15.0.5, cacache@^15.2.0: version "15.2.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" @@ -3974,6 +4296,11 @@ depcheck@^1.4.2: semver "^7.3.2" yargs "^16.1.0" +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3994,6 +4321,11 @@ deps-regex@^0.1.4: resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" integrity sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -4735,7 +5067,7 @@ fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5313,6 +5645,13 @@ graphql-subscriptions@^1.0.0: dependencies: iterall "^1.3.0" +graphql-subscriptions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz#11ec181d475852d8aec879183e8e1eb94f2eb79a" + integrity sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA== + dependencies: + iterall "^1.3.0" + graphql-tag@^2.11.0, graphql-tag@^2.12.0: version "2.12.4" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.4.tgz#d34066688a4f09e72d6f4663c74211e9b4b7c4bf" @@ -5331,6 +5670,11 @@ graphql-tools@^4.0.8: iterall "^1.1.3" uuid "^3.1.0" +graphql-ws@^5.11.2: + version "5.11.2" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.11.2.tgz#d5e0acae8b4d4a4cf7be410a24135cfcefd7ddc0" + integrity sha512-4EiZ3/UXYcjm+xFGP544/yW1+DVI8ZpKASFbzrV5EDTFWJp0ZvLl4Dy2fSZAzz9imKp5pZMIcjB0x/H69Pv/6w== + graphql@^14.0.2: version "14.7.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72" @@ -5565,6 +5909,17 @@ http-errors@1.7.3, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-errors@^1.7.3: version "1.8.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" @@ -6621,6 +6976,11 @@ loglevel@^1.6.7: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== +loglevel@^1.6.8: + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -6665,6 +7025,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.10.1: + version "7.14.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" + integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -7211,6 +7576,11 @@ neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +node-abort-controller@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e" + integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw== + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -7224,7 +7594,7 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@2: +node-fetch@2, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -7542,6 +7912,13 @@ obliterator@^1.6.1: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -7833,7 +8210,7 @@ parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parseurl@^1.3.2, parseurl@~1.3.3: +parseurl@^1.3.2, parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -8285,6 +8662,13 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -8351,6 +8735,16 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + raw-body@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" @@ -9116,6 +9510,11 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -9511,6 +9910,11 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + toml@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" @@ -9613,6 +10017,11 @@ tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" @@ -9891,6 +10300,11 @@ uuid@^8.0.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -9911,6 +10325,11 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +value-or-promise@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" + integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -9942,6 +10361,11 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"