Funktionierender Prototyp des Serious Games zur Vermittlung von Wissen zu Software-Engineering-Arbeitsmodellen.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

METADATA 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. Metadata-Version: 2.1
  2. Name: autobahn
  3. Version: 23.6.2
  4. Summary: WebSocket client & server library, WAMP real-time framework
  5. Home-page: https://github.com/crossbario/autobahn-python
  6. Author: typedef int GmbH
  7. License: MIT License
  8. Project-URL: Source, https://github.com/crossbario/autobahn-python
  9. Keywords: autobahn crossbar websocket realtime rfc6455 wamp rpc pubsub twisted asyncio xbr data-markets blockchain ethereum
  10. Platform: Any
  11. Classifier: License :: OSI Approved :: MIT License
  12. Classifier: Development Status :: 5 - Production/Stable
  13. Classifier: Environment :: No Input/Output (Daemon)
  14. Classifier: Framework :: Twisted
  15. Classifier: Intended Audience :: Developers
  16. Classifier: Operating System :: OS Independent
  17. Classifier: Programming Language :: Python
  18. Classifier: Programming Language :: Python :: 3
  19. Classifier: Programming Language :: Python :: 3.9
  20. Classifier: Programming Language :: Python :: 3.10
  21. Classifier: Programming Language :: Python :: 3.11
  22. Classifier: Programming Language :: Python :: Implementation :: CPython
  23. Classifier: Programming Language :: Python :: Implementation :: PyPy
  24. Classifier: Topic :: Internet
  25. Classifier: Topic :: Internet :: WWW/HTTP
  26. Classifier: Topic :: Communications
  27. Classifier: Topic :: System :: Distributed Computing
  28. Classifier: Topic :: Software Development :: Libraries
  29. Classifier: Topic :: Software Development :: Libraries :: Python Modules
  30. Classifier: Topic :: Software Development :: Object Brokering
  31. Requires-Python: >=3.9
  32. License-File: LICENSE
  33. Requires-Dist: txaio (>=21.2.1)
  34. Requires-Dist: cryptography (>=3.4.6)
  35. Requires-Dist: hyperlink (>=21.0.0)
  36. Requires-Dist: setuptools
  37. Provides-Extra: accelerate
  38. Provides-Extra: all
  39. Requires-Dist: zope.interface (>=5.2.0) ; extra == 'all'
  40. Requires-Dist: twisted (>=20.3.0) ; extra == 'all'
  41. Requires-Dist: attrs (>=20.3.0) ; extra == 'all'
  42. Requires-Dist: python-snappy (>=0.6.0) ; extra == 'all'
  43. Requires-Dist: msgpack (>=1.0.2) ; extra == 'all'
  44. Requires-Dist: ujson (>=4.0.2) ; extra == 'all'
  45. Requires-Dist: cbor2 (>=5.2.0) ; extra == 'all'
  46. Requires-Dist: py-ubjson (>=0.16.1) ; extra == 'all'
  47. Requires-Dist: flatbuffers (>=22.12.6) ; extra == 'all'
  48. Requires-Dist: pyopenssl (>=20.0.1) ; extra == 'all'
  49. Requires-Dist: service-identity (>=18.1.0) ; extra == 'all'
  50. Requires-Dist: pynacl (>=1.4.0) ; extra == 'all'
  51. Requires-Dist: pytrie (>=0.4.0) ; extra == 'all'
  52. Requires-Dist: qrcode (>=7.3.1) ; extra == 'all'
  53. Requires-Dist: cffi (>=1.14.5) ; extra == 'all'
  54. Requires-Dist: argon2-cffi (>=20.1.0) ; extra == 'all'
  55. Requires-Dist: passlib (>=1.7.4) ; extra == 'all'
  56. Requires-Dist: bitarray (>=2.7.5) ; extra == 'all'
  57. Requires-Dist: xbr (>=21.2.1) ; extra == 'all'
  58. Requires-Dist: click (>=8.1.2) ; extra == 'all'
  59. Requires-Dist: zlmdb (>=21.2.1) ; extra == 'all'
  60. Requires-Dist: web3[ipfs] (>=6.0.0) ; extra == 'all'
  61. Requires-Dist: rlp (>=2.0.1) ; extra == 'all'
  62. Requires-Dist: py-eth-sig-utils (>=0.4.0) ; extra == 'all'
  63. Requires-Dist: py-ecc (>=5.1.0) ; extra == 'all'
  64. Requires-Dist: eth-abi (>=4.0.0) ; extra == 'all'
  65. Requires-Dist: mnemonic (>=0.19) ; extra == 'all'
  66. Requires-Dist: base58 (>=2.1.0) ; extra == 'all'
  67. Requires-Dist: ecdsa (>=0.16.1) ; extra == 'all'
  68. Requires-Dist: py-multihash (>=2.0.1) ; extra == 'all'
  69. Requires-Dist: jinja2 (>=2.11.3) ; extra == 'all'
  70. Requires-Dist: yapf (==0.29.0) ; extra == 'all'
  71. Requires-Dist: spake2 (>=0.8) ; extra == 'all'
  72. Requires-Dist: hkdf (>=0.0.3) ; extra == 'all'
  73. Requires-Dist: PyGObject (>=3.40.0) ; extra == 'all'
  74. Provides-Extra: asyncio
  75. Provides-Extra: compress
  76. Requires-Dist: python-snappy (>=0.6.0) ; extra == 'compress'
  77. Provides-Extra: dev
  78. Requires-Dist: backports.tempfile (>=1.0) ; extra == 'dev'
  79. Requires-Dist: bumpversion (>=0.5.3) ; extra == 'dev'
  80. Requires-Dist: codecov (>=2.0.15) ; extra == 'dev'
  81. Requires-Dist: flake8 (<5) ; extra == 'dev'
  82. Requires-Dist: humanize (>=0.5.1) ; extra == 'dev'
  83. Requires-Dist: passlib ; extra == 'dev'
  84. Requires-Dist: pep8-naming (>=0.3.3) ; extra == 'dev'
  85. Requires-Dist: pip (>=9.0.1) ; extra == 'dev'
  86. Requires-Dist: pyenchant (>=1.6.6) ; extra == 'dev'
  87. Requires-Dist: pyflakes (>=1.0.0) ; extra == 'dev'
  88. Requires-Dist: pyinstaller (>=4.2) ; extra == 'dev'
  89. Requires-Dist: pylint (>=1.9.2) ; extra == 'dev'
  90. Requires-Dist: pytest-aiohttp ; extra == 'dev'
  91. Requires-Dist: pytest-asyncio (>=0.14.0) ; extra == 'dev'
  92. Requires-Dist: pytest-runner (>=2.11.1) ; extra == 'dev'
  93. Requires-Dist: pytest (>=3.4.2) ; extra == 'dev'
  94. Requires-Dist: pyyaml (>=4.2b4) ; extra == 'dev'
  95. Requires-Dist: qualname ; extra == 'dev'
  96. Requires-Dist: sphinx-autoapi (>=1.7.0) ; extra == 'dev'
  97. Requires-Dist: sphinx (>=1.7.1) ; extra == 'dev'
  98. Requires-Dist: sphinx-rtd-theme (>=0.1.9) ; extra == 'dev'
  99. Requires-Dist: sphinxcontrib-images (>=0.9.1) ; extra == 'dev'
  100. Requires-Dist: tox-gh-actions (>=2.2.0) ; extra == 'dev'
  101. Requires-Dist: tox (>=4.2.8) ; extra == 'dev'
  102. Requires-Dist: twine (>=3.3.0) ; extra == 'dev'
  103. Requires-Dist: twisted (>=22.10.0) ; extra == 'dev'
  104. Requires-Dist: txaio (>=20.4.1) ; extra == 'dev'
  105. Requires-Dist: watchdog (>=0.8.3) ; extra == 'dev'
  106. Requires-Dist: wheel (>=0.36.2) ; extra == 'dev'
  107. Requires-Dist: yapf (==0.29.0) ; extra == 'dev'
  108. Requires-Dist: mypy (>=0.610) ; (python_version >= "3.4" and platform_python_implementation != "PyPy") and extra == 'dev'
  109. Provides-Extra: encryption
  110. Requires-Dist: pyopenssl (>=20.0.1) ; extra == 'encryption'
  111. Requires-Dist: service-identity (>=18.1.0) ; extra == 'encryption'
  112. Requires-Dist: pynacl (>=1.4.0) ; extra == 'encryption'
  113. Requires-Dist: pytrie (>=0.4.0) ; extra == 'encryption'
  114. Requires-Dist: qrcode (>=7.3.1) ; extra == 'encryption'
  115. Provides-Extra: nvx
  116. Requires-Dist: cffi (>=1.14.5) ; extra == 'nvx'
  117. Provides-Extra: scram
  118. Requires-Dist: cffi (>=1.14.5) ; extra == 'scram'
  119. Requires-Dist: argon2-cffi (>=20.1.0) ; extra == 'scram'
  120. Requires-Dist: passlib (>=1.7.4) ; extra == 'scram'
  121. Provides-Extra: serialization
  122. Requires-Dist: msgpack (>=1.0.2) ; extra == 'serialization'
  123. Requires-Dist: ujson (>=4.0.2) ; extra == 'serialization'
  124. Requires-Dist: cbor2 (>=5.2.0) ; extra == 'serialization'
  125. Requires-Dist: py-ubjson (>=0.16.1) ; extra == 'serialization'
  126. Requires-Dist: flatbuffers (>=22.12.6) ; extra == 'serialization'
  127. Provides-Extra: twisted
  128. Requires-Dist: zope.interface (>=5.2.0) ; extra == 'twisted'
  129. Requires-Dist: twisted (>=20.3.0) ; extra == 'twisted'
  130. Requires-Dist: attrs (>=20.3.0) ; extra == 'twisted'
  131. Provides-Extra: ui
  132. Requires-Dist: PyGObject (>=3.40.0) ; extra == 'ui'
  133. Provides-Extra: xbr
  134. Requires-Dist: bitarray (>=2.7.5) ; extra == 'xbr'
  135. Requires-Dist: xbr (>=21.2.1) ; extra == 'xbr'
  136. Requires-Dist: click (>=8.1.2) ; extra == 'xbr'
  137. Requires-Dist: cbor2 (>=5.2.0) ; extra == 'xbr'
  138. Requires-Dist: zlmdb (>=21.2.1) ; extra == 'xbr'
  139. Requires-Dist: twisted (>=20.3.0) ; extra == 'xbr'
  140. Requires-Dist: web3[ipfs] (>=6.0.0) ; extra == 'xbr'
  141. Requires-Dist: rlp (>=2.0.1) ; extra == 'xbr'
  142. Requires-Dist: py-eth-sig-utils (>=0.4.0) ; extra == 'xbr'
  143. Requires-Dist: py-ecc (>=5.1.0) ; extra == 'xbr'
  144. Requires-Dist: eth-abi (>=4.0.0) ; extra == 'xbr'
  145. Requires-Dist: mnemonic (>=0.19) ; extra == 'xbr'
  146. Requires-Dist: base58 (>=2.1.0) ; extra == 'xbr'
  147. Requires-Dist: ecdsa (>=0.16.1) ; extra == 'xbr'
  148. Requires-Dist: py-multihash (>=2.0.1) ; extra == 'xbr'
  149. Requires-Dist: jinja2 (>=2.11.3) ; extra == 'xbr'
  150. Requires-Dist: yapf (==0.29.0) ; extra == 'xbr'
  151. Requires-Dist: spake2 (>=0.8) ; extra == 'xbr'
  152. Requires-Dist: hkdf (>=0.0.3) ; extra == 'xbr'
  153. Autobahn\|Python
  154. ================
  155. WebSocket & WAMP for Python on Twisted and asyncio.
  156. | |Version| |CI Test Status| |CI Deploy Status| |CI Docker Status| |CI EXE Status| |Docs| |Docker Images| |EXE Download|
  157. --------------
  158. | **Quick Links**: `Source Code <https://github.com/crossbario/autobahn-python>`__ - `Documentation <https://autobahn.readthedocs.io/en/latest/>`__ - `WebSocket Examples <https://autobahn.readthedocs.io/en/latest/websocket/examples.html>`__ - `WAMP Examples <https://autobahn.readthedocs.io/en/latest/wamp/examples.html>`__
  159. | **Community**: `Forum <https://crossbar.discourse.group/>`__ - `StackOverflow <https://stackoverflow.com/questions/tagged/autobahn>`__ - `Twitter <https://twitter.com/autobahnws>`__ - `IRC #autobahn/chat.freenode.net <https://webchat.freenode.net/>`__
  160. | **Companion Projects**: `Autobahn|JS <https://github.com/crossbario/autobahn-js/>`__ - `Autobahn|Cpp <https://github.com/crossbario/autobahn-cpp>`__ - `Autobahn|Testsuite <https://github.com/crossbario/autobahn-testsuite>`__ - `Crossbar.io <https://crossbar.io>`__ - `WAMP <https://wamp-proto.org>`__
  161. Introduction
  162. ------------
  163. **Autobahn\|Python** is a subproject of `Autobahn <https://crossbar.io/autobahn>`__ and provides open-source
  164. implementations of
  165. - `The WebSocket Protocol <https://tools.ietf.org/html/rfc6455>`__
  166. - `The Web Application Messaging Protocol (WAMP) <https://wamp-proto.org/>`__
  167. for Python 3.7+ and running on `Twisted <https://twistedmatrix.com/>`__ and `asyncio <https://docs.python.org/3/library/asyncio.html>`__.
  168. You can use **Autobahn\|Python** to create clients and servers in Python speaking just plain WebSocket or WAMP.
  169. **WebSocket** allows `bidirectional real-time messaging on the Web <https://crossbario.com/blog/post/websocket-why-what-can-i-use-it/>`__ and beyond, while `WAMP <https://wamp-proto.org/>`__ adds real-time application communication on top of WebSocket.
  170. **WAMP** provides asynchronous **Remote Procedure Calls** and **Publish & Subscribe** for applications in *one* protocol running over `WebSocket <https://tools.ietf.org/html/rfc6455>`__. WAMP is a *routed* protocol, so you need a **WAMP Router** to connect your **Autobahn\|Python** based clients. We provide `Crossbar.io <https://crossbar.io>`__, but there are `other options <https://wamp-proto.org/implementations.html#routers>`__ as well.
  171. .. note::
  172. **Autobahn\|Python** up to version v19.11.2 supported Python 2 and 3.4+,
  173. and up to version v20.7.1 supported Python 3.5+,
  174. and up to version v21.2.1 supported Python 3.6+.
  175. Features
  176. --------
  177. - framework for `WebSocket <https://tools.ietf.org/html/rfc6455>`__ and `WAMP <https://wamp-proto.org/>`__ clients and servers
  178. - runs on `CPython <https://python.org/>`__ and `PyPy <https://pypy.org/>`
  179. - runs under `Twisted <https://twistedmatrix.com/>`__ and `asyncio <https://docs.python.org/3/library/asyncio.html>`__ - implements WebSocket
  180. `RFC6455 <https://tools.ietf.org/html/rfc6455>`__ and Draft Hybi-10+
  181. - implements `WebSocket compression <https://tools.ietf.org/html/draft-ietf-hybi-permessage-compression>`__
  182. - implements `WAMP <https://wamp-proto.org/>`__, the Web Application Messaging Protocol
  183. - high-performance, fully asynchronous implementation
  184. - best-in-class standards conformance (100% strict passes with `Autobahn Testsuite <https://crossbar.io/autobahn#testsuite>`__: `Client <https://autobahn.ws/testsuite/reports/clients/index.html>`__ `Server <https://autobahn.ws/testsuite/reports/servers/index.html>`__)
  185. - message-, frame- and streaming-APIs for WebSocket
  186. - supports TLS (secure WebSocket) and proxies
  187. - Open-source (`MIT license <https://github.com/crossbario/autobahn-python/blob/master/LICENSE>`__)
  188. -----
  189. Show me some code
  190. -----------------
  191. To give you a first impression, here are two examples. We have lot more `in the repo <https://github.com/crossbario/autobahn-python/tree/master/examples>`__.
  192. WebSocket Echo Server
  193. ~~~~~~~~~~~~~~~~~~~~~
  194. Here is a simple WebSocket Echo Server that will echo back any WebSocket
  195. message received:
  196. .. code:: python
  197. from autobahn.twisted.websocket import WebSocketServerProtocol
  198. # or: from autobahn.asyncio.websocket import WebSocketServerProtocol
  199. class MyServerProtocol(WebSocketServerProtocol):
  200. def onConnect(self, request):
  201. print("Client connecting: {}".format(request.peer))
  202. def onOpen(self):
  203. print("WebSocket connection open.")
  204. def onMessage(self, payload, isBinary):
  205. if isBinary:
  206. print("Binary message received: {} bytes".format(len(payload)))
  207. else:
  208. print("Text message received: {}".format(payload.decode('utf8')))
  209. # echo back message verbatim
  210. self.sendMessage(payload, isBinary)
  211. def onClose(self, wasClean, code, reason):
  212. print("WebSocket connection closed: {}".format(reason))
  213. To actually run above server protocol, you need some lines of `boilerplate <https://autobahn.readthedocs.io/en/latest/websocket/programming.html#running-a-server>`__.
  214. WAMP Application Component
  215. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  216. Here is a WAMP Application Component that performs all four types of
  217. actions that WAMP provides:
  218. #. **subscribe** to a topic
  219. #. **publish** an event
  220. #. **register** a procedure
  221. #. **call** a procedure
  222. .. code:: python
  223. from autobahn.twisted.wamp import ApplicationSession
  224. # or: from autobahn.asyncio.wamp import ApplicationSession
  225. class MyComponent(ApplicationSession):
  226. @inlineCallbacks
  227. def onJoin(self, details):
  228. # 1. subscribe to a topic so we receive events
  229. def onevent(msg):
  230. print("Got event: {}".format(msg))
  231. yield self.subscribe(onevent, 'com.myapp.hello')
  232. # 2. publish an event to a topic
  233. self.publish('com.myapp.hello', 'Hello, world!')
  234. # 3. register a procedure for remote calling
  235. def add2(x, y):
  236. return x + y
  237. self.register(add2, 'com.myapp.add2')
  238. # 4. call a remote procedure
  239. res = yield self.call('com.myapp.add2', 2, 3)
  240. print("Got result: {}".format(res))
  241. Above code will work on Twisted and asyncio by changing a single line
  242. (the base class of ``MyComponent``). To actually run above application component, you need some lines of `boilerplate <https://autobahn.readthedocs.io/en/latest/wamp/programming.html#running-components>`__ and a `WAMP Router <https://autobahn.readthedocs.io/en/latest/wamp/programming.html#running-a-wamp-router>`__.
  243. Extensions
  244. ----------
  245. Networking framework
  246. ~~~~~~~~~~~~~~~~~~~~
  247. Autobahn runs on both Twisted and asyncio. To select the respective netoworking framework, install flavor:
  248. * ``asyncio``: Install asyncio (when on Python 2, otherwise it's included in the standard library already) and asyncio support in Autobahn
  249. * ``twisted``: Install Twisted and Twisted support in Autobahn
  250. -----
  251. WebSocket acceleration and compression
  252. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  253. * ``accelerate``: Install WebSocket acceleration - *Only use on CPython - not on PyPy (which is faster natively)*
  254. * ``compress``: Install (non-standard) WebSocket compressors **bzip2** and **snappy** (standard **deflate** based WebSocket compression is already included in the base install)
  255. -----
  256. Encryption and WAMP authentication
  257. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  258. Autobahn supports running over TLS (for WebSocket and all WAMP transports) as well as **WAMP-cryposign** authentication.
  259. To install use this flavor:
  260. * ``encryption``: Installs TLS and WAMP-cryptosign dependencies
  261. Autobahn also supports **WAMP-SCRAM** authentication. To install:
  262. * ``scram``: Installs WAMP-SCRAM dependencies
  263. -----
  264. XBR
  265. ~~~
  266. Autobahn includes support for `XBR <https://xbr.network/>`__. To install use this flavor:
  267. * ``xbr``:
  268. To install:
  269. .. code:: console
  270. pip install autobahn[xbr]
  271. or (Twisted, with more bells an whistles)
  272. .. code:: console
  273. pip install autobahn[twisted,encryption,serialization,xbr]
  274. or (asyncio, with more bells an whistles)
  275. .. code:: console
  276. pip install autobahn[asyncio,encryption,serialization,xbr]
  277. -----
  278. Native vector extensions (NVX)
  279. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  280. > This is NOT yet complete - ALPHA!
  281. Autobahn contains **NVX**, a network accelerator library that provides SIMD accelerated native vector code for WebSocket (XOR masking) and UTF-8 validation.
  282. .. note:
  283. NVX lives in namespace `autobahn.nvx` and currently requires a x86-86 CPU with at least SSE2 and makes use of SSE4.1 if available. The code is written using vector instrinsics, should compile with both GCC and Clang,and interfaces with Python using CFFI, and hence runs fast on PyPy.
  284. -----
  285. WAMP Serializers
  286. ~~~~~~~~~~~~~~~~
  287. * ``serialization``: To install additional WAMP serializers: CBOR, MessagePack, UBJSON and Flatbuffers
  288. **Above is for advanced uses. In general we recommend to use CBOR where you can,
  289. and JSON (from the standard library) otherwise.**
  290. -----
  291. To install Autobahn with all available serializers:
  292. .. code:: console
  293. pip install autobahn[serializers]
  294. or (development install)
  295. .. code:: console
  296. pip install -e .[serializers]
  297. Further, to speed up JSON on CPython using ``ujson``, set the environment variable:
  298. .. code:: console
  299. AUTOBAHN_USE_UJSON=1
  300. .. warning::
  301. Using ``ujson`` (on both CPython and PyPy) will break the ability of Autobahn
  302. to transport and translate binary application payloads in WAMP transparently.
  303. This ability depends on features of the regular JSON standard library module
  304. not available on ``ujson``.
  305. .. |Version| image:: https://img.shields.io/pypi/v/autobahn.svg
  306. :target: https://pypi.python.org/pypi/autobahn
  307. .. |CI Test Status| image:: https://github.com/crossbario/autobahn-python/workflows/main/badge.svg
  308. :target: https://github.com/crossbario/autobahn-python/actions?query=workflow%3Amain
  309. :alt: CI Test Status
  310. .. |CI Deploy Status| image:: https://github.com/crossbario/autobahn-python/workflows/deploy/badge.svg
  311. :target: https://github.com/crossbario/autobahn-python/actions?query=workflow%3Adeploy
  312. :alt: CI Deploy Status
  313. .. |CI Docker Status| image:: https://github.com/crossbario/autobahn-python/workflows/docker/badge.svg
  314. :target: https://github.com/crossbario/autobahn-python/actions?query=workflow%3Adocker
  315. :alt: CI Docker Status
  316. .. |CI EXE Status| image:: https://github.com/crossbario/autobahn-python/workflows/pyinstaller/badge.svg
  317. :target: https://github.com/crossbario/autobahn-python/actions?query=workflow%3Apyinstaller
  318. :alt: CI EXE Status
  319. .. |Docs| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat
  320. :target: https://autobahn.readthedocs.io/en/latest/
  321. .. |Docker Images| image:: https://img.shields.io/badge/download-docker-blue.svg?style=flat
  322. :target: https://hub.docker.com/r/crossbario/autobahn-python/
  323. .. |EXE Download| image:: https://img.shields.io/badge/download-exe-blue.svg?style=flat
  324. :target: https://download.crossbario.com/xbrnetwork/linux-amd64/xbrnetwork-latest