File tree 5 files changed +433
-0
lines changed
5 files changed +433
-0
lines changed Original file line number Diff line number Diff line change
1
+ const http = require ( "http" ) ;
2
+ const {
3
+ setEventStreamHeaders,
4
+ sendEvent,
5
+ reuseServerPushChanel,
6
+ } = require ( "./eventstream" ) ;
7
+ const url = require ( "url" ) ;
8
+
9
+ global . serverPushChanel = null ;
10
+ const server = http . createServer ( ( req , res ) => {
11
+ const parsedUrl = url . parse ( req . url ) ;
12
+ const { pathname, query } = parsedUrl ;
13
+
14
+ res . setHeader ( "access-control-allow-origin" , "*" ) ;
15
+
16
+ if ( pathname === "/" ) {
17
+ res . writeHead ( 200 , { "Content-Type" : "text/html" } ) ;
18
+ res . end ( "<h1>Hello World</h1>" ) ;
19
+ }
20
+
21
+ if ( pathname === "/evt" ) {
22
+ setEventStreamHeaders ( res ) ;
23
+ global . serverPushChanel = res ;
24
+ sendEvent ( req , res ) ;
25
+ }
26
+
27
+ // client message
28
+ if ( pathname === "/msg" ) {
29
+ res . writeHead ( 200 , { "Content-Type" : "text/plain" } ) ;
30
+ res . end ( new Date ( ) . toString ( ) ) ;
31
+
32
+ if ( global . serverPushChanel ) {
33
+ reuseServerPushChanel ( global . serverPushChanel , query , res ) ;
34
+ }
35
+ }
36
+ } ) ;
37
+
38
+ server . listen ( 8900 , "localhost" , ( ) => {
39
+ console . log ( "Server is running on port 8900" ) ;
40
+ } ) ;
Original file line number Diff line number Diff line change
1
+ exports . setEventStreamHeaders = function ( res ) {
2
+ res . setHeader ( "Content-Type" , "text/event-stream" ) ;
3
+ res . setHeader ( "Cache-Control" , "no-cache" ) ;
4
+ res . setHeader ( "Connection" , "keep-alive" ) ;
5
+ res . setHeader ( "Access-Control-Allow-Origin" , "*" ) ;
6
+ res . setHeader ( "Access-Control-Allow-Credentials" , true ) ;
7
+ } ;
8
+
9
+ exports . sendEvent = function ( req , res ) {
10
+ setInterval ( ( ) => {
11
+ res . write (
12
+ `data: ${ JSON . stringify ( {
13
+ type : "event" ,
14
+ mode : "ping" ,
15
+ message : "server push, ping" ,
16
+ } ) } \n\n`
17
+ ) ;
18
+ } , 3000 ) ;
19
+ } ;
20
+
21
+ exports . reuseServerPushChanel = function ( serverPushChanel , query , res ) {
22
+ serverPushChanel . write (
23
+ `data: ${ JSON . stringify ( {
24
+ type : "event" ,
25
+ mode : "msg" ,
26
+ message : query ,
27
+ } ) } \n\n`
28
+ ) ;
29
+ } ;
Original file line number Diff line number Diff line change
1
+ <!DOCTYPE html>
2
+ < html lang ="en ">
3
+ < head >
4
+ < meta charset ="UTF-8 " />
5
+ < meta http-equiv ="X-UA-Compatible " content ="IE=edge " />
6
+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0 " />
7
+ < title > Client</ title >
8
+ </ head >
9
+ < body >
10
+ < h2 > 发送消息</ h2 >
11
+ < label for ="m ">
12
+ < input type ="text " id ="m " />
13
+ </ label >
14
+ < button type ="button " id ="sendBtn "> 发送</ button >
15
+
16
+ < h2 > 接受消息</ h2 >
17
+ < h4 class ="connect-status "> Pending connection...</ h4 >
18
+ < ul class ="message-container "> </ ul >
19
+ </ body >
20
+
21
+ < script >
22
+ const eventSource = new EventSource ( "http://localhost:8900/evt" ) ;
23
+ eventSource . onopen = ( event ) => {
24
+ document . querySelector ( ".connect-status" ) . innerHTML =
25
+ "Connected to server" ;
26
+ } ;
27
+ eventSource . onmessage = ( event ) => {
28
+ const message = JSON . parse ( event . data ) ;
29
+ const messageNode = document . createElement ( "li" ) ;
30
+ if ( message . mode === "msg" ) {
31
+ messageNode . setAttribute ( "style" , "color: red" ) ;
32
+ }
33
+ messageNode . innerHTML = `<strong>${
34
+ message ?. mode
35
+ } </strong>: ${ decodeURIComponent ( message . message ) } `;
36
+ document . querySelector ( ".message-container" ) . appendChild ( messageNode ) ;
37
+ } ;
38
+
39
+ sendMessage ( ) ;
40
+
41
+ function sendMessage ( ) {
42
+ const messageInput = document . querySelector ( "#m" ) ;
43
+ const sendBtn = document . querySelector ( "#sendBtn" ) ;
44
+
45
+ sendBtn . addEventListener ( "click" , ( ) => {
46
+ fetch (
47
+ "http://localhost:8900/msg" + "?message=" + messageInput . value
48
+ ) . then ( ( response ) => {
49
+ console . log ( response ) ;
50
+ } ) ;
51
+ } ) ;
52
+ }
53
+ </ script >
54
+ </ html >
Original file line number Diff line number Diff line change
1
+ {
2
+ "name" : " server-push" ,
3
+ "version" : " 1.0.0" ,
4
+ "description" : " " ,
5
+ "main" : " index.js" ,
6
+ "scripts" : {
7
+ "start" : " nodemon app.js"
8
+ },
9
+ "keywords" : [],
10
+ "author" : " " ,
11
+ "license" : " ISC" ,
12
+ "devDependencies" : {
13
+ "nodemon" : " ^2.0.19"
14
+ }
15
+ }
You can’t perform that action at this time.
0 commit comments