pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
134 lines (133 loc) • 5.59 kB
JavaScript
;
/**
* Get history REST API module.
*
* @internal
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetHistoryRequest = void 0;
const request_1 = require("../../components/request");
const operations_1 = __importDefault(require("../../constants/operations"));
const utils_1 = require("../../utils");
// --------------------------------------------------------
// ---------------------- Defaults ------------------------
// --------------------------------------------------------
// region Defaults
/**
* Whether verbose logging enabled or not.
*/
const LOG_VERBOSITY = false;
/**
* Whether associated message metadata should be returned or not.
*/
const INCLUDE_METADATA = false;
/**
* Whether timetokens should be returned as strings by default or not.
*/
const STRINGIFY_TIMETOKENS = false;
/**
* Default and maximum number of messages which should be returned.
*/
const MESSAGES_COUNT = 100;
// endregion
/**
* Get single channel messages request.
*
* @internal
*/
class GetHistoryRequest extends request_1.AbstractRequest {
constructor(parameters) {
var _a, _b, _c;
super();
this.parameters = parameters;
// Apply defaults.
if (parameters.count)
parameters.count = Math.min(parameters.count, MESSAGES_COUNT);
else
parameters.count = MESSAGES_COUNT;
(_a = parameters.stringifiedTimeToken) !== null && _a !== void 0 ? _a : (parameters.stringifiedTimeToken = STRINGIFY_TIMETOKENS);
(_b = parameters.includeMeta) !== null && _b !== void 0 ? _b : (parameters.includeMeta = INCLUDE_METADATA);
(_c = parameters.logVerbosity) !== null && _c !== void 0 ? _c : (parameters.logVerbosity = LOG_VERBOSITY);
}
operation() {
return operations_1.default.PNHistoryOperation;
}
validate() {
if (!this.parameters.keySet.subscribeKey)
return 'Missing Subscribe Key';
if (!this.parameters.channel)
return 'Missing channel';
}
parse(response) {
return __awaiter(this, void 0, void 0, function* () {
const serviceResponse = this.deserializeResponse(response);
const messages = serviceResponse[0];
const startTimeToken = serviceResponse[1];
const endTimeToken = serviceResponse[2];
// Handle malformed get history response.
if (!Array.isArray(messages))
return { messages: [], startTimeToken, endTimeToken };
return {
messages: messages.map((payload) => {
const processedPayload = this.processPayload(payload.message);
const item = {
entry: processedPayload.payload,
timetoken: payload.timetoken,
};
if (processedPayload.error)
item.error = processedPayload.error;
if (payload.meta)
item.meta = payload.meta;
return item;
}),
startTimeToken,
endTimeToken,
};
});
}
get path() {
const { keySet: { subscribeKey }, channel, } = this.parameters;
return `/v2/history/sub-key/${subscribeKey}/channel/${(0, utils_1.encodeString)(channel)}`;
}
get queryParameters() {
const { start, end, reverse, count, stringifiedTimeToken, includeMeta } = this.parameters;
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ count: count, include_token: 'true' }, (start ? { start } : {})), (end ? { end } : {})), (stringifiedTimeToken ? { string_message_token: 'true' } : {})), (reverse !== undefined && reverse !== null ? { reverse: reverse.toString() } : {})), (includeMeta ? { include_meta: 'true' } : {}));
}
processPayload(payload) {
const { crypto, logVerbosity } = this.parameters;
if (!crypto || typeof payload !== 'string')
return { payload };
let decryptedPayload;
let error;
try {
const decryptedData = crypto.decrypt(payload);
decryptedPayload =
decryptedData instanceof ArrayBuffer
? JSON.parse(GetHistoryRequest.decoder.decode(decryptedData))
: decryptedData;
}
catch (err) {
if (logVerbosity)
console.log(`decryption error`, err.message);
decryptedPayload = payload;
error = `Error while decrypting message content: ${err.message}`;
}
return {
payload: decryptedPayload,
error,
};
}
}
exports.GetHistoryRequest = GetHistoryRequest;