* Update CI workflow, dependencies, and add Vitest for testing Co-authored-by: overtorment <overtorment@gmail.com> * Remove Vitest UI and related configuration Co-authored-by: overtorment <overtorment@gmail.com> * Move string utils tests to dedicated tests directory Co-authored-by: overtorment <overtorment@gmail.com> * Update CI workflow to separate lint and test jobs Co-authored-by: overtorment <overtorment@gmail.com> * Rename vitest.config.ts to vitest.config.mts Co-authored-by: overtorment <overtorment@gmail.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
109 lines
7.7 KiB
Markdown
109 lines
7.7 KiB
Markdown
# Ground Control
|
|
|
|
`````````````````````````````````````````````````````````````````
|
|
///::---......```````````````````````````````` ``````````````````````````````````````...............
|
|
::::---.....```````````````````````````````` .-.-`-```..```````````````````````````````.............
|
|
:::---....````````````````````````.-.``--```.///////:/+/:/---....``````````````````````.............
|
|
::---....``````````````````````````://::/:..//////////+++++++++++:--..``````````````````............
|
|
:---...````````````````````````.///////////////////////+++++++++++ooo+:-```````````````````.........
|
|
---...``````````````````````.-////////////////////////+//+++++++++oooo/-.```````````````````........
|
|
--...````````````````````.-////////////////////////////+/++++++++oooooo++/.````````````````````.....
|
|
-...````````````````````-:/+//////////////////////////+++++++++++oooooooooo:````````````````````....
|
|
...````````````````````:++++///////////////////////////++++++++++ooooooooooo+-```````````````````...
|
|
..```````````````````-/+++++//////////////////////////+++++++++++ooooooooooooo:````````````````````.
|
|
.``````````````````./+++++++//////////////////////////+++++++++++oooooooooooooo/````````````````````
|
|
.`````````````````./+++++++++++////////////////////////+++++++++++oooooooooooooo.``````````````````.
|
|
``````````````````.+++++++++++/////////////////////////++++++++++++ooooooooooooo-```````````````````
|
|
```````````````````-++++++++++//////////////////////////++++++++++++oooooooooooo/```````````````````
|
|
````````````````````/++++//++//////////////////////////////://++/-++oooooooooooo:```````````````````
|
|
````````````````````-/+//////////////////////////////////:-.`../..++oooooooooooo-```````````````````
|
|
`````````````````````//+///////////::::::::::://///////////-.`````/++ooooooooooo:```````````````````
|
|
`````````````````` `:////////:-.````````````.://////////+++///:-``-://+oooooooo:```````````````````
|
|
`````````````````` -/////:.`` `-////////////+++++:-``````:+oooooooo-```````````````````
|
|
``````````````````` :++/:`` `-//////////////++/:.````````.+oooooooo.```````````````````
|
|
```````````````````` .++/. .:////////////////-`` ```````.++ooooo+````````````````````
|
|
`````````````````````.++/` `-///////////////:.` ````````-+ooooo/````````````````````
|
|
`````````````````````.++: `://////////////:.` ````````/++ooo:````````````````````
|
|
`````````````````````.++- `://///////////-.` ```````-+++oo-````````````````````
|
|
`````````````````````-++. `/////////////:` ```````.+++oo.````````````````````
|
|
`````````````````````:++. `:////////////.` ```` ```````+++oo.````````````````````
|
|
`````````````````````/o+.`` `--:////////:``.--.```````` ```````++++o-````````````````````
|
|
`````````````````````/oo.``` `...:-::.-://///-://-``--:::://:-.` ````````++++o:````````````````````
|
|
`````````````````````/oo-`````.-``-.-:```://////-` `.`````--:/:::. ``````.++++o-````````````````````
|
|
`````````````````````:oo:``````---.--.-:://///:` `````----:-` ``````-+++++`````````````````````
|
|
`````````````````````:oo+```````:++/:-://////-` ``...-.`` ``````/+++++.````````````````````
|
|
``````````````````````:+o-`````:+/-``-//////. ```````+++++/`````````````````````
|
|
```````````````````````:+/````-:.` `-++++//. ``````.//+/+:`````````````````````
|
|
````````````````````````.+:````````-+++++:` `````````.::``````````````````````
|
|
`````````````````````````.:.``````.++++/-` `````````````/.``````````````````````
|
|
```````````````````````````:``````/+++/. .. .:. ````````````````:/```````````````````````
|
|
```````````````````````````/`````.+++:` `` ``` `````````````````.:+-```````````````````````
|
|
```````````````````````````/-````/++-``` ````````````````-//++++````````````````````````
|
|
```````````````````````````/-````+o:```` `````````````````.++++++/````````````````````````
|
|
```````````````````````````/:```.++```````.--.``..``````````````````/+o++++:````````````````````````
|
|
```````````````````````````//```.o:````.://///:::/:::-.````````````-+++++++/````````````````````````
|
|
```````````````````````````+o-``-o-````..``.......````````````````-/+ooooo++````````````````````````
|
|
``````````````````````````-oo+.`:o.`````....`````````````````````::.+ooooo++.```````````````````````
|
|
`````````````````````````.+ooo+.:+.`````````......`````````````.:-``+ooooo+:-```````````````````````
|
|
`````````````````````````/ooooo-/+````````````````````````````--```.+oooooo/````````````````````````
|
|
````````````````````````/oooooo./+`````````````````````````````````.oooooo/+````````````````````````
|
|
```````````````````````:ooo++o+`/+`````````````````````````````````.oooo+/:`````````````````````````
|
|
``````````````````````.:+/:-//-`++`````````````````````````````````.oooo-`.`````````````````````````
|
|
....````````````````````````.```+/``````````````````````````````````+oo:````````````````````````````
|
|
.....``````````````````````````.+/``````````````````````````````````:+-`````````````````````````````
|
|
......`````````````````````````.+:````````````````````````````````````````````````````````````````..
|
|
.........``````````````````````-+:``````````````````````````````````````````````````````````````....
|
|
...........````````````````````-o-`````````````````````````````````````````````````````````````.....
|
|
.............``````````````````:o-```````````````````````````````````````````````````````````.......
|
|
...............````````````````:o-`````````````````````````````````````````````````````````.........
|
|
................```````````````/o.```````````````````````````````````````````````````````...........
|
|
....................``..```````/+.``````````````````````````````````````````````````.`..............
|
|
...........................````:/``````````````````````````````````````.``..........................
|
|
.............................`.//````````````````````````````````````...............................
|
|
----..........................`..``````````````````````````````.....................................
|
|
`````````````````````````````````````````````````````````````````
|
|
|
|
## Can you hear me, Major Tom?
|
|
|
|
Push notifications server for bitcoin wallets. Processes blocks & mempool in search of subscribed onchain addresses.
|
|
Built with typescript, expressjs, mariadb & [openapi](https://editor.swagger.io/?url=https://raw.githubusercontent.com/BlueWallet/GroundControl/master/openapi.yaml).
|
|
|
|
In memory of David Bowie
|
|
|
|
### Installation
|
|
|
|
```shell script
|
|
npm i
|
|
npm start
|
|
npm run worker-blockprocessor
|
|
npm run worker-processmempool
|
|
npm run worker-sender
|
|
```
|
|
|
|
Works well on Heroku (you'll need `JawsDB Maria` addon)
|
|
|
|
### Environment variables
|
|
|
|
Set them as env variables or put them into `.env` file in project root dir.
|
|
|
|
- `JAWSDB_MARIA_URL` for example `mysql://username:password@host:port/database`
|
|
- ~~`FCM_SERVER_KEY` hex encoded~~ deprecated (in favor of json key file) after FCM XMPP and HTTP legacy APIs was deprecated; the new one is HTTP v1 API; theres also a new uri to post payload
|
|
- `APNS_P8` hex encoded
|
|
- `APNS_P8_KID` issuer key which is "key ID" of your p8 file
|
|
- `APPLE_TEAM_ID` "team ID" of your developer account
|
|
- `BITCOIN_RPC` for example `http://username:password@host:8332`
|
|
- `APNS_TOPIC` for example `io.bluewallet.bluewallet`
|
|
- `GOOGLE_KEY_FILE` - json file with Google key for FCM, in hex
|
|
- `GOOGLE_PROJECT_ID` - acquired with the key file
|
|
|
|
### Getting certificates
|
|
|
|
- outdated https://dev.to/jakubkoci/react-native-push-notifications-313i
|
|
- https://stackoverflow.com/questions/44631803/ios-swift-how-to-create-p8-file/67533665#67533665
|
|
- get P8 hex `xxd -p file.p8 | tr -d '\n'` (google key file as well)
|
|
- https://firebase.google.com/docs/cloud-messaging/migrate-v1
|
|
|
|
### License
|
|
|
|
MIT
|