Skip to report

Server-Sent Events enter NestJS routing

Trace NestJS’s server-sent event endpoints from the router into a new stream service that formats observable messages as events and closes when the request ends.

nestjs/nest #4842 · PR by soyuka · Merged

nestjs/nest 513080d8..7850c9ab

base and head as given

  • Server-sent event endpoints are now part of the HTTP routing API
  • HTTP routing now uses a dedicated server-sent event stream service
  • A server-sent events sample application was added
  • An eventsource dependency was added without component usage
files changed
29
in a component
13
lines in components
261
components
7
public routes changed
0
schema statements
0
new dependencies
1
excluded by role
16
Based on 12 of 13 eligible changed files

Server-sent event endpoints

Added
Before
SSE endpoints did not exist
After
SSE endpoints stream observables

Controllers can declare GET endpoints that stream observable messages as W3C server-sent events. The router formats event fields, opens a streaming HTTP response, and closes the subscription when the request closes.

In favour

  • In favour: Closes subscriptions when requests end, avoiding streams that outlive disconnected clients
  • In favour: Sets streaming headers that disable caching and proxy buffering

Against

  • Against: Declares eventsource without any component use
Files changed in 7 components (6 shown). Dependencies shown: 1 new, 2 unchanged
unchanged · 2new · 11 component added

1 new dependency between components — Core Router → Core Services

What else could behave differently

16 components · 36 files

These components import changed code, directly or through other files. A traced dependency is a place to review, not a confirmed runtime failure.

Reached 3

ComponentSymbolCited atFilesReached by
Commonpackages/common/Added 1 of 2 changed symbols reaching itpackages/common/interfaces/http/http-server.interface.ts:73-7811 direct
Trace path

Shortest component path from the changed symbol:

  1. HTTP Interfaces
  2. Common

Later steps follow file imports; they do not prove this symbol is called.

Core Routerpackages/core/router/Added 1 of 6 changed symbols reaching itpackages/core/helpers/handler-metadata-storage.ts:9-1343 direct · 1 at two steps
Trace path

Shortest component path from the changed symbol:

  1. Core Helpers
  2. Core Router

Later steps follow file imports; they do not prove this symbol is called.

packages/common/pipes/Added 1 of 2 changed symbols reaching itpackages/common/interfaces/http/http-server.interface.ts:73-787none direct · 6 at two steps · 1 at three steps
Trace path

Shortest component path from the changed symbol:

  1. HTTP Interfaces
  2. Common
  3. packages/common/pipes/

Later steps follow file imports; they do not prove this symbol is called.

Held back 9

ComponentFilesReached byResolution
packages/core/3none direct · 1 at three steps · 2 at four stepsprecise
packages/common/utils/1none direct · 1 at three stepsprecise
packages/common/decorators/1none direct · 1 at three stepsprecise
packages/common/cache/1none direct · 1 at four stepsprecise
packages/common/serializer/1none direct · 1 at four stepsprecise
packages/common/http/1none direct · 1 at four stepsprecise
packages/common/cache/decorators/2none direct · 2 at four stepsprecise
packages/common/cache/interceptors/1none direct · 1 at four stepsprecise
packages/common/serializer/decorators/1none direct · 1 at four stepsprecise

Ranked lower 4

ComponentFilesReached by
packages/core/middleware/4none direct · 1 at two steps · 2 at three steps · 1 at four steps
sample/28-sse/src/22 direct
packages/common/decorators/core/2none direct · 1 at two steps · 1 at three steps
packages/common/decorators/http/41 direct · 3 at two steps

Statements 3

The added MessageEvent reached 1 file in Common. 1
packages/common/interfaces/http/http-server.interface.ts:73-78
The added HandleResponseFn reached 4 files in Core Router. 31
packages/core/helpers/handler-metadata-storage.ts:9-13
The added MessageEvent reached 7 files in Common Pipes. 61
packages/common/interfaces/http/http-server.interface.ts:73-78

39 reached files belong to no component — tests, docs and config.

Routes, schema, dependencies

WhatObjectWhere
+ dependencyeventsource@^1.0.7declared, and used by no file in any component
1 statement, with the line behind it
eventsource was declared, and used by no file in any component.

Inspect components, files and symbols

Component

CommonModified
packages/common/

2 files · 2 lines

5 dependents

Common exported MessageEvent and SSE_METADATA.
Core HelpersModified
packages/core/helpers/

1 file · 11 lines

9 dependents

Core Helpers exported HandleResponseFn.
Core ServicesModified
packages/core/services/

2 files · 105 lines

3 dependents

Core Services exported HeaderStream and SseStream.
Core RouterModified
packages/core/router/

2 files · 64 lines

3 dependents

SSE SampleAdded
sample/28-sse/src/

3 files · 43 lines

The SSE sample exported AppController and AppModule.
HTTP InterfacesModified
packages/common/interfaces/http/

1 file · 7 lines

3 dependents

HTTP Interfaces exported MessageEvent.
HTTP DecoratorsModified
packages/common/decorators/http/

2 files · 29 lines

2 dependents

ranked lower · 0.07

HTTP Decorators exported Sse.

File

Commonpackages/common/
packages/common/constants.ts

+1 −0

Commonpackages/common/
packages/common/index.ts

+1 −0

Core Helperspackages/core/helpers/
packages/core/helpers/handler-metadata-storage.ts

+7 −4

Core Servicespackages/core/services/
packages/core/services/sse-stream.service.ts

+104 −0

Core Servicespackages/core/services/
packages/core/services/index.ts

+1 −0

Core Routerpackages/core/router/
packages/core/router/router-response-controller.ts

+43 −1

Core Routerpackages/core/router/
packages/core/router/router-execution-context.ts

+18 −2

SSE Samplesample/28-sse/src/
sample/28-sse/src/app.controller.ts

+25 −0

SSE Samplesample/28-sse/src/
sample/28-sse/src/app.module.ts

+9 −0

SSE Samplesample/28-sse/src/
sample/28-sse/src/main.ts

+9 −0

HTTP Interfacespackages/common/interfaces/http/
packages/common/interfaces/http/http-server.interface.ts

+7 −0

HTTP Decoratorspackages/common/decorators/http/
packages/common/decorators/http/sse.decorator.ts

+28 −0

HTTP Decoratorspackages/common/decorators/http/
packages/common/decorators/http/index.ts

+1 −0

Function

imports what changeddownstream of it, one mark per step

SSE_METADATA()packages/common/constants.ts

reaches 7 components

The added SSE_METADATA reached 4 files in HTTP Decorators. 13
packages/common/constants.ts:29
The added SSE_METADATA reached 1 file in Common Decorators. 1
packages/common/constants.ts:29
The added SSE_METADATA reached 1 file in Common Cache. 1
packages/common/constants.ts:29
The added SSE_METADATA reached 1 file in Common HTTP. 1
packages/common/constants.ts:29
The added SSE_METADATA reached 2 files in Cache Decorators. 2
packages/common/constants.ts:29
The added SSE_METADATA reached 1 file in Cache Interceptors. 1
packages/common/constants.ts:29
The added SSE_METADATA reached 1 file in Serializer Decorators. 1
packages/common/constants.ts:29
MessageEvent()packages/common/interfaces/http/http-server.interface.ts

reaches 3 components

The added MessageEvent reached 2 files in Core Decorators. 11
packages/common/interfaces/http/http-server.interface.ts:73-78
The added MessageEvent reached 1 file in Common Utils. 1
packages/common/interfaces/http/http-server.interface.ts:73-78
The added MessageEvent reached 1 file in Common Serializer. 1
packages/common/interfaces/http/http-server.interface.ts:73-78
RouterExecutionContext()packages/core/router/router-execution-context.ts

reaches 2 components

The RouterExecutionContext signature changed and reached 4 files in Core Middleware. 121
packages/core/router/router-execution-context.ts:56-435
The RouterExecutionContext signature changed and reached 3 files in Core. 12
packages/core/router/router-execution-context.ts:56-435

Diff

Commonpackages/common/
packages/common/constants.ts

29–29

Commonpackages/common/
packages/common/index.ts

34–34

Core Helperspackages/core/helpers/
packages/core/helpers/handler-metadata-storage.ts

9–14, 26–26

Core Servicespackages/core/services/
packages/core/services/sse-stream.service.ts

1–104

Core Servicespackages/core/services/
packages/core/services/index.ts

2–2

Core Routerpackages/core/router/
packages/core/router/router-response-controller.ts

1–6, 8–11, 90–122

Core Routerpackages/core/router/
packages/core/router/router-execution-context.ts

16–16, 30–30, 165–165 and 3 more spans

SSE Samplesample/28-sse/src/
sample/28-sse/src/app.controller.ts

1–25

SSE Samplesample/28-sse/src/
sample/28-sse/src/app.module.ts

1–9

SSE Samplesample/28-sse/src/
sample/28-sse/src/main.ts

1–9

HTTP Interfacespackages/common/interfaces/http/
packages/common/interfaces/http/http-server.interface.ts

72–78

HTTP Decoratorspackages/common/decorators/http/
packages/common/decorators/http/sse.decorator.ts

1–28

HTTP Decoratorspackages/common/decorators/http/
packages/common/decorators/http/index.ts

8–8

Analysis scope

1447 → 7
  1. 1,447
    files at head
  2. 210
    components
  3. 7
    changed by this change
  4. 6
    shown above of 7

Where the new files landed

5 new files
New fileBelongs toUsed byCallsServes
packages/core/services/sse-stream.service.ts
Core Servicesbase frame
Core Router
nothing outside its own component
sample/28-sse/src/3 new files
SSE Samplenew territory
its own component only — 1 of 3 files imported by nothingnothing outside its own component
packages/common/decorators/http/sse.decorator.ts
HTTP Decoratorsbase frame
its own component only
Commonpackages/common/enums/

12 added files carry no component — 7 config, 3 test, 1 asset, 1 docs.

7components changed
12reached, not changed
1components added/removed
1dependencies added between components
0dependencies removed between components
0files moved to another path

29 files changed, 30 claims stated. 16 components reached in total.

naming: “model

narrative: “model

analyzer 0.2.0, config v1.9.0-phase8

Every line above is derived from 513080d8..7850c9ab and nothing else.