Skip to content

Commit 9a68b07

Browse files
author
rafalh
committed
Allow subscribe to deliver NotifySubscribe response.
Useful in live-query like applications where first deliver occours right after subscription.
1 parent 86957ac commit 9a68b07

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,7 @@ class [[nodiscard("unnecessary construction")]] Request
14971497
[[nodiscard("unnecessary call")]] GRAPHQLSERVICE_EXPORT AwaitableResolver visit(
14981498
RequestResolveParams params) const;
14991499
[[nodiscard("leaked subscription")]] GRAPHQLSERVICE_EXPORT AwaitableSubscribe subscribe(
1500-
RequestSubscribeParams params);
1500+
RequestSubscribeParams params, bool deliver = false);
15011501
[[nodiscard("potentially leaked subscription")]] GRAPHQLSERVICE_EXPORT AwaitableUnsubscribe
15021502
unsubscribe(RequestUnsubscribeParams params);
15031503
[[nodiscard("potentially leaked event")]] GRAPHQLSERVICE_EXPORT AwaitableDeliver deliver(

src/GraphQLService.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,7 +2031,7 @@ AwaitableResolver Request::visit(RequestResolveParams params) const
20312031
}
20322032
}
20332033

2034-
AwaitableSubscribe Request::subscribe(RequestSubscribeParams params)
2034+
AwaitableSubscribe Request::subscribe(RequestSubscribeParams params, bool deliver)
20352035
{
20362036
const auto spThis = shared_from_this();
20372037
const auto launch = std::move(params.launch);
@@ -2065,20 +2065,20 @@ AwaitableSubscribe Request::subscribe(RequestSubscribeParams params)
20652065

20662066
lock.unlock();
20672067

2068+
ResolverResult document {};
2069+
20682070
try
20692071
{
20702072
co_await launch;
20712073

2072-
auto errors =
2073-
std::move((co_await optionalOrDefaultSubscription->resolve(selectionSetParams,
2074-
registration->selection,
2075-
registration->data->fragments,
2076-
registration->data->variables))
2077-
.errors);
2074+
document = co_await optionalOrDefaultSubscription->resolve(selectionSetParams,
2075+
registration->selection,
2076+
registration->data->fragments,
2077+
registration->data->variables);
20782078

2079-
if (!errors.empty())
2079+
if (!document.errors.empty())
20802080
{
2081-
throw schema_exception { std::move(errors) };
2081+
throw schema_exception { std::move(document.errors) };
20822082
}
20832083
}
20842084
catch (...)
@@ -2089,6 +2089,23 @@ AwaitableSubscribe Request::subscribe(RequestSubscribeParams params)
20892089
spThis->removeSubscription(key);
20902090
throw;
20912091
}
2092+
2093+
if(deliver){
2094+
std::visit(
2095+
[result = std::move(document)](const auto& callback) mutable {
2096+
using callback_type = std::decay_t<decltype(callback)>;
2097+
2098+
if constexpr (std::is_same_v<callback_type, SubscriptionCallback>)
2099+
{
2100+
callback(std::move(result).document());
2101+
}
2102+
else if constexpr (std::is_same_v<callback_type, SubscriptionVisitor>)
2103+
{
2104+
callback(std::move(result));
2105+
}
2106+
},
2107+
registration->callback);
2108+
}
20922109
}
20932110

20942111
co_return key;

0 commit comments

Comments
 (0)