| 22 | |
| 23 | @Controller() |
| 24 | export class AppController { |
| 25 | private promiseDelayedRequestsStarted = 0; |
| 26 | private promiseDelayedSubscriptionsStarted = 0; |
| 27 | private promiseDelayedCloseEventsObserved = 0; |
| 28 | private promiseDelayedTeardownsObserved = 0; |
| 29 | private promiseDelayedRunningStreams = 0; |
| 30 | private readonly promiseDelayedResolvers: Array<() => void> = []; |
| 31 | |
| 32 | @Sse('sse') |
| 33 | sse(): Observable<MessageEvent> { |
| 34 | return interval(1000).pipe( |
| 35 | map(() => ({ data: { hello: 'world' } }) as MessageEvent), |
| 36 | ); |
| 37 | } |
| 38 | |
| 39 | @Sse('sse/validated') |
| 40 | sseWithValidatedQuery(@Query() query: SseQueryDto): Observable<MessageEvent> { |
| 41 | return of({ data: { limit: query.limit } }); |
| 42 | } |
| 43 | |
| 44 | @Sse('sse/burst') |
| 45 | sseBurst( |
| 46 | @Query('n') n = '20', |
| 47 | @Query('size') size = '65536', |
| 48 | ): Observable<MessageEvent> { |
| 49 | const count = parseInt(n, 10); |
| 50 | const payload = 'X'.repeat(parseInt(size, 10)); |
| 51 | |
| 52 | return new Observable(subscriber => { |
| 53 | for (let i = 0; i < count; i++) { |
| 54 | subscriber.next({ data: payload }); |
| 55 | } |
| 56 | subscriber.complete(); |
| 57 | }); |
| 58 | } |
| 59 | |
| 60 | @Sse('sse/post', { method: RequestMethod.POST }) |
| 61 | ssePost(@Body() body: { content?: string }): Observable<MessageEvent> { |
| 62 | return of({ data: { content: body.content ?? 'default' } }); |
| 63 | } |
| 64 | |
| 65 | @Sse('sse/promise-delayed') |
| 66 | ssePromiseDelayed( |
| 67 | @Req() request: IncomingMessage & { raw?: IncomingMessage }, |
| 68 | ): Promise<Observable<MessageEvent>> { |
| 69 | return this.createPromiseDelayedSse(request); |
| 70 | } |
| 71 | |
| 72 | @Sse('sse/post/promise-delayed', { method: RequestMethod.POST }) |
| 73 | ssePostPromiseDelayed( |
| 74 | @Req() request: IncomingMessage & { raw?: IncomingMessage }, |
| 75 | @Body() _body: { content?: string }, |
| 76 | ): Promise<Observable<MessageEvent>> { |
| 77 | return this.createPromiseDelayedSse(request); |
| 78 | } |
| 79 | |
| 80 | private createPromiseDelayedSse( |
| 81 | request: IncomingMessage & { raw?: IncomingMessage }, |