moleculer-qmit
Version:
QMIT moleculer options preset
237 lines • 10.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const vault_sync_1 = tslib_1.__importDefault(require("vault-sync"));
const child_process_1 = tslib_1.__importDefault(require("child_process"));
const kleur = tslib_1.__importStar(require("kleur"));
const defaultsDeep_1 = tslib_1.__importDefault(require("lodash/defaultsDeep"));
exports.createBrokerOptions = (override,
// dev, stage, prod, ... app provision environment
APP_ENV = process.env.APP_ENV || "dev",
// dev, dev-2, prod, prod-2. prod-asia-northeast-1a-2, ... GKE cluster name
APP_K8S_CLUSTER = process.env.APP_K8S_CLUSTER || process.env.APP_ENV || "dev") => {
/*
* Read mandatory environment variables
*/
console.log(`Creating moleculer service broker options ... ${kleur.cyan("APP_ENV=")}${kleur.green(APP_ENV)}, ${kleur.cyan("APP_K8S_CLUSTER=")}${kleur.blue(APP_K8S_CLUSTER)}`);
try {
/*
* Read common credentials and metadata
*/
const config = vault_sync_1.default((get, list) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
const [services, serviceKeysWithCredentials,] = yield Promise.all([
get("common/data/services").then(res => res.data),
list("common/metadata/services/credentials").then(res => res.keys),
]);
return {
services,
serviceKeysWithCredentials,
serviceKeys: services.groups.reduce((names, g) => names.concat(g.items.map((i) => i.key)), []),
};
}), {
// vault connection setting
uri: "https://vault.internal.qmit.pro",
debug: false,
// alternative auth method for kubernetes pod
method: `k8s/${APP_K8S_CLUSTER}`,
role: "default",
});
/*
* REPL customization
*/
function itemToString(item) {
return kleur.green(`${item.key}`.padEnd(16)) + ": "
+ (item.deprecated ? kleur.dim().white("(deprecated) ") : "")
+ item.desc + "\n".padEnd(19)
+ kleur.cyan(item.uri)
+ (config.serviceKeysWithCredentials.includes(item.key)
? "\n".padEnd(19) + kleur.dim().red(`credentials: vault kv get common/services/credentials/${item.key}`)
: "");
}
const replCommands = {
delimiter: `qmit-${APP_ENV}/${APP_K8S_CLUSTER} $`,
customCommands: [
{
command: "ls [keyword]",
types: {
string: ["keyword"],
},
autocomplete: config.serviceKeys,
description: `List of external services (${config.services.groups.reduce((cnt, g) => cnt + g.items.length, 0)})`,
action(broker, args) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const keyword = args.keyword ? args.keyword.toLowerCase() : null;
const str = config.services.groups.map(group => {
let s = group.items
.filter(item => keyword ? item.key.includes(keyword) || item.desc.toLowerCase().includes(keyword) : true)
.map(itemToString)
.join("\n\n");
if (keyword) {
s = s.split(keyword).join(kleur.bgRed(keyword));
s = s.split(keyword.toUpperCase()).join(kleur.bgRed(keyword.toUpperCase()));
}
if (!s) {
return null;
}
return kleur.green().bold(`${group.desc} (${group.items.length})`) + "\n" + s;
})
.filter(s => !!s)
.join("\n\n");
// eslint-disable-next-line no-console
console.log(str + "\n");
});
},
},
{
command: "open <serviceName>",
description: "Open external service",
autocomplete: config.serviceKeys,
types: {
string: ["serviceName"],
},
action(broker, args /*, helpers*/) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const name = args.serviceName.toLowerCase();
let foundItem = null;
config.services.groups.find(g => {
return g.items.find(item => {
if (item.key === name) {
foundItem = item;
return true;
}
});
});
if (foundItem) {
// eslint-disable-next-line no-console
console.log(itemToString(foundItem) + "\n");
// eslint-disable-next-line security/detect-child-process
child_process_1.default.exec(`open ${foundItem.uri}`);
return;
}
const err = new Error();
err.stack = kleur.red(`Not available service: ${name}`);
throw err;
});
},
},
],
};
/*
* Default Moleculer Service Broker Configuration for QMIT Inc.
*/
const defaults = {
namespace: APP_ENV,
// nodeID: undefined,
logger: true,
// logLevel: undefined,
// logFormatter: "default",
// logObjectPrinter: undefined,
transporter: "redis://redis.internal.qmit.pro:6379",
requestTimeout: 3 * 1000,
retryPolicy: {
enabled: true,
retries: 3,
delay: 100,
maxDelay: 1000,
factor: 2,
check: (err) => {
return err && !!err.retryable;
},
},
contextParamsCloning: false,
maxCallLevel: 5,
heartbeatInterval: 5,
heartbeatTimeout: 15,
tracking: {
enabled: true,
shutdownTimeout: 5000,
},
disableBalancer: false,
registry: {
strategy: "RoundRobin",
preferLocal: true,
},
circuitBreaker: {
enabled: true,
threshold: 0.5,
windowTime: 60,
minRequestCount: 20,
halfOpenTime: 10 * 1000,
check: (err) => {
return err && err.code && err.code >= 500;
},
},
bulkhead: {
enabled: false,
concurrency: 10,
maxQueueSize: 100,
},
transit: {
maxQueueSize: 50 * 1000,
disableReconnect: false,
disableVersionCheck: false,
},
// uidGenerator: undefined,
// errorHandler: undefined,
cacher: "redis://redis.internal.qmit.pro:6379",
serializer: "JSON",
validator: true,
metrics: {
enabled: true,
reporter: [
{
type: "Event",
options: {
// @ts-ignore: moleculer module type has not been updated yet
eventName: "$metrics.snapshot",
broadcast: false,
groups: null,
onlyChanges: false,
interval: 10 * 1000,
},
},
],
},
tracing: {
enabled: true,
// @ts-ignore: moleculer module type has not been updated yet
events: true,
stackTrace: true,
exporter: [
{
type: "Event",
options: {
eventName: "$tracing.spans",
sendStartSpan: false,
sendFinishSpan: true,
broadcast: false,
groups: null,
interval: 5,
spanConverter: null,
defaultTags: null,
},
},
],
},
internalServices: true,
internalMiddlewares: true,
hotReload: false,
// middlewares: undefined,
// @ts-ignore: moleculer module type has not been updated yet
replCommands,
metadata: {},
skipProcessEventRegistration: false,
};
return defaultsDeep_1.default(override || {}, defaults);
}
catch (err) {
console.error(kleur.red(`[${err.code || "unknown"}] ${err.message}`));
if (err.code === 401) {
console.error(`To get access token locally: ${kleur.cyan("vault login -method oidc")}`);
}
process.exit(1);
}
return {};
};
exports.default = exports.createBrokerOptions;
//# sourceMappingURL=index.js.map