@yieldbits/probot
Version:
a probot integration library for nestjs projects
144 lines • 6.03 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProbotDiscovery = void 0;
const common_1 = require("@nestjs/common");
const _ = __importStar(require("lodash"));
const uuid_1 = require("uuid");
const probot_types_1 = require("./probot.types");
const probot_helpers_1 = require("./probot.helpers");
const hook_metadata_accessor_1 = require("./hook-metadata.accessor");
const core_1 = require("@nestjs/core");
let ProbotDiscovery = class ProbotDiscovery {
constructor(discoveryService, metadataAccessor, metadataScanner, config) {
this.discoveryService = discoveryService;
this.metadataAccessor = metadataAccessor;
this.metadataScanner = metadataScanner;
this.config = config;
this.logger = new common_1.Logger('ProbotDiscovery');
this.hooks = new Map();
this.probot = (0, probot_helpers_1.createProbot)(this.config);
}
async onModuleInit() {
this.explore();
}
onApplicationBootstrap() {
if (!_.isEmpty(this.config.webhookProxy)) {
this.smee = (0, probot_helpers_1.createSmee)(this.config);
this.smee.start();
}
this.mountHooks();
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onApplicationShutdown(signal) {
// TODO clear probot event handlers on shutdown
}
mountHooks() {
this.probot
.load((app) => {
this.hooks.forEach((hook) => {
app.on(hook.eventOrEvents, this.initContext(hook.target));
});
})
.then(() => {
this.logger.log('Hook event listeners initialized');
})
.catch(this.logger.error);
}
initContext(fn) {
return async (context) => {
await fn(context);
};
}
explore() {
const instanceWrappers = [
...this.discoveryService.getControllers(),
...this.discoveryService.getProviders(),
];
instanceWrappers
.filter((wrapper) => wrapper.isDependencyTreeStatic())
.forEach((wrapper) => {
const { instance } = wrapper;
if (!instance || !Object.getPrototypeOf(instance)) {
return;
}
this.metadataScanner.scanFromPrototype(instance, Object.getPrototypeOf(instance), (key) => this.lookupHooks(instance, key));
});
}
lookupHooks(instance, key) {
const methodRef = instance[key];
const hookMetadata = this.metadataAccessor.getWebhookEvents(methodRef);
const hookFn = this.wrapFunctionInTryCatchBlocks(methodRef, instance);
// filter functions that do not have a webhook event definition
if (_.isEmpty(hookMetadata)) {
return null;
}
return this.hooks.set((0, uuid_1.v4)(), {
target: hookFn,
eventOrEvents: hookMetadata,
});
}
wrapFunctionInTryCatchBlocks(methodRef, instance) {
return async (...args) => {
try {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
await methodRef.call(instance, ...args);
}
catch (error) {
this.logger.error(error);
}
};
}
receiveHook(request) {
const id = request.headers['x-github-delivery'];
const event = request.headers['x-github-event'];
const body = request.body;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return this.probot.receive({ id, name: event, payload: body });
}
};
ProbotDiscovery = __decorate([
(0, common_1.Injectable)(),
__param(3, (0, common_1.Inject)(probot_types_1.ModuleProviders.ProbotConfig)),
__metadata("design:paramtypes", [core_1.DiscoveryService,
hook_metadata_accessor_1.HookMetadataAccessor,
core_1.MetadataScanner, Object])
], ProbotDiscovery);
exports.ProbotDiscovery = ProbotDiscovery;
//# sourceMappingURL=probot.discovery.js.map