diff --git a/backend/controllers/calls.js b/backend/controllers/calls.js index e20c61e..573a829 100644 --- a/backend/controllers/calls.js +++ b/backend/controllers/calls.js @@ -1,6 +1,6 @@ const { ObjectId } = require('mongodb'); -var { callModel: Call } = require("../models/call"); +const Call = require("../models/call"); const Group = require("../models/group"); const opentelemetry = require('@opentelemetry/api'); var defaultNumResults = 50; diff --git a/backend/controllers/events.js b/backend/controllers/events.js index 33f43c6..6326332 100644 --- a/backend/controllers/events.js +++ b/backend/controllers/events.js @@ -6,7 +6,8 @@ var Podcast = require("../models/podcast"); var System = require("../models/system"); var Talkgroup = require("../models/talkgroup"); 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'; const os = require('os'); diff --git a/backend/controllers/uploads.js b/backend/controllers/uploads.js index d53236e..5fdb922 100644 --- a/backend/controllers/uploads.js +++ b/backend/controllers/uploads.js @@ -2,11 +2,11 @@ const path = require('path'); const fs = require('fs'); const opentelemetry = require('@opentelemetry/api'); const sysStats = require("../sys_stats"); -const System = require("../models/system"); -const Talkgroup = require("../models/talkgroup"); -const { callModel: Call } = require("../models/call"); +const systemSchema = require("../models/systemSchema"); +const talkgroupSchema = require("../models/talkgroupSchema"); +const callSchema = require("../models/callSchema"); const { trace, context } = opentelemetry; - +const mongoose = require("mongoose"); const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3"); const { fromIni } = require("@aws-sdk/credential-providers"); 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_profile = process.env['S3_PROFILE'] ?? 'wasabi-account'; 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({ 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) => { try { - item = await System.findOne({ shortName }, ["key", "ignoreUnknownTalkgroup"]); + item = await mongo_conn_fast.model("System").findOne({ shortName }, ["key", "ignoreUnknownTalkgroup"]); validateSpan.setAttribute('system.exists', !!item); } catch (err) { validateSpan.recordException(err); @@ -110,7 +135,7 @@ exports.upload = async function (req, res, next) { } if (item.ignoreUnknownTalkgroup) { - const talkgroupExists = await Talkgroup.exists({ + const talkgroupExists = await mongo_conn_fast.model("Talkgroup").exists({ shortName, 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 url = `${s3_public_url}/${object_key}`; - const call = new Call({ + const call = new (mongo_conn_slow.model("Call"))({ shortName, talkgroupNum, objectKey: object_key, diff --git a/backend/models/call.js b/backend/models/call.js index 06d6b55..ff464e0 100644 --- a/backend/models/call.js +++ b/backend/models/call.js @@ -1,45 +1,13 @@ 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 } */ -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); diff --git a/backend/models/callSchema.js b/backend/models/callSchema.js new file mode 100644 index 0000000..6dbcebf --- /dev/null +++ b/backend/models/callSchema.js @@ -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; \ No newline at end of file diff --git a/backend/models/event.js b/backend/models/event.js index da0169b..ed9bbc4 100644 --- a/backend/models/event.js +++ b/backend/models/event.js @@ -1,5 +1,5 @@ var mongoose = require('mongoose'); -var {frozenCallSchema} = require('./call'); +const frozenCallSchema = require('./frozenCallSchema'); var eventSchema = mongoose.Schema({ diff --git a/backend/models/frozenCall.js b/backend/models/frozenCall.js new file mode 100644 index 0000000..06139d3 --- /dev/null +++ b/backend/models/frozenCall.js @@ -0,0 +1,4 @@ +var mongoose = require('mongoose'); +const frozenCallSchema = require('./frozenCallSchema'); + +module.exports = mongoose.model('FrozenCall', frozenCallSchema); \ No newline at end of file diff --git a/backend/models/frozenCallSchema.js b/backend/models/frozenCallSchema.js new file mode 100644 index 0000000..801c262 --- /dev/null +++ b/backend/models/frozenCallSchema.js @@ -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; \ No newline at end of file diff --git a/backend/models/system.js b/backend/models/system.js index c761751..fa19fb6 100644 --- a/backend/models/system.js +++ b/backend/models/system.js @@ -1,37 +1,6 @@ var mongoose = require('mongoose'); -var bcrypt = require('bcrypt-nodejs'); -var User = require('./user'); +const systemSchema = require('./systemSchema'); -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); diff --git a/backend/models/systemSchema.js b/backend/models/systemSchema.js new file mode 100644 index 0000000..0f1557b --- /dev/null +++ b/backend/models/systemSchema.js @@ -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; \ No newline at end of file diff --git a/backend/models/talkgroup.js b/backend/models/talkgroup.js index 0e9a812..44211d2 100644 --- a/backend/models/talkgroup.js +++ b/backend/models/talkgroup.js @@ -1,16 +1,4 @@ var mongoose = require('mongoose'); - -var talkgroupSchema = mongoose.Schema({ - shortName: String, - userId: String, - num: Number, - mode: String, - alpha: String, - description: String, - tag: String, - group: String, - priority: Number -}); - +const talkgroupSchema = require('./talkgroupSchema'); module.exports = mongoose.model('Talkgroup', talkgroupSchema); diff --git a/backend/models/talkgroupSchema.js b/backend/models/talkgroupSchema.js new file mode 100644 index 0000000..ce0fa39 --- /dev/null +++ b/backend/models/talkgroupSchema.js @@ -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; \ No newline at end of file diff --git a/frontend/src/Call/components/MediaPlayer.css b/frontend/src/Call/components/MediaPlayer.css index 6702ff7..31a1fda 100644 --- a/frontend/src/Call/components/MediaPlayer.css +++ b/frontend/src/Call/components/MediaPlayer.css @@ -87,4 +87,8 @@ background-color: #5c5c5c; width: 50px; color: white; } -} \ No newline at end of file +} + +i.icon { + font-size: inherit; +} \ No newline at end of file diff --git a/frontend/src/Call/components/MediaPlayer.js b/frontend/src/Call/components/MediaPlayer.js index 315961f..1e7f652 100644 --- a/frontend/src/Call/components/MediaPlayer.js +++ b/frontend/src/Call/components/MediaPlayer.js @@ -67,6 +67,11 @@ const MediaPlayer = (props) => { }, [playSilence]); + useEffect(() => { + setSourceIndex(0); + }, [call]); + + const onReady = (ws) => { setWavesurfer(ws) setIsPlaying(false) @@ -75,7 +80,7 @@ const MediaPlayer = (props) => { call.srcList.forEach(src => { regionsPlugin.addRegion({ start: src.pos, - color: "white", + color: "rgba(128, 128, 128, 1.0)", drag: false, resize: false }); @@ -137,7 +142,7 @@ const MediaPlayer = (props) => { -