Fix invoke local when using callback in nodejs

This commit is contained in:
Daniel Schep 2018-11-27 09:48:03 -05:00
parent 806e07c6d6
commit 5ffd7f4ae8
3 changed files with 75 additions and 50 deletions

View File

@ -22,6 +22,10 @@ module.exports.withMessageByCallback = (event, context, callback) => {
return Promise.resolve();
};
module.exports.withMessageAndDelayByCallback = (event, context, callback) => {
setTimeout(() => callback(null, 'Succeed'), 1);
};
module.exports.withMessageByLambdaProxy = () =>
Promise.resolve({
statusCode: 200,

View File

@ -312,60 +312,63 @@ class AwsInvokeLocal {
this.serverless.cli.consoleLog(JSON.stringify(result, null, 4));
}
const callback = (err, result) => {
if (!hasResponded) {
hasResponded = true;
if (err) {
handleError.call(this, err);
} else if (result) {
handleResult.call(this, result);
return new Promise((resolve) => {
const callback = (err, result) => {
if (!hasResponded) {
hasResponded = true;
if (err) {
handleError.call(this, err);
} else if (result) {
handleResult.call(this, result);
}
}
resolve();
};
const startTime = new Date();
const timeout = Number(this.options.functionObj.timeout)
|| Number(this.serverless.service.provider.timeout)
|| 6;
let context = {
awsRequestId: 'id',
invokeid: 'id',
logGroupName: this.provider.naming.getLogGroupName(this.options.functionObj.name),
logStreamName: '2015/09/22/[HEAD]13370a84ca4ed8b77c427af260',
functionVersion: 'HEAD',
isDefaultFunctionVersion: true,
functionName: this.options.functionObj.name,
memoryLimitInMB: '1024',
succeed(result) {
return callback(null, result);
},
fail(error) {
return callback(error);
},
done(error, result) {
return callback(error, result);
},
getRemainingTimeInMillis() {
return Math.max((timeout * 1000) - ((new Date()).valueOf() - startTime.valueOf()), 0);
},
};
if (customContext) {
context = customContext;
}
};
const startTime = new Date();
const timeout = Number(this.options.functionObj.timeout)
|| Number(this.serverless.service.provider.timeout)
|| 6;
let context = {
awsRequestId: 'id',
invokeid: 'id',
logGroupName: this.provider.naming.getLogGroupName(this.options.functionObj.name),
logStreamName: '2015/09/22/[HEAD]13370a84ca4ed8b77c427af260',
functionVersion: 'HEAD',
isDefaultFunctionVersion: true,
const maybeThennable = lambda(event, context, callback);
if (!_.isUndefined(maybeThennable) && _.isFunction(maybeThennable.then)) {
return maybeThennable
.then(
callback.bind(this, null),
callback.bind(this)
);
}
functionName: this.options.functionObj.name,
memoryLimitInMB: '1024',
succeed(result) {
return callback(null, result);
},
fail(error) {
return callback(error);
},
done(error, result) {
return callback(error, result);
},
getRemainingTimeInMillis() {
return Math.max((timeout * 1000) - ((new Date()).valueOf() - startTime.valueOf()), 0);
},
};
if (customContext) {
context = customContext;
}
const maybeThennable = lambda(event, context, callback);
if (!_.isUndefined(maybeThennable) && _.isFunction(maybeThennable.then)) {
return maybeThennable
.then(
callback.bind(this, null),
callback.bind(this)
);
}
return maybeThennable;
return maybeThennable;
});
}
}

View File

@ -625,6 +625,24 @@ describe('AwsInvokeLocal', () => {
});
});
describe("by callback method even if callback isn't called syncronously", () => {
it('should succeed once if succeed if by callback', () => {
awsInvokeLocal.serverless.config.servicePath = __dirname;
return awsInvokeLocal.invokeLocalNodeJs(
'fixture/asyncHandlerWithSuccess',
'withMessageAndDelayByCallback'
)
.then(() => {
expect(serverless.cli.consoleLog.lastCall.args[0]).to.contain('"Succeed"');
const calls = serverless.cli.consoleLog.getCalls().reduce((acc, call) => (
_.includes(call.args[0], 'Succeed') ? [call].concat(acc) : acc
), []);
expect(calls.length).to.equal(1);
});
});
});
describe('with Lambda Proxy with application/json response', () => {
it('should succeed if succeed', () => {
awsInvokeLocal.serverless.config.servicePath = __dirname;