@@ -36,6 +36,18 @@ const getRoute = (method: RequestMethod, href: string) => {
36
36
return undefined ;
37
37
} ;
38
38
39
+ const activeSocketConnections : Map < string , Set < WebSocket > > = new Map ( ) ,
40
+ removeSocketFromChannel = ( name : string , socket : WebSocket ) => {
41
+ if ( ! activeSocketConnections . get ( name ) ) return ;
42
+ activeSocketConnections . get ( name ) ! . delete ( socket ) ;
43
+ } ,
44
+ addSocketToChannel = ( name : string , socket : WebSocket ) => {
45
+ if ( ! activeSocketConnections . get ( name ) ) {
46
+ activeSocketConnections . set ( name , new Set ( ) ) ;
47
+ }
48
+ activeSocketConnections . get ( name ) ! . add ( socket ) ;
49
+ } ;
50
+
39
51
const listenAndServe = ( port = 3000 , log = console . log ) => {
40
52
log ( "" ) ;
41
53
log ( `✨ server started at http://localhost:${ port } /` ) ;
@@ -110,18 +122,47 @@ const listenAndServe = (port = 3000, log = console.log) => {
110
122
const upgrade = Deno . upgradeWebSocket ( req ) ;
111
123
socket = upgrade . socket ;
112
124
override = upgrade . response ;
125
+ addSocketToChannel ( ctx . upgrade . channel . name , socket ) ;
113
126
return socket ;
114
127
} ,
115
128
channel : {
116
129
name : "" ,
117
130
join : ( name ) => {
131
+ const socket = ctx . upgrade . socket ( ) ;
132
+ if ( socket ) {
133
+ removeSocketFromChannel ( ctx . upgrade . channel . name , socket ) ;
134
+ addSocketToChannel ( name , socket ) ;
135
+ }
118
136
const channel =
119
137
( ctx . upgrade . channel as Mutable < Context [ "upgrade" ] [ "channel" ] > ) ;
120
138
channel . name = name ;
121
139
} ,
122
140
broadcast : ( message ) => {
123
- // todo
124
- console . log ( ctx . upgrade . channel . name , message ) ;
141
+ const { name } = ctx . upgrade . channel ,
142
+ channel = activeSocketConnections . get ( name ) ;
143
+ if ( ! channel ) return ;
144
+ const safe = typeof message === "string" ||
145
+ message instanceof Blob || message instanceof ArrayBuffer ||
146
+ message instanceof SharedArrayBuffer ||
147
+ message instanceof Int8Array ||
148
+ message instanceof Uint8Array ||
149
+ message instanceof Uint8ClampedArray ||
150
+ message instanceof Int16Array ||
151
+ message instanceof Uint16Array ||
152
+ message instanceof Int32Array ||
153
+ message instanceof Uint32Array ||
154
+ message instanceof Float32Array ||
155
+ message instanceof Float64Array ||
156
+ message instanceof BigInt64Array ||
157
+ message instanceof BigUint64Array ||
158
+ message instanceof DataView ;
159
+ if ( ! safe ) message = JSON . stringify ( message ) ;
160
+ const data = message as
161
+ | string
162
+ | Blob
163
+ | ArrayBufferView
164
+ | ArrayBufferLike ;
165
+ for ( const s of channel ) s . send ( data ) ;
125
166
} ,
126
167
} ,
127
168
} ,
0 commit comments