Envelop is a lightweight library allowing developers to easily develop, share, collaborate and extend their GraphQL execution layer. Envelop is the missing GraphQL plugin system.
Please install the latest @envelop/* packages that you are using.
Please make sure the reproduction is as small as possible.
[x] 2. A failing test has been provided
[x] 3. A local solution has been provided
[x] 4. A pull request is pending review
Describe the bug
The cache implementation can be sync or async - each of the methods can return a Promise. However, these promises are not awaited or handled so they end up as "floating promises". When one of these rejects, Node treats it as an unhandled promise rejection and, under default behaviour
Override the cache with an implementation of set which returns a rejected promise.
Execute a query that would be cached.
The result returns since cache.set isn't awaited, but in the background the Node processes crashes.
We noticed this whilst using @envelop/response-cache-redis with a Redis setup that wasn't configured correctly, however, the incorrect error handling can be reproduced with anything that returns a rejected promise.
Expected behavior
The rejected promise should be returned through onExecuteDone so it can be handled by the server and result in a failed request. The process should not get terminated.
Issue workflow progress
Progress of the issue based on the Contributor Workflow
@envelop/*
packages that you are using.Describe the bug
The cache implementation can be sync or async - each of the methods can return a Promise. However, these promises are not awaited or handled so they end up as "floating promises". When one of these rejects, Node treats it as an unhandled promise rejection and, under default behaviour
To Reproduce Steps to reproduce the behavior:
set
which returns a rejected promise.cache.set
isn't awaited, but in the background the Node processes crashes.We noticed this whilst using
@envelop/response-cache-redis
with a Redis setup that wasn't configured correctly, however, the incorrect error handling can be reproduced with anything that returns a rejected promise.Expected behavior
The rejected promise should be returned through
onExecuteDone
so it can be handled by the server and result in a failed request. The process should not get terminated.Environment:
@envelop/*
versions:@envelop/response-cache
:6.1.2