%% ------------------------------------------------------------------- %% %% Copyright (c) 2018 Christopher S. Meiklejohn. All Rights Reserved. %% Copyright (c) 2022 Alejandro M. Ramallo. All Rights Reserved. %% %% This file is provided to you under the Apache License, %% Version 2.0 (the "License"); you may not use this file %% except in compliance with the License. You may obtain %% a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, %% software distributed under the License is distributed on an %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY %% KIND, either express or implied. See the License for the %% specific language governing permissions and limitations %% under the License. %% %% ------------------------------------------------------------------- -module(partisan_rpc_backend). -author("Christopher S. Meiklejohn "). -behaviour(gen_server). %% API -export([start_link/0]). %% gen_server callbacks -export([init/1]). -export([handle_call/3]). -export([handle_cast/2]). -export([handle_info/2]). -export([terminate/2]). -export([code_change/3]). -record(state, {}). -include("partisan.hrl"). %% ============================================================================= %% API %% ============================================================================= start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). %% ============================================================================= %% GEN_SERVER_CALLBACKS %% ============================================================================= init([]) -> {ok, #state{}}. handle_call(_Msg, _From, State) -> {reply, ok, State}. handle_cast(_Msg, State) -> {noreply, State}. handle_info({call, M, F, A, _Timeout, {origin, Caller}}, State) -> %% Execute function. Response = try erlang:apply(M, F, A) catch _:Reason -> {badrpc, Reason} end, %% Send the response to execution. Opts = partisan_rpc:prepare_opts(partisan_config:get(forward_options, [])), ok = partisan:forward_message(Caller, {rpc_response, Response}, Opts), {noreply, State}; handle_info(_Msg, State) -> {noreply, State}. terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}.