@restorecommerce/chassis-srv
Version:
Restore Commerce microservice chassis
152 lines • 5.53 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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.create = void 0;
const base_1 = require("./base");
const graph_1 = require("./graph");
const async_retry_1 = __importDefault(require("async-retry"));
const fs = __importStar(require("fs"));
const arangojs_1 = require("arangojs");
const DB_SYSTEM = '_system';
/**
* Connect to a ArangoDB.
* @param {Object} conf Connection options.
* @param {Logger} logger
* @return active ArangoDB connection
*/
const connect = async (conf, logger) => {
const dbHost = conf.host || '127.0.0.1';
const dbPort = conf.port || 8529;
const dbName = conf.database || 'arango';
const autoCreate = conf.autoCreate || false;
const attempts = conf.retries || 3;
const delay = conf.delay || 1000;
const arangoVersion = conf.version || 30000;
let url = 'http://';
const username = conf.username;
const password = conf.password;
if (username && password) {
url = url + `${username}:${password}@`;
}
url = url + `${dbHost}:${dbPort}`;
let mainError;
let i = 1;
try {
return await (0, async_retry_1.default)(async () => {
logger?.info('Attempt to connect database', {
dbHost, dbPort, dbName,
attempt: i
});
i += 1;
const db = new arangojs_1.Database({
url,
arangoVersion,
});
try {
if (username && password) {
db.useBasicAuth(username, password);
}
await db.database(dbName).get();
}
catch (err) {
if (err.name === 'ArangoError' && err.errorNum === 1228) {
if (autoCreate) {
logger?.verbose(`auto creating arango database ${dbName}`);
// Database does not exist, create a new one
db.database(DB_SYSTEM);
await db.createDatabase(dbName);
db.database(dbName);
return db.database(dbName);
}
}
throw err;
}
return db.database(dbName);
}, { retries: attempts, minTimeout: delay });
}
catch (err) {
const safeError = Object.getOwnPropertyNames(Object.getPrototypeOf(err))
.reduce((acc, curr) => { return acc[curr] = err[curr], acc; }, {});
logger?.error('Database connection error', { err: safeError, dbHost, dbPort, dbName, attempt: i });
mainError = err;
}
throw mainError;
};
/**
* Create a new connected ArangoDB provider.
*
* @param {Object} conf ArangoDB configuration
* @param {Object} [logger] Logger
* @return {Arango} ArangoDB provider
*/
const create = async (conf, logger, graphName, edgeDefConfig) => {
let graph;
const conn = await connect(conf, logger);
let db;
// conn is nothing but this.db
if (graphName) {
try {
graph = conn.graph(graphName);
await graph.create(edgeDefConfig);
}
catch (err) {
if (err.message !== 'graph already exists') {
throw err;
}
}
db = new graph_1.ArangoGraph(conn, graph, edgeDefConfig, logger);
}
else {
db = new base_1.Arango(conn, logger);
}
// iterate db conf and create list of views / analayzers
if (conf?.arangoSearch?.length > 0) {
for (const obj of conf.arangoSearch) {
try {
const { collectionName, path } = obj;
const viewCfg = JSON.parse(fs.readFileSync(path, 'utf8'));
await db.createAnalyzerAndView(viewCfg, collectionName);
}
catch (error) {
logger?.error('Error creating analyzer or view', {
code: error.code, message: error.message, stack: error.stack
});
}
}
}
if (conf.customQueries) {
conf.customQueries.forEach((obj) => {
const { path, name, type } = obj;
const script = fs.readFileSync(path, 'utf8');
db.registerCustomQuery(name, script, type);
});
}
return db;
};
exports.create = create;
//# sourceMappingURL=index.js.map