Skip to content

Commit

Permalink
Merge pull request #510 from gponsinet/feat/gponsinet/flush-db
Browse files Browse the repository at this point in the history
feat(devtools): flush database
  • Loading branch information
Godefroy Ponsinet committed Nov 6, 2018
2 parents fe5cdf0 + 64bc2d6 commit 6cb6637
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 102 deletions.
Expand Up @@ -38,14 +38,26 @@ public void start(Promise promise) {
@ReactMethod
public void restart(Promise promise) {
try {
Core.restart(this.filesDir, this.logger);
Core.restart(this.filesDir);
promise.resolve(null);
} catch (Exception err) {
this.logger.format(Level.ERROR, this.getName(), "Unable to restart core: %s", err);
promise.reject(err);
}
}

@ReactMethod
public void dropDatabase(Promise promise) {
try {
Core.dropDatabase(this.filesDir);
promise.resolve(null);
} catch (Exception err) {
this.logger.format(Level.ERROR, this.getName(), "Unable to drop database: %s", err);
promise.reject(err);
}
}


@ReactMethod
public void getPort(Promise promise) {
try {
Expand Down
@@ -1,40 +1,77 @@
import { ActivityIndicator, Alert, NativeModules } from 'react-native'
import React, { PureComponent } from 'react'
import { Menu, Header } from '../../../Library'

import { Flex, Header, Menu, Screen, Text } from '../../../Library'
import { colors } from '../../../../constants'
import { mutations } from '../../../../graphql'

const { CoreModule } = NativeModules

export default class Database extends PureComponent {
static navigationOptions = ({ navigation }) => ({
header: (
<Header
navigation={navigation}
title='Database'
titleIcon='database'
backBtn
/>
),
header: () =>
navigation.getParam('dropDatabase') || (
<Header
navigation={navigation}
title='Database'
titleIcon='database'
backBtn
/>
),
})

generateFakeData = async () => {
try {
await mutations.generateFakeData.commit({ t: true })
} catch (err) {
this.setState({ err })
console.error(err)
}
}

dropDatabase = async () => {
this.props.navigation.setParams({ dropDatabase: true })
try {
await CoreModule.dropDatabase()
await CoreModule.restart()
await CoreModule.getPort()
} catch (err) {
Alert.alert('An error occured, please, kill and restart the app')
console.error(err)
}
this.props.navigation.setParams({
dropDatabase: false,
})
}

render () {
const dropDatabase = this.props.navigation.getParam('dropDatabase')
if (dropDatabase === true) {
return (
<Screen style={{ backgroundColor: colors.white }}>
<Flex.Rows align='center'>
<Flex.Cols align='end'>
<ActivityIndicator size='large' />
</Flex.Cols>
<Text center margin align='start'>
Dropping database, waiting for daemon to restart ...
</Text>
</Flex.Rows>
</Screen>
)
}
return (
<Menu>
<Menu.Section customMarginTop={1}>
<Menu.Item
icon='database'
title='Generate fake data'
onPress={async () => {
try {
await mutations.generateFakeData.commit({ t: true })
} catch (err) {
this.setState({ err })
console.error(err)
}
}}
onPress={this.generateFakeData}
/>
<Menu.Item
icon='refresh-ccw'
title='Reset database (not implemented)'
onPress={() => {
console.log('Reset')
}}
title='Drop database'
onPress={this.dropDatabase}
/>
</Menu.Section>
</Menu>
Expand Down
Expand Up @@ -32,30 +32,28 @@ export default class List extends PureComponent {
this.setState({ restartDaemon: true }, async () => {
try {
await CoreModule.restart()
console.log(await CoreModule.getPort())
this.props.navigation.setParams({
restartDaemon: false,
})
this.setState({ restartDaemon: false })
} catch (err) {
console.error(err)
}
this.props.navigation.setParams({
restartDaemon: false,
})
this.setState({ restartDaemon: false })
})
}

panic = async () => {
this.props.navigation.setParams({ panic: true })
this.setState({ panic: true }, async () => {
try {
queries.Panic.fetch()
await CoreModule.getPort()
this.props.navigation.setParams({
panic: false,
})
this.setState({ panic: false })
await queries.Panic.fetch()
} catch (err) {
console.error(err)
}
this.props.navigation.setParams({
panic: false,
})
this.setState({ panic: false })
})
}

Expand Down
88 changes: 40 additions & 48 deletions client/react-native/common/relay/environment.js
Expand Up @@ -11,9 +11,12 @@ import {
import 'regenerator-runtime/runtime'

const logStyle = {
relayOK: 'font-weight:bold;color:#FFFFFF;background-color:#F26B02;letter-spacing:1pt;word-spacing:2pt;font-size:12px;text-align:left;font-family:arial, helvetica, sans-serif;line-height:1;',
relayERROR: 'font-weight:bold;color:#FFFFFF;background-color:#880606;letter-spacing:1pt;word-spacing:2pt;font-size:12px;text-align:left;font-family:arial, helvetica, sans-serif;line-height:1;',
title: 'font-weight:normal;font-style:italic;color:#FFFFFF;background-color:#000000;',
relayOK:
'font-weight:bold;color:#FFFFFF;background-color:#F26B02;letter-spacing:1pt;word-spacing:2pt;font-size:12px;text-align:left;font-family:arial, helvetica, sans-serif;line-height:1;',
relayERROR:
'font-weight:bold;color:#FFFFFF;background-color:#880606;letter-spacing:1pt;word-spacing:2pt;font-size:12px;text-align:left;font-family:arial, helvetica, sans-serif;line-height:1;',
title:
'font-weight:normal;font-style:italic;color:#FFFFFF;background-color:#000000;',
}

// eslint-disable-next-line
Expand All @@ -26,6 +29,7 @@ if (Platform.OS === 'web') {
const CoreModule = {
start: async () => {},
restart: async () => console.warn('not implemented in web'),
dropDatabase: async () => console.warn('not implemented in web'),
getPort: async () => {
const url = new URL(window.location.href)
return url.searchParams.get('gql-port') || '8700'
Expand All @@ -36,45 +40,14 @@ if (Platform.OS === 'web') {

const { CoreModule } = NativeModules

// Define a function that fetches the results of an operation (query/mutation/etc)
// and returns its results as a Promise:

// const fetchXHR = (url, { method, headers, body } = {}) =>
// new Promise((resolve, reject) => {
// const xhr = new XMLHttpRequest()
// xhr.open(method, url, true)
// Object.keys(headers).forEach(key => xhr.setRequestHeader(key, headers[key]))
// xhr.onload = () => {
// const data = JSON.parse(xhr.responseText)
// if (
// xhr.readyState === 4 &&
// (xhr.status === '201' || xhr.status === '200')
// ) {
// resolve(data)
// } else {
// reject(data)
// }
// }
// xhr.send(body)
// })

let getIP = () =>
new Promise(resolve => {
if (Platform.OS === 'web') {
return resolve(window.location.hostname)
}

if (Platform.OS === 'ios') {
return resolve('127.0.0.1')
}

if (Platform.OS === 'android') {
return resolve('10.0.2.2')
}
return resolve('127.0.0.1')
})

const getPort = () => CoreModule.getPort()

const setupSubscription = async (config, variables, cacheConfig, observer) => {
try {
const query = config.text
Expand Down Expand Up @@ -109,9 +82,16 @@ const setupSubscription = async (config, variables, cacheConfig, observer) => {
const perfLogger = (msg, req, res) => {
try {
if (res.ok) {
console.groupCollapsed('%c RELAY %c %s', logStyle.relayOK, logStyle.title, msg)
console.groupCollapsed(
'%c RELAY %c %s',
logStyle.relayOK,
logStyle.title,
msg
)
} else {
const errorReason = res.text ? res.text : `Server return empty response with Status Code: ${res.status}.`
const errorReason = res.text
? res.text
: `Server return empty response with Status Code: ${res.status}.`

console.group('%c RELAY %c %s', logStyle.relayERROR, logStyle.title, msg)
console.error(errorReason)
Expand All @@ -131,20 +111,28 @@ const perfLogger = (msg, req, res) => {
}
}

const _fetchQuery = async (req) => {
const query = `http://${await getIP()}:${await getPort()}/query`

// eslint-disable-next-line
if (__DEV__) {
console.log('%c RELAY %c relay query: %s', logStyle.relayOK, logStyle.title, query)
const _fetchQuery = async req => {
try {
const query = `http://${await getIP()}:${await CoreModule.getPort()}/query`

// eslint-disable-next-line
if (__DEV__) {
console.log(
'%c RELAY %c relay query: %s',
logStyle.relayOK,
logStyle.title,
query
)
}
return query
} catch (err) {
console.warn(err)
}

return query
}

// @TODO: Do something better to cache this
let queryLock = false
export const fetchQuery = async (req) => {
export const fetchQuery = async req => {
if (queryLock) {
return queryLock
}
Expand All @@ -154,7 +142,7 @@ export const fetchQuery = async (req) => {

let middlewares = [
// eslint-disable-next-line
__DEV__ ? perfMiddleware({logger: perfLogger}) : null,
__DEV__ ? perfMiddleware({ logger: perfLogger }) : null,
urlMiddleware({
url: fetchQuery,
}),
Expand All @@ -169,7 +157,11 @@ let middlewares = [
// eslint-disable-next-line
if (__DEV__) {
window.forceRelayRetry = forceRetry
console.warn('call `forceRelayRetry()` for immediately retry! Or wait ' + delay + ' ms.')
console.warn(
'call `forceRelayRetry()` for immediately retry! Or wait ' +
delay +
' ms.'
)
}
},
statusCodes: [500, 503, 504],
Expand Down

0 comments on commit 6cb6637

Please sign in to comment.