initial commit with cache support & example

This commit is contained in:
Kingkor Roy Tirtho
2022-02-07 00:11:15 +06:00
commit c7169b04c7
65 changed files with 7155 additions and 0 deletions
@@ -0,0 +1,64 @@
import 'dart:async';
import 'package:fl_query/fl_query.dart';
import "package:gql_transform_link/gql_transform_link.dart";
typedef _RequestTransformer = FutureOr<Request> Function(Request request);
typedef OnException = FutureOr<String> Function(
HttpLinkServerException exception,
);
/// Simple header-based authentication link that adds [headerKey]: [getToken()] to every request.
///
/// If a lazy or exception-based authentication link is needed for your use case,
/// implementing your own from the [gql reference auth link] or opening an issue.
///
/// [gql reference auth link]: https://github.com/gql-dart/gql/blob/1884596904a411363165bcf3c7cfa9dcc2a61c26/examples/gql_example_http_auth_link/lib/http_auth_link.dart
class AuthLink extends _AsyncReqTransformLink {
AuthLink({
required this.getToken,
this.headerKey = 'Authorization',
}) : super(requestTransformer: transform(headerKey, getToken));
/// Authentication callback. Note must include prefixes, e.g. `'Bearer $token'`
final FutureOr<String?> Function() getToken;
/// Header key to set to the result of [getToken]
final String headerKey;
static _RequestTransformer transform(
String headerKey,
FutureOr<String?> Function() getToken,
) =>
(Request request) async {
final token = await getToken();
return request.updateContextEntry<HttpLinkHeaders>(
(headers) => HttpLinkHeaders(
headers: <String, String>{
...headers?.headers ?? <String, String>{},
if (token != null) headerKey: token,
},
),
);
};
}
/// Version of [TransformLink] that handles async transforms
class _AsyncReqTransformLink extends Link {
final _RequestTransformer requestTransformer;
_AsyncReqTransformLink({
required this.requestTransformer,
});
@override
Stream<Response> request(
Request request, [
NextLink? forward,
]) async* {
final req = await requestTransformer(request);
yield* forward!(req);
}
}