commit
799f8e45e3
9 changed files with 318 additions and 39 deletions
|
|
@ -78,9 +78,12 @@
|
||||||
"typescript": "^3.6.3"
|
"typescript": "^3.6.3"
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"*.{js,ts}": [
|
"*.js": [
|
||||||
"prettier --check",
|
"prettier --check",
|
||||||
"eslint"
|
"eslint"
|
||||||
|
],
|
||||||
|
"*.ts": [
|
||||||
|
"prettier --check"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,9 @@ export interface Soul {
|
||||||
export type OpenListenerData = Primitive | null | OpenListenerDataObj
|
export type OpenListenerData = Primitive | null | OpenListenerDataObj
|
||||||
export type OpenListener = (data: OpenListenerData, key: string) => void
|
export type OpenListener = (data: OpenListenerData, key: string) => void
|
||||||
|
|
||||||
|
export type LoadListenerData = OpenListenerData
|
||||||
|
export type LoadListener = (data: LoadListenerData, key: string) => void
|
||||||
|
|
||||||
export interface GUNNodeBase {
|
export interface GUNNodeBase {
|
||||||
_: Soul
|
_: Soul
|
||||||
|
|
||||||
|
|
@ -48,6 +51,8 @@ export interface GUNNodeBase {
|
||||||
|
|
||||||
open(this: GUNNode, cb?: OpenListener): GUNNode
|
open(this: GUNNode, cb?: OpenListener): GUNNode
|
||||||
|
|
||||||
|
load(this: GUNNode, cb?: LoadListener): GUNNode
|
||||||
|
|
||||||
off(): void
|
off(): void
|
||||||
user(): UserGUNNode
|
user(): UserGUNNode
|
||||||
user(epub: string): GUNNode
|
user(epub: string): GUNNode
|
||||||
|
|
|
||||||
|
|
@ -1156,7 +1156,7 @@ const saveSeedBackup = async (mnemonicPhrase, user, SEA) => {
|
||||||
return new Promise((res, rej) => {
|
return new Promise((res, rej) => {
|
||||||
user.get(Key.SEED_BACKUP).put(encryptedSeed, ack => {
|
user.get(Key.SEED_BACKUP).put(encryptedSeed, ack => {
|
||||||
if (ack.err) {
|
if (ack.err) {
|
||||||
rej(ack.err)
|
rej(new Error(ack.err))
|
||||||
} else {
|
} else {
|
||||||
res()
|
res()
|
||||||
}
|
}
|
||||||
|
|
@ -1179,7 +1179,7 @@ const saveChannelsBackup = async (backups, user, SEA) => {
|
||||||
return new Promise((res, rej) => {
|
return new Promise((res, rej) => {
|
||||||
user.get(Key.CHANNELS_BACKUP).put(encryptBackups, ack => {
|
user.get(Key.CHANNELS_BACKUP).put(encryptBackups, ack => {
|
||||||
if (ack.err) {
|
if (ack.err) {
|
||||||
rej(ack.err)
|
rej(new Error(ack.err))
|
||||||
} else {
|
} else {
|
||||||
res()
|
res()
|
||||||
}
|
}
|
||||||
|
|
@ -1218,6 +1218,54 @@ const setLastSeenApp = () =>
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} publicKey
|
||||||
|
* @param {boolean} isPrivate Will overwrite previous private status.
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
*/
|
||||||
|
const follow = (publicKey, isPrivate) => {
|
||||||
|
/** @type {import('shock-common').Schema.Follow} */
|
||||||
|
const newFollow = {
|
||||||
|
private: isPrivate,
|
||||||
|
status: 'ok',
|
||||||
|
user: publicKey
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((res, rej) => {
|
||||||
|
require('../Mediator')
|
||||||
|
.getUser()
|
||||||
|
.get(Key.FOLLOWS)
|
||||||
|
.get(publicKey)
|
||||||
|
// @ts-ignore
|
||||||
|
.put(newFollow, ack => {
|
||||||
|
if (ack.err) {
|
||||||
|
rej(new Error(ack.err))
|
||||||
|
} else {
|
||||||
|
res()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} publicKey
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
const unfollow = publicKey =>
|
||||||
|
new Promise((res, rej) => {
|
||||||
|
require('../Mediator')
|
||||||
|
.getUser()
|
||||||
|
.get(Key.FOLLOWS)
|
||||||
|
.get(publicKey)
|
||||||
|
.put(null, ack => {
|
||||||
|
if (ack.err) {
|
||||||
|
rej(new Error(ack.err))
|
||||||
|
} else {
|
||||||
|
res()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
__createOutgoingFeed,
|
__createOutgoingFeed,
|
||||||
acceptRequest,
|
acceptRequest,
|
||||||
|
|
@ -1236,5 +1284,7 @@ module.exports = {
|
||||||
saveSeedBackup,
|
saveSeedBackup,
|
||||||
saveChannelsBackup,
|
saveChannelsBackup,
|
||||||
disconnect,
|
disconnect,
|
||||||
setLastSeenApp
|
setLastSeenApp,
|
||||||
|
follow,
|
||||||
|
unfollow
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
const Key = require('./key')
|
|
||||||
const Utils = require('./utils')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {string} pub
|
|
||||||
* @returns {Promise<string>}
|
|
||||||
*/
|
|
||||||
exports.currentOrderAddress = async (pub) => {
|
|
||||||
const currAddr = await Utils.tryAndWait((gun) => gun.user(pub).get(Key.CURRENT_ORDER_ADDRESS).then())
|
|
||||||
|
|
||||||
if (typeof currAddr !== 'string') {
|
|
||||||
throw new TypeError('Expected user.currentOrderAddress to be an string')
|
|
||||||
}
|
|
||||||
|
|
||||||
return currAddr
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {string} pub
|
|
||||||
* @returns {Promise<string|null>}
|
|
||||||
*/
|
|
||||||
exports.userToIncomingID = async (pub) => {
|
|
||||||
const incomingID = await require('../Mediator').getUser().get(Key.USER_TO_INCOMING).get(pub).then()
|
|
||||||
|
|
||||||
if (typeof incomingID === 'string') return incomingID
|
|
||||||
|
|
||||||
return null
|
|
||||||
|
|
||||||
}
|
|
||||||
50
services/gunDB/contact-api/getters/follows.js
Normal file
50
services/gunDB/contact-api/getters/follows.js
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
const Common = require('shock-common')
|
||||||
|
const Logger = require('winston')
|
||||||
|
|
||||||
|
const Key = require('../key')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Common.Schema.Follow} Follow
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {Promise<Record<string, Common.Schema.Follow>>}
|
||||||
|
*/
|
||||||
|
exports.currentFollows = () => {
|
||||||
|
const user = require('../../Mediator').getUser()
|
||||||
|
|
||||||
|
return new Promise(res => {
|
||||||
|
user.get(Key.FOLLOWS).load(data => {
|
||||||
|
if (typeof data !== 'object' || data === null) {
|
||||||
|
Logger.warn(
|
||||||
|
`GunDb -> getters -> currentFollows() -> Current follows data as fetched from gun is not an object but ${typeof data}. This can happen if Gun lost its cache and it's still retrieving data from the network.`
|
||||||
|
)
|
||||||
|
res({})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const rejected = Object.entries(data).filter(
|
||||||
|
([_, follow]) => !Common.Schema.isFollow(follow)
|
||||||
|
)
|
||||||
|
|
||||||
|
rejected.forEach(([key, item]) => {
|
||||||
|
// expected when unfollowed
|
||||||
|
if (item !== null) {
|
||||||
|
Logger.warn(
|
||||||
|
`GunDb -> getters -> currentFollows() -> Item not conforming to schema found inside follows data. Key: ${key}, item: ${JSON.stringify(
|
||||||
|
item
|
||||||
|
)}.`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const passed = Object.entries(data).filter(([_, follow]) =>
|
||||||
|
Common.Schema.isFollow(follow)
|
||||||
|
)
|
||||||
|
|
||||||
|
const p = /** @type {unknown} */ (passed)
|
||||||
|
|
||||||
|
res(/** @type {Record<string, Follow>} */ (p))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
42
services/gunDB/contact-api/getters/index.js
Normal file
42
services/gunDB/contact-api/getters/index.js
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
/**
|
||||||
|
* @format
|
||||||
|
*/
|
||||||
|
const Key = require('../key')
|
||||||
|
const Utils = require('../utils')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} pub
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
*/
|
||||||
|
exports.currentOrderAddress = async pub => {
|
||||||
|
const currAddr = await Utils.tryAndWait(gun =>
|
||||||
|
gun
|
||||||
|
.user(pub)
|
||||||
|
.get(Key.CURRENT_ORDER_ADDRESS)
|
||||||
|
.then()
|
||||||
|
)
|
||||||
|
|
||||||
|
if (typeof currAddr !== 'string') {
|
||||||
|
throw new TypeError('Expected user.currentOrderAddress to be an string')
|
||||||
|
}
|
||||||
|
|
||||||
|
return currAddr
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} pub
|
||||||
|
* @returns {Promise<string|null>}
|
||||||
|
*/
|
||||||
|
exports.userToIncomingID = async pub => {
|
||||||
|
const incomingID = await require('../../Mediator')
|
||||||
|
.getUser()
|
||||||
|
.get(Key.USER_TO_INCOMING)
|
||||||
|
.get(pub)
|
||||||
|
.then()
|
||||||
|
|
||||||
|
if (typeof incomingID === 'string') return incomingID
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.Follows = require('./follows')
|
||||||
|
|
@ -42,3 +42,5 @@ exports.CHANNELS_BACKUP = 'channelsBackup'
|
||||||
exports.LAST_SEEN_APP = 'lastSeenApp'
|
exports.LAST_SEEN_APP = 'lastSeenApp'
|
||||||
|
|
||||||
exports.LAST_SEEN_NODE = 'lastSeenNode'
|
exports.LAST_SEEN_NODE = 'lastSeenNode'
|
||||||
|
|
||||||
|
exports.FOLLOWS = 'follows'
|
||||||
|
|
|
||||||
162
src/routes.js
162
src/routes.js
|
|
@ -13,7 +13,6 @@ const responseTime = require("response-time");
|
||||||
const uuid = require("uuid/v4");
|
const uuid = require("uuid/v4");
|
||||||
const Common = require('shock-common')
|
const Common = require('shock-common')
|
||||||
|
|
||||||
|
|
||||||
const getListPage = require("../utils/paginate");
|
const getListPage = require("../utils/paginate");
|
||||||
const auth = require("../services/auth/auth");
|
const auth = require("../services/auth/auth");
|
||||||
const FS = require("../utils/fs");
|
const FS = require("../utils/fs");
|
||||||
|
|
@ -22,6 +21,7 @@ const LightningServices = require("../utils/lightningServices");
|
||||||
const GunDB = require("../services/gunDB/Mediator");
|
const GunDB = require("../services/gunDB/Mediator");
|
||||||
const { unprotectedRoutes, nonEncryptedRoutes } = require("../utils/protectedRoutes");
|
const { unprotectedRoutes, nonEncryptedRoutes } = require("../utils/protectedRoutes");
|
||||||
const GunActions = require("../services/gunDB/contact-api/actions")
|
const GunActions = require("../services/gunDB/contact-api/actions")
|
||||||
|
const GunGetters = require('../services/gunDB/contact-api/getters')
|
||||||
|
|
||||||
const DEFAULT_MAX_NUM_ROUTES_TO_QUERY = 10;
|
const DEFAULT_MAX_NUM_ROUTES_TO_QUERY = 10;
|
||||||
const SESSION_ID = uuid();
|
const SESSION_ID = uuid();
|
||||||
|
|
@ -33,6 +33,8 @@ module.exports = async (
|
||||||
mySocketsEvents,
|
mySocketsEvents,
|
||||||
{ serverPort, CA, CA_KEY, usetls }
|
{ serverPort, CA, CA_KEY, usetls }
|
||||||
) => {
|
) => {
|
||||||
|
const {timeout5} = require('../services/gunDB/contact-api/utils')
|
||||||
|
|
||||||
const Http = Axios.create({
|
const Http = Axios.create({
|
||||||
httpsAgent: new httpsAgent.Agent({
|
httpsAgent: new httpsAgent.Agent({
|
||||||
ca: await FS.readFile(CA)
|
ca: await FS.readFile(CA)
|
||||||
|
|
@ -433,6 +435,67 @@ module.exports = async (
|
||||||
GunActions.saveChannelsBackup(JSON.stringify(channelBackups),user,SEA)
|
GunActions.saveChannelsBackup(JSON.stringify(channelBackups),user,SEA)
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const feedObj = {
|
||||||
|
feed: [
|
||||||
|
{
|
||||||
|
id:'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
|
||||||
|
paragraphs:[
|
||||||
|
"SOme text and stuff 12"
|
||||||
|
],
|
||||||
|
profilePic:"",
|
||||||
|
username:"bobni",
|
||||||
|
media:[
|
||||||
|
{
|
||||||
|
type:'VIDEO',
|
||||||
|
ratio_x: 1024,
|
||||||
|
ratio_y: 436,
|
||||||
|
magnetUri:'magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fsintel.torrent',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id:'3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
|
||||||
|
paragraphs:[
|
||||||
|
"SOme text and stuff"
|
||||||
|
],
|
||||||
|
profilePic:"",
|
||||||
|
username:"bobni",
|
||||||
|
media:[
|
||||||
|
{
|
||||||
|
type:'VIDEO',
|
||||||
|
ratio_x: 1920,
|
||||||
|
ratio_y: 804,
|
||||||
|
magnetUri:'magnet:?xt=urn:btih:c9e15763f722f23e98a29decdfae341b98d53056&dn=Cosmos+Laundromat&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fcosmos-laundromat.torrent',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id:'58694a0f-3da1-471f-bd96-145571e29d72',
|
||||||
|
paragraphs:[
|
||||||
|
"SOme text and stuff"
|
||||||
|
],
|
||||||
|
profilePic:"",
|
||||||
|
username:"bobni",
|
||||||
|
media:[
|
||||||
|
{
|
||||||
|
type:'VIDEO',
|
||||||
|
ratio_x: 1920,
|
||||||
|
ratio_y: 1080,
|
||||||
|
magnetUri:'magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c&dn=Big+Buck+Bunny&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fbig-buck-bunny.torrent',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
user.get("FEED_POC").put(JSON.stringify(feedObj), ack => {
|
||||||
|
if (ack.err) {
|
||||||
|
//rej(new Error(ack.err))
|
||||||
|
logger.log(ack.err)
|
||||||
|
} else {
|
||||||
|
logger.log(ack.err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
//register to listen for channel backups
|
//register to listen for channel backups
|
||||||
const onNewChannelBackup = () => {
|
const onNewChannelBackup = () => {
|
||||||
|
|
@ -1617,8 +1680,7 @@ module.exports = async (
|
||||||
|
|
||||||
const GunEvent = Common.Constants.Event
|
const GunEvent = Common.Constants.Event
|
||||||
const Key = require('../services/gunDB/contact-api/key')
|
const Key = require('../services/gunDB/contact-api/key')
|
||||||
const { timeout5 } = require('../services/gunDB/contact-api/utils')
|
|
||||||
|
|
||||||
app.get("/api/gun/lndchanbackups", async (req,res) => {
|
app.get("/api/gun/lndchanbackups", async (req,res) => {
|
||||||
try{
|
try{
|
||||||
const user = require('../services/gunDB/Mediator').getUser()
|
const user = require('../services/gunDB/Mediator').getUser()
|
||||||
|
|
@ -1633,6 +1695,18 @@ module.exports = async (
|
||||||
res.json({ok:"err"})
|
res.json({ok:"err"})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
app.get("/api/gun/feedpoc", async (req,res) =>{
|
||||||
|
try{
|
||||||
|
logger.warn("FEED POC")
|
||||||
|
const user = require('../services/gunDB/Mediator').getUser()
|
||||||
|
const feedObj = await timeout5(user.get("FEED_POC").then())
|
||||||
|
logger.warn(feedObj)
|
||||||
|
|
||||||
|
res.json({data:feedObj})
|
||||||
|
} catch (err) {
|
||||||
|
//res.json({ok:"err"})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const Events = require('../services/gunDB/contact-api/events')
|
const Events = require('../services/gunDB/contact-api/events')
|
||||||
|
|
||||||
|
|
@ -1757,6 +1831,88 @@ module.exports = async (
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/////////////////////////////////
|
||||||
|
/**
|
||||||
|
* @template P
|
||||||
|
* @typedef {import('express-serve-static-core').RequestHandler<P>} RequestHandler
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
const ap = /** @type {Application} */ (app);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {object} FollowsRouteParams
|
||||||
|
* @prop {(string|undefined)=} publicKey
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {RequestHandler<FollowsRouteParams>}
|
||||||
|
*/
|
||||||
|
const apiGunFollowsGet = (_, res) => {
|
||||||
|
try {
|
||||||
|
// const { publicKey } = req.params;
|
||||||
|
// const currFollows = await GunGetters.currentFollows()
|
||||||
|
|
||||||
|
return res.status(200).json({})
|
||||||
|
} catch (err) {
|
||||||
|
return res.status(500).json({
|
||||||
|
errorMessage: err.message || 'Unknown ERR at GET /api/follows'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {RequestHandler<FollowsRouteParams>}
|
||||||
|
*/
|
||||||
|
const apiGunFollowsPut = (req, res) => {
|
||||||
|
try {
|
||||||
|
const { publicKey } = req.params;
|
||||||
|
if (!publicKey) {
|
||||||
|
throw new Error(`Missing publicKey route param.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// await GunActions.follow(req.params.publicKey, false)
|
||||||
|
|
||||||
|
// 201 would be extraneous here. Implement it inside app.put
|
||||||
|
return res.status(200).json({
|
||||||
|
ok: true
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
return res.status(500).json({
|
||||||
|
errorMessage: err.message || 'Unknown error inside /api/gun/follows/'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {RequestHandler<FollowsRouteParams>}
|
||||||
|
*/
|
||||||
|
const apiGunFollowsDelete = (req, res) => {
|
||||||
|
try {
|
||||||
|
const { publicKey } = req.params;
|
||||||
|
if (!publicKey) {
|
||||||
|
throw new Error(`Missing publicKey route param.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// await GunActions.unfollow(req.params.publicKey)
|
||||||
|
|
||||||
|
return res.status(200).json({
|
||||||
|
ok: true
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
return res.status(500).json({
|
||||||
|
errorMessage: err.message || 'Unknown error inside /api/gun/follows/'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ap.get('/api/gun/follows/', apiGunFollowsGet)
|
||||||
|
ap.get('/api/gun/follows/:publicKey', apiGunFollowsGet)
|
||||||
|
ap.put(`/api/gun/follows/:publicKey`,apiGunFollowsPut)
|
||||||
|
ap.delete(`/api/gun/follows/:publicKey`, apiGunFollowsDelete)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return app so that it can be used by express.
|
* Return app so that it can be used by express.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -5877,9 +5877,9 @@ shellwords@^0.1.1:
|
||||||
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
|
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
|
||||||
|
|
||||||
shock-common@0.x.x:
|
shock-common@0.x.x:
|
||||||
version "0.2.0"
|
version "0.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/shock-common/-/shock-common-0.2.0.tgz#b942d4b8730890aaf192eb873957c235333eddca"
|
resolved "https://registry.yarnpkg.com/shock-common/-/shock-common-0.3.0.tgz#2e8a9c2cd1eda300a8461ea9648d250237f22f78"
|
||||||
integrity sha512-K9UysxR4LnArhljK3kRNdRM2yeI52YxPe0dZ62SNvsHO5oJgE6wDV0qGy9UZYS5FoAprF5QRzzADxgqmGWin+Q==
|
integrity sha512-K0xOKkrOAvD4rlWVQD5WXASiKyfatEX2cj114LC8Wddi3wXpex5yLNdWBXNGFpL6Vc5Wzhza/sEHs4p+Q3xBmw==
|
||||||
dependencies:
|
dependencies:
|
||||||
lodash "^4.17.15"
|
lodash "^4.17.15"
|
||||||
normalizr "^3.6.0"
|
normalizr "^3.6.0"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue