Skip to content

Commit

Permalink
Refactor SpinifyCommandMixin error handling and connection logic
Browse files Browse the repository at this point in the history
  • Loading branch information
PlugFox committed May 13, 2024
1 parent f2661f8 commit b3114ad
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 135 deletions.
18 changes: 18 additions & 0 deletions lib/spinify.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
library spinify;

export 'src/model/channel_push.dart';
export 'src/model/client_info.dart';
export 'src/model/command.dart';
export 'src/model/config.dart';
export 'src/model/exception.dart';
export 'src/model/history.dart';
export 'src/model/jwt.dart';
export 'src/model/metrics.dart';
export 'src/model/presence_stats.dart';
export 'src/model/pushes_stream.dart';
export 'src/model/reply.dart';
export 'src/model/spinify_interface.dart';
export 'src/model/state.dart';
export 'src/model/states_stream.dart';
export 'src/model/stream_position.dart';
export 'src/model/subscription_config.dart';
export 'src/model/subscription_interface.dart';
export 'src/model/subscription_state.dart';
export 'src/model/subscription_states_stream.dart';
export 'src/model/transport_interface.dart';
export 'src/spinify_impl.dart' show Spinify;
3 changes: 3 additions & 0 deletions lib/src/model/channel_push.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ sealed class SpinifyPresence extends SpinifyChannelEvent {

/// Whether this is a leave event
abstract final bool isLeave;

/// Publications
//abstract final Map<String, SpinifyClientInfo> clients;
}

/// Join event
Expand Down
24 changes: 0 additions & 24 deletions lib/src/model/presence.dart

This file was deleted.

40 changes: 0 additions & 40 deletions lib/src/model/refresh_result.dart

This file was deleted.

72 changes: 56 additions & 16 deletions lib/src/model/reply.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:meta/meta.dart';

import 'channel_push.dart';
import 'client_info.dart';
import 'command.dart';
import 'stream_position.dart';

/// {@template reply}
Expand Down Expand Up @@ -30,6 +31,9 @@ sealed class SpinifyReply implements Comparable<SpinifyReply> {
/// Reply type.
abstract final String type;

/// Result of a command.
abstract final bool isResult;

@override
int compareTo(SpinifyReply other) =>
switch (timestamp.compareTo(other.timestamp)) {
Expand All @@ -52,6 +56,12 @@ sealed class SpinifyReply implements Comparable<SpinifyReply> {
String toString() => '$type{id: $id}';
}

/// Reply result of a command.
base mixin SpinifyReplyResult<T extends SpinifyCommand> on SpinifyReply {
@override
bool get isResult => true;
}

/// Server ping message. Server will send this message to client periodically
/// to check if client is still connected.
///
Expand All @@ -65,6 +75,9 @@ final class SpinifyServerPing extends SpinifyReply {

@override
String get type => 'ServerPing';

@override
bool get isResult => false;
}

/// Push can be sent to a client as part of Reply in case of bidirectional
Expand All @@ -83,6 +96,9 @@ final class SpinifyPush extends SpinifyReply {
@override
String get type => 'Push';

@override
bool get isResult => false;

/// Channel push event
String get channel => event.channel;

Expand All @@ -91,7 +107,8 @@ final class SpinifyPush extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyConnectResult extends SpinifyReply {
final class SpinifyConnectResult extends SpinifyReply
with SpinifyReplyResult<SpinifyConnectRequest> {
/// {@macro reply}
const SpinifyConnectResult({
required super.id,
Expand Down Expand Up @@ -146,7 +163,8 @@ final class SpinifyConnectResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifySubscribeResult extends SpinifyReply {
final class SpinifySubscribeResult extends SpinifyReply
with SpinifyReplyResult<SpinifySubscribeRequest> {
/// {@macro reply}
const SpinifySubscribeResult({
required super.id,
Expand Down Expand Up @@ -208,7 +226,8 @@ final class SpinifySubscribeResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyUnsubscribeResult extends SpinifyReply {
final class SpinifyUnsubscribeResult extends SpinifyReply
with SpinifyReplyResult<SpinifyUnsubscribeRequest> {
/// {@macro reply}
const SpinifyUnsubscribeResult({
required super.id,
Expand All @@ -220,7 +239,8 @@ final class SpinifyUnsubscribeResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyPublishResult extends SpinifyReply {
final class SpinifyPublishResult extends SpinifyReply
with SpinifyReplyResult<SpinifyPublishRequest> {
/// {@macro reply}
const SpinifyPublishResult({
required super.id,
Expand All @@ -232,7 +252,8 @@ final class SpinifyPublishResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyPresenceResult extends SpinifyReply {
final class SpinifyPresenceResult extends SpinifyReply
with SpinifyReplyResult<SpinifyPresenceRequest> {
/// {@macro reply}
const SpinifyPresenceResult({
required super.id,
Expand All @@ -249,7 +270,8 @@ final class SpinifyPresenceResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyPresenceStatsResult extends SpinifyReply {
final class SpinifyPresenceStatsResult extends SpinifyReply
with SpinifyReplyResult<SpinifyPresenceStatsRequest> {
/// {@macro reply}
const SpinifyPresenceStatsResult({
required super.id,
Expand All @@ -269,7 +291,8 @@ final class SpinifyPresenceStatsResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyHistoryResult extends SpinifyReply {
final class SpinifyHistoryResult extends SpinifyReply
with SpinifyReplyResult<SpinifyHistoryRequest> {
/// {@macro reply}
const SpinifyHistoryResult({
required super.id,
Expand All @@ -285,7 +308,8 @@ final class SpinifyHistoryResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyPingResult extends SpinifyReply {
final class SpinifyPingResult extends SpinifyReply
with SpinifyReplyResult<SpinifyPingRequest> {
/// {@macro reply}
const SpinifyPingResult({
required super.id,
Expand All @@ -297,7 +321,8 @@ final class SpinifyPingResult extends SpinifyReply {
}

/// {@macro reply}
final class SpinifyRPCResult extends SpinifyReply {
final class SpinifyRPCResult extends SpinifyReply
with SpinifyReplyResult<SpinifyRPCRequest> {
/// {@macro reply}
const SpinifyRPCResult({
required super.id,
Expand All @@ -312,8 +337,11 @@ final class SpinifyRPCResult extends SpinifyReply {
final List<int> data;
}

/// Result of connection refresh
///
/// {@macro reply}
final class SpinifyRefreshResult extends SpinifyReply {
final class SpinifyRefreshResult extends SpinifyReply
with SpinifyReplyResult<SpinifyRefreshRequest> {
/// {@macro reply}
const SpinifyRefreshResult({
required super.id,
Expand All @@ -333,30 +361,42 @@ final class SpinifyRefreshResult extends SpinifyReply {
/// Server version
final String version;

/// Expires
/// Whether a server will expire connection at some point
final bool expires;

/// TTL
/// Time when connection will be expired
final DateTime? ttl;
}

/// Result of subscription refresh
///
/// {@macro reply}
final class SpinifySubRefreshResult extends SpinifyReply {
final class SpinifySubRefreshResult extends SpinifyReply
with SpinifyReplyResult<SpinifySubRefreshRequest> {
/// {@macro reply}
const SpinifySubRefreshResult({
required super.id,
required super.timestamp,
required this.expires,
required this.ttl,
});

@override
String get type => 'SubRefreshResult';

/// Whether a server will expire subscription at some point
final bool expires;

/// Time when subscription will be expired
final DateTime? ttl;
}

/// Error can only be set in replies to commands. For pushes it will have zero
/// value.
/// Error can only be set in replies to commands.
/// For pushes it will have zero value.
///
/// {@macro reply}
final class SpinifyError extends SpinifyReply {
final class SpinifyError extends SpinifyReply
with SpinifyReplyResult<SpinifyCommand> {
/// {@macro reply}
const SpinifyError({
required super.id,
Expand Down
2 changes: 1 addition & 1 deletion lib/src/model/spinify_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

import 'dart:async';

import 'channel_push.dart';
import 'config.dart';
import 'history.dart';
import 'metrics.dart';
import 'presence.dart';
import 'presence_stats.dart';
import 'pushes_stream.dart';
import 'state.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/src/model/subscription_interface.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'dart:async';

import 'channel_push.dart';
import 'history.dart';
import 'presence.dart';
import 'presence_stats.dart';
import 'pushes_stream.dart';
import 'stream_position.dart';
Expand Down
17 changes: 17 additions & 0 deletions lib/src/protobuf/protobuf_codec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -528,9 +528,26 @@ final class ProtobufReplyDecoder extends Converter<pb.Reply, SpinifyReply> {
version: refresh.version,
);
} else if (reply.hasSubRefresh()) {
final refresh = reply.subRefresh;
final pb.SubRefreshResult(:expires, :ttl) = refresh;
final bool expBool;
final DateTime? ttlDT;
if (expires == true && ttl > 0) {
expBool = true;
ttlDT = now.add(Duration(seconds: ttl));
} else if (expires != true) {
expBool = false;
ttlDT = null;
} else {
expBool = false;
ttlDT = null;
assert(false, 'Connection refresh is invalid');
}
return SpinifySubRefreshResult(
id: id,
timestamp: now,
expires: expBool,
ttl: ttlDT,
);
} else {
throw UnimplementedError('Unsupported reply type');
Expand Down
2 changes: 1 addition & 1 deletion lib/src/spinify_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import 'dart:async';

import 'package:meta/meta.dart';

import 'model/channel_push.dart';
import 'model/command.dart';
import 'model/config.dart';
import 'model/history.dart';
import 'model/metrics.dart';
import 'model/presence.dart';
import 'model/presence_stats.dart';
import 'model/pushes_stream.dart';
import 'model/reply.dart';
Expand Down

0 comments on commit b3114ad

Please sign in to comment.