Skip to content

Commit d7cb9ae

Browse files
committed
feat: add 50GB file size limit to object storage [beta]
1 parent 8b628fe commit d7cb9ae

File tree

5 files changed

+43
-3
lines changed

5 files changed

+43
-3
lines changed

lib/minimal-package.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export default { name: '@mondaycom/apps-sdk', version: '3.3.0' };
1+
export default { name: '@mondaycom/apps-sdk', version: '3.3.0-beta.6' };

lib/object-storage/object-storage.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,18 @@ export class ObjectStorage {
222222
const fifteenMinutesFromNow = new Date(Date.now() + TIME_IN_MILLISECOND.MINUTE * 15);
223223
const expires = options.expires || fifteenMinutesFromNow;
224224

225+
const maxFileSizeBytes = options.maxFileSizeBytes || (50 * 1024 * 1024 * 1024);
226+
225227
const signedUrlOptions = {
226228
version: 'v4' as const,
227229
action: 'write' as const,
228230
expires,
229231
...(options.contentType && {
230232
contentType: options.contentType
231-
})
233+
}),
234+
extensionHeaders: {
235+
'x-goog-content-length-range': `0,${maxFileSizeBytes}`
236+
}
232237
};
233238

234239
const [presignedUrl] = await file.getSignedUrl(signedUrlOptions);

lib/types/object-storage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export type GetFileInfoResponse = BaseResponse & {
4747
export type PresignedUrlOptions = {
4848
expires?: Date;
4949
contentType?: string;
50+
maxFileSizeBytes?: number;
5051
}
5152

5253
export type PresignedUrlResponse = BaseResponse & {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@mondaycom/apps-sdk",
3-
"version": "3.3.0",
3+
"version": "3.3.0-beta.6",
44
"description": "monday apps SDK for NodeJS",
55
"main": "./dist/cjs/index.js",
66
"module": "./dist/esm/index.js",

tests/object-storage/object-storage.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,9 @@ describe('ObjectStorage', () => {
303303
action: 'write',
304304
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
305305
expires: expect.any(Date),
306+
extensionHeaders: {
307+
'x-goog-content-length-range': '0,53687091200', // 50 GB default limit
308+
},
306309
});
307310
});
308311

@@ -322,6 +325,9 @@ describe('ObjectStorage', () => {
322325
version: 'v4',
323326
action: 'write',
324327
expires: customExpires,
328+
extensionHeaders: {
329+
'x-goog-content-length-range': '0,53687091200', // 50 GB default limit
330+
},
325331
});
326332
});
327333

@@ -343,6 +349,9 @@ describe('ObjectStorage', () => {
343349
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
344350
expires: expect.any(Date),
345351
contentType: 'text/plain',
352+
extensionHeaders: {
353+
'x-goog-content-length-range': '0,53687091200', // 50 GB default limit
354+
},
346355
});
347356
});
348357

@@ -367,6 +376,9 @@ describe('ObjectStorage', () => {
367376
action: 'write',
368377
expires: customExpires,
369378
contentType: 'application/json',
379+
extensionHeaders: {
380+
'x-goog-content-length-range': '0,53687091200', // 50 GB default limit
381+
},
370382
});
371383
});
372384

@@ -388,6 +400,9 @@ describe('ObjectStorage', () => {
388400
version: 'v4',
389401
action: 'write',
390402
expires: new Date(mockNow + 15 * 60 * 1000), // 15 minutes from mockNow
403+
extensionHeaders: {
404+
'x-goog-content-length-range': '0,53687091200', // 50 GB default limit
405+
},
391406
});
392407

393408
// Restore original Date.now
@@ -416,5 +431,24 @@ describe('ObjectStorage', () => {
416431
expect(result.success).toBe(false);
417432
expect(result.error).toContain('Failed to generate presigned upload URL');
418433
});
434+
435+
it('should enforce 50 GB max file size limit', async () => {
436+
const fileName = 'large-file.bin';
437+
const expectedUrl = 'https://storage.googleapis.com/test-bucket/large-file.bin?signed-url-params';
438+
const fiftyGBInBytes = 50 * 1024 * 1024 * 1024; // 53,687,091,200 bytes
439+
440+
mockFile.getSignedUrl.mockResolvedValueOnce([expectedUrl]);
441+
442+
const result = await objectStorage.getPresignedUploadUrl(fileName);
443+
444+
expect(result.success).toBe(true);
445+
expect(mockFile.getSignedUrl).toHaveBeenCalledWith(
446+
expect.objectContaining({
447+
extensionHeaders: {
448+
'x-goog-content-length-range': `0,${fiftyGBInBytes}`,
449+
},
450+
}),
451+
);
452+
});
419453
});
420454
});

0 commit comments

Comments
 (0)