@sayue_ltr/fleq 1.49.2

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +898 -0
  2. package/LICENSE +21 -0
  3. package/README.md +535 -0
  4. package/assets/icons/.gitkeep +0 -0
  5. package/assets/sounds/.gitkeep +0 -0
  6. package/assets/sounds/cancel.mp3 +0 -0
  7. package/assets/sounds/critical.mp3 +0 -0
  8. package/assets/sounds/info.mp3 +0 -0
  9. package/assets/sounds/normal.mp3 +0 -0
  10. package/assets/sounds/warning.mp3 +0 -0
  11. package/dist/config.js +638 -0
  12. package/dist/dmdata/connection-manager.js +2 -0
  13. package/dist/dmdata/endpoint-selector.js +185 -0
  14. package/dist/dmdata/multi-connection-manager.js +158 -0
  15. package/dist/dmdata/rest-client.js +281 -0
  16. package/dist/dmdata/telegram-parser.js +704 -0
  17. package/dist/dmdata/volcano-parser.js +647 -0
  18. package/dist/dmdata/ws-client.js +336 -0
  19. package/dist/engine/cli/cli-init.js +266 -0
  20. package/dist/engine/cli/cli-run.js +121 -0
  21. package/dist/engine/cli/cli.js +121 -0
  22. package/dist/engine/eew/eew-logger.js +355 -0
  23. package/dist/engine/eew/eew-tracker.js +229 -0
  24. package/dist/engine/messages/message-router.js +261 -0
  25. package/dist/engine/messages/tsunami-state.js +96 -0
  26. package/dist/engine/messages/volcano-state.js +131 -0
  27. package/dist/engine/messages/volcano-vfvo53-aggregator.js +173 -0
  28. package/dist/engine/monitor/monitor.js +118 -0
  29. package/dist/engine/monitor/repl-coordinator.js +63 -0
  30. package/dist/engine/monitor/shutdown.js +114 -0
  31. package/dist/engine/notification/node-notifier-loader.js +19 -0
  32. package/dist/engine/notification/notifier.js +338 -0
  33. package/dist/engine/notification/sound-player.js +230 -0
  34. package/dist/engine/notification/volcano-presentation.js +166 -0
  35. package/dist/engine/startup/config-resolver.js +139 -0
  36. package/dist/engine/startup/tsunami-initializer.js +91 -0
  37. package/dist/engine/startup/update-checker.js +229 -0
  38. package/dist/engine/startup/volcano-initializer.js +89 -0
  39. package/dist/index.js +24 -0
  40. package/dist/logger.js +95 -0
  41. package/dist/types.js +61 -0
  42. package/dist/ui/earthquake-formatter.js +871 -0
  43. package/dist/ui/eew-formatter.js +335 -0
  44. package/dist/ui/formatter.js +689 -0
  45. package/dist/ui/repl.js +2059 -0
  46. package/dist/ui/test-samples.js +880 -0
  47. package/dist/ui/theme.js +516 -0
  48. package/dist/ui/volcano-formatter.js +667 -0
  49. package/dist/ui/waiting-tips.js +227 -0
  50. package/dist/utils/intensity.js +13 -0
  51. package/dist/utils/secrets.js +14 -0
  52. package/package.json +69 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FlEq contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,535 @@
1
+ # FlEq
2
+
3
+ Project DM-D.S.S (dmdata.jp) のAPIを利用して、地震・津波・緊急地震速報・火山情報をリアルタイムにCLIで受信・表示するツールです。
4
+
5
+ ## クイックスタート
6
+
7
+ FlEq を最短で使い始めるには、以下の手順を実行してください。
8
+
9
+ ### 方法1: `fleq init` を使う(初回推奨)
10
+
11
+ 対話形式で API キーや受信設定をまとめて行えます。
12
+
13
+ ```bash
14
+ npm install -g fleq
15
+ fleq init
16
+ fleq
17
+ ```
18
+
19
+ ### 方法2: 手動で設定する
20
+
21
+ 対話なしで設定したい場合は、API キーを保存してから起動します。
22
+
23
+ ```bash
24
+ npm install -g fleq
25
+ fleq config set apiKey your_api_key_here
26
+ fleq
27
+ ```
28
+
29
+ 環境変数を使う場合は、以下でも起動できます。
30
+
31
+ ```bash
32
+ export DMDATA_API_KEY=your_api_key_here
33
+ fleq
34
+ ```
35
+
36
+ PowerShell:
37
+
38
+ ```powershell
39
+ $env:DMDATA_API_KEY = "your_api_key_here"
40
+ fleq
41
+ ```
42
+
43
+ 初回は `telegram.earthquake,eew.forecast,eew.warning,telegram.volcano` を受信対象として起動します。
44
+ 契約内容によっては一部の区分を受信できない場合があります。
45
+
46
+ ## 対応情報
47
+
48
+ | 区分 | 分類名 | 内容 |
49
+ |------|--------|------|
50
+ | 地震・津波関連 | `telegram.earthquake` | 震度速報、震源情報、震源・震度情報、津波警報等 |
51
+ | 緊急地震速報(予報) | `eew.forecast` | EEW予報(要契約) |
52
+ | 緊急地震速報(警報) | `eew.warning` | EEW警報(要契約) |
53
+ | 火山関連 | `telegram.volcano` | 噴火警報、噴火速報、降灰予報、火山の状況に関する解説情報等 |
54
+
55
+ ## 必要条件
56
+
57
+ FlEq を利用するには、以下が必要です。
58
+
59
+ - Node.js 18 以上
60
+ - dmdata.jp のアカウント
61
+ - dmdata.jp で発行した API キー
62
+ - API キーに `socket.start` と、利用する区分に対応した `telegram.get.*` 権限
63
+
64
+ 受信する情報の種類によって、必要な契約区分や権限が異なります。
65
+ たとえば、緊急地震速報(`eew.forecast` / `eew.warning`)の受信には、対応する契約が必要です。
66
+
67
+ API キーをまだ取得していない場合は、先に dmdata.jp でアカウント作成と API キー発行を行ってください。
68
+ 対応 OS については下記の「対応OS」を参照してください。
69
+
70
+ ## 対応OS
71
+
72
+ | OS | 対応状況 | 備考 |
73
+ |----|---------|------|
74
+ | macOS 10.13+ | 対応 | メイン開発・テスト環境 |
75
+ | Linux (x64 / ARM) | 対応 | Raspberry Pi 等の ARM デバイスでも動作 |
76
+ | Windows 10+ | 対応 | ConPTY 対応のターミナルを推奨 |
77
+
78
+ ## インストール
79
+
80
+ ### npm からインストール
81
+
82
+ ```bash
83
+ npm install -g fleq
84
+ ```
85
+
86
+ または単発実行もできます。
87
+
88
+ ```bash
89
+ npx fleq --help
90
+ ```
91
+
92
+ ### ソースから実行
93
+
94
+ ```bash
95
+ git clone https://github.com/Lateo2580/FlEq.git
96
+ cd FlEq
97
+ npm install
98
+ npm run build
99
+ ```
100
+
101
+ ## APIキーの設定
102
+
103
+ 以下のいずれかの方法で設定してください。
104
+
105
+ **方法1: 環境変数**
106
+
107
+ bash / zsh:
108
+ ```bash
109
+ export DMDATA_API_KEY=your_api_key_here
110
+ ```
111
+
112
+ PowerShell:
113
+ ```powershell
114
+ $env:DMDATA_API_KEY = "your_api_key_here"
115
+ ```
116
+
117
+ CMD:
118
+ ```cmd
119
+ set DMDATA_API_KEY=your_api_key_here
120
+ ```
121
+
122
+ **方法2: Configに保存(推奨)**
123
+
124
+ グローバルインストール時はこちらが最も簡単です。
125
+ ```bash
126
+ fleq config set apiKey your_api_key_here
127
+ ```
128
+
129
+ 保存先は `fleq config path` で確認できます(OSごとに異なります。詳細は「Config管理」を参照)。
130
+
131
+ **方法3: .envファイル**
132
+
133
+ カレントディレクトリの `.env` ファイルから読み込みます(ソースからの実行時に便利です)。
134
+ ```
135
+ DMDATA_API_KEY=your-key-here
136
+ ```
137
+
138
+ ## 基本的な使い方
139
+
140
+ 初めて使う場合は、次の順で進めると分かりやすいです。
141
+
142
+ ### 1. 初期設定を行う
143
+
144
+ まずは API キーを設定します。初回は対話形式の `init` が簡単です。
145
+
146
+ ```bash
147
+ fleq init
148
+ ```
149
+
150
+ 対話なしで設定する場合は、次のように API キーを保存できます。
151
+
152
+ ```bash
153
+ fleq config set apiKey your_api_key_here
154
+ ```
155
+
156
+ ### 2. そのまま起動する
157
+
158
+ デフォルト設定で起動すると、以下の区分を受信します。
159
+
160
+ - `telegram.earthquake`
161
+ - `eew.forecast`
162
+ - `eew.warning`
163
+ - `telegram.volcano`
164
+
165
+ ```bash
166
+ fleq
167
+ ```
168
+
169
+ 契約内容によっては、一部の区分を受信できない場合があります。
170
+
171
+ ### 3. 必要に応じて受信区分を指定する
172
+
173
+ 受信したい区分だけを指定して起動できます。
174
+
175
+ ```bash
176
+ fleq -c telegram.earthquake,eew.warning
177
+ ```
178
+
179
+ ### 4. 表示や動作を調整する
180
+
181
+ 表示モードを切り替えたい場合:
182
+
183
+ ```bash
184
+ fleq --mode compact
185
+ ```
186
+
187
+ テスト電文も受信したい場合:
188
+
189
+ ```bash
190
+ fleq --test including
191
+ ```
192
+
193
+ デバッグログを表示したい場合:
194
+
195
+ ```bash
196
+ fleq --debug
197
+ ```
198
+
199
+ 同一 API キーの既存 open socket を閉じてから接続したい場合:
200
+
201
+ ```bash
202
+ fleq --close-others
203
+ ```
204
+
205
+ ### 5. 実行中は REPL コマンドを使える
206
+
207
+ 起動中は `fleq>` プロンプトで各種コマンドを利用できます。
208
+
209
+ - `help`: コマンド一覧を表示
210
+ - `status`: 接続状態を確認
211
+ - `config`: 現在の設定を確認
212
+ - `quit`: 終了
213
+
214
+ 詳しくは下記の「REPLコマンド」を参照してください。
215
+
216
+ ## テスト
217
+
218
+ ```bash
219
+ # テストを実行します
220
+ npm test
221
+
222
+ # ウォッチモードで実行します
223
+ npm run test:watch
224
+ ```
225
+
226
+ - テストフレームワーク: Vitest
227
+ - テストファイル: 22件
228
+ - フィクスチャ: `test/fixtures/` に実電文XML 81件
229
+ - モックヘルパー: `test/helpers/mock-message.ts`
230
+
231
+ ## CLIオプション
232
+
233
+ | オプション | 説明 | デフォルト |
234
+ |-----------|------|-----------|
235
+ | `-k, --api-key <key>` | dmdata.jp APIキー | 環境変数 `DMDATA_API_KEY` |
236
+ | `-c, --classifications <items>` | 受信区分(カンマ区切り) | `telegram.earthquake,eew.forecast,eew.warning,telegram.volcano` |
237
+ | `--test <mode>` | テスト電文: `no` / `including` / `only` | `no` |
238
+ | `--keep-existing` | 既存接続を維持します(互換オプション。現在はデフォルトです) | `true` |
239
+ | `--close-others` | 同一APIキーの既存 open socket を閉じてから接続します | `false` |
240
+ | `--mode <mode>` | 表示モード: `normal` / `compact` | `normal` |
241
+ | `--debug` | デバッグログ表示 | `false` |
242
+
243
+ ## Config管理
244
+
245
+ 永続設定はOS別のディレクトリに保存されます。`config` サブコマンドで管理できます。
246
+
247
+ | OS | デフォルトパス |
248
+ |----|---------------|
249
+ | macOS | `~/Library/Application Support/fleq/config.json` |
250
+ | Linux | `~/.config/fleq/config.json` |
251
+ | Windows | `%APPDATA%\fleq\config.json` |
252
+
253
+ 環境変数 `XDG_CONFIG_HOME` が設定されている場合は、全OSで `$XDG_CONFIG_HOME/fleq/config.json` が優先されます。
254
+ 旧バージョンで `~/.config/fleq/` や `~/.config/dmdata-monitor/` に保存された設定は、初回起動時に自動的に移行されます。
255
+
256
+ ```bash
257
+ # 現在の設定を表示します
258
+ fleq config show
259
+
260
+ # 設定値を保存します
261
+ fleq config set <key> <value>
262
+
263
+ # 設定値を削除します
264
+ fleq config unset <key>
265
+
266
+ # Configファイルの保存先を表示します
267
+ fleq config path
268
+
269
+ # 設定可能キー一覧を表示します
270
+ fleq config keys
271
+ ```
272
+
273
+ 設定可能なキー:
274
+
275
+ | キー | 説明 |
276
+ |------|------|
277
+ | `apiKey` | dmdata.jp APIキー |
278
+ | `classifications` | 受信区分 (カンマ区切り: `telegram.earthquake,eew.forecast,eew.warning,telegram.volcano`) |
279
+ | `testMode` | テスト電文モード: `"no"` / `"including"` / `"only"` |
280
+ | `appName` | アプリケーション名 |
281
+ | `maxReconnectDelaySec` | 再接続の最大待機秒数 |
282
+ | `keepExistingConnections` | 同一APIキーの既存 open socket を維持するかどうか (`true` / `false`) |
283
+ | `tableWidth` | テーブル表示幅 (40〜200、デフォルト: 60) |
284
+ | `infoFullText` | お知らせ電文の全文表示 (`true` / `false`) |
285
+ | `displayMode` | 表示モード: `"normal"` / `"compact"` |
286
+ | `waitTipIntervalMin` | 待機中ヒント表示間隔(分, 0で無効、デフォルト: 30) |
287
+ | `promptClock` | プロンプト時計: `"elapsed"` (経過時間) / `"clock"` (現在時刻) |
288
+ | `sound` | 通知音の有効/無効 (`true` / `false`) |
289
+ | `eewLog` | EEWログ記録の有効/無効 (`true` / `false`) |
290
+ | `eewLogFields` | EEWログ記録項目の設定(オブジェクト形式) |
291
+ | `maxObservations` | 観測点の最大表示件数 (1〜999 / `"off"` で全件表示) |
292
+ | `backup` | EEW副回線の有効/無効 (`true` / `false`) |
293
+
294
+ 設定の優先順位(高い順):
295
+
296
+ 1. CLI オプション (`--api-key`, `--classifications`, `--test`, `--keep-existing`, `--close-others`)
297
+ 2. 環境変数 `DMDATA_API_KEY`(APIキーのみ)
298
+ 3. `.env` ファイル(APIキーのみ)
299
+ 4. Configファイル(`fleq config path` で確認可能)
300
+ 5. デフォルト値 (`DEFAULT_CONFIG`)
301
+
302
+ 補足:
303
+
304
+ - Config保存時と既存Config読み込み時は、可能な範囲で `0600` パーミッションへ調整します(APIキー保護のためです)。Windows では POSIX パーミッションが実効的でないため、ファイルシステムの ACL に依存します。
305
+ - **更新チェック:** FlEq は起動時に npm registry (`registry.npmjs.org`) へ HTTP リクエストを送信し、新しいバージョンの有無を確認します。npm registry に接続できない場合は GitHub Releases API (`api.github.com`) にフォールバックします。チェック結果は 24 時間キャッシュされ、キャッシュが有効な間は外部通信を行いません。この機能を無効にしたい場合は、環境変数 `FLEQ_NO_UPDATE_CHECK=1` を設定してください。
306
+ - DMDATA 公式仕様に合わせ、REST API の認証は `Authorization: Basic ...` を使用します。
307
+ - DMDATA 公式では、同時接続数に余裕がない場合のみ `Socket Close v2` の利用が案内されています。通常運用では `--close-others` は不要です。
308
+
309
+ ## 複数デバイスでの同時運用
310
+
311
+ 同一アカウントの複数APIキーを使って、複数のデバイスで FlEq を同時に起動する場合は、**デバイスごとに異なる `appName` を設定**してください。
312
+
313
+ ```bash
314
+ # デバイスA(例: Mac)
315
+ fleq config set appName fleq-mac
316
+
317
+ # デバイスB(例: Raspberry Pi)
318
+ fleq config set appName fleq-raspi
319
+ ```
320
+
321
+ FlEq は起動時に前回セッションの残留ソケットをクリーンアップしますが、`appName` が同じだと他デバイスのソケットまで閉じてしまいます。デバイスごとに異なる `appName` を設定することで、自分のソケットのみがクリーンアップ対象となり、他デバイスの接続に影響しません。
322
+
323
+ ## REPLコマンド
324
+
325
+ 実行中に `fleq> ` プロンプトで以下のコマンドを利用できます。
326
+
327
+ `help` コマンドでカテゴリ別のコマンド一覧を表示できます。
328
+
329
+ ### 情報
330
+ | コマンド | 説明 |
331
+ |----------|------|
332
+ | `help` / `?` | コマンド一覧を表示 |
333
+ | `history [N]` | 地震履歴を取得・表示(デフォルト10件、最新が一番下) |
334
+ | `colors` | カラーパレット・震度色の一覧を表示 |
335
+ | `detail [tsunami\|volcano]` | 直近の津波情報または火山警報状態を再表示 |
336
+
337
+ ### ステータス
338
+ | コマンド | 説明 |
339
+ |----------|------|
340
+ | `status` | WebSocket 接続状態を表示 |
341
+ | `config` | 現在の設定を表示 |
342
+ | `contract` | 契約区分一覧を表示 |
343
+ | `socket` | 接続中のソケット一覧を表示 |
344
+
345
+ ### 設定
346
+ | コマンド | 説明 |
347
+ |----------|------|
348
+ | `notify` | 通知カテゴリのON/OFF状態を表示 |
349
+ | `notify <category> [on\|off]` | 指定カテゴリの通知をトグル/ON/OFF |
350
+ | `notify all:on` / `all:off` | 全カテゴリの通知を一括ON/OFF |
351
+ | `eewlog` | EEWログ記録の設定を表示 |
352
+ | `eewlog on` / `off` | EEWログ記録の有効/無効を切替 |
353
+ | `eewlog fields` | EEWログ記録項目の一覧表示 |
354
+ | `eewlog fields <field> [on\|off]` | 記録項目のトグル/ON/OFF |
355
+ | `tablewidth [N\|auto]` | テーブル幅の表示・変更(例: `tablewidth 80`、`tablewidth auto` で自動追従) |
356
+ | `infotext [full/short]` | お知らせ電文の全文/省略切替 |
357
+ | `tipinterval [N]` | 待機中ヒント表示間隔(分)を表示・変更(0で無効) |
358
+ | `mode [normal/compact]` | 表示モード切替 |
359
+ | `clock [elapsed/now]` | プロンプト時計の切替 |
360
+ | `sound [on/off]` | 通知音のON/OFF切替 |
361
+ | `theme` | カラーテーマの表示・管理(`theme path` / `theme show` / `theme reset` / `theme reload` / `theme validate`) |
362
+ | `mute [duration]` | 通知を一時ミュート(例: `mute 30m`、`mute off` で解除) |
363
+ | `fold [N\|off]` | 観測点の表示件数制限(例: `fold 10`、`fold off` で全件表示) |
364
+
365
+ ### 操作
366
+ | コマンド | 説明 |
367
+ |----------|------|
368
+ | `test sound [level]` | サウンドテスト(レベル: critical, warning, normal, info, cancel) |
369
+ | `test table [type] [番号]` | 表示形式テスト |
370
+ | `backup [on/off]` | EEW副回線の状態表示・起動/停止 |
371
+ | `clear` | ターミナル画面をクリア |
372
+ | `retry` | WebSocket 再接続を手動試行 |
373
+ | `quit` / `exit` | アプリケーションを終了 |
374
+
375
+ ## CLIバイナリとnpm scripts
376
+
377
+ - CLIバイナリ名: `fleq` (`package.json` の `bin` 設定)
378
+ - `npm run dev`: build + run
379
+ - `npm run dev:lowmem`: build + メモリ最適化モードで run(`--optimize-for-size`)
380
+ - `npm run start:lowmem`: メモリ最適化モードで run(Raspberry Pi 等の低メモリ環境向け)
381
+ - `npm run clean`: `dist/` を削除
382
+ - `npm run release`: バージョン更新(Conventional Commitsに基づく)
383
+ - `npm run release:minor`: minor リリース
384
+ - `npm run release:major`: major リリース
385
+
386
+ ## アーキテクチャ
387
+
388
+ ```
389
+ src/
390
+ ├── index.ts # エントリポイント (薄いブートストラップのみ)
391
+ ├── types.ts # 共有型定義
392
+ ├── config.ts # Configファイル管理 (読み書き・バリデーション)
393
+ ├── logger.ts # ログレベル付きロガー
394
+ ├── utils/
395
+ │ ├── intensity.ts # 震度ランク変換 (intensityToRank)
396
+ │ └── secrets.ts # APIキーマスク (maskApiKey)
397
+ ├── engine/
398
+ │ ├── cli/
399
+ │ │ ├── cli.ts # Commander CLI定義
400
+ │ │ ├── cli-init.ts # インタラクティブ初期設定 (fleq init)
401
+ │ │ └── cli-run.ts # CLIアクションハンドラ (起動バナー・契約チェック)
402
+ │ ├── startup/
403
+ │ │ ├── config-resolver.ts # 設定解決 (CLI引数→環境変数→Config→デフォルト)
404
+ │ │ ├── tsunami-initializer.ts # 起動時の津波警報状態復元 (REST API)
405
+ │ │ ├── volcano-initializer.ts # 起動時の火山警報状態復元 (REST API)
406
+ │ │ └── update-checker.ts # npm 最新バージョンチェック
407
+ │ ├── monitor/
408
+ │ │ ├── monitor.ts # メインオーケストレーション (接続・受信委譲)
409
+ │ │ ├── shutdown.ts # グレースフルシャットダウン処理
410
+ │ │ └── repl-coordinator.ts # REPL表示・接続状態の協調制御
411
+ │ ├── messages/
412
+ │ │ ├── message-router.ts # 受信メッセージの分類・振り分け (全27種類)
413
+ │ │ ├── tsunami-state.ts # 津波警報状態管理 (プロンプト表示・detail コマンド)
414
+ │ │ └── volcano-state.ts # 火山警報状態管理 (複数火山同時追跡・プロンプト・detail)
415
+ │ ├── eew/
416
+ │ │ ├── eew-tracker.ts # EEW イベント追跡 (重複検出・状態管理・最終報処理)
417
+ │ │ └── eew-logger.ts # EEW ログファイル記録 (イベント別ファイル出力)
418
+ │ └── notification/
419
+ │ ├── notifier.ts # デスクトップ通知 (カテゴリ別ON/OFF)
420
+ │ ├── volcano-presentation.ts # 火山電文の表示/通知レベル判定
421
+ │ ├── node-notifier-loader.ts # node-notifier 遅延ロード (optional dependency)
422
+ │ └── sound-player.ts # クロスプラットフォーム通知音再生
423
+ ├── dmdata/
424
+ │ ├── rest-client.ts # dmdata.jp REST API クライアント
425
+ │ ├── ws-client.ts # WebSocket 接続管理 (再接続・ping-pong)
426
+ │ ├── connection-manager.ts # 接続管理インターフェース (ConnectionManager)
427
+ │ ├── multi-connection-manager.ts # 複線接続管理 (primary + backup)
428
+ │ ├── endpoint-selector.ts # エンドポイント選択・リージョン間フェイルオーバー
429
+ │ ├── telegram-parser.ts # XML電文パーサ (gzip+base64デコード)
430
+ │ └── volcano-parser.ts # 火山電文パーサ (10種類の火山電文に対応)
431
+ └── ui/
432
+ ├── formatter.ts # 共通ターミナル表示ユーティリティ (フレーム描画・テキスト処理)
433
+ ├── eew-formatter.ts # EEW 表示フォーマッタ
434
+ ├── earthquake-formatter.ts # 地震・津波・テキスト・南海トラフ・長周期 表示フォーマッタ
435
+ ├── volcano-formatter.ts # 火山 表示フォーマッタ
436
+ ├── theme.ts # テーマシステム (カラーパレット・ロール定義)
437
+ ├── repl.ts # REPL インタラクション
438
+ ├── test-samples.ts # 表示テスト用サンプルデータ
439
+ └── waiting-tips.ts # 待機中ヒント定義
440
+ ```
441
+
442
+ ## 対応電文タイプ(実装ベース)
443
+
444
+ | 電文タイプ | 分類 | パーサ関数 | 表示関数 |
445
+ |-----------|------|-----------|---------|
446
+ | `VXSE43` | `eew.warning` | `parseEewTelegram` | `displayEewInfo` |
447
+ | `VXSE44` | `eew.forecast` | `parseEewTelegram` | `displayEewInfo` |
448
+ | `VXSE45` | `eew.forecast` | `parseEewTelegram` | `displayEewInfo` |
449
+ | `VXSE51` | `telegram.earthquake` | `parseEarthquakeTelegram` | `displayEarthquakeInfo` |
450
+ | `VXSE52` | `telegram.earthquake` | `parseEarthquakeTelegram` | `displayEarthquakeInfo` |
451
+ | `VXSE53` | `telegram.earthquake` | `parseEarthquakeTelegram` | `displayEarthquakeInfo` |
452
+ | `VXSE56` | `telegram.earthquake` | `parseSeismicTextTelegram` | `displaySeismicTextInfo` |
453
+ | `VXSE60` | `telegram.earthquake` | `parseSeismicTextTelegram` | `displaySeismicTextInfo` |
454
+ | `VXSE61` | `telegram.earthquake` | `parseEarthquakeTelegram` | `displayEarthquakeInfo` |
455
+ | `VTSE41` | `telegram.earthquake` | `parseTsunamiTelegram` | `displayTsunamiInfo` |
456
+ | `VTSE51` | `telegram.earthquake` | `parseTsunamiTelegram` | `displayTsunamiInfo` |
457
+ | `VTSE52` | `telegram.earthquake` | `parseTsunamiTelegram` | `displayTsunamiInfo` |
458
+ | `VZSE40` | `telegram.earthquake` | `parseSeismicTextTelegram` | `displaySeismicTextInfo` |
459
+ | `VXSE62` | `telegram.earthquake` | `parseLgObservationTelegram` | `displayLgObservationInfo` |
460
+ | `VYSE50` | `telegram.earthquake` | `parseNankaiTroughTelegram` | `displayNankaiTroughInfo` |
461
+ | `VYSE51` | `telegram.earthquake` | `parseNankaiTroughTelegram` | `displayNankaiTroughInfo` |
462
+ | `VYSE52` | `telegram.earthquake` | `parseNankaiTroughTelegram` | `displayNankaiTroughInfo` |
463
+ | `VYSE60` | `telegram.earthquake` | `parseNankaiTroughTelegram` | `displayNankaiTroughInfo` |
464
+ | `VZVO40` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
465
+ | `VFVO50` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
466
+ | `VFVO51` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
467
+ | `VFVO52` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
468
+ | `VFSVii` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
469
+ | `VFVO53` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
470
+ | `VFVO54` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
471
+ | `VFVO55` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
472
+ | `VFVO56` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
473
+ | `VFVO60` | `telegram.volcano` | `parseVolcanoTelegram` | `displayVolcanoInfo` |
474
+
475
+ ## 主な機能
476
+
477
+ - WebSocketによるリアルタイム受信
478
+ - gzip圧縮+base64エンコードされたXML電文の自動デコード
479
+ - 展開サイズ上限チェック(10MB)
480
+ - 震度に応じた色分け表示
481
+ - 緊急地震速報(警報/予報)の視覚的な強調表示
482
+ - PLUM法・仮定震源要素・既到達の検出と視覚的表示
483
+ - EEWイベントの同時追跡(EventID単位、重複報スキップ、取消対応)
484
+ - EEWイベントのログファイル記録(イベント別ファイル出力、差分表記対応、記録項目の選択可能)
485
+ - EEW最終報(NextAdvisory)の検出とログ・トラッカー自動終了
486
+ - EEW差分表記(前の値 → 新しい値 形式)
487
+ - テーブル幅設定(40〜200、`auto` でターミナル幅に自動追従)とテキスト折り返し機能
488
+ - 表示モード切替(normal / compact)
489
+ - お知らせ電文の全文/省略切替
490
+ - 通知の一時ミュート機能(時間指定)
491
+ - 待機中ヒント表示(間隔設定可能、0で無効)
492
+ - インタラクティブ初期設定(`fleq init`)
493
+ - 津波警報状態管理とプロンプト表示(`detail` コマンドで津波情報を再表示)
494
+ - 通知音再生(レベル別サウンド、クロスプラットフォーム対応)
495
+ - 南海トラフ地震関連情報(VYSE50-52/VYSE60)の表示
496
+ - 長周期地震動に関する観測情報(VXSE62)の表示
497
+ - 地震活動に関する情報(VZSE40)の表示
498
+ - 火山情報の表示(噴火警報・噴火速報・降灰予報・火山の状況に関する解説情報・噴煙流向報・火山海上警報等、10種類の火山電文に対応)
499
+ - 火山警報状態管理(複数火山の同時追跡、プロンプト表示、`detail volcano` コマンドで再表示)
500
+ - 起動時の津波・火山警報状態復元(REST APIで最新状態を取得)
501
+ - EEWで主要動到達と推測される地域のリスト表示
502
+ - デスクトップ通知機能(カテゴリ別ON/OFF、REPLで管理。下記「デスクトップ通知」参照)
503
+ - テーマシステム(CUD配色準拠のカラーパレット + セマンティックロール、`theme.json` でカスタマイズ可能)
504
+ - 観測点の表示件数制限(`fold` コマンド)
505
+ - EEW副回線(backup)による複線接続
506
+ - エンドポイント選択・リージョン間フェイルオーバー
507
+ - 指数バックオフによる自動再接続
508
+ - ping-pongによる接続維持
509
+ - ハートビート監視(90秒)
510
+ - 既存ソケットの自動クリーンアップ
511
+ - Configファイルによる永続設定管理
512
+
513
+ ## デスクトップ通知
514
+
515
+ `node-notifier` パッケージによるデスクトップ通知に対応しています(optional dependency)。
516
+
517
+ | OS | 通知バックエンド |
518
+ |----|----------------|
519
+ | macOS | Notification Center |
520
+ | Linux | `notify-send` (`libnotify`) |
521
+ | Windows | Windows Toast Notifications |
522
+
523
+ **Linux での注意事項:**
524
+
525
+ - デスクトップ環境では通常 `notify-send` がプリインストールされていますが、ない場合は手動インストールが必要です:
526
+ ```bash
527
+ # Debian / Ubuntu / Raspberry Pi OS
528
+ sudo apt install libnotify-bin
529
+ ```
530
+ - ヘッドレス環境(サーバー、SSH接続のみ)では通知を表示する手段がないため、通知機能は自動的に無効になります。アプリの動作には影響しません。
531
+ - `node-notifier` のインストールに失敗した場合でも、通知以外の機能は正常に動作します。
532
+
533
+ ## ライセンス
534
+
535
+ MIT
File without changes
File without changes
Binary file
Binary file
Binary file
Binary file
Binary file