@payloadcms/storage-gcs 4.0.0-internal.cd69eef → 4.0.0-internal.d1cc1d3
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/adapter.js +8 -6
- package/dist/adapter.js.map +1 -1
- package/dist/generateUploadInstructions.d.ts +3 -2
- package/dist/generateUploadInstructions.d.ts.map +1 -1
- package/dist/generateUploadInstructions.js +13 -6
- package/dist/generateUploadInstructions.js.map +1 -1
- package/dist/getFile.d.ts +2 -2
- package/dist/getFile.d.ts.map +1 -1
- package/dist/getFile.js +3 -3
- package/dist/getFile.js.map +1 -1
- package/package.json +4 -4
package/dist/adapter.js
CHANGED
|
@@ -14,15 +14,17 @@ export function createGcsAdapter({ acl, bucket, clientUploads, getStorageClient,
|
|
|
14
14
|
prefix: urlPrefix,
|
|
15
15
|
useCompositePrefixes
|
|
16
16
|
}),
|
|
17
|
-
uploadInstructions:
|
|
18
|
-
|
|
17
|
+
uploadInstructions: {
|
|
18
|
+
enabled: Boolean(clientUploads),
|
|
19
19
|
generate: generateUploadInstructions({
|
|
20
|
+
access: typeof clientUploads === 'object' ? clientUploads.access : undefined,
|
|
20
21
|
bucket,
|
|
21
22
|
collectionPrefix: prefix,
|
|
22
23
|
getStorageClient,
|
|
23
24
|
useCompositePrefixes
|
|
24
|
-
})
|
|
25
|
-
|
|
25
|
+
}),
|
|
26
|
+
useInAdmin: true
|
|
27
|
+
},
|
|
26
28
|
handleDelete: ({ doc: { prefix: docPrefix = '' }, filename })=>deleteFile({
|
|
27
29
|
bucket,
|
|
28
30
|
client: getStorageClient(),
|
|
@@ -45,16 +47,16 @@ export function createGcsAdapter({ acl, bucket, clientUploads, getStorageClient,
|
|
|
45
47
|
});
|
|
46
48
|
return data;
|
|
47
49
|
},
|
|
48
|
-
staticHandler: (req, { headers, params: {
|
|
50
|
+
staticHandler: (req, { headers, params: { filename, prefix: prefixQueryParam, uploadReference } })=>getFile({
|
|
49
51
|
bucket,
|
|
50
52
|
client: getStorageClient(),
|
|
51
53
|
collection,
|
|
52
54
|
collectionPrefix: prefix,
|
|
53
|
-
directUpload,
|
|
54
55
|
filename,
|
|
55
56
|
incomingHeaders: headers,
|
|
56
57
|
prefixQueryParam,
|
|
57
58
|
req,
|
|
59
|
+
uploadReference,
|
|
58
60
|
useCompositePrefixes
|
|
59
61
|
})
|
|
60
62
|
});
|
package/dist/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type {\n Adapter,\n ClientUploadsConfig,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\n\nimport { deleteFile } from './deleteFile.js'\nimport { generateUploadInstructions } from './generateUploadInstructions.js'\nimport { generateURL } from './generateURL.js'\nimport { getFile } from './getFile.js'\nimport { uploadFile } from './uploadFile.js'\n\ninterface CreateGcsAdapterArgs {\n acl?: 'Private' | 'Public'\n bucket: string\n clientUploads?: ClientUploadsConfig\n getStorageClient: () => Storage\n useCompositePrefixes?: boolean\n}\n\nexport function createGcsAdapter({\n acl,\n bucket,\n clientUploads,\n getStorageClient,\n useCompositePrefixes = false,\n}: CreateGcsAdapterArgs): Adapter {\n return ({ collection, prefix = '' }): GeneratedAdapter => ({\n name: 'gcs',\n\n generateURL: ({ filename, prefix: urlPrefix = '' }) =>\n generateURL({\n bucket,\n client: getStorageClient(),\n collectionPrefix: prefix,\n filename,\n prefix: urlPrefix,\n useCompositePrefixes,\n }),\n\n uploadInstructions:
|
|
1
|
+
{"version":3,"sources":["../src/adapter.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type {\n Adapter,\n ClientUploadsConfig,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\n\nimport { deleteFile } from './deleteFile.js'\nimport { generateUploadInstructions } from './generateUploadInstructions.js'\nimport { generateURL } from './generateURL.js'\nimport { getFile } from './getFile.js'\nimport { uploadFile } from './uploadFile.js'\n\ninterface CreateGcsAdapterArgs {\n acl?: 'Private' | 'Public'\n bucket: string\n clientUploads?: ClientUploadsConfig\n getStorageClient: () => Storage\n useCompositePrefixes?: boolean\n}\n\nexport function createGcsAdapter({\n acl,\n bucket,\n clientUploads,\n getStorageClient,\n useCompositePrefixes = false,\n}: CreateGcsAdapterArgs): Adapter {\n return ({ collection, prefix = '' }): GeneratedAdapter => ({\n name: 'gcs',\n\n generateURL: ({ filename, prefix: urlPrefix = '' }) =>\n generateURL({\n bucket,\n client: getStorageClient(),\n collectionPrefix: prefix,\n filename,\n prefix: urlPrefix,\n useCompositePrefixes,\n }),\n\n uploadInstructions: {\n enabled: Boolean(clientUploads),\n generate: generateUploadInstructions({\n access: typeof clientUploads === 'object' ? clientUploads.access : undefined,\n bucket,\n collectionPrefix: prefix,\n getStorageClient,\n useCompositePrefixes,\n }),\n useInAdmin: true,\n },\n\n handleDelete: ({ doc: { prefix: docPrefix = '' }, filename }) =>\n deleteFile({\n bucket,\n client: getStorageClient(),\n collectionPrefix: prefix,\n docPrefix,\n filename,\n useCompositePrefixes,\n }),\n\n handleUpload: async ({ data, file }) => {\n await uploadFile({\n acl,\n bucket,\n buffer: file.buffer,\n client: getStorageClient(),\n collectionPrefix: prefix,\n docPrefix: data.prefix,\n filename: file.filename,\n mimeType: file.mimeType,\n useCompositePrefixes,\n })\n\n return data\n },\n\n staticHandler: (\n req,\n { headers, params: { filename, prefix: prefixQueryParam, uploadReference } },\n ) =>\n getFile({\n bucket,\n client: getStorageClient(),\n collection,\n collectionPrefix: prefix,\n filename,\n incomingHeaders: headers,\n prefixQueryParam,\n req,\n uploadReference,\n useCompositePrefixes,\n }),\n })\n}\n"],"names":["deleteFile","generateUploadInstructions","generateURL","getFile","uploadFile","createGcsAdapter","acl","bucket","clientUploads","getStorageClient","useCompositePrefixes","collection","prefix","name","filename","urlPrefix","client","collectionPrefix","uploadInstructions","enabled","Boolean","generate","access","undefined","useInAdmin","handleDelete","doc","docPrefix","handleUpload","data","file","buffer","mimeType","staticHandler","req","headers","params","prefixQueryParam","uploadReference","incomingHeaders"],"mappings":"AAOA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,0BAA0B,QAAQ,kCAAiC;AAC5E,SAASC,WAAW,QAAQ,mBAAkB;AAC9C,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,UAAU,QAAQ,kBAAiB;AAU5C,OAAO,SAASC,iBAAiB,EAC/BC,GAAG,EACHC,MAAM,EACNC,aAAa,EACbC,gBAAgB,EAChBC,uBAAuB,KAAK,EACP;IACrB,OAAO,CAAC,EAAEC,UAAU,EAAEC,SAAS,EAAE,EAAE,GAAwB,CAAA;YACzDC,MAAM;YAENX,aAAa,CAAC,EAAEY,QAAQ,EAAEF,QAAQG,YAAY,EAAE,EAAE,GAChDb,YAAY;oBACVK;oBACAS,QAAQP;oBACRQ,kBAAkBL;oBAClBE;oBACAF,QAAQG;oBACRL;gBACF;YAEFQ,oBAAoB;gBAClBC,SAASC,QAAQZ;gBACjBa,UAAUpB,2BAA2B;oBACnCqB,QAAQ,OAAOd,kBAAkB,WAAWA,cAAcc,MAAM,GAAGC;oBACnEhB;oBACAU,kBAAkBL;oBAClBH;oBACAC;gBACF;gBACAc,YAAY;YACd;YAEAC,cAAc,CAAC,EAAEC,KAAK,EAAEd,QAAQe,YAAY,EAAE,EAAE,EAAEb,QAAQ,EAAE,GAC1Dd,WAAW;oBACTO;oBACAS,QAAQP;oBACRQ,kBAAkBL;oBAClBe;oBACAb;oBACAJ;gBACF;YAEFkB,cAAc,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE;gBACjC,MAAM1B,WAAW;oBACfE;oBACAC;oBACAwB,QAAQD,KAAKC,MAAM;oBACnBf,QAAQP;oBACRQ,kBAAkBL;oBAClBe,WAAWE,KAAKjB,MAAM;oBACtBE,UAAUgB,KAAKhB,QAAQ;oBACvBkB,UAAUF,KAAKE,QAAQ;oBACvBtB;gBACF;gBAEA,OAAOmB;YACT;YAEAI,eAAe,CACbC,KACA,EAAEC,OAAO,EAAEC,QAAQ,EAAEtB,QAAQ,EAAEF,QAAQyB,gBAAgB,EAAEC,eAAe,EAAE,EAAE,GAE5EnC,QAAQ;oBACNI;oBACAS,QAAQP;oBACRE;oBACAM,kBAAkBL;oBAClBE;oBACAyB,iBAAiBJ;oBACjBE;oBACAH;oBACAI;oBACA5B;gBACF;QACJ,CAAA;AACF"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { Storage } from '@google-cloud/storage';
|
|
2
|
-
import type { GenerateUploadInstructions } from 'payload';
|
|
2
|
+
import type { GenerateUploadInstructions, UploadInstructionsAccess } from 'payload';
|
|
3
3
|
interface Args {
|
|
4
|
+
access?: UploadInstructionsAccess;
|
|
4
5
|
bucket: string;
|
|
5
6
|
collectionPrefix: string;
|
|
6
7
|
getStorageClient: () => Storage;
|
|
7
8
|
useCompositePrefixes?: boolean;
|
|
8
9
|
}
|
|
9
|
-
export declare const generateUploadInstructions: ({ bucket, collectionPrefix, getStorageClient, useCompositePrefixes, }: Args) => GenerateUploadInstructions;
|
|
10
|
+
export declare const generateUploadInstructions: ({ access, bucket, collectionPrefix, getStorageClient, useCompositePrefixes, }: Args) => GenerateUploadInstructions;
|
|
10
11
|
export {};
|
|
11
12
|
//# sourceMappingURL=generateUploadInstructions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateUploadInstructions.d.ts","sourceRoot":"","sources":["../src/generateUploadInstructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"generateUploadInstructions.d.ts","sourceRoot":"","sources":["../src/generateUploadInstructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAKnF,UAAU,IAAI;IACZ,MAAM,CAAC,EAAE,wBAAwB,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,OAAO,CAAA;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,eAAO,MAAM,0BAA0B,kFAMpC,IAAI,KAAG,0BAmDT,CAAA"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { resolveSignedURLKey } from '@payloadcms/plugin-cloud-storage/utilities';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { Forbidden } from 'payload';
|
|
3
|
+
export const generateUploadInstructions = ({ access, bucket, collectionPrefix, getStorageClient, useCompositePrefixes = false })=>{
|
|
4
|
+
return async ({ collectionSlug, docPrefix, filename, filesize, mimeType, overrideAccess, req })=>{
|
|
5
|
+
if (!overrideAccess && (access ? !await access({
|
|
6
|
+
collectionSlug,
|
|
7
|
+
req
|
|
8
|
+
}) : !req.user)) {
|
|
9
|
+
throw new Forbidden(req.t);
|
|
10
|
+
}
|
|
4
11
|
const { fileKey, sanitizedDocPrefix, sanitizedFilename } = await resolveSignedURLKey({
|
|
5
12
|
collectionPrefix,
|
|
6
13
|
collectionSlug,
|
|
@@ -18,12 +25,12 @@ export const generateUploadInstructions = ({ bucket, collectionPrefix, getStorag
|
|
|
18
25
|
return {
|
|
19
26
|
type: 'http',
|
|
20
27
|
file: {
|
|
21
|
-
directUpload: {
|
|
22
|
-
prefix: sanitizedDocPrefix
|
|
23
|
-
},
|
|
24
28
|
filename: sanitizedFilename,
|
|
25
29
|
mimeType,
|
|
26
|
-
size: filesize
|
|
30
|
+
size: filesize,
|
|
31
|
+
uploadReference: {
|
|
32
|
+
prefix: sanitizedDocPrefix
|
|
33
|
+
}
|
|
27
34
|
},
|
|
28
35
|
request: {
|
|
29
36
|
headers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generateUploadInstructions.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { GenerateUploadInstructions } from 'payload'\n\nimport { resolveSignedURLKey } from '@payloadcms/plugin-cloud-storage/utilities'\n\ninterface Args {\n bucket: string\n collectionPrefix: string\n getStorageClient: () => Storage\n useCompositePrefixes?: boolean\n}\n\nexport const generateUploadInstructions = ({\n bucket,\n collectionPrefix,\n getStorageClient,\n useCompositePrefixes = false,\n}: Args): GenerateUploadInstructions => {\n return async ({
|
|
1
|
+
{"version":3,"sources":["../src/generateUploadInstructions.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { GenerateUploadInstructions, UploadInstructionsAccess } from 'payload'\n\nimport { resolveSignedURLKey } from '@payloadcms/plugin-cloud-storage/utilities'\nimport { Forbidden } from 'payload'\n\ninterface Args {\n access?: UploadInstructionsAccess\n bucket: string\n collectionPrefix: string\n getStorageClient: () => Storage\n useCompositePrefixes?: boolean\n}\n\nexport const generateUploadInstructions = ({\n access,\n bucket,\n collectionPrefix,\n getStorageClient,\n useCompositePrefixes = false,\n}: Args): GenerateUploadInstructions => {\n return async ({\n collectionSlug,\n docPrefix,\n filename,\n filesize,\n mimeType,\n overrideAccess,\n req,\n }) => {\n if (!overrideAccess && (access ? !(await access({ collectionSlug, req })) : !req.user)) {\n throw new Forbidden(req.t)\n }\n\n const { fileKey, sanitizedDocPrefix, sanitizedFilename } = await resolveSignedURLKey({\n collectionPrefix,\n collectionSlug,\n docPrefix,\n filename,\n req,\n useCompositePrefixes,\n })\n\n const [url] = await getStorageClient()\n .bucket(bucket)\n .file(fileKey)\n .getSignedUrl({\n action: 'write',\n contentType: mimeType,\n expires: Date.now() + 60 * 60 * 5,\n version: 'v4',\n })\n\n return {\n type: 'http',\n file: {\n filename: sanitizedFilename,\n mimeType,\n size: filesize,\n uploadReference: { prefix: sanitizedDocPrefix },\n },\n request: {\n headers: {\n 'Content-Length': String(filesize),\n 'Content-Type': mimeType,\n },\n method: 'PUT',\n url,\n },\n }\n }\n}\n"],"names":["resolveSignedURLKey","Forbidden","generateUploadInstructions","access","bucket","collectionPrefix","getStorageClient","useCompositePrefixes","collectionSlug","docPrefix","filename","filesize","mimeType","overrideAccess","req","user","t","fileKey","sanitizedDocPrefix","sanitizedFilename","url","file","getSignedUrl","action","contentType","expires","Date","now","version","type","size","uploadReference","prefix","request","headers","String","method"],"mappings":"AAGA,SAASA,mBAAmB,QAAQ,6CAA4C;AAChF,SAASC,SAAS,QAAQ,UAAS;AAUnC,OAAO,MAAMC,6BAA6B,CAAC,EACzCC,MAAM,EACNC,MAAM,EACNC,gBAAgB,EAChBC,gBAAgB,EAChBC,uBAAuB,KAAK,EACvB;IACL,OAAO,OAAO,EACZC,cAAc,EACdC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,cAAc,EACdC,GAAG,EACJ;QACC,IAAI,CAACD,kBAAmBV,CAAAA,SAAS,CAAE,MAAMA,OAAO;YAAEK;YAAgBM;QAAI,KAAM,CAACA,IAAIC,IAAI,AAAD,GAAI;YACtF,MAAM,IAAId,UAAUa,IAAIE,CAAC;QAC3B;QAEA,MAAM,EAAEC,OAAO,EAAEC,kBAAkB,EAAEC,iBAAiB,EAAE,GAAG,MAAMnB,oBAAoB;YACnFK;YACAG;YACAC;YACAC;YACAI;YACAP;QACF;QAEA,MAAM,CAACa,IAAI,GAAG,MAAMd,mBACjBF,MAAM,CAACA,QACPiB,IAAI,CAACJ,SACLK,YAAY,CAAC;YACZC,QAAQ;YACRC,aAAaZ;YACba,SAASC,KAAKC,GAAG,KAAK,KAAK,KAAK;YAChCC,SAAS;QACX;QAEF,OAAO;YACLC,MAAM;YACNR,MAAM;gBACJX,UAAUS;gBACVP;gBACAkB,MAAMnB;gBACNoB,iBAAiB;oBAAEC,QAAQd;gBAAmB;YAChD;YACAe,SAAS;gBACPC,SAAS;oBACP,kBAAkBC,OAAOxB;oBACzB,gBAAgBC;gBAClB;gBACAwB,QAAQ;gBACRhB;YACF;QACF;IACF;AACF,EAAC"}
|
package/dist/getFile.d.ts
CHANGED
|
@@ -5,13 +5,13 @@ interface GetFileArgs {
|
|
|
5
5
|
client: Storage;
|
|
6
6
|
collection: CollectionConfig;
|
|
7
7
|
collectionPrefix?: string;
|
|
8
|
-
directUpload?: unknown;
|
|
9
8
|
filename: string;
|
|
10
9
|
incomingHeaders?: Headers;
|
|
11
10
|
prefixQueryParam?: string;
|
|
12
11
|
req: PayloadRequest;
|
|
12
|
+
uploadReference?: unknown;
|
|
13
13
|
useCompositePrefixes?: boolean;
|
|
14
14
|
}
|
|
15
|
-
export declare function getFile({ bucket, client, collection, collectionPrefix,
|
|
15
|
+
export declare function getFile({ bucket, client, collection, collectionPrefix, filename, incomingHeaders, prefixQueryParam, req, uploadReference, useCompositePrefixes, }: GetFileArgs): Promise<Response>;
|
|
16
16
|
export {};
|
|
17
17
|
//# sourceMappingURL=getFile.d.ts.map
|
package/dist/getFile.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFile.d.ts","sourceRoot":"","sources":["../src/getFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAS/D,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,gBAAgB,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,
|
|
1
|
+
{"version":3,"file":"getFile.d.ts","sourceRoot":"","sources":["../src/getFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAS/D,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,gBAAgB,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,wBAAsB,OAAO,CAAC,EAC5B,MAAM,EACN,MAAM,EACN,UAAU,EACV,gBAAqB,EACrB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,GAAG,EACH,eAAe,EACf,oBAA4B,GAC7B,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiGjC"}
|
package/dist/getFile.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { ApiError } from '@google-cloud/storage';
|
|
2
2
|
import { getFilePrefix as getDocPrefix, getFileKey } from '@payloadcms/plugin-cloud-storage/utilities';
|
|
3
3
|
import { getRangeRequestInfo } from 'payload/internal';
|
|
4
|
-
export async function getFile({ bucket, client, collection, collectionPrefix = '',
|
|
4
|
+
export async function getFile({ bucket, client, collection, collectionPrefix = '', filename, incomingHeaders, prefixQueryParam, req, uploadReference, useCompositePrefixes = false }) {
|
|
5
5
|
try {
|
|
6
6
|
const docPrefix = await getDocPrefix({
|
|
7
7
|
collection,
|
|
8
|
-
directUpload,
|
|
9
8
|
filename,
|
|
10
9
|
prefixQueryParam,
|
|
11
|
-
req
|
|
10
|
+
req,
|
|
11
|
+
uploadReference
|
|
12
12
|
});
|
|
13
13
|
const { fileKey } = getFileKey({
|
|
14
14
|
collectionPrefix,
|
package/dist/getFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/getFile.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { CollectionConfig, PayloadRequest } from 'payload'\n\nimport { ApiError } from '@google-cloud/storage'\nimport {\n getFilePrefix as getDocPrefix,\n getFileKey,\n} from '@payloadcms/plugin-cloud-storage/utilities'\nimport { getRangeRequestInfo } from 'payload/internal'\n\ninterface GetFileArgs {\n bucket: string\n client: Storage\n collection: CollectionConfig\n collectionPrefix?: string\n
|
|
1
|
+
{"version":3,"sources":["../src/getFile.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { CollectionConfig, PayloadRequest } from 'payload'\n\nimport { ApiError } from '@google-cloud/storage'\nimport {\n getFilePrefix as getDocPrefix,\n getFileKey,\n} from '@payloadcms/plugin-cloud-storage/utilities'\nimport { getRangeRequestInfo } from 'payload/internal'\n\ninterface GetFileArgs {\n bucket: string\n client: Storage\n collection: CollectionConfig\n collectionPrefix?: string\n filename: string\n incomingHeaders?: Headers\n prefixQueryParam?: string\n req: PayloadRequest\n uploadReference?: unknown\n useCompositePrefixes?: boolean\n}\n\nexport async function getFile({\n bucket,\n client,\n collection,\n collectionPrefix = '',\n filename,\n incomingHeaders,\n prefixQueryParam,\n req,\n uploadReference,\n useCompositePrefixes = false,\n}: GetFileArgs): Promise<Response> {\n try {\n const docPrefix = await getDocPrefix({\n collection,\n filename,\n prefixQueryParam,\n req,\n uploadReference,\n })\n\n const { fileKey } = getFileKey({\n collectionPrefix,\n docPrefix,\n filename,\n useCompositePrefixes,\n })\n\n const file = client.bucket(bucket).file(fileKey)\n\n const [metadata] = await file.getMetadata()\n\n // Handle range request\n const rangeHeader = req.headers.get('range')\n const fileSize = Number(metadata.size)\n const rangeResult = getRangeRequestInfo({ fileSize, rangeHeader })\n\n if (rangeResult.type === 'invalid') {\n return new Response(null, {\n headers: new Headers(rangeResult.headers),\n status: rangeResult.status,\n })\n }\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = metadata.etag\n\n let headers = new Headers(incomingHeaders)\n\n // Add range-related headers from the result\n for (const [key, value] of Object.entries(rangeResult.headers)) {\n headers.append(key, value)\n }\n\n headers.append('Content-Type', String(metadata.contentType))\n headers.append('ETag', String(metadata.etag))\n\n // Add Content-Security-Policy header for SVG files to prevent executable code\n if (metadata.contentType === 'image/svg+xml') {\n headers.append('Content-Security-Policy', \"script-src 'none'\")\n }\n\n if (\n collection.upload &&\n typeof collection.upload === 'object' &&\n typeof collection.upload.modifyResponseHeaders === 'function'\n ) {\n headers = collection.upload.modifyResponseHeaders({ headers }) || headers\n }\n\n if (etagFromHeaders && etagFromHeaders === objectEtag) {\n return new Response(null, {\n headers,\n status: 304,\n })\n }\n\n // Manually create a ReadableStream for the web from a Node.js stream.\n const readableStream = new ReadableStream({\n start(controller) {\n const streamOptions =\n rangeResult.type === 'partial'\n ? { end: rangeResult.rangeEnd, start: rangeResult.rangeStart }\n : {}\n const nodeStream = file.createReadStream(streamOptions)\n nodeStream.on('data', (chunk) => {\n controller.enqueue(new Uint8Array(chunk))\n })\n nodeStream.on('end', () => {\n controller.close()\n })\n nodeStream.on('error', (err) => {\n controller.error(err)\n })\n },\n })\n\n return new Response(readableStream, {\n headers,\n status: rangeResult.status,\n })\n } catch (err: unknown) {\n if (err instanceof ApiError && err.code === 404) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n req.payload.logger.error(err)\n return new Response('Internal Server Error', { status: 500 })\n }\n}\n"],"names":["ApiError","getFilePrefix","getDocPrefix","getFileKey","getRangeRequestInfo","getFile","bucket","client","collection","collectionPrefix","filename","incomingHeaders","prefixQueryParam","req","uploadReference","useCompositePrefixes","docPrefix","fileKey","file","metadata","getMetadata","rangeHeader","headers","get","fileSize","Number","size","rangeResult","type","Response","Headers","status","etagFromHeaders","objectEtag","etag","key","value","Object","entries","append","String","contentType","upload","modifyResponseHeaders","readableStream","ReadableStream","start","controller","streamOptions","end","rangeEnd","rangeStart","nodeStream","createReadStream","on","chunk","enqueue","Uint8Array","close","err","error","code","statusText","payload","logger"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/storage-gcs",
|
|
3
|
-
"version": "4.0.0-internal.
|
|
3
|
+
"version": "4.0.0-internal.d1cc1d3",
|
|
4
4
|
"description": "Payload storage adapter for Google Cloud Storage",
|
|
5
5
|
"homepage": "https://payloadcms.com",
|
|
6
6
|
"repository": {
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@google-cloud/storage": "7.19.0",
|
|
36
|
-
"@payloadcms/plugin-cloud-storage": "4.0.0-internal.
|
|
36
|
+
"@payloadcms/plugin-cloud-storage": "4.0.0-internal.d1cc1d3"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"payload": "4.0.0-internal.
|
|
39
|
+
"payload": "4.0.0-internal.d1cc1d3"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"payload": "4.0.0-internal.
|
|
42
|
+
"payload": "4.0.0-internal.d1cc1d3"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=24.15.0"
|