Skip to content

Commit

Permalink
Merge pull request #8 from Moesif/async-identify
Browse files Browse the repository at this point in the history
Add: Async identifyUser and identifyCompany
  • Loading branch information
dgilling committed Oct 9, 2020
2 parents 11be5b5 + b252b47 commit 02ddb15
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 62 deletions.
137 changes: 77 additions & 60 deletions lib/index.js
Expand Up @@ -52,9 +52,6 @@ module.exports = function (options, handler) {
metadata.request_context = event && event.requestContext;
return metadata;
};
options.getTags = options.getTags || function () {
return undefined;
};
options.getApiVersion = options.getApiVersion || function (event, context) {
return context.functionVersion;
};
Expand Down Expand Up @@ -242,36 +239,49 @@ function mapResponseHeaders(event, context, result) {
}

function logEvent(event, context, err, result, options, moesifController) {

if (!event.httpMethod || !event.headers) {
logMessage(options.debug, 'logEvent', 'Expecting input format to be the API Gateway proxy integration type. ' +
'See https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource');
return;
logMessage(
options.debug,
'logEvent',
'AWS Lambda trigger must be a Load Balancer or API Gateway. ' +
'See https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource'
);
return Promise.resolve();
}

if (options.skip(event, context)) {
// exit early
return Promise.resolve();
}

var logData = {};
logData.request = {};
logData.response = {};
logData.request.time = event && event.requestContext && event.requestContext.requestTimeEpoch ?
new Date(event && event.requestContext && event.requestContext.requestTimeEpoch) :
Date.now();
logData.request.time =
event && event.requestContext && event.requestContext.requestTimeEpoch
? new Date(event && event.requestContext && event.requestContext.requestTimeEpoch)
: Date.now();

logData.request.uri = getURLWithQueryStringParams(event);
logData.request.verb = event.httpMethod;
logData.request.apiVerion = options.getApiVersion(event, context);
logData.request.ipAddress = requestIp.getClientIp(event) || (event.requestContext && event.requestContext.identity && event.requestContext.identity.sourceIp);
logData.request.ipAddress =
requestIp.getClientIp(event) ||
(event.requestContext &&
event.requestContext.identity &&
event.requestContext.identity.sourceIp);
logData.request.headers = event.headers || {};
logData.metadata = options.getMetadata(event, context);

if (options.logBody && event.body) {
if (event.isBase64Encoded) {
logData.request.body = event.body;
logData.request.transferEncoding = 'base64';
} else {
const bodyWrapper = safeJsonParse(event.body);
logData.request.body = bodyWrapper.body
logData.request.transferEncoding = bodyWrapper.transferEncoding
}
if (event.isBase64Encoded) {
logData.request.body = event.body;
logData.request.transferEncoding = 'base64';
} else {
const bodyWrapper = safeJsonParse(event.body);
logData.request.body = bodyWrapper.body;
logData.request.transferEncoding = bodyWrapper.transferEncoding;
}
}

logMessage(options.debug, 'logEvent', 'created request: \n' + JSON.stringify(logData.request));
Expand All @@ -281,58 +291,68 @@ function logEvent(event, context, err, result, options, moesifController) {
logData.response.headers = mapResponseHeaders(event, context, safeRes);

if (options.logBody && safeRes.body) {
if (safeRes.isBase64Encoded) {
logData.response.body = safeRes.body;
logData.response.transferEncoding = 'base64';
} else {
const bodyWrapper = safeJsonParse(safeRes.body);
logData.response.body = bodyWrapper.body
logData.response.transferEncoding = bodyWrapper.transferEncoding
}
if (safeRes.isBase64Encoded) {
logData.response.body = safeRes.body;
logData.response.transferEncoding = 'base64';
} else {
const bodyWrapper = safeJsonParse(safeRes.body);
logData.response.body = bodyWrapper.body;
logData.response.transferEncoding = bodyWrapper.transferEncoding;
}
}

logMessage(options.debug, 'logEvent', 'created data: \n' + JSON.stringify(logData));

logData = options.maskContent(logData);

logData.userId = options.identifyUser(event, context);
logData.companyId = options.identifyCompany(event, context);
logData.sessionToken = options.getSessionToken(event, context);
logData.tags = options.getTags(event, context);
return Promise.all([
options.identifyUser(event, context),
options.identifyCompany(event, context)
]).then(([userId, companyId]) => {
logData.userId = userId;
logData.companyId = companyId;
logData.sessionToken = options.getSessionToken(event, context);

// Set API direction
logData.direction = "Incoming"
// Set API direction
logData.direction = 'Incoming';

logMessage(options.debug, 'logEvent', 'applied options to data: \n' + JSON.stringify(logData));
logMessage(options.debug, 'logEvent', 'applied options to data: \n' + JSON.stringify(logData));

ensureValidLogData(logData);
ensureValidLogData(logData);

// This is fire and forget, we don't want logging to hold up the request so don't wait for the callback
if (!options.skip(event, context) && moesifConfigManager.shouldSend(logData && logData.userId, logData && logData.companyId)) {

let sampleRate = moesifConfigManager._getSampleRate(logData && logData.userId, logData && logData.companyId);
logData.weight = sampleRate === 0 ? 1 : Math.floor(100 / sampleRate);
// This is fire and forget, we don't want logging to hold up the request so don't wait for the callback
if (moesifConfigManager.shouldSend(logData && logData.userId, logData && logData.companyId)) {
let sampleRate = moesifConfigManager._getSampleRate(
logData && logData.userId,
logData && logData.companyId
);
logData.weight = sampleRate === 0 ? 1 : Math.floor(100 / sampleRate);

logMessage(options.debug, 'logEvent', 'sending data invoking moesifAPI');
logMessage(options.debug, 'logEvent', 'sending data invoking moesifAPI');

return new Promise((resolve) => {
moesifController.createEvent(new EventModel(logData), function(err) {
if (err) {
logMessage(options.debug, 'logEvent', 'Moesif API failed with err=' + JSON.stringify(err));
if (options.callback) {
options.callback(err, logData);
}
} else {
logMessage(options.debug, 'logEvent', 'Moesif API succeeded');
if(options.callback) {
options.callback(null, logData);
return new Promise((resolve) => {
moesifController.createEvent(new EventModel(logData), function(err) {
if (err) {
logMessage(
options.debug,
'logEvent',
'Moesif API failed with err=' + JSON.stringify(err)
);
if (options.callback) {
options.callback(err, logData);
}
} else {
logMessage(options.debug, 'logEvent', 'Moesif API succeeded');
if (options.callback) {
options.callback(null, logData);
}
}
}
resolve();
resolve();
});
});
})
}
return Promise.resolve();
}
return Promise.resolve();
});
}

function bodyToBase64(body) {
Expand Down Expand Up @@ -411,9 +431,6 @@ function ensureValidOptions(options) {
if (options.getMetadata && !_.isFunction(options.getMetadata)) {
throw new Error('getMetadata should be a function');
}
if (options.getTags && !_.isFunction(options.getTags)) {
throw new Error('getTags should be a function');
}
if (options.getApiVersion && !_.isFunction(options.getApiVersion)) {
throw new Error('getApiVersion should be a function');
}
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "moesif-aws-lambda",
"version": "1.2.8",
"version": "1.3.0",
"description": "API Monitoring Middleware for AWS Lambda",
"main": "lib/index.js",
"keywords": [
Expand Down

0 comments on commit 02ddb15

Please sign in to comment.