Data Sharing

Overview

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

See the JavaScript Shared Contexts example on GitHub.

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 create a new shared context, or if the context already exists,
// will completely overwrite its value.
await io.contexts.set("app-styling", newContext);

The set() method overwrites the existing value of the shared 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 shared context, 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 keyToRemove = { alternativeColor: null };

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

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 shared context as a first required argument and a function that will handle the context updates as a second required argument:

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");

Reference

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