trm-core
Version:
TRM (Transport Request Manager) Core
726 lines (725 loc) • 27.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
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.RFCClient = void 0;
const commons_1 = require("../commons");
const trm_commons_1 = require("trm-commons");
const fs_1 = require("fs");
const path_1 = __importDefault(require("path"));
const _1 = require(".");
const xml = __importStar(require("xml-js"));
const nodeRfcLib = 'node-rfc';
class RFCClient {
constructor(_rfcClientArgs, _cLangu, traceDir, _globalNodeModulesPath) {
this._rfcClientArgs = _rfcClientArgs;
this._cLangu = _cLangu;
this._globalNodeModulesPath = _globalNodeModulesPath;
this._aliveCheck = false;
try {
process.env["RFC_TRACE_DIR"] = traceDir || process.cwd();
}
catch (e) {
trm_commons_1.Logger.warning(`Couldn't set RFC trace!`, true);
trm_commons_1.Logger.error(e.toString(), true);
}
trm_commons_1.Logger.log(`RFC_TRACE_DIR: ${process.env["RFC_TRACE_DIR"]}`, true);
}
getRfcClient() {
return __awaiter(this, void 0, void 0, function* () {
if (!this._rfcClient) {
const libPath = path_1.default.join(this._globalNodeModulesPath || (0, trm_commons_1.getGlobalNodeModules)(), nodeRfcLib);
trm_commons_1.Logger.log(`Node RFC lib path: ${libPath}`, true);
if (!(0, fs_1.existsSync)(libPath)) {
throw new _1.RFCClientError("ZRFC_LIB_NOT_FOUND", null, null, `${nodeRfcLib} not found. Run command "npm install ${nodeRfcLib} -g" to continue.`);
}
this._rfcClient = new (yield Promise.resolve(`${libPath}`).then(s => __importStar(require(s)))).Client(this._rfcClientArgs);
}
return this._rfcClient;
});
}
open() {
return __awaiter(this, void 0, void 0, function* () {
try {
trm_commons_1.Logger.loading(`Opening RFC connection`, true);
yield (yield this.getRfcClient()).open();
trm_commons_1.Logger.success(`RFC open`, true);
}
catch (e) {
throw new _1.RFCClientError("ZNO_CONN", null, e, e.message);
}
});
}
close() {
return __awaiter(this, void 0, void 0, function* () {
try {
trm_commons_1.Logger.loading(`Closing RFC connection`, true);
yield (yield this.getRfcClient()).close();
trm_commons_1.Logger.success(`RFC closed`, true);
}
catch (e) {
throw new _1.RFCClientError("ZNO_CLOSE", null, e, e.message);
}
});
}
checkConnection() {
return __awaiter(this, void 0, void 0, function* () {
if (!this._aliveCheck) {
if ((yield this.getRfcClient()).alive) {
trm_commons_1.Logger.success(`RFC open`, true);
}
else {
trm_commons_1.Logger.warning(`RFC closed`, true);
}
this._aliveCheck = true;
}
return (yield this.getRfcClient()).alive;
});
}
sanitizeDebugResponse(obj) {
if (Buffer.isBuffer(obj)) {
try {
return `<file of ${obj.byteLength} bytes>`;
}
catch (_a) {
return "<file of unknown bytes>";
}
}
if (Array.isArray(obj)) {
return obj.map(v => this.sanitizeDebugResponse(v));
}
if (obj && typeof obj === "object") {
return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, this.sanitizeDebugResponse(v)]));
}
return obj;
}
_call(fm_1, arg_1, timeout_1, noErrorParsing_1) {
return __awaiter(this, arguments, void 0, function* (fm, arg, timeout, noErrorParsing, retryCount = 0) {
var argNormalized;
if (arg) {
var emptyKeys = [];
argNormalized = (0, commons_1.normalize)(arg, 'upper');
Object.keys(argNormalized).forEach(key => {
if (argNormalized[key] === undefined || argNormalized === null) {
emptyKeys.push(key);
}
});
emptyKeys.forEach(key => {
delete argNormalized[key];
});
}
else {
argNormalized = {};
}
var callOptions = undefined;
if (timeout) {
callOptions = {
timeout
};
}
try {
trm_commons_1.Logger.loading(`Executing RFC, FM ${fm}, args ${JSON.stringify(argNormalized)}, opts ${JSON.stringify(callOptions)}`, true);
const response = yield (yield this.getRfcClient()).call(fm, argNormalized, callOptions);
const responseNormalized = (0, commons_1.normalize)(response);
trm_commons_1.Logger.success(`RFC resonse: ${JSON.stringify(this.sanitizeDebugResponse(responseNormalized))}`, true);
return responseNormalized;
}
catch (e) {
if (e.message === 'device or resource busy: device or resource busy' && retryCount <= 10) {
trm_commons_1.Logger.log('device or resource busy, retrying', true);
yield new Promise(res => {
setTimeout(res, 1000);
});
return this._call(fm, arg, timeout, noErrorParsing, retryCount + 1);
}
if (noErrorParsing) {
throw e;
}
else {
var message;
var messageError;
const sapMessage = {
no: `${e.abapMsgNumber}`,
class: e.abapMsgClass,
v1: e.abapMsgV1,
v2: e.abapMsgV2,
v3: e.abapMsgV3,
v4: e.abapMsgV4
};
if (sapMessage.no && sapMessage.class) {
try {
message = yield this._getMessage(true, sapMessage);
}
catch (k) {
messageError = k;
message = `Couldn't read error message ${e.abapMsgClass} ${e.abapMsgNumber} ${e.abapMsgV1} ${e.abapMsgV2} ${e.abapMsgV3} ${e.abapMsgV4}`;
}
}
else {
message = e.message;
}
var rfcClientError = new _1.RFCClientError(e.key, sapMessage, e, message);
if (messageError) {
rfcClientError.messageError = messageError;
}
trm_commons_1.Logger.error(rfcClientError.toString(), true);
throw rfcClientError;
}
}
});
}
_getMessage(noErrorParsing, data) {
return __awaiter(this, void 0, void 0, function* () {
var msgnr = data.no;
while (msgnr.length < 3) {
msgnr = `0${msgnr}`;
}
const aT100 = yield this._readTable(noErrorParsing, 'T100', [{ fieldName: 'SPRSL' }, { fieldName: 'ARBGB' }, { fieldName: 'MSGNR' }, { fieldName: 'TEXT' }], `SPRSL EQ '${this._cLangu}' AND ARBGB EQ '${data.class}' AND MSGNR EQ '${msgnr}'`);
if (aT100.length === 1 && aT100[0].text) {
var msg = aT100[0].text;
var counter = 1;
do {
if (msg.includes(`&${counter}`)) {
msg = msg.replace(new RegExp(`&${counter}`, 'gmi'), data[`v${counter}`] || '');
msg = msg.replace(new RegExp(`&${counter}&`, 'gmi'), data[`v${counter}`] || '');
}
else {
msg = msg.replace("&", data[`v${counter}`] || '');
}
counter++;
} while (counter <= 4);
msg = msg.replace(new RegExp(`&\\d*`, 'gmi'), '');
msg = msg.replace(new RegExp(`&`, 'gmi'), '');
return msg.trim();
}
else {
throw new _1.RFCClientError("ZMSG_NOT_FOUND", null, null, `Message ${msgnr}, class ${data.class}, lang ${this._cLangu} not found.`);
}
});
}
getMessage(data) {
return __awaiter(this, void 0, void 0, function* () {
return this._getMessage(false, data);
});
}
_readTable(noErrorParsing, tableName, fields, options) {
return __awaiter(this, void 0, void 0, function* () {
var sqlOutput = [];
const delimiter = '|';
var aOptions = [];
if (options) {
const aSplit = options.split(/\s+AND\s+/);
if (aSplit.length > 1) {
aSplit.forEach((s, i) => {
var sText = s.trim();
if (i !== 0) {
sText = `AND ${sText}`;
}
aOptions.push({ text: sText });
});
}
else {
aOptions = aSplit.map(s => {
return {
text: s
};
});
}
}
try {
const result = yield this._call("RFC_READ_TABLE", {
query_table: tableName.toUpperCase(),
delimiter,
options: aOptions,
fields: fields
}, undefined, noErrorParsing);
const data = result['data'];
data.forEach(tab512 => {
var sqlLine = {};
const waSplit = tab512.wa.split(delimiter);
fields.forEach((field, index) => {
sqlLine[field['FIELDNAME']] = waSplit[index].trim();
});
sqlOutput.push(sqlLine);
});
return (0, commons_1.normalize)(sqlOutput);
}
catch (e) {
if (e.exceptionType === 'TABLE_WITHOUT_DATA') {
return [];
}
else {
throw e;
}
}
});
}
readTable(tableName, fields, options) {
return __awaiter(this, void 0, void 0, function* () {
return this._readTable(false, tableName, fields, options);
});
}
getFileSystem() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_FILE_SYS", {});
return result['fileSys'];
});
}
getDirTrans() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_DIR_TRANS", {});
return result['dirTrans'];
});
}
getBinaryFile(filePath) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_BINARY_FILE", {
file_path: filePath
});
return result['file'];
});
}
writeBinaryFile(filePath, binary) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/WRITE_BINARY_FILE", {
file_path: filePath,
file: binary
});
});
}
createTocTransport(text, target) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/CREATE_TOC", {
text: text,
target: target.trim().toUpperCase()
});
return result['trkorr'];
});
}
createWbTransport(text, target) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/CREATE_IMPORT_TR", {
text: text,
target: target.trim().toUpperCase()
});
return result['trkorr'];
});
}
createCustTransport(text, target) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/CREATE_CUST_TR", {
text: text,
target: target.trim().toUpperCase()
});
return result['trkorr'];
});
}
setTransportDoc(trkorr, doc) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/SET_TRANSPORT_DOC", {
trkorr: trkorr.trim().toUpperCase(),
doc: doc
});
});
}
getDevclassObjects(devclass) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_DEVCLASS_OBJS", {
devclass: devclass.trim().toUpperCase()
});
return result['tadir'];
});
}
removeComments(trkorr, object) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/REMOVE_TR_COMMENTS", {
trkorr: trkorr.trim().toUpperCase(),
object: object.trim().toUpperCase()
});
});
}
addToTransportRequest(trkorr, content, lock) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/ADD_OBJS_TR", {
lock: lock ? 'X' : ' ',
trkorr: trkorr.trim().toUpperCase(),
e071: content.map(o => {
return {
PGMID: o.pgmid,
OBJECT: o.object,
OBJ_NAME: o.objName
};
})
});
});
}
repositoryEnvironment(objectType, objectName) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("REPOSITORY_ENVIRONMENT_RFC", {
obj_type: objectType.trim().toUpperCase(),
object_name: objectName.trim().toUpperCase()
});
return result['environmentTab'];
});
}
deleteTrkorr(trkorr) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/DELETE_TRANSPORT", {
trkorr: trkorr.trim().toUpperCase()
});
});
}
releaseTrkorr(trkorr, lock, timeout) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/RELEASE_TR", {
trkorr: trkorr.trim().toUpperCase(),
lock: lock ? 'X' : ' '
}, timeout);
});
}
readTmsQueue(target) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/READ_TMS_QUEUE", {
target: target
});
return result['requests'];
});
}
createPackage(scompkdtln) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/CREATE_PACKAGE", {
data: scompkdtln
});
});
}
tdevcInterface(devclass, parentcl, rmParentCl, devlayer) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/TDEVC_INTERFACE", {
devclass: devclass.trim().toUpperCase(),
parentcl: parentcl ? parentcl.trim().toUpperCase() : '',
rm_parentcl: rmParentCl ? 'X' : ' ',
devlayer: devlayer ? devlayer.trim().toUpperCase() : ''
});
});
}
getDefaultTransportLayer() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_TRANSPORT_LAYER");
return result['layer'];
});
}
tadirInterface(tadir) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/TADIR_INTERFACE", {
pgmid: tadir.pgmid,
object: tadir.object,
obj_name: tadir.objName,
devclass: tadir.devclass,
set_genflag: tadir.genflag ? 'X' : ' ',
srcsystem: tadir.srcsystem
});
});
}
dequeueTransport(trkorr) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/DEQUEUE_TR", {
trkorr: trkorr.trim().toUpperCase()
});
});
}
forwardTransport(trkorr_1, target_1, source_1) {
return __awaiter(this, arguments, void 0, function* (trkorr, target, source, importAgain = true) {
yield this._call("/ATRM/FORWARD_TR", {
trkorr: trkorr.trim().toUpperCase(),
target: target.trim().toUpperCase(),
source: source.trim().toUpperCase(),
import_again: importAgain ? 'X' : ' '
});
});
}
importTransport(trkorr, system) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/IMPORT_TR", {
system: system.trim().toUpperCase(),
trkorr: trkorr.trim().toUpperCase()
});
});
}
setInstallDevc(installDevc) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/SET_INSTALL_DEVC", {
installdevc: installDevc
});
});
}
getObjectsList() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/LIST_OBJECT_TYPES");
return result['objectText'];
});
}
getTrmServerVersion() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/VERSION");
return result['version'];
});
}
getTrmRestVersion() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/VERSION");
return result['rest'];
});
}
trmServerPing() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/PING");
return result['return'];
});
}
renameTransportRequest(trkorr, as4text) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/RENAME_TRANSPORT_REQUEST", {
trkorr: trkorr.trim().toUpperCase(),
as4text: as4text
});
});
}
addTranslationToTr(trkorr, devclassFilter) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/ADD_LANG_TR", {
trkorr: trkorr,
devclass: devclassFilter
});
});
}
trCopy(from_1, to_1) {
return __awaiter(this, arguments, void 0, function* (from, to, doc = false) {
yield this._call("/ATRM/TR_COPY", {
from: from,
to: to,
doc: doc ? 'X' : ' '
});
});
}
addNamespace(namespace, replicense, texts) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/ADD_NAMESPACE", {
namespace: namespace,
replicense: replicense,
texts: texts
});
});
}
getR3transInfo() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_R3TRANS_INFO");
return result['log'];
});
}
deleteTmsTransport(trkorr, system) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/DEL_TRANSPORT_TMS", {
trkorr: trkorr,
system: system
});
});
}
refreshTransportTmsTxt(trkorr) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/REFRESH_TR_TMS_TXT", {
trkorr: trkorr
});
});
}
getDotAbapgit(devclass) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_DOT_ABAPGIT", {
devclass: devclass
});
return result['dotAbapgit'];
});
}
getAbapgitSource(devclass) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_ABAPGIT_SOURCE", {
devclass: devclass
});
const sXml = result['objects'].toString().replace(/&/g, "&").replace(/-/g, "-");
const oAbapXml = xml.xml2js(sXml, { compact: true });
const objects = oAbapXml['asx:abap']['asx:values']['OBJECTS'].item.map(o => {
return {
pgmid: o['PGMID']['_text'],
object: o['OBJECT']['_text'],
objName: o['OBJ_NAME']['_text'],
fullPath: o['FULL_PATH']['_text']
};
});
return {
zip: result['zip'],
objects
};
});
}
executePostActivity(data, pre) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/EXECUTE_POST_ACTIVITY", {
data: data,
pre: pre ? 'X' : ''
});
return {
messages: result['messages'],
execute: result['execute'] === 'X'
};
});
}
getInstalledPackagesBackend(filter) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_INSTALLED_PACKAGES", filter ? {
package_name: filter.name,
package_registry: filter.registry
} : undefined);
return result['packages'].map(o => {
return Object.assign(Object.assign({}, o), {
manifest: o.manifest.toString()
});
});
});
}
isServerApisAllowed() {
return __awaiter(this, void 0, void 0, function* () {
try {
yield this._call("/ATRM/CHECK_AUTH");
return true;
}
catch (e) {
return e;
}
});
}
changeTrOwner(trkorr, owner) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/CHANGE_TR_OWNER", {
trkorr: trkorr,
new_owner: owner
});
});
}
getPackageDependencies(devclass, includeSubPackages, logId) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_DEPENDENCIES", {
devclass: devclass,
incl_sub: includeSubPackages ? 'X' : ' ',
log_id: logId
});
return result['dependencies'];
});
}
getObjectDependenciesInternal(object, objName) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_DEPENDENCIES_SINGLE", {
object: {
object,
obj_name: objName
}
});
return result['dependencies'];
});
}
createLogPolling(event) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/CREATE_LOG_POLLING", {
event: event
});
return result['id'];
});
}
deleteLogPolling(logID) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/DELETE_LOG_POLLING", {
id: logID
});
});
}
readLogPolling(logID) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/READ_LOG_POLLING", {
id: logID
});
return result['log'];
});
}
getTransportImportStatus(trkorr, system) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_TR_IMPORT_STATUS", {
trkorr: trkorr,
system: system
});
return result['status'];
});
}
getObjectsLocks(objects) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_OBJS_LOCKS", {
objects
});
return result['locks'];
});
}
updateTrmPackageData(data) {
return __awaiter(this, void 0, void 0, function* () {
yield this._call("/ATRM/UPDATE_TRM_PACKAGE_DATA", {
data
});
});
}
getTransportTargets() {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this._call("/ATRM/GET_TR_TARGETS");
return result['targets'];
});
}
}
exports.RFCClient = RFCClient;