@atomist/automation-client
Version:
Atomist API for software low-level client
53 lines • 2.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
exports.NoEventHandlersError = "NO_EVENT_HANDLERS";
function noEventHandlersWereFound(result) {
return result.code !== 0 && !!result.message && result.message.startsWith(exports.NoEventHandlersError);
}
exports.noEventHandlersWereFound = noEventHandlersWereFound;
/**
* Support for implementing an automation server.
*/
class AbstractAutomationServer {
invokeCommand(payload, ctx) {
const h = this.validateCommandInvocation(payload);
return this.invokeCommandHandler(payload, h, ctx);
}
onEvent(payload, ctx) {
const h = this.automations.events.filter(eh => eh.subscriptionName === payload.extensions.operationName);
if (!h || h.length === 0) {
throw new Error(`${exports.NoEventHandlersError}: No event handler with name '${payload.extensions.operationName}'` +
`: Known event handlers are '${this.automations.events.map(e => e.name)}'`);
}
else {
return Promise.all(h.map(eh => this.invokeEventHandler(payload, eh, ctx)));
}
}
validateCommandInvocation(payload) {
const handler = this.automations.commands.find(h => h.name === payload.name);
if (!handler) {
throw new Error(`No command handler with name '${payload.name}'` +
`: Known command handlers are '${this.automations.commands.map(c => c.name)}'`);
}
handler.parameters.forEach(p => {
const payloadValue = payload.args ?
payload.args.find(a => a.name === p.name) : undefined;
if (!payloadValue || _.isNil(payloadValue.value)) {
if (p.required && p.default_value === undefined) {
throw new Error(`Parameter '${p.name}' required but missing in invocation to '${handler.name}'`);
}
}
else {
// We have a parameter. Validate it
if (p.pattern && payloadValue.value.toString().match(new RegExp(p.pattern)) === null) {
throw new Error(`Parameter '${p.name}' value of '${payloadValue.value}'` +
` invalid in invocation to '${handler.name}' with pattern '${p.pattern}'`);
}
}
});
return handler;
}
}
exports.AbstractAutomationServer = AbstractAutomationServer;
//# sourceMappingURL=AbstractAutomationServer.js.map