envio 2.27.5 → 2.28.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,6 +16,7 @@ var Belt_Array = require("rescript/lib/js/belt_Array.js");
16
16
  var Belt_Option = require("rescript/lib/js/belt_Option.js");
17
17
  var Caml_option = require("rescript/lib/js/caml_option.js");
18
18
  var Persistence = require("./Persistence.res.js");
19
+ var InternalTable = require("./db/InternalTable.res.js");
19
20
  var Child_process = require("child_process");
20
21
  var Caml_exceptions = require("rescript/lib/js/caml_exceptions.js");
21
22
  var S$RescriptSchema = require("rescript-schema/src/S.res.js");
@@ -68,11 +69,18 @@ function makeCreateTableQuery(table, pgSchema) {
68
69
  ) + ");";
69
70
  }
70
71
 
71
- function makeInitializeTransaction(pgSchema, pgUser, generalTablesOpt, entitiesOpt, enumsOpt, isEmptyPgSchemaOpt) {
72
- var generalTables = generalTablesOpt !== undefined ? generalTablesOpt : [];
72
+ function makeInitializeTransaction(pgSchema, pgUser, chainConfigsOpt, entitiesOpt, enumsOpt, isEmptyPgSchemaOpt) {
73
+ var chainConfigs = chainConfigsOpt !== undefined ? chainConfigsOpt : [];
73
74
  var entities = entitiesOpt !== undefined ? entitiesOpt : [];
74
75
  var enums = enumsOpt !== undefined ? enumsOpt : [];
75
76
  var isEmptyPgSchema = isEmptyPgSchemaOpt !== undefined ? isEmptyPgSchemaOpt : false;
77
+ var generalTables = [
78
+ InternalTable.EventSyncState.table,
79
+ InternalTable.Chains.table,
80
+ InternalTable.PersistedState.table,
81
+ InternalTable.EndOfBlockRangeScannedData.table,
82
+ InternalTable.RawEvents.table
83
+ ];
76
84
  var allTables = $$Array.copy(generalTables);
77
85
  var allEntityTables = [];
78
86
  entities.forEach(function (entity) {
@@ -107,12 +115,16 @@ function makeInitializeTransaction(pgSchema, pgUser, generalTablesOpt, entitiesO
107
115
  contents: ""
108
116
  };
109
117
  entities.forEach(function (entity) {
110
- functionsQuery.contents = functionsQuery.contents + "\n" + entity.entityHistory.createInsertFnQuery;
118
+ functionsQuery.contents = functionsQuery.contents + "\n" + entity.entityHistory.makeInsertFnQuery(pgSchema);
111
119
  Table.getDerivedFromFields(entity.table).forEach(function (derivedFromField) {
112
120
  var indexField = Utils.unwrapResultExn(Schema.getDerivedFromFieldName(derivedSchema, derivedFromField));
113
121
  query.contents = query.contents + "\n" + makeCreateIndexQuery(derivedFromField.derivedFromEntity, [indexField], pgSchema);
114
122
  });
115
123
  });
124
+ var initialChainsValuesQuery = InternalTable.Chains.makeInitialValuesQuery(pgSchema, chainConfigs);
125
+ if (initialChainsValuesQuery !== undefined) {
126
+ query.contents = query.contents + "\n" + initialChainsValuesQuery;
127
+ }
116
128
  functionsQuery.contents = functionsQuery.contents + "\n" + ("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;");
117
129
  return [query.contents].concat(functionsQuery.contents !== "" ? [functionsQuery.contents] : []);
118
130
  }
@@ -129,6 +141,10 @@ function makeLoadByIdsQuery(pgSchema, tableName) {
129
141
  return "SELECT * FROM \"" + pgSchema + "\".\"" + tableName + "\" WHERE id = ANY($1::text[]);";
130
142
  }
131
143
 
144
+ function makeLoadAllQuery(pgSchema, tableName) {
145
+ return "SELECT * FROM \"" + pgSchema + "\".\"" + tableName + "\";";
146
+ }
147
+
132
148
  function makeInsertUnnestSetQuery(pgSchema, table, itemSchema, isRawEvents) {
133
149
  var match = Table.toSqlParams(table, itemSchema, pgSchema);
134
150
  var quotedNonPrimaryFieldNames = match.quotedNonPrimaryFieldNames;
@@ -177,13 +193,9 @@ function makeInsertValuesSetQuery(pgSchema, table, itemSchema, itemsCount) {
177
193
  ) + ";";
178
194
  }
179
195
 
180
- var rawEventsTableName = "raw_events";
181
-
182
- var eventSyncStateTableName = "event_sync_state";
183
-
184
196
  function makeTableBatchSetQuery(pgSchema, table, itemSchema) {
185
197
  var match = Table.toSqlParams(table, itemSchema, pgSchema);
186
- var isRawEvents = table.tableName === rawEventsTableName;
198
+ var isRawEvents = table.tableName === InternalTable.RawEvents.table.tableName;
187
199
  if (isRawEvents || !match.hasArrayField) {
188
200
  return {
189
201
  query: makeInsertUnnestSetQuery(pgSchema, table, itemSchema, isRawEvents),
@@ -277,7 +289,7 @@ async function setOrThrow(sql, items, table, itemSchema, pgSchema) {
277
289
  throw {
278
290
  RE_EXN_ID: Persistence.StorageError,
279
291
  message: "Failed to insert items into table \"" + table.tableName + "\"",
280
- reason: Internal.prettifyExn(exn),
292
+ reason: Utils.prettifyExn(exn),
281
293
  Error: new Error()
282
294
  };
283
295
  }
@@ -285,13 +297,24 @@ async function setOrThrow(sql, items, table, itemSchema, pgSchema) {
285
297
 
286
298
  function setEntityHistoryOrThrow(sql, entityHistory, rows, shouldCopyCurrentEntity, shouldRemoveInvalidUtf8Opt) {
287
299
  var shouldRemoveInvalidUtf8 = shouldRemoveInvalidUtf8Opt !== undefined ? shouldRemoveInvalidUtf8Opt : false;
288
- return Promise.all(Belt_Array.map(rows, (function (historyRow) {
289
- var row = S$RescriptSchema.reverseConvertToJsonOrThrow(historyRow, entityHistory.schema);
290
- if (shouldRemoveInvalidUtf8) {
291
- removeInvalidUtf8InPlace([row]);
292
- }
293
- return entityHistory.insertFn(sql, row, shouldCopyCurrentEntity !== undefined ? shouldCopyCurrentEntity : !Belt_Option.getWithDefault(historyRow.containsRollbackDiffChange, false));
294
- })));
300
+ return Belt_Array.map(rows, (function (historyRow) {
301
+ var row = S$RescriptSchema.reverseConvertToJsonOrThrow(historyRow, entityHistory.schema);
302
+ if (shouldRemoveInvalidUtf8) {
303
+ removeInvalidUtf8InPlace([row]);
304
+ }
305
+ return $$Promise.$$catch(entityHistory.insertFn(sql, row, shouldCopyCurrentEntity !== undefined ? shouldCopyCurrentEntity : !Belt_Option.getWithDefault(historyRow.containsRollbackDiffChange, false)), (function (exn) {
306
+ var reason = Utils.prettifyExn(exn);
307
+ var detail = (reason?.detail || "");
308
+ throw {
309
+ RE_EXN_ID: Persistence.StorageError,
310
+ message: "Failed to insert history item into table \"" + entityHistory.table.tableName + "\"." + (
311
+ detail !== "" ? " Details: " + detail : ""
312
+ ),
313
+ reason: reason,
314
+ Error: new Error()
315
+ };
316
+ }));
317
+ }));
295
318
  }
296
319
 
297
320
  function makeSchemaTableNamesQuery(pgSchema) {
@@ -370,29 +393,112 @@ function make(sql, pgHost, pgSchema, pgPort, pgUser, pgDatabase, pgPassword, onI
370
393
  };
371
394
  var cacheDirPath = Path.resolve("..", ".envio", "cache");
372
395
  var isInitialized = async function () {
373
- var envioTables = await sql.unsafe("SELECT table_schema FROM information_schema.tables WHERE table_schema = '" + pgSchema + "' AND table_name = '" + eventSyncStateTableName + "';");
396
+ var envioTables = await sql.unsafe("SELECT table_schema FROM information_schema.tables WHERE table_schema = '" + pgSchema + "' AND table_name = '" + InternalTable.EventSyncState.table.tableName + "' OR table_name = '" + InternalTable.Chains.table.tableName + "';");
374
397
  return Utils.$$Array.notEmpty(envioTables);
375
398
  };
376
- var initialize = async function (entitiesOpt, generalTablesOpt, enumsOpt) {
399
+ var restoreEffectCache = async function (withUpload) {
400
+ if (withUpload) {
401
+ var nothingToUploadErrorMessage = "Nothing to upload.";
402
+ var match = await Promise.all([
403
+ $$Promise.$$catch(Fs.promises.readdir(cacheDirPath).then(function (e) {
404
+ return {
405
+ TAG: "Ok",
406
+ _0: e
407
+ };
408
+ }), (function (param) {
409
+ return Promise.resolve({
410
+ TAG: "Error",
411
+ _0: nothingToUploadErrorMessage
412
+ });
413
+ })),
414
+ getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort)
415
+ ]);
416
+ var exit = 0;
417
+ var message;
418
+ var entries = match[0];
419
+ if (entries.TAG === "Ok") {
420
+ var psqlExec = match[1];
421
+ if (psqlExec.TAG === "Ok") {
422
+ var psqlExec$1 = psqlExec._0;
423
+ var cacheFiles = entries._0.filter(function (entry) {
424
+ return entry.endsWith(".tsv");
425
+ });
426
+ await Promise.all(cacheFiles.map(function (entry) {
427
+ var effectName = entry.slice(0, -4);
428
+ var table = Internal.makeCacheTable(effectName);
429
+ return sql.unsafe(makeCreateTableQuery(table, pgSchema)).then(function () {
430
+ var inputFile = Path.join(cacheDirPath, entry);
431
+ var command = psqlExec$1 + " -c 'COPY \"" + pgSchema + "\".\"" + table.tableName + "\" FROM STDIN WITH (FORMAT text, HEADER);' < " + inputFile;
432
+ return new Promise((function (resolve, reject) {
433
+ Child_process.exec(command, psqlExecOptions, (function (error, stdout, param) {
434
+ if (error === null) {
435
+ return resolve(stdout);
436
+ } else {
437
+ return reject(error);
438
+ }
439
+ }));
440
+ }));
441
+ });
442
+ }));
443
+ Logging.info("Successfully uploaded cache.");
444
+ } else {
445
+ message = match[1]._0;
446
+ exit = 1;
447
+ }
448
+ } else {
449
+ message = entries._0;
450
+ exit = 1;
451
+ }
452
+ if (exit === 1) {
453
+ if (message === nothingToUploadErrorMessage) {
454
+ Logging.info("No cache found to upload.");
455
+ } else {
456
+ Logging.error("Failed to upload cache, continuing without it. " + message);
457
+ }
458
+ }
459
+
460
+ }
461
+ var cacheTableInfo = await sql.unsafe(makeSchemaCacheTableInfoQuery(pgSchema));
462
+ if (withUpload && Utils.$$Array.notEmpty(cacheTableInfo) && onNewTables !== undefined) {
463
+ await onNewTables(cacheTableInfo.map(function (info) {
464
+ return info.table_name;
465
+ }));
466
+ }
467
+ var cache = {};
468
+ cacheTableInfo.forEach(function (param) {
469
+ var effectName = param.table_name.slice(cacheTablePrefixLength);
470
+ cache[effectName] = {
471
+ effectName: effectName,
472
+ count: param.count
473
+ };
474
+ });
475
+ return cache;
476
+ };
477
+ var initialize = async function (chainConfigsOpt, entitiesOpt, enumsOpt) {
478
+ var chainConfigs = chainConfigsOpt !== undefined ? chainConfigsOpt : [];
377
479
  var entities = entitiesOpt !== undefined ? entitiesOpt : [];
378
- var generalTables = generalTablesOpt !== undefined ? generalTablesOpt : [];
379
480
  var enums = enumsOpt !== undefined ? enumsOpt : [];
380
481
  var schemaTableNames = await sql.unsafe(makeSchemaTableNamesQuery(pgSchema));
381
482
  if (Utils.$$Array.notEmpty(schemaTableNames) && !schemaTableNames.some(function (table) {
382
- return table.table_name === eventSyncStateTableName;
483
+ return table.table_name === InternalTable.EventSyncState.table.tableName;
383
484
  })) {
384
485
  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_PUBLIC_SCHEMA\" environment variable\n3. Or manually drop the schema in your database if you're certain the data is not needed.");
385
486
  }
386
- var queries = makeInitializeTransaction(pgSchema, pgUser, generalTables, entities, enums, Utils.$$Array.isEmpty(schemaTableNames));
487
+ var queries = makeInitializeTransaction(pgSchema, pgUser, chainConfigs, entities, enums, Utils.$$Array.isEmpty(schemaTableNames));
387
488
  await sql.begin(function (sql) {
388
489
  return queries.map(function (query) {
389
490
  return sql.unsafe(query);
390
491
  });
391
492
  });
493
+ var cache = await restoreEffectCache(true);
392
494
  if (onInitialize !== undefined) {
393
- return await onInitialize();
495
+ await onInitialize();
394
496
  }
395
-
497
+ return {
498
+ cleanRun: true,
499
+ cache: cache,
500
+ chains: chainConfigs.map(InternalTable.Chains.initialFromConfig)
501
+ };
396
502
  };
397
503
  var loadByIdsOrThrow = async function (ids, table, rowsSchema) {
398
504
  var rows;
@@ -523,93 +629,29 @@ function make(sql, pgHost, pgSchema, pgPort, pgUser, pgDatabase, pgPassword, onI
523
629
  }
524
630
  catch (raw_exn){
525
631
  var exn$1 = Caml_js_exceptions.internalToOCamlException(raw_exn);
526
- return Logging.errorWithExn(Internal.prettifyExn(exn$1), "Failed to dump cache.");
632
+ return Logging.errorWithExn(Utils.prettifyExn(exn$1), "Failed to dump cache.");
527
633
  }
528
634
  };
529
- var restoreEffectCache = async function (withUpload) {
530
- if (withUpload) {
531
- var nothingToUploadErrorMessage = "Nothing to upload.";
532
- var match = await Promise.all([
533
- $$Promise.$$catch(Fs.promises.readdir(cacheDirPath).then(function (e) {
534
- return {
535
- TAG: "Ok",
536
- _0: e
537
- };
538
- }), (function (param) {
539
- return Promise.resolve({
540
- TAG: "Error",
541
- _0: nothingToUploadErrorMessage
542
- });
543
- })),
544
- getConnectedPsqlExec(pgUser, pgHost, pgDatabase, pgPort)
545
- ]);
546
- var exit = 0;
547
- var message;
548
- var entries = match[0];
549
- if (entries.TAG === "Ok") {
550
- var psqlExec = match[1];
551
- if (psqlExec.TAG === "Ok") {
552
- var psqlExec$1 = psqlExec._0;
553
- var cacheFiles = entries._0.filter(function (entry) {
554
- return entry.endsWith(".tsv");
555
- });
556
- await Promise.all(cacheFiles.map(function (entry) {
557
- var effectName = entry.slice(0, -4);
558
- var table = Internal.makeCacheTable(effectName);
559
- return sql.unsafe(makeCreateTableQuery(table, pgSchema)).then(function () {
560
- var inputFile = Path.join(cacheDirPath, entry);
561
- var command = psqlExec$1 + " -c 'COPY \"" + pgSchema + "\".\"" + table.tableName + "\" FROM STDIN WITH (FORMAT text, HEADER);' < " + inputFile;
562
- return new Promise((function (resolve, reject) {
563
- Child_process.exec(command, psqlExecOptions, (function (error, stdout, param) {
564
- if (error === null) {
565
- return resolve(stdout);
566
- } else {
567
- return reject(error);
568
- }
569
- }));
570
- }));
571
- });
572
- }));
573
- Logging.info("Successfully uploaded cache.");
574
- } else {
575
- message = match[1]._0;
576
- exit = 1;
577
- }
578
- } else {
579
- message = entries._0;
580
- exit = 1;
581
- }
582
- if (exit === 1) {
583
- if (message === nothingToUploadErrorMessage) {
584
- Logging.info("No cache found to upload.");
585
- } else {
586
- Logging.error("Failed to upload cache, continuing without it. " + message);
587
- }
588
- }
589
-
590
- }
591
- var cacheTableInfo = await sql.unsafe(makeSchemaCacheTableInfoQuery(pgSchema));
592
- if (withUpload && Utils.$$Array.notEmpty(cacheTableInfo) && onNewTables !== undefined) {
593
- await onNewTables(cacheTableInfo.map(function (info) {
594
- return info.table_name;
595
- }));
596
- }
597
- return cacheTableInfo.map(function (info) {
598
- return {
599
- effectName: info.table_name.slice(cacheTablePrefixLength),
600
- count: info.count
601
- };
602
- });
635
+ var loadInitialState = async function () {
636
+ var match = await Promise.all([
637
+ restoreEffectCache(false),
638
+ sql.unsafe(makeLoadAllQuery(pgSchema, InternalTable.Chains.table.tableName))
639
+ ]);
640
+ return {
641
+ cleanRun: false,
642
+ cache: match[0],
643
+ chains: match[1]
644
+ };
603
645
  };
604
646
  return {
605
647
  isInitialized: isInitialized,
606
648
  initialize: initialize,
649
+ loadInitialState: loadInitialState,
607
650
  loadByIdsOrThrow: loadByIdsOrThrow,
608
651
  loadByFieldOrThrow: loadByFieldOrThrow,
609
652
  setOrThrow: setOrThrow$1,
610
653
  setEffectCacheOrThrow: setEffectCacheOrThrow,
611
- dumpEffectCache: dumpEffectCache,
612
- restoreEffectCache: restoreEffectCache
654
+ dumpEffectCache: dumpEffectCache
613
655
  };
614
656
  }
615
657
 
@@ -623,10 +665,9 @@ exports.makeInitializeTransaction = makeInitializeTransaction;
623
665
  exports.makeLoadByIdQuery = makeLoadByIdQuery;
624
666
  exports.makeLoadByFieldQuery = makeLoadByFieldQuery;
625
667
  exports.makeLoadByIdsQuery = makeLoadByIdsQuery;
668
+ exports.makeLoadAllQuery = makeLoadAllQuery;
626
669
  exports.makeInsertUnnestSetQuery = makeInsertUnnestSetQuery;
627
670
  exports.makeInsertValuesSetQuery = makeInsertValuesSetQuery;
628
- exports.rawEventsTableName = rawEventsTableName;
629
- exports.eventSyncStateTableName = eventSyncStateTableName;
630
671
  exports.maxItemsPerQuery = maxItemsPerQuery;
631
672
  exports.makeTableBatchSetQuery = makeTableBatchSetQuery;
632
673
  exports.chunkArray = chunkArray;
@@ -213,9 +213,9 @@ let incrementExecuteBatchDurationCounter = (~duration) => {
213
213
  executeBatchDurationCounter->PromClient.Counter.incMany(duration)
214
214
  }
215
215
 
216
- let setSourceChainHeight = (~blockNumber, ~chain) => {
216
+ let setSourceChainHeight = (~blockNumber, ~chainId) => {
217
217
  sourceChainHeight
218
- ->PromClient.Gauge.labels({"chainId": chain->ChainMap.Chain.toString})
218
+ ->PromClient.Gauge.labels({"chainId": chainId})
219
219
  ->PromClient.Gauge.set(blockNumber)
220
220
  }
221
221
 
@@ -4,7 +4,6 @@
4
4
  var Utils = require("./Utils.res.js");
5
5
  var Hrtime = require("./bindings/Hrtime.res.js");
6
6
  var Js_exn = require("rescript/lib/js/js_exn.js");
7
- var ChainMap = require("./ChainMap.res.js");
8
7
  var Belt_Array = require("rescript/lib/js/belt_Array.js");
9
8
  var Belt_Result = require("rescript/lib/js/belt_Result.js");
10
9
  var PromClient = require("prom-client");
@@ -315,9 +314,9 @@ function incrementExecuteBatchDurationCounter(duration) {
315
314
  executeBatchDurationCounter.inc(duration);
316
315
  }
317
316
 
318
- function setSourceChainHeight(blockNumber, chain) {
317
+ function setSourceChainHeight(blockNumber, chainId) {
319
318
  sourceChainHeight.labels({
320
- chainId: ChainMap.Chain.toString(chain)
319
+ chainId: chainId
321
320
  }).set(blockNumber);
322
321
  }
323
322
 
package/src/Time.res CHANGED
@@ -17,7 +17,7 @@ let rec retryAsyncWithExponentialBackOff = async (
17
17
  let log = retryCount === 0 ? Logging.childTrace : Logging.childWarn
18
18
  logger->log({
19
19
  "msg": `Retrying query ${nextRetryCount->Belt.Int.toString}/${maxRetries->Belt.Int.toString} in ${backOffMillis->Belt.Int.toString}ms - waiting for correct result.`,
20
- "err": exn->Internal.prettifyExn,
20
+ "err": exn->Utils.prettifyExn,
21
21
  })
22
22
  await resolvePromiseAfterDelay(~delayMilliseconds=backOffMillis)
23
23
 
package/src/Time.res.js CHANGED
@@ -3,7 +3,6 @@
3
3
 
4
4
  var Utils = require("./Utils.res.js");
5
5
  var Logging = require("./Logging.res.js");
6
- var Internal = require("./Internal.res.js");
7
6
  var ErrorHandling = require("./ErrorHandling.res.js");
8
7
  var Caml_js_exceptions = require("rescript/lib/js/caml_js_exceptions.js");
9
8
 
@@ -26,7 +25,7 @@ async function retryAsyncWithExponentialBackOff(backOffMillisOpt, multiplicative
26
25
  var log = retryCount === 0 ? Logging.childTrace : Logging.childWarn;
27
26
  log(logger, {
28
27
  msg: "Retrying query " + String(nextRetryCount) + "/" + String(maxRetries) + " in " + String(backOffMillis) + "ms - waiting for correct result.",
29
- err: Internal.prettifyExn(exn)
28
+ err: Utils.prettifyExn(exn)
30
29
  });
31
30
  await Utils.delay(backOffMillis);
32
31
  return await retryAsyncWithExponentialBackOff(Math.imul(backOffMillis, multiplicative), multiplicative, nextRetryCount, maxRetries, logger, f);
package/src/Utils.res CHANGED
@@ -584,3 +584,10 @@ module Hash = {
584
584
  }
585
585
  }
586
586
  }
587
+
588
+ let prettifyExn = exn => {
589
+ switch exn->Js.Exn.anyToExnInternal {
590
+ | Js.Exn.Error(e) => e->(magic: Js.Exn.t => exn)
591
+ | exn => exn
592
+ }
593
+ }
package/src/Utils.res.js CHANGED
@@ -10,6 +10,7 @@ var Belt_Option = require("rescript/lib/js/belt_Option.js");
10
10
  var Caml_option = require("rescript/lib/js/caml_option.js");
11
11
  var Caml_splice_call = require("rescript/lib/js/caml_splice_call.js");
12
12
  var S$RescriptSchema = require("rescript-schema/src/S.res.js");
13
+ var Caml_js_exceptions = require("rescript/lib/js/caml_js_exceptions.js");
13
14
 
14
15
  function delay(milliseconds) {
15
16
  return new Promise((function (resolve, param) {
@@ -530,6 +531,15 @@ var Hash = {
530
531
  makeOrThrow: makeOrThrow
531
532
  };
532
533
 
534
+ function prettifyExn(exn) {
535
+ var e = Caml_js_exceptions.internalToOCamlException(exn);
536
+ if (e.RE_EXN_ID === Js_exn.$$Error) {
537
+ return e._1;
538
+ } else {
539
+ return e;
540
+ }
541
+ }
542
+
533
543
  exports.delay = delay;
534
544
  exports.$$Object = $$Object;
535
545
  exports.$$Error = $$Error;
@@ -548,4 +558,5 @@ exports.$$WeakMap = $$WeakMap;
548
558
  exports.$$Map = $$Map;
549
559
  exports.$$Proxy = $$Proxy;
550
560
  exports.Hash = Hash;
561
+ exports.prettifyExn = prettifyExn;
551
562
  /* variantTag Not a pure module */
@@ -46,7 +46,7 @@ let createPinoMessageWithError = (message, err): pinoMessageBlobWithError => {
46
46
  // serializers type below: `type serializers = {err: Js.Json.t => Js.Json.t}`
47
47
  Utils.magic({
48
48
  "msg": message,
49
- "err": err,
49
+ "err": err->Utils.prettifyExn,
50
50
  })
51
51
  }
52
52
 
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var Pino = require("pino");
5
+ var Utils = require("../Utils.res.js");
5
6
  var Caml_obj = require("rescript/lib/js/caml_obj.js");
6
7
  var Belt_Array = require("rescript/lib/js/belt_Array.js");
7
8
  var Belt_Option = require("rescript/lib/js/belt_Option.js");
@@ -14,7 +15,7 @@ function createPinoMessage(message) {
14
15
  function createPinoMessageWithError(message, err) {
15
16
  return {
16
17
  msg: message,
17
- err: err
18
+ err: Utils.prettifyExn(err)
18
19
  };
19
20
  }
20
21