diff --git a/lib_version.clj b/lib_version.clj index 799e932..1545519 100644 --- a/lib_version.clj +++ b/lib_version.clj @@ -1,4 +1,4 @@ (ns lib-version) (def lib 'district0x/district-server-smart-contracts) ; ends up as / in pom.xml -(def version "1.4.2-SNAPSHOT") +(def version "1.5.0-SNAPSHOT") diff --git a/src/district/server/smart_contracts.cljs b/src/district/server/smart_contracts.cljs index ed4d226..41956f5 100644 --- a/src/district/server/smart_contracts.cljs +++ b/src/district/server/smart_contracts.cljs @@ -261,7 +261,7 @@ identity)] (transform-fn (remove-log-indexes sorted-logs)))) -(defn chunk->logs [transform-fn from-block skip-log-indexes events ignore-forward? [from to] ch-output] +(defn chunk->logs [transform-fn from-block skip-log-indexes events ignore-forward? re-try [from to] ch-output] ">! to ch-output for chunk [from to]: final sorted, skipped and transformed logs as async/ch." (let [sort-and-skip-logs' (partial sort-and-skip-logs transform-fn from-block skip-log-indexes) ch-logs (async/chan 1) @@ -274,12 +274,22 @@ (fn [error events] (let [logs (map (partial enrich-event-log contract contract-instance) (web3-helpers/js->cljkk events))] - (async/put! ch-logs-output (or logs [(with-meta {:err error} {:error? true})])))))))] + (async/put! ch-logs-output (or logs [(with-meta {:err error} {:error? true})]))))))) + re-try-event->logs (fn [event ch-output] + (let [buf (async/chan 1)] + (go-loop [re-try-iteration re-try] + (event->logs event buf) + (let [log (! ch-output log))))))] (go-loop [all-logs [] [event & rest-events] events] (if event (do - (event->logs event ch-logs) + (re-try-event->logs event ch-logs) (recur (into all-logs (logs' (partial chunk->logs transform-fn from-block skip-log-indexes events ignore-forward?) + chunk->logs' (partial chunk->logs transform-fn from-block skip-log-indexes events ignore-forward? re-try) chs-await-for-workers (for [n (range chunks-parallelism)] (async/chan 1)) workers (dotimes [n chunks-parallelism] @@ -328,8 +339,8 @@ (when (fn? callback) (doseq [log chunk-logs] (doseq [res (try - (if-let [?error (:error? (meta log))] - (callback ?error nil) + (if (:error? (meta log)) + (callback log nil) (callback nil log)) (catch js/Error e (when crash-on-event-fail?