Skip to content

Commit 6fd44a6

Browse files
committed
Rename to TibberApiSubscriptionQueryBuilder
1 parent 9571910 commit 6fd44a6

File tree

3 files changed

+56
-71
lines changed

3 files changed

+56
-71
lines changed

src/Tibber.Sdk/GeneratedEntities.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3725,7 +3725,7 @@ public TibberMutationQueryBuilder ExceptSendPushNotification()
37253725
}
37263726
}
37273727

3728-
public partial class RootSubscriptionQueryBuilder : GraphQlQueryBuilder<RootSubscriptionQueryBuilder>
3728+
public partial class TibberApiSubscriptionQueryBuilder : GraphQlQueryBuilder<TibberApiSubscriptionQueryBuilder>
37293729
{
37303730
private static readonly GraphQlFieldMetadata[] AllFieldMetadata =
37313731
new[]
@@ -3738,28 +3738,28 @@ public partial class RootSubscriptionQueryBuilder : GraphQlQueryBuilder<RootSubs
37383738

37393739
public override IReadOnlyList<GraphQlFieldMetadata> AllFields { get { return AllFieldMetadata; } }
37403740

3741-
public RootSubscriptionQueryBuilder(string operationName = null) : base("subscription", operationName)
3741+
public TibberApiSubscriptionQueryBuilder(string operationName = null) : base("subscription", operationName)
37423742
{
37433743
}
37443744

3745-
public RootSubscriptionQueryBuilder WithParameter<T>(GraphQlQueryParameter<T> parameter)
3745+
public TibberApiSubscriptionQueryBuilder WithParameter<T>(GraphQlQueryParameter<T> parameter)
37463746
{
37473747
return WithParameterInternal(parameter);
37483748
}
37493749

3750-
public RootSubscriptionQueryBuilder WithLiveMeasurement(LiveMeasurementQueryBuilder liveMeasurementQueryBuilder, QueryBuilderParameter<Guid> homeId, string alias = null, IncludeDirective include = null, SkipDirective skip = null)
3750+
public TibberApiSubscriptionQueryBuilder WithLiveMeasurement(LiveMeasurementQueryBuilder liveMeasurementQueryBuilder, QueryBuilderParameter<Guid> homeId, string alias = null, IncludeDirective include = null, SkipDirective skip = null)
37513751
{
37523752
var args = new List<QueryBuilderArgumentInfo>();
37533753
args.Add(new QueryBuilderArgumentInfo { ArgumentName = "homeId", ArgumentValue = homeId });
37543754
return WithObjectField("liveMeasurement", alias, liveMeasurementQueryBuilder, new GraphQlDirective[] { include, skip }, args);
37553755
}
37563756

3757-
public RootSubscriptionQueryBuilder ExceptLiveMeasurement()
3757+
public TibberApiSubscriptionQueryBuilder ExceptLiveMeasurement()
37583758
{
37593759
return ExceptField("liveMeasurement");
37603760
}
37613761

3762-
public RootSubscriptionQueryBuilder WithTestMeasurement(LiveMeasurementQueryBuilder liveMeasurementQueryBuilder, QueryBuilderParameter<int?> count = null, QueryBuilderParameter<bool?> complete = null, string alias = null, IncludeDirective include = null, SkipDirective skip = null)
3762+
public TibberApiSubscriptionQueryBuilder WithTestMeasurement(LiveMeasurementQueryBuilder liveMeasurementQueryBuilder, QueryBuilderParameter<int?> count = null, QueryBuilderParameter<bool?> complete = null, string alias = null, IncludeDirective include = null, SkipDirective skip = null)
37633763
{
37643764
var args = new List<QueryBuilderArgumentInfo>();
37653765
if (count != null)
@@ -3771,7 +3771,7 @@ public RootSubscriptionQueryBuilder WithTestMeasurement(LiveMeasurementQueryBuil
37713771
return WithObjectField("testMeasurement", alias, liveMeasurementQueryBuilder, new GraphQlDirective[] { include, skip }, args);
37723772
}
37733773

3774-
public RootSubscriptionQueryBuilder ExceptTestMeasurement()
3774+
public TibberApiSubscriptionQueryBuilder ExceptTestMeasurement()
37753775
{
37763776
return ExceptField("testMeasurement");
37773777
}
@@ -4279,7 +4279,7 @@ public partial class TibberMutation
42794279
public PushNotificationResponse SendPushNotification { get; set; }
42804280
}
42814281

4282-
public partial class RootSubscription
4282+
public partial class TibberApiSubscription
42834283
{
42844284
public LiveMeasurement LiveMeasurement { get; set; }
42854285
public LiveMeasurement TestMeasurement { get; set; }

src/Tibber.Sdk/RealTimeMeasurementListener.cs

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public RealTimeMeasurementListener(TibberApiClient tibberApiClient, Uri websocke
8181
_streamRestartTimer = new Timer(CheckDataStreamAlive, null, -1, 0);
8282
}
8383

84-
public async Task<IObservable<RealTimeMeasurement>> SubscribeHome(Guid homeId, CancellationToken cancellationToken, RootSubscriptionQueryBuilder queryBuilder = null)
84+
public async Task<IObservable<RealTimeMeasurement>> SubscribeHome(Guid homeId, CancellationToken cancellationToken, TibberApiSubscriptionQueryBuilder queryBuilder = null)
8585
{
8686
CheckObjectNotDisposed();
8787

@@ -96,9 +96,7 @@ public async Task<IObservable<RealTimeMeasurement>> SubscribeHome(Guid homeId, C
9696
throw new InvalidOperationException($"Home {homeId} is already subscribed. ");
9797

9898
subscriptionId = Interlocked.Increment(ref _streamId);
99-
_homeObservables.Add(
100-
homeId,
101-
collection = new HomeStreamObserverCollection { Observable = new HomeRealTimeMeasurementObservable(this, homeId, subscriptionId) });
99+
_homeObservables.Add(homeId, collection = new HomeStreamObserverCollection { Observable = new HomeRealTimeMeasurementObservable(this, homeId, subscriptionId) });
102100

103101
observable = collection.Observable;
104102
}
@@ -178,11 +176,11 @@ private async Task ResubscribeStream(Guid homeId, int subscriptionId, Cancellati
178176
await SubscribeStream(homeId, subscriptionId, cancellationToken);
179177
}
180178

181-
private async Task SubscribeStream(Guid homeId, int subscriptionId, CancellationToken cancellationToken, RootSubscriptionQueryBuilder queryBuilder = null)
179+
private async Task SubscribeStream(Guid homeId, int subscriptionId, CancellationToken cancellationToken, TibberApiSubscriptionQueryBuilder queryBuilder = null)
182180
{
183181
Trace.WriteLine($"subscribe to home id {homeId} with subscription id {subscriptionId}");
184182

185-
queryBuilder ??= new RootSubscriptionQueryBuilder().WithLiveMeasurement(new LiveMeasurementQueryBuilder().WithAllScalarFields(), homeId);
183+
queryBuilder ??= new TibberApiSubscriptionQueryBuilder().WithLiveMeasurement(new LiveMeasurementQueryBuilder().WithAllScalarFields(), homeId);
186184
var query = queryBuilder.Build().Replace(@"""", @"\""");
187185
await ExecuteStreamRequest($@"{{""payload"":{{""query"":""{query}"",""variables"":{{}},""extensions"":{{}}}},""type"":""subscribe"",""id"":""{subscriptionId}""}}", cancellationToken);
188186

@@ -307,11 +305,7 @@ private async void StartListening()
307305

308306
stringBuilder.Clear();
309307

310-
var measurementGroups =
311-
stringRecords
312-
.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
313-
.Select(JsonConvert.DeserializeObject<WebSocketMessage>)
314-
.GroupBy(m => m.Id);
308+
var measurementGroups = stringRecords.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Select(JsonConvert.DeserializeObject<WebSocketMessage>).GroupBy(m => m.Id);
315309

316310
foreach (var measurementGroup in measurementGroups)
317311
{
@@ -369,7 +363,6 @@ private async void StartListening()
369363
}
370364
}
371365
}
372-
373366
} while (!_cancellationTokenSource.IsCancellationRequested);
374367
}
375368

@@ -473,28 +466,31 @@ private void CheckDataStreamAlive(object state)
473466
{
474467
var now = DateTimeOffset.UtcNow;
475468

476-
ResubscribeStreams(
477-
c =>
469+
ResubscribeStreams(c =>
470+
{
471+
var sinceLastMessageMs = (now - c.LastMessageReceivedAt).TotalMilliseconds;
472+
if (sinceLastMessageMs <= StreamReSubscriptionCheckPeriodMs)
473+
return false;
474+
475+
// Data not received during past minute; delay exponentially and then resubscribe
476+
var sinceLastReconnectionMs = (now - c.LastReconnectionAttemptAt).TotalMilliseconds;
477+
var delay = GetDelay(c.ReconnectionAttempts);
478+
if (sinceLastReconnectionMs <= delay.TotalMilliseconds)
478479
{
479-
var sinceLastMessageMs = (now - c.LastMessageReceivedAt).TotalMilliseconds;
480-
if (sinceLastMessageMs <= StreamReSubscriptionCheckPeriodMs)
481-
return false;
482-
483-
// Data not received during past minute; delay exponentially and then resubscribe
484-
var sinceLastReconnectionMs = (now - c.LastReconnectionAttemptAt).TotalMilliseconds;
485-
var delay = GetDelay(c.ReconnectionAttempts);
486-
if (sinceLastReconnectionMs <= delay.TotalMilliseconds)
487-
{
488-
Trace.WriteLine($"{now:yyyy-MM-dd HH:mm:ss.fff zzz} home {c.Observable.HomeId} subscription {c.Observable.SubscriptionId}: no data received during last {sinceLastMessageMs:N0} ms; reconnection attempts {c.ReconnectionAttempts}; resubscription delay {delay.TotalSeconds}s not passed yet");
489-
return false;
490-
}
480+
Trace.WriteLine(
481+
$"{now:yyyy-MM-dd HH:mm:ss.fff zzz} home {c.Observable.HomeId} subscription {c.Observable.SubscriptionId}: no data received during last {sinceLastMessageMs:N0} ms; reconnection attempts {c.ReconnectionAttempts}; resubscription delay {delay.TotalSeconds}s not passed yet"
482+
);
483+
return false;
484+
}
491485

492-
Trace.WriteLine($"{now:yyyy-MM-dd HH:mm:ss.fff zzz} home {c.Observable.HomeId} subscription {c.Observable.SubscriptionId}: no data received during last {sinceLastMessageMs:N0} ms; reconnection attempts {c.ReconnectionAttempts}; re-initialize data stream");
493-
c.ReconnectionAttempts++;
494-
c.LastReconnectionAttemptAt = now;
486+
Trace.WriteLine(
487+
$"{now:yyyy-MM-dd HH:mm:ss.fff zzz} home {c.Observable.HomeId} subscription {c.Observable.SubscriptionId}: no data received during last {sinceLastMessageMs:N0} ms; reconnection attempts {c.ReconnectionAttempts}; re-initialize data stream"
488+
);
489+
c.ReconnectionAttempts++;
490+
c.LastReconnectionAttemptAt = now;
495491

496-
return true;
497-
});
492+
return true;
493+
});
498494
}
499495

500496
private static TimeSpan GetDelay(int failures)
@@ -529,17 +525,18 @@ private class WebSocketMessage
529525
public WebSocketPayload Payload { get; set; }
530526
}
531527

532-
private class WebSocketPayload : GraphQlResponse<WebSocketData>
533-
{
534-
}
528+
private class WebSocketPayload : GraphQlResponse<WebSocketData> { }
535529

536530
private class WebSocketData
537531
{
538532
[JsonProperty("liveMeasurement")]
539533
public RealTimeMeasurement RealTimeMeasurement { get; set; }
540534

541535
[JsonProperty("testMeasurement")]
542-
public RealTimeMeasurement TestMeasurement { set { RealTimeMeasurement = value; } }
536+
public RealTimeMeasurement TestMeasurement
537+
{
538+
set { RealTimeMeasurement = value; }
539+
}
543540
}
544541

545542
private class HomeStreamObserverCollection

src/Tibber.Sdk/TibberApiClient.cs

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,12 @@ public TibberApiClient(string accessToken, ProductInfoHeaderValue userAgent = nu
5252

5353
messageHandler ??= new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate };
5454

55-
_httpClient =
56-
new HttpClient(messageHandler)
57-
{
58-
BaseAddress = new Uri(_baseUrl),
59-
Timeout = timeout ?? DefaultTimeout,
60-
DefaultRequestHeaders =
61-
{
62-
Authorization = new AuthenticationHeaderValue("Bearer", _accessToken),
63-
AcceptEncoding = { new StringWithQualityHeaderValue("gzip") }
64-
}
65-
};
55+
_httpClient = new HttpClient(messageHandler)
56+
{
57+
BaseAddress = new Uri(_baseUrl),
58+
Timeout = timeout ?? DefaultTimeout,
59+
DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Bearer", _accessToken), AcceptEncoding = { new StringWithQualityHeaderValue("gzip") } }
60+
};
6661

6762
UserAgent = _httpClient.DefaultRequestHeaders.UserAgent;
6863
if (userAgent is not null)
@@ -155,8 +150,7 @@ public async Task<ICollection<ProductionEntry>> GetHomeProduction(Guid homeId, E
155150
/// <param name="cancellationToken"></param>
156151
/// <exception cref="TibberApiHttpException"></exception>
157152
/// <returns></returns>
158-
public Task<TibberApiQueryResponse> Query(string query, CancellationToken cancellationToken = default) =>
159-
Request<TibberApiQueryResponse>(query, cancellationToken);
153+
public Task<TibberApiQueryResponse> Query(string query, CancellationToken cancellationToken = default) => Request<TibberApiQueryResponse>(query, cancellationToken);
160154

161155
/// <summary>
162156
/// Executes raw GraphQL mutation.
@@ -165,9 +159,7 @@ public Task<TibberApiQueryResponse> Query(string query, CancellationToken cancel
165159
/// <param name="cancellationToken"></param>
166160
/// <exception cref="TibberApiHttpException"></exception>
167161
/// <returns></returns>
168-
public Task<TibberApiMutationResponse> Mutation(string mutation, CancellationToken cancellationToken = default) =>
169-
Request<TibberApiMutationResponse>(mutation, cancellationToken);
170-
162+
public Task<TibberApiMutationResponse> Mutation(string mutation, CancellationToken cancellationToken = default) => Request<TibberApiMutationResponse>(mutation, cancellationToken);
171163

172164
public async Task<TibberApiQueryResponse> ValidateRealtimeDevice(CancellationToken cancellationToken = default)
173165
{
@@ -201,8 +193,7 @@ public async Task<IObservable<RealTimeMeasurement>> StartRealTimeMeasurementList
201193

202194
await Semaphore.WaitAsync(cancellationToken);
203195

204-
_realTimeMeasurementListener ??=
205-
new RealTimeMeasurementListener(this, new Uri(websocketSubscriptionUrl), _accessToken);
196+
_realTimeMeasurementListener ??= new RealTimeMeasurementListener(this, new Uri(websocketSubscriptionUrl), _accessToken);
206197

207198
try
208199
{
@@ -226,7 +217,7 @@ public async Task<IObservable<RealTimeMeasurement>> StartTestMeasurementListener
226217
{
227218
var realTimeMeasurementListener = new RealTimeMeasurementListener(this, new Uri(websocketSubscriptionUrl), _accessToken);
228219

229-
var builder = new RootSubscriptionQueryBuilder().WithTestMeasurement(new LiveMeasurementQueryBuilder().WithAllScalarFields(), messagesToListen, true);
220+
var builder = new TibberApiSubscriptionQueryBuilder().WithTestMeasurement(new LiveMeasurementQueryBuilder().WithAllScalarFields(), messagesToListen, true);
230221
return await realTimeMeasurementListener.SubscribeHome(Guid.NewGuid(), cancellationToken, builder);
231222
}
232223

@@ -272,23 +263,20 @@ private async Task<TResult> Request<TResult>(string query, CancellationToken can
272263
return Serializer.Deserialize<TResult>(jsonReader);
273264
}
274265

275-
private static HttpContent JsonContent(object data) =>
276-
new StringContent(JsonConvert.SerializeObject(data, JsonSerializerSettings), Encoding.UTF8, "application/json");
266+
private static HttpContent JsonContent(object data) => new StringContent(JsonConvert.SerializeObject(data, JsonSerializerSettings), Encoding.UTF8, "application/json");
277267

278268
private static void ValidateResult(TibberApiQueryResponse response)
279269
{
280270
if (response.Errors is not null && response.Errors.Any())
281-
throw new TibberApiException($"Query execution failed:{Environment.NewLine}{String.Join(Environment.NewLine, response.Errors.Select(e => $"{e.Message} (locations: {String.Join(";", e.Locations.Select(l => $"line: {l.Line}, column: {l.Column}"))})"))}");
271+
throw new TibberApiException(
272+
$"Query execution failed:{Environment.NewLine}{String.Join(Environment.NewLine, response.Errors.Select(e => $"{e.Message} (locations: {String.Join(";", e.Locations.Select(l => $"line: {l.Line}, column: {l.Column}"))})"))}"
273+
);
282274
}
283275
}
284276

285-
public class TibberApiQueryResponse : GraphQlResponse<QueryData>
286-
{
287-
}
277+
public class TibberApiQueryResponse : GraphQlResponse<QueryData> { }
288278

289-
public class TibberApiMutationResponse : GraphQlResponse<TibberMutation>
290-
{
291-
}
279+
public class TibberApiMutationResponse : GraphQlResponse<TibberMutation> { }
292280

293281
public class QueryData
294282
{

0 commit comments

Comments
 (0)