mirror of
https://github.com/jambonz/jambonz-api-server.git
synced 2026-07-13 23:51:53 +00:00
e35a03c7ad
* feat: schema change * feat: record all calls * add bucket test for S3 * wip: add S3 upload stream implementation * wip * wip: add ws server * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip: modify sub folder * wip: add record endpoint * wip: add record endpoint * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix: failing testcase * bucket credentials with tags * add tagging * wip * wip * wip * wip * wip * wip * fixed phone number is not in order * feat: schema change * feat: record all calls * add bucket test for S3 * wip: add S3 upload stream implementation * wip * wip: add ws server * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip: modify sub folder * wip: add record endpoint * wip: add record endpoint * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * fix: failing testcase * bucket credentials with tags * add tagging * wip * wip * wip * wip * wip * fixed phone number is not in order * add schema changes to upgrade script * use aws-sdk v3 * jambonz lamejs * jambonz lamejs * add back wav encoder * wip: add record format to schema * add record_format * fix: record file ext * fix: record file ext * fix: record file ext * fix: record file ext * fix download audio * bug fix: dtmf metadata is causing closure of websocket * fix: add extra data to S3 metadata * upgrade db script * bugfix: region was being ignored in test s3 upload --------- Co-authored-by: Dave Horton <daveh@beachdognet.com>
95 lines
3.2 KiB
JavaScript
95 lines
3.2 KiB
JavaScript
const Account = require('../models/account');
|
|
const Websocket = require('ws');
|
|
const PCMToMP3Encoder = require('./encoder');
|
|
const S3MultipartUploadStream = require('./s3-multipart-upload-stream');
|
|
const wav = require('wav');
|
|
|
|
async function upload(logger, socket) {
|
|
|
|
socket._recvInitialMetadata = false;
|
|
socket.on('message', async function(data, isBinary) {
|
|
try {
|
|
if (!isBinary && !socket._recvInitialMetadata) {
|
|
socket._recvInitialMetadata = true;
|
|
const obj = JSON.parse(data.toString());
|
|
logger.info({obj}, 'received JSON message from jambonz');
|
|
const {sampleRate, accountSid, callSid, direction, from, to,
|
|
callId, applicationSid, originatingSipIp, originatingSipTrunkName} = obj;
|
|
const account = await Account.retrieve(accountSid);
|
|
if (account && account.length && account[0].bucket_credential) {
|
|
const obj = account[0].bucket_credential;
|
|
// add tags to metadata
|
|
const metadata = {
|
|
accountSid,
|
|
callSid,
|
|
direction,
|
|
from,
|
|
to,
|
|
callId,
|
|
applicationSid,
|
|
originatingSipIp,
|
|
originatingSipTrunkName,
|
|
sampleRate: `${sampleRate}`
|
|
};
|
|
if (obj.tags && obj.tags.length) {
|
|
obj.tags.forEach((tag) => {
|
|
metadata[tag.Key] = tag.Value;
|
|
});
|
|
}
|
|
// create S3 path
|
|
const day = new Date();
|
|
let Key = `${day.getFullYear()}/${(day.getMonth() + 1).toString().padStart(2, '0')}`;
|
|
Key += `/${day.getDate().toString().padStart(2, '0')}/${callSid}.${account[0].record_format}`;
|
|
|
|
// Uploader
|
|
const uploaderOpts = {
|
|
bucketName: obj.name,
|
|
Key,
|
|
metadata,
|
|
bucketCredential: {
|
|
credentials: {
|
|
accessKeyId: obj.access_key_id,
|
|
secretAccessKey: obj.secret_access_key,
|
|
},
|
|
region: obj.region || 'us-east-1'
|
|
}
|
|
};
|
|
const uploadStream = new S3MultipartUploadStream(logger, uploaderOpts);
|
|
|
|
/**encoder */
|
|
let encoder;
|
|
if (obj.output_format === 'wav') {
|
|
encoder = new wav.Writer({ channels: 2, sampleRate, bitDepth: 16 });
|
|
} else {
|
|
// default is mp3
|
|
encoder = new PCMToMP3Encoder({
|
|
channels: 2,
|
|
sampleRate: sampleRate,
|
|
bitrate: 128
|
|
});
|
|
}
|
|
/* start streaming data */
|
|
const duplex = Websocket.createWebSocketStream(socket);
|
|
duplex.pipe(encoder).pipe(uploadStream);
|
|
} else {
|
|
logger.info(`account ${accountSid} does not have any bucket credential, close the socket`);
|
|
socket.close();
|
|
}
|
|
}
|
|
} catch (err) {
|
|
logger.error({err}, 'error parsing message during connection');
|
|
}
|
|
});
|
|
socket.on('error', function(err) {
|
|
logger.error({err}, 'aws upload: error');
|
|
});
|
|
socket.on('close', (data) => {
|
|
logger.info({data}, 'aws_s3: close');
|
|
});
|
|
socket.on('end', function(err) {
|
|
logger.error({err}, 'aws upload: socket closed from jambonz');
|
|
});
|
|
}
|
|
|
|
module.exports = upload;
|