diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/GsonFactory.java b/aws-api/src/main/java/com/amplifyframework/api/aws/GsonFactory.java index e286d27046..cdf85f4696 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/GsonFactory.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/GsonFactory.java @@ -26,10 +26,13 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.amplifyframework.annotations.InternalAmplifyApi; + /** * Creates a {@link Gson} instance which may be used around the API plugin. */ -final class GsonFactory { +@InternalAmplifyApi +public final class GsonFactory { private static Gson gson = null; private GsonFactory() {} diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/GsonGraphQLResponseFactory.java b/aws-api/src/main/java/com/amplifyframework/api/aws/GsonGraphQLResponseFactory.java index 103938549f..938d66dde3 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/GsonGraphQLResponseFactory.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/GsonGraphQLResponseFactory.java @@ -42,20 +42,25 @@ import java.util.ArrayList; import java.util.List; +import com.amplifyframework.annotations.InternalAmplifyApi; + /** * Converts JSON strings into models of a given type, using Gson. */ -final class GsonGraphQLResponseFactory implements GraphQLResponse.Factory { +@InternalAmplifyApi +public final class GsonGraphQLResponseFactory implements GraphQLResponse.Factory { private final Gson gson; private final AWSApiSchemaRegistry schemaRegistry = new AWSApiSchemaRegistry(); - GsonGraphQLResponseFactory() { + @InternalAmplifyApi + public GsonGraphQLResponseFactory() { this(GsonFactory.instance()); } @VisibleForTesting - GsonGraphQLResponseFactory(Gson gson) { + @InternalAmplifyApi + public GsonGraphQLResponseFactory(Gson gson) { this.gson = gson; } diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/Iso8601Timestamp.java b/aws-api/src/main/java/com/amplifyframework/api/aws/Iso8601Timestamp.java index a45a7e33cd..cc303a8a50 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/Iso8601Timestamp.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/Iso8601Timestamp.java @@ -19,6 +19,8 @@ import java.util.Date; import java.util.Locale; +import com.amplifyframework.annotations.InternalAmplifyApi; + /** * Utility to create a ISO 8601 compliant timestamps. * This utility only created US-locale timestamps. It is intended for @@ -26,10 +28,12 @@ * timestamp returned by this utility should not be displayed to end * users in a UI, as it is not localized. */ -final class Iso8601Timestamp { +@InternalAmplifyApi +public final class Iso8601Timestamp { private Iso8601Timestamp() {} - static String now() { + @InternalAmplifyApi + public static String now() { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US); return formatter.format(new Date()); } diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthAppSyncGraphQLOperation.java b/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthAppSyncGraphQLOperation.java index fb13784113..d59dbf9831 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthAppSyncGraphQLOperation.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthAppSyncGraphQLOperation.java @@ -19,6 +19,7 @@ import androidx.annotation.NonNull; import com.amplifyframework.AmplifyException; +import com.amplifyframework.annotations.InternalAmplifyApi; import com.amplifyframework.api.ApiException; import com.amplifyframework.api.ApiException.ApiAuthException; import com.amplifyframework.api.aws.auth.ApiRequestDecoratorFactory; @@ -152,7 +153,8 @@ private boolean hasAuthRelatedErrors(GraphQLResponse response) { return false; } - static Builder builder() { + @InternalAmplifyApi + public static Builder builder() { return new Builder<>(); } @@ -202,7 +204,8 @@ public void onFailure(@NonNull Call call, @NonNull IOException exception) { } } - static final class Builder { + @InternalAmplifyApi + public static final class Builder { private String endpoint; private OkHttpClient client; private GraphQLRequest request; @@ -213,53 +216,63 @@ static final class Builder { private ExecutorService executorService; private String apiName; - Builder endpoint(@NonNull String endpoint) { + @InternalAmplifyApi + public Builder endpoint(@NonNull String endpoint) { this.endpoint = Objects.requireNonNull(endpoint); return this; } - Builder client(@NonNull OkHttpClient client) { + @InternalAmplifyApi + public Builder client(@NonNull OkHttpClient client) { this.client = Objects.requireNonNull(client); return this; } - Builder request(@NonNull GraphQLRequest request) { + @InternalAmplifyApi + public Builder request(@NonNull GraphQLRequest request) { this.request = Objects.requireNonNull(request); return this; } - Builder responseFactory(@NonNull GraphQLResponse.Factory responseFactory) { + @InternalAmplifyApi + public Builder responseFactory(@NonNull GraphQLResponse.Factory responseFactory) { this.responseFactory = Objects.requireNonNull(responseFactory); return this; } - Builder onResponse(@NonNull Consumer> onResponse) { + @InternalAmplifyApi + public Builder onResponse(@NonNull Consumer> onResponse) { this.onResponse = Objects.requireNonNull(onResponse); return this; } - Builder onFailure(@NonNull Consumer onFailure) { + @InternalAmplifyApi + public Builder onFailure(@NonNull Consumer onFailure) { this.onFailure = Objects.requireNonNull(onFailure); return this; } - Builder apiRequestDecoratorFactory(ApiRequestDecoratorFactory apiRequestDecoratorFactory) { + @InternalAmplifyApi + public Builder apiRequestDecoratorFactory(ApiRequestDecoratorFactory apiRequestDecoratorFactory) { this.apiRequestDecoratorFactory = apiRequestDecoratorFactory; return this; } - Builder executorService(ExecutorService executorService) { + @InternalAmplifyApi + public Builder executorService(ExecutorService executorService) { this.executorService = executorService; return this; } - Builder apiName(String apiName) { + @InternalAmplifyApi + public Builder apiName(String apiName) { this.apiName = apiName; return this; } + @InternalAmplifyApi @SuppressLint("SyntheticAccessor") - MultiAuthAppSyncGraphQLOperation build() { + public MultiAuthAppSyncGraphQLOperation build() { return new MultiAuthAppSyncGraphQLOperation<>(this); } diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthSubscriptionOperation.java b/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthSubscriptionOperation.java index a904fb139a..ffbbccd2fa 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthSubscriptionOperation.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/MultiAuthSubscriptionOperation.java @@ -18,6 +18,7 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import com.amplifyframework.annotations.InternalAmplifyApi; import com.amplifyframework.api.ApiException; import com.amplifyframework.api.ApiException.ApiAuthException; import com.amplifyframework.api.aws.auth.AuthRuleRequestDecorator; @@ -37,7 +38,8 @@ import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; -final class MultiAuthSubscriptionOperation extends AWSGraphQLOperation { +@InternalAmplifyApi +public final class MultiAuthSubscriptionOperation extends AWSGraphQLOperation { private static final Logger LOG = Amplify.Logging.logger(CategoryType.API, "amplify:aws-api"); private final SubscriptionEndpoint subscriptionEndpoint; @@ -68,7 +70,8 @@ private MultiAuthSubscriptionOperation(Builder builder) { } @NonNull - static Builder builder() { + @InternalAmplifyApi + public static Builder builder() { return new Builder<>(); } @@ -197,7 +200,8 @@ Future getSubscriptionFuture() { return subscriptionFuture; } - static final class Builder { + @InternalAmplifyApi + public static final class Builder { private SubscriptionEndpoint subscriptionEndpoint; private AppSyncGraphQLRequest graphQlRequest; private GraphQLResponse.Factory responseFactory; @@ -210,65 +214,76 @@ static final class Builder { private String apiName; @NonNull + @InternalAmplifyApi public Builder subscriptionEndpoint(@NonNull SubscriptionEndpoint subscriptionEndpoint) { this.subscriptionEndpoint = Objects.requireNonNull(subscriptionEndpoint); return this; } @NonNull + @InternalAmplifyApi public Builder graphQlRequest(@NonNull AppSyncGraphQLRequest graphQlRequest) { this.graphQlRequest = Objects.requireNonNull(graphQlRequest); return this; } @NonNull + @InternalAmplifyApi public Builder responseFactory(@NonNull GraphQLResponse.Factory responseFactory) { this.responseFactory = Objects.requireNonNull(responseFactory); return this; } @NonNull + @InternalAmplifyApi public Builder executorService(@NonNull ExecutorService executorService) { this.executorService = Objects.requireNonNull(executorService); return this; } @NonNull + @InternalAmplifyApi public Builder onSubscriptionStart(@NonNull Consumer onSubscriptionStart) { this.onSubscriptionStart = Objects.requireNonNull(onSubscriptionStart); return this; } @NonNull + @InternalAmplifyApi public Builder onNextItem(@NonNull Consumer> onNextItem) { this.onNextItem = Objects.requireNonNull(onNextItem); return this; } @NonNull + @InternalAmplifyApi public Builder onSubscriptionError(@NonNull Consumer onSubscriptionError) { this.onSubscriptionError = Objects.requireNonNull(onSubscriptionError); return this; } @NonNull + @InternalAmplifyApi public Builder onSubscriptionComplete(@NonNull Action onSubscriptionComplete) { this.onSubscriptionComplete = Objects.requireNonNull(onSubscriptionComplete); return this; } + @InternalAmplifyApi public Builder requestDecorator(AuthRuleRequestDecorator requestDecorator) { this.requestDecorator = requestDecorator; return this; } @NonNull + @InternalAmplifyApi public Builder apiName(String apiName) { this.apiName = apiName; return this; } @NonNull + @InternalAmplifyApi public MultiAuthSubscriptionOperation build() { return new MultiAuthSubscriptionOperation<>(this); } diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionEndpoint.java b/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionEndpoint.java index 5e883325cc..6c20542eca 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionEndpoint.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionEndpoint.java @@ -57,11 +57,14 @@ import okhttp3.WebSocket; import okhttp3.WebSocketListener; +import com.amplifyframework.annotations.InternalAmplifyApi; + /** * Manages the lifecycle of a single WebSocket connection, * and multiple GraphQL subscriptions that work on top of it. */ -final class SubscriptionEndpoint { +@InternalAmplifyApi +public final class SubscriptionEndpoint { private static final Logger LOG = Amplify.Logging.logger(CategoryType.API, "amplify:aws-api"); private static final int CONNECTION_ACKNOWLEDGEMENT_TIMEOUT = 30 /* seconds */; private static final int NORMAL_CLOSURE_STATUS = 1000; @@ -104,7 +107,54 @@ final class SubscriptionEndpoint { this.okHttpClient = okHttpClientBuilder.build(); } - void requestSubscription( + /** + * Convenience constructor for standalone use outside the plugin. Builds the internal + * configuration and authorizer from raw parameters. + * + * @param endpoint The AppSync GraphQL endpoint URL. + * @param region The AWS region. + * @param authorizationType The default authorization type. + * @param apiKey The API key (required when authorizationType is API_KEY, null otherwise). + * @param configurator Optional OkHttp client configurator. + * @param responseFactory Factory for deserializing GraphQL responses. + * @param authProviders Optional auth providers for token/credential resolution. + */ + @InternalAmplifyApi + public SubscriptionEndpoint( + @NonNull String endpoint, + @NonNull String region, + @NonNull AuthorizationType authorizationType, + @Nullable String apiKey, + @Nullable OkHttpConfigurator configurator, + @NonNull GraphQLResponse.Factory responseFactory, + @Nullable ApiAuthProviders authProviders + ) { + this( + ApiConfiguration.builder() + .endpoint(endpoint) + .region(region) + .endpointType(EndpointType.GRAPHQL) + .authorizationType(authorizationType) + .apiKey(apiKey) + .build(), + configurator, + responseFactory, + new SubscriptionAuthorizer( + ApiConfiguration.builder() + .endpoint(endpoint) + .region(region) + .endpointType(EndpointType.GRAPHQL) + .authorizationType(authorizationType) + .apiKey(apiKey) + .build(), + authProviders != null ? authProviders : ApiAuthProviders.noProviderOverrides() + ), + null + ); + } + + @InternalAmplifyApi + public void requestSubscription( @NonNull GraphQLRequest request, @NonNull AuthorizationType authType, @NonNull Consumer onSubscriptionStarted, @@ -261,7 +311,8 @@ private void notifySubscriptionData(String subscriptionId, String data) throws A dispatcher.dispatchNextMessage(data); } - void releaseSubscription(String subscriptionId) throws ApiException { + @InternalAmplifyApi + public void releaseSubscription(String subscriptionId) throws ApiException { // First thing we should do is remove it from the pending subscription collection so // the other methods can't grab a hold of the subscription. final Subscription subscription = subscriptions.get(subscriptionId); diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionMessageType.java b/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionMessageType.java index ec9a2e43b1..3212bd2baf 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionMessageType.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/SubscriptionMessageType.java @@ -17,13 +17,16 @@ import androidx.annotation.NonNull; +import com.amplifyframework.annotations.InternalAmplifyApi; + /** * An enumeration of the values that are possible in the "type" field * of a subscription message. * @see GraphQL Over WebSocket Message Types * @see GraphQL Over WebSocket Protocol */ -enum SubscriptionMessageType { +@InternalAmplifyApi +public enum SubscriptionMessageType { /** * Client requests initialization of a connection, to the server. diff --git a/aws-api/src/main/java/com/amplifyframework/api/aws/TimeoutWatchdog.java b/aws-api/src/main/java/com/amplifyframework/api/aws/TimeoutWatchdog.java index c56fa8c723..e29fa6d043 100644 --- a/aws-api/src/main/java/com/amplifyframework/api/aws/TimeoutWatchdog.java +++ b/aws-api/src/main/java/com/amplifyframework/api/aws/TimeoutWatchdog.java @@ -21,11 +21,14 @@ import com.amplifyframework.AmplifyException; import com.amplifyframework.api.ApiException; +import com.amplifyframework.annotations.InternalAmplifyApi; + /** * Closes the WebSocket connection if the time remaining has elapsed. * Enables resetting of the watchdog remaining time. */ -final class TimeoutWatchdog { +@InternalAmplifyApi +public final class TimeoutWatchdog { private final Handler handler; private Runnable timeoutAction;