@adobe/reactor-sdk
Version:
JavaScript SDK for the Reactor API
204 lines (157 loc) • 8.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
var _version = require("./version");
var hosts = _interopRequireWildcard(require("./hosts"));
var auditEvents = _interopRequireWildcard(require("./audit-events"));
var builds = _interopRequireWildcard(require("./builds"));
var callbacks = _interopRequireWildcard(require("./callbacks"));
var companies = _interopRequireWildcard(require("./companies"));
var dataElements = _interopRequireWildcard(require("./data-elements"));
var environments = _interopRequireWildcard(require("./environments"));
var extensionPackages = _interopRequireWildcard(require("./extension-packages"));
var extensions = _interopRequireWildcard(require("./extensions"));
var heartbeat = _interopRequireWildcard(require("./heartbeat"));
var libraries = _interopRequireWildcard(require("./libraries"));
var profiles = _interopRequireWildcard(require("./profiles"));
var properties = _interopRequireWildcard(require("./properties"));
var ruleComponents = _interopRequireWildcard(require("./rule-components"));
var rules = _interopRequireWildcard(require("./rules"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const defaultReactorOptions = {
reactorUrl: 'https://reactor.adobe.io',
enableLogging: false
};
function removeTrailingSlash(str) {
return str.endsWith('/') ? str.slice(0, -1) : str;
}
function bodyIsJson(httpResponse) {
const jsonContentType = 'application/vnd.api+json';
const thisContentType = httpResponse.headers.get('content-type');
return thisContentType && thisContentType.includes(jsonContentType);
}
class Reactor {
constructor(accessToken, userOptions = {}) {
const options = _objectSpread({}, defaultReactorOptions, {}, userOptions);
this.baseUrl = removeTrailingSlash(options.reactorUrl);
this.enableLogging = options.enableLogging;
this.customHeaders = options.customHeaders || {};
this.headers = _objectSpread({}, this.reactorHeaders(accessToken), {}, this.customHeaders);
if (this.enableLogging) console.info("Using Reactor at ".concat(this.baseUrl));
}
reactorHeaders(accessToken) {
return {
Accept: 'application/vnd.api+json;revision=1',
'Content-Type': 'application/vnd.api+json',
'Cache-control': 'no-cache',
Authorization: "Bearer ".concat(accessToken),
'X-Api-Key': 'Activation-DTM',
'User-Agent': "adobe/reactor-sdk/javascript/".concat(_version.version)
};
}
createReviseBody(resourceType, resourceId) {
return {
data: {
id: resourceId,
attributes: {},
type: resourceType,
meta: {
action: 'revise'
}
}
};
}
async requestAndLog(url, requestInfo, requestData) {
// requestData is requestInfo.body as JavaScript objects (not JSON)
const response = await (0, _nodeFetch.default)(url.toString(), requestInfo);
const responseData = bodyIsJson(response) ? await response.json() : null;
const status = "".concat(response.status, " ").concat(response.statusText);
const source = "".concat(requestInfo.method, " ").concat(url.toString());
const traceData = {
// convenient human-readable summaries
status: "".concat(response.status, " ").concat(response.statusText),
// eg '404 not found'
source: "".concat(requestInfo.method, " ").concat(url.toString()),
// eg 'GET http://x.io/'
// raw capture of all request and response data
url: url,
request: requestInfo,
response: response,
// non-JSON versions (i.e., as objects) of request and response bodies
requestBody: requestData || {},
responseBody: responseData || {}
};
const summary = "".concat(traceData.status, " <- ").concat(traceData.source);
if (!response.ok) {
if (this.enableLogging) console.info('[Reactor SDK]', summary, traceData);
throw new FetchError(traceData);
}
if (this.enableLogging) console.debug('[Reactor SDK]', summary, traceData);
return responseData;
}
async request(method, url, requestData = null) {
const requestBodyJson = requestData && JSON.stringify(requestData);
const requestInfo = {
method: method,
headers: this.headers,
body: requestBodyJson
};
return await this.requestAndLog(url, requestInfo, requestData);
}
async sendMultipartFile(method, url, fileObject) {
const multipart = {
'Content-Type': 'multipart/form-data'
};
const requestInfo = {
method: method,
headers: Object.assign({}, this.headers, multipart),
body: fileObject
};
return await this.requestAndLog(url, requestInfo, fileObject);
}
get(path, queryParams = {}) {
const url = new URL(this.baseUrl + path);
Object.entries(queryParams).forEach(([key, val]) => url.searchParams.append(key, val));
return this.request('GET', url);
}
post(path, data) {
return this.request('POST', this.baseUrl + path, data);
}
patch(path, data) {
return this.request('PATCH', this.baseUrl + path, data);
}
delete(path, data) {
return this.request('DELETE', this.baseUrl + path, data);
}
}
exports.default = Reactor;
function extractErrorDetails(traceData) {
const errorList = traceData.responseBody.errors || [];
const details = [traceData.response, ...errorList].map(x => x.detail).filter(x => typeof x !== 'undefined').map(x => "'".concat(x, "'")).join('; also, ');
return details !== '' ? " (".concat(details, ")") : '';
}
class FetchError extends Error {
constructor(traceData) {
const status = traceData.status;
const details = extractErrorDetails(traceData);
const whence = " on ".concat(traceData.source);
super(status + details + whence);
if (Error.captureStackTrace) Error.captureStackTrace(this, FetchError);
this.status = traceData.response.status;
this.statusText = traceData.response.statusText;
this.traceData = traceData;
}
}
Object.assign(Reactor.prototype, auditEvents, builds, callbacks, companies, dataElements, environments, extensionPackages, extensions, heartbeat, hosts, libraries, profiles, properties, ruleComponents, rules);
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
window.Reactor = Reactor;
}
//# sourceMappingURL=index.js.map