/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. *--------------------------------------------------------------------------------------------*/ using System.Diagnostics.CodeAnalysis; namespace GitHub.Copilot; /// Why the runtime is requesting a GitHub token. [Experimental(Diagnostics.Experimental)] public enum GitHubTokenRequestReason { /// The session needs its initial token. Initial, /// The session needs a refreshed token. Refresh, } /// Arguments passed to a session-scoped GitHub token provider. [Experimental(Diagnostics.Experimental)] public sealed class GitHubTokenProviderArgs { /// Gets the effective GitHub host for which a token is needed. public required string Host { get; init; } /// /// Gets the session receiving the token, or before a /// cloud session has been assigned an identifier. /// public string? SessionId { get; init; } /// Gets whether the runtime needs an initial or refreshed token. public required GitHubTokenRequestReason Reason { get; init; } } /// A GitHub access token returned by a session-scoped provider. [Experimental(Diagnostics.Experimental)] public sealed class GitHubToken { /// Gets or sets the GitHub access token. public required string AccessToken { get; set; } /// Gets or sets the OAuth token type. The runtime defaults it to bearer. public string? TokenType { get; set; } /// /// Gets or sets the required positive number of seconds remaining when the /// callback completes. Production GitHub tokens typically last eight hours. /// public required long ExpiresIn { get; set; } /// public override string ToString() => $"{nameof(GitHubToken)} {{ {nameof(TokenType)} = {TokenType}, {nameof(ExpiresIn)} = {ExpiresIn}, {nameof(AccessToken)} = }}"; } /// The result returned by a session-scoped GitHub token provider. [Experimental(Diagnostics.Experimental)] public sealed class GitHubTokenProviderResult { /// Gets whether token acquisition was cancelled. public bool Cancelled { get; private init; } /// Gets the acquired token, if acquisition was not cancelled. public GitHubToken? Token { get; private init; } /// Creates a successful token result. public static GitHubTokenProviderResult FromToken(GitHubToken token) { ArgumentNullException.ThrowIfNull(token); return new() { Token = token }; } /// Creates a cancelled result. public static GitHubTokenProviderResult Cancel() => new() { Cancelled = true }; }