Merge branch 'master' into feature/generate-wall-socket

This commit is contained in:
hatim boufnichel 2020-08-28 22:27:00 +02:00
commit 8589cad6cb
16 changed files with 249 additions and 72 deletions

63
guntest.html Normal file
View file

@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
<script src="node_modules/gun/gun.js"></script>
<script src="node_modules/gun/sea.js"></script>
<script src="node_modules/gun/lib/open.js"></script>
<script src="node_modules/gun/lib/open.js"></script>
<script src="node_modules/gun/lib/load.js"></script>
<script src="node_modules/gun/lib/unset.js"></script>
<script src="node_modules/gun/lib/promise.js"></script>
<script src="node_modules/gun/lib/then.js"></script>
<script src="node_modules/gun/nts.js"></script>
<script>
gun = Gun({
peers: [
`http://guntest.shock.network:8765/gun`
],
axe: false
})
node = gun.get('foo').get('bar')
const UPPER = 100
put = async () => {
const res = await fetch(`https://jsonplaceholder.typicode.com/posts`)
/** @type {Array<any>} */
const data = await res.json()
const obj = {}
data.slice(0, UPPER).forEach((v, i) => obj[i] = v)
node.put(obj, ack => {
console.log(ack.err ? `err: ${ack.err}` : 'ok')
})
}
erase = () => {
(new Array(UPPER)).fill(null).map((_, i) => i).forEach(n => {
node.get(n).put(null, ack => {
console.log(ack.err ? `err: ${ack.err}` : 'ok')
})
})
}
</script>
<style>
body {
background-color: black;
}
</style>
</html>

View file

@ -48,7 +48,7 @@
"request-promise": "^4.2.2", "request-promise": "^4.2.2",
"response-time": "^2.3.2", "response-time": "^2.3.2",
"shelljs": "^0.8.2", "shelljs": "^0.8.2",
"shock-common": "4.0.1", "shock-common": "6.0.0",
"socket.io": "2.1.1", "socket.io": "2.1.1",
"text-encoding": "^0.7.0", "text-encoding": "^0.7.0",
"tingodb": "^0.6.1", "tingodb": "^0.6.1",
@ -79,7 +79,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.9.6" "typescript": "^4.0.2"
}, },
"lint-staged": { "lint-staged": {
"*.js": [ "*.js": [

View file

@ -65,7 +65,7 @@ class Auth {
logger.info('validateToken err', err) logger.info('validateToken err', err)
reject(err) reject(err)
} else { } else {
logger.info('decoded', decoded) // logger.info('decoded', decoded)
resolve({ valid: true }) resolve({ valid: true })
} }
}) })

View file

@ -246,7 +246,7 @@ const getGun = () => {
const getUser = () => { const getUser = () => {
if (!user.is) { if (!user.is) {
logger.warn('called getUser() without being authed') logger.warn('called getUser() without being authed')
throw new Error('NOT_AUTH') throw new Error(Constants.ErrorCode.NOT_AUTH)
} }
return user return user
} }

View file

@ -74,6 +74,7 @@ const __createOutgoingFeed = async (withPublicKey, user, SEA) => {
const newOutgoingFeedID = await new Promise((res, rej) => { const newOutgoingFeedID = await new Promise((res, rej) => {
const _outFeedNode = user const _outFeedNode = user
.get(Key.OUTGOINGS) .get(Key.OUTGOINGS)
//@ts-ignore
.set(newPartialOutgoingFeed, ack => { .set(newPartialOutgoingFeed, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number') {
rej(new Error(ack.err)) rej(new Error(ack.err))
@ -98,6 +99,7 @@ const __createOutgoingFeed = async (withPublicKey, user, SEA) => {
.get(Key.OUTGOINGS) .get(Key.OUTGOINGS)
.get(newOutgoingFeedID) .get(newOutgoingFeedID)
.get(Key.MESSAGES) .get(Key.MESSAGES)
//@ts-ignore
.set(initialMsg, ack => { .set(initialMsg, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number') {
rej(new Error(ack.err)) rej(new Error(ack.err))
@ -591,6 +593,7 @@ const sendHandshakeRequest = async (recipientPublicKey, gun, user, SEA) => {
const hr = gun const hr = gun
.get(Key.HANDSHAKE_NODES) .get(Key.HANDSHAKE_NODES)
.get(currentHandshakeAddress) .get(currentHandshakeAddress)
//@ts-ignore
.set(handshakeRequestData, ack => { .set(handshakeRequestData, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number') {
rej(new Error(`Error trying to create request: ${ack.err}`)) rej(new Error(`Error trying to create request: ${ack.err}`))
@ -627,6 +630,7 @@ const sendHandshakeRequest = async (recipientPublicKey, gun, user, SEA) => {
} }
await new Promise((res, rej) => { await new Promise((res, rej) => {
//@ts-ignore
user.get(Key.STORED_REQS).set(storedReq, ack => { user.get(Key.STORED_REQS).set(storedReq, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number') {
rej( rej(
@ -959,6 +963,7 @@ const sendSpontaneousPayment = async (to, amount, memo, feeLimit) => {
.getGun() .getGun()
.get(Key.ORDER_NODES) .get(Key.ORDER_NODES)
.get(currOrderAddress) .get(currOrderAddress)
//@ts-ignore
.set(order, ack => { .set(order, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number') {
rej( rej(

View file

@ -1,6 +1,7 @@
/** /**
* @format * @format
*/ */
//@ts-ignore
const Common = require('shock-common') const Common = require('shock-common')
const isFinite = require('lodash/isFinite') const isFinite = require('lodash/isFinite')
const shuffle = require('lodash/shuffle') const shuffle = require('lodash/shuffle')
@ -29,8 +30,9 @@ const calculateWallRequest = (numberOfPublicKeyGroups, pageRequested) => {
* @param {number} page * @param {number} page
* @throws {TypeError} * @throws {TypeError}
* @throws {RangeError} * @throws {RangeError}
* @returns {Promise<Common.SchemaTypes.Post[]>} * @returns {Promise<any>}
*/ */
//@returns {Promise<Common.SchemaTypes.Post[]>}
const getFeedPage = async page => { const getFeedPage = async page => {
if (!isFinite(page)) { if (!isFinite(page)) {
throw new TypeError(`Please provide an actual number for [page]`) throw new TypeError(`Please provide an actual number for [page]`)

View file

@ -47,8 +47,9 @@ exports.userToIncomingID = async pub => {
} }
/** /**
* @returns {Promise<Common.SchemaTypes.User>} * @returns {Promise<any>}
*/ */
//@returns {Promise<Common.SchemaTypes.User>}
const getMyUser = async () => { const getMyUser = async () => {
const oldProfile = await Utils.tryAndWait( const oldProfile = await Utils.tryAndWait(
(_, user) => new Promise(res => user.get(Key.PROFILE).load(res)), (_, user) => new Promise(res => user.get(Key.PROFILE).load(res)),
@ -85,7 +86,7 @@ const getMyUser = async () => {
(_, user) => Promise.resolve(user.is && user.is.pub), (_, user) => Promise.resolve(user.is && user.is.pub),
v => typeof v !== 'string' v => typeof v !== 'string'
) )
//@ts-ignore
/** @type {Common.SchemaTypes.User} */ /** @type {Common.SchemaTypes.User} */
const u = { const u = {
avatar: oldProfile.avatar, avatar: oldProfile.avatar,

View file

@ -9,8 +9,9 @@ const Utils = require('../utils')
/** /**
* @param {string} publicKey * @param {string} publicKey
* @returns {Promise<Common.SchemaTypes.User>} * @returns {Promise<any>}
*/ */
//@returns {Promise<Common.SchemaTypes.User>}
const getAnUser = async publicKey => { const getAnUser = async publicKey => {
const oldProfile = await Utils.tryAndWait( const oldProfile = await Utils.tryAndWait(
(g, u) => { (g, u) => {
@ -47,7 +48,7 @@ const getAnUser = async publicKey => {
}, },
v => typeof v !== 'number' v => typeof v !== 'number'
) )
//@ts-ignore
/** @type {Common.SchemaTypes.User} */ /** @type {Common.SchemaTypes.User} */
const u = { const u = {
avatar: oldProfile.avatar || null, avatar: oldProfile.avatar || null,
@ -68,8 +69,9 @@ const getAnUser = async publicKey => {
module.exports.getAnUser = getAnUser module.exports.getAnUser = getAnUser
/** /**
* @returns {Promise<Common.SchemaTypes.User>} * @returns {Promise<any>}
*/ */
//@returns {Promise<Common.SchemaTypes.User>}
const getMyUser = async () => { const getMyUser = async () => {
const oldProfile = await Utils.tryAndWait( const oldProfile = await Utils.tryAndWait(
(_, user) => new Promise(res => user.get(Key.PROFILE).load(res)), (_, user) => new Promise(res => user.get(Key.PROFILE).load(res)),
@ -106,7 +108,7 @@ const getMyUser = async () => {
(_, user) => Promise.resolve(user.is && user.is.pub), (_, user) => Promise.resolve(user.is && user.is.pub),
v => typeof v !== 'string' v => typeof v !== 'string'
) )
//@ts-ignore
/** @type {Common.SchemaTypes.User} */ /** @type {Common.SchemaTypes.User} */
const u = { const u = {
avatar: oldProfile.avatar, avatar: oldProfile.avatar,

View file

@ -43,8 +43,9 @@ const getWallTotalPages = async publicKey => {
* @param {string=} publicKey * @param {string=} publicKey
* @throws {TypeError} * @throws {TypeError}
* @throws {RangeError} * @throws {RangeError}
* @returns {Promise<Common.SchemaTypes.WallPage>} * @returns {Promise<any>}
*/ */
////@returns {Promise<Common.SchemaTypes.WallPage>}
const getWallPage = async (page, publicKey) => { const getWallPage = async (page, publicKey) => {
const totalPages = await getWallTotalPages(publicKey) const totalPages = await getWallTotalPages(publicKey)
@ -103,9 +104,10 @@ const getWallPage = async (page, publicKey) => {
*/ */
const mockUser = await User.getMyUser() const mockUser = await User.getMyUser()
/** /*
* @type {Common.SchemaTypes.WallPage} * @type {Common.SchemaTypes.WallPage}
*/ */
//@ts-ignore
const thePage = await Utils.tryAndWait( const thePage = await Utils.tryAndWait(
(g, u) => { (g, u) => {
/** /**

View file

@ -154,6 +154,7 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
getUser() getUser()
.get(Key.ORDER_TO_RESPONSE) .get(Key.ORDER_TO_RESPONSE)
.get(orderID) .get(orderID)
//@ts-ignore
.put(orderResponse, ack => { .put(orderResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number') {
rej( rej(
@ -183,6 +184,7 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
getUser() getUser()
.get(Key.ORDER_TO_RESPONSE) .get(Key.ORDER_TO_RESPONSE)
.get(orderID) .get(orderID)
//@ts-ignore
.put(orderResponse, ack => { .put(orderResponse, ack => {
if (ack.err && typeof ack.err !== 'number') { if (ack.err && typeof ack.err !== 'number') {
logger.error( logger.error(

View file

@ -151,6 +151,7 @@ const onStoredReqs = cb => {
.get(Key.STORED_REQS) .get(Key.STORED_REQS)
.open(d => { .open(d => {
if (typeof d === 'object' && d !== null) { if (typeof d === 'object' && d !== null) {
//@ts-ignore
encryptedStoredReqs = /** @type {StoredRequest[]} */ (Object.values( encryptedStoredReqs = /** @type {StoredRequest[]} */ (Object.values(
d d
).filter(i => Schema.isStoredRequest(i))) ).filter(i => Schema.isStoredRequest(i)))

View file

@ -1,5 +1,6 @@
/** @format */ /** @format */
const logger = require('winston') const logger = require('winston')
const { Constants } = require('shock-common')
const Key = require('../key') const Key = require('../key')
@ -23,7 +24,7 @@ const onLastSentReqIDs = cb => {
const user = require('../../Mediator').getUser() const user = require('../../Mediator').getUser()
if (!user.is) { if (!user.is) {
logger.warn('lastSentReqID() -> tried to sub without authing') logger.warn('lastSentReqID() -> tried to sub without authing')
throw new Error('NOT_AUTH') throw new Error(Constants.ErrorCode.NOT_AUTH)
} }
user.get(Key.USER_TO_LAST_REQUEST_SENT).open(data => { user.get(Key.USER_TO_LAST_REQUEST_SENT).open(data => {

View file

@ -98,7 +98,7 @@ const onOpenForPubFeedPair = ([pub, feed]) =>
}) })
return return
} }
//@ts-ignore
const incoming = /** @type {import('shock-common').Schema.Outgoing} */ (data) const incoming = /** @type {import('shock-common').Schema.Outgoing} */ (data)
// incomplete data, let's not assume anything // incomplete data, let's not assume anything

View file

@ -129,7 +129,7 @@ const tryAndWait = async (promGen, shouldRetry = () => false) => {
} catch (e) { } catch (e) {
logger.error(e) logger.error(e)
logger.info(JSON.stringify(e)) logger.info(JSON.stringify(e))
if (e.message === 'NOT_AUTH') { if (e.message === Constants.ErrorCode.NOT_AUTH) {
throw e throw e
} }
} }
@ -159,7 +159,7 @@ const tryAndWait = async (promGen, shouldRetry = () => false) => {
} }
} catch (e) { } catch (e) {
logger.error(e) logger.error(e)
if (e.message === 'NOT_AUTH') { if (e.message === Constants.ErrorCode.NOT_AUTH) {
throw e throw e
} }
} }
@ -189,7 +189,7 @@ const tryAndWait = async (promGen, shouldRetry = () => false) => {
} }
} catch (e) { } catch (e) {
logger.error(e) logger.error(e)
if (e.message === 'NOT_AUTH') { if (e.message === Constants.ErrorCode.NOT_AUTH) {
throw e throw e
} }
} }

View file

@ -327,7 +327,7 @@ module.exports = async (
}) })
app.use(async (req, res, next) => { app.use(async (req, res, next) => {
logger.info('Route:', req.path) logger.info(`Route: ${req.path}`)
if (unprotectedRoutes[req.method][req.path]) { if (unprotectedRoutes[req.method][req.path]) {
next() next()
} else { } else {
@ -1507,6 +1507,7 @@ module.exports = async (
}) })
} }
try {
if (keysend) { if (keysend) {
const { dest, amt, finalCltvDelta = 40 } = req.body const { dest, amt, finalCltvDelta = 40 } = req.body
if (!dest || !amt) { if (!dest || !amt) {
@ -1537,6 +1538,14 @@ module.exports = async (
}) })
return res.status(200).json(payment) return res.status(200).json(payment)
} catch (e) {
let msg = 'Unknown Error'
if (e.message) msg = e.message
logger.error(e)
return res.status(500).json({ errorMessage: msg })
}
}) })
app.post('/api/lnd/trackpayment', (req, res) => { app.post('/api/lnd/trackpayment', (req, res) => {
@ -1928,14 +1937,15 @@ module.exports = async (
app.get(`/api/gun/${GunEvent.ON_CHATS}`, (_, res) => { app.get(`/api/gun/${GunEvent.ON_CHATS}`, (_, res) => {
try { try {
const data = Events.getChats() const data = Events.getChats()
logger.info(`Chats polled: ${data.length}`)
res.json({ res.json({
data data
}) })
} catch (err) { } catch (err) {
logger.info('Error in Chats poll:') logger.info('Error in Chats poll:')
logger.error(err) logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({ res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message errorMessage: typeof err === 'string' ? err : err.message
}) })
} }
@ -1950,14 +1960,15 @@ module.exports = async (
.get(Key.AVATAR) .get(Key.AVATAR)
.then() .then()
) )
logger.info(`avatar poll:${(data || '').length} chars`)
res.json({ res.json({
data data
}) })
} catch (err) { } catch (err) {
logger.info('Error in Avatar poll:') logger.info('Error in Avatar poll:')
logger.error(err) logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({ res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message errorMessage: typeof err === 'string' ? err : err.message
}) })
} }
@ -1972,14 +1983,15 @@ module.exports = async (
.get(Key.DISPLAY_NAME) .get(Key.DISPLAY_NAME)
.then() .then()
) )
logger.info(`display name poll:${data}`)
res.json({ res.json({
data data
}) })
} catch (err) { } catch (err) {
logger.info('Error in Display Name poll:') logger.info('Error in Display Name poll:')
logger.error(err) logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({ res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message errorMessage: typeof err === 'string' ? err : err.message
}) })
} }
@ -1991,14 +2003,15 @@ module.exports = async (
const data = await timeout5( const data = await timeout5(
user.get(Key.CURRENT_HANDSHAKE_ADDRESS).then() user.get(Key.CURRENT_HANDSHAKE_ADDRESS).then()
) )
logger.info(`handshake address poll:${data}`)
res.json({ res.json({
data data
}) })
} catch (err) { } catch (err) {
logger.info('Error in Handshake Address poll:') logger.info('Error in Handshake Address poll:')
logger.error(err) logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({ res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message errorMessage: typeof err === 'string' ? err : err.message
}) })
} }
@ -2015,7 +2028,9 @@ module.exports = async (
} catch (err) { } catch (err) {
logger.info('Error in BIO poll:') logger.info('Error in BIO poll:')
logger.error(err) logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({ res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message errorMessage: typeof err === 'string' ? err : err.message
}) })
} }

105
yarn.lock
View file

@ -156,6 +156,13 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/runtime@^7.6.3":
version "7.11.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.6.0": "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.6.0":
version "7.6.0" version "7.6.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
@ -467,6 +474,50 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
"@redux-saga/core@^1.1.3":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4"
integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==
dependencies:
"@babel/runtime" "^7.6.3"
"@redux-saga/deferred" "^1.1.2"
"@redux-saga/delay-p" "^1.1.2"
"@redux-saga/is" "^1.1.2"
"@redux-saga/symbols" "^1.1.2"
"@redux-saga/types" "^1.1.0"
redux "^4.0.4"
typescript-tuple "^2.2.1"
"@redux-saga/deferred@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888"
integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==
"@redux-saga/delay-p@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355"
integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==
dependencies:
"@redux-saga/symbols" "^1.1.2"
"@redux-saga/is@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e"
integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==
dependencies:
"@redux-saga/symbols" "^1.1.2"
"@redux-saga/types" "^1.1.0"
"@redux-saga/symbols@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d"
integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==
"@redux-saga/types@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204"
integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==
"@samverschueren/stream-to-observable@^0.3.0": "@samverschueren/stream-to-observable@^0.3.0":
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
@ -4358,7 +4409,7 @@ 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.20, 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.20, lodash@^4.17.4, lodash@^4.17.5:
version "4.17.20" version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
@ -5556,12 +5607,19 @@ rechoir@^0.6.2:
dependencies: dependencies:
resolve "^1.1.6" resolve "^1.1.6"
redux-saga@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112"
integrity sha512-RkSn/z0mwaSa5/xH/hQLo8gNf4tlvT18qXDNvedihLcfzh+jMchDgaariQoehCpgRltEm4zHKJyINEz6aqswTw==
dependencies:
"@redux-saga/core" "^1.1.3"
redux-thunk@^2.3.0: redux-thunk@^2.3.0:
version "2.3.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
redux@^4.0.5: redux@^4.0.4, redux@^4.0.5:
version "4.0.5" version "4.0.5"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
@ -5574,6 +5632,11 @@ regenerator-runtime@^0.11.0:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.13.4:
version "0.13.7"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
regex-not@^1.0.0, regex-not@^1.0.2: regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
@ -5950,15 +6013,16 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
shock-common@4.0.1: shock-common@6.0.0:
version "4.0.1" version "6.0.0"
resolved "https://registry.yarnpkg.com/shock-common/-/shock-common-4.0.1.tgz#035e7081b6e67f6721e68dcc6b4d1e4c8f2cd96d" resolved "https://registry.yarnpkg.com/shock-common/-/shock-common-6.0.0.tgz#77701dabb344830046b85ece0103de21775197b9"
integrity sha512-3xAkG8lyfyZHK8trgOy2aN75uG1ZBm0MPoIEzP4hgXhyT/b80WmQzX3DqVSSmjfhq1Di0sjmNCY7O5Nf6cEmFg== integrity sha512-kbSkLTtWTK8qVcbW6uViWtar3otW2S5oJIMO/1twPs6Iuv9ATF0QviDtUiU1YN/Y4bX/SXAMm/jRZ3OJ3PLyUA==
dependencies: dependencies:
immer "^6.0.6" immer "^6.0.6"
lodash "^4.17.15" lodash "^4.17.19"
normalizr "^3.6.0" normalizr "^3.6.0"
redux "^4.0.5" redux "^4.0.5"
redux-saga "^1.1.3"
redux-thunk "^2.3.0" redux-thunk "^2.3.0"
uuid "3.x.x" uuid "3.x.x"
@ -6654,10 +6718,29 @@ 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.9.6: typescript-compare@^0.0.2:
version "3.9.6" version "0.0.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425"
integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==
dependencies:
typescript-logic "^0.0.0"
typescript-logic@^0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196"
integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==
typescript-tuple@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2"
integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==
dependencies:
typescript-compare "^0.0.2"
typescript@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.2.tgz#7ea7c88777c723c681e33bf7988be5d008d05ac2"
integrity sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==
uglify-js@^3.1.4: uglify-js@^3.1.4:
version "3.6.0" version "3.6.0"