@apteva/web-sdk 0.10.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ ## 0.11.0 — 2026-10-01
2
+
3
+ - Retain session identity during offline, retryable and uncertain refresh failures
4
+ in both memory and local persistence modes. Never replay an uncertain rotation.
5
+ - Add public `AuthState.reason` and `recovery` fields to distinguish temporary
6
+ uncertainty, confirmed invalid sessions, explicit logout and explicit revocation.
7
+ Block fresh credentials during uncertainty; retain already-valid access tokens.
8
+ - Add sanitized diagnostic triggers for offline, timeout, HTTP, network,
9
+ persistence and unresolved refresh markers, with optional HTTP status.
10
+ - Process refresh failures under Web Locks; prevent older attempts overwriting
11
+ a newer login, and recover when a sibling saves a newer valid revision.
12
+ - Suppress `onUnauthorized` during refresh recovery. Keep subscriptions available
13
+ for retry instead of closing them merely because refresh is uncertain.
14
+ - Add failure, timeout, concurrent-tab and recovery regression coverage including
15
+ real Chromium, localStorage and native Web Locks.
16
+ - Apps own active-call behavior and call-ID recovery after re-login. Existing
17
+ Auth retry-safe errors require v0.12.1; no Auth/Telephony release is part of this
18
+ SDK fix. Explicit revocation state requires an explicit Auth response signal.
19
+
1
20
  ## 0.10.1
2
21
 
3
22
  - Keep an active managed Auth session after Auth explicitly reports a retryable
package/README.md CHANGED
@@ -640,15 +640,17 @@ login and opaque-token APIs retain their original behavior.
640
640
  A temporary mint failure preserves the normal Auth session and blocks only
641
641
  platform-credential requests. Credential types never switch after an error. An
642
642
  explicit `refresh_unavailable` response keeps an active session and permits a
643
- later refresh attempt; an `invalid_grant` response clears it. An uncertain
644
- refresh outcome cannot safely reuse a single-use credential. Local logout clears
643
+ later refresh attempt; `401 invalid_grant` clears it. An uncertain refresh
644
+ outcome retains identity and requires login before acquiring fresh credentials.
645
+ The SDK never reuses a refresh token whose rotation may have committed. Local logout clears
645
646
  credentials and streams immediately; a failed network logout still throws so the
646
647
  host can report that server-side revocation could not be confirmed. A late
647
648
  renewal cannot restore a logged-out session. HTTP writes are never automatically
648
649
  replayed after a 401; successful renewal prepares subsequent calls. Unlike legacy
649
650
  transport mode, a successfully recovered 401 does not trigger the
650
651
  `onUnauthorized` callback in managed Auth mode, although the original call still
651
- rejects. Reconcile a write's outcome before retrying it.
652
+ rejects. Retryable or uncertain refresh failures also suppress this callback;
653
+ use `onStateChange` to present recovery. Reconcile a write's outcome before retrying it.
652
654
 
653
655
 
654
656
  ### Mixed-app integration check
@@ -693,16 +695,45 @@ const conversations = client.app("conversations", { credential: "platform" });
693
695
 
694
696
  `auth.getState()` reports `status` (`idle`, `restoring`, `authenticated`,
695
697
  `unauthenticated`, or `error`), effective `persistence` (`memory`, `local`, or
696
- `unavailable`) and optional credential-free error metadata. Render loading for
697
- `idle`/`restoring`, rather than briefly displaying the login screen. Concurrent
698
- `restore()` calls share one promise. Protected requests await pending restoration
699
- and can start initial restoration themselves. After a restoration error, retry
700
- explicitly with `restore()` or log in; requests do not repeatedly retry it.
701
- `onDiagnostic` receives credential-free refresh outcomes (`succeeded`,
702
- `retryable`, `uncertain`, `invalid`) and session-clear reason codes. It never
703
- receives tokens, server response text or user details. An already authenticated
704
- tab stays authenticated after Auth explicitly returns `refresh_unavailable`;
705
- the failed request rejects, and the next request can try refresh again.
698
+ `unavailable`), and optional credential-free `reason`, `recovery` and error
699
+ metadata. These fields work in memory mode too. Render loading for
700
+ `idle`/`restoring`. **`authenticated` means identity is retained; check `reason`
701
+ and `recovery` before treating the session as fully operational.**
702
+
703
+ | `reason` | `recovery` | Meaning |
704
+ | --- | --- | --- |
705
+ | absent | absent | Normal session or no pending recovery. |
706
+ | `refresh_retryable` | `retry` | Offline before sending, or Auth explicitly guaranteed rotation did not commit. Retry with `auth.restore()` or a later request. |
707
+ | `refresh_uncertain` | `login` | Timeout, lost/malformed response, generic HTTP failure, or unresolved refresh marker. Identity remains; fresh credentials are blocked. |
708
+ | `storage_error` | `login` | Shared credentials cannot be read/coordinated safely. Identity remains; fresh credentials are blocked. |
709
+ | `invalid_session` | `login` | Auth definitively rejected the session; credentials and identity are cleared. |
710
+ | `revoked` | `login` | Auth explicitly reported `401 session_revoked`; credentials and identity are cleared. |
711
+ | `logout` | absent | Explicit local or shared logout. |
712
+ | `session_changed` | absent | Account replacement, disposal, or shared session removal. |
713
+
714
+ Current Auth returns `invalid_grant` for both invalid and revoked sessions, so
715
+ those responses produce `invalid_session`. The SDK reports `revoked` only when
716
+ Auth supplies the explicit signal; it does not infer revocation from a generic 401.
717
+
718
+ Concurrent `restore()` calls share one promise. Protected requests wait for
719
+ pending restoration/refresh. Already-valid access credentials can remain usable
720
+ until expiry; fresh platform mints and refresh-token reuse are blocked during
721
+ uncertainty. A same-origin tab that safely saves a newer active revision can
722
+ unblock recovery. Unknown rotation is never automatically replayed. Transparent
723
+ recovery after an uncertain commit requires an Auth protocol enhancement.
724
+
725
+ `onDiagnostic` receives fixed refresh outcomes (`succeeded`, `retryable`,
726
+ `uncertain`, `invalid`, `revoked`, `blocked`), triggers (`offline`, `timeout`,
727
+ `http`, `network`, `persistence`, `unresolved_marker`), optional HTTP status, and
728
+ session-clear reasons. It never receives tokens, URLs, server text or identity.
729
+ An uncertain refresh does not emit `session_clear` or close all session-bound
730
+ streams. Streams report errors and wait for recovery; genuine logout/login,
731
+ invalid session and revocation close the old session's streams.
732
+
733
+ The SDK manages authentication state. The consuming app decides whether to pause
734
+ an active call, show a retry/login action, or end it. Preserve the call ID in app
735
+ state before a genuine re-login, then reconcile and resume using the app's API.
736
+ Publishing this SDK does not update an app's bundled dependency or call UI.
706
737
 
707
738
  Only the refresh credential, format version, configuration scope and locally
708
739
  generated session/revision identifiers are persisted in localStorage. Normal Auth
@@ -745,9 +776,9 @@ Restoration failure handling:
745
776
  | Result | SDK behavior |
746
777
  | --- | --- |
747
778
  | Auth rejects an invalid/revoked refresh with `401 invalid_grant` | Clear the saved and local session; login is required. |
748
- | Browser is already offline before sending | Preserve the saved credential; retry restoration when connected. |
779
+ | Browser is already offline before sending | Retain identity and the saved credential; report `refresh_retryable` and retry when connected. |
749
780
  | Auth returns `refresh_unavailable` with 503 | Auth confirms rotation did not commit; preserve an active session and its credential for retry. |
750
- | Network failure, generic proxy 5xx/401, malformed response, or `refresh_uncertain` | Preserve an uncertain marker; do not reuse the old credential. If no replacement was saved, require login. |
781
+ | Network failure, generic proxy 5xx/401, malformed response, or `refresh_uncertain` | Retain identity and an uncertain marker; block fresh credentials, report `refresh_uncertain`, and require login if no replacement was saved. |
751
782
  | Platform mint denied | Restore the Auth session; platform-protected access remains blocked. |
752
783
  | Unsupported or malformed storage format | Fail closed; login or logout replaces the record. |
753
784
 
@@ -26,21 +26,30 @@ export interface AuthSessionInfo {
26
26
  expiresAt: string;
27
27
  platformExpiresAt?: string;
28
28
  }
29
+ export type AuthStateReason = "refresh_retryable" | "refresh_uncertain" | "invalid_session" | "logout" | "revoked" | "storage_error" | "session_changed";
30
+ export type AuthDiagnosticTrigger = "offline" | "timeout" | "http" | "network" | "persistence" | "unresolved_marker";
29
31
  export interface AuthState {
30
32
  status: "idle" | "restoring" | "authenticated" | "unauthenticated" | "error";
31
33
  persistence: "memory" | "local" | "unavailable";
34
+ /** Authenticated can retain identity while fresh credentials are blocked. */
35
+ reason?: AuthStateReason;
36
+ recovery?: "retry" | "login";
32
37
  error?: {
33
38
  code: string;
34
39
  message: string;
40
+ trigger?: AuthDiagnosticTrigger;
41
+ httpStatus?: number;
35
42
  };
36
43
  }
37
44
  /** Credential-free lifecycle events suitable for client telemetry. */
38
45
  export type AuthDiagnostic = {
39
46
  type: "refresh";
40
- outcome: "succeeded" | "retryable" | "uncertain" | "invalid";
47
+ outcome: "succeeded" | "retryable" | "uncertain" | "invalid" | "revoked" | "blocked";
48
+ trigger?: AuthDiagnosticTrigger;
49
+ httpStatus?: number;
41
50
  } | {
42
51
  type: "session_clear";
43
- reason: "login" | "logout" | "dispose" | "shared_change" | "invalid_refresh" | "refresh_uncertain" | "storage_error";
52
+ reason: "login" | "logout" | "dispose" | "shared_change" | "invalid_refresh" | "revoked" | "refresh_uncertain" | "storage_error";
44
53
  };
45
54
  export interface AppAuthOptions {
46
55
  /** Public Auth app OAuth client identifier; never a private client secret. */
@@ -82,6 +91,8 @@ export declare class AuthSession {
82
91
  private platformRevision;
83
92
  private pending?;
84
93
  private pendingAuth?;
94
+ private refreshBlock?;
95
+ private recoveryFailure?;
85
96
  private controllers;
86
97
  private listeners;
87
98
  constructor(baseURL: string, projectId: string, options: AppAuthOptions, fetchImpl: typeof fetch, changed: (token: string | undefined) => void, environment?: PersistenceEnvironment);
@@ -89,6 +100,7 @@ export declare class AuthSession {
89
100
  private diagnostic;
90
101
  private emitState;
91
102
  private status;
103
+ private failedRefresh;
92
104
  private synchronize;
93
105
  private ready;
94
106
  restore(): Promise<AuthSessionInfo | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-session.d.ts","sourceRoot":"","sources":["../src/auth-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-session.d.ts","sourceRoot":"","sources":["../src/auth-session.ts"],"names":[],"mappings":"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"}