import 'dart:async'; import 'package:fl_query/fl_query.dart'; import "package:gql_transform_link/gql_transform_link.dart"; typedef _RequestTransformer = FutureOr Function(Request request); typedef OnException = FutureOr 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 Function() getToken; /// Header key to set to the result of [getToken] final String headerKey; static _RequestTransformer transform( String headerKey, FutureOr Function() getToken, ) => (Request request) async { final token = await getToken(); return request.updateContextEntry( (headers) => HttpLinkHeaders( headers: { ...headers?.headers ?? {}, 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 request( Request request, [ NextLink? forward, ]) async* { final req = await requestTransformer(request); yield* forward!(req); } }