Skip to content

Commit 007259f

Browse files
committed
Split providers into messaging and trustlines
1 parent 87d6cfc commit 007259f

File tree

14 files changed

+253
-149
lines changed

14 files changed

+253
-149
lines changed

docs/guides.md

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,18 @@ The user therefore needs some coins ([TLC](https://explore.tlbc.trustlines.found
5858
5959
```javascript
6060
const laika = new TLNetwork({
61-
protocol: 'https',
62-
wsProtocol: 'wss',
63-
host: 'relay0.testnet.trustlines.network',
64-
path: '/api/v1',
61+
relayProviderUrlObject: {
62+
protocol: 'https',
63+
wsProtocol: 'wss',
64+
host: 'relay0.testnet.trustlines.network',
65+
path: '/api/v1'
66+
},
67+
messagingProviderUrlObject: {
68+
protocol: 'https',
69+
wsProtocol: 'wss',
70+
host: 'relay0.testnet.trustlines.network',
71+
path: '/api/v1'
72+
},
6573
walletType: 'ethers'
6674
})
6775

@@ -77,10 +85,18 @@ An additional step of deploying the identity contract of the newly created user
7785

7886
```javascript
7987
const laika = new TLNetwork({
80-
protocol: 'https',
81-
wsProtocol: 'wss',
82-
host: 'relay0.testnet.trustlines.network',
83-
path: '/api/v1',
88+
relayProviderUrlObject: {
89+
protocol: 'https',
90+
wsProtocol: 'wss',
91+
host: 'relay0.testnet.trustlines.network',
92+
path: '/api/v1'
93+
},
94+
messagingProviderUrlObject: {
95+
protocol: 'https',
96+
wsProtocol: 'wss',
97+
host: 'relay0.testnet.trustlines.network',
98+
path: '/api/v1'
99+
},
84100
walletType: 'identity',
85101
identityFactoryAddress: '0x8D2720877Fa796E3C3B91BB91ad6CfcC07Ea249E',
86102
identityImplementationAddress: '0x8BEe92893D3ec62e5B3EBBe4e536A60Fd9AFc9D7'

src/Messaging.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Observable } from 'rxjs/Observable'
22
import { fromPromise } from 'rxjs/observable/fromPromise'
33

44
import { CurrencyNetwork } from './CurrencyNetwork'
5-
import { TLProvider } from './providers/TLProvider'
5+
import { Provider } from './providers/Provider'
66
import { User } from './User'
77

88
import utils from './utils'
@@ -17,11 +17,11 @@ import {
1717
export class Messaging {
1818
private user: User
1919
private currencyNetwork: CurrencyNetwork
20-
private provider: TLProvider
20+
private provider: Provider
2121

2222
constructor(params: {
2323
currencyNetwork: CurrencyNetwork
24-
provider: TLProvider
24+
provider: Provider
2525
user: User
2626
}) {
2727
this.user = params.user

src/TLNetwork.ts

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { User } from './User'
1414
import { RelayProvider } from './providers/RelayProvider'
1515
import { TLProvider } from './providers/TLProvider'
1616

17+
import { Provider } from './providers/Provider'
1718
import { TLSigner } from './signers/TLSigner'
1819
import { Web3Signer } from './signers/Web3Signer'
1920

@@ -26,14 +27,32 @@ import {
2627

2728
import utils from './utils'
2829

29-
import { TLNetworkConfig } from './typings'
30+
import { ProviderUrl, TLNetworkConfig } from './typings'
3031
import { IdentityWallet } from './wallets/IdentityWallet'
3132

3233
/**
3334
* The TLNetwork class is the single entry-point into the trustlines-clientlib.
3435
* It contains all of the library's functionality and all calls to the library should be made through a `TLNetwork` instance.
3536
*/
3637
export class TLNetwork {
38+
private static validateConfig(config: TLNetworkConfig): void {
39+
if (
40+
config.relayProviderUrlObject &&
41+
(config.relayApiUrl || config.relayWsApiUrl)
42+
) {
43+
throw new Error(
44+
`Invalid input config; cannot input both relay provider url object and full urls`
45+
)
46+
}
47+
if (
48+
config.messagingProviderUrlObject &&
49+
(config.messagingApiUrl || config.messagingWsApiUrl)
50+
) {
51+
throw new Error(
52+
`Invalid input config; cannot input both messaging provider url object and full urls`
53+
)
54+
}
55+
}
3756
/**
3857
* User instance containing all user/keystore related methods.
3958
*/
@@ -94,90 +113,107 @@ export class TLNetwork {
94113
/**
95114
* @hidden
96115
*/
97-
public provider: TLProvider
116+
public relayProvider: TLProvider
117+
/**
118+
* @hidden
119+
*/
120+
public messagingProvider: Provider
98121

99122
/**
100123
* Initiates a new TLNetwork instance that provides the public interface to trustlines-clientlib.
101124
* @param config Configuration object. See [[TLNetworkConfig]] for more information.
102125
*/
103126
constructor(config: TLNetworkConfig = {}) {
127+
TLNetwork.validateConfig(config)
128+
const defaultProviderUrl: ProviderUrl = {
129+
protocol: 'http',
130+
host: 'localhost',
131+
port: '',
132+
path: '',
133+
wsProtocol: 'ws'
134+
}
104135
const {
105-
protocol = 'http',
106-
host = 'localhost',
107-
port = '',
108-
path = '',
109-
wsProtocol = 'ws',
136+
relayProviderUrlObject = config.relayProviderUrlObject ||
137+
defaultProviderUrl,
138+
messagingProviderUrlObject = config.messagingProviderUrlObject ||
139+
defaultProviderUrl,
110140
relayApiUrl,
111141
relayWsApiUrl,
142+
messagingApiUrl,
143+
messagingWsApiUrl,
112144
web3Provider,
113145
identityFactoryAddress,
114146
identityImplementationAddress,
115147
walletType = WALLET_TYPE_ETHERS,
116148
chainId
117149
} = config
118150

119-
this.setProvider(
151+
this.setProviders(
120152
new RelayProvider(
121-
relayApiUrl || utils.buildApiUrl(protocol, host, port, path),
122-
relayWsApiUrl || utils.buildApiUrl(wsProtocol, host, port, path)
153+
relayApiUrl || utils.buildApiUrl(relayProviderUrlObject),
154+
relayWsApiUrl || utils.buildWsApiUrl(relayProviderUrlObject)
155+
),
156+
new Provider(
157+
messagingApiUrl || utils.buildApiUrl(messagingProviderUrlObject),
158+
messagingWsApiUrl || utils.buildWsApiUrl(messagingProviderUrlObject)
123159
)
124160
)
125161

126-
this.setWallet(walletType, this.provider, chainId, {
162+
this.setWallet(walletType, this.relayProvider, chainId, {
127163
identityFactoryAddress,
128164
identityImplementationAddress
129165
})
130166
this.setSigner(web3Provider, this.wallet)
131167

132-
this.currencyNetwork = new CurrencyNetwork(this.provider)
168+
this.currencyNetwork = new CurrencyNetwork(this.relayProvider)
133169
this.transaction = new Transaction({
134-
provider: this.provider,
170+
provider: this.relayProvider,
135171
signer: this.signer,
136172
currencyNetwork: this.currencyNetwork
137173
})
138174
this.user = new User({
139-
provider: this.provider,
175+
provider: this.relayProvider,
140176
signer: this.signer,
141177
wallet: this.wallet
142178
})
143179
this.contact = new Contact({
144-
provider: this.provider,
180+
provider: this.relayProvider,
145181
user: this.user
146182
})
147183
this.event = new Event({
148184
currencyNetwork: this.currencyNetwork,
149-
provider: this.provider,
185+
provider: this.relayProvider,
150186
user: this.user
151187
})
152188
this.messaging = new Messaging({
153189
currencyNetwork: this.currencyNetwork,
154-
provider: this.provider,
190+
provider: this.messagingProvider,
155191
user: this.user
156192
})
157193
this.trustline = new Trustline({
158194
currencyNetwork: this.currencyNetwork,
159195
event: this.event,
160-
provider: this.provider,
196+
provider: this.relayProvider,
161197
transaction: this.transaction,
162198
user: this.user
163199
})
164200
this.payment = new Payment({
165201
currencyNetwork: this.currencyNetwork,
166202
event: this.event,
167-
provider: this.provider,
203+
provider: this.relayProvider,
168204
transaction: this.transaction,
169205
user: this.user
170206
})
171207
this.exchange = new Exchange({
172208
currencyNetwork: this.currencyNetwork,
173209
event: this.event,
174210
payment: this.payment,
175-
provider: this.provider,
211+
provider: this.relayProvider,
176212
transaction: this.transaction,
177213
user: this.user
178214
})
179215
this.ethWrapper = new EthWrapper({
180-
provider: this.provider,
216+
provider: this.relayProvider,
181217
transaction: this.transaction,
182218
user: this.user
183219
})
@@ -186,11 +222,15 @@ export class TLNetwork {
186222
/**
187223
* @hidden
188224
*/
189-
public setProvider(provider: TLProvider): void {
190-
if (!(provider instanceof RelayProvider)) {
225+
public setProviders(
226+
relayProvider: TLProvider,
227+
messagingProvider: Provider
228+
): void {
229+
if (!(relayProvider instanceof RelayProvider)) {
191230
throw new Error('Provider not supported.')
192231
}
193-
this.provider = provider
232+
this.relayProvider = relayProvider
233+
this.messagingProvider = messagingProvider
194234
}
195235

196236
/**

src/providers/Provider.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { Observable } from 'rxjs/Observable'
2+
3+
import utils from '../utils'
4+
5+
import { ReconnectingWSOptions } from '../typings'
6+
7+
export class Provider {
8+
public ApiUrl: string
9+
public WsApiUrl: string
10+
11+
constructor(ApiUrl: string, WsApiUrl: string) {
12+
this.ApiUrl = ApiUrl
13+
this.WsApiUrl = WsApiUrl
14+
}
15+
16+
/**
17+
* Returns a JSON response from the REST API of the server.
18+
* @param endpoint Endpoint to fetch.
19+
* @param options Optional fetch options.
20+
*/
21+
public async fetchEndpoint<T>(
22+
endpoint: string,
23+
options?: object
24+
): Promise<T> {
25+
const trimmedEndpoint = utils.trimUrl(endpoint)
26+
return utils.fetchUrl<T>(`${this.ApiUrl}/${trimmedEndpoint}`, options)
27+
}
28+
29+
public async postToEndpoint<T>(endpoint: string, data: any): Promise<T> {
30+
const options = {
31+
body: JSON.stringify(data),
32+
headers: new Headers({ 'Content-Type': 'application/json' }),
33+
method: 'POST'
34+
}
35+
return this.fetchEndpoint<T>(endpoint, options)
36+
}
37+
38+
/**
39+
* Creates a websocket stream connection to the server.
40+
* @param endpoint Websocket stream endpoint to connect to.
41+
* @param functionName Function to call on connection.
42+
* @param args Function arguments.
43+
* @param reconnectOnError Optional flag whether to try reconnecting web socket.
44+
*/
45+
public createWebsocketStream(
46+
endpoint: string,
47+
functionName: string,
48+
args: object,
49+
reconnectingOptions?: ReconnectingWSOptions
50+
): Observable<any> {
51+
const trimmedEndpoint = utils.trimUrl(endpoint)
52+
return utils.websocketStream(
53+
`${this.WsApiUrl}/${trimmedEndpoint}`,
54+
functionName,
55+
args,
56+
reconnectingOptions
57+
)
58+
}
59+
60+
/**
61+
* Returns the version of the currently configured provider server.
62+
* @returns Version of relay in the format `<name>/vX.X.X`.
63+
*/
64+
public async getVersion(): Promise<string> {
65+
return this.fetchEndpoint<string>(`version`)
66+
}
67+
}

0 commit comments

Comments
 (0)