@iota-big3/sdk-gateway
Version:
Universal API Gateway with protocol translation, intelligent routing, rate limiting, health checking, and caching
243 lines • 8.7 kB
TypeScript
/**
* Common Type Definitions
* Shared types to eliminate 'any' usage across the SDK
*/
import { NextFunction, Request, Response } from 'express';
/**
* Express Request with typed body and user
*/
export interface TypedRequest<TBody = unknown, TQuery = Record<string, unknown>, TParams = Record<string, string>> extends Request {
body: TBody;
query: TQuery & Request['query'];
params: TParams & Request['params'];
user?: AuthUser;
correlationId?: string;
span?: TracingSpan;
featureFlags?: FeatureFlagClient;
}
/**
* Express Response with typed json method
*/
export interface TypedResponse<TData = unknown> extends Response {
json: (data: TData) => this;
}
/**
* Express middleware signature
*/
export type ExpressMiddleware = (req: Request, res: Response, next: NextFunction) => void | Promise<void>;
/**
* Typed Express middleware
*/
export type TypedMiddleware<TReq = Request, TRes = Response> = (req: TReq, res: TRes, next: NextFunction) => void | Promise<void>;
export interface AuthUser {
id: string;
email?: string;
name?: string;
roles?: string[];
permissions?: string[];
organizationId?: string;
metadata?: Record<string, unknown>;
}
export interface RedisClient {
get(key: string): Promise<string | null>;
set(key: string, value: string, mode?: 'EX' | 'PX', duration?: number): Promise<string | null>;
setex(key: string, seconds: number, value: string): Promise<string>;
psetex(key: string, milliseconds: number, value: string): Promise<string>;
del(key: string | string[]): Promise<number>;
exists(key: string | string[]): Promise<number>;
expire(key: string, seconds: number): Promise<number>;
ttl(key: string): Promise<number>;
pttl(key: string): Promise<number>;
incr(key: string): Promise<number>;
decr(key: string): Promise<number>;
incrby(key: string, increment: number): Promise<number>;
decrby(key: string, decrement: number): Promise<number>;
hget(key: string, field: string): Promise<string | null>;
hset(key: string, field: string, value: string): Promise<number>;
hdel(key: string, field: string | string[]): Promise<number>;
hgetall(key: string): Promise<Record<string, string>>;
lpush(key: string, ...values: string[]): Promise<number>;
rpush(key: string, ...values: string[]): Promise<number>;
lpop(key: string): Promise<string | null>;
rpop(key: string): Promise<string | null>;
llen(key: string): Promise<number>;
sadd(key: string, ...members: string[]): Promise<number>;
srem(key: string, ...members: string[]): Promise<number>;
smembers(key: string): Promise<string[]>;
sismember(key: string, member: string): Promise<number>;
zadd(key: string, score: number, member: string): Promise<number>;
zrem(key: string, member: string | string[]): Promise<number>;
zrange(key: string, start: number, stop: number, withScores?: 'WITHSCORES'): Promise<string[]>;
zrevrange(key: string, start: number, stop: number, withScores?: 'WITHSCORES'): Promise<string[]>;
zcard(key: string): Promise<number>;
zremrangebyscore(key: string, min: string | number, max: string | number): Promise<number>;
keys(pattern: string): Promise<string[]>;
scan(cursor: string, options?: {
match?: string;
count?: number;
}): Promise<[string, string[]]>;
mget(...keys: string[]): Promise<(string | null)[]>;
mset(...keysAndValues: string[]): Promise<string>;
multi(): RedisMulti;
pipeline(): RedisPipeline;
subscribe(channel: string | string[]): Promise<void>;
unsubscribe(channel: string | string[]): Promise<void>;
publish(channel: string, message: string): Promise<number>;
connect(): Promise<void>;
disconnect(): Promise<void>;
quit(): Promise<void>;
on(event: string, listener: (...args: unknown[]) => void): this;
off(event: string, listener: (...args: unknown[]) => void): this;
}
export interface RedisMulti {
get(key: string): RedisMulti;
set(key: string, value: string): RedisMulti;
del(key: string | string[]): RedisMulti;
incr(key: string): RedisMulti;
incrby(key: string, increment: number): RedisMulti;
expire(key: string, seconds: number): RedisMulti;
pexpire(key: string, milliseconds: number): RedisMulti;
ttl(key: string): RedisMulti;
pttl(key: string): RedisMulti;
zadd(key: string, score: number, member: string): RedisMulti;
zrem(key: string, member: string): RedisMulti;
zremrangebyscore(key: string, min: string | number, max: string | number): RedisMulti;
exec(): Promise<unknown[]>;
}
export interface RedisPipeline {
get(key: string): RedisPipeline;
set(key: string, value: string, mode?: 'EX', duration?: number): RedisPipeline;
setex(key: string, seconds: number, value: string): RedisPipeline;
del(key: string | string[]): RedisPipeline;
expire(key: string, seconds: number): RedisPipeline;
exec(): Promise<unknown[]>;
}
/**
* Class decorator
*/
export type ClassDecorator<T = unknown> = (target: new (...args: unknown[]) => T) => void;
/**
* Method decorator
*/
export type MethodDecorator = (target: unknown, propertyKey: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor | void;
/**
* Property decorator
*/
export type PropertyDecorator = (target: unknown, propertyKey: string | symbol) => void;
/**
* Parameter decorator
*/
export type ParameterDecorator = (target: unknown, propertyKey: string | symbol, parameterIndex: number) => void;
export interface CacheEntry<T = unknown> {
value: T;
ttl?: number;
metadata?: Record<string, unknown>;
}
export interface CacheSerializer {
serialize(value: unknown): string | Buffer;
deserialize(data: string | Buffer): unknown;
}
export interface FeatureFlagClient {
isEnabled(flag: string, userId?: string, attributes?: Record<string, unknown>): Promise<boolean>;
getVariant(flag: string, userId?: string, attributes?: Record<string, unknown>): Promise<string>;
}
export interface FeatureFlagConfig {
enabled: boolean;
percentage?: number;
userOverrides?: string[];
groupOverrides?: string[];
metadata?: Record<string, unknown>;
variants?: Array<{
name: string;
weight: number;
metadata?: Record<string, unknown>;
}>;
}
export interface TracingSpan {
end(): void;
setAttributes(attributes: Record<string, unknown>): void;
setStatus(status: {
code: number;
message?: string;
}): void;
addEvent(name: string, attributes?: Record<string, unknown>): void;
}
export interface TracingContext {
traceparent?: string;
tracestate?: string;
}
export interface DomainEvent<T = unknown> {
id: string;
type: string;
streamId: string;
version: number;
data: T;
metadata?: Record<string, unknown>;
timestamp: Date;
correlationId?: string;
causationId?: string;
}
export interface ErrorDetails {
code: string;
message: string;
details?: unknown;
stack?: string;
cause?: Error;
}
export interface CircuitBreakerStats {
state: 'CLOSED' | 'OPEN' | 'HALF_OPEN';
failures: number;
successes: number;
lastFailureTime?: Date;
nextRetryTime?: Date;
}
export interface RateLimitResult {
allowed: boolean;
remaining: number;
resetAt: Date;
retryAfter?: number;
}
/**
* Deep partial type
*/
export type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
/**
* Async function type
*/
export type AsyncFunction<TArgs extends unknown[] = unknown[], TReturn = unknown> = (...args: TArgs) => Promise<TReturn>;
/**
* Sync function type
*/
export type SyncFunction<TArgs extends unknown[] = unknown[], TReturn = unknown> = (...args: TArgs) => TReturn;
/**
* Any function type
*/
export type AnyFunction<TArgs extends unknown[] = unknown[], TReturn = unknown> = SyncFunction<TArgs, TReturn> | AsyncFunction<TArgs, TReturn>;
/**
* Constructor type
*/
export type Constructor<T = unknown> = new (...args: unknown[]) => T;
/**
* Key-value object
*/
export type KeyValue<T = unknown> = Record<string, T>;
/**
* JSON serializable types
*/
export type JsonPrimitive = string | number | boolean | null;
export type JsonObject = {
[key: string]: JsonValue;
};
export type JsonArray = JsonValue[];
export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
/**
* Extract promise type
*/
export type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
/**
* Make specific keys optional
*/
export type OptionalKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
//# sourceMappingURL=common.d.ts.map