From 04e35654125212c32d6111825768ae077c8132e0 Mon Sep 17 00:00:00 2001 From: edmand46 Date: Sat, 29 Aug 2026 11:33:01 +0300 Subject: [PATCH] 0.6.0: LeaderboardSession.claim, rank_not_eligible is recoverable onClaim replaces onRewardClaimed. rewardClaimed() is a deprecated alias removed in the next version. --- CHANGELOG.md | 10 ++++++++++ package.json | 2 +- src/effects/EffectsCenter.ts | 5 ++++- src/scenario/ScenarioService.ts | 8 ++++++++ src/scenario/engine/sessions.ts | 11 ++++++++--- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a5a9b4..985f801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/package.json b/package.json index c0f9040..2b47b06 100644 --- a/package.json +++ b/package.json @@ -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/" }, diff --git a/src/effects/EffectsCenter.ts b/src/effects/EffectsCenter.ts index 1e45eba..034853c 100644 --- a/src/effects/EffectsCenter.ts +++ b/src/effects/EffectsCenter.ts @@ -35,6 +35,8 @@ export interface StoreOfferEffect { export interface LeaderboardEffect { end(): Promise; + claim(): Promise; + /** @deprecated Use {@link LeaderboardEffect.claim}. Removed in the next SDK version. */ rewardClaimed(): Promise; } @@ -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(), }); } diff --git a/src/scenario/ScenarioService.ts b/src/scenario/ScenarioService.ts index 855e615..3e06457 100644 --- a/src/scenario/ScenarioService.ts +++ b/src/scenario/ScenarioService.ts @@ -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 { private readonly runs = new Map(); @@ -434,6 +438,10 @@ export class ScenarioService { if (this.resolved) return; - this.resolved = true; await this.context.complete('onEnd'); + this.resolved = true; } - async rewardClaimed(): Promise { + async claim(): Promise { 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 { + return this.claim(); } }