UNPKG

trm-core

Version:

TRM (Transport Request Manager) Core

726 lines (725 loc) 27.9 kB
"use strict"; 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, "&amp;").replace(/-/g, "&#45;"); 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;