@c1m-public/platform-auth 0.8.1 → 0.8.3

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.
@@ -308,6 +308,16 @@ function createHandoffSource(config) {
308
308
  // src/session-refresh.ts
309
309
  var DEFAULT_TTL_MS = 5e3;
310
310
  var DEFAULT_MAX = 1e3;
311
+ function parseRefreshEnvelope(value) {
312
+ if (!value || typeof value !== "object") return null;
313
+ const outer = value;
314
+ const payload = outer.data && typeof outer.data === "object" ? outer.data : value;
315
+ if (typeof payload.access_token !== "string" || !payload.access_token) return null;
316
+ return {
317
+ accessToken: payload.access_token,
318
+ refreshToken: typeof payload.refresh_token === "string" && payload.refresh_token ? payload.refresh_token : void 0
319
+ };
320
+ }
311
321
  function createSessionRefresher(config) {
312
322
  const ttl = config.singleflightTtlMs ?? DEFAULT_TTL_MS;
313
323
  const max = config.maxSingleflights ?? DEFAULT_MAX;
@@ -330,8 +340,8 @@ function createSessionRefresher(config) {
330
340
  fetch: config.fetch
331
341
  });
332
342
  if (!response.ok) return null;
333
- const data = parseAuthResponse(await response.json());
334
- return data && hasTokenAudience(data.access_token, config.audience) ? { accessToken: data.access_token, refreshToken: data.refresh_token } : null;
343
+ const refreshed = parseRefreshEnvelope(await response.json());
344
+ return refreshed && hasTokenAudience(refreshed.accessToken, config.audience) ? refreshed : null;
335
345
  } catch {
336
346
  return null;
337
347
  }
@@ -391,4 +401,4 @@ async function evaluateSessionGate(input) {
391
401
  return { kind: "redirect_login" };
392
402
  }
393
403
 
394
- export { AUTH_ERROR_MESSAGES, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, SSO_ERROR_MESSAGES, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, isAuthErrorCode, isHandoffErrorCode, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath };
404
+ export { AUTH_ERROR_MESSAGES, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, SSO_ERROR_MESSAGES, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, isAuthErrorCode, isHandoffErrorCode, parseRefreshEnvelope, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath };
package/dist/index.d.ts CHANGED
@@ -189,6 +189,13 @@ interface SessionRefresherConfig {
189
189
  fetchTimeoutMs?: number;
190
190
  fetch?: typeof fetch;
191
191
  }
192
+ /**
193
+ * Two refresh envelopes exist: the platform one (flat, with token_type and
194
+ * expires_at) and the end-user one (`{ data: { access_token, refresh_token? } }`,
195
+ * where a rotated refresh token is optional). Both carry the access token the
196
+ * same way; that is all a refresh needs.
197
+ */
198
+ declare function parseRefreshEnvelope(value: unknown): RefreshedSession | null;
192
199
  declare function createSessionRefresher(config: SessionRefresherConfig): {
193
200
  refresh(refreshToken: string): Promise<RefreshedSession | null>;
194
201
  size(): number;
@@ -221,4 +228,4 @@ interface SessionGateInput {
221
228
  }
222
229
  declare function evaluateSessionGate(input: SessionGateInput): Promise<SessionGateDecision>;
223
230
 
224
- export { AUTH_ERROR_MESSAGES, type AuthResponse, type CookieOptions, type DeviceIdentity, type DeviceIdentityConfig, type DeviceIdentityStore, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, type HandoffSource, type HandoffSourceConfig, type HandoffSourceTarget, type HandoffTarget, type HandoffTargetConfig, type RefreshedSession, SSO_ERROR_MESSAGES, type SessionData, type SessionGateDecision, type SessionGateInput, type SessionRefresher, type SessionRefresherConfig, type SessionUser, type TokenPayload, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, decodeBase64Url, decodeDefaultSession, decodeTokenPayload, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, hasTokenAudience, isAuthErrorCode, isHandoffErrorCode, isTokenExpired, isTokenExpiringSoon, parseAuthResponse, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath, tokenMaxAgeSeconds };
231
+ export { AUTH_ERROR_MESSAGES, type AuthResponse, type CookieOptions, type DeviceIdentity, type DeviceIdentityConfig, type DeviceIdentityStore, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, type HandoffSource, type HandoffSourceConfig, type HandoffSourceTarget, type HandoffTarget, type HandoffTargetConfig, type RefreshedSession, SSO_ERROR_MESSAGES, type SessionData, type SessionGateDecision, type SessionGateInput, type SessionRefresher, type SessionRefresherConfig, type SessionUser, type TokenPayload, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, decodeBase64Url, decodeDefaultSession, decodeTokenPayload, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, hasTokenAudience, isAuthErrorCode, isHandoffErrorCode, isTokenExpired, isTokenExpiringSoon, parseAuthResponse, parseRefreshEnvelope, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath, tokenMaxAgeSeconds };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { AUTH_ERROR_MESSAGES, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, SSO_ERROR_MESSAGES, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, isAuthErrorCode, isHandoffErrorCode, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath } from './chunk-GQ36R3RQ.js';
1
+ export { AUTH_ERROR_MESSAGES, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, SSO_ERROR_MESSAGES, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, isAuthErrorCode, isHandoffErrorCode, parseRefreshEnvelope, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath } from './chunk-Q7YI7RMG.js';
2
2
  export { decodeBase64Url, decodeDefaultSession, decodeTokenPayload, hasTokenAudience, isTokenExpired, isTokenExpiringSoon, parseAuthResponse, tokenMaxAgeSeconds } from './chunk-FBC2NUH7.js';
3
3
  export { applyForwardedClientHeaders, forwardedRequestHeaders } from './chunk-ZWSJVE5S.js';
package/dist/next.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { SessionData, CookieOptions } from './index.js';
2
- export { AUTH_ERROR_MESSAGES, AuthResponse, DeviceIdentity, DeviceIdentityConfig, DeviceIdentityStore, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, HandoffSource, HandoffSourceConfig, HandoffSourceTarget, HandoffTarget, HandoffTargetConfig, RefreshedSession, SSO_ERROR_MESSAGES, SessionGateDecision, SessionGateInput, SessionRefresher, SessionRefresherConfig, SessionUser, TokenPayload, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, decodeBase64Url, decodeDefaultSession, decodeTokenPayload, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, hasTokenAudience, isAuthErrorCode, isHandoffErrorCode, isTokenExpired, isTokenExpiringSoon, parseAuthResponse, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath, tokenMaxAgeSeconds } from './index.js';
2
+ export { AUTH_ERROR_MESSAGES, AuthResponse, DeviceIdentity, DeviceIdentityConfig, DeviceIdentityStore, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, HandoffSource, HandoffSourceConfig, HandoffSourceTarget, HandoffTarget, HandoffTargetConfig, RefreshedSession, SSO_ERROR_MESSAGES, SessionGateDecision, SessionGateInput, SessionRefresher, SessionRefresherConfig, SessionUser, TokenPayload, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, decodeBase64Url, decodeDefaultSession, decodeTokenPayload, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, hasTokenAudience, isAuthErrorCode, isHandoffErrorCode, isTokenExpired, isTokenExpiringSoon, parseAuthResponse, parseRefreshEnvelope, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath, tokenMaxAgeSeconds } from './index.js';
3
3
  export { applyForwardedClientHeaders, forwardedRequestHeaders } from '@c1m-public/transport';
4
4
  import { R as Resolvable, A as AsyncResolvable } from './internal-D6RafCm2.js';
5
5
 
package/dist/next.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createSessionRefresher, setCookie, deleteCookie } from './chunk-GQ36R3RQ.js';
2
- export { AUTH_ERROR_MESSAGES, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, SSO_ERROR_MESSAGES, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, isAuthErrorCode, isHandoffErrorCode, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath } from './chunk-GQ36R3RQ.js';
1
+ import { createSessionRefresher, setCookie, deleteCookie } from './chunk-Q7YI7RMG.js';
2
+ export { AUTH_ERROR_MESSAGES, HANDOFF_ERROR_FALLBACK, HANDOFF_ERROR_MESSAGES, SSO_ERROR_MESSAGES, authErrorMessage, brokerPaths, createDeviceIdentity, createHandoffSource, createHandoffTarget, createSessionRefresher, deleteCookie, evaluateSessionGate, handoffErrorMessage, hasSessionShape, isAuthErrorCode, isHandoffErrorCode, parseRefreshEnvelope, readCookie, safeInternalPath, serializeCookie, setCookie, sourceStartPath } from './chunk-Q7YI7RMG.js';
3
3
  import { decodeDefaultSession, tokenMaxAgeSeconds, hasTokenAudience, isTokenExpiringSoon, isTokenExpired } from './chunk-FBC2NUH7.js';
4
4
  export { decodeBase64Url, decodeDefaultSession, decodeTokenPayload, hasTokenAudience, isTokenExpired, isTokenExpiringSoon, parseAuthResponse, tokenMaxAgeSeconds } from './chunk-FBC2NUH7.js';
5
5
  import { applyForwardedClientHeaders, resolveValue } from './chunk-ZWSJVE5S.js';
@@ -83,7 +83,7 @@ function isTimeout(error) {
83
83
  return error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError");
84
84
  }
85
85
  function createPlatformFetch(config) {
86
- const doFetch = config.fetch ?? globalThis.fetch;
86
+ const doFetch = (input, init) => (config.fetch ?? globalThis.fetch)(input, init);
87
87
  const forward = config.forwardHeaders ?? buildForwardedRequestHeaders;
88
88
  async function fetchWithAccessToken(path, accessToken, init) {
89
89
  try {
@@ -189,7 +189,7 @@ function createSessionStore(config) {
189
189
  }
190
190
  function assertAudience(token) {
191
191
  if (!hasTokenAudience(token, config.audience)) {
192
- throw new Error(`refusing to store a session token that is not for ${config.audience}`);
192
+ throw new Error(`refusing to store a session token with the wrong audience (expected ${config.audience})`);
193
193
  }
194
194
  }
195
195
  function acceptable(token) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c1m-public/platform-auth",
3
- "version": "0.8.1",
3
+ "version": "0.8.3",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Session and authorization helpers for C1M platform surfaces. The root is runtime-neutral (Web Request/Response): token/session reads, the first-party handoff (PKCE target + source), proxy session gate and coalesced refresh; ./next adds the server-only guard; ./access carries the resolved access snapshot, typed permission keys, predicates, a Next loader and React bindings",