@aifabrix/miso-client 4.15.4 → 4.17.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/sdk-exports.d.ts +14 -0
  3. package/dist/sdk-exports.d.ts.map +1 -1
  4. package/dist/sdk-exports.js +25 -1
  5. package/dist/sdk-exports.js.map +1 -1
  6. package/dist/types/auth-browser.types.d.ts +18 -0
  7. package/dist/types/auth-browser.types.d.ts.map +1 -0
  8. package/dist/types/auth-browser.types.js +20 -0
  9. package/dist/types/auth-browser.types.js.map +1 -0
  10. package/dist/types/browser-session.types.d.ts +35 -0
  11. package/dist/types/browser-session.types.d.ts.map +1 -0
  12. package/dist/types/browser-session.types.js +10 -0
  13. package/dist/types/browser-session.types.js.map +1 -0
  14. package/dist/utils/auth-browser-errors.d.ts +19 -0
  15. package/dist/utils/auth-browser-errors.d.ts.map +1 -0
  16. package/dist/utils/auth-browser-errors.js +51 -0
  17. package/dist/utils/auth-browser-errors.js.map +1 -0
  18. package/dist/utils/browser-api-base-url.d.ts +19 -0
  19. package/dist/utils/browser-api-base-url.d.ts.map +1 -0
  20. package/dist/utils/browser-api-base-url.js +68 -0
  21. package/dist/utils/browser-api-base-url.js.map +1 -0
  22. package/dist/utils/browser-session-recovery.d.ts +26 -0
  23. package/dist/utils/browser-session-recovery.d.ts.map +1 -0
  24. package/dist/utils/browser-session-recovery.js +59 -0
  25. package/dist/utils/browser-session-recovery.js.map +1 -0
  26. package/dist/utils/browser-session.d.ts +29 -0
  27. package/dist/utils/browser-session.d.ts.map +1 -0
  28. package/dist/utils/browser-session.js +262 -0
  29. package/dist/utils/browser-session.js.map +1 -0
  30. package/dist/utils/client-token-url.d.ts +25 -0
  31. package/dist/utils/client-token-url.d.ts.map +1 -0
  32. package/dist/utils/client-token-url.js +67 -0
  33. package/dist/utils/client-token-url.js.map +1 -0
  34. package/dist/utils/loopback-host-alignment.d.ts +13 -0
  35. package/dist/utils/loopback-host-alignment.d.ts.map +1 -0
  36. package/dist/utils/loopback-host-alignment.js +46 -0
  37. package/dist/utils/loopback-host-alignment.js.map +1 -0
  38. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,41 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [4.17.0] - 2026-06-10
11
+
12
+ ### Changed
13
+
14
+ - **Browser-session refresh request shape** - `createBrowserSessionClient().refresh()` now sends cookie-auth `POST /api/v1/auth/refresh` requests without a JSON body, matching cookie-first hard-cut semantics.
15
+ - **Browser-session token surface** - `SessionRestoreSuccess` no longer exposes `refreshToken` for browser flow helpers; browser callbacks continue to return access-token metadata only.
16
+ - **Browser auth documentation alignment** - Authentication/DataClient docs now explicitly describe callback result shape and cookie-first refresh semantics without browser refresh-token exposure.
17
+
18
+ ### Technical
19
+
20
+ - **Tests/docs alignment** - Added regression coverage for no-body browser refresh requests and updated browser-auth documentation examples to reflect the current callback and refresh signatures.
21
+
22
+ ## [4.16.0] - 2026-06-03
23
+
24
+ ### Added
25
+
26
+ - **UI auth consolidation helpers** - `AUTH_CONTROLLER_PATHS`, `resolveBrowserApiBaseUrl`, `alignLoopbackHostnameWithPage`, `recoverBrowserSessionWithStaleCleanup` / `recoverBrowserSessionToUserToken` / `recoverBrowserSessionOrThrow`, `isUnauthorizedApiError`, `isInactiveTokenMessage`, `isStaleBrowserSessionFailure`, and client-token URL helpers (`extractClientTokenFromUrl`, `removeClientTokenFromUrl`) for shared miso-ui and dataplane app-ui browser auth.
27
+
28
+ ### Changed
29
+
30
+ - **`sdk-exports` surface** - Removed `DataClient` and `dataClient` re-exports from the SDK exports entry; import them from the main package entry (`@aifabrix/miso-client`) instead.
31
+
32
+ ### Technical
33
+
34
+ - Unit tests for browser session, recovery, URL resolution, loopback alignment, auth error helpers, and client-token URL utilities.
35
+ - Documentation: browser UI auth helpers in `docs/authentication.md`, enterprise cookie session flow in `docs/dataclient.md`, split-port troubleshooting in `docs/troubleshooting.md`.
36
+
37
+ ## [4.15.5] - 2026-06-03
38
+
39
+ ### Added
40
+
41
+ - **Browser session utilities** - `createBrowserSessionClient`, `createCookieSessionCallbacks`, and `ensureBrowserAccessToken` for cookie-first controller auth (`GET /api/v1/auth/session`, `POST /api/v1/auth/refresh`) with retries, deduplication, and `SessionRestoreResult` typing shared across dataplane and miso-ui.
42
+
8
43
  ## [4.15.4] - 2026-06-03
9
44
 
10
45
  ### Changed
@@ -55,4 +55,18 @@ export { autoInitializeDataClient, getCachedDataClientConfig, } from "./utils/da
55
55
  export type { AutoInitOptions } from "./utils/data-client-auto-init";
56
56
  export type { TokenType, TokenValidationOptions, TokenValidationResult, TokenPayload, KeycloakConfig, DelegatedProviderConfig, DelegatedProviderLookup, } from "./types/token-validation.types";
57
57
  export { TokenValidationService } from "./services/token-validation.service";
58
+ export { AUTH_BROWSER_SESSION_PATHS, AUTH_CONTROLLER_PATHS, } from "./types/auth-browser.types";
59
+ export type { AuthControllerPath } from "./types/auth-browser.types";
60
+ export { isUnauthorizedApiError, isInactiveTokenMessage, isStaleBrowserSessionFailure, } from "./utils/auth-browser-errors";
61
+ export { resolveBrowserApiBaseUrl } from "./utils/browser-api-base-url";
62
+ export type { ResolveBrowserApiBaseUrlOptions } from "./utils/browser-api-base-url";
63
+ export { alignLoopbackHostnameWithPage } from "./utils/loopback-host-alignment";
64
+ export type { AlignLoopbackHostnameOptions } from "./utils/loopback-host-alignment";
65
+ export { recoverBrowserSessionWithStaleCleanup, recoverBrowserSessionToUserToken, recoverBrowserSessionOrThrow, resolveSessionExpiresInSeconds, } from "./utils/browser-session-recovery";
66
+ export type { RecoverBrowserSessionOptions } from "./utils/browser-session-recovery";
67
+ export { extractClientTokenFromUrl, removeClientTokenFromUrl, } from "./utils/client-token-url";
68
+ export type { ClientTokenUrlSource, ExtractClientTokenFromUrlOptions, RemoveClientTokenFromUrlOptions, } from "./utils/client-token-url";
69
+ export { createBrowserSessionClient, createCookieSessionCallbacks, ensureBrowserAccessToken, sessionRestoreToUserToken, } from "./utils/browser-session";
70
+ export type { BrowserSessionClient, BrowserSessionClientOptions, BrowserSessionPath, SessionRestoreFailure, SessionRestoreFailureReason, SessionRestoreResult, SessionRestoreSuccess, } from "./types/browser-session.types";
71
+ export type { CookieSessionCallbacksOptions, EnsureBrowserAccessTokenOptions, } from "./utils/browser-session";
58
72
  //# sourceMappingURL=sdk-exports.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-exports.d.ts","sourceRoot":"","sources":["../src/sdk-exports.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,mBAAmB,0BAA0B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,mBAAmB,oBAAoB,CAAC;AACxC,YAAY,EACV,aAAa,IAAI,uBAAuB,EACxC,aAAa,EACb,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,WAAW,EACX,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EACV,qBAAqB,EACrB,MAAM,EACN,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EACV,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EACzB,SAAS,EACT,uBAAuB,GACxB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,WAAW,EACX,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACtF,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,WAAW,IAAI,qBAAqB,EACpC,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,QAAQ,IAAI,kBAAkB,GAC/B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,kCAAkC,EAClC,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,YAAY,EACV,SAAS,EACT,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"sdk-exports.d.ts","sourceRoot":"","sources":["../src/sdk-exports.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.normalizeExpiresAt = exports.loggerContextMiddleware = exports.hasConfig = exports.createClientTokenEndpoint = exports.sendErrorResponse = exports.getErrorTitle = exports.getErrorTypeUri = exports.handleRouteError = exports.setErrorLogger = exports.createErrorResponse = exports.createSuccessResponse = exports.AppError = exports.ValidationHelper = exports.asyncHandlerNamed = exports.asyncHandler = exports.injectResponseHelpers = exports.ResponseHelper = exports.APPLICATION_STATUS_VALUES = exports.EncryptionError = exports.EncryptionService = exports.handleApiError = exports.transformError = exports.ApiErrorException = exports.MisoClientError = exports.extractRequestContext = exports.extractLoggingContext = exports.normalizeRootUrl = exports.mergeRootUrlWithBasePath = exports.joinApiRoot = exports.coerceControllerUrlToAbsolute = exports.validateUrl = exports.isBrowser = exports.resolveKeycloakUrl = exports.resolveControllerUrl = exports.extractClientTokenInfo = exports.getEnvironmentToken = exports.validateOrigin = exports.loadConfig = exports.LoggerContextStorage = exports.getLogger = exports.HttpClient = exports.CacheService = exports.RedisService = exports.LoggerService = exports.BrowserRoleService = exports.BrowserPermissionService = exports.PermissionService = exports.RoleService = exports.AuthService = exports.detectAuthMethodFromHeaders = void 0;
21
- exports.TokenValidationService = exports.getCachedDataClientConfig = exports.autoInitializeDataClient = exports.UserTokenRefreshManager = exports.isUserTokenExpired = exports.isUserTokenRefreshDue = exports.getUserTokenRefreshDueAt = exports.getEffectiveUserTokenRefreshBuffer = exports.getJwtExpiresAt = void 0;
21
+ exports.sessionRestoreToUserToken = exports.ensureBrowserAccessToken = exports.createCookieSessionCallbacks = exports.createBrowserSessionClient = exports.removeClientTokenFromUrl = exports.extractClientTokenFromUrl = exports.resolveSessionExpiresInSeconds = exports.recoverBrowserSessionOrThrow = exports.recoverBrowserSessionToUserToken = exports.recoverBrowserSessionWithStaleCleanup = exports.alignLoopbackHostnameWithPage = exports.resolveBrowserApiBaseUrl = exports.isStaleBrowserSessionFailure = exports.isInactiveTokenMessage = exports.isUnauthorizedApiError = exports.AUTH_CONTROLLER_PATHS = exports.AUTH_BROWSER_SESSION_PATHS = exports.TokenValidationService = exports.getCachedDataClientConfig = exports.autoInitializeDataClient = exports.UserTokenRefreshManager = exports.isUserTokenExpired = exports.isUserTokenRefreshDue = exports.getUserTokenRefreshDueAt = exports.getEffectiveUserTokenRefreshBuffer = exports.getJwtExpiresAt = void 0;
22
22
  __exportStar(require("./types/config.types"), exports);
23
23
  __exportStar(require("./types/filter.types"), exports);
24
24
  __exportStar(require("./types/filter-schema.types"), exports);
@@ -113,4 +113,28 @@ Object.defineProperty(exports, "autoInitializeDataClient", { enumerable: true, g
113
113
  Object.defineProperty(exports, "getCachedDataClientConfig", { enumerable: true, get: function () { return data_client_auto_init_1.getCachedDataClientConfig; } });
114
114
  var token_validation_service_1 = require("./services/token-validation.service");
115
115
  Object.defineProperty(exports, "TokenValidationService", { enumerable: true, get: function () { return token_validation_service_1.TokenValidationService; } });
116
+ var auth_browser_types_1 = require("./types/auth-browser.types");
117
+ Object.defineProperty(exports, "AUTH_BROWSER_SESSION_PATHS", { enumerable: true, get: function () { return auth_browser_types_1.AUTH_BROWSER_SESSION_PATHS; } });
118
+ Object.defineProperty(exports, "AUTH_CONTROLLER_PATHS", { enumerable: true, get: function () { return auth_browser_types_1.AUTH_CONTROLLER_PATHS; } });
119
+ var auth_browser_errors_1 = require("./utils/auth-browser-errors");
120
+ Object.defineProperty(exports, "isUnauthorizedApiError", { enumerable: true, get: function () { return auth_browser_errors_1.isUnauthorizedApiError; } });
121
+ Object.defineProperty(exports, "isInactiveTokenMessage", { enumerable: true, get: function () { return auth_browser_errors_1.isInactiveTokenMessage; } });
122
+ Object.defineProperty(exports, "isStaleBrowserSessionFailure", { enumerable: true, get: function () { return auth_browser_errors_1.isStaleBrowserSessionFailure; } });
123
+ var browser_api_base_url_1 = require("./utils/browser-api-base-url");
124
+ Object.defineProperty(exports, "resolveBrowserApiBaseUrl", { enumerable: true, get: function () { return browser_api_base_url_1.resolveBrowserApiBaseUrl; } });
125
+ var loopback_host_alignment_1 = require("./utils/loopback-host-alignment");
126
+ Object.defineProperty(exports, "alignLoopbackHostnameWithPage", { enumerable: true, get: function () { return loopback_host_alignment_1.alignLoopbackHostnameWithPage; } });
127
+ var browser_session_recovery_1 = require("./utils/browser-session-recovery");
128
+ Object.defineProperty(exports, "recoverBrowserSessionWithStaleCleanup", { enumerable: true, get: function () { return browser_session_recovery_1.recoverBrowserSessionWithStaleCleanup; } });
129
+ Object.defineProperty(exports, "recoverBrowserSessionToUserToken", { enumerable: true, get: function () { return browser_session_recovery_1.recoverBrowserSessionToUserToken; } });
130
+ Object.defineProperty(exports, "recoverBrowserSessionOrThrow", { enumerable: true, get: function () { return browser_session_recovery_1.recoverBrowserSessionOrThrow; } });
131
+ Object.defineProperty(exports, "resolveSessionExpiresInSeconds", { enumerable: true, get: function () { return browser_session_recovery_1.resolveSessionExpiresInSeconds; } });
132
+ var client_token_url_1 = require("./utils/client-token-url");
133
+ Object.defineProperty(exports, "extractClientTokenFromUrl", { enumerable: true, get: function () { return client_token_url_1.extractClientTokenFromUrl; } });
134
+ Object.defineProperty(exports, "removeClientTokenFromUrl", { enumerable: true, get: function () { return client_token_url_1.removeClientTokenFromUrl; } });
135
+ var browser_session_1 = require("./utils/browser-session");
136
+ Object.defineProperty(exports, "createBrowserSessionClient", { enumerable: true, get: function () { return browser_session_1.createBrowserSessionClient; } });
137
+ Object.defineProperty(exports, "createCookieSessionCallbacks", { enumerable: true, get: function () { return browser_session_1.createCookieSessionCallbacks; } });
138
+ Object.defineProperty(exports, "ensureBrowserAccessToken", { enumerable: true, get: function () { return browser_session_1.ensureBrowserAccessToken; } });
139
+ Object.defineProperty(exports, "sessionRestoreToUserToken", { enumerable: true, get: function () { return browser_session_1.sessionRestoreToUserToken; } });
116
140
  //# sourceMappingURL=sdk-exports.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-exports.js","sourceRoot":"","sources":["../src/sdk-exports.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;AAEH,uDAAqC;AAErC,uDAAqC;AACrC,8DAA4C;AAO5C,iEAAyE;AAAhE,iIAAA,2BAA2B,OAAA;AACpC,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,oEAAkE;AAAzD,uHAAA,iBAAiB,OAAA;AAC1B,oFAAiF;AAAxE,sIAAA,wBAAwB,OAAA;AACjC,wEAAqE;AAA5D,0HAAA,kBAAkB,OAAA;AAC3B,4CAAkD;AAAzC,uGAAA,aAAa,OAAA;AACtB,0DAAwD;AAA/C,6GAAA,YAAY,OAAA;AACrB,0DAAwD;AAA/C,6GAAA,YAAY,OAAA;AACrB,mDAAiD;AAAxC,yGAAA,UAAU,OAAA;AACnB,mFAAqE;AAA5D,mHAAA,SAAS,OAAA;AAClB,4CAAyD;AAAhD,8GAAA,oBAAoB,OAAA;AAE7B,uDAAmD;AAA1C,2GAAA,UAAU,OAAA;AACnB,6DAA0D;AAAjD,kHAAA,cAAc,OAAA;AACvB,+DAAgE;AAAvD,wHAAA,mBAAmB,OAAA;AAC5B,mDAA6D;AAApD,qHAAA,sBAAsB,OAAA;AAG/B,2EAMyC;AALvC,+HAAA,oBAAoB,OAAA;AACpB,6HAAA,kBAAkB,OAAA;AAClB,oHAAA,SAAS,OAAA;AACT,sHAAA,WAAW,OAAA;AACX,wIAAA,6BAA6B,OAAA;AAE/B,6CAI0B;AAHxB,uGAAA,WAAW,OAAA;AACX,oHAAA,wBAAwB,OAAA;AACxB,4GAAA,gBAAgB,OAAA;AAElB,2DAAgE;AAAvD,wHAAA,qBAAqB,OAAA;AAM9B,2DAAgE;AAAvD,wHAAA,qBAAqB,OAAA;AAE9B,2DAAyC;AACzC,uDAAqC;AACrC,8DAA4C;AAC5C,qDAAmC;AACnC,yCAKwB;AAJtB,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AACjB,wGAAA,cAAc,OAAA;AACd,wGAAA,cAAc,OAAA;AAEhB,oEAAkE;AAAzD,uHAAA,iBAAiB,OAAA;AAE1B,6DAA2D;AAAlD,mHAAA,eAAe,OAAA;AAmBxB,qEAA2E;AAAlE,+HAAA,yBAAyB,OAAA;AAClC,qCAiBmB;AAhBjB,yGAAA,cAAc,OAAA;AACd,gHAAA,qBAAqB,OAAA;AACrB,uGAAA,YAAY,OAAA;AACZ,4GAAA,iBAAiB,OAAA;AACjB,2GAAA,gBAAgB,OAAA;AAChB,mGAAA,QAAQ,OAAA;AACR,gHAAA,qBAAqB,OAAA;AACrB,8GAAA,mBAAmB,OAAA;AACnB,yGAAA,cAAc,OAAA;AACd,2GAAA,gBAAgB,OAAA;AAChB,0GAAA,eAAe,OAAA;AACf,wGAAA,aAAa,OAAA;AACb,4GAAA,iBAAiB,OAAA;AACjB,oHAAA,yBAAyB,OAAA;AACzB,oGAAA,SAAS,OAAA;AACT,kHAAA,uBAAuB,OAAA;AA6BzB,iEAQoC;AAPlC,wHAAA,kBAAkB,OAAA;AAClB,qHAAA,eAAe,OAAA;AACf,wIAAA,kCAAkC,OAAA;AAClC,8HAAA,wBAAwB,OAAA;AACxB,2HAAA,qBAAqB,OAAA;AACrB,wHAAA,kBAAkB,OAAA;AAClB,6HAAA,uBAAuB,OAAA;AAEzB,uEAGuC;AAFrC,iIAAA,wBAAwB,OAAA;AACxB,kIAAA,yBAAyB,OAAA;AAY3B,gFAA6E;AAApE,kIAAA,sBAAsB,OAAA"}
1
+ {"version":3,"file":"sdk-exports.js","sourceRoot":"","sources":["../src/sdk-exports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared controller auth path constants for browser applications.
3
+ */
4
+ export declare const AUTH_CONTROLLER_PATHS: {
5
+ readonly SESSION: "/api/v1/auth/session";
6
+ readonly REFRESH: "/api/v1/auth/refresh";
7
+ readonly LOGIN: "/api/v1/auth/login";
8
+ readonly CALLBACK: "/api/v1/auth/callback";
9
+ readonly LOGOUT: "/api/v1/auth/logout";
10
+ readonly CLIENT_TOKEN: "/api/v1/auth/client-token";
11
+ };
12
+ export type AuthControllerPath = (typeof AUTH_CONTROLLER_PATHS)[keyof typeof AUTH_CONTROLLER_PATHS];
13
+ /** @deprecated Use AUTH_CONTROLLER_PATHS.SESSION */
14
+ export declare const AUTH_BROWSER_SESSION_PATHS: {
15
+ readonly SESSION: "/api/v1/auth/session";
16
+ readonly REFRESH: "/api/v1/auth/refresh";
17
+ };
18
+ //# sourceMappingURL=auth-browser.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-browser.types.d.ts","sourceRoot":"","sources":["../../src/types/auth-browser.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,qBAAqB;;;;;;;CAOxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC;AAErE,oDAAoD;AACpD,eAAO,MAAM,0BAA0B;;;CAG7B,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * Shared controller auth path constants for browser applications.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AUTH_BROWSER_SESSION_PATHS = exports.AUTH_CONTROLLER_PATHS = void 0;
7
+ exports.AUTH_CONTROLLER_PATHS = {
8
+ SESSION: "/api/v1/auth/session",
9
+ REFRESH: "/api/v1/auth/refresh",
10
+ LOGIN: "/api/v1/auth/login",
11
+ CALLBACK: "/api/v1/auth/callback",
12
+ LOGOUT: "/api/v1/auth/logout",
13
+ CLIENT_TOKEN: "/api/v1/auth/client-token",
14
+ };
15
+ /** @deprecated Use AUTH_CONTROLLER_PATHS.SESSION */
16
+ exports.AUTH_BROWSER_SESSION_PATHS = {
17
+ SESSION: exports.AUTH_CONTROLLER_PATHS.SESSION,
18
+ REFRESH: exports.AUTH_CONTROLLER_PATHS.REFRESH,
19
+ };
20
+ //# sourceMappingURL=auth-browser.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-browser.types.js","sourceRoot":"","sources":["../../src/types/auth-browser.types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,qBAAqB,GAAG;IACnC,OAAO,EAAE,sBAAsB;IAC/B,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,oBAAoB;IAC3B,QAAQ,EAAE,uBAAuB;IACjC,MAAM,EAAE,qBAAqB;IAC7B,YAAY,EAAE,2BAA2B;CACjC,CAAC;AAKX,oDAAoD;AACvC,QAAA,0BAA0B,GAAG;IACxC,OAAO,EAAE,6BAAqB,CAAC,OAAO;IACtC,OAAO,EAAE,6BAAqB,CAAC,OAAO;CAC9B,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Cookie-first browser session types (controller HttpOnly refresh cookie).
3
+ */
4
+ export { AUTH_BROWSER_SESSION_PATHS, AUTH_CONTROLLER_PATHS, } from "./auth-browser.types";
5
+ export type { AuthControllerPath } from "./auth-browser.types";
6
+ import type { AuthControllerPath } from "./auth-browser.types";
7
+ export type BrowserSessionPath = AuthControllerPath;
8
+ export type SessionRestoreFailureReason = "unauthorized" | "network" | "server" | "invalid";
9
+ export type SessionRestoreSuccess = {
10
+ ok: true;
11
+ accessToken: string;
12
+ expiresAt?: string;
13
+ expiresIn?: number;
14
+ user?: Record<string, unknown>;
15
+ };
16
+ export type SessionRestoreFailure = {
17
+ ok: false;
18
+ status?: number;
19
+ reason: SessionRestoreFailureReason;
20
+ message?: string;
21
+ };
22
+ export type SessionRestoreResult = SessionRestoreSuccess | SessionRestoreFailure;
23
+ export type BrowserSessionClientOptions = {
24
+ /** Resolves controller public base URL (no trailing slash). */
25
+ getBaseUrl: () => string;
26
+ sessionPath?: string;
27
+ refreshPath?: string;
28
+ timeoutMs?: number;
29
+ retryDelaysMs?: number[];
30
+ };
31
+ export type BrowserSessionClient = {
32
+ restore: () => Promise<SessionRestoreResult>;
33
+ refresh: () => Promise<SessionRestoreResult>;
34
+ };
35
+ //# sourceMappingURL=browser-session.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session.types.d.ts","sourceRoot":"","sources":["../../src/types/browser-session.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAEpD,MAAM,MAAM,2BAA2B,GACnC,cAAc,GACd,SAAS,GACT,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,IAAI,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,2BAA2B,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,2BAA2B,GAAG;IACxC,+DAA+D;IAC/D,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC9C,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Cookie-first browser session types (controller HttpOnly refresh cookie).
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AUTH_CONTROLLER_PATHS = exports.AUTH_BROWSER_SESSION_PATHS = void 0;
7
+ var auth_browser_types_1 = require("./auth-browser.types");
8
+ Object.defineProperty(exports, "AUTH_BROWSER_SESSION_PATHS", { enumerable: true, get: function () { return auth_browser_types_1.AUTH_BROWSER_SESSION_PATHS; } });
9
+ Object.defineProperty(exports, "AUTH_CONTROLLER_PATHS", { enumerable: true, get: function () { return auth_browser_types_1.AUTH_CONTROLLER_PATHS; } });
10
+ //# sourceMappingURL=browser-session.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session.types.js","sourceRoot":"","sources":["../../src/types/browser-session.types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2DAG8B;AAF5B,gIAAA,0BAA0B,OAAA;AAC1B,2HAAA,qBAAqB,OAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Browser auth error classification helpers (401, inactive token messages).
3
+ */
4
+ /**
5
+ * Returns true when an API/SDK error represents HTTP 401 Unauthorized.
6
+ */
7
+ export declare function isUnauthorizedApiError(error: unknown): boolean;
8
+ /**
9
+ * Keycloak-style inactive access token message (often surfaced as 400).
10
+ */
11
+ export declare function isInactiveTokenMessage(message: string | null | undefined): boolean;
12
+ /**
13
+ * Session restore failure that should trigger stale-state cleanup before retry.
14
+ */
15
+ export declare function isStaleBrowserSessionFailure(result: {
16
+ ok: boolean;
17
+ reason?: string;
18
+ }): boolean;
19
+ //# sourceMappingURL=auth-browser-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-browser-errors.d.ts","sourceRoot":"","sources":["../../src/utils/auth-browser-errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAuC9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAKV"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Browser auth error classification helpers (401, inactive token messages).
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isUnauthorizedApiError = isUnauthorizedApiError;
7
+ exports.isInactiveTokenMessage = isInactiveTokenMessage;
8
+ exports.isStaleBrowserSessionFailure = isStaleBrowserSessionFailure;
9
+ /**
10
+ * Returns true when an API/SDK error represents HTTP 401 Unauthorized.
11
+ */
12
+ function isUnauthorizedApiError(error) {
13
+ if (error === null || error === undefined) {
14
+ return false;
15
+ }
16
+ const candidate = error;
17
+ if (candidate.status === 401) {
18
+ return true;
19
+ }
20
+ if (candidate.statusCode === 401) {
21
+ return true;
22
+ }
23
+ if (candidate.response?.status === 401) {
24
+ return true;
25
+ }
26
+ if (candidate.response?.statusCode === 401) {
27
+ return true;
28
+ }
29
+ if (candidate.response?.data?.status === 401) {
30
+ return true;
31
+ }
32
+ if (candidate.response?.data?.statusCode === 401) {
33
+ return true;
34
+ }
35
+ const message = candidate.message ?? "";
36
+ return /401|Unauthorized/i.test(message);
37
+ }
38
+ /**
39
+ * Keycloak-style inactive access token message (often surfaced as 400).
40
+ */
41
+ function isInactiveTokenMessage(message) {
42
+ return typeof message === "string" && /token is not active/i.test(message);
43
+ }
44
+ /**
45
+ * Session restore failure that should trigger stale-state cleanup before retry.
46
+ */
47
+ function isStaleBrowserSessionFailure(result) {
48
+ return (!result.ok &&
49
+ (result.reason === "invalid" || result.reason === "unauthorized"));
50
+ }
51
+ //# sourceMappingURL=auth-browser-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-browser-errors.js","sourceRoot":"","sources":["../../src/utils/auth-browser-errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAKH,wDAuCC;AAKD,wDAIC;AAKD,oEAQC;AAhED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,KAAc;IACnD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAWjB,CAAC;IAEF,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,EAAE,UAAU,KAAK,GAAG,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,KAAK,GAAG,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC;IACxC,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CACpC,OAAkC;IAElC,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAgB,4BAA4B,CAAC,MAG5C;IACC,OAAO,CACL,CAAC,MAAM,CAAC,EAAE;QACV,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,CAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Resolve browser API base URL (split-port dev / Vite proxy vs direct controller).
3
+ */
4
+ export type ResolveBrowserApiBaseUrlOptions = {
5
+ /** Highest priority override (e.g. VITE_MISO_API_BASE_URL). */
6
+ explicitMisoApiBaseUrl?: string;
7
+ /** Configured API root (e.g. VITE_API_BASE_URL). */
8
+ configuredApiBaseUrl?: string;
9
+ /** Browser page origin; when omitted, uses window.location.origin when available. */
10
+ pageOrigin?: string;
11
+ /** Optional path prefix merged onto page origin (e.g. Vite BASE_URL). */
12
+ basePath?: string;
13
+ };
14
+ /**
15
+ * When configured API host differs from the page host, use the page origin so
16
+ * requests go through the app proxy (split-port local dev).
17
+ */
18
+ export declare function resolveBrowserApiBaseUrl(options?: ResolveBrowserApiBaseUrlOptions): string;
19
+ //# sourceMappingURL=browser-api-base-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-api-base-url.d.ts","sourceRoot":"","sources":["../../src/utils/browser-api-base-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,+DAA+D;IAC/D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAsCF;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,+BAAoC,GAC5C,MAAM,CAmCR"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * Resolve browser API base URL (split-port dev / Vite proxy vs direct controller).
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveBrowserApiBaseUrl = resolveBrowserApiBaseUrl;
7
+ function trimTrailingSlashes(value) {
8
+ return value.replace(/\/+$/, "");
9
+ }
10
+ function normalizeBasePath(basePath) {
11
+ const raw = (basePath ?? "").trim();
12
+ if (!raw || raw === "/") {
13
+ return "";
14
+ }
15
+ const withLeading = raw.startsWith("/") ? raw : `/${raw}`;
16
+ return trimTrailingSlashes(withLeading);
17
+ }
18
+ function mergeOriginWithBasePath(origin, basePath) {
19
+ const normalizedOrigin = trimTrailingSlashes(origin);
20
+ const path = normalizeBasePath(basePath);
21
+ if (!path) {
22
+ return normalizedOrigin;
23
+ }
24
+ return `${normalizedOrigin}${path}`;
25
+ }
26
+ function readDefaultPageOrigin(basePath) {
27
+ if (typeof globalThis === "undefined") {
28
+ return "";
29
+ }
30
+ const win = globalThis;
31
+ const origin = win.location?.origin;
32
+ if (typeof origin !== "string" || !origin.trim()) {
33
+ return "";
34
+ }
35
+ return mergeOriginWithBasePath(origin, basePath);
36
+ }
37
+ /**
38
+ * When configured API host differs from the page host, use the page origin so
39
+ * requests go through the app proxy (split-port local dev).
40
+ */
41
+ function resolveBrowserApiBaseUrl(options = {}) {
42
+ const explicit = trimTrailingSlashes((options.explicitMisoApiBaseUrl ?? "").trim());
43
+ if (explicit) {
44
+ return explicit;
45
+ }
46
+ const configured = trimTrailingSlashes((options.configuredApiBaseUrl ?? "").trim());
47
+ const pageOrigin = options.pageOrigin !== undefined
48
+ ? trimTrailingSlashes(options.pageOrigin)
49
+ : readDefaultPageOrigin(options.basePath);
50
+ if (!configured) {
51
+ return pageOrigin;
52
+ }
53
+ if (!pageOrigin) {
54
+ return configured;
55
+ }
56
+ try {
57
+ const configuredHost = new URL(configured).host;
58
+ const pageHost = new URL(pageOrigin).host;
59
+ if (configuredHost !== pageHost) {
60
+ return pageOrigin;
61
+ }
62
+ }
63
+ catch {
64
+ return configured;
65
+ }
66
+ return configured;
67
+ }
68
+ //# sourceMappingURL=browser-api-base-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-api-base-url.js","sourceRoot":"","sources":["../../src/utils/browser-api-base-url.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAqDH,4DAqCC;AA7ED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,QAA4B;IACrD,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IAC1D,OAAO,mBAAmB,CAAC,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAc,EAAE,QAAiB;IAChE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,gBAAgB,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAiB;IAC9C,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,UAEX,CAAC;IACF,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACjD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB,CACtC,UAA2C,EAAE;IAE7C,MAAM,QAAQ,GAAG,mBAAmB,CAClC,CAAC,OAAO,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAC9C,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CACpC,CAAC,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAC5C,CAAC;IACF,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,KAAK,SAAS;QAC9B,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC;QACzC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAC1C,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Orchestrated browser session recovery (refresh → restore → stale cleanup → retry).
3
+ */
4
+ import type { UserSessionTokenResult } from "../types/data-client.types";
5
+ import type { BrowserSessionClient, SessionRestoreResult, SessionRestoreSuccess } from "../types/browser-session.types";
6
+ export type RecoverBrowserSessionOptions = {
7
+ client: BrowserSessionClient;
8
+ clearStaleState?: () => void | Promise<void>;
9
+ };
10
+ export declare function resolveSessionExpiresInSeconds(result: SessionRestoreSuccess): number;
11
+ /**
12
+ * Cookie-first silent recovery policy shared by dataplane and DataClient hooks.
13
+ */
14
+ export declare function recoverBrowserSessionWithStaleCleanup(options: RecoverBrowserSessionOptions): Promise<SessionRestoreResult>;
15
+ /**
16
+ * Same as {@link recoverBrowserSessionWithStaleCleanup} mapped to DataClient token shape.
17
+ */
18
+ export declare function recoverBrowserSessionToUserToken(options: RecoverBrowserSessionOptions): Promise<UserSessionTokenResult | null>;
19
+ /**
20
+ * Silent recovery for request retry (throws when recovery fails).
21
+ */
22
+ export declare function recoverBrowserSessionOrThrow(options: RecoverBrowserSessionOptions): Promise<{
23
+ token: string;
24
+ expiresIn: number;
25
+ }>;
26
+ //# sourceMappingURL=browser-session-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-recovery.d.ts","sourceRoot":"","sources":["../../src/utils/browser-session-recovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAIxC,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAcR;AAED;;GAEG;AACH,wBAAsB,qCAAqC,CACzD,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAe/B;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAMxC;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAS/C"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSessionExpiresInSeconds = resolveSessionExpiresInSeconds;
4
+ exports.recoverBrowserSessionWithStaleCleanup = recoverBrowserSessionWithStaleCleanup;
5
+ exports.recoverBrowserSessionToUserToken = recoverBrowserSessionToUserToken;
6
+ exports.recoverBrowserSessionOrThrow = recoverBrowserSessionOrThrow;
7
+ const auth_browser_errors_1 = require("./auth-browser-errors");
8
+ const browser_session_1 = require("./browser-session");
9
+ function resolveSessionExpiresInSeconds(result) {
10
+ if (typeof result.expiresIn === "number" &&
11
+ Number.isFinite(result.expiresIn)) {
12
+ return result.expiresIn;
13
+ }
14
+ if (result.expiresAt) {
15
+ return Math.max(Math.floor((new Date(result.expiresAt).getTime() - Date.now()) / 1000), 0);
16
+ }
17
+ return 0;
18
+ }
19
+ /**
20
+ * Cookie-first silent recovery policy shared by dataplane and DataClient hooks.
21
+ */
22
+ async function recoverBrowserSessionWithStaleCleanup(options) {
23
+ let result = await options.client.refresh();
24
+ if (!result.ok) {
25
+ result = await options.client.restore();
26
+ }
27
+ if ((0, auth_browser_errors_1.isStaleBrowserSessionFailure)(result) && options.clearStaleState) {
28
+ await options.clearStaleState();
29
+ result = await options.client.refresh();
30
+ if (!result.ok) {
31
+ result = await options.client.restore();
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ /**
37
+ * Same as {@link recoverBrowserSessionWithStaleCleanup} mapped to DataClient token shape.
38
+ */
39
+ async function recoverBrowserSessionToUserToken(options) {
40
+ const result = await recoverBrowserSessionWithStaleCleanup(options);
41
+ if (!result.ok) {
42
+ return null;
43
+ }
44
+ return (0, browser_session_1.sessionRestoreToUserToken)(result);
45
+ }
46
+ /**
47
+ * Silent recovery for request retry (throws when recovery fails).
48
+ */
49
+ async function recoverBrowserSessionOrThrow(options) {
50
+ const result = await recoverBrowserSessionWithStaleCleanup(options);
51
+ if (!result.ok) {
52
+ throw new Error("Silent browser re-auth failed");
53
+ }
54
+ return {
55
+ token: result.accessToken,
56
+ expiresIn: resolveSessionExpiresInSeconds(result),
57
+ };
58
+ }
59
+ //# sourceMappingURL=browser-session-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-recovery.js","sourceRoot":"","sources":["../../src/utils/browser-session-recovery.ts"],"names":[],"mappings":";;AAiBA,wEAgBC;AAKD,sFAiBC;AAKD,4EAQC;AAKD,oEAWC;AA3ED,+DAAqE;AACrE,uDAA8D;AAO9D,SAAgB,8BAA8B,CAC5C,MAA6B;IAE7B,IACE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EACjC,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,GAAG,CACb,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EACtE,CAAC,CACF,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,qCAAqC,CACzD,OAAqC;IAErC,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,IAAA,kDAA4B,EAAC,MAAM,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QACpE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gCAAgC,CACpD,OAAqC;IAErC,MAAM,MAAM,GAAG,MAAM,qCAAqC,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAA,2CAAyB,EAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,4BAA4B,CAChD,OAAqC;IAErC,MAAM,MAAM,GAAG,MAAM,qCAAqC,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,WAAW;QACzB,SAAS,EAAE,8BAA8B,CAAC,MAAM,CAAC;KAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Cookie-first browser session restore/refresh against miso-controller.
3
+ */
4
+ import type { UserSessionTokenResult } from "../types/data-client.types";
5
+ import { type BrowserSessionClient, type BrowserSessionClientOptions, type SessionRestoreSuccess } from "../types/browser-session.types";
6
+ /**
7
+ * Create a browser session client (GET session / POST refresh with credentials).
8
+ */
9
+ export declare function createBrowserSessionClient(options: BrowserSessionClientOptions): BrowserSessionClient;
10
+ export declare function sessionRestoreToUserToken(result: SessionRestoreSuccess): UserSessionTokenResult;
11
+ export type CookieSessionCallbacksOptions = BrowserSessionClientOptions & {
12
+ /** Optional hook after a successful restore/refresh (e.g. app in-memory token store). */
13
+ onAccessToken?: (result: SessionRestoreSuccess) => void | Promise<void>;
14
+ };
15
+ /**
16
+ * DataClient hooks for cookie-first controller auth.
17
+ */
18
+ export declare function createCookieSessionCallbacks(options: CookieSessionCallbacksOptions): {
19
+ onSessionRestore: () => Promise<UserSessionTokenResult | null>;
20
+ onTokenRefresh: () => Promise<UserSessionTokenResult | null>;
21
+ };
22
+ export type EnsureBrowserAccessTokenOptions = CookieSessionCallbacksOptions & {
23
+ getAccessToken: () => string | null;
24
+ };
25
+ /**
26
+ * Hydrate access token from cookie when memory is empty (e.g. after full page load).
27
+ */
28
+ export declare function ensureBrowserAccessToken(options: EnsureBrowserAccessTokenOptions): Promise<string | null>;
29
+ //# sourceMappingURL=browser-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../src/utils/browser-session.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAEhC,KAAK,qBAAqB,EAC3B,MAAM,gCAAgC,CAAC;AA+QxC;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAsBtB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,qBAAqB,GAC5B,sBAAsB,CAMxB;AAED,MAAM,MAAM,6BAA6B,GAAG,2BAA2B,GAAG;IACxE,yFAAyF;IACzF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE,CAAC;AAEF;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,6BAA6B,GACrC;IACD,gBAAgB,EAAE,MAAM,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAC/D,cAAc,EAAE,MAAM,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;CAC9D,CAqBA;AAED,MAAM,MAAM,+BAA+B,GAAG,6BAA6B,GAAG;IAC5E,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB"}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBrowserSessionClient = createBrowserSessionClient;
4
+ exports.sessionRestoreToUserToken = sessionRestoreToUserToken;
5
+ exports.createCookieSessionCallbacks = createCookieSessionCallbacks;
6
+ exports.ensureBrowserAccessToken = ensureBrowserAccessToken;
7
+ const browser_session_types_1 = require("../types/browser-session.types");
8
+ const DEFAULT_RETRY_DELAYS_MS = [250, 500, 1000];
9
+ const DEFAULT_TIMEOUT_MS = 10000;
10
+ let restoreSessionInFlight = null;
11
+ let refreshSessionInFlight = null;
12
+ function normalizeExpiresAt(raw) {
13
+ if (typeof raw === "number" && Number.isFinite(raw)) {
14
+ return raw > 10000000000 ? raw : raw * 1000;
15
+ }
16
+ if (typeof raw === "string") {
17
+ const trimmed = raw.trim();
18
+ if (!trimmed)
19
+ return null;
20
+ if (/^\d+$/.test(trimmed)) {
21
+ return normalizeExpiresAt(Number(trimmed));
22
+ }
23
+ const parsed = Date.parse(trimmed);
24
+ return Number.isNaN(parsed) ? null : parsed;
25
+ }
26
+ return null;
27
+ }
28
+ function getNestedRecord(value) {
29
+ return value && typeof value === "object" && !Array.isArray(value)
30
+ ? value
31
+ : null;
32
+ }
33
+ function getSessionPayload(raw) {
34
+ const record = getNestedRecord(raw) ?? {};
35
+ return getNestedRecord(record.data) ?? record;
36
+ }
37
+ function getSessionToken(payload) {
38
+ const token = payload.token ?? payload.accessToken ?? payload.authToken;
39
+ return typeof token === "string" && token ? token : null;
40
+ }
41
+ function resolveTokenExpiresAt(payload, preferredExpiresAt) {
42
+ return (normalizeExpiresAt(preferredExpiresAt) ??
43
+ normalizeExpiresAt(payload.expiresAt) ??
44
+ (typeof payload.expiresIn === "number" && Number.isFinite(payload.expiresIn)
45
+ ? Date.now() + payload.expiresIn * 1000
46
+ : typeof payload.expiresIn === "string" && payload.expiresIn.trim()
47
+ ? Date.now() + Number(payload.expiresIn) * 1000
48
+ : null));
49
+ }
50
+ function buildStatusError(message, status) {
51
+ const error = new Error(message);
52
+ error.status = status;
53
+ return error;
54
+ }
55
+ function getSessionErrorMessage(payload, status) {
56
+ for (const key of ["detail", "message", "title", "error"]) {
57
+ const value = payload[key];
58
+ if (typeof value === "string" && value.trim()) {
59
+ return value.trim();
60
+ }
61
+ }
62
+ return `Browser auth request failed: ${status}`;
63
+ }
64
+ async function readJsonResponse(response) {
65
+ try {
66
+ const text = await response.text();
67
+ if (!text)
68
+ return {};
69
+ const parsed = JSON.parse(text);
70
+ return getNestedRecord(parsed) ?? {};
71
+ }
72
+ catch {
73
+ return {};
74
+ }
75
+ }
76
+ function normalizeSessionFailure(error, fallbackMessage) {
77
+ if (error?.name === "AbortError") {
78
+ return {
79
+ ok: false,
80
+ reason: "network",
81
+ message: "Browser auth request timed out",
82
+ };
83
+ }
84
+ const status = error?.status;
85
+ const message = error instanceof Error ? error.message : fallbackMessage;
86
+ if (status === 401 ||
87
+ (status === 400 && /token is not active/i.test(message))) {
88
+ return { ok: false, status, reason: "unauthorized", message };
89
+ }
90
+ if (status === undefined) {
91
+ return { ok: false, reason: "network", message };
92
+ }
93
+ if (status === 429 || status >= 500) {
94
+ return { ok: false, status, reason: "server", message };
95
+ }
96
+ return { ok: false, status, reason: "invalid", message };
97
+ }
98
+ function isTransientSessionFailure(result) {
99
+ return (!result.ok &&
100
+ (result.reason === "network" ||
101
+ (result.reason === "server" && result.status !== 429)));
102
+ }
103
+ function formatExpiresAtIso(expiresAt) {
104
+ return expiresAt !== null ? new Date(expiresAt).toISOString() : undefined;
105
+ }
106
+ function sleep(ms) {
107
+ return new Promise((resolve) => setTimeout(resolve, ms));
108
+ }
109
+ function resolveSessionEndpoint(options, path) {
110
+ const baseUrl = options.getBaseUrl().replace(/\/+$/, "");
111
+ return baseUrl ? `${baseUrl}${path}` : path;
112
+ }
113
+ function buildSessionFetchInit(method) {
114
+ return {
115
+ method,
116
+ credentials: "include",
117
+ };
118
+ }
119
+ async function fetchWithTimeout(endpoint, init, timeoutMs) {
120
+ const controller = new AbortController();
121
+ const timeoutId = globalThis.setTimeout(() => controller.abort(), timeoutMs);
122
+ try {
123
+ return await fetch(endpoint, { ...init, signal: controller.signal });
124
+ }
125
+ finally {
126
+ globalThis.clearTimeout(timeoutId);
127
+ }
128
+ }
129
+ function parseExpiresIn(payload) {
130
+ if (typeof payload.expiresIn === "number" &&
131
+ Number.isFinite(payload.expiresIn)) {
132
+ return payload.expiresIn;
133
+ }
134
+ if (typeof payload.expiresIn === "string" && payload.expiresIn.trim()) {
135
+ return Number(payload.expiresIn);
136
+ }
137
+ return undefined;
138
+ }
139
+ function parseSessionSuccessPayload(payload) {
140
+ const accessToken = getSessionToken(payload);
141
+ if (!accessToken) {
142
+ return {
143
+ ok: false,
144
+ reason: "invalid",
145
+ message: "Browser auth response did not include an access token",
146
+ };
147
+ }
148
+ const expiresAt = resolveTokenExpiresAt(payload, payload.expiresAt);
149
+ return {
150
+ ok: true,
151
+ accessToken,
152
+ expiresAt: formatExpiresAtIso(expiresAt),
153
+ expiresIn: parseExpiresIn(payload),
154
+ user: getNestedRecord(payload.user) ?? undefined,
155
+ };
156
+ }
157
+ async function executeBrowserSessionAttempt(endpoint, method, timeoutMs) {
158
+ const response = await fetchWithTimeout(endpoint, buildSessionFetchInit(method), timeoutMs);
159
+ if (!response.ok) {
160
+ const errorPayload = await readJsonResponse(response);
161
+ throw buildStatusError(getSessionErrorMessage(errorPayload, response.status), response.status);
162
+ }
163
+ const payload = getSessionPayload(await readJsonResponse(response));
164
+ return parseSessionSuccessPayload(payload);
165
+ }
166
+ async function performBrowserSessionRequest(options, path, method) {
167
+ const endpoint = resolveSessionEndpoint(options, path);
168
+ const retryDelays = options.retryDelaysMs ?? DEFAULT_RETRY_DELAYS_MS;
169
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
170
+ for (let attempt = 0; attempt <= retryDelays.length; attempt += 1) {
171
+ try {
172
+ return await executeBrowserSessionAttempt(endpoint, method, timeoutMs);
173
+ }
174
+ catch (error) {
175
+ const failure = normalizeSessionFailure(error, "Browser auth request failed");
176
+ if (attempt === retryDelays.length ||
177
+ !isTransientSessionFailure(failure)) {
178
+ return failure;
179
+ }
180
+ await sleep(retryDelays[attempt]);
181
+ }
182
+ }
183
+ return {
184
+ ok: false,
185
+ reason: "server",
186
+ message: "Browser auth request failed",
187
+ };
188
+ }
189
+ function dedupeSessionRequest(currentPromise, setPromise, requestFactory) {
190
+ if (currentPromise) {
191
+ return currentPromise;
192
+ }
193
+ const nextPromise = requestFactory().finally(() => {
194
+ setPromise(null);
195
+ });
196
+ setPromise(nextPromise);
197
+ return nextPromise;
198
+ }
199
+ /**
200
+ * Create a browser session client (GET session / POST refresh with credentials).
201
+ */
202
+ function createBrowserSessionClient(options) {
203
+ const sessionPath = options.sessionPath ?? browser_session_types_1.AUTH_BROWSER_SESSION_PATHS.SESSION;
204
+ const refreshPath = options.refreshPath ?? browser_session_types_1.AUTH_BROWSER_SESSION_PATHS.REFRESH;
205
+ return {
206
+ restore: () => dedupeSessionRequest(restoreSessionInFlight, (value) => {
207
+ restoreSessionInFlight = value;
208
+ }, () => performBrowserSessionRequest(options, sessionPath, "GET")),
209
+ refresh: () => dedupeSessionRequest(refreshSessionInFlight, (value) => {
210
+ refreshSessionInFlight = value;
211
+ }, () => performBrowserSessionRequest(options, refreshPath, "POST")),
212
+ };
213
+ }
214
+ function sessionRestoreToUserToken(result) {
215
+ return {
216
+ token: result.accessToken,
217
+ expiresIn: result.expiresIn,
218
+ expiresAt: result.expiresAt,
219
+ };
220
+ }
221
+ /**
222
+ * DataClient hooks for cookie-first controller auth.
223
+ */
224
+ function createCookieSessionCallbacks(options) {
225
+ const client = createBrowserSessionClient(options);
226
+ const mapResult = async (operation) => {
227
+ const result = operation === "restore" ? await client.restore() : await client.refresh();
228
+ if (!result.ok) {
229
+ return null;
230
+ }
231
+ if (options.onAccessToken) {
232
+ await options.onAccessToken(result);
233
+ }
234
+ return sessionRestoreToUserToken(result);
235
+ };
236
+ return {
237
+ onSessionRestore: () => mapResult("restore"),
238
+ onTokenRefresh: () => mapResult("refresh"),
239
+ };
240
+ }
241
+ /**
242
+ * Hydrate access token from cookie when memory is empty (e.g. after full page load).
243
+ */
244
+ async function ensureBrowserAccessToken(options) {
245
+ const existing = options.getAccessToken();
246
+ if (existing) {
247
+ return existing;
248
+ }
249
+ const client = createBrowserSessionClient(options);
250
+ let result = await client.restore();
251
+ if (!result.ok) {
252
+ result = await client.refresh();
253
+ }
254
+ if (!result.ok) {
255
+ return null;
256
+ }
257
+ if (options.onAccessToken) {
258
+ await options.onAccessToken(result);
259
+ }
260
+ return result.accessToken;
261
+ }
262
+ //# sourceMappingURL=browser-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../src/utils/browser-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Extract/remove x-client-token from browser URL query or hash.
3
+ */
4
+ export type ClientTokenUrlSource = {
5
+ href: string;
6
+ search: string;
7
+ hash: string;
8
+ };
9
+ export type ExtractClientTokenFromUrlOptions = {
10
+ /** When omitted, uses window.location in browser environments. */
11
+ location?: ClientTokenUrlSource;
12
+ paramName?: string;
13
+ };
14
+ export type RemoveClientTokenFromUrlOptions = ExtractClientTokenFromUrlOptions & {
15
+ replaceUrl?: (nextHref: string) => void;
16
+ };
17
+ /**
18
+ * Read client token from query string, then hash fragment.
19
+ */
20
+ export declare function extractClientTokenFromUrl(options?: ExtractClientTokenFromUrlOptions): string | null;
21
+ /**
22
+ * Remove client token param from URL without navigation.
23
+ */
24
+ export declare function removeClientTokenFromUrl(options?: RemoveClientTokenFromUrlOptions): void;
25
+ //# sourceMappingURL=client-token-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-token-url.d.ts","sourceRoot":"","sources":["../../src/utils/client-token-url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,kEAAkE;IAClE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GACzC,gCAAgC,GAAG;IACjC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,CAAC;AAqBJ;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gCAAqC,GAC7C,MAAM,GAAG,IAAI,CAmBf;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,+BAAoC,GAC5C,IAAI,CAiCN"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * Extract/remove x-client-token from browser URL query or hash.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.extractClientTokenFromUrl = extractClientTokenFromUrl;
7
+ exports.removeClientTokenFromUrl = removeClientTokenFromUrl;
8
+ function readDefaultLocation() {
9
+ if (typeof globalThis === "undefined") {
10
+ return null;
11
+ }
12
+ const win = globalThis;
13
+ if (!win.location?.href) {
14
+ return null;
15
+ }
16
+ return win.location;
17
+ }
18
+ function extractFromParams(params, paramName) {
19
+ const value = params.get(paramName);
20
+ return value && value.length > 0 ? value : null;
21
+ }
22
+ /**
23
+ * Read client token from query string, then hash fragment.
24
+ */
25
+ function extractClientTokenFromUrl(options = {}) {
26
+ const paramName = options.paramName ?? "x-client-token";
27
+ const location = options.location ?? readDefaultLocation();
28
+ if (!location) {
29
+ return null;
30
+ }
31
+ const fromQuery = extractFromParams(new URLSearchParams(location.search), paramName);
32
+ if (fromQuery) {
33
+ return fromQuery;
34
+ }
35
+ const hashBody = location.hash.startsWith("#")
36
+ ? location.hash.substring(1)
37
+ : location.hash;
38
+ return extractFromParams(new URLSearchParams(hashBody), paramName);
39
+ }
40
+ /**
41
+ * Remove client token param from URL without navigation.
42
+ */
43
+ function removeClientTokenFromUrl(options = {}) {
44
+ const paramName = options.paramName ?? "x-client-token";
45
+ const location = options.location ?? readDefaultLocation();
46
+ if (!location) {
47
+ return;
48
+ }
49
+ const url = new URL(location.href);
50
+ url.searchParams.delete(paramName);
51
+ if (url.hash) {
52
+ const hashBody = url.hash.startsWith("#")
53
+ ? url.hash.substring(1)
54
+ : url.hash;
55
+ const hashParams = new URLSearchParams(hashBody);
56
+ hashParams.delete(paramName);
57
+ url.hash = hashParams.toString() ? `#${hashParams.toString()}` : "";
58
+ }
59
+ const nextHref = url.toString();
60
+ if (options.replaceUrl) {
61
+ options.replaceUrl(nextHref);
62
+ return;
63
+ }
64
+ const history = globalThis.history;
65
+ history?.replaceState?.({}, "", nextHref);
66
+ }
67
+ //# sourceMappingURL=client-token-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-token-url.js","sourceRoot":"","sources":["../../src/utils/client-token-url.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Align loopback hostnames with the browser page (localhost vs 127.0.0.1).
3
+ */
4
+ export type AlignLoopbackHostnameOptions = {
5
+ /** Test hook: override detected page hostname. */
6
+ pageHostname?: string;
7
+ };
8
+ /**
9
+ * When the app is on localhost, rewrite 127.0.0.1 → localhost (same port/path).
10
+ * When the app is on 127.0.0.1, rewrite localhost → 127.0.0.1.
11
+ */
12
+ export declare function alignLoopbackHostnameWithPage(url: string, options?: AlignLoopbackHostnameOptions): string;
13
+ //# sourceMappingURL=loopback-host-alignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback-host-alignment.d.ts","sourceRoot":"","sources":["../../src/utils/loopback-host-alignment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,4BAA4B,GAAG;IACzC,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAcF;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAyBR"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /**
3
+ * Align loopback hostnames with the browser page (localhost vs 127.0.0.1).
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.alignLoopbackHostnameWithPage = alignLoopbackHostnameWithPage;
7
+ function readBrowserHostname() {
8
+ if (typeof globalThis === "undefined") {
9
+ return null;
10
+ }
11
+ const win = globalThis;
12
+ const hostname = win.location?.hostname;
13
+ if (typeof hostname !== "string" || !hostname.trim()) {
14
+ return null;
15
+ }
16
+ return hostname.toLowerCase();
17
+ }
18
+ /**
19
+ * When the app is on localhost, rewrite 127.0.0.1 → localhost (same port/path).
20
+ * When the app is on 127.0.0.1, rewrite localhost → 127.0.0.1.
21
+ */
22
+ function alignLoopbackHostnameWithPage(url, options = {}) {
23
+ const raw = (url || "").trim();
24
+ if (!raw || !/^https?:\/\//i.test(raw)) {
25
+ return raw;
26
+ }
27
+ const pageHost = (options.pageHostname ?? readBrowserHostname())?.toLowerCase();
28
+ if (!pageHost) {
29
+ return raw;
30
+ }
31
+ try {
32
+ const parsed = new URL(raw);
33
+ const targetHost = parsed.hostname.toLowerCase();
34
+ if (pageHost === "localhost" && targetHost === "127.0.0.1") {
35
+ parsed.hostname = "localhost";
36
+ }
37
+ else if (pageHost === "127.0.0.1" && targetHost === "localhost") {
38
+ parsed.hostname = "127.0.0.1";
39
+ }
40
+ return parsed.href.replace(/\/$/, "") || parsed.href;
41
+ }
42
+ catch {
43
+ return raw;
44
+ }
45
+ }
46
+ //# sourceMappingURL=loopback-host-alignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback-host-alignment.js","sourceRoot":"","sources":["../../src/utils/loopback-host-alignment.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAuBH,sEA4BC;AA5CD,SAAS,mBAAmB;IAC1B,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,UAAkD,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAgB,6BAA6B,CAC3C,GAAW,EACX,UAAwC,EAAE;IAE1C,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,CACf,OAAO,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAC9C,EAAE,WAAW,EAAE,CAAC;IACjB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,QAAQ,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC3D,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;QAChC,CAAC;aAAM,IAAI,QAAQ,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAClE,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aifabrix/miso-client",
3
- "version": "4.15.4",
3
+ "version": "4.17.0",
4
4
  "description": "AI Fabrix Client SDK - Authentication, authorization, logging, and Express.js utilities",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",