Files
rudder-js-sdk/CHANGELOG.md
T

170 lines
7.9 KiB
Markdown
Raw Normal View History

2026-08-12 14:02:25 +03:00
# Changelog
## Unreleased
- `client.modules.call` resolves to `CallModuleFunctionClientResponse`, which
carries only `result`. Console output, the kernel call log and `error` are
no longer part of the player response; they stay on the platform dry run.
- Module business errors reject with `RudderHttpError` (`status` 422, body
`{ error, code, requestId }`). `code` is defined by the module and is an
open string.
- `RudderErrorCodes` and the `RudderErrorCode` type are no longer exported
from the package. The generated platform codes are now only `forbidden` and
`row_referenced`; the scenario and quest codes (`early_completion`,
`level_not_reached`, `node_not_active`, `objectives_incomplete`,
`run_expired`, `run_not_active`, `scenario_not_active`, `unknown_run`) are
removed with those domains. Compare `error.code` with string literals.
- 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()`.
2026-09-04 15:36:37 +03:00
## 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.
2026-08-28 17:38:02 +03:00
## 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).
2026-08-28 15:18:31 +03:00
## 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.
2026-08-12 14:02:25 +03:00
## 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.