From 252ad2d07fd44c0a1a32ff31370a7fd578fe0cb1 Mon Sep 17 00:00:00 2001 From: Quan HL Date: Sun, 7 May 2023 06:59:35 +0700 Subject: [PATCH] feat: add metadata to create call as tag --- lib/http-routes/api/create-call.js | 3 +- lib/session/call-info.js | 2 + test/create-call-test.js | 120 +++++++++++++++++------------ 3 files changed, 74 insertions(+), 51 deletions(-) diff --git a/lib/http-routes/api/create-call.js b/lib/http-routes/api/create-call.js index a1432ece..9414f190 100644 --- a/lib/http-routes/api/create-call.js +++ b/lib/http-routes/api/create-call.js @@ -197,7 +197,8 @@ router.post('/', async(req, res) => { callSid, accountSid: req.body.account_sid, applicationSid: app.application_sid, - traceId: rootSpan.traceId + traceId: rootSpan.traceId, + metadata: req.body.metadata }); cs = new RestCallSession({ logger: sipLogger, diff --git a/lib/session/call-info.js b/lib/session/call-info.js index a87bb63d..a26c402d 100644 --- a/lib/session/call-info.js +++ b/lib/session/call-info.js @@ -13,6 +13,7 @@ class CallInfo { this.direction = opts.direction; this.traceId = opts.traceId; this.callTerminationBy = undefined; + this.metadata = opts.metadata; if (opts.req) { const u = opts.req.getParsedHeader('from'); const uri = parseUri(u.uri); @@ -91,6 +92,7 @@ class CallInfo { this.from = from || req.callingNumber; this.to = to; if (tag) this._customerData = tag; + if (this.metadata) this._customerData = {...this._customerData , ...this.metadata} } this.localSipAddress = srf.locals.localSipAddress; diff --git a/test/create-call-test.js b/test/create-call-test.js index 917f0ec4..1de8db64 100644 --- a/test/create-call-test.js +++ b/test/create-call-test.js @@ -1,50 +1,51 @@ -const test = require('tape'); -const { sippUac } = require('./sipp')('test_fs'); -const bent = require('bent'); -const clearModule = require('clear-module'); -const {provisionCallHook} = require('./utils') -const getJSON = bent('json') +const test = require("tape"); +const { sippUac } = require("./sipp")("test_fs"); +const bent = require("bent"); +const clearModule = require("clear-module"); +const { provisionCallHook } = require("./utils"); +const getJSON = bent("json"); const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); -process.on('unhandledRejection', (reason, p) => { - console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); +process.on("unhandledRejection", (reason, p) => { + console.log("Unhandled Rejection at: Promise", p, "reason:", reason); }); function connect(connectable) { return new Promise((resolve, reject) => { - connectable.on('connect', () => { + connectable.on("connect", () => { return resolve(); }); }); } -test('test create-call timeout', async(t) => { +test("test create-call timeout", async (t) => { clearModule.all(); - const {srf, disconnect} = require('../app'); + const { srf, disconnect } = require("../app"); try { await connect(srf); // give UAS app time to come up - const p = sippUac('uas-timeout-cancel.xml', '172.38.0.10'); + const p = sippUac("uas-timeout-cancel.xml", "172.38.0.10"); await waitFor(1000); // GIVEN - let account_sid = '622f62e4-303a-49f2-bbe0-eb1e1714e37a'; - const post = bent('http://127.0.0.1:3000/', 'POST', 'json', 201); - post('v1/createCall', { - 'account_sid':account_sid, - 'timeout': 1, - "call_hook": { - "url": "https://public-apps.jambonz.us/hello-world", - "method": "POST" + let account_sid = "622f62e4-303a-49f2-bbe0-eb1e1714e37a"; + const post = bent("http://127.0.0.1:3000/", "POST", "json", 201); + post("v1/createCall", { + account_sid: account_sid, + timeout: 1, + call_hook: { + url: "https://public-apps.jambonz.us/hello-world", + method: "POST", }, - "from": "15083718299", - "to": { - "type": "phone", - "number": "15583084809" - }}); + from: "15083718299", + to: { + type: "phone", + number: "15583084809", + }, + }); //THEN await p; disconnect(); @@ -55,50 +56,69 @@ test('test create-call timeout', async(t) => { } }); -test('test create-call call-hook basic authentication', async(t) => { +test("test create-call call-hook basic authentication", async (t) => { clearModule.all(); - const {srf, disconnect} = require('../app'); + const { srf, disconnect } = require("../app"); try { await connect(srf); - // GIVEN - let from = 'call_hook_basic_authentication'; - let account_sid = '622f62e4-303a-49f2-bbe0-eb1e1714e37a'; + let from = "call_hook_basic_authentication"; + let account_sid = "622f62e4-303a-49f2-bbe0-eb1e1714e37a"; // Give UAS app time to come up - const p = sippUac('uas.xml', '172.38.0.10', from); + const p = sippUac("uas.xml", "172.38.0.10", from); await waitFor(1000); - const post = bent('http://127.0.0.1:3000/', 'POST', 'json', 201); - post('v1/createCall', { - 'account_sid':account_sid, - "call_hook": { - "url": "http://127.0.0.1:3100/", - "method": "POST", - "username": "username", - "password": "password" + const post = bent("http://127.0.0.1:3000/", "POST", "json", 201); + post("v1/createCall", { + account_sid: account_sid, + call_hook: { + url: "http://127.0.0.1:3100/", + method: "POST", + username: "username", + password: "password", }, - "from": from, - "to": { - "type": "phone", - "number": "15583084809" - }}); + call_status_hook: { + url: "http://127.0.0.1:3100/callStatus", + method: "POST", + }, + from: from, + to: { + type: "phone", + number: "15583084809", + }, + metadata: { + customer: "acme", + referenceId: "deadbeef", + }, + }); let verbs = [ { - "verb": "say", - "text": "hello" - } + verb: "say", + text: "hello", + }, ]; provisionCallHook(from, verbs); //THEN await p; - let obj = await getJSON(`http:127.0.0.1:3100/lastRequest/${from}`) - t.ok(obj.headers.Authorization = 'Basic dXNlcm5hbWU6cGFzc3dvcmQ=', - 'create-call: call-hook contains basic authentication header'); + let obj = await getJSON(`http:127.0.0.1:3100/lastRequest/${from}`); + t.ok( + (obj.headers.Authorization === "Basic dXNlcm5hbWU6cGFzc3dvcmQ="), + "create-call: call-hook contains basic authentication header" + ); + t.ok( + (obj.customerData.customer === 'acme'), + "create-call: metadata is working" + ); + obj = await getJSON(`http:127.0.0.1:3100/lastRequest/${from}_callStatus`); + t.ok( + (obj.customerData.customer === 'acme'), + "create-call: metadata is working" + ); disconnect(); } catch (err) { console.log(`error received: ${err}`);