@apibara/protocol 0.4.2 → 0.4.4
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/dist/client.d.ts +1 -1
- package/dist/client.js +16 -4
- package/dist/client.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +27 -7
package/dist/client.d.ts
CHANGED
package/dist/client.js
CHANGED
|
@@ -7,6 +7,8 @@ const request_1 = require("./request");
|
|
|
7
7
|
var grpc_js_2 = require("@grpc/grpc-js");
|
|
8
8
|
Object.defineProperty(exports, "ChannelCredentials", { enumerable: true, get: function () { return grpc_js_2.ChannelCredentials; } });
|
|
9
9
|
const StreamService = proto_1.v1alpha2.protoDescriptor.apibara.node.v1alpha2.Stream;
|
|
10
|
+
// Server produces an heartbeat every 30 seconds, so we use 45 seconds as a timeout.
|
|
11
|
+
const MESSAGE_TIMEOUT_MS = 45000;
|
|
10
12
|
/**
|
|
11
13
|
* A client to configure and stream data.
|
|
12
14
|
*/
|
|
@@ -31,8 +33,8 @@ class StreamClient {
|
|
|
31
33
|
* ```
|
|
32
34
|
*/
|
|
33
35
|
constructor({ url, credentials, clientOptions, token, onReconnect }) {
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
+
const credentialsWithMetadata = credentials ??
|
|
37
|
+
grpc_js_1.ChannelCredentials.createSsl().compose(grpc_js_1.CallCredentials.createFromMetadataGenerator(createMetadataGenerator(token)));
|
|
36
38
|
this.inner = new StreamService(url, credentialsWithMetadata, {
|
|
37
39
|
'grpc.keepalive_timeout_ms': 3600000,
|
|
38
40
|
...clientOptions,
|
|
@@ -55,13 +57,22 @@ class StreamClient {
|
|
|
55
57
|
while (true) {
|
|
56
58
|
let retryCount = 1;
|
|
57
59
|
let cursor = null;
|
|
60
|
+
let clock;
|
|
58
61
|
try {
|
|
59
62
|
// this check is to make ts happy
|
|
60
63
|
if (!this.stream) {
|
|
61
64
|
throw new Error('Stream disconnected unexpectedly');
|
|
62
65
|
}
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
const streamIter = this.stream[Symbol.asyncIterator]();
|
|
67
|
+
while (true) {
|
|
68
|
+
const timeout = new Promise((_, reject) => {
|
|
69
|
+
clock = setTimeout(() => {
|
|
70
|
+
reject(new Error('Stream timed out'));
|
|
71
|
+
}, MESSAGE_TIMEOUT_MS);
|
|
72
|
+
});
|
|
73
|
+
const message = (await Promise.race([streamIter.next(), timeout]));
|
|
74
|
+
const messageTyped = message.value;
|
|
75
|
+
clearTimeout(clock);
|
|
65
76
|
// only return messages if they are with the most recently configured stream
|
|
66
77
|
if (messageTyped.streamId?.toString() == this.stream_id.toString()) {
|
|
67
78
|
// reset retry count on new message
|
|
@@ -78,6 +89,7 @@ class StreamClient {
|
|
|
78
89
|
}
|
|
79
90
|
}
|
|
80
91
|
catch (err) {
|
|
92
|
+
clearTimeout(clock);
|
|
81
93
|
const isGrpcError = err.hasOwnProperty('code') &&
|
|
82
94
|
err.hasOwnProperty('details') &&
|
|
83
95
|
err.hasOwnProperty('metadata');
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAAA,2CAOsB;AAEtB,mCAAkC;AAClC,uCAA6C;AAE7C,yCAAgE;AAAvD,6GAAA,kBAAkB,OAAA;AAE3B,MAAM,aAAa,GAAG,gBAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -14,6 +14,9 @@ export { ChannelCredentials, StatusObject } from '@grpc/grpc-js'
|
|
|
14
14
|
|
|
15
15
|
const StreamService = v1alpha2.protoDescriptor.apibara.node.v1alpha2.Stream
|
|
16
16
|
|
|
17
|
+
// Server produces an heartbeat every 30 seconds, so we use 45 seconds as a timeout.
|
|
18
|
+
const MESSAGE_TIMEOUT_MS = 45_000
|
|
19
|
+
|
|
17
20
|
export type DataStream = ClientDuplexStream<
|
|
18
21
|
v1alpha2.IStreamDataRequest,
|
|
19
22
|
v1alpha2.IStreamDataResponse
|
|
@@ -74,7 +77,7 @@ export type StreamClientArgs = {
|
|
|
74
77
|
url: string
|
|
75
78
|
|
|
76
79
|
/**
|
|
77
|
-
* Grpc credentials.
|
|
80
|
+
* Override Grpc credentials.
|
|
78
81
|
*
|
|
79
82
|
* Use `ChannelCredentials.createInsecure()` to disable SSL.
|
|
80
83
|
*/
|
|
@@ -128,10 +131,12 @@ export class StreamClient {
|
|
|
128
131
|
* ```
|
|
129
132
|
*/
|
|
130
133
|
constructor({ url, credentials, clientOptions, token, onReconnect }: StreamClientArgs) {
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
134
|
+
const credentialsWithMetadata =
|
|
135
|
+
credentials ??
|
|
136
|
+
ChannelCredentials.createSsl().compose(
|
|
137
|
+
CallCredentials.createFromMetadataGenerator(createMetadataGenerator(token))
|
|
138
|
+
)
|
|
139
|
+
|
|
135
140
|
this.inner = new StreamService(url, credentialsWithMetadata, {
|
|
136
141
|
'grpc.keepalive_timeout_ms': 3_600_000,
|
|
137
142
|
...clientOptions,
|
|
@@ -157,14 +162,27 @@ export class StreamClient {
|
|
|
157
162
|
while (true) {
|
|
158
163
|
let retryCount = 1
|
|
159
164
|
let cursor = null
|
|
165
|
+
let clock
|
|
160
166
|
try {
|
|
161
167
|
// this check is to make ts happy
|
|
162
168
|
if (!this.stream) {
|
|
163
169
|
throw new Error('Stream disconnected unexpectedly')
|
|
164
170
|
}
|
|
165
171
|
|
|
166
|
-
|
|
167
|
-
|
|
172
|
+
const streamIter = this.stream[Symbol.asyncIterator]()
|
|
173
|
+
while (true) {
|
|
174
|
+
const timeout = new Promise((_, reject) => {
|
|
175
|
+
clock = setTimeout(() => {
|
|
176
|
+
reject(new Error('Stream timed out'))
|
|
177
|
+
}, MESSAGE_TIMEOUT_MS)
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
const message = <IteratorResult<v1alpha2.IStreamDataResponse>>(
|
|
181
|
+
await Promise.race([streamIter.next(), timeout])
|
|
182
|
+
)
|
|
183
|
+
const messageTyped = message.value as v1alpha2.IStreamDataResponse
|
|
184
|
+
|
|
185
|
+
clearTimeout(clock)
|
|
168
186
|
|
|
169
187
|
// only return messages if they are with the most recently configured stream
|
|
170
188
|
if (messageTyped.streamId?.toString() == this.stream_id.toString()) {
|
|
@@ -182,6 +200,8 @@ export class StreamClient {
|
|
|
182
200
|
}
|
|
183
201
|
}
|
|
184
202
|
} catch (err: any) {
|
|
203
|
+
clearTimeout(clock)
|
|
204
|
+
|
|
185
205
|
const isGrpcError =
|
|
186
206
|
err.hasOwnProperty('code') &&
|
|
187
207
|
err.hasOwnProperty('details') &&
|