Skip to content

Commit

Permalink
Relay server ts (#357)
Browse files Browse the repository at this point in the history
* change RelayServer.js to typescript RelayServer.ts.

* Moving contract to contracts/test

* Importing environments in server

* Moving to http provider


* Update server version to 0.9.0

Co-authored-by: shahafn <shahaflol@gmail.com>
  • Loading branch information
drortirosh and shahafn authored May 13, 2020
1 parent 5d8ef47 commit 814953c
Show file tree
Hide file tree
Showing 21 changed files with 2,327 additions and 1,703 deletions.
11 changes: 10 additions & 1 deletion jsrelay/webpack.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,17 @@ module.exports = {
new IgnorePlugin(/^scrypt$/),
],
target: 'node',
entry: '../src/relayserver/runServer.js',
entry: '../dist/src/relayserver/runServer.js',
mode: 'development',
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'relayserver.js'
Expand Down
8 changes: 6 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,16 @@
},
"dependencies": {
"@openzeppelin/test-helpers": "0.5.5",
"@truffle/contract": "4.1.13",
"@truffle/contract": "4.2.4",
"@truffle/hdwallet-provider": "1.0.34",
"@types/big.js": "4.0.5",
"@types/bignumber.js": "5.0.0",
"@types/chai": "4.2.11",
"@types/chai-as-promised": "^7.1.2",
"@types/eth-sig-util": "2.1.0",
"@types/lodash": "^4.14.150",
"@types/cors": "^2.8.6",
"@types/express": "^4.17.6",
"@types/mocha": "7.0.2",
"@types/nedb": "1.8.9",
"@types/node": "13.9.1",
Expand Down Expand Up @@ -94,10 +96,11 @@
"patch-package": "6.2.1",
"postinstall-postinstall": "2.0.0",
"request-promise": "4.2.2",
"truffle-contract": "4.0.31",
"truffle-hdwallet-provider": "1.0.17",
"web3": "1.2.6",
"web3-core": "1.2.6",
"web3-core-helpers": "1.2.6",
"web3-eth": "1.2.6",
"web3-eth-abi": "1.2.6",
"web3-eth-contract": "1.2.6",
"web3-utils": "1.2.6",
Expand All @@ -110,6 +113,7 @@
"@0x/sol-trace": "3.0.8",
"@0x/subproviders": "4.1.0",
"@0x/typescript-typings": "5.0.2",
"@machinomy/types-ethereumjs-wallet": "^0.0.12",
"@openeth/truffle-typings": "0.0.5",
"@truffle-types/abi-decoder": "^0.1.1",
"@typescript-eslint/eslint-plugin": "2.23.0",
Expand Down
1 change: 1 addition & 0 deletions src/common/PingResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export default interface PingResponse {
// TODO: this should be 'worker'
RelayServerAddress: Address
RelayManagerAddress: Address
RelayHubAddress: Address
MinGasPrice: IntString
Ready: boolean
Version: string
Expand Down
43 changes: 23 additions & 20 deletions src/relayclient/GsnTestEnvironment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import net from 'net'
import { ether } from '@openzeppelin/test-helpers'

import CommandsLogic, { DeploymentResult } from '../cli/CommandsLogic'
import KeyManager from '../relayserver/KeyManager'
import { KeyManager } from '../relayserver/KeyManager'

import { configureGSN } from './GSNConfigurator'
import { getNetworkUrl, supportedNetworks } from '../cli/utils'
import { TxStoreManager } from '../relayserver/TxStoreManager'
import RelayServer from '../relayserver/RelayServer'
import HttpServer from '../relayserver/HttpServer'
import { RelayServer, RelayServerParams } from '../relayserver/RelayServer'
import { HttpServer } from '../relayserver/HttpServer'
import { Address } from './types/Aliases'
import { RelayProvider } from './RelayProvider'
import Web3 from 'web3'
Expand Down Expand Up @@ -46,11 +46,12 @@ class GsnTestEnvironmentClass {
const balance = await commandsLogic.fundPaymaster(from, deploymentResult.paymasterAddress, ether('1'))
console.log('Sample Paymaster successfully funded, balance:', Web3.utils.fromWei(balance))

await this._runServer(_host, deploymentResult, from)
const port = await this._resolveAvailablePort()
const relayUrl = 'http://127.0.0.1:' + port.toString()
this._runServer(_host, deploymentResult, from, relayUrl, port)
if (this.httpServer == null) {
throw new Error('Failed to run a local Relay Server')
}
const relayUrl = this.httpServer.backend.url as string

const registerOptions = {
from,
Expand Down Expand Up @@ -113,40 +114,42 @@ class GsnTestEnvironmentClass {
}
}

async _runServer (
_runServer (
host: string,
deploymentResult: DeploymentResult,
from: Address
): Promise<void> {
from: Address,
relayUrl: string,
port: number
): void {
if (this.httpServer !== undefined) {
return
}
const port = await this._resolveAvailablePort()
const relayUrl = 'http://127.0.0.1:' + port.toString()

const keyManager = new KeyManager({
count: 2
})
const keyManager = new KeyManager(2)
const txStoreManager = new TxStoreManager({ inMemory: true })

const backend = new RelayServer({
web3provider: new Web3.providers.WebsocketProvider(host),
/*
readonly contractInteractor: ContractInteractor
readonly workerMinBalance: number | undefined // = defaultWorkerMinBalance,
readonly workerTargetBalance: number | undefined // = defaultWorkerTargetBalance,
*/
const relayServerParams = {
web3provider: new Web3.providers.HttpProvider(host),
txStoreManager,
keyManager,
owner: from,
url: relayUrl,
hubAddress: deploymentResult.relayHubAddress,
gasPriceFactor: 1,
baseRelayFee: 0,
pctRelayFee: 0,
devMode: true,
Debug: false
})
}
const backend = new RelayServer(relayServerParams as RelayServerParams)

this.httpServer = new HttpServer({
this.httpServer = new HttpServer(
port,
backend
})
)
this.httpServer.start()
}
}
Expand Down
8 changes: 6 additions & 2 deletions src/relayclient/types/Environments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,28 @@ class Environment {
public readonly gtxdatanonzero: number
public readonly gtxdatazero: number
public readonly chainId: number
public readonly mintxgascost: number

constructor (env: Environment) {
this.gtxdatanonzero = env.gtxdatanonzero
this.gtxdatazero = env.gtxdatazero
this.chainId = env.chainId
this.mintxgascost = env.mintxgascost
}
}

export const environments = {
istanbul: new Environment({
gtxdatanonzero: 16,
gtxdatazero: 4,
chainId: 1
chainId: 1,
mintxgascost: 21000
}),
constantinople: new Environment({
gtxdatanonzero: 68,
gtxdatazero: 4,
chainId: 1
chainId: 1,
mintxgascost: 21000
})
}

Expand Down
52 changes: 31 additions & 21 deletions src/relayserver/HttpServer.js → src/relayserver/HttpServer.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
const express = require('express')
const jsonrpc = require('jsonrpc-lite')
const bodyParser = require('body-parser')
const cors = require('cors')
import express, { Express } from 'express'
import jsonrpc from 'jsonrpc-lite'
import bodyParser from 'body-parser'
import cors from 'cors'
import { RelayServer } from './RelayServer'
import { Server } from 'http'

class HttpServer {
constructor ({ port, backend }) {
this.port = port
this.backend = backend
export class HttpServer {
app: Express
private serverInstance: Server | undefined;
constructor (private readonly port: number, readonly backend: RelayServer) {
this.app = express()
this.app.use(cors())

Expand All @@ -24,8 +26,8 @@ class HttpServer {
this.backend.on('error', (e) => { console.error('httpServer:', e) })
}

start () {
if (!this.serverInstance) {
start (): void {
if (this.serverInstance === undefined) {
this.serverInstance = this.app.listen(this.port, () => {
console.log('Listening on port', this.port)
})
Expand All @@ -38,52 +40,62 @@ class HttpServer {
}
}

stop () {
this.serverInstance.close()
stop (): void {
this.serverInstance?.close()
console.log('Http server stopped.\nShutting down relay...')
}

close () {
close (): void {
console.log('Stopping relay worker...')
// stop (unsubscribe) is async..
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.backend.stop()
// process.exit()
}

// TODO: use this when changing to jsonrpc
async rootHandler (req, res) {
async rootHandler (req: any, res: any): Promise<void> {
let status
try {
let res
let func
if ((func = this.backend[req.body.method])) {
res = await func.apply(this.backend, [req.body.params]) || { code: 200 }
// @ts-ignore
const func = this.backend[req.body.method]
// @ts-ignore
if (func != null) {
// @ts-ignore
res = await func.apply(this.backend, [req.body.params]) ?? { code: 200 }
} else {
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
throw Error(`Implementation of method ${req.body.params} not found on backend!`)
}

// @ts-ignore
status = jsonrpc.success(req.body.id, res)
} catch (e) {
let stack = e.stack.toString()
// remove anything after 'rootHandler'
stack = stack.replace(/(rootHandler.*)[\s\S]*/, '$1')
// @ts-ignore
status = jsonrpc.error(req.body.id, new jsonrpc.JsonRpcError(stack, -125))
}
res.send(status)
}

async pingHandler (req, res) {
pingHandler (req: any, res: any): void {
const pingResponse = this.backend.pingHandler()
res.send(pingResponse)
console.log(`address ${pingResponse.RelayServerAddress} sent. ready: ${pingResponse.Ready}`)
}

async relayHandler (req, res) {
async relayHandler (req: any, res: any): Promise<void> {
if (!this.backend.isReady()) {
res.send('Error: relay not ready')
return
}

try {
// @ts-ignore
const signedTx = await this.backend.createRelayTransaction(req.body)
res.send({ signedTx })
} catch (e) {
Expand All @@ -92,5 +104,3 @@ class HttpServer {
}
}
}

module.exports = HttpServer
73 changes: 0 additions & 73 deletions src/relayserver/KeyManager.js

This file was deleted.

Loading

0 comments on commit 814953c

Please sign in to comment.