Compare commits

...
21 Commits
Author SHA1 Message Date
Chris Troutner ae6bdcdd5f Merge pull request #35 from Permissionless-Software-Foundation/ct-unstable
fix(bch-js): Selecting custom server when not using JWT token
2021-09-08 14:02:25 -07:00
Chris Troutner 9fe822024c fix(bch-js): Selecting custom server when not using JWT token 2021-09-08 14:00:00 -07:00
Chris Troutner fc94041d17 Merge pull request #34 from Permissionless-Software-Foundation/ct-unstable
fix(docker): Using Ubuntu base container
2021-09-08 13:05:58 -07:00
Chris Troutner a3f780b1f5 fix(docker): Using Ubuntu base container 2021-09-08 13:02:23 -07:00
Chris Troutner 9487f19233 Merge pull request #33 from Permissionless-Software-Foundation/ct-unstable
fix(JWT): Added env var to enable/disable JWT retrieval at startup
2021-09-08 12:38:05 -07:00
Chris Troutner 2988374769 linting 2021-09-08 12:35:26 -07:00
Chris Troutner 22ab7260f4 fix(startup): Fixing startup issues caused by code mixup with upstream 2021-09-08 12:35:00 -07:00
Chris Troutner 27f6f62f8c fix(gitignore): Adding run-dev.sh to gitignore 2021-09-08 12:03:46 -07:00
Chris Troutner 33ab787a95 Integrating JWT env var in production 2021-09-08 12:02:57 -07:00
Chris Troutner 4f2cde2599 Merge branch 'master' of https://github.com/Permissionless-Software-Foundation/ipfs-service-provider into ct-unstable 2021-09-08 12:00:41 -07:00
Chris Troutner d419084216 Merge pull request #40 from Permissionless-Software-Foundation/ct-unstable
fix(JWT): Added env var to enable/disable JWT retrieval at startup
2021-09-08 11:59:55 -07:00
Chris Troutner 553e0081fa fix(JWT): Added env var to enable/disable JWT retrieval at startup 2021-09-08 11:58:18 -07:00
Chris Troutner 0716922b7c Merge pull request #32 from Permissionless-Software-Foundation/ct-unstable
fix(memory-leak): Resetting app after 8 hours
2021-09-07 21:05:20 -07:00
Chris Troutner 7e227d994b Merge branch 'master' of https://github.com/Permissionless-Software-Foundation/ipfs-service-provider into ct-unstable 2021-09-07 21:01:46 -07:00
Chris Troutner dd1b702966 Merge pull request #39 from Permissionless-Software-Foundation/ct-unstable
fix(memory-leak): Resetting app after 8 hours
2021-09-07 20:59:56 -07:00
Chris Troutner 0963f89049 fix(memory-leak): Resetting app after 8 hours 2021-09-07 20:58:23 -07:00
Chris Troutner cda3f1c0a7 Merge pull request #31 from Permissionless-Software-Foundation/ct-unstable
fix(JSON RPC): Adding filters and logging to JSON RPC router
2021-09-05 09:40:16 -07:00
Chris Troutner 1247bcb8c0 fix(upstream): Syncing with upstream ipfs-service-provider 2021-09-05 09:35:53 -07:00
Chris Troutner 36476b32ab Noting GitHub Issue 2021-09-05 09:23:38 -07:00
Chris Troutner 630135ac1c Merge pull request #37 from Permissionless-Software-Foundation/ct-unstable
fix(JSON RPC): Adding filters and logging to JSON RPC router
2021-09-05 08:45:51 -07:00
Chris Troutner 0a86c7dc92 fix(JSON RPC): Adding filters and logging to JSON RPC router 2021-09-05 08:31:06 -07:00
12 changed files with 103 additions and 95 deletions
+1
View File
@@ -68,5 +68,6 @@ ipfsdata
ipfs-service-provider.sh
start-bch-wallet-service.sh
data/
run-dev.sh
!README.md
+7
View File
@@ -100,6 +100,13 @@ class Server {
// Attach the other IPFS controllers
await controllers.attachControllers(app)
// ipfs-coord has a memory leak. This app shuts down after 8 hours. It
// expects to be run by Docker or pm2, which can automatically restart
// the app.
setTimeout(function () {
process.exit(0)
}, 60000 * 60 * 8)
return app
} catch (err) {
console.error('Could not start server. Error: ', err)
+3 -1
View File
@@ -13,6 +13,8 @@ const ipfsCoordName = process.env.COORD_NAME
? process.env.COORD_NAME
: 'ipfs-bch-wallet-service'
console.log('GET_JWT_AT_STARTUP: ', process.env.GET_JWT_AT_STARTUP)
module.exports = {
// Configure TCP port.
port: process.env.PORT || 5001,
@@ -32,7 +34,7 @@ module.exports = {
: 'emailpassword',
// FullStack.cash account information, used for automatic JWT handling.
getJwtAtStartup: false,
getJwtAtStartup: process.env.GET_JWT_AT_STARTUP ? true : false,
authServer: process.env.AUTHSERVER
? process.env.AUTHSERVER
: 'https://auth.fullstack.cash',
+22 -10
View File
@@ -2,32 +2,44 @@
#
#IMAGE BUILD COMMANDS
# ct-base-ubuntu = ubuntu 18.04 + nodejs v10 LTS
FROM christroutner/ct-base-ubuntu:latest
FROM ubuntu:20.04
MAINTAINER Chris Troutner <chris.troutner@gmail.com>
#Update the OS and install any OS packages needed.
RUN apt-get update
RUN apt-get install -y sudo git curl nano gnupg wget
#Install Node and NPM
RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get install -y nodejs build-essential
#Create the user 'safeuser' and add them to the sudo group.
#RUN useradd -ms /bin/bash safeuser
#RUN adduser safeuser sudo
RUN useradd -ms /bin/bash safeuser
RUN adduser safeuser sudo
#Set password to 'password' change value below if you want a different password
#RUN echo safeuser:password | chpasswd
RUN echo safeuser:password | chpasswd
#Set the working directory to be the home directory
WORKDIR /home/safeuser
#Setup NPM for non-root global install
#RUN mkdir /home/safeuser/.npm-global
#RUN chown -R safeuser .npm-global
#RUN echo "export PATH=~/.npm-global/bin:$PATH" >> /home/safeuser/.profile
#RUN runuser -l safeuser -c "npm config set prefix '~/.npm-global'"
RUN mkdir /home/safeuser/.npm-global
RUN chown -R safeuser .npm-global
RUN echo "export PATH=~/.npm-global/bin:$PATH" >> /home/safeuser/.profile
RUN runuser -l safeuser -c "npm config set prefix '~/.npm-global'"
# Update to the latest version of npm.
# Working with npm@7.21.1
RUN npm install -g npm
# Switch to user account.
#USER safeuser
# Prep 'sudo' commands.
#RUN echo 'abcd8765' | sudo -S pwd
# Clone the rest.bitcoin.com repository
# Clone the repository
WORKDIR /home/safeuser
RUN git clone https://github.com/Permissionless-Software-Foundation/ipfs-bch-wallet-service
+2 -1
View File
@@ -7,7 +7,7 @@
export MNEMONIC="olive two muscle bottom coral ancient wait legend bronze useful process session"
# The human readable name this IPFS node identifies as.
export COORD_NAME=ipfs-service-provider-generic
export COORD_NAME=bch-wallet-service-generic
# Allow this node to function as a circuit relay. It must not be behind a firewall.
#export ENABLE_CIRCUIT_RELAY=true
@@ -22,6 +22,7 @@ export DEBUG_LEVEL=1
export DBURL=mongodb://172.17.0.1:5555/ipfs-service-prod
# Customize these environment variables for your own installation.
export GET_JWT_AT_STARTUP=1
export AUTHSERVER=https://auth.fullstack.cash
export APISERVER=https://api.fullstack.cash/v5/
export FULLSTACKLOGIN=demo@demo.com
+28 -26
View File
@@ -5,53 +5,55 @@
*/
// Public NPM libraries
const BCHJS = require('@psf/bch-js')
const BCHJS = require("@psf/bch-js");
// Load individual adapter libraries.
const IPFSAdapter = require('./ipfs')
const LocalDB = require('./localdb')
const LogsAPI = require('./logapi')
const Passport = require('./passport')
const Nodemailer = require('./nodemailer')
const IPFSAdapter = require("./ipfs");
const LocalDB = require("./localdb");
const LogsAPI = require("./logapi");
const Passport = require("./passport");
const Nodemailer = require("./nodemailer");
// const { wlogger } = require('./wlogger')
const JSONFiles = require('./json-files')
const FullStackJWT = require('./fullstack-jwt')
const JSONFiles = require("./json-files");
const FullStackJWT = require("./fullstack-jwt");
const config = require('../../config')
const config = require("../../config");
class Adapters {
constructor (localConfig = {}) {
constructor(localConfig = {}) {
// Encapsulate dependencies
this.ipfs = new IPFSAdapter()
this.localdb = new LocalDB()
this.logapi = new LogsAPI()
this.passport = new Passport()
this.nodemailer = new Nodemailer()
this.jsonFiles = new JSONFiles()
this.bchjs = new BCHJS()
this.config = config
this.ipfs = new IPFSAdapter();
this.localdb = new LocalDB();
this.logapi = new LogsAPI();
this.passport = new Passport();
this.nodemailer = new Nodemailer();
this.jsonFiles = new JSONFiles();
this.bchjs = new BCHJS();
this.config = config;
// Get a valid JWT API key and instance bch-js.
this.fullStackJwt = new FullStackJWT(config)
this.fullStackJwt = new FullStackJWT(config);
}
async start () {
async start() {
try {
if (this.config.getJwtAtStartup) {
// Get a JWT token and instantiate bch-js with it. Then pass that instance
// to all the rest of the apps controllers and adapters.
await this.fullStackJwt.getJWT()
await this.fullStackJwt.getJWT();
// Instantiate bch-js with the JWT token, and overwrite the placeholder for bch-js.
this.bchjs = await this.fullStackJwt.instanceBchjs()
this.bchjs = await this.fullStackJwt.instanceBchjs();
} else {
this.bchjs = new BCHJS({ restURL: this.config.apiServer });
}
// Start the IPFS node.
await this.ipfs.start({ bchjs: this.bchjs })
await this.ipfs.start({ bchjs: this.bchjs });
} catch (err) {
console.error('Error in adapters/index.js/start()')
throw err
console.error("Error in adapters/index.js/start()");
throw err;
}
}
}
module.exports = Adapters
module.exports = Adapters;
+10 -4
View File
@@ -47,10 +47,16 @@ class IPFS {
} catch (err) {
console.error('Error in adapters/ipfs/index.js/start()')
// If error is due to a lock file issue. Kill the process, so that
// Docker or pm2 has a chance to restart the service.
if (err.message.includes('Lock already being held')) {
process.exit(1)
// If we are not in a test environment.
if (process.env.SVC_ENV !== 'test') {
// If error is due to a lock file issue. Kill the process, so that
// Docker or pm2 has a chance to restart the service.
if (err.message.includes('Lock already being held')) {
console.log(
'Lock file issue with IPFS. Shutting down so that process manager can restart app.'
)
process.exit(1)
}
}
throw err
+4
View File
@@ -2,6 +2,10 @@
Clean Architecture Adapter for IPFS.
This library deals with IPFS so that the apps business logic doesn't need
to have any specific knowledge of the js-ipfs library.
TODO: Add the external IP address to the list of multiaddrs advertised by
this node. See this GitHub Issue for details:
https://github.com/Permissionless-Software-Foundation/ipfs-service-provider/issues/38
*/
// Global npm libraries
+4 -35
View File
@@ -62,42 +62,11 @@ class Wlogger {
}
}
// transport.on('rotate', notifyRotation)
// function notifyRotation (oldFilename, newFilename) {
// wlogger.info('Rotating log files')
// }
// This controls what goes into the log FILES
// const wlogger = winston.createLogger({
// level: 'verbose',
// format: winston.format.json(),
// transports: [
// //
// // - Write to all logs with level `info` and below to `combined.log`
// // - Write all logs error (and below) to `error.log`.
// //
// // new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
// // new winston.transports.File({ filename: 'logs/combined.log' })
// transport
// ]
// })
// function outputToConsole () {
// wlogger.add(
// new winston.transports.Console({
// format: winston.format.simple(),
// level: 'info'
// })
// )
// }
// This controls the logs to CONSOLE
// if (config.env !== 'test') {
// outputToConsole()
// }
const logger = new Wlogger()
// Allow the logger to write to the console.
logger.outputToConsole()
const wlogger = logger.wlogger
module.exports = { wlogger, Wlogger }
-9
View File
@@ -26,18 +26,9 @@ class Controllers {
}
async attachControllers (app) {
// Get a JWT token and instantiate bch-js with it. Then pass that instance
// to all the rest of the apps controllers and adapters.
await this.adapters.fullStackJwt.getJWT()
// Instantiate bch-js with the JWT token, and overwrite the placeholder for bch-js.
this.adapters.bchjs = await this.adapters.fullStackJwt.instanceBchjs()
// Wait for any startup processes to complete for the Adapters libraries.
await this.adapters.start()
// Attach the REST controllers to the Koa app.
// this.attachRESTControllers(app)
this.attachRPCControllers()
}
+21 -6
View File
@@ -51,23 +51,23 @@ class JSONRPC {
async router (str, from) {
try {
// console.log('router str: ', str)
// console.log('router from: ', from)
console.log('JSON RPC router recieved data from: ', from)
// Exit quietly if 'from' is not specified.
if (!from || typeof from !== 'string') {
// console.warn(
// 'Warning: Can not send JSON RPC response. Can not determine which peer this message came from.'
// )
wlogger.info(
'Warning: Can not send JSON RPC response. Can not determine which peer this message came from.'
)
return
}
// Attempt to parse the incoming data as a JSON RPC string.
const parsedData = _this.jsonrpc.parse(str)
// console.log('\nrouter from: ', from)
// console.log('parsedData: ', parsedData)
// wlogger.debug(`parsedData: ${JSON.stringify(parsedData, null, 2)}`)
// Exit quietly if the incoming string is an invalid JSON RPC string.
if (parsedData.type === 'invalid') {
wlogger.info('Rejecting invalid JSON RPC command.')
return
}
@@ -75,6 +75,21 @@ class JSONRPC {
const alreadyProcessed = _this._checkIfAlreadyProcessed(parsedData)
if (alreadyProcessed) {
return
} else {
// This node will regularly ping known circuit relays with an /about
// JSON RPC call. These will be handled by ipfs-coord, but will percolate
// up to ipfs-coord. Ignore these messages.
if (
parsedData.type.includes('success') &&
parsedData.payload.method === undefined
) {
return
}
// Log the incoming JSON RPC command.
wlogger.info(
`JSON RPC received from ${from}, ID: ${parsedData.payload.id}, type: ${parsedData.type}, method: ${parsedData.payload.method}`
)
}
// Added the property "from" to the parsedData object;
+1 -3
View File
@@ -45,9 +45,7 @@ describe('#Controllers', () => {
it('should catch and throw errors', async () => {
try {
// Force an error
sandbox
.stub(uut.adapters.fullStackJwt, 'getJWT')
.rejects(new Error('test error'))
sandbox.stub(uut.adapters, 'start').rejects(new Error('test error'))
const app = {
use: () => {}