envio 3.5.1 → 3.6.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.
Files changed (52) hide show
  1. package/evm.schema.json +7 -0
  2. package/fuel.schema.json +7 -0
  3. package/index.d.ts +33 -10
  4. package/package.json +6 -6
  5. package/src/ChainState.res +22 -4
  6. package/src/ChainState.res.mjs +20 -3
  7. package/src/ChainState.resi +3 -0
  8. package/src/Config.res +60 -2
  9. package/src/Config.res.mjs +49 -13
  10. package/src/EffectState.res +2 -2
  11. package/src/EffectState.res.mjs +2 -2
  12. package/src/EntityTables.res +32 -0
  13. package/src/EntityTables.res.mjs +44 -0
  14. package/src/Envio.res +7 -7
  15. package/src/Envio.res.mjs +5 -6
  16. package/src/Hasura.res +37 -3
  17. package/src/Hasura.res.mjs +23 -5
  18. package/src/InMemoryStore.res +48 -8
  19. package/src/InMemoryStore.res.mjs +37 -7
  20. package/src/IndexerState.res +30 -24
  21. package/src/IndexerState.res.mjs +20 -35
  22. package/src/IndexerState.resi +8 -6
  23. package/src/Internal.res +29 -11
  24. package/src/Internal.res.mjs +27 -10
  25. package/src/LoadLayer.res +39 -8
  26. package/src/LoadLayer.res.mjs +36 -9
  27. package/src/LoadLayer.resi +2 -0
  28. package/src/Metrics.res +5 -5
  29. package/src/Metrics.res.mjs +5 -1
  30. package/src/Persistence.res +12 -1
  31. package/src/PgStorage.res +183 -37
  32. package/src/PgStorage.res.mjs +149 -34
  33. package/src/PruneStaleHistory.res +1 -0
  34. package/src/PruneStaleHistory.res.mjs +2 -1
  35. package/src/Sink.res +3 -3
  36. package/src/Sink.res.mjs +2 -2
  37. package/src/TestIndexer.res +128 -17
  38. package/src/TestIndexer.res.mjs +75 -9
  39. package/src/UserContext.res +19 -4
  40. package/src/UserContext.res.mjs +15 -9
  41. package/src/Writing.res +8 -16
  42. package/src/Writing.res.mjs +10 -10
  43. package/src/bindings/ClickHouse.res +40 -4
  44. package/src/bindings/ClickHouse.res.mjs +37 -5
  45. package/src/db/EntityHistory.res +64 -21
  46. package/src/db/EntityHistory.res.mjs +43 -22
  47. package/src/db/InternalTable.res.mjs +31 -31
  48. package/src/db/Table.res +24 -1
  49. package/src/db/Table.res.mjs +26 -4
  50. package/src/sources/SourceManager.res +6 -12
  51. package/src/sources/SourceManager.res.mjs +8 -5
  52. package/svm.schema.json +7 -0
@@ -16,11 +16,12 @@ function makeEnumConfig(name, variants) {
16
16
  };
17
17
  }
18
18
 
19
- function mkField(fieldName, fieldType, fieldSchema, $$default, isArrayOpt, isNullableOpt, isPrimaryKeyOpt, isIndexOpt, linkedEntity, description, postgresDbName, clickhouseDbName) {
19
+ function mkField(fieldName, fieldType, fieldSchema, $$default, isArrayOpt, isNullableOpt, isPrimaryKeyOpt, isIndexOpt, isChainIdOpt, linkedEntity, description, postgresDbName, clickhouseDbName) {
20
20
  let isArray = isArrayOpt !== undefined ? isArrayOpt : false;
21
21
  let isNullable = isNullableOpt !== undefined ? isNullableOpt : false;
22
22
  let isPrimaryKey = isPrimaryKeyOpt !== undefined ? isPrimaryKeyOpt : false;
23
23
  let isIndex = isIndexOpt !== undefined ? isIndexOpt : false;
24
+ let isChainId = isChainIdOpt !== undefined ? isChainIdOpt : false;
24
25
  return {
25
26
  TAG: "Field",
26
27
  _0: {
@@ -31,6 +32,7 @@ function mkField(fieldName, fieldType, fieldSchema, $$default, isArrayOpt, isNul
31
32
  isNullable: isNullable,
32
33
  isPrimaryKey: isPrimaryKey,
33
34
  isIndex: isIndex,
35
+ isChainId: isChainId,
34
36
  linkedEntity: linkedEntity,
35
37
  defaultValue: $$default,
36
38
  description: description,
@@ -225,6 +227,18 @@ function getDerivedFromFields(table) {
225
227
  });
226
228
  }
227
229
 
230
+ function getChainIdField(table) {
231
+ return Stdlib_Array.findMap(table.fields, field => {
232
+ if (field.TAG !== "Field") {
233
+ return;
234
+ }
235
+ let field$1 = field._0;
236
+ if (field$1.isChainId) {
237
+ return field$1;
238
+ }
239
+ });
240
+ }
241
+
228
242
  function getFieldByName(table, fieldName) {
229
243
  return table.fields.find(field => getUserDefinedFieldName(field) === fieldName);
230
244
  }
@@ -288,7 +302,8 @@ let queryFields = Utils.$$WeakMap.memoize(table => {
288
302
  return dict;
289
303
  });
290
304
 
291
- function makeRowsSchema(table, rowFieldName) {
305
+ function makeRowsSchema(table, rowFieldName, skipChainIdOpt) {
306
+ let skipChainId = skipChainIdOpt !== undefined ? skipChainIdOpt : false;
292
307
  return S$RescriptSchema.array(S$RescriptSchema.object(s => {
293
308
  let dict = {};
294
309
  table.fields.forEach(field => {
@@ -296,15 +311,20 @@ function makeRowsSchema(table, rowFieldName) {
296
311
  return;
297
312
  }
298
313
  let field$1 = field._0;
314
+ if (field$1.isChainId && skipChainId) {
315
+ return;
316
+ }
299
317
  dict[getApiFieldName(field$1)] = s.f(rowFieldName(field$1), field$1.fieldSchema);
300
318
  });
301
319
  return dict;
302
320
  }));
303
321
  }
304
322
 
305
- let rowsSchema = Utils.$$WeakMap.memoize(table => makeRowsSchema(table, getApiFieldName));
323
+ let rowsSchema = Utils.$$WeakMap.memoize(table => makeRowsSchema(table, getApiFieldName, undefined));
324
+
325
+ let pgRowsSchema = Utils.$$WeakMap.memoize(table => makeRowsSchema(table, getPgDbFieldName, undefined));
306
326
 
307
- let pgRowsSchema = Utils.$$WeakMap.memoize(table => makeRowsSchema(table, getPgDbFieldName));
327
+ let pgEntityRowsSchema = Utils.$$WeakMap.memoize(table => makeRowsSchema(table, getPgDbFieldName, true));
308
328
 
309
329
  let NonExistingTableField = /* @__PURE__ */Primitive_exceptions.create("Table.NonExistingTableField");
310
330
 
@@ -465,6 +485,7 @@ export {
465
485
  getNonDefaultFields,
466
486
  getLinkedEntityFields,
467
487
  getDerivedFromFields,
488
+ getChainIdField,
468
489
  getFieldByName,
469
490
  NoIdField,
470
491
  getIdFieldOrThrow,
@@ -477,6 +498,7 @@ export {
477
498
  makeRowsSchema,
478
499
  rowsSchema,
479
500
  pgRowsSchema,
501
+ pgEntityRowsSchema,
480
502
  NonExistingTableField,
481
503
  getUnfilteredCompositeIndexesUnsafe,
482
504
  toSqlParams,
@@ -468,16 +468,16 @@ let getSourceNewHeight = async (
468
468
  // head on every (re)connect; waking the wait loop on a height we already
469
469
  // know spins it and leaks fallback pollers (#1270).
470
470
  if newHeight > sourceState.knownHeight {
471
+ sourceState->recordRequestStats([{Source.method: "heightPush", seconds: 0.}])
471
472
  sourceState.knownHeight = newHeight
472
473
  let resolvers = sourceState.pendingHeightResolvers
473
474
  sourceState.pendingHeightResolvers = []
474
475
  resolvers->Array.forEach(resolve => resolve(newHeight))
476
+ } else {
477
+ sourceState->recordRequestStats([{Source.method: "heightPushIgnored", seconds: 0.}])
475
478
  }
476
479
  })
477
480
  sourceState.unsubscribe = Some(unsubscribe)
478
- // Count a subscription (re)start rather than every pushed height —
479
- // there's no request/response to time here.
480
- sourceState->recordRequestStats([{Source.method: "heightSubscription", seconds: 0.}])
481
481
  | _ =>
482
482
  // Slowdown polling when the chain isn't progressing
483
483
  let pollingInterval = if reducedPolling {
@@ -724,9 +724,7 @@ let executeQuery = async (
724
724
  ) {
725
725
  | Some(s) =>
726
726
  if s.source !== sourceManager.activeSource {
727
- let logger = Logging.createChild(
728
- ~params={"chainId": sourceManager.activeSource.chainId},
729
- )
727
+ let logger = Logging.createChild(~params={"chainId": sourceManager.activeSource.chainId})
730
728
  logger->Logging.childInfo({
731
729
  "msg": "Switching data-source",
732
730
  "source": s.source.name,
@@ -736,9 +734,7 @@ let executeQuery = async (
736
734
  }
737
735
  s
738
736
  | None =>
739
- let logger = Logging.createChild(
740
- ~params={"chainId": sourceManager.activeSource.chainId},
741
- )
737
+ let logger = Logging.createChild(~params={"chainId": sourceManager.activeSource.chainId})
742
738
  %raw(`null`)->ErrorHandling.mkLogAndRaise(~logger, ~msg=noSourcesError)
743
739
  }
744
740
  sourceManager.activeSource = sourceState.source
@@ -895,9 +891,7 @@ let getBlockHashes = async (sourceManager: t, ~blockNumbers: array<int>, ~isReal
895
891
  let sourceState = switch sourceManager->getNextSource(~isRealtime) {
896
892
  | Some(s) => s
897
893
  | None =>
898
- let logger = Logging.createChild(
899
- ~params={"chainId": sourceManager.activeSource.chainId},
900
- )
894
+ let logger = Logging.createChild(~params={"chainId": sourceManager.activeSource.chainId})
901
895
  %raw(`null`)->ErrorHandling.mkLogAndRaise(
902
896
  ~logger,
903
897
  ~msg="No data-sources available for fetching block hashes.",
@@ -388,18 +388,21 @@ async function getSourceNewHeight(sourceManager, sourceState, knownHeight, stall
388
388
  if (createSubscription !== undefined && isRealtime) {
389
389
  let unsubscribe = createSubscription(newHeight => {
390
390
  if (newHeight <= sourceState.knownHeight) {
391
- return;
391
+ return recordRequestStats(sourceState, [{
392
+ method: "heightPushIgnored",
393
+ seconds: 0
394
+ }]);
392
395
  }
396
+ recordRequestStats(sourceState, [{
397
+ method: "heightPush",
398
+ seconds: 0
399
+ }]);
393
400
  sourceState.knownHeight = newHeight;
394
401
  let resolvers = sourceState.pendingHeightResolvers;
395
402
  sourceState.pendingHeightResolvers = [];
396
403
  resolvers.forEach(resolve => resolve(newHeight));
397
404
  });
398
405
  sourceState.unsubscribe = unsubscribe;
399
- recordRequestStats(sourceState, [{
400
- method: "heightSubscription",
401
- seconds: 0
402
- }]);
403
406
  } else {
404
407
  exit = 1;
405
408
  }
package/svm.schema.json CHANGED
@@ -49,6 +49,13 @@
49
49
  }
50
50
  ]
51
51
  },
52
+ "disable_default_cross_chain": {
53
+ "description": "Make entities and effect caches per-chain instead of shared across every chain (recommended). Sharing then becomes explicit — add `@crossChain` to an entity in schema.graphql or `crossChain: true` to an effect. (default: false)",
54
+ "type": [
55
+ "boolean",
56
+ "null"
57
+ ]
58
+ },
52
59
  "ecosystem": {
53
60
  "description": "Ecosystem of the project.",
54
61
  "$ref": "#/$defs/EcosystemTag"