0.1.3 โข Published 8 months ago
hooktuah v0.1.3
๐ช HookTuah
"Forward to that thang~!"
I was building a price tracking service, Some services I was using did not offer webhooks as a feature, And some did not have a Websocket connection, This library allows you to turn any event source and post it to a webhook endpoint.
๐ Features
- ๐ก Multiple event source types supported:
- WebSocket connections
- HTTP polling with customizable intervals
- Custom event streams
- ๐ Automatic retry mechanisms for connection failures
- ๐ฏ Event transformation and filtering
- ๐ช Type-safe with full TypeScript support
- ๐งช Comprehensive test coverage
- ๐ Easy to integrate with existing systems
๐ฆ Installation
# Using npm
npm install hooktuah
# Using yarn
yarn add hooktuah
# Using bun
bun add hooktuah
๐ Quick Start
import { EventForwarder } from 'hooktuah';
// Create a new forwarder instance
const forwarder = new EventForwarder<RequestType, InputType, OutputType>();
// Subscribe to events
forwarder.subscribe('my-source', {
type: 'websocket',
sourceUrl: 'wss://my-source.com/events',
webhookUrl: 'https://my-webhook.com/endpoint',
transform: (data) => {
// Transform your data before forwarding
return transformedData;
}
});
๐ Usage Examples
WebSocket Source
const forwarder = new EventForwarder<void, SensorData, TransformedData>();
forwarder.subscribe('sensor-stream', {
type: 'websocket',
sourceUrl: 'wss://sensors.example.com/stream',
webhookUrl: 'https://api.example.com/webhook',
transform: (data) => ({
id: data.deviceId,
tempCelsius: data.temperature,
tempFahrenheit: (data.temperature * 9) / 5 + 32,
readingTime: new Date(data.timestamp).toISOString()
})
});
HTTP Polling
forwarder.subscribe('api-poll', {
type: 'polling',
sourceUrl: 'https://api.example.com/data',
webhookUrl: 'https://webhook.site/your-endpoint',
pollInterval: 5000, // 5 seconds
shouldFetch: async () => {
// Conditionally fetch based on your requirements
return true;
}
});
Custom Event Stream
forwarder.subscribe('custom-source', {
type: 'custom',
webhookUrl: 'https://your-webhook.com/endpoint',
createStream: async () => {
return new Observable((subscriber) => {
// Your custom event source logic here
return () => {
// Cleanup logic
};
});
}
});
๐ง Configuration Options
The ForwarderConfig
interface supports the following options:
type
: 'websocket' | 'polling' | 'custom'sourceUrl
: URL for the event sourcewebhookUrl
: Destination webhook URLtransform
: Optional data transformation functionpollInterval
: Required for polling sourcesshouldFetch
: Optional condition for processing eventsrequestConfig
: Optional HTTP request configurationcreateStream
: Required for custom sources
๐งช Testing
# Run tests
bun test
# Run tests with coverage
bun test --coverage
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature
) - Commit your changes (
git commit -m 'Add some AmazingFeature'
) - Push to the branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- Built with RxJS
- Tested with Bun
- Inspired by the need for robust event forwarding in modern applications
Made with โค๏ธ by Bewinxed
Don't forget to give this project a โญ if you found it helpful!