UNPKG

trm-core

Version:

TRM (Transport Request Manager) Core

591 lines (590 loc) 29.7 kB
"use strict"; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SystemConnectorBase = exports.INSTALL_DEVCLASS_VIEW = exports.SKIP_TRKORR_TABL = exports.SRC_TRKORR_TABL = exports.TRM_REST_PACKAGE_NAME = exports.TRM_REST_INTF = exports.TRM_SERVER_INTF = exports.TRM_SERVER_PACKAGE_NAME = void 0; const semver_1 = require("semver"); const trm_commons_1 = require("trm-commons"); const manifest_1 = require("../manifest"); const transport_1 = require("../transport"); const trmPackage_1 = require("../trmPackage"); const registry_1 = require("../registry"); const node_r3trans_1 = require("node-r3trans"); const dependencies_1 = require("../dependencies"); const SystemConnector_1 = require("./SystemConnector"); exports.TRM_SERVER_PACKAGE_NAME = 'trm-server'; exports.TRM_SERVER_INTF = '/ATRM/IF_SERVER'; exports.TRM_REST_INTF = '/ATRM/IF_REST'; exports.TRM_REST_PACKAGE_NAME = 'trm-rest'; exports.SRC_TRKORR_TABL = '/ATRM/SRC_TRKORR'; exports.SKIP_TRKORR_TABL = '/ATRM/SKIPTRKORR'; exports.INSTALL_DEVCLASS_VIEW = '/ATRM/V_INSTDEVC'; class SystemConnectorBase { constructor() { this._tableKeys = {}; this._rootDevclass = {}; } getTransportStatus(trkorr) { return __awaiter(this, void 0, void 0, function* () { const aTrkorrStatusCheck = (yield this.readTable('E070', [{ fieldName: 'TRKORR' }, { fieldName: 'TRSTATUS' }], `TRKORR EQ '${trkorr}'`)); if (aTrkorrStatusCheck.length !== 1) { throw new Error(`Transport not found.`); } else { return aTrkorrStatusCheck[0].trstatus; } }); } getSourceTrkorr(refresh) { return __awaiter(this, void 0, void 0, function* () { if (!this._sourceTrkorr || refresh) { trm_commons_1.Logger.log(`Ready to read installed packages`, true); trm_commons_1.Logger.log(`Checking if ${exports.SRC_TRKORR_TABL} exists`, true); const tablExists = yield this.readTable('TADIR', [{ fieldName: 'OBJ_NAME' }], `PGMID EQ 'R3TR' AND OBJECT EQ 'TABL' AND OBJ_NAME EQ '${exports.SRC_TRKORR_TABL}'`); if (tablExists.length === 1) { trm_commons_1.Logger.log(`TABL ${exports.SRC_TRKORR_TABL} exists`, true); const srcTrkorr = yield this.readTable(exports.SRC_TRKORR_TABL, [{ fieldName: 'TRKORR' }]); this._sourceTrkorr = srcTrkorr.map(o => o.trkorr); } else { this._sourceTrkorr = []; } } return this._sourceTrkorr; }); } getObject(pgmid, object, objName) { return __awaiter(this, void 0, void 0, function* () { const tadir = yield this.readTable('TADIR', [{ fieldName: 'PGMID' }, { fieldName: 'OBJECT' }, { fieldName: 'OBJ_NAME' }, { fieldName: 'DEVCLASS' }, { fieldName: 'SRCSYSTEM' }, { fieldName: 'AUTHOR' }], `PGMID EQ '${pgmid.trim().toUpperCase()}' AND OBJECT EQ '${object.trim().toUpperCase()}' AND OBJ_NAME EQ '${objName.trim().toUpperCase()}'`); if (tadir.length === 1) { return tadir[0]; } }); } getIgnoredTrkorr(refresh) { return __awaiter(this, void 0, void 0, function* () { if (!this._ignoredTrkorr || refresh) { trm_commons_1.Logger.log(`Reading ignored transports`, true); trm_commons_1.Logger.log(`Checking if ${exports.SKIP_TRKORR_TABL} exists`, true); const tablExists = yield this.readTable('TADIR', [{ fieldName: 'OBJ_NAME' }], `PGMID EQ 'R3TR' AND OBJECT EQ 'TABL' AND OBJ_NAME EQ '${exports.SKIP_TRKORR_TABL}'`); if (tablExists.length === 1) { trm_commons_1.Logger.log(`TABLE ${exports.SKIP_TRKORR_TABL} exists`, true); const skipTrkorr = yield this.readTable(exports.SKIP_TRKORR_TABL, [{ fieldName: 'TRKORR' }]); this._ignoredTrkorr = skipTrkorr.map(o => o.trkorr); } else { this._ignoredTrkorr = []; } } return this._ignoredTrkorr; }); } getTrmServerPackage() { return __awaiter(this, void 0, void 0, function* () { var oPackage; const oPublicRegistry = registry_1.RegistryProvider.getRegistry(); const intf = yield this.getObject('R3TR', 'INTF', exports.TRM_SERVER_INTF); if (intf) { try { const trmServerVersion = yield this.getTrmServerVersion(); const oManifest = new manifest_1.Manifest({ name: exports.TRM_SERVER_PACKAGE_NAME, version: trmServerVersion }); if ((0, semver_1.valid)(trmServerVersion)) { oPackage = new trmPackage_1.TrmPackage(exports.TRM_SERVER_PACKAGE_NAME, oPublicRegistry, oManifest).setDevclass(intf.devclass); } } catch (e) { } } if (!oPackage) { throw new Error(`Package ${exports.TRM_SERVER_PACKAGE_NAME} was not found.`); } return oPackage; }); } getTrmRestPackage() { return __awaiter(this, void 0, void 0, function* () { var oPackage; const oPublicRegistry = registry_1.RegistryProvider.getRegistry(); const intf = yield this.getObject('R3TR', 'INTF', exports.TRM_REST_INTF); if (intf) { try { const trmRestVersion = yield this.getTrmRestVersion(); const oManifest = new manifest_1.Manifest({ name: exports.TRM_REST_PACKAGE_NAME, version: trmRestVersion }); if ((0, semver_1.valid)(trmRestVersion)) { oPackage = new trmPackage_1.TrmPackage(exports.TRM_REST_PACKAGE_NAME, oPublicRegistry, oManifest).setDevclass(intf.devclass); } } catch (e) { } } if (!oPackage) { throw new Error(`Package ${exports.TRM_REST_PACKAGE_NAME} was not found.`); } return oPackage; }); } getInstalledPackages(refresh, includeLocals, filter) { return __awaiter(this, void 0, void 0, function* () { var trmPackages = []; var fromBackend = false; if (!refresh && Array.isArray(this._installedPackages)) { trm_commons_1.Logger.log(`Reading cached version of installed packages`, true); return this._installedPackages; } const serverExists = yield this.readTable('TADIR', [{ fieldName: 'OBJ_NAME' }], `PGMID EQ 'R3TR' AND OBJECT EQ 'INTF' AND OBJ_NAME EQ '${exports.TRM_SERVER_INTF}'`); if (serverExists.length === 1) { trm_commons_1.Logger.log(`INTF ${exports.TRM_SERVER_INTF} exists, reading packages from backend API`, true); try { var installedPackagesBackend = yield this.getInstalledPackagesBackend(filter); installedPackagesBackend = installedPackagesBackend.sort((a, b) => Number(`${b.as4Date}${b.as4Time}`) - Number(`${a.as4Date}${a.as4Time}`)); if (!includeLocals) { installedPackagesBackend = installedPackagesBackend.filter(o => o.packageRegistry !== registry_1.LOCAL_RESERVED_KEYWORD); } for (const o of installedPackagesBackend) { const manifest = manifest_1.Manifest.fromAbapXml(o.manifest); if (o.trkorr) { manifest.setLinkedTransport(new transport_1.Transport(o.trkorr, null)); } const trmPackage = new trmPackage_1.TrmPackage(o.packageName, registry_1.RegistryProvider.getRegistry(o.packageRegistry), manifest).setDevclass(o.devclass).setDirtyEntries(o.dirty); trmPackages.push(trmPackage); } fromBackend = true; } catch (e) { trmPackages = []; trm_commons_1.Logger.error(e.toString(), true); } } if (fromBackend) { trm_commons_1.Logger.log(`Packages were fetched from backend API`, true); return trmPackages; } else { trm_commons_1.Logger.log(`Packages weren't fetched from backend API, continue`, true); } var packageTransports = []; trm_commons_1.Logger.log(`Ready to read installed packages`, true); var allTransports = (yield this.readTable('E071', [{ fieldName: 'TRKORR' }], `PGMID EQ '*' AND OBJECT EQ '${transport_1.COMMENT_OBJ}'`)).map(o => o.trkorr); allTransports = Array.from(new Set(allTransports)); for (const trkorr of allTransports) { var aTrkorrStatusCheck; try { trm_commons_1.Logger.log(`Checking ${trkorr} TMS import result`, true); aTrkorrStatusCheck = (yield this.readTable('TMSBUFFER', [{ fieldName: 'TRKORR' }, { fieldName: 'MAXRC' }], `SYSNAM EQ '${this.getSysname()}' AND TRKORR EQ '${trkorr}' AND IMPSING NE 'X'`)); aTrkorrStatusCheck = aTrkorrStatusCheck.filter(o => parseInt(o.maxrc) >= 0); } catch (e) { aTrkorrStatusCheck = []; } if (aTrkorrStatusCheck.length === 0) { trm_commons_1.Logger.log(`${trkorr} is ignored: no status!`, true); allTransports = allTransports.filter(s => s !== trkorr); } } trm_commons_1.Logger.log(`All transports to check: ${JSON.stringify(allTransports)}`, true); const transports = allTransports.map(trkorr => new transport_1.Transport(trkorr, null)); for (const transport of transports) { const trmPackage = yield transport.getLinkedPackage(); if (trmPackage) { trm_commons_1.Logger.log(`Transport ${transport.trkorr}, found linked package`, true); if (trmPackage.registry.getRegistryType() === registry_1.RegistryType.LOCAL && !includeLocals) { trm_commons_1.Logger.log(`Package is local, skipping`, true); continue; } var arrayIndex = packageTransports.findIndex(o => trmPackage_1.TrmPackage.compare(o.package, trmPackage)); if (arrayIndex < 0) { arrayIndex = packageTransports.push({ package: trmPackage, transports: [] }); arrayIndex--; } packageTransports[arrayIndex].transports.push(transport); } } trm_commons_1.Logger.log(`Package Transports map: ${(0, trm_commons_1.inspect)(packageTransports.map(o => { return { packageName: o.package.packageName, registry: o.package.registry.endpoint, transports: o.transports.map(k => k.trkorr) }; }), { breakLength: Infinity, compact: true })}`, true); for (const packageTransport of packageTransports) { const latestTransport = yield transport_1.Transport.getLatest(packageTransport.transports); if (latestTransport) { trmPackages.push(yield latestTransport.getLinkedPackage()); } } trm_commons_1.Logger.log(`Packages found: ${(0, trm_commons_1.inspect)(trmPackages, { breakLength: Infinity, compact: true })}`, true); this._installedPackages = trmPackages; return trmPackages; }); } getDevclass(devclass) { return __awaiter(this, void 0, void 0, function* () { const tdevc = yield this.readTable('TDEVC', [{ fieldName: 'DEVCLASS' }, { fieldName: 'PARENTCL' }, { fieldName: 'TPCLASS' }, { fieldName: 'DLVUNIT' }], `DEVCLASS EQ '${devclass.trim().toUpperCase()}'`); if (tdevc.length === 1) { return tdevc[0]; } }); } getSubpackages(devclass) { return __awaiter(this, void 0, void 0, function* () { const queryFields = [{ fieldName: 'DEVCLASS' }, { fieldName: 'PARENTCL' }]; var subpackages = []; const initial = yield this.readTable('TDEVC', queryFields, `DEVCLASS EQ '${devclass.trim().toUpperCase()}'`); if (initial.length === 1) { subpackages.push({ tdevc: initial[0], queryDone: false }); } while (subpackages.find(o => !o.queryDone)) { const searchParentIndex = subpackages.findIndex(o => !o.queryDone); const tdevc = yield this.readTable('TDEVC', queryFields, `PARENTCL EQ '${subpackages[searchParentIndex].tdevc.devclass.trim().toUpperCase()}'`); subpackages[searchParentIndex].queryDone = true; tdevc.forEach(o => { subpackages.push({ tdevc: o, queryDone: false }); }); } return subpackages.map(o => o.tdevc).filter(o => o.devclass !== devclass.trim().toUpperCase()); }); } getDevclassObjects(devclass_1) { return __awaiter(this, arguments, void 0, function* (devclass, includeSubpackages = true) { var aTadir = []; var aDevclass = [devclass]; if (includeSubpackages) { aDevclass = aDevclass.concat(((yield this.getSubpackages(devclass)).map(o => o.devclass))); } for (const d of aDevclass) { aTadir = aTadir.concat(((yield this.listDevclassObjects(d.trim().toUpperCase())))); } return aTadir; }); } getInstallPackages(packageName, registry) { return __awaiter(this, void 0, void 0, function* () { const registryEndpoint = registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? registry_1.PUBLIC_RESERVED_KEYWORD : registry.endpoint; return yield this.readTable(exports.INSTALL_DEVCLASS_VIEW, [{ fieldName: 'ORIGINAL_DEVCLASS' }, { fieldName: 'INSTALL_DEVCLASS' }], `PACKAGE_NAME EQ '${packageName}' AND PACKAGE_REGISTRY EQ '${registryEndpoint}'`); }); } setPackageSuperpackage(devclass, superpackage) { return __awaiter(this, void 0, void 0, function* () { return yield this.tdevcInterface(devclass, superpackage); }); } clearPackageSuperpackage(devclass) { return __awaiter(this, void 0, void 0, function* () { return yield this.tdevcInterface(devclass, null, true); }); } setPackageTransportLayer(devclass, devlayer) { return __awaiter(this, void 0, void 0, function* () { return yield this.tdevcInterface(devclass, null, null, devlayer); }); } checkSapEntryExists(table, sapEntry) { return __awaiter(this, void 0, void 0, function* () { try { var aQuery = []; Object.keys(sapEntry).forEach(k => { aQuery.push(`${k.trim().toUpperCase()} EQ '${sapEntry[k]}'`); }); const entry = yield this.readTable(table.trim().toUpperCase(), [{ fieldName: Object.keys(sapEntry)[0].trim().toUpperCase() }], aQuery.join(' AND ')); return entry.length > 0; } catch (e) { return false; } }); } getPackageIntegrity(oPackage) { return __awaiter(this, void 0, void 0, function* () { const packageName = oPackage.packageName; const registryEndpoint = oPackage.registry.getRegistryType() === registry_1.RegistryType.PUBLIC ? registry_1.PUBLIC_RESERVED_KEYWORD : oPackage.registry.endpoint; const aIntegrity = yield this.readTable('ZTRM_INTEGRITY', [{ fieldName: 'INTEGRITY' }], `PACKAGE_NAME EQ '${packageName}' AND PACKAGE_REGISTRY EQ '${registryEndpoint}'`); if (aIntegrity.length === 1) { return aIntegrity[0].integrity; } else { return ''; } }); } getFunctionModule(func) { return __awaiter(this, void 0, void 0, function* () { const aTfdir = yield this.readTable('TFDIR', [{ fieldName: 'FUNCNAME' }, { fieldName: 'PNAME' }], `FUNCNAME EQ '${func.trim().toUpperCase()}'`); if (aTfdir.length === 1) { return aTfdir[0]; } }); } getExistingObjects(objects) { return __awaiter(this, void 0, void 0, function* () { var ret = []; for (const object of objects) { const oTadir = yield this.getObject(object.pgmid, object.object, object.objName); if (oTadir) { ret.push(oTadir); } } return ret; }); } getNamespace(namespace) { return __awaiter(this, void 0, void 0, function* () { const aNamespace = yield this.readTable('TRNSPACET', [{ fieldName: 'NAMESPACE' }, { fieldName: 'REPLICENSE' }], `NAMESPACE EQ '${namespace.toUpperCase()}'`); if (aNamespace.length === 1) { const aNamespacet = yield this.readTable('TRNSPACETT', [{ fieldName: 'NAMESPACE' }, { fieldName: 'SPRAS' }, { fieldName: 'DESCRIPTN' }, { fieldName: 'OWNER' }], `NAMESPACE EQ '${namespace.toUpperCase()}'`); return { trnspacet: aNamespace[0], trnspacett: aNamespacet }; } }); } getR3transVersion() { return __awaiter(this, void 0, void 0, function* () { if (!this._r3transInfoLog) { this._r3transInfoLog = yield this.getR3transInfo(); } return node_r3trans_1.R3trans.getVersion(this._r3transInfoLog); }); } getR3transUnicode() { return __awaiter(this, void 0, void 0, function* () { if (!this._r3transInfoLog) { this._r3transInfoLog = yield this.getR3transInfo(); } return node_r3trans_1.R3trans.isUnicode(this._r3transInfoLog); }); } isTransportLayerExist(devlayer) { return __awaiter(this, void 0, void 0, function* () { const aTransportLayer = (yield this.readTable('TCETRAL', [{ fieldName: 'VERSION' }, { fieldName: 'TRANSLAYER' }], `TRANSLAYER EQ '${devlayer}'`)); return aTransportLayer.length > 0; }); } readClassDescriptions(clsname) { return __awaiter(this, void 0, void 0, function* () { return yield this.readTable('SEOCLASSTX', [{ fieldName: 'CLSNAME' }, { fieldName: 'LANGU' }, { fieldName: 'DESCRIPT' }], `CLSNAME EQ '${clsname.trim().toUpperCase()}'`); }); } getPackageDependencies(devclass, includeSubPackages) { return __awaiter(this, void 0, void 0, function* () { var packageDependencies; const logProgress = trm_commons_1.Logger.progressbar('Finding dependencies [{bar}] {percentage}%', '>'); logProgress.start(100, 0); const isStateless = SystemConnector_1.SystemConnector.isStateless(); const newConnection = isStateless ? SystemConnector_1.SystemConnector.systemConnector : SystemConnector_1.SystemConnector.getNewConnection(); if (!isStateless) { yield newConnection.connect(true); const logId = yield newConnection.createLogPolling('DEVCLASS_D'); const job = this.getPackageDependenciesInternal(devclass, includeSubPackages, logId); var stopped = false; const poll = (() => __awaiter(this, void 0, void 0, function* () { while (!stopped) { try { const status = yield newConnection.readLogPolling(logId); if (status) { const match = status.match(/\(([\d.]+)%\)/); if (match) { logProgress.update(parseFloat(match[1])); } } } catch (_a) { } yield new Promise(r => setTimeout(r, 500)); } }))(); try { packageDependencies = yield job; } catch (e) { try { yield newConnection.deleteLogPolling(logId); } catch (_a) { } throw e; } stopped = true; yield poll; logProgress.update(100); try { yield newConnection.deleteLogPolling(logId); if (!isStateless) { yield newConnection.closeConnection(); } } catch (_b) { } logProgress.stop(); return (yield new dependencies_1.PackageDependencies(devclass).setDependencies(packageDependencies || [])); } else { packageDependencies = yield this.getPackageDependenciesInternal(devclass, includeSubPackages); return (yield new dependencies_1.PackageDependencies(devclass).setDependencies(packageDependencies || [])); } }); } getObjectDependencies(object, objName) { return __awaiter(this, void 0, void 0, function* () { const objectDependencies = yield this.getObjectDependenciesInternal(object, objName); return (yield new dependencies_1.ObjectDependencies(object, objName).setDependencies(objectDependencies || [])); }); } getTableKeys(tabname) { return __awaiter(this, void 0, void 0, function* () { tabname = tabname.trim().toUpperCase(); if (!this._tableKeys[tabname]) { this._tableKeys[tabname] = yield this.readTable('DD03L', [{ fieldName: 'FIELDNAME' }, { fieldName: 'POSITION' }, { fieldName: 'LENG' }], `TABNAME EQ '${tabname.trim().toUpperCase()}' AND AS4LOCAL EQ 'A' AND AS4VERS EQ '0000' AND KEYFLAG EQ 'X'`); } return this._tableKeys[tabname]; }); } getRootDevclass(devclass) { return __awaiter(this, void 0, void 0, function* () { devclass = devclass.trim().toUpperCase(); var currentDevclass = devclass; if (!this._rootDevclass[currentDevclass]) { var pastDevclass = []; while (currentDevclass) { var res = (yield this.readTable('TDEVC', [{ fieldName: 'DEVCLASS' }, { fieldName: 'PARENTCL' }], `DEVCLASS EQ '${currentDevclass}'`))[0]; if (res.parentcl) { pastDevclass.push(currentDevclass); currentDevclass = res.parentcl; } else { pastDevclass.push(currentDevclass); pastDevclass.forEach(p => { this._rootDevclass[p] = res.devclass; }); currentDevclass = null; } } } return this._rootDevclass[devclass]; }); } getTimezone() { return __awaiter(this, void 0, void 0, function* () { if (!this._timezone) { const map = { CET: "Europe/Berlin", EET: "Europe/Helsinki", GMTUK: "Europe/London", AZOREN: "Atlantic/Azores", CYPRUS: "Asia/Nicosia", MOLDVA: "Europe/Chisinau", TURKEY: "Europe/Istanbul", CAT: "Africa/Harare", EGYPT: "Africa/Cairo", MOROCC: "Africa/Casablanca", ISRAEL: "Asia/Jerusalem", IRAN: "Asia/Tehran", IRAQ: "Asia/Baghdad", JORDAN: "Asia/Amman", LBANON: "Asia/Beirut", SYRIA: "Asia/Damascus", AFGHAN: "Asia/Kabul", AZT: "Asia/Baku", BDT: "Asia/Dhaka", INDIA: "Asia/Kolkata", JAPAN: "Asia/Tokyo", NEPAL: "Asia/Kathmandu", PKT: "Asia/Karachi", RUS02: "Europe/Kaliningrad", RUS03: "Europe/Moscow", RUS04: "Europe/Samara", RUS05: "Asia/Yekaterinburg", RUS06: "Asia/Omsk", RUS07: "Asia/Krasnoyarsk", RUS08: "Asia/Irkutsk", RUS09: "Asia/Yakutsk", RUS10: "Asia/Vladivostok", RUS11: "Asia/Magadan", RUS12: "Asia/Kamchatka", AUSEUC: "Australia/Eucla", AUSLHI: "Australia/Lord_Howe", AUSNSW: "Australia/Sydney", AUSNT: "Australia/Darwin", AUSQLD: "Australia/Brisbane", AUSSA: "Australia/Adelaide", AUSTAS: "Australia/Hobart", AUSVIC: "Australia/Melbourne", AUSWA: "Australia/Perth", NORFLK: "Pacific/Norfolk", NZST: "Pacific/Auckland", NZCHA: "Pacific/Chatham", ALA: "America/Anchorage", ALAW: "America/Adak", EST: "America/New_York", EST_: "America/Toronto", EST_NA: "America/New_York", ESTNO: "America/New_York", CST: "America/Chicago", CST_NA: "America/Chicago", CSTNO: "America/Chicago", MST: "America/Denver", MSTNO: "America/Phoenix", MST_NA: "America/Denver", PST: "America/Los_Angeles", HAW: "Pacific/Honolulu", NST: "America/St_Johns", PIERRE: "America/Miquelon", ART: "America/Argentina/Buenos_Aires", BRAZIL: "America/Sao_Paulo", BRZLAN: "America/Manaus", BRZLWE: "America/Rio_Branco", CHILE: "America/Santiago", CHILEE: "Pacific/Easter", CHILEM: "America/Punta_Arenas", PARAGY: "America/Asuncion", URUGUA: "America/Montevideo", GST: "America/Godthab", GSTE: "America/Scoresbysund", GSTW: "America/Godthab", FLKLND: "Atlantic/Stanley", FIJI: "Pacific/Fiji", MAU: "Indian/Mauritius", UTC: "UTC", }; try { const sapTimezone = (yield this.readTable('TTZCU', [{ fieldName: 'TZONESYS' }]))[0].tzonesys; const m = sapTimezone.match(/^UTC([+-])(\d{1,2})$/); if (m) { const sign = m[1]; const hours = Number(m[2]); const etcSign = sign === "+" ? "-" : "+"; this._timezone = `Etc/GMT${etcSign}${hours}`; } if (!map[sapTimezone]) { throw new Error(`Unsupported SAP timezone: ${sapTimezone}`); } this._timezone = map[sapTimezone]; } catch (e) { trm_commons_1.Logger.error(`Cannot read/parse system timezone!`, true); trm_commons_1.Logger.error(e.toString(), true); this._timezone = 'UTC'; } } return this._timezone; }); } } exports.SystemConnectorBase = SystemConnectorBase;