envio 2.32.8 → 2.32.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "envio",
3
- "version": "v2.32.8",
3
+ "version": "v2.32.11",
4
4
  "description": "A latency and sync speed optimized, developer friendly blockchain data indexer.",
5
5
  "bin": "./bin.js",
6
6
  "main": "./index.js",
@@ -25,10 +25,10 @@
25
25
  },
26
26
  "homepage": "https://envio.dev",
27
27
  "optionalDependencies": {
28
- "envio-linux-x64": "v2.32.8",
29
- "envio-linux-arm64": "v2.32.8",
30
- "envio-darwin-x64": "v2.32.8",
31
- "envio-darwin-arm64": "v2.32.8"
28
+ "envio-linux-x64": "v2.32.11",
29
+ "envio-linux-arm64": "v2.32.11",
30
+ "envio-darwin-x64": "v2.32.11",
31
+ "envio-darwin-arm64": "v2.32.11"
32
32
  },
33
33
  "dependencies": {
34
34
  "@elastic/ecs-pino-format": "1.4.0",
@@ -104,9 +104,11 @@ module GetLogs = {
104
104
  // Remap "type" -> "kind" on the transaction object at runtime before validation.
105
105
  // The latest hypersync client renamed "kind" to "type" but v2 consumers expect "kind".
106
106
  let transaction: Js.Dict.t<unknown> = event.transaction->Utils.magic
107
- switch transaction->Js.Dict.get("type") {
108
- | Some(v) => transaction->Js.Dict.set("kind", v)
109
- | None => ()
107
+ if transaction->Utils.magic {
108
+ switch transaction->Js.Dict.get("type") {
109
+ | Some(v) => transaction->Js.Dict.set("kind", v)
110
+ | None => ()
111
+ }
110
112
  }
111
113
 
112
114
  let missingParams = []
@@ -197,7 +199,7 @@ module GetLogs = {
197
199
  }
198
200
 
199
201
  module BlockData = {
200
- let makeRequestBody = (~fromBlock, ~toBlock): HyperSyncJsonApi.QueryTypes.postQueryBody => {
202
+ let makeRequestBody = (~fromBlock, ~toBlock): HyperSyncClient.QueryTypes.query => {
201
203
  fromBlock,
202
204
  toBlockExclusive: toBlock + 1,
203
205
  fieldSelection: {
@@ -206,51 +208,44 @@ module BlockData = {
206
208
  includeAllBlocks: true,
207
209
  }
208
210
 
209
- let convertResponse = (res: HyperSyncJsonApi.ResponseTypes.queryResponse): queryResponse<
211
+ let convertResponse = (res: HyperSyncClient.queryResponse): queryResponse<
210
212
  array<ReorgDetection.blockDataWithTimestamp>,
211
213
  > => {
212
- res.data
213
- ->Array.flatMap(item => {
214
- item.blocks->Option.mapWithDefault([], blocks => {
215
- blocks->Array.map(
216
- block => {
217
- switch block {
218
- | {number: blockNumber, timestamp, hash: blockHash} =>
219
- let blockTimestamp = timestamp->BigInt.toInt->Option.getExn
220
- Ok(
221
- (
222
- {
223
- blockTimestamp,
224
- blockNumber,
225
- blockHash,
226
- }: ReorgDetection.blockDataWithTimestamp
227
- ),
228
- )
229
- | _ =>
230
- let missingParams =
231
- [
232
- block.number->Utils.Option.mapNone("block.number"),
233
- block.timestamp->Utils.Option.mapNone("block.timestamp"),
234
- block.hash->Utils.Option.mapNone("block.hash"),
235
- ]->Array.keepMap(p => p)
236
-
237
- Error(
238
- UnexpectedMissingParams({
239
- queryName: "query block data HyperSync",
240
- missingParams,
241
- }),
242
- )
243
- }
244
- },
214
+ res.data.blocks
215
+ ->Option.getWithDefault([])
216
+ ->Array.map(block => {
217
+ switch block {
218
+ | {number: blockNumber, timestamp: blockTimestamp, hash: blockHash} =>
219
+ Ok(
220
+ (
221
+ {
222
+ blockTimestamp,
223
+ blockNumber,
224
+ blockHash,
225
+ }: ReorgDetection.blockDataWithTimestamp
226
+ ),
245
227
  )
246
- })
228
+ | _ =>
229
+ let missingParams =
230
+ [
231
+ block.number->Utils.Option.mapNone("block.number"),
232
+ block.timestamp->Utils.Option.mapNone("block.timestamp"),
233
+ block.hash->Utils.Option.mapNone("block.hash"),
234
+ ]->Array.keepMap(p => p)
235
+
236
+ Error(
237
+ UnexpectedMissingParams({
238
+ queryName: "query block data HyperSync",
239
+ missingParams,
240
+ }),
241
+ )
242
+ }
247
243
  })
248
244
  ->Utils.Array.transposeResults
249
245
  }
250
246
 
251
247
  let rec queryBlockData = async (
252
- ~serverUrl,
253
- ~apiToken,
248
+ ~client: HyperSyncClient.t,
254
249
  ~fromBlock,
255
250
  ~toBlock,
256
251
  ~logger,
@@ -266,38 +261,28 @@ module BlockData = {
266
261
  },
267
262
  )
268
263
 
269
- let maybeSuccessfulRes = switch await Time.retryAsyncWithExponentialBackOff(() =>
270
- HyperSyncJsonApi.queryRoute->Rest.fetch(
271
- {
272
- "query": body,
273
- "token": apiToken,
274
- },
275
- ~client=Rest.client(serverUrl),
276
- )
277
- , ~logger) {
264
+ let maybeSuccessfulRes = switch await client.get(~query=body) {
278
265
  | exception _ => None
279
266
  | res if res.nextBlock <= fromBlock => None
280
267
  | res => Some(res)
281
268
  }
282
269
 
283
- // If the block is not found, retry the query. This can occur since replicas of hypersync might not hack caught up yet
270
+ // If the block is not found, retry the query. This can occur since replicas of hypersync might not have caught up yet
284
271
  switch maybeSuccessfulRes {
285
272
  | None => {
286
- let logger = Logging.createChild(~params={"url": serverUrl})
287
273
  let delayMilliseconds = 100
288
274
  logger->Logging.childInfo(
289
275
  `Block #${fromBlock->Int.toString} not found in HyperSync. HyperSync has multiple instances and it's possible that they drift independently slightly from the head. Indexing should continue correctly after retrying the query in ${delayMilliseconds->Int.toString}ms.`,
290
276
  )
291
277
  await Time.resolvePromiseAfterDelay(~delayMilliseconds)
292
- await queryBlockData(~serverUrl, ~apiToken, ~fromBlock, ~toBlock, ~logger)
278
+ await queryBlockData(~client, ~fromBlock, ~toBlock, ~logger)
293
279
  }
294
280
  | Some(res) =>
295
281
  switch res->convertResponse {
296
282
  | Error(_) as err => err
297
283
  | Ok(datas) if res.nextBlock <= toBlock => {
298
284
  let restRes = await queryBlockData(
299
- ~serverUrl,
300
- ~apiToken,
285
+ ~client,
301
286
  ~fromBlock=res.nextBlock,
302
287
  ~toBlock,
303
288
  ~logger,
@@ -309,7 +294,7 @@ module BlockData = {
309
294
  }
310
295
  }
311
296
 
312
- let queryBlockDataMulti = async (~serverUrl, ~apiToken, ~blockNumbers, ~logger) => {
297
+ let queryBlockDataMulti = async (~client, ~blockNumbers, ~logger) => {
313
298
  switch blockNumbers->Array.get(0) {
314
299
  | None => Ok([])
315
300
  | Some(firstBlock) => {
@@ -334,8 +319,7 @@ module BlockData = {
334
319
  let res = await queryBlockData(
335
320
  ~fromBlock=fromBlock.contents,
336
321
  ~toBlock=toBlock.contents,
337
- ~serverUrl,
338
- ~apiToken,
322
+ ~client,
339
323
  ~logger,
340
324
  )
341
325
  let filtered = res->Result.map(datas => {
@@ -354,10 +338,9 @@ module BlockData = {
354
338
  }
355
339
  }
356
340
 
357
- let queryBlockData = (~serverUrl, ~apiToken, ~blockNumber, ~logger) =>
341
+ let queryBlockData = (~client, ~blockNumber, ~logger) =>
358
342
  BlockData.queryBlockData(
359
- ~serverUrl,
360
- ~apiToken,
343
+ ~client,
361
344
  ~fromBlock=blockNumber,
362
345
  ~toBlock=blockNumber,
363
346
  ~logger,
@@ -1,10 +1,8 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
  'use strict';
3
3
 
4
- var Rest = require("../vendored/Rest.res.js");
5
4
  var Time = require("../Time.res.js");
6
5
  var Utils = require("../Utils.res.js");
7
- var $$BigInt = require("../bindings/BigInt.res.js");
8
6
  var Js_exn = require("rescript/lib/js/js_exn.js");
9
7
  var Js_dict = require("rescript/lib/js/js_dict.js");
10
8
  var Logging = require("../Logging.res.js");
@@ -14,7 +12,6 @@ var Belt_Result = require("rescript/lib/js/belt_Result.js");
14
12
  var Caml_option = require("rescript/lib/js/caml_option.js");
15
13
  var Caml_exceptions = require("rescript/lib/js/caml_exceptions.js");
16
14
  var HyperSyncClient = require("./HyperSyncClient.res.js");
17
- var HyperSyncJsonApi = require("./HyperSyncJsonApi.res.js");
18
15
 
19
16
  var fieldNames = [
20
17
  "address",
@@ -77,9 +74,12 @@ async function query(client, fromBlock, toBlock, logSelections, fieldSelection,
77
74
  }
78
75
  var items = Belt_Array.map(res.data, (function (item) {
79
76
  var transaction = item.transaction;
80
- var v = Js_dict.get(transaction, "type");
81
- if (v !== undefined) {
82
- transaction["kind"] = Caml_option.valFromOption(v);
77
+ if (transaction) {
78
+ var v = Js_dict.get(transaction, "type");
79
+ if (v !== undefined) {
80
+ transaction["kind"] = Caml_option.valFromOption(v);
81
+ }
82
+
83
83
  }
84
84
  var missingParams = [];
85
85
  var returnedObj = item.log;
@@ -174,12 +174,12 @@ async function query(client, fromBlock, toBlock, logSelections, fieldSelection,
174
174
  function makeRequestBody$1(fromBlock, toBlock) {
175
175
  return {
176
176
  fromBlock: fromBlock,
177
- toBlockExclusive: toBlock + 1 | 0,
177
+ toBlock: toBlock + 1 | 0,
178
178
  fieldSelection: {
179
179
  block: [
180
- "number",
181
- "hash",
182
- "timestamp"
180
+ "Number",
181
+ "Hash",
182
+ "Timestamp"
183
183
  ]
184
184
  },
185
185
  includeAllBlocks: true
@@ -187,52 +187,47 @@ function makeRequestBody$1(fromBlock, toBlock) {
187
187
  }
188
188
 
189
189
  function convertResponse(res) {
190
- return Utils.$$Array.transposeResults(Belt_Array.flatMap(res.data, (function (item) {
191
- return Belt_Option.mapWithDefault(item.blocks, [], (function (blocks) {
192
- return Belt_Array.map(blocks, (function (block) {
193
- var blockNumber = block.number;
194
- if (blockNumber !== undefined) {
195
- var blockHash = block.hash;
196
- if (blockHash !== undefined) {
197
- var timestamp = block.timestamp;
198
- if (timestamp !== undefined) {
199
- var blockTimestamp = Belt_Option.getExn($$BigInt.toInt(timestamp));
200
- return {
201
- TAG: "Ok",
202
- _0: {
203
- blockHash: blockHash,
204
- blockNumber: blockNumber,
205
- blockTimestamp: blockTimestamp
206
- }
207
- };
208
- }
209
-
210
- }
211
-
212
- }
213
- var missingParams = Belt_Array.keepMap([
214
- Utils.$$Option.mapNone(block.number, "block.number"),
215
- Utils.$$Option.mapNone(block.timestamp, "block.timestamp"),
216
- Utils.$$Option.mapNone(block.hash, "block.hash")
217
- ], (function (p) {
218
- return p;
219
- }));
220
- return {
221
- TAG: "Error",
222
- _0: {
223
- TAG: "UnexpectedMissingParams",
224
- _0: {
225
- queryName: "query block data HyperSync",
226
- missingParams: missingParams
227
- }
228
- }
229
- };
230
- }));
231
- }));
190
+ return Utils.$$Array.transposeResults(Belt_Array.map(Belt_Option.getWithDefault(res.data.blocks, []), (function (block) {
191
+ var blockNumber = block.number;
192
+ if (blockNumber !== undefined) {
193
+ var blockHash = block.hash;
194
+ if (blockHash !== undefined) {
195
+ var blockTimestamp = block.timestamp;
196
+ if (blockTimestamp !== undefined) {
197
+ return {
198
+ TAG: "Ok",
199
+ _0: {
200
+ blockHash: blockHash,
201
+ blockNumber: blockNumber,
202
+ blockTimestamp: blockTimestamp
203
+ }
204
+ };
205
+ }
206
+
207
+ }
208
+
209
+ }
210
+ var missingParams = Belt_Array.keepMap([
211
+ Utils.$$Option.mapNone(block.number, "block.number"),
212
+ Utils.$$Option.mapNone(block.timestamp, "block.timestamp"),
213
+ Utils.$$Option.mapNone(block.hash, "block.hash")
214
+ ], (function (p) {
215
+ return p;
216
+ }));
217
+ return {
218
+ TAG: "Error",
219
+ _0: {
220
+ TAG: "UnexpectedMissingParams",
221
+ _0: {
222
+ queryName: "query block data HyperSync",
223
+ missingParams: missingParams
224
+ }
225
+ }
226
+ };
232
227
  })));
233
228
  }
234
229
 
235
- async function queryBlockData(serverUrl, apiToken, fromBlock, toBlock, logger) {
230
+ async function queryBlockData(client, fromBlock, toBlock, logger) {
236
231
  var body = makeRequestBody$1(fromBlock, toBlock);
237
232
  var logger$1 = Logging.createChildFrom(logger, {
238
233
  logType: "HyperSync get block hash query",
@@ -243,12 +238,7 @@ async function queryBlockData(serverUrl, apiToken, fromBlock, toBlock, logger) {
243
238
  var exit = 0;
244
239
  var res;
245
240
  try {
246
- res = await Time.retryAsyncWithExponentialBackOff(undefined, undefined, undefined, undefined, logger$1, (function () {
247
- return Rest.$$fetch(HyperSyncJsonApi.queryRoute, {
248
- query: body,
249
- token: apiToken
250
- }, Rest.client(serverUrl, undefined));
251
- }));
241
+ res = await client.get(body);
252
242
  exit = 1;
253
243
  }
254
244
  catch (exn){
@@ -266,20 +256,17 @@ async function queryBlockData(serverUrl, apiToken, fromBlock, toBlock, logger) {
266
256
  return err;
267
257
  }
268
258
  var datas = err._0;
269
- var restRes = await queryBlockData(serverUrl, apiToken, maybeSuccessfulRes.nextBlock, toBlock, logger$1);
259
+ var restRes = await queryBlockData(client, maybeSuccessfulRes.nextBlock, toBlock, logger$1);
270
260
  return Belt_Result.map(restRes, (function (rest) {
271
261
  return Belt_Array.concat(datas, rest);
272
262
  }));
273
263
  }
274
- var logger$2 = Logging.createChild({
275
- url: serverUrl
276
- });
277
- Logging.childInfo(logger$2, "Block #" + String(fromBlock) + " not found in HyperSync. HyperSync has multiple instances and it's possible that they drift independently slightly from the head. Indexing should continue correctly after retrying the query in " + String(100) + "ms.");
264
+ Logging.childInfo(logger$1, "Block #" + String(fromBlock) + " not found in HyperSync. HyperSync has multiple instances and it's possible that they drift independently slightly from the head. Indexing should continue correctly after retrying the query in " + String(100) + "ms.");
278
265
  await Time.resolvePromiseAfterDelay(100);
279
- return await queryBlockData(serverUrl, apiToken, fromBlock, toBlock, logger$2);
266
+ return await queryBlockData(client, fromBlock, toBlock, logger$1);
280
267
  }
281
268
 
282
- async function queryBlockDataMulti(serverUrl, apiToken, blockNumbers, logger) {
269
+ async function queryBlockDataMulti(client, blockNumbers, logger) {
283
270
  var firstBlock = Belt_Array.get(blockNumbers, 0);
284
271
  if (firstBlock === undefined) {
285
272
  return {
@@ -303,7 +290,7 @@ async function queryBlockDataMulti(serverUrl, apiToken, blockNumbers, logger) {
303
290
  if ((toBlock - fromBlock | 0) > 1000) {
304
291
  Js_exn.raiseError("Invalid block data request. Range of block numbers is too large. Max range is 1000. Requested range: " + String(fromBlock) + "-" + String(toBlock));
305
292
  }
306
- var res = await queryBlockData(serverUrl, apiToken, fromBlock, toBlock, logger);
293
+ var res = await queryBlockData(client, fromBlock, toBlock, logger);
307
294
  var filtered = Belt_Result.map(res, (function (datas) {
308
295
  return Belt_Array.keep(datas, (function (data) {
309
296
  return set.delete(data.blockNumber);
@@ -315,8 +302,8 @@ async function queryBlockDataMulti(serverUrl, apiToken, blockNumbers, logger) {
315
302
  return filtered;
316
303
  }
317
304
 
318
- function queryBlockData$1(serverUrl, apiToken, blockNumber, logger) {
319
- return queryBlockData(serverUrl, apiToken, blockNumber, blockNumber, logger).then(function (res) {
305
+ function queryBlockData$1(client, blockNumber, logger) {
306
+ return queryBlockData(client, blockNumber, blockNumber, logger).then(function (res) {
320
307
  return Belt_Result.map(res, (function (res) {
321
308
  return Belt_Array.get(res, 0);
322
309
  }));
@@ -336,4 +323,4 @@ exports.GetLogs = GetLogs;
336
323
  exports.queryBlockData = queryBlockData$1;
337
324
  exports.queryBlockDataMulti = queryBlockDataMulti;
338
325
  exports.mapExn = mapExn;
339
- /* Rest Not a pure module */
326
+ /* Time Not a pure module */
@@ -53,15 +53,13 @@ module GetLogs: {
53
53
  }
54
54
 
55
55
  let queryBlockData: (
56
- ~serverUrl: string,
57
- ~apiToken: string,
56
+ ~client: HyperSyncClient.t,
58
57
  ~blockNumber: int,
59
58
  ~logger: Pino.t,
60
59
  ) => promise<queryResponse<option<ReorgDetection.blockDataWithTimestamp>>>
61
60
 
62
61
  let queryBlockDataMulti: (
63
- ~serverUrl: string,
64
- ~apiToken: string,
62
+ ~client: HyperSyncClient.t,
65
63
  ~blockNumbers: array<int>,
66
64
  ~logger: Pino.t,
67
65
  ) => promise<queryResponse<array<ReorgDetection.blockDataWithTimestamp>>>
@@ -284,6 +284,12 @@ module QueryTypes = {
284
284
  * JoinNothing: join nothing.
285
285
  */
286
286
  joinMode?: joinMode,
287
+ /**
288
+ * Whether to include all blocks regardless of if they are related to a returned transaction or log. Normally
289
+ * the server will return only the blocks that are related to the transaction or logs in the response. But if this
290
+ * is set to true, the server will return data for all blocks in the requested range [from_block, to_block).
291
+ */
292
+ includeAllBlocks?: bool,
287
293
  }
288
294
  }
289
295
 
@@ -456,10 +462,23 @@ type eventResponse = ResponseTypes.eventResponse
456
462
 
457
463
  //Todo, add bindings for these types
458
464
  type streamConfig
459
- type queryResponse
460
465
  type queryResponseStream
461
466
  type eventStream
462
467
 
468
+ type queryResponseData = {
469
+ blocks: option<array<ResponseTypes.block>>,
470
+ transactions: option<array<ResponseTypes.transaction>>,
471
+ logs: option<array<ResponseTypes.log>>,
472
+ }
473
+
474
+ type queryResponse = {
475
+ archiveHeight: option<int>,
476
+ nextBlock: int,
477
+ totalExecutionTime: int,
478
+ data: queryResponseData,
479
+ rollbackGuard: option<ResponseTypes.rollbackGuard>,
480
+ }
481
+
463
482
  @tag("type")
464
483
  type heightStreamEvent =
465
484
  | Height({height: int})
@@ -520,6 +539,16 @@ let make = (
520
539
  )
521
540
  }
522
541
 
542
+ type logLevel = [#trace | #debug | #info | #warn | #error]
543
+ let logLevelSchema: S.t<logLevel> = S.enum([#trace, #debug, #info, #warn, #error])
544
+
545
+ /**
546
+ * Set the log level for the underlying Rust logger in hypersync-client.
547
+ * Must be called before creating any HypersyncClient.
548
+ */
549
+ @module("@envio-dev/hypersync-client")
550
+ external setLogLevel: logLevel => unit = "setLogLevel"
551
+
523
552
  module Decoder = {
524
553
  type rec decodedSolType<'a> = {val: 'a}
525
554
 
@@ -82,6 +82,14 @@ function make(url, apiToken, httpReqTimeoutMillis, maxNumRetries, enableChecksum
82
82
  }, "hyperindex/" + envioVersion);
83
83
  }
84
84
 
85
+ var logLevelSchema = S$RescriptSchema.$$enum([
86
+ "trace",
87
+ "debug",
88
+ "info",
89
+ "warn",
90
+ "error"
91
+ ]);
92
+
85
93
  function toUnderlying(_d) {
86
94
  while(true) {
87
95
  var d = _d;
@@ -117,5 +125,6 @@ exports.QueryTypes = QueryTypes;
117
125
  exports.ResponseTypes = ResponseTypes;
118
126
  exports.HeightStream = HeightStream;
119
127
  exports.make = make;
128
+ exports.logLevelSchema = logLevelSchema;
120
129
  exports.Decoder = Decoder;
121
130
  /* serializationFormatSchema Not a pure module */
@@ -369,8 +369,7 @@ let make = (
369
369
  //If there were no logs at all in the current page query then fetch the
370
370
  //timestamp of the heighest block accounted for
371
371
  HyperSync.queryBlockData(
372
- ~serverUrl=endpointUrl,
373
- ~apiToken,
372
+ ~client,
374
373
  ~blockNumber=heighestBlockQueried,
375
374
  ~logger,
376
375
  )->Promise.thenResolve(res =>
@@ -548,8 +547,7 @@ let make = (
548
547
 
549
548
  let getBlockHashes = (~blockNumbers, ~logger) =>
550
549
  HyperSync.queryBlockDataMulti(
551
- ~serverUrl=endpointUrl,
552
- ~apiToken,
550
+ ~client,
553
551
  ~blockNumbers,
554
552
  ~logger,
555
553
  )->Promise.thenResolve(HyperSync.mapExn)
@@ -280,7 +280,7 @@ function make(param) {
280
280
  exit = 1;
281
281
  }
282
282
  if (exit === 1) {
283
- lastBlockQueriedPromise = HyperSync.queryBlockData(endpointUrl, apiToken, heighestBlockQueried, logger).then(function (res) {
283
+ lastBlockQueriedPromise = HyperSync.queryBlockData(client, heighestBlockQueried, logger).then(function (res) {
284
284
  if (res.TAG !== "Ok") {
285
285
  return mkLogAndRaise("Failed to query blockData for block " + String(heighestBlockQueried), HyperSync.queryErrorToMsq(res._0));
286
286
  }
@@ -390,7 +390,7 @@ function make(param) {
390
390
  };
391
391
  };
392
392
  var getBlockHashes = function (blockNumbers, logger) {
393
- return HyperSync.queryBlockDataMulti(endpointUrl, apiToken, blockNumbers, logger).then(HyperSync.mapExn);
393
+ return HyperSync.queryBlockDataMulti(client, blockNumbers, logger).then(HyperSync.mapExn);
394
394
  };
395
395
  var jsonApiClient = Rest.client(endpointUrl, undefined);
396
396
  return {