Skip to content
This repository was archived by the owner on May 13, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## [0.0.1-dev.10]

- chore: migrate to null-safety

## [0.0.1-dev.9]

- fix: rpc to return PostgrestTransformBuilder
Expand Down
6 changes: 3 additions & 3 deletions example/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:supabase/supabase.dart';

void main() async {
Future<void> main() async {
const supabaseUrl = '';
const supabaseKey = '';
final client = SupabaseClient(supabaseUrl, supabaseKey);
Expand All @@ -19,13 +19,13 @@ void main() async {
final subscription1 =
client.from('countries').on(SupabaseEventTypes.delete, (x) {
print('on countries.delete: ${x.table} ${x.eventType} ${x.oldRecord}');
}).subscribe((String event, {String errorMsg}) {
}).subscribe((String event, {String? errorMsg}) {
print('event: $event error: $errorMsg');
});

final subscription2 = client.from('todos').on(SupabaseEventTypes.insert, (x) {
print('on todos.insert: ${x.table} ${x.eventType} ${x.newRecord}');
}).subscribe((String event, {String errorMsg}) {
}).subscribe((String event, {String? errorMsg}) {
print('event: $event error: $errorMsg');
});

Expand Down
20 changes: 10 additions & 10 deletions lib/src/auth_user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ import 'package:gotrue/gotrue.dart' show User;

class AuthUser extends User {
AuthUser(
{String id,
Map<String, dynamic> appMetadata,
Map<String, dynamic> userMetadata,
String aud,
String email,
String createdAt,
String confirmedAt,
String lastSignInAt,
String role,
String updatedAt})
{required String id,
required Map<String, dynamic> appMetadata,
required Map<String, dynamic> userMetadata,
required String aud,
required String email,
required String createdAt,
String? confirmedAt,
String? lastSignInAt,
required String role,
required String updatedAt})
: super(
id: id,
appMetadata: appMetadata,
Expand Down
38 changes: 17 additions & 21 deletions lib/src/supabase.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,22 @@ import 'package:realtime_client/realtime_client.dart';
import 'supabase_query_builder.dart';

class SupabaseClient {
String supabaseUrl;
String supabaseKey;
String schema;
String restUrl;
String realtimeUrl;
String authUrl;
final String supabaseUrl;
final String supabaseKey;
final String schema;
final String restUrl;
final String realtimeUrl;
final String authUrl;

GoTrueClient auth;
RealtimeClient realtime;
late final GoTrueClient auth;
late final RealtimeClient realtime;

SupabaseClient(this.supabaseUrl, this.supabaseKey,
{String schema, bool autoRefreshToken = true}) {
if (supabaseUrl == null) throw 'supabaseUrl is required.';
if (supabaseKey == null) throw 'supabaseKey is required.';

restUrl = '$supabaseUrl/rest/v1';
realtimeUrl = '$supabaseUrl/realtime/v1'.replaceAll('http', 'ws');
authUrl = '$supabaseUrl/auth/v1';
schema = schema ?? 'public';

{String? schema, bool autoRefreshToken = true})
: restUrl = '$supabaseUrl/rest/v1',
realtimeUrl = '$supabaseUrl/realtime/v1'.replaceAll('http', 'ws'),
authUrl = '$supabaseUrl/auth/v1',
schema = schema ?? 'public' {
auth = _initSupabaseAuthClient(autoRefreshToken: autoRefreshToken);
realtime = _initRealtimeClient();
}
Expand All @@ -44,7 +40,7 @@ class SupabaseClient {
}

/// Perform a stored procedure call.
PostgrestTransformBuilder rpc(String fn, {Map<String, String> params}) {
PostgrestTransformBuilder rpc(String fn, {Map<String, String>? params}) {
final rest = _initPostgRESTClient();
return rest.rpc(fn, params: params);
}
Expand All @@ -54,8 +50,8 @@ class SupabaseClient {
final completer = Completer<int>();

await _closeSubscription(subscription);
final openSubscriptions = getSubscriptions()?.length;
if (openSubscriptions == null || openSubscriptions == 0) {
final openSubscriptions = getSubscriptions().length;
if (openSubscriptions == 0) {
realtime.disconnect();
}
completer.complete(openSubscriptions);
Expand All @@ -68,7 +64,7 @@ class SupabaseClient {
return realtime.channels;
}

GoTrueClient _initSupabaseAuthClient({bool autoRefreshToken}) {
GoTrueClient _initSupabaseAuthClient({bool? autoRefreshToken}) {
return GoTrueClient(
url: authUrl,
headers: {
Expand Down
6 changes: 3 additions & 3 deletions lib/src/supabase_query_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import 'supabase_realtime_payload.dart';
typedef Callback = void Function(SupabaseRealtimePayload payload);

class SupabaseQueryBuilder extends PostgrestQueryBuilder {
SupabaseRealtimeClient _subscription;
RealtimeClient _realtime;
late final SupabaseRealtimeClient _subscription;
late final RealtimeClient _realtime;

SupabaseQueryBuilder(String url, RealtimeClient realtime,
{Map<String, String> headers = const {}, String schema, String table})
{Map<String, String> headers = const {}, String? schema, String? table})
: super(url, headers: headers, schema: schema) {
_subscription =
SupabaseRealtimeClient(realtime, schema ?? 'public', table ?? '*');
Expand Down
21 changes: 12 additions & 9 deletions lib/src/supabase_realtime_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import 'supabase_realtime_payload.dart';

typedef Callback = void Function(SupabaseRealtimePayload payload);

typedef SubscribeCallback = void Function(String event, {String errorMsg});
typedef SubscribeCallback = void Function(String event, {String? errorMsg});

class SupabaseRealtimeClient {
RealtimeSubscription subscription;
late final RealtimeSubscription subscription;

SupabaseRealtimeClient(
RealtimeClient socket, String schema, String tableName) {
Expand All @@ -31,15 +31,18 @@ class SupabaseRealtimeClient {
}

/// Enables the subscription.
RealtimeSubscription subscribe([SubscribeCallback callback]) {
subscription.onError((e) => callback('SUBSCRIPTION_ERROR', errorMsg: e));
subscription.onClose(() => callback('CLOSED'));
RealtimeSubscription subscribe([SubscribeCallback? callback]) {
subscription
.onError((e) => callback?.call('SUBSCRIPTION_ERROR', errorMsg: e));
subscription.onClose(() => callback?.call('CLOSED'));
subscription
.subscribe()
.receive('ok', (_) => callback('SUBSCRIBED'))
.receive('error',
(res) => callback('SUBSCRIPTION_ERROR', errorMsg: res.toString()))
.receive('timeout', (_) => callback('RETRYING_AFTER_TIMEOUT'));
.receive('ok', (_) => callback?.call('SUBSCRIBED'))
.receive(
'error',
(res) =>
callback?.call('SUBSCRIPTION_ERROR', errorMsg: res.toString()))
.receive('timeout', (_) => callback?.call('RETRYING_AFTER_TIMEOUT'));
return subscription;
}
}
63 changes: 35 additions & 28 deletions lib/src/supabase_realtime_payload.dart
Original file line number Diff line number Diff line change
@@ -1,49 +1,56 @@
import 'package:realtime_client/realtime_client.dart';

class SupabaseRealtimePayload {
String commitTimestamp;
final String commitTimestamp;

/// 'INSERT' | 'UPDATE' | 'DELETE'
String eventType;
String schema;
String table;
final String eventType;
final String schema;
final String table;

/// The new record. Present for 'INSERT' and 'UPDATE' events
dynamic newRecord;
final dynamic newRecord;

/// The previous record. Present for 'UPDATE' and 'DELETE' events
dynamic oldRecord;
final dynamic oldRecord;

SupabaseRealtimePayload(
{this.commitTimestamp,
this.eventType,
this.schema,
this.table,
this.newRecord,
this.oldRecord});
SupabaseRealtimePayload({
required this.commitTimestamp,
required this.eventType,
required this.schema,
required this.table,
required this.newRecord,
required this.oldRecord,
});

factory SupabaseRealtimePayload.fromJson(Map<String, dynamic> json) {
final obj = SupabaseRealtimePayload();
obj.schema = json['schema'] as String;
obj.table = json['table'] as String;
obj.commitTimestamp = json['commit_timestamp'] as String;
obj.eventType = json['type'] as String;

final schema = json['schema'] as String;
final table = json['table'] as String;
final commitTimestamp = json['commit_timestamp'] as String;
final eventType = json['type'] as String;
Map<dynamic, dynamic>? newRecord;
if (json['type'] == 'INSERT' || json['type'] == 'UPDATE') {
final columns = obj.convertColumnList(json['columns'] as List<dynamic>);
final records = json['record'] as Map<String, dynamic> ?? {};
obj.newRecord = convertChangeData(columns, records);
final columns = convertColumnList(json['columns'] as List<dynamic>?);
final records = json['record'] as Map<String, dynamic>? ?? {};
newRecord = convertChangeData(columns, records);
}

Map<dynamic, dynamic>? oldRecord;
if (json['type'] == 'UPDATE' || json['type'] == 'DELETE') {
final columns = obj.convertColumnList(json['columns'] as List<dynamic>);
final records = json['old_record'] as Map<String, dynamic> ?? {};
obj.oldRecord = convertChangeData(columns, records);
final columns = convertColumnList(json['columns'] as List<dynamic>?);
final records = json['old_record'] as Map<String, dynamic>? ?? {};
oldRecord = convertChangeData(columns, records);
}
return obj;
return SupabaseRealtimePayload(
table: table,
schema: schema,
commitTimestamp: commitTimestamp,
eventType: eventType,
newRecord: newRecord,
oldRecord: oldRecord,
);
}

List<Map<String, dynamic>> convertColumnList(List<dynamic> columns) {
static List<Map<String, dynamic>> convertColumnList(List<dynamic>? columns) {
final result = <Map<String, dynamic>>[];
if (columns != null) {
for (final column in columns) {
Expand Down
14 changes: 7 additions & 7 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
name: supabase
description: A dart client for Supabase. This client makes it simple for developers to build secure and scalable products.
version: 0.0.1-dev.9
version: 0.0.1-dev.10
homepage: "https://supabase.io"
repository: "https://github.com/supabase/supabase-dart"

environment:
sdk: ">=2.8.1 <3.0.0"
sdk: '>=2.12.0 <3.0.0'

dependencies:
gotrue: ^0.0.1-dev.7
postgrest: ^0.0.7
realtime_client: ^0.0.7
gotrue: ^0.0.1-dev.9
postgrest: ^0.0.8
realtime_client: ^0.0.8

dev_dependencies:
test: ^1.15.4
lint: ^1.3.0
lint: ^1.5.2
test: ^1.16.5
2 changes: 1 addition & 1 deletion test/client_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:test/test.dart';
void main() {
const supabaseUrl = '';
const supabaseKey = '';
SupabaseClient client;
late SupabaseClient client;

setUp(() {
client = SupabaseClient(supabaseUrl, supabaseKey);
Expand Down