npm package: @occupop/lib-queue
Description: This package is intended to be used with `@occupop/lib-container` providing queue consumer/publisher through AWS SQS/SNS clients.
Latest version: 1.0.4

# Package @occupop/lib-queue

This package is intended to be used with `@occupop/lib-container` 
providing queue consumer/publisher through AWS SQS/SNS clients.

This implementation refers to:
- https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sqs
- https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/javascript_sqs_code_examples.html
- https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns
- https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/javascript_sns_code_examples.html

### *NPM registry token required!*

## Install
```bash
# Yarn
yarn add @occupop/lib-queue

# NPM
npm install @occupop/lib-queue

# Bun
bun add @occupop/lib-queue
```

## Env Setup
ENV variables required
```dotenv
AWS_ENDPOINT=http://localstack:4566
AWS_REGION=eu-west-1
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...

AWS_SQS_QUEUE_URL=http://localstack:4566/000000000000/queue-name-here
AWS_SNS_TOPIC_ARN=arn:aws:sns:eu-west-1:000000000000:topic-name-here
```

## Register

```typescript
import { makeQueueService, makeSqsClient, makeSnsClient } from '@occupop/lib-queue'
import { eventContainer } from '.event-container'
//... all other imports omited... 

export const container = createTypedContainer({
    // ...
    // queue service:
    queueService: { asFunction: makeQueueService, singleton: true },
    // optional:
    eventContainer: { asValue: eventContainer },
    sqsClient: { asFunction: makeSqsClient, singleton: true },
    snsClient: { asFunction: makeSnsClient, singleton: true },
    // ...
})

```
- `eventContainer` can be provided direct on consumer call.
- `sqsClient`/`snsClient` is to be registered only if you need some kind of custom implementation.


## Usage  (worker)

```typescript
// worker.ts
import { container } from '.container'
import { eventContainer } from '.event-container'

const { mongoClient, queueService } = container.cradle

await mongoClient.connect()
console.log('Mongo connected')

// providing eventContainer...
await queueService.consume({ eventContainer })
console.log('Queue consuming')

// ... or without, if you register on main container!
// await queueService.consume()
// console.log('Queue consuming')
```

## Usage  (eventContainer simple implementation)

```typescript
// event-container.ts
import type { QueueEventContainer, QueueEvent } from '@occupop/lib-queue'

export const eventContainer = {
    Event_name_here: (event: QueueEvent) => {
        // ... handler implementation
    },
    Another_event_there: (event: QueueEvent) => {
        // ... handler implementation
    }
}
```

## Usage  (eventContainer with dependency injection, `recomended`)

```typescript
// event-container.ts
import { container } from '.container'
import type { QueueEventContainer, QueueEvent } from '@occupop/lib-queue'
import { createTypedContainerScope } from '@occupop/lib-container'

export const eventContainer = createTypedContainerScope(container, {
    Event_name_here: { asFunction: makeEventNameHandler },
    Another_event_there: { asFunction: makeAnotherEventHandler },
    Another_event_alike: { asFunction: makeAnotherEventHandler },
}).cradle
```
#### Sample event handler

```typescript
// event-name-handler.ts
import type { Deps } from '.container'
import { QueueEvent } from "@occupop/lib-queue";

interface CustomEventName extends QueueEvent {
    customAttribute: string
    randomEntity: {
        uuid: string
        someOtherAttribute: string
        maybeAnOptionalOne?: boolean
    }
}

export const makeEventNameHandler = ({ fooService, barService }: Deps) => {
    (event: CustomEventName) => {
        // implementation that depends on fooService and barService...
    }
}
```