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.
Files changed (175) hide show
  1. package/README.md +164 -30
  2. package/bin.mjs +49 -0
  3. package/evm.schema.json +79 -169
  4. package/fuel.schema.json +50 -21
  5. package/index.d.ts +497 -1
  6. package/index.js +4 -0
  7. package/package.json +42 -31
  8. package/rescript.json +4 -1
  9. package/src/Batch.res +11 -8
  10. package/src/Batch.res.mjs +11 -9
  11. package/src/ChainFetcher.res +531 -0
  12. package/src/ChainFetcher.res.mjs +339 -0
  13. package/src/ChainManager.res +190 -0
  14. package/src/ChainManager.res.mjs +166 -0
  15. package/src/Change.res +3 -3
  16. package/src/Config.gen.ts +19 -0
  17. package/src/Config.res +737 -22
  18. package/src/Config.res.mjs +703 -26
  19. package/src/{Indexer.res → Ctx.res} +1 -1
  20. package/src/Ecosystem.res +9 -124
  21. package/src/Ecosystem.res.mjs +19 -160
  22. package/src/Env.res +30 -74
  23. package/src/Env.res.mjs +25 -87
  24. package/src/Envio.gen.ts +3 -1
  25. package/src/Envio.res +20 -9
  26. package/src/EventProcessing.res +469 -0
  27. package/src/EventProcessing.res.mjs +337 -0
  28. package/src/EvmTypes.gen.ts +6 -0
  29. package/src/EvmTypes.res +1 -0
  30. package/src/FetchState.res +1256 -639
  31. package/src/FetchState.res.mjs +1135 -612
  32. package/src/GlobalState.res +1190 -0
  33. package/src/GlobalState.res.mjs +1183 -0
  34. package/src/GlobalStateManager.res +68 -0
  35. package/src/GlobalStateManager.res.mjs +75 -0
  36. package/src/GlobalStateManager.resi +7 -0
  37. package/src/HandlerLoader.res +89 -0
  38. package/src/HandlerLoader.res.mjs +79 -0
  39. package/src/HandlerRegister.res +357 -0
  40. package/src/HandlerRegister.res.mjs +299 -0
  41. package/src/{EventRegister.resi → HandlerRegister.resi} +13 -13
  42. package/src/Hasura.res +111 -175
  43. package/src/Hasura.res.mjs +88 -150
  44. package/src/InMemoryStore.res +1 -1
  45. package/src/InMemoryStore.res.mjs +3 -3
  46. package/src/InMemoryTable.res +1 -1
  47. package/src/InMemoryTable.res.mjs +1 -1
  48. package/src/Internal.gen.ts +4 -0
  49. package/src/Internal.res +230 -12
  50. package/src/Internal.res.mjs +115 -1
  51. package/src/LoadLayer.res +444 -0
  52. package/src/LoadLayer.res.mjs +296 -0
  53. package/src/LoadLayer.resi +32 -0
  54. package/src/LogSelection.res +33 -27
  55. package/src/LogSelection.res.mjs +6 -0
  56. package/src/Logging.res +21 -7
  57. package/src/Logging.res.mjs +16 -8
  58. package/src/Main.res +377 -0
  59. package/src/Main.res.mjs +339 -0
  60. package/src/Persistence.res +7 -21
  61. package/src/Persistence.res.mjs +3 -3
  62. package/src/PgStorage.gen.ts +10 -0
  63. package/src/PgStorage.res +116 -69
  64. package/src/PgStorage.res.d.mts +5 -0
  65. package/src/PgStorage.res.mjs +93 -50
  66. package/src/Prometheus.res +294 -224
  67. package/src/Prometheus.res.mjs +353 -340
  68. package/src/ReorgDetection.res +6 -10
  69. package/src/ReorgDetection.res.mjs +6 -6
  70. package/src/SafeCheckpointTracking.res +4 -4
  71. package/src/SafeCheckpointTracking.res.mjs +2 -2
  72. package/src/Sink.res +4 -2
  73. package/src/Sink.res.mjs +2 -1
  74. package/src/TableIndices.res +0 -1
  75. package/src/TestIndexer.res +692 -0
  76. package/src/TestIndexer.res.mjs +527 -0
  77. package/src/TestIndexerProxyStorage.res +205 -0
  78. package/src/TestIndexerProxyStorage.res.mjs +151 -0
  79. package/src/TopicFilter.res +1 -1
  80. package/src/Types.ts +1 -1
  81. package/src/UserContext.res +424 -0
  82. package/src/UserContext.res.mjs +279 -0
  83. package/src/Utils.res +97 -26
  84. package/src/Utils.res.mjs +91 -44
  85. package/src/bindings/BigInt.res +10 -0
  86. package/src/bindings/BigInt.res.mjs +15 -0
  87. package/src/bindings/ClickHouse.res +120 -23
  88. package/src/bindings/ClickHouse.res.mjs +118 -28
  89. package/src/bindings/DateFns.res +74 -0
  90. package/src/bindings/DateFns.res.mjs +22 -0
  91. package/src/bindings/EventSource.res +8 -1
  92. package/src/bindings/EventSource.res.mjs +8 -1
  93. package/src/bindings/Express.res +1 -0
  94. package/src/bindings/Hrtime.res +14 -1
  95. package/src/bindings/Hrtime.res.mjs +22 -2
  96. package/src/bindings/Hrtime.resi +4 -0
  97. package/src/bindings/Lodash.res +0 -1
  98. package/src/bindings/NodeJs.res +49 -3
  99. package/src/bindings/NodeJs.res.mjs +11 -3
  100. package/src/bindings/Pino.res +24 -10
  101. package/src/bindings/Pino.res.mjs +14 -8
  102. package/src/bindings/Postgres.gen.ts +8 -0
  103. package/src/bindings/Postgres.res +5 -1
  104. package/src/bindings/Postgres.res.d.mts +5 -0
  105. package/src/bindings/PromClient.res +0 -10
  106. package/src/bindings/PromClient.res.mjs +0 -3
  107. package/src/bindings/Vitest.res +142 -0
  108. package/src/bindings/Vitest.res.mjs +9 -0
  109. package/src/bindings/WebSocket.res +27 -0
  110. package/src/bindings/WebSocket.res.mjs +2 -0
  111. package/src/bindings/Yargs.res +8 -0
  112. package/src/bindings/Yargs.res.mjs +2 -0
  113. package/src/db/EntityHistory.res +7 -7
  114. package/src/db/EntityHistory.res.mjs +9 -9
  115. package/src/db/InternalTable.res +59 -111
  116. package/src/db/InternalTable.res.mjs +73 -104
  117. package/src/db/Table.res +27 -8
  118. package/src/db/Table.res.mjs +25 -14
  119. package/src/sources/Evm.res +84 -0
  120. package/src/sources/Evm.res.mjs +105 -0
  121. package/src/sources/EvmChain.res +94 -0
  122. package/src/sources/EvmChain.res.mjs +60 -0
  123. package/src/sources/Fuel.res +19 -34
  124. package/src/sources/Fuel.res.mjs +34 -16
  125. package/src/sources/FuelSDK.res +38 -0
  126. package/src/sources/FuelSDK.res.mjs +29 -0
  127. package/src/sources/HyperFuel.res +2 -2
  128. package/src/sources/HyperFuel.resi +1 -1
  129. package/src/sources/HyperFuelClient.res +2 -2
  130. package/src/sources/HyperFuelSource.res +33 -13
  131. package/src/sources/HyperFuelSource.res.mjs +24 -16
  132. package/src/sources/HyperSync.res +36 -6
  133. package/src/sources/HyperSync.res.mjs +9 -7
  134. package/src/sources/HyperSync.resi +4 -0
  135. package/src/sources/HyperSyncClient.res +1 -1
  136. package/src/sources/HyperSyncHeightStream.res +47 -116
  137. package/src/sources/HyperSyncHeightStream.res.mjs +46 -73
  138. package/src/sources/HyperSyncSource.res +118 -139
  139. package/src/sources/HyperSyncSource.res.mjs +104 -121
  140. package/src/sources/Rpc.res +86 -14
  141. package/src/sources/Rpc.res.mjs +101 -9
  142. package/src/sources/RpcSource.res +621 -364
  143. package/src/sources/RpcSource.res.mjs +843 -410
  144. package/src/sources/RpcWebSocketHeightStream.res +181 -0
  145. package/src/sources/RpcWebSocketHeightStream.res.mjs +196 -0
  146. package/src/sources/Source.res +7 -5
  147. package/src/sources/SourceManager.res +325 -225
  148. package/src/sources/SourceManager.res.mjs +314 -171
  149. package/src/sources/SourceManager.resi +17 -6
  150. package/src/sources/Svm.res +81 -0
  151. package/src/sources/Svm.res.mjs +90 -0
  152. package/src/tui/Tui.res +247 -0
  153. package/src/tui/Tui.res.mjs +337 -0
  154. package/src/tui/bindings/Ink.res +371 -0
  155. package/src/tui/bindings/Ink.res.mjs +72 -0
  156. package/src/tui/bindings/Style.res +123 -0
  157. package/src/tui/bindings/Style.res.mjs +2 -0
  158. package/src/tui/components/BufferedProgressBar.res +40 -0
  159. package/src/tui/components/BufferedProgressBar.res.mjs +57 -0
  160. package/src/tui/components/CustomHooks.res +122 -0
  161. package/src/tui/components/CustomHooks.res.mjs +179 -0
  162. package/src/tui/components/Messages.res +41 -0
  163. package/src/tui/components/Messages.res.mjs +75 -0
  164. package/src/tui/components/SyncETA.res +174 -0
  165. package/src/tui/components/SyncETA.res.mjs +263 -0
  166. package/src/tui/components/TuiData.res +47 -0
  167. package/src/tui/components/TuiData.res.mjs +34 -0
  168. package/svm.schema.json +112 -0
  169. package/bin.js +0 -48
  170. package/src/EventRegister.res +0 -241
  171. package/src/EventRegister.res.mjs +0 -240
  172. package/src/bindings/Ethers.gen.ts +0 -14
  173. package/src/bindings/Ethers.res +0 -204
  174. package/src/bindings/Ethers.res.mjs +0 -130
  175. /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>
@@ -84,38 +84,44 @@ let parseEventFiltersOrThrow = {
84
84
  }
85
85
 
86
86
  let parse = (eventFilters: Js.Json.t): array<Internal.topicSelection> => {
87
- switch eventFilters {
88
- | Array([]) => [%raw(`{}`)]
89
- | Array(a) => a
90
- | _ => [eventFilters]
91
- }->Js.Array2.map(eventFilter => {
92
- switch eventFilter {
93
- | Object(eventFilter) => {
94
- let filterKeys = eventFilter->Js.Dict.keys
95
- switch filterKeys {
96
- | [] => default
97
- | _ => {
98
- filterKeys->Js.Array2.forEach(key => {
99
- if params->Js.Array2.includes(key)->not {
100
- // In TS type validation doesn't catch this
101
- // when we have eventFilters as a callback
102
- Js.Exn.raiseError(
103
- `Invalid event filters configuration. The event doesn't have an indexed parameter "${key}" and can't use it for filtering`,
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
- | _ => Js.Exn.raiseError("Invalid event filters configuration. Expected an object")
117
- }
118
- })
123
+ })
124
+ }
119
125
  }
120
126
 
121
127
  let getEventFiltersOrThrow = switch eventFilters {
@@ -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 => makeMultiStreamLogger(~logFile=None, ~options=Some(Pino.ECS.make()))
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=None)
70
- | ConsolePretty => makeMultiStreamLogger(~logFile=None, ~options=None)
71
- | Both => makeMultiStreamLogger(~logFile=Some(logFilePath), ~options=None)
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->Utils.magic->Utils.Dict.dangerouslyGetNonOption(cacheKey) {
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
- (item->getItemLogger->Utils.magic->Js.Dict.unsafeGet((level :> string)))(params, message)
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 = {
@@ -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
- return makeMultiStreamLogger(undefined, Pino.ECS.make());
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
- return makeMultiStreamLogger(undefined, undefined);
93
+ break;
91
94
  case "both-prettyconsole" :
92
- return makeMultiStreamLogger(logFilePath, undefined);
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 Caml_option.valFromOption(l);
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
- return getItemLogger(item)[level](params, message);
218
+ getItemLogger(item)[level](params, message);
211
219
  }
212
220
 
213
221
  function noopLogger_debug(_message, param) {