@bluelamp/cli-token 1.0.3 → 1.2.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 +25 -0
- package/dist/cjs/index.js +338 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.ts +136 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +324 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,6 +27,31 @@ const maybe = tryReadCliToken();
|
|
|
27
27
|
|---|---|
|
|
28
28
|
| core(I/O なし) | `encryptPayload` / `decryptPayload` / `extractToken` / `validateTokenFormat` |
|
|
29
29
|
| shell(I/O あり) | `getTokenFilePath` / `readCliTokenSync` / `tryReadCliToken` / `loadPortalToken` / `savePortalToken` / `deletePortalToken` |
|
|
30
|
+
| 艦隊の資格の門(1.1.0・n=2607) | `checkFleetGate` / `isAllowedForScope` / `getFleetEntitlementFilePath` / `getFleetGateLogPath` / `formatFleetGateLogLine` / `fleetGateRefusalMessage` / `parseFleetEntitlementCache` / `isFleetEntitlementFresh` |
|
|
31
|
+
| 交換済み JWT の機体共有キャッシュ(1.2.0・n=2774) | `getExchangedJwt` / `evictExchangedJwt` / `exchangedJwtCacheKey` / `getExchangedJwtCacheDir` / `parseCachedExchangedJwt` / `isCachedExchangedJwtUsable` |
|
|
32
|
+
|
|
33
|
+
### 艦隊の資格の門(`checkFleetGate`)
|
|
34
|
+
|
|
35
|
+
席を立てる手元の起点(orchestrator の spawn・scheduler/routine の発火)が通る**唯一の判定**。
|
|
36
|
+
口は `GET {BLUELAMP_PORTAL_API_BASE_URL}/cli/fleet-entitlement`(`X-CLI-Token`)、答えは `~/.bluelamp/fleet-entitlement.json` に 24 時間キャッシュ。
|
|
37
|
+
|
|
38
|
+
- 新しいキャッシュが在れば網に出ない。古い/無ければ 1 回だけ聞く(5 秒で打ち切り)
|
|
39
|
+
- 書くのは `active`/`cancelled` だけ。網の不調・5xx・401・404・`unknown` は前回の答え、前回も無ければ通す(fail-open)
|
|
40
|
+
- 止める(`allowed: false`)のは `cancelled` だけ。返り `{allowed, status, reason, from: "cache"|"network"|"stale"|"none"}`
|
|
41
|
+
- 網に出た回(from が cache 以外)だけ `~/.bluelamp/fleet-gate.log` に 1 行追記(`{ts, caller, from, status, reason}`・トークンと URL は載せない・1MB を超えたら新しい側の半分に詰める)。`caller` は `orchestrator`/`scheduler`/`routine`/`server`
|
|
42
|
+
- `scope`(既定 `"fleet"`): `fleet`=cancelled なら止める(orchestrator・scheduler)。`member`=cancelled でも理由が `no_seat`・`rank_below_min` なら止めない(routine=初伝にも配る。席が丸ごと落ちた・退会・期限切れの時だけ止める)。キャッシュと口は 1 つのまま
|
|
43
|
+
- throw しない。止めた時の文面は `fleetGateRefusalMessage(reason)`(固定)
|
|
44
|
+
|
|
45
|
+
### 交換済み JWT の機体共有キャッシュ(`getExchangedJwt`)
|
|
46
|
+
|
|
47
|
+
艦隊の手足(monster-orchestrator・scheduler・routine)が `POST {bluelamp}/auth/exchange` で取る 10 分の JWT を、**期限まで機体で共有**する。
|
|
48
|
+
以前はプロセスのメモリにだけ持っていたので、発火のたびに立つ fire.js は毎回 exchange し、毎時 :00 に揃っていた(2026-10-09 実測 636 件・p50 6.3 秒)。
|
|
49
|
+
|
|
50
|
+
- 置き場 `~/.bluelamp/jwt-cache/<鍵>.json`(ファイル 600・ディレクトリ 700。`BLUELAMP_JWT_CACHE_DIR` で差し替え=消費側のテスト用)。自分だけが読めるファイルしか信じない
|
|
51
|
+
- 鍵は「口・mcp_id・scope の組・CLI トークンの指紋」の sha256。JWT は `bl:mcp_id` を持つので MCP をまたいで共有しない。CLI トークンはファイルに書かない
|
|
52
|
+
- 取り直すのは期限の 60 秒前から。同時に切れた N プロセスは `<鍵>.json.lock`(`O_EXCL`)を取った 1 本だけが撃ち、他はファイルを待つ(既定 5 秒・過ぎたら自分で撃つ)。30 秒より古いロックは持ち主が死んだと読んで払う
|
|
53
|
+
- 受け手が 401 を返したら `evictExchangedJwt(key, 拒まれた JWT)` → もう一度 `getExchangedJwt`(中身が同じ JWT のときだけ消す)
|
|
54
|
+
- キャッシュの不調(読めない・書けない・ロックが取れない)は exchange に倒す。exchange の失敗だけは throw のまま返す
|
|
30
55
|
|
|
31
56
|
## 制約
|
|
32
57
|
|
package/dist/cjs/index.js
CHANGED
|
@@ -46,7 +46,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
46
46
|
};
|
|
47
47
|
})();
|
|
48
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
-
exports.CliTokenNotFoundError = void 0;
|
|
49
|
+
exports.EXCHANGED_JWT_LOCK_STALE_MS = exports.EXCHANGED_JWT_LOCK_WAIT_MS = exports.EXCHANGED_JWT_REFRESH_BUFFER_MS = exports.FLEET_GATE_LOG_MAX_BYTES = exports.FLEET_ENTITLEMENT_MAX_TTL_SEC = exports.MEMBER_SCOPE_ALLOWED_REASONS = exports.CliTokenNotFoundError = void 0;
|
|
50
50
|
exports.getTokenFilePath = getTokenFilePath;
|
|
51
51
|
exports.getPinnedTenantFilePath = getPinnedTenantFilePath;
|
|
52
52
|
exports.encryptPayload = encryptPayload;
|
|
@@ -59,6 +59,20 @@ exports.loadPortalToken = loadPortalToken;
|
|
|
59
59
|
exports.savePortalToken = savePortalToken;
|
|
60
60
|
exports.deletePortalToken = deletePortalToken;
|
|
61
61
|
exports.readPinnedTenantDeclaration = readPinnedTenantDeclaration;
|
|
62
|
+
exports.isAllowedForScope = isAllowedForScope;
|
|
63
|
+
exports.getFleetEntitlementFilePath = getFleetEntitlementFilePath;
|
|
64
|
+
exports.getFleetGateLogPath = getFleetGateLogPath;
|
|
65
|
+
exports.formatFleetGateLogLine = formatFleetGateLogLine;
|
|
66
|
+
exports.fleetGateRefusalMessage = fleetGateRefusalMessage;
|
|
67
|
+
exports.parseFleetEntitlementCache = parseFleetEntitlementCache;
|
|
68
|
+
exports.isFleetEntitlementFresh = isFleetEntitlementFresh;
|
|
69
|
+
exports.checkFleetGate = checkFleetGate;
|
|
70
|
+
exports.getExchangedJwtCacheDir = getExchangedJwtCacheDir;
|
|
71
|
+
exports.exchangedJwtCacheKey = exchangedJwtCacheKey;
|
|
72
|
+
exports.parseCachedExchangedJwt = parseCachedExchangedJwt;
|
|
73
|
+
exports.isCachedExchangedJwtUsable = isCachedExchangedJwtUsable;
|
|
74
|
+
exports.getExchangedJwt = getExchangedJwt;
|
|
75
|
+
exports.evictExchangedJwt = evictExchangedJwt;
|
|
62
76
|
const node_crypto_1 = require("node:crypto");
|
|
63
77
|
const fs = __importStar(require("node:fs"));
|
|
64
78
|
const os = __importStar(require("node:os"));
|
|
@@ -239,4 +253,327 @@ function readPinnedTenantDeclaration() {
|
|
|
239
253
|
}
|
|
240
254
|
return tenantId;
|
|
241
255
|
}
|
|
256
|
+
/** member の範囲では止めない cancelled の理由(サーバの語・席 A の services/fleetEntitlement.ts が正本) */
|
|
257
|
+
exports.MEMBER_SCOPE_ALLOWED_REASONS = ['no_seat', 'rank_below_min'];
|
|
258
|
+
/** 範囲ごとの「通すか」(純関数)。止めるのは cancelled だけ */
|
|
259
|
+
function isAllowedForScope(status, reason, scope) {
|
|
260
|
+
if (status !== 'cancelled')
|
|
261
|
+
return true;
|
|
262
|
+
return scope === 'member' && reason !== null && exports.MEMBER_SCOPE_ALLOWED_REASONS.includes(reason);
|
|
263
|
+
}
|
|
264
|
+
/** 猶予の上限(24 時間)。サーバの ttl_sec がこれより長くてもここで切る(線を変えるのは主君) */
|
|
265
|
+
exports.FLEET_ENTITLEMENT_MAX_TTL_SEC = 86_400;
|
|
266
|
+
const FLEET_GATE_TIMEOUT_MS = 5_000;
|
|
267
|
+
// 3 つの MCP(backend-client / yashiro-client / ledger-auth)と同じ既定=/api/bluelamp まで含む
|
|
268
|
+
const FLEET_DEFAULT_BASE = 'https://api.motohi.jp/api/bluelamp';
|
|
269
|
+
/** キャッシュの置き場。テストで HOME を差し替えられるよう呼び出し時に解決する */
|
|
270
|
+
function getFleetEntitlementFilePath() {
|
|
271
|
+
return path.join(os.homedir(), '.bluelamp', 'fleet-entitlement.json');
|
|
272
|
+
}
|
|
273
|
+
/** 網に出た回だけ 1 行ずつ追記するログ(門の呼び出しを数える)。テストで HOME を差し替えられるよう呼び出し時に解決する */
|
|
274
|
+
function getFleetGateLogPath() {
|
|
275
|
+
return path.join(os.homedir(), '.bluelamp', 'fleet-gate.log');
|
|
276
|
+
}
|
|
277
|
+
/** fleet-gate.log がこれを超えたら新しい側の半分に詰める */
|
|
278
|
+
exports.FLEET_GATE_LOG_MAX_BYTES = 1_048_576;
|
|
279
|
+
/**
|
|
280
|
+
* fleet-gate.log の 1 行(純関数)。⛔ トークン・URL は載せない(時刻・呼び手・from・status・reason だけ)
|
|
281
|
+
*/
|
|
282
|
+
function formatFleetGateLogLine(nowMs, caller, r) {
|
|
283
|
+
return JSON.stringify({ ts: new Date(nowMs).toISOString(), caller, from: r.from, status: r.status, reason: r.reason }) + '\n';
|
|
284
|
+
}
|
|
285
|
+
function appendFleetGateLog(logPath, line) {
|
|
286
|
+
try {
|
|
287
|
+
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
288
|
+
fs.appendFileSync(logPath, line);
|
|
289
|
+
if (fs.statSync(logPath).size > exports.FLEET_GATE_LOG_MAX_BYTES) {
|
|
290
|
+
const buf = fs.readFileSync(logPath);
|
|
291
|
+
let start = buf.length - Math.floor(exports.FLEET_GATE_LOG_MAX_BYTES / 2);
|
|
292
|
+
const nl = buf.indexOf(0x0a, start);
|
|
293
|
+
start = nl === -1 ? buf.length : nl + 1; // 行の途中から始めない
|
|
294
|
+
const tmp = `${logPath}.${process.pid}.tmp`;
|
|
295
|
+
fs.writeFileSync(tmp, buf.subarray(start));
|
|
296
|
+
fs.renameSync(tmp, logPath);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// ログが書けなくても門の答えは返す(計器が本体を殺さない)
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/** 止めた時の文面(固定・席の起動バナーと艦隊オフィスの頭に同じ文を出す) */
|
|
304
|
+
function fleetGateRefusalMessage(reason) {
|
|
305
|
+
return `解約のため席を立てられません(${reason && reason.length > 0 ? reason : 'cancelled'})`;
|
|
306
|
+
}
|
|
307
|
+
/** キャッシュの中身を検める(純関数)。形が違えば null=キャッシュ無しと同じ */
|
|
308
|
+
function parseFleetEntitlementCache(raw) {
|
|
309
|
+
let v;
|
|
310
|
+
try {
|
|
311
|
+
v = JSON.parse(raw);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
const o = v;
|
|
317
|
+
if (!o || (o.status !== 'active' && o.status !== 'cancelled'))
|
|
318
|
+
return null;
|
|
319
|
+
if (typeof o.checked_at !== 'string' || !Number.isFinite(Date.parse(o.checked_at)))
|
|
320
|
+
return null;
|
|
321
|
+
const ttl = typeof o.ttl_sec === 'number' && Number.isFinite(o.ttl_sec) && o.ttl_sec > 0 ? o.ttl_sec : exports.FLEET_ENTITLEMENT_MAX_TTL_SEC;
|
|
322
|
+
return {
|
|
323
|
+
status: o.status,
|
|
324
|
+
reason: typeof o.reason === 'string' ? o.reason : null,
|
|
325
|
+
checked_at: o.checked_at,
|
|
326
|
+
ttl_sec: ttl,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
/** キャッシュが新しいか(純関数)。未来の時刻(時計の巻き戻り)は古いと読む */
|
|
330
|
+
function isFleetEntitlementFresh(cache, nowMs) {
|
|
331
|
+
const age = nowMs - Date.parse(cache.checked_at);
|
|
332
|
+
const ttlMs = Math.min(cache.ttl_sec, exports.FLEET_ENTITLEMENT_MAX_TTL_SEC) * 1000;
|
|
333
|
+
return age >= 0 && age < ttlMs;
|
|
334
|
+
}
|
|
335
|
+
function fromCache(cache, from, scope) {
|
|
336
|
+
return { allowed: isAllowedForScope(cache.status, cache.reason, scope), status: cache.status, reason: cache.reason, from };
|
|
337
|
+
}
|
|
338
|
+
function readFleetCache(filePath) {
|
|
339
|
+
try {
|
|
340
|
+
return parseFleetEntitlementCache(fs.readFileSync(filePath, 'utf8'));
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
function writeFleetCache(filePath, cache) {
|
|
347
|
+
try {
|
|
348
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
349
|
+
const tmp = `${filePath}.${process.pid}.tmp`;
|
|
350
|
+
fs.writeFileSync(tmp, JSON.stringify(cache) + '\n');
|
|
351
|
+
fs.renameSync(tmp, filePath);
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
// 書けなくても今回の答えは返す(次回また聞くだけ・門で本線を落とさない)
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
async function askFleetEntitlement(url, token, fetchFn, timeoutMs) {
|
|
358
|
+
const ac = new AbortController();
|
|
359
|
+
const timer = setTimeout(() => ac.abort(), timeoutMs);
|
|
360
|
+
try {
|
|
361
|
+
const res = await fetchFn(url, { method: 'GET', headers: { 'X-CLI-Token': token }, signal: ac.signal });
|
|
362
|
+
if (!res.ok)
|
|
363
|
+
return { ok: false, why: `http ${res.status}` };
|
|
364
|
+
const body = (await res.json());
|
|
365
|
+
if (body?.status !== 'active' && body?.status !== 'cancelled') {
|
|
366
|
+
return { ok: false, why: `status=${typeof body?.status === 'string' ? body.status : 'invalid'}` };
|
|
367
|
+
}
|
|
368
|
+
const ttl = typeof body.ttl_sec === 'number' && Number.isFinite(body.ttl_sec) && body.ttl_sec > 0 ? body.ttl_sec : exports.FLEET_ENTITLEMENT_MAX_TTL_SEC;
|
|
369
|
+
return { ok: true, status: body.status, reason: typeof body.reason === 'string' ? body.reason : null, ttl_sec: ttl };
|
|
370
|
+
}
|
|
371
|
+
catch (e) {
|
|
372
|
+
return { ok: false, why: ac.signal.aborted ? `timeout ${timeoutMs}ms` : `network: ${e.message}` };
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
clearTimeout(timer);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* 艦隊の資格の門。**throw しない**。キャッシュと口は範囲によらず 1 つ(判定を 2 つにしない)。
|
|
380
|
+
* 新しいキャッシュ → 網に出ずに答える。古い/無い → 口を 1 回(5 秒で打ち切り)。
|
|
381
|
+
* active/cancelled が返れば書いて答える。それ以外は前回の答え(無ければ通す)。
|
|
382
|
+
*/
|
|
383
|
+
async function checkFleetGate(options = {}) {
|
|
384
|
+
const r = await decideFleetGate(options);
|
|
385
|
+
if (r.from !== 'cache' && options.logPath !== null) {
|
|
386
|
+
appendFleetGateLog(options.logPath ?? getFleetGateLogPath(), formatFleetGateLogLine((options.now ?? Date.now)(), options.caller ?? 'unknown', r));
|
|
387
|
+
}
|
|
388
|
+
return r;
|
|
389
|
+
}
|
|
390
|
+
async function decideFleetGate(options) {
|
|
391
|
+
const scope = options.scope ?? 'fleet';
|
|
392
|
+
const nowMs = (options.now ?? Date.now)();
|
|
393
|
+
const cachePath = options.cachePath ?? getFleetEntitlementFilePath();
|
|
394
|
+
const cache = readFleetCache(cachePath);
|
|
395
|
+
if (cache && isFleetEntitlementFresh(cache, nowMs))
|
|
396
|
+
return fromCache(cache, 'cache', scope);
|
|
397
|
+
const fallback = (why) => cache ? fromCache(cache, 'stale', scope) : { allowed: true, status: 'unknown', reason: why, from: 'none' };
|
|
398
|
+
let token;
|
|
399
|
+
try {
|
|
400
|
+
token = (options.readToken ?? tryReadCliToken)();
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
token = null;
|
|
404
|
+
}
|
|
405
|
+
if (!token)
|
|
406
|
+
return fallback('no cli token');
|
|
407
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
408
|
+
if (typeof fetchFn !== 'function')
|
|
409
|
+
return fallback('fetch unavailable');
|
|
410
|
+
const base = (options.baseUrl ?? (process.env.BLUELAMP_PORTAL_API_BASE_URL || FLEET_DEFAULT_BASE)).replace(/\/+$/, '');
|
|
411
|
+
const asked = await askFleetEntitlement(`${base}/cli/fleet-entitlement`, token, fetchFn, options.timeoutMs ?? FLEET_GATE_TIMEOUT_MS);
|
|
412
|
+
if (!asked.ok)
|
|
413
|
+
return fallback(asked.why);
|
|
414
|
+
writeFleetCache(cachePath, {
|
|
415
|
+
status: asked.status,
|
|
416
|
+
reason: asked.reason,
|
|
417
|
+
checked_at: new Date(nowMs).toISOString(),
|
|
418
|
+
ttl_sec: asked.ttl_sec,
|
|
419
|
+
});
|
|
420
|
+
return { allowed: isAllowedForScope(asked.status, asked.reason, scope), status: asked.status, reason: asked.reason, from: 'network' };
|
|
421
|
+
}
|
|
422
|
+
/** 期限の何 ms 前から取り直すか(既定)。10 分の札で 9 分は使い回す */
|
|
423
|
+
exports.EXCHANGED_JWT_REFRESH_BUFFER_MS = 60_000;
|
|
424
|
+
/** 他のプロセスが取り直している間に待つ上限(既定)。過ぎたら自分で取る(fail-open) */
|
|
425
|
+
exports.EXCHANGED_JWT_LOCK_WAIT_MS = 5_000;
|
|
426
|
+
/** ロックがこれより古ければ持ち主は死んだと読む(exchange の打ち切りより長く取る) */
|
|
427
|
+
exports.EXCHANGED_JWT_LOCK_STALE_MS = 30_000;
|
|
428
|
+
const LOCK_POLL_MS = 100;
|
|
429
|
+
/**
|
|
430
|
+
* 置き場。`BLUELAMP_JWT_CACHE_DIR` が在ればそこ(消費側のテストが実機の置き場を触らないため)、無ければ
|
|
431
|
+
* `~/.bluelamp/jwt-cache`。テストで HOME を差し替えられるよう呼び出し時に解決する
|
|
432
|
+
*/
|
|
433
|
+
function getExchangedJwtCacheDir() {
|
|
434
|
+
return process.env.BLUELAMP_JWT_CACHE_DIR || path.join(os.homedir(), '.bluelamp', 'jwt-cache');
|
|
435
|
+
}
|
|
436
|
+
/** 鍵(純関数)。sha256 の 16 進 64 文字=そのままファイル名に使える */
|
|
437
|
+
function exchangedJwtCacheKey(k) {
|
|
438
|
+
const fingerprint = (0, node_crypto_1.createHash)('sha256').update(k.cliToken).digest('hex');
|
|
439
|
+
const material = JSON.stringify([k.baseUrl.replace(/\/+$/, ''), k.mcpId, [...k.scopes].sort(), fingerprint]);
|
|
440
|
+
return (0, node_crypto_1.createHash)('sha256').update(material).digest('hex');
|
|
441
|
+
}
|
|
442
|
+
/** キャッシュの中身を検める(純関数)。形が違えば null=キャッシュ無しと同じ */
|
|
443
|
+
function parseCachedExchangedJwt(raw) {
|
|
444
|
+
let v;
|
|
445
|
+
try {
|
|
446
|
+
v = JSON.parse(raw);
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
const o = v;
|
|
452
|
+
if (!o || typeof o.token !== 'string' || o.token.length === 0)
|
|
453
|
+
return null;
|
|
454
|
+
if (typeof o.expiresAt !== 'number' || !Number.isFinite(o.expiresAt))
|
|
455
|
+
return null;
|
|
456
|
+
return { token: o.token, expiresAt: o.expiresAt };
|
|
457
|
+
}
|
|
458
|
+
/** まだ使ってよいか(純関数)。期限の bufferMs 前を過ぎたら使わない */
|
|
459
|
+
function isCachedExchangedJwtUsable(c, nowMs, bufferMs) {
|
|
460
|
+
return nowMs < c.expiresAt - bufferMs;
|
|
461
|
+
}
|
|
462
|
+
function cacheFilePath(dir, key) {
|
|
463
|
+
return path.join(dir, `${exchangedJwtCacheKey(key)}.json`);
|
|
464
|
+
}
|
|
465
|
+
/** 読む。自分だけが読める(group/other のビットが立っていない)ファイルしか信じない */
|
|
466
|
+
function readCachedJwt(file) {
|
|
467
|
+
try {
|
|
468
|
+
const st = fs.statSync(file);
|
|
469
|
+
if ((st.mode & 0o077) !== 0)
|
|
470
|
+
return null;
|
|
471
|
+
if (typeof process.getuid === 'function' && st.uid !== process.getuid())
|
|
472
|
+
return null;
|
|
473
|
+
return parseCachedExchangedJwt(fs.readFileSync(file, 'utf8'));
|
|
474
|
+
}
|
|
475
|
+
catch {
|
|
476
|
+
return null;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
function writeCachedJwt(file, c) {
|
|
480
|
+
try {
|
|
481
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
482
|
+
const tmp = `${file}.${process.pid}.${(0, node_crypto_1.randomBytes)(4).toString('hex')}.tmp`;
|
|
483
|
+
fs.writeFileSync(tmp, JSON.stringify(c) + '\n', { mode: 0o600 });
|
|
484
|
+
fs.chmodSync(tmp, 0o600); // umask に依らず 600
|
|
485
|
+
fs.renameSync(tmp, file);
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
// 書けなくても今回の JWT は返す(次のプロセスがもう 1 回取るだけ)
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/** ロックを取る。取れたら true。古いロック(持ち主が死んだ)は 1 回だけ払って取り直す */
|
|
492
|
+
function tryLock(lockFile, nowMs) {
|
|
493
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
494
|
+
try {
|
|
495
|
+
fs.mkdirSync(path.dirname(lockFile), { recursive: true, mode: 0o700 });
|
|
496
|
+
fs.closeSync(fs.openSync(lockFile, 'wx', 0o600));
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
catch (e) {
|
|
500
|
+
if (e.code !== 'EEXIST')
|
|
501
|
+
return false;
|
|
502
|
+
try {
|
|
503
|
+
if (nowMs - fs.statSync(lockFile).mtimeMs <= exports.EXCHANGED_JWT_LOCK_STALE_MS)
|
|
504
|
+
return false;
|
|
505
|
+
fs.unlinkSync(lockFile);
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
return false;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
function unlock(lockFile) {
|
|
515
|
+
try {
|
|
516
|
+
fs.unlinkSync(lockFile);
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
// 消えていても構わない
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
523
|
+
/**
|
|
524
|
+
* 機体で共有する JWT を返す。使える JWT がファイルに在れば口に出ない。
|
|
525
|
+
* 無い/切れかけなら、ロックを取った 1 プロセスだけが exchange して書く。他はその間ファイルを待つ
|
|
526
|
+
* (lockWaitMs を過ぎたら自分で取る)。exchange の失敗は throw のまま返す。
|
|
527
|
+
*/
|
|
528
|
+
async function getExchangedJwt(options) {
|
|
529
|
+
const now = options.now ?? Date.now;
|
|
530
|
+
const bufferMs = options.refreshBufferMs ?? exports.EXCHANGED_JWT_REFRESH_BUFFER_MS;
|
|
531
|
+
const file = cacheFilePath(options.cacheDir ?? getExchangedJwtCacheDir(), options.key);
|
|
532
|
+
const usable = () => {
|
|
533
|
+
const c = readCachedJwt(file);
|
|
534
|
+
return c && isCachedExchangedJwtUsable(c, now(), bufferMs) ? c.token : null;
|
|
535
|
+
};
|
|
536
|
+
const hit = usable();
|
|
537
|
+
if (hit)
|
|
538
|
+
return hit;
|
|
539
|
+
const lockFile = `${file}.lock`;
|
|
540
|
+
const waitUntil = now() + Math.max(0, options.lockWaitMs ?? exports.EXCHANGED_JWT_LOCK_WAIT_MS);
|
|
541
|
+
let locked = tryLock(lockFile, now());
|
|
542
|
+
while (!locked && now() < waitUntil) {
|
|
543
|
+
await sleep(LOCK_POLL_MS);
|
|
544
|
+
const fresh = usable();
|
|
545
|
+
if (fresh)
|
|
546
|
+
return fresh;
|
|
547
|
+
locked = tryLock(lockFile, now());
|
|
548
|
+
}
|
|
549
|
+
try {
|
|
550
|
+
if (locked) {
|
|
551
|
+
// ロックを待っている間に他のプロセスが書いたかもしれない
|
|
552
|
+
const fresh = usable();
|
|
553
|
+
if (fresh)
|
|
554
|
+
return fresh;
|
|
555
|
+
}
|
|
556
|
+
const got = await options.exchange();
|
|
557
|
+
writeCachedJwt(file, { token: got.token, expiresAt: now() + got.expiresInSec * 1000 });
|
|
558
|
+
return got.token;
|
|
559
|
+
}
|
|
560
|
+
finally {
|
|
561
|
+
if (locked)
|
|
562
|
+
unlock(lockFile);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* 受け手に拒まれた(401)JWT を捨てる。ファイルの中身が `rejectedToken` のときだけ消す
|
|
567
|
+
* (その間に他のプロセスが書いた新しい JWT は消さない)。throw しない。
|
|
568
|
+
*/
|
|
569
|
+
function evictExchangedJwt(key, rejectedToken, cacheDir = getExchangedJwtCacheDir()) {
|
|
570
|
+
const file = cacheFilePath(cacheDir, key);
|
|
571
|
+
try {
|
|
572
|
+
if (parseCachedExchangedJwt(fs.readFileSync(file, 'utf8'))?.token === rejectedToken)
|
|
573
|
+
fs.unlinkSync(file);
|
|
574
|
+
}
|
|
575
|
+
catch {
|
|
576
|
+
// 無ければ何もしない
|
|
577
|
+
}
|
|
578
|
+
}
|
|
242
579
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -85,4 +85,140 @@ export declare function deletePortalToken(): void;
|
|
|
85
85
|
* (宣言を置いた機体で pin 無しのトークンが生まれるのが、この仕組みが塞ぐ穴そのもの)。
|
|
86
86
|
*/
|
|
87
87
|
export declare function readPinnedTenantDeclaration(): string | null;
|
|
88
|
+
/** サーバの答え。unknown は「サーバが決められない」 */
|
|
89
|
+
export type FleetEntitlementStatus = 'active' | 'cancelled' | 'unknown';
|
|
90
|
+
/** キャッシュ 1 ファイルの形(値の秘密なし)。書くのは active/cancelled だけ */
|
|
91
|
+
export interface FleetEntitlementCache {
|
|
92
|
+
status: 'active' | 'cancelled';
|
|
93
|
+
reason: string | null;
|
|
94
|
+
/** この機体が答えを受け取った時刻(ISO 8601)。鮮度はこの時刻から測る */
|
|
95
|
+
checked_at: string;
|
|
96
|
+
ttl_sec: number;
|
|
97
|
+
}
|
|
98
|
+
export interface FleetGateResult {
|
|
99
|
+
/** false は `cancelled` のときだけ(scope=member では no_seat・rank_below_min の cancelled も true) */
|
|
100
|
+
allowed: boolean;
|
|
101
|
+
status: FleetEntitlementStatus;
|
|
102
|
+
reason: string | null;
|
|
103
|
+
/** cache=新しいキャッシュ/network=いま聞いた/stale=聞けず古いキャッシュ/none=聞けずキャッシュも無い */
|
|
104
|
+
from: 'cache' | 'network' | 'stale' | 'none';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 門の範囲(判定は 1 つ・止め方だけ 2 つ)。
|
|
108
|
+
* - fleet: 艦隊(皆伝)の手足=orchestrator の spawn・scheduler の発火。cancelled なら止める
|
|
109
|
+
* - member: 初伝(rank 1〜)にも配る手足=routine。席が皆伝に届かないだけ(no_seat・rank_below_min)では止めず、
|
|
110
|
+
* 席が丸ごと落ちた・退会・期限切れ(それ以外の cancelled)の時だけ止める
|
|
111
|
+
*/
|
|
112
|
+
export type FleetGateScope = 'fleet' | 'member';
|
|
113
|
+
/** member の範囲では止めない cancelled の理由(サーバの語・席 A の services/fleetEntitlement.ts が正本) */
|
|
114
|
+
export declare const MEMBER_SCOPE_ALLOWED_REASONS: readonly string[];
|
|
115
|
+
/** 範囲ごとの「通すか」(純関数)。止めるのは cancelled だけ */
|
|
116
|
+
export declare function isAllowedForScope(status: FleetEntitlementStatus, reason: string | null, scope: FleetGateScope): boolean;
|
|
117
|
+
/** 門を呼んだ手足(fleet-gate.log の呼び手の欄) */
|
|
118
|
+
export type FleetGateCaller = 'orchestrator' | 'scheduler' | 'routine' | 'server';
|
|
119
|
+
export interface FleetGateOptions {
|
|
120
|
+
/** 既定 "fleet" */
|
|
121
|
+
scope?: FleetGateScope;
|
|
122
|
+
/** 呼び手。網に出た回の fleet-gate.log の 1 行に載る(省略は "unknown") */
|
|
123
|
+
caller?: FleetGateCaller;
|
|
124
|
+
/** 既定 getFleetGateLogPath()。null で書かない */
|
|
125
|
+
logPath?: string | null;
|
|
126
|
+
/** 既定 Date.now */
|
|
127
|
+
now?: () => number;
|
|
128
|
+
/** 既定 globalThis.fetch */
|
|
129
|
+
fetch?: typeof fetch;
|
|
130
|
+
/** 既定 tryReadCliToken(読めなければ網に出ない=前回の答え) */
|
|
131
|
+
readToken?: () => string | null;
|
|
132
|
+
/** 既定 getFleetEntitlementFilePath() */
|
|
133
|
+
cachePath?: string;
|
|
134
|
+
/** 既定 BLUELAMP_PORTAL_API_BASE_URL(/api/bluelamp まで含む)→ 無ければ本番 */
|
|
135
|
+
baseUrl?: string;
|
|
136
|
+
/** 既定 5000 */
|
|
137
|
+
timeoutMs?: number;
|
|
138
|
+
}
|
|
139
|
+
/** 猶予の上限(24 時間)。サーバの ttl_sec がこれより長くてもここで切る(線を変えるのは主君) */
|
|
140
|
+
export declare const FLEET_ENTITLEMENT_MAX_TTL_SEC = 86400;
|
|
141
|
+
/** キャッシュの置き場。テストで HOME を差し替えられるよう呼び出し時に解決する */
|
|
142
|
+
export declare function getFleetEntitlementFilePath(): string;
|
|
143
|
+
/** 網に出た回だけ 1 行ずつ追記するログ(門の呼び出しを数える)。テストで HOME を差し替えられるよう呼び出し時に解決する */
|
|
144
|
+
export declare function getFleetGateLogPath(): string;
|
|
145
|
+
/** fleet-gate.log がこれを超えたら新しい側の半分に詰める */
|
|
146
|
+
export declare const FLEET_GATE_LOG_MAX_BYTES = 1048576;
|
|
147
|
+
/**
|
|
148
|
+
* fleet-gate.log の 1 行(純関数)。⛔ トークン・URL は載せない(時刻・呼び手・from・status・reason だけ)
|
|
149
|
+
*/
|
|
150
|
+
export declare function formatFleetGateLogLine(nowMs: number, caller: string, r: FleetGateResult): string;
|
|
151
|
+
/** 止めた時の文面(固定・席の起動バナーと艦隊オフィスの頭に同じ文を出す) */
|
|
152
|
+
export declare function fleetGateRefusalMessage(reason: string | null): string;
|
|
153
|
+
/** キャッシュの中身を検める(純関数)。形が違えば null=キャッシュ無しと同じ */
|
|
154
|
+
export declare function parseFleetEntitlementCache(raw: string): FleetEntitlementCache | null;
|
|
155
|
+
/** キャッシュが新しいか(純関数)。未来の時刻(時計の巻き戻り)は古いと読む */
|
|
156
|
+
export declare function isFleetEntitlementFresh(cache: FleetEntitlementCache, nowMs: number): boolean;
|
|
157
|
+
/**
|
|
158
|
+
* 艦隊の資格の門。**throw しない**。キャッシュと口は範囲によらず 1 つ(判定を 2 つにしない)。
|
|
159
|
+
* 新しいキャッシュ → 網に出ずに答える。古い/無い → 口を 1 回(5 秒で打ち切り)。
|
|
160
|
+
* active/cancelled が返れば書いて答える。それ以外は前回の答え(無ければ通す)。
|
|
161
|
+
*/
|
|
162
|
+
export declare function checkFleetGate(options?: FleetGateOptions): Promise<FleetGateResult>;
|
|
163
|
+
/** キャッシュの鍵の材料(どれか 1 つ違えば別の JWT) */
|
|
164
|
+
export interface ExchangedJwtKey {
|
|
165
|
+
/** `/api/bluelamp` まで含む口(BLUELAMP_PORTAL_API_BASE_URL か既定) */
|
|
166
|
+
baseUrl: string;
|
|
167
|
+
mcpId: string;
|
|
168
|
+
scopes: readonly string[];
|
|
169
|
+
/** CLI トークン。指紋(sha256)にしてから鍵に混ぜる=ファイルには残らない */
|
|
170
|
+
cliToken: string;
|
|
171
|
+
}
|
|
172
|
+
/** キャッシュ 1 ファイルの形 */
|
|
173
|
+
export interface CachedExchangedJwt {
|
|
174
|
+
token: string;
|
|
175
|
+
/** 期限(epoch ms) */
|
|
176
|
+
expiresAt: number;
|
|
177
|
+
}
|
|
178
|
+
/** exchange の返り(呼び出し側が口を撃って作る) */
|
|
179
|
+
export interface ExchangedJwt {
|
|
180
|
+
token: string;
|
|
181
|
+
expiresInSec: number;
|
|
182
|
+
}
|
|
183
|
+
/** 期限の何 ms 前から取り直すか(既定)。10 分の札で 9 分は使い回す */
|
|
184
|
+
export declare const EXCHANGED_JWT_REFRESH_BUFFER_MS = 60000;
|
|
185
|
+
/** 他のプロセスが取り直している間に待つ上限(既定)。過ぎたら自分で取る(fail-open) */
|
|
186
|
+
export declare const EXCHANGED_JWT_LOCK_WAIT_MS = 5000;
|
|
187
|
+
/** ロックがこれより古ければ持ち主は死んだと読む(exchange の打ち切りより長く取る) */
|
|
188
|
+
export declare const EXCHANGED_JWT_LOCK_STALE_MS = 30000;
|
|
189
|
+
/**
|
|
190
|
+
* 置き場。`BLUELAMP_JWT_CACHE_DIR` が在ればそこ(消費側のテストが実機の置き場を触らないため)、無ければ
|
|
191
|
+
* `~/.bluelamp/jwt-cache`。テストで HOME を差し替えられるよう呼び出し時に解決する
|
|
192
|
+
*/
|
|
193
|
+
export declare function getExchangedJwtCacheDir(): string;
|
|
194
|
+
/** 鍵(純関数)。sha256 の 16 進 64 文字=そのままファイル名に使える */
|
|
195
|
+
export declare function exchangedJwtCacheKey(k: ExchangedJwtKey): string;
|
|
196
|
+
/** キャッシュの中身を検める(純関数)。形が違えば null=キャッシュ無しと同じ */
|
|
197
|
+
export declare function parseCachedExchangedJwt(raw: string): CachedExchangedJwt | null;
|
|
198
|
+
/** まだ使ってよいか(純関数)。期限の bufferMs 前を過ぎたら使わない */
|
|
199
|
+
export declare function isCachedExchangedJwtUsable(c: CachedExchangedJwt, nowMs: number, bufferMs: number): boolean;
|
|
200
|
+
export interface GetExchangedJwtOptions {
|
|
201
|
+
key: ExchangedJwtKey;
|
|
202
|
+
/** 口を 1 回撃って JWT を得る。失敗は throw(そのまま呼び出し側へ返る) */
|
|
203
|
+
exchange: () => Promise<ExchangedJwt>;
|
|
204
|
+
/** 既定 Date.now */
|
|
205
|
+
now?: () => number;
|
|
206
|
+
/** 既定 getExchangedJwtCacheDir() */
|
|
207
|
+
cacheDir?: string;
|
|
208
|
+
/** 既定 EXCHANGED_JWT_REFRESH_BUFFER_MS */
|
|
209
|
+
refreshBufferMs?: number;
|
|
210
|
+
/** 既定 EXCHANGED_JWT_LOCK_WAIT_MS。呼び出し側に期限があるなら、その残りより短く渡す */
|
|
211
|
+
lockWaitMs?: number;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 機体で共有する JWT を返す。使える JWT がファイルに在れば口に出ない。
|
|
215
|
+
* 無い/切れかけなら、ロックを取った 1 プロセスだけが exchange して書く。他はその間ファイルを待つ
|
|
216
|
+
* (lockWaitMs を過ぎたら自分で取る)。exchange の失敗は throw のまま返す。
|
|
217
|
+
*/
|
|
218
|
+
export declare function getExchangedJwt(options: GetExchangedJwtOptions): Promise<string>;
|
|
219
|
+
/**
|
|
220
|
+
* 受け手に拒まれた(401)JWT を捨てる。ファイルの中身が `rejectedToken` のときだけ消す
|
|
221
|
+
* (その間に他のプロセスが書いた新しい JWT は消さない)。throw しない。
|
|
222
|
+
*/
|
|
223
|
+
export declare function evictExchangedJwt(key: ExchangedJwtKey, rejectedToken: string, cacheDir?: string): void;
|
|
88
224
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH,wDAAwD;AACxD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,MAAM,CAAC,EAAE,MAAM;CAQ5B;AAQD,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOjE;AAED,qBAAqB;AACrB,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEnE;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAuBzC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAM/C;AAED,oDAAoD;AACpD,wBAAgB,eAAe,IAAI,eAAe,GAAG,IAAI,CAUxD;AAED,yCAAyC;AACzC,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAmB,GAAG,IAAI,CAiBlF;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,IAAI,CAgB3D"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - 失敗の返し方は消費側で分かれていたので、throw 版(readCliTokenSync)と
|
|
12
12
|
* null 版(tryReadCliToken)の両方を出す。片方に寄せると挙動が変わる。
|
|
13
13
|
*/
|
|
14
|
-
import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';
|
|
14
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes, scryptSync } from 'node:crypto';
|
|
15
15
|
import * as fs from 'node:fs';
|
|
16
16
|
import * as os from 'node:os';
|
|
17
17
|
import * as path from 'node:path';
|
|
@@ -190,4 +190,327 @@ export function readPinnedTenantDeclaration() {
|
|
|
190
190
|
}
|
|
191
191
|
return tenantId;
|
|
192
192
|
}
|
|
193
|
+
/** member の範囲では止めない cancelled の理由(サーバの語・席 A の services/fleetEntitlement.ts が正本) */
|
|
194
|
+
export const MEMBER_SCOPE_ALLOWED_REASONS = ['no_seat', 'rank_below_min'];
|
|
195
|
+
/** 範囲ごとの「通すか」(純関数)。止めるのは cancelled だけ */
|
|
196
|
+
export function isAllowedForScope(status, reason, scope) {
|
|
197
|
+
if (status !== 'cancelled')
|
|
198
|
+
return true;
|
|
199
|
+
return scope === 'member' && reason !== null && MEMBER_SCOPE_ALLOWED_REASONS.includes(reason);
|
|
200
|
+
}
|
|
201
|
+
/** 猶予の上限(24 時間)。サーバの ttl_sec がこれより長くてもここで切る(線を変えるのは主君) */
|
|
202
|
+
export const FLEET_ENTITLEMENT_MAX_TTL_SEC = 86_400;
|
|
203
|
+
const FLEET_GATE_TIMEOUT_MS = 5_000;
|
|
204
|
+
// 3 つの MCP(backend-client / yashiro-client / ledger-auth)と同じ既定=/api/bluelamp まで含む
|
|
205
|
+
const FLEET_DEFAULT_BASE = 'https://api.motohi.jp/api/bluelamp';
|
|
206
|
+
/** キャッシュの置き場。テストで HOME を差し替えられるよう呼び出し時に解決する */
|
|
207
|
+
export function getFleetEntitlementFilePath() {
|
|
208
|
+
return path.join(os.homedir(), '.bluelamp', 'fleet-entitlement.json');
|
|
209
|
+
}
|
|
210
|
+
/** 網に出た回だけ 1 行ずつ追記するログ(門の呼び出しを数える)。テストで HOME を差し替えられるよう呼び出し時に解決する */
|
|
211
|
+
export function getFleetGateLogPath() {
|
|
212
|
+
return path.join(os.homedir(), '.bluelamp', 'fleet-gate.log');
|
|
213
|
+
}
|
|
214
|
+
/** fleet-gate.log がこれを超えたら新しい側の半分に詰める */
|
|
215
|
+
export const FLEET_GATE_LOG_MAX_BYTES = 1_048_576;
|
|
216
|
+
/**
|
|
217
|
+
* fleet-gate.log の 1 行(純関数)。⛔ トークン・URL は載せない(時刻・呼び手・from・status・reason だけ)
|
|
218
|
+
*/
|
|
219
|
+
export function formatFleetGateLogLine(nowMs, caller, r) {
|
|
220
|
+
return JSON.stringify({ ts: new Date(nowMs).toISOString(), caller, from: r.from, status: r.status, reason: r.reason }) + '\n';
|
|
221
|
+
}
|
|
222
|
+
function appendFleetGateLog(logPath, line) {
|
|
223
|
+
try {
|
|
224
|
+
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
225
|
+
fs.appendFileSync(logPath, line);
|
|
226
|
+
if (fs.statSync(logPath).size > FLEET_GATE_LOG_MAX_BYTES) {
|
|
227
|
+
const buf = fs.readFileSync(logPath);
|
|
228
|
+
let start = buf.length - Math.floor(FLEET_GATE_LOG_MAX_BYTES / 2);
|
|
229
|
+
const nl = buf.indexOf(0x0a, start);
|
|
230
|
+
start = nl === -1 ? buf.length : nl + 1; // 行の途中から始めない
|
|
231
|
+
const tmp = `${logPath}.${process.pid}.tmp`;
|
|
232
|
+
fs.writeFileSync(tmp, buf.subarray(start));
|
|
233
|
+
fs.renameSync(tmp, logPath);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// ログが書けなくても門の答えは返す(計器が本体を殺さない)
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** 止めた時の文面(固定・席の起動バナーと艦隊オフィスの頭に同じ文を出す) */
|
|
241
|
+
export function fleetGateRefusalMessage(reason) {
|
|
242
|
+
return `解約のため席を立てられません(${reason && reason.length > 0 ? reason : 'cancelled'})`;
|
|
243
|
+
}
|
|
244
|
+
/** キャッシュの中身を検める(純関数)。形が違えば null=キャッシュ無しと同じ */
|
|
245
|
+
export function parseFleetEntitlementCache(raw) {
|
|
246
|
+
let v;
|
|
247
|
+
try {
|
|
248
|
+
v = JSON.parse(raw);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
const o = v;
|
|
254
|
+
if (!o || (o.status !== 'active' && o.status !== 'cancelled'))
|
|
255
|
+
return null;
|
|
256
|
+
if (typeof o.checked_at !== 'string' || !Number.isFinite(Date.parse(o.checked_at)))
|
|
257
|
+
return null;
|
|
258
|
+
const ttl = typeof o.ttl_sec === 'number' && Number.isFinite(o.ttl_sec) && o.ttl_sec > 0 ? o.ttl_sec : FLEET_ENTITLEMENT_MAX_TTL_SEC;
|
|
259
|
+
return {
|
|
260
|
+
status: o.status,
|
|
261
|
+
reason: typeof o.reason === 'string' ? o.reason : null,
|
|
262
|
+
checked_at: o.checked_at,
|
|
263
|
+
ttl_sec: ttl,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/** キャッシュが新しいか(純関数)。未来の時刻(時計の巻き戻り)は古いと読む */
|
|
267
|
+
export function isFleetEntitlementFresh(cache, nowMs) {
|
|
268
|
+
const age = nowMs - Date.parse(cache.checked_at);
|
|
269
|
+
const ttlMs = Math.min(cache.ttl_sec, FLEET_ENTITLEMENT_MAX_TTL_SEC) * 1000;
|
|
270
|
+
return age >= 0 && age < ttlMs;
|
|
271
|
+
}
|
|
272
|
+
function fromCache(cache, from, scope) {
|
|
273
|
+
return { allowed: isAllowedForScope(cache.status, cache.reason, scope), status: cache.status, reason: cache.reason, from };
|
|
274
|
+
}
|
|
275
|
+
function readFleetCache(filePath) {
|
|
276
|
+
try {
|
|
277
|
+
return parseFleetEntitlementCache(fs.readFileSync(filePath, 'utf8'));
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function writeFleetCache(filePath, cache) {
|
|
284
|
+
try {
|
|
285
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
286
|
+
const tmp = `${filePath}.${process.pid}.tmp`;
|
|
287
|
+
fs.writeFileSync(tmp, JSON.stringify(cache) + '\n');
|
|
288
|
+
fs.renameSync(tmp, filePath);
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// 書けなくても今回の答えは返す(次回また聞くだけ・門で本線を落とさない)
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async function askFleetEntitlement(url, token, fetchFn, timeoutMs) {
|
|
295
|
+
const ac = new AbortController();
|
|
296
|
+
const timer = setTimeout(() => ac.abort(), timeoutMs);
|
|
297
|
+
try {
|
|
298
|
+
const res = await fetchFn(url, { method: 'GET', headers: { 'X-CLI-Token': token }, signal: ac.signal });
|
|
299
|
+
if (!res.ok)
|
|
300
|
+
return { ok: false, why: `http ${res.status}` };
|
|
301
|
+
const body = (await res.json());
|
|
302
|
+
if (body?.status !== 'active' && body?.status !== 'cancelled') {
|
|
303
|
+
return { ok: false, why: `status=${typeof body?.status === 'string' ? body.status : 'invalid'}` };
|
|
304
|
+
}
|
|
305
|
+
const ttl = typeof body.ttl_sec === 'number' && Number.isFinite(body.ttl_sec) && body.ttl_sec > 0 ? body.ttl_sec : FLEET_ENTITLEMENT_MAX_TTL_SEC;
|
|
306
|
+
return { ok: true, status: body.status, reason: typeof body.reason === 'string' ? body.reason : null, ttl_sec: ttl };
|
|
307
|
+
}
|
|
308
|
+
catch (e) {
|
|
309
|
+
return { ok: false, why: ac.signal.aborted ? `timeout ${timeoutMs}ms` : `network: ${e.message}` };
|
|
310
|
+
}
|
|
311
|
+
finally {
|
|
312
|
+
clearTimeout(timer);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* 艦隊の資格の門。**throw しない**。キャッシュと口は範囲によらず 1 つ(判定を 2 つにしない)。
|
|
317
|
+
* 新しいキャッシュ → 網に出ずに答える。古い/無い → 口を 1 回(5 秒で打ち切り)。
|
|
318
|
+
* active/cancelled が返れば書いて答える。それ以外は前回の答え(無ければ通す)。
|
|
319
|
+
*/
|
|
320
|
+
export async function checkFleetGate(options = {}) {
|
|
321
|
+
const r = await decideFleetGate(options);
|
|
322
|
+
if (r.from !== 'cache' && options.logPath !== null) {
|
|
323
|
+
appendFleetGateLog(options.logPath ?? getFleetGateLogPath(), formatFleetGateLogLine((options.now ?? Date.now)(), options.caller ?? 'unknown', r));
|
|
324
|
+
}
|
|
325
|
+
return r;
|
|
326
|
+
}
|
|
327
|
+
async function decideFleetGate(options) {
|
|
328
|
+
const scope = options.scope ?? 'fleet';
|
|
329
|
+
const nowMs = (options.now ?? Date.now)();
|
|
330
|
+
const cachePath = options.cachePath ?? getFleetEntitlementFilePath();
|
|
331
|
+
const cache = readFleetCache(cachePath);
|
|
332
|
+
if (cache && isFleetEntitlementFresh(cache, nowMs))
|
|
333
|
+
return fromCache(cache, 'cache', scope);
|
|
334
|
+
const fallback = (why) => cache ? fromCache(cache, 'stale', scope) : { allowed: true, status: 'unknown', reason: why, from: 'none' };
|
|
335
|
+
let token;
|
|
336
|
+
try {
|
|
337
|
+
token = (options.readToken ?? tryReadCliToken)();
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
token = null;
|
|
341
|
+
}
|
|
342
|
+
if (!token)
|
|
343
|
+
return fallback('no cli token');
|
|
344
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
345
|
+
if (typeof fetchFn !== 'function')
|
|
346
|
+
return fallback('fetch unavailable');
|
|
347
|
+
const base = (options.baseUrl ?? (process.env.BLUELAMP_PORTAL_API_BASE_URL || FLEET_DEFAULT_BASE)).replace(/\/+$/, '');
|
|
348
|
+
const asked = await askFleetEntitlement(`${base}/cli/fleet-entitlement`, token, fetchFn, options.timeoutMs ?? FLEET_GATE_TIMEOUT_MS);
|
|
349
|
+
if (!asked.ok)
|
|
350
|
+
return fallback(asked.why);
|
|
351
|
+
writeFleetCache(cachePath, {
|
|
352
|
+
status: asked.status,
|
|
353
|
+
reason: asked.reason,
|
|
354
|
+
checked_at: new Date(nowMs).toISOString(),
|
|
355
|
+
ttl_sec: asked.ttl_sec,
|
|
356
|
+
});
|
|
357
|
+
return { allowed: isAllowedForScope(asked.status, asked.reason, scope), status: asked.status, reason: asked.reason, from: 'network' };
|
|
358
|
+
}
|
|
359
|
+
/** 期限の何 ms 前から取り直すか(既定)。10 分の札で 9 分は使い回す */
|
|
360
|
+
export const EXCHANGED_JWT_REFRESH_BUFFER_MS = 60_000;
|
|
361
|
+
/** 他のプロセスが取り直している間に待つ上限(既定)。過ぎたら自分で取る(fail-open) */
|
|
362
|
+
export const EXCHANGED_JWT_LOCK_WAIT_MS = 5_000;
|
|
363
|
+
/** ロックがこれより古ければ持ち主は死んだと読む(exchange の打ち切りより長く取る) */
|
|
364
|
+
export const EXCHANGED_JWT_LOCK_STALE_MS = 30_000;
|
|
365
|
+
const LOCK_POLL_MS = 100;
|
|
366
|
+
/**
|
|
367
|
+
* 置き場。`BLUELAMP_JWT_CACHE_DIR` が在ればそこ(消費側のテストが実機の置き場を触らないため)、無ければ
|
|
368
|
+
* `~/.bluelamp/jwt-cache`。テストで HOME を差し替えられるよう呼び出し時に解決する
|
|
369
|
+
*/
|
|
370
|
+
export function getExchangedJwtCacheDir() {
|
|
371
|
+
return process.env.BLUELAMP_JWT_CACHE_DIR || path.join(os.homedir(), '.bluelamp', 'jwt-cache');
|
|
372
|
+
}
|
|
373
|
+
/** 鍵(純関数)。sha256 の 16 進 64 文字=そのままファイル名に使える */
|
|
374
|
+
export function exchangedJwtCacheKey(k) {
|
|
375
|
+
const fingerprint = createHash('sha256').update(k.cliToken).digest('hex');
|
|
376
|
+
const material = JSON.stringify([k.baseUrl.replace(/\/+$/, ''), k.mcpId, [...k.scopes].sort(), fingerprint]);
|
|
377
|
+
return createHash('sha256').update(material).digest('hex');
|
|
378
|
+
}
|
|
379
|
+
/** キャッシュの中身を検める(純関数)。形が違えば null=キャッシュ無しと同じ */
|
|
380
|
+
export function parseCachedExchangedJwt(raw) {
|
|
381
|
+
let v;
|
|
382
|
+
try {
|
|
383
|
+
v = JSON.parse(raw);
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
const o = v;
|
|
389
|
+
if (!o || typeof o.token !== 'string' || o.token.length === 0)
|
|
390
|
+
return null;
|
|
391
|
+
if (typeof o.expiresAt !== 'number' || !Number.isFinite(o.expiresAt))
|
|
392
|
+
return null;
|
|
393
|
+
return { token: o.token, expiresAt: o.expiresAt };
|
|
394
|
+
}
|
|
395
|
+
/** まだ使ってよいか(純関数)。期限の bufferMs 前を過ぎたら使わない */
|
|
396
|
+
export function isCachedExchangedJwtUsable(c, nowMs, bufferMs) {
|
|
397
|
+
return nowMs < c.expiresAt - bufferMs;
|
|
398
|
+
}
|
|
399
|
+
function cacheFilePath(dir, key) {
|
|
400
|
+
return path.join(dir, `${exchangedJwtCacheKey(key)}.json`);
|
|
401
|
+
}
|
|
402
|
+
/** 読む。自分だけが読める(group/other のビットが立っていない)ファイルしか信じない */
|
|
403
|
+
function readCachedJwt(file) {
|
|
404
|
+
try {
|
|
405
|
+
const st = fs.statSync(file);
|
|
406
|
+
if ((st.mode & 0o077) !== 0)
|
|
407
|
+
return null;
|
|
408
|
+
if (typeof process.getuid === 'function' && st.uid !== process.getuid())
|
|
409
|
+
return null;
|
|
410
|
+
return parseCachedExchangedJwt(fs.readFileSync(file, 'utf8'));
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
function writeCachedJwt(file, c) {
|
|
417
|
+
try {
|
|
418
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
419
|
+
const tmp = `${file}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`;
|
|
420
|
+
fs.writeFileSync(tmp, JSON.stringify(c) + '\n', { mode: 0o600 });
|
|
421
|
+
fs.chmodSync(tmp, 0o600); // umask に依らず 600
|
|
422
|
+
fs.renameSync(tmp, file);
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
// 書けなくても今回の JWT は返す(次のプロセスがもう 1 回取るだけ)
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/** ロックを取る。取れたら true。古いロック(持ち主が死んだ)は 1 回だけ払って取り直す */
|
|
429
|
+
function tryLock(lockFile, nowMs) {
|
|
430
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
431
|
+
try {
|
|
432
|
+
fs.mkdirSync(path.dirname(lockFile), { recursive: true, mode: 0o700 });
|
|
433
|
+
fs.closeSync(fs.openSync(lockFile, 'wx', 0o600));
|
|
434
|
+
return true;
|
|
435
|
+
}
|
|
436
|
+
catch (e) {
|
|
437
|
+
if (e.code !== 'EEXIST')
|
|
438
|
+
return false;
|
|
439
|
+
try {
|
|
440
|
+
if (nowMs - fs.statSync(lockFile).mtimeMs <= EXCHANGED_JWT_LOCK_STALE_MS)
|
|
441
|
+
return false;
|
|
442
|
+
fs.unlinkSync(lockFile);
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
function unlock(lockFile) {
|
|
452
|
+
try {
|
|
453
|
+
fs.unlinkSync(lockFile);
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
// 消えていても構わない
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
460
|
+
/**
|
|
461
|
+
* 機体で共有する JWT を返す。使える JWT がファイルに在れば口に出ない。
|
|
462
|
+
* 無い/切れかけなら、ロックを取った 1 プロセスだけが exchange して書く。他はその間ファイルを待つ
|
|
463
|
+
* (lockWaitMs を過ぎたら自分で取る)。exchange の失敗は throw のまま返す。
|
|
464
|
+
*/
|
|
465
|
+
export async function getExchangedJwt(options) {
|
|
466
|
+
const now = options.now ?? Date.now;
|
|
467
|
+
const bufferMs = options.refreshBufferMs ?? EXCHANGED_JWT_REFRESH_BUFFER_MS;
|
|
468
|
+
const file = cacheFilePath(options.cacheDir ?? getExchangedJwtCacheDir(), options.key);
|
|
469
|
+
const usable = () => {
|
|
470
|
+
const c = readCachedJwt(file);
|
|
471
|
+
return c && isCachedExchangedJwtUsable(c, now(), bufferMs) ? c.token : null;
|
|
472
|
+
};
|
|
473
|
+
const hit = usable();
|
|
474
|
+
if (hit)
|
|
475
|
+
return hit;
|
|
476
|
+
const lockFile = `${file}.lock`;
|
|
477
|
+
const waitUntil = now() + Math.max(0, options.lockWaitMs ?? EXCHANGED_JWT_LOCK_WAIT_MS);
|
|
478
|
+
let locked = tryLock(lockFile, now());
|
|
479
|
+
while (!locked && now() < waitUntil) {
|
|
480
|
+
await sleep(LOCK_POLL_MS);
|
|
481
|
+
const fresh = usable();
|
|
482
|
+
if (fresh)
|
|
483
|
+
return fresh;
|
|
484
|
+
locked = tryLock(lockFile, now());
|
|
485
|
+
}
|
|
486
|
+
try {
|
|
487
|
+
if (locked) {
|
|
488
|
+
// ロックを待っている間に他のプロセスが書いたかもしれない
|
|
489
|
+
const fresh = usable();
|
|
490
|
+
if (fresh)
|
|
491
|
+
return fresh;
|
|
492
|
+
}
|
|
493
|
+
const got = await options.exchange();
|
|
494
|
+
writeCachedJwt(file, { token: got.token, expiresAt: now() + got.expiresInSec * 1000 });
|
|
495
|
+
return got.token;
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
if (locked)
|
|
499
|
+
unlock(lockFile);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* 受け手に拒まれた(401)JWT を捨てる。ファイルの中身が `rejectedToken` のときだけ消す
|
|
504
|
+
* (その間に他のプロセスが書いた新しい JWT は消さない)。throw しない。
|
|
505
|
+
*/
|
|
506
|
+
export function evictExchangedJwt(key, rejectedToken, cacheDir = getExchangedJwtCacheDir()) {
|
|
507
|
+
const file = cacheFilePath(cacheDir, key);
|
|
508
|
+
try {
|
|
509
|
+
if (parseCachedExchangedJwt(fs.readFileSync(file, 'utf8'))?.token === rejectedToken)
|
|
510
|
+
fs.unlinkSync(file);
|
|
511
|
+
}
|
|
512
|
+
catch {
|
|
513
|
+
// 無ければ何もしない
|
|
514
|
+
}
|
|
515
|
+
}
|
|
193
516
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|