@minicor/mcp-server 3.6.0 → 3.9.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 +66 -1
- package/dist/__tests__/builder-discovery.test.d.ts +2 -0
- package/dist/__tests__/builder-discovery.test.d.ts.map +1 -0
- package/dist/__tests__/builder-discovery.test.js +120 -0
- package/dist/__tests__/builder-discovery.test.js.map +1 -0
- package/dist/__tests__/codemode.test.js +35 -0
- package/dist/__tests__/codemode.test.js.map +1 -1
- package/dist/__tests__/config-stores.test.d.ts +2 -0
- package/dist/__tests__/config-stores.test.d.ts.map +1 -0
- package/dist/__tests__/config-stores.test.js +88 -0
- package/dist/__tests__/config-stores.test.js.map +1 -0
- package/dist/__tests__/dev-mode-draft.test.d.ts +2 -0
- package/dist/__tests__/dev-mode-draft.test.d.ts.map +1 -0
- package/dist/__tests__/dev-mode-draft.test.js +260 -0
- package/dist/__tests__/dev-mode-draft.test.js.map +1 -0
- package/dist/__tests__/disk-token-store.test.d.ts +2 -0
- package/dist/__tests__/disk-token-store.test.d.ts.map +1 -0
- package/dist/__tests__/disk-token-store.test.js +231 -0
- package/dist/__tests__/disk-token-store.test.js.map +1 -0
- package/dist/__tests__/laminar-client.test.js +154 -0
- package/dist/__tests__/laminar-client.test.js.map +1 -1
- package/dist/__tests__/lib-dev-mode.test.d.ts +2 -0
- package/dist/__tests__/lib-dev-mode.test.d.ts.map +1 -0
- package/dist/__tests__/lib-dev-mode.test.js +48 -0
- package/dist/__tests__/lib-dev-mode.test.js.map +1 -0
- package/dist/__tests__/paths.test.d.ts +2 -0
- package/dist/__tests__/paths.test.d.ts.map +1 -0
- package/dist/__tests__/paths.test.js +55 -0
- package/dist/__tests__/paths.test.js.map +1 -0
- package/dist/__tests__/recording-frames.test.d.ts +2 -0
- package/dist/__tests__/recording-frames.test.d.ts.map +1 -0
- package/dist/__tests__/recording-frames.test.js +46 -0
- package/dist/__tests__/recording-frames.test.js.map +1 -0
- package/dist/__tests__/server-profile.test.d.ts +2 -0
- package/dist/__tests__/server-profile.test.d.ts.map +1 -0
- package/dist/__tests__/server-profile.test.js +311 -0
- package/dist/__tests__/server-profile.test.js.map +1 -0
- package/dist/builder-index.d.ts +3 -0
- package/dist/builder-index.d.ts.map +1 -0
- package/dist/builder-index.js +5 -0
- package/dist/builder-index.js.map +1 -0
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/codemode.d.ts +3 -1
- package/dist/codemode.d.ts.map +1 -1
- package/dist/codemode.js +20 -6
- package/dist/codemode.js.map +1 -1
- package/dist/disk-token-store.d.ts +101 -0
- package/dist/disk-token-store.d.ts.map +1 -0
- package/dist/disk-token-store.js +398 -0
- package/dist/disk-token-store.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -111
- package/dist/index.js.map +1 -1
- package/dist/laminar-client.d.ts +111 -0
- package/dist/laminar-client.d.ts.map +1 -1
- package/dist/laminar-client.js +47 -1
- package/dist/laminar-client.js.map +1 -1
- package/dist/lib.d.ts +4 -0
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +53 -58
- package/dist/lib.js.map +1 -1
- package/dist/paths.d.ts +4 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +33 -0
- package/dist/paths.js.map +1 -1
- package/dist/prompts/debug-execution.d.ts.map +1 -1
- package/dist/prompts/debug-execution.js +3 -2
- package/dist/prompts/debug-execution.js.map +1 -1
- package/dist/recording-frames.d.ts +58 -0
- package/dist/recording-frames.d.ts.map +1 -0
- package/dist/recording-frames.js +244 -0
- package/dist/recording-frames.js.map +1 -0
- package/dist/seed-skills.js +3 -2
- package/dist/seed-skills.js.map +1 -1
- package/dist/server-profile.d.ts +11 -0
- package/dist/server-profile.d.ts.map +1 -0
- package/dist/server-profile.js +104 -0
- package/dist/server-profile.js.map +1 -0
- package/dist/setup.d.ts +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +81 -71
- package/dist/setup.js.map +1 -1
- package/dist/tools/builder-discovery.d.ts +17 -0
- package/dist/tools/builder-discovery.d.ts.map +1 -0
- package/dist/tools/builder-discovery.js +131 -0
- package/dist/tools/builder-discovery.js.map +1 -0
- package/dist/tools/core.d.ts.map +1 -1
- package/dist/tools/core.js +117 -43
- package/dist/tools/core.js.map +1 -1
- package/dist/tools/dev-mode-draft.d.ts +3 -0
- package/dist/tools/dev-mode-draft.d.ts.map +1 -0
- package/dist/tools/dev-mode-draft.js +279 -0
- package/dist/tools/dev-mode-draft.js.map +1 -0
- package/dist/tools/vm.d.ts.map +1 -1
- package/dist/tools/vm.js +3 -35
- package/dist/tools/vm.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process-safe storage for the OAuth credentials used by the MCP.
|
|
3
|
+
*
|
|
4
|
+
* Reads stay synchronous because they are used while constructing clients.
|
|
5
|
+
* Mutations are asynchronous and serialized with an exclusive lock file so
|
|
6
|
+
* multiple MCP processes cannot lose one another's updates or rotate the same
|
|
7
|
+
* refresh token at the same time.
|
|
8
|
+
*/
|
|
9
|
+
import { type Region } from "./paths.js";
|
|
10
|
+
export interface RegionTokens {
|
|
11
|
+
access_token: string;
|
|
12
|
+
refresh_token: string | null;
|
|
13
|
+
expires_at: number;
|
|
14
|
+
api_base?: string;
|
|
15
|
+
region?: Region;
|
|
16
|
+
}
|
|
17
|
+
/** On-disk format used by current multi-region installations. */
|
|
18
|
+
export type MultiRegionTokens = Partial<Record<Region, RegionTokens>>;
|
|
19
|
+
export interface RefreshedRegionTokens {
|
|
20
|
+
access_token: string;
|
|
21
|
+
expires_at: number;
|
|
22
|
+
/** Omit this when the server did not rotate the refresh token. */
|
|
23
|
+
refresh_token?: string | null;
|
|
24
|
+
api_base?: string;
|
|
25
|
+
region?: Region;
|
|
26
|
+
}
|
|
27
|
+
export interface RefreshTokenContext {
|
|
28
|
+
region: Region;
|
|
29
|
+
/** The most recent credentials read after taking the disk lock. */
|
|
30
|
+
tokens: Readonly<RegionTokens>;
|
|
31
|
+
refreshToken: string;
|
|
32
|
+
}
|
|
33
|
+
export type RefreshTokenCallback = (context: RefreshTokenContext) => Promise<RefreshedRegionTokens | null>;
|
|
34
|
+
export interface RefreshRegionResult {
|
|
35
|
+
tokens: RegionTokens;
|
|
36
|
+
/** `adopted` means another process already completed the refresh. */
|
|
37
|
+
source: "adopted" | "refreshed";
|
|
38
|
+
}
|
|
39
|
+
type PathOption = string | (() => string);
|
|
40
|
+
export interface DiskTokenStoreOptions {
|
|
41
|
+
/** Defaults to getTokenPath(), including its ~/.laminar fallback. */
|
|
42
|
+
readPath?: PathOption;
|
|
43
|
+
/** Defaults to getWriteTokenPath() under ~/.minicor. */
|
|
44
|
+
writePath?: PathOption;
|
|
45
|
+
/** A refreshed token must be valid beyond this buffer to be adopted. */
|
|
46
|
+
refreshBufferMs?: number;
|
|
47
|
+
lockRetryMs?: number;
|
|
48
|
+
lockTimeoutMs?: number;
|
|
49
|
+
staleLockMs?: number;
|
|
50
|
+
/** Injectable for deterministic expiry and lock tests. */
|
|
51
|
+
now?: () => number;
|
|
52
|
+
}
|
|
53
|
+
/** Normalize the legacy flat shape while preserving the current shape as-is. */
|
|
54
|
+
export declare function normalizeStoredTokens(raw: unknown): MultiRegionTokens;
|
|
55
|
+
export declare class DiskTokenStore {
|
|
56
|
+
private readonly readPathOption;
|
|
57
|
+
private readonly writePathOption;
|
|
58
|
+
private readonly refreshBufferMs;
|
|
59
|
+
private readonly lockRetryMs;
|
|
60
|
+
private readonly lockTimeoutMs;
|
|
61
|
+
private readonly staleLockMs;
|
|
62
|
+
private readonly now;
|
|
63
|
+
constructor(options?: DiskTokenStoreOptions);
|
|
64
|
+
/**
|
|
65
|
+
* Read all stored regions synchronously. Once the write destination exists,
|
|
66
|
+
* it takes precedence over an injected or legacy fallback read path.
|
|
67
|
+
*/
|
|
68
|
+
readAll(): MultiRegionTokens;
|
|
69
|
+
readRegion(region: Region): RegionTokens | null;
|
|
70
|
+
/** Replace one region while preserving every other stored region. */
|
|
71
|
+
writeRegion(region: Region, tokens: RegionTokens): Promise<void>;
|
|
72
|
+
/** Remove current and legacy token files without racing a refresh/write. */
|
|
73
|
+
clear(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Atomically update a region from the latest value on disk. This is useful
|
|
76
|
+
* for metadata changes (for example api_base) that must not overwrite a
|
|
77
|
+
* token concurrently refreshed by another process.
|
|
78
|
+
*/
|
|
79
|
+
updateRegion(region: Region, update: (current: Readonly<RegionTokens> | null) => RegionTokens | null): Promise<RegionTokens | null>;
|
|
80
|
+
/**
|
|
81
|
+
* Refresh a region without rotating the same refresh token in two MCPs.
|
|
82
|
+
*
|
|
83
|
+
* The caller supplies the access token it observed before requesting the
|
|
84
|
+
* refresh. After acquiring the cross-process lock, this method re-reads the
|
|
85
|
+
* file. If another process wrote a different, sufficiently valid access
|
|
86
|
+
* token, that token is adopted. Otherwise the callback runs under the lock
|
|
87
|
+
* with the latest refresh token and its result is merged and atomically
|
|
88
|
+
* persisted.
|
|
89
|
+
*/
|
|
90
|
+
refreshRegion(region: Region, observedAccessToken: string, refresh: RefreshTokenCallback): Promise<RefreshRegionResult | null>;
|
|
91
|
+
private activeReadPath;
|
|
92
|
+
private isValidBeyondRefreshBuffer;
|
|
93
|
+
private withLock;
|
|
94
|
+
private acquireLock;
|
|
95
|
+
private removeStaleLock;
|
|
96
|
+
private removeAbandonedCleanupGuard;
|
|
97
|
+
private releaseLock;
|
|
98
|
+
private atomicWrite;
|
|
99
|
+
}
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=disk-token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk-token-store.d.ts","sourceRoot":"","sources":["../src/disk-token-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process-safe storage for the OAuth credentials used by the MCP.
|
|
3
|
+
*
|
|
4
|
+
* Reads stay synchronous because they are used while constructing clients.
|
|
5
|
+
* Mutations are asynchronous and serialized with an exclusive lock file so
|
|
6
|
+
* multiple MCP processes cannot lose one another's updates or rotate the same
|
|
7
|
+
* refresh token at the same time.
|
|
8
|
+
*/
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { apiBaseToRegion, getTokenPath, getWriteTokenPath, } from "./paths.js";
|
|
13
|
+
// A different token only needs to be unexpired to prove another process won
|
|
14
|
+
// the refresh race. Callers that require additional usable lifetime can opt
|
|
15
|
+
// into a buffer matching their normal proactive-refresh policy.
|
|
16
|
+
const DEFAULT_REFRESH_BUFFER_MS = 0;
|
|
17
|
+
const DEFAULT_LOCK_RETRY_MS = 25;
|
|
18
|
+
const DEFAULT_LOCK_TIMEOUT_MS = 60_000;
|
|
19
|
+
const DEFAULT_STALE_LOCK_MS = 30_000;
|
|
20
|
+
function resolvePath(option) {
|
|
21
|
+
return typeof option === "function" ? option() : option;
|
|
22
|
+
}
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
/** Normalize the legacy flat shape while preserving the current shape as-is. */
|
|
27
|
+
export function normalizeStoredTokens(raw) {
|
|
28
|
+
if (!isRecord(raw))
|
|
29
|
+
return {};
|
|
30
|
+
if (raw.us || raw.ca)
|
|
31
|
+
return raw;
|
|
32
|
+
if (raw.access_token) {
|
|
33
|
+
const storedRegion = raw.region;
|
|
34
|
+
const region = storedRegion === "us" || storedRegion === "ca"
|
|
35
|
+
? storedRegion
|
|
36
|
+
: apiBaseToRegion(typeof raw.api_base === "string" ? raw.api_base : "");
|
|
37
|
+
return { [region]: raw };
|
|
38
|
+
}
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
function processIsAlive(pid) {
|
|
42
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
43
|
+
return false;
|
|
44
|
+
try {
|
|
45
|
+
process.kill(pid, 0);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return error.code !== "ESRCH";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function delay(ms) {
|
|
53
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
54
|
+
}
|
|
55
|
+
export class DiskTokenStore {
|
|
56
|
+
readPathOption;
|
|
57
|
+
writePathOption;
|
|
58
|
+
refreshBufferMs;
|
|
59
|
+
lockRetryMs;
|
|
60
|
+
lockTimeoutMs;
|
|
61
|
+
staleLockMs;
|
|
62
|
+
now;
|
|
63
|
+
constructor(options = {}) {
|
|
64
|
+
this.readPathOption = options.readPath ?? getTokenPath;
|
|
65
|
+
this.writePathOption = options.writePath ?? getWriteTokenPath;
|
|
66
|
+
this.refreshBufferMs =
|
|
67
|
+
options.refreshBufferMs ?? DEFAULT_REFRESH_BUFFER_MS;
|
|
68
|
+
this.lockRetryMs = options.lockRetryMs ?? DEFAULT_LOCK_RETRY_MS;
|
|
69
|
+
this.lockTimeoutMs = options.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
|
|
70
|
+
this.staleLockMs = options.staleLockMs ?? DEFAULT_STALE_LOCK_MS;
|
|
71
|
+
this.now = options.now ?? Date.now;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Read all stored regions synchronously. Once the write destination exists,
|
|
75
|
+
* it takes precedence over an injected or legacy fallback read path.
|
|
76
|
+
*/
|
|
77
|
+
readAll() {
|
|
78
|
+
try {
|
|
79
|
+
const tokenPath = this.activeReadPath();
|
|
80
|
+
if (!fs.existsSync(tokenPath))
|
|
81
|
+
return {};
|
|
82
|
+
return normalizeStoredTokens(JSON.parse(fs.readFileSync(tokenPath, "utf8")));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return {};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
readRegion(region) {
|
|
89
|
+
return this.readAll()[region] ?? null;
|
|
90
|
+
}
|
|
91
|
+
/** Replace one region while preserving every other stored region. */
|
|
92
|
+
async writeRegion(region, tokens) {
|
|
93
|
+
await this.withLock(async () => {
|
|
94
|
+
const all = this.readAll();
|
|
95
|
+
all[region] = tokens;
|
|
96
|
+
this.atomicWrite(all);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** Remove current and legacy token files without racing a refresh/write. */
|
|
100
|
+
async clear() {
|
|
101
|
+
await this.withLock(async () => {
|
|
102
|
+
const remove = (tokenPath) => {
|
|
103
|
+
try {
|
|
104
|
+
fs.unlinkSync(tokenPath);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (error.code !== "ENOENT")
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const writePath = resolvePath(this.writePathOption);
|
|
112
|
+
const readPathBeforeClear = resolvePath(this.readPathOption);
|
|
113
|
+
remove(writePath);
|
|
114
|
+
if (readPathBeforeClear !== writePath)
|
|
115
|
+
remove(readPathBeforeClear);
|
|
116
|
+
// A fallback resolver such as getTokenPath() may reveal the legacy file
|
|
117
|
+
// only after the current ~/.minicor file has been removed.
|
|
118
|
+
const readPathAfterClear = resolvePath(this.readPathOption);
|
|
119
|
+
if (readPathAfterClear !== writePath &&
|
|
120
|
+
readPathAfterClear !== readPathBeforeClear) {
|
|
121
|
+
remove(readPathAfterClear);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Atomically update a region from the latest value on disk. This is useful
|
|
127
|
+
* for metadata changes (for example api_base) that must not overwrite a
|
|
128
|
+
* token concurrently refreshed by another process.
|
|
129
|
+
*/
|
|
130
|
+
async updateRegion(region, update) {
|
|
131
|
+
return this.withLock(async () => {
|
|
132
|
+
const all = this.readAll();
|
|
133
|
+
const next = update(all[region] ?? null);
|
|
134
|
+
if (next === null)
|
|
135
|
+
return null;
|
|
136
|
+
all[region] = next;
|
|
137
|
+
this.atomicWrite(all);
|
|
138
|
+
return next;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Refresh a region without rotating the same refresh token in two MCPs.
|
|
143
|
+
*
|
|
144
|
+
* The caller supplies the access token it observed before requesting the
|
|
145
|
+
* refresh. After acquiring the cross-process lock, this method re-reads the
|
|
146
|
+
* file. If another process wrote a different, sufficiently valid access
|
|
147
|
+
* token, that token is adopted. Otherwise the callback runs under the lock
|
|
148
|
+
* with the latest refresh token and its result is merged and atomically
|
|
149
|
+
* persisted.
|
|
150
|
+
*/
|
|
151
|
+
async refreshRegion(region, observedAccessToken, refresh) {
|
|
152
|
+
return this.withLock(async () => {
|
|
153
|
+
const all = this.readAll();
|
|
154
|
+
const latest = all[region];
|
|
155
|
+
if (!latest)
|
|
156
|
+
return null;
|
|
157
|
+
const anotherProcessRefreshed = latest.access_token !== observedAccessToken &&
|
|
158
|
+
this.isValidBeyondRefreshBuffer(latest);
|
|
159
|
+
if (anotherProcessRefreshed) {
|
|
160
|
+
return { tokens: latest, source: "adopted" };
|
|
161
|
+
}
|
|
162
|
+
if (!latest.refresh_token)
|
|
163
|
+
return null;
|
|
164
|
+
const refreshed = await refresh({
|
|
165
|
+
region,
|
|
166
|
+
tokens: { ...latest },
|
|
167
|
+
refreshToken: latest.refresh_token,
|
|
168
|
+
});
|
|
169
|
+
if (!refreshed)
|
|
170
|
+
return null;
|
|
171
|
+
const merged = {
|
|
172
|
+
...latest,
|
|
173
|
+
...refreshed,
|
|
174
|
+
refresh_token: refreshed.refresh_token === undefined
|
|
175
|
+
? latest.refresh_token
|
|
176
|
+
: refreshed.refresh_token,
|
|
177
|
+
region,
|
|
178
|
+
};
|
|
179
|
+
all[region] = merged;
|
|
180
|
+
this.atomicWrite(all);
|
|
181
|
+
return { tokens: merged, source: "refreshed" };
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
activeReadPath() {
|
|
185
|
+
const writePath = resolvePath(this.writePathOption);
|
|
186
|
+
return fs.existsSync(writePath)
|
|
187
|
+
? writePath
|
|
188
|
+
: resolvePath(this.readPathOption);
|
|
189
|
+
}
|
|
190
|
+
isValidBeyondRefreshBuffer(tokens) {
|
|
191
|
+
return (typeof tokens.access_token === "string" &&
|
|
192
|
+
tokens.access_token.length > 0 &&
|
|
193
|
+
Number.isFinite(tokens.expires_at) &&
|
|
194
|
+
this.now() < tokens.expires_at - this.refreshBufferMs);
|
|
195
|
+
}
|
|
196
|
+
async withLock(operation) {
|
|
197
|
+
const lock = await this.acquireLock();
|
|
198
|
+
try {
|
|
199
|
+
return await operation();
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
await this.releaseLock(lock);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async acquireLock() {
|
|
206
|
+
const writePath = resolvePath(this.writePathOption);
|
|
207
|
+
const directory = path.dirname(writePath);
|
|
208
|
+
fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
209
|
+
const lockPath = `${writePath}.lock`;
|
|
210
|
+
const owner = `${process.pid}:${randomUUID()}`;
|
|
211
|
+
// Lock timing deliberately uses wall-clock time rather than the injectable
|
|
212
|
+
// token clock. A frozen clock is useful in expiry tests but must not stop
|
|
213
|
+
// lock timeouts or make a newly-created lock appear stale.
|
|
214
|
+
const deadline = Date.now() + this.lockTimeoutMs;
|
|
215
|
+
while (true) {
|
|
216
|
+
try {
|
|
217
|
+
const handle = await fs.promises.open(lockPath, "wx", 0o600);
|
|
218
|
+
try {
|
|
219
|
+
await handle.writeFile(JSON.stringify({ owner, pid: process.pid, createdAt: Date.now() }), "utf8");
|
|
220
|
+
await handle.sync();
|
|
221
|
+
return { handle, lockPath, owner };
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
await handle.close().catch(() => undefined);
|
|
225
|
+
await fs.promises.unlink(lockPath).catch(() => undefined);
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
if (error.code !== "EEXIST")
|
|
231
|
+
throw error;
|
|
232
|
+
if (this.removeStaleLock(lockPath))
|
|
233
|
+
continue;
|
|
234
|
+
if (Date.now() >= deadline) {
|
|
235
|
+
throw new Error(`Timed out waiting for token-store lock: ${lockPath}`);
|
|
236
|
+
}
|
|
237
|
+
await delay(this.lockRetryMs);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
removeStaleLock(lockPath) {
|
|
242
|
+
const cleanupPath = `${lockPath}.cleanup`;
|
|
243
|
+
const cleanupOwner = `${process.pid}:${randomUUID()}`;
|
|
244
|
+
let cleanupDescriptor;
|
|
245
|
+
try {
|
|
246
|
+
cleanupDescriptor = fs.openSync(cleanupPath, "wx", 0o600);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
if (error.code === "EEXIST") {
|
|
250
|
+
this.removeAbandonedCleanupGuard(cleanupPath);
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
fs.writeFileSync(cleanupDescriptor, JSON.stringify({
|
|
257
|
+
owner: cleanupOwner,
|
|
258
|
+
pid: process.pid,
|
|
259
|
+
createdAt: Date.now(),
|
|
260
|
+
}), "utf8");
|
|
261
|
+
fs.fsyncSync(cleanupDescriptor);
|
|
262
|
+
try {
|
|
263
|
+
const stat = fs.statSync(lockPath);
|
|
264
|
+
if (Date.now() - stat.mtimeMs < this.staleLockMs)
|
|
265
|
+
return false;
|
|
266
|
+
let pid = 0;
|
|
267
|
+
try {
|
|
268
|
+
const metadata = JSON.parse(fs.readFileSync(lockPath, "utf8"));
|
|
269
|
+
if (typeof metadata.pid === "number")
|
|
270
|
+
pid = metadata.pid;
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// An old malformed lock can be removed after the stale threshold.
|
|
274
|
+
}
|
|
275
|
+
if (processIsAlive(pid))
|
|
276
|
+
return false;
|
|
277
|
+
fs.unlinkSync(lockPath);
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
return error.code === "ENOENT";
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
fs.closeSync(cleanupDescriptor);
|
|
286
|
+
try {
|
|
287
|
+
fs.unlinkSync(cleanupPath);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
if (error.code !== "ENOENT")
|
|
291
|
+
throw error;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
removeAbandonedCleanupGuard(cleanupPath) {
|
|
296
|
+
let descriptor;
|
|
297
|
+
try {
|
|
298
|
+
descriptor = fs.openSync(cleanupPath, "r");
|
|
299
|
+
const openedStat = fs.fstatSync(descriptor);
|
|
300
|
+
if (Date.now() - openedStat.mtimeMs < this.staleLockMs)
|
|
301
|
+
return false;
|
|
302
|
+
let pid = 0;
|
|
303
|
+
let owner;
|
|
304
|
+
try {
|
|
305
|
+
const metadata = JSON.parse(fs.readFileSync(descriptor, "utf8"));
|
|
306
|
+
if (typeof metadata.owner === "string")
|
|
307
|
+
owner = metadata.owner;
|
|
308
|
+
if (typeof metadata.pid === "number")
|
|
309
|
+
pid = metadata.pid;
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// A malformed cleanup guard is recoverable after the stale threshold.
|
|
313
|
+
}
|
|
314
|
+
if (processIsAlive(pid))
|
|
315
|
+
return false;
|
|
316
|
+
// Do not remove a guard that was replaced while the abandoned one was
|
|
317
|
+
// being inspected.
|
|
318
|
+
const currentStat = fs.statSync(cleanupPath);
|
|
319
|
+
if (currentStat.dev !== openedStat.dev ||
|
|
320
|
+
currentStat.ino !== openedStat.ino) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
if (owner) {
|
|
324
|
+
try {
|
|
325
|
+
const currentMetadata = JSON.parse(fs.readFileSync(cleanupPath, "utf8"));
|
|
326
|
+
if (currentMetadata.owner !== owner)
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
fs.unlinkSync(cleanupPath);
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
return error.code === "ENOENT";
|
|
338
|
+
}
|
|
339
|
+
finally {
|
|
340
|
+
if (descriptor !== undefined)
|
|
341
|
+
fs.closeSync(descriptor);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async releaseLock(lock) {
|
|
345
|
+
await lock.handle.close();
|
|
346
|
+
try {
|
|
347
|
+
const metadata = JSON.parse(await fs.promises.readFile(lock.lockPath, "utf8"));
|
|
348
|
+
if (metadata.owner === lock.owner) {
|
|
349
|
+
await fs.promises.unlink(lock.lockPath);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
if (error.code !== "ENOENT")
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
atomicWrite(tokens) {
|
|
358
|
+
const writePath = resolvePath(this.writePathOption);
|
|
359
|
+
const directory = path.dirname(writePath);
|
|
360
|
+
fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
361
|
+
const temporaryPath = `${writePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
362
|
+
let descriptor;
|
|
363
|
+
try {
|
|
364
|
+
descriptor = fs.openSync(temporaryPath, "wx", 0o600);
|
|
365
|
+
fs.writeFileSync(descriptor, `${JSON.stringify(tokens, null, 2)}\n`, "utf8");
|
|
366
|
+
fs.fsyncSync(descriptor);
|
|
367
|
+
fs.closeSync(descriptor);
|
|
368
|
+
descriptor = undefined;
|
|
369
|
+
fs.renameSync(temporaryPath, writePath);
|
|
370
|
+
// Best-effort directory sync makes the rename durable on filesystems
|
|
371
|
+
// that support opening directories. Atomicity itself comes from rename.
|
|
372
|
+
try {
|
|
373
|
+
const directoryDescriptor = fs.openSync(directory, "r");
|
|
374
|
+
try {
|
|
375
|
+
fs.fsyncSync(directoryDescriptor);
|
|
376
|
+
}
|
|
377
|
+
finally {
|
|
378
|
+
fs.closeSync(directoryDescriptor);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
// Some platforms do not allow fsync on directory descriptors.
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
if (descriptor !== undefined)
|
|
387
|
+
fs.closeSync(descriptor);
|
|
388
|
+
try {
|
|
389
|
+
fs.unlinkSync(temporaryPath);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
if (error.code !== "ENOENT")
|
|
393
|
+
throw error;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=disk-token-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk-token-store.js","sourceRoot":"","sources":["../src/disk-token-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAKH,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AA2CpB,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOlD"}
|