-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsocket_module.ts
More file actions
83 lines (64 loc) · 1.74 KB
/
socket_module.ts
File metadata and controls
83 lines (64 loc) · 1.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { type Express } from 'express'
import { createServer } from 'http'
import { Server, type Socket } from 'socket.io'
export declare interface ReceivedSms {
date: string
message: string
sender: string
}
export type ReceivedSmsHandler = (sms: ReceivedSms) => void
let io: Server | null = null
let phoneSocket: Socket | null = null
let smsHandler: ReceivedSmsHandler | null = null
function unsetPhoneSocket () {
if (phoneSocket) {
phoneSocket.removeAllListeners()
phoneSocket = null
}
}
function onPhoneConnected (socket: Socket) {
unsetPhoneSocket()
if (!io) {
return
}
console.log('phone connected')
// inform all clients
io.emit('hello', { message: `hello, ${socket.id}` })
// emit to new client
socket.emit('your-id', { id: socket.id })
phoneSocket = socket
phoneSocket.on('send-sms', data => {
console.log('would send SMS', data)
})
phoneSocket.on('received-sms', (data: string) => {
const sms = JSON.parse(data) as ReceivedSms
if (smsHandler) {
smsHandler(sms)
} else {
console.log('received sms', sms)
}
})
phoneSocket.on('disconnect', () => {
unsetPhoneSocket()
console.log('phone disconnected')
})
}
export function sendSms (receiver: string, body: string) {
if (phoneSocket) {
phoneSocket.emit('send-sms', { receiver, body })
}
return !!phoneSocket
}
export function setup (app: Express, receiveHandler: ReceivedSmsHandler) {
if (io) {
throw new Error('Already configured')
}
const httpServer = createServer(app)
io = new Server(httpServer, { pingTimeout: 2000, pingInterval: 2000 })
io.on('connection', onPhoneConnected)
smsHandler = receiveHandler
return httpServer
}
export function hasPhoneConnected () {
return !!phoneSocket
}