envio 2.28.0 → 2.29.0-alpha.1

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.
@@ -5,6 +5,7 @@ var Caml = require("rescript/lib/js/caml.js");
5
5
  var Utils = require("./Utils.res.js");
6
6
  var Js_exn = require("rescript/lib/js/js_exn.js");
7
7
  var Js_dict = require("rescript/lib/js/js_dict.js");
8
+ var Js_math = require("rescript/lib/js/js_math.js");
8
9
  var Logging = require("./Logging.res.js");
9
10
  var Belt_Int = require("rescript/lib/js/belt_Int.js");
10
11
  var Caml_obj = require("rescript/lib/js/caml_obj.js");
@@ -22,7 +23,6 @@ function copy(fetchState) {
22
23
  isFetchingAtHead: fetchState.isFetchingAtHead,
23
24
  endBlock: fetchState.endBlock,
24
25
  maxAddrInPartition: fetchState.maxAddrInPartition,
25
- firstEventBlockNumber: fetchState.firstEventBlockNumber,
26
26
  normalSelection: fetchState.normalSelection,
27
27
  indexingContracts: fetchState.indexingContracts,
28
28
  contractConfigs: fetchState.contractConfigs,
@@ -30,7 +30,8 @@ function copy(fetchState) {
30
30
  chainId: fetchState.chainId,
31
31
  latestFullyFetchedBlock: fetchState.latestFullyFetchedBlock,
32
32
  blockLag: fetchState.blockLag,
33
- queue: fetchState.queue.slice(0)
33
+ queue: fetchState.queue.slice(0),
34
+ onBlockConfigs: fetchState.onBlockConfigs
34
35
  };
35
36
  }
36
37
 
@@ -137,14 +138,12 @@ function updateInternal(fetchState, partitionsOpt, nextPartitionIndexOpt, indexi
137
138
  Prometheus.IndexingPartitions.set(partitions.length, fetchState.chainId);
138
139
  Prometheus.IndexingBufferSize.set(bufferSize, fetchState.chainId);
139
140
  Prometheus.IndexingBufferBlockNumber.set(latestFullyFetchedBlock$1.blockNumber, fetchState.chainId);
140
- var item = Utils.$$Array.last(queue);
141
141
  return {
142
142
  partitions: partitions,
143
143
  nextPartitionIndex: nextPartitionIndex,
144
144
  isFetchingAtHead: isFetchingAtHead,
145
145
  endBlock: fetchState.endBlock,
146
146
  maxAddrInPartition: fetchState.maxAddrInPartition,
147
- firstEventBlockNumber: item !== undefined ? Utils.$$Math.minOptInt(fetchState.firstEventBlockNumber, item.blockNumber) : fetchState.firstEventBlockNumber,
148
147
  normalSelection: fetchState.normalSelection,
149
148
  indexingContracts: indexingContracts,
150
149
  contractConfigs: fetchState.contractConfigs,
@@ -152,7 +151,8 @@ function updateInternal(fetchState, partitionsOpt, nextPartitionIndexOpt, indexi
152
151
  chainId: fetchState.chainId,
153
152
  latestFullyFetchedBlock: latestFullyFetchedBlock$1,
154
153
  blockLag: blockLag,
155
- queue: queue
154
+ queue: queue,
155
+ onBlockConfigs: fetchState.onBlockConfigs
156
156
  };
157
157
  }
158
158
 
@@ -409,7 +409,35 @@ function handleQueryResult(fetchState, query, latestFetchedBlock, newItems, curr
409
409
  };
410
410
  }
411
411
  return Belt_Result.map(tmp, (function (partitions) {
412
- return updateInternal(fetchState, partitions, undefined, undefined, undefined, currentBlockHeight, Belt_Array.concat(fetchState.queue, newItems).sort(compareBufferItem), undefined);
412
+ var newQueue = Belt_Array.concat(fetchState.queue, newItems);
413
+ var onBlockConfigs = fetchState.onBlockConfigs;
414
+ if (onBlockConfigs !== undefined) {
415
+ var prevLatestFetchedBlockNumber = fetchState.latestFullyFetchedBlock.blockNumber;
416
+ var nextLatestFullyFetchedBlockNumber = latestFetchedBlock.blockNumber;
417
+ for(var idx = 0 ,idx_finish = partitions.length; idx < idx_finish; ++idx){
418
+ var p = partitions[idx];
419
+ if (nextLatestFullyFetchedBlockNumber > p.latestFetchedBlock.blockNumber) {
420
+ nextLatestFullyFetchedBlockNumber = p.latestFetchedBlock.blockNumber;
421
+ }
422
+
423
+ }
424
+ var nextLatestFullyFetchedBlockNumber$1 = nextLatestFullyFetchedBlockNumber;
425
+ if (nextLatestFullyFetchedBlockNumber$1 > prevLatestFetchedBlockNumber) {
426
+ for(var blockNumber = prevLatestFetchedBlockNumber + 1 | 0; blockNumber <= nextLatestFullyFetchedBlockNumber$1; ++blockNumber){
427
+ for(var configIdx = 0 ,configIdx_finish = onBlockConfigs.length; configIdx < configIdx_finish; ++configIdx){
428
+ var onBlockConfig = onBlockConfigs[configIdx];
429
+ newQueue.push({
430
+ kind: 1,
431
+ onBlockConfig: onBlockConfig,
432
+ blockNumber: blockNumber,
433
+ logIndex: 16777216
434
+ });
435
+ }
436
+ }
437
+ }
438
+
439
+ }
440
+ return updateInternal(fetchState, partitions, undefined, undefined, undefined, currentBlockHeight, newQueue.sort(compareBufferItem), undefined);
413
441
  }));
414
442
  }
415
443
 
@@ -632,18 +660,6 @@ function getNextQuery(param, concurrencyLimit, targetBufferSize, currentBlockHei
632
660
  }
633
661
  }
634
662
 
635
- function queueItemBlockNumber(queueItem) {
636
- if (queueItem.TAG === "Item") {
637
- return queueItem._0.item.blockNumber;
638
- }
639
- var blockNumber = queueItem.latestFetchedBlock.blockNumber;
640
- if (blockNumber === 0) {
641
- return 0;
642
- } else {
643
- return blockNumber + 1 | 0;
644
- }
645
- }
646
-
647
663
  function makeNoItem(param) {
648
664
  return {
649
665
  TAG: "NoItem",
@@ -651,28 +667,6 @@ function makeNoItem(param) {
651
667
  };
652
668
  }
653
669
 
654
- function qItemLt(a, b) {
655
- var aBlockNumber = queueItemBlockNumber(a);
656
- var bBlockNumber = queueItemBlockNumber(b);
657
- if (aBlockNumber < bBlockNumber) {
658
- return true;
659
- } else if (aBlockNumber === bBlockNumber) {
660
- if (a.TAG === "Item") {
661
- if (b.TAG === "Item") {
662
- return a._0.item.logIndex < b._0.item.logIndex;
663
- } else {
664
- return false;
665
- }
666
- } else if (b.TAG === "Item") {
667
- return true;
668
- } else {
669
- return false;
670
- }
671
- } else {
672
- return false;
673
- }
674
- }
675
-
676
670
  function getEarliestEvent(param) {
677
671
  var queue = param.queue;
678
672
  var latestFullyFetchedBlock = param.latestFullyFetchedBlock;
@@ -695,7 +689,7 @@ function getEarliestEvent(param) {
695
689
  }
696
690
  }
697
691
 
698
- function make(startBlock, endBlock, eventConfigs, contracts, maxAddrInPartition, chainId, blockLagOpt) {
692
+ function make(startBlock, endBlock, eventConfigs, contracts, maxAddrInPartition, chainId, onBlockConfigs, blockLagOpt) {
699
693
  var blockLag = blockLagOpt !== undefined ? blockLagOpt : 0;
700
694
  var latestFetchedBlock_blockNumber = startBlock - 1 | 0;
701
695
  var latestFetchedBlock = {
@@ -796,7 +790,6 @@ function make(startBlock, endBlock, eventConfigs, contracts, maxAddrInPartition,
796
790
  isFetchingAtHead: false,
797
791
  endBlock: endBlock,
798
792
  maxAddrInPartition: maxAddrInPartition,
799
- firstEventBlockNumber: undefined,
800
793
  normalSelection: normalSelection,
801
794
  indexingContracts: indexingContracts,
802
795
  contractConfigs: contractConfigs,
@@ -804,7 +797,8 @@ function make(startBlock, endBlock, eventConfigs, contracts, maxAddrInPartition,
804
797
  chainId: chainId,
805
798
  latestFullyFetchedBlock: latestFetchedBlock,
806
799
  blockLag: blockLag,
807
- queue: []
800
+ queue: [],
801
+ onBlockConfigs: onBlockConfigs
808
802
  };
809
803
  }
810
804
 
@@ -818,10 +812,15 @@ function getLatestFullyFetchedBlock(param) {
818
812
 
819
813
  function pruneQueueFromFirstChangeEvent(queue, firstChangeEvent) {
820
814
  return Belt_Array.keep(queue, (function (item) {
821
- return Caml_obj.lessthan([
822
- item.blockNumber,
823
- item.logIndex
824
- ], [
815
+ var tmp;
816
+ tmp = item.kind === 0 ? [
817
+ item.blockNumber,
818
+ item.logIndex
819
+ ] : [
820
+ item.blockNumber,
821
+ item.logIndex
822
+ ];
823
+ return Caml_obj.lessthan(tmp, [
825
824
  firstChangeEvent.blockNumber,
826
825
  firstChangeEvent.logIndex
827
826
  ]);
@@ -956,7 +955,13 @@ function filterAndSortForUnorderedBatch(fetchStates, maxBatchSize) {
956
955
  } else if (match$1) {
957
956
  return 1;
958
957
  }
959
- return Utils.$$Array.lastUnsafe(a.queue).timestamp - Utils.$$Array.lastUnsafe(b.queue).timestamp | 0;
958
+ var match$2 = Utils.$$Array.lastUnsafe(a.queue);
959
+ var match$3 = Utils.$$Array.lastUnsafe(b.queue);
960
+ if (match$2.kind === 0 && match$3.kind === 0) {
961
+ return match$2.timestamp - match$3.timestamp | 0;
962
+ } else {
963
+ return Js_math.random_int(-1, 1);
964
+ }
960
965
  });
961
966
  }
962
967
 
@@ -971,13 +976,22 @@ function getProgressBlockNumber(param) {
971
976
  }
972
977
 
973
978
  function getProgressNextBlockLogIndex(param) {
974
- var item = Utils.$$Array.last(param.queue);
975
- if (item !== undefined && param.latestFullyFetchedBlock.blockNumber >= item.blockNumber && item.logIndex > 0) {
976
- return item.logIndex - 1 | 0;
979
+ var match = Utils.$$Array.last(param.queue);
980
+ if (match === undefined) {
981
+ return ;
982
+ }
983
+ if (match.kind !== 0) {
984
+ return ;
985
+ }
986
+ var logIndex = match.logIndex;
987
+ if (param.latestFullyFetchedBlock.blockNumber >= match.blockNumber && logIndex > 0) {
988
+ return logIndex - 1 | 0;
977
989
  }
978
990
 
979
991
  }
980
992
 
993
+ var blockItemLogIndex = 16777216;
994
+
981
995
  exports.copy = copy;
982
996
  exports.mergeIntoPartition = mergeIntoPartition;
983
997
  exports.checkIsWithinSyncRange = checkIsWithinSyncRange;
@@ -988,6 +1002,7 @@ exports.registerDynamicContracts = registerDynamicContracts;
988
1002
  exports.UnexpectedPartitionNotFound = UnexpectedPartitionNotFound;
989
1003
  exports.UnexpectedMergeQueryResponse = UnexpectedMergeQueryResponse;
990
1004
  exports.compareBufferItem = compareBufferItem;
1005
+ exports.blockItemLogIndex = blockItemLogIndex;
991
1006
  exports.handleQueryResult = handleQueryResult;
992
1007
  exports.makePartitionQuery = makePartitionQuery;
993
1008
  exports.startFetchingQueries = startFetchingQueries;
@@ -995,9 +1010,7 @@ exports.addressesByContractNameCount = addressesByContractNameCount;
995
1010
  exports.addressesByContractNameGetAll = addressesByContractNameGetAll;
996
1011
  exports.isFullPartition = isFullPartition;
997
1012
  exports.getNextQuery = getNextQuery;
998
- exports.queueItemBlockNumber = queueItemBlockNumber;
999
1013
  exports.makeNoItem = makeNoItem;
1000
- exports.qItemLt = qItemLt;
1001
1014
  exports.getEarliestEvent = getEarliestEvent;
1002
1015
  exports.make = make;
1003
1016
  exports.bufferSize = bufferSize;
@@ -51,6 +51,8 @@ export type genericHandlerWithLoader<loader,handler,eventFilters> = {
51
51
  readonly preRegisterDynamicContracts?: boolean
52
52
  };
53
53
 
54
+ export type blockEvent = { readonly number: number; readonly chainId: number };
55
+
54
56
  export type eventOptions<eventFilters> = {
55
57
  readonly wildcard?: boolean;
56
58
  readonly eventFilters?: eventFilters;
package/src/Internal.res CHANGED
@@ -133,17 +133,58 @@ type evmContractConfig = {
133
133
  events: array<evmEventConfig>,
134
134
  }
135
135
 
136
- type eventItem = {
136
+ // Duplicate the type from item
137
+ // to make item properly unboxed
138
+ type eventItem = private {
139
+ kind: [#0],
137
140
  eventConfig: eventConfig,
138
141
  timestamp: int,
139
142
  chain: ChainMap.Chain.t,
140
143
  blockNumber: int,
141
144
  logIndex: int,
142
145
  event: event,
143
- // Reuse logger object for event
144
- mutable loggerCache?: Pino.t,
145
146
  }
146
147
 
148
+ @genType
149
+ type blockEvent = {
150
+ number: int,
151
+ chainId: int,
152
+ }
153
+
154
+ type onBlockArgs = {
155
+ block: blockEvent,
156
+ context: handlerContext,
157
+ }
158
+
159
+ type onBlockConfig = {
160
+ // When there are multiple onBlock handlers per chain,
161
+ // we want to use the order they are defined for sorting
162
+ index: int,
163
+ name: string,
164
+ chainId: int,
165
+ handler: onBlockArgs => promise<unit>,
166
+ }
167
+
168
+ @tag("kind")
169
+ type item =
170
+ | @as(0)
171
+ Event({
172
+ eventConfig: eventConfig,
173
+ timestamp: int,
174
+ chain: ChainMap.Chain.t,
175
+ blockNumber: int,
176
+ logIndex: int,
177
+ event: event,
178
+ })
179
+ | @as(1) Block({onBlockConfig: onBlockConfig, blockNumber: int, logIndex: int})
180
+
181
+ external castUnsafeEventItem: item => eventItem = "%identity"
182
+
183
+ @get
184
+ external getItemBlockNumber: item => int = "blockNumber"
185
+ @get
186
+ external getItemLogIndex: item => int = "logIndex"
187
+
147
188
  @genType
148
189
  type eventOptions<'eventFilters> = {
149
190
  wildcard?: bool,
@@ -2,6 +2,22 @@
2
2
  // And turn it into PublicConfig instead
3
3
  // For internal use we should create Indexer.res with a stateful type
4
4
 
5
+ type ecosystem = | @as("evm") Evm | @as("fuel") Fuel
6
+
7
+ type sourceSyncOptions = {
8
+ initialBlockInterval?: int,
9
+ backoffMultiplicative?: float,
10
+ accelerationAdditive?: int,
11
+ intervalCeiling?: int,
12
+ backoffMillis?: int,
13
+ queryTimeoutMillis?: int,
14
+ fallbackStallTimeout?: int,
15
+ }
16
+
17
+ type historyFlag = FullHistory | MinHistory
18
+ type rollbackFlag = RollbackOnReorg | NoRollback
19
+ type historyConfig = {rollbackFlag: rollbackFlag, historyFlag: historyFlag}
20
+
5
21
  type contract = {
6
22
  name: string,
7
23
  abi: EvmTypes.Abi.t,
@@ -28,3 +44,5 @@ type sourceSync = {
28
44
  queryTimeoutMillis: int,
29
45
  fallbackStallTimeout: int,
30
46
  }
47
+
48
+ type multichain = | @as("ordered") Ordered | @as("unordered") Unordered
package/src/Logging.res CHANGED
@@ -144,29 +144,41 @@ let createChildFrom = (~logger: t, ~params: 'a) => {
144
144
  logger->child(params->createChildParams)
145
145
  }
146
146
 
147
- let getEventLogger = (eventItem: Internal.eventItem) => {
148
- switch eventItem.loggerCache {
149
- | Some(l) => l
150
- | None => {
151
- let l = getLogger()->child(
152
- {
153
- "contractName": eventItem.eventConfig.contractName,
154
- "eventName": eventItem.eventConfig.name,
155
- "chainId": eventItem.chain->ChainMap.Chain.toChainId,
156
- "block": eventItem.blockNumber,
157
- "logIndex": eventItem.logIndex,
158
- "address": eventItem.event.srcAddress,
159
- }->createChildParams,
160
- )
161
- eventItem.loggerCache = Some(l)
162
- l
147
+ let getItemLogger = {
148
+ let cacheKey = "_logger"
149
+ (item: Internal.item) => {
150
+ switch item->Utils.magic->Utils.Dict.dangerouslyGetNonOption(cacheKey) {
151
+ | Some(l) => l
152
+ | None => {
153
+ let l = getLogger()->child(
154
+ switch item {
155
+ | Event({eventConfig, chain, blockNumber, logIndex, event}) =>
156
+ {
157
+ "contractName": eventConfig.contractName,
158
+ "eventName": eventConfig.name,
159
+ "chainId": chain->ChainMap.Chain.toChainId,
160
+ "block": blockNumber,
161
+ "logIndex": logIndex,
162
+ "address": event.srcAddress,
163
+ }->createChildParams
164
+ | Block({blockNumber, onBlockConfig}) =>
165
+ {
166
+ "onBlock": onBlockConfig.name,
167
+ "chainId": onBlockConfig.chainId,
168
+ "block": blockNumber,
169
+ }->createChildParams
170
+ },
171
+ )
172
+ item->Utils.magic->Js.Dict.set(cacheKey, l)
173
+ l
174
+ }
163
175
  }
164
176
  }
165
177
  }
166
178
 
167
179
  @inline
168
- let logForItem = (eventItem, level: Pino.logLevel, message: string, ~params=?) => {
169
- (eventItem->getEventLogger->Utils.magic->Js.Dict.unsafeGet((level :> string)))(params, message)
180
+ let logForItem = (item, level: Pino.logLevel, message: string, ~params=?) => {
181
+ (item->getItemLogger->Utils.magic->Js.Dict.unsafeGet((level :> string)))(params, message)
170
182
  }
171
183
 
172
184
  let noopLogger: Envio.logger = {
@@ -177,11 +189,11 @@ let noopLogger: Envio.logger = {
177
189
  errorWithExn: (_message: string, _exn) => (),
178
190
  }
179
191
 
180
- let getUserLogger = (eventItem): Envio.logger => {
181
- info: (message: string, ~params=?) => eventItem->logForItem(#uinfo, message, ~params?),
182
- debug: (message: string, ~params=?) => eventItem->logForItem(#udebug, message, ~params?),
183
- warn: (message: string, ~params=?) => eventItem->logForItem(#uwarn, message, ~params?),
184
- error: (message: string, ~params=?) => eventItem->logForItem(#uerror, message, ~params?),
192
+ let getUserLogger = (item): Envio.logger => {
193
+ info: (message: string, ~params=?) => item->logForItem(#uinfo, message, ~params?),
194
+ debug: (message: string, ~params=?) => item->logForItem(#udebug, message, ~params?),
195
+ warn: (message: string, ~params=?) => item->logForItem(#uwarn, message, ~params?),
196
+ error: (message: string, ~params=?) => item->logForItem(#uerror, message, ~params?),
185
197
  errorWithExn: (message: string, exn) =>
186
- eventItem->logForItem(#uerror, message, ~params={"err": exn->Utils.prettifyExn}),
198
+ item->logForItem(#uerror, message, ~params={"err": exn->Utils.prettifyExn}),
187
199
  }
@@ -177,25 +177,39 @@ function createChildFrom(logger, params) {
177
177
  return logger.child(Pino.createChildParams(params));
178
178
  }
179
179
 
180
- function getEventLogger(eventItem) {
181
- var l = eventItem.loggerCache;
180
+ var cacheKey = "_logger";
181
+
182
+ function getItemLogger(item) {
183
+ var l = item[cacheKey];
182
184
  if (l !== undefined) {
183
- return l;
185
+ return Caml_option.valFromOption(l);
184
186
  }
185
- var l$1 = getLogger().child(Pino.createChildParams({
186
- contractName: eventItem.eventConfig.contractName,
187
- eventName: eventItem.eventConfig.name,
188
- chainId: eventItem.chain,
189
- block: eventItem.blockNumber,
190
- logIndex: eventItem.logIndex,
191
- address: eventItem.event.srcAddress
192
- }));
193
- eventItem.loggerCache = l$1;
187
+ var tmp;
188
+ if (item.kind === 0) {
189
+ var eventConfig = item.eventConfig;
190
+ tmp = Pino.createChildParams({
191
+ contractName: eventConfig.contractName,
192
+ eventName: eventConfig.name,
193
+ chainId: item.chain,
194
+ block: item.blockNumber,
195
+ logIndex: item.logIndex,
196
+ address: item.event.srcAddress
197
+ });
198
+ } else {
199
+ var onBlockConfig = item.onBlockConfig;
200
+ tmp = Pino.createChildParams({
201
+ onBlock: onBlockConfig.name,
202
+ chainId: onBlockConfig.chainId,
203
+ block: item.blockNumber
204
+ });
205
+ }
206
+ var l$1 = getLogger().child(tmp);
207
+ item[cacheKey] = l$1;
194
208
  return l$1;
195
209
  }
196
210
 
197
- function logForItem(eventItem, level, message, params) {
198
- return getEventLogger(eventItem)[level](params, message);
211
+ function logForItem(item, level, message, params) {
212
+ return getItemLogger(item)[level](params, message);
199
213
  }
200
214
 
201
215
  function noopLogger_debug(_message, param) {
@@ -226,25 +240,25 @@ var noopLogger = {
226
240
  errorWithExn: noopLogger_errorWithExn
227
241
  };
228
242
 
229
- function getUserLogger(eventItem) {
243
+ function getUserLogger(item) {
230
244
  return {
231
245
  debug: (function (message, params) {
232
- getEventLogger(eventItem)["udebug"](params, message);
246
+ getItemLogger(item)["udebug"](params, message);
233
247
  }),
234
248
  info: (function (message, params) {
235
- getEventLogger(eventItem)["uinfo"](params, message);
249
+ getItemLogger(item)["uinfo"](params, message);
236
250
  }),
237
251
  warn: (function (message, params) {
238
- getEventLogger(eventItem)["uwarn"](params, message);
252
+ getItemLogger(item)["uwarn"](params, message);
239
253
  }),
240
254
  error: (function (message, params) {
241
- getEventLogger(eventItem)["uerror"](params, message);
255
+ getItemLogger(item)["uerror"](params, message);
242
256
  }),
243
257
  errorWithExn: (function (message, exn) {
244
258
  var params = {
245
259
  err: Utils.prettifyExn(exn)
246
260
  };
247
- getEventLogger(eventItem)["uerror"](params, message);
261
+ getItemLogger(item)["uerror"](params, message);
248
262
  })
249
263
  };
250
264
  }
@@ -270,7 +284,7 @@ exports.childErrorWithExn = childErrorWithExn;
270
284
  exports.childFatal = childFatal;
271
285
  exports.createChild = createChild;
272
286
  exports.createChildFrom = createChildFrom;
273
- exports.getEventLogger = getEventLogger;
287
+ exports.getItemLogger = getItemLogger;
274
288
  exports.logForItem = logForItem;
275
289
  exports.noopLogger = noopLogger;
276
290
  exports.getUserLogger = getUserLogger;