├── .gitignore
├── README.md
├── docs
├── CNAME
├── b8d665ed15dd3d44da60.worklet.js
├── bundle.js
├── cyberradio-blast.png
├── enable-threads.js
├── icon.png
├── index.html
└── wasm
│ ├── cyberradio.html
│ ├── cyberradio.js
│ ├── cyberradio.wasm
│ ├── cyberradio.wasm.map
│ └── cyberradio.worker.js
├── package-lock.json
├── package.json
├── server.dev.js
├── server.prod.js
├── src
├── client
│ ├── client.jsx
│ └── index.jsx
├── components
│ ├── App.jsx
│ ├── Finder.jsx
│ ├── Player.jsx
│ └── Static.jsx
├── misc
│ └── utils.jsx
├── stores
│ └── Store.jsx
└── styles
│ ├── app.scss
│ ├── btn.scss
│ ├── finder.scss
│ ├── mixins.scss
│ ├── palette.scss
│ ├── player.scss
│ ├── sources.scss
│ └── volume.scss
├── webpack.config.dev.js
└── webpack.config.prod.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | node_modules
5 | *$py.class
6 |
7 | # C extensions
8 | *.so
9 |
10 | # Distribution / packaging
11 | .Python
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
131 | # macOS
132 | .DS_Store
133 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # :crystal_ball: CyberRadio Blast
2 | ### A browser based SDR console.
3 | Based on the [webusb-libusb](https://github.com/luigifcruz/webusb-libusb) library. Powered by WebAssembly and Emscripten.
4 |
5 |
6 |
7 |
8 |
9 | ## Installation
10 | Just browse to https://blast.luigi.ltd.
11 |
12 | ## Compatibility
13 | - Chrome Desktop
14 |
15 | ## Validated Radios (More to Come!)
16 | - AirSpy HF+ Discovery
17 |
--------------------------------------------------------------------------------
/docs/CNAME:
--------------------------------------------------------------------------------
1 | blast.luigi.ltd
--------------------------------------------------------------------------------
/docs/cyberradio-blast.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigifcruz/CyberRadioBlast/7ed3367a1d5ccd8ca4a9cebef23dfff8acdbd753/docs/cyberradio-blast.png
--------------------------------------------------------------------------------
/docs/enable-threads.js:
--------------------------------------------------------------------------------
1 | // File from https://github.com/josephrocca/clip-image-sorter/blob/main/enable-threads.js
2 |
3 | // NOTE: This file creates a service worker that cross-origin-isolates the page (read more here: https://web.dev/coop-coep/) which allows us to use wasm threads.
4 | // Normally you would set the COOP and COEP headers on the server to do this, but Github Pages doesn't allow this, so this is a hack to do that.
5 |
6 | /* Edited version of: coi-serviceworker v0.1.6 - Guido Zuidhof, licensed under MIT */
7 | // From here: https://github.com/gzuidhof/coi-serviceworker
8 | if(typeof window === 'undefined') {
9 | self.addEventListener("install", () => self.skipWaiting());
10 | self.addEventListener("activate", e => e.waitUntil(self.clients.claim()));
11 |
12 | async function handleFetch(request) {
13 | if(request.cache === "only-if-cached" && request.mode !== "same-origin") {
14 | return;
15 | }
16 |
17 | if(request.mode === "no-cors") { // We need to set `credentials` to "omit" for no-cors requests, per this comment: https://bugs.chromium.org/p/chromium/issues/detail?id=1309901#c7
18 | request = new Request(request.url, {
19 | cache: request.cache,
20 | credentials: "omit",
21 | headers: request.headers,
22 | integrity: request.integrity,
23 | destination: request.destination,
24 | keepalive: request.keepalive,
25 | method: request.method,
26 | mode: request.mode,
27 | redirect: request.redirect,
28 | referrer: request.referrer,
29 | referrerPolicy: request.referrerPolicy,
30 | signal: request.signal,
31 | });
32 | }
33 |
34 | let r = await fetch(request).catch(e => console.error(e));
35 |
36 | if(r.status === 0) {
37 | return r;
38 | }
39 |
40 | const headers = new Headers(r.headers);
41 | headers.set("Cross-Origin-Embedder-Policy", "credentialless"); // or: require-corp
42 | headers.set("Cross-Origin-Opener-Policy", "same-origin");
43 |
44 | return new Response(r.body, { status: r.status, statusText: r.statusText, headers });
45 | }
46 |
47 | self.addEventListener("fetch", function(e) {
48 | e.respondWith(handleFetch(e.request)); // respondWith must be executed synchonously (but can be passed a Promise)
49 | });
50 |
51 | } else {
52 | (async function() {
53 | if(window.crossOriginIsolated !== false) return;
54 |
55 | let registration = await navigator.serviceWorker.register(window.document.currentScript.src).catch(e => console.error("COOP/COEP Service Worker failed to register:", e));
56 | if(registration) {
57 | console.log("COOP/COEP Service Worker registered", registration.scope);
58 |
59 | registration.addEventListener("updatefound", () => {
60 | console.log("Reloading page to make use of updated COOP/COEP Service Worker.");
61 | window.location.reload();
62 | });
63 |
64 | // If the registration is active, but it's not controlling the page
65 | if(registration.active && !navigator.serviceWorker.controller) {
66 | console.log("Reloading page to make use of COOP/COEP Service Worker.");
67 | window.location.reload();
68 | }
69 | }
70 | })();
71 | }
72 |
73 | // Code to deregister:
74 | // let registrations = await navigator.serviceWorker.getRegistrations();
75 | // for(let registration of registrations) {
76 | // await registration.unregister();
77 | // }
78 |
--------------------------------------------------------------------------------
/docs/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigifcruz/CyberRadioBlast/7ed3367a1d5ccd8ca4a9cebef23dfff8acdbd753/docs/icon.png
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | CyberRadio
5 |
6 |
7 |
8 |
9 |
24 |
25 |
26 |
27 |
28 |

29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/docs/wasm/cyberradio.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Emscripten-Generated Code
7 |
103 |
104 |
105 |
106 |
1196 |
1197 |
1198 |
1199 | Downloading...
1200 |
1201 |
1202 | Resize canvas
1203 | Lock/hide mouse pointer
1204 |
1206 |
1207 |
1208 |
1209 |
1212 |
1213 |
1214 |
1215 |
1216 |
1217 |
1218 |
1219 |
1296 |
1297 |
1298 |
1299 |
1300 |
1301 |
--------------------------------------------------------------------------------
/docs/wasm/cyberradio.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/luigifcruz/CyberRadioBlast/7ed3367a1d5ccd8ca4a9cebef23dfff8acdbd753/docs/wasm/cyberradio.wasm
--------------------------------------------------------------------------------
/docs/wasm/cyberradio.wasm.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/vector","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/new","../../libusb/src/libusb.cc","../../../emsdk/upstream/emscripten/cache/sysroot/include/emscripten/val.h","../../../emsdk/upstream/emscripten/cache/sysroot/include/emscripten/wire.h","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/ostream","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/string","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/algorithm","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__string","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__mutex_base","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/memory","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/iterator","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__split_buffer","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/type_traits","../../libusb/src/interface.cc","../../external/airspyhf/libairspyhf/src/iqbalancer.c","../../external/airspyhf/libairspyhf/src/airspyhf.c","../include/libusb.h","../../../src/base/cbuffer.cc","../include/samurai/base/cbuffer.hpp","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/chrono","../../../src/base/channel.cc","../../../src/base/device.cc","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/ios","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__locale","../include/samurai/base/channel.hpp","../include/samurai/tools/magic_enum.hpp","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/array","../../../src/airspyhf/channel.cc","../../../src/airspyhf/device.cc","../include/samurai/base/device.hpp","../../audiocontext/src/audiocontext.cc","../../audiocontext/src/interface.cc","../include/samurai/samurai.hpp","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/initializer_list","../../example/cyberradio.cc","../include/samurai/airspyhf/device.hpp","../../../emsdk/upstream/emscripten/cache/sysroot/include/emscripten/bind.h","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/stdexcept","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/locale","../../../emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/streambuf"],"names":[],"mappings":"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"}
--------------------------------------------------------------------------------
/docs/wasm/cyberradio.worker.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @license
3 | * Copyright 2015 The Emscripten Authors
4 | * SPDX-License-Identifier: MIT
5 | */
6 |
7 | // Pthread Web Worker startup routine:
8 | // This is the entry point file that is loaded first by each Web Worker
9 | // that executes pthreads on the Emscripten application.
10 |
11 | // Thread-local:
12 | var initializedJS = false; // Guard variable for one-time init of the JS state (currently only embind types registration)
13 |
14 | var Module = {};
15 |
16 | function threadPrintErr() {
17 | var text = Array.prototype.slice.call(arguments).join(' ');
18 | console.error(text);
19 | }
20 | function threadAlert() {
21 | var text = Array.prototype.slice.call(arguments).join(' ');
22 | postMessage({cmd: 'alert', text: text, threadId: Module['_pthread_self']()});
23 | }
24 | var err = threadPrintErr;
25 | this.alert = threadAlert;
26 |
27 | Module['instantiateWasm'] = function(info, receiveInstance) {
28 | // Instantiate from the module posted from the main thread.
29 | // We can just use sync instantiation in the worker.
30 | var instance = new WebAssembly.Instance(Module['wasmModule'], info);
31 | // We don't need the module anymore; new threads will be spawned from the main thread.
32 | Module['wasmModule'] = null;
33 | receiveInstance(instance); // The second 'module' parameter is intentionally null here, we don't need to keep a ref to the Module object from here.
34 | return instance.exports;
35 | };
36 |
37 | // When using postMessage to send an object, it is processed by the structured clone algorithm.
38 | // The prototype, and hence methods, on that object is then lost. This function adds back the lost prototype.
39 | // This does not work with nested objects that has prototypes, but it suffices for WasmSourceMap and WasmOffsetConverter.
40 | function resetPrototype(constructor, attrs) {
41 | var object = Object.create(constructor.prototype);
42 | for (var key in attrs) {
43 | if (attrs.hasOwnProperty(key)) {
44 | object[key] = attrs[key];
45 | }
46 | }
47 | return object;
48 | }
49 |
50 | var wasmSourceMapData;
51 | var wasmOffsetData;
52 |
53 | function moduleLoaded() {
54 | wasmSourceMap = resetPrototype(Module['WasmSourceMap'], wasmSourceMapData);
55 | wasmOffsetConverter = resetPrototype(Module['WasmOffsetConverter'], wasmOffsetData);
56 | }
57 |
58 | this.onmessage = function(e) {
59 | try {
60 | if (e.data.cmd === 'load') { // Preload command that is called once per worker to parse and load the Emscripten code.
61 |
62 | // Module and memory were sent from main thread
63 | Module['wasmModule'] = e.data.wasmModule;
64 |
65 | Module['wasmMemory'] = e.data.wasmMemory;
66 |
67 | wasmSourceMapData = e.data.wasmSourceMap;
68 | wasmOffsetData = e.data.wasmOffsetConverter;
69 |
70 | Module['buffer'] = Module['wasmMemory'].buffer;
71 |
72 | Module['ENVIRONMENT_IS_PTHREAD'] = true;
73 |
74 | if (typeof e.data.urlOrBlob === 'string') {
75 | importScripts(e.data.urlOrBlob);
76 | } else {
77 | var objectUrl = URL.createObjectURL(e.data.urlOrBlob);
78 | importScripts(objectUrl);
79 | URL.revokeObjectURL(objectUrl);
80 | }
81 | CyberRadioCore(Module).then(function (instance) {
82 | Module = instance;
83 | moduleLoaded();
84 | });
85 |
86 | } else if (e.data.cmd === 'objectTransfer') {
87 | Module['PThread'].receiveObjectTransfer(e.data);
88 | } else if (e.data.cmd === 'run') {
89 | // This worker was idle, and now should start executing its pthread entry
90 | // point.
91 | // performance.now() is specced to return a wallclock time in msecs since
92 | // that Web Worker/main thread launched. However for pthreads this can
93 | // cause subtle problems in emscripten_get_now() as this essentially
94 | // would measure time from pthread_create(), meaning that the clocks
95 | // between each threads would be wildly out of sync. Therefore sync all
96 | // pthreads to the clock on the main browser thread, so that different
97 | // threads see a somewhat coherent clock across each of them
98 | // (+/- 0.1msecs in testing).
99 | Module['__performance_now_clock_drift'] = performance.now() - e.data.time;
100 |
101 | // Pass the thread address inside the asm.js scope to store it for fast access that avoids the need for a FFI out.
102 | Module['__emscripten_thread_init'](e.data.threadInfoStruct, /*isMainBrowserThread=*/0, /*isMainRuntimeThread=*/0);
103 |
104 | // Establish the stack frame for this thread in global scope
105 | // The stack grows downwards
106 | var max = e.data.stackBase;
107 | var top = e.data.stackBase + e.data.stackSize;
108 | // Also call inside JS module to set up the stack frame for this pthread in JS module scope
109 | Module['establishStackSpace'](top, max);
110 | Module['_emscripten_tls_init']();
111 |
112 | Module['PThread'].receiveObjectTransfer(e.data);
113 | Module['PThread'].setThreadStatus(Module['_pthread_self'](), 1/*EM_THREAD_STATUS_RUNNING*/);
114 |
115 | // Embind must initialize itself on all threads, as it generates support JS.
116 | // We only do this once per worker since they get reused
117 | if (!initializedJS) {
118 | Module['___embind_register_native_and_builtin_types']();
119 | initializedJS = true;
120 | }
121 |
122 | try {
123 | // pthread entry points are always of signature 'void *ThreadMain(void *arg)'
124 | // Native codebases sometimes spawn threads with other thread entry point signatures,
125 | // such as void ThreadMain(void *arg), void *ThreadMain(), or void ThreadMain().
126 | // That is not acceptable per C/C++ specification, but x86 compiler ABI extensions
127 | // enable that to work. If you find the following line to crash, either change the signature
128 | // to "proper" void *ThreadMain(void *arg) form, or try linking with the Emscripten linker
129 | // flag -s EMULATE_FUNCTION_POINTER_CASTS=1 to add in emulation for this x86 ABI extension.
130 | var result = Module['invokeEntryPoint'](e.data.start_routine, e.data.arg);
131 |
132 | // In MINIMAL_RUNTIME the noExitRuntime concept does not apply to
133 | // pthreads. To exit a pthread with live runtime, use the function
134 | // emscripten_unwind_to_js_event_loop() in the pthread body.
135 | // The thread might have finished without calling pthread_exit(). If so,
136 | // then perform the exit operation ourselves.
137 | // (This is a no-op if explicit pthread_exit() had been called prior.)
138 | if (!Module['getNoExitRuntime']())
139 | Module['PThread'].threadExit(result);
140 | } catch(ex) {
141 | if (ex === 'Canceled!') {
142 | Module['PThread'].threadCancel();
143 | } else if (ex != 'unwind') {
144 | // ExitStatus not present in MINIMAL_RUNTIME
145 | if (ex instanceof Module['ExitStatus']) {
146 | if (Module['getNoExitRuntime']()) {
147 | } else {
148 | Module['PThread'].threadExit(ex.status);
149 | }
150 | }
151 | else
152 | {
153 | Module['PThread'].threadExit(-2);
154 | throw ex;
155 | }
156 | }
157 | }
158 | } else if (e.data.cmd === 'cancel') { // Main thread is asking for a pthread_cancel() on this thread.
159 | if (Module['_pthread_self']()) {
160 | Module['PThread'].threadCancel();
161 | }
162 | } else if (e.data.target === 'setimmediate') {
163 | // no-op
164 | } else if (e.data.cmd === 'processThreadQueue') {
165 | if (Module['_pthread_self']()) { // If this thread is actually running?
166 | Module['_emscripten_current_thread_process_queued_calls']();
167 | }
168 | } else {
169 | err('worker.js received unknown command ' + e.data.cmd);
170 | err(e.data);
171 | }
172 | } catch(ex) {
173 | err('worker.js onmessage() captured an uncaught exception: ' + ex);
174 | if (ex && ex.stack) err(ex.stack);
175 | throw ex;
176 | }
177 | };
178 |
179 | // Node.js support
180 | if (typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string') {
181 | // Create as web-worker-like an environment as we can.
182 | self = {
183 | location: {
184 | href: __filename
185 | }
186 | };
187 |
188 | var onmessage = this.onmessage;
189 |
190 | var nodeWorkerThreads = require('worker_threads');
191 |
192 | global.Worker = nodeWorkerThreads.Worker;
193 |
194 | var parentPort = nodeWorkerThreads.parentPort;
195 |
196 | parentPort.on('message', function(data) {
197 | onmessage({ data: data });
198 | });
199 |
200 | var nodeFS = require('fs');
201 |
202 | var nodeRead = function(filename) {
203 | return nodeFS.readFileSync(filename, 'utf8');
204 | };
205 |
206 | function globalEval(x) {
207 | global.require = require;
208 | global.Module = Module;
209 | eval.call(null, x);
210 | }
211 |
212 | importScripts = function(f) {
213 | globalEval(nodeRead(f));
214 | };
215 |
216 | postMessage = function(msg) {
217 | parentPort.postMessage(msg);
218 | };
219 |
220 | if (typeof performance === 'undefined') {
221 | performance = {
222 | now: function() {
223 | return Date.now();
224 | }
225 | };
226 | }
227 | }
228 |
229 |
230 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "blast-web",
3 | "version": "0.0.0",
4 | "description": "",
5 | "main": "server.prod.js",
6 | "scripts": {
7 | "prod": "npm run webpack:prod && node server.prod.js",
8 | "dev": "webpack --config webpack.config.dev.js && node server.dev.js",
9 | "webpack:prod": "webpack --config webpack.config.prod.js"
10 | },
11 | "author": "Luigi Cruz",
12 | "license": "MIT",
13 | "devDependencies": {
14 | "@babel/core": "^7.4.3",
15 | "@babel/plugin-proposal-class-properties": "^7.4.4",
16 | "@babel/plugin-proposal-decorators": "^7.4.4",
17 | "@babel/plugin-transform-runtime": "^7.4.3",
18 | "@babel/preset-env": "^7.4.3",
19 | "@babel/preset-react": "^7.0.0",
20 | "@babel/runtime": "^7.4.3",
21 | "babel-loader": "^8.0.6",
22 | "css-hot-loader": "^1.4.4",
23 | "css-loader": "^2.1.1",
24 | "express": "^4.17.0",
25 | "jsonfile": "^5.0.0",
26 | "mini-css-extract-plugin": "^0.5.0",
27 | "mobx": "^5.9.4",
28 | "mobx-react": "^5.4.3",
29 | "node-sass": "^4.11.0",
30 | "react": "^16.8.6",
31 | "react-dom": "^16.8.6",
32 | "react-hot-loader": "^4.8.3",
33 | "react-router-dom": "^5.0.0",
34 | "react-websocket": "^2.0.1",
35 | "sass-loader": "^7.1.0",
36 | "sass-resources-loader": "^2.0.0",
37 | "socket.io-client": "^2.2.0",
38 | "style-loader": "^0.23.1",
39 | "superagent": "^5.0.2",
40 | "svg-url-loader": "^2.3.2",
41 | "url-loader": "^1.1.2",
42 | "webpack": "^4.29.6",
43 | "webpack-bundle-analyzer": "^3.3.2",
44 | "webpack-cli": "^3.3.0",
45 | "webpack-dev-middleware": "^3.6.2",
46 | "webpack-hot-middleware": "^2.24.3",
47 | "webpackbar": "^3.1.5"
48 | },
49 | "dependencies": {
50 | "audioworklet-polyfill": "^1.1.2",
51 | "https-localhost": "^4.6.4",
52 | "jszmq": "^0.1.2",
53 | "pcm-player": "git+https://github.com/samirkumardas/pcm-player.git",
54 | "react-feather": "^2.0.3",
55 | "react-select": "^3.1.0",
56 | "socket.io-parser": "^3.4.0",
57 | "web-audio-buffer-queue": "^1.1.0",
58 | "worklet-loader": "^1.0.0"
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/server.dev.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const app = require('https-localhost')();
3 | const express = require('express');
4 |
5 | const webpack = require('webpack');
6 | const webpackConfig = require('./webpack.config.dev.js');
7 | const compiler = webpack(webpackConfig);
8 |
9 | app.use(
10 | require('webpack-dev-middleware')(compiler, {
11 | noInfo: true,
12 | publicPath: '/',
13 | })
14 | );
15 |
16 | app.use(require('webpack-hot-middleware')(compiler));
17 |
18 | app.use('/', express.static(path.join(__dirname, 'docs')));
19 |
20 | app.listen(5557);
21 | console.log(`Simulator started at port 5557...`);
22 |
--------------------------------------------------------------------------------
/server.prod.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const express = require('express');
3 | const app = new express();
4 |
5 | const server = require('http').createServer(app);
6 |
7 | app.use('/', express.static(path.join(__dirname, 'docs')));
8 |
9 | server.listen(5557);
10 | console.log(`Production started at port 5557...`);
11 |
--------------------------------------------------------------------------------
/src/client/client.jsx:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | import App from 'components/App';
4 | import { BrowserRouter } from 'react-router-dom';
5 | import { Provider } from 'mobx-react';
6 | import Store from 'stores/Store';
7 |
8 | class Async extends Component {
9 | constructor(props) {
10 | super(props);
11 | this.state = {
12 | store: null
13 | };
14 | }
15 |
16 | componentDidMount() {
17 | this.props.promise.then((store) => {
18 | window.store = store;
19 | this.setState({ store });
20 | });
21 | }
22 |
23 | render() {
24 | if (this.state.store !== null) {
25 | return (
26 |
27 |
28 |
29 |
30 |
31 | )
32 | }
33 | return null;
34 | }
35 | }
36 |
37 | export default class Client extends Component {
38 | render() {
39 | return ;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/client/index.jsx:
--------------------------------------------------------------------------------
1 | import { AppContainer } from 'react-hot-loader';
2 | import Client from './client';
3 | import React from 'react';
4 | import ReactDOM from 'react-dom';
5 |
6 | const render = Component => {
7 | ReactDOM.render(
8 |
9 |
10 | ,
11 | document.getElementById('root')
12 | );
13 | };
14 |
15 | render(Client);
16 |
17 | if (module && module.hot) {
18 | module.hot.accept('./client', () => {
19 | const HotApp = require('./client').default;
20 | render(HotApp);
21 | });
22 | }
23 |
--------------------------------------------------------------------------------
/src/components/App.jsx:
--------------------------------------------------------------------------------
1 | import 'styles/app';
2 |
3 | import React, { Component } from 'react';
4 | import { inject, observer } from 'mobx-react';
5 | import { withRouter } from 'react-router-dom';
6 |
7 | import Player from 'components/Player';
8 | import Finder from 'components/Finder';
9 | import Static from 'components/Static';
10 |
11 | @withRouter
12 | @inject('store')
13 | @observer
14 | class App extends Component {
15 |
16 | render() {
17 | return (
18 |
19 |
20 |
CyberRadio
21 | BLAST
22 |
23 |
24 |
25 |
26 |
27 | );
28 | }
29 |
30 | }
31 |
32 | export default App;
33 |
--------------------------------------------------------------------------------
/src/components/Finder.jsx:
--------------------------------------------------------------------------------
1 | import 'styles/finder';
2 |
3 | import * as Feather from 'react-feather';
4 |
5 | import React, { Component } from 'react';
6 | import { inject, observer } from 'mobx-react';
7 |
8 | @inject('store')
9 | @observer
10 | class Finder extends Component {
11 |
12 | constructor(props) {
13 | super(props);
14 | }
15 |
16 | render() {
17 | return (
18 |
19 |
20 |
21 |
22 |
25 |
30 |
31 |
32 |
33 | );
34 | }
35 |
36 | }
37 |
38 | export default Finder;
39 |
--------------------------------------------------------------------------------
/src/components/Player.jsx:
--------------------------------------------------------------------------------
1 | import 'styles/player';
2 | import 'styles/volume';
3 |
4 | import * as Feather from 'react-feather';
5 |
6 | import React, { Component } from 'react';
7 | import { inject, observer } from 'mobx-react';
8 |
9 | import { ParseFrequency } from 'misc/utils';
10 |
11 | @inject('store')
12 | @observer
13 | class Player extends Component {
14 | constructor(props) {
15 | super(props);
16 | this.store = this.props.store;
17 | }
18 |
19 | handleVolume = (e) => {
20 | const volume = e.target.value / 100;
21 | this.store.setVolume(volume);
22 | }
23 |
24 | render() {
25 | const { playing, volume, selected } = this.store;
26 | const ready = (selected !== null);
27 |
28 | let flags = [
29 | DISCONNECTED
,
30 | ];
31 |
32 | let frequency = "00,000,000";
33 | let sourceName = "Not Connected";
34 | let sourceDescription = "";
35 | let sourceHost = "Select or add a source below.";
36 | let status = ((playing) ? 'LIVE' : 'IDLE');
37 | let statusColor = ((playing) ? '#00897B' : '#FF4242');
38 |
39 | if (selected !== null) {
40 | let channel = ((selected.channels === 2) ? 'STEREO' : 'MONO');
41 | let decoder = selected.codec;
42 | let audio_fs = selected.audio_fs / 1000 + " kHz";
43 |
44 | flags = [];
45 | flags.push({channel}
);
46 | flags.push({decoder}
);
47 | flags.push({audio_fs}
);
48 |
49 | sourceName = selected.name;
50 | sourceHost = selected.host;
51 | sourceDescription = selected.device + " • " + selected.backend;
52 | frequency = ParseFrequency(selected.frequency);
53 | }
54 |
55 | return (
56 |
57 |
58 |
59 |
60 |
61 |
{sourceName}
62 |
{sourceDescription}
63 |
{sourceHost}
64 |
65 |
66 |
{frequency}
67 |
68 |
69 |
72 | {status}
73 |
74 |
75 |
76 | {flags.map((component) => component)}
77 |
78 |
79 |
80 |
83 |
86 |
89 |
90 |
91 |
92 |
99 |
100 |
101 |
102 |
103 | );
104 | }
105 | }
106 |
107 | export default Player;
108 |
--------------------------------------------------------------------------------
/src/components/Static.jsx:
--------------------------------------------------------------------------------
1 | import 'styles/sources';
2 |
3 | import * as Feather from 'react-feather';
4 |
5 | import React, { Component } from 'react';
6 |
7 | class Static extends Component {
8 |
9 | render() {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 | Work in Progress
18 | Expect things to be broken.
19 | Only supported on Chrome (WebUSB).
20 |
21 |
22 |
23 |
24 |
25 |
37 |
38 |
39 | );
40 | }
41 |
42 | }
43 |
44 | export default Static;
45 |
--------------------------------------------------------------------------------
/src/misc/utils.jsx:
--------------------------------------------------------------------------------
1 | function ParseFrequency(x) {
2 | return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
3 | }
4 |
5 | export {
6 | ParseFrequency,
7 | }
--------------------------------------------------------------------------------
/src/stores/Store.jsx:
--------------------------------------------------------------------------------
1 | import { action, computed, observable } from 'mobx';
2 |
3 | import _ from 'lodash';
4 | import request from 'superagent';
5 |
6 | export default class Store {
7 | @observable _core = null;
8 |
9 | @observable selected = null;
10 |
11 | @observable volume = 1.0;
12 | @observable playing = false;
13 |
14 | constructor() {
15 | return new CyberRadioCore().then((core) => {
16 | this._core = core;
17 | this._core.start_core();
18 | return this;
19 | });
20 | }
21 |
22 | @action openDevice = () => {
23 | this.selected = {
24 | channels: 1,
25 | codec: "WAV",
26 | audio_fs: 48e3,
27 | frequency: 96.9e6,
28 | device: "Airspy HF+ Discovery",
29 | backend: "WebUSB"
30 | };
31 | this._core.open_device();
32 | this._tune();
33 | this._core.start_stream();
34 | this.playing = true;
35 | }
36 |
37 | @action setVolume = (volume) => {
38 | this._core.update_demod(volume);
39 | this.volume = volume;
40 | }
41 |
42 | @action forward = () => {
43 | this.selected.frequency += 100e3;
44 | this._tune();
45 | }
46 |
47 | @action backward = () => {
48 | this.selected.frequency -= 100e3;
49 | this._tune();
50 | }
51 |
52 | @action toggle = () => {
53 | if (this.playing) {
54 | this._core.stop_stream();
55 | this.playing = !this.playing;
56 | return;
57 | }
58 | this._tune();
59 | this._core.start_stream();
60 | this.playing = !this.playing;
61 | }
62 |
63 | @action _tune() {
64 | this._core.update_device(this.selected.frequency);
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/styles/app.scss:
--------------------------------------------------------------------------------
1 | body, html {
2 | margin: 0;
3 | padding: 0;
4 | font-family: 'Roboto', serif;
5 | background-color: $background-color;
6 | color: $text-color;
7 | }
8 |
9 | .app {
10 | @media (min-width: 500px) {
11 | justify-content: center;
12 | align-items: center;
13 | display: grid;
14 | }
15 | }
16 |
17 | .header {
18 | margin-top: .75em;
19 | margin-bottom: 1em;
20 | }
21 |
22 | .header h1 {
23 | font-family: 'Racing Sans One', serif;
24 | font-weight: lighter;
25 | text-align: center;
26 | font-size: 2em;
27 | margin: 0;
28 | }
29 |
30 | .header h2 {
31 | font-family: 'Press Start 2P';
32 | font-weight: lighter;
33 | text-align: center;
34 | color: #4ACFAC;
35 | font-size: 2.15em;
36 | margin: 0;
37 | }
38 |
39 | .block {
40 | border-radius: 0.75em;
41 | margin: 0 .75em 0 .75em;
42 | }
43 |
44 | .block .block-body {
45 | padding: 0.75em;
46 | border-radius: 0.75em;
47 | background: $backgroud-block;
48 | margin-bottom: 1em;
49 | }
50 |
51 | .block .block-label {
52 | margin-left: .5em;
53 | font-size: .85em;
54 | font-weight: 500;
55 | color: #7E7E7E;
56 | }
--------------------------------------------------------------------------------
/src/styles/btn.scss:
--------------------------------------------------------------------------------
1 | .btn {
2 | border-radius: 0.5em;
3 | text-align: center;
4 | font-weight: 500;
5 | cursor: pointer;
6 | outline: none;
7 | outline: 0;
8 | color: white;
9 | text-decoration: none;
10 |
11 | &::-moz-focus-inner {
12 | border:0;
13 | }
14 | }
15 |
16 | .btn:disabled {
17 | color: $faint-background-text-color;
18 | cursor: not-allowed;
19 | }
20 |
21 | @mixin btn-size($width, $height) {
22 | height: $height;
23 | width: $width;
24 | }
25 |
26 | @mixin btn-theme($btn-color) {
27 | border: 0.1em solid $btn-color;
28 | background-color: $btn-color;
29 | @include transition(background-color 0.1s ease-in-out);
30 | @include transition(border 0.1s ease-in-out);
31 |
32 | &:hover {
33 | border: 0.1em solid darken($btn-color, 7.5%);
34 | background-color: darken($btn-color, 5%);
35 |
36 | @include transition(background-color 0.1s ease-in-out);
37 | @include transition(border 0.1s ease-in-out);
38 | }
39 | }
40 |
41 | .btn-orange {
42 | @include btn-theme($orange-color);
43 | }
44 |
45 | .btn-blue {
46 | @include btn-theme($blue-color);
47 | }
48 |
49 | .btn-gray {
50 | @include btn-theme(rgba(#ffffff, .1));
51 | }
52 |
53 | .btn-green {
54 | @include btn-theme(darken($green-color, 2.5%));
55 | }
56 |
--------------------------------------------------------------------------------
/src/styles/finder.scss:
--------------------------------------------------------------------------------
1 | @import "btn";
2 |
3 |
4 | .finder .search {
5 | display: flex;
6 | }
7 |
8 | .finder .text-input {
9 | background-color: rgba(#ffffff, .1);
10 | border: 0.1em solid rgba(#ffffff, .1);
11 | border-radius: .5em;
12 | outline: none;
13 | flex-grow: 100;
14 | padding: .5em;
15 | color: white;
16 | }
17 |
18 | .finder .btn-connect {
19 | margin-left: 1em;
20 | @include btn-size(7.5em, 3.0em);
21 | }
22 |
23 | .finder .source-card {
24 | margin-top: .75em;
25 | padding: .5em;
26 | border-radius: .5em;
27 | background: $green-color;
28 | }
29 |
30 | .finder .source-card h1 {
31 | font-size: 1.25em;
32 | font-weight: 600;
33 | margin: 0;
34 | }
35 |
36 | .finder .source-card h2 {
37 | font-size: 1em;
38 | font-weight: 500;
39 | margin: 0;
40 | }
41 |
42 | .finder .source-card h3 {
43 | margin: 0;
44 | font-style: italic;
45 | font-size: .75em;
46 | font-weight: lighter;
47 | margin-top: .15em;
48 | }
49 |
50 |
51 | .finder .source-card button {
52 | @extend .btn;
53 | margin-top: .5em;
54 | width: 100%;
55 | height: 2.5em;
56 | }
--------------------------------------------------------------------------------
/src/styles/mixins.scss:
--------------------------------------------------------------------------------
1 | @mixin transition($x...) {
2 | -webkit-transition: $x;
3 | -moz-transition: $x;
4 | -ms-transition: $x;
5 | -o-transition: $x;
6 | transition: $x;
7 | }
8 |
--------------------------------------------------------------------------------
/src/styles/palette.scss:
--------------------------------------------------------------------------------
1 | $name-color: #24c18b;
2 | $background-color: #121212;
3 | $text-color: #ffffff;
4 | $backgroud-block: #3b3b3b;
5 | $background-hightlight-color: rgba(#ffffff, .05);
6 | $light-background-text-color: rgba(#ffffff, .5);
7 | $faint-background-text-color: rgba(#ffffff, .5);
8 |
9 | $blue-color: #3f8efc;
10 | $orange-color: #fb5607;
11 | $green-color: #059c75;
12 | $green-highlight-color: #2ecc71;
--------------------------------------------------------------------------------
/src/styles/player.scss:
--------------------------------------------------------------------------------
1 | @import "btn";
2 |
3 | .player .frequency {
4 | width: 100%;
5 | text-align: center;
6 | font-family: 'Roboto Mono';
7 | font-weight: 300;
8 | font-size: 3.5em;
9 | overflow: hidden;
10 | }
11 |
12 | .player .information {
13 | width: 100%;
14 | display: flex;
15 | margin-top: .5em;
16 | }
17 |
18 | .player .small {
19 | margin-top: .25em;
20 |
21 | .flag {
22 | width: 100%;
23 | text-align: center;
24 | }
25 | }
26 |
27 | .player .small .hostname {
28 | font-style: italic;
29 | font-size: .75em;
30 | font-weight: lighter;
31 | margin-top: .15em;
32 | color: $light-background-text-color;
33 | }
34 |
35 | .player .information .left {
36 | width: 25%;
37 | display: flex;
38 | }
39 |
40 | .player .information .right {
41 | width: 75%;
42 | display: flex;
43 | justify-content: flex-end;
44 | }
45 |
46 | .player .information .flag {
47 | padding: .5em .75em .5em .75em;
48 | margin: 0 .15em 0 .15em;
49 | border-radius: .5em;
50 | background: $background-hightlight-color;
51 | font-weight: 500;
52 | }
53 |
54 | .player .receiver {
55 | display: flex;
56 | }
57 |
58 | .player .volume {
59 | display: flex;
60 | justify-content: space-between;
61 |
62 | input {
63 | width: 20em;
64 | }
65 |
66 | svg {
67 | margin-top: .01em;
68 | width: 3.5em;
69 | }
70 | }
71 |
72 | .player .controls {
73 | display: flex;
74 | justify-content: space-between;
75 | margin: 1em 0 1em 0;
76 | padding: 0 .1em 0 .1em;
77 | }
78 |
79 | .player .controls button {
80 | @extend .btn;
81 | border: none;
82 | padding: 1em;
83 | width: 32%;
84 | background: rgba(#ffffff, .1);
85 | }
--------------------------------------------------------------------------------
/src/styles/sources.scss:
--------------------------------------------------------------------------------
1 | .sources .source {
2 | background: $background-hightlight-color;
3 | border-radius: 0.75em;
4 | padding: .5em;
5 | }
6 |
7 | .sources .filler {
8 | margin: 1em 0 1em 0;
9 |
10 | svg {
11 | width: 100%;
12 | }
13 |
14 | p {
15 | width: 100%;
16 | text-align: center;
17 | margin: .5em 0 0 0;
18 | font-size: .85em;
19 | }
20 | }
21 |
22 | .sources .filler a {
23 | color: $light-background-text-color;
24 | margin-left: .25em;
25 | }
26 |
27 | .sources .source h1 {
28 | font-size: 1.15em;
29 | font-weight: 600;
30 | margin: 0;
31 | }
32 |
33 | .sources .source h2 {
34 | margin: 0;
35 | font-size: 1em;
36 | font-weight: lighter;
37 | color: $light-background-text-color;
38 | }
39 |
40 | .sources .source h3 {
41 | margin: 0;
42 | font-style: italic;
43 | font-size: .75em;
44 | font-weight: lighter;
45 | margin-top: .15em;
46 | color: $light-background-text-color;
47 | }
48 |
49 | .sources .station {
50 | background-color: $backgroud-block;
51 | border-radius: 0.75em;
52 | margin-top: .5em;
53 | padding: .5em;
54 | cursor: pointer;
55 | display: flex;
56 | justify-content: flex-end;
57 | }
58 |
59 | .sources .station h1 {
60 | font-family: 'Roboto Mono';
61 | font-weight: 400;
62 | font-size: 1.5em;
63 | overflow: hidden;
64 | align-self: center;
65 | margin-right: auto;
66 | }
67 |
68 | .sources .station .flag {
69 | padding: .35em .5em .35em .5em;
70 | margin: 0em .15em 0 .15em;
71 | border-radius: .5em;
72 | background: $background-hightlight-color;
73 | font-weight: 500;
74 | font-size: .75em;
75 | align-self: center;
76 | }
77 |
--------------------------------------------------------------------------------
/src/styles/volume.scss:
--------------------------------------------------------------------------------
1 | .slider {
2 | -webkit-appearance: none;
3 | background: transparent;
4 | }
5 |
6 | .slider:focus {
7 | outline: none;
8 | }
9 |
10 | .slider::-webkit-slider-runnable-track {
11 | border-radius: 1em;
12 | background: $green-highlight-color;
13 | height: .35em;
14 | }
15 |
16 | input[type="range"]::-moz-range-track {
17 | border-radius: 1em;
18 | background: $green-highlight-color;
19 | height: .35em;
20 | }
21 |
22 | .slider::-webkit-slider-thumb {
23 | -webkit-appearance: none;
24 | height: 1.5em;
25 | width: 1.5em;
26 | background: #ffffff;
27 | border: 1px solid darken($color: #ffffff, $amount: 25);
28 | margin-top: -.6em;
29 | border-radius: 50%;
30 | }
31 |
32 | .slider::-moz-range-thumb {
33 | height: 1.5em;
34 | width: 1.5em;
35 | background: #ffffff;
36 | border: 1px solid darken($color: #ffffff, $amount: 25);
37 | margin-top: -.6em;
38 | border-radius: 50%;
39 | }
--------------------------------------------------------------------------------
/webpack.config.dev.js:
--------------------------------------------------------------------------------
1 | const webpack = require('webpack');
2 | const path = require('path');
3 | const WebpackBar = require('webpackbar');
4 |
5 | const devConfig = {
6 | mode: 'development',
7 | target: 'web',
8 | devtool: 'inline-source-map',
9 | performance: {
10 | hints: false,
11 | },
12 | entry: [
13 | 'react-hot-loader/patch',
14 | 'webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000',
15 | path.resolve(__dirname, 'src/client/index.jsx'),
16 | ],
17 | node: {
18 | __dirname: false,
19 | fs: 'empty',
20 | Buffer: false,
21 | process: false
22 | },
23 | output: {
24 | path: path.resolve(__dirname, 'docs'),
25 | filename: 'bundle.js',
26 | publicPath: '/',
27 | },
28 | resolve: {
29 | extensions: ['.js', '.jsx', '.json', '.scss'],
30 | modules: [
31 | path.resolve(__dirname, 'src'),
32 | path.resolve(__dirname, 'node_modules'),
33 | ],
34 | },
35 | module: {
36 | rules: [
37 | {
38 | test: /\.(sa|sc|c)ss$/,
39 | use: [
40 | 'css-hot-loader',
41 | 'style-loader',
42 | 'css-loader',
43 | 'sass-loader',
44 | {
45 | loader: 'sass-resources-loader',
46 | options: {
47 | resources: [
48 | path.resolve(__dirname, 'src/styles/palette.scss'),
49 | path.resolve(__dirname, 'src/styles/mixins.scss'),
50 | ],
51 | },
52 | },
53 | ],
54 | },
55 | {
56 | test: /\.(js|jsx)$/,
57 | loader: 'babel-loader',
58 | exclude: /node_modules/,
59 | options: {
60 | presets: ['@babel/preset-react', '@babel/preset-env'],
61 | plugins: [
62 | '@babel/transform-runtime',
63 | ['@babel/plugin-proposal-decorators', { legacy: true }],
64 | ['@babel/plugin-proposal-class-properties', { loose: true }],
65 | ],
66 | },
67 | },
68 | {
69 | test: /\.(woff|woff2|eot|ttf|otf)$/,
70 | use: ['url-loader'],
71 | }
72 | ],
73 | },
74 | plugins: [new WebpackBar(), new webpack.HotModuleReplacementPlugin()],
75 | };
76 |
77 | module.exports = devConfig;
78 |
79 |
--------------------------------------------------------------------------------
/webpack.config.prod.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const WebpackBar = require('webpackbar');
3 | const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
4 |
5 | const prodConfig = {
6 | mode: 'production',
7 | target: 'web',
8 | entry: path.resolve(__dirname, 'src/client/index.jsx'),
9 | output: {
10 | path: path.resolve(__dirname, 'docs'),
11 | filename: 'bundle.js',
12 | },
13 | performance: {
14 | hints: false,
15 | },
16 | node: {
17 | fs: "empty"
18 | },
19 | resolve: {
20 | extensions: ['.js', '.jsx', '.json', '.scss'],
21 | modules: [
22 | path.resolve(__dirname, 'src'),
23 | path.resolve(__dirname, 'node_modules'),
24 | ],
25 | },
26 | module: {
27 | rules: [
28 | {
29 | test: /\.(sa|sc|c)ss$/,
30 | use: [
31 | 'style-loader',
32 | 'css-loader',
33 | 'sass-loader',
34 | {
35 | loader: 'sass-resources-loader',
36 | options: {
37 | resources: [
38 | path.resolve(__dirname, 'src/styles/palette.scss'),
39 | path.resolve(__dirname, 'src/styles/mixins.scss'),
40 | ],
41 | },
42 | },
43 | ],
44 | },
45 | {
46 | test: /\.(js|jsx)$/,
47 | loader: 'babel-loader',
48 | exclude: /node_modules/,
49 | options: {
50 | presets: ['@babel/preset-react', '@babel/preset-env'],
51 | plugins: [
52 | '@babel/transform-runtime',
53 | ['@babel/plugin-proposal-decorators', { legacy: true }],
54 | ['@babel/plugin-proposal-class-properties', { loose: true }],
55 | ],
56 | },
57 | },
58 | {
59 | test: /\.(woff|woff2|eot|ttf|otf)$/,
60 | exclude: /node_modules/,
61 | use: ['url-loader'],
62 | },
63 | ],
64 | },
65 | plugins: [new WebpackBar()],
66 | };
67 |
68 | if (process.env.NODE_ANALYZE) {
69 | prodConfig.plugins.push(new BundleAnalyzerPlugin());
70 | }
71 |
72 | module.exports = prodConfig;
73 |
--------------------------------------------------------------------------------