123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- const { tunnel } = require('../qcloud')
- const debug = require('debug')('koa-weapp-demo')
- const userMap = {}
- const connectedTunnelIds = []
- const $broadcast = (type, content) => {
- tunnel.broadcast(connectedTunnelIds, type, content)
- .then(result => {
- const invalidTunnelIds = result.data && result.data.invalidTunnelIds || []
- if (invalidTunnelIds.length) {
- console.log('检测到无效的信道 IDs =>', invalidTunnelIds)
-
- invalidTunnelIds.forEach(tunnelId => {
- delete userMap[tunnelId]
- const index = connectedTunnelIds.indexOf(tunnelId)
- if (~index) {
- connectedTunnelIds.splice(index, 1)
- }
- })
- }
- })
- }
- const $close = (tunnelId) => {
- tunnel.closeTunnel(tunnelId)
- }
- function onConnect (tunnelId) {
- console.log(`[onConnect] =>`, { tunnelId })
- if (tunnelId in userMap) {
- connectedTunnelIds.push(tunnelId)
- $broadcast('people', {
- 'total': connectedTunnelIds.length,
- 'enter': userMap[tunnelId]
- })
- } else {
- console.log(`Unknown tunnelId(${tunnelId}) was connectd, close it`)
- $close(tunnelId)
- }
- }
- function onMessage (tunnelId, type, content) {
- console.log(`[onMessage] =>`, { tunnelId, type, content })
- switch (type) {
- case 'speak':
- if (tunnelId in userMap) {
- $broadcast('speak', {
- 'who': userMap[tunnelId],
- 'word': content.word
- })
- } else {
- $close(tunnelId)
- }
- break
- default:
- break
- }
- }
- function onClose (tunnelId) {
- console.log(`[onClose] =>`, { tunnelId })
- if (!(tunnelId in userMap)) {
- console.log(`[onClose][Invalid TunnelId]=>`, tunnelId)
- $close(tunnelId)
- return
- }
- const leaveUser = userMap[tunnelId]
- delete userMap[tunnelId]
- const index = connectedTunnelIds.indexOf(tunnelId)
- if (~index) {
- connectedTunnelIds.splice(index, 1)
- }
-
- if (connectedTunnelIds.length > 0) {
- $broadcast('people', {
- 'total': connectedTunnelIds.length,
- 'leave': leaveUser
- })
- }
- }
- module.exports = {
-
- get: async ctx => {
- const data = await tunnel.getTunnelUrl(ctx.req)
- const tunnelInfo = data.tunnel
- userMap[tunnelInfo.tunnelId] = data.userinfo
- ctx.state.data = tunnelInfo
- },
-
- post: async ctx => {
- const packet = await tunnel.onTunnelMessage(ctx.request.body)
- debug('Tunnel recive a package: %o', packet)
- switch (packet.type) {
- case 'connect':
- onConnect(packet.tunnelId)
- break
- case 'message':
- onMessage(packet.tunnelId, packet.content.messageType, packet.content.messageContent)
- break
- case 'close':
- onClose(packet.tunnelId)
- break
- }
- }
- }
|