@outfoxx/sunday 2.0.0-beta.17 → 2.0.0-beta.19
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/README.md +191 -30
- package/build/client-settings.d.ts +6 -7
- package/build/client-settings.js +58 -28
- package/build/client-settings.js.map +1 -1
- package/build/event-parser.d.ts +21 -8
- package/build/event-parser.js +93 -121
- package/build/event-parser.js.map +1 -1
- package/build/fetch-copy.d.ts +15 -0
- package/build/fetch-copy.js +70 -0
- package/build/fetch-copy.js.map +1 -0
- package/build/fetch-event-source.d.ts +6 -5
- package/build/fetch-event-source.js +168 -137
- package/build/fetch-event-source.js.map +1 -1
- package/build/fetch-oauth-token-provider.js +61 -19
- package/build/fetch-oauth-token-provider.js.map +1 -1
- package/build/fetch-transport.d.ts +14 -6
- package/build/fetch-transport.js +126 -168
- package/build/fetch-transport.js.map +1 -1
- package/build/fetch.js +5 -0
- package/build/fetch.js.map +1 -1
- package/build/index.d.ts +7 -2
- package/build/index.js +6 -2
- package/build/index.js.map +1 -1
- package/build/request-adapter.d.ts +8 -0
- package/build/{token-manager-factory.js → request-adapter.js} +1 -1
- package/build/request-adapter.js.map +1 -0
- package/build/request-adapters.d.ts +25 -8
- package/build/request-adapters.js +126 -14
- package/build/request-adapters.js.map +1 -1
- package/build/request-body.d.ts +24 -0
- package/build/request-body.js +104 -0
- package/build/request-body.js.map +1 -0
- package/build/request-cancellation-error.d.ts +13 -0
- package/build/request-cancellation-error.js +43 -0
- package/build/request-cancellation-error.js.map +1 -0
- package/build/request-execution.d.ts +18 -0
- package/build/request-execution.js +108 -0
- package/build/request-execution.js.map +1 -0
- package/build/request-security.d.ts +9 -3
- package/build/request-security.js +101 -36
- package/build/request-security.js.map +1 -1
- package/build/response-adapter.d.ts +10 -0
- package/build/response-adapter.js +15 -0
- package/build/response-adapter.js.map +1 -0
- package/build/response-adapters.d.ts +13 -0
- package/build/response-adapters.js +75 -0
- package/build/response-adapters.js.map +1 -0
- package/build/token-manager.d.ts +13 -4
- package/build/token-manager.js +110 -33
- package/build/token-manager.js.map +1 -1
- package/build/token-provider.d.ts +8 -1
- package/build/token-provider.js +71 -0
- package/build/token-provider.js.map +1 -1
- package/build/transport.d.ts +3 -3
- package/build/util/abort.d.ts +3 -0
- package/build/util/abort.js +42 -0
- package/build/util/abort.js.map +1 -0
- package/build/util/native-fetch.d.ts +2 -0
- package/build/util/native-fetch.js +39 -0
- package/build/util/native-fetch.js.map +1 -0
- package/build/util/owned-body.d.ts +12 -0
- package/build/util/owned-body.js +243 -0
- package/build/util/owned-body.js.map +1 -0
- package/package.json +9 -6
- package/build/token-manager-factory.d.ts +0 -9
- package/build/token-manager-factory.js.map +0 -1
|
@@ -11,59 +11,109 @@
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
-
import {
|
|
14
|
+
import { withAbort } from './util/abort.js';
|
|
15
|
+
import { prepareRequestBody } from './request-body.js';
|
|
16
|
+
import { copyRequest, copyResponse } from './fetch-copy.js';
|
|
17
|
+
import { RequestCancellationError } from './request-cancellation-error.js';
|
|
18
|
+
import { TokenProviderError, providerCredentials, } from './token-provider.js';
|
|
15
19
|
/** Adds all credentials atomically after every provider succeeds. */
|
|
16
|
-
export async function authorizeRequest(request, bindings,
|
|
17
|
-
if (!manager)
|
|
18
|
-
throw new TokenProviderError();
|
|
20
|
+
export async function authorizeRequest(request, bindings, providers, maxBufferedRequestBytes) {
|
|
19
21
|
const url = new URL(request.url);
|
|
20
22
|
const headers = new Headers(request.headers);
|
|
21
|
-
validateTransports(bindings, url, headers
|
|
22
|
-
|
|
23
|
+
validateTransports(bindings, url, headers);
|
|
24
|
+
// Resolve every binding before starting work, so setup failure cannot strand earlier promises.
|
|
25
|
+
const selected = bindings.map((binding) => {
|
|
26
|
+
const provider = Object.hasOwn(providers, binding.provider)
|
|
27
|
+
? providers[binding.provider]
|
|
28
|
+
: undefined;
|
|
29
|
+
if (!provider)
|
|
30
|
+
throw new TokenProviderError();
|
|
31
|
+
return { binding, provider };
|
|
32
|
+
});
|
|
33
|
+
const acquisition = new AbortController();
|
|
34
|
+
const signal = AbortSignal.any([request.signal, acquisition.signal]);
|
|
35
|
+
let leases;
|
|
36
|
+
try {
|
|
37
|
+
leases = await withAbort(() => Promise.all(selected.map(({ binding, provider }) => providerCredentials(provider, binding, signal))), signal);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
// Promise.all is fail-fast, but siblings still need a cooperative stop signal.
|
|
41
|
+
acquisition.abort(error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
23
44
|
request.signal.throwIfAborted();
|
|
24
45
|
bindings.forEach((binding, index) => applyCredential(binding, leases[index].tokens.accessToken, url, headers));
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
46
|
+
// Changing URL reconstructs Request from settings. Firefox does not expose Request.body,
|
|
47
|
+
// so retain its already-buffered native body through blob() instead of silently dropping it.
|
|
48
|
+
let body;
|
|
49
|
+
if (url.href !== request.url) {
|
|
50
|
+
if (request.body) {
|
|
51
|
+
body = await prepareRequestBody(request.body, {
|
|
52
|
+
signal: request.signal,
|
|
53
|
+
maxBytes: maxBufferedRequestBytes,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else if (request.body === undefined &&
|
|
57
|
+
!['GET', 'HEAD'].includes(request.method)) {
|
|
58
|
+
const buffered = await request.blob();
|
|
59
|
+
if (buffered.size)
|
|
60
|
+
body = buffered;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const authorized = copyRequest(request, {
|
|
64
|
+
...(body !== undefined ? { body } : {}),
|
|
65
|
+
url,
|
|
66
|
+
headers,
|
|
67
|
+
redirect: 'manual',
|
|
68
|
+
credentials: 'omit',
|
|
69
|
+
});
|
|
37
70
|
return { request: authorized, bindings, leases };
|
|
38
71
|
}
|
|
72
|
+
/** Proves body absence without treating an unavailable Request.body property as an empty body. */
|
|
73
|
+
export function isBodylessRequest(request) {
|
|
74
|
+
// Fetch forbids bodies on GET/HEAD. Other methods require an inspectable null body.
|
|
75
|
+
return (request.method === 'GET' ||
|
|
76
|
+
request.method === 'HEAD' ||
|
|
77
|
+
request.body === null);
|
|
78
|
+
}
|
|
39
79
|
/** Requires a safe, replayable request and an explicit bearer invalid-token challenge. */
|
|
40
80
|
export function canRecoverAuthentication(request, response) {
|
|
41
|
-
return response.status === 401 &&
|
|
42
|
-
|
|
43
|
-
|
|
81
|
+
return (response.status === 401 &&
|
|
82
|
+
['GET', 'HEAD', 'OPTIONS'].includes(request.method) &&
|
|
83
|
+
isBodylessRequest(request) &&
|
|
84
|
+
/^Bearer[ \t]+[^ \t]+$/i.test(request.headers.get('Authorization') ?? '') &&
|
|
85
|
+
hasInvalidBearerChallenge(response.headers.get('WWW-Authenticate') ?? ''));
|
|
44
86
|
}
|
|
45
87
|
/** Returns only bearer receipts rejected by an invalid-token challenge, preserving other conjuncts. */
|
|
46
88
|
export function rejectedBearerLeases(request) {
|
|
47
|
-
|
|
89
|
+
const token = /^Bearer[ \t]+([^ \t]+)$/i.exec(request.request.headers.get('Authorization') ?? '')?.[1];
|
|
90
|
+
return request.leases.filter((lease, index) => isBearerBinding(request.bindings[index]) &&
|
|
91
|
+
token === lease.tokens.accessToken);
|
|
48
92
|
}
|
|
49
93
|
function isBearerBinding(binding) {
|
|
50
|
-
return binding.transport.location === 'header' &&
|
|
51
|
-
binding.transport.
|
|
94
|
+
return (binding.transport.location === 'header' &&
|
|
95
|
+
binding.transport.name.toLowerCase() === 'authorization' &&
|
|
96
|
+
binding.transport.prefix?.toLowerCase() === 'bearer');
|
|
52
97
|
}
|
|
53
98
|
/** Removes query credentials from responses before error translation or diagnostic rendering. */
|
|
54
99
|
export function redactSecurityResponse(response, bindings) {
|
|
55
|
-
const queryNames = bindings
|
|
100
|
+
const queryNames = bindings
|
|
101
|
+
.filter((binding) => binding.transport.location === 'query')
|
|
102
|
+
.map((binding) => binding.transport.name);
|
|
56
103
|
if (!queryNames.length || !response.url)
|
|
57
104
|
return response;
|
|
58
105
|
const url = new URL(response.url);
|
|
59
106
|
for (const name of queryNames)
|
|
60
107
|
if (url.searchParams.has(name))
|
|
61
108
|
replaceQueryCredential(url, name, '[redacted]');
|
|
62
|
-
|
|
63
|
-
|
|
109
|
+
if (url.href === response.url)
|
|
110
|
+
return response;
|
|
111
|
+
// Filtered responses cannot be reconstructed; preserve the native response and its hidden body.
|
|
112
|
+
const result = response.status === 0 ? response : copyResponse(response);
|
|
113
|
+
Object.defineProperty(result, 'url', { value: url.href, configurable: true });
|
|
64
114
|
return result;
|
|
65
115
|
}
|
|
66
|
-
function hasInvalidBearerChallenge(header) {
|
|
116
|
+
export function hasInvalidBearerChallenge(header) {
|
|
67
117
|
const parts = splitChallenges(header);
|
|
68
118
|
if (!parts)
|
|
69
119
|
return false;
|
|
@@ -83,14 +133,16 @@ function hasInvalidBearerChallenge(header) {
|
|
|
83
133
|
return false;
|
|
84
134
|
}
|
|
85
135
|
function cookieEntries(headers) {
|
|
86
|
-
return (headers.get('Cookie') ?? '').split(';').flatMap(entry => {
|
|
136
|
+
return (headers.get('Cookie') ?? '').split(';').flatMap((entry) => {
|
|
87
137
|
const split = entry.indexOf('=');
|
|
88
|
-
return split < 0
|
|
138
|
+
return split < 0
|
|
139
|
+
? []
|
|
140
|
+
: [[entry.slice(0, split).trim(), entry.slice(split + 1).trim()]];
|
|
89
141
|
});
|
|
90
142
|
}
|
|
91
143
|
// URLSearchParams re-encodes unrelated values, which can invalidate application-signed query parameters.
|
|
92
144
|
function replaceQueryCredential(url, name, credential) {
|
|
93
|
-
const fields = (url.search ? url.search.slice(1).split('&') : []).filter(field => {
|
|
145
|
+
const fields = (url.search ? url.search.slice(1).split('&') : []).filter((field) => {
|
|
94
146
|
const key = field.split('=', 1)[0];
|
|
95
147
|
try {
|
|
96
148
|
return decodeURIComponent(key.replaceAll('+', ' ')) !== name;
|
|
@@ -102,7 +154,7 @@ function replaceQueryCredential(url, name, credential) {
|
|
|
102
154
|
fields.push(`${encodeURIComponent(name)}=${encodeURIComponent(credential)}`);
|
|
103
155
|
url.search = fields.join('&');
|
|
104
156
|
}
|
|
105
|
-
function validateTransports(bindings, url, headers
|
|
157
|
+
function validateTransports(bindings, url, headers) {
|
|
106
158
|
const names = new Set();
|
|
107
159
|
for (const binding of bindings) {
|
|
108
160
|
const transport = binding.transport;
|
|
@@ -110,9 +162,11 @@ function validateTransports(bindings, url, headers, checkExisting) {
|
|
|
110
162
|
if (names.has(name))
|
|
111
163
|
throw new TokenProviderError();
|
|
112
164
|
names.add(name);
|
|
113
|
-
if (
|
|
114
|
-
(transport.location === 'query' &&
|
|
115
|
-
|
|
165
|
+
if ((transport.location === 'header' && headers.has(transport.name)) ||
|
|
166
|
+
(transport.location === 'query' &&
|
|
167
|
+
url.searchParams.has(transport.name)) ||
|
|
168
|
+
(transport.location === 'cookie' &&
|
|
169
|
+
cookieEntries(headers).some(([name]) => name === transport.name)))
|
|
116
170
|
throw new TokenProviderError();
|
|
117
171
|
}
|
|
118
172
|
}
|
|
@@ -121,7 +175,7 @@ function applyCredential(binding, token, url, headers) {
|
|
|
121
175
|
const credential = transport.prefix ? `${transport.prefix} ${token}` : token;
|
|
122
176
|
switch (transport.location) {
|
|
123
177
|
case 'header': {
|
|
124
|
-
if ([...credential].some(character => character.codePointAt(0) < 32 || character.codePointAt(0) === 127))
|
|
178
|
+
if ([...credential].some((character) => character.codePointAt(0) < 32 || character.codePointAt(0) === 127))
|
|
125
179
|
throw new TokenProviderError();
|
|
126
180
|
headers.set(transport.name, credential);
|
|
127
181
|
break;
|
|
@@ -164,4 +218,15 @@ function splitChallenges(header) {
|
|
|
164
218
|
parts.push(header.slice(start).trim());
|
|
165
219
|
return parts;
|
|
166
220
|
}
|
|
221
|
+
/** Reports all matching rejections, including unsafe requests and exhausted recovery budgets. */
|
|
222
|
+
export async function rejectCredentials(request, response) {
|
|
223
|
+
if (response.status !== 401 ||
|
|
224
|
+
!hasInvalidBearerChallenge(response.headers.get('WWW-Authenticate') ?? ''))
|
|
225
|
+
return;
|
|
226
|
+
let recoverable = true;
|
|
227
|
+
for (const lease of rejectedBearerLeases(request))
|
|
228
|
+
recoverable = ((await lease.invalidate?.()) ?? false) && recoverable;
|
|
229
|
+
if (!recoverable)
|
|
230
|
+
throw new RequestCancellationError('The credential owner rejected authentication recovery');
|
|
231
|
+
}
|
|
167
232
|
//# sourceMappingURL=request-security.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-security.js","sourceRoot":"","sources":["../src/request-security.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,gDAAgD;AAChD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;
|
|
1
|
+
{"version":3,"file":"request-security.js","sourceRoot":"","sources":["../src/request-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapts the response returned by Fetch before Sunday handling. Hidden native intermediate
|
|
3
|
+
* responses are unavailable. The request is the one submitted to Fetch, not a wire-level trace.
|
|
4
|
+
* Consumed resources must be replaced before returning; use request.signal for cancellation.
|
|
5
|
+
* Sunday cancels returned bodies on abort, including while decoding or validation owns their reader.
|
|
6
|
+
*/
|
|
7
|
+
export interface ResponseAdapter {
|
|
8
|
+
/** Returns the adapted value; throwing stops the remaining adapters. */
|
|
9
|
+
adapt(response: Response, request: Request): Response | Promise<Response>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Copyright 2020 Outfox, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=response-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-adapter.js","sourceRoot":"","sources":["../src/response-adapter.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,gDAAgD;AAChD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ResponseAdapter } from './response-adapter.js';
|
|
2
|
+
/** Explicit, flat, ordered composition of response adapters. No request capability is inferred. */
|
|
3
|
+
export declare class ResponseAdapters implements ResponseAdapter {
|
|
4
|
+
readonly adapters: readonly ResponseAdapter[];
|
|
5
|
+
constructor(...adapters: readonly ResponseAdapter[]);
|
|
6
|
+
/** Appends adapters without nesting execution pipelines. */
|
|
7
|
+
chainTo(...next: readonly ResponseAdapter[]): ResponseAdapters;
|
|
8
|
+
adapt(response: Response, request: Request): Promise<Response>;
|
|
9
|
+
}
|
|
10
|
+
/** Composes plain object adapters without inferring response capabilities from request adapters. */
|
|
11
|
+
export declare function chainResponseAdapters(...adapters: readonly ResponseAdapter[]): ResponseAdapters;
|
|
12
|
+
/** @internal Native Fetch bodies already own cancellation and must retain their byte-stream capabilities. */
|
|
13
|
+
export declare function adaptResponse(adapters: readonly ResponseAdapter[], response: Response, request: Request, native?: boolean): Promise<Response>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright 2020 Outfox, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import { ownBody, bodyReads, sameBody } from './util/owned-body.js';
|
|
15
|
+
import { copyResponse } from './fetch-copy.js';
|
|
16
|
+
import { discardBody, withAbort } from './util/abort.js';
|
|
17
|
+
/** Explicit, flat, ordered composition of response adapters. No request capability is inferred. */
|
|
18
|
+
export class ResponseAdapters {
|
|
19
|
+
adapters;
|
|
20
|
+
constructor(...adapters) {
|
|
21
|
+
this.adapters = Object.freeze(adapters.flatMap((adapter) => adapter instanceof ResponseAdapters ? adapter.adapters : [adapter]));
|
|
22
|
+
}
|
|
23
|
+
/** Appends adapters without nesting execution pipelines. */
|
|
24
|
+
chainTo(...next) {
|
|
25
|
+
return new ResponseAdapters(this, ...next);
|
|
26
|
+
}
|
|
27
|
+
async adapt(response, request) {
|
|
28
|
+
return adaptResponse(this.adapters, response, request);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Composes plain object adapters without inferring response capabilities from request adapters. */
|
|
32
|
+
export function chainResponseAdapters(...adapters) {
|
|
33
|
+
return new ResponseAdapters(...adapters);
|
|
34
|
+
}
|
|
35
|
+
/** @internal Native Fetch bodies already own cancellation and must retain their byte-stream capabilities. */
|
|
36
|
+
export async function adaptResponse(adapters, response, request, native = false) {
|
|
37
|
+
if (!adapters.length) {
|
|
38
|
+
request.signal.throwIfAborted();
|
|
39
|
+
return response;
|
|
40
|
+
}
|
|
41
|
+
const cancellation = new AbortController();
|
|
42
|
+
const signal = AbortSignal.any([request.signal, cancellation.signal]);
|
|
43
|
+
let current = response;
|
|
44
|
+
const owned = (value) => {
|
|
45
|
+
if (!value.body || value.status === 0)
|
|
46
|
+
return value;
|
|
47
|
+
const body = ownBody(value.body, signal);
|
|
48
|
+
if (body !== value.body)
|
|
49
|
+
return copyResponse(value, { body });
|
|
50
|
+
bodyReads(value);
|
|
51
|
+
return value;
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
signal.throwIfAborted();
|
|
55
|
+
if (!native)
|
|
56
|
+
current = owned(current);
|
|
57
|
+
for (const adapter of adapters) {
|
|
58
|
+
const adapted = await withAbort(() => adapter.adapt(current, request), signal, discardBody);
|
|
59
|
+
if (sameBody(adapted.body, current.body)) {
|
|
60
|
+
current = adapted;
|
|
61
|
+
bodyReads(current);
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
current = owned(adapted);
|
|
65
|
+
}
|
|
66
|
+
signal.throwIfAborted();
|
|
67
|
+
return current;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
cancellation.abort(error);
|
|
71
|
+
discardBody(current, error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=response-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-adapters.js","sourceRoot":"","sources":["../src/response-adapters.ts"],"names":[],"mappings":"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"}
|
package/build/token-manager.d.ts
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { SecurityBinding } from './security-binding.js';
|
|
2
|
-
import { TokenProvider, TokenSet, TokenStore } from './token-provider.js';
|
|
2
|
+
import { TokenConfiguration, TokenProvider, TokenRequest, TokenSet, TokenStore } from './token-provider.js';
|
|
3
3
|
/** A credential receipt used for conditional invalidation after an invalid-token response. */
|
|
4
4
|
export interface TokenLease {
|
|
5
5
|
readonly key: string;
|
|
6
6
|
readonly tokens: TokenSet;
|
|
7
|
+
/** Rejects the original credential without invalidating a concurrent replacement. */
|
|
8
|
+
readonly invalidate?: () => Promise<boolean>;
|
|
7
9
|
}
|
|
8
10
|
/**
|
|
9
11
|
* Shared token lifecycle with one renewal per cache key. Canceling one caller leaves other waiters
|
|
10
|
-
* running; canceling the last waiter
|
|
12
|
+
* running; canceling the last waiter stops waiting for the provider without abandoning storage commits.
|
|
13
|
+
* A failed or cancelled acquisition is never cached.
|
|
11
14
|
*/
|
|
12
|
-
export declare class TokenManager {
|
|
15
|
+
export declare class TokenManager implements TokenProvider {
|
|
16
|
+
readonly identity: string;
|
|
17
|
+
private readonly provider?;
|
|
13
18
|
private readonly providers;
|
|
14
19
|
private readonly store;
|
|
15
20
|
private readonly renewals;
|
|
@@ -17,11 +22,15 @@ export declare class TokenManager {
|
|
|
17
22
|
private readonly locks;
|
|
18
23
|
private readonly now;
|
|
19
24
|
private readonly skew;
|
|
20
|
-
constructor(providers: Readonly<Record<string, TokenProvider>>, options?: {
|
|
25
|
+
constructor(providers: TokenProvider | Readonly<Record<string, TokenProvider>>, options?: {
|
|
21
26
|
store?: TokenStore;
|
|
22
27
|
expirySkewMs?: number;
|
|
23
28
|
now?: () => number;
|
|
24
29
|
});
|
|
30
|
+
/** Forwards application configuration to the explicitly managed provider. */
|
|
31
|
+
configure(binding: SecurityBinding): TokenConfiguration;
|
|
32
|
+
/** Obtains managed credentials; receipt acquisition preserves rejection context. */
|
|
33
|
+
acquire(request: TokenRequest, signal: AbortSignal): Promise<TokenSet>;
|
|
25
34
|
/** Acquires current credentials without invoking authorization twice for an expired interactive session. */
|
|
26
35
|
credentials(binding: SecurityBinding, signal?: AbortSignal): Promise<TokenLease>;
|
|
27
36
|
/** Invalidates only the credential that failed, preserving a token already renewed by another caller. */
|