///
import { Type } from '@nestjs/common';
import { ConnectionOptions } from 'tls';
import { Transport } from '../enums/transport.enum';
import { ChannelOptions } from '../external/grpc-options.interface';
import { ConsumerConfig, ConsumerRunConfig, ConsumerSubscribeTopics, KafkaConfig, ProducerConfig, ProducerRecord } from '../external/kafka.interface';
import { MqttClientOptions, QoS } from '../external/mqtt-options.interface';
import { IORedisOptions } from '../external/redis.interface';
import { RmqUrl } from '../external/rmq-url.interface';
import { TcpSocket } from '../helpers';
import { CustomTransportStrategy } from './custom-transport-strategy.interface';
import { Deserializer } from './deserializer.interface';
import { Serializer } from './serializer.interface';
export type MicroserviceOptions = GrpcOptions | TcpOptions | RedisOptions | NatsOptions | MqttOptions | RmqOptions | KafkaOptions | CustomStrategy;
/**
* @publicApi
*/
export interface CustomStrategy {
strategy: CustomTransportStrategy;
options?: {};
}
/**
* @publicApi
*/
export interface GrpcOptions {
transport?: Transport.GRPC;
options: {
url?: string;
maxSendMessageLength?: number;
maxReceiveMessageLength?: number;
maxMetadataSize?: number;
keepalive?: {
keepaliveTimeMs?: number;
keepaliveTimeoutMs?: number;
keepalivePermitWithoutCalls?: number;
http2MaxPingsWithoutData?: number;
http2MinTimeBetweenPingsMs?: number;
http2MinPingIntervalWithoutDataMs?: number;
http2MaxPingStrikes?: number;
};
channelOptions?: ChannelOptions;
credentials?: any;
protoPath: string | string[];
package: string | string[];
protoLoader?: string;
packageDefinition?: any;
gracefulShutdown?: boolean;
loader?: {
keepCase?: boolean;
alternateCommentMode?: boolean;
longs?: Function;
enums?: Function;
bytes?: Function;
defaults?: boolean;
arrays?: boolean;
objects?: boolean;
oneofs?: boolean;
json?: boolean;
includeDirs?: string[];
};
};
}
/**
* @publicApi
*/
export interface TcpOptions {
transport?: Transport.TCP;
options?: {
host?: string;
port?: number;
retryAttempts?: number;
retryDelay?: number;
serializer?: Serializer;
tlsOptions?: ConnectionOptions;
deserializer?: Deserializer;
socketClass?: Type;
};
}
/**
* @publicApi
*/
export interface RedisOptions {
transport?: Transport.REDIS;
options?: {
host?: string;
port?: number;
retryAttempts?: number;
retryDelay?: number;
/**
* Use `psubscribe`/`pmessage` to enable wildcards in the patterns
*/
wildcards?: boolean;
serializer?: Serializer;
deserializer?: Deserializer;
} & IORedisOptions;
}
/**
* @publicApi
*/
export interface MqttOptions {
transport?: Transport.MQTT;
options?: MqttClientOptions & {
url?: string;
serializer?: Serializer;
deserializer?: Deserializer;
subscribeOptions?: {
/**
* The QoS
*/
qos: QoS;
nl?: boolean;
rap?: boolean;
rh?: number;
};
userProperties?: Record;
};
}
/**
* @publicApi
*/
export interface NatsOptions {
transport?: Transport.NATS;
options?: {
headers?: Record;
authenticator?: any;
debug?: boolean;
ignoreClusterUpdates?: boolean;
inboxPrefix?: string;
encoding?: string;
name?: string;
user?: string;
pass?: string;
maxPingOut?: number;
maxReconnectAttempts?: number;
reconnectTimeWait?: number;
reconnectJitter?: number;
reconnectJitterTLS?: number;
reconnectDelayHandler?: any;
servers?: string[] | string;
nkey?: any;
reconnect?: boolean;
pedantic?: boolean;
tls?: any;
queue?: string;
serializer?: Serializer;
deserializer?: Deserializer;
userJWT?: string;
nonceSigner?: any;
userCreds?: any;
useOldRequestStyle?: boolean;
pingInterval?: number;
preserveBuffers?: boolean;
waitOnFirstConnect?: boolean;
verbose?: boolean;
noEcho?: boolean;
noRandomize?: boolean;
timeout?: number;
token?: string;
yieldTime?: number;
tokenHandler?: any;
[key: string]: any;
};
}
/**
* @publicApi
*/
export interface RmqOptions {
transport?: Transport.RMQ;
options?: {
urls?: string[] | RmqUrl[];
queue?: string;
prefetchCount?: number;
isGlobalPrefetchCount?: boolean;
queueOptions?: any;
socketOptions?: any;
noAck?: boolean;
consumerTag?: string;
serializer?: Serializer;
deserializer?: Deserializer;
replyQueue?: string;
persistent?: boolean;
headers?: Record;
noAssert?: boolean;
/**
* Maximum number of connection attempts.
* Applies only to the consumer configuration.
* -1 === infinite
* @default -1
*/
maxConnectionAttempts?: number;
};
}
/**
* @publicApi
*/
export interface KafkaParserConfig {
keepBinary?: boolean;
}
/**
* @publicApi
*/
export interface KafkaOptions {
transport?: Transport.KAFKA;
options?: {
/**
* Defaults to `"-server"` on server side and `"-client"` on client side.
*/
postfixId?: string;
client?: KafkaConfig;
consumer?: ConsumerConfig;
run?: Omit;
subscribe?: Omit;
producer?: ProducerConfig;
send?: Omit;
serializer?: Serializer;
deserializer?: Deserializer;
parser?: KafkaParserConfig;
producerOnlyMode?: boolean;
};
}