diff --git a/Plugins/BTCPayServer.Plugins.Blink/BTCPayServer.Plugins.Blink.csproj b/Plugins/BTCPayServer.Plugins.Blink/BTCPayServer.Plugins.Blink.csproj
index 87f4cf6..5f2e00c 100644
--- a/Plugins/BTCPayServer.Plugins.Blink/BTCPayServer.Plugins.Blink.csproj
+++ b/Plugins/BTCPayServer.Plugins.Blink/BTCPayServer.Plugins.Blink.csproj
@@ -9,7 +9,7 @@
Blink
Blink Lightning support
- 1.0.3
+ 1.0.4
true
BTCPayServer.Plugins.Blink
diff --git a/Plugins/BTCPayServer.Plugins.Blink/BlinkLightningClient.cs b/Plugins/BTCPayServer.Plugins.Blink/BlinkLightningClient.cs
index b0ee4fa..e066f0f 100644
--- a/Plugins/BTCPayServer.Plugins.Blink/BlinkLightningClient.cs
+++ b/Plugins/BTCPayServer.Plugins.Blink/BlinkLightningClient.cs
@@ -1,5 +1,6 @@
#nullable enable
using System;
+using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
@@ -9,10 +10,13 @@ using BTCPayServer.HostedServices;
using BTCPayServer.Lightning;
using GraphQL;
using GraphQL.Client.Http;
+using GraphQL.Client.Http.Websocket;
using GraphQL.Client.Serializer.Newtonsoft;
using Microsoft.AspNetCore.OutputCaching;
using NBitcoin;
+using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
+using Newtonsoft.Json.Serialization;
using Network = NBitcoin.Network;
namespace BTCPayServer.Plugins.Blink;
@@ -28,17 +32,32 @@ public class BlinkLightningClient : ILightningClient
private readonly Network _network;
private readonly GraphQLHttpClient _client;
+ public class BlinkConnectionInit
+ {
+ [JsonProperty("X-API-KEY")] public string ApiKey { get; set; }
+ }
public BlinkLightningClient(string apiKey, Uri apiEndpoint, string walletId, Network network, HttpClient httpClient)
{
_apiKey = apiKey;
_apiEndpoint = apiEndpoint;
WalletId = walletId;
_network = network;
- _client = new GraphQLHttpClient(new GraphQLHttpClientOptions() {EndPoint = _apiEndpoint, WebSocketEndPoint = new Uri( "wss://" + _apiEndpoint.Host.Replace("api.", "ws.") + _apiEndpoint.PathAndQuery), ConfigureWebsocketOptions =
- options =>
+ _client = new GraphQLHttpClient(new GraphQLHttpClientOptions() {EndPoint = _apiEndpoint,
+ WebSocketEndPoint =
+ new Uri("wss://" + _apiEndpoint.Host.Replace("api.", "ws.") + _apiEndpoint.PathAndQuery),
+ WebSocketProtocol = WebSocketProtocols.GRAPHQL_TRANSPORT_WS,
+ ConfigureWebSocketConnectionInitPayload = options => new BlinkConnectionInit() {ApiKey = apiKey},
+ ConfigureWebsocketOptions =
+ _ => { }
+ }, new NewtonsoftJsonSerializer(settings =>
+ {
+ if (settings.ContractResolver is CamelCasePropertyNamesContractResolver
+ camelCasePropertyNamesContractResolver)
{
- options.SetRequestHeader("X-API-KEY", apiKey);
- }}, new NewtonsoftJsonSerializer(), httpClient);
+ camelCasePropertyNamesContractResolver.NamingStrategy.OverrideSpecifiedNames = false;
+ camelCasePropertyNamesContractResolver.NamingStrategy.ProcessDictionaryKeys = false;
+ }
+ }), httpClient);
}
@@ -384,7 +403,7 @@ expiresIn = (int)createInvoiceRequest.Expiry.TotalMinutes
{
_lightningClient = lightningClient;
- var stream = httpClient.CreateSubscriptionStream(new GraphQLRequest()
+ var stream = httpClient.CreateSubscriptionStream(new GraphQLRequest()
{
Query = @"subscription myUpdates {
myUpdates {
@@ -409,14 +428,16 @@ expiresIn = (int)createInvoiceRequest.Expiry.TotalMinutes
{
try
{
- var x = stream;
- var y = _lightningClient;
- if (response.Data.myUpdates.update.transaction.direction != "RECEIVE")
+ if(response.Data is null)
return;
- if ((await _lightningClient.GetInvoice(response.Data.myUpdates.update.transaction.initiationVia
- .paymentHash.ToString())) is LightningInvoice inv)
+ if (response.Data.SelectToken("myUpdates.update.transaction.direction")?.Value() != "RECEIVE")
+ return;
+ var invoiceId = response.Data
+ .SelectToken("myUpdates.update.transaction.initiationVia.paymentHash")?.Value();
+ if (invoiceId is null)
+ return;
+ if (await _lightningClient.GetInvoice(invoiceId) is LightningInvoice inv)
{
-
_invoices.Writer.TryWrite(inv);
}
}