nova_plugin behaviour (nova v0.14.3)

View Source

Plugins can be run at two different times; either in the beginning or at the end of a request. They can modify both the actual request or the nova-state. A plugin is implemented with the nova_plugin behaviour and needs to implement three different functions: pre_request/2, post_request/2 and plugin_info/0.

A plugin can return either {ok, NewState}, {break, NewState}, {stop, NewState}, {error, Reason}.

{ok, NewState} will continue the normal execution with the NewState.

{break, NewState} breaks the execution of the current plugin-chain. This means that if a pre_request-plugin returns the break-statement the rest of the plugins in that chain will be skipped.

{stop, NewState} stops the execution. The plugin is responsible in this case for returning a proper response to the client.

{error, Reason} will stop the execution and call the nova_error plugin, resulting in a 500 response back to the user. If debug mode is enabled the reason will be returned in the 500-response.

Summary

Types

reply/0

-type reply() ::
          {reply, Body :: binary()} |
          {reply, Status :: integer(), Body :: binary()} |
          {reply, Status :: integer(), Headers :: [{binary(), binary()}], Body :: binary()}.

request_type/0

-type request_type() :: pre_request | post_request.

Callbacks

init/0

(optional)
-callback init() -> State :: nova:state().

plugin_info/0

-callback plugin_info() ->
                         #{title := binary(),
                           version := binary(),
                           url := binary(),
                           authors := [binary()],
                           description := binary(),
                           requires =>
                               [PluginName :: binary() | {PluginName :: binary(), Version :: binary()}],
                           options => [{Key :: atom(), OptionDescription :: binary()}]}.

post_request/4

(optional)
-callback post_request(Req :: cowboy_req:req(), Env :: any(), Options :: map(), PluginState :: any()) ->
                          {ok, Req0 :: cowboy_req:req(), NewState :: any()} |
                          {ok, Reply :: reply(), Req0 :: cowboy_req:req(), NewState :: any()} |
                          {break, Req0 :: cowboy_req:req(), NewState :: any()} |
                          {break, Reply :: reply(), Req0 :: cowboy_req:req(), NewState :: any()} |
                          {stop, Req0 :: cowboy_req:req(), NewState :: any()} |
                          {stop, Reply :: reply(), Req0 :: cowboy_req:req(), NewState :: any()} |
                          {error, Reason :: term()}.

pre_request/4

(optional)
-callback pre_request(Req :: cowboy_req:req(), Env :: any(), Options :: map(), PluginState :: any()) ->
                         {ok, Req0 :: cowboy_req:req(), NewState :: any()} |
                         {ok, Reply :: reply(), Req0 :: cowboy_req:req(), NewState :: any()} |
                         {break, Req0 :: cowboy_req:req(), NewState :: any()} |
                         {break, Reply :: reply(), Req0 :: cowboy_req:req(), NewState :: any()} |
                         {stop, Req0 :: cowboy_req:req(), NewState :: any()} |
                         {stop, Reply :: reply(), Req0 :: cowboy_req:req(), NewState :: any()} |
                         {error, Reason :: term()}.

stop/1

(optional)
-callback stop(State :: nova:state()) -> ok.