Merge branch 'master' into feature/ln-ux
This commit is contained in:
commit
37c5fe7921
11 changed files with 147 additions and 26 deletions
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
|
@ -1,3 +1,4 @@
|
|||
{
|
||||
"eslint.enable": true
|
||||
"eslint.enable": true,
|
||||
"typescript.tsdk": "node_modules/typescript/lib"
|
||||
}
|
||||
|
|
@ -12,9 +12,11 @@ For easy setup on your Laptop/Desktop, [a wizard is available here.](https://git
|
|||
* Requires [Node.js](https://nodejs.org) 12
|
||||
|
||||
#### Steps:
|
||||
1) Run [LND](https://github.com/lightningnetwork/lnd/releases) - *Example mainnet startup*:
|
||||
1) Run [LND](https://github.com/shocknet/lnd/releases) - *Example mainnet startup*:
|
||||
|
||||
```./lnd --bitcoin.active --bitcoin.mainnet --bitcoin.node=neutrino --neutrino.connect=neutrino.shock.network --routing.assumechanvalid=1 --allow-circular-route=1```
|
||||
(Neutrino example requires builds with experimental flags, our binaries include them.)
|
||||
|
||||
```./lnd --bitcoin.active --bitcoin.mainnet --bitcoin.node=neutrino --neutrino.connect=neutrino.shock.network --routing.assumechanvalid --allow-circular-route```
|
||||
|
||||
|
||||
2) Download and Install API
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ module.exports = (mainnet = false) => {
|
|||
logfile: "shockapi.log",
|
||||
lndLogFile: parsePath(`${lndDirectory}/logs/bitcoin/${network}/lnd.log`),
|
||||
lndDirPath: lndDirectory,
|
||||
peers: ["http://gun.shock.network:8765/gun"],
|
||||
peers: ['http://gun.shock.network:8765/gun'],
|
||||
useTLS: false,
|
||||
tokenExpirationMS: 4500000
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "sw-server",
|
||||
"name": "shockapi",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "src/server.js",
|
||||
|
|
@ -34,12 +34,12 @@
|
|||
"google-proto-files": "^1.0.3",
|
||||
"graphviz": "0.0.8",
|
||||
"grpc": "^1.21.1",
|
||||
"gun": "git://github.com/amark/gun#3e678b8568a4a8a825b84b26759d4dd4f3b0988e",
|
||||
"gun": "git://github.com/amark/gun#97aa976c97e6219a9f93095d32c220dcd371ca62",
|
||||
"husky": "^4.2.5",
|
||||
"jsonfile": "^4.0.0",
|
||||
"jsonwebtoken": "^8.3.0",
|
||||
"localtunnel": "^1.9.0",
|
||||
"lodash": "^4.17.15",
|
||||
"lodash": "^4.17.19",
|
||||
"method-override": "^2.3.7",
|
||||
"promise": "^8.0.1",
|
||||
"ramda": "^0.27.0",
|
||||
|
|
@ -78,7 +78,7 @@
|
|||
"nodemon": "^1.19.3",
|
||||
"prettier": "^1.18.2",
|
||||
"ts-type": "^1.2.16",
|
||||
"typescript": "^3.6.3"
|
||||
"typescript": "^3.9.6"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.js": [
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ require('gun/lib/open')
|
|||
// @ts-ignore
|
||||
require('gun/lib/load')
|
||||
const debounce = require('lodash/debounce')
|
||||
const Encryption = require('../../../utils/encryptionStore')
|
||||
|
||||
const Encryption = require('../../../utils/encryptionStore')
|
||||
const Key = require('../contact-api/key')
|
||||
|
||||
/** @type {import('../contact-api/SimpleGUN').ISEA} */
|
||||
|
|
@ -1275,6 +1275,56 @@ const register = async (alias, pass) => {
|
|||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Peers provided to gun.
|
||||
*/
|
||||
const peers = Object.values(gun._.opt.peers)
|
||||
|
||||
const theresPeers = peers.length > 0
|
||||
const atLeastOneIsConnected = peers.some(
|
||||
p => p.wire && p.wire.readyState === 1
|
||||
)
|
||||
|
||||
if (theresPeers && !atLeastOneIsConnected) {
|
||||
throw new Error(
|
||||
'No connected to any peers for checking of duplicate aliases'
|
||||
)
|
||||
}
|
||||
|
||||
if (theresPeers && atLeastOneIsConnected) {
|
||||
// this import is done here to avoid circular dependency hell
|
||||
const { timeout5 } = require('../contact-api/utils')
|
||||
|
||||
let userData = await timeout5(
|
||||
new Promise(res => {
|
||||
gun.get(`~@${alias}`).once(ud => res(ud))
|
||||
})
|
||||
)
|
||||
|
||||
if (userData) {
|
||||
throw new Error(
|
||||
'The given alias has been used before, use an unique alias instead.'
|
||||
)
|
||||
}
|
||||
|
||||
await new Promise(res => setTimeout(res, 300))
|
||||
|
||||
userData = await timeout5(
|
||||
new Promise(res => {
|
||||
gun.get(`~@${alias}`).once(ud => res(ud), {
|
||||
// https://github.com/amark/gun/pull/971#issue-438630761
|
||||
wait: 1500
|
||||
})
|
||||
})
|
||||
)
|
||||
|
||||
if (userData) {
|
||||
throw new Error(
|
||||
'The given alias has been used before, use an unique alias instead. (Caught at 2nd try)'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
_isRegistering = true
|
||||
|
||||
/** @type {import('../contact-api/SimpleGUN').CreateAck} */
|
||||
|
|
@ -1282,6 +1332,13 @@ const register = async (alias, pass) => {
|
|||
user.create(alias, pass, ack => res(ack))
|
||||
)
|
||||
|
||||
// An empty ack object seems to be caused by a duplicate alias sign up
|
||||
if ('{}' === JSON.stringify(ack)) {
|
||||
throw new Error(
|
||||
'The given alias has been used before, use an unique alias instead. (Empty ack)'
|
||||
)
|
||||
}
|
||||
|
||||
_isRegistering = false
|
||||
|
||||
if (typeof ack.err === 'string') {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,9 @@ dotenv.config()
|
|||
// @ts-ignore Let it crash if undefined
|
||||
exports.DATA_FILE_NAME = process.env.DATA_FILE_NAME || defaults.dataFileName
|
||||
|
||||
// @ts-ignore Let it crash if undefined
|
||||
/**
|
||||
* @type {string[]}
|
||||
*/
|
||||
exports.PEERS = process.env.PEERS
|
||||
? JSON.parse(process.env.PEERS)
|
||||
: defaults.peers
|
||||
|
|
|
|||
|
|
@ -30,9 +30,20 @@ interface OpenListenerDataObj {
|
|||
export type Listener = (data: ListenerData, key: string) => void
|
||||
export type Callback = (ack: Ack) => void
|
||||
|
||||
export interface Peer {
|
||||
url: string
|
||||
id: string
|
||||
wire?: {
|
||||
readyState: number
|
||||
}
|
||||
}
|
||||
|
||||
export interface Soul {
|
||||
get: string
|
||||
put: Primitive | null | object | undefined
|
||||
opt: {
|
||||
peers: Record<string, Peer>
|
||||
}
|
||||
}
|
||||
|
||||
export type OpenListenerData = Primitive | null | OpenListenerDataObj
|
||||
|
|
@ -47,7 +58,7 @@ export interface GUNNodeBase {
|
|||
map(): GUNNode
|
||||
|
||||
on(this: GUNNode, cb: Listener): void
|
||||
once(this: GUNNode, cb?: Listener): GUNNode
|
||||
once(this: GUNNode, cb?: Listener, opts?: { wait: number }): GUNNode
|
||||
|
||||
open(this: GUNNode, cb?: OpenListener): GUNNode
|
||||
load(this: GUNNode, cb?: OpenListener): GUNNode
|
||||
|
|
|
|||
|
|
@ -49,14 +49,14 @@ const getAnUser = async publicKey => {
|
|||
|
||||
/** @type {Common.SchemaTypes.User} */
|
||||
const u = {
|
||||
avatar: oldProfile.avatar,
|
||||
avatar: oldProfile.avatar || null,
|
||||
// @ts-ignore
|
||||
bio,
|
||||
displayName: oldProfile.displayName,
|
||||
bio: bio || null,
|
||||
displayName: oldProfile.displayName || null,
|
||||
// @ts-ignore
|
||||
lastSeenApp,
|
||||
lastSeenApp: lastSeenApp || 0,
|
||||
// @ts-ignore
|
||||
lastSeenNode,
|
||||
lastSeenNode: lastSeenNode || 0,
|
||||
// @ts-ignore
|
||||
publicKey
|
||||
}
|
||||
|
|
|
|||
|
|
@ -714,7 +714,7 @@ module.exports = async (
|
|||
logger.error(err);
|
||||
return res.status(500).json({
|
||||
field: "unknown",
|
||||
errorMessage: err
|
||||
errorMessage: err.message || err
|
||||
})
|
||||
}
|
||||
});
|
||||
|
|
@ -2039,6 +2039,54 @@ module.exports = async (
|
|||
|
||||
ap.get(`/api/gun/feed`, apiGunFeedGet)
|
||||
|
||||
/**
|
||||
* @type {RequestHandler<{}>}
|
||||
*/
|
||||
const apiGunMeGet = async (_, res) => {
|
||||
try {
|
||||
return res.status(200).json(await GunGetters.getMyUser())
|
||||
} catch (err) {
|
||||
logger.error(err)
|
||||
return res.status(500).json({
|
||||
errorMessage: err.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @type {RequestHandler<{}>}
|
||||
*/
|
||||
const apiGunMePut = async (req, res) => {
|
||||
try {
|
||||
const { avatar, bio , displayName} = /** @type {Partial<Omit<Common.Schema.User, 'publicKey'>>} */ (req.body)
|
||||
|
||||
if (avatar) {
|
||||
await GunActions.setAvatar(avatar, require('../services/gunDB/Mediator').getUser())
|
||||
}
|
||||
|
||||
if (bio) {
|
||||
await GunActions.setBio(bio, require('../services/gunDB/Mediator').getUser())
|
||||
}
|
||||
|
||||
if (displayName) {
|
||||
await GunActions.setDisplayName(displayName, require('../services/gunDB/Mediator').getUser())
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
ok: true
|
||||
})
|
||||
} catch (err) {
|
||||
logger.error(err)
|
||||
return res.status(500).json({
|
||||
errorMessage: err.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
ap.get(`/api/gun/me`, apiGunMeGet)
|
||||
ap.put(`/api/gun/me`, apiGunMePut)
|
||||
|
||||
/**
|
||||
* Return app so that it can be used by express.
|
||||
*/
|
||||
|
|
|
|||
16
yarn.lock
16
yarn.lock
|
|
@ -4298,10 +4298,10 @@ lodash@=4.17.4:
|
|||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
|
||||
integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=
|
||||
|
||||
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0:
|
||||
version "4.17.19"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
|
||||
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
|
||||
|
||||
log-symbols@^3.0.0:
|
||||
version "3.0.0"
|
||||
|
|
@ -6505,10 +6505,10 @@ typedarray-dts@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/typedarray-dts/-/typedarray-dts-1.0.0.tgz#9dec9811386dbfba964c295c2606cf9a6b982d06"
|
||||
integrity sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==
|
||||
|
||||
typescript@^3.6.3:
|
||||
version "3.6.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da"
|
||||
integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==
|
||||
typescript@^3.9.6:
|
||||
version "3.9.6"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"
|
||||
integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==
|
||||
|
||||
uglify-js@^3.1.4:
|
||||
version "3.6.0"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue