Skip to content

Commit 3a088fc

Browse files
authored
feat: add support for mock Server-Sent-Events (#101)
* feat: add support for mock `Server-Sent-Events` * chore: add example * docs: add docs * docs: update readme
1 parent 1331cd5 commit 3a088fc

File tree

11 files changed

+332
-13
lines changed

11 files changed

+332
-13
lines changed

README.md

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
- 🌈 Support `vite preview` mode.
4444
- 📤 Support `multipart` content-type, mock upload file.
4545
- 📥 Support mock download file.
46-
- ⚜️ Support `WebSocket Mock`
46+
- ⚜️ Support `WebSocket Mock` and `Server-Sent Events Mock`
4747
- 🗂 Support building small independent deployable mock services.
4848

4949
## Documentation
@@ -155,6 +155,23 @@ export default defineApiMock({
155155
})
156156
```
157157

158+
### createSSEStream(req, res)
159+
160+
Create a `Server-sent events` write stream to support mocking `EventSource`.
161+
162+
``` ts
163+
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
164+
165+
export default defineMock({
166+
url: '/api/sse',
167+
response: (req, res) => {
168+
const sse = createSSEStream(req, res)
169+
sse.write({ event: 'message', data: { message: 'hello world' } })
170+
sse.end()
171+
}
172+
})
173+
```
174+
158175
## Plugin Options
159176

160177
### prefix
@@ -961,6 +978,40 @@ ws.addEventListener('message', (raw) => {
961978
})
962979
```
963980

981+
**示例:** EventSource Mock
982+
983+
```ts
984+
// sse.mock.ts
985+
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
986+
987+
export default defineMock({
988+
url: '/api/sse',
989+
response(req, res) {
990+
const sse = createSSEStream(req, res)
991+
let count = 0
992+
const timer = setInterval(() => {
993+
sse.write({
994+
event: 'count',
995+
data: { count: ++count },
996+
})
997+
if (count >= 10) {
998+
sse.end()
999+
clearInterval(timer)
1000+
}
1001+
}, 1000)
1002+
},
1003+
})
1004+
```
1005+
1006+
```ts
1007+
// app.js
1008+
const es = new EventSource('/api/sse')
1009+
1010+
es.addEventListener('count', (e) => {
1011+
console.log(e.data)
1012+
})
1013+
```
1014+
9641015
## Mock Services
9651016

9661017
In some scenarios, it may be necessary to use the data provided by mock services for display purposes, but the project may have already been packaged, built and deployed without support from `Vite` and this plugin's mock service. Since this plugin supports importing various `node` modules in mock files at the design stage, the mock file cannot be inline into client build code.

README.zh-CN.md

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
- 🌈 支持 `vite preview` 模式
4545
- 📤 支持 multipart 类型,模拟文件上传
4646
- 📥 支持模拟文件下载
47-
- ⚜️ 支持模拟 `WebSocket`
47+
- ⚜️ 支持模拟 `WebSocket``Server-Sent Events`
4848
- 🗂 支持构建可独立部署的小型mock服务
4949

5050
## 文档
@@ -156,6 +156,23 @@ export default defineApiMock({
156156
})
157157
```
158158

159+
### createSSEStream(req, res)
160+
161+
创建一个 `Server-sent events` 写入流,用于支持模拟 `EventSource`
162+
163+
``` ts
164+
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
165+
166+
export default defineMock({
167+
url: '/api/sse',
168+
response: (req, res) => {
169+
const sse = createSSEStream(req, res)
170+
sse.write({ event: 'message', data: { message: 'hello world' } })
171+
sse.end()
172+
}
173+
})
174+
```
175+
159176
## Plugin Options
160177

161178
### prefix
@@ -961,6 +978,40 @@ ws.addEventListener('message', (raw) => {
961978
})
962979
```
963980

981+
**示例:** EventSource Mock
982+
983+
```ts
984+
// sse.mock.ts
985+
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
986+
987+
export default defineMock({
988+
url: '/api/sse',
989+
response(req, res) {
990+
const sse = createSSEStream(req, res)
991+
let count = 0
992+
const timer = setInterval(() => {
993+
sse.write({
994+
event: 'count',
995+
data: { count: ++count },
996+
})
997+
if (count >= 10) {
998+
sse.end()
999+
clearInterval(timer)
1000+
}
1001+
}, 1000)
1002+
},
1003+
})
1004+
```
1005+
1006+
```ts
1007+
// app.js
1008+
const es = new EventSource('/api/sse')
1009+
1010+
es.addEventListener('count', (e) => {
1011+
console.log(e.data)
1012+
})
1013+
```
1014+
9641015
## 独立部署的小型mock服务
9651016

9661017
在一些场景中,可能会需要使用mock服务提供的数据支持,用于展示,但可能项目已完成打包构建部署,已脱离 `vite` 和本插件提供的 mock服务支持。由于本插件在设计之初,支持在mock文件中引入各种 `node` 模块,所以不能将 mock文件打包内联到客户端构建代码中。

docs/.vitepress/config.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,21 @@ export default defineConfig({
1212
theme: { light: 'github-light', dark: 'github-dark' },
1313
headers: { level: [2, 3] },
1414
},
15+
head: [
16+
['link', { rel: 'icon', type: 'image/svg', href: '/logo.svg' }],
17+
],
1518
sitemap: {
1619
hostname: 'https://vite-plugin-mock-dev-server.netlify.app',
1720
},
1821
themeConfig: {
22+
logo: '/logo.svg',
1923
socialLinks: [
2024
{
2125
icon: 'github',
2226
link: 'https://github.com/pengzhanbo/vite-plugin-mock-dev-server',
2327
},
2428
],
25-
search: {
26-
provider: 'local',
27-
},
29+
search: { provider: 'local' },
2830
},
2931
locales: {
3032
root: {
@@ -74,6 +76,7 @@ export default defineConfig({
7476
{ text: 'defineMock', link: '/guide/define-mock' },
7577
{ text: 'createDefineMock', link: '/guide/create-define-mock' },
7678
{ text: 'defineMockData', link: '/guide/define-mock-data' },
79+
{ text: 'createSSEStream', link: '/guide/create-sse-stream' },
7780
],
7881
},
7982
{
@@ -107,8 +110,9 @@ export default defineConfig({
107110
{ text: '请求验证器', link: '/examples/validator' },
108111
{ text: '使用mockjs库', link: '/examples/mockjs' },
109112
{ text: '使用faker-js库', link: '/examples/faker' },
110-
{ text: 'graphql', link: '/examples/graphql' },
111-
{ text: 'websocket', link: '/examples/websocket' },
113+
{ text: 'Graphql', link: '/examples/graphql' },
114+
{ text: 'Websocket', link: '/examples/websocket' },
115+
{ text: 'EventSource', link: '/examples/event-source' },
112116
],
113117
},
114118
},
@@ -158,11 +162,9 @@ export default defineConfig({
158162
items: [
159163
{ text: 'mockDevServerPlugin', link: '/en/guide/mock-plugin' },
160164
{ text: 'defineMock', link: '/en/guide/define-mock' },
161-
{
162-
text: 'createDefineMock',
163-
link: '/en/guide/create-define-mock',
164-
},
165+
{ text: 'createDefineMock', link: '/en/guide/create-define-mock' },
165166
{ text: 'defineMockData', link: '/en/guide/define-mock-data' },
167+
{ text: 'createSSEStream', link: '/en/guide/create-sse-stream' },
166168
],
167169
},
168170
{
@@ -202,8 +204,9 @@ export default defineConfig({
202204
{ text: 'Request validator', link: '/en/examples/validator' },
203205
{ text: 'Use mockjs', link: '/en/examples/mockjs' },
204206
{ text: 'Use faker-js', link: '/en/examples/faker' },
205-
{ text: 'graphql', link: '/en/examples/graphql' },
206-
{ text: 'websocket', link: '/en/examples/websocket' },
207+
{ text: 'Graphql', link: '/en/examples/graphql' },
208+
{ text: 'Websocket', link: '/en/examples/websocket' },
209+
{ text: 'EventSource', link: '/en/examples/event-source' },
207210
],
208211
},
209212
},

docs/en/examples/event-source.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# EventSource
2+
3+
EventSource is an event-based server-sent events protocol that allows a web page or application to create a stream of events that are sent over a connection in real time.
4+
5+
::: code-group
6+
<<< @/../example/mock/sse.mock.ts
7+
8+
:::
9+
10+
::: code-group
11+
12+
```ts [app.ts]
13+
const es = new EventSource('/api/sse')
14+
es.addEventListener('count', (e) => {
15+
console.log(e.data)
16+
})
17+
es.addEventListener('close', () => {
18+
es.close()
19+
20+
console.log('close')
21+
})
22+
```
23+
24+
:::

docs/en/guide/create-sse-stream.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# createSSEStream(req, res)
2+
3+
Create a `Server-sent events` write stream to support mocking `EventSource`.
4+
5+
## Usage
6+
7+
::: code-group
8+
9+
``` ts [*.mock.ts]
10+
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
11+
12+
export default defineMock({
13+
url: '/api/sse',
14+
response: (req, res) => {
15+
const sse = createSSEStream(req, res) // [!code hl:3]
16+
sse.write({ event: 'message', data: { message: 'hello world' } })
17+
sse.end()
18+
}
19+
})
20+
```
21+
22+
:::

docs/examples/event-source.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# EventSource
2+
3+
EventSource 是一种基于事件的服务器发送事件协议,允许网页或应用程序创建一个实时通过连接发送的事件流。
4+
5+
::: code-group
6+
<<< @/../example/mock/sse.mock.ts
7+
8+
:::
9+
10+
::: code-group
11+
12+
```ts [app.ts]
13+
const es = new EventSource('/api/sse')
14+
es.addEventListener('count', (e) => {
15+
console.log(e.data)
16+
})
17+
es.addEventListener('close', () => {
18+
es.close()
19+
20+
console.log('close')
21+
})
22+
```
23+
24+
:::

docs/guide/create-sse-stream.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# createSSEStream(req, res)
2+
3+
创建一个 `Server-sent events` 写入流,用于支持模拟 `EventSource`
4+
5+
## Usage
6+
7+
::: code-group
8+
9+
``` ts [*.mock.ts]
10+
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
11+
12+
export default defineMock({
13+
url: '/api/sse',
14+
response: (req, res) => {
15+
const sse = createSSEStream(req, res) // [!code hl:3]
16+
sse.write({ event: 'message', data: { message: 'hello world' } })
17+
sse.end()
18+
}
19+
})
20+
```
21+
22+
:::

example/mock/sse.mock.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
2+
3+
export default defineMock({
4+
url: '/api/sse',
5+
response(req, res) {
6+
const sse = createSSEStream(req, res)
7+
let count = 0
8+
const timer = setInterval(() => {
9+
sse.write({
10+
event: 'count',
11+
data: { count: ++count },
12+
})
13+
if (count >= 10) {
14+
sse.write({ event: 'close' })
15+
sse.end()
16+
clearInterval(timer)
17+
}
18+
}, 1000)
19+
},
20+
})

example/src/main.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,5 +129,19 @@ function webSocketMock() {
129129
}, 3000)
130130
}
131131

132+
function eventSourceMock() {
133+
const es = new EventSource('/api/sse')
134+
es.addEventListener('count', (e) => {
135+
// eslint-disable-next-line no-console
136+
console.log(e.data)
137+
})
138+
es.addEventListener('close', () => {
139+
es.close()
140+
// eslint-disable-next-line no-console
141+
console.log('close')
142+
})
143+
}
144+
132145
bootstrap()
133146
webSocketMock()
147+
eventSourceMock()

0 commit comments

Comments
 (0)