@chrischall/mcp-utils 2.2.0 → 2.3.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 +28 -1
- package/dist/auth/index.d.ts +53 -3
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +88 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/errors/index.d.ts +6 -4
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +50 -8
- package/dist/errors/index.js.map +1 -1
- package/dist/fetchproxy/index.d.ts.map +1 -1
- package/dist/fetchproxy/index.js +12 -2
- package/dist/fetchproxy/index.js.map +1 -1
- package/dist/fs/confine.d.ts +23 -0
- package/dist/fs/confine.d.ts.map +1 -0
- package/dist/fs/confine.js +64 -0
- package/dist/fs/confine.js.map +1 -0
- package/dist/fs/index.d.ts +15 -2
- package/dist/fs/index.d.ts.map +1 -1
- package/dist/fs/index.js +9 -4
- package/dist/fs/index.js.map +1 -1
- package/dist/fs/output.d.ts +6 -0
- package/dist/fs/output.d.ts.map +1 -1
- package/dist/fs/output.js +13 -0
- package/dist/fs/output.js.map +1 -1
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +2 -1
- package/dist/html/index.js.map +1 -1
- package/dist/http/index.d.ts +10 -4
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +109 -18
- package/dist/http/index.js.map +1 -1
- package/dist/internal/ascii.d.ts +12 -0
- package/dist/internal/ascii.d.ts.map +1 -0
- package/dist/internal/ascii.js +14 -0
- package/dist/internal/ascii.js.map +1 -0
- package/dist/scrape/index.d.ts.map +1 -1
- package/dist/scrape/index.js +3 -2
- package/dist/scrape/index.js.map +1 -1
- package/dist/server/confirmation.d.ts +44 -0
- package/dist/server/confirmation.d.ts.map +1 -1
- package/dist/server/confirmation.js +152 -13
- package/dist/server/confirmation.js.map +1 -1
- package/dist/server/index.d.ts +25 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +55 -5
- package/dist/server/index.js.map +1 -1
- package/dist/session/index.d.ts +8 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +61 -1
- package/dist/session/index.js.map +1 -1
- package/dist/zod/index.d.ts +8 -1
- package/dist/zod/index.d.ts.map +1 -1
- package/dist/zod/index.js +9 -1
- package/dist/zod/index.js.map +1 -1
- package/package.json +13 -5
|
@@ -1,11 +1,125 @@
|
|
|
1
1
|
import { acceptedContent, inputRequired, inputResponse, } from '@modelcontextprotocol/server';
|
|
2
|
+
import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
import { callerAcceptsFormElicitation } from '../caller/index.js';
|
|
4
|
-
import { textResult } from '../response/index.js';
|
|
5
|
+
import { errorResult, textResult } from '../response/index.js';
|
|
5
6
|
const DEFAULT_REQUEST_KEY = 'confirmation';
|
|
6
7
|
const DEFAULT_CONFIRMATION_LABEL = 'Confirm this action should proceed.';
|
|
7
8
|
const UNSUPPORTED_NOTE = 'Nothing was done because this client cannot show a confirmation prompt '
|
|
8
9
|
+ '(it declares no MCP elicitation capability), and this action is never taken without one';
|
|
10
|
+
const STATE_PREFIX = 'mcpu.confirm.v1.';
|
|
11
|
+
/**
|
|
12
|
+
* A canonical, type-tagged serialisation of tool arguments for the binding
|
|
13
|
+
* commitment. Object keys are sorted, so `{a,b}` and `{b,a}` hash the same.
|
|
14
|
+
* Values JSON would flatten to `{}` are serialised faithfully instead — a
|
|
15
|
+
* `Date` as its ISO string, bytes (`Buffer`, typed arrays, `ArrayBuffer`) as
|
|
16
|
+
* base64, a `Map`/`Set` as its entries sorted by canonical form, a `bigint` as
|
|
17
|
+
* its digits — so two calls that differ only in such a value never share a
|
|
18
|
+
* commitment. Each typed value is a one-key `{"$tag":…}` object; a plain
|
|
19
|
+
* object's `$`-prefixed keys are escaped (see {@link escapeKey}), so a plain
|
|
20
|
+
* object that imitates a tag (`{ $bytes: 'dHdv' }`) never encodes the same as
|
|
21
|
+
* the typed value it imitates (`Buffer.from('two')`). Anything else that is not plain data (a class instance, a
|
|
22
|
+
* function, a symbol) cannot be compared honestly and is refused.
|
|
23
|
+
*/
|
|
24
|
+
function canonicalJson(value) {
|
|
25
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
26
|
+
return JSON.stringify(value);
|
|
27
|
+
if (value === undefined)
|
|
28
|
+
return 'null';
|
|
29
|
+
if (typeof value === 'number')
|
|
30
|
+
return Number.isFinite(value) ? JSON.stringify(value) : `{"$num":"${String(value)}"}`;
|
|
31
|
+
if (typeof value === 'bigint')
|
|
32
|
+
return `{"$bigint":"${value.toString()}"}`;
|
|
33
|
+
if (typeof value === 'function' || typeof value === 'symbol') {
|
|
34
|
+
throw new TypeError(`requireConfirmation: cannot bind a ${typeof value} argument value.`);
|
|
35
|
+
}
|
|
36
|
+
if (Array.isArray(value))
|
|
37
|
+
return `[${value.map(canonicalJson).join(',')}]`;
|
|
38
|
+
if (value instanceof Date) {
|
|
39
|
+
return `{"$date":${JSON.stringify(Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString())}}`;
|
|
40
|
+
}
|
|
41
|
+
if (ArrayBuffer.isView(value)) {
|
|
42
|
+
const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
43
|
+
return `{"$bytes":${JSON.stringify(bytes.toString('base64'))}}`;
|
|
44
|
+
}
|
|
45
|
+
if (value instanceof ArrayBuffer)
|
|
46
|
+
return `{"$bytes":${JSON.stringify(Buffer.from(value).toString('base64'))}}`;
|
|
47
|
+
if (value instanceof Map) {
|
|
48
|
+
const entries = [...value.entries()].map(([k, v]) => `[${canonicalJson(k)},${canonicalJson(v)}]`).sort();
|
|
49
|
+
return `{"$map":[${entries.join(',')}]}`;
|
|
50
|
+
}
|
|
51
|
+
if (value instanceof Set) {
|
|
52
|
+
return `{"$set":[${[...value].map(canonicalJson).sort().join(',')}]}`;
|
|
53
|
+
}
|
|
54
|
+
const proto = Object.getPrototypeOf(value);
|
|
55
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
56
|
+
throw new TypeError('requireConfirmation: cannot bind a non-plain object argument value (class instance).');
|
|
57
|
+
}
|
|
58
|
+
const entries = Object.entries(value)
|
|
59
|
+
.filter(([, v]) => v !== undefined)
|
|
60
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
61
|
+
return `{${entries.map(([k, v]) => `${JSON.stringify(escapeKey(k))}:${canonicalJson(v)}`).join(',')}}`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Escape a plain-object key so it can never collide with a type tag. Tags are
|
|
65
|
+
* `$` followed by a letter (`$bytes`, `$date`, …); every plain key that starts
|
|
66
|
+
* with `$` gains one more, so plain keys starting with `$` always start with
|
|
67
|
+
* `$$` and never match a tag. Prefixing is injective, so distinct keys stay
|
|
68
|
+
* distinct (`$x` → `$$x`, `$$x` → `$$$x`).
|
|
69
|
+
*/
|
|
70
|
+
function escapeKey(key) {
|
|
71
|
+
return key.startsWith('$') ? `$${key}` : key;
|
|
72
|
+
}
|
|
73
|
+
function bindingKey(binding) {
|
|
74
|
+
if (binding.ttlSeconds !== undefined && !(Number.isFinite(binding.ttlSeconds) && binding.ttlSeconds > 0)) {
|
|
75
|
+
throw new RangeError('requireConfirmation: binding.ttlSeconds must be a finite number greater than 0.');
|
|
76
|
+
}
|
|
77
|
+
const key = typeof binding.key === 'string' ? Buffer.from(binding.key, 'utf8') : Buffer.from(binding.key);
|
|
78
|
+
if (key.length < 32) {
|
|
79
|
+
throw new RangeError('requireConfirmation: binding.key must be at least 32 bytes.');
|
|
80
|
+
}
|
|
81
|
+
return key;
|
|
82
|
+
}
|
|
83
|
+
function commitment(action, args) {
|
|
84
|
+
return createHash('sha256').update(`${action}\0${canonicalJson(args)}`).digest('base64url');
|
|
85
|
+
}
|
|
86
|
+
function mintState(key, action, binding) {
|
|
87
|
+
const exp = Math.floor(Date.now() / 1000) + (binding.ttlSeconds ?? 600);
|
|
88
|
+
const body = Buffer.from(JSON.stringify({ c: commitment(action, binding.args), exp })).toString('base64url');
|
|
89
|
+
const mac = createHmac('sha256', key).update(`${STATE_PREFIX}${body}`).digest('base64url');
|
|
90
|
+
return `${STATE_PREFIX}${body}.${mac}`;
|
|
91
|
+
}
|
|
92
|
+
/** Whether `state` is a valid, unexpired state minted for this action + args. */
|
|
93
|
+
function verifyState(key, action, binding, state) {
|
|
94
|
+
if (typeof state !== 'string' || !state.startsWith(STATE_PREFIX))
|
|
95
|
+
return false;
|
|
96
|
+
const rest = state.slice(STATE_PREFIX.length);
|
|
97
|
+
const dot = rest.indexOf('.');
|
|
98
|
+
if (dot < 0)
|
|
99
|
+
return false;
|
|
100
|
+
const body = rest.slice(0, dot);
|
|
101
|
+
const mac = Buffer.from(rest.slice(dot + 1), 'base64url');
|
|
102
|
+
const expected = createHmac('sha256', key).update(`${STATE_PREFIX}${body}`).digest();
|
|
103
|
+
if (mac.length !== expected.length || !timingSafeEqual(mac, expected))
|
|
104
|
+
return false;
|
|
105
|
+
let payload;
|
|
106
|
+
try {
|
|
107
|
+
payload = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
if (typeof payload.exp !== 'number' || payload.exp * 1000 <= Date.now())
|
|
113
|
+
return false;
|
|
114
|
+
const want = Buffer.from(commitment(action, binding.args));
|
|
115
|
+
const got = Buffer.from(typeof payload.c === 'string' ? payload.c : '');
|
|
116
|
+
return got.length === want.length && timingSafeEqual(got, want);
|
|
117
|
+
}
|
|
118
|
+
/** The round's echoed requestState, tolerating contexts without the accessor. */
|
|
119
|
+
function echoedState(ctx) {
|
|
120
|
+
const accessor = ctx.mcpReq.requestState;
|
|
121
|
+
return typeof accessor === 'function' ? accessor() : undefined;
|
|
122
|
+
}
|
|
9
123
|
/**
|
|
10
124
|
* Require an explicit, checked form elicitation before a mutating tool proceeds.
|
|
11
125
|
*
|
|
@@ -15,14 +129,34 @@ const UNSUPPORTED_NOTE = 'Nothing was done because this client cannot show a con
|
|
|
15
129
|
*
|
|
16
130
|
* The operation details are a display preview only. Recompute and re-authorize
|
|
17
131
|
* every write from the tool's original validated arguments on each retry.
|
|
132
|
+
*
|
|
133
|
+
* Pass {@link RequireConfirmationOptions.binding} to tie the acceptance to
|
|
134
|
+
* this action and these arguments (recommended for sends, payments and
|
|
135
|
+
* deletes); without it, any accepted response on the request is honoured.
|
|
18
136
|
*/
|
|
19
137
|
export function requireConfirmation(ctx, options) {
|
|
20
138
|
const requestKey = options.requestKey ?? DEFAULT_REQUEST_KEY;
|
|
139
|
+
const key = options.binding ? bindingKey(options.binding) : undefined;
|
|
21
140
|
const confirmationSchema = z.object({
|
|
22
141
|
confirmed: z
|
|
23
142
|
.boolean()
|
|
24
143
|
.describe(options.confirmationLabel ?? DEFAULT_CONFIRMATION_LABEL),
|
|
25
144
|
});
|
|
145
|
+
const ask = () => {
|
|
146
|
+
const preview = {
|
|
147
|
+
action: options.action,
|
|
148
|
+
...(options.details === undefined ? {} : { details: options.details }),
|
|
149
|
+
};
|
|
150
|
+
return inputRequired({
|
|
151
|
+
inputRequests: {
|
|
152
|
+
[requestKey]: inputRequired.elicit({
|
|
153
|
+
message: `${options.message}\n${JSON.stringify(preview, null, 2)}`,
|
|
154
|
+
requestedSchema: confirmationSchema,
|
|
155
|
+
}),
|
|
156
|
+
},
|
|
157
|
+
...(key && options.binding ? { requestState: mintState(key, options.action, options.binding) } : {}),
|
|
158
|
+
});
|
|
159
|
+
};
|
|
26
160
|
const response = inputResponse(ctx.mcpReq.inputResponses, requestKey);
|
|
27
161
|
const accepted = acceptedContent(ctx.mcpReq.inputResponses, requestKey, confirmationSchema);
|
|
28
162
|
if (response.kind === 'missing') {
|
|
@@ -45,20 +179,25 @@ export function requireConfirmation(ctx, options) {
|
|
|
45
179
|
: `${UNSUPPORTED_NOTE}.`,
|
|
46
180
|
});
|
|
47
181
|
}
|
|
48
|
-
|
|
49
|
-
action: options.action,
|
|
50
|
-
...(options.details === undefined ? {} : { details: options.details }),
|
|
51
|
-
};
|
|
52
|
-
return inputRequired({
|
|
53
|
-
inputRequests: {
|
|
54
|
-
[requestKey]: inputRequired.elicit({
|
|
55
|
-
message: `${options.message}\n${JSON.stringify(preview, null, 2)}`,
|
|
56
|
-
requestedSchema: confirmationSchema,
|
|
57
|
-
}),
|
|
58
|
-
},
|
|
59
|
-
});
|
|
182
|
+
return ask();
|
|
60
183
|
}
|
|
61
184
|
if (response.kind === 'elicit' && response.action === 'accept' && accepted?.confirmed === true) {
|
|
185
|
+
// Bound mode: an acceptance only counts for the prompt minted for this
|
|
186
|
+
// exact action + arguments. A replayed, pre-filled or expired one is asked
|
|
187
|
+
// again. An acceptance with NO state at all is not re-asked: a client or
|
|
188
|
+
// host that never round-trips `requestState` would loop accept → re-ask
|
|
189
|
+
// forever, so it gets an explicit error naming the likely cause instead.
|
|
190
|
+
if (key && options.binding) {
|
|
191
|
+
const state = echoedState(ctx);
|
|
192
|
+
if (state === undefined || state === null) {
|
|
193
|
+
return errorResult(`Confirmation for ${options.action} was accepted, but the retry carried no requestState, so it cannot be `
|
|
194
|
+
+ 'checked against the prompt that was shown. Nothing was done. The likely cause is that the MCP client or '
|
|
195
|
+
+ 'host does not round-trip requestState (it must echo the requestState from the input_required result '
|
|
196
|
+
+ 'back on the retry); asking again would loop.');
|
|
197
|
+
}
|
|
198
|
+
if (!verifyState(key, options.action, options.binding, state))
|
|
199
|
+
return ask();
|
|
200
|
+
}
|
|
62
201
|
return undefined;
|
|
63
202
|
}
|
|
64
203
|
return textResult({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/server/confirmation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,GAId,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/server/confirmation.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -110,13 +110,35 @@ export interface GracefulShutdownOptions {
|
|
|
110
110
|
* fleet's `process.exit(0)`). Set `false` in tests so the process survives.
|
|
111
111
|
*/
|
|
112
112
|
exit?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Upper bound (ms) on `onSignal` + `close`. When cleanup has not settled by
|
|
115
|
+
* then, it is abandoned (logged) and the process exits. Default `5000`.
|
|
116
|
+
* Must be a finite number > 0. Only meaningful with `exit` on.
|
|
117
|
+
*/
|
|
118
|
+
timeoutMs?: number;
|
|
119
|
+
/**
|
|
120
|
+
* Grace window (ms) after the first signal during which a repeat signal is
|
|
121
|
+
* ignored rather than treated as "exit now". Under `npx` a single Ctrl-C can
|
|
122
|
+
* deliver SIGINT twice within a few milliseconds (once to the process group,
|
|
123
|
+
* once forwarded by npx); without the window that duplicate would skip the
|
|
124
|
+
* cleanup. A repeat arriving after the window still forces an immediate
|
|
125
|
+
* exit. Default `500`. `0` disables the window. Must be a finite number >= 0.
|
|
126
|
+
*/
|
|
127
|
+
repeatSignalGraceMs?: number;
|
|
113
128
|
}
|
|
114
129
|
/**
|
|
115
130
|
* Wire SIGINT/SIGTERM to a one-shot graceful shutdown: run `onSignal` (e.g.
|
|
116
131
|
* close the client/transport), close `target`, then `process.exit(0)` (unless
|
|
117
|
-
* `exit: false`).
|
|
118
|
-
*
|
|
119
|
-
* cleanup can't hang the host.
|
|
132
|
+
* `exit: false`). A throwing `onSignal`/`close` is logged but still exits
|
|
133
|
+
* cleanly, and cleanup that never settles is abandoned after `timeoutMs`
|
|
134
|
+
* (default 5s), so a wedged cleanup can't hang the host. A second signal while
|
|
135
|
+
* shutdown is in progress forces an immediate exit (with `exit: false` it is
|
|
136
|
+
* ignored, as before) — but only once `repeatSignalGraceMs` (default 500ms)
|
|
137
|
+
* has passed since the first. Under `npx` a single Ctrl-C can deliver SIGINT
|
|
138
|
+
* twice (once to the process group, once forwarded by npx) within a few
|
|
139
|
+
* milliseconds; that duplicate lands inside the window and is ignored, so the
|
|
140
|
+
* cleanup still runs. A deliberate second Ctrl-C after the window still exits
|
|
141
|
+
* at once.
|
|
120
142
|
*
|
|
121
143
|
* `target` is the {@link StdioServerHandle} when called from {@link runMcp} —
|
|
122
144
|
* closing the handle closes whichever instance the connection pinned *and* the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,SAAS,EAA+B,MAAM,8BAA8B,CAAC;AACtF,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,8BAA8B,CAAC;AAI9E,cAAc,mBAAmB,CAAC;AAKlC;;;GAGG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5E;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,CAAC,KAAK,GAAG,OAAO,IAAI,CAC3C,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,KAAK,KACR,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,mBAGnC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB,CAAC,KAAK,GAAG,OAAO;IACrD,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA6FD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgDxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CAAC,KAAK,GAAG,OAAO,EACnD,IAAI,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAClC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,gDAAgD;AAChD,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -227,12 +227,23 @@ export async function createMcpServer(opts) {
|
|
|
227
227
|
}
|
|
228
228
|
return server;
|
|
229
229
|
}
|
|
230
|
+
/** Default bound on graceful-shutdown cleanup. */
|
|
231
|
+
const DEFAULT_SHUTDOWN_TIMEOUT_MS = 5000;
|
|
232
|
+
/** Default window in which a repeat signal is treated as a duplicate delivery. */
|
|
233
|
+
const DEFAULT_REPEAT_SIGNAL_GRACE_MS = 500;
|
|
230
234
|
/**
|
|
231
235
|
* Wire SIGINT/SIGTERM to a one-shot graceful shutdown: run `onSignal` (e.g.
|
|
232
236
|
* close the client/transport), close `target`, then `process.exit(0)` (unless
|
|
233
|
-
* `exit: false`).
|
|
234
|
-
*
|
|
235
|
-
* cleanup can't hang the host.
|
|
237
|
+
* `exit: false`). A throwing `onSignal`/`close` is logged but still exits
|
|
238
|
+
* cleanly, and cleanup that never settles is abandoned after `timeoutMs`
|
|
239
|
+
* (default 5s), so a wedged cleanup can't hang the host. A second signal while
|
|
240
|
+
* shutdown is in progress forces an immediate exit (with `exit: false` it is
|
|
241
|
+
* ignored, as before) — but only once `repeatSignalGraceMs` (default 500ms)
|
|
242
|
+
* has passed since the first. Under `npx` a single Ctrl-C can deliver SIGINT
|
|
243
|
+
* twice (once to the process group, once forwarded by npx) within a few
|
|
244
|
+
* milliseconds; that duplicate lands inside the window and is ignored, so the
|
|
245
|
+
* cleanup still runs. A deliberate second Ctrl-C after the window still exits
|
|
246
|
+
* at once.
|
|
236
247
|
*
|
|
237
248
|
* `target` is the {@link StdioServerHandle} when called from {@link runMcp} —
|
|
238
249
|
* closing the handle closes whichever instance the connection pinned *and* the
|
|
@@ -241,11 +252,48 @@ export async function createMcpServer(opts) {
|
|
|
241
252
|
*/
|
|
242
253
|
export function withGracefulShutdown(target, opts = {}) {
|
|
243
254
|
const shouldExit = opts.exit ?? true;
|
|
255
|
+
if (opts.timeoutMs !== undefined && !(Number.isFinite(opts.timeoutMs) && opts.timeoutMs > 0)) {
|
|
256
|
+
throw new RangeError('withGracefulShutdown: timeoutMs must be a finite number greater than 0.');
|
|
257
|
+
}
|
|
258
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;
|
|
259
|
+
if (opts.repeatSignalGraceMs !== undefined &&
|
|
260
|
+
!(Number.isFinite(opts.repeatSignalGraceMs) && opts.repeatSignalGraceMs >= 0)) {
|
|
261
|
+
throw new RangeError('withGracefulShutdown: repeatSignalGraceMs must be a finite number >= 0.');
|
|
262
|
+
}
|
|
263
|
+
const repeatGraceMs = opts.repeatSignalGraceMs ?? DEFAULT_REPEAT_SIGNAL_GRACE_MS;
|
|
244
264
|
let shuttingDown = false;
|
|
265
|
+
let firstSignalAt = 0;
|
|
266
|
+
let exited = false;
|
|
267
|
+
const exitOnce = () => {
|
|
268
|
+
if (exited)
|
|
269
|
+
return;
|
|
270
|
+
exited = true;
|
|
271
|
+
process.exit(0);
|
|
272
|
+
};
|
|
245
273
|
const handler = (signal) => {
|
|
246
|
-
if (shuttingDown)
|
|
274
|
+
if (shuttingDown) {
|
|
275
|
+
// A repeat inside the grace window is a duplicate delivery of the same
|
|
276
|
+
// interrupt (npx forwards SIGINT to a child that already got it), not a
|
|
277
|
+
// second request: let the cleanup finish.
|
|
278
|
+
if (Date.now() - firstSignalAt < repeatGraceMs)
|
|
279
|
+
return;
|
|
280
|
+
// The host asked again: stop waiting on cleanup.
|
|
281
|
+
if (shouldExit) {
|
|
282
|
+
console.error(`[mcp-utils] second ${signal} during shutdown — exiting now`);
|
|
283
|
+
exitOnce();
|
|
284
|
+
}
|
|
247
285
|
return;
|
|
286
|
+
}
|
|
248
287
|
shuttingDown = true;
|
|
288
|
+
firstSignalAt = Date.now();
|
|
289
|
+
let timer;
|
|
290
|
+
if (shouldExit) {
|
|
291
|
+
timer = setTimeout(() => {
|
|
292
|
+
console.error(`[mcp-utils] graceful shutdown on ${signal} did not finish in ${timeoutMs}ms — exiting`);
|
|
293
|
+
exitOnce();
|
|
294
|
+
}, timeoutMs);
|
|
295
|
+
timer.unref?.();
|
|
296
|
+
}
|
|
249
297
|
void (async () => {
|
|
250
298
|
try {
|
|
251
299
|
if (opts.onSignal)
|
|
@@ -256,8 +304,10 @@ export function withGracefulShutdown(target, opts = {}) {
|
|
|
256
304
|
console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
|
|
257
305
|
}
|
|
258
306
|
finally {
|
|
307
|
+
if (timer !== undefined)
|
|
308
|
+
clearTimeout(timer);
|
|
259
309
|
if (shouldExit)
|
|
260
|
-
|
|
310
|
+
exitOnce();
|
|
261
311
|
}
|
|
262
312
|
})();
|
|
263
313
|
};
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAsB5D,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;IACpD,YAAY;IACZ,GAAG,2BAA2B;CAC/B,CAAC,CAAC;AAoCH;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,WAAW,CAAC,GAAG,GAAG,CAAC,OAAO,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,GAAG,CAAC;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,cAAc,CAAC,IAAwB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,GAAG,GAAI,GAA4B,CAAC,MAAM,CAAC;IACjD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,0EAA0E;IAC1E,yEAAyE;IACzE,OAAO,OAAQ,GAA4B,CAAC,MAAM,KAAK,UAAU;QAC/D,CAAC,CAAE,GAA4C;QAC/C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,cAAc,CAAC,IAAwB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,GAAG,GAAI,GAA4B,CAAC,MAAM,CAAC;IACjD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;IACpD,OAAO,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,wBAAwB,CAAC,MAAiB;IACjD,MAAM,KAAK,GAAI,MAA0C,CAAC,MAAM,CAAC;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,IAAI,GAAI,KAA6C,CAAC,qBAAqB,CAAC;IAClF,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAI,IAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;YACtD,CAAC,CAAE,QAA+B;YAClC,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAEpC,CAAC;IAEb,6EAA6E;IAC7E,uEAAuE;IACvE,kEAAkE;IACjE,MAA+C,CAAC,YAAY,GAAG,CAC9D,IAAa,EACb,MAAe,EACf,EAAoE,EAC3D,EAAE,CACX,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;IAC5C,gEAAgE;IAChE,qEAAqE;IACrE,mEAAmE;IACnE,mEAAmE;IACnE,oEAAoE;IACpE,mEAAmE;IACnE,gEAAgE;IAChE,2CAA2C;IAC3C,EAAE;IACF,iEAAiE;IACjE,mEAAmE;IACnE,8DAA8D;IAC9D,cAAc,CACZ,cAAc,CAAC,IAAI,CAAC,EACpB,GAAG,EAAE;IACH,kEAAkE;IAClE,mEAAmE;IACnE,oEAAoE;IACpE,oEAAoE;IACpE,qEAAqE;IACrE,iEAAiE;IACjE,mCAAmC;IACnC,sBAAsB,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE;QAC5D,IAAI,MAAgD,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChF,CAAC,CAAC,EACJ,cAAc,CAAC,IAAI,CAAC,CACrB,CACF,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAmC;IAEnC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAC1C,EAAE,yBAAyB,EAAE,CAAC,GAAG,wBAAwB,CAAC,EAAE,CAC7D,CAAC;IAEF,qEAAqE;IACrE,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK;QAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE1D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,wEAAwE;QACxE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAa,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AA6CD,kDAAkD;AAClD,MAAM,2BAA2B,GAAG,IAAI,CAAC;AACzC,kFAAkF;AAClF,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,IAAI,GAA4B,EAAE;IAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IACrC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,UAAU,CAAC,yEAAyE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,2BAA2B,CAAC;IAChE,IACE,IAAI,CAAC,mBAAmB,KAAK,SAAS;QACtC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,EAC7E,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,yEAAyE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,IAAI,8BAA8B,CAAC;IACjF,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAQ,EAAE;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,uEAAuE;YACvE,wEAAwE;YACxE,0CAA0C;YAC1C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,aAAa;gBAAE,OAAO;YACvD,iDAAiD;YACjD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,MAAM,gCAAgC,CAAC,CAAC;gBAC5E,QAAQ,EAAE,CAAC;YACb,CAAC;YACD,OAAO;QACT,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;QACpB,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,KAAgD,CAAC;QACrD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,OAAO,CAAC,KAAK,CAAC,oCAAoC,MAAM,sBAAsB,SAAS,cAAc,CAAC,CAAC;gBACvG,QAAQ,EAAE,CAAC;YACb,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACX,iDAAiD,MAAM,KACrD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,IAAI,KAAK,KAAK,SAAS;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,UAAU;oBAAE,QAAQ,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC;AA+CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,MAAM,CAAkB,IAA0B;IAChE,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,wEAAwE;QACxE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,GAAkB,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;IAEtD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE;QAC/E,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO;QAC9B,OAAO,EACL,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,KAAY,EAAE,EAAE;gBAChB,uEAAuE;gBACvE,kEAAkE;gBAClE,kEAAkE;gBAClE,qEAAqE;gBACrE,gEAAgE;gBAChE,oEAAoE;gBACpE,+DAA+D;gBAC/D,OAAO,CAAC,KAAK,CAAC,mCAAmC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC,CAAC;QACJ,wEAAwE;QACxE,0EAA0E;QAC1E,qEAAqE;QACrE,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACjD,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/session/index.d.ts
CHANGED
|
@@ -478,7 +478,11 @@ export interface TokenManagerOptions {
|
|
|
478
478
|
*
|
|
479
479
|
* The default resolves that by only excusing failures that are transient *by
|
|
480
480
|
* construction* — a {@link RateLimitedError}, a {@link RequestTimeoutError},
|
|
481
|
-
*
|
|
481
|
+
* any error carrying a numeric `status` that is 5xx, 429 or 408 (an
|
|
482
|
+
* {@link ApiError}, or `createOAuth2Refresher`'s `OAuth2RefreshError`), an
|
|
483
|
+
* `AbortError`/`TimeoutError`, or a network failure (undici's
|
|
484
|
+
* `TypeError('fetch failed')`, or a socket/DNS error code such as
|
|
485
|
+
* `ECONNRESET`/`ENOTFOUND` on the error or its `cause`). Anything else is assumed to be a
|
|
482
486
|
* dead credential, which keeps the recover-from-revocation guarantee. Override
|
|
483
487
|
* it for a service that signals revocation some other way (or, conversely, one
|
|
484
488
|
* that answers a live token with a 5xx). Mirrors the permanent-vs-transient
|
|
@@ -508,6 +512,9 @@ export interface TokenManagerOptions {
|
|
|
508
512
|
* and costing nothing.
|
|
509
513
|
* - **Proactive:** {@link TokenManager.getAccessToken} refreshes when the token
|
|
510
514
|
* is within `skewMs` (default 5 min) of expiry, returning a still-valid token.
|
|
515
|
+
* If that early refresh fails transiently (see
|
|
516
|
+
* {@link TokenManagerOptions.isRefreshRevoked}) while the current token has
|
|
517
|
+
* not yet expired, the current token is returned and the next call retries.
|
|
511
518
|
* - **Reactive:** {@link TokenManager.withAuth} runs a request, and on a `401`
|
|
512
519
|
* refreshes once and replays exactly once (no infinite loop).
|
|
513
520
|
* - **Race-safe:** concurrent refreshes (and concurrent bootstraps) coalesce
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"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"}
|
package/dist/session/index.js
CHANGED
|
@@ -730,7 +730,50 @@ function defaultIsRefreshRevoked(err) {
|
|
|
730
730
|
return false;
|
|
731
731
|
if (err instanceof ApiError && err.status >= 500)
|
|
732
732
|
return false;
|
|
733
|
-
return
|
|
733
|
+
return !isTransientFailure(err);
|
|
734
|
+
}
|
|
735
|
+
/** An error flagged as "the exchange worked, saving its result did not". */
|
|
736
|
+
function isPersistenceFailure(err) {
|
|
737
|
+
return err !== null && typeof err === 'object' && err.persistenceFailure === true;
|
|
738
|
+
}
|
|
739
|
+
/** Socket / DNS error codes that say nothing about the credential. */
|
|
740
|
+
const TRANSIENT_NETWORK_CODES = new Set([
|
|
741
|
+
'ECONNRESET',
|
|
742
|
+
'ECONNREFUSED',
|
|
743
|
+
'ECONNABORTED',
|
|
744
|
+
'ETIMEDOUT',
|
|
745
|
+
'ENOTFOUND',
|
|
746
|
+
'EAI_AGAIN',
|
|
747
|
+
'ENETUNREACH',
|
|
748
|
+
'ENETDOWN',
|
|
749
|
+
'EHOSTUNREACH',
|
|
750
|
+
'EPIPE',
|
|
751
|
+
]);
|
|
752
|
+
/**
|
|
753
|
+
* Whether `err` is an outage rather than a verdict on the credential: a
|
|
754
|
+
* status-carrying error with a 5xx/429/408 status (duck-typed, so the
|
|
755
|
+
* library's own `OAuth2RefreshError` counts without an import), an abort or
|
|
756
|
+
* timeout, or a network failure. Walks a short `cause` chain because undici
|
|
757
|
+
* wraps the socket error in `TypeError('fetch failed', { cause })`.
|
|
758
|
+
*/
|
|
759
|
+
function isTransientFailure(err) {
|
|
760
|
+
let cur = err;
|
|
761
|
+
for (let depth = 0; depth < 4 && cur !== null && typeof cur === 'object'; depth++) {
|
|
762
|
+
const e = cur;
|
|
763
|
+
if (typeof e.status === 'number' && (e.status >= 500 || e.status === 429 || e.status === 408))
|
|
764
|
+
return true;
|
|
765
|
+
if (e.name === 'AbortError' || e.name === 'TimeoutError')
|
|
766
|
+
return true;
|
|
767
|
+
if (typeof e.code === 'string' && (TRANSIENT_NETWORK_CODES.has(e.code) || e.code.startsWith('UND_ERR_'))) {
|
|
768
|
+
return true;
|
|
769
|
+
}
|
|
770
|
+
// undici's network failure. Matched on the exact message so an ordinary
|
|
771
|
+
// programming TypeError still counts as "credential dead" (re-mint).
|
|
772
|
+
if (e.name === 'TypeError' && e.message === 'fetch failed')
|
|
773
|
+
return true;
|
|
774
|
+
cur = e.cause;
|
|
775
|
+
}
|
|
776
|
+
return false;
|
|
734
777
|
}
|
|
735
778
|
/** Whether a parsed record has the shape of {@link BearerTokens}. */
|
|
736
779
|
function isBearerTokens(raw) {
|
|
@@ -752,6 +795,9 @@ function isBearerTokens(raw) {
|
|
|
752
795
|
* and costing nothing.
|
|
753
796
|
* - **Proactive:** {@link TokenManager.getAccessToken} refreshes when the token
|
|
754
797
|
* is within `skewMs` (default 5 min) of expiry, returning a still-valid token.
|
|
798
|
+
* If that early refresh fails transiently (see
|
|
799
|
+
* {@link TokenManagerOptions.isRefreshRevoked}) while the current token has
|
|
800
|
+
* not yet expired, the current token is returned and the next call retries.
|
|
755
801
|
* - **Reactive:** {@link TokenManager.withAuth} runs a request, and on a `401`
|
|
756
802
|
* refreshes once and replays exactly once (no infinite loop).
|
|
757
803
|
* - **Race-safe:** concurrent refreshes (and concurrent bootstraps) coalesce
|
|
@@ -934,6 +980,11 @@ export class TokenManager {
|
|
|
934
980
|
// store here would destroy the only surviving copy.
|
|
935
981
|
if (err instanceof StatePersistenceError)
|
|
936
982
|
throw err.cause;
|
|
983
|
+
// Same for a refresher that rotated successfully but could not save the
|
|
984
|
+
// new token (createOAuth2Refresher's OAuth2RotationPersistError,
|
|
985
|
+
// duck-typed so this module does not import auth).
|
|
986
|
+
if (isPersistenceFailure(err))
|
|
987
|
+
throw err;
|
|
937
988
|
if (this.bootstrapFn === undefined)
|
|
938
989
|
throw err;
|
|
939
990
|
// Only a credential we believe is DEAD is worth destroying. A 5xx or a
|
|
@@ -955,6 +1006,15 @@ export class TokenManager {
|
|
|
955
1006
|
await this.refreshNow();
|
|
956
1007
|
}
|
|
957
1008
|
catch (err) {
|
|
1009
|
+
// An early refresh that hit an outage must not fail a call whose token
|
|
1010
|
+
// still works: keep using it until it has actually expired.
|
|
1011
|
+
const held = this.tokens;
|
|
1012
|
+
if (!(err instanceof StatePersistenceError) &&
|
|
1013
|
+
held !== undefined &&
|
|
1014
|
+
this.now() < held.expiresAt &&
|
|
1015
|
+
!this.isRefreshRevokedFn(err)) {
|
|
1016
|
+
return held.accessToken;
|
|
1017
|
+
}
|
|
958
1018
|
return (await this.reBootstrap(err)).accessToken;
|
|
959
1019
|
}
|
|
960
1020
|
tokens = this.tokens ?? tokens;
|