dfp-lib
Version:
This project hosts the Node.JS client library for the SOAP-based DFP API at Google.
119 lines (118 loc) • 4.69 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
const util = require("util");
const logger_1 = require("../util/logger");
const soapClient_1 = require("./soapClient");
function joinHeaders(o) {
return o ? Object.keys(o).map(function (key) {
return key + ': ' + o[key];
}).join("\n") : '';
}
class AdsSoapClient extends soapClient_1.SoapClient {
constructor(serviceName, wsdl, xmlns, user, options = {}, headers = {}) {
super(wsdl, xmlns, user, options['classmap']);
this.user = user;
this.options = options;
this.headers = headers;
this.lastArguments = {};
this.lastRequestId = '';
this.serviceName = serviceName;
}
getSuperSoapCall() {
return super.__soapCall.bind(this);
}
__soapCall(functionName, args, options = null) {
return __awaiter(this, void 0, void 0, function* () {
try {
let soapRequestHeader = this.generateSoapRequestHeader();
let httpHeaders = yield this.generateHttpHeaders();
let response = yield this.getSuperSoapCall()(functionName, args, soapRequestHeader, Object.assign({}, this.headers, httpHeaders));
let responseHeader = response.Envelope.Header.ResponseHeader;
this.lastRequestId = responseHeader.requestId;
this.lastElapsedTime = 0 | responseHeader.responseTime;
this.processResponse(functionName);
return response.Envelope.Body;
}
catch (e) {
this.processResponse(functionName, e);
throw e;
}
});
}
processResponse(method, e = null) {
this.lastMethodName = method;
let level = e ? logger_1.Logger.Level.ERROR : logger_1.Logger.Level.INFO;
this.logSoapXml(level);
this.logRequestInfo(level);
}
logSoapXml(level) {
const requestHeaders = joinHeaders(this.__getLastRequestHeaders()).trim();
const request = util.inspect(this.lastRequest, { depth: null });
const responseHeaders = joinHeaders(this.__getLastResponseHeaders()).trim();
const response = util.inspect(this.lastResponse, { depth: null });
const message = `${requestHeaders}\n\n${request}\n\n${responseHeaders}\n\n${response}\n`;
logger_1.Logger.log(logger_1.Logger.SOAP_XML_LOG, message, level);
}
logRequestInfo(level) {
const message = this.generateRequestInfoMessage();
logger_1.Logger.log(logger_1.Logger.REQUEST_INFO_LOG, message, level);
}
getAdsUser() {
return this.user;
}
getServer() {
const obj = this.lastRequest;
return (obj && obj.uri && obj.uri.host) ? obj.uri.host : '';
}
getServiceName() {
return this.serviceName;
}
getLastMethodName() {
return this.lastMethodName;
}
getLastResponseTime() {
return this.lastElapsedTime;
}
getLastRequestId() {
return this.lastRequestId;
}
isFault() {
return this.lastError != null;
}
getLastFaultMessage() {
return this.isFault() ? this.lastError.message : 'null';
}
getHeaderNames() {
return Object.keys(this.headers);
}
getHeaderValue(key) {
return this.__getHeader(key);
}
setHeaderValue(key, value) {
this.__setHeader(key, value);
}
generateHttpHeaders() {
return __awaiter(this, void 0, void 0, function* () {
let httpHeaders = {};
let oauth2Info = this.user.getOAuth2Info();
if (oauth2Info) {
let oauth2Handler = this.user.getOAuth2Handler();
oauth2Info = yield oauth2Handler.getOrRefreshAccessToken(oauth2Info);
this.user.setOAuth2Info(oauth2Info);
if (oauth2Handler.isAccessTokenValid(oauth2Info)) {
httpHeaders['Authorization'] = oauth2Handler.formatCredentialsForHeader(oauth2Info);
}
}
return httpHeaders;
});
}
}
exports.AdsSoapClient = AdsSoapClient;
;