pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
121 lines (104 loc) • 3.24 kB
text/typescript
/**
* Messages count REST API module.
*
* @internal
*/
import { TransportResponse } from '../../types/transport-response';
import { AbstractRequest } from '../../components/request';
import RequestOperation from '../../constants/operations';
import * as History from '../../types/api/history';
import { KeySet, Query } from '../../types/api';
import { encodeNames } from '../../utils';
// --------------------------------------------------------
// ------------------------ Types -------------------------
// --------------------------------------------------------
// region Types
/**
* Request configuration parameters.
*/
type RequestParameters = History.MessageCountParameters & {
/**
* PubNub REST API access key set.
*/
keySet: KeySet;
};
/**
* Service success response.
*/
type ServiceResponse = {
/**
* Request result status code.
*/
status: number;
/**
* Whether service response represent error or not.
*/
error: boolean;
/**
* Human-readable error explanation.
*/
error_message: string;
/**
* Map of channel names to the number of counted messages.
*/
channels: Record<string, number>;
/**
* Map of channel names to pre-computed REST API paths to fetch more.
*/
more: {
[p: string]: {
/**
* Pre-computed message count REST API url to fetch more information.
*/
url: string;
/**
* Whether there is more information available or not.
*/
is_more: boolean;
};
};
};
// endregion
/**
* Count messages request.
*
* @internal
*/
export class MessageCountRequest extends AbstractRequest<History.MessageCountResponse, ServiceResponse> {
constructor(private readonly parameters: RequestParameters) {
super();
}
operation(): RequestOperation {
return RequestOperation.PNMessageCounts;
}
validate(): string | undefined {
const {
keySet: { subscribeKey },
channels,
timetoken,
channelTimetokens,
} = this.parameters;
if (!subscribeKey) return 'Missing Subscribe Key';
if (!channels) return 'Missing channels';
if (timetoken && channelTimetokens) return '`timetoken` and `channelTimetokens` are incompatible together';
if (!timetoken && !channelTimetokens) return '`timetoken` or `channelTimetokens` need to be set';
if (channelTimetokens && channelTimetokens.length > 1 && channelTimetokens.length !== channels.length)
return 'Length of `channelTimetokens` and `channels` do not match';
}
async parse(response: TransportResponse): Promise<History.MessageCountResponse> {
return { channels: this.deserializeResponse(response).channels };
}
protected get path(): string {
return `/v3/history/sub-key/${this.parameters.keySet.subscribeKey}/message-counts/${encodeNames(
this.parameters.channels,
)}`;
}
protected get queryParameters(): Query {
let { channelTimetokens } = this.parameters;
if (this.parameters.timetoken) channelTimetokens = [this.parameters.timetoken];
return {
...(channelTimetokens!.length === 1 ? { timetoken: channelTimetokens![0] } : {}),
...(channelTimetokens!.length > 1 ? { channelsTimetoken: channelTimetokens!.join(',') } : {}),
};
}
}