@chrischall/mcp-utils 2.11.0 → 2.13.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 +507 -13
- package/dist/concurrency/index.d.ts +3 -1
- package/dist/concurrency/index.d.ts.map +1 -1
- package/dist/concurrency/index.js +3 -1
- package/dist/concurrency/index.js.map +1 -1
- package/dist/concurrency/verify-after-write.d.ts +84 -0
- package/dist/concurrency/verify-after-write.d.ts.map +1 -0
- package/dist/concurrency/verify-after-write.js +108 -0
- package/dist/concurrency/verify-after-write.js.map +1 -0
- package/dist/errors/index.d.ts +35 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +79 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/fetchproxy/fallback.d.ts +130 -0
- package/dist/fetchproxy/fallback.d.ts.map +1 -0
- package/dist/fetchproxy/fallback.js +199 -0
- package/dist/fetchproxy/fallback.js.map +1 -0
- package/dist/fetchproxy/index.d.ts +31 -1
- package/dist/fetchproxy/index.d.ts.map +1 -1
- package/dist/fetchproxy/index.js +120 -13
- package/dist/fetchproxy/index.js.map +1 -1
- package/dist/fs/confine.d.ts +9 -0
- package/dist/fs/confine.d.ts.map +1 -1
- package/dist/fs/confine.js +11 -2
- package/dist/fs/confine.js.map +1 -1
- package/dist/fs/index.d.ts +9 -2
- package/dist/fs/index.d.ts.map +1 -1
- package/dist/fs/index.js +13 -4
- package/dist/fs/index.js.map +1 -1
- package/dist/fs/magic.d.ts +35 -0
- package/dist/fs/magic.d.ts.map +1 -0
- package/dist/fs/magic.js +110 -0
- package/dist/fs/magic.js.map +1 -0
- package/dist/fs/output.d.ts +14 -10
- package/dist/fs/output.d.ts.map +1 -1
- package/dist/fs/output.js +21 -45
- package/dist/fs/output.js.map +1 -1
- package/dist/fs/upload-guard.d.ts +97 -0
- package/dist/fs/upload-guard.d.ts.map +1 -0
- package/dist/fs/upload-guard.js +185 -0
- package/dist/fs/upload-guard.js.map +1 -0
- package/dist/fs/write.d.ts +100 -0
- package/dist/fs/write.d.ts.map +1 -0
- package/dist/fs/write.js +207 -0
- package/dist/fs/write.js.map +1 -0
- package/dist/graphql/client.d.ts +228 -0
- package/dist/graphql/client.d.ts.map +1 -0
- package/dist/graphql/client.js +341 -0
- package/dist/graphql/client.js.map +1 -0
- package/dist/graphql/index.d.ts +20 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +20 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/graphql/operation-kind.d.ts +58 -0
- package/dist/graphql/operation-kind.d.ts.map +1 -0
- package/dist/graphql/operation-kind.js +237 -0
- package/dist/graphql/operation-kind.js.map +1 -0
- package/dist/html/index.d.ts +33 -0
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +78 -13
- package/dist/html/index.js.map +1 -1
- package/dist/http/index.d.ts +75 -5
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +111 -22
- package/dist/http/index.js.map +1 -1
- package/dist/http/net-atoms.d.ts +14 -4
- package/dist/http/net-atoms.d.ts.map +1 -1
- package/dist/http/net-atoms.js +95 -13
- package/dist/http/net-atoms.js.map +1 -1
- package/dist/internal/code-point.d.ts +20 -0
- package/dist/internal/code-point.d.ts.map +1 -0
- package/dist/internal/code-point.js +26 -0
- package/dist/internal/code-point.js.map +1 -0
- package/dist/internal/retry-after.d.ts +12 -0
- package/dist/internal/retry-after.d.ts.map +1 -0
- package/dist/internal/retry-after.js +26 -0
- package/dist/internal/retry-after.js.map +1 -0
- package/dist/response/index.d.ts +1 -0
- package/dist/response/index.d.ts.map +1 -1
- package/dist/response/index.js +1 -0
- package/dist/response/index.js.map +1 -1
- package/dist/response/untrusted.d.ts +72 -0
- package/dist/response/untrusted.d.ts.map +1 -0
- package/dist/response/untrusted.js +55 -0
- package/dist/response/untrusted.js.map +1 -0
- package/dist/scrape/index.d.ts +78 -1
- package/dist/scrape/index.d.ts.map +1 -1
- package/dist/scrape/index.js +276 -20
- package/dist/scrape/index.js.map +1 -1
- package/dist/server/confirm-write.d.ts +152 -0
- package/dist/server/confirm-write.d.ts.map +1 -0
- package/dist/server/confirm-write.js +107 -0
- package/dist/server/confirm-write.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/merge-write.d.ts +101 -0
- package/dist/server/merge-write.d.ts.map +1 -0
- package/dist/server/merge-write.js +94 -0
- package/dist/server/merge-write.js.map +1 -0
- package/dist/session/atomic-write.d.ts +15 -0
- package/dist/session/atomic-write.d.ts.map +1 -0
- package/dist/session/atomic-write.js +42 -0
- package/dist/session/atomic-write.js.map +1 -0
- package/dist/session/file-lock.d.ts +57 -0
- package/dist/session/file-lock.d.ts.map +1 -0
- package/dist/session/file-lock.js +215 -0
- package/dist/session/file-lock.js.map +1 -0
- package/dist/session/index.d.ts +118 -2
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +200 -82
- package/dist/session/index.js.map +1 -1
- package/dist/session/login-page.d.ts +73 -0
- package/dist/session/login-page.d.ts.map +1 -0
- package/dist/session/login-page.js +143 -0
- package/dist/session/login-page.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-write.js","sourceRoot":"","sources":["../../src/server/confirm-write.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export * from './confirmation.js';
|
|
|
5
5
|
export * from './confirm-token.js';
|
|
6
6
|
export * from './confirm-env.js';
|
|
7
7
|
export * from './confirm-spent-file.js';
|
|
8
|
+
export * from './confirm-write.js';
|
|
9
|
+
export * from './merge-write.js';
|
|
8
10
|
/**
|
|
9
11
|
* The handle {@link runMcp} returns — re-exported so a caller can name the
|
|
10
12
|
* type without importing the SDK's `/stdio` subpath itself.
|
|
@@ -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;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,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
|
@@ -41,6 +41,8 @@ export * from './confirmation.js';
|
|
|
41
41
|
export * from './confirm-token.js';
|
|
42
42
|
export * from './confirm-env.js';
|
|
43
43
|
export * from './confirm-spent-file.js';
|
|
44
|
+
export * from './confirm-write.js';
|
|
45
|
+
export * from './merge-write.js';
|
|
44
46
|
import { withCallSignal } from '../cancel/index.js';
|
|
45
47
|
import { withCallerCapabilities } from '../caller/index.js';
|
|
46
48
|
/** Protocol revisions supported by servers and the shared test harness. */
|
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":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-modify-write for full-replace update endpoints, built to feed
|
|
3
|
+
* {@link confirmWrite}.
|
|
4
|
+
*
|
|
5
|
+
* Some APIs' update verb REPLACES the whole resource: Tempo v4's PUTs reset
|
|
6
|
+
* "any fields not specified in the request ... to their default values or
|
|
7
|
+
* removed". A body built from only the caller's arguments then silently wipes
|
|
8
|
+
* every field the caller did not mention. The safe shape is: GET the current
|
|
9
|
+
* resource, map it to the update input, lay the caller's defined fields over
|
|
10
|
+
* it, and bind the resource's revision into the confirm token so an edit made
|
|
11
|
+
* between the preview and the confirmed call is refused (DRAFT_CHANGED)
|
|
12
|
+
* instead of overwritten.
|
|
13
|
+
*
|
|
14
|
+
* Hoisted from tempo-api-mcp `src/tools/_merge.ts` (`mergeOverCurrent`,
|
|
15
|
+
* `revisionOf`, `UPDATE_MERGE_NOTE`), which its worklog / plan / team /
|
|
16
|
+
* account update tools share — chrischall/fleet-audit#1180.
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* const { body, revision } = await prepareMergedUpdate({
|
|
20
|
+
* read: () => client.request('GET', `/4/worklogs/${id}`),
|
|
21
|
+
* toInput: worklogToUpdateInput,
|
|
22
|
+
* patch, // the tool's args minus id/confirmToken
|
|
23
|
+
* });
|
|
24
|
+
* const gate = await confirmWrite(ctx, {
|
|
25
|
+
* tool: 'tempo_update_worklog', action: 'worklog.update', account: undefined, target: id,
|
|
26
|
+
* revision, request: { method: 'PUT', path: `/4/worklogs/${id}`, body }, confirmToken,
|
|
27
|
+
* });
|
|
28
|
+
* if (gate) return gate;
|
|
29
|
+
* await client.request('PUT', `/4/worklogs/${id}`, body);
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* Call it on EVERY invocation (phase 1 and the confirmed call) so the preview
|
|
33
|
+
* shows the full merged body and phase 2 re-reads the revision.
|
|
34
|
+
*/
|
|
35
|
+
/** A plain JSON-ish object. */
|
|
36
|
+
type Obj = Record<string, unknown>;
|
|
37
|
+
/**
|
|
38
|
+
* The tool-description sentence for a merged update — the generic form of
|
|
39
|
+
* tempo's `UPDATE_MERGE_NOTE`. No leading space.
|
|
40
|
+
*/
|
|
41
|
+
export declare const MERGED_UPDATE_NOTE: string;
|
|
42
|
+
/**
|
|
43
|
+
* The current resource (already mapped to the update's input shape) with the
|
|
44
|
+
* caller's fields on top. A patch field that is `undefined` or `null` keeps
|
|
45
|
+
* the current value — so `null` cannot clear a field; send the API's own
|
|
46
|
+
* "empty" value for that. Shallow: a patched nested object or array replaces
|
|
47
|
+
* the current one whole. Neither input is mutated.
|
|
48
|
+
*/
|
|
49
|
+
export declare function mergeOverCurrent(current: Obj, patch: Obj): Obj;
|
|
50
|
+
/**
|
|
51
|
+
* A resource's revision — a field the API rotates on every edit — for
|
|
52
|
+
* {@link ConfirmWriteOptions.revision}. Reads `updatedAt` by default (Tempo);
|
|
53
|
+
* pass another field name for an `etag` / `version`. A non-empty string is
|
|
54
|
+
* returned as is and a finite number as its string form; anything else
|
|
55
|
+
* (absent, empty, an object, a non-object resource) is `undefined`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function revisionOf(raw: unknown, field?: string): string | undefined;
|
|
58
|
+
/** Options for {@link prepareMergedUpdate}. */
|
|
59
|
+
export interface MergedUpdateOptions<R = unknown> {
|
|
60
|
+
/** Fetch the current resource (a GET, or a search when the update key is not the read key). */
|
|
61
|
+
read: () => Promise<R>;
|
|
62
|
+
/**
|
|
63
|
+
* Map the resource to the update's input shape — read-only and server-set
|
|
64
|
+
* fields dropped, nested refs flattened to the ids the update takes.
|
|
65
|
+
* Defaults to the resource itself (a non-object becomes `{}`).
|
|
66
|
+
*/
|
|
67
|
+
toInput?: (raw: R) => Obj;
|
|
68
|
+
/** The caller's fields; `undefined`/`null` ones keep the current value. */
|
|
69
|
+
patch: Obj;
|
|
70
|
+
/**
|
|
71
|
+
* Edit the mapped current resource before the merge — e.g. drop a field
|
|
72
|
+
* that only mirrored one the patch changes (tempo's `billableSeconds`), or
|
|
73
|
+
* one that is mutually exclusive with a patched field. Gets a copy.
|
|
74
|
+
*/
|
|
75
|
+
adjust?: (current: Obj, patch: Obj) => void;
|
|
76
|
+
/**
|
|
77
|
+
* Where the revision comes from: a field name (default `'updatedAt'`), a
|
|
78
|
+
* function of the resource, or `false` when the API exposes none.
|
|
79
|
+
*/
|
|
80
|
+
revision?: string | ((raw: R) => string | undefined) | false;
|
|
81
|
+
}
|
|
82
|
+
/** Result of {@link prepareMergedUpdate}. */
|
|
83
|
+
export interface MergedUpdate<R = unknown> {
|
|
84
|
+
/** The full body to send (and to pass to `confirmWrite` as `request.body`). */
|
|
85
|
+
body: Obj;
|
|
86
|
+
/** The resource's revision, for `confirmWrite`'s `revision`; `undefined` when none. */
|
|
87
|
+
revision: string | undefined;
|
|
88
|
+
/** The resource as read. */
|
|
89
|
+
raw: R;
|
|
90
|
+
/** The mapped current resource after `adjust`, before the merge. */
|
|
91
|
+
current: Obj;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Read the current resource and build the full-replace body: `toInput(read())`,
|
|
95
|
+
* then `adjust`, then {@link mergeOverCurrent} with `patch`; plus the
|
|
96
|
+
* resource's revision. Sends nothing — pass `body`/`revision` to
|
|
97
|
+
* {@link confirmWrite}, then write `body`. A failed read rejects as is.
|
|
98
|
+
*/
|
|
99
|
+
export declare function prepareMergedUpdate<R = unknown>(options: MergedUpdateOptions<R>): Promise<MergedUpdate<R>>;
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=merge-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-write.d.ts","sourceRoot":"","sources":["../../src/server/merge-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,+BAA+B;AAC/B,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAMnC;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAIyC,CAAC;AAEzE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAS9D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAc,GAAG,MAAM,GAAG,SAAS,CAKhF;AAED,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,+FAA+F;IAC/F,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC;IAC1B,2EAA2E;IAC3E,KAAK,EAAE,GAAG,CAAC;IACX;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC5C;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC;CAC9D;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,+EAA+E;IAC/E,IAAI,EAAE,GAAG,CAAC;IACV,uFAAuF;IACvF,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,4BAA4B;IAC5B,GAAG,EAAE,CAAC,CAAC;IACP,oEAAoE;IACpE,OAAO,EAAE,GAAG,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAQhH"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-modify-write for full-replace update endpoints, built to feed
|
|
3
|
+
* {@link confirmWrite}.
|
|
4
|
+
*
|
|
5
|
+
* Some APIs' update verb REPLACES the whole resource: Tempo v4's PUTs reset
|
|
6
|
+
* "any fields not specified in the request ... to their default values or
|
|
7
|
+
* removed". A body built from only the caller's arguments then silently wipes
|
|
8
|
+
* every field the caller did not mention. The safe shape is: GET the current
|
|
9
|
+
* resource, map it to the update input, lay the caller's defined fields over
|
|
10
|
+
* it, and bind the resource's revision into the confirm token so an edit made
|
|
11
|
+
* between the preview and the confirmed call is refused (DRAFT_CHANGED)
|
|
12
|
+
* instead of overwritten.
|
|
13
|
+
*
|
|
14
|
+
* Hoisted from tempo-api-mcp `src/tools/_merge.ts` (`mergeOverCurrent`,
|
|
15
|
+
* `revisionOf`, `UPDATE_MERGE_NOTE`), which its worklog / plan / team /
|
|
16
|
+
* account update tools share — chrischall/fleet-audit#1180.
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* const { body, revision } = await prepareMergedUpdate({
|
|
20
|
+
* read: () => client.request('GET', `/4/worklogs/${id}`),
|
|
21
|
+
* toInput: worklogToUpdateInput,
|
|
22
|
+
* patch, // the tool's args minus id/confirmToken
|
|
23
|
+
* });
|
|
24
|
+
* const gate = await confirmWrite(ctx, {
|
|
25
|
+
* tool: 'tempo_update_worklog', action: 'worklog.update', account: undefined, target: id,
|
|
26
|
+
* revision, request: { method: 'PUT', path: `/4/worklogs/${id}`, body }, confirmToken,
|
|
27
|
+
* });
|
|
28
|
+
* if (gate) return gate;
|
|
29
|
+
* await client.request('PUT', `/4/worklogs/${id}`, body);
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* Call it on EVERY invocation (phase 1 and the confirmed call) so the preview
|
|
33
|
+
* shows the full merged body and phase 2 re-reads the revision.
|
|
34
|
+
*/
|
|
35
|
+
function asObj(v) {
|
|
36
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v) ? v : {};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The tool-description sentence for a merged update — the generic form of
|
|
40
|
+
* tempo's `UPDATE_MERGE_NOTE`. No leading space.
|
|
41
|
+
*/
|
|
42
|
+
export const MERGED_UPDATE_NOTE = 'Fields you omit keep their current values: the tool reads the current resource and merges your fields over it '
|
|
43
|
+
+ '(the update replaces the whole resource, so one built from only the changed fields would wipe the rest). That '
|
|
44
|
+
+ 'read runs on every call, so the preview shows the full merged body, and a resource that changes between the '
|
|
45
|
+
+ 'preview and the confirmed call is refused rather than overwritten.';
|
|
46
|
+
/**
|
|
47
|
+
* The current resource (already mapped to the update's input shape) with the
|
|
48
|
+
* caller's fields on top. A patch field that is `undefined` or `null` keeps
|
|
49
|
+
* the current value — so `null` cannot clear a field; send the API's own
|
|
50
|
+
* "empty" value for that. Shallow: a patched nested object or array replaces
|
|
51
|
+
* the current one whole. Neither input is mutated.
|
|
52
|
+
*/
|
|
53
|
+
export function mergeOverCurrent(current, patch) {
|
|
54
|
+
const out = { ...current };
|
|
55
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
56
|
+
if (v === undefined || v === null)
|
|
57
|
+
continue;
|
|
58
|
+
// defineProperty, not assignment: a JSON-parsed "__proto__" key must land
|
|
59
|
+
// as an own field, never as the result's prototype.
|
|
60
|
+
Object.defineProperty(out, k, { value: v, enumerable: true, writable: true, configurable: true });
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A resource's revision — a field the API rotates on every edit — for
|
|
66
|
+
* {@link ConfirmWriteOptions.revision}. Reads `updatedAt` by default (Tempo);
|
|
67
|
+
* pass another field name for an `etag` / `version`. A non-empty string is
|
|
68
|
+
* returned as is and a finite number as its string form; anything else
|
|
69
|
+
* (absent, empty, an object, a non-object resource) is `undefined`.
|
|
70
|
+
*/
|
|
71
|
+
export function revisionOf(raw, field = 'updatedAt') {
|
|
72
|
+
const value = asObj(raw)[field];
|
|
73
|
+
if (typeof value === 'string')
|
|
74
|
+
return value === '' ? undefined : value;
|
|
75
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
76
|
+
return String(value);
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Read the current resource and build the full-replace body: `toInput(read())`,
|
|
81
|
+
* then `adjust`, then {@link mergeOverCurrent} with `patch`; plus the
|
|
82
|
+
* resource's revision. Sends nothing — pass `body`/`revision` to
|
|
83
|
+
* {@link confirmWrite}, then write `body`. A failed read rejects as is.
|
|
84
|
+
*/
|
|
85
|
+
export async function prepareMergedUpdate(options) {
|
|
86
|
+
const raw = await options.read();
|
|
87
|
+
const current = { ...(options.toInput ? options.toInput(raw) : asObj(raw)) };
|
|
88
|
+
options.adjust?.(current, options.patch);
|
|
89
|
+
const body = mergeOverCurrent(current, options.patch);
|
|
90
|
+
const source = options.revision ?? 'updatedAt';
|
|
91
|
+
const revision = source === false ? undefined : typeof source === 'function' ? source(raw) : revisionOf(raw, source);
|
|
92
|
+
return { body, revision, raw, current };
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=merge-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-write.js","sourceRoot":"","sources":["../../src/server/merge-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAKH,SAAS,KAAK,CAAC,CAAU;IACvB,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,gHAAgH;MAC9G,gHAAgH;MAChH,8GAA8G;MAC9G,oEAAoE,CAAC;AAEzE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAY,EAAE,KAAU;IACvD,MAAM,GAAG,GAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,SAAS;QAC5C,0EAA0E;QAC1E,oDAAoD;QACpD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,KAAK,GAAG,WAAW;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACvE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,SAAS,CAAC;AACnB,CAAC;AAuCD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAc,OAA+B;IACpF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,OAAO,GAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replace a file atomically: write a private temp file beside it (`0600`),
|
|
3
|
+
* flush it to disk, then rename it over the target. A concurrent reader sees
|
|
4
|
+
* the old file or the new one — never a truncated half of one, which is what an
|
|
5
|
+
* in-place `writeFileSync` exposes mid-write (mcp-utils#330: a fresh-mode
|
|
6
|
+
* `SessionStore` reader quarantined a live store it caught half-written).
|
|
7
|
+
*
|
|
8
|
+
* The temp name is unique per call so two writers never share (and tear) one.
|
|
9
|
+
* On failure the temp file is removed and the error re-thrown; the target is
|
|
10
|
+
* untouched. Directory creation/permissions stay the caller's business.
|
|
11
|
+
*
|
|
12
|
+
* Internal to the session module; not exported from the package.
|
|
13
|
+
*/
|
|
14
|
+
export declare function writeFileAtomicSync(filePath: string, data: string): void;
|
|
15
|
+
//# sourceMappingURL=atomic-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/session/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAqBxE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replace a file atomically: write a private temp file beside it (`0600`),
|
|
3
|
+
* flush it to disk, then rename it over the target. A concurrent reader sees
|
|
4
|
+
* the old file or the new one — never a truncated half of one, which is what an
|
|
5
|
+
* in-place `writeFileSync` exposes mid-write (mcp-utils#330: a fresh-mode
|
|
6
|
+
* `SessionStore` reader quarantined a live store it caught half-written).
|
|
7
|
+
*
|
|
8
|
+
* The temp name is unique per call so two writers never share (and tear) one.
|
|
9
|
+
* On failure the temp file is removed and the error re-thrown; the target is
|
|
10
|
+
* untouched. Directory creation/permissions stay the caller's business.
|
|
11
|
+
*
|
|
12
|
+
* Internal to the session module; not exported from the package.
|
|
13
|
+
*/
|
|
14
|
+
import { randomBytes } from 'node:crypto';
|
|
15
|
+
import { chmodSync, closeSync, existsSync, fsyncSync, openSync, renameSync, unlinkSync, writeSync } from 'node:fs';
|
|
16
|
+
export function writeFileAtomicSync(filePath, data) {
|
|
17
|
+
const tmp = `${filePath}.tmp-${randomBytes(6).toString('hex')}`;
|
|
18
|
+
try {
|
|
19
|
+
const fd = openSync(tmp, 'wx', 0o600);
|
|
20
|
+
try {
|
|
21
|
+
writeSync(fd, data);
|
|
22
|
+
fsyncSync(fd);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
closeSync(fd);
|
|
26
|
+
}
|
|
27
|
+
// Tighten BEFORE the rename: fresh secrets never sit in a loose file.
|
|
28
|
+
chmodSync(tmp, 0o600);
|
|
29
|
+
renameSync(tmp, filePath);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
try {
|
|
33
|
+
if (existsSync(tmp))
|
|
34
|
+
unlinkSync(tmp);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
/* best-effort */
|
|
38
|
+
}
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=atomic-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/session/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEnH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAY;IAChE,MAAM,GAAG,GAAG,GAAG,QAAQ,QAAQ,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACpB,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,sEAAsE;QACtE,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,GAAG,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An advisory, cross-process lock file — the read-modify-write guard that
|
|
3
|
+
* several fleet servers hand-rolled around a shared state file.
|
|
4
|
+
*
|
|
5
|
+
* Why it exists: more than one process routinely shares a server's state file
|
|
6
|
+
* (Claude Desktop beside a Claude Code session; two children of one `mcp-host`
|
|
7
|
+
* registration on the same data dir). An atomic rename keeps the file from
|
|
8
|
+
* tearing, but it does nothing for a read-modify-write: two writers each read
|
|
9
|
+
* the old content and the second rename silently drops the first one's change.
|
|
10
|
+
* For a credential that rotates on use, "dropped" means an account lockout.
|
|
11
|
+
*
|
|
12
|
+
* The reference implementation is freshbooks-mcp's `withRefreshLock`
|
|
13
|
+
* (`src/auth.ts`, fleet-audit#1008): an exclusively-created lock file next to
|
|
14
|
+
* the state file holding `<pid>:<uuid>` (staged and hard-linked into place, so
|
|
15
|
+
* it never exists ownerless — mcp-utils#330); a lock whose holder is dead, or that has been
|
|
16
|
+
* held past `staleMs`, is broken rather than waited on forever; release is
|
|
17
|
+
* owner-checked so a lock broken as stale and re-taken by someone else is not
|
|
18
|
+
* removed out from under them. If the lock file cannot be created at all (an
|
|
19
|
+
* unwritable directory) the critical section runs UNLOCKED — the state write
|
|
20
|
+
* inside it fails the same way, and that failure is the one worth reporting.
|
|
21
|
+
*
|
|
22
|
+
* Advisory only: it coordinates processes that use it, nothing else.
|
|
23
|
+
*/
|
|
24
|
+
/** Options for {@link withFileLock} and {@link withFileLockSync}. */
|
|
25
|
+
export interface FileLockOptions {
|
|
26
|
+
/**
|
|
27
|
+
* How long a held lock may be before a waiter breaks it even though its holder
|
|
28
|
+
* is still alive. Defaults to 60 s for {@link withFileLock} (it is held across
|
|
29
|
+
* a network round-trip — freshbooks' refresh) and 5 s for
|
|
30
|
+
* {@link withFileLockSync} (held across one small file write, and a waiter
|
|
31
|
+
* blocks the event loop).
|
|
32
|
+
*/
|
|
33
|
+
staleMs?: number;
|
|
34
|
+
/** Delay between attempts while another holder has the lock. Default 25 ms. */
|
|
35
|
+
pollMs?: number;
|
|
36
|
+
/**
|
|
37
|
+
* {@link withFileLock} only: stop WAITING when this aborts, rejecting with its
|
|
38
|
+
* reason. A critical section already entered is not interrupted.
|
|
39
|
+
*/
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run `fn` holding the advisory lock at `lockPath` (conventionally
|
|
44
|
+
* `<stateFile>.lock`), waiting for any other holder first.
|
|
45
|
+
*
|
|
46
|
+
* Waits are polled (`pollMs`) and bounded: a dead holder is broken at once, a
|
|
47
|
+
* live one after `staleMs`. Pass `signal` to give up waiting early.
|
|
48
|
+
*/
|
|
49
|
+
export declare function withFileLock<T>(lockPath: string, fn: () => Promise<T>, opts?: FileLockOptions): Promise<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Synchronous form of {@link withFileLock}, for stores whose API is synchronous
|
|
52
|
+
* ({@link SessionStore}). A waiter BLOCKS the thread between polls, so keep the
|
|
53
|
+
* critical section to a file read and write — which is all it is meant for —
|
|
54
|
+
* and note the shorter default `staleMs` (5 s).
|
|
55
|
+
*/
|
|
56
|
+
export declare function withFileLockSync<T>(lockPath: string, fn: () => T, opts?: FileLockOptions): T;
|
|
57
|
+
//# sourceMappingURL=file-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.d.ts","sourceRoot":"","sources":["../../src/session/file-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAiBH,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA6GD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,CAAC,CAAC,CA6BZ;AAOD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,GAAE,eAAoB,GAAG,CAAC,CAmBhG"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An advisory, cross-process lock file — the read-modify-write guard that
|
|
3
|
+
* several fleet servers hand-rolled around a shared state file.
|
|
4
|
+
*
|
|
5
|
+
* Why it exists: more than one process routinely shares a server's state file
|
|
6
|
+
* (Claude Desktop beside a Claude Code session; two children of one `mcp-host`
|
|
7
|
+
* registration on the same data dir). An atomic rename keeps the file from
|
|
8
|
+
* tearing, but it does nothing for a read-modify-write: two writers each read
|
|
9
|
+
* the old content and the second rename silently drops the first one's change.
|
|
10
|
+
* For a credential that rotates on use, "dropped" means an account lockout.
|
|
11
|
+
*
|
|
12
|
+
* The reference implementation is freshbooks-mcp's `withRefreshLock`
|
|
13
|
+
* (`src/auth.ts`, fleet-audit#1008): an exclusively-created lock file next to
|
|
14
|
+
* the state file holding `<pid>:<uuid>` (staged and hard-linked into place, so
|
|
15
|
+
* it never exists ownerless — mcp-utils#330); a lock whose holder is dead, or that has been
|
|
16
|
+
* held past `staleMs`, is broken rather than waited on forever; release is
|
|
17
|
+
* owner-checked so a lock broken as stale and re-taken by someone else is not
|
|
18
|
+
* removed out from under them. If the lock file cannot be created at all (an
|
|
19
|
+
* unwritable directory) the critical section runs UNLOCKED — the state write
|
|
20
|
+
* inside it fails the same way, and that failure is the one worth reporting.
|
|
21
|
+
*
|
|
22
|
+
* Advisory only: it coordinates processes that use it, nothing else.
|
|
23
|
+
*/
|
|
24
|
+
import { randomUUID } from 'node:crypto';
|
|
25
|
+
import { closeSync, existsSync, linkSync, mkdirSync, openSync, readFileSync, statSync, unlinkSync, writeFileSync, writeSync, } from 'node:fs';
|
|
26
|
+
import { dirname } from 'node:path';
|
|
27
|
+
const DEFAULT_POLL_MS = 25;
|
|
28
|
+
/**
|
|
29
|
+
* Whether the process named in a lock file is still running.
|
|
30
|
+
*
|
|
31
|
+
* Content that names no pid — empty, or not yet written by a holder that
|
|
32
|
+
* created the file a moment ago — counts as ALIVE: it proves nothing about the
|
|
33
|
+
* holder, and reading it as dead let a second process break a held lock
|
|
34
|
+
* (mcp-utils#330). The `staleMs` age check still breaks it if it lingers.
|
|
35
|
+
*/
|
|
36
|
+
function holderAlive(lockPath) {
|
|
37
|
+
let pid;
|
|
38
|
+
try {
|
|
39
|
+
pid = Number.parseInt(readFileSync(lockPath, 'utf8'), 10);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return true; // unreadable now (released, or racing) — let the caller retry
|
|
43
|
+
}
|
|
44
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
45
|
+
return true;
|
|
46
|
+
try {
|
|
47
|
+
process.kill(pid, 0);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
// EPERM: the process exists but belongs to another user — still alive.
|
|
52
|
+
return err.code === 'EPERM';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create the lock file with its owner ALREADY in it: write a private staging
|
|
57
|
+
* file, then hard-link it to `lockPath`. `link` fails with EEXIST exactly like
|
|
58
|
+
* an `O_EXCL` create, but the file appears complete, so no reader ever sees an
|
|
59
|
+
* ownerless lock. On a filesystem without hard links, fall back to `O_EXCL`
|
|
60
|
+
* create + write (where the ownerless window is covered by `holderAlive`).
|
|
61
|
+
*/
|
|
62
|
+
function createLockFile(lockPath, owner) {
|
|
63
|
+
const staging = `${lockPath}.${randomUUID()}.tmp`;
|
|
64
|
+
let linked = false;
|
|
65
|
+
try {
|
|
66
|
+
writeFileSync(staging, owner, { mode: 0o600, flag: 'wx' });
|
|
67
|
+
linkSync(staging, lockPath);
|
|
68
|
+
linked = true;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const code = err.code;
|
|
72
|
+
if (code === 'EEXIST' && existsSync(staging))
|
|
73
|
+
throw err; // the lock is held
|
|
74
|
+
if (code !== 'EPERM' && code !== 'ENOTSUP' && code !== 'EOPNOTSUPP' && code !== 'ENOSYS' && code !== 'EXDEV') {
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
try {
|
|
80
|
+
unlinkSync(staging);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
/* never created */
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (linked)
|
|
87
|
+
return;
|
|
88
|
+
const fd = openSync(lockPath, 'wx', 0o600);
|
|
89
|
+
try {
|
|
90
|
+
writeSync(fd, owner);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
closeSync(fd);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** One acquisition attempt; breaks a dead or stale lock so the next attempt can win. */
|
|
97
|
+
function tryAcquire(lockPath, owner, staleMs) {
|
|
98
|
+
try {
|
|
99
|
+
createLockFile(lockPath, owner);
|
|
100
|
+
return 'acquired';
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (err.code !== 'EEXIST')
|
|
104
|
+
return 'unlockable';
|
|
105
|
+
}
|
|
106
|
+
let stale;
|
|
107
|
+
try {
|
|
108
|
+
stale = !holderAlive(lockPath) || Date.now() - statSync(lockPath).mtimeMs > staleMs;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return 'busy'; // released between our open and stat — retry
|
|
112
|
+
}
|
|
113
|
+
if (stale) {
|
|
114
|
+
try {
|
|
115
|
+
unlinkSync(lockPath);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
/* someone else broke it first */
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return 'busy';
|
|
122
|
+
}
|
|
123
|
+
/** Remove the lock only if it is still ours — it may have been broken and re-taken. */
|
|
124
|
+
function release(lockPath, owner) {
|
|
125
|
+
try {
|
|
126
|
+
if (readFileSync(lockPath, 'utf8') === owner)
|
|
127
|
+
unlinkSync(lockPath);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
/* already gone */
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function prepare(lockPath) {
|
|
134
|
+
try {
|
|
135
|
+
mkdirSync(dirname(lockPath), { recursive: true, mode: 0o700 });
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
/* fall through: openSync reports the real problem */
|
|
139
|
+
}
|
|
140
|
+
return `${process.pid}:${randomUUID()}`;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Run `fn` holding the advisory lock at `lockPath` (conventionally
|
|
144
|
+
* `<stateFile>.lock`), waiting for any other holder first.
|
|
145
|
+
*
|
|
146
|
+
* Waits are polled (`pollMs`) and bounded: a dead holder is broken at once, a
|
|
147
|
+
* live one after `staleMs`. Pass `signal` to give up waiting early.
|
|
148
|
+
*/
|
|
149
|
+
export async function withFileLock(lockPath, fn, opts = {}) {
|
|
150
|
+
const staleMs = opts.staleMs ?? 60_000;
|
|
151
|
+
const pollMs = opts.pollMs ?? DEFAULT_POLL_MS;
|
|
152
|
+
const { signal } = opts;
|
|
153
|
+
const owner = prepare(lockPath);
|
|
154
|
+
let held = false;
|
|
155
|
+
for (;;) {
|
|
156
|
+
signal?.throwIfAborted();
|
|
157
|
+
const r = tryAcquire(lockPath, owner, staleMs);
|
|
158
|
+
if (r === 'acquired') {
|
|
159
|
+
held = true;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
if (r === 'unlockable')
|
|
163
|
+
break; // run unlocked: the write will report the real failure
|
|
164
|
+
await new Promise((resolve) => {
|
|
165
|
+
const done = () => {
|
|
166
|
+
clearTimeout(timer);
|
|
167
|
+
signal?.removeEventListener('abort', done);
|
|
168
|
+
resolve();
|
|
169
|
+
};
|
|
170
|
+
const timer = setTimeout(done, pollMs);
|
|
171
|
+
signal?.addEventListener('abort', done, { once: true });
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
return await fn();
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
if (held)
|
|
179
|
+
release(lockPath, owner);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** Block the thread for `ms` without spinning the CPU. */
|
|
183
|
+
function sleepSync(ms) {
|
|
184
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Synchronous form of {@link withFileLock}, for stores whose API is synchronous
|
|
188
|
+
* ({@link SessionStore}). A waiter BLOCKS the thread between polls, so keep the
|
|
189
|
+
* critical section to a file read and write — which is all it is meant for —
|
|
190
|
+
* and note the shorter default `staleMs` (5 s).
|
|
191
|
+
*/
|
|
192
|
+
export function withFileLockSync(lockPath, fn, opts = {}) {
|
|
193
|
+
const staleMs = opts.staleMs ?? 5_000;
|
|
194
|
+
const pollMs = opts.pollMs ?? DEFAULT_POLL_MS;
|
|
195
|
+
const owner = prepare(lockPath);
|
|
196
|
+
let held = false;
|
|
197
|
+
for (;;) {
|
|
198
|
+
const r = tryAcquire(lockPath, owner, staleMs);
|
|
199
|
+
if (r === 'acquired') {
|
|
200
|
+
held = true;
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
if (r === 'unlockable')
|
|
204
|
+
break;
|
|
205
|
+
sleepSync(pollMs);
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
return fn();
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
if (held)
|
|
212
|
+
release(lockPath, owner);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=file-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../../src/session/file-lock.ts"],"names":[],"mappings":"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"}
|