pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
330 lines (254 loc) • 12.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createValidationError = createValidationError;
exports.generatePNSDK = generatePNSDK;
exports.signRequest = signRequest;
exports["default"] = _default;
exports.PubNubError = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
var _uuid = _interopRequireDefault(require("./uuid"));
var _flow_interfaces = require("../flow_interfaces");
var _utils = _interopRequireDefault(require("../utils"));
var _config = _interopRequireDefault(require("./config"));
var _operations = _interopRequireDefault(require("../constants/operations"));
var _categories = _interopRequireDefault(require("../constants/categories"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
var PubNubError = function (_Error) {
(0, _inherits2["default"])(PubNubError, _Error);
var _super = _createSuper(PubNubError);
function PubNubError(message, status) {
var _this;
(0, _classCallCheck2["default"])(this, PubNubError);
_this = _super.call(this, message);
_this.name = _this.constructor.name;
_this.status = status;
_this.message = message;
return _this;
}
return PubNubError;
}((0, _wrapNativeSuper2["default"])(Error));
exports.PubNubError = PubNubError;
function createError(errorPayload, type) {
errorPayload.type = type;
errorPayload.error = true;
return errorPayload;
}
function createValidationError(message) {
return createError({
message: message
}, 'validationError');
}
function decideURL(endpoint, modules, incomingParams) {
if (endpoint.usePost && endpoint.usePost(modules, incomingParams)) {
return endpoint.postURL(modules, incomingParams);
} else if (endpoint.usePatch && endpoint.usePatch(modules, incomingParams)) {
return endpoint.patchURL(modules, incomingParams);
} else if (endpoint.useGetFile && endpoint.useGetFile(modules, incomingParams)) {
return endpoint.getFileURL(modules, incomingParams);
} else {
return endpoint.getURL(modules, incomingParams);
}
}
function getAuthToken(endpoint, modules, incomingParams) {
var token;
if (endpoint.getAuthToken) {
token = endpoint.getAuthToken(modules, incomingParams);
}
return token;
}
function generatePNSDK(config) {
if (config.sdkName) {
return config.sdkName;
}
var base = "PubNub-JS-".concat(config.sdkFamily);
if (config.partnerId) {
base += "-".concat(config.partnerId);
}
base += "/".concat(config.getVersion());
var pnsdkSuffix = config._getPnsdkSuffix(' ');
if (pnsdkSuffix.length > 0) {
base += pnsdkSuffix;
}
return base;
}
function getHttpMethod(modules, endpoint, incomingParams) {
if (endpoint.usePost && endpoint.usePost(modules, incomingParams)) {
return 'POST';
} else if (endpoint.usePatch && endpoint.usePatch(modules, incomingParams)) {
return 'PATCH';
} else if (endpoint.useDelete && endpoint.useDelete(modules, incomingParams)) {
return 'DELETE';
} else if (endpoint.useGetFile && endpoint.useGetFile(modules, incomingParams)) {
return 'GETFILE';
} else {
return 'GET';
}
}
function signRequest(modules, url, outgoingParams, incomingParams, endpoint) {
var config = modules.config,
crypto = modules.crypto;
var httpMethod = getHttpMethod(modules, endpoint, incomingParams);
outgoingParams.timestamp = Math.floor(new Date().getTime() / 1000);
if (endpoint.getOperation() === 'PNPublishOperation' && endpoint.usePost && endpoint.usePost(modules, incomingParams)) {
httpMethod = 'GET';
}
if (httpMethod === 'GETFILE') {
httpMethod = 'GET';
}
var signInput = "".concat(httpMethod, "\n").concat(config.publishKey, "\n").concat(url, "\n").concat(_utils["default"].signPamFromParams(outgoingParams), "\n");
if (httpMethod === 'POST') {
var payload = endpoint.postPayload(modules, incomingParams);
if (typeof payload === 'string') {
signInput += payload;
} else {
signInput += JSON.stringify(payload);
}
} else if (httpMethod === 'PATCH') {
var _payload = endpoint.patchPayload(modules, incomingParams);
if (typeof _payload === 'string') {
signInput += _payload;
} else {
signInput += JSON.stringify(_payload);
}
}
var signature = "v2.".concat(crypto.HMACSHA256(signInput));
signature = signature.replace(/\+/g, '-');
signature = signature.replace(/\//g, '_');
signature = signature.replace(/=+$/, '');
outgoingParams.signature = signature;
}
function _default(modules, endpoint) {
var networking = modules.networking,
config = modules.config,
telemetryManager = modules.telemetryManager;
var requestId = _uuid["default"].createUUID();
var callback = null;
var promiseComponent = null;
var incomingParams = {};
if (endpoint.getOperation() === _operations["default"].PNTimeOperation || endpoint.getOperation() === _operations["default"].PNChannelGroupsOperation) {
callback = arguments.length <= 2 ? undefined : arguments[2];
} else {
incomingParams = arguments.length <= 2 ? undefined : arguments[2];
callback = arguments.length <= 3 ? undefined : arguments[3];
}
if (typeof Promise !== 'undefined' && !callback) {
promiseComponent = _utils["default"].createPromise();
}
var validationResult = endpoint.validateParams(modules, incomingParams);
if (validationResult) {
if (callback) {
return callback(createValidationError(validationResult));
} else if (promiseComponent) {
promiseComponent.reject(new PubNubError('Validation failed, check status for details', createValidationError(validationResult)));
return promiseComponent.promise;
}
return;
}
var outgoingParams = endpoint.prepareParams(modules, incomingParams);
var url = decideURL(endpoint, modules, incomingParams);
var callInstance;
var networkingParams = {
url: url,
operation: endpoint.getOperation(),
timeout: endpoint.getRequestTimeout(modules),
headers: endpoint.getRequestHeaders ? endpoint.getRequestHeaders() : {},
ignoreBody: typeof endpoint.ignoreBody === 'function' ? endpoint.ignoreBody(modules) : false,
forceBuffered: typeof endpoint.forceBuffered === 'function' ? endpoint.forceBuffered(modules, incomingParams) : null
};
outgoingParams.uuid = config.UUID;
outgoingParams.pnsdk = generatePNSDK(config);
var telemetryLatencies = telemetryManager.operationsLatencyForRequest();
if (Object.keys(telemetryLatencies).length) {
outgoingParams = _objectSpread(_objectSpread({}, outgoingParams), telemetryLatencies);
}
if (config.useInstanceId) {
outgoingParams.instanceid = config.instanceId;
}
if (config.useRequestId) {
outgoingParams.requestid = requestId;
}
if (endpoint.isAuthSupported()) {
var token = getAuthToken(endpoint, modules, incomingParams);
var tokenOrKey = token || config.getAuthKey();
if (tokenOrKey) {
outgoingParams.auth = tokenOrKey;
}
}
if (config.secretKey) {
signRequest(modules, url, outgoingParams, incomingParams, endpoint);
}
var onResponse = function onResponse(status, payload) {
var _responseP;
if (status.error) {
if (endpoint.handleError) {
endpoint.handleError(modules, incomingParams, status);
}
if (callback) {
callback(status);
} else if (promiseComponent) {
promiseComponent.reject(new PubNubError('PubNub call failed, check status for details', status));
}
return;
}
telemetryManager.stopLatencyMeasure(endpoint.getOperation(), requestId);
var responseP = endpoint.handleResponse(modules, payload, incomingParams);
if (typeof ((_responseP = responseP) === null || _responseP === void 0 ? void 0 : _responseP.then) !== 'function') {
responseP = Promise.resolve(responseP);
}
responseP.then(function (result) {
if (callback) {
callback(status, result);
} else if (promiseComponent) {
promiseComponent.fulfill(result);
}
})["catch"](function (e) {
if (callback) {
var errorData = e;
if (endpoint.getOperation() === _operations["default"].PNSubscribeOperation) {
errorData = {
statusCode: 400,
error: true,
operation: endpoint.getOperation(),
errorData: e,
category: _categories["default"].PNUnknownCategory
};
}
callback(errorData, null);
} else if (promiseComponent) {
promiseComponent.reject(new PubNubError('PubNub call failed, check status for details', e));
}
});
};
telemetryManager.startLatencyMeasure(endpoint.getOperation(), requestId);
if (getHttpMethod(modules, endpoint, incomingParams) === 'POST') {
var payload = endpoint.postPayload(modules, incomingParams);
callInstance = networking.POST(outgoingParams, payload, networkingParams, onResponse);
} else if (getHttpMethod(modules, endpoint, incomingParams) === 'PATCH') {
var _payload2 = endpoint.patchPayload(modules, incomingParams);
callInstance = networking.PATCH(outgoingParams, _payload2, networkingParams, onResponse);
} else if (getHttpMethod(modules, endpoint, incomingParams) === 'DELETE') {
callInstance = networking.DELETE(outgoingParams, networkingParams, onResponse);
} else if (getHttpMethod(modules, endpoint, incomingParams) === 'GETFILE') {
callInstance = networking.GETFILE(outgoingParams, networkingParams, onResponse);
} else {
callInstance = networking.GET(outgoingParams, networkingParams, onResponse);
}
if (endpoint.getOperation() === _operations["default"].PNSubscribeOperation) {
return callInstance;
}
if (promiseComponent) {
return promiseComponent.promise;
}
}
//# sourceMappingURL=endpoint.js.map