simplexmq: SimpleXMQ message broker

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

This package includes server, client and agent for SMP protocols:

See terminal chat prototype built with SimpleXMQ broker.


[Skip to Readme]

Properties

Versions 0.3.1, 0.3.2, 0.4.0, 0.4.1, 0.5.0, 0.5.1, 0.5.2, 1.0.0, 1.0.0, 1.0.2, 1.1.0
Change log CHANGELOG.md
Dependencies aeson (>=1.5 && <1.6), ansi-terminal (>=0.10 && <0.12), asn1-encoding (>=0.9 && <0.10), asn1-types (>=0.3 && <0.4), async (>=2.2 && <2.3), attoparsec (>=0.13 && <0.14), base (>=4.7 && <5), base64-bytestring (>=1.0 && <1.3), bytestring (>=0.10 && <0.11), composition (>=1.0 && <1.1), constraints (>=0.12 && <0.14), containers (>=0.6 && <0.7), cryptonite (>=0.27 && <0.30), cryptostore (>=0.2 && <0.3), data-default (>=0.7 && <0.8), direct-sqlite (>=2.3 && <2.4), directory (>=1.3 && <1.4), file-embed (>=0.0.14.0 && <=0.0.15.0), filepath (>=1.4 && <1.5), generic-random (>=1.3 && <1.5), http-types (>=0.12 && <0.13), ini (>=0.4 && <0.5), iso8601-time (>=0.1 && <0.2), memory (>=0.15 && <0.16), mtl (>=2.2 && <2.3), network (>=3.1 && <3.2), network-transport (>=0.5 && <0.6), optparse-applicative (>=0.15 && <0.17), process (>=1.6 && <1.7), QuickCheck (>=2.14 && <2.15), random (>=1.1 && <1.3), simple-logger (>=0.1 && <0.2), simplexmq, sqlite-simple (>=0.4 && <0.5), stm (>=2.5 && <2.6), template-haskell (>=2.16 && <2.17), text (>=1.2 && <1.3), time (>=1.9 && <1.10), tls (>=1.5 && <1.6), transformers (>=0.5 && <0.6), unliftio (>=0.2 && <0.3), unliftio-core (>=0.2 && <0.3), websockets (>=0.12 && <0.13), x509 (>=1.7 && <1.8), x509-store (>=1.6 && <1.7), x509-validation (>=1.6 && <1.7) [details]
License AGPL-3.0-only
Copyright 2020-2022 simplex.chat
Author simplex.chat
Maintainer chat@simplex.chat
Category Chat, Network, Web, System, Cryptography
Home page https://github.com/simplex-chat/simplexmq#readme
Uploaded by epoberezkin at 2022-01-12T16:23:20Z

Modules

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Readme for simplexmq-1.0.0

[back to package description]

SimpleXMQ

GitHub build GitHub release

📢 SimpleXMQ v1 is released - with many security, privacy and efficiency improvements, new functionality - see release notes.

Please note: v1 is not backwards compatible, but it has the version negotiation built into all protocol layers for forwards compatibility of this version and backwards compatibility of the future versions, that will be backwards compatible for at least two versions back.

If you have a server deployed please deploy a new server to a new host and retire the previous version once it is no longer used.

Message broker for unidirectional (simplex) queues

SimpleXMQ is a message broker for managing message queues and sending messages over public network. It consists of SMP server, SMP client library and SMP agent that implement SMP protocol for client-server communication and SMP agent protocol to manage duplex connections via simplex queues on multiple SMP servers.

SMP protocol is inspired by Redis serialization protocol, but it is much simpler - it currently has only 10 client commands and 8 server responses.

SimpleXMQ is implemented in Haskell - it benefits from robust software transactional memory (STM) and concurrency primitives that Haskell provides.

SimpleXMQ roadmap

Components

SMP server

SMP server can be run on any Linux distribution without any dependencies, including low power/low memory devices. It uses in-memory persistence with an optional append-only log of created queues that allows to re-start the server without losing the connections. This log is compacted on every server restart, permanently removing suspended and removed queues.

To enable the queue logging, uncomment enable: on option in smp-server.ini configuration file that is created the first time the server is started.

To initialize the server use smp-server init command - it will generate keys and certificates for TLS transport. The fingerprint of offline certificate is used as part of the server address to protect client/server connection against man-in-the-middle attacks: smp://<fingerprint>@<hostname>:5223.

SMP server implements SMP protocol.

Running SMP server on MacOS

SMP server requires OpenSSL library for initialization. On MacOS OpenSSL library may be replaced with LibreSSL, which doesn't support required algorithms. Before initializing SMP server verify you have OpenSSL installed:

openssl version

If it says "LibreSSL", please install original OpenSSL:

brew update
brew install openssl
echo 'PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zprofile # or follow whatever instructions brew suggests
. ~/.zprofile # or restart your terminal to start a new session

Now openssl version should be saying "OpenSSL". You can now run smp-server init to initialize your SMP server.

SMP client library

SMP client is a Haskell library to connect to SMP servers that allows to:

SMP agent

SMP agent library can be used to run SMP agent as part of another application and to communicate with the agent via STM queues, without serializing and parsing commands and responses.

Haskell type ACommand represents SMP agent protocol to communicate via STM queues.

See simplex-chat terminal UI for the example of integrating SMP agent into another application.

SMP agent executable can be used to run a standalone SMP agent process that implements plaintext SMP agent protocol via TCP port 5224, so it can be used via telnet. It can be deployed in private networks to share access to the connections between multiple applications and services.

Using SMP server and SMP agent

You can either run your own SMP server locally or deploy using Linode StackScript, or try local SMP agent with the deployed servers:

smp://u2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU=@smp4.simplex.im smp://hpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg=@smp5.simplex.im smp://PQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo=@smp6.simplex.im

It's the easiest to try SMP agent via a prototype simplex-chat terminal UI.

Linode

Deploy SMP server on Linode

* You can use free credit Linode offers when creating a new account to deploy an SMP server.

Deployment on Linode is performed via StackScripts, which serve as recipes for Linode instances, also called Linodes. To deploy SMP server on Linode:

Please submit an issue if any problems occur.

DigitalOcean

Deploy SMP server on DigitalOcean

* When creating a DigitalOcean account you can use this link to get free credit. (You would still be required either to provide your credit card details or make a confirmation pre-payment with PayPal)

To deploy SMP server use SimpleX Server 1-click app from DigitalOcean marketplace:

Please submit an issue if any problems occur.

SMP server design

SMP server design

SMP agent design

SMP agent design

License

AGPL v3