[{"data":1,"prerenderedAt":101},["ShallowReactive",2],{"docs:\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore":3},{"kind":4,"title":5,"namespace":6,"namespaceUrl":7,"trail":8,"typeKind":14,"availability":15,"signature":18,"displaySignature":19,"signatureHtml":20,"documentation":21,"documented":22,"bases":23,"inheritedMembers":24,"members":25,"release":98,"section":100},"type","IPluginCredentialStore","Unbroken.LaunchBox.Plugins.Services.Storage","\u002Fplugins\u002Fnamespaces\u002FUnbroken.LaunchBox.Plugins.Services.Storage",[9,12],{"title":10,"url":11},"Services","\u002Fplugins\u002Fnamespaces\u002FUnbroken.LaunchBox.Plugins.Services",{"title":13,"url":7},"Storage","Interface",{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"14.1",false,"public interface Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore","public interface IPluginCredentialStore","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">public\u003C\u002Fspan>\u003Cspan style=\"color:#569CD6\"> interface\u003C\u002Fspan>\u003Cspan style=\"color:#4EC9B0\"> \u003C\u002Fspan>\u003Cspan title=\"Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore\">\u003Cspan style=\"color:#4EC9B0\">IPluginCredentialStore\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\n            \u003Cdiv class=\"api-summary\">Provides protected, package-scoped connection storage through constructor injection.\u003C\u002Fdiv>\n            \u003Ch4>Remarks\u003C\u002Fh4>\n            Components in one managed package share records and notifications. Owner\u002Fconnection handles are compared\n            ordinally ignoring case; opaque value names are ordinal. These are not service account or game identities.\n            Plugins coordinate their own refresh and client caches. Unreadable data fails without overwriting credentials.\n            Unsubscribe event handlers when disposing a component. No cross-package storage access is provided.\n            \n        ",true,[],[],[26,37,48,58,68,78,88],{"availability":27,"id":28,"name":29,"label":29,"kind":30,"summary":31,"signature":32,"displaySignature":33,"signatureHtml":34,"anchor":35,"documentation":36,"documented":22},{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"E:Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.CredentialsChanged","CredentialsChanged","Event","Signals a successful record change in this process; reload state instead of relying on exactly-once delivery.","event System.EventHandler\u003CUnbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialsChangedEventArgs>? CredentialsChanged","event EventHandler\u003CPluginCredentialsChangedEventArgs>? CredentialsChanged","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#9CDCFE\">event\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.eventhandler-1\" title=\"System.EventHandler (Microsoft Learn)\">\u003Cspan style=\"color:#9CDCFE\">EventHandler\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Ca href=\"\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialsChangedEventArgs\" title=\"Unbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialsChangedEventArgs\">\u003Cspan style=\"color:#9CDCFE\">PluginCredentialsChangedEventArgs\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">>? \u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\">CredentialsChanged\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","member-ad2272c2299e77c374d7","\n            \u003Cdiv class=\"api-summary\">Signals a successful record change in this process; reload state instead of relying on exactly-once delivery.\u003C\u002Fdiv>\n        ",{"availability":38,"id":39,"name":40,"label":40,"kind":41,"summary":42,"signature":43,"displaySignature":44,"signatureHtml":45,"anchor":46,"documentation":47,"documented":22},{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"M:Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.GetConnectionsAsync(System.String,System.Threading.CancellationToken)","GetConnectionsAsync","Method","Gets saved descriptors for an owner.","System.Threading.Tasks.Task\u003CSystem.Collections.Generic.IReadOnlyCollection\u003CUnbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection>> GetConnectionsAsync(string ownerId, System.Threading.CancellationToken cancellationToken)","Task\u003CIReadOnlyCollection\u003CPluginStoredConnection>> GetConnectionsAsync(\n    string ownerId,\n    CancellationToken cancellationToken\n)","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.tasks.task-1\" title=\"System.Threading.Tasks.Task (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">Task\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.collections.generic.ireadonlycollection-1\" title=\"System.Collections.Generic.IReadOnlyCollection (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">IReadOnlyCollection\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Ca href=\"\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection\" title=\"Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection\">\u003Cspan style=\"color:#4EC9B0\">PluginStoredConnection\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">>> \u003C\u002Fspan>\u003Cspan style=\"color:#DCDCAA\">GetConnectionsAsync\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> ownerId\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.cancellationtoken\" title=\"System.Threading.CancellationToken (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">CancellationToken\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> cancellationToken\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D4D4D4\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","member-e1186d5033eb5c27490d","\n            \u003Cdiv class=\"api-summary\">Gets saved descriptors for an owner.\u003C\u002Fdiv>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>ownerId\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The package-local owner ID.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>cancellationToken\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>Cancels the read.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Ch4>Returns\u003C\u002Fh4>Saved descriptors, or an empty collection when none exist.\n        ",{"availability":49,"id":50,"name":51,"label":51,"kind":41,"summary":52,"signature":53,"displaySignature":54,"signatureHtml":55,"anchor":56,"documentation":57,"documented":22},{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"M:Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.GetSnapshotAsync(System.String,System.String,System.Threading.CancellationToken)","GetSnapshotAsync","Reads one descriptor and all its values in the same transaction.","System.Threading.Tasks.Task\u003CUnbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot?> GetSnapshotAsync(string ownerId, string connectionId, System.Threading.CancellationToken cancellationToken)","Task\u003CPluginCredentialSnapshot?> GetSnapshotAsync(\n    string ownerId,\n    string connectionId,\n    CancellationToken cancellationToken\n)","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.tasks.task-1\" title=\"System.Threading.Tasks.Task (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">Task\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Ca href=\"\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot\" title=\"Unbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot\">\u003Cspan style=\"color:#4EC9B0\">PluginCredentialSnapshot\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">?> \u003C\u002Fspan>\u003Cspan style=\"color:#DCDCAA\">GetSnapshotAsync\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> ownerId\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> connectionId\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.cancellationtoken\" title=\"System.Threading.CancellationToken (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">CancellationToken\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> cancellationToken\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D4D4D4\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","member-d262e8e4c2c1dd18eb7d","\n            \u003Cdiv class=\"api-summary\">Reads one descriptor and all its values in the same transaction.\u003C\u002Fdiv>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>ownerId\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The package-local owner.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>connectionId\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The owner-local connection handle.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>cancellationToken\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>Cancels the read.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Ch4>Returns\u003C\u002Fh4>A snapshot containing secrets, or null if the connection no longer exists.\n            \u003Ch4>Remarks\u003C\u002Fh4>Read a snapshot before remote token-refresh work, then persist the refreshed values with \u003Ca href=\"\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore#member-197141c991082cc630db\" title=\"Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.TryUpdateConnectionAsync(Unbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot,Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection,System.Collections.Generic.IReadOnlyDictionary{System.String,System.String},System.Threading.CancellationToken)\">IPluginCredentialStore.TryUpdateConnectionAsync\u003C\u002Fa>.\n        ",{"availability":59,"id":60,"name":61,"label":61,"kind":41,"summary":62,"signature":63,"displaySignature":64,"signatureHtml":65,"anchor":66,"documentation":67,"documented":22},{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"M:Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.GetValueAsync(System.String,System.String,System.String,System.Threading.CancellationToken)","GetValueAsync","Gets one opaque value.","System.Threading.Tasks.Task\u003Cstring?> GetValueAsync(string ownerId, string connectionId, string name, System.Threading.CancellationToken cancellationToken)","Task\u003Cstring?> GetValueAsync(\n    string ownerId,\n    string connectionId,\n    string name,\n    CancellationToken cancellationToken\n)","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.tasks.task-1\" title=\"System.Threading.Tasks.Task (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">Task\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#569CD6\">string\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">?> \u003C\u002Fspan>\u003Cspan style=\"color:#DCDCAA\">GetValueAsync\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> ownerId\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> connectionId\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> name\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.cancellationtoken\" title=\"System.Threading.CancellationToken (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">CancellationToken\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> cancellationToken\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D4D4D4\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","member-16bb381d2cf1278261ad","\n            \u003Cdiv class=\"api-summary\">Gets one opaque value.\u003C\u002Fdiv>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>ownerId\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The package-local owner ID.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>connectionId\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The owner-local connection handle.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>name\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The case-sensitive value name.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>cancellationToken\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>Cancels the read.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Ch4>Returns\u003C\u002Fh4>The value, or null when absent.\n        ",{"availability":69,"id":70,"name":71,"label":71,"kind":41,"summary":72,"signature":73,"displaySignature":74,"signatureHtml":75,"anchor":76,"documentation":77,"documented":22},{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"M:Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.RemoveConnectionAsync(System.String,System.String,System.Threading.CancellationToken)","RemoveConnectionAsync","Removes a descriptor and its opaque values.","System.Threading.Tasks.Task RemoveConnectionAsync(string ownerId, string connectionId, System.Threading.CancellationToken cancellationToken)","Task RemoveConnectionAsync(\n    string ownerId,\n    string connectionId,\n    CancellationToken cancellationToken\n)","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.tasks.task\" title=\"System.Threading.Tasks.Task (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">Task\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#DCDCAA\"> RemoveConnectionAsync\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> ownerId\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#569CD6\">    string\u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\"> connectionId\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.cancellationtoken\" title=\"System.Threading.CancellationToken (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">CancellationToken\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> cancellationToken\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D4D4D4\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","member-6b801ea716ab14016e28","\n            \u003Cdiv class=\"api-summary\">Removes a descriptor and its opaque values.\u003C\u002Fdiv>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>ownerId\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The package-local owner ID.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>connectionId\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The owner-local connection handle.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>cancellationToken\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>Cancels the operation.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Ch4>Returns\u003C\u002Fh4>Completion of protected persistence.\n        ",{"availability":79,"id":80,"name":81,"label":81,"kind":41,"summary":82,"signature":83,"displaySignature":84,"signatureHtml":85,"anchor":86,"documentation":87,"documented":22},{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"M:Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.SaveConnectionAsync(Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection,System.Collections.Generic.IReadOnlyDictionary{System.String,System.String},System.Threading.CancellationToken)","SaveConnectionAsync","Saves a descriptor and applies partial changes atomically with other host credential-store writes.","System.Threading.Tasks.Task SaveConnectionAsync(Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection connection, System.Collections.Generic.IReadOnlyDictionary\u003Cstring, string?> values, System.Threading.CancellationToken cancellationToken)","Task SaveConnectionAsync(\n    PluginStoredConnection connection,\n    IReadOnlyDictionary\u003Cstring, string?> values,\n    CancellationToken cancellationToken\n)","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.tasks.task\" title=\"System.Threading.Tasks.Task (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">Task\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#DCDCAA\"> SaveConnectionAsync\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection\" title=\"Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection\">\u003Cspan style=\"color:#4EC9B0\">PluginStoredConnection\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> connection\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.collections.generic.ireadonlydictionary-2\" title=\"System.Collections.Generic.IReadOnlyDictionary (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">IReadOnlyDictionary\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#569CD6\">string\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">, \u003C\u002Fspan>\u003Cspan style=\"color:#569CD6\">string\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">?> \u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\">values\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.cancellationtoken\" title=\"System.Threading.CancellationToken (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">CancellationToken\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> cancellationToken\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D4D4D4\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","member-6afccb706b86d3891d52","\n            \u003Cdiv class=\"api-summary\">Saves a descriptor and applies partial changes atomically with other host credential-store writes.\u003C\u002Fdiv>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>connection\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The descriptor to save.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>values\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>A non-null value adds or replaces its named value, a \u003Ccode>null\u003C\u002Fcode> value removes it, and an omitted name preserves its existing value.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>cancellationToken\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>Cancels the operation; completed writes are not rolled back.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Ch4>Returns\u003C\u002Fh4>Completion of protected persistence.\n        ",{"availability":89,"id":90,"name":91,"label":91,"kind":41,"summary":92,"signature":93,"displaySignature":94,"signatureHtml":95,"anchor":96,"documentation":97,"documented":22},{"firstSeen":16,"isBaseline":17,"declarationFirstSeen":16},"M:Unbroken.LaunchBox.Plugins.Services.Storage.IPluginCredentialStore.TryUpdateConnectionAsync(Unbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot,Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection,System.Collections.Generic.IReadOnlyDictionary{System.String,System.String},System.Threading.CancellationToken)","TryUpdateConnectionAsync","Updates an existing connection only if its snapshot is still current in this store.","System.Threading.Tasks.Task\u003Cbool> TryUpdateConnectionAsync(Unbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot snapshot, Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection connection, System.Collections.Generic.IReadOnlyDictionary\u003Cstring, string?> values, System.Threading.CancellationToken cancellationToken)","Task\u003Cbool> TryUpdateConnectionAsync(\n    PluginCredentialSnapshot snapshot,\n    PluginStoredConnection connection,\n    IReadOnlyDictionary\u003Cstring, string?> values,\n    CancellationToken cancellationToken\n)","\u003Cpre class=\"shiki dark-plus\" style=\"background-color:#1E1E1E;color:#D4D4D4\" tabindex=\"0\" aria-label=\"C# code\">\u003Ccode>\u003Cspan class=\"line\">\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.tasks.task-1\" title=\"System.Threading.Tasks.Task (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">Task\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#569CD6\">bool\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">> \u003C\u002Fspan>\u003Cspan style=\"color:#DCDCAA\">TryUpdateConnectionAsync\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot\" title=\"Unbroken.LaunchBox.Plugins.Services.Storage.PluginCredentialSnapshot\">\u003Cspan style=\"color:#4EC9B0\">PluginCredentialSnapshot\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> snapshot\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"\u002Fplugins\u002Freference\u002FUnbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection\" title=\"Unbroken.LaunchBox.Plugins.Services.Storage.PluginStoredConnection\">\u003Cspan style=\"color:#4EC9B0\">PluginStoredConnection\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> connection\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.collections.generic.ireadonlydictionary-2\" title=\"System.Collections.Generic.IReadOnlyDictionary (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">IReadOnlyDictionary\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#D4D4D4\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#569CD6\">string\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">, \u003C\u002Fspan>\u003Cspan style=\"color:#569CD6\">string\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">?> \u003C\u002Fspan>\u003Cspan style=\"color:#9CDCFE\">values\u003C\u002Fspan>\u003Cspan style=\"color:#D4D4D4\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#4EC9B0\">    \u003C\u002Fspan>\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fsystem.threading.cancellationtoken\" title=\"System.Threading.CancellationToken (Microsoft Learn)\">\u003Cspan style=\"color:#4EC9B0\">CancellationToken\u003C\u002Fspan>\u003C\u002Fa>\u003Cspan style=\"color:#9CDCFE\"> cancellationToken\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D4D4D4\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","member-197141c991082cc630db","\n            \u003Cdiv class=\"api-summary\">Updates an existing connection only if its snapshot is still current in this store.\u003C\u002Fdiv>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>snapshot\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The snapshot read before remote work.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>connection\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>The updated descriptor with the same owner and connection handle.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>values\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>Partial value changes, using the same null\u002Fremoval rules as ordinary saves.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Cdl>\u003Cdt class=\"version-row\">\u003Cspan>\u003Ccode>cancellationToken\u003C\u002Fcode>\u003C\u002Fspan>\u003C\u002Fdt>\u003Cdd>Cancels persistence; completed writes are not rolled back.\u003C\u002Fdd>\u003C\u002Fdl>\n            \u003Ch4>Returns\u003C\u002Fh4>True when accepted, including unchanged values; false when removed or superseded. False makes no changes and publishes no notification.\n            \u003Ch4>Remarks\u003C\u002Fh4>The comparison and write are atomic across participating processes; providers still coordinate service-side token rotation. Discard rejected refresh results and do not continue using their credentials. Do not fall back to an unconditional save after a remote refresh.\n        ",{"currentRelease":16,"currentReleaseState":99},"stable","plugins",1794763758004]