Skip to content

Commit

Permalink
Fixing "Invalid" Error II (#407)
Browse files Browse the repository at this point in the history
I probably did a bad job at explanning how `shareReplay` works, my
apologies.

The thing is that every time that with `shareReplay` every time that its
internal refCount goes down to zero, then it unsubscribes from the
source.

Therefore, there must be a subscription always open for the observable
to be "shared". This is because observables are not eager. What was
happening is that every time the old code was performing a
`firstValueFrom` that creates a subscription and when the condition is
met (and the promise resolves) then it unsubscribes from the observable.
Since that was its only subscription, then the refcount goes down to 0
and the observable dies. So, the next `firstValueFrom` creates a brand
new subscription.

I realize that people coming from PJS may find Observables difficult to
deal with. So, we will probably add an optional callback to the promise
based functions so that you can introspect what's going on under the
hood without having to learn how to work with observables.
  • Loading branch information
josepot authored May 17, 2024
1 parent 7062ef5 commit 2f36243
Showing 1 changed file with 11 additions and 11 deletions.
22 changes: 11 additions & 11 deletions src/dripper/polkadot/PolkadotActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,19 +112,19 @@ export class PolkadotActions {
// client.submit(tx) waits for the finalized value, which might be important for real money,
// but for the faucet drips, early respond is better UX
const submit$ = client.submitAndWatch(tx).pipe(shareReplay(1));

const hash = (await firstValueFrom(submit$.pipe(filter((value) => value.type === "broadcasted")))).txHash;

void firstValueFrom(submit$.pipe(filter((value) => value.type === "finalized")))
.catch((err) => {
logger.error(`Transaction ${hash} failed to finalize`, err);
})
.finally(() => {
let hash = "";
submit$.subscribe({
error: (err) => {
if (hash) logger.error(`Transaction ${hash} failed to finalize`, err);
this.#pendingTransactions.delete(tx);
});

await firstValueFrom(submit$.pipe(filter((value) => value.type === "txBestBlocksState" && value.found)));
},
complete: () => {
this.#pendingTransactions.delete(tx);
},
});

hash = (await firstValueFrom(submit$.pipe(filter((value) => value.type === "txBestBlocksState" && value.found))))
.txHash;
return hash;
}

Expand Down

0 comments on commit 2f36243

Please sign in to comment.