Pusher

Category: Modules
Subcategory: Messaging

Overview

This module provides an integration with Pusher, that allows you to notify clients (browser & mobile) when an object is changed. This module contains a connector and a widget. The connector allows you to push a notification when an object has changed. The widget should be placed in the object that should listen to changes and on the notification it can call a microflow or nanoflow so that an action can be done like refreshing the data.

Documentation

Demo url

Pusher Notify and Listen

Listen to Notify server action and perform client side action.

Trigger a microflow or nanoflow directly from the server on the client app, triggered from other session, without waiting for the users to interact with the page.

Use cases

  • Asynchronous refreshes
  • Notification
  • Chat function

In the standard situation updates in the client are trigger by user interaction, by timed actions or Data grid refresh time. In case information, that is not created by the same user session, that needs to be updated immediately in the client app, no viable option is supported in the Mendix core product. As alternative users need to refresh their page constantly by timers or by constant clicking. This is not user friendly and is not preferment when scaling.

With this module can create a Notify event on the server that directly cause an action in the client application.

The event is based on a persistable object that is available in the server and the client page. From a microflow the Notify action will send a message to every Listen widget that is listen to the same object and Action name.

Please not the Listen widget can only listen when the page is active. So the widget can not be used to send notification when user are navigated away.

Dependencies

  • Mendix 7.14
  • External service Pusher.com

Dependent external service

This module is build around the pusher.com/channels product. https://pusher.com/channels. Pusher.com is a payed service, however there is very generous free tree sandbox plan. https://pusher.com/channels/pricing

At the moment, 28 September 2018

Plan Sandbox
Price Free
Connections 100 Max
Number of channels Unlimited
Messages 200k / Day
Support Limited
Protection SSL

Setup app

  1. Sign up at https://pusher.com
  2. From the dashboard, create an app
  3. On the Channels Apps page select the new app. In App Keys keys are shown
  4. Copy key information into the Pusher module constants:
    1. app_id => Pusher_App_ID
    2. key => Pusher_Key
    3. secret => Pusher_Secret
    4. cluster => Pusher_Cluster

NOTE: Make sure you have different apps (keys) created for each app and environment (development, acceptance and production). When the credentials are shared, messages could go across environment and have unwanted side effects. The configuration can also be set per developer via: Project settings > Edit configuration > Constants.

Usage

  1. Import the module from the app store
  2. Add the module role Pusher User to the relevant project security user role
  3. Update the constants in the Configuration folder with the keys of the app
  4. Create a microflow to execute the the Notify action. With input parameters
    1. Key settings
    2. Action name, same as configured in the widget
    3. The context object of the widget
  5. Place the widget in the page within a data view, the context should match the parameter object
  6. In the Action list add an action
    1. The Action name should match the action name parameter provided in the Notify action.
    2. Select a microflow or nanoflow the execute the action

Sequence diagram

Update object via Notify - Listen

Refresh microflow

A microflow can be used to retrieve data that is changed by other users as long is it committed and the transaction has finished.

The $Message variable is containing the object in session state, and the with the XPath query [id = $Message] the object is retried from the database. The changes action does only do a Refresh in client. This will trigger an refresh update on the client page.

Update object via Notify - Listen

Security

The notify messages are sent to anybody who is listening. A message will contain limited data: entity name, id, changed date, notifier username. To send a 'Notify' message it is requires to have the private key which is stored on the server in the NotifyListen.secret constant. This 'secret' should not shared with anybody. he 'Listen' widget will use the public NotifyListen.key to receive a signal and will perform the action as the logged in user.

An addition authentication requests is made to the Mendix REST server <host>/rest/pusher/key and <host>/rest/pusher/auth. Only when success full the user is allowed to lists. The service will only allow logged in user with the module right NotifyListen.User to listen, if the user have entity access to the object of the data where the widget is placed in.

Releases

Version: 2.0.0
Framework Version: 8.12.5
Release Notes: Export module as a Mendix 8.12.5 module to allow conversion to Mendix 9.
Version: 1.0.7
Framework Version: 7.23.3
Release Notes: Fix module to support Mendix 7.23.3 and above.
Version: 1.0.6
Framework Version: 7.23.3
Release Notes: Upgrade `httpcore` Java dependency to fix a `NoClassDefFoundError` for class `org/apache/http/ssl/SSLContexts`.
Version: 1.0.5
Framework Version: 7.23.3
Release Notes: Add support for pushing updates via a scheduled event (Solved GitHub issue #3, Mendix Support Ticket #90208)
Version: 1.0.4
Framework Version: 7.23.3
Release Notes: - Update widgets dependencies - Rename widget to `Pusher Listen` to make it easier to find it in the Select widget dialog.