Data Sharing Between Apps

Overview

A shared context is a named object (holding a map of key/value pairs) that stores cross app data. The context object can hold any cross-app data. Any app can update a context or subscribe for context updates and react to them by using the name of the context.

The Shared Contexts API offers a simple and effective solution for sharing data between your apps. Imagine you have an app showing a list of clients and an app showing client portfolios. What you need, is your "Portfolio" app to show the portfolio of a specific client that the user has selected from the "Clients" app. You can easily achieve this in a few simple steps by using the Shared Contexts API:

  • instruct the "Clients" app to publish updates to a context object holding the id of the currently selected client;
  • instruct the "Portfolio" app to subscribe for updates of that same context object and specify how the "Portfolio" app should handle the received data in order to update its current state;

The Shared Contexts API is accessible via the io.contexts object.

The Live Examples section demonstrates using the Shared Contexts API.

Setting Contexts

To create a shared context or replace entirely the value of an existing one, use the set() method:

const newContext = { backgroundColor: "purple" };

// This will completely overwrite the existing context value.
await io.contexts.set("app-styling", newContext);

The set() method overwrites the existing context object, as opposed to the update() method, which only updates the values of its properties.

Getting Contexts

To get the value of a specific context object, use the get() method:

const data = await io.contexts.get("app-styling");

Listing All Contexts

To get the names of all currently available shared contexts, use the all() method:

// Returns a string array with the available context names.
const availableContexts = io.contexts.all();

Updating Contexts

To update the value of an existing shared context, use the update() method. New properties will be added, existing ones will be updated, and you can also remove shared context keys by setting them to null. If the specified shared context doesn't exist, it will be created:

const contextUpdate = {
    backgroundColor: "red",
    alternativeColor: "green"
};

await io.contexts.update("app-styling", contextUpdate);

To remove a shared context key, set it to null:

const keysToRemove = { alternativeColor: null };

await io.contexts.update("app-styling", keysToRemove);

Updating Specific Properties

You can use the setPath() and setPaths() methods to update specific shared context properties using a dot-separated string path to point to the location of the property within the shared context object. If the property (or the path) doesn't exist, it will be created. These methods are useful for updating or creating one or more nested properties within the shared context object.

To update or create a single property, use the setPath() method. It accepts the name of the shared context, a path to the property to update, and a value for the property:

const path = "text.color";
const value = "grey";

await io.contexts.setPath("app-styling", path, value);

// Assuming the context already exists and has this shape:
// { backgroundColor: "red" }, it will be updated as follows:
// { backgroundColor: "red", text: { color: "grey" } }

To update or create multiple properties, use the setPaths() method. It accepts the name of the shared context and a list of PathValue objects each containing a path to the property to update and a value for it:

const updates = [
    { path: "table.cells", value: { width: 50, height: 30 } },
    { path: "text.color", value: "white" }
];

await io.contexts.setPaths("app-styling", updates);

// Assuming the context already exists and has this shape:
// { backgroundColor: "red", text: { color: "grey" } }, it will be updated as follows:
//
// {
//     backgroundColor: "red",
//     text: {
//         color: "white"
//     },
//     table: {
//         cells: {
//             width: 50,
//             height: 30
//         }
//     }
// }

Subscribing for Context Updates

To subscribe for context updates, use the subscribe() method. It accepts the name of the context as a first required parameter and a function that will handle the context updates as a second required parameter:

const handler = (context, delta, removed) => {
    const bgColor = context.backgroundColor;

    console.log(bgColor);
});

await io.contexts.subscribe("app-styling", handler);

Unsubscribing

The subscribe() method returns a Promise which resolves with a function you can use to unsubscribe from context updates:

const unsubscribe = await io.contexts.subscribe("app-styling", handler);

unsubscribe();

Destroying Contexts

To destroy a context object, use the destroy() method:

await io.contexts.destroy("app-styling");

Live Examples

Setting and Getting Context

The apps below demonstrate how to set and get context using the get() and set() methods of the Shared Contexts API.

Create a value in App B (any string) that will be assigned to a pre-defined property of the context object and set the "Browser" context by clicking the "Set Context" button. Click "Get Context" in App A to print the current value of the shared context object.

Subscribing for Context Updates

The apps below demonstrate how to update a shared context object and how to subscribe for updates of a context by using the update() and subscribe() methods of the Shared Contexts API.

Click the "Subscribe" button in App A to subscribe for updates of the "Browser" context. Every time the "Browser" context changes, the context value will be printed. Create a context value and click the "Update Context" button in App B to update the "Browser" context.

Discovering Contexts

The apps below demonstrate how to get a list of all contexts and find a specific context by name.

Create several contexts with different names from App B. Input the name of the context you want to find in App A and click the "Find Context" button to print the context.

Reference

For a complete list of the available Shared Contexts API methods and properties, see the Shared Contexts API Reference Documentation.