Skip to content

Commit 69f1a49

Browse files
authored
Fix error where Node 6 functions were timing out (#286)
1 parent f7b7b6f commit 69f1a49

File tree

2 files changed

+37
-30
lines changed

2 files changed

+37
-30
lines changed

spec/cloud-functions.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ describe('makeCloudFunction', () => {
130130
return { data, context };
131131
},
132132
});
133+
process.env.X_GOOGLE_NEW_FUNCTION_SIGNATURE = 'true';
133134
let cf = makeCloudFunction(args);
135+
delete process.env.X_GOOGLE_NEW_FUNCTION_SIGNATURE;
134136
let testContext = {
135137
eventId: '00000',
136138
timestamp: '2016-11-04T21:29:03.496Z',

src/cloud-functions.ts

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -231,23 +231,9 @@ export function makeCloudFunction<EventData>({
231231
legacyEventType,
232232
opts = {},
233233
}: MakeCloudFunctionArgs<EventData>): CloudFunction<EventData> {
234-
let cloudFunction: any = async (eventOrData: any, context?: any) => {
235-
let data: any;
236-
if (isContext(context)) {
237-
// In Node 8 runtime, function called with 2 params: data & context
238-
data = eventOrData;
239-
} else {
240-
// In Node 6 runtime, function called with single event param
241-
data = _.get(eventOrData, 'data');
242-
if (isEvent(eventOrData)) {
243-
// new eventflow v1beta2 format
244-
context = _.cloneDeep(eventOrData.context);
245-
} else {
246-
// eventflow v1beta1 format
247-
context = _.omit(eventOrData, 'data');
248-
}
249-
}
234+
let cloudFunction;
250235

236+
let cloudFunctionNewSignature: any = (data: any, context: any) => {
251237
if (legacyEventType && context.eventType === legacyEventType) {
252238
// v1beta1 event flow has different format for context, transform them to new format.
253239
context = {
@@ -276,19 +262,42 @@ export function makeCloudFunction<EventData>({
276262
}
277263
context.params = context.params || _makeParams(context, triggerResource);
278264

279-
try {
280-
before(event);
265+
before(event);
281266

282-
let dataOrChange = dataConstructor(event);
283-
let promise = handler(dataOrChange, context);
284-
if (typeof promise === 'undefined') {
285-
console.warn('Function returned undefined, expected Promise or value');
286-
}
287-
return await promise;
288-
} finally {
289-
after(event);
267+
let dataOrChange = dataConstructor(event);
268+
let promise = handler(dataOrChange, context);
269+
if (typeof promise === 'undefined') {
270+
console.warn('Function returned undefined, expected Promise or value');
290271
}
272+
return Promise.resolve(promise)
273+
.then(result => {
274+
after(event);
275+
return result;
276+
})
277+
.catch(err => {
278+
after(event);
279+
return Promise.reject(err);
280+
});
291281
};
282+
283+
if (process.env.X_GOOGLE_NEW_FUNCTION_SIGNATURE === 'true') {
284+
cloudFunction = cloudFunctionNewSignature;
285+
} else {
286+
cloudFunction = (raw: Event | LegacyEvent) => {
287+
let context;
288+
// In Node 6 runtime, function called with single event param
289+
let data = _.get(raw, 'data');
290+
if (isEvent(raw)) {
291+
// new eventflow v1beta2 format
292+
context = _.cloneDeep(raw.context);
293+
} else {
294+
// eventflow v1beta1 format
295+
context = _.omit(raw, 'data');
296+
}
297+
return cloudFunctionNewSignature(data, context);
298+
};
299+
}
300+
292301
Object.defineProperty(cloudFunction, '__trigger', {
293302
get: () => {
294303
let trigger: any = _.assign(optsToTrigger(opts), {
@@ -311,10 +320,6 @@ function isEvent(event: Event | LegacyEvent): event is Event {
311320
return _.has(event, 'context');
312321
}
313322

314-
function isContext(context: EventContext | any): context is EventContext {
315-
return _.has(context, 'eventId');
316-
}
317-
318323
function _makeParams(
319324
context: EventContext,
320325
triggerResourceGetter: () => string

0 commit comments

Comments
 (0)