@nahisaho/katashiro-core 0.2.2 → 0.2.4
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/dist/errors/ErrorCodes.d.ts +99 -0
- package/dist/errors/ErrorCodes.d.ts.map +1 -0
- package/dist/errors/ErrorCodes.js +109 -0
- package/dist/errors/ErrorCodes.js.map +1 -0
- package/dist/errors/KatashiroError.d.ts +82 -0
- package/dist/errors/KatashiroError.d.ts.map +1 -0
- package/dist/errors/KatashiroError.js +168 -0
- package/dist/errors/KatashiroError.js.map +1 -0
- package/dist/errors/__tests__/KatashiroError.test.d.ts +8 -0
- package/dist/errors/__tests__/KatashiroError.test.d.ts.map +1 -0
- package/dist/errors/__tests__/KatashiroError.test.js +263 -0
- package/dist/errors/__tests__/KatashiroError.test.js.map +1 -0
- package/dist/errors/index.d.ts +14 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +14 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/retry.d.ts +79 -0
- package/dist/errors/retry.d.ts.map +1 -0
- package/dist/errors/retry.js +150 -0
- package/dist/errors/retry.js.map +1 -0
- package/dist/errors/types.d.ts +68 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/errors/types.js +16 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラーコード定数
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001 §4
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 共通エラーコード定数
|
|
9
|
+
*
|
|
10
|
+
* 形式: {MODULE}_{CATEGORY}_{NUMBER}
|
|
11
|
+
* - MODULE: モジュール識別子 (COR, COL, ANA, MED, GEN, KNW)
|
|
12
|
+
* - CATEGORY: カテゴリ (VAL, AUT, PRM, NTF, CNF, NET, TMO, SEC, SYS, EXT)
|
|
13
|
+
* - NUMBER: 連番 (001-999)
|
|
14
|
+
*/
|
|
15
|
+
export declare const ErrorCodes: {
|
|
16
|
+
/** パラメータが無効 */
|
|
17
|
+
readonly INVALID_PARAMETER: "COR_VAL_001";
|
|
18
|
+
/** 必須パラメータが欠落 */
|
|
19
|
+
readonly MISSING_REQUIRED: "COR_VAL_002";
|
|
20
|
+
/** 型が不一致 */
|
|
21
|
+
readonly TYPE_MISMATCH: "COR_VAL_003";
|
|
22
|
+
/** 内部エラー */
|
|
23
|
+
readonly INTERNAL_ERROR: "COR_SYS_001";
|
|
24
|
+
/** 未実装機能 */
|
|
25
|
+
readonly NOT_IMPLEMENTED: "COR_SYS_002";
|
|
26
|
+
/** 接続失敗 */
|
|
27
|
+
readonly CONNECTION_FAILED: "COR_NET_001";
|
|
28
|
+
/** 操作タイムアウト */
|
|
29
|
+
readonly OPERATION_TIMEOUT: "COR_TMO_001";
|
|
30
|
+
/** ファイルが見つからない */
|
|
31
|
+
readonly FILE_NOT_FOUND: "COL_NTF_001";
|
|
32
|
+
/** 未対応のファイル形式 */
|
|
33
|
+
readonly UNSUPPORTED_FORMAT: "COL_VAL_001";
|
|
34
|
+
/** ファイルが破損 */
|
|
35
|
+
readonly CORRUPTED_FILE: "COL_VAL_002";
|
|
36
|
+
/** パスワード保護 */
|
|
37
|
+
readonly PASSWORD_PROTECTED: "COL_SEC_001";
|
|
38
|
+
/** スクレイピング失敗 */
|
|
39
|
+
readonly SCRAPE_FAILED: "COL_NET_001";
|
|
40
|
+
/** レート制限 */
|
|
41
|
+
readonly RATE_LIMITED: "COL_NET_002";
|
|
42
|
+
/** リサーチタイムアウト */
|
|
43
|
+
readonly RESEARCH_TIMEOUT: "COL_TMO_001";
|
|
44
|
+
/** 検索APIエラー */
|
|
45
|
+
readonly SEARCH_API_ERROR: "COL_EXT_001";
|
|
46
|
+
/** コードが無効 */
|
|
47
|
+
readonly INVALID_CODE: "ANA_VAL_001";
|
|
48
|
+
/** ブロックされたモジュール */
|
|
49
|
+
readonly BLOCKED_MODULE: "ANA_VAL_002";
|
|
50
|
+
/** サンドボックス違反 */
|
|
51
|
+
readonly SANDBOX_VIOLATION: "ANA_SEC_001";
|
|
52
|
+
/** 権限拒否 */
|
|
53
|
+
readonly PERMISSION_DENIED: "ANA_SEC_002";
|
|
54
|
+
/** 実行タイムアウト */
|
|
55
|
+
readonly EXECUTION_TIMEOUT: "ANA_TMO_001";
|
|
56
|
+
/** メモリ超過 */
|
|
57
|
+
readonly MEMORY_EXCEEDED: "ANA_SYS_001";
|
|
58
|
+
/** 収束失敗 */
|
|
59
|
+
readonly CONVERGENCE_FAILED: "ANA_SYS_002";
|
|
60
|
+
/** LLM APIエラー */
|
|
61
|
+
readonly LLM_API_ERROR: "ANA_EXT_001";
|
|
62
|
+
/** プロンプトが無効 */
|
|
63
|
+
readonly INVALID_PROMPT: "MED_VAL_001";
|
|
64
|
+
/** コンテンツポリシー違反 */
|
|
65
|
+
readonly CONTENT_POLICY_VIOLATION: "MED_VAL_002";
|
|
66
|
+
/** 未対応の音声形式 */
|
|
67
|
+
readonly UNSUPPORTED_AUDIO_FORMAT: "MED_VAL_003";
|
|
68
|
+
/** 未対応の画像形式 */
|
|
69
|
+
readonly UNSUPPORTED_IMAGE_FORMAT: "MED_VAL_004";
|
|
70
|
+
/** 生成失敗 */
|
|
71
|
+
readonly GENERATION_FAILED: "MED_NET_001";
|
|
72
|
+
/** 生成タイムアウト */
|
|
73
|
+
readonly GENERATION_TIMEOUT: "MED_TMO_001";
|
|
74
|
+
/** プロバイダーエラー */
|
|
75
|
+
readonly PROVIDER_ERROR: "MED_EXT_001";
|
|
76
|
+
/** クォータ超過 */
|
|
77
|
+
readonly QUOTA_EXCEEDED: "MED_EXT_002";
|
|
78
|
+
/** テンプレートエラー */
|
|
79
|
+
readonly TEMPLATE_ERROR: "GEN_VAL_001";
|
|
80
|
+
/** レンダリング失敗 */
|
|
81
|
+
readonly RENDER_FAILED: "GEN_SYS_001";
|
|
82
|
+
/** ノードが見つからない */
|
|
83
|
+
readonly NODE_NOT_FOUND: "KNW_NTF_001";
|
|
84
|
+
/** エッジが見つからない */
|
|
85
|
+
readonly EDGE_NOT_FOUND: "KNW_NTF_002";
|
|
86
|
+
/** 永続化失敗 */
|
|
87
|
+
readonly PERSISTENCE_FAILED: "KNW_SYS_001";
|
|
88
|
+
/** クエリエラー */
|
|
89
|
+
readonly QUERY_ERROR: "KNW_VAL_001";
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* エラーコードキー型
|
|
93
|
+
*/
|
|
94
|
+
export type ErrorCodeKey = keyof typeof ErrorCodes;
|
|
95
|
+
/**
|
|
96
|
+
* エラーコード値型
|
|
97
|
+
*/
|
|
98
|
+
export type ErrorCodeValue = (typeof ErrorCodes)[ErrorCodeKey];
|
|
99
|
+
//# sourceMappingURL=ErrorCodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorCodes.d.ts","sourceRoot":"","sources":["../../src/errors/ErrorCodes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;IAKrB,eAAe;;IAEf,iBAAiB;;IAEjB,YAAY;;IAEZ,YAAY;;IAEZ,YAAY;;IAEZ,WAAW;;IAEX,eAAe;;IAOf,kBAAkB;;IAElB,iBAAiB;;IAEjB,cAAc;;IAEd,cAAc;;IAEd,gBAAgB;;IAEhB,YAAY;;IAEZ,iBAAiB;;IAEjB,eAAe;;IAOf,aAAa;;IAEb,mBAAmB;;IAEnB,gBAAgB;;IAEhB,WAAW;;IAEX,eAAe;;IAEf,YAAY;;IAEZ,WAAW;;IAEX,iBAAiB;;IAOjB,eAAe;;IAEf,kBAAkB;;IAElB,eAAe;;IAEf,eAAe;;IAEf,WAAW;;IAEX,eAAe;;IAEf,gBAAgB;;IAEhB,aAAa;;IAOb,gBAAgB;;IAEhB,eAAe;;IAOf,iBAAiB;;IAEjB,iBAAiB;;IAEjB,YAAY;;IAEZ,aAAa;;CAEL,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,UAAU,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラーコード定数
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001 §4
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 共通エラーコード定数
|
|
9
|
+
*
|
|
10
|
+
* 形式: {MODULE}_{CATEGORY}_{NUMBER}
|
|
11
|
+
* - MODULE: モジュール識別子 (COR, COL, ANA, MED, GEN, KNW)
|
|
12
|
+
* - CATEGORY: カテゴリ (VAL, AUT, PRM, NTF, CNF, NET, TMO, SEC, SYS, EXT)
|
|
13
|
+
* - NUMBER: 連番 (001-999)
|
|
14
|
+
*/
|
|
15
|
+
export const ErrorCodes = {
|
|
16
|
+
// ========================================
|
|
17
|
+
// Core (COR) - 共通エラー
|
|
18
|
+
// ========================================
|
|
19
|
+
/** パラメータが無効 */
|
|
20
|
+
INVALID_PARAMETER: 'COR_VAL_001',
|
|
21
|
+
/** 必須パラメータが欠落 */
|
|
22
|
+
MISSING_REQUIRED: 'COR_VAL_002',
|
|
23
|
+
/** 型が不一致 */
|
|
24
|
+
TYPE_MISMATCH: 'COR_VAL_003',
|
|
25
|
+
/** 内部エラー */
|
|
26
|
+
INTERNAL_ERROR: 'COR_SYS_001',
|
|
27
|
+
/** 未実装機能 */
|
|
28
|
+
NOT_IMPLEMENTED: 'COR_SYS_002',
|
|
29
|
+
/** 接続失敗 */
|
|
30
|
+
CONNECTION_FAILED: 'COR_NET_001',
|
|
31
|
+
/** 操作タイムアウト */
|
|
32
|
+
OPERATION_TIMEOUT: 'COR_TMO_001',
|
|
33
|
+
// ========================================
|
|
34
|
+
// Collector (COL) - 情報収集エラー
|
|
35
|
+
// ========================================
|
|
36
|
+
/** ファイルが見つからない */
|
|
37
|
+
FILE_NOT_FOUND: 'COL_NTF_001',
|
|
38
|
+
/** 未対応のファイル形式 */
|
|
39
|
+
UNSUPPORTED_FORMAT: 'COL_VAL_001',
|
|
40
|
+
/** ファイルが破損 */
|
|
41
|
+
CORRUPTED_FILE: 'COL_VAL_002',
|
|
42
|
+
/** パスワード保護 */
|
|
43
|
+
PASSWORD_PROTECTED: 'COL_SEC_001',
|
|
44
|
+
/** スクレイピング失敗 */
|
|
45
|
+
SCRAPE_FAILED: 'COL_NET_001',
|
|
46
|
+
/** レート制限 */
|
|
47
|
+
RATE_LIMITED: 'COL_NET_002',
|
|
48
|
+
/** リサーチタイムアウト */
|
|
49
|
+
RESEARCH_TIMEOUT: 'COL_TMO_001',
|
|
50
|
+
/** 検索APIエラー */
|
|
51
|
+
SEARCH_API_ERROR: 'COL_EXT_001',
|
|
52
|
+
// ========================================
|
|
53
|
+
// Analyzer (ANA) - 分析エラー
|
|
54
|
+
// ========================================
|
|
55
|
+
/** コードが無効 */
|
|
56
|
+
INVALID_CODE: 'ANA_VAL_001',
|
|
57
|
+
/** ブロックされたモジュール */
|
|
58
|
+
BLOCKED_MODULE: 'ANA_VAL_002',
|
|
59
|
+
/** サンドボックス違反 */
|
|
60
|
+
SANDBOX_VIOLATION: 'ANA_SEC_001',
|
|
61
|
+
/** 権限拒否 */
|
|
62
|
+
PERMISSION_DENIED: 'ANA_SEC_002',
|
|
63
|
+
/** 実行タイムアウト */
|
|
64
|
+
EXECUTION_TIMEOUT: 'ANA_TMO_001',
|
|
65
|
+
/** メモリ超過 */
|
|
66
|
+
MEMORY_EXCEEDED: 'ANA_SYS_001',
|
|
67
|
+
/** 収束失敗 */
|
|
68
|
+
CONVERGENCE_FAILED: 'ANA_SYS_002',
|
|
69
|
+
/** LLM APIエラー */
|
|
70
|
+
LLM_API_ERROR: 'ANA_EXT_001',
|
|
71
|
+
// ========================================
|
|
72
|
+
// Media (MED) - メディア生成エラー
|
|
73
|
+
// ========================================
|
|
74
|
+
/** プロンプトが無効 */
|
|
75
|
+
INVALID_PROMPT: 'MED_VAL_001',
|
|
76
|
+
/** コンテンツポリシー違反 */
|
|
77
|
+
CONTENT_POLICY_VIOLATION: 'MED_VAL_002',
|
|
78
|
+
/** 未対応の音声形式 */
|
|
79
|
+
UNSUPPORTED_AUDIO_FORMAT: 'MED_VAL_003',
|
|
80
|
+
/** 未対応の画像形式 */
|
|
81
|
+
UNSUPPORTED_IMAGE_FORMAT: 'MED_VAL_004',
|
|
82
|
+
/** 生成失敗 */
|
|
83
|
+
GENERATION_FAILED: 'MED_NET_001',
|
|
84
|
+
/** 生成タイムアウト */
|
|
85
|
+
GENERATION_TIMEOUT: 'MED_TMO_001',
|
|
86
|
+
/** プロバイダーエラー */
|
|
87
|
+
PROVIDER_ERROR: 'MED_EXT_001',
|
|
88
|
+
/** クォータ超過 */
|
|
89
|
+
QUOTA_EXCEEDED: 'MED_EXT_002',
|
|
90
|
+
// ========================================
|
|
91
|
+
// Generator (GEN) - コンテンツ生成エラー
|
|
92
|
+
// ========================================
|
|
93
|
+
/** テンプレートエラー */
|
|
94
|
+
TEMPLATE_ERROR: 'GEN_VAL_001',
|
|
95
|
+
/** レンダリング失敗 */
|
|
96
|
+
RENDER_FAILED: 'GEN_SYS_001',
|
|
97
|
+
// ========================================
|
|
98
|
+
// Knowledge (KNW) - 知識管理エラー
|
|
99
|
+
// ========================================
|
|
100
|
+
/** ノードが見つからない */
|
|
101
|
+
NODE_NOT_FOUND: 'KNW_NTF_001',
|
|
102
|
+
/** エッジが見つからない */
|
|
103
|
+
EDGE_NOT_FOUND: 'KNW_NTF_002',
|
|
104
|
+
/** 永続化失敗 */
|
|
105
|
+
PERSISTENCE_FAILED: 'KNW_SYS_001',
|
|
106
|
+
/** クエリエラー */
|
|
107
|
+
QUERY_ERROR: 'KNW_VAL_001',
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=ErrorCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorCodes.js","sourceRoot":"","sources":["../../src/errors/ErrorCodes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,2CAA2C;IAC3C,qBAAqB;IACrB,2CAA2C;IAE3C,eAAe;IACf,iBAAiB,EAAE,aAAa;IAChC,iBAAiB;IACjB,gBAAgB,EAAE,aAAa;IAC/B,YAAY;IACZ,aAAa,EAAE,aAAa;IAC5B,YAAY;IACZ,cAAc,EAAE,aAAa;IAC7B,YAAY;IACZ,eAAe,EAAE,aAAa;IAC9B,WAAW;IACX,iBAAiB,EAAE,aAAa;IAChC,eAAe;IACf,iBAAiB,EAAE,aAAa;IAEhC,2CAA2C;IAC3C,4BAA4B;IAC5B,2CAA2C;IAE3C,kBAAkB;IAClB,cAAc,EAAE,aAAa;IAC7B,iBAAiB;IACjB,kBAAkB,EAAE,aAAa;IACjC,cAAc;IACd,cAAc,EAAE,aAAa;IAC7B,cAAc;IACd,kBAAkB,EAAE,aAAa;IACjC,gBAAgB;IAChB,aAAa,EAAE,aAAa;IAC5B,YAAY;IACZ,YAAY,EAAE,aAAa;IAC3B,iBAAiB;IACjB,gBAAgB,EAAE,aAAa;IAC/B,eAAe;IACf,gBAAgB,EAAE,aAAa;IAE/B,2CAA2C;IAC3C,yBAAyB;IACzB,2CAA2C;IAE3C,aAAa;IACb,YAAY,EAAE,aAAa;IAC3B,mBAAmB;IACnB,cAAc,EAAE,aAAa;IAC7B,gBAAgB;IAChB,iBAAiB,EAAE,aAAa;IAChC,WAAW;IACX,iBAAiB,EAAE,aAAa;IAChC,eAAe;IACf,iBAAiB,EAAE,aAAa;IAChC,YAAY;IACZ,eAAe,EAAE,aAAa;IAC9B,WAAW;IACX,kBAAkB,EAAE,aAAa;IACjC,iBAAiB;IACjB,aAAa,EAAE,aAAa;IAE5B,2CAA2C;IAC3C,0BAA0B;IAC1B,2CAA2C;IAE3C,eAAe;IACf,cAAc,EAAE,aAAa;IAC7B,kBAAkB;IAClB,wBAAwB,EAAE,aAAa;IACvC,eAAe;IACf,wBAAwB,EAAE,aAAa;IACvC,eAAe;IACf,wBAAwB,EAAE,aAAa;IACvC,WAAW;IACX,iBAAiB,EAAE,aAAa;IAChC,eAAe;IACf,kBAAkB,EAAE,aAAa;IACjC,gBAAgB;IAChB,cAAc,EAAE,aAAa;IAC7B,aAAa;IACb,cAAc,EAAE,aAAa;IAE7B,2CAA2C;IAC3C,+BAA+B;IAC/B,2CAA2C;IAE3C,gBAAgB;IAChB,cAAc,EAAE,aAAa;IAC7B,eAAe;IACf,aAAa,EAAE,aAAa;IAE5B,2CAA2C;IAC3C,4BAA4B;IAC5B,2CAA2C;IAE3C,iBAAiB;IACjB,cAAc,EAAE,aAAa;IAC7B,iBAAiB;IACjB,cAAc,EAAE,aAAa;IAC7B,YAAY;IACZ,kBAAkB,EAAE,aAAa;IACjC,aAAa;IACb,WAAW,EAAE,aAAa;CAClB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KATASHIROエラークラス
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001 §5
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
import type { ErrorModule, ErrorCategory, StructuredErrorCode, KatashiroErrorOptions, SerializedError } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* エラーコードをパース
|
|
10
|
+
*
|
|
11
|
+
* @param code - エラーコード文字列 (e.g., "COL_NTF_001")
|
|
12
|
+
* @returns 構造化エラーコード
|
|
13
|
+
* @throws Error - 無効なフォーマットの場合
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseErrorCode(code: string): StructuredErrorCode;
|
|
16
|
+
/**
|
|
17
|
+
* KATASHIRO共通エラークラス
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { KatashiroError, ErrorCodes } from '@nahisaho/katashiro-core';
|
|
22
|
+
*
|
|
23
|
+
* throw new KatashiroError(
|
|
24
|
+
* ErrorCodes.FILE_NOT_FOUND,
|
|
25
|
+
* 'File not found: document.pdf',
|
|
26
|
+
* { details: { filePath: 'document.pdf' }, retryable: false }
|
|
27
|
+
* );
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class KatashiroError extends Error {
|
|
31
|
+
/** 構造化エラーコード */
|
|
32
|
+
readonly code: StructuredErrorCode;
|
|
33
|
+
/** 追加詳細情報 */
|
|
34
|
+
readonly details?: Record<string, unknown>;
|
|
35
|
+
/** 原因となったエラー */
|
|
36
|
+
readonly cause?: Error;
|
|
37
|
+
/** リトライ可能か */
|
|
38
|
+
readonly retryable: boolean;
|
|
39
|
+
/** エラー発生時刻 */
|
|
40
|
+
readonly timestamp: Date;
|
|
41
|
+
/**
|
|
42
|
+
* KatashiroErrorを作成
|
|
43
|
+
*
|
|
44
|
+
* @param code - エラーコード (e.g., "COL_NTF_001")
|
|
45
|
+
* @param message - エラーメッセージ
|
|
46
|
+
* @param options - オプション
|
|
47
|
+
*/
|
|
48
|
+
constructor(code: string, message: string, options?: KatashiroErrorOptions);
|
|
49
|
+
/**
|
|
50
|
+
* カテゴリに基づいてリトライ可能性を判定
|
|
51
|
+
*/
|
|
52
|
+
private determineRetryable;
|
|
53
|
+
/**
|
|
54
|
+
* エラーコード文字列を取得
|
|
55
|
+
*/
|
|
56
|
+
get errorCode(): string;
|
|
57
|
+
/**
|
|
58
|
+
* モジュール識別子を取得
|
|
59
|
+
*/
|
|
60
|
+
get module(): ErrorModule;
|
|
61
|
+
/**
|
|
62
|
+
* カテゴリを取得
|
|
63
|
+
*/
|
|
64
|
+
get category(): ErrorCategory;
|
|
65
|
+
/**
|
|
66
|
+
* JSON形式に変換
|
|
67
|
+
*/
|
|
68
|
+
toJSON(): SerializedError;
|
|
69
|
+
/**
|
|
70
|
+
* 文字列に変換
|
|
71
|
+
*/
|
|
72
|
+
toString(): string;
|
|
73
|
+
/**
|
|
74
|
+
* KatashiroErrorかどうかを判定
|
|
75
|
+
*/
|
|
76
|
+
static isKatashiroError(error: unknown): error is KatashiroError;
|
|
77
|
+
/**
|
|
78
|
+
* 任意のエラーをKatashiroErrorに変換
|
|
79
|
+
*/
|
|
80
|
+
static from(error: unknown, defaultCode?: string): KatashiroError;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=KatashiroError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KatashiroError.d.ts","sourceRoot":"","sources":["../../src/errors/KatashiroError.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CA8ChE;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,gBAAgB;IAChB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,aAAa;IACb,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,gBAAgB;IAChB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,cAAc;IACd,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,cAAc;IACd,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAEzB;;;;;;OAMG;gBACS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAe1E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,WAAW,CAExB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,aAAa,CAE5B;IAED;;OAEG;IACH,MAAM,IAAI,eAAe;IAYzB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc;IAIhE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,SAAgB,GAAG,cAAc;CAgBzE"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KATASHIROエラークラス
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001 §5
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* エラーコードをパース
|
|
9
|
+
*
|
|
10
|
+
* @param code - エラーコード文字列 (e.g., "COL_NTF_001")
|
|
11
|
+
* @returns 構造化エラーコード
|
|
12
|
+
* @throws Error - 無効なフォーマットの場合
|
|
13
|
+
*/
|
|
14
|
+
export function parseErrorCode(code) {
|
|
15
|
+
const parts = code.split('_');
|
|
16
|
+
if (parts.length !== 3) {
|
|
17
|
+
throw new Error(`Invalid error code format: ${code}. Expected format: MODULE_CATEGORY_NUMBER`);
|
|
18
|
+
}
|
|
19
|
+
const module = parts[0];
|
|
20
|
+
const category = parts[1];
|
|
21
|
+
const number = parts[2];
|
|
22
|
+
// モジュール検証
|
|
23
|
+
const validModules = ['COR', 'COL', 'ANA', 'MED', 'GEN', 'KNW'];
|
|
24
|
+
if (!validModules.includes(module)) {
|
|
25
|
+
throw new Error(`Invalid module: ${module}. Valid modules: ${validModules.join(', ')}`);
|
|
26
|
+
}
|
|
27
|
+
// カテゴリ検証
|
|
28
|
+
const validCategories = [
|
|
29
|
+
'VAL',
|
|
30
|
+
'AUT',
|
|
31
|
+
'PRM',
|
|
32
|
+
'NTF',
|
|
33
|
+
'CNF',
|
|
34
|
+
'NET',
|
|
35
|
+
'TMO',
|
|
36
|
+
'SEC',
|
|
37
|
+
'SYS',
|
|
38
|
+
'EXT',
|
|
39
|
+
];
|
|
40
|
+
if (!validCategories.includes(category)) {
|
|
41
|
+
throw new Error(`Invalid category: ${category}. Valid categories: ${validCategories.join(', ')}`);
|
|
42
|
+
}
|
|
43
|
+
// 番号検証
|
|
44
|
+
if (!/^\d{3}$/.test(number)) {
|
|
45
|
+
throw new Error(`Invalid number: ${number}. Expected 3-digit number (e.g., 001)`);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
code,
|
|
49
|
+
module: module,
|
|
50
|
+
category: category,
|
|
51
|
+
number,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* KATASHIRO共通エラークラス
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* import { KatashiroError, ErrorCodes } from '@nahisaho/katashiro-core';
|
|
60
|
+
*
|
|
61
|
+
* throw new KatashiroError(
|
|
62
|
+
* ErrorCodes.FILE_NOT_FOUND,
|
|
63
|
+
* 'File not found: document.pdf',
|
|
64
|
+
* { details: { filePath: 'document.pdf' }, retryable: false }
|
|
65
|
+
* );
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export class KatashiroError extends Error {
|
|
69
|
+
/** 構造化エラーコード */
|
|
70
|
+
code;
|
|
71
|
+
/** 追加詳細情報 */
|
|
72
|
+
details;
|
|
73
|
+
/** 原因となったエラー */
|
|
74
|
+
cause;
|
|
75
|
+
/** リトライ可能か */
|
|
76
|
+
retryable;
|
|
77
|
+
/** エラー発生時刻 */
|
|
78
|
+
timestamp;
|
|
79
|
+
/**
|
|
80
|
+
* KatashiroErrorを作成
|
|
81
|
+
*
|
|
82
|
+
* @param code - エラーコード (e.g., "COL_NTF_001")
|
|
83
|
+
* @param message - エラーメッセージ
|
|
84
|
+
* @param options - オプション
|
|
85
|
+
*/
|
|
86
|
+
constructor(code, message, options) {
|
|
87
|
+
super(message);
|
|
88
|
+
this.name = 'KatashiroError';
|
|
89
|
+
this.code = parseErrorCode(code);
|
|
90
|
+
this.details = options?.details;
|
|
91
|
+
this.cause = options?.cause;
|
|
92
|
+
this.retryable = options?.retryable ?? this.determineRetryable();
|
|
93
|
+
this.timestamp = new Date();
|
|
94
|
+
// スタックトレースを正しく設定
|
|
95
|
+
if (Error.captureStackTrace) {
|
|
96
|
+
Error.captureStackTrace(this, KatashiroError);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* カテゴリに基づいてリトライ可能性を判定
|
|
101
|
+
*/
|
|
102
|
+
determineRetryable() {
|
|
103
|
+
const retryableCategories = ['NET', 'TMO', 'EXT'];
|
|
104
|
+
return retryableCategories.includes(this.code.category);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* エラーコード文字列を取得
|
|
108
|
+
*/
|
|
109
|
+
get errorCode() {
|
|
110
|
+
return this.code.code;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* モジュール識別子を取得
|
|
114
|
+
*/
|
|
115
|
+
get module() {
|
|
116
|
+
return this.code.module;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* カテゴリを取得
|
|
120
|
+
*/
|
|
121
|
+
get category() {
|
|
122
|
+
return this.code.category;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* JSON形式に変換
|
|
126
|
+
*/
|
|
127
|
+
toJSON() {
|
|
128
|
+
return {
|
|
129
|
+
name: this.name,
|
|
130
|
+
code: this.code.code,
|
|
131
|
+
message: this.message,
|
|
132
|
+
details: this.details,
|
|
133
|
+
retryable: this.retryable,
|
|
134
|
+
timestamp: this.timestamp.toISOString(),
|
|
135
|
+
cause: this.cause?.message,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 文字列に変換
|
|
140
|
+
*/
|
|
141
|
+
toString() {
|
|
142
|
+
return `[${this.code.code}] ${this.message}`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* KatashiroErrorかどうかを判定
|
|
146
|
+
*/
|
|
147
|
+
static isKatashiroError(error) {
|
|
148
|
+
return error instanceof KatashiroError;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 任意のエラーをKatashiroErrorに変換
|
|
152
|
+
*/
|
|
153
|
+
static from(error, defaultCode = 'COR_SYS_001') {
|
|
154
|
+
if (KatashiroError.isKatashiroError(error)) {
|
|
155
|
+
return error;
|
|
156
|
+
}
|
|
157
|
+
if (error instanceof Error) {
|
|
158
|
+
return new KatashiroError(defaultCode, error.message, {
|
|
159
|
+
cause: error,
|
|
160
|
+
retryable: false,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return new KatashiroError(defaultCode, String(error), {
|
|
164
|
+
retryable: false,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=KatashiroError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KatashiroError.js","sourceRoot":"","sources":["../../src/errors/KatashiroError.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KatashiroError.test.d.ts","sourceRoot":"","sources":["../../../src/errors/__tests__/KatashiroError.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KatashiroError テスト
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001
|
|
5
|
+
* @task TASK-000-5
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
import { KatashiroError, parseErrorCode, ErrorCodes, withRetry, retry, calculateBackoffDelay, DEFAULT_RETRY_CONFIG, } from '../index.js';
|
|
9
|
+
import { ok, err } from '../../result.js';
|
|
10
|
+
describe('parseErrorCode', () => {
|
|
11
|
+
it('正常なエラーコードをパースできる', () => {
|
|
12
|
+
const result = parseErrorCode('COL_NTF_001');
|
|
13
|
+
expect(result).toEqual({
|
|
14
|
+
code: 'COL_NTF_001',
|
|
15
|
+
module: 'COL',
|
|
16
|
+
category: 'NTF',
|
|
17
|
+
number: '001',
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
it('全モジュールをパースできる', () => {
|
|
21
|
+
const modules = ['COR', 'COL', 'ANA', 'MED', 'GEN', 'KNW'];
|
|
22
|
+
for (const mod of modules) {
|
|
23
|
+
const result = parseErrorCode(`${mod}_VAL_001`);
|
|
24
|
+
expect(result.module).toBe(mod);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it('全カテゴリをパースできる', () => {
|
|
28
|
+
const categories = ['VAL', 'AUT', 'PRM', 'NTF', 'CNF', 'NET', 'TMO', 'SEC', 'SYS', 'EXT'];
|
|
29
|
+
for (const cat of categories) {
|
|
30
|
+
const result = parseErrorCode(`COR_${cat}_001`);
|
|
31
|
+
expect(result.category).toBe(cat);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it('無効なフォーマットでエラーをスロー', () => {
|
|
35
|
+
expect(() => parseErrorCode('INVALID')).toThrow('Invalid error code format');
|
|
36
|
+
expect(() => parseErrorCode('COL_NTF')).toThrow('Invalid error code format');
|
|
37
|
+
expect(() => parseErrorCode('COL_NTF_001_EXTRA')).toThrow('Invalid error code format');
|
|
38
|
+
});
|
|
39
|
+
it('無効なモジュールでエラーをスロー', () => {
|
|
40
|
+
expect(() => parseErrorCode('XXX_VAL_001')).toThrow('Invalid module');
|
|
41
|
+
});
|
|
42
|
+
it('無効なカテゴリでエラーをスロー', () => {
|
|
43
|
+
expect(() => parseErrorCode('COR_XXX_001')).toThrow('Invalid category');
|
|
44
|
+
});
|
|
45
|
+
it('無効な番号でエラーをスロー', () => {
|
|
46
|
+
expect(() => parseErrorCode('COR_VAL_1')).toThrow('Invalid number');
|
|
47
|
+
expect(() => parseErrorCode('COR_VAL_1000')).toThrow('Invalid number');
|
|
48
|
+
expect(() => parseErrorCode('COR_VAL_ABC')).toThrow('Invalid number');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('KatashiroError', () => {
|
|
52
|
+
it('基本的なエラーを作成できる', () => {
|
|
53
|
+
const error = new KatashiroError(ErrorCodes.FILE_NOT_FOUND, 'File not found: test.pdf');
|
|
54
|
+
expect(error.name).toBe('KatashiroError');
|
|
55
|
+
expect(error.message).toBe('File not found: test.pdf');
|
|
56
|
+
expect(error.errorCode).toBe('COL_NTF_001');
|
|
57
|
+
expect(error.module).toBe('COL');
|
|
58
|
+
expect(error.category).toBe('NTF');
|
|
59
|
+
expect(error.retryable).toBe(false); // NTFはリトライ不可
|
|
60
|
+
expect(error.timestamp).toBeInstanceOf(Date);
|
|
61
|
+
});
|
|
62
|
+
it('詳細情報付きエラーを作成できる', () => {
|
|
63
|
+
const error = new KatashiroError(ErrorCodes.SCRAPE_FAILED, 'Scrape failed', {
|
|
64
|
+
details: { url: 'https://example.com', statusCode: 403 },
|
|
65
|
+
retryable: true,
|
|
66
|
+
});
|
|
67
|
+
expect(error.details).toEqual({ url: 'https://example.com', statusCode: 403 });
|
|
68
|
+
expect(error.retryable).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
it('原因エラー付きで作成できる', () => {
|
|
71
|
+
const cause = new Error('Network timeout');
|
|
72
|
+
const error = new KatashiroError(ErrorCodes.CONNECTION_FAILED, 'Connection failed', {
|
|
73
|
+
cause,
|
|
74
|
+
});
|
|
75
|
+
expect(error.cause).toBe(cause);
|
|
76
|
+
});
|
|
77
|
+
it('NETカテゴリはデフォルトでリトライ可能', () => {
|
|
78
|
+
const error = new KatashiroError(ErrorCodes.SCRAPE_FAILED, 'Scrape failed');
|
|
79
|
+
expect(error.retryable).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it('TMOカテゴリはデフォルトでリトライ可能', () => {
|
|
82
|
+
const error = new KatashiroError(ErrorCodes.OPERATION_TIMEOUT, 'Timeout');
|
|
83
|
+
expect(error.retryable).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it('EXTカテゴリはデフォルトでリトライ可能', () => {
|
|
86
|
+
const error = new KatashiroError(ErrorCodes.SEARCH_API_ERROR, 'API error');
|
|
87
|
+
expect(error.retryable).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
it('VALカテゴリはデフォルトでリトライ不可', () => {
|
|
90
|
+
const error = new KatashiroError(ErrorCodes.INVALID_PARAMETER, 'Invalid param');
|
|
91
|
+
expect(error.retryable).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
it('toJSON()で正しくシリアライズできる', () => {
|
|
94
|
+
const error = new KatashiroError(ErrorCodes.FILE_NOT_FOUND, 'Not found', {
|
|
95
|
+
details: { path: '/test' },
|
|
96
|
+
});
|
|
97
|
+
const json = error.toJSON();
|
|
98
|
+
expect(json.name).toBe('KatashiroError');
|
|
99
|
+
expect(json.code).toBe('COL_NTF_001');
|
|
100
|
+
expect(json.message).toBe('Not found');
|
|
101
|
+
expect(json.details).toEqual({ path: '/test' });
|
|
102
|
+
expect(json.retryable).toBe(false);
|
|
103
|
+
expect(json.timestamp).toBeDefined();
|
|
104
|
+
});
|
|
105
|
+
it('toString()でフォーマットされる', () => {
|
|
106
|
+
const error = new KatashiroError(ErrorCodes.FILE_NOT_FOUND, 'File not found');
|
|
107
|
+
expect(error.toString()).toBe('[COL_NTF_001] File not found');
|
|
108
|
+
});
|
|
109
|
+
it('isKatashiroError()で判定できる', () => {
|
|
110
|
+
const katashiroError = new KatashiroError(ErrorCodes.INTERNAL_ERROR, 'Error');
|
|
111
|
+
const regularError = new Error('Regular error');
|
|
112
|
+
expect(KatashiroError.isKatashiroError(katashiroError)).toBe(true);
|
|
113
|
+
expect(KatashiroError.isKatashiroError(regularError)).toBe(false);
|
|
114
|
+
expect(KatashiroError.isKatashiroError(null)).toBe(false);
|
|
115
|
+
expect(KatashiroError.isKatashiroError('string')).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
it('from()でErrorを変換できる', () => {
|
|
118
|
+
const original = new Error('Original error');
|
|
119
|
+
const converted = KatashiroError.from(original);
|
|
120
|
+
expect(converted).toBeInstanceOf(KatashiroError);
|
|
121
|
+
expect(converted.message).toBe('Original error');
|
|
122
|
+
expect(converted.cause).toBe(original);
|
|
123
|
+
expect(converted.errorCode).toBe('COR_SYS_001');
|
|
124
|
+
});
|
|
125
|
+
it('from()でKatashiroErrorはそのまま返す', () => {
|
|
126
|
+
const original = new KatashiroError(ErrorCodes.FILE_NOT_FOUND, 'Not found');
|
|
127
|
+
const result = KatashiroError.from(original);
|
|
128
|
+
expect(result).toBe(original);
|
|
129
|
+
});
|
|
130
|
+
it('from()で文字列を変換できる', () => {
|
|
131
|
+
const converted = KatashiroError.from('String error');
|
|
132
|
+
expect(converted.message).toBe('String error');
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
describe('ErrorCodes', () => {
|
|
136
|
+
it('全てのエラーコードが正しいフォーマット', () => {
|
|
137
|
+
for (const [, code] of Object.entries(ErrorCodes)) {
|
|
138
|
+
expect(() => parseErrorCode(code)).not.toThrow();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
it('主要なエラーコードが定義されている', () => {
|
|
142
|
+
expect(ErrorCodes.INVALID_PARAMETER).toBe('COR_VAL_001');
|
|
143
|
+
expect(ErrorCodes.FILE_NOT_FOUND).toBe('COL_NTF_001');
|
|
144
|
+
expect(ErrorCodes.SANDBOX_VIOLATION).toBe('ANA_SEC_001');
|
|
145
|
+
expect(ErrorCodes.INVALID_PROMPT).toBe('MED_VAL_001');
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
describe('calculateBackoffDelay', () => {
|
|
149
|
+
it('指数バックオフで増加する', () => {
|
|
150
|
+
const base = 1000;
|
|
151
|
+
const max = 30000;
|
|
152
|
+
// ジッターがあるので範囲でチェック
|
|
153
|
+
const delay0 = calculateBackoffDelay(0, base, max);
|
|
154
|
+
expect(delay0).toBeGreaterThanOrEqual(base);
|
|
155
|
+
expect(delay0).toBeLessThanOrEqual(base * 1.3);
|
|
156
|
+
const delay1 = calculateBackoffDelay(1, base, max);
|
|
157
|
+
expect(delay1).toBeGreaterThanOrEqual(base * 2);
|
|
158
|
+
expect(delay1).toBeLessThanOrEqual(base * 2 * 1.3);
|
|
159
|
+
const delay2 = calculateBackoffDelay(2, base, max);
|
|
160
|
+
expect(delay2).toBeGreaterThanOrEqual(base * 4);
|
|
161
|
+
expect(delay2).toBeLessThanOrEqual(base * 4 * 1.3);
|
|
162
|
+
});
|
|
163
|
+
it('最大値を超えない', () => {
|
|
164
|
+
const delay = calculateBackoffDelay(10, 1000, 5000);
|
|
165
|
+
expect(delay).toBeLessThanOrEqual(5000);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe('withRetry', () => {
|
|
169
|
+
it('成功時は1回で完了', async () => {
|
|
170
|
+
let callCount = 0;
|
|
171
|
+
const fn = async () => {
|
|
172
|
+
callCount++;
|
|
173
|
+
return ok('success');
|
|
174
|
+
};
|
|
175
|
+
const result = await withRetry(fn);
|
|
176
|
+
expect(result._tag).toBe('Ok');
|
|
177
|
+
if (result._tag === 'Ok') {
|
|
178
|
+
expect(result.value).toBe('success');
|
|
179
|
+
}
|
|
180
|
+
expect(callCount).toBe(1);
|
|
181
|
+
});
|
|
182
|
+
it('リトライ可能なエラーでリトライする', async () => {
|
|
183
|
+
let callCount = 0;
|
|
184
|
+
const fn = async () => {
|
|
185
|
+
callCount++;
|
|
186
|
+
if (callCount < 3) {
|
|
187
|
+
return err(new KatashiroError(ErrorCodes.SCRAPE_FAILED, 'Failed', { retryable: true }));
|
|
188
|
+
}
|
|
189
|
+
return ok('success');
|
|
190
|
+
};
|
|
191
|
+
const result = await withRetry(fn, { maxRetries: 3, baseDelayMs: 10, maxDelayMs: 100 });
|
|
192
|
+
expect(result._tag).toBe('Ok');
|
|
193
|
+
expect(callCount).toBe(3);
|
|
194
|
+
});
|
|
195
|
+
it('リトライ不可のエラーはリトライしない', async () => {
|
|
196
|
+
let callCount = 0;
|
|
197
|
+
const fn = async () => {
|
|
198
|
+
callCount++;
|
|
199
|
+
return err(new KatashiroError(ErrorCodes.INVALID_PARAMETER, 'Invalid', { retryable: false }));
|
|
200
|
+
};
|
|
201
|
+
const result = await withRetry(fn, { maxRetries: 3 });
|
|
202
|
+
expect(result._tag).toBe('Err');
|
|
203
|
+
expect(callCount).toBe(1);
|
|
204
|
+
});
|
|
205
|
+
it('最大リトライ回数後は失敗', async () => {
|
|
206
|
+
let callCount = 0;
|
|
207
|
+
const fn = async () => {
|
|
208
|
+
callCount++;
|
|
209
|
+
return err(new KatashiroError(ErrorCodes.SCRAPE_FAILED, 'Failed', { retryable: true }));
|
|
210
|
+
};
|
|
211
|
+
const result = await withRetry(fn, { maxRetries: 2, baseDelayMs: 10, maxDelayMs: 100 });
|
|
212
|
+
expect(result._tag).toBe('Err');
|
|
213
|
+
expect(callCount).toBe(3); // 初回 + 2回リトライ
|
|
214
|
+
});
|
|
215
|
+
it('コールバックが呼ばれる', async () => {
|
|
216
|
+
let retryCount = 0;
|
|
217
|
+
let successCalled = false;
|
|
218
|
+
let callCount = 0;
|
|
219
|
+
const fn = async () => {
|
|
220
|
+
callCount++;
|
|
221
|
+
if (callCount < 2) {
|
|
222
|
+
return err(new KatashiroError(ErrorCodes.SCRAPE_FAILED, 'Failed', { retryable: true }));
|
|
223
|
+
}
|
|
224
|
+
return ok('success');
|
|
225
|
+
};
|
|
226
|
+
await withRetry(fn, { maxRetries: 3, baseDelayMs: 10, maxDelayMs: 100 }, {
|
|
227
|
+
onRetry: () => {
|
|
228
|
+
retryCount++;
|
|
229
|
+
},
|
|
230
|
+
onSuccess: () => {
|
|
231
|
+
successCalled = true;
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
expect(retryCount).toBe(1);
|
|
235
|
+
expect(successCalled).toBe(true);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe('retry', () => {
|
|
239
|
+
it('簡易リトライが動作する', async () => {
|
|
240
|
+
let callCount = 0;
|
|
241
|
+
const fn = async () => {
|
|
242
|
+
callCount++;
|
|
243
|
+
if (callCount < 2) {
|
|
244
|
+
return err(new KatashiroError(ErrorCodes.CONNECTION_FAILED, 'Failed', { retryable: true }));
|
|
245
|
+
}
|
|
246
|
+
return ok('success');
|
|
247
|
+
};
|
|
248
|
+
const result = await retry(fn, 3);
|
|
249
|
+
expect(result._tag).toBe('Ok');
|
|
250
|
+
expect(callCount).toBe(2);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe('DEFAULT_RETRY_CONFIG', () => {
|
|
254
|
+
it('デフォルト値が設定されている', () => {
|
|
255
|
+
expect(DEFAULT_RETRY_CONFIG.maxRetries).toBe(3);
|
|
256
|
+
expect(DEFAULT_RETRY_CONFIG.baseDelayMs).toBe(1000);
|
|
257
|
+
expect(DEFAULT_RETRY_CONFIG.maxDelayMs).toBe(30000);
|
|
258
|
+
expect(DEFAULT_RETRY_CONFIG.retryableCategories).toContain('NET');
|
|
259
|
+
expect(DEFAULT_RETRY_CONFIG.retryableCategories).toContain('TMO');
|
|
260
|
+
expect(DEFAULT_RETRY_CONFIG.retryableCategories).toContain('EXT');
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
//# sourceMappingURL=KatashiroError.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KatashiroError.test.js","sourceRoot":"","sources":["../../../src/errors/__tests__/KatashiroError.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラーモジュール
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
export type { ErrorModule, ErrorCategory, StructuredErrorCode, KatashiroErrorOptions, SerializedError, RetryConfig, } from './types.js';
|
|
8
|
+
export { DEFAULT_RETRY_CONFIG } from './types.js';
|
|
9
|
+
export { KatashiroError, parseErrorCode } from './KatashiroError.js';
|
|
10
|
+
export { ErrorCodes } from './ErrorCodes.js';
|
|
11
|
+
export type { ErrorCodeKey, ErrorCodeValue } from './ErrorCodes.js';
|
|
12
|
+
export { withRetry, retry, withRetryPromise, calculateBackoffDelay, } from './retry.js';
|
|
13
|
+
export type { RetryResult, RetryCallbacks } from './retry.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EACL,SAAS,EACT,KAAK,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラーモジュール
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
export { DEFAULT_RETRY_CONFIG } from './types.js';
|
|
8
|
+
// エラークラス
|
|
9
|
+
export { KatashiroError, parseErrorCode } from './KatashiroError.js';
|
|
10
|
+
// エラーコード定数
|
|
11
|
+
export { ErrorCodes } from './ErrorCodes.js';
|
|
12
|
+
// リトライユーティリティ
|
|
13
|
+
export { withRetry, retry, withRetryPromise, calculateBackoffDelay, } from './retry.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,SAAS;AACT,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,WAAW;AACX,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,cAAc;AACd,OAAO,EACL,SAAS,EACT,KAAK,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* リトライユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001 §6.2
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
import type { Result } from '../result.js';
|
|
8
|
+
import type { RetryConfig } from './types.js';
|
|
9
|
+
import { KatashiroError } from './KatashiroError.js';
|
|
10
|
+
/**
|
|
11
|
+
* 指数バックオフ遅延を計算
|
|
12
|
+
*
|
|
13
|
+
* @param attempt - 試行回数 (0から開始)
|
|
14
|
+
* @param baseDelayMs - 基本遅延時間
|
|
15
|
+
* @param maxDelayMs - 最大遅延時間
|
|
16
|
+
* @returns 遅延時間 (ms)
|
|
17
|
+
*/
|
|
18
|
+
export declare function calculateBackoffDelay(attempt: number, baseDelayMs: number, maxDelayMs: number): number;
|
|
19
|
+
/**
|
|
20
|
+
* リトライ実行結果
|
|
21
|
+
*/
|
|
22
|
+
export interface RetryResult<T> {
|
|
23
|
+
/** 成功したか */
|
|
24
|
+
readonly success: boolean;
|
|
25
|
+
/** 結果(成功時) */
|
|
26
|
+
readonly value?: T;
|
|
27
|
+
/** 最後のエラー(失敗時) */
|
|
28
|
+
readonly lastError?: KatashiroError;
|
|
29
|
+
/** 試行回数 */
|
|
30
|
+
readonly attempts: number;
|
|
31
|
+
/** 総実行時間 (ms) */
|
|
32
|
+
readonly totalTimeMs: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* リトライコールバック
|
|
36
|
+
*/
|
|
37
|
+
export interface RetryCallbacks<T> {
|
|
38
|
+
/** リトライ前に呼ばれる */
|
|
39
|
+
onRetry?: (attempt: number, error: KatashiroError, delayMs: number) => void;
|
|
40
|
+
/** 成功時に呼ばれる */
|
|
41
|
+
onSuccess?: (result: T, attempts: number) => void;
|
|
42
|
+
/** 最終失敗時に呼ばれる */
|
|
43
|
+
onFailure?: (error: KatashiroError, attempts: number) => void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* リトライ付きで関数を実行
|
|
47
|
+
*
|
|
48
|
+
* @param fn - 実行する関数
|
|
49
|
+
* @param config - リトライ設定
|
|
50
|
+
* @param callbacks - コールバック
|
|
51
|
+
* @returns 結果
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const result = await withRetry(
|
|
56
|
+
* () => fetchData(url),
|
|
57
|
+
* { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 10000 },
|
|
58
|
+
* { onRetry: (attempt) => console.log(`Retry ${attempt}`) }
|
|
59
|
+
* );
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare function withRetry<T>(fn: () => Promise<Result<T, KatashiroError>>, config?: Partial<RetryConfig>, callbacks?: RetryCallbacks<T>): Promise<Result<T, KatashiroError>>;
|
|
63
|
+
/**
|
|
64
|
+
* 簡易リトライ(設定なし)
|
|
65
|
+
*
|
|
66
|
+
* @param fn - 実行する関数
|
|
67
|
+
* @param maxRetries - 最大リトライ回数(デフォルト: 3)
|
|
68
|
+
* @returns 結果
|
|
69
|
+
*/
|
|
70
|
+
export declare function retry<T>(fn: () => Promise<Result<T, KatashiroError>>, maxRetries?: number): Promise<Result<T, KatashiroError>>;
|
|
71
|
+
/**
|
|
72
|
+
* Promise版リトライ(Result型を使わない場合)
|
|
73
|
+
*
|
|
74
|
+
* @param fn - 実行する関数
|
|
75
|
+
* @param config - リトライ設定
|
|
76
|
+
* @returns 結果
|
|
77
|
+
*/
|
|
78
|
+
export declare function withRetryPromise<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>): Promise<T>;
|
|
79
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/errors/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AASrD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,YAAY;IACZ,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,cAAc;IACd,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnB,kBAAkB;IAClB,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,WAAW;IACX,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iBAAiB;IACjB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,iBAAiB;IACjB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5E,eAAe;IACf,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,iBAAiB;IACjB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,EAC5C,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,EACjC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAiEpC;AAeD;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,EAC5C,UAAU,SAAI,GACb,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAEpC;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAChC,OAAO,CAAC,CAAC,CAAC,CAmCZ"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* リトライユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001 §6.2
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
import { isOk, err } from '../result.js';
|
|
8
|
+
import { DEFAULT_RETRY_CONFIG } from './types.js';
|
|
9
|
+
import { KatashiroError } from './KatashiroError.js';
|
|
10
|
+
/**
|
|
11
|
+
* スリープ関数
|
|
12
|
+
*/
|
|
13
|
+
function sleep(ms) {
|
|
14
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 指数バックオフ遅延を計算
|
|
18
|
+
*
|
|
19
|
+
* @param attempt - 試行回数 (0から開始)
|
|
20
|
+
* @param baseDelayMs - 基本遅延時間
|
|
21
|
+
* @param maxDelayMs - 最大遅延時間
|
|
22
|
+
* @returns 遅延時間 (ms)
|
|
23
|
+
*/
|
|
24
|
+
export function calculateBackoffDelay(attempt, baseDelayMs, maxDelayMs) {
|
|
25
|
+
// ジッター付き指数バックオフ
|
|
26
|
+
const exponentialDelay = baseDelayMs * Math.pow(2, attempt);
|
|
27
|
+
const jitter = Math.random() * 0.3 * exponentialDelay; // 30%のジッター
|
|
28
|
+
return Math.min(exponentialDelay + jitter, maxDelayMs);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* リトライ付きで関数を実行
|
|
32
|
+
*
|
|
33
|
+
* @param fn - 実行する関数
|
|
34
|
+
* @param config - リトライ設定
|
|
35
|
+
* @param callbacks - コールバック
|
|
36
|
+
* @returns 結果
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const result = await withRetry(
|
|
41
|
+
* () => fetchData(url),
|
|
42
|
+
* { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 10000 },
|
|
43
|
+
* { onRetry: (attempt) => console.log(`Retry ${attempt}`) }
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export async function withRetry(fn, config = {}, callbacks) {
|
|
48
|
+
const mergedConfig = {
|
|
49
|
+
...DEFAULT_RETRY_CONFIG,
|
|
50
|
+
...config,
|
|
51
|
+
};
|
|
52
|
+
let lastError = null;
|
|
53
|
+
for (let attempt = 0; attempt <= mergedConfig.maxRetries; attempt++) {
|
|
54
|
+
try {
|
|
55
|
+
const result = await fn();
|
|
56
|
+
if (isOk(result)) {
|
|
57
|
+
callbacks?.onSuccess?.(result.value, attempt + 1);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
lastError = result.error;
|
|
61
|
+
// リトライ不可のエラーはすぐに返す
|
|
62
|
+
if (!shouldRetry(lastError, mergedConfig)) {
|
|
63
|
+
callbacks?.onFailure?.(lastError, attempt + 1);
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
// 最後の試行ならリトライしない
|
|
67
|
+
if (attempt === mergedConfig.maxRetries) {
|
|
68
|
+
callbacks?.onFailure?.(lastError, attempt + 1);
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
// バックオフ遅延
|
|
72
|
+
const delay = calculateBackoffDelay(attempt, mergedConfig.baseDelayMs, mergedConfig.maxDelayMs);
|
|
73
|
+
callbacks?.onRetry?.(attempt + 1, lastError, delay);
|
|
74
|
+
await sleep(delay);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// 予期しないエラーをKatashiroErrorに変換
|
|
78
|
+
lastError = KatashiroError.from(error);
|
|
79
|
+
if (!shouldRetry(lastError, mergedConfig)) {
|
|
80
|
+
callbacks?.onFailure?.(lastError, attempt + 1);
|
|
81
|
+
return err(lastError);
|
|
82
|
+
}
|
|
83
|
+
if (attempt === mergedConfig.maxRetries) {
|
|
84
|
+
callbacks?.onFailure?.(lastError, attempt + 1);
|
|
85
|
+
return err(lastError);
|
|
86
|
+
}
|
|
87
|
+
const delay = calculateBackoffDelay(attempt, mergedConfig.baseDelayMs, mergedConfig.maxDelayMs);
|
|
88
|
+
callbacks?.onRetry?.(attempt + 1, lastError, delay);
|
|
89
|
+
await sleep(delay);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ここには到達しないはずだが、型安全のために
|
|
93
|
+
return err(lastError);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* リトライすべきかを判定
|
|
97
|
+
*/
|
|
98
|
+
function shouldRetry(error, config) {
|
|
99
|
+
// 明示的にリトライ不可の場合
|
|
100
|
+
if (!error.retryable) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
// カテゴリがリトライ対象か
|
|
104
|
+
return config.retryableCategories.includes(error.category);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 簡易リトライ(設定なし)
|
|
108
|
+
*
|
|
109
|
+
* @param fn - 実行する関数
|
|
110
|
+
* @param maxRetries - 最大リトライ回数(デフォルト: 3)
|
|
111
|
+
* @returns 結果
|
|
112
|
+
*/
|
|
113
|
+
export async function retry(fn, maxRetries = 3) {
|
|
114
|
+
return withRetry(fn, { maxRetries });
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Promise版リトライ(Result型を使わない場合)
|
|
118
|
+
*
|
|
119
|
+
* @param fn - 実行する関数
|
|
120
|
+
* @param config - リトライ設定
|
|
121
|
+
* @returns 結果
|
|
122
|
+
*/
|
|
123
|
+
export async function withRetryPromise(fn, config = {}) {
|
|
124
|
+
const mergedConfig = {
|
|
125
|
+
...DEFAULT_RETRY_CONFIG,
|
|
126
|
+
...config,
|
|
127
|
+
};
|
|
128
|
+
let lastError = null;
|
|
129
|
+
for (let attempt = 0; attempt <= mergedConfig.maxRetries; attempt++) {
|
|
130
|
+
try {
|
|
131
|
+
return await fn();
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
135
|
+
// KatashiroErrorの場合はリトライ可能性をチェック
|
|
136
|
+
if (KatashiroError.isKatashiroError(error)) {
|
|
137
|
+
if (!shouldRetry(error, mergedConfig)) {
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (attempt === mergedConfig.maxRetries) {
|
|
142
|
+
throw lastError;
|
|
143
|
+
}
|
|
144
|
+
const delay = calculateBackoffDelay(attempt, mergedConfig.baseDelayMs, mergedConfig.maxDelayMs);
|
|
145
|
+
await sleep(delay);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
throw lastError;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/errors/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラー型定義
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* エラーモジュール識別子
|
|
9
|
+
*/
|
|
10
|
+
export type ErrorModule = 'COR' | 'COL' | 'ANA' | 'MED' | 'GEN' | 'KNW';
|
|
11
|
+
/**
|
|
12
|
+
* エラーカテゴリ
|
|
13
|
+
*/
|
|
14
|
+
export type ErrorCategory = 'VAL' | 'AUT' | 'PRM' | 'NTF' | 'CNF' | 'NET' | 'TMO' | 'SEC' | 'SYS' | 'EXT';
|
|
15
|
+
/**
|
|
16
|
+
* 構造化エラーコード
|
|
17
|
+
*/
|
|
18
|
+
export interface StructuredErrorCode {
|
|
19
|
+
/** 完全なエラーコード (e.g., "COL_NTF_001") */
|
|
20
|
+
readonly code: string;
|
|
21
|
+
/** モジュール識別子 */
|
|
22
|
+
readonly module: ErrorModule;
|
|
23
|
+
/** カテゴリ */
|
|
24
|
+
readonly category: ErrorCategory;
|
|
25
|
+
/** 連番 */
|
|
26
|
+
readonly number: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* エラーオプション
|
|
30
|
+
*/
|
|
31
|
+
export interface KatashiroErrorOptions {
|
|
32
|
+
/** 追加詳細情報 */
|
|
33
|
+
readonly details?: Record<string, unknown>;
|
|
34
|
+
/** 原因となったエラー */
|
|
35
|
+
readonly cause?: Error;
|
|
36
|
+
/** リトライ可能か */
|
|
37
|
+
readonly retryable?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* シリアライズされたエラー
|
|
41
|
+
*/
|
|
42
|
+
export interface SerializedError {
|
|
43
|
+
readonly name: string;
|
|
44
|
+
readonly code: string;
|
|
45
|
+
readonly message: string;
|
|
46
|
+
readonly details?: Record<string, unknown>;
|
|
47
|
+
readonly retryable: boolean;
|
|
48
|
+
readonly timestamp: string;
|
|
49
|
+
readonly cause?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* リトライ設定
|
|
53
|
+
*/
|
|
54
|
+
export interface RetryConfig {
|
|
55
|
+
/** 最大リトライ回数 */
|
|
56
|
+
readonly maxRetries: number;
|
|
57
|
+
/** 基本遅延時間 (ms) */
|
|
58
|
+
readonly baseDelayMs: number;
|
|
59
|
+
/** 最大遅延時間 (ms) */
|
|
60
|
+
readonly maxDelayMs: number;
|
|
61
|
+
/** リトライ対象カテゴリ */
|
|
62
|
+
readonly retryableCategories: ReadonlyArray<ErrorCategory>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* デフォルトリトライ設定
|
|
66
|
+
*/
|
|
67
|
+
export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/errors/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,WAAW;IACX,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,SAAS;IACT,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa;IACb,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,gBAAgB;IAChB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,cAAc;IACd,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,eAAe;IACf,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kBAAkB;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kBAAkB;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iBAAiB;IACjB,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAKlC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* エラー型定義
|
|
3
|
+
*
|
|
4
|
+
* @design DES-COMMON-001
|
|
5
|
+
* @task TASK-000
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* デフォルトリトライ設定
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_RETRY_CONFIG = {
|
|
11
|
+
maxRetries: 3,
|
|
12
|
+
baseDelayMs: 1000,
|
|
13
|
+
maxDelayMs: 30000,
|
|
14
|
+
retryableCategories: ['NET', 'TMO', 'EXT'],
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/errors/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2EH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,KAAK;IACjB,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;CAC3C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
* 共通型・ユーティリティ
|
|
4
4
|
*
|
|
5
5
|
* @requirement REQ-NFR-006, REQ-NFR-007
|
|
6
|
-
* @design DES-KATASHIRO-001 §2.2
|
|
7
|
-
* @task TSK-001
|
|
6
|
+
* @design DES-KATASHIRO-001 §2.2, DES-COMMON-001
|
|
7
|
+
* @task TSK-001, TASK-000
|
|
8
8
|
*/
|
|
9
9
|
export type { Result, Ok, Err } from './result.js';
|
|
10
10
|
export { ok, err, isOk, isErr } from './result.js';
|
|
11
|
-
export type { ID, Timestamp, URL, SearchQuery, SearchResult, SearchOptions, Source, SourceMetadata, Content, ContentType, KatashiroError, ErrorCode, } from './types.js';
|
|
11
|
+
export type { ID, Timestamp, URL, SearchQuery, SearchResult, SearchOptions, Source, SourceMetadata, Content, ContentType, KatashiroError as LegacyKatashiroError, ErrorCode as LegacyErrorCode, } from './types.js';
|
|
12
12
|
export { generateId, formatTimestamp, validateUrl } from './utils.js';
|
|
13
13
|
export type { LogLevel, LogEntry, Logger as LoggerInterface } from './logger.js';
|
|
14
14
|
export { Logger, LoggerClass, createLogger } from './logger.js';
|
|
15
|
+
export { KatashiroError, parseErrorCode, ErrorCodes, withRetry, retry, withRetryPromise, calculateBackoffDelay, DEFAULT_RETRY_CONFIG, } from './errors/index.js';
|
|
16
|
+
export type { ErrorModule, ErrorCategory, StructuredErrorCode, KatashiroErrorOptions, SerializedError, RetryConfig, ErrorCodeKey, ErrorCodeValue, RetryResult, RetryCallbacks, } from './errors/index.js';
|
|
15
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGnD,YAAY,EAEV,EAAE,EACF,SAAS,EACT,GAAG,EAEH,WAAW,EACX,YAAY,EACZ,aAAa,EAEb,MAAM,EACN,cAAc,EAEd,OAAO,EACP,WAAW,EAEX,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGnD,YAAY,EAEV,EAAE,EACF,SAAS,EACT,GAAG,EAEH,WAAW,EACX,YAAY,EACZ,aAAa,EAEb,MAAM,EACN,cAAc,EAEd,OAAO,EACP,WAAW,EAEX,cAAc,IAAI,oBAAoB,EACtC,SAAS,IAAI,eAAe,GAC7B,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGtE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAEL,cAAc,EACd,cAAc,EAEd,UAAU,EAEV,SAAS,EACT,KAAK,EACL,gBAAgB,EAChB,qBAAqB,EAErB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAEV,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,11 +3,21 @@
|
|
|
3
3
|
* 共通型・ユーティリティ
|
|
4
4
|
*
|
|
5
5
|
* @requirement REQ-NFR-006, REQ-NFR-007
|
|
6
|
-
* @design DES-KATASHIRO-001 §2.2
|
|
7
|
-
* @task TSK-001
|
|
6
|
+
* @design DES-KATASHIRO-001 §2.2, DES-COMMON-001
|
|
7
|
+
* @task TSK-001, TASK-000
|
|
8
8
|
*/
|
|
9
9
|
export { ok, err, isOk, isErr } from './result.js';
|
|
10
10
|
// ユーティリティ
|
|
11
11
|
export { generateId, formatTimestamp, validateUrl } from './utils.js';
|
|
12
12
|
export { Logger, LoggerClass, createLogger } from './logger.js';
|
|
13
|
+
// エラーモジュール (DES-COMMON-001)
|
|
14
|
+
export {
|
|
15
|
+
// エラークラス
|
|
16
|
+
KatashiroError, parseErrorCode,
|
|
17
|
+
// エラーコード定数
|
|
18
|
+
ErrorCodes,
|
|
19
|
+
// リトライユーティリティ
|
|
20
|
+
withRetry, retry, withRetryPromise, calculateBackoffDelay,
|
|
21
|
+
// デフォルト設定
|
|
22
|
+
DEFAULT_RETRY_CONFIG, } from './errors/index.js';
|
|
13
23
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAuBnD,UAAU;AACV,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAItE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAuBnD,UAAU;AACV,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAItE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE,4BAA4B;AAC5B,OAAO;AACL,SAAS;AACT,cAAc,EACd,cAAc;AACd,WAAW;AACX,UAAU;AACV,cAAc;AACd,SAAS,EACT,KAAK,EACL,gBAAgB,EAChB,qBAAqB;AACrB,UAAU;AACV,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
|