@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 +19 -0
- package/README.md +46 -15
- package/dist/auth-session.d.ts +14 -2
- package/dist/auth-session.d.ts.map +1 -1
- package/dist/auth-session.js +201 -83
- package/dist/auth-session.js.map +1 -1
- package/dist/client.d.ts +25 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +38 -3
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/notifications.d.ts +71 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +2 -0
- package/dist/notifications.js.map +1 -0
- package/dist/session-persistence.d.ts +2 -1
- package/dist/session-persistence.d.ts.map +1 -1
- package/dist/session-persistence.js +3 -2
- package/dist/session-persistence.js.map +1 -1
- package/package.json +1 -1
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;
|
|
644
|
-
|
|
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.
|
|
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
|
|
697
|
-
|
|
698
|
-
`
|
|
699
|
-
and
|
|
700
|
-
|
|
701
|
-
`
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
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 |
|
|
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` |
|
|
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
|
|
package/dist/auth-session.d.ts
CHANGED
|
@@ -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":"AAAA,OAAO,EAA4D,KAAK,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACjI,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,cAAc;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AACnE,MAAM,WAAW,eAAgB,SAAQ,cAAc;IAAG,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAChF,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AACD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,eAAe,GAAG,iBAAiB,GAAG,OAAO,CAAC;IAC7E,WAAW,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IAChD,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-session.d.ts","sourceRoot":"","sources":["../src/auth-session.ts"],"names":[],"mappings":"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"}
|