kiri-mcp-server 0.23.0 → 0.24.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 +1 -1
- package/dist/package.json +1 -1
- package/dist/src/client/connection-manager.d.ts +151 -0
- package/dist/src/client/connection-manager.d.ts.map +1 -0
- package/dist/src/client/connection-manager.js +375 -0
- package/dist/src/client/connection-manager.js.map +1 -0
- package/dist/src/client/proxy.d.ts +3 -0
- package/dist/src/client/proxy.d.ts.map +1 -1
- package/dist/src/client/proxy.js +149 -25
- package/dist/src/client/proxy.js.map +1 -1
- package/dist/src/client/request-queue.d.ts +103 -0
- package/dist/src/client/request-queue.d.ts.map +1 -0
- package/dist/src/client/request-queue.js +203 -0
- package/dist/src/client/request-queue.js.map +1 -0
- package/dist/src/shared/utils/retry.d.ts +16 -1
- package/dist/src/shared/utils/retry.d.ts.map +1 -1
- package/dist/src/shared/utils/retry.js +23 -3
- package/dist/src/shared/utils/retry.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Intelligent code context extraction for LLMs via Model Context Protocol
|
|
4
4
|
|
|
5
|
-
[](package.json)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
[](https://modelcontextprotocol.io/)
|
package/dist/package.json
CHANGED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConnectionManager - ソケット接続の確立・維持・再接続を管理
|
|
3
|
+
*
|
|
4
|
+
* @see Issue #156: MCP接続がデーモン再起動時に切断され、自動再接続しない問題への対応
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from "events";
|
|
7
|
+
import * as net from "net";
|
|
8
|
+
import { RequestQueue } from "./request-queue.js";
|
|
9
|
+
/**
|
|
10
|
+
* 接続状態
|
|
11
|
+
*/
|
|
12
|
+
export type ConnectionStatus = "disconnected" | "connecting" | "connected" | "reconnecting";
|
|
13
|
+
/**
|
|
14
|
+
* 接続状態の詳細情報
|
|
15
|
+
*/
|
|
16
|
+
export interface ConnectionState {
|
|
17
|
+
status: ConnectionStatus;
|
|
18
|
+
lastConnectedAt?: number;
|
|
19
|
+
disconnectedAt?: number;
|
|
20
|
+
reconnectAttempt: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* エラーが再接続可能かどうかを判定
|
|
24
|
+
*/
|
|
25
|
+
export declare function isRetriableError(error: unknown): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* ConnectionManagerのオプション
|
|
28
|
+
*/
|
|
29
|
+
export interface ConnectionManagerOptions {
|
|
30
|
+
/** ソケットパス */
|
|
31
|
+
socketPath: string;
|
|
32
|
+
/** データベースパス(デーモン起動用) */
|
|
33
|
+
databasePath: string;
|
|
34
|
+
/** リポジトリルート(デーモン起動用) */
|
|
35
|
+
repoRoot: string;
|
|
36
|
+
/** 最大再接続試行回数。デフォルト: 10 */
|
|
37
|
+
maxReconnectAttempts?: number | undefined;
|
|
38
|
+
/** 初期再接続遅延(ミリ秒)。デフォルト: 500 */
|
|
39
|
+
reconnectInitialDelayMs?: number | undefined;
|
|
40
|
+
/** 最大再接続遅延(ミリ秒)。デフォルト: 30000 */
|
|
41
|
+
reconnectMaxDelayMs?: number | undefined;
|
|
42
|
+
/** バックオフ倍率。デフォルト: 2 */
|
|
43
|
+
backoffMultiplier?: number | undefined;
|
|
44
|
+
/** ジッター(ミリ秒)。デフォルト: 100 */
|
|
45
|
+
jitterMs?: number | undefined;
|
|
46
|
+
/** リクエストキュー(外部から注入可能) */
|
|
47
|
+
requestQueue?: RequestQueue | undefined;
|
|
48
|
+
/** ウォッチモード */
|
|
49
|
+
watchMode?: boolean | undefined;
|
|
50
|
+
/** デバウンス時間(ミリ秒) */
|
|
51
|
+
debounceMs?: number | undefined;
|
|
52
|
+
/** 縮退モード許可 */
|
|
53
|
+
allowDegrade?: boolean | undefined;
|
|
54
|
+
/** セキュリティ設定パス */
|
|
55
|
+
securityConfigPath?: string | undefined;
|
|
56
|
+
/** セキュリティロックパス */
|
|
57
|
+
securityLockPath?: string | undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* ConnectionManagerイベント
|
|
61
|
+
*/
|
|
62
|
+
export interface ConnectionManagerEvents {
|
|
63
|
+
connected: [];
|
|
64
|
+
disconnected: [reason: string];
|
|
65
|
+
reconnecting: [attempt: number, maxAttempts: number, delayMs: number];
|
|
66
|
+
reconnected: [];
|
|
67
|
+
maxRetriesExceeded: [];
|
|
68
|
+
data: [data: Buffer];
|
|
69
|
+
error: [error: Error];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 接続マネージャー
|
|
73
|
+
*
|
|
74
|
+
* ソケット接続の確立・維持・再接続を管理する。
|
|
75
|
+
* 指数バックオフ付きリトライ戦略を提供する。
|
|
76
|
+
*/
|
|
77
|
+
export declare class ConnectionManager extends EventEmitter {
|
|
78
|
+
private socket;
|
|
79
|
+
private state;
|
|
80
|
+
private readonly socketPath;
|
|
81
|
+
private readonly databasePath;
|
|
82
|
+
private readonly repoRoot;
|
|
83
|
+
private readonly maxReconnectAttempts;
|
|
84
|
+
private readonly reconnectInitialDelayMs;
|
|
85
|
+
private readonly reconnectMaxDelayMs;
|
|
86
|
+
private readonly backoffMultiplier;
|
|
87
|
+
private readonly jitterMs;
|
|
88
|
+
private readonly requestQueue;
|
|
89
|
+
private readonly watchMode;
|
|
90
|
+
private readonly debounceMs;
|
|
91
|
+
private readonly allowDegrade;
|
|
92
|
+
private readonly securityConfigPath;
|
|
93
|
+
private readonly securityLockPath;
|
|
94
|
+
private isReconnecting;
|
|
95
|
+
private isClosed;
|
|
96
|
+
/** 再接続待機中のintervalをトラッキング(close時にクリーンアップ) */
|
|
97
|
+
private pendingWaitIntervals;
|
|
98
|
+
constructor(options: ConnectionManagerOptions);
|
|
99
|
+
/**
|
|
100
|
+
* 型安全なイベント発火
|
|
101
|
+
*/
|
|
102
|
+
emit<K extends keyof ConnectionManagerEvents>(event: K, ...args: ConnectionManagerEvents[K]): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* 型安全なイベントリスナー登録
|
|
105
|
+
*/
|
|
106
|
+
on<K extends keyof ConnectionManagerEvents>(event: K, listener: (...args: ConnectionManagerEvents[K]) => void): this;
|
|
107
|
+
/**
|
|
108
|
+
* 初回接続を確立
|
|
109
|
+
*/
|
|
110
|
+
connect(): Promise<net.Socket>;
|
|
111
|
+
/**
|
|
112
|
+
* 再接続を試行
|
|
113
|
+
*/
|
|
114
|
+
reconnect(): Promise<net.Socket>;
|
|
115
|
+
/**
|
|
116
|
+
* データを送信(キュー経由)
|
|
117
|
+
*
|
|
118
|
+
* 接続中の場合は即座に送信。未接続の場合はキューに追加し、
|
|
119
|
+
* 再接続後にreplayAll()で自動送信される。
|
|
120
|
+
*/
|
|
121
|
+
send(data: string): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* 接続を閉じる
|
|
124
|
+
*/
|
|
125
|
+
close(): void;
|
|
126
|
+
/**
|
|
127
|
+
* 現在の接続状態を取得
|
|
128
|
+
*/
|
|
129
|
+
getState(): ConnectionState;
|
|
130
|
+
/**
|
|
131
|
+
* 現在のソケットを取得
|
|
132
|
+
*/
|
|
133
|
+
getSocket(): net.Socket | null;
|
|
134
|
+
/**
|
|
135
|
+
* リクエストキューを取得
|
|
136
|
+
*/
|
|
137
|
+
getRequestQueue(): RequestQueue;
|
|
138
|
+
/**
|
|
139
|
+
* ソケット接続を作成
|
|
140
|
+
*/
|
|
141
|
+
private createConnection;
|
|
142
|
+
/**
|
|
143
|
+
* ソケットイベントリスナーを設定
|
|
144
|
+
*/
|
|
145
|
+
private setupSocketListeners;
|
|
146
|
+
/**
|
|
147
|
+
* 切断時の処理
|
|
148
|
+
*/
|
|
149
|
+
private handleDisconnection;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=connection-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../src/client/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConnectionManager - ソケット接続の確立・維持・再接続を管理
|
|
3
|
+
*
|
|
4
|
+
* @see Issue #156: MCP接続がデーモン再起動時に切断され、自動再接続しない問題への対応
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from "events";
|
|
7
|
+
import * as net from "net";
|
|
8
|
+
import { calculateBackoffDelay } from "../shared/utils/retry.js";
|
|
9
|
+
import { RequestQueue } from "./request-queue.js";
|
|
10
|
+
import { startDaemon, isDaemonRunning } from "./start-daemon.js";
|
|
11
|
+
/**
|
|
12
|
+
* 再接続可能なエラーコード
|
|
13
|
+
*/
|
|
14
|
+
const RETRIABLE_ERROR_CODES = new Set([
|
|
15
|
+
"ECONNREFUSED", // デーモン未起動
|
|
16
|
+
"EPIPE", // 接続切断
|
|
17
|
+
"ECONNRESET", // 接続リセット
|
|
18
|
+
"ENOENT", // ソケットファイル未作成
|
|
19
|
+
"ETIMEDOUT", // 接続タイムアウト
|
|
20
|
+
]);
|
|
21
|
+
/**
|
|
22
|
+
* エラーが再接続可能かどうかを判定
|
|
23
|
+
*/
|
|
24
|
+
export function isRetriableError(error) {
|
|
25
|
+
if (error instanceof Error) {
|
|
26
|
+
const code = error.code;
|
|
27
|
+
return code !== undefined && RETRIABLE_ERROR_CODES.has(code);
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 接続マネージャー
|
|
33
|
+
*
|
|
34
|
+
* ソケット接続の確立・維持・再接続を管理する。
|
|
35
|
+
* 指数バックオフ付きリトライ戦略を提供する。
|
|
36
|
+
*/
|
|
37
|
+
export class ConnectionManager extends EventEmitter {
|
|
38
|
+
socket = null;
|
|
39
|
+
state = {
|
|
40
|
+
status: "disconnected",
|
|
41
|
+
reconnectAttempt: 0,
|
|
42
|
+
};
|
|
43
|
+
socketPath;
|
|
44
|
+
databasePath;
|
|
45
|
+
repoRoot;
|
|
46
|
+
maxReconnectAttempts;
|
|
47
|
+
reconnectInitialDelayMs;
|
|
48
|
+
reconnectMaxDelayMs;
|
|
49
|
+
backoffMultiplier;
|
|
50
|
+
jitterMs;
|
|
51
|
+
requestQueue;
|
|
52
|
+
watchMode;
|
|
53
|
+
debounceMs;
|
|
54
|
+
allowDegrade;
|
|
55
|
+
securityConfigPath;
|
|
56
|
+
securityLockPath;
|
|
57
|
+
isReconnecting = false;
|
|
58
|
+
isClosed = false;
|
|
59
|
+
/** 再接続待機中のintervalをトラッキング(close時にクリーンアップ) */
|
|
60
|
+
pendingWaitIntervals = new Set();
|
|
61
|
+
constructor(options) {
|
|
62
|
+
super();
|
|
63
|
+
this.socketPath = options.socketPath;
|
|
64
|
+
this.databasePath = options.databasePath;
|
|
65
|
+
this.repoRoot = options.repoRoot;
|
|
66
|
+
this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10;
|
|
67
|
+
this.reconnectInitialDelayMs = options.reconnectInitialDelayMs ?? 500;
|
|
68
|
+
this.reconnectMaxDelayMs = options.reconnectMaxDelayMs ?? 30000;
|
|
69
|
+
this.backoffMultiplier = options.backoffMultiplier ?? 2;
|
|
70
|
+
this.jitterMs = options.jitterMs ?? 100;
|
|
71
|
+
this.requestQueue = options.requestQueue ?? new RequestQueue();
|
|
72
|
+
this.watchMode = options.watchMode ?? false;
|
|
73
|
+
this.debounceMs = options.debounceMs ?? 500;
|
|
74
|
+
this.allowDegrade = options.allowDegrade ?? false;
|
|
75
|
+
this.securityConfigPath = options.securityConfigPath;
|
|
76
|
+
this.securityLockPath = options.securityLockPath;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 型安全なイベント発火
|
|
80
|
+
*/
|
|
81
|
+
emit(event, ...args) {
|
|
82
|
+
return super.emit(event, ...args);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 型安全なイベントリスナー登録
|
|
86
|
+
*/
|
|
87
|
+
on(event, listener) {
|
|
88
|
+
return super.on(event, listener);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 初回接続を確立
|
|
92
|
+
*/
|
|
93
|
+
async connect() {
|
|
94
|
+
if (this.isClosed) {
|
|
95
|
+
throw new Error("ConnectionManager is closed");
|
|
96
|
+
}
|
|
97
|
+
if (this.socket && this.state.status === "connected") {
|
|
98
|
+
return this.socket;
|
|
99
|
+
}
|
|
100
|
+
this.state.status = "connecting";
|
|
101
|
+
// デーモンが起動していない場合は起動(カスタムソケットパスを考慮)
|
|
102
|
+
const running = await isDaemonRunning(this.databasePath, this.socketPath);
|
|
103
|
+
if (!running) {
|
|
104
|
+
console.error("[ConnectionManager] Daemon not running. Starting daemon...");
|
|
105
|
+
await startDaemon({
|
|
106
|
+
repoRoot: this.repoRoot,
|
|
107
|
+
databasePath: this.databasePath,
|
|
108
|
+
socketPath: this.socketPath,
|
|
109
|
+
watchMode: this.watchMode,
|
|
110
|
+
debounceMs: this.debounceMs,
|
|
111
|
+
allowDegrade: this.allowDegrade,
|
|
112
|
+
securityConfigPath: this.securityConfigPath,
|
|
113
|
+
securityLockPath: this.securityLockPath,
|
|
114
|
+
});
|
|
115
|
+
console.error("[ConnectionManager] Daemon started successfully");
|
|
116
|
+
}
|
|
117
|
+
this.socket = await this.createConnection();
|
|
118
|
+
this.setupSocketListeners(this.socket);
|
|
119
|
+
this.state.status = "connected";
|
|
120
|
+
this.state.lastConnectedAt = Date.now();
|
|
121
|
+
this.state.reconnectAttempt = 0;
|
|
122
|
+
this.emit("connected");
|
|
123
|
+
return this.socket;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 再接続を試行
|
|
127
|
+
*/
|
|
128
|
+
async reconnect() {
|
|
129
|
+
if (this.isClosed) {
|
|
130
|
+
throw new Error("ConnectionManager is closed");
|
|
131
|
+
}
|
|
132
|
+
if (this.isReconnecting) {
|
|
133
|
+
// 既に再接続中の場合は完了を待機(タイムアウト付き)
|
|
134
|
+
const waitTimeoutMs = this.maxReconnectAttempts * this.reconnectMaxDelayMs + 10000;
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
const startTime = Date.now();
|
|
137
|
+
const checkInterval = setInterval(() => {
|
|
138
|
+
// タイムアウトチェック
|
|
139
|
+
if (Date.now() - startTime > waitTimeoutMs) {
|
|
140
|
+
clearInterval(checkInterval);
|
|
141
|
+
this.pendingWaitIntervals.delete(checkInterval);
|
|
142
|
+
reject(new Error("Reconnection wait timeout"));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// close()が呼ばれた場合
|
|
146
|
+
if (this.isClosed) {
|
|
147
|
+
clearInterval(checkInterval);
|
|
148
|
+
this.pendingWaitIntervals.delete(checkInterval);
|
|
149
|
+
reject(new Error("ConnectionManager is closed"));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// 再接続完了チェック
|
|
153
|
+
if (!this.isReconnecting) {
|
|
154
|
+
clearInterval(checkInterval);
|
|
155
|
+
this.pendingWaitIntervals.delete(checkInterval);
|
|
156
|
+
if (this.socket && this.state.status === "connected") {
|
|
157
|
+
resolve(this.socket);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
reject(new Error("Reconnection failed"));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}, 100);
|
|
164
|
+
this.pendingWaitIntervals.add(checkInterval);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
this.isReconnecting = true;
|
|
168
|
+
this.state.status = "reconnecting";
|
|
169
|
+
this.state.disconnectedAt = Date.now();
|
|
170
|
+
try {
|
|
171
|
+
for (let attempt = 1; attempt <= this.maxReconnectAttempts; attempt++) {
|
|
172
|
+
this.state.reconnectAttempt = attempt;
|
|
173
|
+
const delayMs = calculateBackoffDelay(this.reconnectInitialDelayMs, attempt, this.backoffMultiplier, this.reconnectMaxDelayMs, this.jitterMs);
|
|
174
|
+
this.emit("reconnecting", attempt, this.maxReconnectAttempts, delayMs);
|
|
175
|
+
console.error(`[ConnectionManager] Reconnection attempt ${attempt}/${this.maxReconnectAttempts} (delay: ${Math.round(delayMs)}ms)`);
|
|
176
|
+
// 遅延
|
|
177
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
178
|
+
// デーモンが起動していない場合は起動を試みる(カスタムソケットパスを考慮)
|
|
179
|
+
const running = await isDaemonRunning(this.databasePath, this.socketPath);
|
|
180
|
+
if (!running) {
|
|
181
|
+
console.error("[ConnectionManager] Daemon not running. Attempting to start...");
|
|
182
|
+
try {
|
|
183
|
+
await startDaemon({
|
|
184
|
+
repoRoot: this.repoRoot,
|
|
185
|
+
databasePath: this.databasePath,
|
|
186
|
+
socketPath: this.socketPath,
|
|
187
|
+
watchMode: this.watchMode,
|
|
188
|
+
debounceMs: this.debounceMs,
|
|
189
|
+
allowDegrade: this.allowDegrade,
|
|
190
|
+
securityConfigPath: this.securityConfigPath,
|
|
191
|
+
securityLockPath: this.securityLockPath,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
catch (startErr) {
|
|
195
|
+
console.error(`[ConnectionManager] Failed to start daemon: ${startErr.message}`);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
// 古いソケットをクリーンアップ
|
|
201
|
+
if (this.socket) {
|
|
202
|
+
this.socket.removeAllListeners();
|
|
203
|
+
this.socket.destroy();
|
|
204
|
+
this.socket = null;
|
|
205
|
+
}
|
|
206
|
+
this.socket = await this.createConnection();
|
|
207
|
+
this.setupSocketListeners(this.socket);
|
|
208
|
+
this.state.status = "connected";
|
|
209
|
+
this.state.lastConnectedAt = Date.now();
|
|
210
|
+
this.state.reconnectAttempt = 0;
|
|
211
|
+
// 保留中のリクエストを再送信
|
|
212
|
+
const replayedCount = await this.requestQueue.replayAll(this.socket);
|
|
213
|
+
if (replayedCount > 0) {
|
|
214
|
+
console.error(`[ConnectionManager] Replayed ${replayedCount} pending requests`);
|
|
215
|
+
}
|
|
216
|
+
this.emit("reconnected");
|
|
217
|
+
console.error("[ConnectionManager] Reconnected to daemon successfully");
|
|
218
|
+
return this.socket;
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
console.error(`[ConnectionManager] Reconnection attempt ${attempt} failed: ${err.message}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// 最大リトライ回数超過
|
|
225
|
+
this.state.status = "disconnected";
|
|
226
|
+
this.emit("maxRetriesExceeded");
|
|
227
|
+
console.error(`[ConnectionManager] Max reconnection attempts (${this.maxReconnectAttempts}) exceeded`);
|
|
228
|
+
throw new Error(`Failed to reconnect after ${this.maxReconnectAttempts} attempts`);
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
this.isReconnecting = false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* データを送信(キュー経由)
|
|
236
|
+
*
|
|
237
|
+
* 接続中の場合は即座に送信。未接続の場合はキューに追加し、
|
|
238
|
+
* 再接続後にreplayAll()で自動送信される。
|
|
239
|
+
*/
|
|
240
|
+
async send(data) {
|
|
241
|
+
// 接続中の場合は即座に送信
|
|
242
|
+
if (this.socket && this.state.status === "connected") {
|
|
243
|
+
// キューに追加(レスポンス受信時にdequeueされる)
|
|
244
|
+
this.requestQueue.enqueue(data);
|
|
245
|
+
return new Promise((resolve, reject) => {
|
|
246
|
+
this.socket.write(data + "\n", (err) => {
|
|
247
|
+
if (err) {
|
|
248
|
+
reject(err);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
resolve();
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// 未接続の場合はキューに追加して再接続
|
|
257
|
+
// 再接続成功時にreplayAll()で自動送信されるため、ここでは送信しない
|
|
258
|
+
this.requestQueue.enqueue(data);
|
|
259
|
+
await this.reconnect();
|
|
260
|
+
// replayAll()で既に送信済みなので、追加の送信は不要
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* 接続を閉じる
|
|
264
|
+
*/
|
|
265
|
+
close() {
|
|
266
|
+
this.isClosed = true;
|
|
267
|
+
this.requestQueue.clear();
|
|
268
|
+
// 待機中のintervalをすべてクリア
|
|
269
|
+
for (const interval of this.pendingWaitIntervals) {
|
|
270
|
+
clearInterval(interval);
|
|
271
|
+
}
|
|
272
|
+
this.pendingWaitIntervals.clear();
|
|
273
|
+
if (this.socket) {
|
|
274
|
+
this.socket.removeAllListeners();
|
|
275
|
+
this.socket.destroy();
|
|
276
|
+
this.socket = null;
|
|
277
|
+
}
|
|
278
|
+
this.state.status = "disconnected";
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 現在の接続状態を取得
|
|
282
|
+
*/
|
|
283
|
+
getState() {
|
|
284
|
+
return { ...this.state };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* 現在のソケットを取得
|
|
288
|
+
*/
|
|
289
|
+
getSocket() {
|
|
290
|
+
return this.socket;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* リクエストキューを取得
|
|
294
|
+
*/
|
|
295
|
+
getRequestQueue() {
|
|
296
|
+
return this.requestQueue;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* ソケット接続を作成
|
|
300
|
+
*/
|
|
301
|
+
createConnection() {
|
|
302
|
+
return new Promise((resolve, reject) => {
|
|
303
|
+
const socket = net.connect(this.socketPath);
|
|
304
|
+
const onConnect = () => {
|
|
305
|
+
socket.removeListener("error", onError);
|
|
306
|
+
resolve(socket);
|
|
307
|
+
};
|
|
308
|
+
const onError = (err) => {
|
|
309
|
+
socket.removeListener("connect", onConnect);
|
|
310
|
+
reject(err);
|
|
311
|
+
};
|
|
312
|
+
socket.once("connect", onConnect);
|
|
313
|
+
socket.once("error", onError);
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* ソケットイベントリスナーを設定
|
|
318
|
+
*/
|
|
319
|
+
setupSocketListeners(socket) {
|
|
320
|
+
socket.on("data", (data) => {
|
|
321
|
+
this.emit("data", data);
|
|
322
|
+
// レスポンスを受信したらキューから削除
|
|
323
|
+
try {
|
|
324
|
+
const lines = data
|
|
325
|
+
.toString()
|
|
326
|
+
.split("\n")
|
|
327
|
+
.filter((line) => line.trim());
|
|
328
|
+
for (const line of lines) {
|
|
329
|
+
const response = JSON.parse(line);
|
|
330
|
+
if (response.id !== undefined && response.id !== null) {
|
|
331
|
+
this.requestQueue.dequeue(response.id);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
// JSONパースエラーは無視
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
socket.on("end", () => {
|
|
340
|
+
console.error("[ConnectionManager] Connection ended");
|
|
341
|
+
this.emit("disconnected", "Connection ended");
|
|
342
|
+
this.handleDisconnection();
|
|
343
|
+
});
|
|
344
|
+
socket.on("error", (err) => {
|
|
345
|
+
console.error(`[ConnectionManager] Socket error: ${err.message}`);
|
|
346
|
+
this.emit("error", err);
|
|
347
|
+
if (isRetriableError(err)) {
|
|
348
|
+
this.emit("disconnected", `Socket error: ${err.message}`);
|
|
349
|
+
this.handleDisconnection();
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
socket.on("close", () => {
|
|
353
|
+
if (this.state.status === "connected") {
|
|
354
|
+
console.error("[ConnectionManager] Connection closed");
|
|
355
|
+
this.emit("disconnected", "Connection closed");
|
|
356
|
+
this.handleDisconnection();
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* 切断時の処理
|
|
362
|
+
*/
|
|
363
|
+
handleDisconnection() {
|
|
364
|
+
if (this.isClosed || this.isReconnecting) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
this.state.status = "disconnected";
|
|
368
|
+
this.state.disconnectedAt = Date.now();
|
|
369
|
+
// 自動再接続を開始
|
|
370
|
+
this.reconnect().catch((err) => {
|
|
371
|
+
console.error(`[ConnectionManager] Auto-reconnection failed: ${err.message}`);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=connection-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../../src/client/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Transparently bridges stdio (MCP client) ↔ Unix socket (daemon).
|
|
6
6
|
* Auto-starts daemon if not running, handles retries and fallback.
|
|
7
|
+
* Supports automatic reconnection on daemon restart.
|
|
8
|
+
*
|
|
9
|
+
* @see Issue #156: MCP接続がデーモン再起動時に切断され、自動再接続しない問題への対応
|
|
7
10
|
*/
|
|
8
11
|
export {};
|
|
9
12
|
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/client/proxy.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/client/proxy.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/src/client/proxy.js
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Transparently bridges stdio (MCP client) ↔ Unix socket (daemon).
|
|
6
6
|
* Auto-starts daemon if not running, handles retries and fallback.
|
|
7
|
+
* Supports automatic reconnection on daemon restart.
|
|
8
|
+
*
|
|
9
|
+
* @see Issue #156: MCP接続がデーモン再起動時に切断され、自動再接続しない問題への対応
|
|
7
10
|
*/
|
|
8
11
|
import { spawn } from "child_process";
|
|
9
12
|
import * as net from "net";
|
|
@@ -14,6 +17,7 @@ import packageJson from "../../package.json" with { type: "json" };
|
|
|
14
17
|
import { defineCli } from "../shared/cli/args.js";
|
|
15
18
|
import { getSocketPath } from "../shared/utils/socket.js";
|
|
16
19
|
import { parsePositiveInt } from "../shared/utils/validation.js";
|
|
20
|
+
import { ConnectionManager, isRetriableError } from "./connection-manager.js";
|
|
17
21
|
import { startDaemon, isDaemonRunning, stopDaemon } from "./start-daemon.js";
|
|
18
22
|
/** Delay after stopping daemon before starting new processes */
|
|
19
23
|
const DAEMON_STOP_WAIT_MS = 1000;
|
|
@@ -122,6 +126,32 @@ const PROXY_CLI_SPEC = {
|
|
|
122
126
|
},
|
|
123
127
|
],
|
|
124
128
|
},
|
|
129
|
+
{
|
|
130
|
+
title: "Reconnection",
|
|
131
|
+
options: [
|
|
132
|
+
{
|
|
133
|
+
flag: "max-reconnect-attempts",
|
|
134
|
+
type: "string",
|
|
135
|
+
description: "Maximum number of reconnection attempts (default: 10)",
|
|
136
|
+
placeholder: "<count>",
|
|
137
|
+
default: "10",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
flag: "reconnect-delay",
|
|
141
|
+
type: "string",
|
|
142
|
+
description: "Initial reconnection delay in milliseconds (default: 500)",
|
|
143
|
+
placeholder: "<ms>",
|
|
144
|
+
default: "500",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
flag: "reconnect-max-delay",
|
|
148
|
+
type: "string",
|
|
149
|
+
description: "Maximum reconnection delay in milliseconds (default: 30000)",
|
|
150
|
+
placeholder: "<ms>",
|
|
151
|
+
default: "30000",
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
125
155
|
],
|
|
126
156
|
examples: [
|
|
127
157
|
"kiri --repo /path/to/repo --db /path/to/index.duckdb",
|
|
@@ -151,6 +181,9 @@ function parseProxyArgs() {
|
|
|
151
181
|
securityConfigPath: values["security-config"],
|
|
152
182
|
securityLockPath: values["security-lock"],
|
|
153
183
|
fullIndex: values.full || false,
|
|
184
|
+
maxReconnectAttempts: parsePositiveInt(values["max-reconnect-attempts"], 10, "max reconnect attempts"),
|
|
185
|
+
reconnectInitialDelayMs: parsePositiveInt(values["reconnect-delay"], 500, "reconnect delay"),
|
|
186
|
+
reconnectMaxDelayMs: parsePositiveInt(values["reconnect-max-delay"], 30000, "reconnect max delay"),
|
|
154
187
|
};
|
|
155
188
|
}
|
|
156
189
|
/**
|
|
@@ -207,7 +240,7 @@ async function checkDaemonVersion(socket) {
|
|
|
207
240
|
/**
|
|
208
241
|
* デーモンに接続を試みる(リトライロジック付き)
|
|
209
242
|
*/
|
|
210
|
-
async function
|
|
243
|
+
async function _connectToDaemon(socketPath, maxRetries, retryDelayMs) {
|
|
211
244
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
212
245
|
try {
|
|
213
246
|
const socket = net.connect(socketPath);
|
|
@@ -228,12 +261,82 @@ async function connectToDaemon(socketPath, maxRetries, retryDelayMs) {
|
|
|
228
261
|
}
|
|
229
262
|
}
|
|
230
263
|
}
|
|
231
|
-
throw new Error("Unexpected error in
|
|
264
|
+
throw new Error("Unexpected error in _connectToDaemon");
|
|
232
265
|
}
|
|
233
266
|
/**
|
|
234
|
-
* Stdio ↔ Socket
|
|
267
|
+
* Stdio ↔ Socket ブリッジを確立(再接続対応版)
|
|
268
|
+
*
|
|
269
|
+
* ConnectionManagerを使用して、デーモン再起動時も自動的に再接続を試みる。
|
|
270
|
+
* 再接続中のリクエストはRequestQueueでバッファリングされ、再接続後に再送信される。
|
|
271
|
+
*
|
|
272
|
+
* @see Issue #156
|
|
235
273
|
*/
|
|
236
|
-
function
|
|
274
|
+
function createReconnectingBridge(connectionManager) {
|
|
275
|
+
const requestQueue = connectionManager.getRequestQueue();
|
|
276
|
+
// stdin → socket
|
|
277
|
+
const stdinReader = readline.createInterface({
|
|
278
|
+
input: process.stdin,
|
|
279
|
+
crlfDelay: Infinity,
|
|
280
|
+
});
|
|
281
|
+
stdinReader.on("line", async (line) => {
|
|
282
|
+
// リクエストをキューに追加
|
|
283
|
+
requestQueue.enqueue(line);
|
|
284
|
+
const socket = connectionManager.getSocket();
|
|
285
|
+
if (socket && connectionManager.getState().status === "connected") {
|
|
286
|
+
try {
|
|
287
|
+
socket.write(line + "\n");
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
console.error(`[Proxy] Write error: ${err.message}`);
|
|
291
|
+
// 書き込みエラーは無視(再接続時に再送信される)
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// 接続されていない場合、リクエストはキューに保持され、再接続後に再送信される
|
|
295
|
+
});
|
|
296
|
+
stdinReader.on("close", () => {
|
|
297
|
+
connectionManager.close();
|
|
298
|
+
process.exit(0);
|
|
299
|
+
});
|
|
300
|
+
// socket → stdout のイベントリスナーを設定
|
|
301
|
+
// Note: dequeue処理はConnectionManager.setupSocketListeners()で行われる
|
|
302
|
+
connectionManager.on("data", (data) => {
|
|
303
|
+
// 改行区切りでレスポンスを処理し、stdoutへ出力
|
|
304
|
+
const lines = data
|
|
305
|
+
.toString()
|
|
306
|
+
.split("\n")
|
|
307
|
+
.filter((line) => line.trim());
|
|
308
|
+
for (const line of lines) {
|
|
309
|
+
console.log(line);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
// 再接続イベントのログ出力
|
|
313
|
+
connectionManager.on("reconnecting", (attempt, maxAttempts, delayMs) => {
|
|
314
|
+
console.error(`[Proxy] Reconnection attempt ${attempt}/${maxAttempts} (delay: ${Math.round(delayMs)}ms)`);
|
|
315
|
+
});
|
|
316
|
+
connectionManager.on("reconnected", () => {
|
|
317
|
+
console.error("[Proxy] Reconnected to daemon successfully");
|
|
318
|
+
});
|
|
319
|
+
connectionManager.on("disconnected", (reason) => {
|
|
320
|
+
console.error(`[Proxy] Connection lost: ${reason}. Attempting reconnection...`);
|
|
321
|
+
});
|
|
322
|
+
connectionManager.on("maxRetriesExceeded", () => {
|
|
323
|
+
console.error("[Proxy] Max reconnection attempts exceeded. Exiting.");
|
|
324
|
+
process.exit(1);
|
|
325
|
+
});
|
|
326
|
+
connectionManager.on("error", (err) => {
|
|
327
|
+
if (!isRetriableError(err)) {
|
|
328
|
+
console.error(`[Proxy] Fatal socket error: ${err.message}`);
|
|
329
|
+
process.exit(1);
|
|
330
|
+
}
|
|
331
|
+
// 再接続可能なエラーはConnectionManagerが自動的に処理
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Stdio ↔ Socket ブリッジを確立(レガシー版、後方互換性のために残す)
|
|
336
|
+
*
|
|
337
|
+
* @deprecated createReconnectingBridgeを使用してください
|
|
338
|
+
*/
|
|
339
|
+
function _bridgeStdioToSocket(socket) {
|
|
237
340
|
// stdin → socket
|
|
238
341
|
const stdinReader = readline.createInterface({
|
|
239
342
|
input: process.stdin,
|
|
@@ -322,6 +425,10 @@ async function handleFullIndex(options) {
|
|
|
322
425
|
}
|
|
323
426
|
/**
|
|
324
427
|
* メイン関数:プロキシを起動
|
|
428
|
+
*
|
|
429
|
+
* ConnectionManagerを使用して、デーモン再起動時も自動的に再接続を試みる。
|
|
430
|
+
*
|
|
431
|
+
* @see Issue #156
|
|
325
432
|
*/
|
|
326
433
|
async function main() {
|
|
327
434
|
const options = parseProxyArgs();
|
|
@@ -331,16 +438,22 @@ async function main() {
|
|
|
331
438
|
return; // Exit without starting MCP proxy
|
|
332
439
|
}
|
|
333
440
|
try {
|
|
334
|
-
//
|
|
335
|
-
const
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
441
|
+
// ConnectionManagerを作成
|
|
442
|
+
const connectionManager = new ConnectionManager({
|
|
443
|
+
socketPath: options.socketPath,
|
|
444
|
+
databasePath: options.databasePath,
|
|
445
|
+
repoRoot: options.repoRoot,
|
|
446
|
+
maxReconnectAttempts: options.maxReconnectAttempts,
|
|
447
|
+
reconnectInitialDelayMs: options.reconnectInitialDelayMs,
|
|
448
|
+
reconnectMaxDelayMs: options.reconnectMaxDelayMs,
|
|
449
|
+
watchMode: options.watchMode,
|
|
450
|
+
debounceMs: options.debounceMs,
|
|
451
|
+
allowDegrade: options.allowDegrade,
|
|
452
|
+
securityConfigPath: options.securityConfigPath,
|
|
453
|
+
securityLockPath: options.securityLockPath,
|
|
454
|
+
});
|
|
455
|
+
// 初回接続
|
|
456
|
+
const socket = await connectionManager.connect();
|
|
344
457
|
// バージョン互換性をチェック
|
|
345
458
|
try {
|
|
346
459
|
await checkDaemonVersion(socket);
|
|
@@ -351,28 +464,39 @@ async function main() {
|
|
|
351
464
|
if (versionErr.message.includes("Version mismatch")) {
|
|
352
465
|
console.error(`[Proxy] ${versionErr.message}`);
|
|
353
466
|
console.error("[Proxy] Automatically restarting daemon with current version...");
|
|
354
|
-
|
|
467
|
+
connectionManager.close();
|
|
355
468
|
// 古いデーモンを停止
|
|
356
469
|
await stopDaemon(options.databasePath);
|
|
357
470
|
// 少し待ってから新しいデーモンを起動
|
|
358
471
|
await new Promise((resolve) => setTimeout(resolve, DAEMON_STOP_WAIT_MS));
|
|
359
|
-
//
|
|
360
|
-
|
|
472
|
+
// 新しいConnectionManagerを作成して再接続
|
|
473
|
+
const newConnectionManager = new ConnectionManager({
|
|
474
|
+
socketPath: options.socketPath,
|
|
475
|
+
databasePath: options.databasePath,
|
|
476
|
+
repoRoot: options.repoRoot,
|
|
477
|
+
maxReconnectAttempts: options.maxReconnectAttempts,
|
|
478
|
+
reconnectInitialDelayMs: options.reconnectInitialDelayMs,
|
|
479
|
+
reconnectMaxDelayMs: options.reconnectMaxDelayMs,
|
|
480
|
+
watchMode: options.watchMode,
|
|
481
|
+
debounceMs: options.debounceMs,
|
|
482
|
+
allowDegrade: options.allowDegrade,
|
|
483
|
+
securityConfigPath: options.securityConfigPath,
|
|
484
|
+
securityLockPath: options.securityLockPath,
|
|
485
|
+
});
|
|
486
|
+
const newSocket = await newConnectionManager.connect();
|
|
361
487
|
console.error("[Proxy] Daemon restarted successfully, reconnecting...");
|
|
362
|
-
// 再接続を試みる
|
|
363
|
-
const newSocket = await connectToDaemon(options.socketPath, options.maxRetries, options.retryDelayMs);
|
|
364
488
|
// 再度バージョンチェック
|
|
365
489
|
await checkDaemonVersion(newSocket);
|
|
366
|
-
console.error("[Proxy] Connected to daemon. Bridging stdio ↔ socket...");
|
|
367
|
-
// Stdio ↔ Socket
|
|
368
|
-
|
|
490
|
+
console.error("[Proxy] Connected to daemon. Bridging stdio ↔ socket (with reconnection support)...");
|
|
491
|
+
// Stdio ↔ Socket ブリッジを確立(再接続対応版)
|
|
492
|
+
createReconnectingBridge(newConnectionManager);
|
|
369
493
|
return;
|
|
370
494
|
}
|
|
371
495
|
throw versionError;
|
|
372
496
|
}
|
|
373
|
-
console.error("[Proxy] Connected to daemon. Bridging stdio ↔ socket...");
|
|
374
|
-
// Stdio ↔ Socket
|
|
375
|
-
|
|
497
|
+
console.error("[Proxy] Connected to daemon. Bridging stdio ↔ socket (with reconnection support)...");
|
|
498
|
+
// Stdio ↔ Socket ブリッジを確立(再接続対応版)
|
|
499
|
+
createReconnectingBridge(connectionManager);
|
|
376
500
|
}
|
|
377
501
|
catch (err) {
|
|
378
502
|
const error = err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/client/proxy.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/client/proxy.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,EAAE,SAAS,EAAgB,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7E,gEAAgE;AAChE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAyBjC;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAqB;IAC/C,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,cAAc,GAAY;IAC9B,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE,2EAA2E;IACxF,OAAO,EAAE,WAAW,CAAC,OAAO;IAC5B,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE;QACR;YACE,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sBAAsB;oBACnC,WAAW,EAAE,QAAQ;oBACrB,OAAO,EAAE,GAAG;iBACb;gBACD;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mEAAmE;oBAChF,WAAW,EAAE,QAAQ;iBACtB;aACF;SACF;QACD;YACE,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wCAAwC;oBACrD,WAAW,EAAE,QAAQ;iBACtB;aACF;SACF;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,6CAA6C;oBAC1D,OAAO,EAAE,KAAK;iBACf;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+CAA+C;oBAC5D,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,KAAK;iBACf;aACF;SACF;QACD;YACE,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,gDAAgD;oBAC7D,OAAO,EAAE,KAAK;iBACf;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;oBAC/C,WAAW,EAAE,QAAQ;iBACtB;gBACD;oBACE,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;oBACtC,WAAW,EAAE,QAAQ;iBACtB;aACF;SACF;QACD;YACE,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS;oBACf,WAAW,EACT,8EAA8E;oBAChF,OAAO,EAAE,KAAK;iBACf;aACF;SACF;QACD;YACE,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,wBAAwB;oBAC9B,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uDAAuD;oBACpE,WAAW,EAAE,SAAS;oBACtB,OAAO,EAAE,IAAI;iBACd;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;oBACxE,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,KAAK;iBACf;gBACD;oBACE,IAAI,EAAE,qBAAqB;oBAC3B,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6DAA6D;oBAC1E,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,OAAO;iBACjB;aACF;SACF;KACF;IACD,QAAQ,EAAE;QACR,sDAAsD;QACtD,8BAA8B;QAC9B,6CAA6C;KAC9C;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc;IACrB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAE,MAAM,CAAC,IAA2B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAC9B,MAAM,CAAC,EAAyB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAChF,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAW,CAAC;QAC/C,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAEhC,OAAO;QACL,QAAQ;QACR,YAAY;QACZ,UAAU;QACV,SAAS,EAAG,MAAM,CAAC,KAAiB,IAAI,KAAK;QAC7C,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAA8B,EAAE,GAAG,EAAE,gBAAgB,CAAC;QAC1F,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,IAAI;QAClB,YAAY,EAAG,MAAM,CAAC,eAAe,CAAa,IAAI,KAAK;QAC3D,kBAAkB,EAAE,MAAM,CAAC,iBAAiB,CAAuB;QACnE,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAuB;QAC/D,SAAS,EAAG,MAAM,CAAC,IAAgB,IAAI,KAAK;QAC5C,oBAAoB,EAAE,gBAAgB,CACpC,MAAM,CAAC,wBAAwB,CAAuB,EACtD,EAAE,EACF,wBAAwB,CACzB;QACD,uBAAuB,EAAE,gBAAgB,CACvC,MAAM,CAAC,iBAAiB,CAAuB,EAC/C,GAAG,EACH,iBAAiB,CAClB;QACD,mBAAmB,EAAE,gBAAgB,CACnC,MAAM,CAAC,qBAAqB,CAAuB,EACnD,KAAK,EACL,qBAAqB,CACtB;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAAC,MAAkB;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC7C,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,2BAA2B;QAC3B,MAAM,WAAW,GAAG;YAClB,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,MAAM;SACf,CAAC;QAEF,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE;YACnC,IAAI,gBAAgB;gBAAE,OAAO;YAE7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpD,IAAI,QAAQ,CAAC,EAAE,KAAK,eAAe,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACvD,gBAAgB,GAAG,IAAI,CAAC;oBACxB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;oBAE3C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC;oBACvE,MAAM,aAAa,GACjB,OAAO,WAAW,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;oBAE3E,uBAAuB;oBACvB,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACxE,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAExE,IAAI,gBAAgB,KAAK,gBAAgB,EAAE,CAAC;wBAC1C,MAAM,CACJ,IAAI,KAAK,CACP,4BAA4B,aAAa,gCAAgC,aAAa,kDAAkD,CACzI,CACF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CACX,wCAAwC,aAAa,YAAY,aAAa,EAAE,CACjF,CAAC;wBACF,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC;gBACD,6DAA6D;YAC/D,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,UAAkB,EAClB,UAAkB,EAClB,YAAoB;IAEpB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAEvC,UAAU;YACV,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,8BAA8B,OAAO,IAAI,UAAU,YAAa,GAAa,CAAC,OAAO,EAAE,CACxF,CAAC;YAEF,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,qCAAqC,UAAU,gCAAiC,GAAa,CAAC,OAAO,EAAE,CACxG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAAC,iBAAoC;IACpE,MAAM,YAAY,GAAG,iBAAiB,CAAC,eAAe,EAAE,CAAC;IAEzD,iBAAiB;IACjB,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC;QAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACpC,eAAe;QACf,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAC7C,IAAI,MAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClE,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,wBAAyB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChE,0BAA0B;YAC5B,CAAC;QACH,CAAC;QACD,wCAAwC;IAC1C,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC3B,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAC/B,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACpC,4BAA4B;QAC5B,MAAM,KAAK,GAAG,IAAI;aACf,QAAQ,EAAE;aACV,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;QACrE,OAAO,CAAC,KAAK,CACX,gCAAgC,OAAO,IAAI,WAAW,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAC3F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QACvC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;QAC9C,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,8BAA8B,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,iBAAiB,CAAC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9C,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACpC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,qCAAqC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,MAAkB;IAC9C,iBAAiB;IACjB,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC;QAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,GAAG,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC;QAC5C,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QACpB,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,YAAoB;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,kCAAkC;QAClC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE9D,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EACjE;YACE,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;SACxC,CACF,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,eAAe,CAAC,OAAqB;IAClD,IAAI,CAAC;QACH,uEAAuE;QACvE,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC1D,MAAM,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC/C,CAAC;QAED,gFAAgF;QAChF,OAAO,CAAC,KAAK,CAAC,0CAA0C,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;QAC/E,MAAM,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAEhD,yBAAyB;QACzB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,MAAM,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAY,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,sCAAsC;IACtC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,kCAAkC;IAC5C,CAAC;IAED,IAAI,CAAC;QACH,uBAAuB;QACvB,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;YAC9C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;YAClD,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;YACxD,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC;QAEH,OAAO;QACP,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAEjD,gBAAgB;QAChB,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,YAAqB,CAAC;YACzC,0BAA0B;YAC1B,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBAEjF,iBAAiB,CAAC,KAAK,EAAE,CAAC;gBAE1B,YAAY;gBACZ,MAAM,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAEvC,oBAAoB;gBACpB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;gBAEzE,+BAA+B;gBAC/B,MAAM,oBAAoB,GAAG,IAAI,iBAAiB,CAAC;oBACjD,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;oBAClD,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;oBACxD,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;oBAChD,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;oBAC9C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;iBAC3C,CAAC,CAAC;gBAEH,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBAEvD,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;gBAExE,cAAc;gBACd,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAEpC,OAAO,CAAC,KAAK,CACX,qFAAqF,CACtF,CAAC;gBAEF,iCAAiC;gBACjC,wBAAwB,CAAC,oBAAoB,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YACD,MAAM,YAAY,CAAC;QACrB,CAAC;QAED,OAAO,CAAC,KAAK,CACX,qFAAqF,CACtF,CAAC;QAEF,iCAAiC;QACjC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAY,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,gCAAgC,OAAO,CAAC,YAAY,aAAa,CAAC,CAAC;QACjF,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,YAAY;AACZ,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestQueue - 再接続中のリクエストをバッファリングし、再接続後に再送信する
|
|
3
|
+
*
|
|
4
|
+
* @see Issue #156: MCP接続がデーモン再起動時に切断され、自動再接続しない問題への対応
|
|
5
|
+
*/
|
|
6
|
+
import type * as net from "net";
|
|
7
|
+
/**
|
|
8
|
+
* 保留中のリクエスト情報
|
|
9
|
+
*/
|
|
10
|
+
export interface PendingRequest {
|
|
11
|
+
/** JSON-RPC リクエストID */
|
|
12
|
+
id: string | number;
|
|
13
|
+
/** JSON-RPC リクエスト文字列(送信用) */
|
|
14
|
+
data: string;
|
|
15
|
+
/** 送信時刻(タイムアウト計算用) */
|
|
16
|
+
timestamp: number;
|
|
17
|
+
/** タイムアウト時間(ミリ秒) */
|
|
18
|
+
timeoutMs: number;
|
|
19
|
+
/** リトライ回数 */
|
|
20
|
+
retryCount: number;
|
|
21
|
+
/** タイムアウトタイマーID */
|
|
22
|
+
timeoutTimer?: NodeJS.Timeout;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* RequestQueueのオプション
|
|
26
|
+
*/
|
|
27
|
+
export interface RequestQueueOptions {
|
|
28
|
+
/** リクエストタイムアウト時間(ミリ秒)。デフォルト: 30000 */
|
|
29
|
+
requestTimeoutMs?: number;
|
|
30
|
+
/** 最大保留リクエスト数。デフォルト: 100 */
|
|
31
|
+
maxPendingRequests?: number;
|
|
32
|
+
/** 最大リトライ回数。デフォルト: 3 */
|
|
33
|
+
maxRetryCount?: number;
|
|
34
|
+
/** タイムアウト時のコールバック */
|
|
35
|
+
onTimeout?: (request: PendingRequest) => void;
|
|
36
|
+
/** キュー満杯時のコールバック */
|
|
37
|
+
onQueueFull?: (request: PendingRequest) => void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* JSON-RPCリクエストからIDを抽出するユーティリティ
|
|
41
|
+
*/
|
|
42
|
+
export declare function extractRequestId(data: string): string | number | null;
|
|
43
|
+
/**
|
|
44
|
+
* リクエストキュー
|
|
45
|
+
*
|
|
46
|
+
* 再接続中のリクエストをバッファリングし、再接続後に再送信する。
|
|
47
|
+
* タイムアウト管理とリトライ制限を提供する。
|
|
48
|
+
*/
|
|
49
|
+
export declare class RequestQueue {
|
|
50
|
+
private readonly queue;
|
|
51
|
+
private readonly requestTimeoutMs;
|
|
52
|
+
private readonly maxPendingRequests;
|
|
53
|
+
private readonly maxRetryCount;
|
|
54
|
+
private readonly onTimeout;
|
|
55
|
+
private readonly onQueueFull;
|
|
56
|
+
constructor(options?: RequestQueueOptions);
|
|
57
|
+
/**
|
|
58
|
+
* リクエストをキューに追加
|
|
59
|
+
*
|
|
60
|
+
* @param data - JSON-RPC リクエスト文字列
|
|
61
|
+
* @returns 追加されたリクエスト情報、またはnull(notificationの場合やキュー満杯の場合)
|
|
62
|
+
*/
|
|
63
|
+
enqueue(data: string): PendingRequest | null;
|
|
64
|
+
/**
|
|
65
|
+
* レスポンス受信時にキューからリクエストを削除
|
|
66
|
+
*
|
|
67
|
+
* @param id - JSON-RPC リクエストID
|
|
68
|
+
* @returns 削除されたリクエスト情報、またはundefined
|
|
69
|
+
*/
|
|
70
|
+
dequeue(id: string | number): PendingRequest | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* 再接続後に保留中のリクエストを再送信
|
|
73
|
+
*
|
|
74
|
+
* @param socket - 再接続後のソケット
|
|
75
|
+
* @returns 再送信されたリクエスト数
|
|
76
|
+
*/
|
|
77
|
+
replayAll(socket: net.Socket): Promise<number>;
|
|
78
|
+
/**
|
|
79
|
+
* キュー内のリクエスト数を取得
|
|
80
|
+
*/
|
|
81
|
+
size(): number;
|
|
82
|
+
/**
|
|
83
|
+
* キューをクリア(全リクエストのタイムアウトタイマーも解除)
|
|
84
|
+
*/
|
|
85
|
+
clear(): void;
|
|
86
|
+
/**
|
|
87
|
+
* 全ての保留中リクエストを取得(デバッグ用)
|
|
88
|
+
*/
|
|
89
|
+
getAll(): PendingRequest[];
|
|
90
|
+
/**
|
|
91
|
+
* 特定のリクエストを取得
|
|
92
|
+
*/
|
|
93
|
+
get(id: string | number): PendingRequest | undefined;
|
|
94
|
+
/**
|
|
95
|
+
* タイムアウト処理
|
|
96
|
+
*/
|
|
97
|
+
private handleTimeout;
|
|
98
|
+
/**
|
|
99
|
+
* ソケットへの書き込み(Promise化)
|
|
100
|
+
*/
|
|
101
|
+
private writeToSocket;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=request-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-queue.d.ts","sourceRoot":"","sources":["../../../src/client/request-queue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,KAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,oBAAoB;IACpB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrE;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmD;IACzE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;IAC5E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkD;gBAElE,OAAO,GAAE,mBAAwB;IAQ7C;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IA4C5C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS;IAWxD;;;;;OAKG;IACG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8CpD;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,MAAM,IAAI,cAAc,EAAE;IAI1B;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS;IAIpD;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAWtB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestQueue - 再接続中のリクエストをバッファリングし、再接続後に再送信する
|
|
3
|
+
*
|
|
4
|
+
* @see Issue #156: MCP接続がデーモン再起動時に切断され、自動再接続しない問題への対応
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* JSON-RPCリクエストからIDを抽出するユーティリティ
|
|
8
|
+
*/
|
|
9
|
+
export function extractRequestId(data) {
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(data);
|
|
12
|
+
// JSON-RPC 2.0のidフィールドを取得
|
|
13
|
+
// idがない場合はnotificationなのでキューイング不要
|
|
14
|
+
if (parsed.id !== undefined && parsed.id !== null) {
|
|
15
|
+
return parsed.id;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* リクエストキュー
|
|
25
|
+
*
|
|
26
|
+
* 再接続中のリクエストをバッファリングし、再接続後に再送信する。
|
|
27
|
+
* タイムアウト管理とリトライ制限を提供する。
|
|
28
|
+
*/
|
|
29
|
+
export class RequestQueue {
|
|
30
|
+
queue = new Map();
|
|
31
|
+
requestTimeoutMs;
|
|
32
|
+
maxPendingRequests;
|
|
33
|
+
maxRetryCount;
|
|
34
|
+
onTimeout;
|
|
35
|
+
onQueueFull;
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
this.requestTimeoutMs = options.requestTimeoutMs ?? 30000;
|
|
38
|
+
this.maxPendingRequests = options.maxPendingRequests ?? 100;
|
|
39
|
+
this.maxRetryCount = options.maxRetryCount ?? 3;
|
|
40
|
+
this.onTimeout = options.onTimeout ?? undefined;
|
|
41
|
+
this.onQueueFull = options.onQueueFull ?? undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* リクエストをキューに追加
|
|
45
|
+
*
|
|
46
|
+
* @param data - JSON-RPC リクエスト文字列
|
|
47
|
+
* @returns 追加されたリクエスト情報、またはnull(notificationの場合やキュー満杯の場合)
|
|
48
|
+
*/
|
|
49
|
+
enqueue(data) {
|
|
50
|
+
const id = extractRequestId(data);
|
|
51
|
+
// idがない場合はnotification(応答不要)なのでキューイング不要
|
|
52
|
+
if (id === null) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
// キュー満杯チェック
|
|
56
|
+
if (this.queue.size >= this.maxPendingRequests) {
|
|
57
|
+
const request = {
|
|
58
|
+
id,
|
|
59
|
+
data,
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
timeoutMs: this.requestTimeoutMs,
|
|
62
|
+
retryCount: 0,
|
|
63
|
+
};
|
|
64
|
+
this.onQueueFull?.(request);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
// 既存のリクエストがある場合は上書き(同じIDのリクエストは最新のみ保持)
|
|
68
|
+
const existing = this.queue.get(id);
|
|
69
|
+
if (existing?.timeoutTimer) {
|
|
70
|
+
clearTimeout(existing.timeoutTimer);
|
|
71
|
+
}
|
|
72
|
+
const request = {
|
|
73
|
+
id,
|
|
74
|
+
data,
|
|
75
|
+
timestamp: Date.now(),
|
|
76
|
+
timeoutMs: this.requestTimeoutMs,
|
|
77
|
+
retryCount: existing?.retryCount ?? 0,
|
|
78
|
+
};
|
|
79
|
+
// タイムアウトタイマーを設定
|
|
80
|
+
request.timeoutTimer = setTimeout(() => {
|
|
81
|
+
this.handleTimeout(id);
|
|
82
|
+
}, this.requestTimeoutMs);
|
|
83
|
+
this.queue.set(id, request);
|
|
84
|
+
return request;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* レスポンス受信時にキューからリクエストを削除
|
|
88
|
+
*
|
|
89
|
+
* @param id - JSON-RPC リクエストID
|
|
90
|
+
* @returns 削除されたリクエスト情報、またはundefined
|
|
91
|
+
*/
|
|
92
|
+
dequeue(id) {
|
|
93
|
+
const request = this.queue.get(id);
|
|
94
|
+
if (request) {
|
|
95
|
+
if (request.timeoutTimer) {
|
|
96
|
+
clearTimeout(request.timeoutTimer);
|
|
97
|
+
}
|
|
98
|
+
this.queue.delete(id);
|
|
99
|
+
}
|
|
100
|
+
return request;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 再接続後に保留中のリクエストを再送信
|
|
104
|
+
*
|
|
105
|
+
* @param socket - 再接続後のソケット
|
|
106
|
+
* @returns 再送信されたリクエスト数
|
|
107
|
+
*/
|
|
108
|
+
async replayAll(socket) {
|
|
109
|
+
let replayedCount = 0;
|
|
110
|
+
const toRemove = [];
|
|
111
|
+
for (const [id, request] of this.queue) {
|
|
112
|
+
// リトライ上限チェック
|
|
113
|
+
if (request.retryCount >= this.maxRetryCount) {
|
|
114
|
+
toRemove.push(id);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// リトライ回数を増加
|
|
118
|
+
request.retryCount++;
|
|
119
|
+
// タイムアウトタイマーをリセット
|
|
120
|
+
if (request.timeoutTimer) {
|
|
121
|
+
clearTimeout(request.timeoutTimer);
|
|
122
|
+
}
|
|
123
|
+
request.timeoutTimer = setTimeout(() => {
|
|
124
|
+
this.handleTimeout(id);
|
|
125
|
+
}, this.requestTimeoutMs);
|
|
126
|
+
// ソケットに再送信
|
|
127
|
+
try {
|
|
128
|
+
await this.writeToSocket(socket, request.data);
|
|
129
|
+
replayedCount++;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// 書き込みエラーは無視(次の再接続で再試行)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// リトライ上限に達したリクエストを削除
|
|
136
|
+
for (const id of toRemove) {
|
|
137
|
+
const request = this.queue.get(id);
|
|
138
|
+
if (request?.timeoutTimer) {
|
|
139
|
+
clearTimeout(request.timeoutTimer);
|
|
140
|
+
}
|
|
141
|
+
this.queue.delete(id);
|
|
142
|
+
if (request) {
|
|
143
|
+
this.onTimeout?.(request);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return replayedCount;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* キュー内のリクエスト数を取得
|
|
150
|
+
*/
|
|
151
|
+
size() {
|
|
152
|
+
return this.queue.size;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* キューをクリア(全リクエストのタイムアウトタイマーも解除)
|
|
156
|
+
*/
|
|
157
|
+
clear() {
|
|
158
|
+
for (const request of this.queue.values()) {
|
|
159
|
+
if (request.timeoutTimer) {
|
|
160
|
+
clearTimeout(request.timeoutTimer);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
this.queue.clear();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 全ての保留中リクエストを取得(デバッグ用)
|
|
167
|
+
*/
|
|
168
|
+
getAll() {
|
|
169
|
+
return Array.from(this.queue.values());
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 特定のリクエストを取得
|
|
173
|
+
*/
|
|
174
|
+
get(id) {
|
|
175
|
+
return this.queue.get(id);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* タイムアウト処理
|
|
179
|
+
*/
|
|
180
|
+
handleTimeout(id) {
|
|
181
|
+
const request = this.queue.get(id);
|
|
182
|
+
if (request) {
|
|
183
|
+
this.queue.delete(id);
|
|
184
|
+
this.onTimeout?.(request);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* ソケットへの書き込み(Promise化)
|
|
189
|
+
*/
|
|
190
|
+
writeToSocket(socket, data) {
|
|
191
|
+
return new Promise((resolve, reject) => {
|
|
192
|
+
socket.write(data + "\n", (err) => {
|
|
193
|
+
if (err) {
|
|
194
|
+
reject(err);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
resolve();
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=request-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-queue.js","sourceRoot":"","sources":["../../../src/client/request-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,22 @@ export interface RetryOptions {
|
|
|
2
2
|
maxAttempts: number;
|
|
3
3
|
delayMs: number;
|
|
4
4
|
jitterMs?: number;
|
|
5
|
+
/** 最大遅延時間(ミリ秒)。指数バックオフの上限を設定 */
|
|
6
|
+
maxDelayMs?: number;
|
|
7
|
+
/** バックオフ倍率。指定時は指数バックオフを使用(デフォルト: 1 = 線形) */
|
|
8
|
+
backoffMultiplier?: number;
|
|
5
9
|
isRetriable?: (error: unknown) => boolean;
|
|
6
10
|
}
|
|
7
|
-
|
|
11
|
+
/**
|
|
12
|
+
* 指数バックオフ付きの遅延時間を計算
|
|
13
|
+
*
|
|
14
|
+
* @param baseDelayMs - 基本遅延時間
|
|
15
|
+
* @param attempt - 現在の試行回数(1から始まる)
|
|
16
|
+
* @param backoffMultiplier - バックオフ倍率(デフォルト: 1 = 線形)
|
|
17
|
+
* @param maxDelayMs - 最大遅延時間(上限)
|
|
18
|
+
* @param jitterMs - ジッター(ランダムな追加遅延)
|
|
19
|
+
* @returns 計算された遅延時間(ミリ秒)
|
|
20
|
+
*/
|
|
21
|
+
export declare function calculateBackoffDelay(baseDelayMs: number, attempt: number, backoffMultiplier?: number, maxDelayMs?: number, jitterMs?: number): number;
|
|
22
|
+
export declare function withRetry<T>(operation: () => Promise<T>, { maxAttempts, delayMs, jitterMs, maxDelayMs, backoffMultiplier, isRetriable, }: RetryOptions): Promise<T>;
|
|
8
23
|
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,iBAAiB,GAAE,MAAU,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAU,GACnB,MAAM,CAaR;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,EACE,WAAW,EACX,OAAO,EACP,QAAY,EACZ,UAAU,EACV,iBAAqB,EACrB,WAAW,GACZ,EAAE,YAAY,GACd,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
|
|
@@ -1,4 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 指数バックオフ付きの遅延時間を計算
|
|
3
|
+
*
|
|
4
|
+
* @param baseDelayMs - 基本遅延時間
|
|
5
|
+
* @param attempt - 現在の試行回数(1から始まる)
|
|
6
|
+
* @param backoffMultiplier - バックオフ倍率(デフォルト: 1 = 線形)
|
|
7
|
+
* @param maxDelayMs - 最大遅延時間(上限)
|
|
8
|
+
* @param jitterMs - ジッター(ランダムな追加遅延)
|
|
9
|
+
* @returns 計算された遅延時間(ミリ秒)
|
|
10
|
+
*/
|
|
11
|
+
export function calculateBackoffDelay(baseDelayMs, attempt, backoffMultiplier = 1, maxDelayMs, jitterMs = 0) {
|
|
12
|
+
// 指数バックオフ: baseDelay * (multiplier ^ (attempt - 1))
|
|
13
|
+
// attempt=1 では baseDelay、attempt=2 では baseDelay * multiplier、...
|
|
14
|
+
const exponentialDelay = baseDelayMs * Math.pow(backoffMultiplier, attempt - 1);
|
|
15
|
+
// 最大遅延を適用
|
|
16
|
+
const cappedDelay = maxDelayMs !== undefined ? Math.min(exponentialDelay, maxDelayMs) : exponentialDelay;
|
|
17
|
+
// ジッターを追加
|
|
18
|
+
const jitter = jitterMs > 0 ? Math.random() * jitterMs : 0;
|
|
19
|
+
return cappedDelay + jitter;
|
|
20
|
+
}
|
|
21
|
+
export async function withRetry(operation, { maxAttempts, delayMs, jitterMs = 0, maxDelayMs, backoffMultiplier = 1, isRetriable, }) {
|
|
2
22
|
if (maxAttempts < 1) {
|
|
3
23
|
throw new Error("maxAttempts must be >= 1");
|
|
4
24
|
}
|
|
@@ -11,8 +31,8 @@ export async function withRetry(operation, { maxAttempts, delayMs, jitterMs = 0,
|
|
|
11
31
|
if (!shouldRetry) {
|
|
12
32
|
throw error;
|
|
13
33
|
}
|
|
14
|
-
const
|
|
15
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
34
|
+
const delay = calculateBackoffDelay(delayMs, attempt, backoffMultiplier, maxDelayMs, jitterMs);
|
|
35
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
16
36
|
}
|
|
17
37
|
}
|
|
18
38
|
throw new Error("Retry attempts exhausted");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAWA;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmB,EACnB,OAAe,EACf,oBAA4B,CAAC,EAC7B,UAAmB,EACnB,WAAmB,CAAC;IAEpB,oDAAoD;IACpD,iEAAiE;IACjE,MAAM,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAEhF,UAAU;IACV,MAAM,WAAW,GACf,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEvF,UAAU;IACV,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,OAAO,WAAW,GAAG,MAAM,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAA2B,EAC3B,EACE,WAAW,EACX,OAAO,EACP,QAAQ,GAAG,CAAC,EACZ,UAAU,EACV,iBAAiB,GAAG,CAAC,EACrB,WAAW,GACE;IAEf,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,OAAO,GAAG,WAAW,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,qBAAqB,CACjC,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,QAAQ,CACT,CAAC;YACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC9C,CAAC"}
|