diff --git a/test/webhook/app.js b/test/webhook/app.js index 4d6348ea..695010f4 100644 --- a/test/webhook/app.js +++ b/test/webhook/app.js @@ -1,14 +1,54 @@ -const assert = require('assert'); -const fs = require('fs'); const express = require('express'); const app = express(); +const Websocket = require('ws'); const listenPort = process.env.HTTP_PORT || 3000; let json_mapping = new Map(); let hook_mapping = new Map(); +let ws_packet_count = new Map(); +let ws_metadata = new Map(); -app.listen(listenPort, () => { +/** websocket server for listen audio */ +const recvAudio = (socket, req) => { + let packets = 0; + let path = req.url; + console.log('received websocket connection'); + socket.on('message', (data, isBinary) => { + if (!isBinary) { + try { + const msg = JSON.parse(data); + console.log({msg}, 'received websocket message'); + ws_metadata.set(path, msg); + } + catch (err) { + console.log({err}, 'error parsing websocket message'); + } + } + else { + packets += data.length; + } + }); + socket.on('error', (err) => { + console.log({err}, 'listen websocket: error'); + }); + + socket.on('close', () => { + ws_packet_count.set(path, packets); + }) +}; + +const wsServer = new Websocket.Server({ noServer: true }); +wsServer.setMaxListeners(0); +wsServer.on('connection', recvAudio.bind(null)); + +const server = app.listen(listenPort, () => { console.log(`sample jambones app server listening on ${listenPort}`); }); +server.on('upgrade', (request, socket, head) => { + console.log('received upgrade request'); + wsServer.handleUpgrade(request, socket, head, (socket) => { + wsServer.emit('connection', socket, request); + }); +}); app.use(express.urlencoded({ extended: true })); app.use(express.json()); @@ -20,6 +60,7 @@ app.use(express.json()); app.all('/', (req, res) => { console.log(req.body, 'POST /'); const key = req.body.from + addRequestToMap(key, req, hook_mapping); return getJsonFromMap(key, req, res); }); @@ -96,6 +137,27 @@ app.get('/lastRequest/:key', (req, res) => { } }) +// WS Fetch +app.get('/ws_packet_count/:key', (req, res) => { + let key = `/${req.params.key}`; + console.log(key, ws_packet_count); + if (ws_packet_count.has(key)) { + return res.json({ count: ws_packet_count.get(key) }); + } else { + return res.sendStatus(404); + } +}) + +app.get('/ws_metadata/:key', (req, res) => { + let key = `/${req.params.key}`; + console.log(key, ws_packet_count); + if (ws_metadata.has(key)) { + return res.json({ metadata: ws_metadata.get(key) }); + } else { + return res.sendStatus(404); + } +}) + /* * private function */ diff --git a/test/webhook/package-lock.json b/test/webhook/package-lock.json index 08af4acd..1eaf5c66 100644 --- a/test/webhook/package-lock.json +++ b/test/webhook/package-lock.json @@ -9,7 +9,8 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "express": "^4.18.2" + "express": "^4.18.2", + "ws": "^8.12.0" } }, "node_modules/accepts": { @@ -587,6 +588,26 @@ "engines": { "node": ">= 0.8" } + }, + "node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } }, "dependencies": { @@ -1013,6 +1034,12 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "requires": {} } } } diff --git a/test/webhook/package.json b/test/webhook/package.json index 971b66df..2579d622 100644 --- a/test/webhook/package.json +++ b/test/webhook/package.json @@ -9,6 +9,7 @@ "author": "Dave Horton", "license": "MIT", "dependencies": { - "express": "^4.18.2" + "express": "^4.18.2", + "ws":"^8.12.0" } }