@tchain/tcabci-read-js-client 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/client.js +56 -31
- package/client_test.js +45 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,6 +18,9 @@ $ npm i @tchain/tcabci-read-js-client
|
|
|
18
18
|
const tcAbciClient = require("@tchain/tcabci-read-js-client")
|
|
19
19
|
|
|
20
20
|
const client = new tcAbciClient()
|
|
21
|
+
// OR
|
|
22
|
+
const client = new tcAbciClient(['https://read-node-01.transferchain.io',
|
|
23
|
+
'wss://read-node-01.transferchain.io/ws'])
|
|
21
24
|
|
|
22
25
|
client.Start()
|
|
23
26
|
|
package/client.js
CHANGED
|
@@ -19,14 +19,21 @@ class TCAbciClient {
|
|
|
19
19
|
#subscribedAddresses = []
|
|
20
20
|
#connected = false
|
|
21
21
|
#version = "v0.1.0"
|
|
22
|
+
#retrieverCount = 0
|
|
22
23
|
errorCb = null
|
|
23
24
|
listenCb = null
|
|
24
25
|
#ws = null
|
|
25
26
|
#httpClient = null
|
|
27
|
+
#readNodeAddress = READ_NODE_ADDRESS
|
|
28
|
+
#readNodeWSAddress = READ_NODE_WS_ADDRESS
|
|
26
29
|
|
|
27
|
-
constructor() {
|
|
30
|
+
constructor(readNodeAddresses = []) {
|
|
31
|
+
if (readNodeAddresses.length === 2) {
|
|
32
|
+
this.#readNodeAddress = readNodeAddresses[0]
|
|
33
|
+
this.#readNodeWSAddress = readNodeAddresses[1]
|
|
34
|
+
}
|
|
28
35
|
this.#httpClient = axios.create({
|
|
29
|
-
baseURL:
|
|
36
|
+
baseURL: this.#readNodeAddress,
|
|
30
37
|
timeout: 10000,
|
|
31
38
|
headers: {'Client': `tcabaci-read-js-client${this.#version}`}
|
|
32
39
|
})
|
|
@@ -39,26 +46,7 @@ class TCAbciClient {
|
|
|
39
46
|
this.listenCb = cb
|
|
40
47
|
}
|
|
41
48
|
Start() {
|
|
42
|
-
return
|
|
43
|
-
if (this.#getConnected()) {
|
|
44
|
-
reject(ALREADY_CONNECTED)
|
|
45
|
-
}
|
|
46
|
-
const wsClient = this.#wsClient()
|
|
47
|
-
this.#ws = new wsClient(READ_NODE_WS_ADDRESS)
|
|
48
|
-
|
|
49
|
-
this.#ws.onerror = (event) => {
|
|
50
|
-
this.#setConnected(false)
|
|
51
|
-
if (this.errorCb) {
|
|
52
|
-
this.errorCb(event.error)
|
|
53
|
-
}
|
|
54
|
-
reject(event)
|
|
55
|
-
}
|
|
56
|
-
this.#ws.onopen = (event) => {
|
|
57
|
-
this.#setConnected(true)
|
|
58
|
-
resolve(event)
|
|
59
|
-
}
|
|
60
|
-
this.#ws.onmessage = this.#listen
|
|
61
|
-
})
|
|
49
|
+
return this.#connect()
|
|
62
50
|
}
|
|
63
51
|
Stop() {
|
|
64
52
|
if (!this.#getConnected()) {
|
|
@@ -160,6 +148,52 @@ class TCAbciClient {
|
|
|
160
148
|
.catch(e => { throw TRANSACTION_NOT_BROADCAST })
|
|
161
149
|
}
|
|
162
150
|
|
|
151
|
+
Disconnect(code = 1000) {
|
|
152
|
+
if (this.#getConnected()) {
|
|
153
|
+
this.#ws.close(code)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
#connect() {
|
|
158
|
+
return new Promise((resolve, reject) => {
|
|
159
|
+
if (this.#getConnected()) {
|
|
160
|
+
reject(ALREADY_CONNECTED)
|
|
161
|
+
}
|
|
162
|
+
const wsClient = this.#wsClient()
|
|
163
|
+
this.#ws = new wsClient(this.#readNodeWSAddress)
|
|
164
|
+
|
|
165
|
+
this.#ws.onerror = (event) => {
|
|
166
|
+
this.#setConnected(false)
|
|
167
|
+
if (this.errorCb) {
|
|
168
|
+
this.errorCb(event.error)
|
|
169
|
+
}
|
|
170
|
+
reject(event)
|
|
171
|
+
}
|
|
172
|
+
this.#ws.onopen = (event) => {
|
|
173
|
+
this.#setConnected(true)
|
|
174
|
+
this.#retrieverCount = 0
|
|
175
|
+
resolve(event)
|
|
176
|
+
}
|
|
177
|
+
this.#ws.onmessage = (message) => {
|
|
178
|
+
if (message.data === "OK" && message.data.length < 10) {
|
|
179
|
+
return { status: message.data }
|
|
180
|
+
}
|
|
181
|
+
if (this.listenCb) {
|
|
182
|
+
this.listenCb(toJSON(message.data))
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
this.#ws.onclose = (event) => {
|
|
186
|
+
this.#setConnected(false)
|
|
187
|
+
if (event.code !== 1000 && this.#retrieverCount <= 10) {
|
|
188
|
+
this.#retrieverCount++
|
|
189
|
+
setTimeout(() => {
|
|
190
|
+
this.#connect().catch(() => {})
|
|
191
|
+
}, 3000)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
})
|
|
195
|
+
}
|
|
196
|
+
|
|
163
197
|
#wsClient() {
|
|
164
198
|
if (typeof window !== "undefined") {
|
|
165
199
|
return window.WebSocket
|
|
@@ -167,15 +201,6 @@ class TCAbciClient {
|
|
|
167
201
|
const { WebSocket } = require("ws")
|
|
168
202
|
return WebSocket
|
|
169
203
|
}
|
|
170
|
-
#listen(message) {
|
|
171
|
-
if (message.data === "OK" && message.data.length < 10) {
|
|
172
|
-
return { status: message.data }
|
|
173
|
-
}
|
|
174
|
-
const txData = toJSON(message.data)
|
|
175
|
-
if (this.listenCb) {
|
|
176
|
-
this.listenCb(new Transaction(txData).ToJSONString())
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
204
|
#getConnected() {
|
|
180
205
|
return this.#connected
|
|
181
206
|
}
|
package/client_test.js
CHANGED
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
const tcAbciClient = require("./client")
|
|
2
2
|
const unitJS = require("unit.js")
|
|
3
|
-
const {INVALID_ARGUMENTS, INVALID_URL, TRANSACTION_TYPE_NOT_VALID} = require("./errors")
|
|
4
|
-
const { TX_TYPE } = require("./constants")
|
|
3
|
+
const {INVALID_ARGUMENTS, INVALID_URL, TRANSACTION_TYPE_NOT_VALID, TRANSACTION_NOT_BROADCAST} = require("./errors")
|
|
4
|
+
const { TX_TYPE, READ_NODE_ADDRESS, READ_NODE_WS_ADDRESS} = require("./constants")
|
|
5
5
|
const {randomString} = require("./util")
|
|
6
6
|
|
|
7
7
|
describe("TCAbciClient TESTS", () => {
|
|
8
8
|
|
|
9
|
+
it('should start with valid parameters and read node addresses',(done) => {
|
|
10
|
+
const client = new tcAbciClient([READ_NODE_ADDRESS, READ_NODE_WS_ADDRESS])
|
|
11
|
+
client.Start()
|
|
12
|
+
.then(() => {
|
|
13
|
+
const { connected, subscribed } = client.Status()
|
|
14
|
+
unitJS.assert.equal(connected, true)
|
|
15
|
+
unitJS.assert.equal(subscribed, false)
|
|
16
|
+
done()
|
|
17
|
+
})
|
|
18
|
+
.catch(err => {
|
|
19
|
+
done(err)
|
|
20
|
+
})
|
|
21
|
+
})
|
|
22
|
+
|
|
9
23
|
it('should start with valid parameters',(done) => {
|
|
10
24
|
const client = new tcAbciClient()
|
|
11
25
|
client.Start()
|
|
@@ -20,6 +34,33 @@ describe("TCAbciClient TESTS", () => {
|
|
|
20
34
|
})
|
|
21
35
|
})
|
|
22
36
|
|
|
37
|
+
it('should reconnect with start and valid parameters',(done) => {
|
|
38
|
+
const client = new tcAbciClient()
|
|
39
|
+
client.Start()
|
|
40
|
+
.then(() => {
|
|
41
|
+
const { connected, subscribed } = client.Status()
|
|
42
|
+
unitJS.assert.equal(connected, true)
|
|
43
|
+
unitJS.assert.equal(subscribed, false)
|
|
44
|
+
|
|
45
|
+
client.Disconnect(1003)
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
const { connected: c2, subscribed: b2} = client.Status()
|
|
48
|
+
unitJS.assert.equal(c2, false)
|
|
49
|
+
unitJS.assert.equal(b2, false)
|
|
50
|
+
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
const { connected, subscribed } = client.Status()
|
|
53
|
+
unitJS.assert.equal(connected, true)
|
|
54
|
+
unitJS.assert.equal(subscribed, false)
|
|
55
|
+
done()
|
|
56
|
+
}, 3100)
|
|
57
|
+
}, 1000)
|
|
58
|
+
})
|
|
59
|
+
.catch(err => {
|
|
60
|
+
done(err)
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
|
23
64
|
it('should subscribe with valid parameters',(done) => {
|
|
24
65
|
const client = new tcAbciClient()
|
|
25
66
|
client.Start()
|
|
@@ -121,7 +162,8 @@ describe("TCAbciClient TESTS", () => {
|
|
|
121
162
|
done()
|
|
122
163
|
})
|
|
123
164
|
.catch(err => {
|
|
124
|
-
|
|
165
|
+
unitJS.assert.equal(TRANSACTION_NOT_BROADCAST, err)
|
|
166
|
+
done()
|
|
125
167
|
})
|
|
126
168
|
})
|
|
127
169
|
|