Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(data): add publish events over WebSocket #14242

Open
wants to merge 11 commits into
base: main
Choose a base branch
from

Conversation

zxl629
Copy link

@zxl629 zxl629 commented Feb 25, 2025

Description of changes

Add support to publish events over WebSocket connection for Amplify events client. Customers can now perform the following operations to publish their events.

// WSS Connect 
const channel = await events.connect("test/events");

// WSS publish events
await channel.publish(
      { key: "my event content" },
      { authMode: "identityPool" }
);

// WSS publish events batch
await channel.publish([1, 2, 3], { authMode: "identityPool" });

Description of how you validated changes

Checklist

  • PR description included
  • yarn test passes
  • Unit Tests are changed or added
  • Relevant documentation is changed or added (and PR referenced)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@zxl629 zxl629 marked this pull request as ready for review February 25, 2025 17:09
@zxl629 zxl629 requested a review from a team as a code owner February 25, 2025 17:09
@@ -70,7 +70,7 @@ async function connect(
};

// WS publish is not enabled in the service yet. It will be a follow up feature

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we adjust this comment?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this comment has been removed.

@zxl629 zxl629 requested a review from blakedunson February 27, 2025 18:33
Comment on lines +272 to +273
cleanup();
reject(new Error(`Publish errors: ${errorTypes.join(', ')}`));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this mean we'll close the WS connection if there's a publish error? If so, I don't think that's the behavior we want here. Publish errors would ideally be surfaced at the call site, similar to events.connect, e.g.

try {
  await channel.publish({ some: 'data' })
} catch (err) {
  console.log('publish error', err)
}

This way, WS publish is self contained / decoupled from channel.subscribe.

Copy link
Author

@zxl629 zxl629 Mar 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We will not close the WS connection if there's a publish error. However, there was a bug in the implementation causing uncaught errors in Promise, it should surface the publish errors at the call site now.
Tested with:

const publishSingleEvent = async () => {
  try {
    await channel.publish(
      { key: "my event content" },
      { authMode: "userPool" }
    );
    console.log("Single event published via WS");
  } catch (error) {
    console.error(error);
  }
};

@zxl629 zxl629 requested a review from iartemiev March 3, 2025 22:20
Copy link
Member

@stocaaro stocaaro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We discussed offline how I would expect event.connect should allow both publish and subscribe until the channel has been closed, after which neither publish nor subscribe should work. With multi-channel, there are oddities around how this works in this implementation.

This change adds publish events to websockets. There should be tests added for this on the provider tests.

@zxl629 zxl629 requested a review from stocaaro March 7, 2025 08:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants