moleculer-api
Version:
A dynamic API Gateway for MoleculerJS which updates REST endpoints and aggregated GraphQL schema, access control policy for each action calls from metadata of remote services schema without restart or deployment.
78 lines • 3.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createMoleculerServiceSchema = void 0;
const discover_1 = require("./discover");
const serviceName = "$api";
function createMoleculerServiceSchema(props) {
const discoveryMap = new Map(); // nodeId -> discovered Service[]
return {
name: serviceName,
events: {
/* receive all events and broker */
"**": (ctx) => {
const event = ctx.eventName;
// skip internal events
if (!event || event.startsWith("$")) {
return;
}
const params = ctx.params;
const groups = ctx.eventGroups ? (Array.isArray(ctx.eventGroups) ? ctx.eventGroups : [ctx.eventGroups]) : (ctx.eventType === "broadcastLocal" ? [serviceName] : []);
const broadcast = ctx.eventType === "broadcast";
let from;
const nodeId = ctx.nodeID;
const serviceId = ctx.service && (ctx.service.fullName || ctx.service.name || ctx.service.id);
if (nodeId && serviceId) {
from = `${nodeId}@${serviceId}`;
}
// broker event
props.emitEvent({ event, params, groups, broadcast, from });
},
/* service discovery */
"$node.updated": (ctx) => {
const node = ctx.params.node;
// remove old services
const oldServices = discoveryMap.get(node.id);
for (const service of oldServices) {
if (service.id === serviceName) {
continue; // will not discover "this" services
}
props.emitServiceDisconnected(service, node.id);
}
discoveryMap.delete(node.id);
// add latest services
const latestServices = discover_1.proxyMoleculerServiceDiscovery(node);
discoveryMap.set(node.id, latestServices);
for (const service of latestServices) {
if (service.id === serviceName) {
continue; // will not discover "this" services
}
props.emitServiceConnected(service);
}
},
"$node.connected": (ctx) => {
const node = ctx.params.node;
const services = discover_1.proxyMoleculerServiceDiscovery(node);
discoveryMap.set(node.id, services);
for (const service of services) {
if (service.id === serviceName) {
continue; // will not discover "this" services
}
props.emitServiceConnected(service);
}
},
"$node.disconnected": (ctx) => {
const node = ctx.params.node;
const services = discoveryMap.get(node.id) || [];
for (const service of services) {
if (service.id === serviceName) {
continue; // will not discover "this" services
}
props.emitServiceDisconnected(service, node.id);
}
discoveryMap.delete(node.id);
},
},
};
}
exports.createMoleculerServiceSchema = createMoleculerServiceSchema;
//# sourceMappingURL=service.js.map