/// import { CancelTokenSource } from 'axios'; import DataLoader from 'dataloader'; import { GraphQLFieldConfig, GraphQLFieldResolver, GraphQLScalarType } from 'graphql'; import { SchemaDirectiveVisitor } from 'graphql-tools'; import { ParameterizedContext } from 'koa'; import { Middleware } from 'koa-compose'; import { Span, Tracer } from 'opentracing'; import { ParsedUrlQuery } from 'querystring'; import { ClientsImplementation, IOClients } from '../../../clients/IOClients'; import { InstanceOptions } from '../../../HttpClient'; import { IUserLandTracer } from '../../../tracing/UserLandTracer'; import { BindingHeader } from '../../../utils/binding'; import { IOMessage } from '../../../utils/message'; import { TenantHeader } from '../../../utils/tenant'; import { Logger } from '../../logger'; import { MetricsLogger } from '../../logger/metricsLogger'; import { MessagesLoaderV2 } from './graphql/schema/messagesLoaderV2'; import { Recorder } from './utils/recorder'; type ServerTiming = Record; export type Maybe = T | null | undefined; export interface TracingContext { tracer: Tracer; currentSpan: Span | undefined; } export interface Context { clients: T; vtex: IOContext; timings: Record; metrics: Record; previousTimerStart: [number, number]; requestHandlerName?: string; serverTiming?: ServerTiming; tracing?: TracingContext; } export interface EventContext { clients: T; state: StateT; vtex: IOContext; body: any; timings: Record; metrics: Record; key: string; sender: string; subject: string; } type KnownKeys = { [K in keyof T]: string extends K ? never : number extends K ? never : K; } extends { [_ in keyof T]: infer U; } ? U : never; interface Loaders { messages?: DataLoader; messagesV2?: MessagesLoaderV2; immutableMessagesV2?: MessagesLoaderV2; } export type ServiceContext = Pick>, KnownKeys>>> & CustomT & { loaders?: Loaders; }; export type RouteHandler = Middleware>; export type EventHandler = Middleware>; export type Resolver = GraphQLFieldResolver, any> | GraphQLFieldConfig, any>; export type Handler = RouteHandler; export interface HttpRoute { handler: RouteHandler; path: string; } export interface RecorderState { recorder: Recorder; body: any; } export interface ParamsContext { params: any; metricsLogger: MetricsLogger; } export interface ClientsConfig { implementation?: ClientsImplementation; options: Record; } export interface GraphQLOptions { resolvers: Record> | GraphQLScalarType>; schema?: string; schemaDirectives?: Record; } export interface ServiceConfig { clients?: ClientsConfig; events?: Record | Array>>; graphql?: GraphQLOptions; routes?: Record | Array>>; } export interface Cancellation { cancelable: boolean; cancelled: boolean; source: CancelTokenSource; } export interface IOContext { account: string; platform: string; authToken: string; adminUserAuthToken?: string; storeUserAuthToken?: string; locale?: string; production: boolean; product: string; recorder?: Recorder; region: string; route: { declarer?: string; id: string; params: ParsedUrlQuery; type: 'public' | 'private' | 'event'; }; userAgent: string; workspace: string; segmentToken?: string; sessionToken?: string; requestId: string; operationId: string; janusEnv?: JanusEnv; serverTiming?: ServerTiming; logger: Logger; eventInfo?: EventBody; host?: string; tenant?: TenantHeader; binding?: BindingHeader; cancellation?: Cancellation; settings?: any; tracer: IUserLandTracer; } export interface EventBody { sender: string; subject: string; key: string; } export type RouteSettingsType = 'pure' | 'workspace' | 'userAndWorkspace'; export interface ServiceRoute { path: string; public?: boolean; smartcache?: boolean; extensible?: boolean; settingsType?: RouteSettingsType; rateLimitPerReplica?: RateLimitOptions; } export interface ServiceEvent { keys?: string[]; sender?: string; subject?: string; settingsType?: RouteSettingsType; rateLimitPerReplica?: RateLimitOptions; } export interface RateLimitOptions { perMinute?: number; concurrent?: number; } export interface RawServiceJSON { stack: 'nodejs'; memory: number; ttl?: number; timeout?: number; runtimeArgs?: string[]; routes?: Record; rateLimitPerReplica?: RateLimitOptions; events?: Record; minReplicas?: number; maxReplicas?: number; workers?: number; deterministicVary?: boolean; } export interface ServiceJSON extends RawServiceJSON { workers: number; } export type JanusEnv = string; export {};