This commit also renames BlueTableSchemaAdaptor to BlueTableSchemaAdapter, and makes it implement IBlueTableSchema.
51 lines
1.4 KiB
C#
51 lines
1.4 KiB
C#
namespace Bts.DataStream;
|
|
|
|
using BCG;
|
|
|
|
using bts;
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
using System;
|
|
|
|
public class ObservableViewStream : ViewStream, IObservable<IDataPacket>, IDisposable {
|
|
readonly IObservable<IDataPacket> source;
|
|
readonly string? name;
|
|
readonly ILogger? logger;
|
|
IDisposable? subscription;
|
|
|
|
public ObservableViewStream(IObservable<IDataPacket> source, string? name = null, ILogger? logger = null) {
|
|
this.source = source;
|
|
this.name = name;
|
|
this.logger = logger;
|
|
}
|
|
|
|
public void Dispose() {
|
|
GC.SuppressFinalize(this);
|
|
if (subscription is not null) {
|
|
subscription.Dispose();
|
|
subscription = null;
|
|
}
|
|
}
|
|
|
|
protected override void myOnFirstSubscriber() {
|
|
Log.isnull(subscription);
|
|
subscription = source.Subscribe(myFireEvent, OnError, OnCompleted);
|
|
|
|
void OnError(Exception exception) =>
|
|
logger?.LogError("Error in ObservableViewStream. name: {Name}, error: {Exception}", name, exception);
|
|
|
|
void OnCompleted() =>
|
|
logger?.LogInformation("ObservableViewStream completed. name: {Name}", name);
|
|
}
|
|
|
|
protected override void myOnLastSubscriber() {
|
|
Log.notnull(subscription);
|
|
subscription.Dispose();
|
|
subscription = null;
|
|
}
|
|
|
|
IDisposable IObservable<IDataPacket>.Subscribe(IObserver<IDataPacket> observer) =>
|
|
source.Subscribe(observer);
|
|
}
|