# google-cloud-pubsub
A thin wrapper around Google Cloud Pub/Sub for Haskell.
## Features
### Topic Operations
- Create topics
- Delete topics
- Publish messages to topics
### Subscription Operations
- Create subscriptions
- Delete subscriptions
- Acknowledge messages
- Modify acknowledgment deadlines
- Pull messages from subscriptions
## Installation
- Cabal: add to your `.cabal`
- `build-depends: google-cloud-pubsub == 1.1.0.0`
- Stack: add to your `package.yaml`
- `dependencies: - google-cloud-pubsub == 1.1.0.0`
This package depends on `google-cloud-common` for authentication and HTTP helpers.
## Usage
### Topic Operations
```haskell
import Google.Cloud.PubSub.Topic
-- Create a topic
result <- createTopic "my-project" "my-topic"
case result of
Left err -> putStrLn $ "Error: " ++ err
Right topic -> print topic
-- Publish a message
let message = Message "Hello World" Nothing Nothing
publishResult <- publishMessage "my-project" "my-topic" [message]
case publishResult of
Left err -> putStrLn $ "Error: " ++ err
Right response -> print $ messageIds response
-- Delete a topic
deleteResult <- deleteTopic "my-project" "my-topic"
case deleteResult of
Left err -> putStrLn $ "Error: " ++ err
Right _ -> putStrLn "Topic deleted successfully"
```
### Subscription Operations
```haskell
import Google.Cloud.PubSub.Subscription
-- Create a subscription
let config = SubscriptionConfig
{ topic = "projects/my-project/topics/my-topic"
, pushConfig = Nothing
, ackDeadlineSeconds = 600
, retainAckedMessages = False
, messageRetentionDuration = Nothing
, labels = Nothing
, enableMessageOrdering = False
, expirationPolicy = Nothing
, filter = Nothing
, deadLetterPolicy = Nothing
, retryPolicy = Nothing
, enableExactlyOnceDelivery = Nothing
}
createResult <- createSubscription "my-project" "my-subscription" config
case createResult of
Left err -> putStrLn $ "Error: " ++ err
Right subscription -> print subscription
-- Pull messages
pullResult <- pullMessages "my-project" "my-subscription" 10
case pullResult of
Left err -> putStrLn $ "Error: " ++ err
Right response -> do
mapM_ print $ receivedMessages response
-- Acknowledge messages
let ackIds = map ackId $ receivedMessages response
ackResult <- acknowledgeMessages "my-project" "my-subscription" ackIds
case ackResult of
Left err -> putStrLn $ "Ack error: " ++ err
Right _ -> putStrLn "Messages acknowledged"
-- Delete a subscription
deleteResult <- deleteSubscription "my-project" "my-subscription"
case deleteResult of
Left err -> putStrLn $ "Error: " ++ err
Right _ -> putStrLn "Subscription deleted successfully"
```
## Authentication
Authentication is handled by `google-cloud-common` and follows this order:
1. If `GOOGLE_APPLICATION_CREDENTIALS` is set, a Service Account JSON is used to
create a signed JWT which is exchanged for an access token.
2. Otherwise, the Compute metadata server is used (suitable for GCE/GKE).
## Dependencies
- `google-cloud-common` - Common functionality for Google Cloud libraries
## License
MIT © Contributors