trm-core
Version:
TRM (Transport Request Manager) Core
521 lines (520 loc) • 27.2 kB
JavaScript
;
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.SKIP_TRKORR_TABL = exports.SRC_TRKORR_TABL = exports.TRM_REST_PACKAGE_NAME = 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");
exports.TRM_SERVER_PACKAGE_NAME = 'trm-server';
exports.TRM_SERVER_INTF = 'ZIF_TRM';
exports.TRM_REST_PACKAGE_NAME = 'trm-rest';
exports.SRC_TRKORR_TABL = 'ZTRM_SRC_TRKORR';
exports.SKIP_TRKORR_TABL = 'ZTRM_SKIP_TRKORR';
class SystemConnectorBase {
constructor() {
}
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;
}
});
}
getPackageWorkbenchTransport(oPackage) {
return __awaiter(this, void 0, void 0, function* () {
var aTrkorr = (yield this.readTable('E071', [{ fieldName: 'TRKORR' }], `PGMID EQ '*' AND OBJECT EQ '${transport_1.COMMENT_OBJ}'`)).map(o => o.trkorr);
aTrkorr = Array.from(new Set(aTrkorr));
var aSkipTrkorr = [];
for (const sTrkorr of aTrkorr) {
var canBeReleased = false;
try {
canBeReleased = (yield this.getTransportStatus(sTrkorr)) === 'D';
}
catch (e) {
canBeReleased = false;
}
if (!canBeReleased) {
aSkipTrkorr.push(sTrkorr);
}
}
aTrkorr = aTrkorr.filter(trkorr => !aSkipTrkorr.includes(trkorr));
const transports = aTrkorr.map(trkorr => new transport_1.Transport(trkorr));
var packageTransports = [];
for (const transport of transports) {
const transportPackage = yield transport.getLinkedPackage();
if (transportPackage) {
if (trmPackage_1.TrmPackage.compare(transportPackage, oPackage)) {
packageTransports.push(transport);
}
}
}
if (packageTransports.length > 0) {
return yield transport_1.Transport.getLatest(packageTransports);
}
return null;
});
}
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', 'ZIF_TRM');
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', 'ZIF_TRM_REST');
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() {
return __awaiter(this, arguments, void 0, function* (includeSoruces = true, refresh, includeLocals) {
var trmPackages = [];
var fromBackend = false;
if (!refresh) {
if (includeSoruces && this._installedPackagesI) {
trm_commons_1.Logger.log(`Cached version of installed packages with sources`, true);
return this._installedPackagesI;
}
else if (!includeSoruces && this._installedPackages) {
trm_commons_1.Logger.log(`Cached version of installed packages without sources`, true);
return this._installedPackages;
}
}
trm_commons_1.Logger.log(`Include sources: ${includeSoruces}`, true);
const aSourceTrkorr = includeSoruces ? (yield this.getSourceTrkorr(refresh)) : [];
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`, true);
try {
var installedPackagesBackend = yield this.getInstalledPackagesBackend();
if (!includeSoruces) {
installedPackagesBackend = installedPackagesBackend.filter(o => !aSourceTrkorr.includes(o.transport.trkorr));
}
if (!includeLocals) {
installedPackagesBackend = installedPackagesBackend.filter(o => o.registry !== registry_1.LOCAL_RESERVED_KEYWORD);
}
for (const o of installedPackagesBackend) {
const transport = o.transport.trkorr ? new transport_1.Transport(o.transport.trkorr, null, o.transport.migration) : null;
const manifest = manifest_1.Manifest.fromAbapXml(o.manifest);
if (transport) {
manifest.setLinkedTransport(transport);
}
const trmPackage = new trmPackage_1.TrmPackage(o.name, registry_1.RegistryProvider.getRegistry(o.registry), manifest);
if (transport) {
try {
trmPackage.setDevclass(yield transport.getDevclass(o.tdevc));
}
catch (x) {
}
}
else {
if (o.tdevc.length === 1) {
trmPackage.setDevclass(o.tdevc[0].devclass);
}
}
trmPackage.setWbTransport(o.trkorr ? new transport_1.Transport(o.trkorr) : null);
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`, true);
return trmPackages;
}
else {
trm_commons_1.Logger.log(`Packages weren't fetched from backend, continue`, true);
}
var packageTransports = [];
trm_commons_1.Logger.log(`Ready to read installed packages`, true);
trm_commons_1.Logger.log(`Source trkorr ${JSON.stringify(aSourceTrkorr)}`, true);
var aSkipTrkorr = yield this.getIgnoredTrkorr();
trm_commons_1.Logger.log(`Ignored trkorr ${JSON.stringify(aSkipTrkorr)}`, true);
var aMigrationTrkorr;
var aActualTrkorr = (yield this.readTable('E071', [{ fieldName: 'TRKORR' }], `PGMID EQ '*' AND OBJECT EQ '${transport_1.COMMENT_OBJ}' AND TRKORR EQ 'RSTK906391'`)).map(o => o.trkorr);
aActualTrkorr = Array.from(new Set(aActualTrkorr));
try {
aMigrationTrkorr = (yield this.readTable('ZTRM_E070', [{ fieldName: 'TRM_TROKRR' }])).map(o => o.trmTrokrr);
}
catch (e) {
aMigrationTrkorr = [];
}
var aTrkorr = aActualTrkorr.map(s => {
return {
trkorr: s,
migration: false
};
}).concat(aMigrationTrkorr.map(s => {
return {
trkorr: s,
migration: true
};
}));
for (const sTrkorr of aTrkorr) {
if (!aSourceTrkorr.includes(sTrkorr.trkorr)) {
trm_commons_1.Logger.log(`${sTrkorr.trkorr} not from source`, true);
var aTrkorrStatusCheck;
try {
trm_commons_1.Logger.log(`Checking ${sTrkorr.trkorr} TMS import result`, true);
if (!sTrkorr.migration) {
aTrkorrStatusCheck = (yield this.readTable('TMSBUFFER', [{ fieldName: 'TRKORR' }, { fieldName: 'MAXRC' }], `SYSNAM EQ '${this.getSysname()}' AND TRKORR EQ '${sTrkorr.trkorr}' AND IMPSING NE 'X'`));
}
else {
aTrkorrStatusCheck = (yield this.readTable('ZTRM_TMSBUFFER', [{ fieldName: 'TRKORR' }, { fieldName: 'MAXRC' }], `SYSNAM EQ '${this.getSysname()}' AND TRM_TROKRR EQ '${sTrkorr.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(`Adding ${sTrkorr.trkorr} to skipped filter`, true);
aSkipTrkorr.push(sTrkorr.trkorr);
}
}
}
aTrkorr = aTrkorr.filter(trkorr => !aSkipTrkorr.includes(trkorr.trkorr));
trm_commons_1.Logger.log(`Final transports ${JSON.stringify(aTrkorr)}`, true);
const transports = aTrkorr.map(trkorr => new transport_1.Transport(trkorr.trkorr, null, trkorr.migration));
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);
trm_commons_1.Logger.log(`Excluding trm-server (adding it manually)`, true);
try {
const trmServerPackage = trmPackages.find(o => o.packageName === exports.TRM_SERVER_PACKAGE_NAME && o.compareRegistry(registry_1.RegistryProvider.getRegistry()));
var generatedTrmServerPackage = yield this.getTrmServerPackage();
if (trmServerPackage && trmServerPackage.manifest) {
trm_commons_1.Logger.log(`trm-server was found (it was imported via transport)`, true);
if (trmServerPackage.manifest.get().version === generatedTrmServerPackage.manifest.get().version) {
trm_commons_1.Logger.log(`trm-server imported is the one currenlty in use`, true);
generatedTrmServerPackage.manifest = trmServerPackage.manifest;
}
}
trmPackages = trmPackages.filter(o => !(o.packageName === exports.TRM_SERVER_PACKAGE_NAME && o.compareRegistry(registry_1.RegistryProvider.getRegistry())));
trmPackages.push(generatedTrmServerPackage);
}
catch (e) {
trm_commons_1.Logger.warning(`${exports.TRM_SERVER_PACKAGE_NAME} is not installed`, true);
}
trm_commons_1.Logger.log(`Excluding trm-rest (adding it manually)`, true);
try {
const trmRestPackage = trmPackages.find(o => o.packageName === exports.TRM_REST_PACKAGE_NAME && o.compareRegistry(registry_1.RegistryProvider.getRegistry()));
var generatedTrmRestPackage = yield this.getTrmRestPackage();
if (trmRestPackage && trmRestPackage.manifest) {
trm_commons_1.Logger.log(`trm-rest was found (it was imported via transport)`, true);
if (trmRestPackage.manifest.get().version === generatedTrmRestPackage.manifest.get().version) {
trm_commons_1.Logger.log(`trm-rest imported is the one currenlty in use`, true);
generatedTrmRestPackage.manifest = trmRestPackage.manifest;
}
}
trmPackages = trmPackages.filter(o => !(o.packageName === exports.TRM_REST_PACKAGE_NAME && o.compareRegistry(registry_1.RegistryProvider.getRegistry())));
trmPackages.push(generatedTrmRestPackage);
}
catch (e) {
trm_commons_1.Logger.warning(`${exports.TRM_SERVER_PACKAGE_NAME} is not installed`, true);
}
if (includeSoruces) {
this._installedPackagesI = trmPackages;
}
else {
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' }], `DEVCLASS EQ '${devclass.trim().toUpperCase()}'`);
if (tdevc.length === 1) {
return tdevc[0];
}
});
}
getTransportTargets() {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield this.readTable('TMSCSYS', [{ fieldName: 'SYSNAM' }, { fieldName: 'SYSTXT' }, { fieldName: 'SYSTYP' }]);
}
catch (e) {
return yield this.readTable('TMSCSYS', [{ fieldName: 'SYSNAM' }, { fieldName: 'SYSTXT' }]);
}
});
}
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('ZTRMVINSTALLDEVC', [{ 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()}'`);
});
}
}
exports.SystemConnectorBase = SystemConnectorBase;