UNPKG

@yieldbits/probot

Version:

a probot integration library for nestjs projects

144 lines 6.03 kB
"use strict"; 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