Files
rudder-js-sdk/CHANGELOG.md
T

7.1 KiB

Changelog

Unreleased

  • Login and token refresh send platform: 'web' and, when the new optional appVersion client option is set, appVersion. The backend stores them on the player for segment rules (player.platform, player.appVersion).

2.0.0

Breaking change — kernel surface. Module-specific client methods are removed. The SDK now exposes the kernel only: auth, player (including wallets), catalog currencies, storage, project storage, revision sync, client.modules.call(module, fn, args), and client.resources(slug).

Removed

  • client.battlePass / BattlePassService
  • client.quests / QuestsService / QuestMetrics
  • client.leaderboards / LeaderboardsService / LeaderboardHandle
  • client.stores / StoresDomain / ShopHandle / OfferHandle
  • client.inventory / InventoryDomain
  • client.remoteConfig / ConfigDomain / RemoteConfigState
  • Scenario runtime (ScenarioService, login-event trigger, pending poll)
  • Module-specific effects: onStoreOffer, onLeaderboard, onQuest, onBattlePass, onBattlePassLevel, onConfigChanged
  • Generated wire types for battle pass, quests, stores, inventory, leaderboards, remote config, and scenarios

Call module functions with client.modules.call(module, fn, args) and read or write resource rows with client.resources(slug) (list / get / create / update / delete).

Also required by the backend environments release: every project now has exactly two environments, staging and prod, and the SDK key passed as projectKey decides which one the player belongs to. The environment never appears in the client API: it is resolved at login and carried inside the access and refresh tokens. Tokens issued before this release have no environment claim and are rejected with 401, so the first call after the backend upgrade refreshes, fails, clears the token store and emits 'signed-out' to every onAuthStateChange listener. Log the player in again with client.auth.loginWithDevice() / loginWithCustom().

1.0.0

  • Scenario execution moved server-side. The SDK no longer walks a local DAG or persists plan state to IndexedDB.
  • Removed RudderClientOptions.runtime.planStateStore and the PlanStateStore type.
  • GET /sdk/v1/scenarios/pending is polled on login, on a ~30s heartbeat, and at each effect waitDeadline. Completions POST /sdk/v1/scenarios/callback; the response may carry the next PendingEffect.
  • Scenario remote_config_override nodes no longer emit onConfigChanged (the server applies the override). The ConfigChangedEffect type and onConfigChanged subscription remain.

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 progress quests. Report a released catalog counter slug instead. purchaseOffer / purchaseItem helpers are unchanged (server-side shop fan-out).

0.5.0

  • client.auth.loginWithCustom({ customData, region?, language?, nickname? }) — custom webhook auth, same token + runtime start as loginWithDevice.
  • QuestMetrics.purchaseOffer / purchaseItem helpers for the shop purchase metric format.
  • Typecheck against regenerated models: listQuests no longer takes a body, battle-pass track is 'free' | 'premium', scenario run status has no unknown_run.

0.4.0

  • Fixed BattlePassLevelSession.level reading node data key level — the admin editor writes levelNumber, so tiers always reported 0. The session now reads levelNumber, matching the editor and server validation.
  • UGC support removed from the generated wire types (src/generated/ugc.ts deleted by apigen); no UGC surface was ever exposed by this SDK.
  • Generated API types regenerated from the gateway openapi spec, adding the new platform operations.

0.3.0

Breaking changes — the package was aligned with the Rudder SDK glossary and the regenerated wire types (src/generated, apigen). No compatibility shims are provided.

Auth

  • client.auth.loginViaDevice(region, language, nickname?) replaced by client.auth.loginWithDevice(options?: { region?, language?, nickname? }). Default region is now 'global' (was 'en'); default language stays 'en'.
  • New client.auth.onAuthStateChange(cb) — fires immediately with the current state, then on every 'signed-in' | 'signed-out' transition (login, logout, and unrecoverable session expiry in the transport).
  • New client.auth.isAuthenticated.

Client configuration

  • tokenStore in RudderClientOptions is now optional. Default: localStorage-backed store with a silent in-memory fallback where localStorage is unavailable (SSR, private mode). New createDefaultTokenStore() export.
  • Invalid client options (baseUrl / projectKey missing) now throw RudderError with code: 'sdk/invalid-options' instead of a plain Error.
  • New onEffectError option — called when an effect handler throws (default: console.error); previously such errors were swallowed silently.

Renames

  • client.config → client.remoteConfig (canonical glossary name).
  • client.battlepass → client.battlePass; BattlepassService → BattlePassService.
  • Effects: onBattlepass / BattlepassEffect → onBattlePass / BattlePassEffect; onBattlepassLevel / BattlepassLevelEffect → onBattlePassLevel / BattlePassLevelEffect.
  • Generated types: SdkQuest → Quest; *Battlepass* request/response types → *BattlePass*.
  • Internal transport sendAsync → request (not part of the public surface).

Leaderboards

  • Removed LeaderboardsService.getRanking(slug, limit) and LeaderboardsService.submitScore(slug, score). Single path: client.leaderboards.findBySlug(slug) → handle.list(limit?) / handle.submit(score).

Errors

  • RudderNetworkError.inner → standard Error.cause.
  • RudderHttpError.code is typed as RudderErrorCode | (string & {}) (generated union of server error codes, plus room for unknown strings).
  • New exports: RudderErrorCode (type), RudderErrorCodes (constants), SDK_ERROR_INVALID_OPTIONS, RudderErrorCodeLike (type).

Public surface

  • The barrel no longer exports getOrCreateDeviceId, domain classes (PlayerDomain, …) or service constructors (AuthService, …) as values — they remain available as types. Instances live on the client.
  • SubmittedBy is no longer re-exported (UGC is unsupported on web).

Bundle

  • The scenario engine and the IndexedDB plan store are loaded lazily (dynamic import) on first login / first runtime access — a thin client never pulls the scenario machinery into the initial chunk.
  • The package now ships both ESM (dist/index.js) and CJS (dist/index.cjs) builds with matching exports entries.