Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issues with FunctionsFramework::cloudEvent() #159

Open
xtfer opened this issue Sep 2, 2023 · 1 comment
Open

Issues with FunctionsFramework::cloudEvent() #159

xtfer opened this issue Sep 2, 2023 · 1 comment
Labels
bug Something isn't working P2

Comments

@xtfer
Copy link

xtfer commented Sep 2, 2023

Having issues with FunctionsFramework::cloudEvent() when running in Cloud Functions (but not locally) as documented at https://cloud.google.com/functions/docs/tutorials/pubsub#preparing_the_application.

I'm calling the following:

FunctionsFramework::cloudEvent('eventarc-event-name', 'myFunctionName');

function myFunctionName(\CloudEvents\V1\CloudEventInterface $event)

This runs locally, but when I run it on Cloud Run the it tells me I have to hint Google\CloudFunctions\CloudEvent, but if I do that it wants CloudEventInterface instead. Putting either results in the other being required.

PHP message: PHP Fatal error: Uncaught LogicException: Your function must have "Google\CloudFunctions\CloudEvent" as the typehint for the first argument in /workspace/vendor/google/cloud-functions-framework/src/CloudEventFunctionWrapper.php:65

I can't repeat this locally. FunctionsFramework calls the following, which locally always forces CloudEventInterface, and I can debug this right through to the Reflection check on line 71 of CloudEventFunctionWrapper

public static function cloudEvent(string $name, callable $fn)
    {
        Invoker::registerFunction($name, new CloudEventFunctionWrapper($fn, true));
    }

If I do both (which seems probably unintended and wrong anyway), I get the following error:

PHP message: PHP Fatal error: Uncaught Error: Call to undefined method ReflectionUnionType::getName() in /workspace/vendor/google/cloud-functions-framework/src/CloudEventFunctionWrapper.php:75 Stack trace: #0 /workspace/vendor/google/cloud-functions-framework/src/FunctionValidationTrait.php(43): Google\CloudFunctions\CloudEventFunctionWrapper->validateFirstParameter(Object(ReflectionParameter)) #1 /workspace/vendor/google/cloud-functions-framework/src/CloudEventFunctionWrapper.php(58): Google\CloudFunctions\CloudEventFunctionWrapper->validateFunctionSignature(Object(ReflectionFunction)) #2 /workspace/vendor/google/cloud-functions-framework/src/FunctionsFramework.php(35): Google\CloudFunctions\CloudEventFunctionWrapper->__construct('dicomwebImport', true) #3 /workspace/index.php(11): Google\CloudFunctions\FunctionsFramework::cloudEvent('transport-reque...', 'dicomwebImport') #4 /workspace/vendor/google/cloud-functions-framework/router.php(37): require_once('/workspace/inde...')

I'm not even sure how to proceed here, as this is the officially documented approach, but doesn't appear in the readme for this project at all.

@xtfer
Copy link
Author

xtfer commented Sep 2, 2023

I may have found the issue.

FunctionsFramework::cloudEvent($target, true) marshals to the \CloudEvents\V1\CloudEventInterface() (second parameter is true), but when the function is actually run via the Invoker, line 59, it marshals to \Google\CloudFunctions\CloudEvent() (second parameter is false).

$this->function = new CloudEventFunctionWrapper($target, false);

So it is not possible to call FunctionsFramework::cloudEvent() as documented, since a function parameter can't have both types (or, at least, this specific implementation can't read more than one).

I'm wondering if the use of \Google\CloudFunctions\CloudEvent() is incorrect, and it should be \CloudEvents\V1\CloudEvent().

@kenneth-rosario kenneth-rosario added bug Something isn't working P2 labels Sep 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working P2
Projects
None yet
Development

No branches or pull requests

3 participants