envio 3.0.0-alpha.2 → 3.0.0-alpha.20
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/README.md +164 -30
- package/bin.mjs +49 -0
- package/evm.schema.json +79 -169
- package/fuel.schema.json +50 -21
- package/index.d.ts +497 -1
- package/index.js +4 -0
- package/package.json +42 -31
- package/rescript.json +4 -1
- package/src/Batch.res +11 -8
- package/src/Batch.res.mjs +11 -9
- package/src/ChainFetcher.res +531 -0
- package/src/ChainFetcher.res.mjs +339 -0
- package/src/ChainManager.res +190 -0
- package/src/ChainManager.res.mjs +166 -0
- package/src/Change.res +3 -3
- package/src/Config.gen.ts +19 -0
- package/src/Config.res +737 -22
- package/src/Config.res.mjs +703 -26
- package/src/{Indexer.res → Ctx.res} +1 -1
- package/src/Ecosystem.res +9 -124
- package/src/Ecosystem.res.mjs +19 -160
- package/src/Env.res +30 -74
- package/src/Env.res.mjs +25 -87
- package/src/Envio.gen.ts +3 -1
- package/src/Envio.res +20 -9
- package/src/EventProcessing.res +469 -0
- package/src/EventProcessing.res.mjs +337 -0
- package/src/EvmTypes.gen.ts +6 -0
- package/src/EvmTypes.res +1 -0
- package/src/FetchState.res +1256 -639
- package/src/FetchState.res.mjs +1135 -612
- package/src/GlobalState.res +1190 -0
- package/src/GlobalState.res.mjs +1183 -0
- package/src/GlobalStateManager.res +68 -0
- package/src/GlobalStateManager.res.mjs +75 -0
- package/src/GlobalStateManager.resi +7 -0
- package/src/HandlerLoader.res +89 -0
- package/src/HandlerLoader.res.mjs +79 -0
- package/src/HandlerRegister.res +357 -0
- package/src/HandlerRegister.res.mjs +299 -0
- package/src/{EventRegister.resi → HandlerRegister.resi} +13 -13
- package/src/Hasura.res +111 -175
- package/src/Hasura.res.mjs +88 -150
- package/src/InMemoryStore.res +1 -1
- package/src/InMemoryStore.res.mjs +3 -3
- package/src/InMemoryTable.res +1 -1
- package/src/InMemoryTable.res.mjs +1 -1
- package/src/Internal.gen.ts +4 -0
- package/src/Internal.res +230 -12
- package/src/Internal.res.mjs +115 -1
- package/src/LoadLayer.res +444 -0
- package/src/LoadLayer.res.mjs +296 -0
- package/src/LoadLayer.resi +32 -0
- package/src/LogSelection.res +33 -27
- package/src/LogSelection.res.mjs +6 -0
- package/src/Logging.res +21 -7
- package/src/Logging.res.mjs +16 -8
- package/src/Main.res +377 -0
- package/src/Main.res.mjs +339 -0
- package/src/Persistence.res +7 -21
- package/src/Persistence.res.mjs +3 -3
- package/src/PgStorage.gen.ts +10 -0
- package/src/PgStorage.res +116 -69
- package/src/PgStorage.res.d.mts +5 -0
- package/src/PgStorage.res.mjs +93 -50
- package/src/Prometheus.res +294 -224
- package/src/Prometheus.res.mjs +353 -340
- package/src/ReorgDetection.res +6 -10
- package/src/ReorgDetection.res.mjs +6 -6
- package/src/SafeCheckpointTracking.res +4 -4
- package/src/SafeCheckpointTracking.res.mjs +2 -2
- package/src/Sink.res +4 -2
- package/src/Sink.res.mjs +2 -1
- package/src/TableIndices.res +0 -1
- package/src/TestIndexer.res +692 -0
- package/src/TestIndexer.res.mjs +527 -0
- package/src/TestIndexerProxyStorage.res +205 -0
- package/src/TestIndexerProxyStorage.res.mjs +151 -0
- package/src/TopicFilter.res +1 -1
- package/src/Types.ts +1 -1
- package/src/UserContext.res +424 -0
- package/src/UserContext.res.mjs +279 -0
- package/src/Utils.res +97 -26
- package/src/Utils.res.mjs +91 -44
- package/src/bindings/BigInt.res +10 -0
- package/src/bindings/BigInt.res.mjs +15 -0
- package/src/bindings/ClickHouse.res +120 -23
- package/src/bindings/ClickHouse.res.mjs +118 -28
- package/src/bindings/DateFns.res +74 -0
- package/src/bindings/DateFns.res.mjs +22 -0
- package/src/bindings/EventSource.res +8 -1
- package/src/bindings/EventSource.res.mjs +8 -1
- package/src/bindings/Express.res +1 -0
- package/src/bindings/Hrtime.res +14 -1
- package/src/bindings/Hrtime.res.mjs +22 -2
- package/src/bindings/Hrtime.resi +4 -0
- package/src/bindings/Lodash.res +0 -1
- package/src/bindings/NodeJs.res +49 -3
- package/src/bindings/NodeJs.res.mjs +11 -3
- package/src/bindings/Pino.res +24 -10
- package/src/bindings/Pino.res.mjs +14 -8
- package/src/bindings/Postgres.gen.ts +8 -0
- package/src/bindings/Postgres.res +5 -1
- package/src/bindings/Postgres.res.d.mts +5 -0
- package/src/bindings/PromClient.res +0 -10
- package/src/bindings/PromClient.res.mjs +0 -3
- package/src/bindings/Vitest.res +142 -0
- package/src/bindings/Vitest.res.mjs +9 -0
- package/src/bindings/WebSocket.res +27 -0
- package/src/bindings/WebSocket.res.mjs +2 -0
- package/src/bindings/Yargs.res +8 -0
- package/src/bindings/Yargs.res.mjs +2 -0
- package/src/db/EntityHistory.res +7 -7
- package/src/db/EntityHistory.res.mjs +9 -9
- package/src/db/InternalTable.res +59 -111
- package/src/db/InternalTable.res.mjs +73 -104
- package/src/db/Table.res +27 -8
- package/src/db/Table.res.mjs +25 -14
- package/src/sources/Evm.res +84 -0
- package/src/sources/Evm.res.mjs +105 -0
- package/src/sources/EvmChain.res +94 -0
- package/src/sources/EvmChain.res.mjs +60 -0
- package/src/sources/Fuel.res +19 -34
- package/src/sources/Fuel.res.mjs +34 -16
- package/src/sources/FuelSDK.res +38 -0
- package/src/sources/FuelSDK.res.mjs +29 -0
- package/src/sources/HyperFuel.res +2 -2
- package/src/sources/HyperFuel.resi +1 -1
- package/src/sources/HyperFuelClient.res +2 -2
- package/src/sources/HyperFuelSource.res +33 -13
- package/src/sources/HyperFuelSource.res.mjs +24 -16
- package/src/sources/HyperSync.res +36 -6
- package/src/sources/HyperSync.res.mjs +9 -7
- package/src/sources/HyperSync.resi +4 -0
- package/src/sources/HyperSyncClient.res +1 -1
- package/src/sources/HyperSyncHeightStream.res +47 -116
- package/src/sources/HyperSyncHeightStream.res.mjs +46 -73
- package/src/sources/HyperSyncSource.res +118 -139
- package/src/sources/HyperSyncSource.res.mjs +104 -121
- package/src/sources/Rpc.res +86 -14
- package/src/sources/Rpc.res.mjs +101 -9
- package/src/sources/RpcSource.res +621 -364
- package/src/sources/RpcSource.res.mjs +843 -410
- package/src/sources/RpcWebSocketHeightStream.res +181 -0
- package/src/sources/RpcWebSocketHeightStream.res.mjs +196 -0
- package/src/sources/Source.res +7 -5
- package/src/sources/SourceManager.res +325 -225
- package/src/sources/SourceManager.res.mjs +314 -171
- package/src/sources/SourceManager.resi +17 -6
- package/src/sources/Svm.res +81 -0
- package/src/sources/Svm.res.mjs +90 -0
- package/src/tui/Tui.res +247 -0
- package/src/tui/Tui.res.mjs +337 -0
- package/src/tui/bindings/Ink.res +371 -0
- package/src/tui/bindings/Ink.res.mjs +72 -0
- package/src/tui/bindings/Style.res +123 -0
- package/src/tui/bindings/Style.res.mjs +2 -0
- package/src/tui/components/BufferedProgressBar.res +40 -0
- package/src/tui/components/BufferedProgressBar.res.mjs +57 -0
- package/src/tui/components/CustomHooks.res +122 -0
- package/src/tui/components/CustomHooks.res.mjs +179 -0
- package/src/tui/components/Messages.res +41 -0
- package/src/tui/components/Messages.res.mjs +75 -0
- package/src/tui/components/SyncETA.res +174 -0
- package/src/tui/components/SyncETA.res.mjs +263 -0
- package/src/tui/components/TuiData.res +47 -0
- package/src/tui/components/TuiData.res.mjs +34 -0
- package/svm.schema.json +112 -0
- package/bin.js +0 -48
- package/src/EventRegister.res +0 -241
- package/src/EventRegister.res.mjs +0 -240
- package/src/bindings/Ethers.gen.ts +0 -14
- package/src/bindings/Ethers.res +0 -204
- package/src/bindings/Ethers.res.mjs +0 -130
- /package/src/{Indexer.res.mjs → Ctx.res.mjs} +0 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Utils from "./Utils.res.mjs";
|
|
4
|
+
import * as Hrtime from "./bindings/Hrtime.res.mjs";
|
|
5
|
+
import * as Logging from "./Logging.res.mjs";
|
|
6
|
+
import * as Internal from "./Internal.res.mjs";
|
|
7
|
+
import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
|
|
8
|
+
import * as Prometheus from "./Prometheus.res.mjs";
|
|
9
|
+
import * as Caml_option from "rescript/lib/es6/caml_option.js";
|
|
10
|
+
import * as LoadManager from "./LoadManager.res.mjs";
|
|
11
|
+
import * as Persistence from "./Persistence.res.mjs";
|
|
12
|
+
import * as TableIndices from "./TableIndices.res.mjs";
|
|
13
|
+
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
14
|
+
import * as InMemoryStore from "./InMemoryStore.res.mjs";
|
|
15
|
+
import * as InMemoryTable from "./InMemoryTable.res.mjs";
|
|
16
|
+
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
17
|
+
import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
|
|
18
|
+
|
|
19
|
+
function loadById(loadManager, persistence, entityConfig, inMemoryStore, shouldGroup, item, entityId) {
|
|
20
|
+
var key = entityConfig.name + ".get";
|
|
21
|
+
var inMemTable = InMemoryStore.getInMemTable(inMemoryStore, entityConfig);
|
|
22
|
+
var load = async function (idsToLoad, param) {
|
|
23
|
+
var timerRef = Prometheus.StorageLoad.startOperation(key);
|
|
24
|
+
var dbEntities;
|
|
25
|
+
try {
|
|
26
|
+
dbEntities = await Persistence.getInitializedStorageOrThrow(persistence).loadByIdsOrThrow(idsToLoad, entityConfig.table, entityConfig.rowsSchema);
|
|
27
|
+
}
|
|
28
|
+
catch (raw_exn){
|
|
29
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
30
|
+
if (exn.RE_EXN_ID === Persistence.StorageError) {
|
|
31
|
+
dbEntities = ErrorHandling.mkLogAndRaise(Logging.getItemLogger(item), exn.message, exn.reason);
|
|
32
|
+
} else {
|
|
33
|
+
throw exn;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
var entitiesMap = {};
|
|
37
|
+
for(var idx = 0 ,idx_finish = dbEntities.length; idx < idx_finish; ++idx){
|
|
38
|
+
var entity = dbEntities[idx];
|
|
39
|
+
entitiesMap[entity.id] = entity;
|
|
40
|
+
}
|
|
41
|
+
idsToLoad.forEach(function (entityId) {
|
|
42
|
+
InMemoryTable.Entity.initValue(inMemTable, entityId, entitiesMap[entityId], false);
|
|
43
|
+
});
|
|
44
|
+
return Prometheus.StorageLoad.endOperation(timerRef, key, idsToLoad.length, dbEntities.length);
|
|
45
|
+
};
|
|
46
|
+
return LoadManager.call(loadManager, entityId, key, load, LoadManager.noopHasher, shouldGroup, (function (hash) {
|
|
47
|
+
return InMemoryTable.hasByHash(inMemTable.table, hash);
|
|
48
|
+
}), InMemoryTable.Entity.getUnsafe(inMemTable));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function callEffect(effect, arg, inMemTable, timerRef, onError) {
|
|
52
|
+
var effectName = effect.name;
|
|
53
|
+
var hadActiveCalls = effect.activeCallsCount > 0;
|
|
54
|
+
effect.activeCallsCount = effect.activeCallsCount + 1 | 0;
|
|
55
|
+
Prometheus.SafeGauge.handleInt(Prometheus.EffectCalls.activeCallsCount, effectName, effect.activeCallsCount);
|
|
56
|
+
if (hadActiveCalls) {
|
|
57
|
+
var elapsed = Hrtime.secondsBetween(effect.prevCallStartTimerRef, timerRef);
|
|
58
|
+
if (elapsed > 0) {
|
|
59
|
+
Prometheus.SafeCounter.handleFloat(Prometheus.EffectCalls.timeCounter, effectName, elapsed);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
effect.prevCallStartTimerRef = timerRef;
|
|
64
|
+
return effect.handler(arg).then(function (output) {
|
|
65
|
+
inMemTable.dict[arg.cacheKey] = output;
|
|
66
|
+
if (arg.context.cache) {
|
|
67
|
+
inMemTable.idsToStore.push(arg.cacheKey);
|
|
68
|
+
return ;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
}).catch(function (exn) {
|
|
72
|
+
onError(arg.cacheKey, exn);
|
|
73
|
+
}).finally(function () {
|
|
74
|
+
effect.activeCallsCount = effect.activeCallsCount - 1 | 0;
|
|
75
|
+
Prometheus.SafeGauge.handleInt(Prometheus.EffectCalls.activeCallsCount, effectName, effect.activeCallsCount);
|
|
76
|
+
var newTimer = Hrtime.makeTimer();
|
|
77
|
+
Prometheus.SafeCounter.handleFloat(Prometheus.EffectCalls.timeCounter, effectName, Hrtime.secondsBetween(effect.prevCallStartTimerRef, newTimer));
|
|
78
|
+
effect.prevCallStartTimerRef = newTimer;
|
|
79
|
+
Prometheus.SafeCounter.increment(Prometheus.EffectCalls.totalCallsCount, effectName);
|
|
80
|
+
Prometheus.SafeCounter.handleFloat(Prometheus.EffectCalls.sumTimeCounter, effectName, Hrtime.toSecondsFloat(Hrtime.timeSince(timerRef)));
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function executeWithRateLimit(effect, effectArgs, inMemTable, onError, isFromQueue) {
|
|
85
|
+
var effectName = effect.name;
|
|
86
|
+
var timerRef = Hrtime.makeTimer();
|
|
87
|
+
var promises = [];
|
|
88
|
+
var state = effect.rateLimit;
|
|
89
|
+
if (state !== undefined) {
|
|
90
|
+
var now = Date.now();
|
|
91
|
+
if (now >= state.windowStartTime + state.durationMs) {
|
|
92
|
+
state.availableCalls = state.callsPerDuration;
|
|
93
|
+
state.windowStartTime = now;
|
|
94
|
+
state.nextWindowPromise = undefined;
|
|
95
|
+
}
|
|
96
|
+
var immediateCount = Math.min(state.availableCalls, effectArgs.length);
|
|
97
|
+
var immediateArgs = Belt_Array.slice(effectArgs, 0, immediateCount);
|
|
98
|
+
var queuedArgs = Belt_Array.sliceToEnd(effectArgs, immediateCount);
|
|
99
|
+
state.availableCalls = state.availableCalls - immediateCount | 0;
|
|
100
|
+
for(var idx = 0 ,idx_finish = immediateArgs.length; idx < idx_finish; ++idx){
|
|
101
|
+
promises.push(callEffect(effect, immediateArgs[idx], inMemTable, timerRef, onError));
|
|
102
|
+
}
|
|
103
|
+
if (immediateCount > 0 && isFromQueue) {
|
|
104
|
+
state.queueCount = state.queueCount - immediateCount | 0;
|
|
105
|
+
Prometheus.EffectQueueCount.set(state.queueCount, effectName);
|
|
106
|
+
}
|
|
107
|
+
if (Utils.$$Array.notEmpty(queuedArgs)) {
|
|
108
|
+
if (!isFromQueue) {
|
|
109
|
+
state.queueCount = state.queueCount + queuedArgs.length | 0;
|
|
110
|
+
Prometheus.EffectQueueCount.set(state.queueCount, effectName);
|
|
111
|
+
}
|
|
112
|
+
var millisUntilReset = {
|
|
113
|
+
contents: 0
|
|
114
|
+
};
|
|
115
|
+
var p = state.nextWindowPromise;
|
|
116
|
+
var nextWindowPromise;
|
|
117
|
+
if (p !== undefined) {
|
|
118
|
+
nextWindowPromise = Caml_option.valFromOption(p);
|
|
119
|
+
} else {
|
|
120
|
+
millisUntilReset.contents = state.windowStartTime + state.durationMs - now | 0;
|
|
121
|
+
var p$1 = Utils.delay(millisUntilReset.contents);
|
|
122
|
+
state.nextWindowPromise = Caml_option.some(p$1);
|
|
123
|
+
nextWindowPromise = p$1;
|
|
124
|
+
}
|
|
125
|
+
promises.push(nextWindowPromise.then(function () {
|
|
126
|
+
if (millisUntilReset.contents > 0) {
|
|
127
|
+
Prometheus.SafeCounter.handleFloat(Prometheus.EffectQueueCount.timeCounter, effectName, millisUntilReset.contents / 1000);
|
|
128
|
+
}
|
|
129
|
+
return executeWithRateLimit(effect, queuedArgs, inMemTable, onError, true);
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
} else {
|
|
134
|
+
for(var idx$1 = 0 ,idx_finish$1 = effectArgs.length; idx$1 < idx_finish$1; ++idx$1){
|
|
135
|
+
promises.push(callEffect(effect, effectArgs[idx$1], inMemTable, timerRef, onError));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return Promise.all(promises);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function loadEffect(loadManager, persistence, effect, effectArgs, inMemoryStore, shouldGroup, item) {
|
|
142
|
+
var effectName = effect.name;
|
|
143
|
+
var key = effectName + ".effect";
|
|
144
|
+
var inMemTable = InMemoryStore.getEffectInMemTable(inMemoryStore, effect);
|
|
145
|
+
var load = async function (args, onError) {
|
|
146
|
+
var idsToLoad = args.map(function (arg) {
|
|
147
|
+
return arg.cacheKey;
|
|
148
|
+
});
|
|
149
|
+
var idsFromCache = new Set();
|
|
150
|
+
var match = persistence.storageStatus;
|
|
151
|
+
var tmp;
|
|
152
|
+
tmp = typeof match !== "object" || match.TAG === "Initializing" ? false : Utils.Dict.has(match._0.cache, effectName);
|
|
153
|
+
if (tmp) {
|
|
154
|
+
var timerRef = Prometheus.StorageLoad.startOperation(key);
|
|
155
|
+
var match$1 = effect.storageMeta;
|
|
156
|
+
var outputSchema = match$1.outputSchema;
|
|
157
|
+
var dbEntities;
|
|
158
|
+
try {
|
|
159
|
+
dbEntities = await Persistence.getInitializedStorageOrThrow(persistence).loadByIdsOrThrow(idsToLoad, match$1.table, Internal.effectCacheItemRowsSchema);
|
|
160
|
+
}
|
|
161
|
+
catch (raw_exn){
|
|
162
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
163
|
+
Logging.childWarn(Logging.getItemLogger(item), {
|
|
164
|
+
msg: "Failed to load cache effect cache. The indexer will continue working, but the effect will not be able to use the cache.",
|
|
165
|
+
err: Utils.prettifyExn(exn),
|
|
166
|
+
effect: effectName
|
|
167
|
+
});
|
|
168
|
+
dbEntities = [];
|
|
169
|
+
}
|
|
170
|
+
dbEntities.forEach(function (dbEntity) {
|
|
171
|
+
try {
|
|
172
|
+
var output = S$RescriptSchema.parseOrThrow(dbEntity.output, outputSchema);
|
|
173
|
+
idsFromCache.add(dbEntity.id);
|
|
174
|
+
inMemTable.dict[dbEntity.id] = output;
|
|
175
|
+
return ;
|
|
176
|
+
}
|
|
177
|
+
catch (raw_error){
|
|
178
|
+
var error = Caml_js_exceptions.internalToOCamlException(raw_error);
|
|
179
|
+
if (error.RE_EXN_ID === S$RescriptSchema.Raised) {
|
|
180
|
+
inMemTable.invalidationsCount = inMemTable.invalidationsCount + 1 | 0;
|
|
181
|
+
Prometheus.EffectCacheInvalidationsCount.increment(effectName);
|
|
182
|
+
return Logging.childTrace(Logging.getItemLogger(item), {
|
|
183
|
+
msg: "Invalidated effect cache",
|
|
184
|
+
input: dbEntity.id,
|
|
185
|
+
effect: effectName,
|
|
186
|
+
err: S$RescriptSchema.$$Error.message(error._1)
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
Prometheus.StorageLoad.endOperation(timerRef, key, idsToLoad.length, dbEntities.length);
|
|
193
|
+
}
|
|
194
|
+
var remainingCallsCount = idsToLoad.length - idsFromCache.size | 0;
|
|
195
|
+
if (remainingCallsCount <= 0) {
|
|
196
|
+
return ;
|
|
197
|
+
}
|
|
198
|
+
var argsToCall = [];
|
|
199
|
+
for(var idx = 0 ,idx_finish = args.length; idx < idx_finish; ++idx){
|
|
200
|
+
var arg = args[idx];
|
|
201
|
+
if (!idsFromCache.has(arg.cacheKey)) {
|
|
202
|
+
argsToCall.push(arg);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
}
|
|
206
|
+
if (Utils.$$Array.notEmpty(argsToCall)) {
|
|
207
|
+
return await executeWithRateLimit(effect, argsToCall, inMemTable, onError, false);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
};
|
|
211
|
+
return LoadManager.call(loadManager, effectArgs, key, load, (function (args) {
|
|
212
|
+
return args.cacheKey;
|
|
213
|
+
}), shouldGroup, (function (hash) {
|
|
214
|
+
return Utils.Dict.has(inMemTable.dict, hash);
|
|
215
|
+
}), (function (hash) {
|
|
216
|
+
return inMemTable.dict[hash];
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function loadByField(loadManager, persistence, operator, entityConfig, inMemoryStore, fieldName, fieldValueSchema, shouldGroup, item, fieldValue) {
|
|
221
|
+
var operatorCallName;
|
|
222
|
+
switch (operator) {
|
|
223
|
+
case "Eq" :
|
|
224
|
+
operatorCallName = "eq";
|
|
225
|
+
break;
|
|
226
|
+
case "Gt" :
|
|
227
|
+
operatorCallName = "gt";
|
|
228
|
+
break;
|
|
229
|
+
case "Lt" :
|
|
230
|
+
operatorCallName = "lt";
|
|
231
|
+
break;
|
|
232
|
+
|
|
233
|
+
}
|
|
234
|
+
var key = entityConfig.name + ".getWhere." + fieldName + "." + operatorCallName;
|
|
235
|
+
var inMemTable = InMemoryStore.getInMemTable(inMemoryStore, entityConfig);
|
|
236
|
+
var load = async function (fieldValues, param) {
|
|
237
|
+
var timerRef = Prometheus.StorageLoad.startOperation(key);
|
|
238
|
+
var size = {
|
|
239
|
+
contents: 0
|
|
240
|
+
};
|
|
241
|
+
var indiciesToLoad = fieldValues.map(function (fieldValue) {
|
|
242
|
+
return {
|
|
243
|
+
fieldName: fieldName,
|
|
244
|
+
fieldValue: fieldValue,
|
|
245
|
+
operator: operator
|
|
246
|
+
};
|
|
247
|
+
});
|
|
248
|
+
await Promise.all(indiciesToLoad.map(async function (index) {
|
|
249
|
+
InMemoryTable.Entity.addEmptyIndex(inMemTable, index);
|
|
250
|
+
try {
|
|
251
|
+
var tmp;
|
|
252
|
+
switch (index.operator) {
|
|
253
|
+
case "Eq" :
|
|
254
|
+
tmp = "=";
|
|
255
|
+
break;
|
|
256
|
+
case "Gt" :
|
|
257
|
+
tmp = ">";
|
|
258
|
+
break;
|
|
259
|
+
case "Lt" :
|
|
260
|
+
tmp = "<";
|
|
261
|
+
break;
|
|
262
|
+
|
|
263
|
+
}
|
|
264
|
+
var entities = await Persistence.getInitializedStorageOrThrow(persistence).loadByFieldOrThrow(TableIndices.Index.getFieldName(index), fieldValueSchema, index.fieldValue, tmp, entityConfig.table, entityConfig.rowsSchema);
|
|
265
|
+
Belt_Array.forEach(entities, (function (entity) {
|
|
266
|
+
InMemoryTable.Entity.initValue(inMemTable, entity.id, entity, false);
|
|
267
|
+
}));
|
|
268
|
+
size.contents = size.contents + entities.length | 0;
|
|
269
|
+
return ;
|
|
270
|
+
}
|
|
271
|
+
catch (raw_exn){
|
|
272
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
273
|
+
if (exn.RE_EXN_ID === Persistence.StorageError) {
|
|
274
|
+
return ErrorHandling.mkLogAndRaise(Logging.createChildFrom(Logging.getItemLogger(item), {
|
|
275
|
+
operator: operatorCallName,
|
|
276
|
+
tableName: entityConfig.table.tableName,
|
|
277
|
+
fieldName: fieldName,
|
|
278
|
+
fieldValue: fieldValue
|
|
279
|
+
}), exn.message, exn.reason);
|
|
280
|
+
}
|
|
281
|
+
throw exn;
|
|
282
|
+
}
|
|
283
|
+
}));
|
|
284
|
+
return Prometheus.StorageLoad.endOperation(timerRef, key, fieldValues.length, size.contents);
|
|
285
|
+
};
|
|
286
|
+
return LoadManager.call(loadManager, fieldValue, key, load, (function (fieldValue) {
|
|
287
|
+
return TableIndices.FieldValue.toString(fieldValue);
|
|
288
|
+
}), shouldGroup, InMemoryTable.Entity.hasIndex(inMemTable, fieldName, operator), InMemoryTable.Entity.getUnsafeOnIndex(inMemTable, fieldName, operator));
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export {
|
|
292
|
+
loadById ,
|
|
293
|
+
loadByField ,
|
|
294
|
+
loadEffect ,
|
|
295
|
+
}
|
|
296
|
+
/* Utils Not a pure module */
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
let loadById: (
|
|
2
|
+
~loadManager: LoadManager.t,
|
|
3
|
+
~persistence: Persistence.t,
|
|
4
|
+
~entityConfig: Internal.entityConfig,
|
|
5
|
+
~inMemoryStore: InMemoryStore.t,
|
|
6
|
+
~shouldGroup: bool,
|
|
7
|
+
~item: Internal.item,
|
|
8
|
+
~entityId: string,
|
|
9
|
+
) => promise<option<Internal.entity>>
|
|
10
|
+
|
|
11
|
+
let loadByField: (
|
|
12
|
+
~loadManager: LoadManager.t,
|
|
13
|
+
~persistence: Persistence.t,
|
|
14
|
+
~operator: TableIndices.Operator.t,
|
|
15
|
+
~entityConfig: Internal.entityConfig,
|
|
16
|
+
~inMemoryStore: InMemoryStore.t,
|
|
17
|
+
~fieldName: string,
|
|
18
|
+
~fieldValueSchema: RescriptSchema.S.t<'fieldValue>,
|
|
19
|
+
~shouldGroup: bool,
|
|
20
|
+
~item: Internal.item,
|
|
21
|
+
~fieldValue: 'fieldValue,
|
|
22
|
+
) => promise<array<Internal.entity>>
|
|
23
|
+
|
|
24
|
+
let loadEffect: (
|
|
25
|
+
~loadManager: LoadManager.t,
|
|
26
|
+
~persistence: Persistence.t,
|
|
27
|
+
~effect: Internal.effect,
|
|
28
|
+
~effectArgs: Internal.effectArgs,
|
|
29
|
+
~inMemoryStore: InMemoryStore.t,
|
|
30
|
+
~shouldGroup: bool,
|
|
31
|
+
~item: Internal.item,
|
|
32
|
+
) => promise<Internal.effectOutput>
|
package/src/LogSelection.res
CHANGED
|
@@ -84,38 +84,44 @@ let parseEventFiltersOrThrow = {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
let parse = (eventFilters: Js.Json.t): array<Internal.topicSelection> => {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
switch
|
|
93
|
-
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
)
|
|
87
|
+
if eventFilters === Obj.magic(true) {
|
|
88
|
+
[default]
|
|
89
|
+
} else if eventFilters === Obj.magic(false) {
|
|
90
|
+
[]
|
|
91
|
+
} else {
|
|
92
|
+
switch eventFilters {
|
|
93
|
+
| Array([]) => [%raw(`{}`)]
|
|
94
|
+
| Array(a) => a
|
|
95
|
+
| _ => [eventFilters]
|
|
96
|
+
}->Js.Array2.map(eventFilter => {
|
|
97
|
+
switch eventFilter {
|
|
98
|
+
| Object(eventFilter) => {
|
|
99
|
+
let filterKeys = eventFilter->Js.Dict.keys
|
|
100
|
+
switch filterKeys {
|
|
101
|
+
| [] => default
|
|
102
|
+
| _ => {
|
|
103
|
+
filterKeys->Js.Array2.forEach(key => {
|
|
104
|
+
if params->Js.Array2.includes(key)->not {
|
|
105
|
+
// In TS type validation doesn't catch this
|
|
106
|
+
// when we have eventFilters as a callback
|
|
107
|
+
Js.Exn.raiseError(
|
|
108
|
+
`Invalid event filters configuration. The event doesn't have an indexed parameter "${key}" and can't use it for filtering`,
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
})
|
|
112
|
+
{
|
|
113
|
+
Internal.topic0,
|
|
114
|
+
topic1: topic1(eventFilter),
|
|
115
|
+
topic2: topic2(eventFilter),
|
|
116
|
+
topic3: topic3(eventFilter),
|
|
105
117
|
}
|
|
106
|
-
})
|
|
107
|
-
{
|
|
108
|
-
Internal.topic0,
|
|
109
|
-
topic1: topic1(eventFilter),
|
|
110
|
-
topic2: topic2(eventFilter),
|
|
111
|
-
topic3: topic3(eventFilter),
|
|
112
118
|
}
|
|
113
119
|
}
|
|
114
120
|
}
|
|
121
|
+
| _ => Js.Exn.raiseError("Invalid event filters configuration. Expected an object")
|
|
115
122
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
})
|
|
123
|
+
})
|
|
124
|
+
}
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
let getEventFiltersOrThrow = switch eventFilters {
|
package/src/LogSelection.res.mjs
CHANGED
|
@@ -100,6 +100,12 @@ function parseEventFiltersOrThrow(eventFilters, sighash, params, topic1Opt, topi
|
|
|
100
100
|
topic3: emptyTopics
|
|
101
101
|
};
|
|
102
102
|
var parse = function (eventFilters) {
|
|
103
|
+
if (eventFilters === true) {
|
|
104
|
+
return [$$default];
|
|
105
|
+
}
|
|
106
|
+
if (eventFilters === false) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
103
109
|
var tmp;
|
|
104
110
|
tmp = !Array.isArray(eventFilters) && (eventFilters === null || typeof eventFilters !== "object") && typeof eventFilters !== "number" && typeof eventFilters !== "string" && typeof eventFilters !== "boolean" ? [eventFilters] : (
|
|
105
111
|
Array.isArray(eventFilters) ? (
|
package/src/Logging.res
CHANGED
|
@@ -42,33 +42,40 @@ let makeLogger = (~logStrategy, ~logFilePath, ~defaultFileLogLevel, ~userLogLeve
|
|
|
42
42
|
let makeMultiStreamLogger =
|
|
43
43
|
MultiStreamLogger.make(~userLogLevel, ~defaultFileLogLevel, ~customLevels=logLevels, ...)
|
|
44
44
|
|
|
45
|
+
// Empty base disables pid and hostname in logs
|
|
46
|
+
let base: Js.Json.t = %raw("{}")
|
|
47
|
+
|
|
45
48
|
switch logStrategy {
|
|
46
49
|
| EcsFile =>
|
|
47
50
|
makeWithOptionsAndTransport(
|
|
48
51
|
{
|
|
49
52
|
...Pino.ECS.make(),
|
|
50
53
|
customLevels: logLevels,
|
|
54
|
+
base,
|
|
51
55
|
},
|
|
52
56
|
Transport.make(pinoFile),
|
|
53
57
|
)
|
|
54
|
-
| EcsConsoleMultistream =>
|
|
58
|
+
| EcsConsoleMultistream =>
|
|
59
|
+
makeMultiStreamLogger(~logFile=None, ~options=Some({...Pino.ECS.make(), base}))
|
|
55
60
|
| EcsConsole =>
|
|
56
61
|
make({
|
|
57
62
|
...Pino.ECS.make(),
|
|
58
63
|
level: userLogLevel,
|
|
59
64
|
customLevels: logLevels,
|
|
65
|
+
base,
|
|
60
66
|
})
|
|
61
67
|
| FileOnly =>
|
|
62
68
|
makeWithOptionsAndTransport(
|
|
63
69
|
{
|
|
64
70
|
customLevels: logLevels,
|
|
65
71
|
level: defaultFileLogLevel,
|
|
72
|
+
base,
|
|
66
73
|
},
|
|
67
74
|
Transport.make(pinoFile),
|
|
68
75
|
)
|
|
69
|
-
| ConsoleRaw => makeMultiStreamLogger(~logFile=None, ~options=
|
|
70
|
-
| ConsolePretty => makeMultiStreamLogger(~logFile=None, ~options=
|
|
71
|
-
| Both => makeMultiStreamLogger(~logFile=Some(logFilePath), ~options=
|
|
76
|
+
| ConsoleRaw => makeMultiStreamLogger(~logFile=None, ~options=Some({base: base}))
|
|
77
|
+
| ConsolePretty => makeMultiStreamLogger(~logFile=None, ~options=Some({base: base}))
|
|
78
|
+
| Both => makeMultiStreamLogger(~logFile=Some(logFilePath), ~options=Some({base: base}))
|
|
72
79
|
}
|
|
73
80
|
}
|
|
74
81
|
|
|
@@ -147,7 +154,9 @@ let createChildFrom = (~logger: t, ~params: 'a) => {
|
|
|
147
154
|
let getItemLogger = {
|
|
148
155
|
let cacheKey = "_logger"
|
|
149
156
|
(item: Internal.item) => {
|
|
150
|
-
switch item
|
|
157
|
+
switch item
|
|
158
|
+
->(Utils.magic: Internal.item => Js.Dict.t<Pino.t>)
|
|
159
|
+
->Utils.Dict.dangerouslyGetNonOption(cacheKey) {
|
|
151
160
|
| Some(l) => l
|
|
152
161
|
| None => {
|
|
153
162
|
let l = getLogger()->child(
|
|
@@ -169,7 +178,7 @@ let getItemLogger = {
|
|
|
169
178
|
}->createChildParams
|
|
170
179
|
},
|
|
171
180
|
)
|
|
172
|
-
item->Utils.magic->Js.Dict.set(cacheKey, l)
|
|
181
|
+
item->(Utils.magic: Internal.item => Js.Dict.t<Pino.t>)->Js.Dict.set(cacheKey, l)
|
|
173
182
|
l
|
|
174
183
|
}
|
|
175
184
|
}
|
|
@@ -178,7 +187,12 @@ let getItemLogger = {
|
|
|
178
187
|
|
|
179
188
|
@inline
|
|
180
189
|
let logForItem = (item, level: Pino.logLevel, message: string, ~params=?) => {
|
|
181
|
-
(
|
|
190
|
+
(
|
|
191
|
+
item
|
|
192
|
+
->getItemLogger
|
|
193
|
+
->(Utils.magic: Pino.t => Js.Dict.t<(option<'a>, string) => unit>)
|
|
194
|
+
->Js.Dict.unsafeGet((level :> string))
|
|
195
|
+
)(params, message)
|
|
182
196
|
}
|
|
183
197
|
|
|
184
198
|
let noopLogger: Envio.logger = {
|
package/src/Logging.res.mjs
CHANGED
|
@@ -71,27 +71,35 @@ function makeLogger(logStrategy, logFilePath, defaultFileLogLevel, userLogLevel)
|
|
|
71
71
|
var makeMultiStreamLogger = function (none, none$1) {
|
|
72
72
|
return Pino.MultiStreamLogger.make(userLogLevel, logLevels, none, none$1, defaultFileLogLevel);
|
|
73
73
|
};
|
|
74
|
+
var base = {};
|
|
74
75
|
switch (logStrategy) {
|
|
75
76
|
case "ecs-file" :
|
|
76
77
|
var newrecord = Caml_obj.obj_dup(Pino.ECS.make());
|
|
77
|
-
return Pino$1.pino((newrecord.customLevels = logLevels, newrecord), Pino$1.transport(pinoFile));
|
|
78
|
+
return Pino$1.pino((newrecord.base = base, newrecord.customLevels = logLevels, newrecord), Pino$1.transport(pinoFile));
|
|
78
79
|
case "ecs-console" :
|
|
79
80
|
var newrecord$1 = Caml_obj.obj_dup(Pino.ECS.make());
|
|
80
|
-
return Pino$1.pino((newrecord$1.customLevels = logLevels, newrecord$1.level = userLogLevel, newrecord$1));
|
|
81
|
+
return Pino$1.pino((newrecord$1.base = base, newrecord$1.customLevels = logLevels, newrecord$1.level = userLogLevel, newrecord$1));
|
|
81
82
|
case "ecs-console-multistream" :
|
|
82
|
-
|
|
83
|
+
var newrecord$2 = Caml_obj.obj_dup(Pino.ECS.make());
|
|
84
|
+
return makeMultiStreamLogger(undefined, (newrecord$2.base = base, newrecord$2));
|
|
83
85
|
case "file-only" :
|
|
84
86
|
return Pino$1.pino({
|
|
85
87
|
level: defaultFileLogLevel,
|
|
86
|
-
customLevels: logLevels
|
|
88
|
+
customLevels: logLevels,
|
|
89
|
+
base: base
|
|
87
90
|
}, Pino$1.transport(pinoFile));
|
|
88
91
|
case "console-raw" :
|
|
89
92
|
case "console-pretty" :
|
|
90
|
-
|
|
93
|
+
break;
|
|
91
94
|
case "both-prettyconsole" :
|
|
92
|
-
return makeMultiStreamLogger(logFilePath,
|
|
95
|
+
return makeMultiStreamLogger(logFilePath, {
|
|
96
|
+
base: base
|
|
97
|
+
});
|
|
93
98
|
|
|
94
99
|
}
|
|
100
|
+
return makeMultiStreamLogger(undefined, {
|
|
101
|
+
base: base
|
|
102
|
+
});
|
|
95
103
|
}
|
|
96
104
|
|
|
97
105
|
function setLogger(l) {
|
|
@@ -180,7 +188,7 @@ var cacheKey = "_logger";
|
|
|
180
188
|
function getItemLogger(item) {
|
|
181
189
|
var l = item[cacheKey];
|
|
182
190
|
if (l !== undefined) {
|
|
183
|
-
return
|
|
191
|
+
return l;
|
|
184
192
|
}
|
|
185
193
|
var tmp;
|
|
186
194
|
if (item.kind === 0) {
|
|
@@ -207,7 +215,7 @@ function getItemLogger(item) {
|
|
|
207
215
|
}
|
|
208
216
|
|
|
209
217
|
function logForItem(item, level, message, params) {
|
|
210
|
-
|
|
218
|
+
getItemLogger(item)[level](params, message);
|
|
211
219
|
}
|
|
212
220
|
|
|
213
221
|
function noopLogger_debug(_message, param) {
|