diff --git a/lib/lambda-utils.js b/lib/lambda-utils.js index 49adfbf71..bdd39cba7 100644 --- a/lib/lambda-utils.js +++ b/lib/lambda-utils.js @@ -11,6 +11,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const utils_1 = require("./utils"); const constants_1 = require("./constants"); +const serverlessYml = require("./cli/serverless-yml"); const PRICING = require("./lambda-pricing"); const defaultConcurrency = 1; const notNull = (val) => !!val; @@ -186,17 +187,19 @@ class Utils { update: getDateUpdatedEnvironmentVariables() }); }); - this.invokeLocal = (params) => __awaiter(this, void 0, void 0, function* () { - const { FunctionName, InvocationType, Payload } = params; - this.logger.debug(`invoking ${params.FunctionName} inside ${this.env.FUNCTION_NAME}`); - const shortName = this.getShortName(FunctionName); - const yml = require('./cli/serverless-yml'); - const { functions } = yml; + this.requireLambdaByName = (shortName) => { + const { functions } = serverlessYml; const handlerExportPath = functions[shortName].handler; const lastDotIdx = handlerExportPath.lastIndexOf('.'); const handlerPath = path.join('..', handlerExportPath.slice(0, lastDotIdx)); const handleExportName = handlerExportPath.slice(lastDotIdx + 1); - const handler = require(handlerPath)[handleExportName]; + return require(handlerPath)[handleExportName]; + }; + this.invokeLocal = (params) => __awaiter(this, void 0, void 0, function* () { + const { FunctionName, InvocationType, Payload } = params; + this.logger.debug(`invoking ${params.FunctionName} inside ${this.env.FUNCTION_NAME}`); + const shortName = this.getShortName(FunctionName); + const handler = this.requireLambdaByName(shortName); const event = typeof Payload === 'string' ? JSON.parse(Payload) : {}; const context = utils_1.createLambdaContext(FunctionName); const result = { diff --git a/lib/lambda/mqtt/onmessage.js b/lib/lambda/mqtt/onmessage.js index 3c0fdac53..3569ae56d 100644 --- a/lib/lambda/mqtt/onmessage.js +++ b/lib/lambda/mqtt/onmessage.js @@ -1,10 +1,13 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("../../init-lambda"); -const { debug, wrap, user, env, stringUtils, utils, constants } = require('../..').tradle; +const { debug, wrap, user, env, lambdaUtils, stringUtils, utils, constants } = require('../..').tradle; const { prettify } = stringUtils; const { SEQ } = constants; const { timestamp } = utils; +if (env.INVOKE_BOT_LAMBDAS_DIRECTLY) { + lambdaUtils.requireLambdaByName(env.BOT_ONMESSAGE); +} exports.handler = wrap(function* (event, context) { debug('[START]', timestamp()); let { topic, clientId, data } = event; diff --git a/src/lambda-utils.ts b/src/lambda-utils.ts index 44d431def..cc43646b6 100644 --- a/src/lambda-utils.ts +++ b/src/lambda-utils.ts @@ -8,6 +8,7 @@ import { unitToMillis } from './constants' +import serverlessYml = require('./cli/serverless-yml') import PRICING = require('./lambda-pricing') const defaultConcurrency = 1 @@ -277,18 +278,21 @@ export default class Utils { }) } + private requireLambdaByName = (shortName:string) => { + const { functions } = serverlessYml + const handlerExportPath = functions[shortName].handler + const lastDotIdx = handlerExportPath.lastIndexOf('.') + const handlerPath = path.join('..', handlerExportPath.slice(0, lastDotIdx)) + const handleExportName = handlerExportPath.slice(lastDotIdx + 1) + return require(handlerPath)[handleExportName] + } + private invokeLocal = async (params:AWS.Lambda.InvocationRequest) :Promise => { const { FunctionName, InvocationType, Payload } = params this.logger.debug(`invoking ${params.FunctionName} inside ${this.env.FUNCTION_NAME}`) const shortName = this.getShortName(FunctionName) - const yml = require('./cli/serverless-yml') - const { functions } = yml - const handlerExportPath = functions[shortName].handler - const lastDotIdx = handlerExportPath.lastIndexOf('.') - const handlerPath = path.join('..', handlerExportPath.slice(0, lastDotIdx)) - const handleExportName = handlerExportPath.slice(lastDotIdx + 1) - const handler = require(handlerPath)[handleExportName] + const handler = this.requireLambdaByName(shortName) const event = typeof Payload === 'string' ? JSON.parse(Payload) : {} // not ideal as the called function may have different environment vars const context = createLambdaContext(FunctionName) diff --git a/src/lambda/mqtt/onmessage.ts b/src/lambda/mqtt/onmessage.ts index ae8092f31..d646a8010 100644 --- a/src/lambda/mqtt/onmessage.ts +++ b/src/lambda/mqtt/onmessage.ts @@ -5,6 +5,7 @@ const { wrap, user, env, + lambdaUtils, stringUtils, utils, constants @@ -14,6 +15,10 @@ const { prettify } = stringUtils const { SEQ } = constants const { timestamp } = utils +if (env.INVOKE_BOT_LAMBDAS_DIRECTLY) { + lambdaUtils.requireLambdaByName(env.BOT_ONMESSAGE) +} + exports.handler = wrap(function* (event, context) { // the user sent us a message debug('[START]', timestamp())