rangler-js
v0.1.4
Published
Node.js SDK for the Rangler API.
Maintainers
Readme
Rangler JavaScript SDK
Node.js SDK for the Rangler API, modeled after the Stripe Node SDK style:
const rangler = Rangler('rgl_test_...')ornew Rangler('rgl_test_...')- promise-returning resource methods
- per-request options as the second argument
rangler.webhooks.constructEvent(...)requestandresponseevents- TypeScript declarations included
Installation
npm install rangler-jsUsage
const Rangler = require('rangler-js');
const rangler = Rangler('rgl_test_your_api_key', {
environment: 'sandbox',
});
const companies = await rangler.companies.list({ limit: 25 });
const filing = await rangler.filings.retrieve('filing_123');With ESM:
import Rangler from 'rangler-js';
const rangler = new Rangler(process.env.RANGLER_API_KEY, {
environment: 'sandbox',
});Connect
const linkToken = await rangler.connect.createLinkToken(
{
clientUserId: 'customer_123',
allowedOrigins: ['https://app.example.com'],
products: ['accounts', 'positions', 'transactions'],
},
{
idempotencyKey: 'customer_123-connect-link',
}
);
const connections = await rangler.connect.listConnections({
clientUserId: 'customer_123',
});
const portfolio = await rangler.connect.getPortfolio({
clientUserId: 'customer_123',
});Events
const page = await rangler.events.list({
eventTypes: ['filing.new'],
limit: 100,
});
for (const event of page.data) {
console.log(event.id, event.type, event.occurredAt);
}Event list promises support Stripe-style auto-pagination:
await rangler.events
.list({ eventTypes: ['filing.new'], limit: 100 })
.autoPagingEach((event) => {
console.log(event.id);
});
for await (const event of rangler.events.list({ limit: 100 })) {
console.log(event.id);
}Webhooks
Pass the raw request body exactly as received.
const event = rangler.webhooks.constructEvent(
rawBody,
headers,
process.env.RANGLER_WEBHOOK_SECRET
);
console.log(event.type, event.resource && event.resource.id);With Express:
app.post('/rangler/webhooks', express.raw({ type: 'application/json' }), (req, res) => {
try {
const event = rangler.webhooks.constructEvent(
req.body,
req.headers,
process.env.RANGLER_WEBHOOK_SECRET
);
res.json({ received: event.id });
} catch (err) {
res.status(400).json({ error: err.message });
}
});Request Options
Like Stripe, request options are the second argument:
await rangler.connect.createLinkToken(
{
clientUserId: 'customer_123',
allowedOrigins: ['https://app.example.com'],
},
{
idempotencyKey: 'link-token-123',
timeout: 1000,
}
);Request Events
rangler.on('request', (request) => {
console.log(request.method, request.path);
});
rangler.on('response', (response) => {
console.log(response.status, response.elapsed);
});Optional Polling Utility
For cursor-based event consumption, the SDK includes a small polling helper. Resource methods are still the primary SDK surface.
const store = new Rangler.InMemoryCursorStore();
const consumer = new Rangler.PollingConsumer(rangler.events, {
cursorStore: store,
stream: 'market-wide-filings',
});
const events = await consumer.poll({
eventTypes: ['filing.new'],
limit: 100,
});