Connect SDK
The sdk/connect
library provides an idiomatic approach to interfacing with the HxDR GraphQL API. It simplifies the complexities involved in error handling, managing streaming responses for @live
-queries, subscriptions, and integrates seamlessly with authentication. Additionally, it supports automatic retries and facilitates GraphQL introspection, ensuring a robust and efficient connection strategy.
It acts as a wrapper on top of apollo/client
which will be provisioned and can be directly accessed for optional, advanced usage.
Installation
To install this package, you need to have access to the private @sdk
npm scope.
Begin by installing the sdk/connect
package using your preferred package manager:
npm install @sdk/connect
Setup
Vanilla JavaScript/TypeScript
To integrate sdk/connect
into your project, configure the client as shown below:
import { ConnectClient } from '@sdk/connect';
const myClient = new ConnectClient({
linkOptions: {
endpoint: 'https://hxdr.app',
clientName: 'my-application',
clientVersion: '1.0.0',
errorHandler: error => {
// Handle errors globally
console.error(error);
},
},
});
This setup utilizes Apollo's InMemoryCache
for caching strategies, enhancing performance and user experience.
React Integration
npm install @sdk/connect-react react react-dom
To provide global access to the sdk/connect
service within a React application, wrap your app with the ConnectProvider
and utilize the useConnect
hook for easy access:
import { ConnectProvider, useConnect } from '@sdk/connect-react';
import { myClient } from './client'; // Assuming myClient is exported from another file
function Root() {
return (
<ConnectProvider client={myClient}>
<App />
</ConnectProvider>
);
}
import { useConnect } from '@sdk/connect-react';
function App() {
const { connectClient } = useConnect();
const result = connectClient.getApolloClient().query(/* ... */);
return; // ...
}
Error Handling
The sdk/connect
client allows for global error handling through the provided error handler during client setup. This feature is invaluable for implementing user notifications or session management based on API responses:
const myClient = new ConnectClient({
linkOptions: {
// ...Other link options
errorHandler: async error => {
// Example error handling
if (error.code === 'UNAUTHENTICATED') {
// Redirect to login or refresh token
} else if (error.code === 'OFFLINE') {
// Notify user of connectivity issues
} else if (error.code === 'SERVER') {
// General error handling
}
},
},
});
The common error codes include:
- UNAUTHENTICATED: Indicates an invalid or missing session token for secured API calls.
- OFFLINE: Triggered when a connection to the API cannot be established.
- SERVER: Represents a generic server error, typically a
500
response.
Authentication
Authenticated Users
To dynamically handle Bearer token inclusion in request headers, provide a token resolver function during client initialization:
import { Option } from '@sdk/core';
const myClient = new ConnectClient({
linkOptions: {
// Other link options
authenticationTokenResolver: async () => {
const token = await authService.getCurrentSessionToken();
return Option.unwrapOr(token);
},
},
});
This approach ensures that each request uses the most recent session token, maintaining secure and authenticated connections.
Anonymous Users
For operations involving anonymous users, a signed token may be required. Pass this token via the GraphQL context for applicable queries or mutations:
myClient.getApolloClient().query({
query: MY_QUERY,
context: {
anonymousUserToken: 'my-anonymous-signature',
},
});
This mechanism supports scenarios where anonymous users interact with the API under limited permissions.
Cache Configuration (Advanced)
In order to configure the cache Type Policies (opens in a new tab), pass your custom policies at client creation.
const myClient = new ConnectClient({
cacheTypePolicies: {
/* ... */
},
linkOptions: {
// Other link options
},
});