|
|
|
|
@ -1,800 +0,0 @@
@@ -1,800 +0,0 @@
|
|
|
|
|
#LyX 2.0 created this file. For more info see http://www.lyx.org/ |
|
|
|
|
\lyxformat 413 |
|
|
|
|
\begin_document |
|
|
|
|
\begin_header |
|
|
|
|
\textclass article |
|
|
|
|
\use_default_options true |
|
|
|
|
\maintain_unincluded_children false |
|
|
|
|
\language english |
|
|
|
|
\language_package default |
|
|
|
|
\inputencoding auto |
|
|
|
|
\fontencoding global |
|
|
|
|
\font_roman default |
|
|
|
|
\font_sans default |
|
|
|
|
\font_typewriter default |
|
|
|
|
\font_default_family default |
|
|
|
|
\use_non_tex_fonts false |
|
|
|
|
\font_sc false |
|
|
|
|
\font_osf false |
|
|
|
|
\font_sf_scale 100 |
|
|
|
|
\font_tt_scale 100 |
|
|
|
|
|
|
|
|
|
\graphics default |
|
|
|
|
\default_output_format default |
|
|
|
|
\output_sync 0 |
|
|
|
|
\bibtex_command default |
|
|
|
|
\index_command default |
|
|
|
|
\paperfontsize default |
|
|
|
|
\use_hyperref false |
|
|
|
|
\papersize default |
|
|
|
|
\use_geometry false |
|
|
|
|
\use_amsmath 1 |
|
|
|
|
\use_esint 1 |
|
|
|
|
\use_mhchem 1 |
|
|
|
|
\use_mathdots 1 |
|
|
|
|
\cite_engine basic |
|
|
|
|
\use_bibtopic false |
|
|
|
|
\use_indices false |
|
|
|
|
\paperorientation portrait |
|
|
|
|
\suppress_date false |
|
|
|
|
\use_refstyle 1 |
|
|
|
|
\index Index |
|
|
|
|
\shortcut idx |
|
|
|
|
\color #008000 |
|
|
|
|
\end_index |
|
|
|
|
\secnumdepth 3 |
|
|
|
|
\tocdepth 3 |
|
|
|
|
\paragraph_separation indent |
|
|
|
|
\paragraph_indentation default |
|
|
|
|
\quotes_language english |
|
|
|
|
\papercolumns 1 |
|
|
|
|
\papersides 1 |
|
|
|
|
\paperpagestyle default |
|
|
|
|
\tracking_changes false |
|
|
|
|
\output_changes false |
|
|
|
|
\html_math_output 0 |
|
|
|
|
\html_css_as_file 0 |
|
|
|
|
\html_be_strict false |
|
|
|
|
\end_header |
|
|
|
|
|
|
|
|
|
\begin_body |
|
|
|
|
|
|
|
|
|
\begin_layout Title |
|
|
|
|
Architectural Description for Pontarius XMPP 0.1 (First Draft) |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Author |
|
|
|
|
The Pontarius project |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Date |
|
|
|
|
17th of August 2011 |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
\begin_inset CommandInset toc |
|
|
|
|
LatexCommand tableofcontents |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Section |
|
|
|
|
Introduction |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Summary |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
This is a first draft of an architectural description for Pontarius XMPP, |
|
|
|
|
version 0.1. |
|
|
|
|
It follows the IEEE 1471 recommended practice, and elaborates on the stakeholde |
|
|
|
|
rs and their concerns (Section 2) through viewpoint and view artifacts |
|
|
|
|
\begin_inset Foot |
|
|
|
|
status open |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
A |
|
|
|
|
\emph on |
|
|
|
|
viewpoint |
|
|
|
|
\emph default |
|
|
|
|
is the language, including notations, models, and techniques, that is used |
|
|
|
|
to describe a view. |
|
|
|
|
A |
|
|
|
|
\emph on |
|
|
|
|
view |
|
|
|
|
\emph default |
|
|
|
|
is an artifact that, based on a viewpoint, addresses concerns of system |
|
|
|
|
stakeholders. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
(Section 3 and Section 4, respectively). |
|
|
|
|
The Consistency section (Section 5) records architectural inconsistencies, |
|
|
|
|
if any. |
|
|
|
|
The Rationale section (Section 6) elaborates on reasons for the approaches |
|
|
|
|
taken, as well as mentioning the alternatives considered. |
|
|
|
|
We would greatly appreciate any feedback on our architectural decisions. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Change history |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
\begin_inset Tabular |
|
|
|
|
<lyxtabular version="3" rows="2" columns="3"> |
|
|
|
|
<features tabularvalignment="middle"> |
|
|
|
|
<column alignment="center" valignment="top" width="0"> |
|
|
|
|
<column alignment="center" valignment="top" width="0"> |
|
|
|
|
<column alignment="center" valignment="top" width="0"> |
|
|
|
|
<row> |
|
|
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
|
|
|
|
\begin_inset Text |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
Version |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
</cell> |
|
|
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
|
|
|
|
\begin_inset Text |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
Date |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
</cell> |
|
|
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
|
|
|
|
\begin_inset Text |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
Description |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
</cell> |
|
|
|
|
</row> |
|
|
|
|
<row> |
|
|
|
|
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> |
|
|
|
|
\begin_inset Text |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
First draft |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
</cell> |
|
|
|
|
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> |
|
|
|
|
\begin_inset Text |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
08/13/2011 |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
</cell> |
|
|
|
|
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> |
|
|
|
|
\begin_inset Text |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
First draft |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
</cell> |
|
|
|
|
</row> |
|
|
|
|
</lyxtabular> |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Context |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Pontarius XMPP is an XMPP library written in Haskell, for use with Haskell |
|
|
|
|
applications. |
|
|
|
|
The version targetted by this document, 0.1, is relatively lacking of features |
|
|
|
|
compared to some other XMPP libraries as it is only implementing the XMPP |
|
|
|
|
Core functionalities of XMPP. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The Pontarius project is the only entity who has contributed to or expressed |
|
|
|
|
an interest of Pontarius XMPP to date. |
|
|
|
|
Thus, Pontarius XMPP is currently only influenced by the concerns of the |
|
|
|
|
Pontarius project. |
|
|
|
|
While the Pontarius project would like to see Pontarius XMPP become the |
|
|
|
|
de-facto XMPP library for Haskell, their highest priority is to develop |
|
|
|
|
an uncentralized media server on top of XMPP and XPMN. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Implementing support for XMPP Core was a first step toward this end. |
|
|
|
|
Developing the various extensions necessary for XPMN |
|
|
|
|
\begin_inset Foot |
|
|
|
|
status open |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
These extensions include, but are not limited to, SASL EXTERNAL, Jingle, |
|
|
|
|
and end-to-end encryption. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
will be the second step---this is what will determine the requirements |
|
|
|
|
of Pontarius XMPP 0.2. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
With this in mind, the |
|
|
|
|
\emph on |
|
|
|
|
mission |
|
|
|
|
\emph default |
|
|
|
|
of Pontarius XMPP 0.1 becomes to serve as a solid foundation for the extensions |
|
|
|
|
planned for Pontarius XMPP 0.2, as well as to allow for the simple connection |
|
|
|
|
and communication primitives usages that are possible within XMPP Core. |
|
|
|
|
However, we will defer most extra features (features not wanted by the |
|
|
|
|
Pontarius project) until further notice. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Please consult the Software Requirements Specification for Pontarius XMPP |
|
|
|
|
for more information about the Pontarius XMPP 0.1 features. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Glossary |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Description |
|
|
|
|
FOSS Free and Open Source Software: See http://www.gnu.org/philosophy/free-sw.html |
|
|
|
|
and http://www.opensource.org/osd.html |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Description |
|
|
|
|
Pontarius Jon Kristensen's project to develop FOSS, uncentralized, and privacy-a |
|
|
|
|
ware software solutions; see http://www.pontarius.org/ |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Description |
|
|
|
|
XMPP Extendable Messaging and Presence Protocol: An uncentralized, open, |
|
|
|
|
and near-real-time presence and messaging protocol; see http://www.xmpp.org/ |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Description |
|
|
|
|
XMPP |
|
|
|
|
\begin_inset space ~ |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
Core An Internet standard that defines the core protocol methods of XMPP, |
|
|
|
|
setup and teardown of XMPP streams, encryption, authentication, error handling, |
|
|
|
|
and communication primitives; see RFC 6120 |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Description |
|
|
|
|
XPMN Extended Personal Media Network: An XMPP-based media network architecture |
|
|
|
|
that allows media devices to utilize and expose media services in a flexible, |
|
|
|
|
generic and user-friendly way; see http://www.xpmn.org/ |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
References |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Itemize |
|
|
|
|
Software Requirements Specification for Pontarius XMPP (the latest published |
|
|
|
|
version can be found http://www.pontarius.org/) |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Section |
|
|
|
|
Stakeholders and concerns |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Acquirer, developers, and maintainers (the Pontarius project) |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The system is essentially |
|
|
|
|
\begin_inset Quotes eld |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
acquired |
|
|
|
|
\begin_inset Quotes erd |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
, architected, developed, and maintained by the Pontarius project. |
|
|
|
|
However, Pontarius XMPP being FOSS, you never know who might join in on |
|
|
|
|
the effort. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The plan to build an XPMN media server on top of Pontarius XMPP makes the |
|
|
|
|
|
|
|
|
|
\emph on |
|
|
|
|
extensibility |
|
|
|
|
\emph default |
|
|
|
|
attribute of the system particularily important. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Trying to make as much code as possible pure, clean, and |
|
|
|
|
\emph on |
|
|
|
|
testable |
|
|
|
|
\emph default |
|
|
|
|
, we believe that Pontarius XMPP will be relatively |
|
|
|
|
\emph on |
|
|
|
|
correct |
|
|
|
|
\emph default |
|
|
|
|
. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The system is in the end stages of its alpha phase and is very likely to |
|
|
|
|
be finished, so there are no significant risks to the acquirer. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Note that the Pontarius project have not planned to actually develop an |
|
|
|
|
application using Pontarius XMPP 0.1. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Users |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The users of Pontarius XMPP are third-party (Haskell) application developers |
|
|
|
|
who utilizes the XMPP Core functionality. |
|
|
|
|
We are not addressing all user concerns in this release, or the next; see |
|
|
|
|
section 1.4 for more information. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Like with the Pontarius project, users would appreciate a high level of |
|
|
|
|
|
|
|
|
|
\emph on |
|
|
|
|
extendability |
|
|
|
|
\emph default |
|
|
|
|
, allowing them to implement their own high-level protocols on top of XMPP |
|
|
|
|
Core. |
|
|
|
|
Of course, |
|
|
|
|
\emph on |
|
|
|
|
correctness |
|
|
|
|
\emph default |
|
|
|
|
is of great importance as well. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
One great strenght of Haskell is the level of |
|
|
|
|
\emph on |
|
|
|
|
development efficiency |
|
|
|
|
\emph default |
|
|
|
|
that can often be archieved; we want to utilize this in Pontarius XMPP. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The client will also need to be |
|
|
|
|
\emph on |
|
|
|
|
flexible |
|
|
|
|
\emph default |
|
|
|
|
in that it can be concurrent. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
We will take the above concerns into consideration in the architecture of |
|
|
|
|
Pontarius XMPP 0.1. |
|
|
|
|
However, there are a number of attributes that, as mentioned above, will |
|
|
|
|
be deferred until later versions, such as the needs for |
|
|
|
|
\emph on |
|
|
|
|
interoperability |
|
|
|
|
\emph default |
|
|
|
|
(against XMPP servers), |
|
|
|
|
\emph on |
|
|
|
|
deployability |
|
|
|
|
\emph default |
|
|
|
|
, and |
|
|
|
|
\emph on |
|
|
|
|
portability |
|
|
|
|
\emph default |
|
|
|
|
, all arising from the fact that Pontarius XMPP may be used in different |
|
|
|
|
environments. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Section |
|
|
|
|
Viewpoints |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Extendibility |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Both stakeholder groups is in a great need of extendibility, so this concern |
|
|
|
|
is of utmost importance. |
|
|
|
|
We have addressed the issue through a flexible event system, where applications |
|
|
|
|
easily can insert hooks on certain standard events (streams opened, message |
|
|
|
|
received, etc.), and also generate custom events themselves. |
|
|
|
|
These custom events can contain any payload that the client wants, such |
|
|
|
|
as for example a high-level payload with identities and features for a |
|
|
|
|
service discovery response |
|
|
|
|
\begin_inset Foot |
|
|
|
|
status open |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
Read more about the Service Discovery extension at http://xmpp.org/extensions/xep |
|
|
|
|
-0030.html. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
, enabling clients to define handlers for service discovery replies, without |
|
|
|
|
even requiring that Pontarius XMPP is aware of the event type. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The corresponding view (see the 4.1 section) will show the necessary features |
|
|
|
|
and illustrate how the event system is covering the requirements. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Testability and correctness |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The pure and functional nature of Haskell allows for a fantastic isolation |
|
|
|
|
between components, and increases the understandability and testability |
|
|
|
|
of the code. |
|
|
|
|
By making most of the code pure and utilizing testing tools like QuickCheck, |
|
|
|
|
we can be unusually confident that the code is correct, compared to other |
|
|
|
|
languages. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
That being said, Pontarius XMPP 0.1 in its current state has one huge and |
|
|
|
|
impure function: the state loop function. |
|
|
|
|
The loop carries and modifies a state, but also performs impure (IO) function |
|
|
|
|
calls. |
|
|
|
|
Being impure, we cannot conveniently write QuickCheck properties and perform |
|
|
|
|
other testing for this function. |
|
|
|
|
A simple approach to this problem is illustrated in Section 4.2. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Development efficiency |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Haskell's strong type system allows client developers to catch a great many |
|
|
|
|
bugs that would be runtime errors in other programming languages at compile |
|
|
|
|
time. |
|
|
|
|
This does not only, as mentioned above, produce more correct code, but |
|
|
|
|
it also saves the developer a lot of time. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Section 4.3 describes how we plan to use monads transformers to further increase |
|
|
|
|
the development efficiency for Pontarius XMPP users. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Flexibility: Concurrency |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Client applications needs to be able to access the library from multiple |
|
|
|
|
threads. |
|
|
|
|
Section 4.4 will illustrate the concurrency model of Pontarius XMPP. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Section |
|
|
|
|
Views |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Extendibility: The event system |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The event system needs to support the following features in regards to these |
|
|
|
|
extensible event types. |
|
|
|
|
|
|
|
|
|
\begin_inset Quotes eld |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
Any function |
|
|
|
|
\begin_inset Quotes erd |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
below means any function with access to the XMPP session. |
|
|
|
|
A hook is a function that is registered with Pontarius XMPP to receive |
|
|
|
|
a certain event. |
|
|
|
|
\begin_inset Foot |
|
|
|
|
status open |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
Hooks can only register for exactly one event. |
|
|
|
|
If developers want one function to handle multiple events, they will have |
|
|
|
|
to insert multiple hooks which |
|
|
|
|
\begin_inset Quotes eld |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
overloads |
|
|
|
|
\begin_inset Quotes erd |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
the real hook function (perhaps using in-line Lambda functions). |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Enumerate |
|
|
|
|
Defining arbitrary (non-hierarchical) events with any payload |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Enumerate |
|
|
|
|
Injection of such event, where Pontarius XMPP will forward received event |
|
|
|
|
(without understanding it) using the registered hooks |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Enumerate |
|
|
|
|
Allowing functions to register hooks for any such event type, similar to |
|
|
|
|
how they would register a regular event |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Enumerate |
|
|
|
|
Returning, upon registration, a hook ID that may or may not be stored by |
|
|
|
|
the client |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Enumerate |
|
|
|
|
Allowing any function to unregister a hook using its hook ID |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Enumerate |
|
|
|
|
Allowing any function that is hooked to Pontarius XMPP to unregister itself |
|
|
|
|
(without knowing its hook ID) |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Enumerate |
|
|
|
|
Processing hook modifications (registration and unregistration) must happen |
|
|
|
|
immediately, so that hooks are not missing events, or receiving events |
|
|
|
|
that they should not process |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Haskell's type system is static, and it's not completely straight-forward |
|
|
|
|
to implement dynamic types like these. |
|
|
|
|
Our suggested solution is using an existential type---a Haskell type class---th |
|
|
|
|
at can wrap these custom events into a generic type, which we can use to |
|
|
|
|
distinguish one hook type from another, so that we can divide them into |
|
|
|
|
groups. |
|
|
|
|
We have decided to go with |
|
|
|
|
\family typewriter |
|
|
|
|
Data.Dynamic |
|
|
|
|
\family default |
|
|
|
|
and |
|
|
|
|
\family typewriter |
|
|
|
|
Data.Typeable |
|
|
|
|
\family default |
|
|
|
|
of the Haskell base package. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The dynamic event is called DynamicEvent, and it contains its Typeable payload |
|
|
|
|
and nothing more. |
|
|
|
|
Hence, you only need to make your payload an instance of Typeable. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Injecting the event can be done through |
|
|
|
|
\family typewriter |
|
|
|
|
raiseDynamicEvent :: Typeable a => a -> XMPPT m () |
|
|
|
|
\family default |
|
|
|
|
. |
|
|
|
|
This function will generate a |
|
|
|
|
\family typewriter |
|
|
|
|
DynamicEvent |
|
|
|
|
\family default |
|
|
|
|
value wrapping the |
|
|
|
|
\family typewriter |
|
|
|
|
Typeable |
|
|
|
|
\family default |
|
|
|
|
, and call all functions registered with the |
|
|
|
|
\family typewriter |
|
|
|
|
TypeRep |
|
|
|
|
\family default |
|
|
|
|
(type representation) of the |
|
|
|
|
\family typewriter |
|
|
|
|
Typeable |
|
|
|
|
\family default |
|
|
|
|
. |
|
|
|
|
\begin_inset Foot |
|
|
|
|
status open |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
It seems that GHC versions prior to 7.2 does not provide an |
|
|
|
|
\family typewriter |
|
|
|
|
Ord |
|
|
|
|
\family default |
|
|
|
|
instance for |
|
|
|
|
\family typewriter |
|
|
|
|
TypeRep |
|
|
|
|
\family default |
|
|
|
|
, so in order for us to be able to use the |
|
|
|
|
\family typewriter |
|
|
|
|
TypeRep |
|
|
|
|
\family default |
|
|
|
|
as keys in maps and be compatible with older versions of GHC, we will probably |
|
|
|
|
have to provide one ourselves. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Registering a hook for a |
|
|
|
|
\family typewriter |
|
|
|
|
DynamicEvent |
|
|
|
|
\family default |
|
|
|
|
type would mean calling something like |
|
|
|
|
\family typewriter |
|
|
|
|
registerDynamicEventHook :: Typeable a => a -> XMPPT m HookID |
|
|
|
|
\family default |
|
|
|
|
. |
|
|
|
|
Unregistering is analogous. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
To make sure that processing happens prior to any other events, a special |
|
|
|
|
|
|
|
|
|
\family typewriter |
|
|
|
|
Chan |
|
|
|
|
\family default |
|
|
|
|
can be used, which is always processed prior to the regular internal events |
|
|
|
|
of Pontarius XMPP. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Testability and correctness: The state loop |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Instead of mixing the pure state-machine-related code and logic with the |
|
|
|
|
impure (IO) actions, we are using a function like |
|
|
|
|
\family typewriter |
|
|
|
|
State -> Event -> (State, [ImpureAction]) |
|
|
|
|
\family default |
|
|
|
|
that, given a state and event |
|
|
|
|
\begin_inset Foot |
|
|
|
|
status open |
|
|
|
|
|
|
|
|
|
\begin_layout Plain Layout |
|
|
|
|
Note that this event type is internal to the library and has nothing to |
|
|
|
|
do with the event system mentioned in Section 4.1. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
, updates the state and returns a list of impure actions to be performed |
|
|
|
|
separately. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
As a side note, one thing that could possibly be investigated and used is |
|
|
|
|
the functional reactive programming paradigm. |
|
|
|
|
However, that would most likely require a completely different approach |
|
|
|
|
toward reading and modifying the state, and a lot of time spent. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Development efficiency: Monads |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The main efficiency feature of Pontarius XMPP is the use of monad transformers. |
|
|
|
|
Pontarius XMPP defines |
|
|
|
|
\family typewriter |
|
|
|
|
XMPPT |
|
|
|
|
\family default |
|
|
|
|
, which contains the necessary information to interact with Pontarius XMPP |
|
|
|
|
(such as some |
|
|
|
|
\family typewriter |
|
|
|
|
Chan |
|
|
|
|
\family default |
|
|
|
|
s) from a convenient and flexible context. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
Being a monad transformer, |
|
|
|
|
\family typewriter |
|
|
|
|
XMPPT |
|
|
|
|
\family default |
|
|
|
|
can be stacked on top of an arbitrary amount of |
|
|
|
|
\family typewriter |
|
|
|
|
MonadIO |
|
|
|
|
\family default |
|
|
|
|
monad transformers to provide extra functionality. |
|
|
|
|
One thing that this allows client developers to do is to use the |
|
|
|
|
\family typewriter |
|
|
|
|
StateT |
|
|
|
|
\family default |
|
|
|
|
monad transformer below |
|
|
|
|
\family typewriter |
|
|
|
|
XMPPT |
|
|
|
|
\family default |
|
|
|
|
to perform stateful operations in the |
|
|
|
|
\family typewriter |
|
|
|
|
XMPPT |
|
|
|
|
\family default |
|
|
|
|
context. |
|
|
|
|
One example of a use of this would be to always have the client state carried |
|
|
|
|
around, and getting it as easily as |
|
|
|
|
\family typewriter |
|
|
|
|
do clientState <- lift $ get |
|
|
|
|
\family default |
|
|
|
|
. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Subsection |
|
|
|
|
Flexibility: Concurrency |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
The usage of monads in Pontarius XMPP has one notable limitation---it necessaril |
|
|
|
|
y means one calculation, and one thread. |
|
|
|
|
Imagine that you want to perform an XMPP action from a different thread. |
|
|
|
|
Perhaps you want to update your presence every 30 seconds, or you want |
|
|
|
|
to send a message on some database event? The Pontarius XMPP architecture |
|
|
|
|
offer a backdoor for this through its event system; developers can use |
|
|
|
|
|
|
|
|
|
\family typewriter |
|
|
|
|
dynamicEventInjector :: Typeable a => XMPPT m (a -> IO ()) |
|
|
|
|
\family default |
|
|
|
|
to acquire this function. |
|
|
|
|
After that, the receiving hooks can perform the actual XMPP actions in |
|
|
|
|
the |
|
|
|
|
\begin_inset Quotes eld |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
main thread |
|
|
|
|
\begin_inset Quotes erd |
|
|
|
|
\end_inset |
|
|
|
|
|
|
|
|
|
based on the event payload. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Section |
|
|
|
|
Consistency |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
There are no known inconsistencies in this document. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Section |
|
|
|
|
Rationale |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\begin_layout Standard |
|
|
|
|
There are no known alternative approaches for the architecture. |
|
|
|
|
\end_layout |
|
|
|
|
|
|
|
|
|
\end_body |
|
|
|
|
\end_document |