{"_id":"@castore/event-bridge-s3-message-bus-adapter","_rev":"3-75cd93e64066de94bfea304e07497952","name":"@castore/event-bridge-s3-message-bus-adapter","dist-tags":{"latest":"1.25.3"},"versions":{"1.25.0":{"name":"@castore/event-bridge-s3-message-bus-adapter","description":"DRY Castore MessageBus definition using AWS EventBridge and S3","license":"MIT","homepage":"https://github.com/theodo/castore#readme","bugs":{"url":"https://github.com/theodo/castore/issues"},"repository":{"type":"git","url":"git+https://github.com/theodo/castore.git"},"keywords":["event","source","store","typescript"],"publishConfig":{"access":"public"},"sideEffects":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/types/index.d.ts","scripts":{"lint-fix":"yarn linter-base-config --fix","lint-fix-all":"yarn lint-fix .","linter-base-config":"eslint --ext=js,ts","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","test-circular":"yarn depcruise --validate dependency-cruiser.js .","test-linter":"yarn linter-base-config .","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'"},"dependencies":{"@castore/event-bridge-message-bus-adapter":"1.25.0","@types/aws-lambda":"^8.10.111","lodash.chunk":"^4.2.0","ts-toolbelt":"^9.6.0","undici":"^5.23.0"},"devDependencies":{"@aws-sdk/client-eventbridge":"^3.2.0","@aws-sdk/client-s3":"^3.2.0","@aws-sdk/s3-request-presigner":"^3.2.0","@babel/cli":"^7.17.6","@babel/core":"^7.17.9","@babel/plugin-transform-runtime":"^7.17.0","@babel/preset-env":"^7.16.11","@babel/preset-typescript":"^7.16.7","@castore/core":"workspace:","@types/lodash.chunk":"^4.2.7","@types/node":"^17.0.29","aws-sdk-client-mock":"^2.1.0","babel-plugin-module-resolver":"^4.1.0","concurrently":"^7.1.0","dependency-cruiser":"^11.7.0","eslint":"^8.14.0","prettier":"^2.6.2","ts-node":"^10.7.0","tsc-alias":"^1.8.7","typescript":"^4.6.3","vitest":"^0.26.2"},"maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"nx":{"targets":{"package":{"outputs":["packages/event-bridge-s3-message-bus-adapter/dist"]}}},"peerDependencies":{"@aws-sdk/client-eventbridge":"^3.0.0","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0","@castore/core":"^v1.25.0.0.0"},"version":"1.25.0","gitHead":"725dbe37774dba863a1406e5ba0de6c8aa3c499e","_id":"@castore/event-bridge-s3-message-bus-adapter@1.25.0","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-a2t7gU2lA5l84EgVaUcdoh7kc2RwVS5Ln+viOuYCQ13pjxyP6tKILoSCcyx8Co8+LtfMVEw0fsVh0G/Ttu+QUA==","shasum":"50c246158979557111ce49a817344e252a55b7f8","tarball":"https://registry.npmjs.org/@castore/event-bridge-s3-message-bus-adapter/-/event-bridge-s3-message-bus-adapter-1.25.0.tgz","fileCount":37,"unpackedSize":267190,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDIX1VhKaE6maTMOGa4yWPeZe9Vi6opN+Im4M8+SdAjcAiBcLUPkIrfyhxZzY8COJK2kbibgqejCRppiQ8amG1Ck1w=="}]},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/event-bridge-s3-message-bus-adapter_1.25.0_1693064418847_0.5299939449933058"},"_hasShrinkwrap":false},"1.25.1":{"name":"@castore/event-bridge-s3-message-bus-adapter","description":"DRY Castore MessageBus definition using AWS EventBridge and S3","license":"MIT","homepage":"https://github.com/theodo/castore#readme","bugs":{"url":"https://github.com/theodo/castore/issues"},"repository":{"type":"git","url":"git+https://github.com/theodo/castore.git"},"keywords":["event","source","store","typescript"],"publishConfig":{"access":"public"},"sideEffects":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/types/index.d.ts","scripts":{"lint-fix":"yarn linter-base-config --fix","lint-fix-all":"yarn lint-fix .","linter-base-config":"eslint --ext=js,ts","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","test-circular":"yarn depcruise --validate dependency-cruiser.js .","test-linter":"yarn linter-base-config .","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'"},"dependencies":{"@castore/event-bridge-message-bus-adapter":"1.25.1","@types/aws-lambda":"^8.10.111","lodash.chunk":"^4.2.0","ts-toolbelt":"^9.6.0","undici":"^5.23.0"},"devDependencies":{"@aws-sdk/client-eventbridge":"^3.2.0","@aws-sdk/client-s3":"^3.2.0","@aws-sdk/s3-request-presigner":"^3.2.0","@babel/cli":"^7.17.6","@babel/core":"^7.17.9","@babel/plugin-transform-runtime":"^7.17.0","@babel/preset-env":"^7.16.11","@babel/preset-typescript":"^7.16.7","@castore/core":"workspace:","@types/lodash.chunk":"^4.2.7","@types/node":"^17.0.29","aws-sdk-client-mock":"^2.1.0","babel-plugin-module-resolver":"^4.1.0","concurrently":"^7.1.0","dependency-cruiser":"^11.7.0","eslint":"^8.14.0","prettier":"^2.6.2","ts-node":"^10.7.0","tsc-alias":"^1.8.7","typescript":"^4.6.3","vitest":"^0.26.2"},"maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"nx":{"targets":{"package":{"outputs":["packages/event-bridge-s3-message-bus-adapter/dist"]}}},"peerDependencies":{"@aws-sdk/client-eventbridge":"^3.0.0","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0","@castore/core":"^v1.25.1.0.0"},"version":"1.25.1","gitHead":"be8529d3653e52b05e0aa6127a14267be54e0a8f","_id":"@castore/event-bridge-s3-message-bus-adapter@1.25.1","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-l6V30F4JGim6+K2ATh3DD+OI433dST52PtqeG7rh/6rKa0iDwmOmGboGWN7NIbI5u+ojUbYngJPJarTKbjhOqA==","shasum":"4360f810c18733121c463b712aff2e70e09f125f","tarball":"https://registry.npmjs.org/@castore/event-bridge-s3-message-bus-adapter/-/event-bridge-s3-message-bus-adapter-1.25.1.tgz","fileCount":37,"unpackedSize":267258,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDh1sWsIluyiKfZLE0cb6C8eKg4zMNBHSVfAYhBbusIkQIgbcniKXnZwqaQkUROHrYT2Rjhfa7kzyzubVKXCFxr0gI="}]},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/event-bridge-s3-message-bus-adapter_1.25.1_1693318085638_0.30444198336686923"},"_hasShrinkwrap":false},"1.25.2":{"name":"@castore/event-bridge-s3-message-bus-adapter","description":"DRY Castore MessageBus definition using AWS EventBridge and S3","license":"MIT","homepage":"https://github.com/theodo/castore#readme","bugs":{"url":"https://github.com/theodo/castore/issues"},"repository":{"type":"git","url":"git+https://github.com/theodo/castore.git"},"keywords":["event","source","store","typescript"],"publishConfig":{"access":"public"},"sideEffects":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/types/index.d.ts","scripts":{"lint-fix":"yarn linter-base-config --fix","lint-fix-all":"yarn lint-fix .","linter-base-config":"eslint --ext=js,ts","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","test-circular":"yarn depcruise --validate dependency-cruiser.js .","test-linter":"yarn linter-base-config .","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'"},"dependencies":{"@castore/event-bridge-message-bus-adapter":"1.25.2","@types/aws-lambda":"^8.10.111","lodash.chunk":"^4.2.0","ts-toolbelt":"^9.6.0","undici":"^5.23.0"},"devDependencies":{"@aws-sdk/client-eventbridge":"^3.2.0","@aws-sdk/client-s3":"^3.2.0","@aws-sdk/s3-request-presigner":"^3.2.0","@babel/cli":"^7.17.6","@babel/core":"^7.17.9","@babel/plugin-transform-runtime":"^7.17.0","@babel/preset-env":"^7.16.11","@babel/preset-typescript":"^7.16.7","@castore/core":"workspace:","@types/lodash.chunk":"^4.2.7","@types/node":"^17.0.29","aws-sdk-client-mock":"^2.1.0","babel-plugin-module-resolver":"^4.1.0","concurrently":"^7.1.0","dependency-cruiser":"^11.7.0","eslint":"^8.14.0","prettier":"^2.6.2","ts-node":"^10.7.0","tsc-alias":"^1.8.7","typescript":"^4.6.3","vitest":"^0.26.2"},"maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"nx":{"targets":{"package":{"outputs":["packages/event-bridge-s3-message-bus-adapter/dist"]}}},"peerDependencies":{"@aws-sdk/client-eventbridge":"^3.0.0","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0","@castore/core":"^1.0.0"},"version":"1.25.2","gitHead":"4e5b563eb3b5e89bf2e2364c29c879d46c94382f","_id":"@castore/event-bridge-s3-message-bus-adapter@1.25.2","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-oFgI45nORkgfFpP01i7qChMDbM09enh692mtwK12u+wb3dUhIXe9xHpPzw7P6p7PhQ6HQYICo7BtJkTr0Sm45g==","shasum":"1991834e13e481818656af627f3f648c25d2c833","tarball":"https://registry.npmjs.org/@castore/event-bridge-s3-message-bus-adapter/-/event-bridge-s3-message-bus-adapter-1.25.2.tgz","fileCount":37,"unpackedSize":267252,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEMdQ9WgOFvqsItbfhzl4KoSHXlRm5SS6g3ADuR2EWprAiEAx6KFrLu+DPsZp0IbXwF4r/P1zvy3iMrusw1fzq9JFWI="}]},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/event-bridge-s3-message-bus-adapter_1.25.2_1693578452216_0.1310825240261626"},"_hasShrinkwrap":false},"1.25.3":{"name":"@castore/event-bridge-s3-message-bus-adapter","description":"DRY Castore MessageBus definition using AWS EventBridge and S3","license":"MIT","homepage":"https://github.com/theodo/castore#readme","bugs":{"url":"https://github.com/theodo/castore/issues"},"repository":{"type":"git","url":"git+https://github.com/theodo/castore.git"},"keywords":["event","source","store","typescript"],"publishConfig":{"access":"public"},"sideEffects":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/types/index.d.ts","scripts":{"lint-fix":"yarn linter-base-config --fix","lint-fix-all":"yarn lint-fix .","linter-base-config":"eslint --ext=js,ts","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","test-circular":"yarn depcruise --validate dependency-cruiser.js .","test-linter":"yarn linter-base-config .","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'"},"dependencies":{"@castore/event-bridge-message-bus-adapter":"1.25.3","@types/aws-lambda":"^8.10.111","lodash.chunk":"^4.2.0","ts-toolbelt":"^9.6.0","undici":"^5.23.0"},"devDependencies":{"@aws-sdk/client-eventbridge":"^3.2.0","@aws-sdk/client-s3":"^3.2.0","@aws-sdk/s3-request-presigner":"^3.2.0","@babel/cli":"^7.17.6","@babel/core":"^7.17.9","@babel/plugin-transform-runtime":"^7.17.0","@babel/preset-env":"^7.16.11","@babel/preset-typescript":"^7.16.7","@castore/core":"workspace:","@types/lodash.chunk":"^4.2.7","@types/node":"^17.0.29","aws-sdk-client-mock":"^2.1.0","babel-plugin-module-resolver":"^4.1.0","concurrently":"^7.1.0","dependency-cruiser":"^11.7.0","eslint":"^8.14.0","prettier":"^2.6.2","ts-node":"^10.7.0","tsc-alias":"^1.8.7","typescript":"^4.6.3","vitest":"^0.26.2"},"maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"nx":{"targets":{"package":{"outputs":["packages/event-bridge-s3-message-bus-adapter/dist"]}}},"peerDependencies":{"@aws-sdk/client-eventbridge":"^3.0.0","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0","@castore/core":"^1.0.0"},"version":"1.25.3","_id":"@castore/event-bridge-s3-message-bus-adapter@1.25.3","gitHead":"ecd9450993bc30501e00829b033c2af980ec099d","_nodeVersion":"18.18.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-4EEm7BbYWxs17tJldLZ51zucOmtoL7fROISyTh6+qaZB6JGdUy0OsQDBGzOFEk3410mPmOX8gyBfHJvMtnrD5g==","shasum":"34ac8dc263824c49d789e608929d5ed3552ef4fc","tarball":"https://registry.npmjs.org/@castore/event-bridge-s3-message-bus-adapter/-/event-bridge-s3-message-bus-adapter-1.25.3.tgz","fileCount":37,"unpackedSize":267252,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEQy03sMmelGxrDuNWf8Dy7kUjkB/T6c5RgoIahtBz0tAiBCtQyVD9K0/Q0IbQXAWZazEX+KZxn6KjtvwIuA2g1vkw=="}]},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/event-bridge-s3-message-bus-adapter_1.25.3_1695996656151_0.5916524840181081"},"_hasShrinkwrap":false}},"time":{"created":"2023-08-26T15:40:18.753Z","1.25.0":"2023-08-26T15:40:19.139Z","modified":"2023-09-29T14:10:56.569Z","1.25.1":"2023-08-29T14:08:05.815Z","1.25.2":"2023-09-01T14:27:32.452Z","1.25.3":"2023-09-29T14:10:56.327Z"},"maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"description":"DRY Castore MessageBus definition using AWS EventBridge and S3","homepage":"https://github.com/theodo/castore#readme","keywords":["event","source","store","typescript"],"repository":{"type":"git","url":"git+https://github.com/theodo/castore.git"},"bugs":{"url":"https://github.com/theodo/castore/issues"},"license":"MIT","readme":"# EventBridge Message Bus Adapter\n\nDRY Castore [`MessageBus`](https://github.com/castore-dev/castore/#--messagebus) definition using [AWS EventBridge](https://aws.amazon.com/eventbridge/) and [AWS S3](https://aws.amazon.com/s3/).\n\nThis adapter works like the [EventBridge Message Bus Adapter](https://www.npmjs.com/package/@castore/event-bridge-message-bus-adapter) (it actually uses it under the hood), excepts that entry sizes are checked before publishing messages to EventBridge. If they are over the [256KB limit](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-putevent-size.html), they are written on a s3 bucket instead, and a message is sent containing a pre-signed URL, as [recommended by AWS](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-putevent-size.html).\n\nDo not forget to set a [lifecycle configuration](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) on your s3 bucket to delete the written objects after the presigned URL has expired to avoid high s3 bills! 🤑\n\n## 📥 Installation\n\n```bash\n# npm\nnpm install @castore/event-bridge-s3-message-bus-adapter\n\n# yarn\nyarn add @castore/event-bridge-s3-message-bus-adapter\n```\n\nThis package has `@castore/core`, `@aws-sdk/client-eventbridge` (above v3), `@aws-sdk/client-eventbridge` (above v3) and `@aws-sdk/s3-request-presigner` (above v3) as peer dependencies, so you will have to install them as well:\n\n```bash\n# npm\nnpm install @castore/core @aws-sdk/client-eventbridge @aws-sdk/client-s3 @aws-sdk/s3-request-presigner\n\n# yarn\nyarn add @castore/core @aws-sdk/client-eventbridge @aws-sdk/client-s3 @aws-sdk/s3-request-presigner\n```\n\n## 👩‍💻 Usage\n\n```ts\nimport { EventBridgeClient } from '@aws-sdk/client-eventbridge';\nimport { S3Client } from '@aws-sdk/client-s3';\n\nimport { EventBridgeS3MessageBusAdapter } from '@castore/event-bridge-s3-message-bus-adapter';\n\nconst eventBridgeClient = new EventBridgeClient({});\nconst s3Client = new S3Client({});\n\nconst messageBusAdapter = new EventBridgeS3MessageBusAdapter({\n  eventBusName: 'my-event-bus-name',\n  eventBridgeClient,\n  s3BucketName: 'my-bucket-name',\n  s3Client,\n  // 👇 Optional s3 prefix for temporary data\n  s3Prefix: 'temporary-storage/',\n  // 👇 Optional s3 presignature expiration in seconds (defaults to 900)\n  s3PreSignatureExpirationInSec: 3600\n});\n\n// 👇 Alternatively, provide a getter\nconst messageBusAdapter = new EventBridgeS3MessageBusAdapter({\n  eventBusName: () => process.env.MY_EVENT_BUS_NAME,\n  s3BucketName: () => process.env.MY_BUCKET_NAME\n  ...\n});\n\nconst appMessageBus = new NotificationMessageBus({\n  ...\n  messageBusAdapter\n})\n```\n\nThis will directly plug your MessageBus to EventBridge and S3 🙌\n\n## 🤔 How it works\n\nYou can read the [EventBridge Message Bus Adapter documentation](https://www.npmjs.com/package/@castore/event-bridge-message-bus-adapter) for regular cases.\n\nWhen an entry is oversized, its `Detail` is saved as a JSON object in the provided s3 bucket. It's key is a concatenation of the constructor `s3Prefix` option, the `eventStoreId` and `aggregateId` of the event and the current timestamp:\n\n```ts\nconst key = 'temporary-storage/POKEMONS/pikachu1/2020-01-01T00:00:00.000Z';\n```\n\nIf the event is a notification or state-carrying event, the `version` is also added to the mix:\n\n```ts\n// 👇 Date is suffixed by the version\nconst key = 'temporary-storage/POKEMONS/pikachu1/2020-01-01T00:00:00.000Z#3';\n```\n\nOn the listeners side, you can use the `EventBridgeS3MessageBusMessage` TS type to type your argument, and the `parseMessage` util to fetch the message if it has been uploaded to S3 (it passes it through otherwise):\n\n```ts\nimport {\n  EventBridgeS3MessageBusMessage,\n  parseMessage,\n} from '@castore/event-bridge-s3-message-bus-adapter';\n\nconst listener = async (\n  message: EventBridgeS3MessageBusMessage<typeof appMessageBus>,\n) => {\n  // 🙌 Correctly typed!\n  const { eventStoreId, event } = await parseMessage(message);\n};\n```\n\nNote that `parseMessage` uses `fetch` under the hood, so you will have to provide it if your version of node doesn't:\n\n```ts\nimport fetch from 'node-fetch';\n\nimport {\n  EventBridgeS3MessageBusMessage,\n  parseMessage,\n} from '@castore/event-bridge-s3-message-bus-adapter';\n\nconst listener = async (\n  message: EventBridgeS3MessageBusMessage<typeof appMessageBus>,\n) => {\n  const { eventStoreId, event } = await parseMessage(message, { fetch });\n};\n```\n\nYou can provide event store ids and event types if you listener only listens to specific event types:\n\n```ts\nimport type { EventBridgeS3MessageBusMessage } from '@castore/event-bridge-s3-message-bus-adapter';\n\nconst listener = async (\n  message: EventBridgeS3MessageBusMessage<\n    typeof appMessageBus,\n    'POKEMONS', // <= Only listen to the 'POKEMONS' event store events (optional)\n    'POKEMON_APPEARED' // <= Only listen to 'POKEMON_APPEARED' events (optional)\n  >,\n) => {\n  // 🙌 Correctly typed!\n  const { eventStoreId, event } = await parseMessage(message);\n};\n```\n\n## 🔑 IAM\n\nThe `publishMessage` method requires the `events:PutEvents` IAM permission on the provided event bus, as well as the `s3:putObject` and `s3:getObject` IAM permissions on the provided s3 bucket at the desired keys (e.g. `my-bucket-name/temporary-storage/*`).\n\nThe `parseMessage` doesn't require any permission as the messageURL is pre-signed.\n","readmeFilename":"README.md"}