Skip to content

Commit

Permalink
🧹 fix: mapFile
Browse files Browse the repository at this point in the history
  • Loading branch information
SaltyAom committed Dec 23, 2023
1 parent 8e810bb commit 4ba3e85
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 55 deletions.
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 0.8.0
# 0.8.0 - 23 Dec 2023
Feature:
- `headers` initialization function
- macro
Expand All @@ -12,7 +12,7 @@ Feature:

Improvement:
- lazy query reference
- add content-range header to `Blob` by default
- add content-range header to `File` and `Blob` by default if etag is not used
- update TypeBox to 0.32
- override lifecycle response of `be` and `af`

Expand Down
92 changes: 39 additions & 53 deletions src/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,40 @@ export const isNotEmpty = (obj: Object) => {
return false
}

const handleFile = (response: File | Blob, set?: Context['set']) => {
const size = response.size
if (
(size &&
set &&
set.status !== 206 &&
set.status !== 304 &&
set.status !== 412 &&
set.status !== 416) ||
(!set && size)
) {
if (set)
return new Response(response as Blob, {
status: set.status as number,
headers: Object.assign(
{
'accept-ranges': 'bytes',
'content-range': `bytes 0-${size - 1}/${size}`
},
set.headers
)
})

return new Response(response as Blob, {
headers: {
'accept-ranges': 'bytes',
'content-range': `bytes 0-${size - 1}/${size}`
}
})
}

return new Response(response as Blob)
}

export const parseSetCookies = (headers: Headers, setCookie: string[]) => {
if (!headers || !Array.isArray(setCookie)) return headers

Expand Down Expand Up @@ -117,19 +151,7 @@ export const mapResponse = (
return new Response(response as string, set as SetResponse)

case 'Blob':
const size = (response as File).size
if (size)
return new Response(response as Blob, {
status: set.status,
headers: Object.assign(
{
'accept-ranges': 'bytes',
'content-range': `bytes 0-${size - 1}/${size}`
},
set.headers
)
})
else return new Response(response as Blob)
return handleFile(response as File | Blob, set)

case 'Object':
case 'Array':
Expand Down Expand Up @@ -213,15 +235,7 @@ export const mapResponse = (
return new Response(response as string)

case 'Blob':
const size = (response as File).size
if (size)
return new Response(response as Blob, {
headers: {
'accept-ranges': 'bytes',
'content-range': `bytes 0-${size - 1}/${size}`
}
})
else return new Response(response as Blob)
return handleFile(response as File | Blob, set)

case 'Object':
case 'Array':
Expand Down Expand Up @@ -343,19 +357,7 @@ export const mapEarlyResponse = (
return new Response(response as string, set as SetResponse)

case 'Blob':
const size = (response as File).size
if (size)
return new Response(response as Blob, {
status: set.status,
headers: Object.assign(
{
'accept-ranges': 'bytes',
'content-range': `bytes 0-${size - 1}/${size}`
},
set.headers
)
})
else return new Response(response as Blob)
return handleFile(response as File | Blob, set)

case 'Object':
case 'Array':
Expand Down Expand Up @@ -449,15 +451,7 @@ export const mapEarlyResponse = (
return new Response(response as string)

case 'Blob':
const size = (response as File).size
if (size)
return new Response(response as Blob, {
headers: {
'accept-ranges': 'bytes',
'content-range': `bytes 0-${size - 1}/${size}`
}
})
else return new Response(response as Blob)
return handleFile(response as File | Blob, set)

case 'Object':
case 'Array':
Expand Down Expand Up @@ -547,15 +541,7 @@ export const mapCompactResponse = (response: unknown): Response => {
return new Response(response as string)

case 'Blob':
const size = (response as File).size
if (size)
return new Response(response as Blob, {
headers: {
'accept-ranges': 'bytes',
'content-range': `bytes 0-${size - 1}/${size}`
}
})
else return new Response(response as Blob)
return handleFile(response as File | Blob)

case 'Object':
case 'Array':
Expand Down
13 changes: 13 additions & 0 deletions test/units/map-early-response.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,4 +298,17 @@ describe('Map Early Response', () => {
expect(response?.status).toBe(200)
})

it('skip content-range on not modified', async () => {
const kyuukararin = Bun.file('test/kyuukurarin.mp4')

const response = mapEarlyResponse(kyuukararin, {
...defaultContext,
status: 304,
})

expect(response).toBeInstanceOf(Response)
expect(response?.headers.get('accept-ranges')).toBeNull()
expect(response?.headers.get('content-range')).toBeNull()
expect(response?.status).toBe(200)
})
})
14 changes: 14 additions & 0 deletions test/units/map-response.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,4 +326,18 @@ describe('Map Response', () => {
)
expect(response.status).toBe(200)
})

it('map video on not modified', async () => {
const kyuukararin = Bun.file('test/kyuukurarin.mp4')

const response = mapResponse(kyuukararin, {
...defaultContext,
status: 304,
})

expect(response).toBeInstanceOf(Response)
expect(response.headers.get('accept-ranges')).toBeNull()
expect(response.headers.get('content-range')).toBeNull()
expect(response.status).toBe(200)
})
})

0 comments on commit 4ba3e85

Please sign in to comment.