From 915ebb1a47b63971ae6fae3e8bf3178043406e90 Mon Sep 17 00:00:00 2001 From: tjroach Date: Wed, 2 Apr 2025 11:53:30 -0400 Subject: [PATCH 1/5] Events API Contract shells --- .../.gitignore | 0 .../build.gradle.kts | 2 +- appsync/aws-appsync-amplify/gradle.properties | 4 + .../core/authorizers/AmplifyIamAuthorizer.kt | 0 .../authorizers/AmplifyUserPoolAuthorizer.kt | 0 .../appsync/core/util/AppSyncRequestSigner.kt | 0 .../authorizers/AmplifyIamAuthorizerTest.kt | 0 .../AmplifyUserPoolAuthorizerTest.kt | 0 .../core/util/AppSyncRequestSignerTest.kt | 0 .../gradle.properties | 4 - .../aws/appsync/events/ChannelAuthorizers.kt | 29 ++++++ .../aws/appsync/events/Events.kt | 94 +++++++++++++++++++ .../aws/appsync/events/EventsChannel.kt | 75 +++++++++++++++ .../aws/appsync/events/EventsException.kt | 94 +++++++++++++++++++ .../aws/appsync/events/EventsMessage.kt | 24 +++++ .../aws/appsync/events/PublishResult.kt | 74 +++++++++++++++ settings.gradle.kts | 6 +- 17 files changed, 397 insertions(+), 9 deletions(-) rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/.gitignore (100%) rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/build.gradle.kts (96%) create mode 100644 appsync/aws-appsync-amplify/gradle.properties rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizer.kt (100%) rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizer.kt (100%) rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/src/main/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSigner.kt (100%) rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizerTest.kt (100%) rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizerTest.kt (100%) rename appsync/{aws-appsync-core-amplify => aws-appsync-amplify}/src/test/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSignerTest.kt (100%) delete mode 100644 appsync/aws-appsync-core-amplify/gradle.properties create mode 100644 appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt create mode 100644 appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt create mode 100644 appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt create mode 100644 appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt create mode 100644 appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsMessage.kt create mode 100644 appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/PublishResult.kt diff --git a/appsync/aws-appsync-core-amplify/.gitignore b/appsync/aws-appsync-amplify/.gitignore similarity index 100% rename from appsync/aws-appsync-core-amplify/.gitignore rename to appsync/aws-appsync-amplify/.gitignore diff --git a/appsync/aws-appsync-core-amplify/build.gradle.kts b/appsync/aws-appsync-amplify/build.gradle.kts similarity index 96% rename from appsync/aws-appsync-core-amplify/build.gradle.kts rename to appsync/aws-appsync-amplify/build.gradle.kts index e9397fcc7e..88e6bd0e67 100644 --- a/appsync/aws-appsync-core-amplify/build.gradle.kts +++ b/appsync/aws-appsync-amplify/build.gradle.kts @@ -31,7 +31,7 @@ project.setProperty("VERSION_NAME", readVersion()) group = properties["POM_GROUP"].toString() android { - namespace = "com.amplifyframework.aws.appsync.core" + namespace = "com.amplifyframework.aws.appsync.amplify" defaultConfig { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/appsync/aws-appsync-amplify/gradle.properties b/appsync/aws-appsync-amplify/gradle.properties new file mode 100644 index 0000000000..2e25005862 --- /dev/null +++ b/appsync/aws-appsync-amplify/gradle.properties @@ -0,0 +1,4 @@ +POM_ARTIFACT_ID=aws-appsync-amplify +POM_NAME=Amplify Extensions for AWS AppSync +POM_DESCRIPTION=Amplify Extensions for AWS AppSync +POM_PACKAGING=aar \ No newline at end of file diff --git a/appsync/aws-appsync-core-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizer.kt b/appsync/aws-appsync-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizer.kt similarity index 100% rename from appsync/aws-appsync-core-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizer.kt rename to appsync/aws-appsync-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizer.kt diff --git a/appsync/aws-appsync-core-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizer.kt b/appsync/aws-appsync-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizer.kt similarity index 100% rename from appsync/aws-appsync-core-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizer.kt rename to appsync/aws-appsync-amplify/src/main/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizer.kt diff --git a/appsync/aws-appsync-core-amplify/src/main/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSigner.kt b/appsync/aws-appsync-amplify/src/main/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSigner.kt similarity index 100% rename from appsync/aws-appsync-core-amplify/src/main/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSigner.kt rename to appsync/aws-appsync-amplify/src/main/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSigner.kt diff --git a/appsync/aws-appsync-core-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizerTest.kt b/appsync/aws-appsync-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizerTest.kt similarity index 100% rename from appsync/aws-appsync-core-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizerTest.kt rename to appsync/aws-appsync-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyIamAuthorizerTest.kt diff --git a/appsync/aws-appsync-core-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizerTest.kt b/appsync/aws-appsync-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizerTest.kt similarity index 100% rename from appsync/aws-appsync-core-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizerTest.kt rename to appsync/aws-appsync-amplify/src/test/java/com/amplifyframework/aws/appsync/core/authorizers/AmplifyUserPoolAuthorizerTest.kt diff --git a/appsync/aws-appsync-core-amplify/src/test/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSignerTest.kt b/appsync/aws-appsync-amplify/src/test/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSignerTest.kt similarity index 100% rename from appsync/aws-appsync-core-amplify/src/test/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSignerTest.kt rename to appsync/aws-appsync-amplify/src/test/java/com/amplifyframework/aws/appsync/core/util/AppSyncRequestSignerTest.kt diff --git a/appsync/aws-appsync-core-amplify/gradle.properties b/appsync/aws-appsync-core-amplify/gradle.properties deleted file mode 100644 index aeb50c7e4b..0000000000 --- a/appsync/aws-appsync-core-amplify/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -POM_ARTIFACT_ID=aws-appsync-core-amplify -POM_NAME=AWS AppSync Core for Amplify Android -POM_DESCRIPTION=AWS AppSync Core for Amplify Android Library -POM_PACKAGING=aar \ No newline at end of file diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt new file mode 100644 index 0000000000..2172b7d5a8 --- /dev/null +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.amplifyframework.aws.appsync.events + +import com.amplifyframework.aws.appsync.core.AppSyncAuthorizer + +/** + * Authorizers passed to a channel to manage subscriptions and publishes. + * + * @property subscribeAuthorizer used for subscription requests. + * @property publishAuthorizer used for publish requests. + * @constructor Pass subscribe and publisher authorizer types. + */ +data class ChannelAuthorizers( + val subscribeAuthorizer: AppSyncAuthorizer, + val publishAuthorizer: AppSyncAuthorizer +) \ No newline at end of file diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt new file mode 100644 index 0000000000..f63a32a021 --- /dev/null +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.amplifyframework.aws.appsync.events + +import com.amplifyframework.aws.appsync.core.AppSyncAuthorizer +import kotlinx.serialization.json.JsonElement + +/** + * Publish a single event to a channel. + * + * @property endpoint AWS AppSync Events endpoint. + * @param connectAuthorizer for AWS AppSync Websocket Pub/Sub connection. + * @param defaultChannelAuthorizers passed to created channels if not overridden. + */ +class Events( + val endpoint: String, + val connectAuthorizer: AppSyncAuthorizer, + val defaultChannelAuthorizers: ChannelAuthorizers +) { + + /** + * Publish a single event to a channel. + * + * @param channelName of the channel to publish to. + * @param event formatted in json. + * @param authorizer for the publish call. If not provided, the EventChannel publish authorizer will be used. + * @return result of publish. + */ + @Throws(EventsException::class) + suspend fun publish( + channelName: String, + event: JsonElement, + authorizer: AppSyncAuthorizer = this.defaultChannelAuthorizers.publishAuthorizer + ) : PublishResult { + TODO("Need to implement") + } + + /** + * Publish a multiple events (up to 5) to a channel. + * + * @param channelName of the channel to publish to. + * @param events list of formatted json events. + * @param authorizer for the publish call. If not provided, the EventChannel publish authorizer will be used. + * @return result of publish. + */ + @Throws(EventsException::class) + suspend fun publish( + channelName: String, + events: List, + authorizer: AppSyncAuthorizer = this.defaultChannelAuthorizers.publishAuthorizer + ) : PublishResult { + TODO("Need to implement") + } + + /** + * Create a channel. + * + * @param channelName of the channel to use. + * @param authorizers for the channel to use for subscriptions and publishes. + * @return a channel to manage subscriptions and publishes. + */ + @Throws(EventsException::class) + fun channel( + channelName: String, + authorizers: ChannelAuthorizers = this.defaultChannelAuthorizers, + ) : EventsChannel { + TODO("Need to implement") + } + + /** + * Method to disconnect from all channels. + * + * @param flushEvents set to true (default) to allow all pending publish calls to succeed before disconnecting. + * Setting to false will immediately disconnect, cancelling any in-progress or queued event publishes. + * @param authorizers for the channel to use for subscriptions and publishes. + * @return a channel to manage subscriptions and publishes. + */ + @Throws(EventsException::class) + suspend fun disconnect(flushEvents: Boolean = true) { + TODO("Need to implement") + } +} \ No newline at end of file diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt new file mode 100644 index 0000000000..5a6a620791 --- /dev/null +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.amplifyframework.aws.appsync.events + +import com.amplifyframework.aws.appsync.core.AppSyncAuthorizer +import kotlinx.coroutines.flow.Flow +import kotlinx.serialization.json.JsonElement + +/** + * A class to manage channel subscriptions and publishes + * + * @property name of the channel + * @property authorizers used for channel subscriptions and publishes + */ +class EventsChannel internal constructor( + val name: String, + val authorizers: ChannelAuthorizers +) { + + /** + * Subscribe to a channel. + * + * @param authorizer for the subscribe call. If not provided, the EventChannel subscribe authorizer will be used. + * @return flow of event messages. Collect flow to receive messages. + */ + @Throws(EventsException::class) + fun subscribe( + authorizer: AppSyncAuthorizer = this.authorizers.subscribeAuthorizer + ) : Flow { + TODO("Need to implement") + + } + + /** + * Publish a single event to a channel. + * + * @param event formatted in json. + * @param authorizer for the publish call. If not provided, the EventChannel publish authorizer will be used. + * @return result of publish. + */ + @Throws(EventsException::class) + suspend fun publish( + event: JsonElement, + authorizer: AppSyncAuthorizer = this.authorizers.publishAuthorizer + ) : PublishResult { + TODO("Need to implement") + } + + /** + * Publish a multiple events (up to 5) to a channel. + * + * @param events list of formatted json events. + * @param authorizer for the publish call. If not provided, the EventChannel publish authorizer will be used. + * @return result of publish. + */ + @Throws(EventsException::class) + suspend fun publish( + events: List, + authorizer: AppSyncAuthorizer = this.authorizers.publishAuthorizer + ) : PublishResult { + TODO("Need to implement") + } +} \ No newline at end of file diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt new file mode 100644 index 0000000000..e56a4a4783 --- /dev/null +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.amplifyframework.aws.appsync.events + +/** + * Base class for exceptions thrown in Events library + * + * @param message of the exception. + * @param cause of the exception. + * @param recoverySuggestion recommendation to resolve exception. + */ +open class EventsException internal constructor( + message: String, + cause: Throwable? = null, + val recoverySuggestion: String? = null +) : Exception(message, cause) + +/** + * Thrown when failing to connect to Events WebSocket. + */ +class ConnectException internal constructor(cause: Throwable?) : EventsException( + message = "Failed to connect to the Events Api", + cause = cause, + recoverySuggestion = "See the underlying exception for cause" +) + +/** + * Thrown when call is unauthorized. + */ +class UnauthorizedException internal constructor(): EventsException( + message = "Unauthorized", + recoverySuggestion = "Check your authorizer and Event configuration values and try again" +) + +/** + * Thrown when connection is unexpectedly closed. + */ +class ConnectionClosedException internal constructor(cause: Throwable? = null) : EventsException( + message = "The websocket connection was closed", + cause = cause, + recoverySuggestion = "Check your internet connection and try again" +) + +/** + * Thrown when rate limit is exceeded. + */ +internal class RateLimitExceededException internal constructor(): EventsException( + message = "Rate limit exceeded", + recoverySuggestion = "Try again later" +) + +/** + * Thrown when operation is unsupported. + */ +internal class UnsupportedOperationException internal constructor(): EventsException( + message = "WebSocket did not understand the operation", + recoverySuggestion = "This is not expected to occur. Contact AWS" +) + +/** + * Thrown when resource is not found. + */ +internal class ResourceNotFoundException internal constructor(): EventsException( + message = "Resource not found", + recoverySuggestion = "Check Event configuration values and try again" +) + +/** + * Thrown when hitting max subscription limit. + */ +class MaxSubscriptionsReachedException internal constructor(throwable: Throwable) : EventsException( + message = "Max number of subscriptions reached", + recoverySuggestion = "Unsubscribe from existing channels before attempting to subscribe." +) + +/** + * Thrown when attempting to send too many events or invalid request. + */ +class BadRequestException internal constructor(): EventsException( + message = "Input exceeded 5 event limit", + recoverySuggestion = "Submit 5 events or less." +) \ No newline at end of file diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsMessage.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsMessage.kt new file mode 100644 index 0000000000..03743fc929 --- /dev/null +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsMessage.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.amplifyframework.aws.appsync.events + +import kotlinx.serialization.json.JsonElement + +/** + * An event received through a subscription. + * + * @property data of the received event, formatted in json. + */ +data class EventsMessage(val data: JsonElement) \ No newline at end of file diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/PublishResult.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/PublishResult.kt new file mode 100644 index 0000000000..6c5849eb3a --- /dev/null +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/PublishResult.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.amplifyframework.aws.appsync.events + +/** + * Contains the result of an event(s) publish call. + * + * @property successfulEvents list of events successfully processed by AWS AppSync. + * @property failedEvents list of events that AWS AppSync failed to process. + * @property status of the publish call. + * Successful = All events published successfully + * Failed = All events failed to publish + * PartialSuccess = Mix of successful and failed events. Check event indexes to determine individual states. + */ +data class PublishResult internal constructor( + val successfulEvents: List, + val failedEvents: List +) { + + /** + * Contains identifying information of an event AWS AppSync failed to process. + */ + sealed class Status { + data object Successful: Status() + data object Failed: Status() + data object PartialSuccess: Status() + } + + val status: Status get() { + return when { + successfulEvents.isNotEmpty() && failedEvents.isNotEmpty() -> Status.PartialSuccess + failedEvents.isNotEmpty() -> Status.Failed + else -> Status.Successful + } + } +} + +/** + * Contains identifying information of a successfully processed event. + * + * @property identifier identifier of event used for logging purposes. + * @property index of the event as it was sent in the publish. + */ +data class SuccessfulEvent internal constructor( + val identifier: String, + val index: Int +) + +/** + * Contains identifying information of an event AWS AppSync failed to process. + * + * @property identifier identifier of event used for logging purposes. + * @property index of the event as it was sent in the publish. + * @property errorCode for the failed event. + * @property errorMessage for the failed event. + */ +data class FailedEvent internal constructor( + val identifier: String, + val index: Int, + val errorCode: Int?, + val errorMessage: String? +) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index bd5c9cdefe..619481dbff 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -63,13 +63,11 @@ include(":aws-logging-cloudwatch") // Events API include(":aws-appsync-core") -include(":aws-appsync-core-amplify") +include(":aws-appsync-amplify") include(":aws-appsync-events") -include(":aws-appsync-events-amplify") project(":aws-appsync-core").projectDir = file("appsync/aws-appsync-core") -project(":aws-appsync-core-amplify").projectDir = file("appsync/aws-appsync-core-amplify") +project(":aws-appsync-amplify").projectDir = file("appsync/aws-appsync-amplify") project(":aws-appsync-events").projectDir = file("appsync/aws-appsync-events") -project(":aws-appsync-events-amplify").projectDir = file("appsync/aws-appsync-events-amplify") // Apollo Extensions From d4c640641714642f2fa26e922c4a1b8ae082c4f8 Mon Sep 17 00:00:00 2001 From: tjroach Date: Wed, 2 Apr 2025 11:55:56 -0400 Subject: [PATCH 2/5] lint --- .../aws/appsync/events/ChannelAuthorizers.kt | 2 +- .../amplifyframework/aws/appsync/events/Events.kt | 8 ++++---- .../aws/appsync/events/EventsChannel.kt | 9 ++++----- .../aws/appsync/events/EventsException.kt | 12 ++++++------ 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt index 2172b7d5a8..11b3b894cc 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt @@ -26,4 +26,4 @@ import com.amplifyframework.aws.appsync.core.AppSyncAuthorizer data class ChannelAuthorizers( val subscribeAuthorizer: AppSyncAuthorizer, val publishAuthorizer: AppSyncAuthorizer -) \ No newline at end of file +) diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt index f63a32a021..2d64f4e9a8 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt @@ -43,7 +43,7 @@ class Events( channelName: String, event: JsonElement, authorizer: AppSyncAuthorizer = this.defaultChannelAuthorizers.publishAuthorizer - ) : PublishResult { + ): PublishResult { TODO("Need to implement") } @@ -60,7 +60,7 @@ class Events( channelName: String, events: List, authorizer: AppSyncAuthorizer = this.defaultChannelAuthorizers.publishAuthorizer - ) : PublishResult { + ): PublishResult { TODO("Need to implement") } @@ -75,7 +75,7 @@ class Events( fun channel( channelName: String, authorizers: ChannelAuthorizers = this.defaultChannelAuthorizers, - ) : EventsChannel { + ): EventsChannel { TODO("Need to implement") } @@ -91,4 +91,4 @@ class Events( suspend fun disconnect(flushEvents: Boolean = true) { TODO("Need to implement") } -} \ No newline at end of file +} diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt index 5a6a620791..d1d605f7ae 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt @@ -38,9 +38,8 @@ class EventsChannel internal constructor( @Throws(EventsException::class) fun subscribe( authorizer: AppSyncAuthorizer = this.authorizers.subscribeAuthorizer - ) : Flow { + ): Flow { TODO("Need to implement") - } /** @@ -54,7 +53,7 @@ class EventsChannel internal constructor( suspend fun publish( event: JsonElement, authorizer: AppSyncAuthorizer = this.authorizers.publishAuthorizer - ) : PublishResult { + ): PublishResult { TODO("Need to implement") } @@ -69,7 +68,7 @@ class EventsChannel internal constructor( suspend fun publish( events: List, authorizer: AppSyncAuthorizer = this.authorizers.publishAuthorizer - ) : PublishResult { + ): PublishResult { TODO("Need to implement") } -} \ No newline at end of file +} diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt index e56a4a4783..f9efb0a0f8 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt @@ -39,7 +39,7 @@ class ConnectException internal constructor(cause: Throwable?) : EventsException /** * Thrown when call is unauthorized. */ -class UnauthorizedException internal constructor(): EventsException( +class UnauthorizedException internal constructor() : EventsException( message = "Unauthorized", recoverySuggestion = "Check your authorizer and Event configuration values and try again" ) @@ -56,7 +56,7 @@ class ConnectionClosedException internal constructor(cause: Throwable? = null) : /** * Thrown when rate limit is exceeded. */ -internal class RateLimitExceededException internal constructor(): EventsException( +internal class RateLimitExceededException internal constructor() : EventsException( message = "Rate limit exceeded", recoverySuggestion = "Try again later" ) @@ -64,7 +64,7 @@ internal class RateLimitExceededException internal constructor(): EventsExceptio /** * Thrown when operation is unsupported. */ -internal class UnsupportedOperationException internal constructor(): EventsException( +internal class UnsupportedOperationException internal constructor() : EventsException( message = "WebSocket did not understand the operation", recoverySuggestion = "This is not expected to occur. Contact AWS" ) @@ -72,7 +72,7 @@ internal class UnsupportedOperationException internal constructor(): EventsExcep /** * Thrown when resource is not found. */ -internal class ResourceNotFoundException internal constructor(): EventsException( +internal class ResourceNotFoundException internal constructor() : EventsException( message = "Resource not found", recoverySuggestion = "Check Event configuration values and try again" ) @@ -88,7 +88,7 @@ class MaxSubscriptionsReachedException internal constructor(throwable: Throwable /** * Thrown when attempting to send too many events or invalid request. */ -class BadRequestException internal constructor(): EventsException( +class BadRequestException internal constructor() : EventsException( message = "Input exceeded 5 event limit", recoverySuggestion = "Submit 5 events or less." -) \ No newline at end of file +) From 7b6bd0c2046665fdaba24e2320a09343fcdbc58d Mon Sep 17 00:00:00 2001 From: tjroach Date: Wed, 2 Apr 2025 11:56:39 -0400 Subject: [PATCH 3/5] remove unused lib --- appsync/aws-appsync-events-amplify/.gitignore | 1 - .../build.gradle.kts | 51 ------------------- .../gradle.properties | 4 -- 3 files changed, 56 deletions(-) delete mode 100644 appsync/aws-appsync-events-amplify/.gitignore delete mode 100644 appsync/aws-appsync-events-amplify/build.gradle.kts delete mode 100644 appsync/aws-appsync-events-amplify/gradle.properties diff --git a/appsync/aws-appsync-events-amplify/.gitignore b/appsync/aws-appsync-events-amplify/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/appsync/aws-appsync-events-amplify/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/appsync/aws-appsync-events-amplify/build.gradle.kts b/appsync/aws-appsync-events-amplify/build.gradle.kts deleted file mode 100644 index caa20213f0..0000000000 --- a/appsync/aws-appsync-events-amplify/build.gradle.kts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -import java.util.Properties - -plugins { - id("com.android.library") - id("kotlin-android") -} - -apply(from = rootProject.file("configuration/publishing.gradle")) - -fun readVersion() = Properties().run { - file("../version.properties").inputStream().use { load(it) } - get("VERSION_NAME").toString() -} - -project.setProperty("VERSION_NAME", readVersion()) -group = properties["POM_GROUP"].toString() - -android { - namespace = "com.amplifyframework.aws.appsync.events.amplify" - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - testOptions { - execution = "ANDROIDX_TEST_ORCHESTRATOR" - } -} - -dependencies { - api(project(":aws-appsync-events")) - - testImplementation(libs.test.junit) - testImplementation(libs.test.mockk) - testImplementation(libs.test.kotlin.coroutines) - testImplementation(libs.test.kotest.assertions) -} diff --git a/appsync/aws-appsync-events-amplify/gradle.properties b/appsync/aws-appsync-events-amplify/gradle.properties deleted file mode 100644 index bc0b3408e9..0000000000 --- a/appsync/aws-appsync-events-amplify/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -POM_ARTIFACT_ID=aws-appsync-events-amplify -POM_NAME=AWS AppSync Events for Amplify Android -POM_DESCRIPTION=AWS AppSync Events Library for Amplify Android -POM_PACKAGING=aar \ No newline at end of file From d7276c43ac5a59d29be2a67b498d9433e3a8800a Mon Sep 17 00:00:00 2001 From: tjroach Date: Wed, 2 Apr 2025 15:08:20 -0400 Subject: [PATCH 4/5] move data types to own folder --- .../java/com/amplifyframework/aws/appsync/events/Events.kt | 3 +++ .../com/amplifyframework/aws/appsync/events/EventsChannel.kt | 4 ++++ .../aws/appsync/events/{ => data}/ChannelAuthorizers.kt | 2 +- .../aws/appsync/events/{ => data}/EventsException.kt | 2 +- .../aws/appsync/events/{ => data}/EventsMessage.kt | 2 +- .../aws/appsync/events/{ => data}/PublishResult.kt | 5 +++-- 6 files changed, 13 insertions(+), 5 deletions(-) rename appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/{ => data}/ChannelAuthorizers.kt (95%) rename appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/{ => data}/EventsException.kt (98%) rename appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/{ => data}/EventsMessage.kt (93%) rename appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/{ => data}/PublishResult.kt (96%) diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt index 2d64f4e9a8..9eea1afdfd 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt @@ -15,6 +15,9 @@ package com.amplifyframework.aws.appsync.events import com.amplifyframework.aws.appsync.core.AppSyncAuthorizer +import com.amplifyframework.aws.appsync.events.data.ChannelAuthorizers +import com.amplifyframework.aws.appsync.events.data.EventsException +import com.amplifyframework.aws.appsync.events.data.PublishResult import kotlinx.serialization.json.JsonElement /** diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt index d1d605f7ae..cfe4eba15f 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsChannel.kt @@ -15,6 +15,10 @@ package com.amplifyframework.aws.appsync.events import com.amplifyframework.aws.appsync.core.AppSyncAuthorizer +import com.amplifyframework.aws.appsync.events.data.ChannelAuthorizers +import com.amplifyframework.aws.appsync.events.data.EventsException +import com.amplifyframework.aws.appsync.events.data.EventsMessage +import com.amplifyframework.aws.appsync.events.data.PublishResult import kotlinx.coroutines.flow.Flow import kotlinx.serialization.json.JsonElement diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/ChannelAuthorizers.kt similarity index 95% rename from appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt rename to appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/ChannelAuthorizers.kt index 11b3b894cc..32e740a6dc 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/ChannelAuthorizers.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/ChannelAuthorizers.kt @@ -12,7 +12,7 @@ * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ -package com.amplifyframework.aws.appsync.events +package com.amplifyframework.aws.appsync.events.data import com.amplifyframework.aws.appsync.core.AppSyncAuthorizer diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/EventsException.kt similarity index 98% rename from appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt rename to appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/EventsException.kt index f9efb0a0f8..78034e574f 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsException.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/EventsException.kt @@ -12,7 +12,7 @@ * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ -package com.amplifyframework.aws.appsync.events +package com.amplifyframework.aws.appsync.events.data /** * Base class for exceptions thrown in Events library diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsMessage.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/EventsMessage.kt similarity index 93% rename from appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsMessage.kt rename to appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/EventsMessage.kt index 03743fc929..68a1ce735e 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/EventsMessage.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/EventsMessage.kt @@ -12,7 +12,7 @@ * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ -package com.amplifyframework.aws.appsync.events +package com.amplifyframework.aws.appsync.events.data import kotlinx.serialization.json.JsonElement diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/PublishResult.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/PublishResult.kt similarity index 96% rename from appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/PublishResult.kt rename to appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/PublishResult.kt index 6c5849eb3a..6b45cc7f72 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/PublishResult.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/data/PublishResult.kt @@ -12,7 +12,7 @@ * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ -package com.amplifyframework.aws.appsync.events +package com.amplifyframework.aws.appsync.events.data /** * Contains the result of an event(s) publish call. @@ -38,7 +38,8 @@ data class PublishResult internal constructor( data object PartialSuccess: Status() } - val status: Status get() { + val status: Status + get() { return when { successfulEvents.isNotEmpty() && failedEvents.isNotEmpty() -> Status.PartialSuccess failedEvents.isNotEmpty() -> Status.Failed From 1c4f726af5f8a89e3a6aa670785dd9b8b95dce31 Mon Sep 17 00:00:00 2001 From: tjroach Date: Thu, 3 Apr 2025 10:37:56 -0400 Subject: [PATCH 5/5] fix documentation --- .../main/java/com/amplifyframework/aws/appsync/events/Events.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt index 9eea1afdfd..1a7af0269c 100644 --- a/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt +++ b/appsync/aws-appsync-events/src/main/java/com/amplifyframework/aws/appsync/events/Events.kt @@ -21,7 +21,7 @@ import com.amplifyframework.aws.appsync.events.data.PublishResult import kotlinx.serialization.json.JsonElement /** - * Publish a single event to a channel. + * The main class for interacting with AWS AppSync Events * * @property endpoint AWS AppSync Events endpoint. * @param connectAuthorizer for AWS AppSync Websocket Pub/Sub connection.