@payloadcms/storage-s3 3.37.0-internal.f2e6c68 → 3.38.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { ClientUploadsConfig, CollectionOptions } from '@payloadcms/plugin-cloud-storage/types';
2
2
  import type { Plugin, UploadCollectionSlug } from 'payload';
3
3
  import * as AWS from '@aws-sdk/client-s3';
4
+ import type { SignedDownloadsConfig } from './staticHandler.js';
4
5
  export type S3StorageOptions = {
5
6
  /**
6
7
  * Access control list for uploaded files.
@@ -19,7 +20,9 @@ export type S3StorageOptions = {
19
20
  /**
20
21
  * Collection options to apply the S3 adapter to.
21
22
  */
22
- collections: Partial<Record<UploadCollectionSlug, Omit<CollectionOptions, 'adapter'> | true>>;
23
+ collections: Partial<Record<UploadCollectionSlug, ({
24
+ signedDownloads?: SignedDownloadsConfig;
25
+ } & Omit<CollectionOptions, 'adapter'>) | true>>;
23
26
  /**
24
27
  * AWS S3 client configuration. Highly dependent on your AWS setup.
25
28
  *
@@ -38,6 +41,10 @@ export type S3StorageOptions = {
38
41
  * Default: true
39
42
  */
40
43
  enabled?: boolean;
44
+ /**
45
+ * Use pre-signed URLs for files downloading. Can be overriden per-collection.
46
+ */
47
+ signedDownloads?: SignedDownloadsConfig;
41
48
  };
42
49
  type S3StoragePlugin = (storageS3Args: S3StorageOptions) => Plugin;
43
50
  export declare const s3Storage: S3StoragePlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mBAAmB,EAEnB,iBAAiB,EAElB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,KAAK,EAAU,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnE,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAUzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IAEH,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;IAC/B;;;;OAIG;IAEH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAE7F;;;;OAIG;IACH,MAAM,EAAE,GAAG,CAAC,cAAc,CAAA;IAE1B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,KAAK,eAAe,GAAG,CAAC,aAAa,EAAE,gBAAgB,KAAK,MAAM,CAAA;AAelE,eAAO,MAAM,SAAS,EAAE,eA4ErB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mBAAmB,EAEnB,iBAAiB,EAElB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,KAAK,EAAU,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnE,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAIzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAQ/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IAEH,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;IAE/B;;;;OAIG;IAEH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC;;OAEG;IACH,WAAW,EAAE,OAAO,CAClB,MAAM,CACJ,oBAAoB,EAClB,CAAC;QACC,eAAe,CAAC,EAAE,qBAAqB,CAAA;KACxC,GAAG,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,GACvC,IAAI,CACP,CACF,CAAA;IACD;;;;OAIG;IACH,MAAM,EAAE,GAAG,CAAC,cAAc,CAAA;IAE1B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAA;CACxC,CAAA;AAED,KAAK,eAAe,GAAG,CAAC,aAAa,EAAE,gBAAgB,KAAK,MAAM,CAAA;AAelE,eAAO,MAAM,SAAS,EAAE,eA4ErB,CAAA"}
package/dist/index.js CHANGED
@@ -75,8 +75,13 @@ export const s3Storage = (s3StorageOptions)=>(incomingConfig)=>{
75
75
  collections: collectionsWithAdapter
76
76
  })(config);
77
77
  };
78
- function s3StorageInternal(getStorageClient, { acl, bucket, clientUploads, config = {} }) {
78
+ function s3StorageInternal(getStorageClient, { acl, bucket, clientUploads, collections, config = {}, signedDownloads: topLevelSignedDownloads }) {
79
79
  return ({ collection, prefix })=>{
80
+ const collectionStorageConfig = collections[collection.slug];
81
+ let signedDownloads = typeof collectionStorageConfig === 'object' ? collectionStorageConfig.signedDownloads ?? false : null;
82
+ if (signedDownloads === null) {
83
+ signedDownloads = topLevelSignedDownloads ?? null;
84
+ }
80
85
  return {
81
86
  name: 's3',
82
87
  clientUploads,
@@ -98,7 +103,8 @@ function s3StorageInternal(getStorageClient, { acl, bucket, clientUploads, confi
98
103
  staticHandler: getHandler({
99
104
  bucket,
100
105
  collection,
101
- getStorageClient
106
+ getStorageClient,
107
+ signedDownloads: signedDownloads ?? false
102
108
  })
103
109
  };
104
110
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Adapter,\n ClientUploadsConfig,\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { NodeHttpHandlerOptions } from '@smithy/node-http-handler'\nimport type { Config, Plugin, UploadCollectionSlug } from 'payload'\n\nimport * as AWS from '@aws-sdk/client-s3'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\n\nimport { getGenerateSignedURLHandler } from './generateSignedURL.js'\nimport { getGenerateURL } from './generateURL.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getHandler } from './staticHandler.js'\n\nexport type S3StorageOptions = {\n /**\n * Access control list for uploaded files.\n */\n\n acl?: 'private' | 'public-read'\n /**\n * Bucket name to upload files to.\n *\n * Must follow [AWS S3 bucket naming conventions](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).\n */\n\n bucket: string\n\n /**\n * Do uploads directly on the client to bypass limits on Vercel. You must allow CORS PUT method for the bucket to your website.\n */\n clientUploads?: ClientUploadsConfig\n /**\n * Collection options to apply the S3 adapter to.\n */\n collections: Partial<Record<UploadCollectionSlug, Omit<CollectionOptions, 'adapter'> | true>>\n\n /**\n * AWS S3 client configuration. Highly dependent on your AWS setup.\n *\n * [AWS.S3ClientConfig Docs](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html)\n */\n config: AWS.S3ClientConfig\n\n /**\n * Whether or not to disable local storage\n *\n * @default true\n */\n disableLocalStorage?: boolean\n\n /**\n * Whether or not to enable the plugin\n *\n * Default: true\n */\n enabled?: boolean\n}\n\ntype S3StoragePlugin = (storageS3Args: S3StorageOptions) => Plugin\n\nlet storageClient: AWS.S3 | null = null\n\nconst defaultRequestHandlerOpts: NodeHttpHandlerOptions = {\n httpAgent: {\n keepAlive: true,\n maxSockets: 100,\n },\n httpsAgent: {\n keepAlive: true,\n maxSockets: 100,\n },\n}\n\nexport const s3Storage: S3StoragePlugin =\n (s3StorageOptions: S3StorageOptions) =>\n (incomingConfig: Config): Config => {\n const getStorageClient: () => AWS.S3 = () => {\n if (storageClient) {\n return storageClient\n }\n\n storageClient = new AWS.S3({\n requestHandler: defaultRequestHandlerOpts,\n ...(s3StorageOptions.config ?? {}),\n })\n return storageClient\n }\n\n const isPluginDisabled = s3StorageOptions.enabled === false\n\n initClientUploads({\n clientHandler: '@payloadcms/storage-s3/client#S3ClientUploadHandler',\n collections: s3StorageOptions.collections,\n config: incomingConfig,\n enabled: !isPluginDisabled && Boolean(s3StorageOptions.clientUploads),\n serverHandler: getGenerateSignedURLHandler({\n access:\n typeof s3StorageOptions.clientUploads === 'object'\n ? s3StorageOptions.clientUploads.access\n : undefined,\n acl: s3StorageOptions.acl,\n bucket: s3StorageOptions.bucket,\n collections: s3StorageOptions.collections,\n getStorageClient,\n }),\n serverHandlerPath: '/storage-s3-generate-signed-url',\n })\n\n if (isPluginDisabled) {\n return incomingConfig\n }\n\n const adapter = s3StorageInternal(getStorageClient, s3StorageOptions)\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n s3StorageOptions.collections,\n ).reduce(\n (acc, [slug, collOptions]) => ({\n ...acc,\n [slug]: {\n ...(collOptions === true ? {} : collOptions),\n adapter,\n },\n }),\n {} as Record<string, CollectionOptions>,\n )\n\n // Set disableLocalStorage: true for collections specified in the plugin options\n const config = {\n ...incomingConfig,\n collections: (incomingConfig.collections || []).map((collection) => {\n if (!collectionsWithAdapter[collection.slug]) {\n return collection\n }\n\n return {\n ...collection,\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n disableLocalStorage: true,\n },\n }\n }),\n }\n\n return cloudStoragePlugin({\n collections: collectionsWithAdapter,\n })(config)\n }\n\nfunction s3StorageInternal(\n getStorageClient: () => AWS.S3,\n { acl, bucket, clientUploads, config = {} }: S3StorageOptions,\n): Adapter {\n return ({ collection, prefix }): GeneratedAdapter => {\n return {\n name: 's3',\n clientUploads,\n generateURL: getGenerateURL({ bucket, config }),\n handleDelete: getHandleDelete({ bucket, getStorageClient }),\n handleUpload: getHandleUpload({\n acl,\n bucket,\n collection,\n getStorageClient,\n prefix,\n }),\n staticHandler: getHandler({ bucket, collection, getStorageClient }),\n }\n }\n}\n"],"names":["AWS","cloudStoragePlugin","initClientUploads","getGenerateSignedURLHandler","getGenerateURL","getHandleDelete","getHandleUpload","getHandler","storageClient","defaultRequestHandlerOpts","httpAgent","keepAlive","maxSockets","httpsAgent","s3Storage","s3StorageOptions","incomingConfig","getStorageClient","S3","requestHandler","config","isPluginDisabled","enabled","clientHandler","collections","Boolean","clientUploads","serverHandler","access","undefined","acl","bucket","serverHandlerPath","adapter","s3StorageInternal","collectionsWithAdapter","Object","entries","reduce","acc","slug","collOptions","map","collection","upload","disableLocalStorage","prefix","name","generateURL","handleDelete","handleUpload","staticHandler"],"mappings":"AAUA,YAAYA,SAAS,qBAAoB;AACzC,SAASC,kBAAkB,QAAQ,mCAAkC;AACrE,SAASC,iBAAiB,QAAQ,6CAA4C;AAE9E,SAASC,2BAA2B,QAAQ,yBAAwB;AACpE,SAASC,cAAc,QAAQ,mBAAkB;AACjD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,UAAU,QAAQ,qBAAoB;AAiD/C,IAAIC,gBAA+B;AAEnC,MAAMC,4BAAoD;IACxDC,WAAW;QACTC,WAAW;QACXC,YAAY;IACd;IACAC,YAAY;QACVF,WAAW;QACXC,YAAY;IACd;AACF;AAEA,OAAO,MAAME,YACX,CAACC,mBACD,CAACC;QACC,MAAMC,mBAAiC;YACrC,IAAIT,eAAe;gBACjB,OAAOA;YACT;YAEAA,gBAAgB,IAAIR,IAAIkB,EAAE,CAAC;gBACzBC,gBAAgBV;gBAChB,GAAIM,iBAAiBK,MAAM,IAAI,CAAC,CAAC;YACnC;YACA,OAAOZ;QACT;QAEA,MAAMa,mBAAmBN,iBAAiBO,OAAO,KAAK;QAEtDpB,kBAAkB;YAChBqB,eAAe;YACfC,aAAaT,iBAAiBS,WAAW;YACzCJ,QAAQJ;YACRM,SAAS,CAACD,oBAAoBI,QAAQV,iBAAiBW,aAAa;YACpEC,eAAexB,4BAA4B;gBACzCyB,QACE,OAAOb,iBAAiBW,aAAa,KAAK,WACtCX,iBAAiBW,aAAa,CAACE,MAAM,GACrCC;gBACNC,KAAKf,iBAAiBe,GAAG;gBACzBC,QAAQhB,iBAAiBgB,MAAM;gBAC/BP,aAAaT,iBAAiBS,WAAW;gBACzCP;YACF;YACAe,mBAAmB;QACrB;QAEA,IAAIX,kBAAkB;YACpB,OAAOL;QACT;QAEA,MAAMiB,UAAUC,kBAAkBjB,kBAAkBF;QAEpD,+CAA+C;QAC/C,MAAMoB,yBAAmEC,OAAOC,OAAO,CACrFtB,iBAAiBS,WAAW,EAC5Bc,MAAM,CACN,CAACC,KAAK,CAACC,MAAMC,YAAY,GAAM,CAAA;gBAC7B,GAAGF,GAAG;gBACN,CAACC,KAAK,EAAE;oBACN,GAAIC,gBAAgB,OAAO,CAAC,IAAIA,WAAW;oBAC3CR;gBACF;YACF,CAAA,GACA,CAAC;QAGH,gFAAgF;QAChF,MAAMb,SAAS;YACb,GAAGJ,cAAc;YACjBQ,aAAa,AAACR,CAAAA,eAAeQ,WAAW,IAAI,EAAE,AAAD,EAAGkB,GAAG,CAAC,CAACC;gBACnD,IAAI,CAACR,sBAAsB,CAACQ,WAAWH,IAAI,CAAC,EAAE;oBAC5C,OAAOG;gBACT;gBAEA,OAAO;oBACL,GAAGA,UAAU;oBACbC,QAAQ;wBACN,GAAI,OAAOD,WAAWC,MAAM,KAAK,WAAWD,WAAWC,MAAM,GAAG,CAAC,CAAC;wBAClEC,qBAAqB;oBACvB;gBACF;YACF;QACF;QAEA,OAAO5C,mBAAmB;YACxBuB,aAAaW;QACf,GAAGf;IACL,EAAC;AAEH,SAASc,kBACPjB,gBAA8B,EAC9B,EAAEa,GAAG,EAAEC,MAAM,EAAEL,aAAa,EAAEN,SAAS,CAAC,CAAC,EAAoB;IAE7D,OAAO,CAAC,EAAEuB,UAAU,EAAEG,MAAM,EAAE;QAC5B,OAAO;YACLC,MAAM;YACNrB;YACAsB,aAAa5C,eAAe;gBAAE2B;gBAAQX;YAAO;YAC7C6B,cAAc5C,gBAAgB;gBAAE0B;gBAAQd;YAAiB;YACzDiC,cAAc5C,gBAAgB;gBAC5BwB;gBACAC;gBACAY;gBACA1B;gBACA6B;YACF;YACAK,eAAe5C,WAAW;gBAAEwB;gBAAQY;gBAAY1B;YAAiB;QACnE;IACF;AACF"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Adapter,\n ClientUploadsConfig,\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { NodeHttpHandlerOptions } from '@smithy/node-http-handler'\nimport type { Config, Plugin, UploadCollectionSlug } from 'payload'\n\nimport * as AWS from '@aws-sdk/client-s3'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\n\nimport type { SignedDownloadsConfig } from './staticHandler.js'\n\nimport { getGenerateSignedURLHandler } from './generateSignedURL.js'\nimport { getGenerateURL } from './generateURL.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getHandler } from './staticHandler.js'\n\nexport type S3StorageOptions = {\n /**\n * Access control list for uploaded files.\n */\n\n acl?: 'private' | 'public-read'\n\n /**\n * Bucket name to upload files to.\n *\n * Must follow [AWS S3 bucket naming conventions](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).\n */\n\n bucket: string\n\n /**\n * Do uploads directly on the client to bypass limits on Vercel. You must allow CORS PUT method for the bucket to your website.\n */\n clientUploads?: ClientUploadsConfig\n /**\n * Collection options to apply the S3 adapter to.\n */\n collections: Partial<\n Record<\n UploadCollectionSlug,\n | ({\n signedDownloads?: SignedDownloadsConfig\n } & Omit<CollectionOptions, 'adapter'>)\n | true\n >\n >\n /**\n * AWS S3 client configuration. Highly dependent on your AWS setup.\n *\n * [AWS.S3ClientConfig Docs](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html)\n */\n config: AWS.S3ClientConfig\n\n /**\n * Whether or not to disable local storage\n *\n * @default true\n */\n disableLocalStorage?: boolean\n\n /**\n * Whether or not to enable the plugin\n *\n * Default: true\n */\n enabled?: boolean\n /**\n * Use pre-signed URLs for files downloading. Can be overriden per-collection.\n */\n signedDownloads?: SignedDownloadsConfig\n}\n\ntype S3StoragePlugin = (storageS3Args: S3StorageOptions) => Plugin\n\nlet storageClient: AWS.S3 | null = null\n\nconst defaultRequestHandlerOpts: NodeHttpHandlerOptions = {\n httpAgent: {\n keepAlive: true,\n maxSockets: 100,\n },\n httpsAgent: {\n keepAlive: true,\n maxSockets: 100,\n },\n}\n\nexport const s3Storage: S3StoragePlugin =\n (s3StorageOptions: S3StorageOptions) =>\n (incomingConfig: Config): Config => {\n const getStorageClient: () => AWS.S3 = () => {\n if (storageClient) {\n return storageClient\n }\n\n storageClient = new AWS.S3({\n requestHandler: defaultRequestHandlerOpts,\n ...(s3StorageOptions.config ?? {}),\n })\n return storageClient\n }\n\n const isPluginDisabled = s3StorageOptions.enabled === false\n\n initClientUploads({\n clientHandler: '@payloadcms/storage-s3/client#S3ClientUploadHandler',\n collections: s3StorageOptions.collections,\n config: incomingConfig,\n enabled: !isPluginDisabled && Boolean(s3StorageOptions.clientUploads),\n serverHandler: getGenerateSignedURLHandler({\n access:\n typeof s3StorageOptions.clientUploads === 'object'\n ? s3StorageOptions.clientUploads.access\n : undefined,\n acl: s3StorageOptions.acl,\n bucket: s3StorageOptions.bucket,\n collections: s3StorageOptions.collections,\n getStorageClient,\n }),\n serverHandlerPath: '/storage-s3-generate-signed-url',\n })\n\n if (isPluginDisabled) {\n return incomingConfig\n }\n\n const adapter = s3StorageInternal(getStorageClient, s3StorageOptions)\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n s3StorageOptions.collections,\n ).reduce(\n (acc, [slug, collOptions]) => ({\n ...acc,\n [slug]: {\n ...(collOptions === true ? {} : collOptions),\n adapter,\n },\n }),\n {} as Record<string, CollectionOptions>,\n )\n\n // Set disableLocalStorage: true for collections specified in the plugin options\n const config = {\n ...incomingConfig,\n collections: (incomingConfig.collections || []).map((collection) => {\n if (!collectionsWithAdapter[collection.slug]) {\n return collection\n }\n\n return {\n ...collection,\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n disableLocalStorage: true,\n },\n }\n }),\n }\n\n return cloudStoragePlugin({\n collections: collectionsWithAdapter,\n })(config)\n }\n\nfunction s3StorageInternal(\n getStorageClient: () => AWS.S3,\n {\n acl,\n bucket,\n clientUploads,\n collections,\n config = {},\n signedDownloads: topLevelSignedDownloads,\n }: S3StorageOptions,\n): Adapter {\n return ({ collection, prefix }): GeneratedAdapter => {\n const collectionStorageConfig = collections[collection.slug]\n\n let signedDownloads: null | SignedDownloadsConfig =\n typeof collectionStorageConfig === 'object'\n ? (collectionStorageConfig.signedDownloads ?? false)\n : null\n\n if (signedDownloads === null) {\n signedDownloads = topLevelSignedDownloads ?? null\n }\n\n return {\n name: 's3',\n clientUploads,\n generateURL: getGenerateURL({ bucket, config }),\n handleDelete: getHandleDelete({ bucket, getStorageClient }),\n handleUpload: getHandleUpload({\n acl,\n bucket,\n collection,\n getStorageClient,\n prefix,\n }),\n staticHandler: getHandler({\n bucket,\n collection,\n getStorageClient,\n signedDownloads: signedDownloads ?? false,\n }),\n }\n }\n}\n"],"names":["AWS","cloudStoragePlugin","initClientUploads","getGenerateSignedURLHandler","getGenerateURL","getHandleDelete","getHandleUpload","getHandler","storageClient","defaultRequestHandlerOpts","httpAgent","keepAlive","maxSockets","httpsAgent","s3Storage","s3StorageOptions","incomingConfig","getStorageClient","S3","requestHandler","config","isPluginDisabled","enabled","clientHandler","collections","Boolean","clientUploads","serverHandler","access","undefined","acl","bucket","serverHandlerPath","adapter","s3StorageInternal","collectionsWithAdapter","Object","entries","reduce","acc","slug","collOptions","map","collection","upload","disableLocalStorage","signedDownloads","topLevelSignedDownloads","prefix","collectionStorageConfig","name","generateURL","handleDelete","handleUpload","staticHandler"],"mappings":"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"}
@@ -1,11 +1,16 @@
1
1
  import type * as AWS from '@aws-sdk/client-s3';
2
2
  import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types';
3
3
  import type { CollectionConfig } from 'payload';
4
+ export type SignedDownloadsConfig = {
5
+ /** @default 7200 */
6
+ expiresIn?: number;
7
+ } | boolean;
4
8
  interface Args {
5
9
  bucket: string;
6
10
  collection: CollectionConfig;
7
11
  getStorageClient: () => AWS.S3;
12
+ signedDownloads?: SignedDownloadsConfig;
8
13
  }
9
- export declare const getHandler: ({ bucket, collection, getStorageClient }: Args) => StaticHandler;
14
+ export declare const getHandler: ({ bucket, collection, getStorageClient, signedDownloads, }: Args) => StaticHandler;
10
15
  export {};
11
16
  //# sourceMappingURL=staticHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAM/C,UAAU,IAAI;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,gBAAgB,CAAA;IAC5B,gBAAgB,EAAE,MAAM,GAAG,CAAC,EAAE,CAAA;CAC/B;AA8BD,eAAO,MAAM,UAAU,6CAA8C,IAAI,KAAG,aA+D3E,CAAA"}
1
+ {"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAQ/C,MAAM,MAAM,qBAAqB,GAC7B;IACE,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GACD,OAAO,CAAA;AAEX,UAAU,IAAI;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,gBAAgB,CAAA;IAC5B,gBAAgB,EAAE,MAAM,GAAG,CAAC,EAAE,CAAA;IAC9B,eAAe,CAAC,EAAE,qBAAqB,CAAA;CACxC;AA8BD,eAAO,MAAM,UAAU,+DAKpB,IAAI,KAAG,aA0ET,CAAA"}
@@ -1,3 +1,5 @@
1
+ import { GetObjectCommand } from '@aws-sdk/client-s3';
2
+ import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
1
3
  import { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities';
2
4
  import path from 'path';
3
5
  // Type guard for NodeJS.Readable streams
@@ -18,7 +20,7 @@ const streamToBuffer = async (readableStream)=>{
18
20
  }
19
21
  return Buffer.concat(chunks);
20
22
  };
21
- export const getHandler = ({ bucket, collection, getStorageClient })=>{
23
+ export const getHandler = ({ bucket, collection, getStorageClient, signedDownloads })=>{
22
24
  return async (req, { params: { clientUploadContext, filename } })=>{
23
25
  let object = undefined;
24
26
  try {
@@ -29,6 +31,17 @@ export const getHandler = ({ bucket, collection, getStorageClient })=>{
29
31
  req
30
32
  });
31
33
  const key = path.posix.join(prefix, filename);
34
+ if (signedDownloads && !clientUploadContext) {
35
+ const command = new GetObjectCommand({
36
+ Bucket: bucket,
37
+ Key: key
38
+ });
39
+ const signedUrl = await getSignedUrl(// @ts-expect-error mismatch versions
40
+ getStorageClient(), command, typeof signedDownloads === 'object' ? signedDownloads : {
41
+ expiresIn: 7200
42
+ });
43
+ return Response.redirect(signedUrl);
44
+ }
32
45
  object = await getStorageClient().getObject({
33
46
  Bucket: bucket,
34
47
  Key: key
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type * as AWS from '@aws-sdk/client-s3'\nimport type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\nimport type { Readable } from 'stream'\n\nimport { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities'\nimport path from 'path'\n\ninterface Args {\n bucket: string\n collection: CollectionConfig\n getStorageClient: () => AWS.S3\n}\n\n// Type guard for NodeJS.Readable streams\nconst isNodeReadableStream = (body: unknown): body is Readable => {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'pipe' in body &&\n typeof (body as any).pipe === 'function' &&\n 'destroy' in body &&\n typeof (body as any).destroy === 'function'\n )\n}\n\nconst destroyStream = (object: AWS.GetObjectOutput | undefined) => {\n if (object?.Body && isNodeReadableStream(object.Body)) {\n object.Body.destroy()\n }\n}\n\n// Convert a stream into a promise that resolves with a Buffer\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst streamToBuffer = async (readableStream: any) => {\n const chunks = []\n for await (const chunk of readableStream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nexport const getHandler = ({ bucket, collection, getStorageClient }: Args): StaticHandler => {\n return async (req, { params: { clientUploadContext, filename } }) => {\n let object: AWS.GetObjectOutput | undefined = undefined\n try {\n const prefix = await getFilePrefix({ clientUploadContext, collection, filename, req })\n\n const key = path.posix.join(prefix, filename)\n\n object = await getStorageClient().getObject({\n Bucket: bucket,\n Key: key,\n })\n\n if (!object.Body) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = object.ETag\n\n if (etagFromHeaders && etagFromHeaders === objectEtag) {\n return new Response(null, {\n headers: new Headers({\n 'Accept-Ranges': String(object.AcceptRanges),\n 'Content-Length': String(object.ContentLength),\n 'Content-Type': String(object.ContentType),\n ETag: String(object.ETag),\n }),\n status: 304,\n })\n }\n\n // On error, manually destroy stream to close socket\n if (object.Body && isNodeReadableStream(object.Body)) {\n const stream = object.Body\n stream.on('error', (err) => {\n req.payload.logger.error({\n err,\n key,\n msg: 'Error streaming S3 object, destroying stream',\n })\n stream.destroy()\n })\n }\n\n const bodyBuffer = await streamToBuffer(object.Body)\n\n return new Response(bodyBuffer, {\n headers: new Headers({\n 'Accept-Ranges': String(object.AcceptRanges),\n 'Content-Length': String(object.ContentLength),\n 'Content-Type': String(object.ContentType),\n ETag: String(object.ETag),\n }),\n status: 200,\n })\n } catch (err) {\n req.payload.logger.error(err)\n return new Response('Internal Server Error', { status: 500 })\n } finally {\n destroyStream(object)\n }\n }\n}\n"],"names":["getFilePrefix","path","isNodeReadableStream","body","pipe","destroy","destroyStream","object","Body","streamToBuffer","readableStream","chunks","chunk","push","Buffer","from","concat","getHandler","bucket","collection","getStorageClient","req","params","clientUploadContext","filename","undefined","prefix","key","posix","join","getObject","Bucket","Key","Response","status","statusText","etagFromHeaders","headers","get","objectEtag","ETag","Headers","String","AcceptRanges","ContentLength","ContentType","stream","on","err","payload","logger","error","msg","bodyBuffer"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type * as AWS from '@aws-sdk/client-s3'\nimport type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\nimport type { Readable } from 'stream'\n\nimport { GetObjectCommand } from '@aws-sdk/client-s3'\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner'\nimport { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities'\nimport path from 'path'\n\nexport type SignedDownloadsConfig =\n | {\n /** @default 7200 */\n expiresIn?: number\n }\n | boolean\n\ninterface Args {\n bucket: string\n collection: CollectionConfig\n getStorageClient: () => AWS.S3\n signedDownloads?: SignedDownloadsConfig\n}\n\n// Type guard for NodeJS.Readable streams\nconst isNodeReadableStream = (body: unknown): body is Readable => {\n return (\n typeof body === 'object' &&\n body !== null &&\n 'pipe' in body &&\n typeof (body as any).pipe === 'function' &&\n 'destroy' in body &&\n typeof (body as any).destroy === 'function'\n )\n}\n\nconst destroyStream = (object: AWS.GetObjectOutput | undefined) => {\n if (object?.Body && isNodeReadableStream(object.Body)) {\n object.Body.destroy()\n }\n}\n\n// Convert a stream into a promise that resolves with a Buffer\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst streamToBuffer = async (readableStream: any) => {\n const chunks = []\n for await (const chunk of readableStream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nexport const getHandler = ({\n bucket,\n collection,\n getStorageClient,\n signedDownloads,\n}: Args): StaticHandler => {\n return async (req, { params: { clientUploadContext, filename } }) => {\n let object: AWS.GetObjectOutput | undefined = undefined\n try {\n const prefix = await getFilePrefix({ clientUploadContext, collection, filename, req })\n\n const key = path.posix.join(prefix, filename)\n\n if (signedDownloads && !clientUploadContext) {\n const command = new GetObjectCommand({ Bucket: bucket, Key: key })\n const signedUrl = await getSignedUrl(\n // @ts-expect-error mismatch versions\n getStorageClient(),\n command,\n typeof signedDownloads === 'object' ? signedDownloads : { expiresIn: 7200 },\n )\n return Response.redirect(signedUrl)\n }\n\n object = await getStorageClient().getObject({\n Bucket: bucket,\n Key: key,\n })\n\n if (!object.Body) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = object.ETag\n\n if (etagFromHeaders && etagFromHeaders === objectEtag) {\n return new Response(null, {\n headers: new Headers({\n 'Accept-Ranges': String(object.AcceptRanges),\n 'Content-Length': String(object.ContentLength),\n 'Content-Type': String(object.ContentType),\n ETag: String(object.ETag),\n }),\n status: 304,\n })\n }\n\n // On error, manually destroy stream to close socket\n if (object.Body && isNodeReadableStream(object.Body)) {\n const stream = object.Body\n stream.on('error', (err) => {\n req.payload.logger.error({\n err,\n key,\n msg: 'Error streaming S3 object, destroying stream',\n })\n stream.destroy()\n })\n }\n\n const bodyBuffer = await streamToBuffer(object.Body)\n\n return new Response(bodyBuffer, {\n headers: new Headers({\n 'Accept-Ranges': String(object.AcceptRanges),\n 'Content-Length': String(object.ContentLength),\n 'Content-Type': String(object.ContentType),\n ETag: String(object.ETag),\n }),\n status: 200,\n })\n } catch (err) {\n req.payload.logger.error(err)\n return new Response('Internal Server Error', { status: 500 })\n } finally {\n destroyStream(object)\n }\n }\n}\n"],"names":["GetObjectCommand","getSignedUrl","getFilePrefix","path","isNodeReadableStream","body","pipe","destroy","destroyStream","object","Body","streamToBuffer","readableStream","chunks","chunk","push","Buffer","from","concat","getHandler","bucket","collection","getStorageClient","signedDownloads","req","params","clientUploadContext","filename","undefined","prefix","key","posix","join","command","Bucket","Key","signedUrl","expiresIn","Response","redirect","getObject","status","statusText","etagFromHeaders","headers","get","objectEtag","ETag","Headers","String","AcceptRanges","ContentLength","ContentType","stream","on","err","payload","logger","error","msg","bodyBuffer"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-s3",
3
- "version": "3.37.0-internal.f2e6c68",
3
+ "version": "3.38.0-canary.0",
4
4
  "description": "Payload storage adapter for Amazon S3",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -39,14 +39,14 @@
39
39
  "@aws-sdk/client-s3": "^3.614.0",
40
40
  "@aws-sdk/lib-storage": "^3.614.0",
41
41
  "@aws-sdk/s3-request-presigner": "^3.614.0",
42
- "@payloadcms/plugin-cloud-storage": "3.37.0-internal.f2e6c68"
42
+ "@payloadcms/plugin-cloud-storage": "3.38.0-canary.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@smithy/node-http-handler": "4.0.3",
46
- "payload": "3.37.0-internal.f2e6c68"
46
+ "payload": "3.38.0-canary.0"
47
47
  },
48
48
  "peerDependencies": {
49
- "payload": "3.37.0-internal.f2e6c68"
49
+ "payload": "3.38.0-canary.0"
50
50
  },
51
51
  "engines": {
52
52
  "node": "^18.20.2 || >=20.9.0"