@saturnbtcio/indexer-api-sdk
Version:
SDK for Titan BTC indexer
217 lines (160 loc) • 5.7 kB
Markdown
A TypeScript SDK for interacting with the Saturn Titan indexer.
- Node.js 20 or higher
```bash
npm install @saturnbtcio/indexer-sdk
```
Inputs and outputs for the SDK methods should be fully typed and will help you along in making valid requests.
```typescript
import { SaturnIndexerSDK } from '@saturnbtcio/indexer-sdk';
// Initialize with base URL
const sdk = new SaturnIndexerSDK('https://api.example.com');
// Make requests
const res = await sdk.api.pool.findByTokenFilter({
name: ['token1', 'token2'],
limit: 20,
offset: 0,
});
// Check for success
if (res.status === 200) {
console.log(res.data.response);
console.log(res.data.offset);
}
```
The SDK includes a WebSocket client for subscribing to real-time events.
```typescript
import { WebSocketClient, EventType } from '@saturnbtcio/indexer-sdk';
const wsClient = new WebSocketClient({
url: 'https://api.example.com/ws', // Will be converted to ws:// or wss:// automatically
maxReconnectAttempts: 5, // Optional, defaults to 5 (0 for unlimited)
reconnectInterval: 2000, // Optional, milliseconds between reconnect attempts
});
```
You can subscribe to events in multiple ways:
```typescript
// Simple subscription to all events of a type
await wsClient.subscribe([EventType.Swap]);
// Subscribe to multiple event types at once
await wsClient.subscribe([EventType.Swap, EventType.Transaction]);
// Subscribe with filters
await wsClient.subscribeWithFilter(EventType.Swap, {
assetPair: 'ETH/USDC', // Only receive swap events for this pair
});
// Subscribe to multiple events with different filters
await wsClient.subscribe([
{
event_type: EventType.Swap,
filters: { assetPair: 'ETH/USDC' },
},
{
event_type: EventType.Transaction,
filters: { sender: '0x123abc...' },
},
]);
```
Register event handlers to process events as they arrive:
```typescript
// Handle swap events
const unsubscribeSwaps = wsClient.on(EventType.Swap, (swapEvent) => {
console.log(
`Swap: ${swapEvent.amountIn} ${swapEvent.assetPair.base} → ${swapEvent.amountOut} ${swapEvent.assetPair.quote}`,
);
console.log(`Price: ${swapEvent.price}`);
});
// Handle transaction events
wsClient.on(EventType.Transaction, (transaction) => {
console.log(`New transaction: ${transaction.hash}`);
});
```
```typescript
// Unsubscribe from all subscriptions for specific event types
await wsClient.unsubscribe([EventType.Swap]);
// Unsubscribe from a specific filter for an event type
await wsClient.unsubscribeFilter(EventType.Swap, { assetPair: 'ETH/USDC' });
// Unsubscribe from multiple specific filters
await wsClient.unsubscribeFilters([
{
event_type: EventType.Swap,
filter: { assetPair: 'ETH/USDC' }
},
{
event_type: EventType.Transaction,
filter: { sender: '0x123abc...' }
}
]);
// Unregister event handler with the function returned by .on()
unsubscribeSwaps();
// Close the WebSocket connection
wsClient.close();
```
The WebSocket client automatically handles reconnection if the connection is lost. You can configure this behavior with `maxReconnectAttempts` and `reconnectInterval` options.
In addition to data events, you can also listen for WebSocket connection events:
```typescript
import { WebSocketClient, ConnectionEventType } from '@saturnbtcio/indexer-sdk';
const wsClient = new WebSocketClient({
url: 'https://api.example.com/ws',
});
// Define handlers as standalone functions to be able to reference them for removal
const onConnected = () => {
console.log('Connection established!');
};
const onDisconnect = (event) => {
console.log(`Disconnected with code ${event.data.code}`);
};
// Register handlers
wsClient.onConnection(ConnectionEventType.Connected, onConnected);
wsClient.onConnection(ConnectionEventType.Disconnected, onDisconnect);
// Later, remove specific handlers
wsClient.offConnection(ConnectionEventType.Connected, onConnected);
// Or remove all handlers for a specific event type
wsClient.offAllConnections(ConnectionEventType.Disconnected);
// Or remove all connection event handlers
wsClient.offAllConnectionEvents();
// The returned function approach still works too
const removeHandler = wsClient.onConnection(ConnectionEventType.Error, (event) => {
console.error('Connection error:', event.data);
});
// Later
removeHandler(); // This will remove the handler
```
Connection events can be especially useful for:
- Subscribing to topics when the connection is established
- Displaying connection status to users
- Implementing custom reconnection logic
- Cleaning up resources on disconnection
```typescript
import { WebSocketClient, EventType } from '@saturnbtcio/indexer-sdk';
async function main() {
// Initialize client
const wsClient = new WebSocketClient({
url: 'https://api.example.com/ws',
});
// Connect and subscribe
await wsClient.connect();
// Subscribe to swap events with a filter
await wsClient.subscribeWithFilter(EventType.Swap, {
assetPair: 'ETH/USDC',
});
// Register event handler
wsClient.on(EventType.Swap, (swapEvent) => {
console.log(
`Swap at ${swapEvent.createdAt}: ${swapEvent.amountIn} ${swapEvent.assetPair.base} → ${swapEvent.amountOut} ${swapEvent.assetPair.quote}`,
);
});
// Keep connection alive for this example
console.log('Listening for events. Press Ctrl+C to exit.');
}
main().catch(console.error);
```