@securitydept/session-context-client 0.3.0-beta.5 → 0.3.0-beta.6

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/dist/index.d.mts CHANGED
@@ -1,7 +1,4 @@
1
1
  import { CancellationTokenOptions, DisposableTrait, ErrorSummary, EventStreamTrait, FoundationEnvironment, IdentityPrincipal, OperationSpanTrait, ReadableSignalTrait, ResourceSnapshot, ResourceTrait, SYMBOL_DISPOSE, SecuritydeptInjectorTrait, SecuritydeptProvider, SpanTrait } from "@securitydept/client";
2
- import * as _$arktype from "arktype";
3
- import * as _$arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
4
-
5
2
  //#region src/types.d.ts
6
3
  declare const SessionContextErrorCode: {
7
4
  readonly OperationFailed: "session.operation_failed";
@@ -148,9 +145,9 @@ declare class SessionContextClient implements DisposableTrait {
148
145
  declare function parseSessionInfoPayload(body: unknown): SessionInfo;
149
146
  //#endregion
150
147
  //#region src/contracts/schemas.d.ts
151
- declare const SessionInfoSchema: _$arktype_internal_variants_object_ts0.ObjectType<(In: {
148
+ declare const SessionInfoSchema: import("arktype/internal/variants/object.ts").ObjectType<(In: {
152
149
  [x: string]: any;
153
- }) => _$arktype.Out<SessionInfo>, {}>;
150
+ }) => import("arktype").Out<SessionInfo>, {}>;
154
151
  declare const SessionUserInfoResponseSchema: any;
155
152
  //#endregion
156
153
  //#region src/providers.d.ts
package/dist/index.mjs CHANGED
@@ -266,7 +266,14 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
266
266
  }
267
267
  };
268
268
  }
269
- let _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _initProto;
269
+ let _dec;
270
+ let _dec1;
271
+ let _dec2;
272
+ let _dec3;
273
+ let _dec4;
274
+ let _dec5;
275
+ let _dec6;
276
+ let _initProto;
270
277
  const POST_AUTH_REDIRECT_PARAM = "post_auth_redirect_uri";
271
278
  const instrumentSessionMethod = defineInstrumentMethodDecorator(({ factoryArgs: [operation] }) => function() {
272
279
  return {
@@ -560,7 +567,8 @@ _dec = instrumentSessionMethod("start"), _dec1 = withDisposableStack(0, true), _
560
567
  async _executeLogout(cancellationToken, operationSpan) {
561
568
  cancellationToken.throwIfCancellationRequested();
562
569
  this._operationSignals.logoutPending.set(true);
563
- const loadingSnapshot = reduceResourceSnapshot(this._sessionSnapshotSignal.get(), { kind: ResourceSnapshotUpdateKind.Load });
570
+ const previous = this._sessionSnapshotSignal.get();
571
+ const loadingSnapshot = reduceResourceSnapshot(previous, { kind: ResourceSnapshotUpdateKind.Load });
564
572
  this._sessionSnapshotSignal.set(loadingSnapshot);
565
573
  this._emitSessionEvent({
566
574
  type: SessionContextEventType.SessionLogoutStarted,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["SessionContextErrorCode","OperationFailed","ClientDisposed","RouterUnavailable","InvalidSessionPayload","SessionContextSource","SessionContext","SessionContextEventType","SessionRefreshStarted","SessionRefreshSucceeded","SessionRefreshFailed","SessionLogoutStarted","SessionLogoutSucceeded","SessionLogoutFailed","IdentityPrincipalSchema","IdentityPrincipalWireSchema","type","defineType","SessionInfoSchema","principal","pipe","input","attributes","extra","SessionUserInfoResponseSchema","ClientError","ClientErrorKind","formatValidationFailure","validateWithSchemaSync","SessionContextErrorCode","SessionContextSource","SessionInfoSchema","SessionUserInfoResponseSchema","parseSessionInfoPayload","body","infoResult","success","value","userInfoResult","failure","issues","issueSummary","kind","Protocol","code","InvalidSessionPayload","message","source","SessionContext","cause","SecuritydeptInjectionToken","SESSION_CONTEXT_CLIENT","SESSION_CONTEXT_CLIENT_CONFIG","ClientError","ClientErrorKind","createCancellationTokenSource","createLinkedCancellationToken","createOnceAsyncLockCallable","createSignal","defineInstrumentMethodDecorator","describeError","ENVIRONMENT_TOKEN","injectDisposableStackFrom","mapResource","ResourceSnapshotUpdateKind","ResourceStatus","RouterNavigationIntent","RouterNavigationMode","readonlySignal","reduceResourceSnapshot","resourceFromSnapshots","SecuritydeptDestroyRef","SYMBOL_DISPOSE","UriReferenceString","withDisposableStack","commandResponseData","concatCommand","dispatchCommandLocallyToStream","RxEventReplaySubject","RxEventSubject","RxStateSignal","filter","from","lastValueFrom","take","takeUntil","v7","uuidv7","parseSessionInfoPayload","SESSION_CONTEXT_CLIENT_CONFIG","SessionContextErrorCode","SessionContextEventType","SessionContextSource","POST_AUTH_REDIRECT_PARAM","instrumentSessionMethod","factoryArgs","operation","environment","span","name","config","tracing","prefix","target","fields","normalizeError","error","fromUnknown","code","OperationFailed","message","source","SessionContext","SessionContextClient","start","refresh","_refresh","logout","_logout","loginWithRedirect","_loginWithRedirect","defaultOptions","loginPath","logoutPath","userInfoPath","_environment","_config","_span","_rootCancellation","_destroyed","fromInitialValue","destroyed$","pipe","value","_sessionSnapshotSignal","status","Idle","_operationSignals","startPending","refreshPending","logoutPending","loginRedirectPending","_eventSubject","_refreshCommandSubject","_refreshResponseSubject","_logoutCommandSubject","_logoutResponseSubject","_startOnce","cancellationToken","operationSpan","throwIfCancellationRequested","set","_dispatchRefresh","id","sessionSnapshot","sessionResource","isAuthenticated","sessionOperations","events","fromEnvironmentConfig","options","fromInjector","injector","client","get","onDestroy","dispose","baseUrl","replace","fork","attributes","clientName","sessionInfo","subscribe","cancel","kind","Cancelled","ClientDisposed","command","_executeRefresh","_executeLogout","autoStart","catch","token","disposableStack","use","_dispatchLogout","_operationSpan","router","Configuration","RouterUnavailable","navigate","url","parse","_createLoginRedirectUrl","postAuthRedirectUri","intent","AuthRedirect","mode","External","payload","undefined","requestStream","responseStream","createCommandExtra","previous","previousValue","Reloading","Resolved","Error","loadingSnapshot","Load","_emitSessionEvent","type","SessionRefreshStarted","session","_fetchSessionInfo","Resolve","setAttributes","authenticated","SessionRefreshSucceeded","Fail","SessionRefreshFailed","errorSummary","SessionLogoutStarted","_readCurrentSession","response","transport","execute","_createLogoutUrl","method","headers","body","JSON","stringify","fromHttpResponse","SessionLogoutSucceeded","SessionLogoutFailed","base","params","URLSearchParams","toString","snapshot","input","next","at","time","now","INJECTOR_TOKEN","SessionContextClient","SESSION_CONTEXT_CLIENT","SESSION_CONTEXT_CLIENT_CONFIG","provideSessionContext","options","provide","useValue","config","useFactory","injector","fromInjector","deps"],"sources":["../src/types.ts","../src/contracts/schemas.ts","../src/contracts/parsers.ts","../src/tokens.ts","../src/client.ts","../src/providers.ts"],"sourcesContent":["import {\n\ttype CancellationTokenOptions,\n\ttype ErrorSummary,\n\ttype IdentityPrincipal,\n} from \"@securitydept/client\";\n\n// --- Session Context Client types ---\n\nexport const SessionContextErrorCode = {\n\tOperationFailed: \"session.operation_failed\",\n\tClientDisposed: \"session.client_disposed\",\n\tRouterUnavailable: \"session.router_unavailable\",\n\tInvalidSessionPayload: \"session.invalid_user_info_payload\",\n} as const;\n\nexport type SessionContextErrorCode =\n\t(typeof SessionContextErrorCode)[keyof typeof SessionContextErrorCode];\n\nexport const SessionContextSource = {\n\tSessionContext: \"session-context\",\n} as const;\n\nexport type SessionContextSource =\n\t(typeof SessionContextSource)[keyof typeof SessionContextSource];\n\n/** Session principal — shared authenticated principal semantics via @securitydept/client. */\nexport type SessionPrincipal = IdentityPrincipal;\n\n/** Session info returned from the server. */\nexport interface SessionInfo {\n\tprincipal: SessionPrincipal;\n\tattributes?: Record<string, unknown>;\n\textra?: Record<string, unknown>;\n}\n\nexport interface SessionContextClientTracingOptions {\n\ttarget?: string;\n\tprefix?: string;\n}\n\nexport interface SessionContextOperationOptions\n\textends CancellationTokenOptions {}\n\nexport interface SessionLoginWithRedirectOptions\n\textends CancellationTokenOptions {\n\tpostAuthRedirectUri?: string;\n}\n\n/** Configuration for the Session Context Client. */\nexport interface SessionContextClientConfig {\n\tid?: string;\n\t/** Base URL of the SecurityDept server. */\n\tbaseUrl: string;\n\t/** Login path (default: \"/auth/session/login\"). */\n\tloginPath?: string;\n\t/** Logout path (default: \"/auth/session/logout\"). */\n\tlogoutPath?: string;\n\t/** User info endpoint path (default: \"/auth/session/user-info\"). */\n\tuserInfoPath?: string;\n\tautoStart?: boolean;\n\ttracing?: SessionContextClientTracingOptions;\n}\n\nexport interface ResolvedSessionContextClientConfig {\n\tid: string;\n\tbaseUrl: string;\n\tloginPath: string;\n\tlogoutPath: string;\n\tuserInfoPath: string;\n\ttracing: Required<SessionContextClientTracingOptions>;\n}\n\nexport const SessionContextEventType = {\n\tSessionRefreshStarted: \"session.refresh.started\",\n\tSessionRefreshSucceeded: \"session.refresh.succeeded\",\n\tSessionRefreshFailed: \"session.refresh.failed\",\n\tSessionLogoutStarted: \"session.logout.started\",\n\tSessionLogoutSucceeded: \"session.logout.succeeded\",\n\tSessionLogoutFailed: \"session.logout.failed\",\n} as const;\n\nexport type SessionContextEventType =\n\t(typeof SessionContextEventType)[keyof typeof SessionContextEventType];\n\nexport interface SessionContextEvent {\n\ttype: SessionContextEventType;\n\tat: number;\n\tclient: {\n\t\tid: string;\n\t};\n\tsession?: SessionInfo | null;\n\terrorSummary?: ErrorSummary;\n}\n","import {\n\tIdentityPrincipalSchema,\n\tIdentityPrincipalWireSchema,\n} from \"@securitydept/client\";\nimport { type as defineType } from \"arktype\";\nimport { type SessionInfo } from \"../types\";\n\nexport const SessionInfoSchema = defineType({\n\tprincipal: IdentityPrincipalSchema,\n\t\"attributes?\": \"object\",\n\t\"extra?\": \"object\",\n}).pipe(\n\t(input): SessionInfo => ({\n\t\tprincipal: input.principal,\n\t\tattributes: input.attributes as Record<string, unknown> | undefined,\n\t\textra: input.extra as Record<string, unknown> | undefined,\n\t}),\n);\n\nexport const SessionUserInfoResponseSchema = IdentityPrincipalWireSchema.pipe(\n\t(principal): SessionInfo => ({ principal }),\n);\n","import {\n\tClientError,\n\tClientErrorKind,\n\tformatValidationFailure,\n\tvalidateWithSchemaSync,\n} from \"@securitydept/client\";\nimport {\n\tSessionContextErrorCode,\n\tSessionContextSource,\n\ttype SessionInfo,\n} from \"../types\";\nimport { SessionInfoSchema, SessionUserInfoResponseSchema } from \"./schemas\";\n\nexport function parseSessionInfoPayload(body: unknown): SessionInfo {\n\tconst infoResult = validateWithSchemaSync(SessionInfoSchema, body);\n\tif (infoResult.success) {\n\t\treturn infoResult.value;\n\t}\n\n\tconst userInfoResult = validateWithSchemaSync(\n\t\tSessionUserInfoResponseSchema,\n\t\tbody,\n\t);\n\tif (userInfoResult.success) {\n\t\treturn userInfoResult.value;\n\t}\n\n\tconst failure = {\n\t\tsuccess: false as const,\n\t\tissues: [...infoResult.issues, ...userInfoResult.issues],\n\t};\n\tconst issueSummary = formatValidationFailure(failure);\n\tthrow new ClientError({\n\t\tkind: ClientErrorKind.Protocol,\n\t\tcode: SessionContextErrorCode.InvalidSessionPayload,\n\t\tmessage: issueSummary\n\t\t\t? `Session /user-info payload is invalid: ${issueSummary}.`\n\t\t\t: \"Session /user-info payload is invalid.\",\n\t\tsource: SessionContextSource.SessionContext,\n\t\tcause: failure.issues,\n\t});\n}\n","import { SecuritydeptInjectionToken } from \"@securitydept/client\";\nimport { type SessionContextClient } from \"./client\";\nimport { type SessionContextClientConfig } from \"./types\";\n\nexport const SESSION_CONTEXT_CLIENT =\n\tnew SecuritydeptInjectionToken<SessionContextClient>(\n\t\t\"SESSION_CONTEXT_CLIENT\",\n\t);\n\nexport const SESSION_CONTEXT_CLIENT_CONFIG =\n\tnew SecuritydeptInjectionToken<SessionContextClientConfig>(\n\t\t\"SESSION_CONTEXT_CLIENT_CONFIG\",\n\t);\n","import {\n\ttype CancellationTokenSourceTrait,\n\ttype CancellationTokenTrait,\n\tClientError,\n\tClientErrorKind,\n\tcreateCancellationTokenSource,\n\tcreateLinkedCancellationToken,\n\tcreateOnceAsyncLockCallable,\n\tcreateSignal,\n\ttype DisposableTrait,\n\tdefineInstrumentMethodDecorator,\n\tdescribeError,\n\tENVIRONMENT_TOKEN,\n\ttype EventStreamTrait,\n\ttype FoundationEnvironment,\n\tinjectDisposableStackFrom,\n\tmapResource,\n\ttype OperationSpanTrait,\n\ttype ReadableSignalTrait,\n\ttype ResourceSnapshot,\n\tResourceSnapshotUpdateKind,\n\tResourceStatus,\n\ttype ResourceTrait,\n\tRouterNavigationIntent,\n\tRouterNavigationMode,\n\treadonlySignal,\n\treduceResourceSnapshot,\n\tresourceFromSnapshots,\n\tSecuritydeptDestroyRef,\n\ttype SecuritydeptInjectorTrait,\n\ttype SpanTrait,\n\tSYMBOL_DISPOSE,\n\tUriReferenceString,\n\ttype WritableSignalTrait,\n\twithDisposableStack,\n} from \"@securitydept/client\";\nimport {\n\ttype Command,\n\ttype CommandResponse,\n\tcommandResponseData,\n\tconcatCommand,\n\tdispatchCommandLocallyToStream,\n\tRxEventReplaySubject,\n\tRxEventSubject,\n\tRxStateSignal,\n} from \"@securitydept/client/rx\";\nimport { filter, from, lastValueFrom, take, takeUntil } from \"rxjs\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { parseSessionInfoPayload } from \"./contracts/parsers\";\nimport { SESSION_CONTEXT_CLIENT_CONFIG } from \"./tokens\";\nimport {\n\ttype ResolvedSessionContextClientConfig,\n\ttype SessionContextClientConfig,\n\tSessionContextErrorCode,\n\ttype SessionContextEvent,\n\tSessionContextEventType,\n\ttype SessionContextOperationOptions,\n\tSessionContextSource,\n\ttype SessionInfo,\n\ttype SessionLoginWithRedirectOptions,\n} from \"./types\";\n\ninterface SessionContextOperationSignals {\n\treadonly startPending: ReadableSignalTrait<boolean>;\n\treadonly refreshPending: ReadableSignalTrait<boolean>;\n\treadonly logoutPending: ReadableSignalTrait<boolean>;\n\treadonly loginRedirectPending: ReadableSignalTrait<boolean>;\n}\n\ninterface SessionCommandExtra {\n\tcancellationToken: CancellationTokenTrait;\n\toperationSpan?: OperationSpanTrait;\n}\n\ntype SessionRefreshCommand = Command<void, SessionCommandExtra>;\ntype SessionLogoutCommand = Command<void, SessionCommandExtra>;\n\nconst POST_AUTH_REDIRECT_PARAM = \"post_auth_redirect_uri\";\n\nconst instrumentSessionMethod = defineInstrumentMethodDecorator<\n\t[operation: string],\n\tSessionContextClient\n>(\n\t({ factoryArgs: [operation] }) =>\n\t\tfunction (this: SessionContextClient) {\n\t\t\treturn {\n\t\t\t\tenvironment: this.environment,\n\t\t\t\tspan: this.span,\n\t\t\t\tname: `${this.config.tracing.prefix}.${operation}`,\n\t\t\t\ttarget: this.config.tracing.target,\n\t\t\t\tfields: { operation },\n\t\t\t\tnormalizeError: (error: unknown) =>\n\t\t\t\t\tClientError.fromUnknown(error, {\n\t\t\t\t\t\tcode: SessionContextErrorCode.OperationFailed,\n\t\t\t\t\t\tmessage: \"The session operation failed unexpectedly\",\n\t\t\t\t\t\tsource: SessionContextSource.SessionContext,\n\t\t\t\t\t}),\n\t\t\t};\n\t\t},\n);\n\n/**\n * Session Context Client.\n *\n * Owns session state, lifecycle, login/logout navigation, and tracing.\n * Host capabilities are resolved once through FoundationEnvironment at\n * construction time.\n */\nexport class SessionContextClient implements DisposableTrait {\n\tstatic defaultOptions = {\n\t\tloginPath: \"/auth/session/login\",\n\t\tlogoutPath: \"/auth/session/logout\",\n\t\tuserInfoPath: \"/auth/session/user-info\",\n\t\ttracing: {\n\t\t\ttarget: \"session-context-client\",\n\t\t\tprefix: \"session_context\",\n\t\t},\n\t} as const;\n\n\tprivate readonly _environment: FoundationEnvironment;\n\tprivate readonly _config: ResolvedSessionContextClientConfig;\n\tprivate readonly _span: SpanTrait;\n\tprivate readonly _rootCancellation: CancellationTokenSourceTrait =\n\t\tcreateCancellationTokenSource();\n\tprivate readonly _destroyed = RxStateSignal.fromInitialValue(false);\n\tprivate readonly destroyed$ = from(this._destroyed).pipe(\n\t\tfilter((value): value is true => value),\n\t\ttake(1),\n\t);\n\tprivate readonly _sessionSnapshotSignal = RxStateSignal.fromInitialValue<\n\t\tResourceSnapshot<SessionInfo | null>\n\t>({ status: ResourceStatus.Idle });\n\tprivate readonly _operationSignals: {\n\t\treadonly startPending: WritableSignalTrait<boolean>;\n\t\treadonly refreshPending: WritableSignalTrait<boolean>;\n\t\treadonly logoutPending: WritableSignalTrait<boolean>;\n\t\treadonly loginRedirectPending: WritableSignalTrait<boolean>;\n\t} = {\n\t\tstartPending: createSignal(false),\n\t\trefreshPending: createSignal(false),\n\t\tlogoutPending: createSignal(false),\n\t\tloginRedirectPending: createSignal(false),\n\t};\n\tprivate readonly _eventSubject =\n\t\tnew RxEventReplaySubject<SessionContextEvent>(100);\n\tprivate readonly _refreshCommandSubject =\n\t\tnew RxEventSubject<SessionRefreshCommand>();\n\tprivate readonly _refreshResponseSubject = new RxEventSubject<\n\t\tCommandResponse<SessionRefreshCommand, SessionInfo | null>\n\t>();\n\tprivate readonly _logoutCommandSubject =\n\t\tnew RxEventSubject<SessionLogoutCommand>();\n\tprivate readonly _logoutResponseSubject = new RxEventSubject<\n\t\tCommandResponse<SessionLogoutCommand, void>\n\t>();\n\tprivate readonly _startOnce = createOnceAsyncLockCallable(\n\t\tasync (\n\t\t\tcancellationToken: CancellationTokenTrait,\n\t\t\toperationSpan?: OperationSpanTrait,\n\t\t) => {\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._operationSignals.startPending.set(true);\n\t\t\ttry {\n\t\t\t\treturn await this._dispatchRefresh(cancellationToken, operationSpan);\n\t\t\t} finally {\n\t\t\t\tthis._operationSignals.startPending.set(false);\n\t\t\t}\n\t\t},\n\t);\n\n\treadonly id: string;\n\treadonly sessionSnapshot: ReadableSignalTrait<\n\t\tResourceSnapshot<SessionInfo | null>\n\t>;\n\treadonly sessionResource: ResourceTrait<SessionInfo | null>;\n\treadonly isAuthenticated: ResourceTrait<boolean>;\n\treadonly sessionOperations: SessionContextOperationSignals;\n\treadonly events: EventStreamTrait<SessionContextEvent>;\n\n\tprotected get environment(): FoundationEnvironment {\n\t\treturn this._environment;\n\t}\n\n\tprotected get span(): SpanTrait {\n\t\treturn this._span;\n\t}\n\n\tprotected get config(): ResolvedSessionContextClientConfig {\n\t\treturn this._config;\n\t}\n\n\tstatic fromEnvironmentConfig(options: {\n\t\treadonly config: SessionContextClientConfig;\n\t\treadonly environment: FoundationEnvironment;\n\t}): SessionContextClient {\n\t\treturn new SessionContextClient(options.config, options.environment);\n\t}\n\n\tstatic fromInjector(\n\t\tinjector: SecuritydeptInjectorTrait,\n\t): SessionContextClient {\n\t\tconst client = SessionContextClient.fromEnvironmentConfig({\n\t\t\tconfig: injector.get(SESSION_CONTEXT_CLIENT_CONFIG),\n\t\t\tenvironment: injector.get(ENVIRONMENT_TOKEN),\n\t\t});\n\t\tinjector\n\t\t\t.get(SecuritydeptDestroyRef, null)\n\t\t\t?.onDestroy(() => client.dispose());\n\t\treturn client;\n\t}\n\n\tprotected constructor(\n\t\tconfig: SessionContextClientConfig,\n\t\tenvironment: FoundationEnvironment,\n\t) {\n\t\tthis._environment = environment;\n\t\tconst baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n\t\tthis._config = {\n\t\t\tid: config.id ?? uuidv7(),\n\t\t\tbaseUrl,\n\t\t\tloginPath:\n\t\t\t\tconfig.loginPath ?? SessionContextClient.defaultOptions.loginPath,\n\t\t\tlogoutPath:\n\t\t\t\tconfig.logoutPath ?? SessionContextClient.defaultOptions.logoutPath,\n\t\t\tuserInfoPath:\n\t\t\t\tconfig.userInfoPath ?? SessionContextClient.defaultOptions.userInfoPath,\n\t\t\ttracing: {\n\t\t\t\ttarget:\n\t\t\t\t\tconfig.tracing?.target ??\n\t\t\t\t\tSessionContextClient.defaultOptions.tracing.target,\n\t\t\t\tprefix:\n\t\t\t\t\tconfig.tracing?.prefix ??\n\t\t\t\t\tSessionContextClient.defaultOptions.tracing.prefix,\n\t\t\t},\n\t\t};\n\t\tthis.id = this._config.id;\n\t\tthis._span = environment.span.fork({\n\t\t\tattributes: {\n\t\t\t\tclientName: this.constructor.name,\n\t\t\t\tid: this.id,\n\t\t\t},\n\t\t});\n\t\tthis.sessionSnapshot = readonlySignal(this._sessionSnapshotSignal);\n\t\tthis.sessionResource = resourceFromSnapshots(() =>\n\t\t\tthis._sessionSnapshotSignal.get(),\n\t\t);\n\t\tthis.isAuthenticated = mapResource(\n\t\t\tthis.sessionResource,\n\t\t\t(sessionInfo) => sessionInfo !== null,\n\t\t);\n\t\tthis.sessionOperations = {\n\t\t\tstartPending: readonlySignal(this._operationSignals.startPending),\n\t\t\trefreshPending: readonlySignal(this._operationSignals.refreshPending),\n\t\t\tlogoutPending: readonlySignal(this._operationSignals.logoutPending),\n\t\t\tloginRedirectPending: readonlySignal(\n\t\t\t\tthis._operationSignals.loginRedirectPending,\n\t\t\t),\n\t\t};\n\t\tthis.events = this._eventSubject;\n\t\tthis.destroyed$.subscribe(() => {\n\t\t\tthis._rootCancellation.cancel(\n\t\t\t\tnew ClientError({\n\t\t\t\t\tkind: ClientErrorKind.Cancelled,\n\t\t\t\t\tcode: SessionContextErrorCode.ClientDisposed,\n\t\t\t\t\tmessage: \"SessionContextClient has been disposed.\",\n\t\t\t\t\tsource: SessionContextSource.SessionContext,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.isAuthenticated.dispose();\n\t\t\tthis.sessionResource.dispose();\n\t\t});\n\n\t\tfrom(this._refreshCommandSubject)\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.destroyed$),\n\t\t\t\tconcatCommand((command) =>\n\t\t\t\t\tthis._executeRefresh(\n\t\t\t\t\t\tcommand.cancellationToken,\n\t\t\t\t\t\tcommand.operationSpan,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(this._refreshResponseSubject);\n\n\t\tfrom(this._logoutCommandSubject)\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.destroyed$),\n\t\t\t\tconcatCommand((command) =>\n\t\t\t\t\tthis._executeLogout(command.cancellationToken, command.operationSpan),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(this._logoutResponseSubject);\n\n\t\tif (config.autoStart === true) {\n\t\t\tthis.start().catch(() => {\n\t\t\t\t// Startup failure is reflected by sessionSnapshot.\n\t\t\t});\n\t\t}\n\t}\n\n\t@instrumentSessionMethod(\"start\")\n\tasync start(operationSpan?: OperationSpanTrait): Promise<SessionInfo | null> {\n\t\tconst cancellationToken = this._rootCancellation.token;\n\t\treturn await this._startOnce(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync refresh(\n\t\toptions: SessionContextOperationOptions = {},\n\t): Promise<SessionInfo | null> {\n\t\tconst disposableStack = injectDisposableStackFrom(options, true);\n\t\tconst cancellationToken = createLinkedCancellationToken(\n\t\t\tthis._rootCancellation.token,\n\t\t\toptions.cancellationToken,\n\t\t);\n\t\tdisposableStack?.use(cancellationToken);\n\t\treturn await this._refresh(cancellationToken);\n\t}\n\n\t@instrumentSessionMethod(\"refresh\")\n\tprivate async _refresh(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\treturn await this._dispatchRefresh(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync logout(options: SessionContextOperationOptions = {}): Promise<void> {\n\t\tconst disposableStack = injectDisposableStackFrom(options, true);\n\t\tconst cancellationToken = createLinkedCancellationToken(\n\t\t\tthis._rootCancellation.token,\n\t\t\toptions.cancellationToken,\n\t\t);\n\t\tdisposableStack?.use(cancellationToken);\n\t\tawait this._logout(cancellationToken);\n\t}\n\n\t@instrumentSessionMethod(\"logout\")\n\tprivate async _logout(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tawait this._dispatchLogout(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync loginWithRedirect(\n\t\toptions: SessionLoginWithRedirectOptions = {},\n\t): Promise<void> {\n\t\tconst disposableStack = injectDisposableStackFrom(options, true);\n\t\tconst cancellationToken = createLinkedCancellationToken(\n\t\t\tthis._rootCancellation.token,\n\t\t\toptions.cancellationToken,\n\t\t);\n\t\tdisposableStack?.use(cancellationToken);\n\t\tawait this._loginWithRedirect(options, cancellationToken);\n\t}\n\n\t@instrumentSessionMethod(\"login.redirect\")\n\tprivate async _loginWithRedirect(\n\t\toptions: SessionLoginWithRedirectOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\t_operationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst router = this._environment.router;\n\t\tif (!router) {\n\t\t\tthrow new ClientError({\n\t\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\t\tcode: SessionContextErrorCode.RouterUnavailable,\n\t\t\t\tmessage: \"loginWithRedirect() requires environment.router.\",\n\t\t\t\tsource: SessionContextSource.SessionContext,\n\t\t\t});\n\t\t}\n\t\tthis._operationSignals.loginRedirectPending.set(true);\n\t\ttry {\n\t\t\tawait router.navigate({\n\t\t\t\turl: UriReferenceString.parse(\n\t\t\t\t\tthis._createLoginRedirectUrl(options.postAuthRedirectUri),\n\t\t\t\t),\n\t\t\t\tintent: RouterNavigationIntent.AuthRedirect,\n\t\t\t\tmode: RouterNavigationMode.External,\n\t\t\t});\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t} finally {\n\t\t\tthis._operationSignals.loginRedirectPending.set(false);\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis._destroyed.set(true);\n\t}\n\n\t[SYMBOL_DISPOSE](): void {\n\t\tthis.dispose();\n\t}\n\n\tprivate async _dispatchRefresh(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst sessionInfo = await lastValueFrom(\n\t\t\tdispatchCommandLocallyToStream<\n\t\t\t\tvoid,\n\t\t\t\tSessionCommandExtra,\n\t\t\t\tSessionInfo | null,\n\t\t\t\tSessionRefreshCommand\n\t\t\t>({\n\t\t\t\tpayload: undefined,\n\t\t\t\trequestStream: this._refreshCommandSubject,\n\t\t\t\tresponseStream: this._refreshResponseSubject,\n\t\t\t\tcreateCommandExtra: () => ({ cancellationToken, operationSpan }),\n\t\t\t}).pipe(commandResponseData()),\n\t\t);\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\treturn sessionInfo;\n\t}\n\n\tprivate async _dispatchLogout(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tawait lastValueFrom(\n\t\t\tdispatchCommandLocallyToStream<\n\t\t\t\tvoid,\n\t\t\t\tSessionCommandExtra,\n\t\t\t\tvoid,\n\t\t\t\tSessionLogoutCommand\n\t\t\t>({\n\t\t\t\tpayload: undefined,\n\t\t\t\trequestStream: this._logoutCommandSubject,\n\t\t\t\tresponseStream: this._logoutResponseSubject,\n\t\t\t\tcreateCommandExtra: () => ({ cancellationToken, operationSpan }),\n\t\t\t}).pipe(commandResponseData()),\n\t\t);\n\t\tcancellationToken.throwIfCancellationRequested();\n\t}\n\n\tprivate async _executeRefresh(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tthis._operationSignals.refreshPending.set(true);\n\t\tconst previous = this._sessionSnapshotSignal.get();\n\t\tconst previousValue =\n\t\t\tprevious.status === ResourceStatus.Reloading ||\n\t\t\tprevious.status === ResourceStatus.Resolved ||\n\t\t\tprevious.status === ResourceStatus.Error\n\t\t\t\t? previous.value\n\t\t\t\t: null;\n\t\tconst loadingSnapshot = reduceResourceSnapshot(previous, {\n\t\t\tkind: ResourceSnapshotUpdateKind.Load,\n\t\t});\n\t\tthis._sessionSnapshotSignal.set(loadingSnapshot);\n\t\tthis._emitSessionEvent({\n\t\t\ttype: SessionContextEventType.SessionRefreshStarted,\n\t\t\tsession: previousValue,\n\t\t});\n\t\ttry {\n\t\t\tconst sessionInfo = await this._fetchSessionInfo(cancellationToken);\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Resolve,\n\t\t\t\t\tvalue: sessionInfo,\n\t\t\t\t}),\n\t\t\t);\n\t\t\toperationSpan?.setAttributes({\n\t\t\t\tauthenticated: sessionInfo !== null,\n\t\t\t});\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionRefreshSucceeded,\n\t\t\t\tsession: sessionInfo,\n\t\t\t});\n\t\t\treturn sessionInfo;\n\t\t} catch (error) {\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Fail,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionRefreshFailed,\n\t\t\t\tsession: previousValue,\n\t\t\t\terrorSummary: describeError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis._operationSignals.refreshPending.set(false);\n\t\t}\n\t}\n\n\tprivate async _executeLogout(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tthis._operationSignals.logoutPending.set(true);\n\t\tconst previous = this._sessionSnapshotSignal.get();\n\t\tconst loadingSnapshot = reduceResourceSnapshot(previous, {\n\t\t\tkind: ResourceSnapshotUpdateKind.Load,\n\t\t});\n\t\tthis._sessionSnapshotSignal.set(loadingSnapshot);\n\t\tthis._emitSessionEvent({\n\t\t\ttype: SessionContextEventType.SessionLogoutStarted,\n\t\t\tsession: this._readCurrentSession(),\n\t\t});\n\t\ttry {\n\t\t\tconst response = await this._environment.transport.execute({\n\t\t\t\turl: this._createLogoutUrl(),\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({}),\n\t\t\t\tcancellationToken,\n\t\t\t});\n\n\t\t\tif (response.status < 200 || response.status >= 300) {\n\t\t\t\tthrow ClientError.fromHttpResponse({\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\tbody: response.body,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Resolve,\n\t\t\t\t\tvalue: null,\n\t\t\t\t}),\n\t\t\t);\n\t\t\toperationSpan?.setAttributes({ authenticated: false });\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionLogoutSucceeded,\n\t\t\t\tsession: null,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Fail,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionLogoutFailed,\n\t\t\t\tsession: this._readCurrentSession(),\n\t\t\t\terrorSummary: describeError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis._operationSignals.logoutPending.set(false);\n\t\t}\n\t}\n\n\tprivate async _fetchSessionInfo(\n\t\tcancellationToken: CancellationTokenTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst response = await this._environment.transport.execute({\n\t\t\turl: this._config.baseUrl + this._config.userInfoPath,\n\t\t\tmethod: \"GET\",\n\t\t\theaders: {},\n\t\t\tcancellationToken,\n\t\t});\n\t\tcancellationToken.throwIfCancellationRequested();\n\n\t\tif (response.status === 401 || response.status === 403) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (response.status >= 200 && response.status < 300) {\n\t\t\treturn parseSessionInfoPayload(response.body);\n\t\t}\n\n\t\tthrow ClientError.fromHttpResponse({\n\t\t\tstatus: response.status,\n\t\t\tbody: response.body,\n\t\t});\n\t}\n\n\tprivate _createLoginRedirectUrl(postAuthRedirectUri?: string): string {\n\t\tconst base = this._config.baseUrl + this._config.loginPath;\n\t\tif (postAuthRedirectUri) {\n\t\t\tconst params = new URLSearchParams({\n\t\t\t\t[POST_AUTH_REDIRECT_PARAM]: postAuthRedirectUri,\n\t\t\t});\n\t\t\treturn `${base}?${params.toString()}`;\n\t\t}\n\t\treturn base;\n\t}\n\n\tprivate _createLogoutUrl(): string {\n\t\treturn this._config.baseUrl + this._config.logoutPath;\n\t}\n\n\tprivate _readCurrentSession(): SessionInfo | null {\n\t\tconst snapshot = this._sessionSnapshotSignal.get();\n\t\treturn snapshot.status === ResourceStatus.Reloading ||\n\t\t\tsnapshot.status === ResourceStatus.Resolved ||\n\t\t\tsnapshot.status === ResourceStatus.Error\n\t\t\t? snapshot.value\n\t\t\t: null;\n\t}\n\n\tprivate _emitSessionEvent(\n\t\tinput: Omit<SessionContextEvent, \"at\" | \"client\">,\n\t): void {\n\t\tthis._eventSubject.next({\n\t\t\t...input,\n\t\t\tat: this._environment.time.now(),\n\t\t\tclient: {\n\t\t\t\tid: this.id,\n\t\t\t},\n\t\t});\n\t}\n}\n","import {\n\tINJECTOR_TOKEN,\n\ttype SecuritydeptInjectorTrait,\n\ttype SecuritydeptProvider,\n} from \"@securitydept/client\";\nimport { SessionContextClient } from \"./client\";\nimport {\n\tSESSION_CONTEXT_CLIENT,\n\tSESSION_CONTEXT_CLIENT_CONFIG,\n} from \"./tokens\";\nimport { type SessionContextClientConfig } from \"./types\";\n\nexport interface ProvideSessionContextOptions {\n\treadonly config: SessionContextClientConfig;\n}\n\nexport function provideSessionContext(\n\toptions: ProvideSessionContextOptions,\n): readonly SecuritydeptProvider[] {\n\treturn [\n\t\t{\n\t\t\tprovide: SESSION_CONTEXT_CLIENT_CONFIG,\n\t\t\tuseValue: options.config,\n\t\t},\n\t\t{\n\t\t\tprovide: SESSION_CONTEXT_CLIENT,\n\t\t\tuseFactory: (injector: SecuritydeptInjectorTrait) =>\n\t\t\t\tSessionContextClient.fromInjector(injector),\n\t\t\tdeps: [INJECTOR_TOKEN],\n\t\t},\n\t];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["SessionContextErrorCode","OperationFailed","ClientDisposed","RouterUnavailable","InvalidSessionPayload","SessionContextSource","SessionContext","SessionContextEventType","SessionRefreshStarted","SessionRefreshSucceeded","SessionRefreshFailed","SessionLogoutStarted","SessionLogoutSucceeded","SessionLogoutFailed","IdentityPrincipalSchema","IdentityPrincipalWireSchema","type","defineType","SessionInfoSchema","principal","pipe","input","attributes","extra","SessionUserInfoResponseSchema","ClientError","ClientErrorKind","formatValidationFailure","validateWithSchemaSync","SessionContextErrorCode","SessionContextSource","SessionInfoSchema","SessionUserInfoResponseSchema","parseSessionInfoPayload","body","infoResult","success","value","userInfoResult","failure","issues","issueSummary","kind","Protocol","code","InvalidSessionPayload","message","source","SessionContext","cause","SecuritydeptInjectionToken","SESSION_CONTEXT_CLIENT","SESSION_CONTEXT_CLIENT_CONFIG","ClientError","ClientErrorKind","createCancellationTokenSource","createLinkedCancellationToken","createOnceAsyncLockCallable","createSignal","defineInstrumentMethodDecorator","describeError","ENVIRONMENT_TOKEN","injectDisposableStackFrom","mapResource","ResourceSnapshotUpdateKind","ResourceStatus","RouterNavigationIntent","RouterNavigationMode","readonlySignal","reduceResourceSnapshot","resourceFromSnapshots","SecuritydeptDestroyRef","SYMBOL_DISPOSE","UriReferenceString","withDisposableStack","commandResponseData","concatCommand","dispatchCommandLocallyToStream","RxEventReplaySubject","RxEventSubject","RxStateSignal","filter","from","lastValueFrom","take","takeUntil","v7","uuidv7","parseSessionInfoPayload","SESSION_CONTEXT_CLIENT_CONFIG","SessionContextErrorCode","SessionContextEventType","SessionContextSource","POST_AUTH_REDIRECT_PARAM","instrumentSessionMethod","factoryArgs","operation","environment","span","name","config","tracing","prefix","target","fields","normalizeError","error","fromUnknown","code","OperationFailed","message","source","SessionContext","SessionContextClient","start","refresh","_refresh","logout","_logout","loginWithRedirect","_loginWithRedirect","defaultOptions","loginPath","logoutPath","userInfoPath","_environment","_config","_span","_rootCancellation","_destroyed","fromInitialValue","destroyed$","pipe","value","_sessionSnapshotSignal","status","Idle","_operationSignals","startPending","refreshPending","logoutPending","loginRedirectPending","_eventSubject","_refreshCommandSubject","_refreshResponseSubject","_logoutCommandSubject","_logoutResponseSubject","_startOnce","cancellationToken","operationSpan","throwIfCancellationRequested","set","_dispatchRefresh","id","sessionSnapshot","sessionResource","isAuthenticated","sessionOperations","events","fromEnvironmentConfig","options","fromInjector","injector","client","get","onDestroy","dispose","baseUrl","replace","fork","attributes","clientName","sessionInfo","subscribe","cancel","kind","Cancelled","ClientDisposed","command","_executeRefresh","_executeLogout","autoStart","catch","token","disposableStack","use","_dispatchLogout","_operationSpan","router","Configuration","RouterUnavailable","navigate","url","parse","_createLoginRedirectUrl","postAuthRedirectUri","intent","AuthRedirect","mode","External","payload","undefined","requestStream","responseStream","createCommandExtra","previous","previousValue","Reloading","Resolved","Error","loadingSnapshot","Load","_emitSessionEvent","type","SessionRefreshStarted","session","_fetchSessionInfo","Resolve","setAttributes","authenticated","SessionRefreshSucceeded","Fail","SessionRefreshFailed","errorSummary","SessionLogoutStarted","_readCurrentSession","response","transport","execute","_createLogoutUrl","method","headers","body","JSON","stringify","fromHttpResponse","SessionLogoutSucceeded","SessionLogoutFailed","base","params","URLSearchParams","toString","snapshot","input","next","at","time","now","INJECTOR_TOKEN","SessionContextClient","SESSION_CONTEXT_CLIENT","SESSION_CONTEXT_CLIENT_CONFIG","provideSessionContext","options","provide","useValue","config","useFactory","injector","fromInjector","deps"],"sources":["../src/types.ts","../src/contracts/schemas.ts","../src/contracts/parsers.ts","../src/tokens.ts","../src/client.ts","../src/providers.ts"],"sourcesContent":["import {\n\ttype CancellationTokenOptions,\n\ttype ErrorSummary,\n\ttype IdentityPrincipal,\n} from \"@securitydept/client\";\n\n// --- Session Context Client types ---\n\nexport const SessionContextErrorCode = {\n\tOperationFailed: \"session.operation_failed\",\n\tClientDisposed: \"session.client_disposed\",\n\tRouterUnavailable: \"session.router_unavailable\",\n\tInvalidSessionPayload: \"session.invalid_user_info_payload\",\n} as const;\n\nexport type SessionContextErrorCode =\n\t(typeof SessionContextErrorCode)[keyof typeof SessionContextErrorCode];\n\nexport const SessionContextSource = {\n\tSessionContext: \"session-context\",\n} as const;\n\nexport type SessionContextSource =\n\t(typeof SessionContextSource)[keyof typeof SessionContextSource];\n\n/** Session principal — shared authenticated principal semantics via @securitydept/client. */\nexport type SessionPrincipal = IdentityPrincipal;\n\n/** Session info returned from the server. */\nexport interface SessionInfo {\n\tprincipal: SessionPrincipal;\n\tattributes?: Record<string, unknown>;\n\textra?: Record<string, unknown>;\n}\n\nexport interface SessionContextClientTracingOptions {\n\ttarget?: string;\n\tprefix?: string;\n}\n\nexport interface SessionContextOperationOptions\n\textends CancellationTokenOptions {}\n\nexport interface SessionLoginWithRedirectOptions\n\textends CancellationTokenOptions {\n\tpostAuthRedirectUri?: string;\n}\n\n/** Configuration for the Session Context Client. */\nexport interface SessionContextClientConfig {\n\tid?: string;\n\t/** Base URL of the SecurityDept server. */\n\tbaseUrl: string;\n\t/** Login path (default: \"/auth/session/login\"). */\n\tloginPath?: string;\n\t/** Logout path (default: \"/auth/session/logout\"). */\n\tlogoutPath?: string;\n\t/** User info endpoint path (default: \"/auth/session/user-info\"). */\n\tuserInfoPath?: string;\n\tautoStart?: boolean;\n\ttracing?: SessionContextClientTracingOptions;\n}\n\nexport interface ResolvedSessionContextClientConfig {\n\tid: string;\n\tbaseUrl: string;\n\tloginPath: string;\n\tlogoutPath: string;\n\tuserInfoPath: string;\n\ttracing: Required<SessionContextClientTracingOptions>;\n}\n\nexport const SessionContextEventType = {\n\tSessionRefreshStarted: \"session.refresh.started\",\n\tSessionRefreshSucceeded: \"session.refresh.succeeded\",\n\tSessionRefreshFailed: \"session.refresh.failed\",\n\tSessionLogoutStarted: \"session.logout.started\",\n\tSessionLogoutSucceeded: \"session.logout.succeeded\",\n\tSessionLogoutFailed: \"session.logout.failed\",\n} as const;\n\nexport type SessionContextEventType =\n\t(typeof SessionContextEventType)[keyof typeof SessionContextEventType];\n\nexport interface SessionContextEvent {\n\ttype: SessionContextEventType;\n\tat: number;\n\tclient: {\n\t\tid: string;\n\t};\n\tsession?: SessionInfo | null;\n\terrorSummary?: ErrorSummary;\n}\n","import {\n\tIdentityPrincipalSchema,\n\tIdentityPrincipalWireSchema,\n} from \"@securitydept/client\";\nimport { type as defineType } from \"arktype\";\nimport { type SessionInfo } from \"../types\";\n\nexport const SessionInfoSchema = defineType({\n\tprincipal: IdentityPrincipalSchema,\n\t\"attributes?\": \"object\",\n\t\"extra?\": \"object\",\n}).pipe(\n\t(input): SessionInfo => ({\n\t\tprincipal: input.principal,\n\t\tattributes: input.attributes as Record<string, unknown> | undefined,\n\t\textra: input.extra as Record<string, unknown> | undefined,\n\t}),\n);\n\nexport const SessionUserInfoResponseSchema = IdentityPrincipalWireSchema.pipe(\n\t(principal): SessionInfo => ({ principal }),\n);\n","import {\n\tClientError,\n\tClientErrorKind,\n\tformatValidationFailure,\n\tvalidateWithSchemaSync,\n} from \"@securitydept/client\";\nimport {\n\tSessionContextErrorCode,\n\tSessionContextSource,\n\ttype SessionInfo,\n} from \"../types\";\nimport { SessionInfoSchema, SessionUserInfoResponseSchema } from \"./schemas\";\n\nexport function parseSessionInfoPayload(body: unknown): SessionInfo {\n\tconst infoResult = validateWithSchemaSync(SessionInfoSchema, body);\n\tif (infoResult.success) {\n\t\treturn infoResult.value;\n\t}\n\n\tconst userInfoResult = validateWithSchemaSync(\n\t\tSessionUserInfoResponseSchema,\n\t\tbody,\n\t);\n\tif (userInfoResult.success) {\n\t\treturn userInfoResult.value;\n\t}\n\n\tconst failure = {\n\t\tsuccess: false as const,\n\t\tissues: [...infoResult.issues, ...userInfoResult.issues],\n\t};\n\tconst issueSummary = formatValidationFailure(failure);\n\tthrow new ClientError({\n\t\tkind: ClientErrorKind.Protocol,\n\t\tcode: SessionContextErrorCode.InvalidSessionPayload,\n\t\tmessage: issueSummary\n\t\t\t? `Session /user-info payload is invalid: ${issueSummary}.`\n\t\t\t: \"Session /user-info payload is invalid.\",\n\t\tsource: SessionContextSource.SessionContext,\n\t\tcause: failure.issues,\n\t});\n}\n","import { SecuritydeptInjectionToken } from \"@securitydept/client\";\nimport { type SessionContextClient } from \"./client\";\nimport { type SessionContextClientConfig } from \"./types\";\n\nexport const SESSION_CONTEXT_CLIENT =\n\tnew SecuritydeptInjectionToken<SessionContextClient>(\n\t\t\"SESSION_CONTEXT_CLIENT\",\n\t);\n\nexport const SESSION_CONTEXT_CLIENT_CONFIG =\n\tnew SecuritydeptInjectionToken<SessionContextClientConfig>(\n\t\t\"SESSION_CONTEXT_CLIENT_CONFIG\",\n\t);\n","import {\n\ttype CancellationTokenSourceTrait,\n\ttype CancellationTokenTrait,\n\tClientError,\n\tClientErrorKind,\n\tcreateCancellationTokenSource,\n\tcreateLinkedCancellationToken,\n\tcreateOnceAsyncLockCallable,\n\tcreateSignal,\n\ttype DisposableTrait,\n\tdefineInstrumentMethodDecorator,\n\tdescribeError,\n\tENVIRONMENT_TOKEN,\n\ttype EventStreamTrait,\n\ttype FoundationEnvironment,\n\tinjectDisposableStackFrom,\n\tmapResource,\n\ttype OperationSpanTrait,\n\ttype ReadableSignalTrait,\n\ttype ResourceSnapshot,\n\tResourceSnapshotUpdateKind,\n\tResourceStatus,\n\ttype ResourceTrait,\n\tRouterNavigationIntent,\n\tRouterNavigationMode,\n\treadonlySignal,\n\treduceResourceSnapshot,\n\tresourceFromSnapshots,\n\tSecuritydeptDestroyRef,\n\ttype SecuritydeptInjectorTrait,\n\ttype SpanTrait,\n\tSYMBOL_DISPOSE,\n\tUriReferenceString,\n\ttype WritableSignalTrait,\n\twithDisposableStack,\n} from \"@securitydept/client\";\nimport {\n\ttype Command,\n\ttype CommandResponse,\n\tcommandResponseData,\n\tconcatCommand,\n\tdispatchCommandLocallyToStream,\n\tRxEventReplaySubject,\n\tRxEventSubject,\n\tRxStateSignal,\n} from \"@securitydept/client/rx\";\nimport { filter, from, lastValueFrom, take, takeUntil } from \"rxjs\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { parseSessionInfoPayload } from \"./contracts/parsers\";\nimport { SESSION_CONTEXT_CLIENT_CONFIG } from \"./tokens\";\nimport {\n\ttype ResolvedSessionContextClientConfig,\n\ttype SessionContextClientConfig,\n\tSessionContextErrorCode,\n\ttype SessionContextEvent,\n\tSessionContextEventType,\n\ttype SessionContextOperationOptions,\n\tSessionContextSource,\n\ttype SessionInfo,\n\ttype SessionLoginWithRedirectOptions,\n} from \"./types\";\n\ninterface SessionContextOperationSignals {\n\treadonly startPending: ReadableSignalTrait<boolean>;\n\treadonly refreshPending: ReadableSignalTrait<boolean>;\n\treadonly logoutPending: ReadableSignalTrait<boolean>;\n\treadonly loginRedirectPending: ReadableSignalTrait<boolean>;\n}\n\ninterface SessionCommandExtra {\n\tcancellationToken: CancellationTokenTrait;\n\toperationSpan?: OperationSpanTrait;\n}\n\ntype SessionRefreshCommand = Command<void, SessionCommandExtra>;\ntype SessionLogoutCommand = Command<void, SessionCommandExtra>;\n\nconst POST_AUTH_REDIRECT_PARAM = \"post_auth_redirect_uri\";\n\nconst instrumentSessionMethod = defineInstrumentMethodDecorator<\n\t[operation: string],\n\tSessionContextClient\n>(\n\t({ factoryArgs: [operation] }) =>\n\t\tfunction (this: SessionContextClient) {\n\t\t\treturn {\n\t\t\t\tenvironment: this.environment,\n\t\t\t\tspan: this.span,\n\t\t\t\tname: `${this.config.tracing.prefix}.${operation}`,\n\t\t\t\ttarget: this.config.tracing.target,\n\t\t\t\tfields: { operation },\n\t\t\t\tnormalizeError: (error: unknown) =>\n\t\t\t\t\tClientError.fromUnknown(error, {\n\t\t\t\t\t\tcode: SessionContextErrorCode.OperationFailed,\n\t\t\t\t\t\tmessage: \"The session operation failed unexpectedly\",\n\t\t\t\t\t\tsource: SessionContextSource.SessionContext,\n\t\t\t\t\t}),\n\t\t\t};\n\t\t},\n);\n\n/**\n * Session Context Client.\n *\n * Owns session state, lifecycle, login/logout navigation, and tracing.\n * Host capabilities are resolved once through FoundationEnvironment at\n * construction time.\n */\nexport class SessionContextClient implements DisposableTrait {\n\tstatic defaultOptions = {\n\t\tloginPath: \"/auth/session/login\",\n\t\tlogoutPath: \"/auth/session/logout\",\n\t\tuserInfoPath: \"/auth/session/user-info\",\n\t\ttracing: {\n\t\t\ttarget: \"session-context-client\",\n\t\t\tprefix: \"session_context\",\n\t\t},\n\t} as const;\n\n\tprivate readonly _environment: FoundationEnvironment;\n\tprivate readonly _config: ResolvedSessionContextClientConfig;\n\tprivate readonly _span: SpanTrait;\n\tprivate readonly _rootCancellation: CancellationTokenSourceTrait =\n\t\tcreateCancellationTokenSource();\n\tprivate readonly _destroyed = RxStateSignal.fromInitialValue(false);\n\tprivate readonly destroyed$ = from(this._destroyed).pipe(\n\t\tfilter((value): value is true => value),\n\t\ttake(1),\n\t);\n\tprivate readonly _sessionSnapshotSignal = RxStateSignal.fromInitialValue<\n\t\tResourceSnapshot<SessionInfo | null>\n\t>({ status: ResourceStatus.Idle });\n\tprivate readonly _operationSignals: {\n\t\treadonly startPending: WritableSignalTrait<boolean>;\n\t\treadonly refreshPending: WritableSignalTrait<boolean>;\n\t\treadonly logoutPending: WritableSignalTrait<boolean>;\n\t\treadonly loginRedirectPending: WritableSignalTrait<boolean>;\n\t} = {\n\t\tstartPending: createSignal(false),\n\t\trefreshPending: createSignal(false),\n\t\tlogoutPending: createSignal(false),\n\t\tloginRedirectPending: createSignal(false),\n\t};\n\tprivate readonly _eventSubject =\n\t\tnew RxEventReplaySubject<SessionContextEvent>(100);\n\tprivate readonly _refreshCommandSubject =\n\t\tnew RxEventSubject<SessionRefreshCommand>();\n\tprivate readonly _refreshResponseSubject = new RxEventSubject<\n\t\tCommandResponse<SessionRefreshCommand, SessionInfo | null>\n\t>();\n\tprivate readonly _logoutCommandSubject =\n\t\tnew RxEventSubject<SessionLogoutCommand>();\n\tprivate readonly _logoutResponseSubject = new RxEventSubject<\n\t\tCommandResponse<SessionLogoutCommand, void>\n\t>();\n\tprivate readonly _startOnce = createOnceAsyncLockCallable(\n\t\tasync (\n\t\t\tcancellationToken: CancellationTokenTrait,\n\t\t\toperationSpan?: OperationSpanTrait,\n\t\t) => {\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._operationSignals.startPending.set(true);\n\t\t\ttry {\n\t\t\t\treturn await this._dispatchRefresh(cancellationToken, operationSpan);\n\t\t\t} finally {\n\t\t\t\tthis._operationSignals.startPending.set(false);\n\t\t\t}\n\t\t},\n\t);\n\n\treadonly id: string;\n\treadonly sessionSnapshot: ReadableSignalTrait<\n\t\tResourceSnapshot<SessionInfo | null>\n\t>;\n\treadonly sessionResource: ResourceTrait<SessionInfo | null>;\n\treadonly isAuthenticated: ResourceTrait<boolean>;\n\treadonly sessionOperations: SessionContextOperationSignals;\n\treadonly events: EventStreamTrait<SessionContextEvent>;\n\n\tprotected get environment(): FoundationEnvironment {\n\t\treturn this._environment;\n\t}\n\n\tprotected get span(): SpanTrait {\n\t\treturn this._span;\n\t}\n\n\tprotected get config(): ResolvedSessionContextClientConfig {\n\t\treturn this._config;\n\t}\n\n\tstatic fromEnvironmentConfig(options: {\n\t\treadonly config: SessionContextClientConfig;\n\t\treadonly environment: FoundationEnvironment;\n\t}): SessionContextClient {\n\t\treturn new SessionContextClient(options.config, options.environment);\n\t}\n\n\tstatic fromInjector(\n\t\tinjector: SecuritydeptInjectorTrait,\n\t): SessionContextClient {\n\t\tconst client = SessionContextClient.fromEnvironmentConfig({\n\t\t\tconfig: injector.get(SESSION_CONTEXT_CLIENT_CONFIG),\n\t\t\tenvironment: injector.get(ENVIRONMENT_TOKEN),\n\t\t});\n\t\tinjector\n\t\t\t.get(SecuritydeptDestroyRef, null)\n\t\t\t?.onDestroy(() => client.dispose());\n\t\treturn client;\n\t}\n\n\tprotected constructor(\n\t\tconfig: SessionContextClientConfig,\n\t\tenvironment: FoundationEnvironment,\n\t) {\n\t\tthis._environment = environment;\n\t\tconst baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n\t\tthis._config = {\n\t\t\tid: config.id ?? uuidv7(),\n\t\t\tbaseUrl,\n\t\t\tloginPath:\n\t\t\t\tconfig.loginPath ?? SessionContextClient.defaultOptions.loginPath,\n\t\t\tlogoutPath:\n\t\t\t\tconfig.logoutPath ?? SessionContextClient.defaultOptions.logoutPath,\n\t\t\tuserInfoPath:\n\t\t\t\tconfig.userInfoPath ?? SessionContextClient.defaultOptions.userInfoPath,\n\t\t\ttracing: {\n\t\t\t\ttarget:\n\t\t\t\t\tconfig.tracing?.target ??\n\t\t\t\t\tSessionContextClient.defaultOptions.tracing.target,\n\t\t\t\tprefix:\n\t\t\t\t\tconfig.tracing?.prefix ??\n\t\t\t\t\tSessionContextClient.defaultOptions.tracing.prefix,\n\t\t\t},\n\t\t};\n\t\tthis.id = this._config.id;\n\t\tthis._span = environment.span.fork({\n\t\t\tattributes: {\n\t\t\t\tclientName: this.constructor.name,\n\t\t\t\tid: this.id,\n\t\t\t},\n\t\t});\n\t\tthis.sessionSnapshot = readonlySignal(this._sessionSnapshotSignal);\n\t\tthis.sessionResource = resourceFromSnapshots(() =>\n\t\t\tthis._sessionSnapshotSignal.get(),\n\t\t);\n\t\tthis.isAuthenticated = mapResource(\n\t\t\tthis.sessionResource,\n\t\t\t(sessionInfo) => sessionInfo !== null,\n\t\t);\n\t\tthis.sessionOperations = {\n\t\t\tstartPending: readonlySignal(this._operationSignals.startPending),\n\t\t\trefreshPending: readonlySignal(this._operationSignals.refreshPending),\n\t\t\tlogoutPending: readonlySignal(this._operationSignals.logoutPending),\n\t\t\tloginRedirectPending: readonlySignal(\n\t\t\t\tthis._operationSignals.loginRedirectPending,\n\t\t\t),\n\t\t};\n\t\tthis.events = this._eventSubject;\n\t\tthis.destroyed$.subscribe(() => {\n\t\t\tthis._rootCancellation.cancel(\n\t\t\t\tnew ClientError({\n\t\t\t\t\tkind: ClientErrorKind.Cancelled,\n\t\t\t\t\tcode: SessionContextErrorCode.ClientDisposed,\n\t\t\t\t\tmessage: \"SessionContextClient has been disposed.\",\n\t\t\t\t\tsource: SessionContextSource.SessionContext,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.isAuthenticated.dispose();\n\t\t\tthis.sessionResource.dispose();\n\t\t});\n\n\t\tfrom(this._refreshCommandSubject)\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.destroyed$),\n\t\t\t\tconcatCommand((command) =>\n\t\t\t\t\tthis._executeRefresh(\n\t\t\t\t\t\tcommand.cancellationToken,\n\t\t\t\t\t\tcommand.operationSpan,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(this._refreshResponseSubject);\n\n\t\tfrom(this._logoutCommandSubject)\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.destroyed$),\n\t\t\t\tconcatCommand((command) =>\n\t\t\t\t\tthis._executeLogout(command.cancellationToken, command.operationSpan),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(this._logoutResponseSubject);\n\n\t\tif (config.autoStart === true) {\n\t\t\tthis.start().catch(() => {\n\t\t\t\t// Startup failure is reflected by sessionSnapshot.\n\t\t\t});\n\t\t}\n\t}\n\n\t@instrumentSessionMethod(\"start\")\n\tasync start(operationSpan?: OperationSpanTrait): Promise<SessionInfo | null> {\n\t\tconst cancellationToken = this._rootCancellation.token;\n\t\treturn await this._startOnce(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync refresh(\n\t\toptions: SessionContextOperationOptions = {},\n\t): Promise<SessionInfo | null> {\n\t\tconst disposableStack = injectDisposableStackFrom(options, true);\n\t\tconst cancellationToken = createLinkedCancellationToken(\n\t\t\tthis._rootCancellation.token,\n\t\t\toptions.cancellationToken,\n\t\t);\n\t\tdisposableStack?.use(cancellationToken);\n\t\treturn await this._refresh(cancellationToken);\n\t}\n\n\t@instrumentSessionMethod(\"refresh\")\n\tprivate async _refresh(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\treturn await this._dispatchRefresh(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync logout(options: SessionContextOperationOptions = {}): Promise<void> {\n\t\tconst disposableStack = injectDisposableStackFrom(options, true);\n\t\tconst cancellationToken = createLinkedCancellationToken(\n\t\t\tthis._rootCancellation.token,\n\t\t\toptions.cancellationToken,\n\t\t);\n\t\tdisposableStack?.use(cancellationToken);\n\t\tawait this._logout(cancellationToken);\n\t}\n\n\t@instrumentSessionMethod(\"logout\")\n\tprivate async _logout(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tawait this._dispatchLogout(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync loginWithRedirect(\n\t\toptions: SessionLoginWithRedirectOptions = {},\n\t): Promise<void> {\n\t\tconst disposableStack = injectDisposableStackFrom(options, true);\n\t\tconst cancellationToken = createLinkedCancellationToken(\n\t\t\tthis._rootCancellation.token,\n\t\t\toptions.cancellationToken,\n\t\t);\n\t\tdisposableStack?.use(cancellationToken);\n\t\tawait this._loginWithRedirect(options, cancellationToken);\n\t}\n\n\t@instrumentSessionMethod(\"login.redirect\")\n\tprivate async _loginWithRedirect(\n\t\toptions: SessionLoginWithRedirectOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\t_operationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst router = this._environment.router;\n\t\tif (!router) {\n\t\t\tthrow new ClientError({\n\t\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\t\tcode: SessionContextErrorCode.RouterUnavailable,\n\t\t\t\tmessage: \"loginWithRedirect() requires environment.router.\",\n\t\t\t\tsource: SessionContextSource.SessionContext,\n\t\t\t});\n\t\t}\n\t\tthis._operationSignals.loginRedirectPending.set(true);\n\t\ttry {\n\t\t\tawait router.navigate({\n\t\t\t\turl: UriReferenceString.parse(\n\t\t\t\t\tthis._createLoginRedirectUrl(options.postAuthRedirectUri),\n\t\t\t\t),\n\t\t\t\tintent: RouterNavigationIntent.AuthRedirect,\n\t\t\t\tmode: RouterNavigationMode.External,\n\t\t\t});\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t} finally {\n\t\t\tthis._operationSignals.loginRedirectPending.set(false);\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis._destroyed.set(true);\n\t}\n\n\t[SYMBOL_DISPOSE](): void {\n\t\tthis.dispose();\n\t}\n\n\tprivate async _dispatchRefresh(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst sessionInfo = await lastValueFrom(\n\t\t\tdispatchCommandLocallyToStream<\n\t\t\t\tvoid,\n\t\t\t\tSessionCommandExtra,\n\t\t\t\tSessionInfo | null,\n\t\t\t\tSessionRefreshCommand\n\t\t\t>({\n\t\t\t\tpayload: undefined,\n\t\t\t\trequestStream: this._refreshCommandSubject,\n\t\t\t\tresponseStream: this._refreshResponseSubject,\n\t\t\t\tcreateCommandExtra: () => ({ cancellationToken, operationSpan }),\n\t\t\t}).pipe(commandResponseData()),\n\t\t);\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\treturn sessionInfo;\n\t}\n\n\tprivate async _dispatchLogout(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tawait lastValueFrom(\n\t\t\tdispatchCommandLocallyToStream<\n\t\t\t\tvoid,\n\t\t\t\tSessionCommandExtra,\n\t\t\t\tvoid,\n\t\t\t\tSessionLogoutCommand\n\t\t\t>({\n\t\t\t\tpayload: undefined,\n\t\t\t\trequestStream: this._logoutCommandSubject,\n\t\t\t\tresponseStream: this._logoutResponseSubject,\n\t\t\t\tcreateCommandExtra: () => ({ cancellationToken, operationSpan }),\n\t\t\t}).pipe(commandResponseData()),\n\t\t);\n\t\tcancellationToken.throwIfCancellationRequested();\n\t}\n\n\tprivate async _executeRefresh(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tthis._operationSignals.refreshPending.set(true);\n\t\tconst previous = this._sessionSnapshotSignal.get();\n\t\tconst previousValue =\n\t\t\tprevious.status === ResourceStatus.Reloading ||\n\t\t\tprevious.status === ResourceStatus.Resolved ||\n\t\t\tprevious.status === ResourceStatus.Error\n\t\t\t\t? previous.value\n\t\t\t\t: null;\n\t\tconst loadingSnapshot = reduceResourceSnapshot(previous, {\n\t\t\tkind: ResourceSnapshotUpdateKind.Load,\n\t\t});\n\t\tthis._sessionSnapshotSignal.set(loadingSnapshot);\n\t\tthis._emitSessionEvent({\n\t\t\ttype: SessionContextEventType.SessionRefreshStarted,\n\t\t\tsession: previousValue,\n\t\t});\n\t\ttry {\n\t\t\tconst sessionInfo = await this._fetchSessionInfo(cancellationToken);\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Resolve,\n\t\t\t\t\tvalue: sessionInfo,\n\t\t\t\t}),\n\t\t\t);\n\t\t\toperationSpan?.setAttributes({\n\t\t\t\tauthenticated: sessionInfo !== null,\n\t\t\t});\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionRefreshSucceeded,\n\t\t\t\tsession: sessionInfo,\n\t\t\t});\n\t\t\treturn sessionInfo;\n\t\t} catch (error) {\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Fail,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionRefreshFailed,\n\t\t\t\tsession: previousValue,\n\t\t\t\terrorSummary: describeError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis._operationSignals.refreshPending.set(false);\n\t\t}\n\t}\n\n\tprivate async _executeLogout(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<void> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tthis._operationSignals.logoutPending.set(true);\n\t\tconst previous = this._sessionSnapshotSignal.get();\n\t\tconst loadingSnapshot = reduceResourceSnapshot(previous, {\n\t\t\tkind: ResourceSnapshotUpdateKind.Load,\n\t\t});\n\t\tthis._sessionSnapshotSignal.set(loadingSnapshot);\n\t\tthis._emitSessionEvent({\n\t\t\ttype: SessionContextEventType.SessionLogoutStarted,\n\t\t\tsession: this._readCurrentSession(),\n\t\t});\n\t\ttry {\n\t\t\tconst response = await this._environment.transport.execute({\n\t\t\t\turl: this._createLogoutUrl(),\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({}),\n\t\t\t\tcancellationToken,\n\t\t\t});\n\n\t\t\tif (response.status < 200 || response.status >= 300) {\n\t\t\t\tthrow ClientError.fromHttpResponse({\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\tbody: response.body,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Resolve,\n\t\t\t\t\tvalue: null,\n\t\t\t\t}),\n\t\t\t);\n\t\t\toperationSpan?.setAttributes({ authenticated: false });\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionLogoutSucceeded,\n\t\t\t\tsession: null,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._sessionSnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Fail,\n\t\t\t\t\terror,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis._emitSessionEvent({\n\t\t\t\ttype: SessionContextEventType.SessionLogoutFailed,\n\t\t\t\tsession: this._readCurrentSession(),\n\t\t\t\terrorSummary: describeError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis._operationSignals.logoutPending.set(false);\n\t\t}\n\t}\n\n\tprivate async _fetchSessionInfo(\n\t\tcancellationToken: CancellationTokenTrait,\n\t): Promise<SessionInfo | null> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst response = await this._environment.transport.execute({\n\t\t\turl: this._config.baseUrl + this._config.userInfoPath,\n\t\t\tmethod: \"GET\",\n\t\t\theaders: {},\n\t\t\tcancellationToken,\n\t\t});\n\t\tcancellationToken.throwIfCancellationRequested();\n\n\t\tif (response.status === 401 || response.status === 403) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (response.status >= 200 && response.status < 300) {\n\t\t\treturn parseSessionInfoPayload(response.body);\n\t\t}\n\n\t\tthrow ClientError.fromHttpResponse({\n\t\t\tstatus: response.status,\n\t\t\tbody: response.body,\n\t\t});\n\t}\n\n\tprivate _createLoginRedirectUrl(postAuthRedirectUri?: string): string {\n\t\tconst base = this._config.baseUrl + this._config.loginPath;\n\t\tif (postAuthRedirectUri) {\n\t\t\tconst params = new URLSearchParams({\n\t\t\t\t[POST_AUTH_REDIRECT_PARAM]: postAuthRedirectUri,\n\t\t\t});\n\t\t\treturn `${base}?${params.toString()}`;\n\t\t}\n\t\treturn base;\n\t}\n\n\tprivate _createLogoutUrl(): string {\n\t\treturn this._config.baseUrl + this._config.logoutPath;\n\t}\n\n\tprivate _readCurrentSession(): SessionInfo | null {\n\t\tconst snapshot = this._sessionSnapshotSignal.get();\n\t\treturn snapshot.status === ResourceStatus.Reloading ||\n\t\t\tsnapshot.status === ResourceStatus.Resolved ||\n\t\t\tsnapshot.status === ResourceStatus.Error\n\t\t\t? snapshot.value\n\t\t\t: null;\n\t}\n\n\tprivate _emitSessionEvent(\n\t\tinput: Omit<SessionContextEvent, \"at\" | \"client\">,\n\t): void {\n\t\tthis._eventSubject.next({\n\t\t\t...input,\n\t\t\tat: this._environment.time.now(),\n\t\t\tclient: {\n\t\t\t\tid: this.id,\n\t\t\t},\n\t\t});\n\t}\n}\n","import {\n\tINJECTOR_TOKEN,\n\ttype SecuritydeptInjectorTrait,\n\ttype SecuritydeptProvider,\n} from \"@securitydept/client\";\nimport { SessionContextClient } from \"./client\";\nimport {\n\tSESSION_CONTEXT_CLIENT,\n\tSESSION_CONTEXT_CLIENT_CONFIG,\n} from \"./tokens\";\nimport { type SessionContextClientConfig } from \"./types\";\n\nexport interface ProvideSessionContextOptions {\n\treadonly config: SessionContextClientConfig;\n}\n\nexport function provideSessionContext(\n\toptions: ProvideSessionContextOptions,\n): readonly SecuritydeptProvider[] {\n\treturn [\n\t\t{\n\t\t\tprovide: SESSION_CONTEXT_CLIENT_CONFIG,\n\t\t\tuseValue: options.config,\n\t\t},\n\t\t{\n\t\t\tprovide: SESSION_CONTEXT_CLIENT,\n\t\t\tuseFactory: (injector: SecuritydeptInjectorTrait) =>\n\t\t\t\tSessionContextClient.fromInjector(injector),\n\t\t\tdeps: [INJECTOR_TOKEN],\n\t\t},\n\t];\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@securitydept/session-context-client",
3
- "version": "0.3.0-beta.5",
3
+ "version": "0.3.0-beta.6",
4
4
  "description": "Session Context Client of the SecurityDept TypeScript SDK, a layered authentication and authorization toolkit built as reusable Rust crates, a TypeScript client SDK workspace, and reference server/web apps.",
5
5
  "author": "Zhou Yeheng <root@aitiotekt.com>",
6
6
  "license": "MIT",
@@ -37,13 +37,13 @@
37
37
  "dist"
38
38
  ],
39
39
  "dependencies": {
40
- "arktype": "^2.2.0",
40
+ "arktype": "^2.2.3",
41
41
  "rxjs": "^7.8.2",
42
42
  "uuid": "^14.0.1",
43
- "@securitydept/client": "0.3.0-beta.5"
43
+ "@securitydept/client": "0.3.0-beta.6"
44
44
  },
45
45
  "devDependencies": {
46
- "vitest": "^4.1.6"
46
+ "vitest": "^4.1.10"
47
47
  },
48
48
  "scripts": {
49
49
  "build": "tsdown",