Connection
The Storefront API uses SignalR for real-time communication. This page explains how to establish and manage a connection from your frontend application.
CORS Whitelisting Required
Before connecting, ensure your domain has been whitelisted for CORS. See Domain Whitelisting for details.
SignalR Client Library
Include the SignalR JavaScript client library in your application. You can use a CDN or install it via npm.
CDN
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.1/signalr.min.js"></script>
npm
npm install @microsoft/signalr
Establishing a Connection
Create a connection to the SignalR hub using the HubConnectionBuilder:
const connection = new signalR.HubConnectionBuilder()
.withUrl("https://papi.skchase.com/public/hub/storefront")
.configureLogging(signalR.LogLevel.Information)
.build();
Starting the Connection
Start the connection before invoking any hub methods:
async function startConnection() {
try {
await connection.start();
console.log("Connected to Storefront API");
} catch (err) {
console.error("Connection failed:", err);
}
}
Registering Event Handlers
Register event handlers before starting the connection to ensure you don't miss any events:
// Register handlers first
connection.on("BasketUpdated", (basket) => {
console.log("Basket updated:", basket);
});
connection.on("SomethingHappened", (error) => {
console.log("Error occurred:", error);
});
// Then start the connection
await connection.start();
Connection Lifecycle
Automatic Reconnection
SignalR supports automatic reconnection. Configure it when building the connection:
const connection = new signalR.HubConnectionBuilder()
.withUrl("https://papi.skchase.com/public/hub/storefront")
.withAutomaticReconnect()
.build();
Handling Disconnection
Monitor connection state changes to handle disconnections:
connection.onclose((error) => {
console.log("Connection closed:", error);
});
connection.onreconnecting((error) => {
console.log("Reconnecting:", error);
});
connection.onreconnected((connectionId) => {
console.log("Reconnected with ID:", connectionId);
// Resume shopping to restore basket state
});
Complete Connection Example
class StorefrontConnection {
constructor(hubUrl, salesChannelId) {
this.hubUrl = hubUrl;
this.salesChannelId = salesChannelId;
this.connection = null;
}
async initialize() {
this.connection = new signalR.HubConnectionBuilder()
.withUrl(this.hubUrl)
.withAutomaticReconnect()
.configureLogging(signalR.LogLevel.Information)
.build();
// Register event handlers
this.connection.on("BasketUpdated", this.onBasketUpdated.bind(this));
this.connection.on("SomethingHappened", this.onError.bind(this));
// Handle reconnection
this.connection.onreconnected(async () => {
await this.resumeSession();
});
// Start connection
await this.connection.start();
}
onBasketUpdated(basket) {
// Handle basket updates
}
onError(error) {
// Handle errors
}
async resumeSession() {
// Resume shopping session after reconnection
}
}