ironbar/services/gateway/service-map.js

44 lines
1.4 KiB
JavaScript

const {sendActionToService} = require('@truss/comm');
if (!process.env.SERVICES) {
console.error('$SERVICES must be defined!');
process.exit(1);
}
const services = process.env.SERVICES.split(',');
export function loadServiceMap() {
// get all schemas
const schemas$ = services.map((service) => {
return sendActionToService({type: '@truss/schema'}, service);
});
// build service map
return Promise.all(schemas$).then((schemas) => {
return schemas.reduce((serviceMap, schema, i) => {
const service = services[i];
for (const type of (schema.executors || [])) {
if (serviceMap.executors[type]) {
throw new RangeError(`
Only one executor may be specified per action type! "${service}"
tried to register an executor but "${serviceMap.executors[type]}"
already registered one for "${type}".
`.replace(/\s+/g, ' ').trim());
}
serviceMap.executors[type] = service;
}
for (const type of (schema.listeners || [])) {
serviceMap.listeners[type] = serviceMap.listeners[type] || [];
serviceMap.listeners[type].push(service);
}
for (const hook of (schema.hooks || [])) {
serviceMap.hooks[hook] = serviceMap.hooks[hook] || [];
serviceMap.hooks[hook].push(service);
}
return serviceMap;
}, {
executors: {},
hooks: {},
listeners: {},
});
});
}