@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.
- package/CHANGELOG.md +898 -0
- package/LICENSE +21 -0
- package/README.md +535 -0
- package/assets/icons/.gitkeep +0 -0
- package/assets/sounds/.gitkeep +0 -0
- package/assets/sounds/cancel.mp3 +0 -0
- package/assets/sounds/critical.mp3 +0 -0
- package/assets/sounds/info.mp3 +0 -0
- package/assets/sounds/normal.mp3 +0 -0
- package/assets/sounds/warning.mp3 +0 -0
- package/dist/config.js +638 -0
- package/dist/dmdata/connection-manager.js +2 -0
- package/dist/dmdata/endpoint-selector.js +185 -0
- package/dist/dmdata/multi-connection-manager.js +158 -0
- package/dist/dmdata/rest-client.js +281 -0
- package/dist/dmdata/telegram-parser.js +704 -0
- package/dist/dmdata/volcano-parser.js +647 -0
- package/dist/dmdata/ws-client.js +336 -0
- package/dist/engine/cli/cli-init.js +266 -0
- package/dist/engine/cli/cli-run.js +121 -0
- package/dist/engine/cli/cli.js +121 -0
- package/dist/engine/eew/eew-logger.js +355 -0
- package/dist/engine/eew/eew-tracker.js +229 -0
- package/dist/engine/messages/message-router.js +261 -0
- package/dist/engine/messages/tsunami-state.js +96 -0
- package/dist/engine/messages/volcano-state.js +131 -0
- package/dist/engine/messages/volcano-vfvo53-aggregator.js +173 -0
- package/dist/engine/monitor/monitor.js +118 -0
- package/dist/engine/monitor/repl-coordinator.js +63 -0
- package/dist/engine/monitor/shutdown.js +114 -0
- package/dist/engine/notification/node-notifier-loader.js +19 -0
- package/dist/engine/notification/notifier.js +338 -0
- package/dist/engine/notification/sound-player.js +230 -0
- package/dist/engine/notification/volcano-presentation.js +166 -0
- package/dist/engine/startup/config-resolver.js +139 -0
- package/dist/engine/startup/tsunami-initializer.js +91 -0
- package/dist/engine/startup/update-checker.js +229 -0
- package/dist/engine/startup/volcano-initializer.js +89 -0
- package/dist/index.js +24 -0
- package/dist/logger.js +95 -0
- package/dist/types.js +61 -0
- package/dist/ui/earthquake-formatter.js +871 -0
- package/dist/ui/eew-formatter.js +335 -0
- package/dist/ui/formatter.js +689 -0
- package/dist/ui/repl.js +2059 -0
- package/dist/ui/test-samples.js +880 -0
- package/dist/ui/theme.js +516 -0
- package/dist/ui/volcano-formatter.js +667 -0
- package/dist/ui/waiting-tips.js +227 -0
- package/dist/utils/intensity.js +13 -0
- package/dist/utils/secrets.js +14 -0
- package/package.json +69 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.restoreVolcanoState = restoreVolcanoState;
|
|
37
|
+
const rest_client_1 = require("../../dmdata/rest-client");
|
|
38
|
+
const volcano_parser_1 = require("../../dmdata/volcano-parser");
|
|
39
|
+
const log = __importStar(require("../../logger"));
|
|
40
|
+
/** TelegramListItem を WsDataMessage 互換の形に変換する (body は呼び出し側で確認済み前提) */
|
|
41
|
+
function toWsDataMessage(item, body) {
|
|
42
|
+
return {
|
|
43
|
+
type: "data",
|
|
44
|
+
version: "2.0",
|
|
45
|
+
classification: item.classification,
|
|
46
|
+
id: item.id,
|
|
47
|
+
passing: [],
|
|
48
|
+
head: item.head,
|
|
49
|
+
xmlReport: item.xmlReport,
|
|
50
|
+
format: item.format,
|
|
51
|
+
compression: item.compression,
|
|
52
|
+
encoding: item.encoding,
|
|
53
|
+
body,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 起動時に最新の VFVO50 電文を取得し、火山警報状態を復元する。
|
|
58
|
+
* エラー時は警告ログのみ出力し、アプリの起動を妨げない。
|
|
59
|
+
*/
|
|
60
|
+
async function restoreVolcanoState(apiKey, volcanoState) {
|
|
61
|
+
try {
|
|
62
|
+
const res = await (0, rest_client_1.listTelegrams)(apiKey, "VFVO50", 1);
|
|
63
|
+
if (res.items.length === 0) {
|
|
64
|
+
log.debug("VFVO50 電文なし: 火山状態の復元をスキップ");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const item = res.items[0];
|
|
68
|
+
if (!item.body) {
|
|
69
|
+
log.debug("VFVO50 電文に body が含まれていません: 火山状態の復元をスキップ");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const msg = toWsDataMessage(item, item.body);
|
|
73
|
+
const info = (0, volcano_parser_1.parseVolcanoTelegram)(msg);
|
|
74
|
+
if (info == null) {
|
|
75
|
+
log.debug("VFVO50 電文のパースに失敗: 火山状態の復元をスキップ");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
volcanoState.update(info);
|
|
79
|
+
if (volcanoState.size() > 0) {
|
|
80
|
+
log.info(`火山警報状態を復元しました (${volcanoState.size()} 件)`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
log.debug("最新の VFVO50 は警報なし (解除または平常)");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
log.warn(`火山状態の復元に失敗しました: ${err instanceof Error ? err.message : err}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
process.env.DOTENV_CONFIG_QUIET = "true";
|
|
8
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
9
|
+
dotenv_1.default.config();
|
|
10
|
+
// ── トゥルーカラー強制 ──
|
|
11
|
+
// chalk の自動検出では Windows PowerShell や一部ターミナルで
|
|
12
|
+
// トゥルーカラー (level 3) を検出できず、RGB 値が 256 色に
|
|
13
|
+
// ダウングレードされて色味がずれることがある。
|
|
14
|
+
// 何らかの色サポートがある場合はトゥルーカラーに引き上げる。
|
|
15
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
16
|
+
if (chalk_1.default.level > 0 && chalk_1.default.level < 3) {
|
|
17
|
+
chalk_1.default.level = 3;
|
|
18
|
+
}
|
|
19
|
+
const cli_1 = require("./engine/cli/cli");
|
|
20
|
+
const program = (0, cli_1.buildProgram)();
|
|
21
|
+
program.parseAsync().catch((err) => {
|
|
22
|
+
console.error(`致命的エラー: ${err instanceof Error ? err.message : err}`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
});
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LogLevel = void 0;
|
|
7
|
+
exports.setLogLevel = setLogLevel;
|
|
8
|
+
exports.setLogPrefixBuilder = setLogPrefixBuilder;
|
|
9
|
+
exports.setLogHooks = setLogHooks;
|
|
10
|
+
exports.debug = debug;
|
|
11
|
+
exports.info = info;
|
|
12
|
+
exports.warn = warn;
|
|
13
|
+
exports.error = error;
|
|
14
|
+
exports.alert = alert;
|
|
15
|
+
exports.eewWarning = eewWarning;
|
|
16
|
+
exports.eewForecast = eewForecast;
|
|
17
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
18
|
+
var LogLevel;
|
|
19
|
+
(function (LogLevel) {
|
|
20
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
21
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
22
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
23
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
24
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
25
|
+
let currentLevel = LogLevel.INFO;
|
|
26
|
+
function setLogLevel(level) {
|
|
27
|
+
currentLevel = level;
|
|
28
|
+
}
|
|
29
|
+
/** ログ行のプレフィックスビルダー (REPL から動的に差し替え可能) */
|
|
30
|
+
let prefixBuilder = null;
|
|
31
|
+
/** ログ出力前後のフック (REPL プロンプト行クリア・再描画用) */
|
|
32
|
+
let logHooks = null;
|
|
33
|
+
/** プレフィックスビルダーを設定する */
|
|
34
|
+
function setLogPrefixBuilder(builder) {
|
|
35
|
+
prefixBuilder = builder;
|
|
36
|
+
}
|
|
37
|
+
/** ログ出力前後のフックを設定する */
|
|
38
|
+
function setLogHooks(hooks) {
|
|
39
|
+
logHooks = hooks;
|
|
40
|
+
}
|
|
41
|
+
/** 現在のプレフィックスを取得する */
|
|
42
|
+
function getPrefix() {
|
|
43
|
+
if (prefixBuilder)
|
|
44
|
+
return prefixBuilder();
|
|
45
|
+
// デフォルト: 未接続状態のプレフィックス
|
|
46
|
+
return chalk_1.default.gray("FlEq [○ --:--:--]> ");
|
|
47
|
+
}
|
|
48
|
+
function debug(msg, ...args) {
|
|
49
|
+
if (currentLevel <= LogLevel.DEBUG) {
|
|
50
|
+
if (logHooks)
|
|
51
|
+
logHooks.beforeLog();
|
|
52
|
+
console.log(getPrefix() + chalk_1.default.gray(`[DEBUG] ${msg}`), ...args);
|
|
53
|
+
if (logHooks)
|
|
54
|
+
logHooks.afterLog();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function info(msg, ...args) {
|
|
58
|
+
if (currentLevel <= LogLevel.INFO) {
|
|
59
|
+
if (logHooks)
|
|
60
|
+
logHooks.beforeLog();
|
|
61
|
+
console.log(getPrefix() + chalk_1.default.white(msg), ...args);
|
|
62
|
+
if (logHooks)
|
|
63
|
+
logHooks.afterLog();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function warn(msg, ...args) {
|
|
67
|
+
if (currentLevel <= LogLevel.WARN) {
|
|
68
|
+
if (logHooks)
|
|
69
|
+
logHooks.beforeLog();
|
|
70
|
+
console.log(getPrefix() + chalk_1.default.yellow(msg), ...args);
|
|
71
|
+
if (logHooks)
|
|
72
|
+
logHooks.afterLog();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function error(msg, ...args) {
|
|
76
|
+
if (currentLevel <= LogLevel.ERROR) {
|
|
77
|
+
if (logHooks)
|
|
78
|
+
logHooks.beforeLog();
|
|
79
|
+
console.log(getPrefix() + chalk_1.default.red(msg), ...args);
|
|
80
|
+
if (logHooks)
|
|
81
|
+
logHooks.afterLog();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** 重要な地震情報向け:赤背景白文字 */
|
|
85
|
+
function alert(msg) {
|
|
86
|
+
console.log(chalk_1.default.bgRed.white.bold(` ${msg} `));
|
|
87
|
+
}
|
|
88
|
+
/** EEW警報向け:黄背景黒文字 */
|
|
89
|
+
function eewWarning(msg) {
|
|
90
|
+
console.log(chalk_1.default.bgYellow.black.bold(` ⚠ ${msg} `));
|
|
91
|
+
}
|
|
92
|
+
/** EEW予報向け */
|
|
93
|
+
function eewForecast(msg) {
|
|
94
|
+
console.log(chalk_1.default.bgCyan.black(` ${msg} `));
|
|
95
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_CONFIG = void 0;
|
|
4
|
+
/** デフォルト設定 */
|
|
5
|
+
exports.DEFAULT_CONFIG = {
|
|
6
|
+
classifications: ["telegram.earthquake", "eew.forecast", "eew.warning", "telegram.volcano"],
|
|
7
|
+
testMode: "no",
|
|
8
|
+
appName: "fleq",
|
|
9
|
+
maxReconnectDelaySec: 60,
|
|
10
|
+
keepExistingConnections: true,
|
|
11
|
+
tableWidth: null,
|
|
12
|
+
infoFullText: false,
|
|
13
|
+
displayMode: "normal",
|
|
14
|
+
promptClock: "elapsed",
|
|
15
|
+
waitTipIntervalMin: 30,
|
|
16
|
+
notify: {
|
|
17
|
+
eew: true,
|
|
18
|
+
earthquake: true,
|
|
19
|
+
tsunami: true,
|
|
20
|
+
seismicText: true,
|
|
21
|
+
nankaiTrough: true,
|
|
22
|
+
lgObservation: true,
|
|
23
|
+
volcano: true,
|
|
24
|
+
},
|
|
25
|
+
sound: true,
|
|
26
|
+
eewLog: true,
|
|
27
|
+
eewLogFields: {
|
|
28
|
+
hypocenter: true,
|
|
29
|
+
originTime: true,
|
|
30
|
+
coordinates: true,
|
|
31
|
+
magnitude: true,
|
|
32
|
+
forecastIntensity: true,
|
|
33
|
+
maxLgInt: true,
|
|
34
|
+
forecastAreas: true,
|
|
35
|
+
lgIntensity: true,
|
|
36
|
+
isPlum: true,
|
|
37
|
+
hasArrived: true,
|
|
38
|
+
diff: true,
|
|
39
|
+
maxIntChangeReason: true,
|
|
40
|
+
},
|
|
41
|
+
maxObservations: null,
|
|
42
|
+
backup: false,
|
|
43
|
+
truncation: {
|
|
44
|
+
seismicTextLines: 15,
|
|
45
|
+
nankaiTroughLines: 20,
|
|
46
|
+
volcanoAlertLines: 10,
|
|
47
|
+
volcanoEruptionLines: 8,
|
|
48
|
+
volcanoTextLines: 8,
|
|
49
|
+
volcanoAshfallQuickLines: 8,
|
|
50
|
+
volcanoAshfallDetailLines: 16,
|
|
51
|
+
volcanoAshfallRegularLines: 10,
|
|
52
|
+
volcanoPreventionLines: 8,
|
|
53
|
+
volcanoMunicipalities: 6,
|
|
54
|
+
ashfallAreasQuick: 5,
|
|
55
|
+
ashfallAreasOther: 3,
|
|
56
|
+
ashfallPeriodsQuick: 1,
|
|
57
|
+
ashfallPeriodsOther: 3,
|
|
58
|
+
plumeWindSampleRows: 5,
|
|
59
|
+
tsunamiCompactForecastAreas: 3,
|
|
60
|
+
},
|
|
61
|
+
};
|