@niur/nestjs-service-bus
Version:
NestJS Azure Service Bus Microservice Transport
66 lines (61 loc) • 1.98 kB
text/typescript
import { isNil } from "@nestjs/common/utils/shared.utils";
import { ClientProxy } from "@nestjs/microservices";
import {
connectable,
defer,
mergeMap,
Observable,
Observer,
Subject,
throwError,
} from "rxjs";
import { AzureServiceBusSenderOptions } from "../interfaces";
import { InvalidMessageException } from "../errors";
import { ServiceBusMessage, ServiceBusMessageBatch } from "@azure/service-bus";
import { AmqpAnnotatedMessage } from "@azure/core-amqp";
export abstract class AzureServiceBusClientProxy extends ClientProxy {
public send<
TResult = AzureServiceBusSenderOptions,
TInput =
| ServiceBusMessage
| ServiceBusMessage[]
| ServiceBusMessageBatch
| AmqpAnnotatedMessage
| AmqpAnnotatedMessage[]
>(pattern: AzureServiceBusSenderOptions, data: TInput): Observable<TResult> {
if (isNil(pattern) || isNil(data)) {
return throwError(() => new InvalidMessageException());
}
return defer(async () => this.connect()).pipe(
mergeMap(
() =>
new Observable((observer: Observer<TResult>) => {
const callback = this.createObserver(observer);
return this.publish({ pattern, data }, callback);
})
)
);
}
public emit<
TResult = AzureServiceBusSenderOptions,
TInput =
| ServiceBusMessage
| ServiceBusMessage[]
| ServiceBusMessageBatch
| AmqpAnnotatedMessage
| AmqpAnnotatedMessage[]
>(pattern: AzureServiceBusSenderOptions, data: TInput): Observable<TResult> {
if (isNil(pattern) || isNil(data)) {
return throwError(() => new InvalidMessageException());
}
const source = defer(async () => this.connect()).pipe(
mergeMap(() => this.dispatchEvent({ pattern, data }))
);
const connectableSource = connectable(source, {
connector: () => new Subject(),
resetOnDisconnect: false,
});
connectableSource.connect();
return connectableSource;
}
}