@payloadcms/storage-r2 3.71.0-internal.ef75fa0 → 3.71.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/staticHandler.d.ts +1 -1
- package/dist/staticHandler.d.ts.map +1 -1
- package/dist/staticHandler.js +69 -21
- package/dist/staticHandler.js.map +1 -1
- package/dist/types.d.ts +14 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +4 -4
package/dist/staticHandler.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ interface Args {
|
|
|
6
6
|
collection: CollectionConfig;
|
|
7
7
|
prefix?: string;
|
|
8
8
|
}
|
|
9
|
-
export declare const getHandler: ({ bucket, prefix }: Args) => StaticHandler;
|
|
9
|
+
export declare const getHandler: ({ bucket, collection, prefix }: Args) => StaticHandler;
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=staticHandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAK/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,UAAU,IAAI;IACZ,MAAM,EAAE,QAAQ,CAAA;IAChB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID,eAAO,MAAM,UAAU,mCAAyC,IAAI,KAAG,aA8EtE,CAAA"}
|
package/dist/staticHandler.js
CHANGED
|
@@ -1,28 +1,76 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
+
import { getRangeRequestInfo } from 'payload/internal';
|
|
2
3
|
const isMiniflare = process.env.NODE_ENV === 'development';
|
|
3
|
-
export const getHandler = ({ bucket, prefix = '' })=>{
|
|
4
|
-
return async (req, { params: { filename } })=>{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
export const getHandler = ({ bucket, collection, prefix = '' })=>{
|
|
5
|
+
return async (req, { headers: incomingHeaders, params: { filename } })=>{
|
|
6
|
+
try {
|
|
7
|
+
const key = path.posix.join(prefix, filename);
|
|
8
|
+
// Get file size for range validation
|
|
9
|
+
const headObj = await bucket?.head(key);
|
|
10
|
+
if (!headObj) {
|
|
11
|
+
return new Response(null, {
|
|
12
|
+
status: 404,
|
|
13
|
+
statusText: 'Not Found'
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const fileSize = headObj.size;
|
|
17
|
+
// Handle range request
|
|
18
|
+
const rangeHeader = req.headers.get('range');
|
|
19
|
+
const rangeResult = getRangeRequestInfo({
|
|
20
|
+
fileSize,
|
|
21
|
+
rangeHeader
|
|
22
|
+
});
|
|
23
|
+
if (rangeResult.type === 'invalid') {
|
|
24
|
+
return new Response(null, {
|
|
25
|
+
headers: new Headers(rangeResult.headers),
|
|
26
|
+
status: rangeResult.status
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Get object with range if needed
|
|
30
|
+
// Due to https://github.com/cloudflare/workers-sdk/issues/6047
|
|
31
|
+
// We cannot send a Headers instance to Miniflare
|
|
32
|
+
const obj = rangeResult.type === 'partial' && !isMiniflare ? await bucket?.get(key, {
|
|
33
|
+
range: {
|
|
34
|
+
length: rangeResult.rangeEnd - rangeResult.rangeStart + 1,
|
|
35
|
+
offset: rangeResult.rangeStart
|
|
36
|
+
}
|
|
37
|
+
}) : await bucket?.get(key);
|
|
38
|
+
if (obj?.body == undefined) {
|
|
39
|
+
return new Response(null, {
|
|
40
|
+
status: 404,
|
|
41
|
+
statusText: 'Not Found'
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
let headers = new Headers(incomingHeaders);
|
|
45
|
+
// Add range-related headers from the result
|
|
46
|
+
for (const [key, value] of Object.entries(rangeResult.headers)){
|
|
47
|
+
headers.append(key, value);
|
|
48
|
+
}
|
|
49
|
+
// Add R2-specific headers
|
|
50
|
+
if (!isMiniflare) {
|
|
51
|
+
obj.writeHttpMetadata(headers);
|
|
52
|
+
}
|
|
53
|
+
const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match');
|
|
54
|
+
if (collection.upload && typeof collection.upload === 'object' && typeof collection.upload.modifyResponseHeaders === 'function') {
|
|
55
|
+
headers = collection.upload.modifyResponseHeaders({
|
|
56
|
+
headers
|
|
57
|
+
}) || headers;
|
|
58
|
+
}
|
|
59
|
+
if (etagFromHeaders && etagFromHeaders === obj.etag) {
|
|
60
|
+
return new Response(null, {
|
|
61
|
+
headers,
|
|
62
|
+
status: 304
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return new Response(obj.body, {
|
|
66
|
+
headers,
|
|
67
|
+
status: rangeResult.status
|
|
68
|
+
});
|
|
69
|
+
} catch (err) {
|
|
70
|
+
return new Response('Internal Server Error', {
|
|
71
|
+
status: 500
|
|
13
72
|
});
|
|
14
73
|
}
|
|
15
|
-
const headers = new Headers();
|
|
16
|
-
if (!isMiniflare) {
|
|
17
|
-
obj.writeHttpMetadata(headers);
|
|
18
|
-
}
|
|
19
|
-
return obj.etag === (req.headers.get('etag') || req.headers.get('if-none-match')) ? new Response(null, {
|
|
20
|
-
headers,
|
|
21
|
-
status: 304
|
|
22
|
-
}) : new Response(obj.body, {
|
|
23
|
-
headers,
|
|
24
|
-
status: 200
|
|
25
|
-
});
|
|
26
74
|
};
|
|
27
75
|
};
|
|
28
76
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\n\nimport path from 'path'\n\nimport type { R2Bucket } from './types.js'\n\ninterface Args {\n bucket: R2Bucket\n collection: CollectionConfig\n prefix?: string\n}\n\nconst isMiniflare = process.env.NODE_ENV === 'development'\n\nexport const getHandler = ({ bucket, prefix = '' }: Args): StaticHandler => {\n return async (req, { params: { filename } }) => {\n // Due to https://github.com/cloudflare/workers-sdk/issues/6047\n
|
|
1
|
+
{"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\n\nimport path from 'path'\nimport { getRangeRequestInfo } from 'payload/internal'\n\nimport type { R2Bucket } from './types.js'\n\ninterface Args {\n bucket: R2Bucket\n collection: CollectionConfig\n prefix?: string\n}\n\nconst isMiniflare = process.env.NODE_ENV === 'development'\n\nexport const getHandler = ({ bucket, collection, prefix = '' }: Args): StaticHandler => {\n return async (req, { headers: incomingHeaders, params: { filename } }) => {\n try {\n const key = path.posix.join(prefix, filename)\n\n // Get file size for range validation\n const headObj = await bucket?.head(key)\n if (!headObj) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const fileSize = headObj.size\n\n // Handle range request\n const rangeHeader = req.headers.get('range')\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 // Get object with range if needed\n // Due to https://github.com/cloudflare/workers-sdk/issues/6047\n // We cannot send a Headers instance to Miniflare\n const obj =\n rangeResult.type === 'partial' && !isMiniflare\n ? await bucket?.get(key, {\n range: {\n length: rangeResult.rangeEnd - rangeResult.rangeStart + 1,\n offset: rangeResult.rangeStart,\n },\n })\n : await bucket?.get(key)\n\n if (obj?.body == undefined) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\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 // Add R2-specific headers\n if (!isMiniflare) {\n obj.writeHttpMetadata(headers)\n }\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\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 === obj.etag) {\n return new Response(null, {\n headers,\n status: 304,\n })\n }\n\n return new Response(obj.body, {\n headers,\n status: rangeResult.status,\n })\n } catch (err: unknown) {\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["path","getRangeRequestInfo","isMiniflare","process","env","NODE_ENV","getHandler","bucket","collection","prefix","req","headers","incomingHeaders","params","filename","key","posix","join","headObj","head","Response","status","statusText","fileSize","size","rangeHeader","get","rangeResult","type","Headers","obj","range","length","rangeEnd","rangeStart","offset","body","undefined","value","Object","entries","append","writeHttpMetadata","etagFromHeaders","upload","modifyResponseHeaders","etag","err"],"mappings":"AAGA,OAAOA,UAAU,OAAM;AACvB,SAASC,mBAAmB,QAAQ,mBAAkB;AAUtD,MAAMC,cAAcC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAE7C,OAAO,MAAMC,aAAa,CAAC,EAAEC,MAAM,EAAEC,UAAU,EAAEC,SAAS,EAAE,EAAQ;IAClE,OAAO,OAAOC,KAAK,EAAEC,SAASC,eAAe,EAAEC,QAAQ,EAAEC,QAAQ,EAAE,EAAE;QACnE,IAAI;YACF,MAAMC,MAAMf,KAAKgB,KAAK,CAACC,IAAI,CAACR,QAAQK;YAEpC,qCAAqC;YACrC,MAAMI,UAAU,MAAMX,QAAQY,KAAKJ;YACnC,IAAI,CAACG,SAAS;gBACZ,OAAO,IAAIE,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMC,WAAWL,QAAQM,IAAI;YAE7B,uBAAuB;YACvB,MAAMC,cAAcf,IAAIC,OAAO,CAACe,GAAG,CAAC;YACpC,MAAMC,cAAc1B,oBAAoB;gBAAEsB;gBAAUE;YAAY;YAEhE,IAAIE,YAAYC,IAAI,KAAK,WAAW;gBAClC,OAAO,IAAIR,SAAS,MAAM;oBACxBT,SAAS,IAAIkB,QAAQF,YAAYhB,OAAO;oBACxCU,QAAQM,YAAYN,MAAM;gBAC5B;YACF;YAEA,kCAAkC;YAClC,+DAA+D;YAC/D,iDAAiD;YACjD,MAAMS,MACJH,YAAYC,IAAI,KAAK,aAAa,CAAC1B,cAC/B,MAAMK,QAAQmB,IAAIX,KAAK;gBACrBgB,OAAO;oBACLC,QAAQL,YAAYM,QAAQ,GAAGN,YAAYO,UAAU,GAAG;oBACxDC,QAAQR,YAAYO,UAAU;gBAChC;YACF,KACA,MAAM3B,QAAQmB,IAAIX;YAExB,IAAIe,KAAKM,QAAQC,WAAW;gBAC1B,OAAO,IAAIjB,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,IAAIX,UAAU,IAAIkB,QAAQjB;YAE1B,4CAA4C;YAC5C,KAAK,MAAM,CAACG,KAAKuB,MAAM,IAAIC,OAAOC,OAAO,CAACb,YAAYhB,OAAO,EAAG;gBAC9DA,QAAQ8B,MAAM,CAAC1B,KAAKuB;YACtB;YAEA,0BAA0B;YAC1B,IAAI,CAACpC,aAAa;gBAChB4B,IAAIY,iBAAiB,CAAC/B;YACxB;YAEA,MAAMgC,kBAAkBjC,IAAIC,OAAO,CAACe,GAAG,CAAC,WAAWhB,IAAIC,OAAO,CAACe,GAAG,CAAC;YAEnE,IACElB,WAAWoC,MAAM,IACjB,OAAOpC,WAAWoC,MAAM,KAAK,YAC7B,OAAOpC,WAAWoC,MAAM,CAACC,qBAAqB,KAAK,YACnD;gBACAlC,UAAUH,WAAWoC,MAAM,CAACC,qBAAqB,CAAC;oBAAElC;gBAAQ,MAAMA;YACpE;YAEA,IAAIgC,mBAAmBA,oBAAoBb,IAAIgB,IAAI,EAAE;gBACnD,OAAO,IAAI1B,SAAS,MAAM;oBACxBT;oBACAU,QAAQ;gBACV;YACF;YAEA,OAAO,IAAID,SAASU,IAAIM,IAAI,EAAE;gBAC5BzB;gBACAU,QAAQM,YAAYN,MAAM;YAC5B;QACF,EAAE,OAAO0B,KAAc;YACrB,OAAO,IAAI3B,SAAS,yBAAyB;gBAAEC,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
|
+
export interface R2Range {
|
|
2
|
+
/** The number of bytes to return */
|
|
3
|
+
length?: number;
|
|
4
|
+
/** The byte offset to start from (inclusive) */
|
|
5
|
+
offset?: number;
|
|
6
|
+
/** Return the last n bytes */
|
|
7
|
+
suffix?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface R2GetOptions {
|
|
10
|
+
[key: string]: any;
|
|
11
|
+
onlyIf?: any | Headers;
|
|
12
|
+
range?: R2Range;
|
|
13
|
+
}
|
|
1
14
|
export interface R2Bucket {
|
|
2
15
|
createMultipartUpload(key: string, options?: any): Promise<any>;
|
|
3
16
|
delete(keys: string | string[]): Promise<void>;
|
|
4
|
-
get(key: string, options:
|
|
5
|
-
onlyIf: any | Headers;
|
|
6
|
-
} & any): Promise<any | null>;
|
|
7
|
-
get(key: string, options?: any): Promise<any | null>;
|
|
17
|
+
get(key: string, options?: R2GetOptions): Promise<any | null>;
|
|
8
18
|
head(key: string): Promise<any>;
|
|
9
19
|
list(options?: any): Promise<any>;
|
|
10
20
|
put(key: string, value: ArrayBuffer | ArrayBufferView | Blob | null | ReadableStream | string, options?: {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IAC7D,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,EAC5E,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,GAAG,GAAG,OAAO,CAAA;QAC5B,MAAM,EAAE,GAAG,CAAA;KACZ,GAAG,GAAG,GACN,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IACtB,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,EAC5E,OAAO,CAAC,EAAE,GAAG,GACZ,OAAO,CAAC,GAAG,CAAC,CAAA;IACf,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAA;CAC1D"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["export interface
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["export interface R2Range {\n /** The number of bytes to return */\n length?: number\n /** The byte offset to start from (inclusive) */\n offset?: number\n /** Return the last n bytes */\n suffix?: number\n}\n\nexport interface R2GetOptions {\n [key: string]: any\n onlyIf?: any | Headers\n range?: R2Range\n}\n\nexport interface R2Bucket {\n createMultipartUpload(key: string, options?: any): Promise<any>\n delete(keys: string | string[]): Promise<void>\n get(key: string, options?: R2GetOptions): Promise<any | null>\n head(key: string): Promise<any>\n list(options?: any): Promise<any>\n put(\n key: string,\n value: ArrayBuffer | ArrayBufferView | Blob | null | ReadableStream | string,\n options?: {\n httpMetadata?: any | Headers\n onlyIf: any\n } & any,\n ): Promise<any | null>\n put(\n key: string,\n value: ArrayBuffer | ArrayBufferView | Blob | null | ReadableStream | string,\n options?: any,\n ): Promise<any>\n resumeMultipartUpload(key: string, uploadId: string): any\n}\n"],"names":[],"mappings":"AAeA,WAoBC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/storage-r2",
|
|
3
|
-
"version": "3.71.0
|
|
3
|
+
"version": "3.71.0",
|
|
4
4
|
"description": "Payload storage adapter for Cloudflare R2",
|
|
5
5
|
"homepage": "https://payloadcms.com",
|
|
6
6
|
"repository": {
|
|
@@ -37,13 +37,13 @@
|
|
|
37
37
|
"dist"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@payloadcms/plugin-cloud-storage": "3.71.0
|
|
40
|
+
"@payloadcms/plugin-cloud-storage": "3.71.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"payload": "3.71.0
|
|
43
|
+
"payload": "3.71.0"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
|
-
"payload": "3.71.0
|
|
46
|
+
"payload": "3.71.0"
|
|
47
47
|
},
|
|
48
48
|
"engines": {
|
|
49
49
|
"node": "^18.20.2 || >=20.9.0"
|