Cette page explique comment utiliser l'API Google Workspace Events pour créer un abonnement à une ressource Google Workspace. Un abonnement Google Workspace permet à votre application de recevoir des informations sur les événements Google Workspace, qui représentent des modifications apportées à une ressource Google Workspace. Pour en savoir plus sur les ressources et les types d'événements compatibles avec l'API Google Workspace Events, consultez la présentation de l'API Google Workspace Events.
Cette page décrit les étapes à suivre pour créer un abonnement Google Workspace :
- configurer votre environnement ;
- Créez un sujet Google Cloud Pub/Sub et abonnez-vous-y. Vous utilisez ce sujet comme point de terminaison pour recevoir les événements Google Workspace.
- Appelez la méthode
create
de l'API Google Workspace Events sur la ressourceSubscription
. - Testez votre abonnement Google Workspace pour vérifier que votre sujet Pub/Sub reçoit les événements auxquels vous vous êtes abonné.
- Vous pouvez également configurer la manière dont les événements sont envoyés à un point de terminaison pour votre application, afin que celle-ci puisse traiter l'événement et, si nécessaire, prendre des mesures.
Prérequis
Apps Script
- Pour utiliser les commandes Google Cloud CLI de ce guide :
- Installez Google Cloud CLI.
- Pour
initialiser la CLI
gcloud
, exécutez le code suivant :
gcloud init
- Un projet Google Cloud avec la facturation activée. Pour les abonnements à Chat, vous devez également activer l'API Chat dans votre projet Cloud et configurer les champs Nom de l'application, URL de l'avatar et Description. Pour en savoir plus, consultez Créer une application Google Chat.
- Nécessite l'authentification de l'utilisateur avec l'écran de consentement OAuth configuré pour l'application. Lorsque vous configurez l'écran de consentement, vous devez spécifier un champ d'application pour prendre en charge chaque type d'événement pour l'abonnement. Pour configurer l'écran de consentement et identifier les habilitations requises, consultez Choisir des habilitations.
- Un projet Apps Script :
- Utilisez votre projet Google Cloud au lieu de celui créé automatiquement par Apps Script.
- Pour tous les champs d'application que vous avez ajoutés pour configurer l'écran de consentement OAuth, vous devez également les ajouter au fichier
appsscript.json
de votre projet Apps Script. Exemple : - Activez le service avancé
Google Workspace Events
.
"oauthScopes": [ "https://www.googleapis.com/auth/chat.messages.readonly" ]
Python
- Python 3.6 ou version ultérieure
- Outil de gestion de packages pip
- Dernières bibliothèques clientes Google pour Python. Pour les installer ou les mettre à jour, exécutez la commande suivante dans votre interface de ligne de commande :
pip3 install --upgrade google-api-python-client google-auth-oauthlib
- Pour utiliser les commandes Google Cloud CLI de ce guide :
- Installez Google Cloud CLI.
- Pour
initialiser la CLI
gcloud
, exécutez le code suivant :
gcloud init
- Un projet Google Cloud avec la facturation activée. Pour les abonnements à Chat, vous devez également activer l'API Chat dans votre projet Cloud et configurer les champs Nom de l'application, URL de l'avatar et Description. Pour en savoir plus, consultez Créer une application Google Chat.
- Nécessite l'authentification de l'utilisateur avec l'écran de consentement OAuth configuré pour l'application. Lorsque vous configurez l'écran de consentement, vous devez spécifier un champ d'application pour prendre en charge chaque type d'événement pour l'abonnement. Pour configurer l'écran de consentement et identifier les habilitations requises, consultez Choisir des habilitations.
Configurer votre environnement
La section suivante explique comment configurer votre environnement avant de créer un abonnement Google Workspace.
Activer l'API Google Workspace Events et l'API Google Cloud Pub/Sub
Avant d'utiliser les API Google, vous devez les activer dans un projet Google Cloud. Vous pouvez activer une ou plusieurs API dans un même projet Google Cloud.Console Google Cloud
Dans la console Google Cloud, ouvrez le projet Google Cloud de votre application et activez les API Google Workspace Events et Pub/Sub :
gcloud
Dans votre répertoire de travail, connectez-vous à votre compte Google :
gcloud auth login
Définissez le projet sur le projet Cloud de votre application :
gcloud config set project PROJECT_ID
Remplacez
PROJECT_ID
par l'ID du projet pour le projet Cloud de votre application.Activez l'API Google Workspace Events et l'API Google Cloud Pub/Sub :
gcloud services enable pubsub.googleapis.com workspaceevents.googleapis.com
Créer des identifiants client OAuth
Choisissez le type d'application pour obtenir des instructions spécifiques sur la création d'un ID client OAuth :
Application Web
- Dans la console Google Cloud, accédez à Menu > > Clients.
- Cliquez sur Créer un client.
- Cliquez sur Type d'application > Application Web.
- Dans le champ Nom, saisissez un nom pour l'identifiant. Ce nom n'apparaît que dans la console Google Cloud.
- Ajoutez les URI autorisés associés à votre application :
- Applications côté client (JavaScript) : sous Origines JavaScript autorisées, cliquez sur Ajouter un URI. Saisissez ensuite un URI à utiliser pour les requêtes du navigateur. Cela permet d'identifier les domaines à partir desquels votre application peut envoyer des requêtes d'API au serveur OAuth 2.0.
- Applications côté serveur (Java, Python, etc.) : sous URI de redirection autorisés, cliquez sur Ajouter un URI. Saisissez ensuite un URI de point de terminaison vers lequel le serveur OAuth 2.0 peut envoyer des réponses.
- Cliquez sur Créer.
Les identifiants que vous venez de créer s'affichent sous ID client OAuth 2.0.
Notez l'ID client. Les codes secrets du client ne sont pas utilisés pour les applications Web.
Android
- Dans la console Google Cloud, accédez à Menu > > Clients.
- Cliquez sur Créer un client.
- Cliquez sur Type d'application > Android.
- Dans le champ "Nom", saisissez un nom pour l'identifiant. Ce nom n'apparaît que dans la console Google Cloud.
- Dans le champ "Nom du package", saisissez le nom du package de votre fichier
AndroidManifest.xml
. - Dans le champ "Empreinte du certificat SHA-1", saisissez l'empreinte du certificat SHA-1 que vous avez générée.
- Cliquez sur Créer.
Les identifiants que vous venez de créer s'affichent sous "ID client OAuth 2.0".
iOS
- Dans la console Google Cloud, accédez à Menu > > Clients.
- Cliquez sur Créer un client.
- Cliquez sur Type d'application > iOS.
- Dans le champ "Nom", saisissez un nom pour l'identifiant. Ce nom n'apparaît que dans la console Google Cloud.
- Dans le champ "Bundle ID" (ID du bundle), saisissez l'identifiant du bundle tel qu'il apparaît dans le fichier
Info.plist
de l'application. - (Facultatif) Si votre application apparaît dans l'App Store d'Apple, saisissez son ID App Store.
- (Facultatif) Dans le champ "ID d'équipe", saisissez la chaîne unique de 10 caractères générée par Apple et attribuée à votre équipe.
- Cliquez sur Créer.
Les identifiants que vous venez de créer s'affichent sous "ID client OAuth 2.0".
Application Chrome
- Dans la console Google Cloud, accédez à Menu > > Clients.
- Cliquez sur Créer un client.
- Cliquez sur Type d'application > Extension Chrome.
- Dans le champ "Nom", saisissez un nom pour l'identifiant. Ce nom n'apparaît que dans la console Google Cloud.
- Dans le champ "ID de l'article", saisissez la chaîne de 32 caractères unique de votre application. Vous trouverez cette valeur d'ID dans l'URL de votre application sur le Chrome Web Store et dans le tableau de bord du développeur Chrome Web Store.
- Cliquez sur Créer.
Les identifiants que vous venez de créer s'affichent sous "ID client OAuth 2.0".
Application de bureau
- Dans la console Google Cloud, accédez à Menu > > Clients.
- Cliquez sur Créer un client.
- Cliquez sur Type d'application > Application de bureau.
- Dans le champ Nom, saisissez un nom pour l'identifiant. Ce nom n'apparaît que dans la console Google Cloud.
- Cliquez sur Créer.
Les identifiants que vous venez de créer s'affichent sous "ID client OAuth 2.0".
TV et périphériques à saisie limitée
- Dans la console Google Cloud, accédez à Menu > > Clients.
- Cliquez sur Créer un client.
- Cliquez sur Type d'application > TV et appareils à saisie limitée.
- Dans le champ "Nom", saisissez un nom pour l'identifiant. Ce nom n'apparaît que dans la console Google Cloud.
- Cliquez sur Créer.
Les identifiants que vous venez de créer s'affichent sous "ID client OAuth 2.0".
Plate-forme Windows universelle (UWP)
- Dans la console Google Cloud, accédez à Menu > > Clients.
- Cliquez sur Créer un client.
- Cliquez sur Type d'application > Plate-forme Windows universelle (UWP).
- Dans le champ "Nom", saisissez un nom pour l'identifiant. Ce nom n'apparaît que dans la console Google Cloud.
- Dans le champ "ID du Store", saisissez l'ID Microsoft Store unique de votre application (12 caractères). Vous trouverez cet ID dans l'URL Microsoft Store de votre application et dans le Centre des partenaires.
- Cliquez sur Créer.
Les identifiants que vous venez de créer s'affichent sous "ID client OAuth 2.0".
Télécharger le fichier JSON du code secret du client
Le fichier du code secret du client est une représentation JSON des identifiants de l'ID client OAuth auxquels votre application peut faire référence lorsqu'elle fournit des identifiants.
Dans la console Google Cloud, accédez à Menu > API et services > Identifiants.
Sous ID client OAuth 2.0, cliquez sur l'ID client que vous avez créé.
Cliquez sur Télécharger au format JSON.
Enregistrez le fichier sous le nom
credentials.json
.
Créer un sujet Pub/Sub et s'y abonner
Dans cette section, vous allez créer un sujet Pub/Sub et un abonnement à ce sujet. Votre sujet Pub/Sub sert de point de terminaison de notification où votre abonnement Google Workspace reçoit les événements.
Pour en savoir plus sur la création et la gestion des sujets Pub/Sub, consultez la documentation Pub/Sub.
Pour créer un sujet Pub/Sub et vous y abonner :
Console Google Cloud
Dans la console Google Cloud, accédez à la page Pub/Sub :
Accéder à Google Cloud Pub/Sub
Assurez-vous que le projet Cloud de votre application est sélectionné.
Cliquez sur
Créer un sujet, puis procédez comme suit :- Saisissez un nom pour votre sujet, par exemple
workspace-events-topic
. - Laissez l'option Ajouter un abonnement par défaut sélectionnée. Pub/Sub nomme cet abonnement par défaut de la même manière que votre sujet, par exemple
workspace-events-topic-sub
. - Facultatif : Mettez à jour ou configurez des propriétés supplémentaires pour votre thème.
- Saisissez un nom pour votre sujet, par exemple
Cliquez sur Créer. Le nom complet de votre sujet est au format
projects/PROJECT_ID/topics/TOPIC_ID
. Vous utiliserez ce nom complet lors d'une prochaine étape.Accordez l'autorisation de publier des messages Pub/Sub dans votre sujet :
- Sur la page de votre sujet, accédez au panneau latéral et ouvrez l'onglet Autorisations.
- Cliquez sur Ajouter un compte principal.
- Dans le champ Ajouter des comptes principaux, ajoutez le compte de service pour l'application Google Workspace qui fournit des événements à votre abonnement :
- Pour les événements Chat,
chat-api-push@system.gserviceaccount.com
. - Version Preview développeur : pour les événements Drive,
drive-api-event-push@system.gserviceaccount.com
. - Pour les événements Meet,
meet-api-event-push@system.gserviceaccount.com
.
- Pour les événements Chat,
- Dans le menu Attribuer des rôles, sélectionnez
Pub/Sub Publisher
. - Cliquez sur Enregistrer. La mise à jour des autorisations pour votre thème peut prendre quelques minutes.
gcloud
Dans votre projet Cloud, créez un sujet en exécutant la commande suivante :
gcloud pubsub topics create TOPIC_ID
Remplacez
TOPIC_ID
par un ID unique pour votre sujet, par exempleworkspace-events-topic
.Le résultat affiche le nom complet du sujet, au format
projects/PROJECT_ID/topics/TOPIC_ID
. Notez le nom et assurez-vous que la valeur de PROJECT_ID correspond à l'ID de projet Cloud de votre application. Vous utiliserez le nom du sujet à l'étape suivante et pour créer l'abonnement Google Workspace ultérieurement.Accordez l'accès à la publication de messages dans votre sujet :
gcloud pubsub topics add-iam-policy-binding TOPIC_NAME --member='serviceAccount:GOOGLE_WORKSPACE_APPLICATION' --role='roles/pubsub.publisher'
Remplacez les éléments suivants :
TOPIC_NAME
: nom complet du sujet, qui correspond au résultat de l'étape précédente. Le fichier est au formatprojects/PROJECT_ID/topics/TOPIC_ID
.GOOGLE_WORKSPACE_APPLICATION
: application Google Workspace qui doit fournir des événements à votre abonnement :- Pour recevoir des événements de Chat, utilisez
chat-api-push@system.gserviceaccount.com
. - Version Preview développeur : pour recevoir des événements de Drive, utilisez
drive-api-event-push@system.gserviceaccount.com
. - Pour recevoir des événements de Meet, utilisez
meet-api-event-push@system.gserviceaccount.com
.
- Pour recevoir des événements de Chat, utilisez
La mise à jour des autorisations pour votre thème peut prendre quelques minutes.
Créez un abonnement Pub/Sub pour le sujet :
gcloud pubsub subscriptions create SUBSCRIPTION_NAME --topic=TOPIC_NAME
Remplacez les éléments suivants :
SUBSCRIPTION_NAME
: nom de votre abonnement, tel queworkspace-events-subscription
.TOPIC_NAME
: nom du sujet que vous avez créé à l'étape précédente.
S'abonner à une ressource Google Workspace
Dans cette section, vous vous abonnez à la ressource Google Workspace dont vous souhaitez surveiller les événements.
Choisir et identifier la ressource cible
Dans un abonnement Google Workspace, la ressource cible est la ressource Google Workspace dont vous surveillez les événements. La ressource cible est représentée dans le champ targetResource
de l'abonnement, au format du nom complet de la ressource. Par exemple, pour un abonnement qui surveille un espace Google Chat (spaces/AAAABBBBBBB
), la valeur de targetResource
est //chat.googleapis.com/spaces/AAAABBBBBBB
.
Identifier une ressource cible pour Chat
Ressource cible | Format | Limites |
---|---|---|
Espace |
où SPACE correspond à l'ID dans le
nom de ressource de la ressource |
L'utilisateur Chat qui autorise l'abonnement doit être membre de l'espace avec son compte Google Workspace ou Google. |
Tous les espaces d'un utilisateur |
|
L'abonnement ne reçoit que les événements des espaces dont l'utilisateur est membre avec son compte Google Workspace ou Google. |
Utilisateur |
où USER correspond à l'ID dans le
nom de ressource de la ressource |
L'abonnement ne reçoit que les événements concernant l'utilisateur qui a autorisé l'abonnement. Un utilisateur ne peut pas autoriser un abonnement au nom d'autres utilisateurs. |
Identifier une ressource cible pour Drive
Ressource cible | Format | Limites (le cas échéant) |
---|---|---|
Fichier |
//drive.googleapis.com/files/FILE
où FILE est l'ID dans le
nom de ressource de la ressource |
L'utilisateur qui autorise l'abonnement doit disposer d'une autorisation sur le fichier dans l'abonnement par rapport à l'événement d'abonnement. |
Drive partagé |
//drive.googleapis.com/drives/DRIVE
où DRIVE est l'ID dans le nom de ressource de la ressource |
L'abonnement ne reçoit que les événements concernant les éléments du Drive partagé dont l'utilisateur est membre avec son compte Google Workspace ou son compte Google. |
Identifier une ressource cible pour Meet
Ressource cible | Format | Limites (le cas échéant) |
---|---|---|
Espace de réunion | //meet.googleapis.com/spaces/SPACE
où SPACE correspond à l'ID dans le
nom de ressource de la ressource |
|
Utilisateur | //cloudidentity.googleapis.com/users/USER
où USER correspond à l'ID dans le champ
|
L'abonnement reçoit des événements concernant les espaces de réunion dans lesquels l'utilisateur est l'un des suivants :
|
Créer un abonnement Google Workspace
Pour créer un abonnement, vous utilisez la méthode subscriptions.create
de l'API Google Workspace Events afin de créer une ressource Subscription
.
Vous spécifiez les champs suivants :
targetResource
: un compte Google Workspace que vous avez identifié dans la section précédente, mis en forme à l'aide de son nom de ressource complet.eventTypes
: tableau d'un ou plusieurs types d'événements que vous souhaitez recevoir concernant la ressource. Par exemple, si votre application n'a besoin de connaître que les nouveaux messages publiés dans un espace Chat, elle peut simplement s'abonner aux événements concernant les messages créés.notificationEndpoint
: point de terminaison de notification où votre abonnement Google Workspace envoie des événements. Vous utilisez le sujet Pub/Sub que vous avez créé dans la section précédente.payloadOptions
: options permettant de spécifier la quantité de données de ressources à inclure dans la charge utile de l'événement. Cette configuration affecte le délai d'expiration de votre abonnement. Pour en savoir plus, consultez Données d'événement.
Pour créer un abonnement Google Workspace :
Apps Script
Dans votre projet Apps Script, créez un fichier de script nommé
createSubscription
et ajoutez le code suivant :function createSubscription() { // The Google Workspace resource to monitor for events. const targetResource = 'TARGET_RESOURCE'; // The types of events to receive. const eventTypes = [EVENT_TYPES]; // The endpoint to deliver events to, such as a Google Cloud Pub/Sub topic. const pubsubTopic = 'TOPIC_NAME'; // Whether to include resource data or not. const resourceData = RESOURCE_DATA; // Call the Workspace Events API using the advanced service. const response = WorkspaceEvents.Subscriptions.create({ targetResource: targetResource, eventTypes: eventTypes, notificationEndpoint: { pubsubTopic: pubsubTopic, }, payloadOptions: { includeResource: resourceData } }); console.log(response); }
Remplacez les éléments suivants :
TARGET_RESOURCE
: ressource Google Workspace à laquelle vous vous abonnez, formatée sous la forme de son nom complet. Par exemple, pour s'abonner à un espace Google Chat avec l'ID d'espaceAAAABBBB
, utilisez//chat.googleapis.com/spaces/AAAABBBB
.EVENT_TYPES
: un ou plusieurs types d'événements auxquels vous souhaitez vous abonner dans la ressource cible. Mettez-le en forme sous forme de tableau de chaînes, comme'google.workspace.chat.message.v1.created'
.TOPIC_NAME
: nom complet du sujet Pub/Sub que vous avez créé dans votre projet Cloud. Le fichier est au formatprojects/PROJECT_ID/topics/TOPIC_ID
.RESOURCE_DATA
: valeur booléenne qui indique si l'abonnement inclut des données de ressources dans la charge utile :True
: inclut toutes les données de ressources. Pour limiter les champs inclus, ajoutez le champfieldMask
et spécifiez au moins un champ pour la ressource modifiée. Seuls les abonnements aux ressources Chat permettent d'inclure des données de ressources.False
: exclut les données de ressources.
Pour créer l'abonnement Google Workspace, exécutez la fonction
createSubscription
dans votre projet Apps Script.
Python
Dans votre répertoire de travail, créez un fichier nommé
create_subscription.py
et ajoutez le code suivant :"""Create subscription.""" from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build # Specify required scopes. SCOPES = [SCOPES] # Authenticate with Google Workspace and get user authentication. flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES) CREDENTIALS = flow.run_local_server() # The Google Workspace resource to monitor for events. TARGET_RESOURCE = 'TARGET_RESOURCE' # The types of events to receive. EVENT_TYPES = [EVENT_TYPES] # The endpoint to deliver events to, such as a Google Cloud Pub/Sub topic. TOPIC = 'TOPIC_NAME' # Call the Workspace Events API using the service endpoint. service = build( 'workspaceevents', 'v1', credentials=CREDENTIALS, ) BODY = { 'target_resource': TARGET_RESOURCE, 'event_types': EVENT_TYPES, 'notification_endpoint': {'pubsub_topic': TOPIC}, 'payload_options': {'include_resource': RESOURCE_DATA}, } response = service.subscriptions().create(body=BODY).execute() print(response)
Remplacez les éléments suivants :
SCOPES
: un ou plusieurs champs d'application OAuth compatibles avec chaque type d'événement pour l'abonnement. Formaté sous forme de tableau de chaînes. Pour lister plusieurs niveaux d'accès, séparez-les par des virgules. Par exemple,'https://www.googleapis.com/auth/chat.spaces.readonly', 'https://www.googleapis.com/auth/chat.memberships.readonly'
.TARGET_RESOURCE
: ressource Google Workspace à laquelle vous vous abonnez, formatée sous la forme de son nom complet. Par exemple, pour s'abonner à un espace Google Chat avec l'ID d'espaceAAAABBBB
, utilisez//chat.googleapis.com/spaces/AAAABBBB
.EVENT_TYPES
: un ou plusieurs types d'événements auxquels vous souhaitez vous abonner dans la ressource cible. Mettez-le en forme sous forme de tableau de chaînes, comme'google.workspace.chat.message.v1.created'
.TOPIC_NAME
: nom complet du sujet Pub/Sub que vous avez créé dans votre projet Cloud. Le fichier est au formatprojects/PROJECT_ID/topics/TOPIC_ID
.RESOURCE_DATA
: valeur booléenne qui indique si l'abonnement inclut des données de ressources dans la charge utile :True
: inclut toutes les données de ressources. Pour limiter les champs inclus, ajoutez le champfieldMask
et spécifiez au moins un champ pour la ressource modifiée. Seuls les abonnements aux ressources Chat permettent d'inclure des données de ressources.False
: exclut les données de ressources.
Pour créer l'abonnement Google Workspace, exécutez la commande suivante dans votre terminal :
python3 create_subscription.py
L'API Google Workspace Events renvoie une opération de longue durée terminée qui contient l'instance de la ressource Subscription
que vous avez créée.
Tester votre abonnement Google Workspace
Pour vérifier que vous recevez bien les événements Google Workspace, vous pouvez déclencher un événement et extraire les messages vers l'abonnement Pub/Sub.
Pour tester votre abonnement Google Workspace :
Console Google Cloud
Déclenchez un ou plusieurs types d'événements dans la ressource cible de votre abonnement Google Workspace. Par exemple, si vous vous êtes abonné aux nouveaux messages d'un espace Chat, publiez un message dans l'espace.
Dans la console Google Cloud, accédez à la page Pub/Sub :
Assurez-vous que le projet Cloud de votre application est sélectionné.
Dans le menu Pub/Sub, cliquez sur Abonnements.
Dans le tableau, recherchez l'abonnement Pub/Sub correspondant à votre sujet, puis cliquez sur son nom.
Cliquez sur l'onglet Messages.
Cliquez sur Extraire. La génération d'un message Pub/Sub à partir d'un événement peut prendre quelques minutes.
gcloud
Déclenchez un ou plusieurs types d'événements dans la ressource cible de votre abonnement Google Workspace. Par exemple, si vous vous êtes abonné aux nouveaux messages d'un espace Chat, publiez un message dans l'espace.
Exécutez la commande suivante :
gcloud pubsub subscriptions pull PUBSUB_SUBSCRIPTION_NAME --format=json --limit=MESSAGE_COUNT --auto-ack
Remplacez les éléments suivants :
PUBSUB_SUBSCRIPTION_NAME
: nom complet de votre abonnement Pub/Sub, au formatprojects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID
.MESSAGE_COUNT
: nombre maximal de messages Pub/Sub que vous souhaitez extraire.
La génération d'un message Pub/Sub à partir d'un événement peut prendre quelques minutes.
Pour chaque événement Google Workspace que vous avez déclenché, un message contenant l'événement est envoyé à votre abonnement Pub/Sub. Pour en savoir plus, consultez Recevoir des événements en tant que messages Google Cloud Pub/Sub.
Configurer la façon dont votre application reçoit les événements
L'abonnement Pub/Sub que vous avez créé est basé sur l'extraction. Une fois que vous avez testé votre abonnement Pub/Sub, vous pouvez modifier le type de distribution pour changer la façon dont votre application reçoit les événements. Par exemple, vous pouvez configurer l'abonnement Pub/Sub sur un type de diffusion push afin que votre application puisse recevoir des événements directement sur un point de terminaison d'application.
Pour savoir comment configurer un abonnement Pub/Sub, consultez la documentation Pub/Sub.