Skip to content

Commit f450476

Browse files
committed
Added support for StreamableFile class
1 parent 640a696 commit f450476

File tree

2 files changed

+26
-24
lines changed

2 files changed

+26
-24
lines changed

src/app/app.controller.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
1-
import { Controller, Get, Param, Post, Req, Res } from '@nestjs/common'
2-
import { AppService } from './app.service'
3-
4-
import { FastifyRequest, FastifyReply } from 'fastify'
5-
import { Http2ServerResponse } from 'http2'
61
import {
7-
ApiTags,
8-
ApiOperation,
2+
Controller,
3+
Get,
4+
Param,
5+
Post,
6+
Req,
7+
Res,
8+
StreamableFile,
9+
} from '@nestjs/common'
10+
import {
911
ApiConsumes,
10-
ApiOkResponse,
1112
ApiCreatedResponse,
13+
ApiOkResponse,
14+
ApiOperation,
15+
ApiTags,
1216
} from '@nestjs/swagger'
17+
import { FastifyReply, FastifyRequest } from 'fastify'
18+
import { AppService } from './app.service'
1319
import { File } from './models/file.entity'
1420

1521
type Request = FastifyRequest
@@ -79,8 +85,8 @@ export class AppController {
7985
downloadFile(
8086
@Param('id') id: string,
8187
@Req() request: Request,
82-
@Res() response: Response,
83-
) {
84-
this.appService.download(id, request, response)
88+
@Res({ passthrough: true }) response: Response,
89+
): Promise<StreamableFile> {
90+
return this.appService.download(id, request, response)
8591
}
8692
}

src/app/app.service.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import {
2+
BadRequestException,
23
Injectable,
34
NotFoundException,
45
ServiceUnavailableException,
5-
BadRequestException,
6+
StreamableFile,
67
} from '@nestjs/common'
78
import { InjectConnection, InjectModel } from '@nestjs/mongoose'
89
import { FastifyReply, FastifyRequest } from 'fastify'
9-
import { Http2ServerResponse } from 'http2'
1010
import { GridFSBucket, ObjectId } from 'mongodb'
1111
import { Connection, Model, mongo } from 'mongoose'
12-
import { File } from './models/file.entity'
1312
import { Stream } from 'stream'
13+
import { File } from './models/file.entity'
1414

1515
type Request = FastifyRequest
1616
type Response = FastifyReply
@@ -60,7 +60,11 @@ export class AppService {
6060
})
6161
}
6262

63-
async download(id: string, request: Request, response: Response) {
63+
async download(
64+
id: string,
65+
request: Request,
66+
response: Response,
67+
): Promise<StreamableFile> {
6468
try {
6569
if (!ObjectId.isValid(id)) {
6670
throw new BadRequestException(null, 'InvalidVideoId')
@@ -93,18 +97,10 @@ export class AppService {
9397
'Content-Disposition': `attachment; filename="${fileInfo.filename}"`,
9498
})
9599

96-
response.raw.on('close', () => {
97-
readstream.destroy()
98-
})
99-
100-
response.send(readstream)
100+
return new StreamableFile(readstream)
101101
} else {
102102
const readstream = this.bucket.openDownloadStream(oId)
103103

104-
response.raw.on('close', () => {
105-
readstream.destroy()
106-
})
107-
108104
response.status(200)
109105
response.headers({
110106
'Accept-Range': 'bytes',

0 commit comments

Comments
 (0)