├── .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 | image/svg+xml 1196 | 1197 | 1198 |
1199 |
Downloading...
1200 | 1201 | 1202 | Resize canvas 1203 | Lock/hide mouse pointer     1204 | 1206 | 1207 | 1208 | 1209 |
1210 | 1211 |
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 |
26 |
27 |

Support the development of this FOSS project.

28 |

29 | GitHub | 30 | PayPal | 31 | Patreon | 32 | Buy Me A Coffee 33 |

34 |

Created by @luigifcruz

35 |
36 |
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 | --------------------------------------------------------------------------------