Skip to Main Content
Player Logo
PlayerPlugins

Async Node Plugin

The AsyncNode Plugin is used to enable streaming additional content into a flow that has already been loaded and rendered.
A common use case for this plugin is conversational UI, as the users input more dialogue, new content must be streamed into Player in order to keep the UI up to date.
The pillar that makes this possible is the concept of an AsyncNode. An AsyncNode is any tree node with the property async: true, it represents a placeholder node that will be replaced by a concrete node in the future.
In the example below, node with the id “some-async-node” will not be rendered on first render, but will be replaced with a UI asset node at a later time:
{
  "id": "flow-1",
    "views": [
      {
        "id": 'action',
        "actions": [
          {
            "id": "some-async-node",
            "async": true,
          },
        ],
      },
    ],
  ...
}
The AsyncNodePlugin exposes an onAsyncNode hook on all platforms. The onAsyncNode hook will be invoked with the current node when the plugin is available and an AsyncNode is detected during the resolve process. The node used to call the hook with could contain metadata according to content spec.
User should tap into the onAsyncNode hook to examine the node’s metadata before making a decision on what to replace the async node with. The return could be a single asset node or an array of asset nodes.

Continuous Streaming

In order to keep streaming in new content, there must be at least 1 or more AsyncNodes in the view tree at all times.
This means there must be a constant renewal of new AsyncNodes after the previous ones are resolved by the user.

Usage

Add the plugin to Player:
import { Player } from '@player-ui/player';
import { AsyncNodePlugin } from '@player-ui/async-node-plugin';

const asyncNodePlugin = new AsyncNodePlugin();

// Configuring async node behaviour
asyncNodePlugin.hooks.onAsyncNode.tap('handleAsync', async (node: Node.Node) => {
  ...
  // Determine what to return to be parsed into a concrete UI asset
});

const player = new Player({
  plugins: [
    asyncNodePlugin
  ]
})