pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
352 lines (313 loc) • 11.2 kB
text/typescript
/**
* PubNub Channel Groups API module.
*/
import { RemoveChannelGroupChannelsRequest } from './endpoints/channel_groups/remove_channels';
import { KeySet, ResultCallback, SendRequestFunction, StatusCallback } from './types/api';
import { AddChannelGroupChannelsRequest } from './endpoints/channel_groups/add_channels';
import { ListChannelGroupChannels } from './endpoints/channel_groups/list_channels';
import { DeleteChannelGroupRequest } from './endpoints/channel_groups/delete_group';
import { ListChannelGroupsRequest } from './endpoints/channel_groups/list_groups';
import * as ChannelGroups from './types/api/channel-groups';
import { LoggerManager } from './components/logger-manager';
/**
* PubNub Stream / Channel group API interface.
*/
export default class PubNubChannelGroups {
/**
* Registered loggers' manager.
*
* @internal
*/
private readonly logger: LoggerManager;
/**
* PubNub account keys set which should be used for REST API calls.
*
* @internal
*/
private readonly keySet: KeySet;
/* eslint-disable @typescript-eslint/no-explicit-any */
/**
* Function which should be used to send REST API calls.
*
* @internal
*/
private readonly sendRequest: SendRequestFunction<any, any>;
/**
* Create stream / channel group API access object.
*
* @param logger - Registered loggers' manager.
* @param keySet - PubNub account keys set which should be used for REST API calls.
* @param sendRequest - Function which should be used to send REST API calls.
*
* @internal
*/
constructor(
logger: LoggerManager,
keySet: KeySet,
/* eslint-disable @typescript-eslint/no-explicit-any */
sendRequest: SendRequestFunction<any, any>,
) {
this.sendRequest = sendRequest;
this.logger = logger;
this.keySet = keySet;
}
// --------------------------------------------------------
// ---------------------- Audit API -----------------------
// --------------------------------------------------------
// region Audit API
/**
* Fetch channel group channels.
*
* @param parameters - Request configuration parameters.
* @param callback - Request completion handler callback.
*/
public listChannels(
parameters: ChannelGroups.ListChannelGroupChannelsParameters,
callback: ResultCallback<ChannelGroups.ListChannelGroupChannelsResponse>,
): void;
/**
* Fetch channel group channels.
*
* @param parameters - Request configuration parameters.
*
* @returns Asynchronous get channel group channels response.
*/
public async listChannels(
parameters: ChannelGroups.ListChannelGroupChannelsParameters,
): Promise<ChannelGroups.ListChannelGroupChannelsResponse>;
/**
* Fetch channel group channels.
*
* @param parameters - Request configuration parameters.
* @param [callback] - Request completion handler callback.
*
* @returns Asynchronous get channel group channels response or `void` in case if `callback`
* provided.
*/
public async listChannels(
parameters: ChannelGroups.ListChannelGroupChannelsParameters,
callback?: ResultCallback<ChannelGroups.ListChannelGroupChannelsResponse>,
): Promise<ChannelGroups.ListChannelGroupChannelsResponse | void> {
this.logger.debug('PubNub', () => ({
messageType: 'object',
message: { ...parameters },
details: 'List channel group channels with parameters:',
}));
const request = new ListChannelGroupChannels({ ...parameters, keySet: this.keySet });
const logResponse = (response: ChannelGroups.ListChannelGroupChannelsResponse | null) => {
if (!response) return;
this.logger.debug(
'PubNub',
`List channel group channels success. Received ${response.channels.length} channels.`,
);
};
if (callback)
return this.sendRequest(request, (status, response) => {
logResponse(response);
callback(status, response);
});
return this.sendRequest(request).then((response) => {
logResponse(response);
return response;
});
}
// region Deprecated
/**
* Fetch all channel groups.
*
* @param callback - Request completion handler callback.
*
* @deprecated
*/
public listGroups(callback: ResultCallback<ChannelGroups.ListAllChannelGroupsResponse>): void;
/**
* Fetch all channel groups.
*
* @returns Asynchronous get all channel groups response.
*
* @deprecated
*/
public async listGroups(): Promise<ChannelGroups.ListAllChannelGroupsResponse>;
/**
* Fetch all channel groups.
*
* @param [callback] - Request completion handler callback.
*
* @returns Asynchronous get all channel groups response or `void` in case if `callback` provided.
*
* @deprecated
*/
public async listGroups(
callback?: ResultCallback<ChannelGroups.ListAllChannelGroupsResponse>,
): Promise<ChannelGroups.ListAllChannelGroupsResponse | void> {
this.logger.debug('PubNub', 'List all channel groups.');
const request = new ListChannelGroupsRequest({ keySet: this.keySet });
const logResponse = (response: ChannelGroups.ListAllChannelGroupsResponse | null) => {
if (!response) return;
this.logger.debug('PubNub', `List all channel groups success. Received ${response.groups.length} groups.`);
};
if (callback)
return this.sendRequest(request, (status, response) => {
logResponse(response);
callback(status, response);
});
return this.sendRequest(request).then((response) => {
logResponse(response);
return response;
});
}
// endregion
// endregion
// --------------------------------------------------------
// ---------------------- Manage API ----------------------
// --------------------------------------------------------
// region Manage API
/**
* Add channels to the channel group.
*
* @param parameters - Request configuration parameters.
* @param callback - Request completion handler callback.
*/
public addChannels(parameters: ChannelGroups.ManageChannelGroupChannelsParameters, callback: StatusCallback): void;
/**
* Add channels to the channel group.
*
* @param parameters - Request configuration parameters.
*
* @returns Asynchronous add channels to the channel group response.
*/
public async addChannels(
parameters: ChannelGroups.ManageChannelGroupChannelsParameters,
): Promise<Record<string, unknown>>;
/**
* Add channels to the channel group.
*
* @param parameters - Request configuration parameters.
* @param [callback] - Request completion handler callback.
*
* @returns Asynchronous add channels to the channel group response or `void` in case if
* `callback` provided.
*/
public async addChannels(
parameters: ChannelGroups.ManageChannelGroupChannelsParameters,
callback?: StatusCallback,
): Promise<Record<string, unknown> | void> {
this.logger.debug('PubNub', () => ({
messageType: 'object',
message: { ...parameters },
details: 'Add channels to the channel group with parameters:',
}));
const request = new AddChannelGroupChannelsRequest({ ...parameters, keySet: this.keySet });
const logResponse = () => {
this.logger.debug('PubNub', `Add channels to the channel group success.`);
};
if (callback)
return this.sendRequest(request, (status) => {
if (!status.error) logResponse();
callback(status);
});
return this.sendRequest(request).then((response) => {
logResponse();
return response;
});
}
/**
* Remove channels from the channel group.
*
* @param parameters - Request configuration parameters.
* @param callback - Request completion handler callback.
*/
public removeChannels(parameters: ChannelGroups.ManageChannelGroupChannelsParameters, callback: StatusCallback): void;
/**
* Remove channels from the channel group.
*
* @param parameters - Request configuration parameters.
*
* @returns Asynchronous remove channels from the channel group response.
*/
public async removeChannels(
parameters: ChannelGroups.ManageChannelGroupChannelsParameters,
): Promise<Record<string, unknown>>;
/**
* Remove channels from the channel group.
*
* @param parameters - Request configuration parameters.
* @param [callback] - Request completion handler callback.
*
* @returns Asynchronous remove channels from the channel group response or `void` in
* case if `callback` provided.
*/
public async removeChannels(
parameters: ChannelGroups.ManageChannelGroupChannelsParameters,
callback?: StatusCallback,
): Promise<Record<string, unknown> | void> {
this.logger.debug('PubNub', () => ({
messageType: 'object',
message: { ...parameters },
details: 'Remove channels from the channel group with parameters:',
}));
const request = new RemoveChannelGroupChannelsRequest({ ...parameters, keySet: this.keySet });
const logResponse = () => {
this.logger.debug('PubNub', `Remove channels from the channel group success.`);
};
if (callback)
return this.sendRequest(request, (status) => {
if (!status.error) logResponse();
callback(status);
});
return this.sendRequest(request).then((response) => {
logResponse();
return response;
});
}
/**
* Remove channel group.
*
* @param parameters - Request configuration parameters.
* @param callback - Request completion handler callback.
*/
public deleteGroup(parameters: ChannelGroups.DeleteChannelGroupParameters, callback: StatusCallback): void;
/**
* Remove channel group.
*
* @param parameters - Request configuration parameters.
*
* @returns Asynchronous remove channel group response.
*/
public async deleteGroup(parameters: ChannelGroups.DeleteChannelGroupParameters): Promise<Record<string, unknown>>;
/**
* Remove a channel group.
*
* @param parameters - Request configuration parameters.
* @param [callback] - Request completion handler callback.
*
* @returns Asynchronous remove channel group response or `void` in case if `callback` provided.
*/
public async deleteGroup(
parameters: ChannelGroups.DeleteChannelGroupParameters,
callback?: StatusCallback,
): Promise<Record<string, unknown> | void> {
this.logger.debug('PubNub', () => ({
messageType: 'object',
message: { ...parameters },
details: 'Remove a channel group with parameters:',
}));
const request = new DeleteChannelGroupRequest({ ...parameters, keySet: this.keySet });
const logResponse = () => {
this.logger.debug(
'PubNub',
`Remove a channel group success. Removed '${parameters.channelGroup}' channel group.'`,
);
};
if (callback)
return this.sendRequest(request, (status) => {
if (!status.error) logResponse();
callback(status);
});
return this.sendRequest(request).then((response) => {
logResponse();
return response;
});
}
// endregion
}