hfbcast 1.0.2 → 1.0.8-lib7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -30
- package/assets/database.sqlite.gz +0 -0
- package/commithash.json +1 -0
- package/dist/hfbcast.min.js +2 -0
- package/dist/hfbcast.min.js.map +1 -0
- package/dist/index.html +1 -13
- package/dist/index.min.js +2 -0
- package/dist/index.min.js.map +1 -0
- package/doc/README.md +12 -0
- package/doc/documentation.adoc +23 -0
- package/doc/images/figure1.png +0 -0
- package/doc/images/figure2.png +0 -0
- package/doc/styles/asciidoctor-default.css +393 -0
- package/doc/styles/coderay-asciidoctor.css +87 -0
- package/doc/styles/stylesheet.css +6 -0
- package/index.js +80 -0
- package/package.json +71 -28
- package/server.js +122 -0
- package/src/index.html +14 -0
- package/src/index.js +48 -84
- package/src/lib.js +133 -0
- package/test/runTests.js +22 -0
- package/.vscode/tasks.json +0 -28
- package/dist/demo.js +0 -206
- package/dist/rfdfhfbroadcast.js +0 -195
- package/release +0 -1
- package/scripts/build.js +0 -19
- package/scripts/cicd/jobs.sh +0 -14
- package/scripts/local/publish.bat +0 -11
- package/sources/shortwave_AOKI.html +0 -55006
- package/sources/shortwave_EIBI.html +0 -97450
- package/sources/shortwave_HFCC.html +0 -33631
- package/sqlite/build.ts +0 -127
- package/sqlite/data-source.ts +0 -17
- package/sqlite/entity/Broadcast.ts +0 -38
- package/sqlite/entity/Site.ts +0 -26
- package/sqlite/package-lock.json +0 -2303
- package/sqlite/package.json +0 -17
- package/src/demo.html +0 -13
- package/src/demo.js +0 -6
- package/src/index.d.ts +0 -33
- package/tsconfig.json +0 -15
- package/webpack.config.js +0 -28
package/package.json
CHANGED
|
@@ -1,30 +1,73 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
2
|
+
"name": "hfbcast",
|
|
3
|
+
"version": "1.0.8-lib7",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "./index.js",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.sys/FRA/df-hfbcast.git"
|
|
9
|
+
},
|
|
10
|
+
"bin": {
|
|
11
|
+
"@fra/df-hfbcast": "server.js",
|
|
12
|
+
"df-hfbcast-runserver": "server.js",
|
|
13
|
+
"df-hfbcast-test": "test/runTests.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"src",
|
|
17
|
+
"dist",
|
|
18
|
+
"doc",
|
|
19
|
+
"server.js",
|
|
20
|
+
"index.js",
|
|
21
|
+
"assets",
|
|
22
|
+
"commithash.json"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "webpack",
|
|
26
|
+
"build:db": "cd sqlite && npm install && npm run build && gzip database.sqlite && mv database.sqlite.gz ../assets",
|
|
27
|
+
"dev": "webpack serve",
|
|
28
|
+
"devserve": "webpack serve --env server=start",
|
|
29
|
+
"serve": "nodemon server.js"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [],
|
|
32
|
+
"author": "",
|
|
33
|
+
"license": "ISC",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"cors": "^2.8.5",
|
|
36
|
+
"css-loader": "^7.1.2",
|
|
37
|
+
"express": "^4.19.1",
|
|
38
|
+
"http-proxy-middleware": "^2.0.6",
|
|
39
|
+
"jquery": "^3.7.0",
|
|
40
|
+
"log4js": "^6.9.1",
|
|
41
|
+
"pako": "^2.1.0",
|
|
42
|
+
"sql.js": "^1.10.2",
|
|
43
|
+
"style-loader": "^4.0.0",
|
|
44
|
+
"url-loader": "^4.1.1",
|
|
45
|
+
"yargs": "^17.7.2"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"ag-grid-community": "^32.2.2",
|
|
49
|
+
"dockerode": "^3.3.5",
|
|
50
|
+
"glob": "^11.0.0",
|
|
51
|
+
"html-webpack-plugin": "^5.6.0",
|
|
52
|
+
"jest": "^29.7.0",
|
|
53
|
+
"node-fetch": "2.6.5",
|
|
54
|
+
"nodemon": "^3.1.0",
|
|
55
|
+
"rimraf": "^6.0.1",
|
|
56
|
+
"shelljs": "^0.8.5",
|
|
57
|
+
"terser-webpack-plugin": "^5.3.10",
|
|
58
|
+
"webpack": "^5.91.0",
|
|
59
|
+
"webpack-bundle-analyzer": "^4.10.2",
|
|
60
|
+
"webpack-cli": "^5.1.4",
|
|
61
|
+
"webpack-dev-server": "4.15.1"
|
|
62
|
+
},
|
|
63
|
+
"jobInfo": {
|
|
64
|
+
"doc": "1. build documentation",
|
|
65
|
+
"database": "2. build the database",
|
|
66
|
+
"package": "3. build and pack the application (needs 1 & 2)",
|
|
67
|
+
"test": "4. run tests (needs 3)",
|
|
68
|
+
"run": "5. run the package (needs 3)",
|
|
69
|
+
"publish": "6. publish the package (needs 3)",
|
|
70
|
+
"image": "7. build the application image (needs 3)",
|
|
71
|
+
"deploy": "8. deploy the application (needs 7)"
|
|
72
|
+
}
|
|
30
73
|
}
|
package/server.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const log4js = require("log4js");
|
|
4
|
+
|
|
5
|
+
function server(config, silent) {
|
|
6
|
+
|
|
7
|
+
const express = require('express')
|
|
8
|
+
const path = require('path')
|
|
9
|
+
const cors = require('cors')
|
|
10
|
+
const app = express()
|
|
11
|
+
|
|
12
|
+
const logger = log4js.getLogger();
|
|
13
|
+
logger.level = silent ? 'fatal' : 'debug';
|
|
14
|
+
|
|
15
|
+
let resolver, rejecter;
|
|
16
|
+
|
|
17
|
+
app.use(express.json())
|
|
18
|
+
app.use(cors());
|
|
19
|
+
app.options('*', cors());
|
|
20
|
+
|
|
21
|
+
// //allowing for use of sharedArrayBuffers
|
|
22
|
+
// app.use((req, res, next) => {
|
|
23
|
+
// res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
|
|
24
|
+
// // res.setHeader("Cross-Origin-Embedder-Policy", "same-origin");
|
|
25
|
+
// next();
|
|
26
|
+
// })
|
|
27
|
+
|
|
28
|
+
//******************************
|
|
29
|
+
// serve static content
|
|
30
|
+
//******************************
|
|
31
|
+
|
|
32
|
+
app.use(express.static(path.resolve(__dirname, 'dist')));
|
|
33
|
+
// app.use('/doc/mathjax', express.static(path.resolve(__dirname, 'lib/mathjax')));
|
|
34
|
+
app.use('/doc', express.static(path.resolve(__dirname, 'doc')));
|
|
35
|
+
|
|
36
|
+
//******************************
|
|
37
|
+
// REST
|
|
38
|
+
//******************************
|
|
39
|
+
|
|
40
|
+
app.get('/api/v1/resource/:parameter', (req, res, next) => {
|
|
41
|
+
reqURL = new URL(req.url, 'http://' + req.headers.host + '/');
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
res.json({
|
|
45
|
+
parameter: req.params.parameter,
|
|
46
|
+
queryVar1: reqURL.searchParams.get('var1'),
|
|
47
|
+
queryVar2: reqURL.searchParams.get('var2'),
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
app.post('/api/v1/resource', (req, res, next) => {
|
|
52
|
+
res.json({requestBody: req.body});
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
//******************************
|
|
56
|
+
// proxy
|
|
57
|
+
//******************************
|
|
58
|
+
|
|
59
|
+
const { createProxyMiddleware } = require('http-proxy-middleware');
|
|
60
|
+
|
|
61
|
+
app.use('/jsontest',
|
|
62
|
+
createProxyMiddleware({
|
|
63
|
+
target: 'http://echo.jsontest.com/',
|
|
64
|
+
changeOrigin: true,
|
|
65
|
+
pathRewrite: {
|
|
66
|
+
'^/jsontest':''
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
//*********************************************************************
|
|
72
|
+
// set up web sockets (all on the same port as the http server)
|
|
73
|
+
//*********************************************************************
|
|
74
|
+
|
|
75
|
+
const server = require('http').createServer();
|
|
76
|
+
|
|
77
|
+
server.on('request', app);
|
|
78
|
+
|
|
79
|
+
server.on('error', e => {
|
|
80
|
+
logger.info(e);
|
|
81
|
+
rejecter('server error');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
server.listen(8080, () => {
|
|
85
|
+
logger.info('app server listening on http://localhost:8080')
|
|
86
|
+
resolver('server started');
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
resolver = resolve;
|
|
91
|
+
rejecter = reject;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const yargs = require('yargs')
|
|
96
|
+
.usage('npm start -- -c <config file> -s <silent>')
|
|
97
|
+
.options({
|
|
98
|
+
config: {
|
|
99
|
+
alias: 'c',
|
|
100
|
+
describe: 'config file',
|
|
101
|
+
},
|
|
102
|
+
silent: {
|
|
103
|
+
alias: 's',
|
|
104
|
+
describe: 'run without logging',
|
|
105
|
+
}
|
|
106
|
+
})
|
|
107
|
+
.argv;
|
|
108
|
+
|
|
109
|
+
if (require.main === module) {
|
|
110
|
+
server(yargs.config ? require('./' + yargs.config) : {}, yargs.silent)
|
|
111
|
+
.then(message => {
|
|
112
|
+
console.log(message);
|
|
113
|
+
})
|
|
114
|
+
.catch(message => {
|
|
115
|
+
console.error(message);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
module.exports = {
|
|
120
|
+
server
|
|
121
|
+
};
|
|
122
|
+
|
package/src/index.html
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>hfbcast</title>
|
|
7
|
+
<!-- <link rel="stylesheet" href="https://unpkg.com/ag-grid-community/styles/ag-grid.css"> -->
|
|
8
|
+
<!-- <link rel="stylesheet" href="https://unpkg.com/ag-grid-community/styles/ag-theme-alpine.css"> -->
|
|
9
|
+
<!-- <script src="https://cdn.jsdelivr.net/npm/ag-grid-community/dist/ag-grid-community.min.js"></script> -->
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="myGrid" class="ag-theme-balham" style="height: 500px"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
package/src/index.js
CHANGED
|
@@ -1,84 +1,48 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return res[0];
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
getBroadcastsAt(frequencyKHz, intervalKHz) {
|
|
53
|
-
|
|
54
|
-
const now = new Date();
|
|
55
|
-
const currentDay = now.getUTCDay();
|
|
56
|
-
const currentHour = now.getUTCHours();
|
|
57
|
-
const currentMinute = now.getUTCMinutes();
|
|
58
|
-
const currentTime = currentMinute + 60*currentHour;
|
|
59
|
-
|
|
60
|
-
const query = `SELECT * FROM broadcast
|
|
61
|
-
JOIN site on broadcast.siteId = site.id
|
|
62
|
-
WHERE broadcast.startTime <= ${currentTime} AND
|
|
63
|
-
broadcast.endTime >= ${currentTime} AND
|
|
64
|
-
NOT (site.lat = 0 AND site.lon = 0) AND
|
|
65
|
-
broadcast.days & (1 << ${currentDay}) != 0 AND
|
|
66
|
-
broadcast.frequency <= ${intervalKHz + frequencyKHz/1000} AND
|
|
67
|
-
broadcast.frequency >= ${-intervalKHz + frequencyKHz/1000}
|
|
68
|
-
`
|
|
69
|
-
|
|
70
|
-
const broadcasts = [];
|
|
71
|
-
const res = this.db.exec(query);
|
|
72
|
-
if (res.length > 0) {
|
|
73
|
-
res[0].values.forEach(c => {
|
|
74
|
-
const broadcast = {};
|
|
75
|
-
c.forEach((colvalue, i) => {
|
|
76
|
-
broadcast[res[0].columns[i]] = colvalue;
|
|
77
|
-
})
|
|
78
|
-
broadcasts.push(broadcast);
|
|
79
|
-
})
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return broadcasts;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
1
|
+
import 'style-loader!css-loader!ag-grid-community/styles/ag-theme-balham.css';
|
|
2
|
+
import 'style-loader!css-loader!ag-grid-community/styles/ag-grid.css';
|
|
3
|
+
import {createGrid} from 'ag-grid-community';
|
|
4
|
+
import {BroadcastDb} from './lib.js';
|
|
5
|
+
import {commitHash} from '../commithash.json';
|
|
6
|
+
// import {BroadcastDb, commitHash} from '../dist';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
console.log('COMMIT HASH', commitHash);
|
|
10
|
+
|
|
11
|
+
(new BroadcastDb()).then(db => {
|
|
12
|
+
// Get and display build info
|
|
13
|
+
const buildInfo = db.getBuildInfo();
|
|
14
|
+
if (buildInfo) {
|
|
15
|
+
const buildInfoDiv = document.createElement('div');
|
|
16
|
+
buildInfoDiv.style.padding = '10px';
|
|
17
|
+
buildInfoDiv.style.backgroundColor = '#f0f0f0';
|
|
18
|
+
buildInfoDiv.style.marginBottom = '10px';
|
|
19
|
+
buildInfoDiv.style.fontFamily = 'monospace';
|
|
20
|
+
buildInfoDiv.innerHTML = `
|
|
21
|
+
<strong>Database Build Info:</strong><br>
|
|
22
|
+
Build Date: ${buildInfo.buildDate}<br>
|
|
23
|
+
Commit Hash: ${buildInfo.commitHash}
|
|
24
|
+
`;
|
|
25
|
+
document.body.insertBefore(buildInfoDiv, document.body.firstChild);
|
|
26
|
+
console.log('Database Build Info:', buildInfo);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const result = db.getBroadcastsBetween(0,30000);
|
|
30
|
+
// console.log(result.columns);
|
|
31
|
+
// console.log(result.values);
|
|
32
|
+
|
|
33
|
+
const useColumns = ['frequency', 'station', 'country', 'source', 'name', 'power', 'lon', 'lat'];
|
|
34
|
+
const useIndex = useColumns.map(name => result.columns.indexOf(name));
|
|
35
|
+
|
|
36
|
+
const gridOptions = {
|
|
37
|
+
rowData: result.values.map(row => useColumns.reduce((res, name, i) => {
|
|
38
|
+
res[name] = row[useIndex[i]];
|
|
39
|
+
return res;
|
|
40
|
+
},{})),
|
|
41
|
+
columnDefs: useColumns.map((name, i) => {return {field: name}}),
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const myGridElement = document.querySelector('#myGrid');
|
|
45
|
+
createGrid(myGridElement, gridOptions);
|
|
46
|
+
|
|
47
|
+
});
|
|
48
|
+
|
package/src/lib.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
const dumm = require("sql.js");
|
|
2
|
+
const pako = require("pako");
|
|
3
|
+
const sqlwasm = require("url-loader!sql.js/dist/sql-wasm.wasm").default;
|
|
4
|
+
const gzUrl = require("url-loader!../assets/database.sqlite.gz").default;
|
|
5
|
+
|
|
6
|
+
async function openDb() {
|
|
7
|
+
return new Promise(resolve => {
|
|
8
|
+
fetch(sqlwasm).then(res => res.blob()).then(async blob => {
|
|
9
|
+
const sqlPromise = dumm({
|
|
10
|
+
locateFile: () => URL.createObjectURL(blob)
|
|
11
|
+
});
|
|
12
|
+
const dataPromise = fetch(gzUrl).then(res => res.arrayBuffer());
|
|
13
|
+
const [SQL, buf] = await Promise.all([sqlPromise, dataPromise])
|
|
14
|
+
const db = new SQL.Database(new Uint8Array(pako.ungzip(buf)));
|
|
15
|
+
resolve(db);
|
|
16
|
+
})
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class BroadcastDb {
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
return new Promise(async resolve => {
|
|
24
|
+
this.db = await openDb();
|
|
25
|
+
resolve(this)
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
getBroadcastsFromSites(station) {
|
|
30
|
+
|
|
31
|
+
const now = new Date();
|
|
32
|
+
const currentDay = now.getUTCDay();
|
|
33
|
+
const currentHour = now.getUTCHours();
|
|
34
|
+
const currentMinute = now.getUTCMinutes();
|
|
35
|
+
const currentTime = currentMinute + 60*currentHour;
|
|
36
|
+
|
|
37
|
+
const query = `SELECT * FROM broadcast
|
|
38
|
+
JOIN site on broadcast.siteId = site.id
|
|
39
|
+
WHERE broadcast.station LIKE '%${station}%'`
|
|
40
|
+
const res = this.db.exec(query);
|
|
41
|
+
|
|
42
|
+
return res[0];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getBroadcastsBetween(minFreqkHz, maxFreqkHz, startTm = new Date(), endTm = new Date()) {
|
|
46
|
+
|
|
47
|
+
//getUTCDay (Monday = 1, Tuesday = 2 ... Sunday = 0)
|
|
48
|
+
let startDay = endTm.getUTCDay()-1;
|
|
49
|
+
if (startDay === -1) {
|
|
50
|
+
startDay = 6;
|
|
51
|
+
}
|
|
52
|
+
const startHour = startTm.getUTCHours();
|
|
53
|
+
const startMinute = startTm.getUTCMinutes();
|
|
54
|
+
const startTime = startMinute + 60*startHour;
|
|
55
|
+
|
|
56
|
+
const endHour = endTm.getUTCHours();
|
|
57
|
+
const endMinute = endTm.getUTCMinutes();
|
|
58
|
+
const endTime = endMinute + 60*endHour;
|
|
59
|
+
|
|
60
|
+
const query = `SELECT * FROM broadcast
|
|
61
|
+
JOIN site on broadcast.siteId = site.id
|
|
62
|
+
WHERE broadcast.startTime <= ${endTime} AND
|
|
63
|
+
broadcast.endTime > ${startTime} AND
|
|
64
|
+
NOT (site.lat = 0 AND site.lon = 0) AND
|
|
65
|
+
broadcast.days & (1 << ${startDay}) != 0 AND
|
|
66
|
+
broadcast.frequency <= ${maxFreqkHz} AND
|
|
67
|
+
broadcast.frequency >= ${minFreqkHz}
|
|
68
|
+
`
|
|
69
|
+
const res = this.db.exec(query);
|
|
70
|
+
|
|
71
|
+
return res[0];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
getBroadcastsAt(frequencyKHz, intervalKHz, startTm = new Date(), endTm = new Date()) {
|
|
76
|
+
|
|
77
|
+
//getUTCDay (Monday = 1, Tuesday = 2 ... Sunday = 0)
|
|
78
|
+
let currentDay = endTm.getUTCDay()-1;
|
|
79
|
+
if (currentDay === -1) {
|
|
80
|
+
currentDay = 6;
|
|
81
|
+
}
|
|
82
|
+
const startHour = startTm.getUTCHours();
|
|
83
|
+
const startMinute = startTm.getUTCMinutes();
|
|
84
|
+
const startTime = startMinute + 60*startHour;
|
|
85
|
+
|
|
86
|
+
const endHour = endTm.getUTCHours();
|
|
87
|
+
const endMinute = endTm.getUTCMinutes();
|
|
88
|
+
const endTime = endMinute + 60*endHour;
|
|
89
|
+
|
|
90
|
+
const query = `SELECT * FROM broadcast
|
|
91
|
+
JOIN site on broadcast.siteId = site.id
|
|
92
|
+
WHERE broadcast.startTime <= ${endTime} AND
|
|
93
|
+
broadcast.endTime > ${startTime} AND
|
|
94
|
+
NOT (site.lat = 0 AND site.lon = 0) AND
|
|
95
|
+
broadcast.days & (1 << ${currentDay}) != 0 AND
|
|
96
|
+
broadcast.frequency <= ${intervalKHz + frequencyKHz/1000} AND
|
|
97
|
+
broadcast.frequency >= ${-intervalKHz + frequencyKHz/1000}
|
|
98
|
+
`
|
|
99
|
+
|
|
100
|
+
const broadcasts = [];
|
|
101
|
+
const res = this.db.exec(query);
|
|
102
|
+
if (res.length > 0) {
|
|
103
|
+
res[0].values.forEach(c => {
|
|
104
|
+
const broadcast = {};
|
|
105
|
+
c.forEach((colvalue, i) => {
|
|
106
|
+
broadcast[res[0].columns[i]] = colvalue;
|
|
107
|
+
})
|
|
108
|
+
broadcasts.push(broadcast);
|
|
109
|
+
})
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return broadcasts;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
getBuildInfo() {
|
|
116
|
+
const query = `SELECT * FROM build_info ORDER BY id DESC LIMIT 1`;
|
|
117
|
+
const res = this.db.exec(query);
|
|
118
|
+
|
|
119
|
+
if (res.length > 0 && res[0].values.length > 0) {
|
|
120
|
+
const buildInfo = {};
|
|
121
|
+
res[0].values[0].forEach((colvalue, i) => {
|
|
122
|
+
buildInfo[res[0].columns[i]] = colvalue;
|
|
123
|
+
});
|
|
124
|
+
return buildInfo;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
module.exports = {
|
|
132
|
+
BroadcastDb
|
|
133
|
+
}
|
package/test/runTests.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
console.log('testing package hfbcast ...');
|
|
4
|
+
|
|
5
|
+
// const jest = require("jest");
|
|
6
|
+
// const path = require("path");
|
|
7
|
+
|
|
8
|
+
// const options = {
|
|
9
|
+
// projects: [path.resolve(__dirname)],
|
|
10
|
+
// silent: false,
|
|
11
|
+
// };
|
|
12
|
+
|
|
13
|
+
// jest
|
|
14
|
+
// .runCLI(options, options.projects)
|
|
15
|
+
// .then((success) => {
|
|
16
|
+
// console.log(success.results.success ? 'PASSED!' : 'FAILED!');
|
|
17
|
+
// process.exit(success.results.success ? 0 : 1)
|
|
18
|
+
// })
|
|
19
|
+
// .catch((failure) => {
|
|
20
|
+
// console.error('COULD NOT RUN TESTS!');
|
|
21
|
+
// process.exit(1)
|
|
22
|
+
// });
|
package/.vscode/tasks.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
|
3
|
-
// for the documentation about the tasks.json format
|
|
4
|
-
"version": "2.0.0",
|
|
5
|
-
"tasks": [
|
|
6
|
-
{
|
|
7
|
-
"label": "publish package",
|
|
8
|
-
"type": "shell",
|
|
9
|
-
"command": "./scripts/local/publish.sh",
|
|
10
|
-
"windows": {
|
|
11
|
-
"command": ".\\scripts\\local\\publish.bat"
|
|
12
|
-
},
|
|
13
|
-
"group": "build native",
|
|
14
|
-
"presentation": {
|
|
15
|
-
"reveal": "always",
|
|
16
|
-
"panel": "new"
|
|
17
|
-
},
|
|
18
|
-
"problemMatcher": []
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"type": "npm",
|
|
22
|
-
"script": "dev",
|
|
23
|
-
"problemMatcher": [],
|
|
24
|
-
"label": "npm: dev",
|
|
25
|
-
"detail": "webpack serve"
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
}
|