7 #ifndef CPPWAMP_CORO_COROSESSION_HPP
8 #define CPPWAMP_CORO_COROSESSION_HPP
16 #include <boost/asio/post.hpp>
17 #include <boost/asio/spawn.hpp>
18 #include "../asyncresult.hpp"
19 #include "../config.hpp"
20 #include "../session.hpp"
57 template <
typename TIgnoredBase = Session>
62 using Ptr = std::shared_ptr<CoroSession>;
80 template <
typename TSpawnHandler>
81 using YieldContext = boost::asio::basic_yield_context<TSpawnHandler>;
95 template <
typename TExecutionContext>
96 static CPPWAMP_ENABLED_TYPE(
Ptr, isExecutionContext<TExecutionContext>())
98 TExecutionContext& context,
104 return create(context.get_executor(), connector);
113 template <
typename TExecutionContext>
114 static CPPWAMP_ENABLED_TYPE(Ptr, isExecutionContext<TExecutionContext>())
116 TExecutionContext& context,
121 return create(context.get_executor(), connectors);
130 template <
typename H>
131 size_t connect(YieldContext<H> yield, std::error_code* ec =
nullptr);
137 template <
typename H>
139 std::error_code* ec =
nullptr);
148 template <
typename H>
149 Reason leave(YieldContext<H> yield, std::error_code* ec =
nullptr);
155 template <
typename H>
157 std::error_code* ec =
nullptr);
164 void subscribe(
Topic topic, EventSlot slot,
168 template <
typename H>
170 YieldContext<H> yield, std::error_code* ec =
nullptr);
181 template <
typename H>
182 bool unsubscribe(
const Subscription& sub, YieldContext<H> yield,
183 std::error_code* ec =
nullptr);
186 void publish(
Pub pub);
193 template <
typename H>
195 std::error_code* ec =
nullptr);
201 void enroll(
Procedure procedure, CallSlot slot,
205 template <
typename H>
207 YieldContext<H> yield, std::error_code* ec =
nullptr);
211 void enroll(
Procedure procedure, CallSlot callSlot,
212 InterruptSlot interruptSlot,
216 template <
typename H>
218 InterruptSlot interruptSlot, YieldContext<H> yield,
219 std::error_code* ec =
nullptr);
230 template <
typename H>
231 bool unregister(
const Registration& reg, YieldContext<H> yield,
232 std::error_code* ec =
nullptr);
238 template <
typename H>
239 Result call(
Rpc rpc, YieldContext<H> yield, std::error_code* ec =
nullptr);
245 template <
typename H>
246 void suspend(YieldContext<H> yield);
257 void reset() =
delete;
272 template <
typename B>
286 template <
typename B>
314 template <
typename B>
321 "Session is not disconnected");
322 Base::connect(std::move(handler));
330 template <
typename B>
331 template <
typename H>
339 "Session is not disconnected");
340 auto index = Base::connect(yield);
342 return index.value();
343 *ec = !index ? index.error() : std::error_code{};
344 return index.value_or(0);
361 template <
typename B>
369 "Session is not closed");
370 Base::join(std::move(realm), std::move(handler));
378 template <
typename B>
379 template <
typename H>
388 "Session is not closed");
389 auto info = Base::join(std::move(realm), yield);
392 *ec = !info ? info.error() : std::error_code{};
400 template <
typename B>
404 "Session is not authenticating");
405 Base::authenticate(std::move(auth));
422 template <
typename B>
429 "Session is not established");
430 Base::leave(std::move(handler));
438 template <
typename B>
439 template <
typename H>
447 "Session is not established");
448 auto reason = Base::leave(yield);
450 return reason.value();
451 *ec = !reason ? reason.error() : std::error_code{};
452 return reason.value_or(
Reason{});
467 template <
typename B>
475 "Session is not established");
476 Base::leave(std::move(reason), std::move(handler));
484 template <
typename B>
485 template <
typename H>
495 "Session is not established");
496 auto result = Base::leave(std::move(reason), yield);
498 return result.value();
499 *ec = !result ? result.error() : std::error_code{};
500 return result.value_or(
Reason{});
515 template <
typename B>
525 "Session is not established");
527 return Base::subscribe(move(topic), move(slot), move(handler));
535 template <
typename B>
536 template <
typename H>
547 "Session is not established");
548 auto sub = Base::subscribe(std::move(topic), std::move(slot), yield);
551 *ec = !sub ? sub.error() : std::error_code{};
566 template <
typename B>
571 Base::unsubscribe(sub);
596 template <
typename B>
604 "Session is not established");
605 Base::unsubscribe(sub, std::move(handler));
613 template <
typename B>
614 template <
typename H>
623 "Session is not established");
624 auto unsubscribed = Base::unsubscribe(sub, yield);
626 return unsubscribed.value();
627 *ec = !unsubscribed ? unsubscribed.error() : std::error_code{};
628 return unsubscribed.value_or(
false);
635 template <
typename B>
641 "Session is not established");
656 template <
typename B>
664 "Session is not established");
665 Base::publish(pub, std::move(handler));
673 template <
typename B>
674 template <
typename H>
683 "Session is not established");
684 auto pubId = Base::publish(std::move(pub), yield);
686 return pubId.value();
687 *ec = !pubId ? pubId.error() : std::error_code{};
688 return pubId.value_or(0);
706 template <
typename B>
715 "Session is not established");
716 Base::enroll(std::move(procedure), std::move(slot), std::move(handler));
724 template <
typename B>
725 template <
typename H>
737 "Session is not established");
738 auto reg = Base::enroll(std::move(procedure), std::move(slot), yield);
741 *ec = !reg ? reg.error() : std::error_code{};
760 template <
typename B>
771 "Session is not established");
772 Base::enroll(std::move(procedure), std::move(callSlot),
773 std::move(interruptSlot), std::move(handler));
781 template <
typename B>
782 template <
typename H>
796 "Session is not established");
797 auto reg = Base::enroll(std::move(procedure), std::move(callSlot),
798 std::move(interruptSlot), yield);
801 *ec = !reg ? reg.error() : std::error_code{};
816 template <
typename B>
821 Base::unregister(reg);
842 template <
typename B>
850 "Session is not established");
851 Base::unregister(reg, std::move(handler));
859 template <
typename B>
860 template <
typename H>
869 "Session is not established");
870 auto unregistered = Base::unregister(reg, yield);
872 return unregistered.value();
873 *ec = !unregistered ? unregistered.error() : std::error_code{};
874 return unregistered.value_or(
false);
891 template <
typename B>
899 "Session is not established");
901 Base::call(std::move(rpc), chit, std::move(handler));
910 template <
typename B>
911 template <
typename H>
920 "Session is not established");
921 auto result = Base::call(std::move(rpc), yield);
923 return result.value();
924 *ec = !result ? result.error() : std::error_code{};
925 return result.value_or(
Result{});
936 template <
typename B>
937 template <
typename H>
940 boost::asio::post(this->userIosvc(), yield);
945 #endif // CPPWAMP_CORO_COROSESSION_HPP