Skip to content

Commit b72eea3

Browse files
committed
Fixing exists() method on s3 provider.
Fails due to error thrown by client.
1 parent af75f21 commit b72eea3

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ export function getStorageProvider(providerId: string): StorageProvider {
3232
}
3333

3434
export * from './providers/interface'
35+
export { StorageClient } from './providers/interface'

src/providers/s3.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { WritableStream } from 'memory-streams'
2727
import makeDebug from 'debug'
2828
const debug = makeDebug('nim:storage-s3')
2929

30-
class S3RemoteFile implements RemoteFile {
30+
export class S3RemoteFile implements RemoteFile {
3131
private s3: S3Client
3232
private bucketName: string
3333
private web: boolean
@@ -79,7 +79,15 @@ class S3RemoteFile implements RemoteFile {
7979

8080
async exists(): Promise<boolean> {
8181
debug('exists was called for file %s', this.name)
82-
return !!await this.getMetadata()
82+
try {
83+
await this.getMetadata()
84+
} catch (err) {
85+
if (err?.$metadata?.httpStatusCode === 404) {
86+
return false
87+
}
88+
throw err
89+
}
90+
return true
8391
}
8492

8593
delete(): Promise<any> {

tests/s3.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import provider, { NimS3Client } from '@nimbella/storage/providers/s3'
22
import { StorageKey } from '@nimbella/storage/providers/interface'
3+
import {S3RemoteFile} from '../src/providers/s3'
4+
import {S3Client} from '@aws-sdk/client-s3'
35

46
describe('test prepareCredentials method', () => {
57
test('should return credentials instance from input parameters', () => {
@@ -25,3 +27,39 @@ describe('test getClient method', () => {
2527
expect(client.getBucketName()).toEqual(`data-${namespace}-api-nimbella-io`)
2628
})
2729
})
30+
31+
describe('test file.exists() method', () => {
32+
test('should return true if file exists', async () => {
33+
const client = { send: async () => ({ storageClass: null, ContentLength: null, etag: null }) }
34+
const file = new S3RemoteFile((client as unknown) as S3Client, '', '', false)
35+
expect(await file.exists()).toBeTruthy()
36+
})
37+
test('should return false if file does not exist', async () => {
38+
class ServiceError extends Error {
39+
"$metadata": {}
40+
}
41+
const client = {
42+
send: async () => {
43+
const err = new ServiceError('Missing file')
44+
err["$metadata"] = { httpStatusCode: 404 }
45+
throw err
46+
}
47+
}
48+
const file = new S3RemoteFile((client as unknown) as S3Client, '', '', false)
49+
expect(await file.exists()).toBeFalsy()
50+
})
51+
test('should throw error otherwise', async () => {
52+
class ServiceError extends Error {
53+
"$metadata": {}
54+
}
55+
const client = {
56+
send: async () => {
57+
const err = new ServiceError('Some error message')
58+
err["$metadata"] = { httpStatusCode: 500 }
59+
throw err
60+
}
61+
}
62+
const file = new S3RemoteFile((client as unknown) as S3Client, '', '', false)
63+
return expect(file.exists()).rejects.toThrow('Some error message');
64+
})
65+
})

0 commit comments

Comments
 (0)