@securitydept/basic-auth-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,6 +1,4 @@
1
1
  import { CancellationTokenOptions, DisposableTrait, ErrorSummary, EventStreamTrait, FoundationEnvironment, ReadableSignalTrait, ResourceSnapshot, ResourceTrait, SYMBOL_DISPOSE, SecuritydeptInjectorTrait, SecuritydeptProvider, SpanTrait } from "@securitydept/client";
2
- import * as _$arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
3
-
4
2
  //#region src/authorization-header.d.ts
5
3
  interface CreateBasicAuthorizationHeaderValueOptions {
6
4
  readonly username: string;
@@ -75,7 +73,8 @@ type BasicAuthContextSource = (typeof BasicAuthContextSource)[keyof typeof Basic
75
73
  declare const BasicAuthContextEventType: {
76
74
  readonly BoundaryRefreshStarted: "basic_auth.boundary.refresh.started";
77
75
  readonly BoundaryRefreshSucceeded: "basic_auth.boundary.refresh.succeeded";
78
- readonly BoundaryRefreshFailed: "basic_auth.boundary.refresh.failed"; /** These logout events describe local boundary-projection clearing only. */
76
+ readonly BoundaryRefreshFailed: "basic_auth.boundary.refresh.failed";
77
+ /** These logout events describe local boundary-projection clearing only. */
79
78
  readonly LogoutStarted: "basic_auth.logout.started";
80
79
  readonly LogoutSucceeded: "basic_auth.logout.succeeded";
81
80
  readonly LogoutFailed: "basic_auth.logout.failed";
@@ -236,7 +235,7 @@ interface ProvideBasicAuthContextOptions {
236
235
  declare function provideBasicAuthContext(options: ProvideBasicAuthContextOptions): readonly SecuritydeptProvider[];
237
236
  //#endregion
238
237
  //#region src/schemas.d.ts
239
- declare const BasicAuthContextClientConfigSchema: _$arktype_internal_variants_object_ts0.ObjectType<{
238
+ declare const BasicAuthContextClientConfigSchema: import("arktype/internal/variants/object.ts").ObjectType<{
240
239
  baseUrl: string;
241
240
  zones: {
242
241
  zonePrefix: string;
package/dist/index.mjs CHANGED
@@ -13,13 +13,16 @@ function createBasicAuthorizationHeaderValue(options) {
13
13
  });
14
14
  return `Basic ${encodeUint8ArrayToBase64(new TextEncoder().encode(`${options.username}:${options.password}`))}`;
15
15
  }
16
+ //#endregion
17
+ //#region src/schemas.ts
18
+ const BasicAuthZoneConfigSchema = type({
19
+ zonePrefix: "string > 0",
20
+ "loginSubpath?": "string"
21
+ });
16
22
  const BasicAuthContextClientConfigSchema = type({
17
23
  "id?": "string > 0",
18
24
  baseUrl: "string > 0",
19
- zones: type({
20
- zonePrefix: "string > 0",
21
- "loginSubpath?": "string"
22
- }).array().atLeastLength(1),
25
+ zones: BasicAuthZoneConfigSchema.array().atLeastLength(1),
23
26
  "probePath?": "string > 0",
24
27
  "autoStart?": "boolean",
25
28
  "tracing?": {
@@ -279,7 +282,14 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
279
282
  }
280
283
  };
281
284
  }
282
- let _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _initProto;
285
+ let _dec;
286
+ let _dec1;
287
+ let _dec2;
288
+ let _dec3;
289
+ let _dec4;
290
+ let _dec5;
291
+ let _dec6;
292
+ let _initProto;
283
293
  const DEFAULT_LOGIN_SUBPATH = "/login";
284
294
  const POST_AUTH_REDIRECT_PARAM = "post_auth_redirect_uri";
285
295
  const instrumentBasicAuthMethod = defineInstrumentMethodDecorator(({ factoryArgs: [operation] }) => function() {
@@ -662,7 +672,8 @@ _dec = instrumentBasicAuthMethod("start"), _dec1 = withDisposableStack(0, true),
662
672
  async _executeRefresh(options, cancellationToken, operationSpan) {
663
673
  cancellationToken.throwIfCancellationRequested();
664
674
  this._operationSignals.refreshPending.set(true);
665
- const loadingSnapshot = reduceResourceSnapshot(this._boundarySnapshotSignal.get(), { kind: ResourceSnapshotUpdateKind.Load });
675
+ const previous = this._boundarySnapshotSignal.get();
676
+ const loadingSnapshot = reduceResourceSnapshot(previous, { kind: ResourceSnapshotUpdateKind.Load });
666
677
  this._boundarySnapshotSignal.set(loadingSnapshot);
667
678
  this._emitEvent({
668
679
  type: BasicAuthContextEventType.BoundaryRefreshStarted,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["ClientError","ClientErrorKind","encodeUint8ArrayToBase64","createBasicAuthorizationHeaderValue","options","username","includes","kind","Configuration","code","message","source","TextEncoder","encode","password","type","defineType","BasicAuthZoneConfigSchema","zonePrefix","BasicAuthContextClientConfigSchema","baseUrl","zones","array","atLeastLength","SecuritydeptInjectionToken","BASIC_AUTH_CONTEXT_CLIENT","BASIC_AUTH_CONTEXT_CLIENT_CONFIG","BasicAuthContextErrorCode","OperationFailed","InvalidConfig","ClientDisposed","RouterUnavailable","ProbePathRequired","ZoneNotFound","ZoneRequired","BasicAuthBoundaryKind","Authenticated","Challenge","Unauthorized","BasicAuthContextSource","BasicAuthContext","BasicAuthContextEventType","BoundaryRefreshStarted","BoundaryRefreshSucceeded","BoundaryRefreshFailed","LogoutStarted","LogoutSucceeded","LogoutFailed","LoginRedirectStarted","LoginRedirectSucceeded","LoginRedirectFailed","AuthGuardResultKind","Ok","Redirect","AuthGuardRedirectStatus","Found","SeeOther","TemporaryRedirect","ClientError","ClientErrorKind","createCancellationTokenSource","createLinkedCancellationToken","createOnceAsyncLockCallable","createSignal","defineInstrumentMethodDecorator","describeError","ENVIRONMENT_TOKEN","injectDisposableStackFrom","mapResource","ResourceSnapshotUpdateKind","ResourceStatus","RouterNavigationIntent","RouterNavigationMode","readonlySignal","reduceResourceSnapshot","resourceFromSnapshots","SecuritydeptDestroyRef","SYMBOL_DISPOSE","throwValidationClientError","UriReferenceString","validateTraitInput","withDisposableStack","commandResponseData","concatCommand","dispatchCommandLocallyToStream","RxEventReplaySubject","RxEventSubject","RxStateSignal","filter","from","lastValueFrom","take","takeUntil","v7","uuidv7","BasicAuthContextClientConfigSchema","BASIC_AUTH_CONTEXT_CLIENT_CONFIG","AuthGuardRedirectStatus","AuthGuardResultKind","BasicAuthBoundaryKind","BasicAuthBoundaryKindValues","BasicAuthContextErrorCode","BasicAuthContextEventType","BasicAuthContextSource","DEFAULT_LOGIN_SUBPATH","POST_AUTH_REDIRECT_PARAM","instrumentBasicAuthMethod","factoryArgs","operation","environment","span","name","config","tracing","prefix","target","fields","normalizeError","error","fromUnknown","code","OperationFailed","message","source","BasicAuthContext","resolveZone","zonePrefix","replace","loginSub","loginSubpath","loginPath","readBasicAuthBoundaryKind","options","status","Authenticated","challengeHeader","Challenge","Unauthorized","BasicAuthContextClient","_start","refresh","_refresh","logout","_logout","loginWithRedirect","_loginWithRedirect","defaultOptions","_environment","_config","_span","_rootCancellation","_destroyed","fromInitialValue","destroyed$","pipe","value","_boundarySnapshotSignal","Idle","_operationSignals","startPending","refreshPending","logoutPending","loginRedirectPending","_eventSubject","_refreshCommandSubject","_refreshResponseSubject","_startOnce","cancellationToken","operationSpan","throwIfCancellationRequested","set","_dispatchRefresh","_resolveRefreshOptions","id","zones","boundarySnapshot","boundaryResource","isAuthenticated","operations","events","fromEnvironmentConfig","fromInjector","injector","client","get","onDestroy","dispose","bundledSchema","onInvalid","failure","InvalidConfig","messagePrefix","resolvedConfig","baseUrl","map","probePath","fork","attributes","clientName","snapshot","authenticated","subscribe","cancel","kind","Cancelled","ClientDisposed","command","_executeRefresh","payload","autoStart","start","catch","token","disposableStack","use","_options","_emitEvent","type","LogoutStarted","_readCurrentSnapshot","Resolved","setAttributes","localProjectionCleared","LogoutSucceeded","LogoutFailed","errorSummary","_operationSpan","router","Configuration","RouterUnavailable","zone","_resolveZoneForAction","postAuthRedirectUri","currentPath","LoginRedirectStarted","navigate","url","parse","loginUrl","intent","AuthRedirect","mode","External","LoginRedirectSucceeded","LoginRedirectFailed","zoneForPath","path","matchedZone","matches","startsWith","length","zoneForPrefix","find","isInZone","undefined","base","params","URLSearchParams","toString","loginUrlForZonePrefix","handleUnauthorized","responseStatus","Ok","Redirect","Found","location","ProbePathRequired","action","ZoneNotFound","ZoneRequired","requestStream","responseStream","createCommandExtra","previous","loadingSnapshot","Load","BoundaryRefreshStarted","response","transport","execute","method","headers","accept","fromHttpResponse","body","_snapshotFromResponse","Resolve","boundaryKind","BoundaryRefreshSucceeded","Fail","BoundaryRefreshFailed","requestPath","Reloading","Error","input","next","at","time","now","INJECTOR_TOKEN","BasicAuthContextClient","BASIC_AUTH_CONTEXT_CLIENT","BASIC_AUTH_CONTEXT_CLIENT_CONFIG","provideBasicAuthContext","options","provide","useValue","config","useFactory","injector","fromInjector","deps"],"sources":["../src/authorization-header.ts","../src/schemas.ts","../src/tokens.ts","../src/types.ts","../src/client.ts","../src/providers.ts"],"sourcesContent":["import {\n\tClientError,\n\tClientErrorKind,\n\tencodeUint8ArrayToBase64,\n} from \"@securitydept/client\";\n\nexport interface CreateBasicAuthorizationHeaderValueOptions {\n\treadonly username: string;\n\treadonly password: string;\n}\n\nexport function createBasicAuthorizationHeaderValue(\n\toptions: CreateBasicAuthorizationHeaderValueOptions,\n): string {\n\tif (options.username.includes(\":\")) {\n\t\tthrow new ClientError({\n\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\tcode: \"basic_auth.authorization_header.username_contains_colon\",\n\t\t\tmessage: \"A Basic authentication username cannot contain a colon.\",\n\t\t\tsource: \"basic_auth\",\n\t\t});\n\t}\n\n\treturn `Basic ${encodeUint8ArrayToBase64(\n\t\tnew TextEncoder().encode(`${options.username}:${options.password}`),\n\t)}`;\n}\n","import { type as defineType } from \"arktype\";\n\nexport const BasicAuthZoneConfigSchema = defineType({\n\tzonePrefix: \"string > 0\",\n\t\"loginSubpath?\": \"string\",\n});\n\nexport const BasicAuthContextClientConfigSchema = defineType({\n\t\"id?\": \"string > 0\",\n\tbaseUrl: \"string > 0\",\n\tzones: BasicAuthZoneConfigSchema.array().atLeastLength(1),\n\t\"probePath?\": \"string > 0\",\n\t\"autoStart?\": \"boolean\",\n\t\"tracing?\": {\n\t\t\"target?\": \"string > 0\",\n\t\t\"prefix?\": \"string > 0\",\n\t},\n});\n","import { SecuritydeptInjectionToken } from \"@securitydept/client\";\nimport { type BasicAuthContextClient } from \"./client\";\nimport { type BasicAuthContextClientConfig } from \"./types\";\n\nexport const BASIC_AUTH_CONTEXT_CLIENT =\n\tnew SecuritydeptInjectionToken<BasicAuthContextClient>(\n\t\t\"BASIC_AUTH_CONTEXT_CLIENT\",\n\t);\n\nexport const BASIC_AUTH_CONTEXT_CLIENT_CONFIG =\n\tnew SecuritydeptInjectionToken<BasicAuthContextClientConfig>(\n\t\t\"BASIC_AUTH_CONTEXT_CLIENT_CONFIG\",\n\t);\n","// --- Basic Auth Context Client types ---\n\nimport {\n\ttype CancellationTokenOptions,\n\ttype ErrorSummary,\n\ttype ReadableSignalTrait,\n\ttype ResourceSnapshot,\n\ttype ResourceTrait,\n} from \"@securitydept/client\";\n\n/** Configuration for a single Basic Auth zone. */\nexport const BasicAuthContextErrorCode = {\n\tOperationFailed: \"basic_auth.operation_failed\",\n\tInvalidConfig: \"basic_auth.invalid_config\",\n\tClientDisposed: \"basic_auth.client_disposed\",\n\tRouterUnavailable: \"basic_auth.router_unavailable\",\n\tProbePathRequired: \"basic_auth.probe_path_required\",\n\tZoneNotFound: \"basic_auth.zone_not_found\",\n\tZoneRequired: \"basic_auth.zone_required\",\n} as const;\n\nexport type BasicAuthContextErrorCode =\n\t(typeof BasicAuthContextErrorCode)[keyof typeof BasicAuthContextErrorCode];\n\nexport interface BasicAuthZoneConfig {\n\t/** URL path prefix for this zone (e.g. \"/basic\"). */\n\tzonePrefix: string;\n\t/** Login subpath relative to zone prefix (default: \"/login\"). */\n\tloginSubpath?: string;\n}\n\n/** Configuration for the Basic Auth Context Client. */\nexport interface BasicAuthContextClientConfig {\n\tid?: string;\n\t/** Base URL of the SecurityDept server. */\n\tbaseUrl: string;\n\t/** One or more Basic Auth zones to manage. */\n\tzones: BasicAuthZoneConfig[];\n\t/** Protected endpoint used by start()/refresh() to observe the boundary. */\n\tprobePath?: string;\n\tautoStart?: boolean;\n\ttracing?: BasicAuthContextClientTracingOptions;\n}\n\nexport interface BasicAuthContextClientTracingOptions {\n\ttarget?: string;\n\tprefix?: string;\n}\n\nexport interface ResolvedBasicAuthContextClientConfig {\n\tid: string;\n\tbaseUrl: string;\n\tzones: readonly ResolvedBasicAuthZone[];\n\tprobePath?: string;\n\ttracing: Required<BasicAuthContextClientTracingOptions>;\n}\n\nexport const BasicAuthBoundaryKind = {\n\tAuthenticated: \"authenticated\",\n\tChallenge: \"challenge\",\n\tUnauthorized: \"unauthorized\",\n} as const;\n\nexport type BasicAuthBoundaryKind =\n\t(typeof BasicAuthBoundaryKind)[keyof typeof BasicAuthBoundaryKind];\n\nexport interface BasicAuthBoundaryObservation {\n\tstatus: number;\n\tchallengeHeader?: string | null;\n\trequestPath?: string;\n}\n\nexport interface BasicAuthBoundarySnapshot {\n\tauthenticated: boolean;\n\tboundaryKind: BasicAuthBoundaryKind;\n\tstatus: number;\n\tpath: string;\n\tchallengeHeader: string | null;\n\tzone?: ResolvedBasicAuthZone;\n}\n\nexport const BasicAuthContextSource = {\n\tBasicAuthContext: \"basic-auth-context\",\n} as const;\n\nexport type BasicAuthContextSource =\n\t(typeof BasicAuthContextSource)[keyof typeof BasicAuthContextSource];\n\nexport const BasicAuthContextEventType = {\n\tBoundaryRefreshStarted: \"basic_auth.boundary.refresh.started\",\n\tBoundaryRefreshSucceeded: \"basic_auth.boundary.refresh.succeeded\",\n\tBoundaryRefreshFailed: \"basic_auth.boundary.refresh.failed\",\n\t/** These logout events describe local boundary-projection clearing only. */\n\tLogoutStarted: \"basic_auth.logout.started\",\n\tLogoutSucceeded: \"basic_auth.logout.succeeded\",\n\tLogoutFailed: \"basic_auth.logout.failed\",\n\tLoginRedirectStarted: \"basic_auth.login.redirect.started\",\n\tLoginRedirectSucceeded: \"basic_auth.login.redirect.succeeded\",\n\tLoginRedirectFailed: \"basic_auth.login.redirect.failed\",\n} as const;\n\nexport type BasicAuthContextEventType =\n\t(typeof BasicAuthContextEventType)[keyof typeof BasicAuthContextEventType];\n\nexport interface BasicAuthContextEvent {\n\ttype: BasicAuthContextEventType;\n\tat: number;\n\tclient: {\n\t\tid: string;\n\t};\n\tsnapshot?: BasicAuthBoundarySnapshot | null;\n\tzone?: ResolvedBasicAuthZone;\n\terrorSummary?: ErrorSummary;\n}\n\nexport interface BasicAuthContextOperationSignals {\n\treadonly startPending: ReadableSignalTrait<boolean>;\n\treadonly refreshPending: ReadableSignalTrait<boolean>;\n\treadonly logoutPending: ReadableSignalTrait<boolean>;\n\treadonly loginRedirectPending: ReadableSignalTrait<boolean>;\n}\n\nexport interface BasicAuthRefreshOptions extends CancellationTokenOptions {\n\tpath?: string;\n}\n\nexport type BasicAuthZoneSelectionOptions =\n\t| {\n\t\t\tcurrentPath: string;\n\t\t\tzonePrefix?: never;\n\t }\n\t| {\n\t\t\tzonePrefix: string;\n\t\t\tcurrentPath?: never;\n\t };\n\n/** Options for clearing the client's in-memory boundary projection. */\nexport interface BasicAuthLogoutOptions extends CancellationTokenOptions {}\n\nexport type BasicAuthLoginWithRedirectOptions = BasicAuthZoneSelectionOptions &\n\tCancellationTokenOptions & {\n\t\tpostAuthRedirectUri?: string;\n\t};\n\nexport const AuthGuardResultKind = {\n\tOk: \"ok\",\n\tRedirect: \"redirect\",\n} as const;\n\nexport type AuthGuardResultKind =\n\t(typeof AuthGuardResultKind)[keyof typeof AuthGuardResultKind];\n\nexport const AuthGuardRedirectStatus = {\n\tFound: 302,\n\tSeeOther: 303,\n\tTemporaryRedirect: 307,\n} as const;\n\nexport type AuthGuardRedirectStatus =\n\t(typeof AuthGuardRedirectStatus)[keyof typeof AuthGuardRedirectStatus];\n\n/** Redirect instruction — framework-neutral result. */\nexport type AuthGuardResult<T> =\n\t| { kind: typeof AuthGuardResultKind.Ok; value: T }\n\t| {\n\t\t\tkind: typeof AuthGuardResultKind.Redirect;\n\t\t\tstatus: AuthGuardRedirectStatus;\n\t\t\tlocation: string;\n\t };\n\n/** Resolved zone with computed paths. */\nexport interface ResolvedBasicAuthZone {\n\tzonePrefix: string;\n\tloginPath: string;\n}\n\nexport interface BasicAuthContextClientStateSignals {\n\treadonly boundarySnapshot: ReadableSignalTrait<\n\t\tResourceSnapshot<BasicAuthBoundarySnapshot | null>\n\t>;\n\treadonly boundaryResource: ResourceTrait<BasicAuthBoundarySnapshot | null>;\n\treadonly isAuthenticated: ResourceTrait<boolean>;\n}\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\tthrowValidationClientError,\n\tUriReferenceString,\n\tvalidateTraitInput,\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 { BasicAuthContextClientConfigSchema } from \"./schemas\";\nimport { BASIC_AUTH_CONTEXT_CLIENT_CONFIG } from \"./tokens\";\nimport {\n\tAuthGuardRedirectStatus,\n\ttype AuthGuardResult,\n\tAuthGuardResultKind,\n\ttype BasicAuthBoundaryKind,\n\tBasicAuthBoundaryKind as BasicAuthBoundaryKindValues,\n\ttype BasicAuthBoundaryObservation,\n\ttype BasicAuthBoundarySnapshot,\n\ttype BasicAuthContextClientConfig,\n\tBasicAuthContextErrorCode,\n\ttype BasicAuthContextEvent,\n\tBasicAuthContextEventType,\n\ttype BasicAuthContextOperationSignals,\n\tBasicAuthContextSource,\n\ttype BasicAuthLoginWithRedirectOptions,\n\ttype BasicAuthLogoutOptions,\n\ttype BasicAuthRefreshOptions,\n\ttype BasicAuthZoneConfig,\n\ttype BasicAuthZoneSelectionOptions,\n\ttype ResolvedBasicAuthContextClientConfig,\n\ttype ResolvedBasicAuthZone,\n} from \"./types\";\n\nconst DEFAULT_LOGIN_SUBPATH = \"/login\";\nconst POST_AUTH_REDIRECT_PARAM = \"post_auth_redirect_uri\";\n\ninterface BasicAuthCommandExtra {\n\tcancellationToken: CancellationTokenTrait;\n\toperationSpan?: OperationSpanTrait;\n}\n\ntype ResolvedBasicAuthRefreshOptions = { path: string };\n\ntype BasicAuthRefreshCommand = Command<\n\tResolvedBasicAuthRefreshOptions,\n\tBasicAuthCommandExtra\n>;\n\nconst instrumentBasicAuthMethod = defineInstrumentMethodDecorator<\n\t[operation: string],\n\tBasicAuthContextClient\n>(\n\t({ factoryArgs: [operation] }) =>\n\t\tfunction (this: BasicAuthContextClient) {\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: BasicAuthContextErrorCode.OperationFailed,\n\t\t\t\t\t\tmessage: \"The Basic Auth operation failed unexpectedly\",\n\t\t\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t\t\t}),\n\t\t\t};\n\t\t},\n);\n\nfunction resolveZone(config: BasicAuthZoneConfig): ResolvedBasicAuthZone {\n\tconst prefix = config.zonePrefix.replace(/\\/+$/, \"\");\n\tconst loginSub = config.loginSubpath ?? DEFAULT_LOGIN_SUBPATH;\n\n\treturn {\n\t\tzonePrefix: prefix,\n\t\tloginPath: prefix + loginSub,\n\t};\n}\n\nexport function readBasicAuthBoundaryKind(\n\toptions: BasicAuthBoundaryObservation,\n): BasicAuthBoundaryKind {\n\tif (options.status < 400) {\n\t\treturn BasicAuthBoundaryKindValues.Authenticated;\n\t}\n\n\tif (options.challengeHeader) {\n\t\treturn BasicAuthBoundaryKindValues.Challenge;\n\t}\n\n\treturn BasicAuthBoundaryKindValues.Unauthorized;\n}\n\n/**\n * Basic Auth Context Client.\n *\n * Owns zone-aware Basic Auth boundary observations and login navigation.\n * It does not manage browser credentials or principal data.\n */\nexport class BasicAuthContextClient implements DisposableTrait {\n\tstatic defaultOptions = {\n\t\tloginSubpath: DEFAULT_LOGIN_SUBPATH,\n\t\ttracing: {\n\t\t\ttarget: \"basic-auth-context-client\",\n\t\t\tprefix: \"basic_auth_context\",\n\t\t},\n\t} as const;\n\n\tprivate readonly _environment: FoundationEnvironment;\n\tprivate readonly _config: ResolvedBasicAuthContextClientConfig;\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 _boundarySnapshotSignal = RxStateSignal.fromInitialValue<\n\t\tResourceSnapshot<BasicAuthBoundarySnapshot | 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<BasicAuthContextEvent>(100);\n\tprivate readonly _refreshCommandSubject =\n\t\tnew RxEventSubject<BasicAuthRefreshCommand>();\n\tprivate readonly _refreshResponseSubject = new RxEventSubject<\n\t\tCommandResponse<BasicAuthRefreshCommand, BasicAuthBoundarySnapshot>\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(\n\t\t\t\t\tthis._resolveRefreshOptions({}),\n\t\t\t\t\tcancellationToken,\n\t\t\t\t\toperationSpan,\n\t\t\t\t);\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 zones: readonly ResolvedBasicAuthZone[];\n\treadonly boundarySnapshot: ReadableSignalTrait<\n\t\tResourceSnapshot<BasicAuthBoundarySnapshot | null>\n\t>;\n\treadonly boundaryResource: ResourceTrait<BasicAuthBoundarySnapshot | null>;\n\treadonly isAuthenticated: ResourceTrait<boolean>;\n\treadonly operations: BasicAuthContextOperationSignals;\n\treadonly events: EventStreamTrait<BasicAuthContextEvent>;\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(): ResolvedBasicAuthContextClientConfig {\n\t\treturn this._config;\n\t}\n\n\tstatic fromEnvironmentConfig(options: {\n\t\treadonly config: BasicAuthContextClientConfig;\n\t\treadonly environment: FoundationEnvironment;\n\t}): BasicAuthContextClient {\n\t\treturn new BasicAuthContextClient(options.config, options.environment);\n\t}\n\n\tstatic fromInjector(\n\t\tinjector: SecuritydeptInjectorTrait,\n\t): BasicAuthContextClient {\n\t\tconst client = BasicAuthContextClient.fromEnvironmentConfig({\n\t\t\tconfig: injector.get(BASIC_AUTH_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: BasicAuthContextClientConfig,\n\t\tenvironment: FoundationEnvironment,\n\t) {\n\t\tvalidateTraitInput({\n\t\t\tvalue: config,\n\t\t\tbundledSchema: BasicAuthContextClientConfigSchema,\n\t\t\tonInvalid: (failure) =>\n\t\t\t\tthrowValidationClientError({\n\t\t\t\t\tcode: BasicAuthContextErrorCode.InvalidConfig,\n\t\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t\t\tmessagePrefix: \"BasicAuthContextClient could not validate config\",\n\t\t\t\t\tfailure,\n\t\t\t\t}),\n\t\t});\n\t\tconst resolvedConfig: ResolvedBasicAuthContextClientConfig = {\n\t\t\tid: config.id ?? uuidv7(),\n\t\t\tbaseUrl: (config.baseUrl ?? \"\").replace(/\\/+$/, \"\"),\n\t\t\tzones: (config.zones ?? []).map(resolveZone),\n\t\t\tprobePath: config.probePath,\n\t\t\ttracing: {\n\t\t\t\ttarget:\n\t\t\t\t\tconfig.tracing?.target ??\n\t\t\t\t\tBasicAuthContextClient.defaultOptions.tracing.target,\n\t\t\t\tprefix:\n\t\t\t\t\tconfig.tracing?.prefix ??\n\t\t\t\t\tBasicAuthContextClient.defaultOptions.tracing.prefix,\n\t\t\t},\n\t\t};\n\n\t\tthis._environment = environment;\n\t\tthis._config = resolvedConfig;\n\t\tthis.id = resolvedConfig.id;\n\t\tthis.zones = resolvedConfig.zones;\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.boundarySnapshot = readonlySignal(this._boundarySnapshotSignal);\n\t\tthis.boundaryResource = resourceFromSnapshots(() =>\n\t\t\tthis._boundarySnapshotSignal.get(),\n\t\t);\n\t\tthis.isAuthenticated = mapResource(\n\t\t\tthis.boundaryResource,\n\t\t\t(snapshot) => snapshot?.authenticated === true,\n\t\t);\n\t\tthis.operations = {\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: BasicAuthContextErrorCode.ClientDisposed,\n\t\t\t\t\tmessage: \"BasicAuthContextClient has been disposed.\",\n\t\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.isAuthenticated.dispose();\n\t\t\tthis.boundaryResource.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.payload,\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\tif (config.autoStart === true) {\n\t\t\tthis.start().catch(() => {\n\t\t\t\t// Startup failure is reflected by boundarySnapshot.\n\t\t\t});\n\t\t}\n\t}\n\n\tasync start(): Promise<BasicAuthBoundarySnapshot> {\n\t\tconst cancellationToken = this._rootCancellation.token;\n\t\treturn await this._start(cancellationToken);\n\t}\n\n\t@instrumentBasicAuthMethod(\"start\")\n\tprivate async _start(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\treturn await this._startOnce(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync refresh(\n\t\toptions: BasicAuthRefreshOptions = {},\n\t): Promise<BasicAuthBoundarySnapshot> {\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(options, cancellationToken);\n\t}\n\n\t@instrumentBasicAuthMethod(\"refresh\")\n\tprivate async _refresh(\n\t\toptions: BasicAuthRefreshOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\treturn await this._dispatchRefresh(\n\t\t\tthis._resolveRefreshOptions(options),\n\t\t\tcancellationToken,\n\t\t\toperationSpan,\n\t\t);\n\t}\n\n\t/**\n\t * Clears only this client's in-memory Basic Auth boundary projection.\n\t *\n\t * Browsers own HTTP Basic credentials. This method cannot revoke or clear\n\t * those credentials, and a later probe may observe an authenticated state\n\t * again when the browser continues sending them.\n\t */\n\t@withDisposableStack(0, true)\n\tasync logout(options: BasicAuthLogoutOptions = {}): 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\treturn await this._logout(options, cancellationToken);\n\t}\n\n\t@instrumentBasicAuthMethod(\"logout\")\n\tprivate async _logout(\n\t\t_options: BasicAuthLogoutOptions,\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\tthis._emitEvent({\n\t\t\ttype: BasicAuthContextEventType.LogoutStarted,\n\t\t\tsnapshot: this._readCurrentSnapshot(),\n\t\t});\n\t\ttry {\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._boundarySnapshotSignal.set({\n\t\t\t\tstatus: ResourceStatus.Resolved,\n\t\t\t\tvalue: null,\n\t\t\t});\n\t\t\toperationSpan?.setAttributes({ localProjectionCleared: true });\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LogoutSucceeded,\n\t\t\t\tsnapshot: null,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LogoutFailed,\n\t\t\t\tsnapshot: this._readCurrentSnapshot(),\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\t@withDisposableStack(0, true)\n\tasync loginWithRedirect(\n\t\toptions: BasicAuthLoginWithRedirectOptions,\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@instrumentBasicAuthMethod(\"login.redirect\")\n\tprivate async _loginWithRedirect(\n\t\toptions: BasicAuthLoginWithRedirectOptions,\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: BasicAuthContextErrorCode.RouterUnavailable,\n\t\t\t\tmessage: \"loginWithRedirect() requires environment.router.\",\n\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t});\n\t\t}\n\t\tconst zone = this._resolveZoneForAction(options, \"login redirect\");\n\t\tconst postAuthRedirectUri =\n\t\t\toptions.postAuthRedirectUri ?? options.currentPath;\n\n\t\tthis._operationSignals.loginRedirectPending.set(true);\n\t\tthis._emitEvent({\n\t\t\ttype: BasicAuthContextEventType.LoginRedirectStarted,\n\t\t\tzone,\n\t\t});\n\t\ttry {\n\t\t\tawait router.navigate({\n\t\t\t\turl: UriReferenceString.parse(this.loginUrl(zone, postAuthRedirectUri)),\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\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LoginRedirectSucceeded,\n\t\t\t\tzone,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LoginRedirectFailed,\n\t\t\t\tzone,\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.loginRedirectPending.set(false);\n\t\t}\n\t}\n\n\t/** Find the zone that contains the given path. */\n\tzoneForPath(path: string): ResolvedBasicAuthZone | undefined {\n\t\tlet matchedZone: ResolvedBasicAuthZone | undefined;\n\n\t\tfor (const zone of this.zones) {\n\t\t\tconst matches =\n\t\t\t\tpath === zone.zonePrefix || path.startsWith(`${zone.zonePrefix}/`);\n\t\t\tif (!matches) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!matchedZone ||\n\t\t\t\tzone.zonePrefix.length > matchedZone.zonePrefix.length\n\t\t\t) {\n\t\t\t\tmatchedZone = zone;\n\t\t\t}\n\t\t}\n\n\t\treturn matchedZone;\n\t}\n\n\tzoneForPrefix(zonePrefix: string): ResolvedBasicAuthZone | undefined {\n\t\treturn this.zones.find((zone) => zone.zonePrefix === zonePrefix);\n\t}\n\n\t/** Check whether a path falls inside any configured zone. */\n\tisInZone(path: string): boolean {\n\t\treturn this.zoneForPath(path) !== undefined;\n\t}\n\n\t/** Build the full login URL for a zone, optionally with a post-auth redirect. */\n\tloginUrl(zone: ResolvedBasicAuthZone, postAuthRedirectUri?: string): string {\n\t\tconst base = this._config.baseUrl + zone.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\tloginUrlForZonePrefix(\n\t\tzonePrefix: string,\n\t\tpostAuthRedirectUri?: string,\n\t): string | null {\n\t\tconst zone = this.zoneForPrefix(zonePrefix);\n\t\treturn zone ? this.loginUrl(zone, postAuthRedirectUri) : null;\n\t}\n\n\t/**\n\t * Handle a 401 response: if the current path is inside a zone,\n\t * return a redirect instruction to the zone's login URL.\n\t */\n\thandleUnauthorized(\n\t\tcurrentPath: string,\n\t\tresponseStatus: number,\n\t): AuthGuardResult<null> {\n\t\tif (responseStatus !== 401) {\n\t\t\treturn { kind: AuthGuardResultKind.Ok, value: null };\n\t\t}\n\n\t\tconst zone = this.zoneForPath(currentPath);\n\t\tif (!zone) {\n\t\t\treturn { kind: AuthGuardResultKind.Ok, value: null };\n\t\t}\n\n\t\treturn {\n\t\t\tkind: AuthGuardResultKind.Redirect,\n\t\t\tstatus: AuthGuardRedirectStatus.Found,\n\t\t\tlocation: this.loginUrl(zone, currentPath),\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 _resolveRefreshOptions(\n\t\toptions: BasicAuthRefreshOptions,\n\t): ResolvedBasicAuthRefreshOptions {\n\t\tconst path = options.path ?? this._config.probePath;\n\t\tif (!path) {\n\t\t\tthrow new ClientError({\n\t\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\t\tcode: BasicAuthContextErrorCode.ProbePathRequired,\n\t\t\t\tmessage:\n\t\t\t\t\t\"BasicAuthContextClient.refresh() requires options.path or config.probePath.\",\n\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t});\n\t\t}\n\t\treturn { path };\n\t}\n\n\tprivate _resolveZoneForAction(\n\t\toptions: BasicAuthZoneSelectionOptions,\n\t\taction: string,\n\t): ResolvedBasicAuthZone {\n\t\tif (options.zonePrefix) {\n\t\t\tconst zone = this.zoneForPrefix(options.zonePrefix);\n\t\t\tif (zone) {\n\t\t\t\treturn zone;\n\t\t\t}\n\t\t\tthrow new ClientError({\n\t\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\t\tcode: BasicAuthContextErrorCode.ZoneNotFound,\n\t\t\t\tmessage: `BasicAuthContextClient ${action} could not find zone \"${options.zonePrefix}\".`,\n\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t});\n\t\t}\n\n\t\tconst zone =\n\t\t\ttypeof options.currentPath === \"string\"\n\t\t\t\t? this.zoneForPath(options.currentPath)\n\t\t\t\t: undefined;\n\t\tif (zone) {\n\t\t\treturn zone;\n\t\t}\n\n\t\tthrow new ClientError({\n\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\tcode: BasicAuthContextErrorCode.ZoneRequired,\n\t\t\tmessage: `BasicAuthContextClient ${action} requires options.currentPath inside a configured zone or options.zonePrefix.`,\n\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t});\n\t}\n\n\tprivate async _dispatchRefresh(\n\t\tpayload: ResolvedBasicAuthRefreshOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst snapshot = await lastValueFrom(\n\t\t\tdispatchCommandLocallyToStream<\n\t\t\t\tResolvedBasicAuthRefreshOptions,\n\t\t\t\tBasicAuthCommandExtra,\n\t\t\t\tBasicAuthBoundarySnapshot,\n\t\t\t\tBasicAuthRefreshCommand\n\t\t\t>({\n\t\t\t\tpayload,\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 snapshot;\n\t}\n\n\tprivate async _executeRefresh(\n\t\toptions: ResolvedBasicAuthRefreshOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tthis._operationSignals.refreshPending.set(true);\n\t\tconst previous = this._boundarySnapshotSignal.get();\n\t\tconst loadingSnapshot = reduceResourceSnapshot(previous, {\n\t\t\tkind: ResourceSnapshotUpdateKind.Load,\n\t\t});\n\t\tthis._boundarySnapshotSignal.set(loadingSnapshot);\n\t\tthis._emitEvent({\n\t\t\ttype: BasicAuthContextEventType.BoundaryRefreshStarted,\n\t\t\tsnapshot: this._readCurrentSnapshot(),\n\t\t});\n\t\ttry {\n\t\t\tconst response = await this._environment.transport.execute({\n\t\t\t\turl: this._config.baseUrl + options.path,\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: { accept: \"application/json\" },\n\t\t\t\tcancellationToken,\n\t\t\t});\n\t\t\tif (\n\t\t\t\tresponse.status >= 400 &&\n\t\t\t\tresponse.status !== 401 &&\n\t\t\t\tresponse.status !== 403\n\t\t\t) {\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\tconst snapshot = this._snapshotFromResponse(options.path, response);\n\t\t\tthis._boundarySnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Resolve,\n\t\t\t\t\tvalue: snapshot,\n\t\t\t\t}),\n\t\t\t);\n\t\t\toperationSpan?.setAttributes({\n\t\t\t\tauthenticated: snapshot.authenticated,\n\t\t\t\tboundaryKind: snapshot.boundaryKind,\n\t\t\t});\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.BoundaryRefreshSucceeded,\n\t\t\t\tsnapshot,\n\t\t\t\tzone: snapshot.zone,\n\t\t\t});\n\t\t\treturn snapshot;\n\t\t} catch (error) {\n\t\t\tthis._boundarySnapshotSignal.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._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.BoundaryRefreshFailed,\n\t\t\t\tsnapshot: this._readCurrentSnapshot(),\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 _snapshotFromResponse(\n\t\tpath: string,\n\t\tresponse: { status: number; headers: Record<string, string> },\n\t): BasicAuthBoundarySnapshot {\n\t\tconst challengeHeader =\n\t\t\tresponse.headers[\"WWW-Authenticate\"] ??\n\t\t\tresponse.headers[\"www-authenticate\"] ??\n\t\t\tnull;\n\t\tconst zone = this.zoneForPath(path);\n\t\tconst boundaryKind = readBasicAuthBoundaryKind({\n\t\t\tstatus: response.status,\n\t\t\tchallengeHeader,\n\t\t\trequestPath: path,\n\t\t});\n\t\treturn {\n\t\t\tauthenticated: boundaryKind === BasicAuthBoundaryKindValues.Authenticated,\n\t\t\tboundaryKind,\n\t\t\tstatus: response.status,\n\t\t\tpath,\n\t\t\tchallengeHeader,\n\t\t\tzone,\n\t\t};\n\t}\n\n\tprivate _readCurrentSnapshot(): BasicAuthBoundarySnapshot | null {\n\t\tconst snapshot = this._boundarySnapshotSignal.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 _emitEvent(\n\t\tinput: Omit<BasicAuthContextEvent, \"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 { BasicAuthContextClient } from \"./client\";\nimport {\n\tBASIC_AUTH_CONTEXT_CLIENT,\n\tBASIC_AUTH_CONTEXT_CLIENT_CONFIG,\n} from \"./tokens\";\nimport { type BasicAuthContextClientConfig } from \"./types\";\n\nexport interface ProvideBasicAuthContextOptions {\n\treadonly config: BasicAuthContextClientConfig;\n}\n\nexport function provideBasicAuthContext(\n\toptions: ProvideBasicAuthContextOptions,\n): readonly SecuritydeptProvider[] {\n\treturn [\n\t\t{\n\t\t\tprovide: BASIC_AUTH_CONTEXT_CLIENT_CONFIG,\n\t\t\tuseValue: options.config,\n\t\t},\n\t\t{\n\t\t\tprovide: BASIC_AUTH_CONTEXT_CLIENT,\n\t\t\tuseFactory: (injector: SecuritydeptInjectorTrait) =>\n\t\t\t\tBasicAuthContextClient.fromInjector(injector),\n\t\t\tdeps: [INJECTOR_TOKEN],\n\t\t},\n\t];\n}\n"],"mappings":";;;;;;AAWA,SAAgBG,oCACfC,SAAmD;CAEnD,IAAIA,QAAQC,SAASC,SAAS,IAAA,EAC7B,MAAM,IAAIN,YAAY;EACrBO,MAAMN,gBAAgBO;EACtBC,MAAM;EACNC,SAAS;EACTC,QAAQ;EACT,CAAA;CAGD,OAAO,SAAST,yBACf,IAAIU,aAAAA,CAAcC,OAAO,GAAGT,QAAQC,SAAS,GAAGD,QAAQU,WAAU,CAAA;;ACjBpE,MAAaK,qCAAqCH,KAAW;CAC5D,OAAO;CACPI,SAAS;CACTC,OARwCL,KAAW;EACnDE,YAAY;EACZ,iBAAiB;EAClB,CAKQD,CAA0BK,OAAK,CAAGC,cAAc,EAAA;CACvD,cAAc;CACd,cAAc;CACd,YAAY;EACX,WAAW;EACX,WAAW;EACZ;CACD,CAAA;;;ACbA,MAAaE,4BACZ,IAAID,2BACH,4BAAA;AAGF,MAAaE,mCACZ,IAAIF,2BACH,mCAAA;;;mDCAF,MAAaG,4BAA4B;CACxCC,iBAAiB;CACjBC,eAAe;CACfC,gBAAgB;CAChBC,mBAAmB;CACnBC,mBAAmB;CACnBC,cAAc;CACdC,cAAc;CACf;AAsCA,MAAaC,wBAAwB;CACpCC,eAAe;CACfC,WAAW;CACXC,cAAc;CACf;AAoBA,MAAaC,yBAAyB,EACrCC,kBAAkB,sBACnB;AAKA,MAAaC,4BAA4B;CACxCC,wBAAwB;CACxBC,0BAA0B;CAC1BC,uBAAuB;8EAEvBC,eAAe;CACfC,iBAAiB;CACjBC,cAAc;CACdC,sBAAsB;CACtBC,wBAAwB;CACxBC,qBAAqB;CACtB;AA6CA,MAAaC,sBAAsB;CAClCC,IAAI;CACJC,UAAU;CACX;AAKA,MAAaC,0BAA0B;CACtCC,OAAO;CACPC,UAAU;CACVC,mBAAmB;CACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjFA,MAAM+C,wBAAwB;AAC9B,MAAMC,2BAA2B;AAcjC,MAAMC,4BAA4B1C,iCAIhC,EAAE2C,aAAa,CAACC,iBAChB,WAAA;CACC,OAAO;EACNC,aAAa,KAAKA;EAClBC,MAAM,KAAKA;EACXC,MAAM,GAAG,KAAKC,OAAOC,QAAQC,OAAO,GAAGN;EACvCO,QAAQ,KAAKH,OAAOC,QAAQE;EAC5BC,QAAQ,EAAER,WAAU;EACpBS,iBAAiBC,UAChB5D,YAAY6D,YAAYD,OAAO;GAC9BE,MAAMnB,0BAA0BoB;GAChCC,SAAS;GACTC,QAAQpB,uBAAuBqB;GAChC,CAAA;EACF;EACD;AAGF,SAASC,YAAYb,QAA2B;CAC/C,MAAME,SAASF,OAAOc,WAAWC,QAAQ,QAAQ,GAAA;CAGjD,OAAO;EACND,YAAYZ;EACZgB,WAAWhB,UAJKF,OAAOiB,gBAAgBzB;EAKxC;;AAGD,SAAgB2B,0BACfC,SAAqC;CAErC,IAAIA,QAAQC,SAAS,KACpB,OAAOjC,sBAA4BkC;CAGpC,IAAIF,QAAQG,iBACX,OAAOnC,sBAA4BoC;CAGpC,OAAOpC,sBAA4BqC;;OA6MlC/B,0BAA0B,QAAA,EAAA,QAQ1BzB,oBAAoB,GAAG,KAAA,EAAA,QAavByB,0BAA0B,UAAA,EAAA,QAqB1BzB,oBAAoB,GAAG,KAAA,EAAA,QAWvByB,0BAA0B,SAAA,EAAA,QAmC1BzB,oBAAoB,GAAG,KAAA,EAAA,QAavByB,0BAA0B,iBAAA;;;;;;GAzS5B,IAAagC,yBAAb,MAAaA,uBAAAA;;;;;;IAqMEC;;;;;IAQRC;;;;;IAaQC;;;;;IAqBRC;;;;;IAWQC;;;;;IAmCRC;;;;;IAaQC;;;;CAzSd,OAAOC,iBAAiB;EACvBjB,cAAczB;EACdS,SAAS;GACRE,QAAQ;GACRD,QAAQ;GACT;EACD;CAEiBiC;CACAC;CACAC;CACAC,qBAAAA,WAAAA,KAAAA,EAChB1F,+BAAAA;CACgB2F,aAAahE,cAAciE,iBAAiB,MAAA;CAC5CC,aAAahE,KAAK,KAAK8D,WAAU,CAAEG,KACnDlE,QAAQmE,UAAyBA,MAAAA,EACjChE,KAAK,EAAA,CAAA;CAEWiE,0BAA0BrE,cAAciE,iBAEvD,EAAEnB,QAAQ/D,eAAeuF,MAAK,CAAA;CACfC,oBAKb;EACHC,cAAchG,aAAa,MAAA;EAC3BiG,gBAAgBjG,aAAa,MAAA;EAC7BkG,eAAelG,aAAa,MAAA;EAC5BmG,sBAAsBnG,aAAa,MAAA;EACpC;CACiBoG,gBAChB,IAAI9E,qBAA4C,IAAA;CAChC+E,yBAChB,IAAI9E,gBAAAA;CACY+E,0BAA0B,IAAI/E,gBAAAA;CAG9BgF,aAAaxG,4BAC7B,OACCyG,mBACAC,kBAAAA;EAEAD,kBAAkBE,8BAA4B;EAC9C,KAAKX,kBAAkBC,aAAaW,IAAI,KAAA;EACxC,IAAI;GACH,OAAO,MAAM,KAAKC,iBACjB,KAAKC,uBAAuB,EAAC,CAAA,EAC7BL,mBACAC,cAAAA;YAEQ;GACT,KAAKV,kBAAkBC,aAAaW,IAAI,MAAA;;GAE1C;CAGQG;CACAC;CACAC;CAGAC;CACAC;CACAC;CACAC;CAET,IAActE,cAAqC;EAClD,OAAO,KAAKsC;;CAGb,IAAcrC,OAAkB;EAC/B,OAAO,KAAKuC;;CAGb,IAAcrC,SAA+C;EAC5D,OAAO,KAAKoC;;CAGb,OAAOgC,sBAAsBhD,SAGF;EAC1B,OAAO,IAAIM,uBAAuBN,QAAQpB,QAAQoB,QAAQvB,YAAW;;CAGtE,OAAOwE,aACNC,UACyB;EACzB,MAAMC,SAAS7C,uBAAuB0C,sBAAsB;GAC3DpE,QAAQsE,SAASE,IAAIxF,iCAAAA;GACrBa,aAAayE,SAASE,IAAItH,kBAAAA;GAC3B,CAAA;EACAoH,SACEE,IAAI5G,wBAAwB,KAAA,EAC3B6G,gBAAgBF,OAAOG,SAAO,CAAA;EACjC,OAAOH;;CAGR,YACCvE,QACAH,aACC;EACD7B,mBAAmB;GAClB2E,OAAO3C;GACP2E,eAAe5F;GACf6F,YAAYC,YACX/G,2BAA2B;IAC1B0C,MAAMnB,0BAA0ByF;IAChCnE,QAAQpB,uBAAuBqB;IAC/BmE,eAAe;IACfF;IACD,CAAA;GACF,CAAA;EACA,MAAMG,iBAAuD;GAC5DnB,IAAI7D,OAAO6D,MAAM/E,IAAAA;GACjBmG,UAAUjF,OAAOiF,WAAW,IAAIlE,QAAQ,QAAQ,GAAA;GAChD+C,QAAQ9D,OAAO8D,SAAS,EAAE,EAAEoB,IAAIrE,YAAAA;GAChCsE,WAAWnF,OAAOmF;GAClBlF,SAAS;IACRE,QACCH,OAAOC,SAASE,UAChBuB,uBAAuBQ,eAAejC,QAAQE;IAC/CD,QACCF,OAAOC,SAASC,UAChBwB,uBAAuBQ,eAAejC,QAAQC;IAChD;GACD;EAEA,KAAKiC,eAAetC;EACpB,KAAKuC,UAAU4C;EACf,KAAKnB,KAAKmB,eAAenB;EACzB,KAAKC,QAAQkB,eAAelB;EAC5B,KAAKzB,QAAQxC,YAAYC,KAAKsF,KAAK,EAClCC,YAAY;GACXC,YAAY,KAAK,YAAYvF;GAC7B8D,IAAI,KAAKA;GACV,EACD,CAAA;EACA,KAAKE,mBAAmBtG,eAAe,KAAKmF,wBAAuB;EACnE,KAAKoB,mBAAmBrG,4BACvB,KAAKiF,wBAAwB4B,KAAG,CAAA;EAEjC,KAAKP,kBAAkB7G,YACtB,KAAK4G,mBACJuB,aAAaA,UAAUC,kBAAkB,KAAA;EAE3C,KAAKtB,aAAa;GACjBnB,cAActF,eAAe,KAAKqF,kBAAkBC,aAAY;GAChEC,gBAAgBvF,eAAe,KAAKqF,kBAAkBE,eAAc;GACpEC,eAAexF,eAAe,KAAKqF,kBAAkBG,cAAa;GAClEC,sBAAsBzF,eACrB,KAAKqF,kBAAkBI,qBAAoB;GAE7C;EACA,KAAKiB,SAAS,KAAKhB;EACnB,KAAKV,WAAWgD,gBAAU;GACzB,KAAKnD,kBAAkBoD,OACtB,IAAIhJ,YAAY;IACfiJ,MAAMhJ,gBAAgBiJ;IACtBpF,MAAMnB,0BAA0BwG;IAChCnF,SAAS;IACTC,QAAQpB,uBAAuBqB;IAChC,CAAA,CAAA;GAED,KAAKqD,gBAAgBS,SAAO;GAC5B,KAAKV,iBAAiBU,SAAO;IAC9B;EAEAjG,KAAK,KAAK2E,uBAAsB,CAC9BV,KACA9D,UAAU,KAAK6D,WAAU,EACzBtE,eAAe2H,YACd,KAAKC,gBACJD,QAAQE,SACRF,QAAQvC,mBACRuC,QAAQtC,cAAa,CAAA,CAAA,CAIvBiC,UAAU,KAAKpC,wBAAuB;EAExC,IAAIrD,OAAOiG,cAAc,MACxB,KAAKC,OAAK,CAAGC,YAAM,GAEnB;;CAIF,MAAMD,QAA4C;EACjD,MAAM3C,oBAAoB,KAAKjB,kBAAkB8D;EACjD,OAAO,MAAM,KAAKzE,OAAO4B,kBAAAA;;CAG1B,MACc5B,OACb4B,mBACAC,eACqC;EACrC,OAAO,MAAM,KAAKF,WAAWC,mBAAmBC,cAAAA;;CAGjD,MACM5B,QACLR,UAAmC,EAAE,EACA;EACrC,MAAMiF,kBAAkBlJ,0BAA0BiE,SAAS,KAAA;EAC3D,MAAMmC,oBAAoB1G,8BACzB,KAAKyF,kBAAkB8D,OACvBhF,QAAQmC,kBAAiB;EAE1B8C,iBAAiBC,IAAI/C,kBAAAA;EACrB,OAAO,MAAM,KAAK1B,SAAST,SAASmC,kBAAAA;;CAGrC,MACc1B,SACbT,SACAmC,mBACAC,eACqC;EACrCD,kBAAkBE,8BAA4B;EAC9C,OAAO,MAAM,KAAKE,iBACjB,KAAKC,uBAAuBxC,QAAAA,EAC5BmC,mBACAC,cAAAA;;;;;;;;IAWF,MACM1B,OAAOV,UAAkC,EAAE,EAAiB;EACjE,MAAMiF,kBAAkBlJ,0BAA0BiE,SAAS,KAAA;EAC3D,MAAMmC,oBAAoB1G,8BACzB,KAAKyF,kBAAkB8D,OACvBhF,QAAQmC,kBAAiB;EAE1B8C,iBAAiBC,IAAI/C,kBAAAA;EACrB,OAAO,MAAM,KAAKxB,QAAQX,SAASmC,kBAAAA;;CAGpC,MACcxB,QACbwE,UACAhD,mBACAC,eACgB;EAChBD,kBAAkBE,8BAA4B;EAC9C,KAAKX,kBAAkBG,cAAcS,IAAI,KAAA;EACzC,KAAK8C,WAAW;GACfC,MAAMnH,0BAA0BoH;GAChCnB,UAAU,KAAKoB,sBAAoB;GACpC,CAAA;EACA,IAAI;GACHpD,kBAAkBE,8BAA4B;GAC9C,KAAKb,wBAAwBc,IAAI;IAChCrC,QAAQ/D,eAAesJ;IACvBjE,OAAO;IACR,CAAA;GACAa,eAAeqD,cAAc,EAAEC,wBAAwB,MAAK,CAAA;GAC5D,KAAKN,WAAW;IACfC,MAAMnH,0BAA0ByH;IAChCxB,UAAU;IACX,CAAA;WACQjF,OAAO;GACf,KAAKkG,WAAW;IACfC,MAAMnH,0BAA0B0H;IAChCzB,UAAU,KAAKoB,sBAAoB;IACnCM,cAAchK,cAAcqD,MAAAA;IAC7B,CAAA;GACA,MAAMA;YACG;GACT,KAAKwC,kBAAkBG,cAAcS,IAAI,MAAA;;;CAI3C,MACM1B,kBACLZ,SACgB;EAChB,MAAMiF,kBAAkBlJ,0BAA0BiE,SAAS,KAAA;EAC3D,MAAMmC,oBAAoB1G,8BACzB,KAAKyF,kBAAkB8D,OACvBhF,QAAQmC,kBAAiB;EAE1B8C,iBAAiBC,IAAI/C,kBAAAA;EACrB,MAAM,KAAKtB,mBAAmBb,SAASmC,kBAAAA;;CAGxC,MACctB,mBACbb,SACAmC,mBACA2D,gBACgB;EAChB3D,kBAAkBE,8BAA4B;EAC9C,MAAM0D,SAAS,KAAKhF,aAAagF;EACjC,IAAI,CAACA,QACJ,MAAM,IAAIzK,YAAY;GACrBiJ,MAAMhJ,gBAAgByK;GACtB5G,MAAMnB,0BAA0BgI;GAChC3G,SAAS;GACTC,QAAQpB,uBAAuBqB;GAChC,CAAA;EAED,MAAM0G,OAAO,KAAKC,sBAAsBnG,SAAS,iBAAA;EACjD,MAAMoG,sBACLpG,QAAQoG,uBAAuBpG,QAAQqG;EAExC,KAAK3E,kBAAkBI,qBAAqBQ,IAAI,KAAA;EAChD,KAAK8C,WAAW;GACfC,MAAMnH,0BAA0BoI;GAChCJ;GACD,CAAA;EACA,IAAI;GACH,MAAMH,OAAOQ,SAAS;IACrBC,KAAK7J,mBAAmB8J,MAAM,KAAKC,SAASR,MAAME,oBAAAA,CAAAA;IAClDO,QAAQxK,uBAAuByK;IAC/BC,MAAMzK,qBAAqB0K;IAC5B,CAAA;GACA3E,kBAAkBE,8BAA4B;GAC9C,KAAK+C,WAAW;IACfC,MAAMnH,0BAA0B6I;IAChCb;IACD,CAAA;WACQhH,OAAO;GACf,KAAKkG,WAAW;IACfC,MAAMnH,0BAA0B8I;IAChCd;IACAL,cAAchK,cAAcqD,MAAAA;IAC7B,CAAA;GACA,MAAMA;YACG;GACT,KAAKwC,kBAAkBI,qBAAqBQ,IAAI,MAAA;;;oDAKlD2E,YAAYC,MAAiD;EAC5D,IAAIC;EAEJ,KAAK,MAAMjB,QAAQ,KAAKxD,OAAO;GAG9B,IAAI,EADHwE,SAAShB,KAAKxG,cAAcwH,KAAKG,WAAW,GAAGnB,KAAKxG,WAAW,GAAE,GAEjE;GAGD,IACC,CAACyH,eACDjB,KAAKxG,WAAW4H,SAASH,YAAYzH,WAAW4H,QAEhDH,cAAcjB;;EAIhB,OAAOiB;;CAGRI,cAAc7H,YAAuD;EACpE,OAAO,KAAKgD,MAAM8E,MAAMtB,SAASA,KAAKxG,eAAeA,WAAAA;;+DAItD+H,SAASP,MAAuB;EAC/B,OAAO,KAAKD,YAAYC,KAAAA,KAAUQ,KAAAA;;mFAInChB,SAASR,MAA6BE,qBAAsC;EAC3E,MAAMuB,OAAO,KAAK3G,QAAQ6C,UAAUqC,KAAKpG;EACzC,IAAIsG,qBAIH,OAAO,GAAGuB,KAAK,GAAGC,IAHCC,gBAAgB,GACjCxJ,2BAA2B+H,qBAC7B,CACkBwB,CAAOE,UAAQ;EAElC,OAAOH;;CAGRI,sBACCrI,YACA0G,qBACgB;EAChB,MAAMF,OAAO,KAAKqB,cAAc7H,WAAAA;EAChC,OAAOwG,OAAO,KAAKQ,SAASR,MAAME,oBAAAA,GAAuB;;;;;IAO1D4B,mBACC3B,aACA4B,gBACwB;EACxB,IAAIA,mBAAmB,KACtB,OAAO;GAAE1D,MAAMzG,oBAAoBoK;GAAI3G,OAAO;GAAK;EAGpD,MAAM2E,OAAO,KAAKe,YAAYZ,YAAAA;EAC9B,IAAI,CAACH,MACJ,OAAO;GAAE3B,MAAMzG,oBAAoBoK;GAAI3G,OAAO;GAAK;EAGpD,OAAO;GACNgD,MAAMzG,oBAAoBqK;GAC1BlI,QAAQpC,wBAAwBuK;GAChCC,UAAU,KAAK3B,SAASR,MAAMG,YAAAA;GAC/B;;CAGD/C,UAAgB;EACf,KAAKnC,WAAWmB,IAAI,KAAA;;CAGrB,CAAC7F,kBAAwB;EACxB,KAAK6G,SAAO;;CAGLd,uBACPxC,SACkC;EAClC,MAAMkH,OAAOlH,QAAQkH,QAAQ,KAAKlG,QAAQ+C;EAC1C,IAAI,CAACmD,MACJ,MAAM,IAAI5L,YAAY;GACrBiJ,MAAMhJ,gBAAgByK;GACtB5G,MAAMnB,0BAA0BqK;GAChChJ,SACC;GACDC,QAAQpB,uBAAuBqB;GAChC,CAAA;EAED,OAAO,EAAE0H,MAAK;;CAGPf,sBACPnG,SACAuI,QACwB;EACxB,IAAIvI,QAAQN,YAAY;GACvB,MAAMwG,OAAO,KAAKqB,cAAcvH,QAAQN,WAAU;GAClD,IAAIwG,MACH,OAAOA;GAER,MAAM,IAAI5K,YAAY;IACrBiJ,MAAMhJ,gBAAgByK;IACtB5G,MAAMnB,0BAA0BuK;IAChClJ,SAAS,0BAA0BiJ,OAAO,wBAAwBvI,QAAQN,WAAW;IACrFH,QAAQpB,uBAAuBqB;IAChC,CAAA;;EAGD,MAAM0G,OACL,OAAOlG,QAAQqG,gBAAgB,WAC5B,KAAKY,YAAYjH,QAAQqG,YAAW,GACpCqB,KAAAA;EACJ,IAAIxB,MACH,OAAOA;EAGR,MAAM,IAAI5K,YAAY;GACrBiJ,MAAMhJ,gBAAgByK;GACtB5G,MAAMnB,0BAA0BwK;GAChCnJ,SAAS,0BAA0BiJ,OAAO;GAC1ChJ,QAAQpB,uBAAuBqB;GAChC,CAAA;;CAGD,MAAc+C,iBACbqC,SACAzC,mBACAC,eACqC;EACrCD,kBAAkBE,8BAA4B;EAC9C,MAAM8B,WAAW,MAAM7G,cACtBN,+BAKE;GACD4H;GACA8D,eAAe,KAAK1G;GACpB2G,gBAAgB,KAAK1G;GACrB2G,2BAA2B;IAAEzG;IAAmBC;IAAc;GAC/D,CAAA,CAAGd,KAAKxE,qBAAAA,CAAAA,CAAAA;EAETqF,kBAAkBE,8BAA4B;EAC9C,OAAO8B;;CAGR,MAAcQ,gBACb3E,SACAmC,mBACAC,eACqC;EACrCD,kBAAkBE,8BAA4B;EAC9C,KAAKX,kBAAkBE,eAAeU,IAAI,KAAA;EAE1C,MAAMwG,kBAAkBxM,uBADP,KAAKkF,wBAAwB4B,KACCyF,EAAU,EACxDtE,MAAMtI,2BAA2B8M,MAClC,CAAA;EACA,KAAKvH,wBAAwBc,IAAIwG,gBAAAA;EACjC,KAAK1D,WAAW;GACfC,MAAMnH,0BAA0B8K;GAChC7E,UAAU,KAAKoB,sBAAoB;GACpC,CAAA;EACA,IAAI;GACH,MAAM0D,WAAW,MAAM,KAAKlI,aAAamI,UAAUC,QAAQ;IAC1D3C,KAAK,KAAKxF,QAAQ6C,UAAU7D,QAAQkH;IACpCkC,QAAQ;IACRC,SAAS,EAAEC,QAAQ,oBAAmB;IACtCnH;IACD,CAAA;GACA,IACC8G,SAAShJ,UAAU,OACnBgJ,SAAShJ,WAAW,OACpBgJ,SAAShJ,WAAW,KAEpB,MAAM3E,YAAYiO,iBAAiB;IAClCtJ,QAAQgJ,SAAShJ;IACjBuJ,MAAMP,SAASO;IAChB,CAAA;GAGDrH,kBAAkBE,8BAA4B;GAC9C,MAAM8B,WAAW,KAAKsF,sBAAsBzJ,QAAQkH,MAAM+B,SAAAA;GAC1D,KAAKzH,wBAAwBc,IAC5BhG,uBAAuBwM,iBAAiB;IACvCvE,MAAMtI,2BAA2ByN;IACjCnI,OAAO4C;IACR,CAAA,CAAA;GAED/B,eAAeqD,cAAc;IAC5BrB,eAAeD,SAASC;IACxBuF,cAAcxF,SAASwF;IACxB,CAAA;GACA,KAAKvE,WAAW;IACfC,MAAMnH,0BAA0B0L;IAChCzF;IACA+B,MAAM/B,SAAS+B;IAChB,CAAA;GACA,OAAO/B;WACCjF,OAAO;GACf,KAAKsC,wBAAwBc,IAC5BhG,uBAAuBwM,iBAAiB;IACvCvE,MAAMtI,2BAA2B4N;IACjC3K;IACD,CAAA,CAAA;GAED,KAAKkG,WAAW;IACfC,MAAMnH,0BAA0B4L;IAChC3F,UAAU,KAAKoB,sBAAoB;IACnCM,cAAchK,cAAcqD,MAAAA;IAC7B,CAAA;GACA,MAAMA;YACG;GACT,KAAKwC,kBAAkBE,eAAeU,IAAI,MAAA;;;CAIpCmH,sBACPvC,MACA+B,UAC4B;EAC5B,MAAM9I,kBACL8I,SAASI,QAAQ,uBACjBJ,SAASI,QAAQ,uBACjB;EACD,MAAMnD,OAAO,KAAKe,YAAYC,KAAAA;EAC9B,MAAMyC,eAAe5J,0BAA0B;GAC9CE,QAAQgJ,SAAShJ;GACjBE;GACA4J,aAAa7C;GACd,CAAA;EACA,OAAO;GACN9C,eAAeuF,iBAAiB3L,sBAA4BkC;GAC5DyJ;GACA1J,QAAQgJ,SAAShJ;GACjBiH;GACA/G;GACA+F;GACD;;CAGOX,uBAAyD;EAChE,MAAMpB,WAAW,KAAK3C,wBAAwB4B,KAAG;EACjD,OAAOe,SAASlE,WAAW/D,eAAe8N,aACzC7F,SAASlE,WAAW/D,eAAesJ,YACnCrB,SAASlE,WAAW/D,eAAe+N,QACjC9F,SAAS5C,QACT;;CAGI6D,WACP8E,OACO;EACP,KAAKnI,cAAcoI,KAAK;GACvB,GAAGD;GACHE,IAAI,KAAKrJ,aAAasJ,KAAKC,KAAG;GAC9BnH,QAAQ,EACPV,IAAI,KAAKA,IACV;GACD,CAAA;;;;;ACluBF,SAAgBkI,wBACfC,SAAuC;CAEvC,OAAO,CACN;EACCC,SAASH;EACTI,UAAUF,QAAQG;EACnB,EACA;EACCF,SAASJ;EACTO,aAAaC,aACZT,uBAAuBU,aAAaD,SAAAA;EACrCE,MAAM,CAACZ,eAAe;EACvB,CACA"}
1
+ {"version":3,"file":"index.mjs","names":["ClientError","ClientErrorKind","encodeUint8ArrayToBase64","createBasicAuthorizationHeaderValue","options","username","includes","kind","Configuration","code","message","source","TextEncoder","encode","password","type","defineType","BasicAuthZoneConfigSchema","zonePrefix","BasicAuthContextClientConfigSchema","baseUrl","zones","array","atLeastLength","SecuritydeptInjectionToken","BASIC_AUTH_CONTEXT_CLIENT","BASIC_AUTH_CONTEXT_CLIENT_CONFIG","BasicAuthContextErrorCode","OperationFailed","InvalidConfig","ClientDisposed","RouterUnavailable","ProbePathRequired","ZoneNotFound","ZoneRequired","BasicAuthBoundaryKind","Authenticated","Challenge","Unauthorized","BasicAuthContextSource","BasicAuthContext","BasicAuthContextEventType","BoundaryRefreshStarted","BoundaryRefreshSucceeded","BoundaryRefreshFailed","LogoutStarted","LogoutSucceeded","LogoutFailed","LoginRedirectStarted","LoginRedirectSucceeded","LoginRedirectFailed","AuthGuardResultKind","Ok","Redirect","AuthGuardRedirectStatus","Found","SeeOther","TemporaryRedirect","ClientError","ClientErrorKind","createCancellationTokenSource","createLinkedCancellationToken","createOnceAsyncLockCallable","createSignal","defineInstrumentMethodDecorator","describeError","ENVIRONMENT_TOKEN","injectDisposableStackFrom","mapResource","ResourceSnapshotUpdateKind","ResourceStatus","RouterNavigationIntent","RouterNavigationMode","readonlySignal","reduceResourceSnapshot","resourceFromSnapshots","SecuritydeptDestroyRef","SYMBOL_DISPOSE","throwValidationClientError","UriReferenceString","validateTraitInput","withDisposableStack","commandResponseData","concatCommand","dispatchCommandLocallyToStream","RxEventReplaySubject","RxEventSubject","RxStateSignal","filter","from","lastValueFrom","take","takeUntil","v7","uuidv7","BasicAuthContextClientConfigSchema","BASIC_AUTH_CONTEXT_CLIENT_CONFIG","AuthGuardRedirectStatus","AuthGuardResultKind","BasicAuthBoundaryKind","BasicAuthBoundaryKindValues","BasicAuthContextErrorCode","BasicAuthContextEventType","BasicAuthContextSource","DEFAULT_LOGIN_SUBPATH","POST_AUTH_REDIRECT_PARAM","instrumentBasicAuthMethod","factoryArgs","operation","environment","span","name","config","tracing","prefix","target","fields","normalizeError","error","fromUnknown","code","OperationFailed","message","source","BasicAuthContext","resolveZone","zonePrefix","replace","loginSub","loginSubpath","loginPath","readBasicAuthBoundaryKind","options","status","Authenticated","challengeHeader","Challenge","Unauthorized","BasicAuthContextClient","_start","refresh","_refresh","logout","_logout","loginWithRedirect","_loginWithRedirect","defaultOptions","_environment","_config","_span","_rootCancellation","_destroyed","fromInitialValue","destroyed$","pipe","value","_boundarySnapshotSignal","Idle","_operationSignals","startPending","refreshPending","logoutPending","loginRedirectPending","_eventSubject","_refreshCommandSubject","_refreshResponseSubject","_startOnce","cancellationToken","operationSpan","throwIfCancellationRequested","set","_dispatchRefresh","_resolveRefreshOptions","id","zones","boundarySnapshot","boundaryResource","isAuthenticated","operations","events","fromEnvironmentConfig","fromInjector","injector","client","get","onDestroy","dispose","bundledSchema","onInvalid","failure","InvalidConfig","messagePrefix","resolvedConfig","baseUrl","map","probePath","fork","attributes","clientName","snapshot","authenticated","subscribe","cancel","kind","Cancelled","ClientDisposed","command","_executeRefresh","payload","autoStart","start","catch","token","disposableStack","use","_options","_emitEvent","type","LogoutStarted","_readCurrentSnapshot","Resolved","setAttributes","localProjectionCleared","LogoutSucceeded","LogoutFailed","errorSummary","_operationSpan","router","Configuration","RouterUnavailable","zone","_resolveZoneForAction","postAuthRedirectUri","currentPath","LoginRedirectStarted","navigate","url","parse","loginUrl","intent","AuthRedirect","mode","External","LoginRedirectSucceeded","LoginRedirectFailed","zoneForPath","path","matchedZone","matches","startsWith","length","zoneForPrefix","find","isInZone","undefined","base","params","URLSearchParams","toString","loginUrlForZonePrefix","handleUnauthorized","responseStatus","Ok","Redirect","Found","location","ProbePathRequired","action","ZoneNotFound","ZoneRequired","requestStream","responseStream","createCommandExtra","previous","loadingSnapshot","Load","BoundaryRefreshStarted","response","transport","execute","method","headers","accept","fromHttpResponse","body","_snapshotFromResponse","Resolve","boundaryKind","BoundaryRefreshSucceeded","Fail","BoundaryRefreshFailed","requestPath","Reloading","Error","input","next","at","time","now","INJECTOR_TOKEN","BasicAuthContextClient","BASIC_AUTH_CONTEXT_CLIENT","BASIC_AUTH_CONTEXT_CLIENT_CONFIG","provideBasicAuthContext","options","provide","useValue","config","useFactory","injector","fromInjector","deps"],"sources":["../src/authorization-header.ts","../src/schemas.ts","../src/tokens.ts","../src/types.ts","../src/client.ts","../src/providers.ts"],"sourcesContent":["import {\n\tClientError,\n\tClientErrorKind,\n\tencodeUint8ArrayToBase64,\n} from \"@securitydept/client\";\n\nexport interface CreateBasicAuthorizationHeaderValueOptions {\n\treadonly username: string;\n\treadonly password: string;\n}\n\nexport function createBasicAuthorizationHeaderValue(\n\toptions: CreateBasicAuthorizationHeaderValueOptions,\n): string {\n\tif (options.username.includes(\":\")) {\n\t\tthrow new ClientError({\n\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\tcode: \"basic_auth.authorization_header.username_contains_colon\",\n\t\t\tmessage: \"A Basic authentication username cannot contain a colon.\",\n\t\t\tsource: \"basic_auth\",\n\t\t});\n\t}\n\n\treturn `Basic ${encodeUint8ArrayToBase64(\n\t\tnew TextEncoder().encode(`${options.username}:${options.password}`),\n\t)}`;\n}\n","import { type as defineType } from \"arktype\";\n\nexport const BasicAuthZoneConfigSchema = defineType({\n\tzonePrefix: \"string > 0\",\n\t\"loginSubpath?\": \"string\",\n});\n\nexport const BasicAuthContextClientConfigSchema = defineType({\n\t\"id?\": \"string > 0\",\n\tbaseUrl: \"string > 0\",\n\tzones: BasicAuthZoneConfigSchema.array().atLeastLength(1),\n\t\"probePath?\": \"string > 0\",\n\t\"autoStart?\": \"boolean\",\n\t\"tracing?\": {\n\t\t\"target?\": \"string > 0\",\n\t\t\"prefix?\": \"string > 0\",\n\t},\n});\n","import { SecuritydeptInjectionToken } from \"@securitydept/client\";\nimport { type BasicAuthContextClient } from \"./client\";\nimport { type BasicAuthContextClientConfig } from \"./types\";\n\nexport const BASIC_AUTH_CONTEXT_CLIENT =\n\tnew SecuritydeptInjectionToken<BasicAuthContextClient>(\n\t\t\"BASIC_AUTH_CONTEXT_CLIENT\",\n\t);\n\nexport const BASIC_AUTH_CONTEXT_CLIENT_CONFIG =\n\tnew SecuritydeptInjectionToken<BasicAuthContextClientConfig>(\n\t\t\"BASIC_AUTH_CONTEXT_CLIENT_CONFIG\",\n\t);\n","// --- Basic Auth Context Client types ---\n\nimport {\n\ttype CancellationTokenOptions,\n\ttype ErrorSummary,\n\ttype ReadableSignalTrait,\n\ttype ResourceSnapshot,\n\ttype ResourceTrait,\n} from \"@securitydept/client\";\n\n/** Configuration for a single Basic Auth zone. */\nexport const BasicAuthContextErrorCode = {\n\tOperationFailed: \"basic_auth.operation_failed\",\n\tInvalidConfig: \"basic_auth.invalid_config\",\n\tClientDisposed: \"basic_auth.client_disposed\",\n\tRouterUnavailable: \"basic_auth.router_unavailable\",\n\tProbePathRequired: \"basic_auth.probe_path_required\",\n\tZoneNotFound: \"basic_auth.zone_not_found\",\n\tZoneRequired: \"basic_auth.zone_required\",\n} as const;\n\nexport type BasicAuthContextErrorCode =\n\t(typeof BasicAuthContextErrorCode)[keyof typeof BasicAuthContextErrorCode];\n\nexport interface BasicAuthZoneConfig {\n\t/** URL path prefix for this zone (e.g. \"/basic\"). */\n\tzonePrefix: string;\n\t/** Login subpath relative to zone prefix (default: \"/login\"). */\n\tloginSubpath?: string;\n}\n\n/** Configuration for the Basic Auth Context Client. */\nexport interface BasicAuthContextClientConfig {\n\tid?: string;\n\t/** Base URL of the SecurityDept server. */\n\tbaseUrl: string;\n\t/** One or more Basic Auth zones to manage. */\n\tzones: BasicAuthZoneConfig[];\n\t/** Protected endpoint used by start()/refresh() to observe the boundary. */\n\tprobePath?: string;\n\tautoStart?: boolean;\n\ttracing?: BasicAuthContextClientTracingOptions;\n}\n\nexport interface BasicAuthContextClientTracingOptions {\n\ttarget?: string;\n\tprefix?: string;\n}\n\nexport interface ResolvedBasicAuthContextClientConfig {\n\tid: string;\n\tbaseUrl: string;\n\tzones: readonly ResolvedBasicAuthZone[];\n\tprobePath?: string;\n\ttracing: Required<BasicAuthContextClientTracingOptions>;\n}\n\nexport const BasicAuthBoundaryKind = {\n\tAuthenticated: \"authenticated\",\n\tChallenge: \"challenge\",\n\tUnauthorized: \"unauthorized\",\n} as const;\n\nexport type BasicAuthBoundaryKind =\n\t(typeof BasicAuthBoundaryKind)[keyof typeof BasicAuthBoundaryKind];\n\nexport interface BasicAuthBoundaryObservation {\n\tstatus: number;\n\tchallengeHeader?: string | null;\n\trequestPath?: string;\n}\n\nexport interface BasicAuthBoundarySnapshot {\n\tauthenticated: boolean;\n\tboundaryKind: BasicAuthBoundaryKind;\n\tstatus: number;\n\tpath: string;\n\tchallengeHeader: string | null;\n\tzone?: ResolvedBasicAuthZone;\n}\n\nexport const BasicAuthContextSource = {\n\tBasicAuthContext: \"basic-auth-context\",\n} as const;\n\nexport type BasicAuthContextSource =\n\t(typeof BasicAuthContextSource)[keyof typeof BasicAuthContextSource];\n\nexport const BasicAuthContextEventType = {\n\tBoundaryRefreshStarted: \"basic_auth.boundary.refresh.started\",\n\tBoundaryRefreshSucceeded: \"basic_auth.boundary.refresh.succeeded\",\n\tBoundaryRefreshFailed: \"basic_auth.boundary.refresh.failed\",\n\t/** These logout events describe local boundary-projection clearing only. */\n\tLogoutStarted: \"basic_auth.logout.started\",\n\tLogoutSucceeded: \"basic_auth.logout.succeeded\",\n\tLogoutFailed: \"basic_auth.logout.failed\",\n\tLoginRedirectStarted: \"basic_auth.login.redirect.started\",\n\tLoginRedirectSucceeded: \"basic_auth.login.redirect.succeeded\",\n\tLoginRedirectFailed: \"basic_auth.login.redirect.failed\",\n} as const;\n\nexport type BasicAuthContextEventType =\n\t(typeof BasicAuthContextEventType)[keyof typeof BasicAuthContextEventType];\n\nexport interface BasicAuthContextEvent {\n\ttype: BasicAuthContextEventType;\n\tat: number;\n\tclient: {\n\t\tid: string;\n\t};\n\tsnapshot?: BasicAuthBoundarySnapshot | null;\n\tzone?: ResolvedBasicAuthZone;\n\terrorSummary?: ErrorSummary;\n}\n\nexport interface BasicAuthContextOperationSignals {\n\treadonly startPending: ReadableSignalTrait<boolean>;\n\treadonly refreshPending: ReadableSignalTrait<boolean>;\n\treadonly logoutPending: ReadableSignalTrait<boolean>;\n\treadonly loginRedirectPending: ReadableSignalTrait<boolean>;\n}\n\nexport interface BasicAuthRefreshOptions extends CancellationTokenOptions {\n\tpath?: string;\n}\n\nexport type BasicAuthZoneSelectionOptions =\n\t| {\n\t\t\tcurrentPath: string;\n\t\t\tzonePrefix?: never;\n\t }\n\t| {\n\t\t\tzonePrefix: string;\n\t\t\tcurrentPath?: never;\n\t };\n\n/** Options for clearing the client's in-memory boundary projection. */\nexport interface BasicAuthLogoutOptions extends CancellationTokenOptions {}\n\nexport type BasicAuthLoginWithRedirectOptions = BasicAuthZoneSelectionOptions &\n\tCancellationTokenOptions & {\n\t\tpostAuthRedirectUri?: string;\n\t};\n\nexport const AuthGuardResultKind = {\n\tOk: \"ok\",\n\tRedirect: \"redirect\",\n} as const;\n\nexport type AuthGuardResultKind =\n\t(typeof AuthGuardResultKind)[keyof typeof AuthGuardResultKind];\n\nexport const AuthGuardRedirectStatus = {\n\tFound: 302,\n\tSeeOther: 303,\n\tTemporaryRedirect: 307,\n} as const;\n\nexport type AuthGuardRedirectStatus =\n\t(typeof AuthGuardRedirectStatus)[keyof typeof AuthGuardRedirectStatus];\n\n/** Redirect instruction — framework-neutral result. */\nexport type AuthGuardResult<T> =\n\t| { kind: typeof AuthGuardResultKind.Ok; value: T }\n\t| {\n\t\t\tkind: typeof AuthGuardResultKind.Redirect;\n\t\t\tstatus: AuthGuardRedirectStatus;\n\t\t\tlocation: string;\n\t };\n\n/** Resolved zone with computed paths. */\nexport interface ResolvedBasicAuthZone {\n\tzonePrefix: string;\n\tloginPath: string;\n}\n\nexport interface BasicAuthContextClientStateSignals {\n\treadonly boundarySnapshot: ReadableSignalTrait<\n\t\tResourceSnapshot<BasicAuthBoundarySnapshot | null>\n\t>;\n\treadonly boundaryResource: ResourceTrait<BasicAuthBoundarySnapshot | null>;\n\treadonly isAuthenticated: ResourceTrait<boolean>;\n}\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\tthrowValidationClientError,\n\tUriReferenceString,\n\tvalidateTraitInput,\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 { BasicAuthContextClientConfigSchema } from \"./schemas\";\nimport { BASIC_AUTH_CONTEXT_CLIENT_CONFIG } from \"./tokens\";\nimport {\n\tAuthGuardRedirectStatus,\n\ttype AuthGuardResult,\n\tAuthGuardResultKind,\n\ttype BasicAuthBoundaryKind,\n\tBasicAuthBoundaryKind as BasicAuthBoundaryKindValues,\n\ttype BasicAuthBoundaryObservation,\n\ttype BasicAuthBoundarySnapshot,\n\ttype BasicAuthContextClientConfig,\n\tBasicAuthContextErrorCode,\n\ttype BasicAuthContextEvent,\n\tBasicAuthContextEventType,\n\ttype BasicAuthContextOperationSignals,\n\tBasicAuthContextSource,\n\ttype BasicAuthLoginWithRedirectOptions,\n\ttype BasicAuthLogoutOptions,\n\ttype BasicAuthRefreshOptions,\n\ttype BasicAuthZoneConfig,\n\ttype BasicAuthZoneSelectionOptions,\n\ttype ResolvedBasicAuthContextClientConfig,\n\ttype ResolvedBasicAuthZone,\n} from \"./types\";\n\nconst DEFAULT_LOGIN_SUBPATH = \"/login\";\nconst POST_AUTH_REDIRECT_PARAM = \"post_auth_redirect_uri\";\n\ninterface BasicAuthCommandExtra {\n\tcancellationToken: CancellationTokenTrait;\n\toperationSpan?: OperationSpanTrait;\n}\n\ntype ResolvedBasicAuthRefreshOptions = { path: string };\n\ntype BasicAuthRefreshCommand = Command<\n\tResolvedBasicAuthRefreshOptions,\n\tBasicAuthCommandExtra\n>;\n\nconst instrumentBasicAuthMethod = defineInstrumentMethodDecorator<\n\t[operation: string],\n\tBasicAuthContextClient\n>(\n\t({ factoryArgs: [operation] }) =>\n\t\tfunction (this: BasicAuthContextClient) {\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: BasicAuthContextErrorCode.OperationFailed,\n\t\t\t\t\t\tmessage: \"The Basic Auth operation failed unexpectedly\",\n\t\t\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t\t\t}),\n\t\t\t};\n\t\t},\n);\n\nfunction resolveZone(config: BasicAuthZoneConfig): ResolvedBasicAuthZone {\n\tconst prefix = config.zonePrefix.replace(/\\/+$/, \"\");\n\tconst loginSub = config.loginSubpath ?? DEFAULT_LOGIN_SUBPATH;\n\n\treturn {\n\t\tzonePrefix: prefix,\n\t\tloginPath: prefix + loginSub,\n\t};\n}\n\nexport function readBasicAuthBoundaryKind(\n\toptions: BasicAuthBoundaryObservation,\n): BasicAuthBoundaryKind {\n\tif (options.status < 400) {\n\t\treturn BasicAuthBoundaryKindValues.Authenticated;\n\t}\n\n\tif (options.challengeHeader) {\n\t\treturn BasicAuthBoundaryKindValues.Challenge;\n\t}\n\n\treturn BasicAuthBoundaryKindValues.Unauthorized;\n}\n\n/**\n * Basic Auth Context Client.\n *\n * Owns zone-aware Basic Auth boundary observations and login navigation.\n * It does not manage browser credentials or principal data.\n */\nexport class BasicAuthContextClient implements DisposableTrait {\n\tstatic defaultOptions = {\n\t\tloginSubpath: DEFAULT_LOGIN_SUBPATH,\n\t\ttracing: {\n\t\t\ttarget: \"basic-auth-context-client\",\n\t\t\tprefix: \"basic_auth_context\",\n\t\t},\n\t} as const;\n\n\tprivate readonly _environment: FoundationEnvironment;\n\tprivate readonly _config: ResolvedBasicAuthContextClientConfig;\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 _boundarySnapshotSignal = RxStateSignal.fromInitialValue<\n\t\tResourceSnapshot<BasicAuthBoundarySnapshot | 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<BasicAuthContextEvent>(100);\n\tprivate readonly _refreshCommandSubject =\n\t\tnew RxEventSubject<BasicAuthRefreshCommand>();\n\tprivate readonly _refreshResponseSubject = new RxEventSubject<\n\t\tCommandResponse<BasicAuthRefreshCommand, BasicAuthBoundarySnapshot>\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(\n\t\t\t\t\tthis._resolveRefreshOptions({}),\n\t\t\t\t\tcancellationToken,\n\t\t\t\t\toperationSpan,\n\t\t\t\t);\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 zones: readonly ResolvedBasicAuthZone[];\n\treadonly boundarySnapshot: ReadableSignalTrait<\n\t\tResourceSnapshot<BasicAuthBoundarySnapshot | null>\n\t>;\n\treadonly boundaryResource: ResourceTrait<BasicAuthBoundarySnapshot | null>;\n\treadonly isAuthenticated: ResourceTrait<boolean>;\n\treadonly operations: BasicAuthContextOperationSignals;\n\treadonly events: EventStreamTrait<BasicAuthContextEvent>;\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(): ResolvedBasicAuthContextClientConfig {\n\t\treturn this._config;\n\t}\n\n\tstatic fromEnvironmentConfig(options: {\n\t\treadonly config: BasicAuthContextClientConfig;\n\t\treadonly environment: FoundationEnvironment;\n\t}): BasicAuthContextClient {\n\t\treturn new BasicAuthContextClient(options.config, options.environment);\n\t}\n\n\tstatic fromInjector(\n\t\tinjector: SecuritydeptInjectorTrait,\n\t): BasicAuthContextClient {\n\t\tconst client = BasicAuthContextClient.fromEnvironmentConfig({\n\t\t\tconfig: injector.get(BASIC_AUTH_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: BasicAuthContextClientConfig,\n\t\tenvironment: FoundationEnvironment,\n\t) {\n\t\tvalidateTraitInput({\n\t\t\tvalue: config,\n\t\t\tbundledSchema: BasicAuthContextClientConfigSchema,\n\t\t\tonInvalid: (failure) =>\n\t\t\t\tthrowValidationClientError({\n\t\t\t\t\tcode: BasicAuthContextErrorCode.InvalidConfig,\n\t\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t\t\tmessagePrefix: \"BasicAuthContextClient could not validate config\",\n\t\t\t\t\tfailure,\n\t\t\t\t}),\n\t\t});\n\t\tconst resolvedConfig: ResolvedBasicAuthContextClientConfig = {\n\t\t\tid: config.id ?? uuidv7(),\n\t\t\tbaseUrl: (config.baseUrl ?? \"\").replace(/\\/+$/, \"\"),\n\t\t\tzones: (config.zones ?? []).map(resolveZone),\n\t\t\tprobePath: config.probePath,\n\t\t\ttracing: {\n\t\t\t\ttarget:\n\t\t\t\t\tconfig.tracing?.target ??\n\t\t\t\t\tBasicAuthContextClient.defaultOptions.tracing.target,\n\t\t\t\tprefix:\n\t\t\t\t\tconfig.tracing?.prefix ??\n\t\t\t\t\tBasicAuthContextClient.defaultOptions.tracing.prefix,\n\t\t\t},\n\t\t};\n\n\t\tthis._environment = environment;\n\t\tthis._config = resolvedConfig;\n\t\tthis.id = resolvedConfig.id;\n\t\tthis.zones = resolvedConfig.zones;\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.boundarySnapshot = readonlySignal(this._boundarySnapshotSignal);\n\t\tthis.boundaryResource = resourceFromSnapshots(() =>\n\t\t\tthis._boundarySnapshotSignal.get(),\n\t\t);\n\t\tthis.isAuthenticated = mapResource(\n\t\t\tthis.boundaryResource,\n\t\t\t(snapshot) => snapshot?.authenticated === true,\n\t\t);\n\t\tthis.operations = {\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: BasicAuthContextErrorCode.ClientDisposed,\n\t\t\t\t\tmessage: \"BasicAuthContextClient has been disposed.\",\n\t\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.isAuthenticated.dispose();\n\t\t\tthis.boundaryResource.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.payload,\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\tif (config.autoStart === true) {\n\t\t\tthis.start().catch(() => {\n\t\t\t\t// Startup failure is reflected by boundarySnapshot.\n\t\t\t});\n\t\t}\n\t}\n\n\tasync start(): Promise<BasicAuthBoundarySnapshot> {\n\t\tconst cancellationToken = this._rootCancellation.token;\n\t\treturn await this._start(cancellationToken);\n\t}\n\n\t@instrumentBasicAuthMethod(\"start\")\n\tprivate async _start(\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\treturn await this._startOnce(cancellationToken, operationSpan);\n\t}\n\n\t@withDisposableStack(0, true)\n\tasync refresh(\n\t\toptions: BasicAuthRefreshOptions = {},\n\t): Promise<BasicAuthBoundarySnapshot> {\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(options, cancellationToken);\n\t}\n\n\t@instrumentBasicAuthMethod(\"refresh\")\n\tprivate async _refresh(\n\t\toptions: BasicAuthRefreshOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\treturn await this._dispatchRefresh(\n\t\t\tthis._resolveRefreshOptions(options),\n\t\t\tcancellationToken,\n\t\t\toperationSpan,\n\t\t);\n\t}\n\n\t/**\n\t * Clears only this client's in-memory Basic Auth boundary projection.\n\t *\n\t * Browsers own HTTP Basic credentials. This method cannot revoke or clear\n\t * those credentials, and a later probe may observe an authenticated state\n\t * again when the browser continues sending them.\n\t */\n\t@withDisposableStack(0, true)\n\tasync logout(options: BasicAuthLogoutOptions = {}): 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\treturn await this._logout(options, cancellationToken);\n\t}\n\n\t@instrumentBasicAuthMethod(\"logout\")\n\tprivate async _logout(\n\t\t_options: BasicAuthLogoutOptions,\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\tthis._emitEvent({\n\t\t\ttype: BasicAuthContextEventType.LogoutStarted,\n\t\t\tsnapshot: this._readCurrentSnapshot(),\n\t\t});\n\t\ttry {\n\t\t\tcancellationToken.throwIfCancellationRequested();\n\t\t\tthis._boundarySnapshotSignal.set({\n\t\t\t\tstatus: ResourceStatus.Resolved,\n\t\t\t\tvalue: null,\n\t\t\t});\n\t\t\toperationSpan?.setAttributes({ localProjectionCleared: true });\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LogoutSucceeded,\n\t\t\t\tsnapshot: null,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LogoutFailed,\n\t\t\t\tsnapshot: this._readCurrentSnapshot(),\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\t@withDisposableStack(0, true)\n\tasync loginWithRedirect(\n\t\toptions: BasicAuthLoginWithRedirectOptions,\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@instrumentBasicAuthMethod(\"login.redirect\")\n\tprivate async _loginWithRedirect(\n\t\toptions: BasicAuthLoginWithRedirectOptions,\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: BasicAuthContextErrorCode.RouterUnavailable,\n\t\t\t\tmessage: \"loginWithRedirect() requires environment.router.\",\n\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t});\n\t\t}\n\t\tconst zone = this._resolveZoneForAction(options, \"login redirect\");\n\t\tconst postAuthRedirectUri =\n\t\t\toptions.postAuthRedirectUri ?? options.currentPath;\n\n\t\tthis._operationSignals.loginRedirectPending.set(true);\n\t\tthis._emitEvent({\n\t\t\ttype: BasicAuthContextEventType.LoginRedirectStarted,\n\t\t\tzone,\n\t\t});\n\t\ttry {\n\t\t\tawait router.navigate({\n\t\t\t\turl: UriReferenceString.parse(this.loginUrl(zone, postAuthRedirectUri)),\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\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LoginRedirectSucceeded,\n\t\t\t\tzone,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.LoginRedirectFailed,\n\t\t\t\tzone,\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.loginRedirectPending.set(false);\n\t\t}\n\t}\n\n\t/** Find the zone that contains the given path. */\n\tzoneForPath(path: string): ResolvedBasicAuthZone | undefined {\n\t\tlet matchedZone: ResolvedBasicAuthZone | undefined;\n\n\t\tfor (const zone of this.zones) {\n\t\t\tconst matches =\n\t\t\t\tpath === zone.zonePrefix || path.startsWith(`${zone.zonePrefix}/`);\n\t\t\tif (!matches) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!matchedZone ||\n\t\t\t\tzone.zonePrefix.length > matchedZone.zonePrefix.length\n\t\t\t) {\n\t\t\t\tmatchedZone = zone;\n\t\t\t}\n\t\t}\n\n\t\treturn matchedZone;\n\t}\n\n\tzoneForPrefix(zonePrefix: string): ResolvedBasicAuthZone | undefined {\n\t\treturn this.zones.find((zone) => zone.zonePrefix === zonePrefix);\n\t}\n\n\t/** Check whether a path falls inside any configured zone. */\n\tisInZone(path: string): boolean {\n\t\treturn this.zoneForPath(path) !== undefined;\n\t}\n\n\t/** Build the full login URL for a zone, optionally with a post-auth redirect. */\n\tloginUrl(zone: ResolvedBasicAuthZone, postAuthRedirectUri?: string): string {\n\t\tconst base = this._config.baseUrl + zone.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\tloginUrlForZonePrefix(\n\t\tzonePrefix: string,\n\t\tpostAuthRedirectUri?: string,\n\t): string | null {\n\t\tconst zone = this.zoneForPrefix(zonePrefix);\n\t\treturn zone ? this.loginUrl(zone, postAuthRedirectUri) : null;\n\t}\n\n\t/**\n\t * Handle a 401 response: if the current path is inside a zone,\n\t * return a redirect instruction to the zone's login URL.\n\t */\n\thandleUnauthorized(\n\t\tcurrentPath: string,\n\t\tresponseStatus: number,\n\t): AuthGuardResult<null> {\n\t\tif (responseStatus !== 401) {\n\t\t\treturn { kind: AuthGuardResultKind.Ok, value: null };\n\t\t}\n\n\t\tconst zone = this.zoneForPath(currentPath);\n\t\tif (!zone) {\n\t\t\treturn { kind: AuthGuardResultKind.Ok, value: null };\n\t\t}\n\n\t\treturn {\n\t\t\tkind: AuthGuardResultKind.Redirect,\n\t\t\tstatus: AuthGuardRedirectStatus.Found,\n\t\t\tlocation: this.loginUrl(zone, currentPath),\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 _resolveRefreshOptions(\n\t\toptions: BasicAuthRefreshOptions,\n\t): ResolvedBasicAuthRefreshOptions {\n\t\tconst path = options.path ?? this._config.probePath;\n\t\tif (!path) {\n\t\t\tthrow new ClientError({\n\t\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\t\tcode: BasicAuthContextErrorCode.ProbePathRequired,\n\t\t\t\tmessage:\n\t\t\t\t\t\"BasicAuthContextClient.refresh() requires options.path or config.probePath.\",\n\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t});\n\t\t}\n\t\treturn { path };\n\t}\n\n\tprivate _resolveZoneForAction(\n\t\toptions: BasicAuthZoneSelectionOptions,\n\t\taction: string,\n\t): ResolvedBasicAuthZone {\n\t\tif (options.zonePrefix) {\n\t\t\tconst zone = this.zoneForPrefix(options.zonePrefix);\n\t\t\tif (zone) {\n\t\t\t\treturn zone;\n\t\t\t}\n\t\t\tthrow new ClientError({\n\t\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\t\tcode: BasicAuthContextErrorCode.ZoneNotFound,\n\t\t\t\tmessage: `BasicAuthContextClient ${action} could not find zone \"${options.zonePrefix}\".`,\n\t\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t\t});\n\t\t}\n\n\t\tconst zone =\n\t\t\ttypeof options.currentPath === \"string\"\n\t\t\t\t? this.zoneForPath(options.currentPath)\n\t\t\t\t: undefined;\n\t\tif (zone) {\n\t\t\treturn zone;\n\t\t}\n\n\t\tthrow new ClientError({\n\t\t\tkind: ClientErrorKind.Configuration,\n\t\t\tcode: BasicAuthContextErrorCode.ZoneRequired,\n\t\t\tmessage: `BasicAuthContextClient ${action} requires options.currentPath inside a configured zone or options.zonePrefix.`,\n\t\t\tsource: BasicAuthContextSource.BasicAuthContext,\n\t\t});\n\t}\n\n\tprivate async _dispatchRefresh(\n\t\tpayload: ResolvedBasicAuthRefreshOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tconst snapshot = await lastValueFrom(\n\t\t\tdispatchCommandLocallyToStream<\n\t\t\t\tResolvedBasicAuthRefreshOptions,\n\t\t\t\tBasicAuthCommandExtra,\n\t\t\t\tBasicAuthBoundarySnapshot,\n\t\t\t\tBasicAuthRefreshCommand\n\t\t\t>({\n\t\t\t\tpayload,\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 snapshot;\n\t}\n\n\tprivate async _executeRefresh(\n\t\toptions: ResolvedBasicAuthRefreshOptions,\n\t\tcancellationToken: CancellationTokenTrait,\n\t\toperationSpan?: OperationSpanTrait,\n\t): Promise<BasicAuthBoundarySnapshot> {\n\t\tcancellationToken.throwIfCancellationRequested();\n\t\tthis._operationSignals.refreshPending.set(true);\n\t\tconst previous = this._boundarySnapshotSignal.get();\n\t\tconst loadingSnapshot = reduceResourceSnapshot(previous, {\n\t\t\tkind: ResourceSnapshotUpdateKind.Load,\n\t\t});\n\t\tthis._boundarySnapshotSignal.set(loadingSnapshot);\n\t\tthis._emitEvent({\n\t\t\ttype: BasicAuthContextEventType.BoundaryRefreshStarted,\n\t\t\tsnapshot: this._readCurrentSnapshot(),\n\t\t});\n\t\ttry {\n\t\t\tconst response = await this._environment.transport.execute({\n\t\t\t\turl: this._config.baseUrl + options.path,\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: { accept: \"application/json\" },\n\t\t\t\tcancellationToken,\n\t\t\t});\n\t\t\tif (\n\t\t\t\tresponse.status >= 400 &&\n\t\t\t\tresponse.status !== 401 &&\n\t\t\t\tresponse.status !== 403\n\t\t\t) {\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\tconst snapshot = this._snapshotFromResponse(options.path, response);\n\t\t\tthis._boundarySnapshotSignal.set(\n\t\t\t\treduceResourceSnapshot(loadingSnapshot, {\n\t\t\t\t\tkind: ResourceSnapshotUpdateKind.Resolve,\n\t\t\t\t\tvalue: snapshot,\n\t\t\t\t}),\n\t\t\t);\n\t\t\toperationSpan?.setAttributes({\n\t\t\t\tauthenticated: snapshot.authenticated,\n\t\t\t\tboundaryKind: snapshot.boundaryKind,\n\t\t\t});\n\t\t\tthis._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.BoundaryRefreshSucceeded,\n\t\t\t\tsnapshot,\n\t\t\t\tzone: snapshot.zone,\n\t\t\t});\n\t\t\treturn snapshot;\n\t\t} catch (error) {\n\t\t\tthis._boundarySnapshotSignal.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._emitEvent({\n\t\t\t\ttype: BasicAuthContextEventType.BoundaryRefreshFailed,\n\t\t\t\tsnapshot: this._readCurrentSnapshot(),\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 _snapshotFromResponse(\n\t\tpath: string,\n\t\tresponse: { status: number; headers: Record<string, string> },\n\t): BasicAuthBoundarySnapshot {\n\t\tconst challengeHeader =\n\t\t\tresponse.headers[\"WWW-Authenticate\"] ??\n\t\t\tresponse.headers[\"www-authenticate\"] ??\n\t\t\tnull;\n\t\tconst zone = this.zoneForPath(path);\n\t\tconst boundaryKind = readBasicAuthBoundaryKind({\n\t\t\tstatus: response.status,\n\t\t\tchallengeHeader,\n\t\t\trequestPath: path,\n\t\t});\n\t\treturn {\n\t\t\tauthenticated: boundaryKind === BasicAuthBoundaryKindValues.Authenticated,\n\t\t\tboundaryKind,\n\t\t\tstatus: response.status,\n\t\t\tpath,\n\t\t\tchallengeHeader,\n\t\t\tzone,\n\t\t};\n\t}\n\n\tprivate _readCurrentSnapshot(): BasicAuthBoundarySnapshot | null {\n\t\tconst snapshot = this._boundarySnapshotSignal.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 _emitEvent(\n\t\tinput: Omit<BasicAuthContextEvent, \"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 { BasicAuthContextClient } from \"./client\";\nimport {\n\tBASIC_AUTH_CONTEXT_CLIENT,\n\tBASIC_AUTH_CONTEXT_CLIENT_CONFIG,\n} from \"./tokens\";\nimport { type BasicAuthContextClientConfig } from \"./types\";\n\nexport interface ProvideBasicAuthContextOptions {\n\treadonly config: BasicAuthContextClientConfig;\n}\n\nexport function provideBasicAuthContext(\n\toptions: ProvideBasicAuthContextOptions,\n): readonly SecuritydeptProvider[] {\n\treturn [\n\t\t{\n\t\t\tprovide: BASIC_AUTH_CONTEXT_CLIENT_CONFIG,\n\t\t\tuseValue: options.config,\n\t\t},\n\t\t{\n\t\t\tprovide: BASIC_AUTH_CONTEXT_CLIENT,\n\t\t\tuseFactory: (injector: SecuritydeptInjectorTrait) =>\n\t\t\t\tBasicAuthContextClient.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/basic-auth-context-client",
3
- "version": "0.3.0-beta.5",
3
+ "version": "0.3.0-beta.6",
4
4
  "description": "Basic Auth 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",