@getanthill/datastore
Version:
Event-Sourced Datastore
240 lines • 8.73 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 });
process.env.MONGOMS_DOWNLOAD_URL =
process.env.MONGOMS_DOWNLOAD_URL ||
'https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian12-8.0.3.tgz';
process.env.OTEL_PROMETHEUS_EXPORTER_PREVENT_SERVER_START = 'true';
/* @ts-ignore */
const jest_preset_1 = __importDefault(require("@shelf/jest-mongodb/jest-preset"));
const lodash_1 = require("lodash");
const util_1 = __importDefault(require("util"));
const net_1 = __importDefault(require("net"));
const config_1 = __importDefault(require("./config"));
const models_1 = require("./models");
const App_1 = __importDefault(require("./App"));
const services_1 = require("./services");
const Datastore_1 = __importDefault(require("./sdk/Datastore"));
// Set the default ACCESS_TOKENS for the tests:
process.env.ADMIN_ACCESS_TOKENS = 'token';
async function setup() {
console.log('Global Setup');
process.env.SKIP_MONGODB_IN_MEMORY !== 'true' &&
(await setupMongodbInMemory());
}
exports.default = setup;
async function setupMongodbInMemory(attempt = 0) {
try {
const { default: setupMongoDb } = await Promise.resolve(`${jest_preset_1.default.globalSetup}`).then(s => __importStar(require(s)));
await setupMongoDb({
rootDir: '.',
});
}
catch (err) {
if (attempt < 10) {
console.warn(err);
console.log('Retrying the MongoDB setup');
await new Promise((resolve) => setTimeout(resolve, 1000));
setupMongodbInMemory(attempt + 1);
return;
}
console.error(err);
process.exit(1);
}
}
async function teardownMongoDbInMemory() {
try {
const { default: teardownMongoDb } = await Promise.resolve(`${jest_preset_1.default.globalTeardown}`).then(s => __importStar(require(s)));
process.env.SKIP_MONGODB_IN_MEMORY !== 'true' &&
(await teardownMongoDb({
rootDir: '.',
}));
}
catch (err) {
console.warn(err);
}
}
setup.setupMongodbInMemory = setupMongodbInMemory;
setup.teardownMongoDbInMemory = teardownMongoDbInMemory;
setup.uuid = function uuid() {
return 'uuid' + (Math.random() * 1e16).toFixed(0);
};
const DEFAULT_SERVICES_CONFIG = config_1.default;
async function getPort() {
return new Promise((resolve) => {
const srv = net_1.default.createServer();
srv.listen(0, () => {
// @ts-ignore
const port = srv.address()?.port;
srv.close(() => {
resolve(port);
});
});
});
}
setup.build = async (config = {}) => {
const dbName = `datastore_test_${new Date().getTime()}`;
const _config = (0, lodash_1.merge)({}, DEFAULT_SERVICES_CONFIG, {
mode: 'development',
port: await getPort(),
features: {
initInternalModels: false,
},
mongodb: {
databases: [
{
...DEFAULT_SERVICES_CONFIG.mongodb.databases[0],
url: (process.env.MONGO_URL ||
DEFAULT_SERVICES_CONFIG.mongodb.databases[0].url)
.replace('/?', '/' + dbName + '?')
.replace('/datastore', `/${dbName}`),
},
{
...DEFAULT_SERVICES_CONFIG.mongodb.databases[1],
url: (process.env.MONGO_URL ||
DEFAULT_SERVICES_CONFIG.mongodb.databases[1].url)
.replace('/?', '/' + dbName + '?')
.replace('/datastore', `/${dbName}`),
},
],
ensureIndexInBackground: true,
},
}, config);
const services = (0, services_1.build)(_config);
if (typeof jest !== 'undefined') {
/* @ts-ignore */
global.debugMock = jest
.spyOn(services.telemetry.logger, 'debug')
/* @ts-ignore */
.mockImplementation(() => null);
/* @ts-ignore */
global.infoMock = jest
.spyOn(services.telemetry.logger, 'info')
/* @ts-ignore */
.mockImplementation(() => null);
/* @ts-ignore */
global.warnMock = jest
.spyOn(services.telemetry.logger, 'warn')
/* @ts-ignore */
.mockImplementation(() => null);
/* @ts-ignore */
global.errorMock = jest
.spyOn(services.telemetry.logger, 'error')
/* @ts-ignore */
.mockImplementation(() => null);
}
await services.mongodb.connect();
await services.mongodb.db('datastore_write').dropDatabase();
await services.fhe.connect();
return new App_1.default(services);
};
setup.cleanModel = async function cleanModel(services, modelName) {
// Remove internal models
await Promise.all([
services.mongodb.db('datastore_write').collection(modelName).deleteMany({}),
services.mongodb
.db('datastore_write')
.collection(`${modelName}_events`)
.deleteMany({}),
services.mongodb
.db('datastore_write')
.collection(`${modelName}_snapshots`)
.deleteMany({}),
]);
};
setup.cleanModels = async function cleanModels(services) {
await setup.cleanModel(services, 'internal_models');
};
setup.initModels = async function initModels(services, modelConfigs = []) {
const models = (0, models_1.init)({
models: [],
}, services);
await setup.cleanModels(services);
await Promise.all(modelConfigs.map((modelConfig) => models.createModel({
is_enabled: true,
...modelConfig,
})));
await models.reload();
await Promise.all(modelConfigs.map((modelConfig) => models.createModelIndexes(modelConfig)));
models.services = services;
services.models = models;
return models;
};
setup.teardownDb = async function teardownDb(mongodb) {
try {
if (!mongodb.db('datastore_write')) {
return;
}
await mongodb.db('datastore_write').dropDatabase();
await mongodb.disconnect();
}
catch (err) {
console.error(err);
}
};
setup.startApi = async function startApi(_config = {}, modelConfigs = []) {
const app = await setup.build(_config);
app.services.models = await setup.initModels(app.services, modelConfigs);
await app.services.models.initInternalModels();
await app.start();
const sdk = new Datastore_1.default({
baseUrl: `http://localhost:${app.services.config.port}`,
// Set to true to inspect SDK responses:
debug: process.env.DATASTORE_DEBUG === 'true',
token: 'token',
timeout: 300000,
telemetry: app.services.telemetry,
});
let res = { state: 'down' };
do {
const { data } = await sdk.heartbeat();
res = data;
} while (res.state !== 'up' &&
(await new Promise((resolve) => setTimeout(resolve, 10))));
return [
app.services.config,
app.services.mongodb,
app.services.models,
app.express,
app.server,
sdk,
app.services,
app,
];
};
setup.stopApi = async function stopApi(app) {
await app.stop();
};
setup.restartApi = async function restartApi(app, _config = {}) {
await setup.stopApi(app);
return setup.startApi(_config);
};
setup.inspect = (obj) => {
console.log(util_1.default.inspect(obj, false, null, true));
};
//# sourceMappingURL=setup.js.map