mirror of
https://github.com/openmhz/trunk-server.git
synced 2026-11-13 17:27:37 -05:00
More Mongoose connections - updated wavesurfer look
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
const { ObjectId } = require('mongodb');
|
const { ObjectId } = require('mongodb');
|
||||||
var { callModel: Call } = require("../models/call");
|
const Call = require("../models/call");
|
||||||
const Group = require("../models/group");
|
const Group = require("../models/group");
|
||||||
const opentelemetry = require('@opentelemetry/api');
|
const opentelemetry = require('@opentelemetry/api');
|
||||||
var defaultNumResults = 50;
|
var defaultNumResults = 50;
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ var Podcast = require("../models/podcast");
|
|||||||
var System = require("../models/system");
|
var System = require("../models/system");
|
||||||
var Talkgroup = require("../models/talkgroup");
|
var Talkgroup = require("../models/talkgroup");
|
||||||
const AdmZip = require("adm-zip");
|
const AdmZip = require("adm-zip");
|
||||||
var { callModel: Call, frozenCallModel: FrozenCall } = require("../models/call");
|
const Call = require("../models/call");
|
||||||
|
const FrozenCall = require("../models/frozenCall");
|
||||||
|
|
||||||
var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com';
|
var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com';
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ const path = require('path');
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const opentelemetry = require('@opentelemetry/api');
|
const opentelemetry = require('@opentelemetry/api');
|
||||||
const sysStats = require("../sys_stats");
|
const sysStats = require("../sys_stats");
|
||||||
const System = require("../models/system");
|
const systemSchema = require("../models/systemSchema");
|
||||||
const Talkgroup = require("../models/talkgroup");
|
const talkgroupSchema = require("../models/talkgroupSchema");
|
||||||
const { callModel: Call } = require("../models/call");
|
const callSchema = require("../models/callSchema");
|
||||||
const { trace, context } = opentelemetry;
|
const { trace, context } = opentelemetry;
|
||||||
|
const mongoose = require("mongoose");
|
||||||
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
|
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");
|
||||||
const { fromIni } = require("@aws-sdk/credential-providers");
|
const { fromIni } = require("@aws-sdk/credential-providers");
|
||||||
const { NodeHttpHandler } = require('@smithy/node-http-handler');
|
const { NodeHttpHandler } = require('@smithy/node-http-handler');
|
||||||
@@ -21,6 +21,31 @@ const s3_region = process.env['S3_REGION'] ?? 'us-west-1';
|
|||||||
const s3_bucket = process.env['S3_BUCKET'] ?? 'openmhz-west';
|
const s3_bucket = process.env['S3_BUCKET'] ?? 'openmhz-west';
|
||||||
const s3_profile = process.env['S3_PROFILE'] ?? 'wasabi-account';
|
const s3_profile = process.env['S3_PROFILE'] ?? 'wasabi-account';
|
||||||
const s3_public_url = process.env['S3_PUBLIC_URL'] ?? `${s3_endpoint}/${s3_bucket}`;
|
const s3_public_url = process.env['S3_PUBLIC_URL'] ?? `${s3_endpoint}/${s3_bucket}`;
|
||||||
|
const host = process.env['MONGO_NODE_DRIVER_HOST'] != null ? process.env['MONGO_NODE_DRIVER_HOST'] : 'mongo';
|
||||||
|
const port = process.env['MONGO_NODE_DRIVER_PORT'] != null ? process.env['MONGO_NODE_DRIVER_PORT'] : 27017;
|
||||||
|
const mongoUrl = 'mongodb://' + host + ':' + port + '/scanner';
|
||||||
|
|
||||||
|
|
||||||
|
// `asPromise()` returns a promise that resolves to the connection
|
||||||
|
// once the connection succeeds, or rejects if connection failed.
|
||||||
|
const mongo_conn_slow = mongoose.createConnection(mongoUrl, { maxPoolSize: 150 });
|
||||||
|
const mongo_conn_fast = mongoose.createConnection(mongoUrl, { maxPoolSize: 150 });
|
||||||
|
mongo_conn_slow.on('error', console.error);
|
||||||
|
mongo_conn_fast.on('error', console.error);
|
||||||
|
mongo_conn_slow.on('disconnected', () => {
|
||||||
|
console.log('Mongo Slow Disconnected');
|
||||||
|
mongo_conn_slow.openUri(mongoUrl, { maxPoolSize: 150 }).catch(console.error);
|
||||||
|
});
|
||||||
|
mongo_conn_fast.on('disconnected', () => {
|
||||||
|
console.log('Mongo Fast Disconnected');
|
||||||
|
mongo_conn_fast.openUri(mongoUrl, { maxPoolSize: 150 }).catch(console.error);
|
||||||
|
});
|
||||||
|
|
||||||
|
mongo_conn_slow.model('Call', callSchema);
|
||||||
|
mongo_conn_fast.model('System', systemSchema);
|
||||||
|
mongo_conn_fast.model('Talkgroup', talkgroupSchema);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const client = new S3Client({
|
const client = new S3Client({
|
||||||
requestHandler: new NodeHttpHandler({
|
requestHandler: new NodeHttpHandler({
|
||||||
@@ -80,7 +105,7 @@ exports.upload = async function (req, res, next) {
|
|||||||
|
|
||||||
await tracer.startActiveSpan('validate_system', { parent: trace.getActiveSpan(context.active()) }, async (validateSpan) => {
|
await tracer.startActiveSpan('validate_system', { parent: trace.getActiveSpan(context.active()) }, async (validateSpan) => {
|
||||||
try {
|
try {
|
||||||
item = await System.findOne({ shortName }, ["key", "ignoreUnknownTalkgroup"]);
|
item = await mongo_conn_fast.model("System").findOne({ shortName }, ["key", "ignoreUnknownTalkgroup"]);
|
||||||
validateSpan.setAttribute('system.exists', !!item);
|
validateSpan.setAttribute('system.exists', !!item);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
validateSpan.recordException(err);
|
validateSpan.recordException(err);
|
||||||
@@ -110,7 +135,7 @@ exports.upload = async function (req, res, next) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (item.ignoreUnknownTalkgroup) {
|
if (item.ignoreUnknownTalkgroup) {
|
||||||
const talkgroupExists = await Talkgroup.exists({
|
const talkgroupExists = await mongo_conn_fast.model("Talkgroup").exists({
|
||||||
shortName,
|
shortName,
|
||||||
num: talkgroupNum,
|
num: talkgroupNum,
|
||||||
});
|
});
|
||||||
@@ -132,7 +157,7 @@ exports.upload = async function (req, res, next) {
|
|||||||
const object_key = `media/${shortName}-${talkgroupNum}-${startTime}${path.extname(req.file.originalname)}`;
|
const object_key = `media/${shortName}-${talkgroupNum}-${startTime}${path.extname(req.file.originalname)}`;
|
||||||
const url = `${s3_public_url}/${object_key}`;
|
const url = `${s3_public_url}/${object_key}`;
|
||||||
|
|
||||||
const call = new Call({
|
const call = new (mongo_conn_slow.model("Call"))({
|
||||||
shortName,
|
shortName,
|
||||||
talkgroupNum,
|
talkgroupNum,
|
||||||
objectKey: object_key,
|
objectKey: object_key,
|
||||||
|
|||||||
@@ -1,45 +1,13 @@
|
|||||||
var mongoose = require('mongoose');
|
var mongoose = require('mongoose');
|
||||||
|
const callSchema = require('./callSchema');
|
||||||
/*
|
/*
|
||||||
{ "_id" : ObjectId("5bbc148de26adf00068a0076"), "shortName" : "dcfd", "talkgroupNum" : 11619, "objectKey" : "dcfd-11619-1539052672.m4a", "endpoint" : "nyc3.digitaloceanspaces.com", "bucket" : "openmhz", "time" : ISODate("2018-10-09T02:37:52Z"), "name" : "11619-1539052672.m4a", "freq" : 856987500, "url" : "https://media.openmhz.com/dcfd/2018/10/9/11619-1539052672.m4a", "emergency" : 0, "path" : "/dcfd/2018/10/9/", "srcList" : [ { "pos" : 0, "src" : 1116743 }, { "pos" : 1.8, "src" : 1102467 }, { "pos" : 3.6, "src" : 1116743 } ], "freqList" : [ { "pos" : 0, "freq" : 856987500, "len" : 51744, "errors" : 170, "spikes" : 29 } ], "len" : 6.142 }
|
{ "_id" : ObjectId("5bbc148de26adf00068a0076"), "shortName" : "dcfd", "talkgroupNum" : 11619, "objectKey" : "dcfd-11619-1539052672.m4a", "endpoint" : "nyc3.digitaloceanspaces.com", "bucket" : "openmhz", "time" : ISODate("2018-10-09T02:37:52Z"), "name" : "11619-1539052672.m4a", "freq" : 856987500, "url" : "https://media.openmhz.com/dcfd/2018/10/9/11619-1539052672.m4a", "emergency" : 0, "path" : "/dcfd/2018/10/9/", "srcList" : [ { "pos" : 0, "src" : 1116743 }, { "pos" : 1.8, "src" : 1102467 }, { "pos" : 3.6, "src" : 1116743 } ], "freqList" : [ { "pos" : 0, "freq" : 856987500, "len" : 51744, "errors" : 170, "spikes" : 29 } ], "len" : 6.142 }
|
||||||
*/
|
*/
|
||||||
var srcSchema = mongoose.Schema({ pos: Number, src: String });
|
|
||||||
var freqSchema = mongoose.Schema({ pos: Number, freq: Number, len: Number, error: Number, spikes: Number});
|
|
||||||
var callSchema = mongoose.Schema({
|
|
||||||
talkgroupNum: Number,
|
|
||||||
shortName: String,
|
|
||||||
objectKey: String,
|
|
||||||
endpoint: String,
|
|
||||||
bucket: String,
|
|
||||||
time: Date,
|
|
||||||
name: String,
|
|
||||||
freq: Number,
|
|
||||||
errorCount: Number,
|
|
||||||
spikeCount: Number,
|
|
||||||
url: String,
|
|
||||||
emergency: Boolean,
|
|
||||||
path: String,
|
|
||||||
len: Number,
|
|
||||||
star: {
|
|
||||||
type: Number,
|
|
||||||
default: 0
|
|
||||||
},
|
|
||||||
srcList: [srcSchema]
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var frozenCallSchema = mongoose.Schema();
|
|
||||||
frozenCallSchema.add(callSchema).add({
|
|
||||||
systemName: String,
|
|
||||||
systemDescription: String,
|
|
||||||
talkgroupDescription: String,
|
|
||||||
talkgroupAlpha: String,
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
exports.frozenCallSchema = frozenCallSchema;
|
|
||||||
exports.frozenCallModel = mongoose.model('FrozenCall', frozenCallSchema);
|
|
||||||
|
|
||||||
|
|
||||||
exports.callSchema = callSchema;
|
|
||||||
exports.callModel = mongoose.model('Call', callSchema);
|
module.exports = mongoose.model('Call', callSchema);
|
||||||
|
|||||||
27
backend/models/callSchema.js
Normal file
27
backend/models/callSchema.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
var mongoose = require('mongoose');
|
||||||
|
|
||||||
|
var srcSchema = mongoose.Schema({ pos: Number, src: String });
|
||||||
|
|
||||||
|
const callSchema = mongoose.Schema({
|
||||||
|
talkgroupNum: Number,
|
||||||
|
shortName: String,
|
||||||
|
objectKey: String,
|
||||||
|
endpoint: String,
|
||||||
|
bucket: String,
|
||||||
|
time: Date,
|
||||||
|
name: String,
|
||||||
|
freq: Number,
|
||||||
|
errorCount: Number,
|
||||||
|
spikeCount: Number,
|
||||||
|
url: String,
|
||||||
|
emergency: Boolean,
|
||||||
|
path: String,
|
||||||
|
len: Number,
|
||||||
|
star: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
srcList: [srcSchema]
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = callSchema;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
var mongoose = require('mongoose');
|
var mongoose = require('mongoose');
|
||||||
var {frozenCallSchema} = require('./call');
|
const frozenCallSchema = require('./frozenCallSchema');
|
||||||
|
|
||||||
|
|
||||||
var eventSchema = mongoose.Schema({
|
var eventSchema = mongoose.Schema({
|
||||||
|
|||||||
4
backend/models/frozenCall.js
Normal file
4
backend/models/frozenCall.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var mongoose = require('mongoose');
|
||||||
|
const frozenCallSchema = require('./frozenCallSchema');
|
||||||
|
|
||||||
|
module.exports = mongoose.model('FrozenCall', frozenCallSchema);
|
||||||
14
backend/models/frozenCallSchema.js
Normal file
14
backend/models/frozenCallSchema.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
var mongoose = require('mongoose');
|
||||||
|
const callSchema = require('./callSchema');
|
||||||
|
|
||||||
|
var frozenCallSchema = mongoose.Schema();
|
||||||
|
|
||||||
|
frozenCallSchema.add(callSchema).add({
|
||||||
|
systemName: String,
|
||||||
|
systemDescription: String,
|
||||||
|
talkgroupDescription: String,
|
||||||
|
talkgroupAlpha: String,
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = frozenCallSchema;
|
||||||
@@ -1,37 +1,6 @@
|
|||||||
var mongoose = require('mongoose');
|
var mongoose = require('mongoose');
|
||||||
var bcrypt = require('bcrypt-nodejs');
|
const systemSchema = require('./systemSchema');
|
||||||
var User = require('./user');
|
|
||||||
|
|
||||||
var systemSchema = mongoose.Schema({
|
|
||||||
name: String,
|
|
||||||
shortName: String,
|
|
||||||
systemType: String,
|
|
||||||
county: String,
|
|
||||||
country: String,
|
|
||||||
city: String,
|
|
||||||
state: String,
|
|
||||||
description: String,
|
|
||||||
status: String,
|
|
||||||
showScreenName: Boolean,
|
|
||||||
allowContact: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
callAvg: Number,
|
|
||||||
callCount: Number,
|
|
||||||
ignoreUnknownTalkgroup : Boolean,
|
|
||||||
active: {type: Boolean, default: false},
|
|
||||||
lastActive: Date,
|
|
||||||
userId: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
|
|
||||||
key: String
|
|
||||||
});
|
|
||||||
|
|
||||||
systemSchema.methods.generateHash = function(password) {
|
|
||||||
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
|
|
||||||
};
|
|
||||||
|
|
||||||
systemSchema.methods.validPassword = function(password) {
|
|
||||||
return bcrypt.compareSync(password, this.local.password);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
exports.systemSchema = systemSchema;
|
||||||
module.exports = mongoose.model('System', systemSchema);
|
module.exports = mongoose.model('System', systemSchema);
|
||||||
|
|||||||
37
backend/models/systemSchema.js
Normal file
37
backend/models/systemSchema.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
var mongoose = require('mongoose');
|
||||||
|
var bcrypt = require('bcrypt-nodejs');
|
||||||
|
var User = require('./user');
|
||||||
|
|
||||||
|
const systemSchema = mongoose.Schema({
|
||||||
|
name: String,
|
||||||
|
shortName: String,
|
||||||
|
systemType: String,
|
||||||
|
county: String,
|
||||||
|
country: String,
|
||||||
|
city: String,
|
||||||
|
state: String,
|
||||||
|
description: String,
|
||||||
|
status: String,
|
||||||
|
showScreenName: Boolean,
|
||||||
|
allowContact: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
callAvg: Number,
|
||||||
|
callCount: Number,
|
||||||
|
ignoreUnknownTalkgroup : Boolean,
|
||||||
|
active: {type: Boolean, default: false},
|
||||||
|
lastActive: Date,
|
||||||
|
userId: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
|
||||||
|
key: String
|
||||||
|
});
|
||||||
|
|
||||||
|
systemSchema.methods.generateHash = function(password) {
|
||||||
|
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
|
||||||
|
};
|
||||||
|
|
||||||
|
systemSchema.methods.validPassword = function(password) {
|
||||||
|
return bcrypt.compareSync(password, this.local.password);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = systemSchema;
|
||||||
@@ -1,16 +1,4 @@
|
|||||||
var mongoose = require('mongoose');
|
var mongoose = require('mongoose');
|
||||||
|
const talkgroupSchema = require('./talkgroupSchema');
|
||||||
var talkgroupSchema = mongoose.Schema({
|
|
||||||
shortName: String,
|
|
||||||
userId: String,
|
|
||||||
num: Number,
|
|
||||||
mode: String,
|
|
||||||
alpha: String,
|
|
||||||
description: String,
|
|
||||||
tag: String,
|
|
||||||
group: String,
|
|
||||||
priority: Number
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = mongoose.model('Talkgroup', talkgroupSchema);
|
module.exports = mongoose.model('Talkgroup', talkgroupSchema);
|
||||||
|
|||||||
15
backend/models/talkgroupSchema.js
Normal file
15
backend/models/talkgroupSchema.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
var mongoose = require('mongoose');
|
||||||
|
|
||||||
|
const talkgroupSchema = mongoose.Schema({
|
||||||
|
shortName: String,
|
||||||
|
userId: String,
|
||||||
|
num: Number,
|
||||||
|
mode: String,
|
||||||
|
alpha: String,
|
||||||
|
description: String,
|
||||||
|
tag: String,
|
||||||
|
group: String,
|
||||||
|
priority: Number
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = talkgroupSchema;
|
||||||
@@ -88,3 +88,7 @@ background-color: #5c5c5c;
|
|||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i.icon {
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
@@ -67,6 +67,11 @@ const MediaPlayer = (props) => {
|
|||||||
|
|
||||||
}, [playSilence]);
|
}, [playSilence]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setSourceIndex(0);
|
||||||
|
}, [call]);
|
||||||
|
|
||||||
|
|
||||||
const onReady = (ws) => {
|
const onReady = (ws) => {
|
||||||
setWavesurfer(ws)
|
setWavesurfer(ws)
|
||||||
setIsPlaying(false)
|
setIsPlaying(false)
|
||||||
@@ -75,7 +80,7 @@ const MediaPlayer = (props) => {
|
|||||||
call.srcList.forEach(src => {
|
call.srcList.forEach(src => {
|
||||||
regionsPlugin.addRegion({
|
regionsPlugin.addRegion({
|
||||||
start: src.pos,
|
start: src.pos,
|
||||||
color: "white",
|
color: "rgba(128, 128, 128, 1.0)",
|
||||||
drag: false,
|
drag: false,
|
||||||
resize: false
|
resize: false
|
||||||
});
|
});
|
||||||
@@ -137,7 +142,7 @@ const MediaPlayer = (props) => {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div className="button-item" onClick={onPlayPause} >
|
<div className="button-item" onClick={onPlayPause}>
|
||||||
{
|
{
|
||||||
isPlaying
|
isPlaying
|
||||||
? (<Icon name="pause" />)
|
? (<Icon name="pause" />)
|
||||||
@@ -149,7 +154,9 @@ const MediaPlayer = (props) => {
|
|||||||
<WavesurferPlayer
|
<WavesurferPlayer
|
||||||
autoplay={true}
|
autoplay={true}
|
||||||
height={25}
|
height={25}
|
||||||
|
barWidth ={3}
|
||||||
|
barGap={3}
|
||||||
|
barRadius={6}
|
||||||
waveColor="#E81B39"
|
waveColor="#E81B39"
|
||||||
url={call.url}
|
url={call.url}
|
||||||
onReady={onReady}
|
onReady={onReady}
|
||||||
|
|||||||
Reference in New Issue
Block a user