0.6.0: LeaderboardSession.claim, rank_not_eligible is recoverable
CI / publish (push) Successful in 27s
CI / check (push) Successful in 59s

onClaim replaces onRewardClaimed. rewardClaimed() is a deprecated alias removed in the next version.
This commit is contained in:
edmand46
2026-08-29 11:33:01 +03:00
parent 19a296ab9a
commit 04e3565412
5 changed files with 31 additions and 5 deletions
+10
View File
@@ -1,5 +1,15 @@
# Changelog
## 0.6.0
- `LeaderboardSession.claim()` / effect `claim()` completes the leaderboard
node with handle `onClaim`. The server matches live rank to an authored
place and continues from that place (Grant Reward and/or In-App Message).
- `rewardClaimed()` is a deprecated alias for `claim()` and will be removed
in the next SDK version.
- `rank_not_eligible` on Claim leaves the session open (retry Claim or End);
it no longer fails the run.
## 0.5.1
- `QuestMetrics` / `reportProgress`: custom free-text metrics no longer
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@rudder/js-sdk",
"version": "0.5.1",
"version": "0.6.0",
"publishConfig": {
"registry": "https://hub.rudder.build/api/packages/rudder/npm/"
},
+4 -1
View File
@@ -35,6 +35,8 @@ export interface StoreOfferEffect {
export interface LeaderboardEffect {
end(): Promise<void>;
claim(): Promise<void>;
/** @deprecated Use {@link LeaderboardEffect.claim}. Removed in the next SDK version. */
rewardClaimed(): Promise<void>;
}
@@ -191,7 +193,8 @@ export class EffectsCenter implements Effects {
emitLeaderboard(session: LeaderboardSession): void {
this.emit(this.leaderboardHandlers, {
end: () => session.end(),
rewardClaimed: () => session.rewardClaimed(),
claim: () => session.claim(),
rewardClaimed: () => session.claim(),
});
}
+8
View File
@@ -61,6 +61,10 @@ function isTransientHttpError(err: unknown): boolean {
return false;
}
function isRankNotEligible(err: unknown): boolean {
return err instanceof RudderHttpError && err.code === 'rank_not_eligible';
}
export class ScenarioService<TConfig extends RemoteConfigShape = RemoteConfigShape> {
private readonly runs = new Map<string, RuntimeRun>();
@@ -434,6 +438,10 @@ export class ScenarioService<TConfig extends RemoteConfigShape = RemoteConfigSha
await this.persist();
} catch (err) {
run.pendingTransitions--;
if (isRankNotEligible(err)) {
await this.persist();
throw err;
}
this.failRun(
run,
nodeId,
+8 -3
View File
@@ -180,14 +180,19 @@ export class LeaderboardSession {
async end(): Promise<void> {
if (this.resolved) return;
this.resolved = true;
await this.context.complete('onEnd');
this.resolved = true;
}
async rewardClaimed(): Promise<void> {
async claim(): Promise<void> {
if (this.resolved) return;
await this.context.complete('onClaim');
this.resolved = true;
await this.context.complete('onRewardClaimed');
}
/** @deprecated Use {@link LeaderboardSession.claim}. Removed in the next SDK version. */
async rewardClaimed(): Promise<void> {
return this.claim();
}
}