1 | import Config from './config'
|
2 | import Accounts from './accounts'
|
3 | import reduct = require('reduct')
|
4 | import {
|
5 | BackendConstructor,
|
6 | BackendInstance,
|
7 | SubmitPaymentParams
|
8 | } from '../types/backend'
|
9 |
|
10 | import { loadModuleOfType } from '../lib/utils'
|
11 |
|
12 | const DEFAULT_BACKEND = 'one-to-one'
|
13 |
|
14 | export default class RateBackend implements BackendInstance {
|
15 | protected backend: BackendInstance
|
16 | private accounts: Accounts
|
17 |
|
18 | constructor (deps: reduct.Injector) {
|
19 | const config = deps(Config)
|
20 | this.accounts = deps(Accounts)
|
21 |
|
22 | const Backend: BackendConstructor = loadModuleOfType('backend', config.backend || DEFAULT_BACKEND)
|
23 | this.backend = new Backend(Object.assign({
|
24 | spread: config.spread
|
25 | }, config.backendConfig), {
|
26 | getInfo: (account: string) => this.accounts.getInfo(account),
|
27 | accounts: this.accounts
|
28 | })
|
29 | }
|
30 |
|
31 | connect () {
|
32 | return this.backend.connect()
|
33 | }
|
34 |
|
35 | getRate (sourceAccount: string, destinationAccount: string) {
|
36 | return this.backend.getRate(sourceAccount, destinationAccount)
|
37 | }
|
38 |
|
39 | submitPayment (params: SubmitPaymentParams) {
|
40 | return this.backend.submitPayment(params)
|
41 | }
|
42 |
|
43 | submitPacket (params: SubmitPaymentParams) {
|
44 | if (this.backend.submitPacket) {
|
45 | return this.backend.submitPacket(params)
|
46 | }
|
47 | return Promise.resolve()
|
48 | }
|
49 |
|
50 | async getStatus () {
|
51 | const rates = {}
|
52 | const accountIds = this.accounts.getAccountIds()
|
53 | for (const srcAccount of accountIds) {
|
54 | const accountRates = rates[srcAccount] = {}
|
55 | for (const dstAccount of accountIds) {
|
56 | if (srcAccount === dstAccount) continue
|
57 | accountRates[dstAccount] = await this.backend.getRate(srcAccount, dstAccount)
|
58 | }
|
59 | }
|
60 | return rates
|
61 | }
|
62 | }
|