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.
- package/evm.schema.json +7 -0
- package/fuel.schema.json +7 -0
- package/index.d.ts +33 -10
- package/package.json +6 -6
- package/src/ChainState.res +22 -4
- package/src/ChainState.res.mjs +20 -3
- package/src/ChainState.resi +3 -0
- package/src/Config.res +60 -2
- package/src/Config.res.mjs +49 -13
- package/src/EffectState.res +2 -2
- package/src/EffectState.res.mjs +2 -2
- package/src/EntityTables.res +32 -0
- package/src/EntityTables.res.mjs +44 -0
- package/src/Envio.res +7 -7
- package/src/Envio.res.mjs +5 -6
- package/src/Hasura.res +37 -3
- package/src/Hasura.res.mjs +23 -5
- package/src/InMemoryStore.res +48 -8
- package/src/InMemoryStore.res.mjs +37 -7
- package/src/IndexerState.res +30 -24
- package/src/IndexerState.res.mjs +20 -35
- package/src/IndexerState.resi +8 -6
- package/src/Internal.res +29 -11
- package/src/Internal.res.mjs +27 -10
- package/src/LoadLayer.res +39 -8
- package/src/LoadLayer.res.mjs +36 -9
- package/src/LoadLayer.resi +2 -0
- package/src/Metrics.res +5 -5
- package/src/Metrics.res.mjs +5 -1
- package/src/Persistence.res +12 -1
- package/src/PgStorage.res +183 -37
- package/src/PgStorage.res.mjs +149 -34
- package/src/PruneStaleHistory.res +1 -0
- package/src/PruneStaleHistory.res.mjs +2 -1
- package/src/Sink.res +3 -3
- package/src/Sink.res.mjs +2 -2
- package/src/TestIndexer.res +128 -17
- package/src/TestIndexer.res.mjs +75 -9
- package/src/UserContext.res +19 -4
- package/src/UserContext.res.mjs +15 -9
- package/src/Writing.res +8 -16
- package/src/Writing.res.mjs +10 -10
- package/src/bindings/ClickHouse.res +40 -4
- package/src/bindings/ClickHouse.res.mjs +37 -5
- package/src/db/EntityHistory.res +64 -21
- package/src/db/EntityHistory.res.mjs +43 -22
- package/src/db/InternalTable.res.mjs +31 -31
- package/src/db/Table.res +24 -1
- package/src/db/Table.res.mjs +26 -4
- package/src/sources/SourceManager.res +6 -12
- package/src/sources/SourceManager.res.mjs +8 -5
- package/svm.schema.json +7 -0
package/src/db/Table.res.mjs
CHANGED
|
@@ -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
|
|
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"
|