Merge branch 'master' into feature/ln-ux

This commit is contained in:
hatim boufnichel 2020-07-23 17:39:28 +02:00
commit 37c5fe7921
11 changed files with 147 additions and 26 deletions

View file

@ -1,3 +1,4 @@
{ {
"eslint.enable": true "eslint.enable": true,
"typescript.tsdk": "node_modules/typescript/lib"
} }

View file

@ -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 * Requires [Node.js](https://nodejs.org) 12
#### Steps: #### 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 2) Download and Install API

View file

@ -48,7 +48,7 @@ module.exports = (mainnet = false) => {
logfile: "shockapi.log", logfile: "shockapi.log",
lndLogFile: parsePath(`${lndDirectory}/logs/bitcoin/${network}/lnd.log`), lndLogFile: parsePath(`${lndDirectory}/logs/bitcoin/${network}/lnd.log`),
lndDirPath: lndDirectory, lndDirPath: lndDirectory,
peers: ["http://gun.shock.network:8765/gun"], peers: ['http://gun.shock.network:8765/gun'],
useTLS: false, useTLS: false,
tokenExpirationMS: 4500000 tokenExpirationMS: 4500000
}; };

View file

@ -1,5 +1,5 @@
{ {
"name": "sw-server", "name": "shockapi",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "src/server.js", "main": "src/server.js",
@ -34,12 +34,12 @@
"google-proto-files": "^1.0.3", "google-proto-files": "^1.0.3",
"graphviz": "0.0.8", "graphviz": "0.0.8",
"grpc": "^1.21.1", "grpc": "^1.21.1",
"gun": "git://github.com/amark/gun#3e678b8568a4a8a825b84b26759d4dd4f3b0988e", "gun": "git://github.com/amark/gun#97aa976c97e6219a9f93095d32c220dcd371ca62",
"husky": "^4.2.5", "husky": "^4.2.5",
"jsonfile": "^4.0.0", "jsonfile": "^4.0.0",
"jsonwebtoken": "^8.3.0", "jsonwebtoken": "^8.3.0",
"localtunnel": "^1.9.0", "localtunnel": "^1.9.0",
"lodash": "^4.17.15", "lodash": "^4.17.19",
"method-override": "^2.3.7", "method-override": "^2.3.7",
"promise": "^8.0.1", "promise": "^8.0.1",
"ramda": "^0.27.0", "ramda": "^0.27.0",
@ -78,7 +78,7 @@
"nodemon": "^1.19.3", "nodemon": "^1.19.3",
"prettier": "^1.18.2", "prettier": "^1.18.2",
"ts-type": "^1.2.16", "ts-type": "^1.2.16",
"typescript": "^3.6.3" "typescript": "^3.9.6"
}, },
"lint-staged": { "lint-staged": {
"*.js": [ "*.js": [

View file

@ -12,8 +12,8 @@ require('gun/lib/open')
// @ts-ignore // @ts-ignore
require('gun/lib/load') require('gun/lib/load')
const debounce = require('lodash/debounce') const debounce = require('lodash/debounce')
const Encryption = require('../../../utils/encryptionStore')
const Encryption = require('../../../utils/encryptionStore')
const Key = require('../contact-api/key') const Key = require('../contact-api/key')
/** @type {import('../contact-api/SimpleGUN').ISEA} */ /** @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 _isRegistering = true
/** @type {import('../contact-api/SimpleGUN').CreateAck} */ /** @type {import('../contact-api/SimpleGUN').CreateAck} */
@ -1282,6 +1332,13 @@ const register = async (alias, pass) => {
user.create(alias, pass, ack => res(ack)) 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 _isRegistering = false
if (typeof ack.err === 'string') { if (typeof ack.err === 'string') {

View file

@ -11,7 +11,9 @@ dotenv.config()
// @ts-ignore Let it crash if undefined // @ts-ignore Let it crash if undefined
exports.DATA_FILE_NAME = process.env.DATA_FILE_NAME || defaults.dataFileName 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 exports.PEERS = process.env.PEERS
? JSON.parse(process.env.PEERS) ? JSON.parse(process.env.PEERS)
: defaults.peers : defaults.peers

View file

@ -30,9 +30,20 @@ interface OpenListenerDataObj {
export type Listener = (data: ListenerData, key: string) => void export type Listener = (data: ListenerData, key: string) => void
export type Callback = (ack: Ack) => void export type Callback = (ack: Ack) => void
export interface Peer {
url: string
id: string
wire?: {
readyState: number
}
}
export interface Soul { export interface Soul {
get: string get: string
put: Primitive | null | object | undefined put: Primitive | null | object | undefined
opt: {
peers: Record<string, Peer>
}
} }
export type OpenListenerData = Primitive | null | OpenListenerDataObj export type OpenListenerData = Primitive | null | OpenListenerDataObj
@ -47,7 +58,7 @@ export interface GUNNodeBase {
map(): GUNNode map(): GUNNode
on(this: GUNNode, cb: Listener): void 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 open(this: GUNNode, cb?: OpenListener): GUNNode
load(this: GUNNode, cb?: OpenListener): GUNNode load(this: GUNNode, cb?: OpenListener): GUNNode

View file

@ -49,14 +49,14 @@ const getAnUser = async publicKey => {
/** @type {Common.SchemaTypes.User} */ /** @type {Common.SchemaTypes.User} */
const u = { const u = {
avatar: oldProfile.avatar, avatar: oldProfile.avatar || null,
// @ts-ignore // @ts-ignore
bio, bio: bio || null,
displayName: oldProfile.displayName, displayName: oldProfile.displayName || null,
// @ts-ignore // @ts-ignore
lastSeenApp, lastSeenApp: lastSeenApp || 0,
// @ts-ignore // @ts-ignore
lastSeenNode, lastSeenNode: lastSeenNode || 0,
// @ts-ignore // @ts-ignore
publicKey publicKey
} }

View file

@ -714,7 +714,7 @@ module.exports = async (
logger.error(err); logger.error(err);
return res.status(500).json({ return res.status(500).json({
field: "unknown", field: "unknown",
errorMessage: err errorMessage: err.message || err
}) })
} }
}); });
@ -2039,6 +2039,54 @@ module.exports = async (
ap.get(`/api/gun/feed`, apiGunFeedGet) 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. * Return app so that it can be used by express.
*/ */

View file

@ -4298,10 +4298,10 @@ lodash@=4.17.4:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= 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: 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.15" version "4.17.19"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
log-symbols@^3.0.0: log-symbols@^3.0.0:
version "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" resolved "https://registry.yarnpkg.com/typedarray-dts/-/typedarray-dts-1.0.0.tgz#9dec9811386dbfba964c295c2606cf9a6b982d06"
integrity sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA== integrity sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==
typescript@^3.6.3: typescript@^3.9.6:
version "3.6.3" version "3.9.6"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"
integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==
uglify-js@^3.1.4: uglify-js@^3.1.4:
version "3.6.0" version "3.6.0"