{"_id":"@btzone/sqs-consumer","name":"@btzone/sqs-consumer","dist-tags":{"latest":"5.8.0"},"versions":{"5.8.0":{"name":"@btzone/sqs-consumer","version":"5.8.0","description":"Build SQS-based Node applications without the boilerplate","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"npm run clean && tsc","watch":"tsc --watch","clean":"npx rimraf dist/*","prepublish":"npm run build","pretest":"npm run build","test":"mocha --recursive --full-trace --exit","coverage":"nyc mocha && nyc report --reporter=html && nyc report --reporter=json-summary","lcov":"nyc mocha && nyc report --reporter=lcov","lint":"eslint . --ext .ts","lint:fix":"eslint . --fix","format":"prettier --loglevel warn --write \"**/*.{js,json,jsx,md,ts,tsx,html}\"","format:check":"prettier --check \"**/*.{js,json,jsx,md,ts,tsx,html}\"","posttest":"npm run lint && npm run format:check"},"repository":{"type":"git","url":"git+https://github.com/BBC/sqs-consumer.git"},"bugs":{"url":"https://github.com/BBC/sqs-consumer/issues"},"homepage":"https://github.com/BBC/sqs-consumer","keywords":["sqs","queue","consumer"],"license":"Apache-2.0","devDependencies":{"@types/chai":"^4.3.4","@types/debug":"^4.1.7","@types/mocha":"^10.0.1","@types/node":"^16.18.7","@types/sinon":"^10.0.13","chai":"^4.3.7","eslint":"^8.29.0","eslint-config-iplayer-ts":"^4.1.0","eslint-config-prettier":"^4.3.0","mocha":"^10.1.0","nyc":"^15.1.0","p-event":"^4.2.0","prettier":"^2.8.1","sinon":"^15.0.0","ts-node":"^10.9.1","typescript":"^4.9.4"},"dependencies":{"aws-sdk":"^2.1271.0","debug":"^4.3.4"},"peerDependencies":{"aws-sdk":"^2.1271.0"},"mocha":{"spec":"test/**/**/*.test.ts","require":"ts-node/register"},"nyc":{"include":["src/**/*.ts"],"extension":[".ts"],"require":["ts-node/register"],"sourceMap":true,"instrument":true},"eslintConfig":{"extends":["iplayer-ts","prettier","prettier/react","prettier/@typescript-eslint"],"parserOptions":{"sourceType":"module"},"rules":{"@typescript-eslint/naming-convention":["error",{"selector":"variable","format":["camelCase","UPPER_CASE","PascalCase"],"leadingUnderscore":"allow"}]}},"_id":"@btzone/sqs-consumer@5.8.0","_nodeVersion":"18.10.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-4E617uB77KsDAWGXquXhhYrHPLUGPR6c8uE+8NngAQ9eYh3x/vp3uqg+M8bNccIxbXlGX3JHYcCpOHsOn+SZbg==","shasum":"5477213a8767d88f6a38d6b10309ad64fe229338","tarball":"https://registry.npmjs.org/@btzone/sqs-consumer/-/sqs-consumer-5.8.0.tgz","fileCount":20,"unpackedSize":68899,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD0CK/VjKuT8SGHG4WLLkE6yjVuxVlD9HeVGjcMzeDzQgIhAPUQJS+JbD/u7kwB2lM0jIls1pWqItDjCb3DMlhQP2Ys"}]},"_npmUser":{"name":"btzone","email":"dev@leadprofit.com"},"directories":{},"maintainers":[{"name":"btzone","email":"dev@leadprofit.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sqs-consumer_5.8.0_1687249845921_0.1842156452596444"},"_hasShrinkwrap":false}},"time":{"created":"2023-06-20T08:30:45.861Z","5.8.0":"2023-06-20T08:30:46.058Z","modified":"2023-06-20T08:30:46.239Z"},"maintainers":[{"name":"btzone","email":"dev@leadprofit.com"}],"description":"Build SQS-based Node applications without the boilerplate","homepage":"https://github.com/BBC/sqs-consumer","keywords":["sqs","queue","consumer"],"repository":{"type":"git","url":"git+https://github.com/BBC/sqs-consumer.git"},"bugs":{"url":"https://github.com/BBC/sqs-consumer/issues"},"license":"Apache-2.0","readme":"# sqs-consumer\n\n[![NPM downloads](https://img.shields.io/npm/dm/sqs-consumer.svg?style=flat)](https://npmjs.org/package/sqs-consumer)\n[![Build Status](https://github.com/bbc/sqs-consumer/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/bbc/sqs-consumer/actions/workflows/test.yml)\n[![Code Climate](https://codeclimate.com/github/BBC/sqs-consumer/badges/gpa.svg)](https://codeclimate.com/github/BBC/sqs-consumer)\n[![Test Coverage](https://codeclimate.com/github/BBC/sqs-consumer/badges/coverage.svg)](https://codeclimate.com/github/BBC/sqs-consumer)\n\nBuild SQS-based applications without the boilerplate. Just define an async function that handles the SQS message processing.\n\n## Installation\n\n```bash\nnpm install sqs-consumer --save-dev\n```\n\n## Usage\n\n```js\nconst { Consumer } = require('sqs-consumer');\n\nconst app = Consumer.create({\n  queueUrl: 'https://sqs.eu-west-1.amazonaws.com/account-id/queue-name',\n  handleMessage: async (message) => {\n    // do some work with `message`\n  }\n});\n\napp.on('error', (err) => {\n  console.error(err.message);\n});\n\napp.on('processing_error', (err) => {\n  console.error(err.message);\n});\n\napp.start();\n```\n\n- The queue is polled continuously for messages using [long polling](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html).\n- Messages are deleted from the queue once the handler function has completed successfully.\n- Throwing an error (or returning a rejected promise) from the handler function will cause the message to be left on the queue. An [SQS redrive policy](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSDeadLetterQueue.html) can be used to move messages that cannot be processed to a dead letter queue.\n- By default messages are processed one at a time – a new message won't be received until the first one has been processed. To process messages in parallel, use the `batchSize` option [detailed below](#options).\n- By default, the default Node.js HTTP/HTTPS SQS agent creates a new TCP connection for every new request ([AWS SQS documentation](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html)). To avoid the cost of establishing a new connection, you can reuse an existing connection by passing a new SQS instance with `keepAlive: true`.\n\n```js\nconst { Consumer } = require('sqs-consumer');\nconst AWS = require('aws-sdk');\nconst https = require('https');\n\nconst app = Consumer.create({\n  queueUrl: 'https://sqs.eu-west-1.amazonaws.com/account-id/queue-name',\n  handleMessage: async (message) => {\n    // do some work with `message`\n  },\n  sqs: new AWS.SQS({\n    httpOptions: {\n      agent: new https.Agent({\n        keepAlive: true\n      })\n    }\n  })\n});\n\napp.on('error', (err) => {\n  console.error(err.message);\n});\n\napp.on('processing_error', (err) => {\n  console.error(err.message);\n});\n\napp.start();\n```\n\n### Credentials\n\nBy default the consumer will look for AWS credentials in the places [specified by the AWS SDK](http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html#Setting_AWS_Credentials). The simplest option is to export your credentials as environment variables:\n\n```bash\nexport AWS_SECRET_ACCESS_KEY=...\nexport AWS_ACCESS_KEY_ID=...\n```\n\nIf you need to specify your credentials manually, you can use a pre-configured instance of the [AWS SQS](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html) client:\n\n```js\nconst { Consumer } = require('sqs-consumer');\nconst AWS = require('aws-sdk');\n\nAWS.config.update({\n  region: 'eu-west-1',\n  accessKeyId: '...',\n  secretAccessKey: '...'\n});\n\nconst app = Consumer.create({\n  queueUrl: 'https://sqs.eu-west-1.amazonaws.com/account-id/queue-name',\n  handleMessage: async (message) => {\n    // ...\n  },\n  sqs: new AWS.SQS()\n});\n\napp.on('error', (err) => {\n  console.error(err.message);\n});\n\napp.on('processing_error', (err) => {\n  console.error(err.message);\n});\n\napp.on('timeout_error', (err) => {\n  console.error(err.message);\n});\n\napp.start();\n```\n\n## API\n\n### `Consumer.create(options)`\n\nCreates a new SQS consumer.\n\n#### Options\n\n- `queueUrl` - _String_ - The SQS queue URL\n- `region` - _String_ - The AWS region (default `eu-west-1`)\n- `handleMessage` - _Function_ - An `async` function (or function that returns a `Promise`) to be called whenever a message is received. Receives an SQS message object as it's first argument.\n- `handleMessageBatch` - _Function_ - An `async` function (or function that returns a `Promise`) to be called whenever a batch of messages is received. Similar to `handleMessage` but will receive the list of messages, not each message individually. **If both are set, `handleMessageBatch` overrides `handleMessage`**.\n- `handleMessageTimeout` - _Number_ - Time in ms to wait for `handleMessage` to process a message before timing out. Emits `timeout_error` on timeout. By default, if `handleMessage` times out, the unprocessed message returns to the end of the queue.\n- `attributeNames` - _Array_ - List of queue attributes to retrieve (i.e. `['All', 'ApproximateFirstReceiveTimestamp', 'ApproximateReceiveCount']`).\n- `messageAttributeNames` - _Array_ - List of message attributes to retrieve (i.e. `['name', 'address']`).\n- `batchSize` - _Number_ - The number of messages to request from SQS when polling (default `1`). This cannot be higher than the AWS limit of 10.\n- `visibilityTimeout` - _Number_ - The duration (in seconds) that the received messages are hidden from subsequent retrieve requests after being retrieved by a ReceiveMessage request.\n- `heartbeatInterval` - _Number_ - The interval (in seconds) between requests to extend the message visibility timeout. On each heartbeat the visibility is extended by adding `visibilityTimeout` to the number of seconds since the start of the handler function. This value must less than `visibilityTimeout`.\n- `terminateVisibilityTimeout` - _Boolean_ - If true, sets the message visibility timeout to 0 after a `processing_error` (defaults to `false`).\n- `waitTimeSeconds` - _Number_ - The duration (in seconds) for which the call will wait for a message to arrive in the queue before returning (defaults to `20`).\n- `authenticationErrorTimeout` - _Number_ - The duration (in milliseconds) to wait before retrying after an authentication error (defaults to `10000`).\n- `pollingWaitTimeMs` - _Number_ - The duration (in milliseconds) to wait before repolling the queue (defaults to `0`).\n- `sqs` - _Object_ - An optional [AWS SQS](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html) object to use if you need to configure the client manually\n- `shouldDeleteMessages` - _Boolean_ - Default to `true`, if you don't want the package to delete messages from sqs set this to `false`\n\n### `consumer.start()`\n\nStart polling the queue for messages.\n\n### `consumer.stop()`\n\nStop polling the queue for messages.\n\n### `consumer.isRunning`\n\nReturns the current polling state of the consumer: `true` if it is actively polling, `false` if it is not.\n\n### Events\n\nEach consumer is an [`EventEmitter`](http://nodejs.org/api/events.html) and emits the following events:\n\n| Event                | Params             | Description                                                                                                                     |\n| -------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------- |\n| `error`              | `err`, `[message]` | Fired when an error occurs interacting with the queue. If the error correlates to a message, that message is included in Params |\n| `processing_error`   | `err`, `message`   | Fired when an error occurs processing the message.                                                                              |\n| `timeout_error`      | `err`, `message`   | Fired when `handleMessageTimeout` is supplied as an option and if `handleMessage` times out.                                    |\n| `message_received`   | `message`          | Fired when a message is received.                                                                                               |\n| `message_processed`  | `message`          | Fired when a message is successfully processed and removed from the queue.                                                      |\n| `response_processed` | None               | Fired after one batch of items (up to `batchSize`) has been successfully processed.                                             |\n| `stopped`            | None               | Fired when the consumer finally stops its work.                                                                                 |\n| `empty`              | None               | Fired when the queue is empty (All messages have been consumed).                                                                |\n\n### AWS IAM Permissions\n\nConsumer will receive and delete messages from the SQS queue. Ensure `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:DeleteMessageBatch`, `sqs:ChangeMessageVisibility` and `sqs:ChangeMessageVisibilityBatch` access is granted on the queue being consumed.\n\n### Contributing\n\nSee contributing [guidelines](https://github.com/bbc/sqs-consumer/blob/main/.github/CONTRIBUTING.md).\n","readmeFilename":"README.md"}