{"_id":"@temporalio/external-storage-s3","_rev":"5-37782784c492f3bd1920fd8aa95afdec","name":"@temporalio/external-storage-s3","dist-tags":{"latest":"1.24.0"},"versions":{"1.21.0":{"name":"@temporalio/external-storage-s3","version":"1.21.0","keywords":["temporal","workflow","external storage","payload","s3","aws"],"author":{"name":"Temporal Technologies Inc.","email":"sdk@temporal.io"},"license":"MIT","_id":"@temporalio/external-storage-s3@1.21.0","maintainers":[{"name":"luminousmoose","email":"alex.scott.thomsen@gmail.com"},{"name":"tempbearpig","email":"roey@temporal.io"},{"name":"temporal-sdk-team","email":"sdk@temporal.io"},{"name":"alex.tideman","email":"alex.tideman@temporal.io"},{"name":"rossedfort","email":"rossedfort@gmail.com"},{"name":"laurakwhit","email":"laura.k.whitaker@gmail.com"}],"homepage":"https://github.com/temporalio/sdk-typescript/tree/main/contrib/external-storage-s3","bugs":{"url":"https://github.com/temporalio/sdk-typescript/issues"},"ava":{"timeout":"60s"},"dist":{"shasum":"e900061a321cd8db52f81a8d02c1161bf44b6bdd","tarball":"https://registry.npmjs.org/@temporalio/external-storage-s3/-/external-storage-s3-1.21.0.tgz","fileCount":15,"integrity":"sha512-rsnrzBm0YUbCz4EESnjEyDa7o0xbDah+KunwSfNLlHC9/EsmrGIGXYvc3N3I7jax5TRZdJLA1CHMSU2fj+PnYA==","signatures":[{"sig":"MEYCIQDerAtrpU8Ylwq/GWAv+eFELV9c818urrVY9yJcSA7xYwIhAN1UVF6LKcVXLM9ku7T8h1ZfZ5Ojfo3TUtrnULqkl284","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35546},"main":"lib/index.js","_from":"file:temporalio-external-storage-s3-1.21.0.tgz","types":"./lib/index.d.ts","engines":{"node":">= 20.3.0"},"scripts":{"test":"ava ./lib/__tests__/test-*.js","build":"tsc --build"},"_npmUser":{"name":"temporal-sdk-team","email":"sdk@temporal.io"},"_resolved":"/private/var/folders/nv/kfty22tn3zv_2wxtqh909xtm0000gn/T/b9c8b6e90f26dc7d26efa6bb50bfc7d3/temporalio-external-storage-s3-1.21.0.tgz","_integrity":"sha512-rsnrzBm0YUbCz4EESnjEyDa7o0xbDah+KunwSfNLlHC9/EsmrGIGXYvc3N3I7jax5TRZdJLA1CHMSU2fj+PnYA==","repository":{"url":"git+https://github.com/temporalio/sdk-typescript.git","type":"git","directory":"contrib/external-storage-s3"},"_npmVersion":"10.9.3","description":"Amazon S3 external storage driver for the Temporal TypeScript SDK","directories":{},"_nodeVersion":"22.19.0","dependencies":{"@temporalio/proto":"1.21.0","@temporalio/common":"1.21.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ava":"^5.3.1"},"_npmOperationalInternal":{"tmp":"tmp/external-storage-s3_1.21.0_1784820899067_0.13017666386591986","host":"s3://npm-registry-packages-npm-production"}},"1.21.1":{"name":"@temporalio/external-storage-s3","version":"1.21.1","keywords":["temporal","workflow","external storage","payload","s3","aws"],"author":"Temporal Technologies Inc. <sdk@temporal.io>","license":"MIT","_id":"@temporalio/external-storage-s3@1.21.1","maintainers":[{"name":"luminousmoose","email":"alex.scott.thomsen@gmail.com"},{"name":"tempbearpig","email":"roey@temporal.io"},{"name":"temporal-sdk-team","email":"sdk@temporal.io"},{"name":"alex.tideman","email":"alex.tideman@temporal.io"},{"name":"rossedfort","email":"rossedfort@gmail.com"},{"name":"laurakwhit","email":"laura.k.whitaker@gmail.com"}],"homepage":"https://github.com/temporalio/sdk-typescript/tree/main/contrib/external-storage-s3","bugs":{"url":"https://github.com/temporalio/sdk-typescript/issues"},"ava":{"timeout":"60s"},"dist":{"shasum":"657de88b5dbd189c1af6bcb5098bc950ea204ccc","tarball":"https://registry.npmjs.org/@temporalio/external-storage-s3/-/external-storage-s3-1.21.1.tgz","fileCount":15,"integrity":"sha512-5yTfv03iOTk1vYkgB8Xnx1kTNrzZ80NeiRZBWfXU7IUfpueR9/EI1ab3evf2F/YITEqujWzQMBPff25OV8tRhw==","signatures":[{"sig":"MEUCIDUKfUlHUBV49AOwPts26pvr69QBfqKhCephh42WSMyHAiEA8DwZ7u1ncsYNsgDBUqbMqylMVRx3XLcpZF/eMVy/YjY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35546},"main":"lib/index.js","types":"./lib/index.d.ts","engines":{"node":">= 20.3.0"},"scripts":{"test":"ava ./lib/__tests__/test-*.js","build":"tsc --build"},"_npmUser":{"name":"temporal-sdk-team","email":"sdk@temporal.io"},"repository":{"url":"git+https://github.com/temporalio/sdk-typescript.git","type":"git","directory":"contrib/external-storage-s3"},"description":"Amazon S3 external storage driver for the Temporal TypeScript SDK","directories":{},"_nodeVersion":"26.4.0","dependencies":{"@temporalio/proto":"1.21.1","@temporalio/common":"1.21.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ava":"^5.3.1"},"_npmOperationalInternal":{"tmp":"tmp/external-storage-s3_1.21.1_1784900515897_0.7021014372997434","host":"s3://npm-registry-packages-npm-production"}},"1.22.0":{"name":"@temporalio/external-storage-s3","version":"1.22.0","keywords":["temporal","workflow","external storage","payload","s3","aws"],"author":{"name":"Temporal Technologies Inc.","email":"sdk@temporal.io"},"license":"MIT","_id":"@temporalio/external-storage-s3@1.22.0","maintainers":[{"name":"luminousmoose","email":"alex.scott.thomsen@gmail.com"},{"name":"tempbearpig","email":"roey@temporal.io"},{"name":"temporal-sdk-team","email":"sdk@temporal.io"},{"name":"alex.tideman","email":"alex.tideman@temporal.io"},{"name":"rossedfort","email":"rossedfort@gmail.com"},{"name":"laurakwhit","email":"laura.k.whitaker@gmail.com"}],"homepage":"https://github.com/temporalio/sdk-typescript/tree/main/contrib/external-storage-s3","bugs":{"url":"https://github.com/temporalio/sdk-typescript/issues"},"ava":{"timeout":"60s"},"dist":{"shasum":"17eeac5cb0cddd845ddeb88960fcfbc354a3b3dd","tarball":"https://registry.npmjs.org/@temporalio/external-storage-s3/-/external-storage-s3-1.22.0.tgz","fileCount":15,"integrity":"sha512-CB9mC2WtRA8lm92E2FPxBBm1av0VHMr/sFncCKmHESXUfnWbEFfHTJPGKNe3z73fOGcP2H26orX844eKPo1nWQ==","signatures":[{"sig":"MEUCIQCnyvwnJ13CL0LGZlxjd0+jvDZv4j+budNhwlCUrnt1kQIgNSjVFTdpAcF4xzYcr1KumFuskNDICJR0edGSDQKCyTs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35570},"main":"lib/index.js","_from":"file:temporalio-external-storage-s3-1.22.0.tgz","types":"./lib/index.d.ts","engines":{"node":">= 20.3.0"},"scripts":{"test":"tsx ../../scripts/ava-ci.ts ./lib/__tests__/test-*.js","build":"tsc --build"},"_npmUser":{"name":"temporal-sdk-team","email":"sdk@temporal.io"},"_resolved":"/private/var/folders/nv/kfty22tn3zv_2wxtqh909xtm0000gn/T/ee01312f4a35b643697d7af645ee0ba6/temporalio-external-storage-s3-1.22.0.tgz","_integrity":"sha512-CB9mC2WtRA8lm92E2FPxBBm1av0VHMr/sFncCKmHESXUfnWbEFfHTJPGKNe3z73fOGcP2H26orX844eKPo1nWQ==","repository":{"url":"git+https://github.com/temporalio/sdk-typescript.git","type":"git","directory":"contrib/external-storage-s3"},"_npmVersion":"10.9.3","description":"Amazon S3 external storage driver for the Temporal TypeScript SDK","directories":{},"_nodeVersion":"22.19.0","dependencies":{"@temporalio/proto":"1.22.0","@temporalio/common":"1.22.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ava":"^5.3.1"},"_npmOperationalInternal":{"tmp":"tmp/external-storage-s3_1.22.0_1785940761669_0.6904680856884355","host":"s3://npm-registry-packages-npm-production"}},"1.23.0":{"name":"@temporalio/external-storage-s3","version":"1.23.0","keywords":["temporal","workflow","external storage","payload","s3","aws"],"author":"Temporal Technologies Inc. <sdk@temporal.io>","license":"MIT","_id":"@temporalio/external-storage-s3@1.23.0","maintainers":[{"name":"luminousmoose","email":"alex.scott.thomsen@gmail.com"},{"name":"tempbearpig","email":"roey@temporal.io"},{"name":"temporal-sdk-team","email":"sdk@temporal.io"},{"name":"alex.tideman","email":"alex.tideman@temporal.io"},{"name":"rossedfort","email":"rossedfort@gmail.com"},{"name":"laurakwhit","email":"laura.k.whitaker@gmail.com"}],"homepage":"https://github.com/temporalio/sdk-typescript/tree/main/contrib/external-storage-s3","bugs":{"url":"https://github.com/temporalio/sdk-typescript/issues"},"ava":{"timeout":"60s"},"dist":{"shasum":"8e642ead0a40ddc20655425005cc13bceb2a1c99","tarball":"https://registry.npmjs.org/@temporalio/external-storage-s3/-/external-storage-s3-1.23.0.tgz","fileCount":15,"integrity":"sha512-iflv+bJF/jxP7BOymCBa4TecR5lNBtCaO3EphxWoT7QyHI8dnYf63Gisv8ArFrKSwsCcJRVWQJ3rPgrWIhz40A==","signatures":[{"sig":"MEQCIAYzW+TL8BiXgsEFmr4I6LpYckXkL+kT93UetWJe7d5NAiAZGhntwR5aELAbf9qPmXA+VMhJRNP89aEkNmPHSzLgfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36195},"main":"lib/index.js","types":"./lib/index.d.ts","engines":{"node":">= 20.3.0"},"scripts":{"test":"tsx ../../scripts/ava-ci.ts ./lib/__tests__/test-*.js","build":"tsc --build"},"_npmUser":{"name":"temporal-sdk-team","email":"sdk@temporal.io"},"repository":{"url":"git+https://github.com/temporalio/sdk-typescript.git","type":"git","directory":"contrib/external-storage-s3"},"description":"Amazon S3 external storage driver for the Temporal TypeScript SDK","directories":{},"_nodeVersion":"26.4.0","dependencies":{"@temporalio/proto":"1.23.0","@temporalio/common":"1.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ava":"^5.3.1"},"_npmOperationalInternal":{"tmp":"tmp/external-storage-s3_1.23.0_1787714863893_0.4404638729944155","host":"s3://npm-registry-packages-npm-production"}},"1.24.0":{"_id":"@temporalio/external-storage-s3@1.24.0","ava":{"timeout":"60s"},"bugs":{"url":"https://github.com/temporalio/sdk-typescript/issues"},"dist":{"shasum":"e4e9f77ae4c7a397b9ca26b44a30c1cd82b4e0ff","tarball":"https://registry.npmjs.org/@temporalio/external-storage-s3/-/external-storage-s3-1.24.0.tgz","fileCount":15,"integrity":"sha512-Ko0ZHtvfUjYirg6y/obZVFDyd/jSxx8Gx++eV5owwWSV0HKnpTSAD6I4ipeDOcEb9qwqnh3U3jC7UpaPJMKfdQ==","signatures":[{"sig":"MEYCIQCO+nLyS26SUtLBeusbQwb3jWrVGSrCDE5T7PIDlYWHGwIhAJEt2JUj6w7GlevF9O0GRXkD6O7ngflhSv4BMJ+cy4zD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEOZB7GoRj1lhMGiFk4CYZavtqDIG+5PmZXabMupMNVBAiEAwG/6ZBsP2APw2KD9Wsz4VJnYxrTvcA3zet/2NDBVfrE="}],"unpackedSize":36195},"main":"lib/index.js","name":"@temporalio/external-storage-s3","types":"./lib/index.d.ts","author":"Temporal Technologies Inc. <sdk@temporal.io>","engines":{"node":">= 20.3.0"},"license":"MIT","scripts":{"test":"tsx ../../scripts/ava-ci.ts ./lib/__tests__/test-*.js","build":"tsc --build"},"version":"1.24.0","_npmUser":{"name":"temporal-sdk-team","email":"sdk@temporal.io"},"homepage":"https://github.com/temporalio/sdk-typescript/tree/main/contrib/external-storage-s3","keywords":["temporal","workflow","external storage","payload","s3","aws"],"repository":{"url":"git+https://github.com/temporalio/sdk-typescript.git","type":"git","directory":"contrib/external-storage-s3"},"description":"Amazon S3 external storage driver for the Temporal TypeScript SDK","directories":{},"maintainers":[{"name":"luminousmoose","email":"alex.scott.thomsen@gmail.com"},{"name":"tempbearpig","email":"roey@temporal.io"},{"name":"temporal-sdk-team","email":"sdk@temporal.io"},{"name":"alex.tideman","email":"alex.tideman@temporal.io"},{"name":"rossedfort","email":"rossedfort@gmail.com"},{"name":"laurakwhit","email":"laura.k.whitaker@gmail.com"}],"_nodeVersion":"26.0.0","dependencies":{"@temporalio/proto":"1.24.0","@temporalio/common":"1.24.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ava":"^5.3.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/external-storage-s3_1.24.0_1789438693741_0.3005396780778462"}}},"time":{"created":"2026-07-23T15:34:58.949Z","modified":"2026-09-15T02:18:14.031Z","1.21.0":"2026-07-23T15:34:59.231Z","1.21.1":"2026-07-24T13:41:56.077Z","1.22.0":"2026-08-05T14:39:21.798Z","1.23.0":"2026-08-26T03:27:44.025Z","1.24.0":"2026-09-15T02:18:13.845Z"},"bugs":{"url":"https://github.com/temporalio/sdk-typescript/issues"},"author":"Temporal Technologies Inc. <sdk@temporal.io>","license":"MIT","homepage":"https://github.com/temporalio/sdk-typescript/tree/main/contrib/external-storage-s3","keywords":["temporal","workflow","external storage","payload","s3","aws"],"repository":{"url":"git+https://github.com/temporalio/sdk-typescript.git","type":"git","directory":"contrib/external-storage-s3"},"description":"Amazon S3 external storage driver for the Temporal TypeScript SDK","maintainers":[{"name":"luminousmoose","email":"alex.scott.thomsen@gmail.com"},{"name":"tempbearpig","email":"roey@temporal.io"},{"name":"temporal-sdk-team","email":"sdk@temporal.io"},{"name":"alex.tideman","email":"alex.tideman@temporal.io"},{"name":"rossedfort","email":"rossedfort@gmail.com"},{"name":"laurakwhit","email":"laura.k.whitaker@gmail.com"}],"readme":"# Amazon S3 External Storage Driver for the Temporal TypeScript SDK\n\n> ⚠️ **This package is experimental and may be subject to change.** ⚠️\n\n`@temporalio/external-storage-s3` stores and retrieves Temporal payloads in Amazon S3 via the [External Storage](https://docs.temporal.io/external-storage) feature.\n\nThis package has no AWS dependency: it defines the driver and the `S3StorageDriverClient` interface, and you supply the S3 client. Use the companion [`@temporalio/external-storage-s3-aws-sdk`](../external-storage-s3-aws-sdk) package for an [`@aws-sdk/client-s3`](https://www.npmjs.com/package/@aws-sdk/client-s3)-backed client, or implement the interface yourself.\n\n## Using the AWS SDK client\n\nInstall the adapter package alongside this one:\n\n    npm install @temporalio/external-storage-s3 @temporalio/external-storage-s3-aws-sdk @aws-sdk/client-s3\n\n```ts\nimport { S3Client } from '@aws-sdk/client-s3';\nimport { S3StorageDriver } from '@temporalio/external-storage-s3';\nimport { AwsSdkS3StorageDriverClient } from '@temporalio/external-storage-s3-aws-sdk';\n\nconst s3Client = new S3Client({ region: 'us-east-1' });\nconst driver = new S3StorageDriver({\n  client: new AwsSdkS3StorageDriverClient(s3Client),\n  bucket: 'my-temporal-payloads',\n});\n```\n\nRegister the resulting driver with the SDK's External Storage configuration so the\nclient and worker offload eligible payloads to it.\n\n## Custom S3 client implementations\n\nTo use a different S3 library, implement `S3StorageDriverClient`.\n\n```ts\nimport type { S3StorageDriverClient } from '@temporalio/external-storage-s3';\n\nconst myClient: S3StorageDriverClient = {\n  async putObject(bucket, key, data, options) {\n    /* ... */\n  },\n  async objectExists(bucket, key, options) {\n    /* ... */\n    return false;\n  },\n  async getObject(bucket, key, options) {\n    /* ... */\n    return new Uint8Array();\n  },\n};\n```\n\n## Dynamic bucket selection\n\nPass a callable as `bucket` to choose the destination per payload:\n\n```ts\nconst driver = new S3StorageDriver({\n  client: new AwsSdkS3StorageDriverClient(s3Client),\n  bucket: (_context, payload) => ((payload.data?.length ?? 0) > 10 * 1024 * 1024 ? 'large-payloads' : 'small-payloads'),\n});\n```\n\n## Required IAM permissions\n\nThe credentials used by your S3 client must have these S3 permissions on the target bucket and its objects:\n\n```json\n{\n  \"Effect\": \"Allow\",\n  \"Action\": [\"s3:PutObject\", \"s3:GetObject\"],\n  \"Resource\": \"arn:aws:s3:::my-temporal-payloads/*\"\n}\n```\n\n`s3:PutObject` is required by components that store payloads (typically the client and worker sending workflow/activity inputs); `s3:GetObject` is required by components that retrieve them. Components that only retrieve do not need `s3:PutObject`, and vice versa.\n\n## S3 Storage Key Specification\n\nAll Temporal S3 drivers generate S3 keys in a consistent manner.\n\n### Key format\n\nWorkflow key:\n\n```text\nv0/ns/{namespace}/wt/{workflow-type}/wi/{workflow-id}/ri/{run-id}/d/{hash-algorithm}/{hex-digest}\n```\n\nActivity key:\n\n```text\nv0/ns/{namespace}/at/{activity-type}/ai/{activity-id}/ri/{run-id}/d/{hash-algorithm}/{hex-digest}\n```\n\nFallback key (unknown target):\n\n```text\nv0/d/{hash-algorithm}/{hex-digest}\n```\n\n- If no namespace, workflow, or activity information is available, the fallback is used.\n- Dynamic path segments are percent-encoded (rules below).\n- Missing values (including a missing `run-id`) are encoded as `null`.\n- `hex-digest` is lower-case SHA-256 hex (64 characters).\n\n### Percent-encoding rules\n\nThe Temporal SDKs escape anything that isn't listed in S3's safe character set: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n\nSafe Characters:\n\n```text\nAlphanumeric characters\n  0-9\n  a-z\n  A-Z\n\nSpecial characters\n  Exclamation point (!)\n  Hyphen (-)\n  Underscore (_)\n  Period (.)\n  Asterisk (*)\n  Single quotation mark (')\n  Opening parenthesis (()\n  Closing parenthesis ())\n```\n\n### Examples\n\nWorkflow key example:\n\n```text\ninput:\n  namespace=payments prod\n  workflow-type=ChargeWorkflow\n  workflow-id=order+123=abc\n  run-id=3f1d6c7a-8b2e-4f7a-9d0a-87a6f95e4d31\n  hash-algorithm=sha256\n  hex-digest=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\n\noutput:\n  v0/ns/payments%20prod/wt/ChargeWorkflow/wi/order%2B123%3Dabc/ri/3f1d6c7a-8b2e-4f7a-9d0a-87a6f95e4d31/d/sha256/9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08\n```\n\nActivity key example:\n\n```text\ninput:\n  namespace=payments prod\n  activity-type=Capture/Charge\n  activity-id=activity id+42\n  run-id=9e1d1fd9-2f8a-4c40-93e2-731f31b9268b\n  hash-algorithm=sha256\n  hex-digest=2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824\n\noutput:\n  v0/ns/payments%20prod/at/Capture%2FCharge/ai/activity%20id%2B42/ri/9e1d1fd9-2f8a-4c40-93e2-731f31b9268b/d/sha256/2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824\n```\n","readmeFilename":""}