From a824acb78a525b914975a24e0cfebc0f871d96c5 Mon Sep 17 00:00:00 2001 From: Marat Alekperov Date: Sun, 12 Apr 2026 15:12:33 +0200 Subject: [PATCH] feat: add PubSub NextJS guide --- src/data/languages/languageData.ts | 1 + src/data/languages/languageInfo.ts | 4 + src/data/languages/types.ts | 1 + src/data/nav/pubsub.ts | 4 + .../pub-sub-nextjs-getting-started-guide.png | Bin 0 -> 62164 bytes src/pages/docs/getting-started/nextjs.mdx | 562 ++++++++++++++++++ 6 files changed, 572 insertions(+) create mode 100644 src/images/content/screenshots/getting-started/pub-sub-nextjs-getting-started-guide.png create mode 100644 src/pages/docs/getting-started/nextjs.mdx diff --git a/src/data/languages/languageData.ts b/src/data/languages/languageData.ts index 342e4eedd0..06d39aae74 100644 --- a/src/data/languages/languageData.ts +++ b/src/data/languages/languageData.ts @@ -23,6 +23,7 @@ export default { nodejs: '2.21', typescript: '2.21', react: '2.21', + nextjs: '2.21', csharp: '1.2', flutter: '1.2', java: '1.7', diff --git a/src/data/languages/languageInfo.ts b/src/data/languages/languageInfo.ts index 94d92cb31c..ba1eb0c7cb 100644 --- a/src/data/languages/languageInfo.ts +++ b/src/data/languages/languageInfo.ts @@ -9,6 +9,10 @@ export default { label: 'React', syntaxHighlighterKey: 'javascript', }, + nextjs: { + label: 'Next.js', + syntaxHighlighterKey: 'javascript', + }, java: { label: 'Java', syntaxHighlighterKey: 'java', diff --git a/src/data/languages/types.ts b/src/data/languages/types.ts index c9eccfc93a..090d6fe322 100644 --- a/src/data/languages/types.ts +++ b/src/data/languages/types.ts @@ -25,6 +25,7 @@ export const languageKeys = [ 'rest', 'css', 'laravel', + 'nextjs', ] as const; export type LanguageKey = (typeof languageKeys)[number]; diff --git a/src/data/nav/pubsub.ts b/src/data/nav/pubsub.ts index 72f4e39228..fd8648e734 100644 --- a/src/data/nav/pubsub.ts +++ b/src/data/nav/pubsub.ts @@ -29,6 +29,10 @@ export default { name: 'Node.js', link: '/docs/getting-started/node', }, + { + name: 'Next.js', + link: '/docs/getting-started/nextjs', + }, { name: 'React', link: '/docs/getting-started/react', diff --git a/src/images/content/screenshots/getting-started/pub-sub-nextjs-getting-started-guide.png b/src/images/content/screenshots/getting-started/pub-sub-nextjs-getting-started-guide.png new file mode 100644 index 0000000000000000000000000000000000000000..bd71bdfb4228db47c9de59f31b29694daadb2f51 GIT binary patch literal 62164 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 O<+z27`AbvRsQ&=QzRW)W literal 0 HcmV?d00001 diff --git a/src/pages/docs/getting-started/nextjs.mdx b/src/pages/docs/getting-started/nextjs.mdx new file mode 100644 index 0000000000..4991984908 --- /dev/null +++ b/src/pages/docs/getting-started/nextjs.mdx @@ -0,0 +1,562 @@ +--- +title: "Getting started: Pub/Sub in Next.js" +meta_description: "Get started with Ably Pub/Sub in Next.js. Learn how to publish and subscribe to messages, track presence, retrieve message history, and manage realtime connections in a Next.js App Router application." +meta_keywords: "Pub/Sub Next.js, Next.js PubSub, Ably Next.js SDK, realtime messaging Next.js, publish subscribe Next.js, Ably Pub/Sub guide, Next.js realtime communication, Ably tutorial Next.js, Next.js message history, presence API Next.js, Ably Pub/Sub example, realtime Pub/Sub Next.js" +languages: + - nextjs +--- + +This guide will get you started with Ably Pub/Sub in a new Next.js application. + +You'll establish a realtime connection to Ably and learn to publish and subscribe to messages. You'll also implement presence to track other online clients, and learn how to retrieve message history. + + + +## Prerequisites + +1. [Sign up](https://ably.com/signup) for an Ably account. +2. Create a [new app](https://ably.com/accounts/any/apps/new), and create your first API key in the **API Keys** tab of the dashboard. +3. Your API key will need the `publish`, `subscribe`, `presence` and `history` capabilities. + +### Create a Next.js project + +Create a new Next.js project using the official scaffolding tool. Select **App Router** and **TypeScript** when prompted: + + +```shell +npx create-next-app@latest ably-pubsub-nextjs +cd ably-pubsub-nextjs +``` + + +### Update globals.css + +Replace the contents of `src/app/globals.css` with the following to reset browser defaults and ensure consistent font sizing across all elements including inputs and buttons: + + +```css +/* src/app/globals.css */ +html { + height: 100%; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + min-height: 100%; + display: flex; + flex-direction: column; + color: #171717; + background: #ffffff; + font-family: Arial, Helvetica, sans-serif; + font-size: 15px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +*, +input, +button { + box-sizing: border-box; + padding: 0; + margin: 0; + font-size: inherit; + font-family: inherit; +} +``` + + +### Install Ably Pub/Sub JavaScript SDK + +Install the Ably Pub/Sub JavaScript SDK: + + +```shell +npm install ably +``` + + +### (Optional) Install Ably CLI + +Use the [Ably CLI](https://github.com/ably/cli) as an additional client to quickly test Pub/Sub features. It can simulate other clients by publishing messages, subscribing to channels, and managing presence states. + +1. Install the Ably CLI: + + +```shell +npm install -g @ably/cli +``` + + +2. Run the following to log in to your Ably account and set the default app and API key: + + +```shell +ably login +``` + + + + + + +## Step 1: Connect to Ably + +Clients establish a connection with Ably when they instantiate an SDK instance. This enables them to send and receive messages in realtime across channels. + +Open up the [dev console](https://ably.com/accounts/any/apps/any/console) of your first app before you start so that you can see what happens. + +### Set up AblyProvider + +The Ably Pub/Sub SDK provides React hooks and context providers that make it easy to use Pub/Sub features in your components. + +Because the Ably Pub/Sub client uses browser APIs such as WebSocket, it cannot run during server-side rendering. Create a new file `src/app/AblyProvider.tsx` that initializes the client inside a `useEffect` and wraps children in the `AblyProvider`: + + +```react +// src/app/AblyProvider.tsx +'use client'; + +import * as Ably from 'ably'; +import { AblyProvider as AblyReactProvider } from 'ably/react'; +import { ReactNode, useEffect, useState } from 'react'; + +export function AblyProvider({ children }: { children: ReactNode }) { + const [client, setClient] = useState(null); + + useEffect(() => { + const ably = new Ably.Realtime({ + key: '{{API_KEY}}', + clientId: 'my-first-client', + }); + setClient(ably); + return () => { + ably.close(); + }; + }, []); + + if (!client) return null; + return {children}; +} +``` + + + + +Add the `AblyProvider` to your root layout in `src/app/layout.tsx`: + + +```react highlight="+2-3,+9" +// src/app/layout.tsx +import type { ReactNode } from 'react'; +import { AblyProvider } from './AblyProvider'; + +export default function RootLayout({ children }: { children: ReactNode }) { + return ( + + + {children} + + + ); +} +``` + + +This establishes a connection to Ably as soon as your application mounts in the browser. While using an API key is fine for this guide, you should use [token authentication](/docs/auth/token) in production. A [`clientId`](/docs/auth/identified-clients) identifies the client, which is required for features such as presence. + +### Display the connection state + +To display the connection state in your UI, create a client component at `src/app/ConnectionState.tsx`: + + +```react +// src/app/ConnectionState.tsx +'use client'; + +import { useAbly, useConnectionStateListener } from 'ably/react'; +import { useState } from 'react'; + +export function ConnectionState() { + const ably = useAbly(); + const [connectionState, setConnectionState] = useState(ably.connection.state); + + useConnectionStateListener((stateChange) => { + setConnectionState(stateChange.current); + }); + + return ( +

+ Connection: {connectionState} +

+ ); +} +``` +
+ +Update `src/app/page.tsx` to render the component: + + +```react highlight="+2,+8" +// src/app/page.tsx +import { ConnectionState } from './ConnectionState'; + +export default function Home() { + return ( +
+

Ably Pub/Sub - Next.js

+ +
+ ); +} +``` +
+ +Start the development server: + + +```shell +npm run dev +``` + + +Open [http://localhost:3000](http://localhost:3000) and you should see `Connection: connected`. You can also inspect the connection event in the [dev console](https://ably.com/accounts/any/apps/any/console) of your app. + +## Step 2: Subscribe to a channel and publish a message
+ +To publish and subscribe to messages on a channel use the `ChannelProvider` component from the Ably Pub/Sub SDK, which scopes child components to a specific channel. + +### ChannelProvider + +The `ChannelProvider` must be nested inside the `AblyProvider`. Update `src/app/page.tsx` to include the `ChannelProvider`: + + +```react highlight="+2,+4,+12-14" +// src/app/page.tsx +'use client'; + +import { ChannelProvider } from 'ably/react'; +import { ConnectionState } from './ConnectionState'; + +export default function Home() { + return ( +
+

Ably Pub/Sub - Next.js

+ + + {/* Channel-scoped components go here */} + +
+ ); +} +``` +
+ +### Subscribe to a channel
+ +Use the `useChannel()` hook to subscribe to messages on a channel. Create a new file `src/app/Messages.tsx`: + + +```react +// src/app/Messages.tsx +'use client'; + +import type { Message } from 'ably'; +import { useChannel } from 'ably/react'; +import { useState } from 'react'; + +export function Messages() { + const [messages, setMessages] = useState([]); + + useChannel('my-first-channel', (message) => { + setMessages((prev) => [...prev, message]); + }); + + return ( +
+ {messages.map((msg) => ( +

+ {String(msg.data)} +

+ ))} +
+ ); +} +``` +
+ +Add `Messages` to `page.tsx` inside the `ChannelProvider`: + + +```react highlight="+6,+14" +// src/app/page.tsx +'use client'; + +import { ChannelProvider } from 'ably/react'; +import { ConnectionState } from './ConnectionState'; +import { Messages } from './Messages'; + +export default function Home() { + return ( +
+

Ably Pub/Sub - Next.js

+ + + + +
+ ); +} +``` +
+ +Test it by publishing a message from the CLI: + + +```shell +ably channels publish my-first-channel 'Hello from CLI!' +``` + + +### Publish a message
+ +The `useChannel()` hook also returns a `publish` method. Update `src/app/Messages.tsx` to add a message input: + + +```react highlight="+10,+12,+16-20,+23,+27,+32-47" +// src/app/Messages.tsx +'use client'; + +import type { Message } from 'ably'; +import { useChannel } from 'ably/react'; +import { useState } from 'react'; + +export function Messages() { + const [messages, setMessages] = useState([]); + const [inputValue, setInputValue] = useState(''); + + const { publish } = useChannel('my-first-channel', (message) => { + setMessages((prev) => [...prev, message]); + }); + + const handlePublish = () => { + if (!inputValue.trim()) return; + publish('my-first-messages', inputValue.trim()).catch(console.error); + setInputValue(''); + }; + + return ( +
+
+ {messages.map((msg) => ( +

+ {msg.clientId}: + {String(msg.data)} +

+ ))} +
+
+ setInputValue(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && handlePublish()} + style={{ flex: 1, padding: '10px 12px', border: '1px solid #ccc', borderRadius: '4px', outline: 'none' }} + /> + +
+
+ ); +} +``` +
+ +Type a message and click **Publish** to see it appear in your UI. Open another browser window to see messages arriving in realtime. + +## Step 3: Join the presence set
+ +Presence enables clients to be aware of one another on the same channel. You can show who is online, provide status updates, and notify the channel when someone goes offline. + +Use the `usePresence()` and `usePresenceListener()` hooks from the Ably Pub/Sub SDK. Create a new file `src/app/PresenceStatus.tsx`: + + +```react +// src/app/PresenceStatus.tsx +'use client'; + +import { usePresence, usePresenceListener } from 'ably/react'; + +export function PresenceStatus() { + usePresence('my-first-channel', { status: "I'm here!" }); + + const { presenceData } = usePresenceListener('my-first-channel'); + + return ( +
+

+ Present ({presenceData.length}) +

+
    + {presenceData.map((member, idx) => ( +
  • + + {member.clientId} + {member.data?.status ? - {member.data.status} : null} +
  • + ))} +
+
+ ); +} +``` +
+ +Update `src/app/page.tsx` to include `PresenceStatus` and `ConnectionState` inside the `ChannelProvider`, alongside `Messages`: + + +```react highlight="+7,+14-22" +// src/app/page.tsx +'use client'; + +import { ChannelProvider } from 'ably/react'; +import { ConnectionState } from './ConnectionState'; +import { Messages } from './Messages'; +import { PresenceStatus } from './PresenceStatus'; + +export default function Home() { + return ( +
+

Ably Pub/Sub - Next.js

+ +
+
+ + +
+
+ +
+
+
+
+ ); +} +``` +
+ +Your client ID will appear in the presence list. Join presence via the CLI to see another client joining: + + +```shell +ably channels presence enter my-first-channel --data '{"status":"From CLI"}' +``` + + +## Step 4: Retrieve message history
+ +Ably stores messages for 2 minutes by default. You can [extend the storage period](/docs/storage-history/storage) if required. + +The `useChannel()` hook returns a `channel` instance. Use its `history()` method to load previously published messages on mount. Update your `Messages` component in `src/app/Messages.tsx` to load history with a `useEffect`: + + +```react highlight="+6,+12,+16-22" +// src/app/Messages.tsx +'use client'; + +import type { Message } from 'ably'; +import { useChannel } from 'ably/react'; +import { useEffect, useState } from 'react'; + +export function Messages() { + const [messages, setMessages] = useState([]); + const [inputValue, setInputValue] = useState(''); + + const { publish, channel } = useChannel('my-first-channel', (message) => { + setMessages((prev) => [...prev, message]); + }); + + useEffect(() => { + async function loadHistory() { + const history = await channel.history({ limit: 5 }); + setMessages((prev) => [...history.items.reverse(), ...prev]); + } + loadHistory().catch(console.error); + }, [channel]); + + const handlePublish = () => { + if (!inputValue.trim()) return; + publish('my-first-messages', inputValue.trim()).catch(console.error); + setInputValue(''); + }; + + return ( +
+
+ {messages.map((msg) => ( +

+ {msg.clientId}: + {String(msg.data)} +

+ ))} +
+
+ setInputValue(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && handlePublish()} + style={{ flex: 1, padding: '10px 12px', border: '1px solid #ccc', borderRadius: '4px', outline: 'none' }} + /> + +
+
+ ); +} +``` +
+ +Publish a few messages first if needed: + + +```shell +ably channels publish --count 5 my-first-channel "Message number {{.Count}}" +``` + + +Reload the page. The last 5 messages will appear immediately, loaded from history before any new realtime messages arrive. + +Your completed application should look like this: + +![The completed Next.js Pub/Sub application.](../../../images/content/screenshots/getting-started/pub-sub-nextjs-getting-started-guide.png) + +## Next steps
+ +Continue to explore the documentation with Next.js as the selected language: + +* Understand [token authentication](/docs/auth/token) before going to production. +* Understand how to effectively [manage connections](/docs/connect#close?lang=nextjs). +* Explore more [advanced](/docs/pub-sub/advanced?lang=nextjs) Pub/Sub concepts. + +You can also explore the [Ably CLI](https://www.npmjs.com/package/@ably/cli) further, visit the Pub/Sub [API references](/docs/api/realtime-sdk?lang=javascript), or browse the [Ably Next.js Fundamentals Kit](https://github.com/ably/ably-nextjs-fundamentals-kit) for more complete examples.