diff --git a/docs/bot_media/index.html b/docs/bot_media/index.html index 93f1cc58..643faf70 100644 --- a/docs/bot_media/index.html +++ b/docs/bot_media/index.html @@ -82,6 +82,11 @@

Graph Communications Bot Media SDKThe Real-time Media Platform enables bots to interact with Microsoft Teams calls and meetings using real-time voice, video and screen sharing. This is an advanced capability which allows the bot to send and receive voice and video content frame by frame. The bot has "raw" access to the voice, video and screen sharing media streams. (Bots which process media themselves are called application-hosted media bots, as opposed to simpler service-hosted media bots that rely on the Real-time Media platform for all media processing.)

For example, in a 1:1 call with a bot, as the user speaks, the bot will receive 50 audio frames per second, with each frame containing 20 milliseconds (ms) of audio. An application-hosted media bot can perform real-time speech recognition as the audio frames are received, rather than having to wait for a recording after the user has stopped speaking. The bot can also send and receive high-definition-resolution video, including video-based screen sharing content.

The platform provides a simple "socket"-like API for the bot to send and receive media, and handles the real-time encoding and decoding of audio/video packets, using codecs such as SILK and G.722 for audio and H.264 for video. The platform also handles all media packet encryption/decryption and packet network transmission automatically, so the bot just needs to concern itself with the actual audio/video content. A real-time media bot may participate in 1:1 calls as well as meetings with multiple participants.

+

Microsoft Real-Time Media Platform for Bots API ("Media Access API")

+

Accompanying Documentation

+

The Media Access API is offered under the terms of the Microsoft APIs Terms of Use (https://docs.microsoft.com/en-us/legal/microsoft-apis/terms-of-use) and this accompanying documentation.

+

"Media Access API" means (i) any form of machine accessible application programming interface that Microsoft makes publicly available which provides access to a Microsoft Offering that includes media content (e.g., audio or video), including all associated tools, elements, components and executables therein, (ii) any Microsoft sample code that enables interactions with a Microsoft Offering, and (iii) documentation that Microsoft makes available to help enable your access to the Media Access API.

+

Additional Restriction: You may NOT use the Media Access API to record or otherwise persist media content from calls or meetings that your Application accesses, or data derived from that media content.


Select a class on the left to dive into the reference docs

diff --git a/docs/calls/Microsoft.Graph.Communications.Calls.IMediaSession.html b/docs/calls/Microsoft.Graph.Communications.Calls.IMediaSession.html index b7aee220..1adb12c5 100644 --- a/docs/calls/Microsoft.Graph.Communications.Calls.IMediaSession.html +++ b/docs/calls/Microsoft.Graph.Communications.Calls.IMediaSession.html @@ -145,7 +145,7 @@
Property Value
- Modality[] + Modality[] diff --git a/docs/client/Microsoft.Graph.Communications.Client.Cache.CacheContext-1.html b/docs/client/Microsoft.Graph.Communications.Client.Cache.CacheContext-1.html index c46a1311..d752bda2 100644 --- a/docs/client/Microsoft.Graph.Communications.Client.Cache.CacheContext-1.html +++ b/docs/client/Microsoft.Graph.Communications.Client.Cache.CacheContext-1.html @@ -112,7 +112,6 @@
Assembly: Microsoft.Graph.Communications.Client.dll
Syntax
public struct CacheContext<TEntity>
-
     where TEntity : Entity
Type Parameters
diff --git a/docs/client/Microsoft.Graph.Communications.Client.Cache.ICache.html b/docs/client/Microsoft.Graph.Communications.Client.Cache.ICache.html index 4a677044..3115a792 100644 --- a/docs/client/Microsoft.Graph.Communications.Client.Cache.ICache.html +++ b/docs/client/Microsoft.Graph.Communications.Client.Cache.ICache.html @@ -104,7 +104,6 @@

Declaration

Task<string> GetDataAsync<T>(IEnumerable<IGraphProperty> properties, string resourcePath, CancellationToken cancellationToken = default(CancellationToken))
-
     where T : Entity
Parameters
@@ -179,7 +178,6 @@

Declaration

Task<IEnumerable<string>> GetDataCollectionAsync<T>(IEnumerable<IGraphProperty> properties, string resourcePath, CancellationToken cancellationToken = default(CancellationToken))
-
     where T : Entity
Parameters
diff --git a/docs/client/Microsoft.Graph.Communications.Client.Cache.ServiceCache.html b/docs/client/Microsoft.Graph.Communications.Client.Cache.ServiceCache.html index 237ccad3..679481eb 100644 --- a/docs/client/Microsoft.Graph.Communications.Client.Cache.ServiceCache.html +++ b/docs/client/Microsoft.Graph.Communications.Client.Cache.ServiceCache.html @@ -161,7 +161,6 @@

Declaration

public Task<string> GetDataAsync<T>(IEnumerable<IGraphProperty> properties, string resourcePath, CancellationToken cancellationToken = default(CancellationToken))
-
     where T : Entity
Parameters
@@ -236,7 +235,6 @@

Declaration

public Task<IEnumerable<string>> GetDataCollectionAsync<T>(IEnumerable<IGraphProperty> properties, string resourcePath, CancellationToken cancellationToken = default(CancellationToken))
-
     where T : Entity
Parameters
diff --git a/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphAuthClient.html b/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphAuthClient.html index bdd18a97..cc580de1 100644 --- a/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphAuthClient.html +++ b/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphAuthClient.html @@ -181,7 +181,6 @@

Declaration

protected override Task<IGraphResponse<T2>> SendHttpRequestAsync<T1, T2>(IGraphRequest<T1> graphRequest, CancellationToken cancellationToken)
-
     where T1 : class where T2 : class
Parameters
diff --git a/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphClientWrapper.html b/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphClientWrapper.html index 1e2fb00f..3448454a 100644 --- a/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphClientWrapper.html +++ b/docs/client/Microsoft.Graph.Communications.Client.Transport.GraphClientWrapper.html @@ -218,7 +218,6 @@

Declaration

public Task<IGraphResponse> SendAsync<T>(IGraphRequest<T> request, CancellationToken cancellationToken = default(CancellationToken))
-
     where T : class
Parameters
@@ -280,7 +279,6 @@

Declaration

public Task<IGraphResponse<T2>> SendAsync<T1, T2>(IGraphRequest<T1> request, CancellationToken cancellationToken = default(CancellationToken))
-
     where T1 : class where T2 : class
Parameters
diff --git a/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventArgs-1.html b/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventArgs-1.html index e771ffa8..ed41bc72 100644 --- a/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventArgs-1.html +++ b/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventArgs-1.html @@ -120,7 +120,6 @@
Assembly: Microsoft.Graph.Communications.Client.dll
Syntax
public class ResourceEventArgs<TEntity>
-
     where TEntity : Entity
Type Parameters
diff --git a/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventHandler-2.html b/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventHandler-2.html index 3784b6a8..39cee709 100644 --- a/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventHandler-2.html +++ b/docs/client/Microsoft.Graph.Communications.Resources.ResourceEventHandler-2.html @@ -91,7 +91,6 @@
Assembly: Microsoft.Graph.Communications.Client.dll
Syntax
public delegate void ResourceEventHandler<in TSender, TEntity>(TSender sender, ResourceEventArgs<TEntity> e)
-
     where TEntity : Entity;
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.CollectionUtils.html b/docs/common/Microsoft.Graph.Communications.Common.CollectionUtils.html index c426487f..9ae363c0 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.CollectionUtils.html +++ b/docs/common/Microsoft.Graph.Communications.Common.CollectionUtils.html @@ -516,7 +516,6 @@

Declaration

public static void TryRemoveAndDispose<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dictionary, TKey key)
-
     where TValue : IDisposable
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.EnumUtils.html b/docs/common/Microsoft.Graph.Communications.Common.EnumUtils.html index e1de7654..d868da8b 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.EnumUtils.html +++ b/docs/common/Microsoft.Graph.Communications.Common.EnumUtils.html @@ -174,7 +174,6 @@

Declaration

public static TEnum Parse<TEnum>(string value)
-
     where TEnum : struct, IComparable, IFormattable, IConvertible
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.StateMachine-1.html b/docs/common/Microsoft.Graph.Communications.Common.StateMachine-1.html index d7f41b4a..350ee208 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.StateMachine-1.html +++ b/docs/common/Microsoft.Graph.Communications.Common.StateMachine-1.html @@ -118,7 +118,6 @@
Assembly: Microsoft.Graph.Communications.Common.dll
Syntax
public sealed class StateMachine<TStateEnum>
-
     where TStateEnum : struct, IComparable, IFormattable, IConvertible
Type Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.Telemetry.LoggingExtensions.html b/docs/common/Microsoft.Graph.Communications.Common.Telemetry.LoggingExtensions.html index edeace42..bd025b91 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.Telemetry.LoggingExtensions.html +++ b/docs/common/Microsoft.Graph.Communications.Common.Telemetry.LoggingExtensions.html @@ -759,7 +759,6 @@

Declaration

public static T GetTypedProperty<T>(this LogEvent logEvent)
-
     where T : class
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.Transport.GraphHttpClient.html b/docs/common/Microsoft.Graph.Communications.Common.Transport.GraphHttpClient.html index 511a9078..773bbdcd 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.Transport.GraphHttpClient.html +++ b/docs/common/Microsoft.Graph.Communications.Common.Transport.GraphHttpClient.html @@ -492,7 +492,6 @@

Declaration

public Task<IGraphResponse> SendAsync<T>(IGraphRequest<T> graphRequest, CancellationToken cancellationToken = default(CancellationToken))
-
     where T : class
Parameters
@@ -554,7 +553,6 @@

Declaration

public Task<IGraphResponse<T2>> SendAsync<T1, T2>(IGraphRequest<T1> graphRequest, CancellationToken cancellationToken = default(CancellationToken))
-
     where T1 : class where T2 : class
Parameters
@@ -623,7 +621,6 @@

Declaration

protected virtual Task<IGraphResponse<T2>> SendHttpRequestAsync<T1, T2>(IGraphRequest<T1> graphRequest, CancellationToken cancellationToken)
-
     where T1 : class where T2 : class
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.Transport.HttpResponseMessageExtensions.html b/docs/common/Microsoft.Graph.Communications.Common.Transport.HttpResponseMessageExtensions.html index 437979d0..3fbf2e85 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.Transport.HttpResponseMessageExtensions.html +++ b/docs/common/Microsoft.Graph.Communications.Common.Transport.HttpResponseMessageExtensions.html @@ -266,7 +266,6 @@

Declaration

public static Task<IGraphResponse<T>> ToGraphResponseAsync<T>(this HttpResponseMessage httpResponse, JsonSerializerSettings serializerSettings = null)
-
     where T : class
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.Transport.IGraphClient.html b/docs/common/Microsoft.Graph.Communications.Common.Transport.IGraphClient.html index bb409205..9909923d 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.Transport.IGraphClient.html +++ b/docs/common/Microsoft.Graph.Communications.Common.Transport.IGraphClient.html @@ -155,7 +155,6 @@

Declaration

Task<IGraphResponse> SendAsync<TRequest>(IGraphRequest<TRequest> request, CancellationToken cancellationToken = default(CancellationToken))
-
     where TRequest : class
Parameters
@@ -222,7 +221,6 @@

Declaration

Task<IGraphResponse<TResponse>> SendAsync<TRequest, TResponse>(IGraphRequest<TRequest> request, CancellationToken cancellationToken = default(CancellationToken))
-
     where TRequest : class where TResponse : class
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.Utilities.html b/docs/common/Microsoft.Graph.Communications.Common.Utilities.html index d0a28a05..5eb49f08 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.Utilities.html +++ b/docs/common/Microsoft.Graph.Communications.Common.Utilities.html @@ -276,7 +276,6 @@

Declaration

public static void SafeDispose<T>(ref T t, IGraphLogger logger = null)
-
     where T : class, IDisposable
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.Validator.html b/docs/common/Microsoft.Graph.Communications.Common.Validator.html index e5e2a53e..6e9692ae 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.Validator.html +++ b/docs/common/Microsoft.Graph.Communications.Common.Validator.html @@ -366,7 +366,6 @@

Declaration

public static T Equals<T, TE>(this T value, T expected, string message = null)
-
     where TE : Exception
Parameters
@@ -537,7 +536,6 @@

Declaration

public static void InRange<T>(this T value, T minValue, T maxValue, string paramName = null)
-
     where T : IComparable<T>
Parameters
@@ -682,7 +680,6 @@

Declaration

public static void IsFalse<T>(this bool condition, string message = null)
-
     where T : Exception
Parameters
@@ -811,7 +808,6 @@

Declaration

public static void IsTrue<T>(this bool condition, string message = null)
-
     where T : Exception
Parameters
@@ -862,7 +858,6 @@

Declaration

public static T NotEmpty<T>(this T obj, string paramName = null, string message = null)
-
     where T : IEnumerable
Parameters
diff --git a/docs/common/Microsoft.Graph.Communications.Common.WeakKey-1.html b/docs/common/Microsoft.Graph.Communications.Common.WeakKey-1.html index 1e559075..df9d64cf 100644 --- a/docs/common/Microsoft.Graph.Communications.Common.WeakKey-1.html +++ b/docs/common/Microsoft.Graph.Communications.Common.WeakKey-1.html @@ -117,7 +117,6 @@
Assembly: Microsoft.Graph.Communications.Common.dll
Syntax
public class WeakKey<T>
-
     where T : class
Type Parameters
diff --git a/docs/index.json b/docs/index.json index 52eaff35..07738fb0 100644 --- a/docs/index.json +++ b/docs/index.json @@ -1,2033 +1,2018 @@ { - "common/Microsoft.Graph.Communications.Common.HttpConstants.HeaderNames.html": { - "href": "common/Microsoft.Graph.Communications.Common.HttpConstants.HeaderNames.html", - "title": "Class HttpConstants.HeaderNames", - "keywords": "Class HttpConstants.HeaderNames The header names. Inheritance Object HttpConstants.HeaderNames Inherited Members Object.ToString() Object.Equals(Object) Object.Equals(Object, Object) Object.ReferenceEquals(Object, Object) Object.GetHashCode() Object.GetType() Object.MemberwiseClone() Namespace : Microsoft.Graph.Communications.Common Assembly : Microsoft.Graph.Communications.Common.dll Syntax public static class HeaderNames Fields Accept The accept header. Declaration public const string Accept = \"Accept\" Field Value Type Description String AccessControlAllowCredentials Access-Control-Allow-Credentials Declaration public const string AccessControlAllowCredentials = \"Access-Control-Allow-Credentials\" Field Value Type Description String AccessControlAllowHeaders Access-Control-Allow-Headers Declaration public const string AccessControlAllowHeaders = \"Access-Control-Allow-Headers\" Field Value Type Description String AccessControlAllowOrigin Access-Control-Allow-Origin Declaration public const string AccessControlAllowOrigin = \"Access-Control-Allow-Origin\" Field Value Type Description String AccessControlMaxAge Access-Control-Max-Age Declaration public const string AccessControlMaxAge = \"Access-Control-Max-Age\" Field Value Type Description String AccessControlRequestHeaders Access-Control-Request-Headers Declaration public const string AccessControlRequestHeaders = \"Access-Control-Request-Headers\" Field Value Type Description String AccessControlRequestMethod Access-Control-Request-Method Declaration public const string AccessControlRequestMethod = \"Access-Control-Request-Method\" Field Value Type Description String Authorization The authorization header. Declaration public const string Authorization = \"Authorization\" Field Value Type Description String CacheControl The cache control header. Declaration public const string CacheControl = \"Cache-Control\" Field Value Type Description String CalleeRegion The callee region header. Declaration public const string CalleeRegion = \"X-Microsoft-Skype-Callee-Region\" Field Value Type Description String CallerRegion The caller region header. Declaration public const string CallerRegion = \"X-Microsoft-Skype-Caller-Region\" Field Value Type Description String ChainId The chain identifier header. This header is used to correlate requests to each other within the NGC stack. Declaration public const string ChainId = \"X-Microsoft-Skype-Chain-ID\" Field Value Type Description String ClientRequestId The client request identifier header. This header is used to track individual requests between the client and SF services. Declaration public const string ClientRequestId = \"Client-Request-Id\" Field Value Type Description String Connection The connection header. Declaration public const string Connection = \"Connection\" Field Value Type Description String ContentLength The content length header. Declaration public const string ContentLength = \"Content-Length\" Field Value Type Description String ContentType The content type header. Declaration public const string ContentType = \"Content-Type\" Field Value Type Description String ContextId The context identifier header. Declaration public const string ContextId = \"ContextId\" Field Value Type Description String Date The date header. Declaration public const string Date = \"Date\" Field Value Type Description String Duration The duration header. Declaration public const string Duration = \"Duration\" Field Value Type Description String GatewayServiceRootHeader the header that graph adds to the proxied request to PMA Declaration public const string GatewayServiceRootHeader = \"x-ms-gateway-serviceRoot\" Field Value Type Description String Host The host header. Declaration public const string Host = \"Host\" Field Value Type Description String Location The location header. Declaration public const string Location = \"Location\" Field Value Type Description String MessageId The message identifier header. This header is used to track individual requests within the NGC stack. Declaration public const string MessageId = \"X-Microsoft-Skype-Message-ID\" Field Value Type Description String MsAttribution X-MS-Attribution. Declaration public const string MsAttribution = \"X-MS-Attribution\" Field Value Type Description String MsDiagnostics The microsoft graph diagnostics header. Declaration public const string MsDiagnostics = \"x-ms-ags-diagnostic\" Field Value Type Description String MsParticipants X-MS-Participants. Declaration public const string MsParticipants = \"X-MS-Participants\" Field Value Type Description String ODataVersion The odata version header. Declaration public const string ODataVersion = \"OData-Version\" Field Value Type Description String Origin Origin Declaration public const string Origin = \"Origin\" Field Value Type Description String OriginalMessageId The original message identifier header. Declaration public const string OriginalMessageId = \"X-Microsoft-Skype-Original-Message-ID\" Field Value Type Description String PmaInstanceUrl The pma instance URL. Used to retarget PSA to a particular PMA instance. Declaration public const string PmaInstanceUrl = \"X-Microsoft-Pma-Instance\" Field Value Type Description String RedirectDu The redirect du header. Declaration public const string RedirectDu = \"X-Plat-Redirect-Du\" Field Value Type Description String RedirectRegion The redirect region header. Declaration public const string RedirectRegion = \"X-Plat-Redirect-Region\" Field Value Type Description String RequestId The request identifier header. This header is returned by graph to identify the specific request. Declaration public const string RequestId = \"Request-Id\" Field Value Type Description String RoutingTargetRegion The Routing-Target-Region header. Declaration public const string RoutingTargetRegion = \"Routing-Target-Region\" Field Value Type Description String ScenarioId The scenario identifier header. This header is used to correlate requests to each other between client and SF services. Declaration public const string ScenarioId = \"Scenario-Id\" Field Value Type Description String SchedulingServiceTelemetryId Scheduling service telemetry header. This header is used to correlate requests with SS service. Declaration public const string SchedulingServiceTelemetryId = \"X-MS-Skype-MLC-Telemetry-Id\" Field Value Type Description String Skypetoken X-Skypetoken Declaration public const string Skypetoken = \"X-Skypetoken\" Field Value Type Description String StrictTransportSecurity The strict transport security header. Declaration public const string StrictTransportSecurity = \"Strict-Transport-Security\" Field Value Type Description String Tenant The tenant header Declaration public const string Tenant = \"X-Microsoft-Tenant\" Field Value Type Description String TenantRegion The tenant region header. Declaration public const string TenantRegion = \"Tenant-Region\" Field Value Type Description String ThrowSite The throw site header. Declaration public const string ThrowSite = \"X-ThrowSite\" Field Value Type Description String TransferEncoding The transfer encoding header. Declaration public const string TransferEncoding = \"Transfer-Encoding\" Field Value Type Description String UserAgent The user agent header. Declaration public const string UserAgent = \"User-Agent\" Field Value Type Description String WebhooksResource Webhooks-WorkloadResource Declaration public const string WebhooksResource = \"Webhooks-WorkloadResource\" Field Value Type Description String XMsClientUserAgent Client User Agent header. This header has the user agent in requests. Used in requests to presence service at the moment. Declaration public const string XMsClientUserAgent = \"X-Ms-Client-User-Agent\" Field Value Type Description String XMsClientVersion The client version header. This header has the client version in requests. Used in requests to presence service at the moment. Declaration public const string XMsClientVersion = \"X-Ms-Client-Version\" Field Value Type Description String XMsCorrelationId the correlation id header. This header is used to correlate requests with presence service at the moment. Declaration public const string XMsCorrelationId = \"X-Ms-Correlation-Id\" Field Value Type Description String" - }, - "articles/calls/calling-notifications.html": { - "href": "articles/calls/calling-notifications.html", - "title": "Notifications in Calling", - "keywords": "Notifications in Calling Important: APIs for Calling in Microsoft Graph are in preview and are subject to change. Use of these APIs in production applications is not supported. Refer to Registering a Calling Bot on how to register the callback URL. This callback is used for all incoming calls to the application. Protocol determination The incoming notification is provided in legacy format for compatibility with the previous protocol . In order to convert the call to the Microsoft Graph protocol, the bot must determine the notification is in legacy format and reply with: HTTP/1.1 204 No Content The application will again receive the notification but this time it will be in the Microsoft Graph protocol. You may configure the protocol your application supports and avoid receiving the initial callback in legacy format. The setting is available as a configuration option in the Skype Channel. Redirects for region affinity We will invoke your callback from the data-center hosting the call. The call may start in any data-center and does not take into account region affinities. The notification will be sent to your deployment depending on the GeoDNS resolution. If your application determines, by inspecting the initial notification payload or otherwise, that it needs to run in a different deployment, the application may reply with: HTTP/1.1 302 Found Location: your-new-location You may decide to pickup the call and answer . You can specify the callback URL to handle this particular call. This is useful for stateful instances where your call is handled by a particular partition and you want to embed this information on the callback URL for routing to the right instance. Authenticating the callback Application should inspect the token passed by on the notification to validate the request. Whenever the API raises a web hook event, the API gets an OAUTH token from us, with audience as the application's App ID and adds it in the Authorization header as a Bearer token. The application is expected to validate this token before accepting the callback request. POST https://bot.contoso.com/api/calls Content-Type: application/json Authentication: Bearer \"value\": [ \"subscriptionId\": \"2887CEE8344B47C291F1AF628599A93C\", \"subscriptionExpirationDateTime\": \"2016-11-20T18:23:45.9356913Z\", \"changeType\": \"updated\", \"resource\": \"/app/calls/8A934F51F25B4EE19613D4049491857B\", \"resourceData\": { \"@odata.type\": \"#microsoft.graph.call\", \"state\": \"Established\" } ] The OAUTH token would have values like the following, and will be signed by us. The openid configuration published at https://api.aps.skype.com/v1/.well-known/OpenIdConfiguration can be used to verify the token. { \"aud\": \"0efc74f7-41c3-47a4-8775-7259bfef4241\", \"iss\": \"https://api.botframework.com\", \"iat\": 1466741440, \"nbf\": 1466741440, \"exp\": 1466745340, \"tid\": \"1fdd12d0-4620-44ed-baec-459b611f84b2\" } aud audience is the App ID URI specified for the application. tid is the tenant id for contoso iss is the token issuer, https://api.botframework.com The listener interface on the web hook URL can validate the token, ensure it has not expired, checking whether it has been signed by our published openid configuration. You must also check whether audience matches your App ID before accepting the callback request. Sample shows how to validate inbound requests. Additional information You can read more about AAD tokens and Validation" - }, - "articles/calls/register-calling-bot.html": { - "href": "articles/calls/register-calling-bot.html", - "title": "Registering a calling bot", - "keywords": "Registering a calling bot Important: APIs for Calling in Microsoft Graph are in preview and are subject to change. Use of these APIs in production applications is not supported. In this topic you will learn how to register a new Calling Bot. Register your bot in the Azure Bot Service Complete the following steps: Register a bot by creating a Bot Channels Registration through Azure Bot Channel Registration . Once you complete the registration, take a note of the registered config values (Bot Name, Application Id, and Application Secret). You will need these values later in the code samples. In the resource blade, click Channels . Enable the Microsoft Teams channel and enable calling on the Calling tab. Fill in the Webhook (for calling) where you will receive incoming notifications. E.g. https://{your domain}/api/calls . Refer to Connect a bot to channels for more information on how to configure channels. Permissions Add Microsoft Graph permissions for calling to your bot Microsoft Graph exposes granular permissions controlling the access apps have to resources. As a developer, you decide which permissions for Microsoft Graph your app requests. The Microsoft Graph Calling APIs support Application permissions, which are used by apps that run without a signed-in user present; for example, apps that run as background services or bots. Application permissions can only be consented by a tenant administrator. Calling bots and applications have some capabilties that will need tenant administrator consent. Below is a list of those permissions: Permission Display String Description Admin Consent Required Calls.Initiate.All Initiate outgoing 1:1 calls from the app (preview) Allows the app to place outbound calls to a single user and transfer calls to users in your organization's directory, without a signed-in user. Yes Calls.InitiateGroupCall.All Initiate outgoing group calls from the app (preview) Allows the app to place outbound calls to multiple users and add participants to meetings in your organization, without a signed-in user. Yes Calls.JoinGroupCall.All Join Group Calls and Meetings as an app (preview) Allows the app to join group calls and scheduled meetings in your organization, without a signed-in user. The app will be joined with the privileges of a directory user to meetings in your tenant. Yes Calls.JoinGroupCallasGuest.All Join Group Calls and Meetings as a guest (preview) Allows the app to anonymously join group calls and scheduled meetings in your organization, without a signed-in user. The app will be joined as a guest to meetings in your tenant. Yes Calls.AccessMedia.All *see below* Access media streams in a call as an app (preview) Allows the app to get direct access to participant media streams in a call, without a signed-in user. Yes Important: You may not use the Microsoft.Graph.Calls.Media API to record or otherwise persist media content from calls or meetings that your bot accesses. Assigning permissions You pre-configure the application permissions your app needs when you register your app. To add permissions from the Azure Bot Registration Portal: From the Settings blade, click Manage . This is the link appearing by the Microsoft App ID . This link will open a window where you can click on API permissions and then click Add a permission in the right pane. Select Microsoft Graph , choose Application Permissions and then select the permissions your app requires in the Select Permissions dialog. Getting administrator consent An administrator can either consent to these permissions using the Azure portal when your app is installed in their organization, or you can provide a sign-up experience in your app through which administrators can consent to the permissions you configured. Once administrator consent is recorded by Azure AD, your app can request tokens without having to request consent again. You can rely on an administrator to grant the permissions your app needs at the Azure portal , but often a better option is to provide a sign-up experience for administrators by using the Azure AD v2.0 /adminconsent endpoint. Please refer to the instructions on constructing an Admin Consent URL for more detail. Note : Constructing the Tenant Admin Consent URL requires a configured Redirect URI/Reply URL in the App Registration Portal . To add reply URLs for your bot, access your bot registration, choose Advanced Options > Edit Application Manifest. Add your Redirect URI to the field replyURLs. Important : Any time you make a change to the configured permissions, you must also repeat the Admin Consent process. Changes made in the app registration portal will not be reflected until consent has been reapplied by the tenant's administrator. Register bot in Microsoft Teams The code samples can be used in combination with a Microsoft Teams App Manifest settings to add the Calling and Video buttons for a 1:1 bot interaction. To develop calling bot, add 'supportsCalling' and 'supportsVideo' boolean properties to the bots section in the app manifest and the bot is all set to receive calls once installed (either to a personal context or a team). App Manifests can be uploaded through the App Studio in the Microsoft Teams client. In the Teams client, select Apps from the left pane and then select App Studio . From the top pane, click Manifest editor and then Create a new app from the left pane. In the App details tab, provide the basic information. Navigate to the Capabilities section, and select the Bots tab. Then select Set Up in the right pane. Fill in the desired bot name Select the Select from one of my existing bots option, and find your bot from above in the dropdown. Check all options under Calling Bot and Scope Press Save" - }, - "bot_media/Microsoft.Skype.Bots.Media.AudioSocket.html": { - "href": "bot_media/Microsoft.Skype.Bots.Media.AudioSocket.html", - "title": "Class AudioSocket", - "keywords": "Class AudioSocket Provides Send and Receive I/O access to an audio stream. Inheritance Object AudioSocket Implements IAudioSocket IDisposable Inherited Members Object.ToString() Object.Equals(Object) Object.Equals(Object, Object) Object.ReferenceEquals(Object, Object) Object.GetHashCode() Object.GetType() Object.MemberwiseClone() Namespace : Microsoft.Skype.Bots.Media Assembly : Microsoft.Skype.Bots.Media.dll Syntax public sealed class AudioSocket : IAudioSocket, IDisposable, IInternalAudioSocket, IInternalSocket Constructors AudioSocket(AudioSocketSettings) Allows the application to send a packet of audio media if the application has configured the AudioSocket to send media. The application should be sending about 50 packets of audio media per second; each buffer containing 20 milliseconds worth of audio content. The application must create a concrete class which derives from the AudioMediaBuffer abstract class. The buffer object passed to the Send method is still potentially in-use after the method returns to the caller. The application must not free the buffer's data until the the buffer object's Dispose() method is invoked by the Media Platform. Declaration public AudioSocket(AudioSocketSettings settings) Parameters Type Name Description AudioSocketSettings settings Socket settings Methods Dispose() Disposes the object Declaration public void Dispose() Send(AudioMediaBuffer) Allows the application to send a packet of audio media if the application has configured the AudioSocket to send media. Declaration public void Send(AudioMediaBuffer buffer) Parameters Type Name Description AudioMediaBuffer buffer AudioMediaBuffer to send. Events AudioMediaReceived If the application has configured the AudioSocket to receive media, this event is raised each time a packet of audio media is received. Once the application has consumed the buffer, it must call the buffer's Dispose() method. Declaration public event EventHandler AudioMediaReceived Event Type Type Description EventHandler < AudioMediaReceivedEventArgs > Remarks The application must be able to handle at least 50 incoming audio buffers per second. Events are serialized, so only one event at a time is raised to the app. AudioSendStatusChanged If the application has configured the AudioSocket to send media, this event is raised to inform the application when it may begin sending media and when it should stop. The application cannot send media before receiving a MediaSendStatusChanged event indicating the SendStatus is Active, such media will be discarded. Declaration public event EventHandler AudioSendStatusChanged Event Type Type Description EventHandler < AudioSendStatusChangedEventArgs > DominantSpeakerChanged This event is raised when there is a change in the dominant speaker in the conference. If there is no dominant speaker in the conference the CurrentDominantSpeaker argument in the event will have the value None (0xFFFFFFFF). Declaration public event EventHandler DominantSpeakerChanged Event Type Type Description EventHandler < DominantSpeakerChangedEventArgs > MediaStreamFailure This event is raised if there is a network connection failure with the peer. To recover, the bot will need to start a new call or rejoin the meeting. Declaration public event EventHandler MediaStreamFailure Event Type Type Description EventHandler < MediaStreamFailureEventArgs > ToneReceived This event is raised when the DTMF tone is received. ToneId enum indicates the tone value. Declaration public event EventHandler ToneReceived Event Type Type Description EventHandler < ToneReceivedEventArgs > Implements IAudioSocket System.IDisposable" - }, - "bot_media/Microsoft.Skype.Bots.Media.DataMediaBuffer.html": { - "href": "bot_media/Microsoft.Skype.Bots.Media.DataMediaBuffer.html", - "title": "Class DataMediaBuffer", - "keywords": "Class DataMediaBuffer Reserved for the internal use. Inheritance Object DataMediaBuffer Implements IDisposable Inherited Members Object.ToString() Object.Equals(Object) Object.Equals(Object, Object) Object.ReferenceEquals(Object, Object) Object.GetHashCode() Object.GetType() Object.MemberwiseClone() Namespace : Microsoft.Skype.Bots.Media Assembly : Microsoft.Skype.Bots.Media.dll Syntax public abstract class DataMediaBuffer : IDisposable Constructors DataMediaBuffer() Declaration protected DataMediaBuffer() Properties Data Reserved for the internal use. Declaration public byte[] Data { get; protected set; } Property Value Type Description Byte [] MediaSourceId Reserved for the internal use. Declaration public uint MediaSourceId { get; protected set; } Property Value Type Description UInt32 Methods Dispose() Reserved for the internal use. Declaration public void Dispose() Dispose(Boolean) Reserved for the internal use. Declaration protected abstract void Dispose(bool disposing) Parameters Type Name Description Boolean disposing Implements System.IDisposable" - }, - "bot_media/Microsoft.Skype.Bots.Media.DataType.html": { - "href": "bot_media/Microsoft.Skype.Bots.Media.DataType.html", - "title": "Enum DataType", - "keywords": "Enum DataType Reserved for the internal use. Namespace : Microsoft.Skype.Bots.Media Assembly : Microsoft.Skype.Bots.Media.dll Syntax public enum DataType Fields Name Description Transcript Reserved for the internal use." - }, - "bot_media/Microsoft.Skype.Bots.Media.IMediaPlatform.html": { - "href": "bot_media/Microsoft.Skype.Bots.Media.IMediaPlatform.html", - "title": "Interface IMediaPlatform", - "keywords": "Interface IMediaPlatform Interface to the MediaPlatform. Inherited Members IDisposable.Dispose() Namespace : Microsoft.Skype.Bots.Media Assembly : Microsoft.Skype.Bots.Media.dll Syntax public interface IMediaPlatform : IDisposable Properties CurrentHealth The current health status of the media platform. Declaration MediaPlatformHealthStatus CurrentHealth { get; } Property Value Type Description MediaPlatformHealthStatus Methods CreateMediaConfiguration(IAudioSocket) Returns a serialized MediaConfiguration object representing the socket so that the Skype calling cloud can establish an audio/video call to the bot. Declaration JObject CreateMediaConfiguration(IAudioSocket audioSocket) Parameters Type Name Description IAudioSocket audioSocket Socket that handles audio. Returns Type Description Newtonsoft.Json.Linq.JObject Serialized MediaConfiguration object. Exceptions Type Condition InvalidOperationException MediaPlatform is not initialized. SkypeMediaException The media platform is currently overloaded and cannot handle new calls. CreateMediaConfiguration(IAudioSocket, IDataSocket) Reserved for the internal use. Declaration JObject CreateMediaConfiguration(IAudioSocket audioSocket, IDataSocket dataSocket) Parameters Type Name Description IAudioSocket audioSocket IDataSocket dataSocket Returns Type Description Newtonsoft.Json.Linq.JObject CreateMediaConfiguration(IAudioSocket, IVideoSocket) Returns a serialized MediaConfiguration object representing the sockets so that the Skype calling cloud can establish an audio/video call to the bot. Declaration JObject CreateMediaConfiguration(IAudioSocket audioSocket, IVideoSocket videoSocket) Parameters Type Name Description IAudioSocket audioSocket Socket that handles audio. IVideoSocket videoSocket Socket that handles video. Returns Type Description Newtonsoft.Json.Linq.JObject Serialized MediaConfiguration object. Exceptions Type Condition ArgumentException A VideoSocket is not configured correctly. InvalidOperationException MediaPlatform is not initialized. SkypeMediaException The media platform is currently overloaded and cannot handle new calls. CreateMediaConfiguration(IAudioSocket, IList) Returns a serialized MediaConfiguration object representing the sockets so that the Skype calling cloud can establish an audio/video call to the bot. Declaration JObject CreateMediaConfiguration(IAudioSocket audioSocket, IList videoSockets) Parameters Type Name Description IAudioSocket audioSocket Socket that handles audio. IList < IVideoSocket > videoSockets Ordered list of video sockets. If multiview sockets are provided, only the first one can have a send direction (ie. send only or send receive) and all the sockets should have a receive direction. Returns Type Description Newtonsoft.Json.Linq.JObject Serialized MediaConfiguration object. Exceptions Type Condition ArgumentException A VideoSocket is not configured correctly. InvalidOperationException MediaPlatform is not initialized. SkypeMediaException The media platform is currently overloaded and cannot handle new calls. CreateMediaConfiguration(IAudioSocket, IList, IVideoSocket) Returns a serialized MediaConfiguration object representing the sockets so that the Skype calling cloud can establish an audio/video/video-based screen sharing call to the bot. Declaration JObject CreateMediaConfiguration(IAudioSocket audioSocket, IList videoSockets, IVideoSocket vbssSocket) Parameters Type Name Description IAudioSocket audioSocket Socket that handles audio. IList < IVideoSocket > videoSockets Ordered list of video sockets. If multiview sockets are provided, only the first one can have a send direction (ie. send only or send receive) and all the sockets should have a receive direction. IVideoSocket vbssSocket Video socket for the video-based screen sharing (VBSS) modality. Socket must be configured as RecvOnly. Returns Type Description Newtonsoft.Json.Linq.JObject Exceptions Type Condition ArgumentException A VideoSocket is not configured correctly. InvalidOperationException MediaPlatform is not initialized, or a vbssSocket is configured to be sendonly or sendrecv. SkypeMediaException The media platform is currently overloaded and cannot handle new calls. CreateMediaConfiguration(IAudioSocket, IList, IVideoSocket, IDataSocket) Reserved for the internal use. Declaration JObject CreateMediaConfiguration(IAudioSocket audioSocket, IList videoSockets, IVideoSocket vbssSocket, IDataSocket dataSocket) Parameters Type Name Description IAudioSocket audioSocket IList < IVideoSocket > videoSockets IVideoSocket vbssSocket IDataSocket dataSocket Returns Type Description Newtonsoft.Json.Linq.JObject CreateMediaConfiguration(IVideoSocket) Returns a serialized mediaConfiguration object representing the socket so that the Skype calling cloud can establish a video-based screen sharing call to the bot. Declaration JObject CreateMediaConfiguration(IVideoSocket vbssSocket) Parameters Type Name Description IVideoSocket vbssSocket Video socket for the video-based screen sharing (VBSS) modality. Socket must be configured as RecvOnly. Returns Type Description Newtonsoft.Json.Linq.JObject Exceptions Type Condition ArgumentException A VideoSocket is not configured correctly. InvalidOperationException MediaPlatform is not initialized, or a vbssSocket is configured to be sendonly or sendrecv. SkypeMediaException The media platform is currently overloaded and cannot handle new calls. GetCurrentTimestamp() Get a current timestamp, in 100-ns units. To be used when sourcing media buffers. Declaration long GetCurrentTimestamp() Returns Type Description Int64 Initialize(MediaPlatformSettings) Initializes the Media Platform for Bot. Declaration void Initialize(MediaPlatformSettings settings) Parameters Type Name Description MediaPlatformSettings settings Settings to initialize the Bot Media Platform. Events MediaPlatformHealthChanged Raised when there is a change in the media platform's health status. The event arguments report the current and previous platform health conditions. Declaration event EventHandler MediaPlatformHealthChanged Event Type Type Description EventHandler < MediaPlatformHealthChangedEventArgs > Remarks A bot application which may handle very high call volumes or perform complex real-time media processing should monitor this event for changes in the media platform health status. When the event reports the platform health status has become HeavilyLoaded, the application should avoid starting new bot calls on the machine instance until the health status returns back to Normal." - }, - "bot_media/Microsoft.Skype.Bots.Media.MediaPlatformHealthChangedEventArgs.html": { - "href": "bot_media/Microsoft.Skype.Bots.Media.MediaPlatformHealthChangedEventArgs.html", - "title": "Class MediaPlatformHealthChangedEventArgs", - "keywords": "Class MediaPlatformHealthChangedEventArgs Event arguments of the MediaPlatformHealthChangedEvent providing the current and previous health status of the media platform. Inheritance Object EventArgs MediaPlatformHealthChangedEventArgs Inherited Members EventArgs.Empty Object.ToString() Object.Equals(Object) Object.Equals(Object, Object) Object.ReferenceEquals(Object, Object) Object.GetHashCode() Object.GetType() Object.MemberwiseClone() Namespace : Microsoft.Skype.Bots.Media Assembly : Microsoft.Skype.Bots.Media.dll Syntax public class MediaPlatformHealthChangedEventArgs : EventArgs Constructors MediaPlatformHealthChangedEventArgs() Declaration public MediaPlatformHealthChangedEventArgs() Properties CurrentHealth The current health status. Declaration public MediaPlatformHealthStatus CurrentHealth { get; set; } Property Value Type Description MediaPlatformHealthStatus PreviousHealth The previous health status. Declaration public MediaPlatformHealthStatus PreviousHealth { get; set; } Property Value Type Description MediaPlatformHealthStatus" - }, - "articles/calls/MultipleAppSupport.html": { - "href": "articles/calls/MultipleAppSupport.html", - "title": "Supporting Multiple Applications Within Single Code Base", - "keywords": "Supporting Multiple Applications Within Single Code Base Some developers may wish to support multiple applications from within the same application code. With very little effort, this can be done using multiple instances of ICommunicationsClient . There are some steps that should be taken to ensure that we make outbound requests with the right application, and we forward incoming notifications to the right application. This writeup will demonstrate how to alter the existing samples to add multiple application support. We have not created a sample of this scenario explicitly given that it is not a standard way to use the Graph SDK. Create multiple communications clients First, each application instance requires it's own ICommunicationsClient instance, given that it supports a single IRequestAuthenticationProvider Let's change the Bot ICommunicationsClient Client to an IDictionary Clients and create our clients. /// /// Prevents a default instance of the class from being created. /// private Bot() { this.AddClient( Service.Instance.Configuration.MicrosoftAppId, Service.Instance.Configuration.MicrosoftAppPassword); this.AddClient( Service.Instance.Configuration.MicrosoftApp2Id, Service.Instance.Configuration.MicrosoftApp2Password); } private void AddClient(string appId, string appSecret) { // Create a unique notification uri for first app instance // This appends the app id to the callback uri so we get // https://base.uri/callbacks/{appId} var notificationUri = new Uri( Service.Instance.Configuration.CallControlBaseUrl, appId); var builder = new CommunicationsClientBuilder(\"AudioVideoPlaybackBot\", appId); builder .SetAuthenticationProvider( new AuthenticationProvider( appId, appSecret, Service.Instance.Configuration.TokenAudienceResourceLink)) .SetNotificationUrl(notificationUri) .SetMediaPlatformSettings(Service.Instance.Configuration.MediaPlatformSettings) .SetServiceBaseUrl(Service.Instance.Configuration.PlaceCallEndpointUrl); var client = builder.Build(); this.Clients.Add(appId, client); client.Calls().OnIncoming += this.CallsOnIncoming; client.Calls().OnUpdated += this.CallsOnUpdated; } /// /// Gets the contained app clients /// public IDictionary Clients { get; } Let's also add a reference to the ICallCollection to the call handler for ease of access. This will allow us to reference the correct collection/client from any given call id. /// /// Initializes a new instance of the class. /// /// The call collection. /// The call. public CallHandler(ICallCollection callCollection, ICall call); /// /// Gets the call collection /// public ICallCollection CallCollection { get; } /// /// Gets the call /// public ICall Call { get; } Handle notifications Next we need to adjust the incoming call controller to forward the notifications to the right client. If there is no need to handle incoming call, then the above configuration will automatically route the the correct apps endpoint. If we need to handle incoming call, we can either have a default app process all those scenarios, or the callback URI of each app can contain the app id. For example, if our service URI is https://base.uri/callback , we can set all our bots to use this URI directly, but then we lose knowledge of which app is receiving the incoming call. If we change each app's callback URI to https://base.uri/callback/{appId} (example: https://base.uri/callback/9ecd52e5-6592-42b7-b562-093f37f13bde , where the appId is 9ecd52e5-6592-42b7-b562-093f37f13bde) then we have the app context when an incoming call occurs. Of course there are other ways to get the app ID, like from the auth token or the payload, but this is one simple option. To handle the app id in the URI the controllers for callbacks need to be changed to the following: /// /// Gets a reference to singleton sample bot/client instance /// private IDictionary Clients => Bot.Instance.Clients; /// /// Handle a callback for an incoming call. /// Here we don't know what application is receiving the callback. /// /// /// The . /// [HttpPost] [Route(\"\")] public Task OnIncomingRequestAsync() { // Pick some app id to handle this call. var appId = this.Clients.Keys.First(); return this.OnIncomingRequestAsync(appId); } /// /// Handle a callback for an incoming call or notification. /// Here we've added the application id to the callback URI. /// /// /// The . /// [HttpPost] [Route(\"{appId}\")] public async Task OnIncomingRequestAsync(string appId) { Log.Info(new CallerInfo(), LogContext.FrontEnd, $\"Received HTTP {this.Request.Method}, {this.Request.RequestUri}\"); // Pass the incoming message to the sdk. The sdk takes care of what to do with it. var client = this.Clients[appId]; var response = await client.ProcessNotificationAsync(this.Request).ConfigureAwait(false); // Enforce the connection close to ensure that requests are evenly load balanced so // calls do no stick to one instance of the worker role. response.Headers.ConnectionClose = true; return response; } Additional notes There are a few items not addressed here. For instance, when a VTC joins a meeting, which app should it use? This has been purposefuly excluded from this guide given that it is unique business logic. Some may want a different bot configuration for each client, others may associate unique permissions to each bot and use depending on action being performed." - }, - "articles/calls/IVR.html": { - "href": "articles/calls/IVR.html", - "title": "Interactive Voice Response (IVR)", - "keywords": "Interactive Voice Response (IVR) Graph Calling SDK and Core SDK can be used to make and manage IVR calls. Features Join exiting calls Answer incoming calls Subscribe to tones Transfer call Play media Record Cancel media operations Calling SDK Snippets Join Existing Call and Answer Incoming Call Please refer to the concept articles Redirect and Transfer In order to do a redirect or transfer, you need to create an invitation object. This invitation target is the transferee in blind transfer and the original caller in consultative transfer. var target = new InvitationParticipantInfo { Identity = new IdentitySet { User = new Identity { Id = \"**The Target's AAD ID**\", DisplayName = \"**(optional) The Target's Display Name**\", } } }; ICall call = this.GetIncomingCall(); await call.RedirectAsync(new[] { target }).ConfigureAwait(false); Blind transfer To make a blind transfer, only the target needs to be specified. ICall oritinalCall = this.Client.Calls[\"*call id to transfer*\"]; await oritinalCall.TransferAsync(target).ConfigureAwait(false); Consultative transfer ICall newCall = this.Client.Calls[\"*call id of second call*\"]; await newCall.TransferAsync(target, \"*id of the original call*\").ConfigureAwait(false); Subscribe to tones ICall call = this.Client.Calls[\"*id of the call*\"]; await call.SubscribeToToneAsync().ConfigureAwait(false); Any tones that are received are sent as part of a call update in ToneInfo property of the call resource. Play media prompts ICall call = this.Client.Calls[\"*id of the call*\"]; await call.PlayPromptAsync(*A list of media prompts to play*).ConfigureAwait(false); Record ICall call = this.Client.Calls[\"*id of the call*\"]; HttpClient httpClient = this.HttpClient; RecordOperationResult result = await call.RecordAsync(*record options*).ConfigureAwait(false); string location = result.RecordResourceLocation; string token = result.RecordResourceAccessToken; // Stream the content of the recording somewhere. using (var outputStream = new MemoryStream()) using (var request = new HttpRequestMessage(HttpMethod.Get, new Uri(location))) { // Set the authorization header. request.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", token); using(var response = await httpClient.SendAsync(request).ConfigureAwait(false)) using(var content = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { await content.CopyToAsync(outputStream); outputStream?.Seek(0, SeekOrigin.Begin); // Do something with stream. } } Cancel media processing This API will cancel all prompts that are queued to be played. ICall call = this.Client.Calls[\"*id of the call*\"]; await call.CancelMediaProcessingAsync().ConfigureAwait(false);" - }, - "README.Internal.html": { - "href": "README.Internal.html", - "title": "How to generate docs", - "keywords": "How to generate docs Download and unzip docfx.zip from https://github.com/dotnet/docfx/releases , extract it to a local folder, and add it to PATH so you can run it anywhere. Install Visual STUDIO 2017 Developer tools v15.0 and later After installation, open a X64 Native Tools Command Prompt for VS 2017. Run docfx in the docs folder, this will generate a _site folder Pack the _site folder with the project level README.md that explains how to go through the docs. How to serve the docs Download and unzip docfx.zip from https://github.com/dotnet/docfx/releases , extract it to a local folder, and add it to PATH so you can run it anywhere. Open a console window and cd to the directory which contains the _site folder Serve the docs site using docfx serve .\\_site command Goto http://localhost:8080 in your browser to view the documentation." + "core_calls/Microsoft.Graph.ICloudCommunicationsGetPresencesByUserIdRequestBuilder.html": { + "href": "core_calls/Microsoft.Graph.ICloudCommunicationsGetPresencesByUserIdRequestBuilder.html", + "title": "Interface ICloudCommunicationsGetPresencesByUserIdRequestBuilder", + "keywords": "Interface ICloudCommunicationsGetPresencesByUserIdRequestBuilder The interface ICloudCommunicationsGetPresencesByUserIdRequestBuilder. Namespace : Microsoft.Graph Assembly : Microsoft.Graph.Communications.Core.Calls.dll Syntax public interface ICloudCommunicationsGetPresencesByUserIdRequestBuilder Methods Request(IEnumerable