UNPKG

moleculer-qmit

Version:

QMIT moleculer options preset

237 lines 10.1 kB
"use strict"; 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