@superdurable/dex 1.15.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/dist/src/client.js +1 -0
- package/dist/src/client.js.map +1 -1
- package/dist/src/credential.d.ts +86 -0
- package/dist/src/credential.js +373 -7
- package/dist/src/credential.js.map +1 -1
- package/dist/src/gen/dex.d.ts +159 -17
- package/dist/src/gen/dex.js +175 -9
- package/dist/src/gen/dex.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/options.d.ts +28 -2
- package/dist/src/options.js.map +1 -1
- package/dist/src/pull-worker.d.ts +1 -0
- package/dist/src/pull-worker.js +13 -3
- package/dist/src/pull-worker.js.map +1 -1
- package/dist/src/sdk-version.generated.d.ts +1 -1
- package/dist/src/sdk-version.generated.js +1 -1
- package/native/linux-aarch64/dex_blob_cache_node.node +0 -0
- package/native/linux-x86_64/dex_blob_cache_node.node +0 -0
- package/native/macos-aarch64/dex_blob_cache_node.node +0 -0
- package/native/macos-x86_64/dex_blob_cache_node.node +0 -0
- package/native/windows-x86_64/dex_blob_cache_node.node +0 -0
- package/package.json +1 -1
package/dist/src/credential.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
//
|
|
7
7
|
// SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0
|
|
8
8
|
import { readFileSync, statSync } from "node:fs";
|
|
9
|
+
import { inspect } from "node:util";
|
|
9
10
|
import { InterceptingCall, Metadata, status, } from "@grpc/grpc-js";
|
|
10
11
|
/**
|
|
11
12
|
* Reads a bearer token from a rotating file.
|
|
@@ -73,6 +74,270 @@ export class FileCredential {
|
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
76
|
}
|
|
77
|
+
const rejectedToken = Symbol("dex.rejectedToken");
|
|
78
|
+
const apiKeyCredentialStates = new WeakMap();
|
|
79
|
+
/**
|
|
80
|
+
* Exchanges an API key for short-lived Dex bearer tokens.
|
|
81
|
+
*
|
|
82
|
+
* Use this instead of FileCredential when the application holds an API key rather than a
|
|
83
|
+
* rotating token file. The first call exchanges the key. Calls after 80% of the token's
|
|
84
|
+
* lifetime start one shared background refresh and continue using the valid token.
|
|
85
|
+
* Failed refreshes are retried no more often than every five seconds while that token
|
|
86
|
+
* remains valid. Expired-token callers await the same exchange, bounded by the exchange
|
|
87
|
+
* timeout. A rejected token is discarded. Unary calls retry once, and pull streams
|
|
88
|
+
* reconnect immediately once before using the Worker's backoff.
|
|
89
|
+
*
|
|
90
|
+
* The token URL must use HTTPS, except loopback HTTP is accepted for local endpoints.
|
|
91
|
+
* Token endpoint redirects are never followed.
|
|
92
|
+
* Credential inspection contains no secrets. Exchange errors redact the API key,
|
|
93
|
+
* cached and two most recently issued access tokens, the failed response's access token,
|
|
94
|
+
* and JWT-shaped substrings before truncating each endpoint error field to 200 characters.
|
|
95
|
+
* A JWT-shaped substring has three or more base64url segments of at least 10 characters each.
|
|
96
|
+
* The rule also applies to the token URL and can redact other text of that shape, such as a
|
|
97
|
+
* long dotted host name. Raw transport causes are omitted.
|
|
98
|
+
* Concurrent calls are safe. The credential owns no persistent HTTP client or timer;
|
|
99
|
+
* an in-flight exchange ends within the configured timeout. An injected fetch is owned
|
|
100
|
+
* by the application. The application owns this credential when sharing it among
|
|
101
|
+
* Clients and Workers; closing either does not close the credential.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* const credential = new ApiKeyCredential({
|
|
106
|
+
* tokenUrl: "https://auth.example.com/token",
|
|
107
|
+
* serverId: "dex-server-id",
|
|
108
|
+
* apiKey: process.env.DEX_API_KEY!,
|
|
109
|
+
* });
|
|
110
|
+
* const client = new Client(registry, cache, { credential });
|
|
111
|
+
* const worker = new Worker(registry, cache, { credential, pull: {} });
|
|
112
|
+
* try { await worker.start(); await client.searchFlows("", 10); }
|
|
113
|
+
* finally { await client.close(); await worker.close(); }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export class ApiKeyCredential {
|
|
117
|
+
/**
|
|
118
|
+
* Validates the exchange settings without contacting the token endpoint.
|
|
119
|
+
* @param options - Token URL, server ID, API key, optional timeout and fetch implementation.
|
|
120
|
+
* @throws TypeError when a required string, token URL, timeout, or fetch is invalid.
|
|
121
|
+
*/
|
|
122
|
+
constructor(options) {
|
|
123
|
+
if (options === null || typeof options !== "object")
|
|
124
|
+
throw new TypeError("dex: API key credential options are required");
|
|
125
|
+
for (const [name, value] of Object.entries({ tokenUrl: options.tokenUrl, serverId: options.serverId, apiKey: options.apiKey })) {
|
|
126
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
127
|
+
throw new TypeError(`dex: ${name} must be a non-empty string`);
|
|
128
|
+
}
|
|
129
|
+
let parsedUrl;
|
|
130
|
+
try {
|
|
131
|
+
parsedUrl = new URL(options.tokenUrl);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
throw new TypeError("dex: tokenUrl must be an absolute HTTP or HTTPS URL");
|
|
135
|
+
}
|
|
136
|
+
const hostname = parsedUrl.hostname.toLowerCase();
|
|
137
|
+
const isLoopback = hostname === "localhost" || hostname === "[::1]"
|
|
138
|
+
|| /^127\.(?:\d{1,3}\.){2}\d{1,3}$/.test(hostname);
|
|
139
|
+
if (parsedUrl.protocol !== "https:" && !(parsedUrl.protocol === "http:" && isLoopback)) {
|
|
140
|
+
throw new TypeError("dex: tokenUrl must use HTTPS except for loopback HTTP");
|
|
141
|
+
}
|
|
142
|
+
if (parsedUrl.username !== "" || parsedUrl.password !== "") {
|
|
143
|
+
throw new TypeError("dex: tokenUrl must not contain user information");
|
|
144
|
+
}
|
|
145
|
+
const exchangeTimeoutMs = options.exchangeTimeoutMs ?? 10_000;
|
|
146
|
+
if (!Number.isFinite(exchangeTimeoutMs) || exchangeTimeoutMs <= 0 || exchangeTimeoutMs > 2_147_483_647) {
|
|
147
|
+
throw new TypeError("dex: exchangeTimeoutMs must be positive and at most 2,147,483,647");
|
|
148
|
+
}
|
|
149
|
+
if (options.fetch !== undefined && typeof options.fetch !== "function") {
|
|
150
|
+
throw new TypeError("dex: fetch must be a function");
|
|
151
|
+
}
|
|
152
|
+
apiKeyCredentialStates.set(this, {
|
|
153
|
+
tokenUrl: options.tokenUrl,
|
|
154
|
+
serverId: options.serverId,
|
|
155
|
+
apiKey: options.apiKey,
|
|
156
|
+
exchangeTimeoutMs,
|
|
157
|
+
fetch: options.fetch ?? globalThis.fetch,
|
|
158
|
+
cachedToken: undefined,
|
|
159
|
+
lastAccessToken: undefined,
|
|
160
|
+
previousAccessToken: undefined,
|
|
161
|
+
expiresAtMs: 0,
|
|
162
|
+
refreshAtMs: 0,
|
|
163
|
+
nextRefreshAtMs: 0,
|
|
164
|
+
pendingExchange: undefined,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Returns a valid access token, exchanging the API key when needed.
|
|
169
|
+
* Concurrent callers share one exchange. A valid token is returned immediately during
|
|
170
|
+
* refresh. When no valid token exists, this waits up to the exchange timeout.
|
|
171
|
+
* @returns The current bearer access token.
|
|
172
|
+
* @throws Error when the token endpoint rejects the request, returns invalid data, or cannot be reached in time.
|
|
173
|
+
*/
|
|
174
|
+
token() {
|
|
175
|
+
const now = performance.now();
|
|
176
|
+
if (this.apiKeyState.cachedToken !== undefined && now < this.apiKeyState.expiresAtMs) {
|
|
177
|
+
if (now >= this.apiKeyState.refreshAtMs && now >= this.apiKeyState.nextRefreshAtMs && this.apiKeyState.pendingExchange === undefined) {
|
|
178
|
+
void this.startExchange().catch(() => { });
|
|
179
|
+
}
|
|
180
|
+
return Promise.resolve(this.apiKeyState.cachedToken);
|
|
181
|
+
}
|
|
182
|
+
return this.apiKeyState.pendingExchange ?? this.startExchange();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Hides API key and access token values from Node inspection.
|
|
186
|
+
* @returns A redacted credential description.
|
|
187
|
+
*/
|
|
188
|
+
[inspect.custom]() {
|
|
189
|
+
return "ApiKeyCredential {}";
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Hides API key and access token values from JSON serialization.
|
|
193
|
+
* @returns An empty object without credential secrets.
|
|
194
|
+
*/
|
|
195
|
+
toJSON() {
|
|
196
|
+
return {};
|
|
197
|
+
}
|
|
198
|
+
[rejectedToken](token) {
|
|
199
|
+
if (this.apiKeyState.cachedToken === token) {
|
|
200
|
+
this.apiKeyState.cachedToken = undefined;
|
|
201
|
+
this.apiKeyState.nextRefreshAtMs = 0;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
startExchange() {
|
|
205
|
+
const exchange = this.exchange().then(({ token, startedAtMs, lifetimeMs }) => {
|
|
206
|
+
this.apiKeyState.cachedToken = token;
|
|
207
|
+
this.apiKeyState.previousAccessToken = this.apiKeyState.lastAccessToken;
|
|
208
|
+
this.apiKeyState.lastAccessToken = token;
|
|
209
|
+
this.apiKeyState.expiresAtMs = startedAtMs + lifetimeMs;
|
|
210
|
+
this.apiKeyState.refreshAtMs = startedAtMs + lifetimeMs * 0.8;
|
|
211
|
+
this.apiKeyState.nextRefreshAtMs = 0;
|
|
212
|
+
return token;
|
|
213
|
+
}, (failure) => {
|
|
214
|
+
if (this.apiKeyState.cachedToken !== undefined && performance.now() < this.apiKeyState.expiresAtMs) {
|
|
215
|
+
this.apiKeyState.nextRefreshAtMs = performance.now() + 5_000;
|
|
216
|
+
}
|
|
217
|
+
throw failure;
|
|
218
|
+
});
|
|
219
|
+
this.apiKeyState.pendingExchange = exchange;
|
|
220
|
+
void exchange.finally(() => {
|
|
221
|
+
if (this.apiKeyState.pendingExchange === exchange)
|
|
222
|
+
this.apiKeyState.pendingExchange = undefined;
|
|
223
|
+
}).catch(() => { });
|
|
224
|
+
return exchange;
|
|
225
|
+
}
|
|
226
|
+
async exchange() {
|
|
227
|
+
const startedAtMs = performance.now();
|
|
228
|
+
const deadline = new ApiKeyExchangeDeadline(this.apiKeyState.exchangeTimeoutMs, (statusCode) => this.exchangeError(statusCode, "exchange timed out"));
|
|
229
|
+
try {
|
|
230
|
+
const fetchExchange = this.apiKeyState.fetch;
|
|
231
|
+
const response = await Promise.race([fetchExchange(this.apiKeyState.tokenUrl, {
|
|
232
|
+
method: "POST",
|
|
233
|
+
redirect: "manual",
|
|
234
|
+
headers: { "content-type": "application/json", accept: "application/json" },
|
|
235
|
+
body: JSON.stringify({ server_id: this.apiKeyState.serverId, api_key: this.apiKeyState.apiKey }),
|
|
236
|
+
signal: deadline.signal,
|
|
237
|
+
}), deadline.timeout]);
|
|
238
|
+
deadline.statusCode = response.status;
|
|
239
|
+
if (response.status >= 300 && response.status < 400) {
|
|
240
|
+
throw this.exchangeError(response.status, "redirect refused");
|
|
241
|
+
}
|
|
242
|
+
const body = await Promise.race([response.text(), deadline.timeout]);
|
|
243
|
+
let payload;
|
|
244
|
+
try {
|
|
245
|
+
payload = JSON.parse(body);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
throw this.exchangeError(deadline.statusCode, "invalid JSON response");
|
|
249
|
+
}
|
|
250
|
+
if (response.status !== 200) {
|
|
251
|
+
throw this.exchangeError(deadline.statusCode, this.responseErrorDetails(payload));
|
|
252
|
+
}
|
|
253
|
+
if (payload === null || typeof payload !== "object" || Array.isArray(payload)) {
|
|
254
|
+
throw this.exchangeError(deadline.statusCode, "invalid response object");
|
|
255
|
+
}
|
|
256
|
+
const fields = payload;
|
|
257
|
+
if (typeof fields.access_token !== "string" || fields.access_token === "") {
|
|
258
|
+
throw this.exchangeError(deadline.statusCode, "invalid access_token");
|
|
259
|
+
}
|
|
260
|
+
if (typeof fields.token_type !== "string" || fields.token_type.toLowerCase() !== "bearer") {
|
|
261
|
+
throw this.exchangeError(deadline.statusCode, "invalid token_type");
|
|
262
|
+
}
|
|
263
|
+
if (typeof fields.expires_in !== "number" || !Number.isSafeInteger(fields.expires_in) || fields.expires_in <= 0) {
|
|
264
|
+
throw this.exchangeError(deadline.statusCode, "invalid expires_in");
|
|
265
|
+
}
|
|
266
|
+
const lifetimeMs = fields.expires_in * 1_000;
|
|
267
|
+
if (performance.now() >= startedAtMs + lifetimeMs) {
|
|
268
|
+
throw this.exchangeError(200, "access token expired before exchange completed");
|
|
269
|
+
}
|
|
270
|
+
return { token: fields.access_token, startedAtMs, lifetimeMs };
|
|
271
|
+
}
|
|
272
|
+
catch (failure) {
|
|
273
|
+
if (failure instanceof ApiKeyExchangeError)
|
|
274
|
+
throw failure;
|
|
275
|
+
throw this.exchangeError(deadline.statusCode, deadline.didTimeout ? "exchange timed out" : "transport failure");
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
deadline.close();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
responseErrorDetails(payload) {
|
|
282
|
+
if (payload === null || typeof payload !== "object" || Array.isArray(payload))
|
|
283
|
+
return "exchange rejected";
|
|
284
|
+
const fields = payload;
|
|
285
|
+
const responseToken = typeof fields.access_token === "string" ? fields.access_token : undefined;
|
|
286
|
+
const details = [fields.error, fields.error_description]
|
|
287
|
+
.filter((value) => typeof value === "string")
|
|
288
|
+
.map((value) => this.redact(value, responseToken).slice(0, 200));
|
|
289
|
+
return details.length === 0 ? "exchange rejected" : details.join(": ");
|
|
290
|
+
}
|
|
291
|
+
redact(value, responseToken) {
|
|
292
|
+
const secrets = [this.apiKeyState.apiKey, this.apiKeyState.cachedToken, this.apiKeyState.lastAccessToken,
|
|
293
|
+
this.apiKeyState.previousAccessToken, responseToken]
|
|
294
|
+
.filter((secret) => secret !== undefined && secret !== "")
|
|
295
|
+
.sort((first, second) => second.length - first.length);
|
|
296
|
+
let redacted = value;
|
|
297
|
+
for (const secret of secrets)
|
|
298
|
+
redacted = redacted.replaceAll(secret, "[REDACTED]");
|
|
299
|
+
return redacted.replace(/(?<![A-Za-z0-9_-])[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_-]{10,}){2,}(?![A-Za-z0-9_-])/g, "[REDACTED]");
|
|
300
|
+
}
|
|
301
|
+
exchangeError(statusCode, detail) {
|
|
302
|
+
return new ApiKeyExchangeError(`dex: token exchange ${this.redact(this.apiKeyState.tokenUrl)} HTTP status ${statusCode ?? "unavailable"}: ${this.redact(detail)}`);
|
|
303
|
+
}
|
|
304
|
+
get apiKeyState() {
|
|
305
|
+
const state = apiKeyCredentialStates.get(this);
|
|
306
|
+
if (state === undefined)
|
|
307
|
+
throw new Error("dex: API key credential was not initialized");
|
|
308
|
+
return state;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
class ApiKeyExchangeError extends Error {
|
|
312
|
+
constructor(message) {
|
|
313
|
+
super(message);
|
|
314
|
+
this.name = "ApiKeyExchangeError";
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
class ApiKeyExchangeDeadline {
|
|
318
|
+
timeoutError;
|
|
319
|
+
signal;
|
|
320
|
+
timeout;
|
|
321
|
+
statusCode;
|
|
322
|
+
didTimeout = false;
|
|
323
|
+
controller = new AbortController();
|
|
324
|
+
timer;
|
|
325
|
+
rejectTimeout;
|
|
326
|
+
constructor(timeoutMs, timeoutError) {
|
|
327
|
+
this.timeoutError = timeoutError;
|
|
328
|
+
this.signal = this.controller.signal;
|
|
329
|
+
this.timeout = new Promise((_resolve, reject) => { this.rejectTimeout = reject; });
|
|
330
|
+
this.timer = setTimeout(this.onTimeout.bind(this), timeoutMs);
|
|
331
|
+
}
|
|
332
|
+
close() {
|
|
333
|
+
clearTimeout(this.timer);
|
|
334
|
+
}
|
|
335
|
+
onTimeout() {
|
|
336
|
+
this.didTimeout = true;
|
|
337
|
+
this.controller.abort();
|
|
338
|
+
this.rejectTimeout(this.timeoutError(this.statusCode));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
76
341
|
export function credentialInterceptors(credential) {
|
|
77
342
|
if (credential === undefined)
|
|
78
343
|
return [];
|
|
@@ -86,9 +351,11 @@ class CredentialInterceptor {
|
|
|
86
351
|
}
|
|
87
352
|
intercept(options, nextCall) {
|
|
88
353
|
const downstream = nextCall(options);
|
|
89
|
-
const requester = new CredentialRequester(this.credential, options, downstream);
|
|
354
|
+
const requester = new CredentialRequester(this.credential, options, nextCall, downstream);
|
|
90
355
|
return new InterceptingCall(downstream, {
|
|
91
356
|
start: requester.start.bind(requester),
|
|
357
|
+
sendMessage: requester.sendMessage.bind(requester),
|
|
358
|
+
halfClose: requester.halfClose.bind(requester),
|
|
92
359
|
cancel: requester.cancel.bind(requester),
|
|
93
360
|
});
|
|
94
361
|
}
|
|
@@ -96,6 +363,7 @@ class CredentialInterceptor {
|
|
|
96
363
|
class CredentialRequester {
|
|
97
364
|
credential;
|
|
98
365
|
options;
|
|
366
|
+
nextCall;
|
|
99
367
|
downstream;
|
|
100
368
|
isSettled = false;
|
|
101
369
|
listener;
|
|
@@ -103,9 +371,17 @@ class CredentialRequester {
|
|
|
103
371
|
next;
|
|
104
372
|
deadlineAtMs;
|
|
105
373
|
deadlineTimer;
|
|
106
|
-
|
|
374
|
+
tokenUsed;
|
|
375
|
+
requestMessage;
|
|
376
|
+
hasHalfClosed = false;
|
|
377
|
+
hasRetried = false;
|
|
378
|
+
isCancelled = false;
|
|
379
|
+
isRetryPending = false;
|
|
380
|
+
retryCall;
|
|
381
|
+
constructor(credential, options, nextCall, downstream) {
|
|
107
382
|
this.credential = credential;
|
|
108
383
|
this.options = options;
|
|
384
|
+
this.nextCall = nextCall;
|
|
109
385
|
this.downstream = downstream;
|
|
110
386
|
}
|
|
111
387
|
start(metadata, listener, next) {
|
|
@@ -118,6 +394,15 @@ class CredentialRequester {
|
|
|
118
394
|
void Promise.resolve().then(this.readToken.bind(this)).then(this.onToken.bind(this), this.onCredentialFailure.bind(this));
|
|
119
395
|
}
|
|
120
396
|
cancel(next) {
|
|
397
|
+
this.isCancelled = true;
|
|
398
|
+
if (this.isRetryPending) {
|
|
399
|
+
this.finishPendingRetry(status.CANCELLED, "Cancelled on client");
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (this.retryCall !== undefined) {
|
|
403
|
+
this.retryCall.cancelWithStatus(status.CANCELLED, "Cancelled on client");
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
121
406
|
if (this.isSettled) {
|
|
122
407
|
next();
|
|
123
408
|
return;
|
|
@@ -138,6 +423,15 @@ class CredentialRequester {
|
|
|
138
423
|
readToken() {
|
|
139
424
|
return this.credential.token();
|
|
140
425
|
}
|
|
426
|
+
sendMessage(message, next) {
|
|
427
|
+
if (this.isUnary())
|
|
428
|
+
this.requestMessage = message;
|
|
429
|
+
next(message);
|
|
430
|
+
}
|
|
431
|
+
halfClose(next) {
|
|
432
|
+
this.hasHalfClosed = true;
|
|
433
|
+
next();
|
|
434
|
+
}
|
|
141
435
|
onToken(token) {
|
|
142
436
|
if (this.isSettled)
|
|
143
437
|
return;
|
|
@@ -148,14 +442,15 @@ class CredentialRequester {
|
|
|
148
442
|
try {
|
|
149
443
|
this.metadata.set("authorization", `Bearer ${token}`);
|
|
150
444
|
}
|
|
151
|
-
catch
|
|
152
|
-
this.fail(status.UNAUTHENTICATED,
|
|
445
|
+
catch {
|
|
446
|
+
this.fail(status.UNAUTHENTICATED, "invalid bearer token");
|
|
153
447
|
return;
|
|
154
448
|
}
|
|
155
449
|
this.isSettled = true;
|
|
450
|
+
this.tokenUsed = token;
|
|
156
451
|
this.clearDeadline();
|
|
157
452
|
try {
|
|
158
|
-
this.next(this.metadata, this.
|
|
453
|
+
this.next(this.metadata, this.responseListener());
|
|
159
454
|
}
|
|
160
455
|
catch (failure) {
|
|
161
456
|
const details = failure instanceof Error ? failure.message : String(failure);
|
|
@@ -170,6 +465,63 @@ class CredentialRequester {
|
|
|
170
465
|
onCredentialFailure(failure) {
|
|
171
466
|
this.fail(status.UNAUTHENTICATED, failure instanceof Error ? failure.message : String(failure), failure);
|
|
172
467
|
}
|
|
468
|
+
responseListener() {
|
|
469
|
+
return {
|
|
470
|
+
onReceiveMetadata: (metadata) => this.listener?.onReceiveMetadata(metadata),
|
|
471
|
+
onReceiveMessage: (message) => this.listener?.onReceiveMessage(message),
|
|
472
|
+
onReceiveStatus: (receivedStatus) => this.onResponseStatus(receivedStatus),
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
onResponseStatus(receivedStatus) {
|
|
476
|
+
if (receivedStatus.code !== status.UNAUTHENTICATED || this.tokenUsed === undefined
|
|
477
|
+
|| !(rejectedToken in this.credential)) {
|
|
478
|
+
this.listener?.onReceiveStatus(receivedStatus);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
const rejectedCredential = this.credential;
|
|
482
|
+
rejectedCredential[rejectedToken](this.tokenUsed);
|
|
483
|
+
if (!this.isUnary() || this.hasRetried || !this.hasHalfClosed || this.isCancelled) {
|
|
484
|
+
this.listener?.onReceiveStatus(receivedStatus);
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
this.hasRetried = true;
|
|
488
|
+
this.isRetryPending = true;
|
|
489
|
+
this.checkDeadline();
|
|
490
|
+
if (!this.isRetryPending)
|
|
491
|
+
return;
|
|
492
|
+
void Promise.resolve().then(this.readToken.bind(this)).then((token) => this.retryWithToken(token), (failure) => {
|
|
493
|
+
this.finishPendingRetry(status.UNAUTHENTICATED, failure instanceof Error ? failure.message : String(failure), failure);
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
retryWithToken(token) {
|
|
497
|
+
if (!this.isRetryPending)
|
|
498
|
+
return;
|
|
499
|
+
if (this.deadlineAtMs !== undefined && Date.now() >= this.deadlineAtMs) {
|
|
500
|
+
this.finishPendingRetry(status.DEADLINE_EXCEEDED, "Deadline exceeded");
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
this.isRetryPending = false;
|
|
504
|
+
this.clearDeadline();
|
|
505
|
+
try {
|
|
506
|
+
this.tokenUsed = token;
|
|
507
|
+
const retryMetadata = this.metadata.clone();
|
|
508
|
+
retryMetadata.set("authorization", `Bearer ${token}`);
|
|
509
|
+
this.retryCall = this.nextCall(this.options);
|
|
510
|
+
this.retryCall.start(retryMetadata, this.responseListener());
|
|
511
|
+
this.retryCall.sendMessage(this.requestMessage);
|
|
512
|
+
this.retryCall.halfClose();
|
|
513
|
+
}
|
|
514
|
+
catch {
|
|
515
|
+
this.listener?.onReceiveStatus({
|
|
516
|
+
code: status.UNAUTHENTICATED,
|
|
517
|
+
details: "could not start credential retry",
|
|
518
|
+
metadata: new Metadata(),
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
isUnary() {
|
|
523
|
+
return !this.options.method_definition.requestStream && !this.options.method_definition.responseStream;
|
|
524
|
+
}
|
|
173
525
|
startDeadline() {
|
|
174
526
|
const deadline = this.options.deadline;
|
|
175
527
|
if (deadline === undefined)
|
|
@@ -181,11 +533,14 @@ class CredentialRequester {
|
|
|
181
533
|
this.checkDeadline();
|
|
182
534
|
}
|
|
183
535
|
checkDeadline() {
|
|
184
|
-
if (this.isSettled || this.deadlineAtMs === undefined)
|
|
536
|
+
if ((this.isSettled && !this.isRetryPending) || this.deadlineAtMs === undefined)
|
|
185
537
|
return;
|
|
186
538
|
const remainingMs = this.deadlineAtMs - Date.now();
|
|
187
539
|
if (remainingMs <= 0) {
|
|
188
|
-
this.
|
|
540
|
+
if (this.isRetryPending)
|
|
541
|
+
this.finishPendingRetry(status.DEADLINE_EXCEEDED, "Deadline exceeded");
|
|
542
|
+
else
|
|
543
|
+
this.fail(status.DEADLINE_EXCEEDED, "Deadline exceeded");
|
|
189
544
|
return;
|
|
190
545
|
}
|
|
191
546
|
this.deadlineTimer = setTimeout(this.checkDeadline.bind(this), Math.min(remainingMs, 2_147_483_647));
|
|
@@ -202,6 +557,17 @@ class CredentialRequester {
|
|
|
202
557
|
metadata: new Metadata(),
|
|
203
558
|
}, cause === undefined ? {} : { cause }));
|
|
204
559
|
}
|
|
560
|
+
finishPendingRetry(code, details, cause) {
|
|
561
|
+
if (!this.isRetryPending)
|
|
562
|
+
return;
|
|
563
|
+
this.isRetryPending = false;
|
|
564
|
+
this.clearDeadline();
|
|
565
|
+
this.listener?.onReceiveStatus(Object.assign({
|
|
566
|
+
code,
|
|
567
|
+
details,
|
|
568
|
+
metadata: new Metadata(),
|
|
569
|
+
}, cause === undefined ? {} : { cause }));
|
|
570
|
+
}
|
|
205
571
|
clearDeadline() {
|
|
206
572
|
if (this.deadlineTimer !== undefined)
|
|
207
573
|
clearTimeout(this.deadlineTimer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../src/credential.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../src/credential.ts"],"names":[],"mappings":"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"}
|