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.
Files changed (220) hide show
  1. package/README.md +3 -3
  2. package/bin.mjs +2 -48
  3. package/evm.schema.json +67 -0
  4. package/fuel.schema.json +67 -0
  5. package/index.d.ts +822 -38
  6. package/index.js +5 -3
  7. package/package.json +10 -8
  8. package/rescript.json +5 -9
  9. package/src/Address.res +4 -5
  10. package/src/Address.res.mjs +9 -12
  11. package/src/Api.res +15 -0
  12. package/src/Api.res.mjs +20 -0
  13. package/src/Batch.res +32 -34
  14. package/src/Batch.res.mjs +172 -187
  15. package/src/Bin.res +89 -0
  16. package/src/Bin.res.mjs +97 -0
  17. package/src/ChainFetcher.res +33 -57
  18. package/src/ChainFetcher.res.mjs +197 -227
  19. package/src/ChainManager.res +6 -14
  20. package/src/ChainManager.res.mjs +74 -85
  21. package/src/ChainMap.res +14 -16
  22. package/src/ChainMap.res.mjs +38 -38
  23. package/src/Config.res +193 -135
  24. package/src/Config.res.mjs +566 -592
  25. package/src/Core.res +182 -0
  26. package/src/Core.res.mjs +207 -0
  27. package/src/Ecosystem.res +25 -4
  28. package/src/Ecosystem.res.mjs +12 -13
  29. package/src/Env.res +20 -13
  30. package/src/Env.res.mjs +124 -113
  31. package/src/EnvSafe.res +269 -0
  32. package/src/EnvSafe.res.mjs +296 -0
  33. package/src/EnvSafe.resi +18 -0
  34. package/src/Envio.res +37 -26
  35. package/src/Envio.res.mjs +59 -60
  36. package/src/ErrorHandling.res +2 -2
  37. package/src/ErrorHandling.res.mjs +15 -15
  38. package/src/EventConfigBuilder.res +219 -81
  39. package/src/EventConfigBuilder.res.mjs +259 -202
  40. package/src/EventProcessing.res +27 -38
  41. package/src/EventProcessing.res.mjs +165 -183
  42. package/src/EventUtils.res +11 -11
  43. package/src/EventUtils.res.mjs +21 -22
  44. package/src/EvmTypes.res +0 -1
  45. package/src/EvmTypes.res.mjs +5 -5
  46. package/src/FetchState.res +360 -256
  47. package/src/FetchState.res.mjs +958 -914
  48. package/src/GlobalState.res +365 -351
  49. package/src/GlobalState.res.mjs +958 -992
  50. package/src/GlobalStateManager.res +1 -2
  51. package/src/GlobalStateManager.res.mjs +36 -44
  52. package/src/HandlerLoader.res +107 -23
  53. package/src/HandlerLoader.res.mjs +128 -38
  54. package/src/HandlerRegister.res +127 -103
  55. package/src/HandlerRegister.res.mjs +164 -164
  56. package/src/HandlerRegister.resi +12 -4
  57. package/src/Hasura.res +35 -22
  58. package/src/Hasura.res.mjs +158 -167
  59. package/src/InMemoryStore.res +20 -27
  60. package/src/InMemoryStore.res.mjs +64 -80
  61. package/src/InMemoryTable.res +34 -39
  62. package/src/InMemoryTable.res.mjs +165 -170
  63. package/src/Internal.res +52 -33
  64. package/src/Internal.res.mjs +84 -81
  65. package/src/LazyLoader.res.mjs +55 -61
  66. package/src/LoadLayer.res +77 -78
  67. package/src/LoadLayer.res.mjs +160 -189
  68. package/src/LoadManager.res +16 -21
  69. package/src/LoadManager.res.mjs +79 -84
  70. package/src/LogSelection.res +236 -68
  71. package/src/LogSelection.res.mjs +211 -141
  72. package/src/Logging.res +13 -9
  73. package/src/Logging.res.mjs +130 -143
  74. package/src/Main.res +430 -51
  75. package/src/Main.res.mjs +530 -271
  76. package/src/Persistence.res +80 -84
  77. package/src/Persistence.res.mjs +131 -132
  78. package/src/PgStorage.res +294 -167
  79. package/src/PgStorage.res.mjs +799 -817
  80. package/src/Prometheus.res +50 -58
  81. package/src/Prometheus.res.mjs +345 -373
  82. package/src/ReorgDetection.res +22 -24
  83. package/src/ReorgDetection.res.mjs +100 -106
  84. package/src/SafeCheckpointTracking.res +7 -7
  85. package/src/SafeCheckpointTracking.res.mjs +40 -43
  86. package/src/SimulateItems.res +41 -49
  87. package/src/SimulateItems.res.mjs +257 -272
  88. package/src/Sink.res +2 -2
  89. package/src/Sink.res.mjs +22 -26
  90. package/src/TableIndices.res +1 -2
  91. package/src/TableIndices.res.mjs +42 -48
  92. package/src/TestIndexer.res +196 -189
  93. package/src/TestIndexer.res.mjs +536 -536
  94. package/src/TestIndexerProxyStorage.res +16 -16
  95. package/src/TestIndexerProxyStorage.res.mjs +99 -122
  96. package/src/TestIndexerWorker.res +4 -0
  97. package/src/TestIndexerWorker.res.mjs +7 -0
  98. package/src/Throttler.res +3 -3
  99. package/src/Throttler.res.mjs +23 -24
  100. package/src/Time.res +1 -1
  101. package/src/Time.res.mjs +18 -21
  102. package/src/TopicFilter.res +3 -3
  103. package/src/TopicFilter.res.mjs +29 -30
  104. package/src/UserContext.res +93 -54
  105. package/src/UserContext.res.mjs +197 -182
  106. package/src/Utils.res +141 -86
  107. package/src/Utils.res.mjs +334 -295
  108. package/src/bindings/BigDecimal.res +0 -2
  109. package/src/bindings/BigDecimal.res.mjs +19 -23
  110. package/src/bindings/ClickHouse.res +28 -27
  111. package/src/bindings/ClickHouse.res.mjs +243 -240
  112. package/src/bindings/DateFns.res +11 -11
  113. package/src/bindings/DateFns.res.mjs +7 -7
  114. package/src/bindings/EventSource.res.mjs +2 -2
  115. package/src/bindings/Express.res +2 -5
  116. package/src/bindings/Hrtime.res +2 -2
  117. package/src/bindings/Hrtime.res.mjs +30 -32
  118. package/src/bindings/Lodash.res.mjs +1 -1
  119. package/src/bindings/NodeJs.res +14 -9
  120. package/src/bindings/NodeJs.res.mjs +20 -20
  121. package/src/bindings/Pino.res +8 -10
  122. package/src/bindings/Pino.res.mjs +40 -43
  123. package/src/bindings/Postgres.res +7 -5
  124. package/src/bindings/Postgres.res.mjs +9 -9
  125. package/src/bindings/PromClient.res +17 -2
  126. package/src/bindings/PromClient.res.mjs +30 -7
  127. package/src/bindings/SDSL.res.mjs +2 -2
  128. package/src/bindings/Viem.res +4 -4
  129. package/src/bindings/Viem.res.mjs +20 -22
  130. package/src/bindings/Vitest.res +1 -1
  131. package/src/bindings/Vitest.res.mjs +2 -2
  132. package/src/bindings/WebSocket.res +1 -1
  133. package/src/db/EntityHistory.res +9 -3
  134. package/src/db/EntityHistory.res.mjs +84 -59
  135. package/src/db/InternalTable.res +62 -60
  136. package/src/db/InternalTable.res.mjs +271 -203
  137. package/src/db/Schema.res +1 -2
  138. package/src/db/Schema.res.mjs +28 -32
  139. package/src/db/Table.res +28 -27
  140. package/src/db/Table.res.mjs +276 -292
  141. package/src/sources/EventRouter.res +21 -16
  142. package/src/sources/EventRouter.res.mjs +55 -57
  143. package/src/sources/Evm.res +17 -1
  144. package/src/sources/Evm.res.mjs +16 -8
  145. package/src/sources/EvmChain.res +15 -17
  146. package/src/sources/EvmChain.res.mjs +40 -42
  147. package/src/sources/Fuel.res +14 -1
  148. package/src/sources/Fuel.res.mjs +16 -8
  149. package/src/sources/FuelSDK.res +1 -1
  150. package/src/sources/FuelSDK.res.mjs +6 -8
  151. package/src/sources/HyperFuel.res +8 -10
  152. package/src/sources/HyperFuel.res.mjs +113 -123
  153. package/src/sources/HyperFuelClient.res.mjs +6 -7
  154. package/src/sources/HyperFuelSource.res +19 -20
  155. package/src/sources/HyperFuelSource.res.mjs +339 -356
  156. package/src/sources/HyperSync.res +11 -13
  157. package/src/sources/HyperSync.res.mjs +206 -220
  158. package/src/sources/HyperSyncClient.res +5 -7
  159. package/src/sources/HyperSyncClient.res.mjs +70 -75
  160. package/src/sources/HyperSyncHeightStream.res +8 -9
  161. package/src/sources/HyperSyncHeightStream.res.mjs +78 -86
  162. package/src/sources/HyperSyncJsonApi.res +18 -15
  163. package/src/sources/HyperSyncJsonApi.res.mjs +201 -231
  164. package/src/sources/HyperSyncSource.res +17 -21
  165. package/src/sources/HyperSyncSource.res.mjs +268 -290
  166. package/src/sources/Rpc.res +5 -5
  167. package/src/sources/Rpc.res.mjs +168 -192
  168. package/src/sources/RpcSource.res +166 -167
  169. package/src/sources/RpcSource.res.mjs +972 -1046
  170. package/src/sources/RpcWebSocketHeightStream.res +10 -11
  171. package/src/sources/RpcWebSocketHeightStream.res.mjs +131 -145
  172. package/src/sources/SimulateSource.res +1 -1
  173. package/src/sources/SimulateSource.res.mjs +35 -38
  174. package/src/sources/Source.res +1 -1
  175. package/src/sources/Source.res.mjs +3 -3
  176. package/src/sources/SourceManager.res +39 -20
  177. package/src/sources/SourceManager.res.mjs +340 -371
  178. package/src/sources/SourceManager.resi +2 -1
  179. package/src/sources/Svm.res +12 -5
  180. package/src/sources/Svm.res.mjs +44 -41
  181. package/src/tui/Tui.res +23 -12
  182. package/src/tui/Tui.res.mjs +292 -290
  183. package/src/tui/bindings/Ink.res +2 -4
  184. package/src/tui/bindings/Ink.res.mjs +35 -41
  185. package/src/tui/components/BufferedProgressBar.res +7 -7
  186. package/src/tui/components/BufferedProgressBar.res.mjs +46 -46
  187. package/src/tui/components/CustomHooks.res +1 -2
  188. package/src/tui/components/CustomHooks.res.mjs +102 -122
  189. package/src/tui/components/Messages.res +1 -2
  190. package/src/tui/components/Messages.res.mjs +38 -42
  191. package/src/tui/components/SyncETA.res +10 -11
  192. package/src/tui/components/SyncETA.res.mjs +178 -196
  193. package/src/tui/components/TuiData.res +1 -1
  194. package/src/tui/components/TuiData.res.mjs +7 -6
  195. package/src/vendored/Rest.res +52 -66
  196. package/src/vendored/Rest.res.mjs +324 -364
  197. package/svm.schema.json +67 -0
  198. package/src/Address.gen.ts +0 -8
  199. package/src/Config.gen.ts +0 -19
  200. package/src/Envio.gen.ts +0 -55
  201. package/src/EvmTypes.gen.ts +0 -6
  202. package/src/InMemoryStore.gen.ts +0 -6
  203. package/src/Internal.gen.ts +0 -64
  204. package/src/PgStorage.gen.ts +0 -10
  205. package/src/PgStorage.res.d.mts +0 -5
  206. package/src/Types.ts +0 -56
  207. package/src/bindings/BigDecimal.gen.ts +0 -14
  208. package/src/bindings/BigDecimal.res.d.mts +0 -5
  209. package/src/bindings/BigInt.gen.ts +0 -10
  210. package/src/bindings/BigInt.res +0 -70
  211. package/src/bindings/BigInt.res.d.mts +0 -5
  212. package/src/bindings/BigInt.res.mjs +0 -154
  213. package/src/bindings/Ethers.res.d.mts +0 -5
  214. package/src/bindings/Pino.gen.ts +0 -17
  215. package/src/bindings/Postgres.gen.ts +0 -8
  216. package/src/bindings/Postgres.res.d.mts +0 -5
  217. package/src/bindings/Promise.res +0 -67
  218. package/src/bindings/Promise.res.mjs +0 -26
  219. package/src/db/InternalTable.gen.ts +0 -36
  220. package/src/sources/HyperSyncClient.gen.ts +0 -19
@@ -2,58 +2,53 @@
2
2
 
3
3
  import * as Fs from "fs";
4
4
  import * as Env from "./Env.res.mjs";
5
+ import * as Sink from "./Sink.res.mjs";
5
6
  import * as Path from "path";
6
- import * as $$Array from "rescript/lib/es6/array.js";
7
7
  import * as Table from "./db/Table.res.mjs";
8
8
  import * as Utils from "./Utils.res.mjs";
9
- import * as $$BigInt from "./bindings/BigInt.res.mjs";
10
9
  import * as Config from "./Config.res.mjs";
10
+ import * as Hasura from "./Hasura.res.mjs";
11
11
  import * as Hrtime from "./bindings/Hrtime.res.mjs";
12
- import * as Js_exn from "rescript/lib/es6/js_exn.js";
13
12
  import * as Schema from "./db/Schema.res.mjs";
14
- import * as Js_dict from "rescript/lib/es6/js_dict.js";
15
13
  import * as Logging from "./Logging.res.mjs";
16
- import * as $$Promise from "./bindings/Promise.res.mjs";
17
- import * as Caml_obj from "rescript/lib/es6/caml_obj.js";
18
14
  import * as Internal from "./Internal.res.mjs";
19
15
  import Postgres from "postgres";
20
- import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
16
+ import * as Belt_Array from "@rescript/runtime/lib/es6/Belt_Array.js";
21
17
  import * as Prometheus from "./Prometheus.res.mjs";
22
- import * as Caml_option from "rescript/lib/es6/caml_option.js";
23
18
  import * as Persistence from "./Persistence.res.mjs";
19
+ import * as ChainFetcher from "./ChainFetcher.res.mjs";
24
20
  import * as EntityHistory from "./db/EntityHistory.res.mjs";
25
21
  import * as InternalTable from "./db/InternalTable.res.mjs";
26
22
  import * as Child_process from "child_process";
27
- import * as Caml_exceptions from "rescript/lib/es6/caml_exceptions.js";
23
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
24
+ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
25
+ import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
26
+ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
28
27
  import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
29
- import * as Caml_js_exceptions from "rescript/lib/es6/caml_js_exceptions.js";
28
+ import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
30
29
 
31
- var getCacheRowCountFnName = "get_cache_row_count";
30
+ let getCacheRowCountFnName = "get_cache_row_count";
32
31
 
33
32
  function makeClient() {
34
33
  return Postgres({
35
- host: Env.Db.host,
36
- port: Env.Db.port,
37
- database: Env.Db.database,
38
- username: Env.Db.user,
39
- password: Env.Db.password,
40
- ssl: Env.Db.ssl,
41
- max: Env.Db.maxConnections,
42
- onnotice: Caml_obj.equal(Env.userLogLevel, "warn") || Caml_obj.equal(Env.userLogLevel, "error") ? undefined : (function (_str) {
43
-
44
- }),
45
- transform: {
46
- undefined: null
47
- }
48
- });
34
+ host: Env.Db.host,
35
+ port: Env.Db.port,
36
+ database: Env.Db.database,
37
+ username: Env.Db.user,
38
+ password: Env.Db.password,
39
+ ssl: Env.Db.ssl,
40
+ max: Env.Db.maxConnections,
41
+ onnotice: Primitive_object.equal(Env.userLogLevel, "warn") || Primitive_object.equal(Env.userLogLevel, "error") ? undefined : _str => {},
42
+ transform: {
43
+ undefined: null
44
+ }
45
+ });
49
46
  }
50
47
 
51
48
  function makeCreateIndexQuery(tableName, indexFields, pgSchema) {
52
- var indexName = tableName + "_" + indexFields.join("_");
53
- var index = Belt_Array.map(indexFields, (function (idx) {
54
- return "\"" + idx + "\"";
55
- })).join(", ");
56
- return "CREATE INDEX IF NOT EXISTS \"" + indexName + "\" ON \"" + pgSchema + "\".\"" + tableName + "\"(" + index + ");";
49
+ let indexName = tableName + "_" + indexFields.join("_");
50
+ let index = Belt_Array.map(indexFields, idx => `"` + idx + `"`).join(", ");
51
+ return `CREATE INDEX IF NOT EXISTS "` + indexName + `" ON "` + pgSchema + `"."` + tableName + `"(` + index + `);`;
57
52
  }
58
53
 
59
54
  function directionToSql(direction) {
@@ -73,104 +68,94 @@ function directionToIndexName(direction) {
73
68
  }
74
69
 
75
70
  function makeCreateCompositeIndexQuery(tableName, indexFields, pgSchema) {
76
- var indexName = tableName + "_" + indexFields.map(function (f) {
77
- return f.fieldName + directionToIndexName(f.direction);
78
- }).join("_");
79
- var index = Belt_Array.map(indexFields, (function (f) {
80
- return "\"" + f.fieldName + "\"" + directionToSql(f.direction);
81
- })).join(", ");
82
- return "CREATE INDEX IF NOT EXISTS \"" + indexName + "\" ON \"" + pgSchema + "\".\"" + tableName + "\"(" + index + ");";
71
+ let indexName = tableName + "_" + indexFields.map(f => f.fieldName + directionToIndexName(f.direction)).join("_");
72
+ let index = Belt_Array.map(indexFields, f => `"` + f.fieldName + `"` + directionToSql(f.direction)).join(", ");
73
+ return `CREATE INDEX IF NOT EXISTS "` + indexName + `" ON "` + pgSchema + `"."` + tableName + `"(` + index + `);`;
83
74
  }
84
75
 
85
76
  function makeCreateTableIndicesQuery(table, pgSchema) {
86
- var tableName = table.tableName;
87
- var createIndex = function (indexField) {
88
- return makeCreateIndexQuery(tableName, [indexField], pgSchema);
89
- };
90
- var createCompositeIndex = function (indexFields) {
91
- return makeCreateCompositeIndexQuery(tableName, indexFields, pgSchema);
92
- };
93
- var singleIndices = Table.getSingleIndices(table);
94
- var compositeIndices = Table.getCompositeIndices(table);
95
- return Belt_Array.map(singleIndices, createIndex).join("\n") + Belt_Array.map(compositeIndices, createCompositeIndex).join("\n");
77
+ let tableName = table.tableName;
78
+ let createIndex = indexField => makeCreateIndexQuery(tableName, [indexField], pgSchema);
79
+ let createCompositeIndex = indexFields => makeCreateCompositeIndexQuery(tableName, indexFields, pgSchema);
80
+ let singleIndices = Table.getSingleIndices(table);
81
+ let compositeIndices = Table.getCompositeIndices(table);
82
+ return singleIndices.map(createIndex).join("\n") + compositeIndices.map(createCompositeIndex).join("\n");
96
83
  }
97
84
 
98
85
  function makeCreateTableQuery(table, pgSchema, isNumericArrayAsText) {
99
- var fieldsMapped = Belt_Array.map(Table.getFields(table), (function (field) {
100
- var defaultValue = field.defaultValue;
101
- var isNullable = field.isNullable;
102
- var fieldName = Table.getDbFieldName(field);
103
- return "\"" + fieldName + "\" " + Table.getPgFieldType(field.fieldType, pgSchema, field.isArray, isNumericArrayAsText, isNullable) + (
104
- defaultValue !== undefined ? " DEFAULT " + defaultValue : (
105
- isNullable ? "" : " NOT NULL"
106
- )
107
- );
108
- })).join(", ");
109
- var primaryKeyFieldNames = Table.getPrimaryKeyFieldNames(table);
110
- var primaryKey = Belt_Array.map(primaryKeyFieldNames, (function (field) {
111
- return "\"" + field + "\"";
112
- })).join(", ");
113
- return "CREATE TABLE IF NOT EXISTS \"" + pgSchema + "\".\"" + table.tableName + "\"(" + fieldsMapped + (
114
- primaryKeyFieldNames.length !== 0 ? ", PRIMARY KEY(" + primaryKey + ")" : ""
115
- ) + ");";
86
+ let fieldsMapped = Table.getFields(table).map(field => {
87
+ let defaultValue = field.defaultValue;
88
+ let isNullable = field.isNullable;
89
+ let fieldName = Table.getDbFieldName(field);
90
+ return `"` + fieldName + `" ` + Table.getPgFieldType(field.fieldType, pgSchema, field.isArray, isNumericArrayAsText, isNullable) + (
91
+ defaultValue !== undefined ? ` DEFAULT ` + defaultValue : (
92
+ isNullable ? `` : ` NOT NULL`
93
+ )
94
+ );
95
+ }).join(", ");
96
+ let primaryKeyFieldNames = Table.getPrimaryKeyFieldNames(table);
97
+ let primaryKey = primaryKeyFieldNames.map(field => `"` + field + `"`).join(", ");
98
+ return `CREATE TABLE IF NOT EXISTS "` + pgSchema + `"."` + table.tableName + `"(` + fieldsMapped + (
99
+ primaryKeyFieldNames.length !== 0 ? `, PRIMARY KEY(` + primaryKey + `)` : ""
100
+ ) + `);`;
116
101
  }
117
102
 
118
- var entityHistoryCache = new WeakMap();
103
+ let entityHistoryCache = new WeakMap();
119
104
 
120
105
  function getEntityHistory(entityConfig) {
121
- var cache = entityHistoryCache.get(entityConfig);
106
+ let cache = entityHistoryCache.get(entityConfig);
122
107
  if (cache !== undefined) {
123
108
  return cache;
124
109
  }
125
- var dataFields = Belt_Array.keepMap(entityConfig.table.fields, (function (field) {
126
- if (field.TAG !== "Field") {
127
- return ;
128
- }
129
- var field$1 = field._0;
130
- var match = field$1.fieldName;
131
- if (match === "id") {
132
- return {
133
- TAG: "Field",
134
- _0: {
135
- fieldName: "id",
136
- fieldType: field$1.fieldType,
137
- fieldSchema: field$1.fieldSchema,
138
- isArray: field$1.isArray,
139
- isNullable: field$1.isNullable,
140
- isPrimaryKey: true,
141
- isIndex: field$1.isIndex,
142
- linkedEntity: field$1.linkedEntity,
143
- defaultValue: field$1.defaultValue
144
- }
145
- };
146
- } else {
147
- return {
148
- TAG: "Field",
149
- _0: {
150
- fieldName: field$1.fieldName,
151
- fieldType: field$1.fieldType,
152
- fieldSchema: field$1.fieldSchema,
153
- isArray: field$1.isArray,
154
- isNullable: true,
155
- isPrimaryKey: field$1.isPrimaryKey,
156
- isIndex: false,
157
- linkedEntity: field$1.linkedEntity,
158
- defaultValue: field$1.defaultValue
159
- }
160
- };
161
- }
162
- }));
163
- var actionField = Table.mkField(EntityHistory.changeFieldName, EntityHistory.changeFieldType, S$RescriptSchema.never, undefined, undefined, undefined, undefined, undefined, undefined);
164
- var checkpointIdField = Table.mkField(EntityHistory.checkpointIdFieldName, EntityHistory.checkpointIdFieldType, EntityHistory.unsafeCheckpointIdSchema, undefined, undefined, undefined, true, undefined, undefined);
165
- var entityTableName = entityConfig.table.tableName;
166
- var historyTableName = EntityHistory.historyTableName(entityTableName, entityConfig.index);
167
- var table = Table.mkTable(historyTableName, undefined, Belt_Array.concat(dataFields, [
168
- checkpointIdField,
169
- actionField
170
- ]));
171
- var setChangeSchema = EntityHistory.makeSetUpdateSchema(entityConfig.schema);
172
- var cache_setChangeSchemaRows = S$RescriptSchema.array(setChangeSchema);
173
- var cache$1 = {
110
+ let dataFields = Belt_Array.keepMap(entityConfig.table.fields, field => {
111
+ if (field.TAG !== "Field") {
112
+ return;
113
+ }
114
+ let field$1 = field._0;
115
+ let match = field$1.fieldName;
116
+ if (match === "id") {
117
+ return {
118
+ TAG: "Field",
119
+ _0: {
120
+ fieldName: "id",
121
+ fieldType: field$1.fieldType,
122
+ fieldSchema: field$1.fieldSchema,
123
+ isArray: field$1.isArray,
124
+ isNullable: field$1.isNullable,
125
+ isPrimaryKey: true,
126
+ isIndex: field$1.isIndex,
127
+ linkedEntity: field$1.linkedEntity,
128
+ defaultValue: field$1.defaultValue
129
+ }
130
+ };
131
+ } else {
132
+ return {
133
+ TAG: "Field",
134
+ _0: {
135
+ fieldName: field$1.fieldName,
136
+ fieldType: field$1.fieldType,
137
+ fieldSchema: field$1.fieldSchema,
138
+ isArray: field$1.isArray,
139
+ isNullable: true,
140
+ isPrimaryKey: field$1.isPrimaryKey,
141
+ isIndex: false,
142
+ linkedEntity: field$1.linkedEntity,
143
+ defaultValue: field$1.defaultValue
144
+ }
145
+ };
146
+ }
147
+ });
148
+ let actionField = Table.mkField(EntityHistory.changeFieldName, EntityHistory.changeFieldType, S$RescriptSchema.never, undefined, undefined, undefined, undefined, undefined, undefined);
149
+ let checkpointIdField = Table.mkField(EntityHistory.checkpointIdFieldName, EntityHistory.checkpointIdFieldType, EntityHistory.unsafeCheckpointIdSchema, undefined, undefined, undefined, true, undefined, undefined);
150
+ let entityTableName = entityConfig.table.tableName;
151
+ let historyTableName = EntityHistory.historyTableName(entityTableName, entityConfig.index);
152
+ let table = Table.mkTable(historyTableName, undefined, Belt_Array.concat(dataFields, [
153
+ checkpointIdField,
154
+ actionField
155
+ ]));
156
+ let setChangeSchema = EntityHistory.makeSetUpdateSchema(entityConfig.schema);
157
+ let cache_setChangeSchemaRows = S$RescriptSchema.array(setChangeSchema);
158
+ let cache$1 = {
174
159
  table: table,
175
160
  setChangeSchema: setChangeSchema,
176
161
  setChangeSchemaRows: cache_setChangeSchemaRows
@@ -180,166 +165,161 @@ function getEntityHistory(entityConfig) {
180
165
  }
181
166
 
182
167
  function makeInitializeTransaction(pgSchema, pgUser, isHasuraEnabled, chainConfigsOpt, entitiesOpt, enumsOpt, isEmptyPgSchemaOpt) {
183
- var chainConfigs = chainConfigsOpt !== undefined ? chainConfigsOpt : [];
184
- var entities = entitiesOpt !== undefined ? entitiesOpt : [];
185
- var enums = enumsOpt !== undefined ? enumsOpt : [];
186
- var isEmptyPgSchema = isEmptyPgSchemaOpt !== undefined ? isEmptyPgSchemaOpt : false;
187
- var generalTables = [
168
+ let chainConfigs = chainConfigsOpt !== undefined ? chainConfigsOpt : [];
169
+ let entities = entitiesOpt !== undefined ? entitiesOpt : [];
170
+ let enums = enumsOpt !== undefined ? enumsOpt : [];
171
+ let isEmptyPgSchema = isEmptyPgSchemaOpt !== undefined ? isEmptyPgSchemaOpt : false;
172
+ let generalTables = [
188
173
  InternalTable.Chains.table,
189
174
  InternalTable.PersistedState.table,
190
175
  InternalTable.Checkpoints.table,
191
176
  InternalTable.RawEvents.table
192
177
  ];
193
- var allTables = $$Array.copy(generalTables);
194
- var allEntityTables = [];
195
- entities.forEach(function (entityConfig) {
196
- allEntityTables.push(entityConfig.table);
197
- allTables.push(entityConfig.table);
198
- allTables.push(getEntityHistory(entityConfig).table);
199
- });
200
- var derivedSchema = Schema.make(allEntityTables);
201
- var query = {
178
+ let allTables = generalTables.slice();
179
+ let allEntityTables = [];
180
+ entities.forEach(entityConfig => {
181
+ allEntityTables.push(entityConfig.table);
182
+ allTables.push(entityConfig.table);
183
+ allTables.push(getEntityHistory(entityConfig).table);
184
+ });
185
+ let derivedSchema = Schema.make(allEntityTables);
186
+ let query = {
202
187
  contents: (
203
- isEmptyPgSchema && pgSchema === "public" ? "CREATE SCHEMA IF NOT EXISTS \"" + pgSchema + "\";\n" : "DROP SCHEMA IF EXISTS \"" + pgSchema + "\" CASCADE;\nCREATE SCHEMA \"" + pgSchema + "\";\n"
204
- ) + ("GRANT ALL ON SCHEMA \"" + pgSchema + "\" TO \"" + pgUser + "\";\nGRANT ALL ON SCHEMA \"" + pgSchema + "\" TO public;")
188
+ isEmptyPgSchema && pgSchema === "public" ? `CREATE SCHEMA IF NOT EXISTS "` + pgSchema + `";\n` : `DROP SCHEMA IF EXISTS "` + pgSchema + `" CASCADE;
189
+ CREATE SCHEMA "` + pgSchema + `";\n`
190
+ ) + (`GRANT ALL ON SCHEMA "` + pgSchema + `" TO "` + pgUser + `";
191
+ GRANT ALL ON SCHEMA "` + pgSchema + `" TO public;`)
205
192
  };
206
- enums.forEach(function (enumConfig) {
207
- var enumCreateQuery = "CREATE TYPE \"" + pgSchema + "\"." + enumConfig.name + " AS ENUM(" + enumConfig.variants.map(function (v) {
208
- return "'" + v + "'";
209
- }).join(", ") + ");";
210
- query.contents = query.contents + "\n" + enumCreateQuery;
211
- });
212
- allTables.forEach(function (table) {
213
- query.contents = query.contents + "\n" + makeCreateTableQuery(table, pgSchema, isHasuraEnabled);
214
- });
215
- allTables.forEach(function (table) {
216
- var indices = makeCreateTableIndicesQuery(table, pgSchema);
217
- if (indices !== "") {
218
- query.contents = query.contents + "\n" + indices;
219
- return ;
220
- }
221
-
222
- });
223
- entities.forEach(function (entity) {
224
- Table.getDerivedFromFields(entity.table).forEach(function (derivedFromField) {
225
- var indexField = Utils.unwrapResultExn(Schema.getDerivedFromFieldName(derivedSchema, derivedFromField));
226
- query.contents = query.contents + "\n" + makeCreateIndexQuery(derivedFromField.derivedFromEntity, [indexField], pgSchema);
227
- });
228
- });
193
+ enums.forEach(enumConfig => {
194
+ let enumCreateQuery = `CREATE TYPE "` + pgSchema + `".` + enumConfig.name + ` AS ENUM(` + enumConfig.variants.map(v => `'` + v + `'`).join(", ") + `);`;
195
+ query.contents = query.contents + "\n" + enumCreateQuery;
196
+ });
197
+ allTables.forEach(table => {
198
+ query.contents = query.contents + "\n" + makeCreateTableQuery(table, pgSchema, isHasuraEnabled);
199
+ });
200
+ allTables.forEach(table => {
201
+ let indices = makeCreateTableIndicesQuery(table, pgSchema);
202
+ if (indices !== "") {
203
+ query.contents = query.contents + "\n" + indices;
204
+ return;
205
+ }
206
+ });
207
+ entities.forEach(entity => {
208
+ Table.getDerivedFromFields(entity.table).forEach(derivedFromField => {
209
+ let indexField = Utils.unwrapResultExn(Schema.getDerivedFromFieldName(derivedSchema, derivedFromField));
210
+ query.contents = query.contents + "\n" + makeCreateIndexQuery(derivedFromField.derivedFromEntity, [indexField], pgSchema);
211
+ });
212
+ });
229
213
  query.contents = query.contents + "\n" + InternalTable.Views.makeMetaViewQuery(pgSchema);
230
214
  query.contents = query.contents + "\n" + InternalTable.Views.makeChainMetadataViewQuery(pgSchema);
231
- var initialChainsValuesQuery = InternalTable.Chains.makeInitialValuesQuery(pgSchema, chainConfigs);
215
+ let initialChainsValuesQuery = InternalTable.Chains.makeInitialValuesQuery(pgSchema, chainConfigs);
232
216
  if (initialChainsValuesQuery !== undefined) {
233
217
  query.contents = query.contents + "\n" + initialChainsValuesQuery;
234
218
  }
235
219
  return [
236
- query.contents,
237
- "CREATE OR REPLACE FUNCTION " + getCacheRowCountFnName + "(table_name text) \nRETURNS integer AS $$\nDECLARE\n result integer;\nBEGIN\n EXECUTE format('SELECT COUNT(*) FROM \"" + pgSchema + "\".%I', table_name) INTO result;\n RETURN result;\nEND;\n$$ LANGUAGE plpgsql;"
238
- ];
220
+ query.contents,
221
+ `CREATE OR REPLACE FUNCTION ` + getCacheRowCountFnName + `(table_name text)
222
+ RETURNS integer AS $$
223
+ DECLARE
224
+ result integer;
225
+ BEGIN
226
+ EXECUTE format('SELECT COUNT(*) FROM "` + pgSchema + `".%I', table_name) INTO result;
227
+ RETURN result;
228
+ END;
229
+ $$ LANGUAGE plpgsql;`
230
+ ];
239
231
  }
240
232
 
241
233
  function makeLoadByIdQuery(pgSchema, tableName) {
242
- return "SELECT * FROM \"" + pgSchema + "\".\"" + tableName + "\" WHERE id = $1 LIMIT 1;";
234
+ return `SELECT * FROM "` + pgSchema + `"."` + tableName + `" WHERE id = $1 LIMIT 1;`;
243
235
  }
244
236
 
245
237
  function makeLoadByFieldQuery(pgSchema, tableName, fieldName, operator) {
246
- return "SELECT * FROM \"" + pgSchema + "\".\"" + tableName + "\" WHERE \"" + fieldName + "\" " + operator + " $1;";
238
+ return `SELECT * FROM "` + pgSchema + `"."` + tableName + `" WHERE "` + fieldName + `" ` + operator + ` $1;`;
247
239
  }
248
240
 
249
241
  function makeLoadByIdsQuery(pgSchema, tableName) {
250
- return "SELECT * FROM \"" + pgSchema + "\".\"" + tableName + "\" WHERE id = ANY($1::text[]);";
242
+ return `SELECT * FROM "` + pgSchema + `"."` + tableName + `" WHERE id = ANY($1::text[]);`;
251
243
  }
252
244
 
253
245
  function makeDeleteByIdQuery(pgSchema, tableName) {
254
- return "DELETE FROM \"" + pgSchema + "\".\"" + tableName + "\" WHERE id = $1;";
246
+ return `DELETE FROM "` + pgSchema + `"."` + tableName + `" WHERE id = $1;`;
255
247
  }
256
248
 
257
249
  function makeDeleteByIdsQuery(pgSchema, tableName) {
258
- return "DELETE FROM \"" + pgSchema + "\".\"" + tableName + "\" WHERE id = ANY($1::text[]);";
250
+ return `DELETE FROM "` + pgSchema + `"."` + tableName + `" WHERE id = ANY($1::text[]);`;
259
251
  }
260
252
 
261
253
  function makeLoadAllQuery(pgSchema, tableName) {
262
- return "SELECT * FROM \"" + pgSchema + "\".\"" + tableName + "\";";
254
+ return `SELECT * FROM "` + pgSchema + `"."` + tableName + `";`;
263
255
  }
264
256
 
265
257
  function makeInsertUnnestSetQuery(pgSchema, table, itemSchema, isRawEvents) {
266
- var match = Table.toSqlParams(table, itemSchema, pgSchema);
267
- var quotedNonPrimaryFieldNames = match.quotedNonPrimaryFieldNames;
268
- var primaryKeyFieldNames = Table.getPrimaryKeyFieldNames(table);
269
- return "INSERT INTO \"" + pgSchema + "\".\"" + table.tableName + "\" (" + match.quotedFieldNames.join(", ") + ")\nSELECT * FROM unnest(" + match.arrayFieldTypes.map(function (arrayFieldType, idx) {
270
- return "$" + (idx + 1 | 0).toString() + "::" + arrayFieldType;
271
- }).join(",") + ")" + (
272
- isRawEvents || primaryKeyFieldNames.length === 0 ? "" : "ON CONFLICT(" + primaryKeyFieldNames.map(function (fieldName) {
273
- return "\"" + fieldName + "\"";
274
- }).join(",") + ") DO " + (
275
- Utils.$$Array.isEmpty(quotedNonPrimaryFieldNames) ? "NOTHING" : "UPDATE SET " + quotedNonPrimaryFieldNames.map(function (fieldName) {
276
- return fieldName + " = EXCLUDED." + fieldName;
277
- }).join(",")
278
- )
279
- ) + ";";
258
+ let match = Table.toSqlParams(table, itemSchema, pgSchema);
259
+ let quotedNonPrimaryFieldNames = match.quotedNonPrimaryFieldNames;
260
+ let primaryKeyFieldNames = Table.getPrimaryKeyFieldNames(table);
261
+ return `INSERT INTO "` + pgSchema + `"."` + table.tableName + `" (` + match.quotedFieldNames.join(", ") + `)
262
+ SELECT * FROM unnest(` + match.arrayFieldTypes.map((arrayFieldType, idx) => `$` + (idx + 1 | 0).toString() + `::` + arrayFieldType).join(",") + `)` + (
263
+ isRawEvents || primaryKeyFieldNames.length === 0 ? `` : `ON CONFLICT(` + primaryKeyFieldNames.map(fieldName => `"` + fieldName + `"`).join(",") + `) DO ` + (
264
+ Utils.$$Array.isEmpty(quotedNonPrimaryFieldNames) ? `NOTHING` : `UPDATE SET ` + quotedNonPrimaryFieldNames.map(fieldName => fieldName + ` = EXCLUDED.` + fieldName).join(",")
265
+ )
266
+ ) + ";";
280
267
  }
281
268
 
282
269
  function makeInsertValuesSetQuery(pgSchema, table, itemSchema, itemsCount) {
283
- var match = Table.toSqlParams(table, itemSchema, pgSchema);
284
- var quotedNonPrimaryFieldNames = match.quotedNonPrimaryFieldNames;
285
- var quotedFieldNames = match.quotedFieldNames;
286
- var primaryKeyFieldNames = Table.getPrimaryKeyFieldNames(table);
287
- var fieldsCount = quotedFieldNames.length;
288
- var placeholders = "";
289
- for(var idx = 1; idx <= itemsCount; ++idx){
270
+ let match = Table.toSqlParams(table, itemSchema, pgSchema);
271
+ let quotedNonPrimaryFieldNames = match.quotedNonPrimaryFieldNames;
272
+ let quotedFieldNames = match.quotedFieldNames;
273
+ let primaryKeyFieldNames = Table.getPrimaryKeyFieldNames(table);
274
+ let fieldsCount = quotedFieldNames.length;
275
+ let placeholders = "";
276
+ for (let idx = 1; idx <= itemsCount; ++idx) {
290
277
  if (idx > 1) {
291
278
  placeholders = placeholders + ",";
292
279
  }
293
280
  placeholders = placeholders + "(";
294
- for(var fieldIdx = 0; fieldIdx < fieldsCount; ++fieldIdx){
281
+ for (let fieldIdx = 0; fieldIdx < fieldsCount; ++fieldIdx) {
295
282
  if (fieldIdx > 0) {
296
283
  placeholders = placeholders + ",";
297
284
  }
298
- placeholders = placeholders + ("$" + (Math.imul(fieldIdx, itemsCount) + idx | 0).toString());
285
+ placeholders = placeholders + (`$` + ((fieldIdx * itemsCount | 0) + idx | 0).toString());
299
286
  }
300
287
  placeholders = placeholders + ")";
301
288
  }
302
- return "INSERT INTO \"" + pgSchema + "\".\"" + table.tableName + "\" (" + quotedFieldNames.join(", ") + ")\nVALUES" + placeholders + (
303
- primaryKeyFieldNames.length !== 0 ? "ON CONFLICT(" + primaryKeyFieldNames.map(function (fieldName) {
304
- return "\"" + fieldName + "\"";
305
- }).join(",") + ") DO " + (
306
- Utils.$$Array.isEmpty(quotedNonPrimaryFieldNames) ? "NOTHING" : "UPDATE SET " + quotedNonPrimaryFieldNames.map(function (fieldName) {
307
- return fieldName + " = EXCLUDED." + fieldName;
308
- }).join(",")
309
- ) : ""
310
- ) + ";";
289
+ return `INSERT INTO "` + pgSchema + `"."` + table.tableName + `" (` + quotedFieldNames.join(", ") + `)
290
+ VALUES` + placeholders + (
291
+ primaryKeyFieldNames.length !== 0 ? `ON CONFLICT(` + primaryKeyFieldNames.map(fieldName => `"` + fieldName + `"`).join(",") + `) DO ` + (
292
+ Utils.$$Array.isEmpty(quotedNonPrimaryFieldNames) ? `NOTHING` : `UPDATE SET ` + quotedNonPrimaryFieldNames.map(fieldName => fieldName + ` = EXCLUDED.` + fieldName).join(",")
293
+ ) : ``
294
+ ) + ";";
311
295
  }
312
296
 
313
297
  function makeTableBatchSetQuery(pgSchema, table, itemSchema) {
314
- var match = Table.toSqlParams(table, itemSchema, pgSchema);
315
- var isRawEvents = table.tableName === InternalTable.RawEvents.table.tableName;
316
- var isHistoryUpdate = table.tableName.startsWith(EntityHistory.historyTablePrefix);
298
+ let match = Table.toSqlParams(table, itemSchema, pgSchema);
299
+ let isRawEvents = table.tableName === InternalTable.RawEvents.table.tableName;
300
+ let isHistoryUpdate = table.tableName.startsWith(EntityHistory.historyTablePrefix);
317
301
  if ((isRawEvents || !match.hasArrayField) && !isHistoryUpdate) {
318
302
  return {
319
- query: makeInsertUnnestSetQuery(pgSchema, table, itemSchema, isRawEvents),
320
- convertOrThrow: S$RescriptSchema.compile(S$RescriptSchema.unnest(match.dbSchema), "Output", "Input", "Sync", false),
321
- isInsertValues: false
322
- };
303
+ query: makeInsertUnnestSetQuery(pgSchema, table, itemSchema, isRawEvents),
304
+ convertOrThrow: S$RescriptSchema.compile(S$RescriptSchema.unnest(match.dbSchema), "Output", "Input", "Sync", false),
305
+ isInsertValues: false
306
+ };
323
307
  } else {
324
308
  return {
325
- query: makeInsertValuesSetQuery(pgSchema, table, itemSchema, 500),
326
- convertOrThrow: S$RescriptSchema.compile(S$RescriptSchema.preprocess(S$RescriptSchema.unnest(itemSchema), (function (param) {
327
- return {
328
- s: (function (prim) {
329
- return prim.flat(1);
330
- })
331
- };
332
- })), "Output", "Input", "Sync", false),
333
- isInsertValues: true
334
- };
309
+ query: makeInsertValuesSetQuery(pgSchema, table, itemSchema, 500),
310
+ convertOrThrow: S$RescriptSchema.compile(S$RescriptSchema.preprocess(S$RescriptSchema.unnest(itemSchema), param => ({
311
+ s: prim => prim.flat(1)
312
+ })), "Output", "Input", "Sync", false),
313
+ isInsertValues: true
314
+ };
335
315
  }
336
316
  }
337
317
 
338
318
  function chunkArray(arr, chunkSize) {
339
- var chunks = [];
340
- var i = 0;
341
- while(i < arr.length) {
342
- var chunk = arr.slice(i, i + chunkSize | 0);
319
+ let chunks = [];
320
+ let i = 0;
321
+ while (i < arr.length) {
322
+ let chunk = arr.slice(i, i + chunkSize | 0);
343
323
  chunks.push(chunk);
344
324
  i = i + chunkSize | 0;
345
325
  };
@@ -347,35 +327,30 @@ function chunkArray(arr, chunkSize) {
347
327
  }
348
328
 
349
329
  function removeInvalidUtf8InPlace(entities) {
350
- entities.forEach(function (item) {
351
- Utils.Dict.forEachWithKey(item, (function (value, key) {
352
- if (typeof value === "string") {
353
- item[key] = value.replaceAll("\x00", "");
354
- return ;
355
- }
356
-
357
- }));
358
- });
330
+ entities.forEach(item => Utils.Dict.forEachWithKey(item, (value, key) => {
331
+ if (typeof value === "string") {
332
+ item[key] = value.replaceAll("\x00", "");
333
+ return;
334
+ }
335
+ }));
359
336
  }
360
337
 
361
- var pgErrorMessageSchema = S$RescriptSchema.object(function (s) {
362
- return s.f("message", S$RescriptSchema.string);
363
- });
338
+ let pgErrorMessageSchema = S$RescriptSchema.object(s => s.f("message", S$RescriptSchema.string));
364
339
 
365
- var PgEncodingError = /* @__PURE__ */Caml_exceptions.create("PgStorage.PgEncodingError");
340
+ let PgEncodingError = /* @__PURE__ */Primitive_exceptions.create("PgStorage.PgEncodingError");
366
341
 
367
- var setQueryCache = new WeakMap();
342
+ let setQueryCache = new WeakMap();
368
343
 
369
344
  async function setOrThrow(sql, items, table, itemSchema, pgSchema) {
370
345
  if (items.length === 0) {
371
- return ;
346
+ return;
372
347
  }
373
- var cached = setQueryCache.get(table);
374
- var data;
348
+ let cached = setQueryCache.get(table);
349
+ let data;
375
350
  if (cached !== undefined) {
376
- data = Caml_option.valFromOption(cached);
351
+ data = Primitive_option.valFromOption(cached);
377
352
  } else {
378
- var newQuery = makeTableBatchSetQuery(pgSchema, table, itemSchema);
353
+ let newQuery = makeTableBatchSetQuery(pgSchema, table, itemSchema);
379
354
  setQueryCache.set(table, newQuery);
380
355
  data = newQuery;
381
356
  }
@@ -383,53 +358,57 @@ async function setOrThrow(sql, items, table, itemSchema, pgSchema) {
383
358
  if (!data.isInsertValues) {
384
359
  return await sql.unsafe(data.query, data.convertOrThrow(items), {prepare: true});
385
360
  }
386
- var chunks = chunkArray(items, 500);
387
- var responses = [];
388
- chunks.forEach(function (chunk) {
389
- var chunkSize = chunk.length;
390
- var isFullChunk = chunkSize === 500;
391
- var params = data.convertOrThrow(chunk);
392
- var response = isFullChunk ? sql.unsafe(data.query, params, {prepare: true}) : sql.unsafe(makeInsertValuesSetQuery(pgSchema, table, itemSchema, chunkSize), params);
393
- responses.push(response);
394
- });
361
+ let chunks = chunkArray(items, 500);
362
+ let responses = [];
363
+ chunks.forEach(chunk => {
364
+ let chunkSize = chunk.length;
365
+ let isFullChunk = chunkSize === 500;
366
+ let params = data.convertOrThrow(chunk);
367
+ let response = isFullChunk ? sql.unsafe(data.query, params, {prepare: true}) : sql.unsafe(makeInsertValuesSetQuery(pgSchema, table, itemSchema, chunkSize), params);
368
+ responses.push(response);
369
+ });
395
370
  await Promise.all(responses);
396
- return ;
397
- }
398
- catch (raw_exn){
399
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
371
+ return;
372
+ } catch (raw_exn) {
373
+ let exn = Primitive_exceptions.internalToException(raw_exn);
400
374
  if (exn.RE_EXN_ID === S$RescriptSchema.Raised) {
401
375
  throw {
402
- RE_EXN_ID: Persistence.StorageError,
403
- message: "Failed to convert items for table \"" + table.tableName + "\"",
404
- reason: exn,
405
- Error: new Error()
406
- };
376
+ RE_EXN_ID: Persistence.StorageError,
377
+ message: `Failed to convert items for table "` + table.tableName + `"`,
378
+ reason: exn,
379
+ Error: new Error()
380
+ };
407
381
  }
408
382
  throw {
409
- RE_EXN_ID: Persistence.StorageError,
410
- message: "Failed to insert items into table \"" + table.tableName + "\"",
411
- reason: Utils.prettifyExn(exn),
412
- Error: new Error()
413
- };
383
+ RE_EXN_ID: Persistence.StorageError,
384
+ message: `Failed to insert items into table "` + table.tableName + `"`,
385
+ reason: Utils.prettifyExn(exn),
386
+ Error: new Error()
387
+ };
414
388
  }
415
389
  }
416
390
 
417
391
  function makeSchemaTableNamesQuery(pgSchema) {
418
- return "SELECT table_name FROM information_schema.tables WHERE table_schema = '" + pgSchema + "';";
392
+ return `SELECT table_name FROM information_schema.tables WHERE table_schema = '` + pgSchema + `';`;
419
393
  }
420
394
 
421
- var cacheTablePrefixLength = Internal.cacheTablePrefix.length;
395
+ let cacheTablePrefixLength = Internal.cacheTablePrefix.length;
422
396
 
423
397
  function makeSchemaCacheTableInfoQuery(pgSchema) {
424
- return "SELECT \n t.table_name,\n " + getCacheRowCountFnName + "(t.table_name) as count\n FROM information_schema.tables t\n WHERE t.table_schema = '" + pgSchema + "' \n AND t.table_name LIKE '" + Internal.cacheTablePrefix + "%';";
398
+ return `SELECT
399
+ t.table_name,
400
+ ` + getCacheRowCountFnName + `(t.table_name) as count
401
+ FROM information_schema.tables t
402
+ WHERE t.table_schema = '` + pgSchema + `'
403
+ AND t.table_name LIKE '` + Internal.cacheTablePrefix + `%';`;
425
404
  }
426
405
 
427
- var psqlExecState = {
406
+ let psqlExecState = {
428
407
  contents: "Unknown"
429
408
  };
430
409
 
431
410
  async function getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort, containerName) {
432
- var promise = psqlExecState.contents;
411
+ let promise = psqlExecState.contents;
433
412
  if (typeof promise === "object") {
434
413
  if (promise.TAG === "Pending") {
435
414
  return await promise._0;
@@ -437,36 +416,36 @@ async function getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort, containe
437
416
  return promise._0;
438
417
  }
439
418
  }
440
- var promise$1 = new Promise((function (resolve, _reject) {
441
- var binary = "psql";
442
- Child_process.exec(binary + " --version", (function (error, param, param$1) {
443
- if (error === null) {
444
- return resolve({
445
- TAG: "Ok",
446
- _0: binary + " -h " + pgHost + " -p " + pgPort.toString() + " -U " + pgUser + " -d " + pgDatabase
447
- });
448
- }
449
- var binary$1 = "docker exec -i -u " + pgUser + " " + containerName + " psql";
450
- Child_process.exec(binary$1 + " --version", (function (error, param, param$1) {
451
- if (error === null) {
452
- return resolve({
453
- TAG: "Ok",
454
- _0: binary$1 + " -h " + pgHost + " -p " + (5432).toString() + " -U " + pgUser + " -d " + pgDatabase
455
- });
456
- } else {
457
- return resolve({
458
- TAG: "Error",
459
- _0: "Please check if \"psql\" binary is installed or Docker container \"" + containerName + "\" is running."
460
- });
461
- }
462
- }));
463
- }));
464
- }));
419
+ let promise$1 = new Promise((resolve, _reject) => {
420
+ let binary = "psql";
421
+ Child_process.exec(binary + ` --version`, (error, param, param$1) => {
422
+ if (error === null) {
423
+ return resolve({
424
+ TAG: "Ok",
425
+ _0: binary + ` -h ` + pgHost + ` -p ` + pgPort.toString() + ` -U ` + pgUser + ` -d ` + pgDatabase
426
+ });
427
+ }
428
+ let binary$1 = `docker exec -i -u ` + pgUser + ` ` + containerName + ` psql`;
429
+ Child_process.exec(binary$1 + ` --version`, (error, param, param$1) => {
430
+ if (error === null) {
431
+ return resolve({
432
+ TAG: "Ok",
433
+ _0: binary$1 + ` -h ` + pgHost + ` -p ` + (5432).toString() + ` -U ` + pgUser + ` -d ` + pgDatabase
434
+ });
435
+ } else {
436
+ return resolve({
437
+ TAG: "Error",
438
+ _0: `Please check if "psql" binary is installed or Docker container "` + containerName + `" is running.`
439
+ });
440
+ }
441
+ });
442
+ });
443
+ });
465
444
  psqlExecState.contents = {
466
445
  TAG: "Pending",
467
446
  _0: promise$1
468
447
  };
469
- var result = await promise$1;
448
+ let result = await promise$1;
470
449
  psqlExecState.contents = {
471
450
  TAG: "Resolved",
472
451
  _0: result
@@ -479,46 +458,44 @@ async function deleteByIdsOrThrow(sql, pgSchema, ids, table) {
479
458
  await (
480
459
  ids.length !== 1 ? sql.unsafe(makeDeleteByIdsQuery(pgSchema, table.tableName), [ids], {prepare: true}) : sql.unsafe(makeDeleteByIdQuery(pgSchema, table.tableName), ids, {prepare: true})
481
460
  );
482
- return ;
483
- }
484
- catch (raw_exn){
485
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
461
+ return;
462
+ } catch (raw_exn) {
463
+ let exn = Primitive_exceptions.internalToException(raw_exn);
486
464
  throw {
487
- RE_EXN_ID: Persistence.StorageError,
488
- message: "Failed deleting \"" + table.tableName + "\" from storage by ids",
489
- reason: exn,
490
- Error: new Error()
491
- };
465
+ RE_EXN_ID: Persistence.StorageError,
466
+ message: `Failed deleting "` + table.tableName + `" from storage by ids`,
467
+ reason: exn,
468
+ Error: new Error()
469
+ };
492
470
  }
493
471
  }
494
472
 
495
473
  function makeInsertDeleteUpdatesQuery(entityConfig, pgSchema) {
496
- var historyTableName = EntityHistory.historyTableName(entityConfig.name, entityConfig.index);
497
- var allHistoryFieldNames = Belt_Array.keepMap(entityConfig.table.fields, (function (fieldOrDerived) {
498
- if (fieldOrDerived.TAG === "Field") {
499
- return Table.getDbFieldName(fieldOrDerived._0);
500
- }
501
-
502
- }));
474
+ let historyTableName = EntityHistory.historyTableName(entityConfig.name, entityConfig.index);
475
+ let allHistoryFieldNames = Belt_Array.keepMap(entityConfig.table.fields, fieldOrDerived => {
476
+ if (fieldOrDerived.TAG === "Field") {
477
+ return Table.getDbFieldName(fieldOrDerived._0);
478
+ }
479
+ });
503
480
  allHistoryFieldNames.push(EntityHistory.checkpointIdFieldName);
504
481
  allHistoryFieldNames.push(EntityHistory.changeFieldName);
505
- var allHistoryFieldNamesStr = Belt_Array.map(allHistoryFieldNames, (function (name) {
506
- return "\"" + name + "\"";
507
- })).join(", ");
508
- var selectParts = Belt_Array.map(allHistoryFieldNames, (function (fieldName) {
509
- if (fieldName === Table.idFieldName) {
510
- return "u." + Table.idFieldName;
511
- } else if (fieldName === EntityHistory.checkpointIdFieldName) {
512
- return "u." + EntityHistory.checkpointIdFieldName;
513
- } else if (fieldName === EntityHistory.changeFieldName) {
514
- return "'" + "DELETE" + "'";
515
- } else {
516
- return "NULL";
517
- }
518
- }));
519
- var selectPartsStr = selectParts.join(", ");
520
- var checkpointIdPgType = Table.getPgFieldType(EntityHistory.checkpointIdFieldType, pgSchema, false, false, false);
521
- return "INSERT INTO \"" + pgSchema + "\".\"" + historyTableName + "\" (" + allHistoryFieldNamesStr + ")\nSELECT " + selectPartsStr + "\nFROM UNNEST($1::text[], $2::" + checkpointIdPgType + "[]) AS u(" + Table.idFieldName + ", " + EntityHistory.checkpointIdFieldName + ")";
482
+ let allHistoryFieldNamesStr = Belt_Array.map(allHistoryFieldNames, name => `"` + name + `"`).join(", ");
483
+ let selectParts = Belt_Array.map(allHistoryFieldNames, fieldName => {
484
+ if (fieldName === Table.idFieldName) {
485
+ return `u.` + Table.idFieldName;
486
+ } else if (fieldName === EntityHistory.checkpointIdFieldName) {
487
+ return `u.` + EntityHistory.checkpointIdFieldName;
488
+ } else if (fieldName === EntityHistory.changeFieldName) {
489
+ return `'` + "DELETE" + `'`;
490
+ } else {
491
+ return "NULL";
492
+ }
493
+ });
494
+ let selectPartsStr = selectParts.join(", ");
495
+ let checkpointIdPgType = Table.getPgFieldType(EntityHistory.checkpointIdFieldType, pgSchema, false, false, false);
496
+ return `INSERT INTO "` + pgSchema + `"."` + historyTableName + `" (` + allHistoryFieldNamesStr + `)
497
+ SELECT ` + selectPartsStr + `
498
+ FROM UNNEST($1::text[], $2::` + checkpointIdPgType + `[]) AS u(` + Table.idFieldName + `, ` + EntityHistory.checkpointIdFieldName + `)`;
522
499
  }
523
500
 
524
501
  function executeSet(sql, items, dbFunction) {
@@ -531,274 +508,257 @@ function executeSet(sql, items, dbFunction) {
531
508
 
532
509
  async function writeBatch(sql, batch, rawEvents, pgSchema, rollbackTargetCheckpointId, isInReorgThreshold, config, allEntities, setEffectCacheOrThrow, updatedEffectsCache, updatedEntities, sinkPromise, escapeTables) {
533
510
  try {
534
- var shouldSaveHistory = Config.shouldSaveHistory(config, isInReorgThreshold);
535
- var specificError = {
511
+ let shouldSaveHistory = Config.shouldSaveHistory(config, isInReorgThreshold);
512
+ let specificError = {
536
513
  contents: undefined
537
514
  };
538
- var setRawEvents = function (__x) {
539
- return executeSet(__x, rawEvents, (function (sql, items) {
540
- return setOrThrow(sql, items, InternalTable.RawEvents.table, InternalTable.RawEvents.schema, pgSchema);
541
- }));
542
- };
543
- var setEntities = Belt_Array.map(updatedEntities, (function (param) {
544
- var updates = param.updates;
545
- var entityConfig = param.entityConfig;
546
- var entitiesToSet = [];
547
- var idsToDelete = [];
548
- updates.forEach(function (row) {
549
- var match = row.latestChange;
550
- if (match.type === "SET") {
551
- entitiesToSet.push(match.entity);
552
- return ;
553
- }
554
- idsToDelete.push(match.entityId);
555
- });
556
- var shouldRemoveInvalidUtf8 = escapeTables !== undefined && Caml_option.valFromOption(escapeTables).has(entityConfig.table) ? true : false;
557
- return async function (sql) {
558
- try {
559
- var promises = [];
560
- if (shouldSaveHistory) {
561
- var backfillHistoryIds = new Set();
562
- var batchSetUpdates = [];
563
- var batchDeleteCheckpointIds = [];
564
- var batchDeleteEntityIds = [];
565
- updates.forEach(function (update) {
566
- var containsRollbackDiffChange = update.containsRollbackDiffChange;
567
- update.history.forEach(function (change) {
568
- if (!containsRollbackDiffChange) {
569
- backfillHistoryIds.add(change.entityId);
570
- }
571
- if (change.type === "SET") {
572
- batchSetUpdates.push(change);
573
- return ;
574
- }
575
- batchDeleteEntityIds.push(change.entityId);
576
- batchDeleteCheckpointIds.push(change.checkpointId);
577
- });
578
- });
579
- if (backfillHistoryIds.size !== 0) {
580
- await EntityHistory.backfillHistory(sql, pgSchema, entityConfig.name, entityConfig.index, Array.from(backfillHistoryIds));
581
- }
582
- if (Utils.$$Array.notEmpty(batchDeleteCheckpointIds)) {
583
- promises.push(sql.unsafe(makeInsertDeleteUpdatesQuery(entityConfig, pgSchema), [
584
- batchDeleteEntityIds,
585
- $$BigInt.arrayToStringArray(batchDeleteCheckpointIds)
586
- ], {prepare: true}));
587
- }
588
- if (Utils.$$Array.notEmpty(batchSetUpdates)) {
589
- if (shouldRemoveInvalidUtf8) {
590
- var entities = batchSetUpdates.map(function (batchSetUpdate) {
591
- if (batchSetUpdate.type === "SET") {
592
- return batchSetUpdate.entity;
593
- } else {
594
- return Js_exn.raiseError("Expected Set action");
595
- }
596
- });
597
- removeInvalidUtf8InPlace(entities);
598
- }
599
- var entityHistory = getEntityHistory(entityConfig);
600
- promises.push(setOrThrow(sql, batchSetUpdates, entityHistory.table, entityHistory.setChangeSchema, pgSchema));
601
- }
602
-
603
- }
604
- if (Utils.$$Array.notEmpty(entitiesToSet)) {
605
- if (shouldRemoveInvalidUtf8) {
606
- removeInvalidUtf8InPlace(entitiesToSet);
607
- }
608
- promises.push(setOrThrow(sql, entitiesToSet, entityConfig.table, entityConfig.schema, pgSchema));
515
+ let setRawEvents = __x => executeSet(__x, rawEvents, (sql, items) => setOrThrow(sql, items, InternalTable.RawEvents.table, InternalTable.RawEvents.schema, pgSchema));
516
+ let setEntities = Belt_Array.map(updatedEntities, param => {
517
+ let updates = param.updates;
518
+ let entityConfig = param.entityConfig;
519
+ let entitiesToSet = [];
520
+ let idsToDelete = [];
521
+ updates.forEach(row => {
522
+ let match = row.latestChange;
523
+ if (match.type === "SET") {
524
+ entitiesToSet.push(match.entity);
525
+ return;
526
+ }
527
+ idsToDelete.push(match.entityId);
528
+ });
529
+ let shouldRemoveInvalidUtf8 = escapeTables !== undefined ? Primitive_option.valFromOption(escapeTables).has(entityConfig.table) : false;
530
+ return async sql => {
531
+ try {
532
+ let promises = [];
533
+ if (shouldSaveHistory) {
534
+ let backfillHistoryIds = new Set();
535
+ let batchSetUpdates = [];
536
+ let batchDeleteCheckpointIds = [];
537
+ let batchDeleteEntityIds = [];
538
+ updates.forEach(update => {
539
+ let containsRollbackDiffChange = update.containsRollbackDiffChange;
540
+ update.history.forEach(change => {
541
+ if (!containsRollbackDiffChange) {
542
+ backfillHistoryIds.add(change.entityId);
609
543
  }
610
- if (Utils.$$Array.notEmpty(idsToDelete)) {
611
- promises.push(deleteByIdsOrThrow(sql, pgSchema, idsToDelete, entityConfig.table));
544
+ if (change.type === "SET") {
545
+ batchSetUpdates.push(change);
546
+ return;
612
547
  }
613
- await Promise.all(promises);
614
- return ;
615
- }
616
- catch (raw_exn){
617
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
618
- var normalizedExn = Caml_js_exceptions.internalToOCamlException(exn.RE_EXN_ID === "JsError" || exn.RE_EXN_ID !== Persistence.StorageError ? exn : exn.reason);
619
- if (normalizedExn.RE_EXN_ID === "JsError") {
620
- var val;
621
- try {
622
- val = S$RescriptSchema.parseOrThrow(normalizedExn._1, pgErrorMessageSchema);
623
- }
624
- catch (exn$1){
625
- return ;
626
- }
627
- switch (val) {
628
- case "current transaction is aborted, commands ignored until end of transaction block" :
629
- return ;
630
- case "invalid byte sequence for encoding \"UTF8\": 0x00" :
631
- specificError.contents = {
632
- RE_EXN_ID: PgEncodingError,
633
- table: entityConfig.table
634
- };
635
- return ;
636
- default:
637
- specificError.contents = Utils.prettifyExn(exn);
638
- return ;
639
- }
640
- } else {
641
- if (normalizedExn.RE_EXN_ID !== S$RescriptSchema.Raised) {
642
- return ;
548
+ batchDeleteEntityIds.push(change.entityId);
549
+ batchDeleteCheckpointIds.push(change.checkpointId);
550
+ });
551
+ });
552
+ if (backfillHistoryIds.size !== 0) {
553
+ await EntityHistory.backfillHistory(sql, pgSchema, entityConfig.name, entityConfig.index, Array.from(backfillHistoryIds));
554
+ }
555
+ if (Utils.$$Array.notEmpty(batchDeleteCheckpointIds)) {
556
+ promises.push(sql.unsafe(makeInsertDeleteUpdatesQuery(entityConfig, pgSchema), [
557
+ batchDeleteEntityIds,
558
+ Utils.$$BigInt.arrayToStringArray(batchDeleteCheckpointIds)
559
+ ], {prepare: true}));
560
+ }
561
+ if (Utils.$$Array.notEmpty(batchSetUpdates)) {
562
+ if (shouldRemoveInvalidUtf8) {
563
+ removeInvalidUtf8InPlace(batchSetUpdates.map(batchSetUpdate => {
564
+ if (batchSetUpdate.type === "SET") {
565
+ return batchSetUpdate.entity;
566
+ } else {
567
+ return Stdlib_JsError.throwWithMessage("Expected Set action");
643
568
  }
644
- throw normalizedExn;
645
- }
569
+ }));
646
570
  }
647
- };
648
- }));
649
- var rollbackTables = rollbackTargetCheckpointId !== undefined ? (function (sql) {
650
- var promises = allEntities.map(function (entityConfig) {
651
- return EntityHistory.rollback(sql, pgSchema, entityConfig.name, entityConfig.index, rollbackTargetCheckpointId);
652
- });
653
- promises.push(InternalTable.Checkpoints.rollback(sql, pgSchema, rollbackTargetCheckpointId));
654
- return Promise.all(promises);
655
- }) : undefined;
571
+ let entityHistory = getEntityHistory(entityConfig);
572
+ promises.push(setOrThrow(sql, batchSetUpdates, entityHistory.table, entityHistory.setChangeSchema, pgSchema));
573
+ }
574
+ }
575
+ if (Utils.$$Array.notEmpty(entitiesToSet)) {
576
+ if (shouldRemoveInvalidUtf8) {
577
+ removeInvalidUtf8InPlace(entitiesToSet);
578
+ }
579
+ promises.push(setOrThrow(sql, entitiesToSet, entityConfig.table, entityConfig.schema, pgSchema));
580
+ }
581
+ if (Utils.$$Array.notEmpty(idsToDelete)) {
582
+ promises.push(deleteByIdsOrThrow(sql, pgSchema, idsToDelete, entityConfig.table));
583
+ }
584
+ await Promise.all(promises);
585
+ return;
586
+ } catch (raw_exn) {
587
+ let exn = Primitive_exceptions.internalToException(raw_exn);
588
+ let normalizedExn = Primitive_exceptions.internalToException(exn.RE_EXN_ID === "JsExn" || exn.RE_EXN_ID !== Persistence.StorageError ? exn : exn.reason);
589
+ if (normalizedExn.RE_EXN_ID === "JsExn") {
590
+ let val;
591
+ try {
592
+ val = S$RescriptSchema.parseOrThrow(normalizedExn._1, pgErrorMessageSchema);
593
+ } catch (exn$1) {
594
+ return;
595
+ }
596
+ switch (val) {
597
+ case "current transaction is aborted, commands ignored until end of transaction block" :
598
+ return;
599
+ case "invalid byte sequence for encoding \"UTF8\": 0x00" :
600
+ specificError.contents = {
601
+ RE_EXN_ID: PgEncodingError,
602
+ table: entityConfig.table
603
+ };
604
+ return;
605
+ default:
606
+ specificError.contents = Utils.prettifyExn(exn);
607
+ return;
608
+ }
609
+ } else {
610
+ if (normalizedExn.RE_EXN_ID !== S$RescriptSchema.Raised) {
611
+ return;
612
+ }
613
+ throw normalizedExn;
614
+ }
615
+ }
616
+ };
617
+ });
618
+ let rollbackTables = rollbackTargetCheckpointId !== undefined ? sql => {
619
+ let promises = allEntities.map(entityConfig => EntityHistory.rollback(sql, pgSchema, entityConfig.name, entityConfig.index, rollbackTargetCheckpointId));
620
+ promises.push(InternalTable.Checkpoints.rollback(sql, pgSchema, rollbackTargetCheckpointId));
621
+ return Promise.all(promises);
622
+ } : undefined;
656
623
  try {
657
624
  await Promise.all([
658
- sql.begin(async function (sql) {
659
- if (rollbackTables !== undefined) {
660
- await rollbackTables(sql);
661
- }
662
- var setOperations = Belt_Array.concat([
663
- (function (sql) {
664
- return InternalTable.Chains.setProgressedChains(sql, pgSchema, Utils.Dict.mapValuesToArray(batch.progressedChainsById, (function (chainAfterBatch) {
665
- return {
666
- chainId: chainAfterBatch.fetchState.chainId,
667
- progressBlockNumber: chainAfterBatch.progressBlockNumber,
668
- sourceBlockNumber: chainAfterBatch.sourceBlockNumber,
669
- totalEventsProcessed: chainAfterBatch.totalEventsProcessed
670
- };
671
- })));
672
- }),
673
- setRawEvents
674
- ], setEntities);
675
- if (shouldSaveHistory) {
676
- setOperations.push(function (sql) {
677
- return InternalTable.Checkpoints.insert(sql, pgSchema, batch.checkpointIds, batch.checkpointChainIds, batch.checkpointBlockNumbers, batch.checkpointBlockHashes, batch.checkpointEventsProcessed);
678
- });
679
- }
680
- await Promise.all(Belt_Array.map(setOperations, (function (dbFunc) {
681
- return dbFunc(sql);
682
- })));
683
- if (sinkPromise === undefined) {
684
- return ;
685
- }
686
- var exn = await Caml_option.valFromOption(sinkPromise);
687
- if (exn === undefined) {
688
- return ;
689
- }
690
- throw exn;
691
- }),
692
- Promise.all(Belt_Array.map(updatedEffectsCache, (function (param) {
693
- return setEffectCacheOrThrow(param.effect, param.items, param.shouldInitialize);
694
- })))
695
- ]);
696
- var specificError$1 = specificError.contents;
625
+ sql.begin(async sql => {
626
+ if (rollbackTables !== undefined) {
627
+ await rollbackTables(sql);
628
+ }
629
+ let setOperations = Belt_Array.concat([
630
+ sql => InternalTable.Chains.setProgressedChains(sql, pgSchema, Utils.Dict.mapValuesToArray(batch.progressedChainsById, chainAfterBatch => ({
631
+ chainId: chainAfterBatch.fetchState.chainId,
632
+ progressBlockNumber: chainAfterBatch.progressBlockNumber,
633
+ sourceBlockNumber: chainAfterBatch.sourceBlockNumber,
634
+ totalEventsProcessed: chainAfterBatch.totalEventsProcessed
635
+ }))),
636
+ setRawEvents
637
+ ], setEntities);
638
+ if (shouldSaveHistory) {
639
+ setOperations.push(sql => InternalTable.Checkpoints.insert(sql, pgSchema, batch.checkpointIds, batch.checkpointChainIds, batch.checkpointBlockNumbers, batch.checkpointBlockHashes, batch.checkpointEventsProcessed));
640
+ }
641
+ await Promise.all(Belt_Array.map(setOperations, dbFunc => dbFunc(sql)));
642
+ if (sinkPromise === undefined) {
643
+ return;
644
+ }
645
+ let exn = await sinkPromise;
646
+ if (exn === undefined) {
647
+ return;
648
+ }
649
+ throw exn;
650
+ }),
651
+ Promise.all(Belt_Array.map(updatedEffectsCache, param => setEffectCacheOrThrow(param.effect, param.items, param.shouldInitialize)))
652
+ ]);
653
+ let specificError$1 = specificError.contents;
697
654
  if (specificError$1 === undefined) {
698
- return ;
655
+ return;
699
656
  }
700
657
  throw specificError$1;
701
- }
702
- catch (raw_exn){
703
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
704
- var specificError$2 = specificError.contents;
658
+ } catch (raw_exn) {
659
+ let exn = Primitive_exceptions.internalToException(raw_exn);
660
+ let specificError$2 = specificError.contents;
705
661
  throw specificError$2 !== undefined ? specificError$2 : exn;
706
662
  }
707
- }
708
- catch (raw_exn$1){
709
- var exn$1 = Caml_js_exceptions.internalToOCamlException(raw_exn$1);
663
+ } catch (raw_exn$1) {
664
+ let exn$1 = Primitive_exceptions.internalToException(raw_exn$1);
710
665
  if (exn$1.RE_EXN_ID === PgEncodingError) {
711
- var escapeTables$1 = escapeTables !== undefined ? Caml_option.valFromOption(escapeTables) : new Set();
666
+ let escapeTables$1 = escapeTables !== undefined ? Primitive_option.valFromOption(escapeTables) : new Set();
712
667
  escapeTables$1.add(exn$1.table);
713
- return await writeBatch(sql, batch, rawEvents, pgSchema, rollbackTargetCheckpointId, isInReorgThreshold, config, allEntities, setEffectCacheOrThrow, updatedEffectsCache, updatedEntities, sinkPromise, Caml_option.some(escapeTables$1));
668
+ return await writeBatch(sql, batch, rawEvents, pgSchema, rollbackTargetCheckpointId, isInReorgThreshold, config, allEntities, setEffectCacheOrThrow, updatedEffectsCache, updatedEntities, sinkPromise, Primitive_option.some(escapeTables$1));
714
669
  }
715
670
  throw exn$1;
716
671
  }
717
672
  }
718
673
 
719
674
  function makeGetRollbackRestoredEntitiesQuery(entityConfig, pgSchema) {
720
- var dataFieldNames = Belt_Array.keepMap(entityConfig.table.fields, (function (fieldOrDerived) {
721
- if (fieldOrDerived.TAG === "Field") {
722
- return Table.getDbFieldName(fieldOrDerived._0);
723
- }
724
-
725
- }));
726
- var dataFieldsCommaSeparated = Belt_Array.map(dataFieldNames, (function (name) {
727
- return "\"" + name + "\"";
728
- })).join(", ");
729
- var historyTableName = EntityHistory.historyTableName(entityConfig.name, entityConfig.index);
730
- return "SELECT DISTINCT ON (" + Table.idFieldName + ") " + dataFieldsCommaSeparated + "\nFROM \"" + pgSchema + "\".\"" + historyTableName + "\"\nWHERE \"" + EntityHistory.checkpointIdFieldName + "\" <= $1\n AND EXISTS (\n SELECT 1\n FROM \"" + pgSchema + "\".\"" + historyTableName + "\" h\n WHERE h." + Table.idFieldName + " = \"" + historyTableName + "\"." + Table.idFieldName + "\n AND h.\"" + EntityHistory.checkpointIdFieldName + "\" > $1\n )\nORDER BY " + Table.idFieldName + ", \"" + EntityHistory.checkpointIdFieldName + "\" DESC";
675
+ let dataFieldNames = Belt_Array.keepMap(entityConfig.table.fields, fieldOrDerived => {
676
+ if (fieldOrDerived.TAG === "Field") {
677
+ return Table.getDbFieldName(fieldOrDerived._0);
678
+ }
679
+ });
680
+ let dataFieldsCommaSeparated = Belt_Array.map(dataFieldNames, name => `"` + name + `"`).join(", ");
681
+ let historyTableName = EntityHistory.historyTableName(entityConfig.name, entityConfig.index);
682
+ return `SELECT DISTINCT ON (` + Table.idFieldName + `) ` + dataFieldsCommaSeparated + `
683
+ FROM "` + pgSchema + `"."` + historyTableName + `"
684
+ WHERE "` + EntityHistory.checkpointIdFieldName + `" <= $1
685
+ AND EXISTS (
686
+ SELECT 1
687
+ FROM "` + pgSchema + `"."` + historyTableName + `" h
688
+ WHERE h.` + Table.idFieldName + ` = "` + historyTableName + `".` + Table.idFieldName + `
689
+ AND h."` + EntityHistory.checkpointIdFieldName + `" > $1
690
+ )
691
+ ORDER BY ` + Table.idFieldName + `, "` + EntityHistory.checkpointIdFieldName + `" DESC`;
731
692
  }
732
693
 
733
694
  function makeGetRollbackRemovedIdsQuery(entityConfig, pgSchema) {
734
- var historyTableName = EntityHistory.historyTableName(entityConfig.name, entityConfig.index);
735
- return "SELECT DISTINCT " + Table.idFieldName + "\nFROM \"" + pgSchema + "\".\"" + historyTableName + "\"\nWHERE \"" + EntityHistory.checkpointIdFieldName + "\" > $1\nAND NOT EXISTS (\n SELECT 1\n FROM \"" + pgSchema + "\".\"" + historyTableName + "\" h\n WHERE h." + Table.idFieldName + " = \"" + historyTableName + "\"." + Table.idFieldName + "\n AND h.\"" + EntityHistory.checkpointIdFieldName + "\" <= $1\n)";
695
+ let historyTableName = EntityHistory.historyTableName(entityConfig.name, entityConfig.index);
696
+ return `SELECT DISTINCT ` + Table.idFieldName + `
697
+ FROM "` + pgSchema + `"."` + historyTableName + `"
698
+ WHERE "` + EntityHistory.checkpointIdFieldName + `" > $1
699
+ AND NOT EXISTS (
700
+ SELECT 1
701
+ FROM "` + pgSchema + `"."` + historyTableName + `" h
702
+ WHERE h.` + Table.idFieldName + ` = "` + historyTableName + `".` + Table.idFieldName + `
703
+ AND h."` + EntityHistory.checkpointIdFieldName + `" <= $1
704
+ )`;
736
705
  }
737
706
 
738
707
  function make(sql, pgHost, pgSchema, pgPort, pgUser, pgDatabase, pgPassword, isHasuraEnabled, sink, onInitialize, onNewTables) {
739
- var containerName = "envio-postgres";
740
- var psqlExecOptions_env = Js_dict.fromArray([
741
- [
742
- "PGPASSWORD",
743
- pgPassword
744
- ],
745
- [
746
- "PATH",
747
- process.env.PATH
748
- ]
749
- ]);
750
- var psqlExecOptions = {
708
+ let containerName = "envio-postgres";
709
+ let psqlExecOptions_env = Object.fromEntries([
710
+ [
711
+ "PGPASSWORD",
712
+ pgPassword
713
+ ],
714
+ [
715
+ "PATH",
716
+ process.env.PATH
717
+ ]
718
+ ]);
719
+ let psqlExecOptions = {
751
720
  env: psqlExecOptions_env
752
721
  };
753
- var cacheDirPath = Path.resolve(".envio", "cache");
754
- var isInitialized = async function () {
755
- var envioTables = await sql.unsafe("SELECT table_schema FROM information_schema.tables WHERE table_schema = '" + pgSchema + "' AND (table_name = 'event_sync_state' OR table_name = '" + InternalTable.Chains.table.tableName + "');");
756
- return Utils.$$Array.notEmpty(envioTables);
757
- };
758
- var restoreEffectCache = async function (withUpload) {
722
+ let cacheDirPath = Path.resolve(".envio", "cache");
723
+ let isInitialized = async () => Utils.$$Array.notEmpty(await sql.unsafe(`SELECT table_schema FROM information_schema.tables WHERE table_schema = '` + pgSchema + `' AND (table_name = '` + "event_sync_state" + `' OR table_name = '` + InternalTable.Chains.table.tableName + `');`));
724
+ let restoreEffectCache = async withUpload => {
759
725
  if (withUpload) {
760
- var nothingToUploadErrorMessage = "Nothing to upload.";
761
- var match = await Promise.all([
762
- $$Promise.$$catch(Fs.promises.readdir(cacheDirPath).then(function (e) {
763
- return {
764
- TAG: "Ok",
765
- _0: e
766
- };
767
- }), (function (param) {
768
- return Promise.resolve({
769
- TAG: "Error",
770
- _0: nothingToUploadErrorMessage
771
- });
772
- })),
773
- getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort, containerName)
774
- ]);
775
- var exit = 0;
776
- var message;
777
- var entries = match[0];
726
+ let nothingToUploadErrorMessage = "Nothing to upload.";
727
+ let match = await Promise.all([
728
+ Stdlib_Promise.$$catch(Fs.promises.readdir(cacheDirPath).then(e => ({
729
+ TAG: "Ok",
730
+ _0: e
731
+ })), param => Promise.resolve({
732
+ TAG: "Error",
733
+ _0: nothingToUploadErrorMessage
734
+ })),
735
+ getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort, containerName)
736
+ ]);
737
+ let exit = 0;
738
+ let message;
739
+ let entries = match[0];
778
740
  if (entries.TAG === "Ok") {
779
- var psqlExec = match[1];
741
+ let psqlExec = match[1];
780
742
  if (psqlExec.TAG === "Ok") {
781
- var psqlExec$1 = psqlExec._0;
782
- var cacheFiles = entries._0.filter(function (entry) {
783
- return entry.endsWith(".tsv");
743
+ let psqlExec$1 = psqlExec._0;
744
+ let cacheFiles = entries._0.filter(entry => entry.endsWith(".tsv"));
745
+ await Promise.all(cacheFiles.map(entry => {
746
+ let effectName = entry.slice(0, -4);
747
+ let table = Internal.makeCacheTable(effectName);
748
+ return sql.unsafe(makeCreateTableQuery(table, pgSchema, false)).then(() => {
749
+ let inputFile = Path.join(cacheDirPath, entry);
750
+ let command = psqlExec$1 + ` -c 'COPY "` + pgSchema + `"."` + table.tableName + `" FROM STDIN WITH (FORMAT text, HEADER);' < ` + inputFile;
751
+ return new Promise((resolve, reject) => {
752
+ Child_process.exec(command, psqlExecOptions, (error, stdout, param) => {
753
+ if (error === null) {
754
+ return resolve(stdout);
755
+ } else {
756
+ return reject(error);
757
+ }
758
+ });
784
759
  });
785
- await Promise.all(cacheFiles.map(function (entry) {
786
- var effectName = entry.slice(0, -4);
787
- var table = Internal.makeCacheTable(effectName);
788
- return sql.unsafe(makeCreateTableQuery(table, pgSchema, false)).then(function () {
789
- var inputFile = Path.join(cacheDirPath, entry);
790
- var command = psqlExec$1 + " -c 'COPY \"" + pgSchema + "\".\"" + table.tableName + "\" FROM STDIN WITH (FORMAT text, HEADER);' < " + inputFile;
791
- return new Promise((function (resolve, reject) {
792
- Child_process.exec(command, psqlExecOptions, (function (error, stdout, param) {
793
- if (error === null) {
794
- return resolve(stdout);
795
- } else {
796
- return reject(error);
797
- }
798
- }));
799
- }));
800
- });
801
- }));
760
+ });
761
+ }));
802
762
  Logging.info("Successfully uploaded cache.");
803
763
  } else {
804
764
  message = match[1]._0;
@@ -812,343 +772,365 @@ function make(sql, pgHost, pgSchema, pgPort, pgUser, pgDatabase, pgPassword, isH
812
772
  if (message === nothingToUploadErrorMessage) {
813
773
  Logging.info("No cache found to upload.");
814
774
  } else {
815
- Logging.error("Failed to upload cache, continuing without it. " + message);
775
+ Logging.error(`Failed to upload cache, continuing without it. ` + message);
816
776
  }
817
777
  }
818
-
819
778
  }
820
- var cacheTableInfo = await sql.unsafe(makeSchemaCacheTableInfoQuery(pgSchema));
779
+ let cacheTableInfo = await sql.unsafe(makeSchemaCacheTableInfoQuery(pgSchema));
821
780
  if (withUpload && Utils.$$Array.notEmpty(cacheTableInfo) && onNewTables !== undefined) {
822
- await onNewTables(cacheTableInfo.map(function (info) {
823
- return info.table_name;
824
- }));
781
+ await onNewTables(cacheTableInfo.map(info => info.table_name));
825
782
  }
826
- var cache = {};
827
- cacheTableInfo.forEach(function (param) {
828
- var effectName = param.table_name.slice(cacheTablePrefixLength);
829
- cache[effectName] = {
830
- effectName: effectName,
831
- count: param.count
832
- };
833
- });
783
+ let cache = {};
784
+ cacheTableInfo.forEach(param => {
785
+ let effectName = param.table_name.slice(cacheTablePrefixLength);
786
+ cache[effectName] = {
787
+ effectName: effectName,
788
+ count: param.count
789
+ };
790
+ });
834
791
  return cache;
835
792
  };
836
- var initialize = async function (chainConfigsOpt, entitiesOpt, enumsOpt) {
837
- var chainConfigs = chainConfigsOpt !== undefined ? chainConfigsOpt : [];
838
- var entities = entitiesOpt !== undefined ? entitiesOpt : [];
839
- var enums = enumsOpt !== undefined ? enumsOpt : [];
840
- var schemaTableNames = await sql.unsafe(makeSchemaTableNamesQuery(pgSchema));
841
- if (Utils.$$Array.notEmpty(schemaTableNames) && !schemaTableNames.some(function (table) {
842
- return table.table_name === InternalTable.Chains.table.tableName ? true : table.table_name === "event_sync_state";
843
- })) {
844
- Js_exn.raiseError("Cannot run Envio migrations on PostgreSQL schema \"" + pgSchema + "\" because it contains non-Envio tables. Running migrations would delete all data in this schema.\n\nTo resolve this:\n1. If you want to use this schema, first backup any important data, then drop it with: \"pnpm envio local db-migrate down\"\n2. Or specify a different schema name by setting the \"ENVIO_PG_SCHEMA\" environment variable\n3. Or manually drop the schema in your database if you're certain the data is not needed.");
793
+ let initialize = async (chainConfigsOpt, entitiesOpt, enumsOpt) => {
794
+ let chainConfigs = chainConfigsOpt !== undefined ? chainConfigsOpt : [];
795
+ let entities = entitiesOpt !== undefined ? entitiesOpt : [];
796
+ let enums = enumsOpt !== undefined ? enumsOpt : [];
797
+ let schemaTableNames = await sql.unsafe(makeSchemaTableNamesQuery(pgSchema));
798
+ if (Utils.$$Array.notEmpty(schemaTableNames) && !schemaTableNames.some(table => table.table_name === InternalTable.Chains.table.tableName ? true : table.table_name === "event_sync_state")) {
799
+ Stdlib_JsError.throwWithMessage(`Cannot run Envio migrations on PostgreSQL schema "` + pgSchema + `" because it contains non-Envio tables. Running migrations would delete all data in this schema.\n\nTo resolve this:\n1. If you want to use this schema, first backup any important data, then drop it with: "pnpm envio local db-migrate down"\n2. Or specify a different schema name by setting the "ENVIO_PG_SCHEMA" environment variable\n3. Or manually drop the schema in your database if you're certain the data is not needed.`);
845
800
  }
846
801
  if (sink !== undefined) {
847
802
  await sink.initialize(chainConfigs, entities, enums);
848
803
  }
849
- var queries = makeInitializeTransaction(pgSchema, pgUser, isHasuraEnabled, chainConfigs, entities, enums, Utils.$$Array.isEmpty(schemaTableNames));
850
- await sql.begin(function (sql) {
851
- return Promise.all(queries.map(function (query) {
852
- return sql.unsafe(query);
853
- }));
804
+ let queries = makeInitializeTransaction(pgSchema, pgUser, isHasuraEnabled, chainConfigs, entities, enums, Utils.$$Array.isEmpty(schemaTableNames));
805
+ await sql.begin(sql => Promise.all(queries.map(query => sql.unsafe(query))));
806
+ let ids = [];
807
+ let addrChainIds = [];
808
+ let addrContractNames = [];
809
+ chainConfigs.forEach(chain => {
810
+ chain.contracts.forEach(contract => {
811
+ contract.addresses.forEach(address => {
812
+ ids.push(Config.EnvioAddresses.makeId(chain.id, address));
813
+ addrChainIds.push(chain.id);
814
+ addrContractNames.push(contract.name);
854
815
  });
855
- var cache = await restoreEffectCache(true);
816
+ });
817
+ });
818
+ if (ids.length !== 0) {
819
+ await sql.unsafe(`INSERT INTO "` + pgSchema + `"."` + Config.EnvioAddresses.table.tableName + `" ("id", "chain_id", "registration_block", "registration_log_index", "contract_name")
820
+ SELECT id, chain_id, -1, -1, contract_name FROM unnest($1::text[],$2::int[],$3::text[]) AS t(id, chain_id, contract_name);`, [
821
+ ids,
822
+ addrChainIds,
823
+ addrContractNames
824
+ ]);
825
+ }
826
+ let cache = await restoreEffectCache(true);
856
827
  if (onInitialize !== undefined) {
857
828
  await onInitialize();
858
829
  }
859
830
  return {
860
- cleanRun: true,
861
- cache: cache,
862
- chains: chainConfigs.map(function (chainConfig) {
863
- return {
864
- id: chainConfig.id,
865
- startBlock: chainConfig.startBlock,
866
- endBlock: chainConfig.endBlock,
867
- maxReorgDepth: chainConfig.maxReorgDepth,
868
- progressBlockNumber: -1,
869
- numEventsProcessed: 0,
870
- firstEventBlockNumber: undefined,
871
- timestampCaughtUpToHeadOrEndblock: undefined,
872
- dynamicContracts: [],
873
- sourceBlockNumber: 0
874
- };
875
- }),
876
- checkpointId: InternalTable.Checkpoints.initialCheckpointId,
877
- reorgCheckpoints: []
878
- };
831
+ cleanRun: true,
832
+ cache: cache,
833
+ chains: chainConfigs.map(chainConfig => ({
834
+ id: chainConfig.id,
835
+ startBlock: chainConfig.startBlock,
836
+ endBlock: chainConfig.endBlock,
837
+ maxReorgDepth: chainConfig.maxReorgDepth,
838
+ progressBlockNumber: -1,
839
+ numEventsProcessed: 0,
840
+ firstEventBlockNumber: undefined,
841
+ timestampCaughtUpToHeadOrEndblock: undefined,
842
+ indexingAddresses: ChainFetcher.configAddresses(chainConfig),
843
+ sourceBlockNumber: 0
844
+ })),
845
+ checkpointId: InternalTable.Checkpoints.initialCheckpointId,
846
+ reorgCheckpoints: []
847
+ };
879
848
  };
880
- var loadByIdsOrThrow = async function (ids, table, rowsSchema) {
881
- var rows;
849
+ let loadByIdsOrThrow = async (ids, table, rowsSchema) => {
850
+ let rows;
882
851
  try {
883
852
  rows = await (
884
853
  ids.length !== 1 ? sql.unsafe(makeLoadByIdsQuery(pgSchema, table.tableName), [ids], {prepare: true}) : sql.unsafe(makeLoadByIdQuery(pgSchema, table.tableName), ids, {prepare: true})
885
854
  );
886
- }
887
- catch (raw_exn){
888
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
855
+ } catch (raw_exn) {
856
+ let exn = Primitive_exceptions.internalToException(raw_exn);
889
857
  throw {
890
- RE_EXN_ID: Persistence.StorageError,
891
- message: "Failed loading \"" + table.tableName + "\" from storage by ids",
892
- reason: exn,
893
- Error: new Error()
894
- };
858
+ RE_EXN_ID: Persistence.StorageError,
859
+ message: `Failed loading "` + table.tableName + `" from storage by ids`,
860
+ reason: exn,
861
+ Error: new Error()
862
+ };
895
863
  }
896
864
  try {
897
865
  return S$RescriptSchema.parseOrThrow(rows, rowsSchema);
898
- }
899
- catch (raw_exn$1){
900
- var exn$1 = Caml_js_exceptions.internalToOCamlException(raw_exn$1);
866
+ } catch (raw_exn$1) {
867
+ let exn$1 = Primitive_exceptions.internalToException(raw_exn$1);
901
868
  throw {
902
- RE_EXN_ID: Persistence.StorageError,
903
- message: "Failed to parse \"" + table.tableName + "\" loaded from storage by ids",
904
- reason: exn$1,
905
- Error: new Error()
906
- };
869
+ RE_EXN_ID: Persistence.StorageError,
870
+ message: `Failed to parse "` + table.tableName + `" loaded from storage by ids`,
871
+ reason: exn$1,
872
+ Error: new Error()
873
+ };
907
874
  }
908
875
  };
909
- var loadByFieldOrThrow = async function (fieldName, fieldSchema, fieldValue, operator, table, rowsSchema) {
910
- var params;
876
+ let loadByFieldOrThrow = async (fieldName, fieldSchema, fieldValue, operator, table, rowsSchema) => {
877
+ let params;
911
878
  try {
912
879
  params = [S$RescriptSchema.reverseConvertToJsonOrThrow(fieldValue, fieldSchema)];
913
- }
914
- catch (raw_exn){
915
- var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
880
+ } catch (raw_exn) {
881
+ let exn = Primitive_exceptions.internalToException(raw_exn);
916
882
  throw {
917
- RE_EXN_ID: Persistence.StorageError,
918
- message: "Failed loading \"" + table.tableName + "\" from storage by field \"" + fieldName + "\". Couldn't serialize provided value.",
919
- reason: exn,
920
- Error: new Error()
921
- };
883
+ RE_EXN_ID: Persistence.StorageError,
884
+ message: `Failed loading "` + table.tableName + `" from storage by field "` + fieldName + `". Couldn't serialize provided value.`,
885
+ reason: exn,
886
+ Error: new Error()
887
+ };
922
888
  }
923
- var rows;
889
+ let rows;
924
890
  try {
925
891
  rows = await sql.unsafe(makeLoadByFieldQuery(pgSchema, table.tableName, fieldName, operator), params, {prepare: true});
926
- }
927
- catch (raw_exn$1){
928
- var exn$1 = Caml_js_exceptions.internalToOCamlException(raw_exn$1);
892
+ } catch (raw_exn$1) {
893
+ let exn$1 = Primitive_exceptions.internalToException(raw_exn$1);
929
894
  throw {
930
- RE_EXN_ID: Persistence.StorageError,
931
- message: "Failed loading \"" + table.tableName + "\" from storage by field \"" + fieldName + "\"",
932
- reason: exn$1,
933
- Error: new Error()
934
- };
895
+ RE_EXN_ID: Persistence.StorageError,
896
+ message: `Failed loading "` + table.tableName + `" from storage by field "` + fieldName + `"`,
897
+ reason: exn$1,
898
+ Error: new Error()
899
+ };
935
900
  }
936
901
  try {
937
902
  return S$RescriptSchema.parseOrThrow(rows, rowsSchema);
938
- }
939
- catch (raw_exn$2){
940
- var exn$2 = Caml_js_exceptions.internalToOCamlException(raw_exn$2);
903
+ } catch (raw_exn$2) {
904
+ let exn$2 = Primitive_exceptions.internalToException(raw_exn$2);
941
905
  throw {
942
- RE_EXN_ID: Persistence.StorageError,
943
- message: "Failed to parse \"" + table.tableName + "\" loaded from storage by ids",
944
- reason: exn$2,
945
- Error: new Error()
946
- };
906
+ RE_EXN_ID: Persistence.StorageError,
907
+ message: `Failed to parse "` + table.tableName + `" loaded from storage by ids`,
908
+ reason: exn$2,
909
+ Error: new Error()
910
+ };
947
911
  }
948
912
  };
949
- var setOrThrow$1 = function (items, table, itemSchema) {
950
- return setOrThrow(sql, items, table, itemSchema, pgSchema);
951
- };
952
- var setEffectCacheOrThrow = async function (effect, items, initialize) {
953
- var match = effect.storageMeta;
954
- var table = match.table;
913
+ let setOrThrow$1 = (items, table, itemSchema) => setOrThrow(sql, items, table, itemSchema, pgSchema);
914
+ let setEffectCacheOrThrow = async (effect, items, initialize) => {
915
+ let match = effect.storageMeta;
916
+ let table = match.table;
955
917
  if (initialize) {
956
918
  await sql.unsafe(makeCreateTableQuery(table, pgSchema, false));
957
919
  if (onNewTables !== undefined) {
958
920
  await onNewTables([table.tableName]);
959
921
  }
960
-
961
922
  }
962
923
  return await setOrThrow$1(items, table, match.itemSchema);
963
924
  };
964
- var dumpEffectCache = async function () {
925
+ let dumpEffectCache = async () => {
965
926
  try {
966
- var cacheTableInfo = (await sql.unsafe(makeSchemaCacheTableInfoQuery(pgSchema))).filter(function (i) {
967
- return i.count > 0;
968
- });
927
+ let cacheTableInfo = (await sql.unsafe(makeSchemaCacheTableInfoQuery(pgSchema))).filter(i => i.count > 0);
969
928
  if (!Utils.$$Array.notEmpty(cacheTableInfo)) {
970
- return ;
929
+ return;
971
930
  }
972
931
  try {
973
932
  await Fs.promises.access(cacheDirPath);
974
- }
975
- catch (exn){
933
+ } catch (exn) {
976
934
  await Fs.promises.mkdir(cacheDirPath, {
977
- recursive: true
978
- });
935
+ recursive: true
936
+ });
979
937
  }
980
- var psqlExec = await getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort, containerName);
938
+ let psqlExec = await getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort, containerName);
981
939
  if (psqlExec.TAG !== "Ok") {
982
- return Logging.error("Failed to dump cache. " + psqlExec._0);
940
+ return Logging.error(`Failed to dump cache. ` + psqlExec._0);
983
941
  }
984
- var psqlExec$1 = psqlExec._0;
985
- Logging.info("Dumping cache: " + cacheTableInfo.map(function (param) {
986
- return param.table_name + " (" + String(param.count) + " rows)";
987
- }).join(", "));
988
- var promises = cacheTableInfo.map(async function (param) {
989
- var tableName = param.table_name;
990
- var cacheName = tableName.slice(cacheTablePrefixLength);
991
- var outputFile = Path.join(cacheDirPath, cacheName + ".tsv");
992
- var command = psqlExec$1 + " -c 'COPY \"" + pgSchema + "\".\"" + tableName + "\" TO STDOUT WITH (FORMAT text, HEADER);' > " + outputFile;
993
- return new Promise((function (resolve, reject) {
994
- Child_process.exec(command, psqlExecOptions, (function (error, stdout, param) {
995
- if (error === null) {
996
- return resolve(stdout);
997
- } else {
998
- return reject(error);
999
- }
1000
- }));
1001
- }));
942
+ let psqlExec$1 = psqlExec._0;
943
+ Logging.info(`Dumping cache: ` + cacheTableInfo.map(param => param.table_name + " (" + String(param.count) + " rows)").join(", "));
944
+ let promises = cacheTableInfo.map(async param => {
945
+ let tableName = param.table_name;
946
+ let cacheName = tableName.slice(cacheTablePrefixLength);
947
+ let outputFile = Path.join(cacheDirPath, cacheName + ".tsv");
948
+ let command = psqlExec$1 + ` -c 'COPY "` + pgSchema + `"."` + tableName + `" TO STDOUT WITH (FORMAT text, HEADER);' > ` + outputFile;
949
+ return new Promise((resolve, reject) => {
950
+ Child_process.exec(command, psqlExecOptions, (error, stdout, param) => {
951
+ if (error === null) {
952
+ return resolve(stdout);
953
+ } else {
954
+ return reject(error);
955
+ }
1002
956
  });
957
+ });
958
+ });
1003
959
  await Promise.all(promises);
1004
- return Logging.info("Successfully dumped cache to " + cacheDirPath);
1005
- }
1006
- catch (raw_exn){
1007
- var exn$1 = Caml_js_exceptions.internalToOCamlException(raw_exn);
1008
- return Logging.errorWithExn(Utils.prettifyExn(exn$1), "Failed to dump cache.");
960
+ return Logging.info(`Successfully dumped cache to ` + cacheDirPath);
961
+ } catch (raw_exn) {
962
+ let exn$1 = Primitive_exceptions.internalToException(raw_exn);
963
+ return Logging.errorWithExn(Utils.prettifyExn(exn$1), `Failed to dump cache.`);
1009
964
  }
1010
965
  };
1011
- var resumeInitialState = async function () {
1012
- var match = await Promise.all([
1013
- restoreEffectCache(false),
1014
- InternalTable.Chains.getInitialState(sql, pgSchema).then(function (rawInitialStates) {
1015
- return Belt_Array.map(rawInitialStates, (function (rawInitialState) {
1016
- return {
1017
- id: rawInitialState.id,
1018
- startBlock: rawInitialState.startBlock,
1019
- endBlock: Caml_option.null_to_opt(rawInitialState.endBlock),
1020
- maxReorgDepth: rawInitialState.maxReorgDepth,
1021
- progressBlockNumber: rawInitialState.progressBlockNumber,
1022
- numEventsProcessed: rawInitialState.numEventsProcessed,
1023
- firstEventBlockNumber: Caml_option.null_to_opt(rawInitialState.firstEventBlockNumber),
1024
- timestampCaughtUpToHeadOrEndblock: Caml_option.null_to_opt(rawInitialState.timestampCaughtUpToHeadOrEndblock),
1025
- dynamicContracts: rawInitialState.dynamicContracts,
1026
- sourceBlockNumber: rawInitialState.sourceBlockNumber
1027
- };
1028
- }));
1029
- }),
1030
- sql.unsafe(InternalTable.Checkpoints.makeCommitedCheckpointIdQuery(pgSchema)),
1031
- sql.unsafe(InternalTable.Checkpoints.makeGetReorgCheckpointsQuery(pgSchema))
1032
- ]);
1033
- var checkpointId = BigInt(match[2][0].id);
1034
- var reorgCheckpoints = Belt_Array.map(match[3], (function (raw) {
1035
- return {
1036
- id: BigInt(raw.id),
1037
- chain_id: raw.chain_id,
1038
- block_number: raw.block_number,
1039
- block_hash: raw.block_hash
1040
- };
1041
- }));
966
+ let resumeInitialState = async () => {
967
+ let match = await Promise.all([
968
+ restoreEffectCache(false),
969
+ InternalTable.Chains.getInitialState(sql, pgSchema).then(rawInitialStates => Belt_Array.map(rawInitialStates, rawInitialState => ({
970
+ id: rawInitialState.id,
971
+ startBlock: rawInitialState.startBlock,
972
+ endBlock: Primitive_option.fromNull(rawInitialState.endBlock),
973
+ maxReorgDepth: rawInitialState.maxReorgDepth,
974
+ progressBlockNumber: rawInitialState.progressBlockNumber,
975
+ numEventsProcessed: rawInitialState.numEventsProcessed,
976
+ firstEventBlockNumber: Primitive_option.fromNull(rawInitialState.firstEventBlockNumber),
977
+ timestampCaughtUpToHeadOrEndblock: Primitive_option.fromNull(rawInitialState.timestampCaughtUpToHeadOrEndblock),
978
+ indexingAddresses: rawInitialState.indexingAddresses,
979
+ sourceBlockNumber: rawInitialState.sourceBlockNumber
980
+ }))),
981
+ sql.unsafe(InternalTable.Checkpoints.makeCommitedCheckpointIdQuery(pgSchema)),
982
+ sql.unsafe(InternalTable.Checkpoints.makeGetReorgCheckpointsQuery(pgSchema))
983
+ ]);
984
+ let checkpointId = BigInt(match[2][0].id);
985
+ let reorgCheckpoints = Belt_Array.map(match[3], raw => ({
986
+ id: BigInt(raw.id),
987
+ chain_id: raw.chain_id,
988
+ block_number: raw.block_number,
989
+ block_hash: raw.block_hash
990
+ }));
1042
991
  if (sink !== undefined) {
1043
992
  await sink.resume(checkpointId);
1044
993
  }
1045
994
  return {
1046
- cleanRun: false,
1047
- cache: match[0],
1048
- chains: match[1],
1049
- checkpointId: checkpointId,
1050
- reorgCheckpoints: reorgCheckpoints
1051
- };
995
+ cleanRun: false,
996
+ cache: match[0],
997
+ chains: match[1],
998
+ checkpointId: checkpointId,
999
+ reorgCheckpoints: reorgCheckpoints
1000
+ };
1052
1001
  };
1053
- var reset = async function () {
1054
- var query = "DROP SCHEMA IF EXISTS \"" + pgSchema + "\" CASCADE;";
1002
+ let reset = async () => {
1003
+ let query = `DROP SCHEMA IF EXISTS "` + pgSchema + `" CASCADE;`;
1055
1004
  return await sql.unsafe(query);
1056
1005
  };
1057
- var setChainMeta = function (chainsData) {
1058
- return InternalTable.Chains.setMeta(sql, pgSchema, chainsData).then(function (param) {
1059
- return undefined;
1060
- });
1061
- };
1062
- var pruneStaleCheckpoints = function (safeCheckpointId) {
1063
- return InternalTable.Checkpoints.pruneStaleCheckpoints(sql, pgSchema, safeCheckpointId);
1064
- };
1065
- var pruneStaleEntityHistory = function (entityName, entityIndex, safeCheckpointId) {
1066
- return EntityHistory.pruneStaleEntityHistory(sql, entityName, entityIndex, pgSchema, safeCheckpointId);
1067
- };
1068
- var getRollbackTargetCheckpoint = function (reorgChainId, lastKnownValidBlockNumber) {
1069
- return InternalTable.Checkpoints.getRollbackTargetCheckpoint(sql, pgSchema, reorgChainId, lastKnownValidBlockNumber);
1070
- };
1071
- var getRollbackProgressDiff = function (rollbackTargetCheckpointId) {
1072
- return InternalTable.Checkpoints.getRollbackProgressDiff(sql, pgSchema, rollbackTargetCheckpointId);
1073
- };
1074
- var getRollbackData = async function (entityConfig, rollbackTargetCheckpointId) {
1075
- return await Promise.all([
1076
- sql.unsafe(makeGetRollbackRemovedIdsQuery(entityConfig, pgSchema), [rollbackTargetCheckpointId.toString()], {prepare: true}),
1077
- sql.unsafe(makeGetRollbackRestoredEntitiesQuery(entityConfig, pgSchema), [rollbackTargetCheckpointId.toString()], {prepare: true})
1078
- ]);
1079
- };
1080
- var writeBatchMethod = async function (batch, rawEvents, rollbackTargetCheckpointId, isInReorgThreshold, config, allEntities, updatedEffectsCache, updatedEntities) {
1081
- var sinkPromise;
1006
+ let setChainMeta = chainsData => InternalTable.Chains.setMeta(sql, pgSchema, chainsData).then(param => (undefined));
1007
+ let pruneStaleCheckpoints = safeCheckpointId => InternalTable.Checkpoints.pruneStaleCheckpoints(sql, pgSchema, safeCheckpointId);
1008
+ let pruneStaleEntityHistory = (entityName, entityIndex, safeCheckpointId) => EntityHistory.pruneStaleEntityHistory(sql, entityName, entityIndex, pgSchema, safeCheckpointId);
1009
+ let getRollbackTargetCheckpoint = (reorgChainId, lastKnownValidBlockNumber) => InternalTable.Checkpoints.getRollbackTargetCheckpoint(sql, pgSchema, reorgChainId, lastKnownValidBlockNumber);
1010
+ let getRollbackProgressDiff = rollbackTargetCheckpointId => InternalTable.Checkpoints.getRollbackProgressDiff(sql, pgSchema, rollbackTargetCheckpointId);
1011
+ let getRollbackData = async (entityConfig, rollbackTargetCheckpointId) => await Promise.all([
1012
+ sql.unsafe(makeGetRollbackRemovedIdsQuery(entityConfig, pgSchema), [rollbackTargetCheckpointId.toString()], {prepare: true}),
1013
+ sql.unsafe(makeGetRollbackRestoredEntitiesQuery(entityConfig, pgSchema), [rollbackTargetCheckpointId.toString()], {prepare: true})
1014
+ ]);
1015
+ let writeBatchMethod = async (batch, rawEvents, rollbackTargetCheckpointId, isInReorgThreshold, config, allEntities, updatedEffectsCache, updatedEntities) => {
1016
+ let sinkPromise;
1082
1017
  if (sink !== undefined) {
1083
- var timerRef = Hrtime.makeTimer();
1084
- sinkPromise = Caml_option.some(sink.writeBatch(batch, updatedEntities).then(function () {
1085
- Prometheus.SinkWrite.increment(sink.name, Hrtime.toSecondsFloat(Hrtime.timeSince(timerRef)));
1086
- }).catch(function (exn) {
1087
- return exn;
1088
- }));
1018
+ let timerRef = Hrtime.makeTimer();
1019
+ sinkPromise = sink.writeBatch(batch, updatedEntities).then(() => {
1020
+ Prometheus.StorageWrite.increment(sink.name, Hrtime.toSecondsFloat(Hrtime.timeSince(timerRef)));
1021
+ }).catch(exn => exn);
1089
1022
  } else {
1090
1023
  sinkPromise = undefined;
1091
1024
  }
1092
- return await writeBatch(sql, batch, rawEvents, pgSchema, rollbackTargetCheckpointId, isInReorgThreshold, config, allEntities, setEffectCacheOrThrow, updatedEffectsCache, updatedEntities, sinkPromise, undefined);
1025
+ let primaryTimerRef = Hrtime.makeTimer();
1026
+ await writeBatch(sql, batch, rawEvents, pgSchema, rollbackTargetCheckpointId, isInReorgThreshold, config, allEntities, setEffectCacheOrThrow, updatedEffectsCache, updatedEntities, sinkPromise, undefined);
1027
+ return Prometheus.StorageWrite.increment("postgres", Hrtime.toSecondsFloat(Hrtime.timeSince(primaryTimerRef)));
1093
1028
  };
1029
+ let close = () => sql.end();
1094
1030
  return {
1095
- isInitialized: isInitialized,
1096
- initialize: initialize,
1097
- resumeInitialState: resumeInitialState,
1098
- loadByIdsOrThrow: loadByIdsOrThrow,
1099
- loadByFieldOrThrow: loadByFieldOrThrow,
1100
- dumpEffectCache: dumpEffectCache,
1101
- reset: reset,
1102
- setChainMeta: setChainMeta,
1103
- pruneStaleCheckpoints: pruneStaleCheckpoints,
1104
- pruneStaleEntityHistory: pruneStaleEntityHistory,
1105
- getRollbackTargetCheckpoint: getRollbackTargetCheckpoint,
1106
- getRollbackProgressDiff: getRollbackProgressDiff,
1107
- getRollbackData: getRollbackData,
1108
- writeBatch: writeBatchMethod
1109
- };
1031
+ name: "postgres",
1032
+ isInitialized: isInitialized,
1033
+ initialize: initialize,
1034
+ resumeInitialState: resumeInitialState,
1035
+ loadByIdsOrThrow: loadByIdsOrThrow,
1036
+ loadByFieldOrThrow: loadByFieldOrThrow,
1037
+ dumpEffectCache: dumpEffectCache,
1038
+ reset: reset,
1039
+ setChainMeta: setChainMeta,
1040
+ pruneStaleCheckpoints: pruneStaleCheckpoints,
1041
+ pruneStaleEntityHistory: pruneStaleEntityHistory,
1042
+ getRollbackTargetCheckpoint: getRollbackTargetCheckpoint,
1043
+ getRollbackProgressDiff: getRollbackProgressDiff,
1044
+ getRollbackData: getRollbackData,
1045
+ writeBatch: writeBatchMethod,
1046
+ close: close
1047
+ };
1048
+ }
1049
+
1050
+ function makeStorageFromEnv(config, sqlOpt, pgSchemaOpt, isHasuraEnabledOpt) {
1051
+ let sql = sqlOpt !== undefined ? Primitive_option.valFromOption(sqlOpt) : makeClient();
1052
+ let pgSchema = pgSchemaOpt !== undefined ? pgSchemaOpt : Env.Db.publicSchema;
1053
+ let isHasuraEnabled = isHasuraEnabledOpt !== undefined ? isHasuraEnabledOpt : Env.Hasura.enabled;
1054
+ let tmp;
1055
+ if (config.storage.clickhouse) {
1056
+ let host = Env.ClickHouse.host();
1057
+ let username = Env.ClickHouse.username();
1058
+ let password = Env.ClickHouse.password();
1059
+ let missing = [];
1060
+ let checkEnv = (opt, name) => {
1061
+ if (opt !== undefined) {
1062
+ return;
1063
+ } else {
1064
+ missing.push(name);
1065
+ return;
1066
+ }
1067
+ };
1068
+ checkEnv(host, "ENVIO_CLICKHOUSE_HOST");
1069
+ checkEnv(username, "ENVIO_CLICKHOUSE_USERNAME");
1070
+ checkEnv(password, "ENVIO_CLICKHOUSE_PASSWORD");
1071
+ if (missing.length !== 0) {
1072
+ Stdlib_JsError.throwWithMessage(`ClickHouse storage is enabled but required env vars are not set: ` + missing.join(", ") + `. Please set them, disable clickhouse in the \`storage\` config, or run \`envio dev\` for a pre-configured local ClickHouse.`);
1073
+ }
1074
+ tmp = Sink.makeClickHouse(host, Env.ClickHouse.database(), username, password);
1075
+ } else {
1076
+ tmp = undefined;
1077
+ }
1078
+ return make(sql, Env.Db.host, pgSchema, Env.Db.port, Env.Db.user, Env.Db.database, Env.Db.password, isHasuraEnabled, tmp, isHasuraEnabled ? () => Stdlib_Promise.$$catch(Hasura.trackDatabase(Env.Hasura.graphqlEndpoint, {
1079
+ role: Env.Hasura.role,
1080
+ secret: Env.Hasura.secret
1081
+ }, pgSchema, config.userEntities, Env.Hasura.aggregateEntities, Env.Hasura.responseLimit, Schema.make(Belt_Array.map(config.allEntities, e => e.table))), err => Promise.resolve(Logging.errorWithExn(Utils.prettifyExn(err), `Error tracking tables`))) : undefined, isHasuraEnabled ? tableNames => Stdlib_Promise.$$catch(Hasura.trackTables(Env.Hasura.graphqlEndpoint, {
1082
+ role: Env.Hasura.role,
1083
+ secret: Env.Hasura.secret
1084
+ }, pgSchema, tableNames), err => Promise.resolve(Logging.errorWithExn(Utils.prettifyExn(err), `Error tracking new tables`))) : undefined);
1085
+ }
1086
+
1087
+ function makePersistenceFromConfig(config, storageOpt) {
1088
+ let storage = storageOpt !== undefined ? storageOpt : makeStorageFromEnv(config, undefined, undefined, undefined);
1089
+ return Persistence.make(config.userEntities, config.allEnums, storage);
1110
1090
  }
1111
1091
 
1112
- var maxItemsPerQuery = 500;
1092
+ let maxItemsPerQuery = 500;
1113
1093
 
1114
1094
  export {
1115
- getCacheRowCountFnName ,
1116
- makeClient ,
1117
- makeCreateIndexQuery ,
1118
- directionToSql ,
1119
- directionToIndexName ,
1120
- makeCreateCompositeIndexQuery ,
1121
- makeCreateTableIndicesQuery ,
1122
- makeCreateTableQuery ,
1123
- entityHistoryCache ,
1124
- getEntityHistory ,
1125
- makeInitializeTransaction ,
1126
- makeLoadByIdQuery ,
1127
- makeLoadByFieldQuery ,
1128
- makeLoadByIdsQuery ,
1129
- makeDeleteByIdQuery ,
1130
- makeDeleteByIdsQuery ,
1131
- makeLoadAllQuery ,
1132
- makeInsertUnnestSetQuery ,
1133
- makeInsertValuesSetQuery ,
1134
- maxItemsPerQuery ,
1135
- makeTableBatchSetQuery ,
1136
- chunkArray ,
1137
- removeInvalidUtf8InPlace ,
1138
- pgErrorMessageSchema ,
1139
- PgEncodingError ,
1140
- setQueryCache ,
1141
- setOrThrow ,
1142
- makeSchemaTableNamesQuery ,
1143
- cacheTablePrefixLength ,
1144
- makeSchemaCacheTableInfoQuery ,
1145
- getConnectedPsqlExec ,
1146
- deleteByIdsOrThrow ,
1147
- makeInsertDeleteUpdatesQuery ,
1148
- executeSet ,
1149
- writeBatch ,
1150
- makeGetRollbackRestoredEntitiesQuery ,
1151
- makeGetRollbackRemovedIdsQuery ,
1152
- make ,
1095
+ getCacheRowCountFnName,
1096
+ makeClient,
1097
+ makeCreateIndexQuery,
1098
+ directionToSql,
1099
+ directionToIndexName,
1100
+ makeCreateCompositeIndexQuery,
1101
+ makeCreateTableIndicesQuery,
1102
+ makeCreateTableQuery,
1103
+ entityHistoryCache,
1104
+ getEntityHistory,
1105
+ makeInitializeTransaction,
1106
+ makeLoadByIdQuery,
1107
+ makeLoadByFieldQuery,
1108
+ makeLoadByIdsQuery,
1109
+ makeDeleteByIdQuery,
1110
+ makeDeleteByIdsQuery,
1111
+ makeLoadAllQuery,
1112
+ makeInsertUnnestSetQuery,
1113
+ makeInsertValuesSetQuery,
1114
+ maxItemsPerQuery,
1115
+ makeTableBatchSetQuery,
1116
+ chunkArray,
1117
+ removeInvalidUtf8InPlace,
1118
+ pgErrorMessageSchema,
1119
+ PgEncodingError,
1120
+ setQueryCache,
1121
+ setOrThrow,
1122
+ makeSchemaTableNamesQuery,
1123
+ cacheTablePrefixLength,
1124
+ makeSchemaCacheTableInfoQuery,
1125
+ getConnectedPsqlExec,
1126
+ deleteByIdsOrThrow,
1127
+ makeInsertDeleteUpdatesQuery,
1128
+ executeSet,
1129
+ writeBatch,
1130
+ makeGetRollbackRestoredEntitiesQuery,
1131
+ makeGetRollbackRemovedIdsQuery,
1132
+ make,
1133
+ makeStorageFromEnv,
1134
+ makePersistenceFromConfig,
1153
1135
  }
1154
1136
  /* entityHistoryCache Not a pure module */