///
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 {};