@nestjs-twurple/pubsub v0.2.0
NestJS Twurple PubSub
A NestJS wrapper for @twurple/pubsub package.
This module can be used alone or in combination with other @nestjs-twurple modules.
!IMPORTANT These packages require
twurpleversion 7.0 or higher.
Table of Contents
Installation
This module can be used in combination with @nestjs-twurple/auth module. Install it if necessary.
yarn:
yarn add @nestjs-twurple/pubsub @twurple/auth @twurple/pubsubnpm:
npm i @nestjs-twurple/pubsub @twurple/auth @twurple/pubsubUsage
For basic information, check out the general documentation at the root of the repository @nestjs-twurple.
Also take a look at the official @twurple/pubsub reference and guides: Listening to PubSub topics.
Import and Registration
The module must be register either with register or registerAsync static methods.
To create a PubSub client, you must provide TwurplePubSubOptions. The options below are directly extended from the PubSubClientConfig interface provided by @twurple/pubsub package, so the example below may become outdated at some point.
interface TwurplePubSubOptions {
authProvider: AuthProvider;
logger?: Partial<LoggerOptions>;
wsOptions?: WebSocketClientOptions;
}Example of using registerAsync static method:
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { RefreshingAuthProvider } from '@twurple/auth';
import { TwurplePubSubModule } from '@nestjs-twurple/pubsub';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TwurplePubSubModule.registerAsync({
isGlobal: true,
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
return {
authProvider: new RefreshingAuthProvider({
// ...
})
};
}
})
]
})
export class AppModule {}You can also use TwurpleAuthModule from @nestjs-twurple/auth package to inject an auth provider:
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TWURPLE_AUTH_PROVIDER, TwurpleAuthModule } from '@nestjs-twurple/auth';
import { TwurplePubSubModule } from '@nestjs-twurple/pubsub';
import { AuthProvider } from '@twurple/auth';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TwurpleAuthModule.registerAsync({
isGlobal: true,
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
return {
type: 'refreshing',
clientId: configService.get('TWITCH_CLIENT_ID'),
clientSecret: configService.get('TWITCH_CLIENT_SECRET'),
onRefresh: async (userId, token) => {
// Handle token refresh
}
};
}
}),
TwurplePubSubModule.registerAsync({
isGlobal: true,
inject: [TWURPLE_AUTH_PROVIDER],
useFactory: (authProvider: AuthProvider) => {
// Here we are able to access the auth provider instance
// provided by TwurpleAuthModule above
return { authProvider };
}
})
]
})
export class AppModule {}Using the PubSubClient
The module internally creates a PubSubClient instance. You can inject it anywhere you need it using @InjectPubSubClient() decorator. For example, you can create TwitchPubSubService provider where you can listen to PubSub events. Note that before listening to channel events the user(s) must be registered in the auth provider.
import { Injectable } from '@nestjs/common';
import { InjectPubSubClient } from '@nestjs-twurple/pubsub';
import { PubSubClient, type PubSubSubscriptionMessage } from '@twurple/pubsub';
@Injectable()
export class TwitchPubSubService {
// Inject PubSubClient
constructor(@InjectPubSubClient() private readonly _pubSubClient: PubSubClient) {
const subscriptionHandler = this._pubSubClient.onSubscription(userId, (message: PubSubSubscriptionMessage) => {
console.log(`${message.userDisplayName} just subscribed!`);
});
// Other listeners...
}
// Other methods...
}Alternatively, you can use TWURPLE_CHAT_CLIENT token to inject the ChatClient instance to your custom providers or factories:
import { Inject, Injectable, OnApplicationBootstrap } from '@nestjs/common';
import { TWURPLE_PUBSUB_CLIENT } from '@nestjs-twurple/pubsub';
import { PubSubClient } from '@twurple/pubsub';
@Injectable()
export class TwitchChatService implements OnApplicationBootstrap {
// Inject PubSubClient
constructor(@Inject(TWURPLE_PUBSUB_CLIENT) private readonly _pubSubClient: PubSubClient) {}
}