[bot] break out RPC and shared packages for bot service breakout

This commit is contained in:
41666 2019-04-04 11:13:34 -05:00
parent 544ae65c58
commit 50b5e334a3
No known key found for this signature in database
GPG key ID: BC51D07640DC10AF
31 changed files with 233 additions and 111 deletions

View file

@ -1,5 +1,5 @@
// @flow
import RPCClient from '../rpc'
import RPCClient from '@roleypoly/rpc-client'
const client = new RPCClient({ forceDev: false })

View file

@ -7,6 +7,7 @@
},
"dependencies": {
"@roleypoly/types": "^2.0.0",
"@roleypoly/rpc-client": "^2.0.0",
"color": "^3.1.0",
"eventemitter3": "^3.1.0",
"fast-redux": "^0.7.1",

View file

@ -42,6 +42,7 @@ class RoleypolyApp extends App {
ctx.user = user
} catch (e) {
if (e.code === 403) {
console.error('user not found')
ctx.user = null
} else {
console.error(e)

View file

@ -3,7 +3,7 @@ import * as React from 'react'
import Head from 'next/head'
import type { PageProps } from '../../types'
import SocialCards from '../../components/social-cards'
import redirect from '../../lib/redirect'
import redirect from '../../util/redirect'
import { connect } from 'react-redux'
import { fetchServerIfNeed, getCurrentServerState, type ServerState } from '../../stores/currentServer'
import { renderRoles, getCategoryViewState, toggleRole, type ViewState } from '../../stores/roles'

View file

@ -4,7 +4,7 @@ import styled from 'styled-components'
import { md } from '../../kit/media'
import DiscordButton from '../../components/discord-button'
import RPC from '../../config/rpc'
import redirect from '../../lib/redirect'
import redirect from '../../util/redirect'
import dynamic from 'next/dynamic'
import type { PageProps } from '../../types'
import type { ServerSlug } from '@roleypoly/types'

View file

@ -1,5 +1,5 @@
import * as React from 'react'
import redirect from '../lib/redirect'
import redirect from '../util/redirect'
// import Link from 'next/link'
// import Head from '../components/head'
// import Nav from '../components/nav'

View file

@ -1,119 +0,0 @@
// @flow
import superagent from 'superagent'
import RPCError from '@roleypoly/server/rpc/_error'
export type RPCResponse = {
response?: mixed,
hash?: string,
// error stuff
error?: boolean,
msg?: string,
trace?: string
}
export type RPCRequest = {
fn: string,
args: mixed[]
}
export default class RPCClient {
dev: boolean = false
baseUrl: string
firstKnownHash: string
recentHash: string
cookieHeader: string
rpc: {
[fn: string]: (...args: any[]) => Promise<any>
} = {}
__rpcAvailable: Array<{
name: string,
args: number
}> = []
constructor ({ forceDev, baseUrl = '/api/_rpc' }: { forceDev?: boolean, baseUrl?: string } = {}) {
this.baseUrl = (process.env.APP_URL || '') + baseUrl
if (forceDev != null) {
this.dev = forceDev
} else {
this.dev = process.env.NODE_ENV === 'development'
}
this.rpc = new Proxy({}, {
get: this.__rpcCall,
has: this.__checkCall,
ownKeys: this.__listCalls,
delete: () => {}
})
if (this.dev) {
this.updateCalls()
}
}
withCookies = (h: string) => {
this.cookieHeader = h
return this.rpc
}
async updateCalls () {
// this is for development only. doing in prod is probably dumb.
const rsp = await superagent.get(this.baseUrl)
if (rsp.status !== 200) {
console.error(rsp)
return
}
const { hash, available } = rsp.body
this.__rpcAvailable = available
if (this.firstKnownHash == null) {
this.firstKnownHash = hash
}
this.recentHash = hash
// just kinda prefill. none of these get called anyway.
// and don't matter in prod either.
for (let { name } of available) {
this.rpc[name] = async () => {}
}
}
async call (fn: string, ...args: any[]): mixed {
const req: RPCRequest = { fn, args }
const rq = superagent.post(this.baseUrl)
if (this.cookieHeader != null) {
rq.cookies = this.cookieHeader
}
const rsp = await rq.send(req).ok(() => true)
const body: RPCResponse = rsp.body
// console.log(body)
if (body.error === true) {
console.error(body)
throw RPCError.fromResponse(body, rsp.status)
}
if (body.hash != null) {
if (this.firstKnownHash == null) {
this.firstKnownHash = body.hash
}
this.recentHash = body.hash
if (this.firstKnownHash !== this.recentHash) {
this.updateCalls()
}
}
return body.response
}
// PROXY HANDLERS
__rpcCall = (_: {}, fn: string) => this.call.bind(this, fn)
__checkCall = (_: {}, fn: string) => this.dev ? this.__listCalls(_).includes(fn) : true
__listCalls = (_: {}): string[] => this.__rpcAvailable.map(x => x.name)
}