envio 3.0.0-alpha.21 → 3.0.0-alpha.23
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 +3 -3
- package/bin.mjs +2 -48
- package/evm.schema.json +67 -0
- package/fuel.schema.json +67 -0
- package/index.d.ts +822 -38
- package/index.js +5 -3
- package/package.json +10 -8
- package/rescript.json +5 -9
- package/src/Address.res +4 -5
- package/src/Address.res.mjs +9 -12
- package/src/Api.res +15 -0
- package/src/Api.res.mjs +20 -0
- package/src/Batch.res +32 -34
- package/src/Batch.res.mjs +172 -187
- package/src/Bin.res +89 -0
- package/src/Bin.res.mjs +97 -0
- package/src/ChainFetcher.res +33 -57
- package/src/ChainFetcher.res.mjs +197 -227
- package/src/ChainManager.res +6 -14
- package/src/ChainManager.res.mjs +74 -85
- package/src/ChainMap.res +14 -16
- package/src/ChainMap.res.mjs +38 -38
- package/src/Config.res +193 -135
- package/src/Config.res.mjs +566 -592
- package/src/Core.res +182 -0
- package/src/Core.res.mjs +207 -0
- package/src/Ecosystem.res +25 -4
- package/src/Ecosystem.res.mjs +12 -13
- package/src/Env.res +20 -13
- package/src/Env.res.mjs +124 -113
- package/src/EnvSafe.res +269 -0
- package/src/EnvSafe.res.mjs +296 -0
- package/src/EnvSafe.resi +18 -0
- package/src/Envio.res +37 -26
- package/src/Envio.res.mjs +59 -60
- package/src/ErrorHandling.res +2 -2
- package/src/ErrorHandling.res.mjs +15 -15
- package/src/EventConfigBuilder.res +219 -81
- package/src/EventConfigBuilder.res.mjs +259 -202
- package/src/EventProcessing.res +27 -38
- package/src/EventProcessing.res.mjs +165 -183
- package/src/EventUtils.res +11 -11
- package/src/EventUtils.res.mjs +21 -22
- package/src/EvmTypes.res +0 -1
- package/src/EvmTypes.res.mjs +5 -5
- package/src/FetchState.res +360 -256
- package/src/FetchState.res.mjs +958 -914
- package/src/GlobalState.res +365 -351
- package/src/GlobalState.res.mjs +958 -992
- package/src/GlobalStateManager.res +1 -2
- package/src/GlobalStateManager.res.mjs +36 -44
- package/src/HandlerLoader.res +107 -23
- package/src/HandlerLoader.res.mjs +128 -38
- package/src/HandlerRegister.res +127 -103
- package/src/HandlerRegister.res.mjs +164 -164
- package/src/HandlerRegister.resi +12 -4
- package/src/Hasura.res +35 -22
- package/src/Hasura.res.mjs +158 -167
- package/src/InMemoryStore.res +20 -27
- package/src/InMemoryStore.res.mjs +64 -80
- package/src/InMemoryTable.res +34 -39
- package/src/InMemoryTable.res.mjs +165 -170
- package/src/Internal.res +52 -33
- package/src/Internal.res.mjs +84 -81
- package/src/LazyLoader.res.mjs +55 -61
- package/src/LoadLayer.res +77 -78
- package/src/LoadLayer.res.mjs +160 -189
- package/src/LoadManager.res +16 -21
- package/src/LoadManager.res.mjs +79 -84
- package/src/LogSelection.res +236 -68
- package/src/LogSelection.res.mjs +211 -141
- package/src/Logging.res +13 -9
- package/src/Logging.res.mjs +130 -143
- package/src/Main.res +430 -51
- package/src/Main.res.mjs +530 -271
- package/src/Persistence.res +80 -84
- package/src/Persistence.res.mjs +131 -132
- package/src/PgStorage.res +294 -167
- package/src/PgStorage.res.mjs +799 -817
- package/src/Prometheus.res +50 -58
- package/src/Prometheus.res.mjs +345 -373
- package/src/ReorgDetection.res +22 -24
- package/src/ReorgDetection.res.mjs +100 -106
- package/src/SafeCheckpointTracking.res +7 -7
- package/src/SafeCheckpointTracking.res.mjs +40 -43
- package/src/SimulateItems.res +41 -49
- package/src/SimulateItems.res.mjs +257 -272
- package/src/Sink.res +2 -2
- package/src/Sink.res.mjs +22 -26
- package/src/TableIndices.res +1 -2
- package/src/TableIndices.res.mjs +42 -48
- package/src/TestIndexer.res +196 -189
- package/src/TestIndexer.res.mjs +536 -536
- package/src/TestIndexerProxyStorage.res +16 -16
- package/src/TestIndexerProxyStorage.res.mjs +99 -122
- package/src/TestIndexerWorker.res +4 -0
- package/src/TestIndexerWorker.res.mjs +7 -0
- package/src/Throttler.res +3 -3
- package/src/Throttler.res.mjs +23 -24
- package/src/Time.res +1 -1
- package/src/Time.res.mjs +18 -21
- package/src/TopicFilter.res +3 -3
- package/src/TopicFilter.res.mjs +29 -30
- package/src/UserContext.res +93 -54
- package/src/UserContext.res.mjs +197 -182
- package/src/Utils.res +141 -86
- package/src/Utils.res.mjs +334 -295
- package/src/bindings/BigDecimal.res +0 -2
- package/src/bindings/BigDecimal.res.mjs +19 -23
- package/src/bindings/ClickHouse.res +28 -27
- package/src/bindings/ClickHouse.res.mjs +243 -240
- package/src/bindings/DateFns.res +11 -11
- package/src/bindings/DateFns.res.mjs +7 -7
- package/src/bindings/EventSource.res.mjs +2 -2
- package/src/bindings/Express.res +2 -5
- package/src/bindings/Hrtime.res +2 -2
- package/src/bindings/Hrtime.res.mjs +30 -32
- package/src/bindings/Lodash.res.mjs +1 -1
- package/src/bindings/NodeJs.res +14 -9
- package/src/bindings/NodeJs.res.mjs +20 -20
- package/src/bindings/Pino.res +8 -10
- package/src/bindings/Pino.res.mjs +40 -43
- package/src/bindings/Postgres.res +7 -5
- package/src/bindings/Postgres.res.mjs +9 -9
- package/src/bindings/PromClient.res +17 -2
- package/src/bindings/PromClient.res.mjs +30 -7
- package/src/bindings/SDSL.res.mjs +2 -2
- package/src/bindings/Viem.res +4 -4
- package/src/bindings/Viem.res.mjs +20 -22
- package/src/bindings/Vitest.res +1 -1
- package/src/bindings/Vitest.res.mjs +2 -2
- package/src/bindings/WebSocket.res +1 -1
- package/src/db/EntityHistory.res +9 -3
- package/src/db/EntityHistory.res.mjs +84 -59
- package/src/db/InternalTable.res +62 -60
- package/src/db/InternalTable.res.mjs +271 -203
- package/src/db/Schema.res +1 -2
- package/src/db/Schema.res.mjs +28 -32
- package/src/db/Table.res +28 -27
- package/src/db/Table.res.mjs +276 -292
- package/src/sources/EventRouter.res +21 -16
- package/src/sources/EventRouter.res.mjs +55 -57
- package/src/sources/Evm.res +17 -1
- package/src/sources/Evm.res.mjs +16 -8
- package/src/sources/EvmChain.res +15 -17
- package/src/sources/EvmChain.res.mjs +40 -42
- package/src/sources/Fuel.res +14 -1
- package/src/sources/Fuel.res.mjs +16 -8
- package/src/sources/FuelSDK.res +1 -1
- package/src/sources/FuelSDK.res.mjs +6 -8
- package/src/sources/HyperFuel.res +8 -10
- package/src/sources/HyperFuel.res.mjs +113 -123
- package/src/sources/HyperFuelClient.res.mjs +6 -7
- package/src/sources/HyperFuelSource.res +19 -20
- package/src/sources/HyperFuelSource.res.mjs +339 -356
- package/src/sources/HyperSync.res +11 -13
- package/src/sources/HyperSync.res.mjs +206 -220
- package/src/sources/HyperSyncClient.res +5 -7
- package/src/sources/HyperSyncClient.res.mjs +70 -75
- package/src/sources/HyperSyncHeightStream.res +8 -9
- package/src/sources/HyperSyncHeightStream.res.mjs +78 -86
- package/src/sources/HyperSyncJsonApi.res +18 -15
- package/src/sources/HyperSyncJsonApi.res.mjs +201 -231
- package/src/sources/HyperSyncSource.res +17 -21
- package/src/sources/HyperSyncSource.res.mjs +268 -290
- package/src/sources/Rpc.res +5 -5
- package/src/sources/Rpc.res.mjs +168 -192
- package/src/sources/RpcSource.res +166 -167
- package/src/sources/RpcSource.res.mjs +972 -1046
- package/src/sources/RpcWebSocketHeightStream.res +10 -11
- package/src/sources/RpcWebSocketHeightStream.res.mjs +131 -145
- package/src/sources/SimulateSource.res +1 -1
- package/src/sources/SimulateSource.res.mjs +35 -38
- package/src/sources/Source.res +1 -1
- package/src/sources/Source.res.mjs +3 -3
- package/src/sources/SourceManager.res +39 -20
- package/src/sources/SourceManager.res.mjs +340 -371
- package/src/sources/SourceManager.resi +2 -1
- package/src/sources/Svm.res +12 -5
- package/src/sources/Svm.res.mjs +44 -41
- package/src/tui/Tui.res +23 -12
- package/src/tui/Tui.res.mjs +292 -290
- package/src/tui/bindings/Ink.res +2 -4
- package/src/tui/bindings/Ink.res.mjs +35 -41
- package/src/tui/components/BufferedProgressBar.res +7 -7
- package/src/tui/components/BufferedProgressBar.res.mjs +46 -46
- package/src/tui/components/CustomHooks.res +1 -2
- package/src/tui/components/CustomHooks.res.mjs +102 -122
- package/src/tui/components/Messages.res +1 -2
- package/src/tui/components/Messages.res.mjs +38 -42
- package/src/tui/components/SyncETA.res +10 -11
- package/src/tui/components/SyncETA.res.mjs +178 -196
- package/src/tui/components/TuiData.res +1 -1
- package/src/tui/components/TuiData.res.mjs +7 -6
- package/src/vendored/Rest.res +52 -66
- package/src/vendored/Rest.res.mjs +324 -364
- package/svm.schema.json +67 -0
- package/src/Address.gen.ts +0 -8
- package/src/Config.gen.ts +0 -19
- package/src/Envio.gen.ts +0 -55
- package/src/EvmTypes.gen.ts +0 -6
- package/src/InMemoryStore.gen.ts +0 -6
- package/src/Internal.gen.ts +0 -64
- package/src/PgStorage.gen.ts +0 -10
- package/src/PgStorage.res.d.mts +0 -5
- package/src/Types.ts +0 -56
- package/src/bindings/BigDecimal.gen.ts +0 -14
- package/src/bindings/BigDecimal.res.d.mts +0 -5
- package/src/bindings/BigInt.gen.ts +0 -10
- package/src/bindings/BigInt.res +0 -70
- package/src/bindings/BigInt.res.d.mts +0 -5
- package/src/bindings/BigInt.res.mjs +0 -154
- package/src/bindings/Ethers.res.d.mts +0 -5
- package/src/bindings/Pino.gen.ts +0 -17
- package/src/bindings/Postgres.gen.ts +0 -8
- package/src/bindings/Postgres.res.d.mts +0 -5
- package/src/bindings/Promise.res +0 -67
- package/src/bindings/Promise.res.mjs +0 -26
- package/src/db/InternalTable.gen.ts +0 -36
- package/src/sources/HyperSyncClient.gen.ts +0 -19
|
@@ -1,27 +1,51 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as
|
|
3
|
+
import * as Utils from "./Utils.res.mjs";
|
|
4
4
|
import * as Logging from "./Logging.res.mjs";
|
|
5
|
-
import * as
|
|
6
|
-
import * as
|
|
7
|
-
import * as
|
|
5
|
+
import * as Belt_Option from "@rescript/runtime/lib/es6/Belt_Option.js";
|
|
6
|
+
import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
|
|
7
|
+
import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
let version = Utils.EnvioPackage.value.version;
|
|
10
|
+
|
|
11
|
+
let existing = globalThis.__envioRegistry;
|
|
12
|
+
|
|
13
|
+
let registry;
|
|
14
|
+
|
|
15
|
+
if (existing == null) {
|
|
16
|
+
let fresh_eventRegistrations = {};
|
|
17
|
+
let fresh_activeRegistration = {
|
|
18
|
+
contents: undefined
|
|
19
|
+
};
|
|
20
|
+
let fresh_preRegistered = [];
|
|
21
|
+
let fresh = {
|
|
22
|
+
version: version,
|
|
23
|
+
eventRegistrations: fresh_eventRegistrations,
|
|
24
|
+
activeRegistration: fresh_activeRegistration,
|
|
25
|
+
preRegistered: fresh_preRegistered
|
|
26
|
+
};
|
|
27
|
+
globalThis.__envioRegistry = fresh;
|
|
28
|
+
registry = fresh;
|
|
29
|
+
} else {
|
|
30
|
+
registry = existing.version === version ? existing : Stdlib_JsError.throwWithMessage(`Multiple incompatible envio versions loaded in the same process: ` + existing.version + ` and ` + version + `. Deduplicate the 'envio' dependency in your project.`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let eventRegistrations = registry.eventRegistrations;
|
|
10
34
|
|
|
11
35
|
function getKey(contractName, eventName) {
|
|
12
36
|
return contractName + "." + eventName;
|
|
13
37
|
}
|
|
14
38
|
|
|
15
39
|
function get(contractName, eventName) {
|
|
16
|
-
|
|
40
|
+
let existing = eventRegistrations[getKey(contractName, eventName)];
|
|
17
41
|
if (existing !== undefined) {
|
|
18
42
|
return existing;
|
|
19
43
|
} else {
|
|
20
44
|
return {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
45
|
+
handler: undefined,
|
|
46
|
+
contractRegister: undefined,
|
|
47
|
+
eventOptions: undefined
|
|
48
|
+
};
|
|
25
49
|
}
|
|
26
50
|
}
|
|
27
51
|
|
|
@@ -29,28 +53,26 @@ function set(contractName, eventName, registration) {
|
|
|
29
53
|
eventRegistrations[getKey(contractName, eventName)] = registration;
|
|
30
54
|
}
|
|
31
55
|
|
|
32
|
-
|
|
33
|
-
contents: undefined
|
|
34
|
-
};
|
|
56
|
+
let activeRegistration = registry.activeRegistration;
|
|
35
57
|
|
|
36
|
-
|
|
58
|
+
let preRegistered = registry.preRegistered;
|
|
37
59
|
|
|
38
60
|
function withRegistration(fn) {
|
|
39
|
-
|
|
61
|
+
let r = activeRegistration.contents;
|
|
40
62
|
if (r !== undefined) {
|
|
41
63
|
if (r.finished) {
|
|
42
|
-
return
|
|
64
|
+
return Stdlib_JsError.throwWithMessage("The indexer finished initializing, so no more handlers can be registered. Make sure the handlers are registered on the top level of the file.");
|
|
43
65
|
} else {
|
|
44
66
|
return fn(r);
|
|
45
67
|
}
|
|
46
68
|
} else {
|
|
47
69
|
preRegistered.push(fn);
|
|
48
|
-
return
|
|
70
|
+
return;
|
|
49
71
|
}
|
|
50
72
|
}
|
|
51
73
|
|
|
52
74
|
function startRegistration(ecosystem, multichain) {
|
|
53
|
-
|
|
75
|
+
let r = {
|
|
54
76
|
ecosystem: ecosystem,
|
|
55
77
|
multichain: multichain,
|
|
56
78
|
registrations: {
|
|
@@ -59,27 +81,26 @@ function startRegistration(ecosystem, multichain) {
|
|
|
59
81
|
finished: false
|
|
60
82
|
};
|
|
61
83
|
activeRegistration.contents = r;
|
|
62
|
-
while(preRegistered.length
|
|
63
|
-
|
|
84
|
+
while (preRegistered.length !== 0) {
|
|
85
|
+
let fn = preRegistered.pop();
|
|
64
86
|
if (fn !== undefined) {
|
|
65
87
|
fn(r);
|
|
66
88
|
}
|
|
67
|
-
|
|
68
89
|
};
|
|
69
90
|
}
|
|
70
91
|
|
|
71
92
|
function finishRegistration() {
|
|
72
|
-
|
|
93
|
+
let r = activeRegistration.contents;
|
|
73
94
|
if (r !== undefined) {
|
|
74
95
|
r.finished = true;
|
|
75
96
|
return r.registrations;
|
|
76
97
|
} else {
|
|
77
|
-
return
|
|
98
|
+
return Stdlib_JsError.throwWithMessage("The indexer has not started registering handlers, so can't finish it.");
|
|
78
99
|
}
|
|
79
100
|
}
|
|
80
101
|
|
|
81
102
|
function isPendingRegistration() {
|
|
82
|
-
|
|
103
|
+
let r = activeRegistration.contents;
|
|
83
104
|
if (r !== undefined) {
|
|
84
105
|
return !r.finished;
|
|
85
106
|
} else {
|
|
@@ -87,48 +108,36 @@ function isPendingRegistration() {
|
|
|
87
108
|
}
|
|
88
109
|
}
|
|
89
110
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
111
|
+
function throwIfFinishedRegistration(methodName) {
|
|
112
|
+
let match = activeRegistration.contents;
|
|
113
|
+
if (match === undefined) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
let match$1 = match.finished;
|
|
117
|
+
if (match$1) {
|
|
118
|
+
return Stdlib_JsError.throwWithMessage(`Cannot call \`indexer.` + methodName + `\` after the indexer has started. Make sure all handlers are registered at the top level of your handler module.`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
99
121
|
|
|
100
|
-
function
|
|
101
|
-
withRegistration(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
});
|
|
120
|
-
} else {
|
|
121
|
-
onBlockByChainId[chainId] = [{
|
|
122
|
-
index: 0,
|
|
123
|
-
name: options.name,
|
|
124
|
-
chainId: chainId,
|
|
125
|
-
startBlock: options.startBlock,
|
|
126
|
-
endBlock: options.endBlock,
|
|
127
|
-
interval: options.interval,
|
|
128
|
-
handler: handler
|
|
129
|
-
}];
|
|
130
|
-
}
|
|
131
|
-
});
|
|
122
|
+
function registerOnBlock(name, chainId, interval, startBlock, endBlock, handler) {
|
|
123
|
+
withRegistration(registration => {
|
|
124
|
+
let match = registration.multichain;
|
|
125
|
+
if (match === "ordered") {
|
|
126
|
+
Stdlib_JsError.throwWithMessage("Block Handlers are not supported for ordered multichain mode. Please reach out to the Envio team if you need this feature. Or enable unordered multichain mode by removing `multichain: ordered` from the config.yaml file.");
|
|
127
|
+
}
|
|
128
|
+
let onBlockByChainId = registration.registrations.onBlockByChainId;
|
|
129
|
+
let key = String(chainId);
|
|
130
|
+
let index = Belt_Option.mapWithDefault(onBlockByChainId[key], 0, configs => configs.length);
|
|
131
|
+
Utils.Dict.push(onBlockByChainId, key, {
|
|
132
|
+
index: index,
|
|
133
|
+
name: name,
|
|
134
|
+
chainId: chainId,
|
|
135
|
+
startBlock: startBlock,
|
|
136
|
+
endBlock: endBlock,
|
|
137
|
+
interval: interval,
|
|
138
|
+
handler: handler
|
|
139
|
+
});
|
|
140
|
+
});
|
|
132
141
|
}
|
|
133
142
|
|
|
134
143
|
function getHandler(contractName, eventName) {
|
|
@@ -139,20 +148,16 @@ function getContractRegister(contractName, eventName) {
|
|
|
139
148
|
return get(contractName, eventName).contractRegister;
|
|
140
149
|
}
|
|
141
150
|
|
|
142
|
-
function
|
|
143
|
-
return Belt_Option.flatMap(get(contractName, eventName).eventOptions,
|
|
144
|
-
return value.eventFilters;
|
|
145
|
-
}));
|
|
151
|
+
function getOnEventWhere(contractName, eventName) {
|
|
152
|
+
return Belt_Option.flatMap(get(contractName, eventName).eventOptions, value => value.where);
|
|
146
153
|
}
|
|
147
154
|
|
|
148
155
|
function isWildcard(contractName, eventName) {
|
|
149
|
-
return Belt_Option.getWithDefault(Belt_Option.flatMap(get(contractName, eventName).eventOptions,
|
|
150
|
-
return value.wildcard;
|
|
151
|
-
})), false);
|
|
156
|
+
return Belt_Option.getWithDefault(Belt_Option.flatMap(get(contractName, eventName).eventOptions, value => value.wildcard), false);
|
|
152
157
|
}
|
|
153
158
|
|
|
154
159
|
function hasRegistration(contractName, eventName) {
|
|
155
|
-
|
|
160
|
+
let r = get(contractName, eventName);
|
|
156
161
|
if (Belt_Option.isSome(r.handler)) {
|
|
157
162
|
return true;
|
|
158
163
|
} else {
|
|
@@ -161,28 +166,26 @@ function hasRegistration(contractName, eventName) {
|
|
|
161
166
|
}
|
|
162
167
|
|
|
163
168
|
function raiseDuplicateRegistration(contractName, eventName, msg, logger) {
|
|
164
|
-
|
|
169
|
+
let fullMsg = msg + " for " + contractName + "." + eventName;
|
|
165
170
|
Logging.childError(Logging.createChildFrom(logger, {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
return
|
|
171
|
+
contractName: contractName,
|
|
172
|
+
eventName: eventName
|
|
173
|
+
}), fullMsg);
|
|
174
|
+
return Stdlib_JsError.throwWithMessage(fullMsg);
|
|
170
175
|
}
|
|
171
176
|
|
|
172
177
|
function eventOptionsMatch(existing, incoming) {
|
|
173
178
|
if (existing !== undefined) {
|
|
174
179
|
if (incoming !== undefined && existing.wildcard === incoming.wildcard) {
|
|
175
|
-
|
|
176
|
-
|
|
180
|
+
let a = existing.where;
|
|
181
|
+
let b = incoming.where;
|
|
177
182
|
if (a !== undefined) {
|
|
178
|
-
if (
|
|
179
|
-
if (
|
|
180
|
-
return
|
|
183
|
+
if (b !== undefined) {
|
|
184
|
+
if (typeof a === "function" || typeof b === "function") {
|
|
185
|
+
return a === b;
|
|
181
186
|
} else {
|
|
182
|
-
return
|
|
187
|
+
return Primitive_object.equal(a, b);
|
|
183
188
|
}
|
|
184
|
-
} else if (b !== undefined && b.TAG !== "Static") {
|
|
185
|
-
return a._0 === b._0;
|
|
186
189
|
} else {
|
|
187
190
|
return false;
|
|
188
191
|
}
|
|
@@ -198,102 +201,99 @@ function eventOptionsMatch(existing, incoming) {
|
|
|
198
201
|
}
|
|
199
202
|
|
|
200
203
|
function setEventOptions(contractName, eventName, eventOptions, loggerOpt) {
|
|
201
|
-
|
|
204
|
+
let logger = loggerOpt !== undefined ? loggerOpt : Logging.getLogger();
|
|
202
205
|
if (eventOptions === undefined) {
|
|
203
|
-
return
|
|
206
|
+
return;
|
|
204
207
|
}
|
|
205
|
-
|
|
206
|
-
|
|
208
|
+
let t = get(contractName, eventName);
|
|
209
|
+
let existingValue = t.eventOptions;
|
|
207
210
|
if (existingValue !== undefined) {
|
|
208
211
|
if (!eventOptionsMatch(existingValue, eventOptions)) {
|
|
209
|
-
return raiseDuplicateRegistration(contractName, eventName, "Cannot register handler with different options. Make sure all handlers for the same event use identical options (wildcard,
|
|
212
|
+
return raiseDuplicateRegistration(contractName, eventName, "Cannot register handler with different options. Make sure all handlers for the same event use identical options (wildcard, where)", logger);
|
|
210
213
|
} else {
|
|
211
|
-
return
|
|
214
|
+
return;
|
|
212
215
|
}
|
|
213
216
|
} else {
|
|
214
217
|
return set(contractName, eventName, {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
218
|
+
handler: t.handler,
|
|
219
|
+
contractRegister: t.contractRegister,
|
|
220
|
+
eventOptions: eventOptions
|
|
221
|
+
});
|
|
219
222
|
}
|
|
220
223
|
}
|
|
221
224
|
|
|
222
225
|
function setHandler(contractName, eventName, handler, eventOptions, loggerOpt) {
|
|
223
|
-
|
|
224
|
-
withRegistration(
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
contractRegister: t.contractRegister,
|
|
241
|
-
eventOptions: t.eventOptions
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
setEventOptions(contractName, eventName, eventOptions, logger);
|
|
245
|
-
var t$1 = get(contractName, eventName);
|
|
246
|
-
set(contractName, eventName, {
|
|
247
|
-
handler: handler,
|
|
248
|
-
contractRegister: t$1.contractRegister,
|
|
249
|
-
eventOptions: t$1.eventOptions
|
|
250
|
-
});
|
|
226
|
+
let logger = loggerOpt !== undefined ? loggerOpt : Logging.getLogger();
|
|
227
|
+
withRegistration(_registration => {
|
|
228
|
+
let t = get(contractName, eventName);
|
|
229
|
+
let prevHandler = t.handler;
|
|
230
|
+
if (prevHandler !== undefined) {
|
|
231
|
+
let incomingEventOptions = Belt_Option.map(eventOptions, v => v);
|
|
232
|
+
if (!eventOptionsMatch(t.eventOptions, incomingEventOptions)) {
|
|
233
|
+
return raiseDuplicateRegistration(contractName, eventName, "Cannot register a second handler with different options. Make sure all handlers for the same event use identical options (wildcard, where)", logger);
|
|
234
|
+
}
|
|
235
|
+
let composedHandler = async args => {
|
|
236
|
+
await prevHandler(args);
|
|
237
|
+
return await handler(args);
|
|
238
|
+
};
|
|
239
|
+
return set(contractName, eventName, {
|
|
240
|
+
handler: composedHandler,
|
|
241
|
+
contractRegister: t.contractRegister,
|
|
242
|
+
eventOptions: t.eventOptions
|
|
251
243
|
});
|
|
244
|
+
}
|
|
245
|
+
setEventOptions(contractName, eventName, eventOptions, logger);
|
|
246
|
+
let t$1 = get(contractName, eventName);
|
|
247
|
+
set(contractName, eventName, {
|
|
248
|
+
handler: handler,
|
|
249
|
+
contractRegister: t$1.contractRegister,
|
|
250
|
+
eventOptions: t$1.eventOptions
|
|
251
|
+
});
|
|
252
|
+
});
|
|
252
253
|
}
|
|
253
254
|
|
|
254
255
|
function setContractRegister(contractName, eventName, contractRegister, eventOptions, loggerOpt) {
|
|
255
|
-
|
|
256
|
-
withRegistration(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
contractRegister: composedContractRegister,
|
|
273
|
-
eventOptions: t.eventOptions
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
setEventOptions(contractName, eventName, eventOptions, logger);
|
|
277
|
-
var t$1 = get(contractName, eventName);
|
|
278
|
-
set(contractName, eventName, {
|
|
279
|
-
handler: t$1.handler,
|
|
280
|
-
contractRegister: contractRegister,
|
|
281
|
-
eventOptions: t$1.eventOptions
|
|
282
|
-
});
|
|
256
|
+
let logger = loggerOpt !== undefined ? loggerOpt : Logging.getLogger();
|
|
257
|
+
withRegistration(_registration => {
|
|
258
|
+
let t = get(contractName, eventName);
|
|
259
|
+
let prevContractRegister = t.contractRegister;
|
|
260
|
+
if (prevContractRegister !== undefined) {
|
|
261
|
+
let incomingEventOptions = Belt_Option.map(eventOptions, v => v);
|
|
262
|
+
if (!eventOptionsMatch(t.eventOptions, incomingEventOptions)) {
|
|
263
|
+
return raiseDuplicateRegistration(contractName, eventName, "Cannot register a second contractRegister with different options. Make sure all handlers for the same event use identical options (wildcard, where)", logger);
|
|
264
|
+
}
|
|
265
|
+
let composedContractRegister = async args => {
|
|
266
|
+
await prevContractRegister(args);
|
|
267
|
+
return await contractRegister(args);
|
|
268
|
+
};
|
|
269
|
+
return set(contractName, eventName, {
|
|
270
|
+
handler: t.handler,
|
|
271
|
+
contractRegister: composedContractRegister,
|
|
272
|
+
eventOptions: t.eventOptions
|
|
283
273
|
});
|
|
274
|
+
}
|
|
275
|
+
setEventOptions(contractName, eventName, eventOptions, logger);
|
|
276
|
+
let t$1 = get(contractName, eventName);
|
|
277
|
+
set(contractName, eventName, {
|
|
278
|
+
handler: t$1.handler,
|
|
279
|
+
contractRegister: contractRegister,
|
|
280
|
+
eventOptions: t$1.eventOptions
|
|
281
|
+
});
|
|
282
|
+
});
|
|
284
283
|
}
|
|
285
284
|
|
|
286
285
|
export {
|
|
287
|
-
startRegistration
|
|
288
|
-
isPendingRegistration
|
|
289
|
-
finishRegistration
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
286
|
+
startRegistration,
|
|
287
|
+
isPendingRegistration,
|
|
288
|
+
finishRegistration,
|
|
289
|
+
throwIfFinishedRegistration,
|
|
290
|
+
setHandler,
|
|
291
|
+
setContractRegister,
|
|
292
|
+
getHandler,
|
|
293
|
+
getContractRegister,
|
|
294
|
+
getOnEventWhere,
|
|
295
|
+
isWildcard,
|
|
296
|
+
hasRegistration,
|
|
297
|
+
registerOnBlock,
|
|
298
298
|
}
|
|
299
|
-
/*
|
|
299
|
+
/* existing Not a pure module */
|
package/src/HandlerRegister.resi
CHANGED
|
@@ -3,19 +3,20 @@ type registrations = {onBlockByChainId: dict<array<Internal.onBlockConfig>>}
|
|
|
3
3
|
let startRegistration: (~ecosystem: Ecosystem.t, ~multichain: Internal.multichain) => unit
|
|
4
4
|
let isPendingRegistration: unit => bool
|
|
5
5
|
let finishRegistration: unit => registrations
|
|
6
|
+
let throwIfFinishedRegistration: (~methodName: string) => unit
|
|
6
7
|
|
|
7
8
|
let setHandler: (
|
|
8
9
|
~contractName: string,
|
|
9
10
|
~eventName: string,
|
|
10
11
|
Internal.genericHandler<Internal.genericHandlerArgs<'event, Internal.handlerContext>>,
|
|
11
|
-
~eventOptions: option<Internal.eventOptions<'
|
|
12
|
+
~eventOptions: option<Internal.eventOptions<'where>>,
|
|
12
13
|
~logger: Pino.t=?,
|
|
13
14
|
) => unit
|
|
14
15
|
let setContractRegister: (
|
|
15
16
|
~contractName: string,
|
|
16
17
|
~eventName: string,
|
|
17
18
|
Internal.genericContractRegister<Internal.genericContractRegisterArgs<'event, 'context>>,
|
|
18
|
-
~eventOptions: option<Internal.eventOptions<'
|
|
19
|
+
~eventOptions: option<Internal.eventOptions<'where>>,
|
|
19
20
|
~logger: Pino.t=?,
|
|
20
21
|
) => unit
|
|
21
22
|
let getHandler: (~contractName: string, ~eventName: string) => option<Internal.handler>
|
|
@@ -23,8 +24,15 @@ let getContractRegister: (
|
|
|
23
24
|
~contractName: string,
|
|
24
25
|
~eventName: string,
|
|
25
26
|
) => option<Internal.contractRegister>
|
|
26
|
-
let
|
|
27
|
+
let getOnEventWhere: (~contractName: string, ~eventName: string) => option<JSON.t>
|
|
27
28
|
let isWildcard: (~contractName: string, ~eventName: string) => bool
|
|
28
29
|
let hasRegistration: (~contractName: string, ~eventName: string) => bool
|
|
29
30
|
|
|
30
|
-
let
|
|
31
|
+
let registerOnBlock: (
|
|
32
|
+
~name: string,
|
|
33
|
+
~chainId: int,
|
|
34
|
+
~interval: int,
|
|
35
|
+
~startBlock: option<int>,
|
|
36
|
+
~endBlock: option<int>,
|
|
37
|
+
~handler: Internal.onBlockArgs => promise<unit>,
|
|
38
|
+
) => unit
|
package/src/Hasura.res
CHANGED
|
@@ -27,7 +27,14 @@ let clearMetadataRoute = Rest.route(() => {
|
|
|
27
27
|
path: "",
|
|
28
28
|
input: s => {
|
|
29
29
|
let _ = s.field("type", S.literal("clear_metadata"))
|
|
30
|
-
let _ = s.field(
|
|
30
|
+
let _ = s.field(
|
|
31
|
+
"args",
|
|
32
|
+
S.literal(
|
|
33
|
+
Object.make(),
|
|
34
|
+
|
|
35
|
+
// Otherwise the entity in gql will be prefixed with the schema name (when it's not public)
|
|
36
|
+
),
|
|
37
|
+
)
|
|
31
38
|
s->auth
|
|
32
39
|
},
|
|
33
40
|
responses,
|
|
@@ -58,13 +65,13 @@ let rawBodyRoute = Rest.route(() => {
|
|
|
58
65
|
responses,
|
|
59
66
|
})
|
|
60
67
|
|
|
61
|
-
let sendOperation = async (~endpoint, ~auth, ~operation:
|
|
68
|
+
let sendOperation = async (~endpoint, ~auth, ~operation: JSON.t) => {
|
|
62
69
|
let maxRetries = 3
|
|
63
70
|
let rec retry = async (~attempt) => {
|
|
64
71
|
try {
|
|
65
72
|
let _ = await rawBodyRoute->Rest.fetch(
|
|
66
73
|
{
|
|
67
|
-
"bodyString": operation->
|
|
74
|
+
"bodyString": operation->JSON.stringify,
|
|
68
75
|
"auth": auth,
|
|
69
76
|
},
|
|
70
77
|
~client=Rest.client(endpoint),
|
|
@@ -72,7 +79,7 @@ let sendOperation = async (~endpoint, ~auth, ~operation: Js.Json.t) => {
|
|
|
72
79
|
} catch {
|
|
73
80
|
| exn =>
|
|
74
81
|
if attempt < maxRetries {
|
|
75
|
-
let backoffMs =
|
|
82
|
+
let backoffMs = Math.pow(2.0, ~exp=attempt->Belt.Int.toFloat)->Belt.Float.toInt * 1000
|
|
76
83
|
await Time.resolvePromiseAfterDelay(~delayMilliseconds=backoffMs)
|
|
77
84
|
await retry(~attempt=attempt + 1)
|
|
78
85
|
} else {
|
|
@@ -111,19 +118,18 @@ let trackTables = async (~endpoint, ~auth, ~pgSchema, ~tableNames: array<string>
|
|
|
111
118
|
"args": {
|
|
112
119
|
// If set to false, any warnings will cause the API call to fail and no new tables to be tracked. Otherwise tables that fail to track will be raised as warnings. (default: true)
|
|
113
120
|
"allow_warnings": false,
|
|
114
|
-
"tables": tableNames->
|
|
121
|
+
"tables": tableNames->Array.map(tableName =>
|
|
115
122
|
{
|
|
116
123
|
"table": {
|
|
117
124
|
"name": tableName,
|
|
118
125
|
"schema": pgSchema,
|
|
119
126
|
},
|
|
120
127
|
"configuration": {
|
|
121
|
-
// Otherwise the entity in gql will be prefixed with the schema name (when it's not public)
|
|
122
128
|
"custom_name": tableName,
|
|
123
129
|
},
|
|
124
130
|
}
|
|
125
131
|
),
|
|
126
|
-
}->(Utils.magic: 'a =>
|
|
132
|
+
}->(Utils.magic: 'a => JSON.t),
|
|
127
133
|
},
|
|
128
134
|
~client=Rest.client(endpoint),
|
|
129
135
|
)
|
|
@@ -167,12 +173,12 @@ let createSelectPermission = async (
|
|
|
167
173
|
"source": "default",
|
|
168
174
|
"permission": {
|
|
169
175
|
"columns": "*",
|
|
170
|
-
"filter":
|
|
176
|
+
"filter": Object.make(),
|
|
171
177
|
"limit": responseLimit,
|
|
172
|
-
"allow_aggregations": aggregateEntities->
|
|
178
|
+
"allow_aggregations": aggregateEntities->Array.includes(tableName),
|
|
173
179
|
},
|
|
174
180
|
},
|
|
175
|
-
}->(Utils.magic: 'a =>
|
|
181
|
+
}->(Utils.magic: 'a => JSON.t),
|
|
176
182
|
)
|
|
177
183
|
}
|
|
178
184
|
|
|
@@ -207,11 +213,11 @@ let createEntityRelationship = async (
|
|
|
207
213
|
"schema": pgSchema,
|
|
208
214
|
"name": mappedEntity,
|
|
209
215
|
},
|
|
210
|
-
"column_mapping":
|
|
216
|
+
"column_mapping": JSON.parseOrThrow(`{${derivedFromTo}}`),
|
|
211
217
|
},
|
|
212
218
|
},
|
|
213
219
|
},
|
|
214
|
-
}->(Utils.magic: 'a =>
|
|
220
|
+
}->(Utils.magic: 'a => JSON.t),
|
|
215
221
|
)
|
|
216
222
|
}
|
|
217
223
|
|
|
@@ -229,7 +235,7 @@ let trackDatabase = async (
|
|
|
229
235
|
InternalTable.Views.metaViewName,
|
|
230
236
|
InternalTable.Views.chainMetadataViewName,
|
|
231
237
|
]
|
|
232
|
-
let userTableNames = userEntities->
|
|
238
|
+
let userTableNames = userEntities->Array.map(entity => entity.table.tableName)
|
|
233
239
|
let tableNames = [exposedInternalTableNames, userTableNames]->Belt.Array.concatMany
|
|
234
240
|
|
|
235
241
|
Logging.info("Tracking tables in Hasura")
|
|
@@ -238,19 +244,26 @@ let trackDatabase = async (
|
|
|
238
244
|
|
|
239
245
|
await trackTables(~endpoint, ~auth, ~pgSchema, ~tableNames)
|
|
240
246
|
|
|
241
|
-
for i in 0 to tableNames->
|
|
242
|
-
let tableName = tableNames->
|
|
243
|
-
await createSelectPermission(
|
|
247
|
+
for i in 0 to tableNames->Array.length - 1 {
|
|
248
|
+
let tableName = tableNames->Array.getUnsafe(i)
|
|
249
|
+
await createSelectPermission(
|
|
250
|
+
~endpoint,
|
|
251
|
+
~auth,
|
|
252
|
+
~tableName,
|
|
253
|
+
~pgSchema,
|
|
254
|
+
~responseLimit,
|
|
255
|
+
~aggregateEntities,
|
|
256
|
+
)
|
|
244
257
|
}
|
|
245
258
|
|
|
246
|
-
for i in 0 to userEntities->
|
|
247
|
-
let entityConfig = userEntities->
|
|
259
|
+
for i in 0 to userEntities->Array.length - 1 {
|
|
260
|
+
let entityConfig = userEntities->Array.getUnsafe(i)
|
|
248
261
|
let {tableName} = entityConfig.table
|
|
249
262
|
|
|
250
263
|
//Set array relationships
|
|
251
264
|
let derivedFromFields = entityConfig.table->Table.getDerivedFromFields
|
|
252
|
-
for j in 0 to derivedFromFields->
|
|
253
|
-
let derivedFromField = derivedFromFields->
|
|
265
|
+
for j in 0 to derivedFromFields->Array.length - 1 {
|
|
266
|
+
let derivedFromField = derivedFromFields->Array.getUnsafe(j)
|
|
254
267
|
//determines the actual name of the underlying relational field (if it's an entity mapping then suffixes _id for eg.)
|
|
255
268
|
let relationalFieldName =
|
|
256
269
|
schema->Schema.getDerivedFromFieldName(derivedFromField)->Utils.unwrapResultExn
|
|
@@ -270,8 +283,8 @@ let trackDatabase = async (
|
|
|
270
283
|
|
|
271
284
|
//Set object relationships
|
|
272
285
|
let linkedEntityFields = entityConfig.table->Table.getLinkedEntityFields
|
|
273
|
-
for j in 0 to linkedEntityFields->
|
|
274
|
-
let (field, linkedEntityName) = linkedEntityFields->
|
|
286
|
+
for j in 0 to linkedEntityFields->Array.length - 1 {
|
|
287
|
+
let (field, linkedEntityName) = linkedEntityFields->Array.getUnsafe(j)
|
|
275
288
|
await createEntityRelationship(
|
|
276
289
|
~endpoint,
|
|
277
290
|
~auth,
|