@sayue_ltr/fleq 1.50.1 → 2.0.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/CHANGELOG.md +174 -0
- package/README.md +42 -6
- package/dist/config.js +37 -4
- package/dist/dmdata/rest-client.js +58 -3
- package/dist/dmdata/telegram-parser.js +115 -64
- package/dist/dmdata/ws-client.js +49 -18
- package/dist/engine/cli/cli-run.js +88 -3
- package/dist/engine/cli/cli.js +12 -0
- package/dist/engine/eew/eew-tracker.js +41 -15
- package/dist/engine/filter/compile-filter.js +21 -0
- package/dist/engine/filter/compiler.js +188 -0
- package/dist/engine/filter/errors.js +41 -0
- package/dist/engine/filter/field-registry.js +78 -0
- package/dist/engine/filter/index.js +15 -0
- package/dist/engine/filter/parser.js +137 -0
- package/dist/engine/filter/rank-maps.js +34 -0
- package/dist/engine/filter/tokenizer.js +121 -0
- package/dist/engine/filter/type-checker.js +104 -0
- package/dist/engine/filter/types.js +2 -0
- package/dist/engine/filter-template/pipeline-controller.js +73 -0
- package/dist/engine/filter-template/pipeline.js +16 -0
- package/dist/engine/messages/display-callbacks.js +7 -0
- package/dist/engine/messages/message-router.js +114 -182
- package/dist/engine/messages/summary-tracker.js +106 -0
- package/dist/engine/messages/telegram-stats.js +103 -0
- package/dist/engine/messages/volcano-route-handler.js +122 -0
- package/dist/engine/monitor/monitor.js +52 -4
- package/dist/engine/monitor/shutdown.js +1 -0
- package/dist/engine/notification/notifier.js +21 -4
- package/dist/engine/notification/sound-player.js +398 -36
- package/dist/engine/presentation/diff-store.js +158 -0
- package/dist/engine/presentation/diff-types.js +2 -0
- package/dist/engine/presentation/events/from-earthquake.js +53 -0
- package/dist/engine/presentation/events/from-eew.js +72 -0
- package/dist/engine/presentation/events/from-lg-observation.js +58 -0
- package/dist/engine/presentation/events/from-nankai-trough.js +39 -0
- package/dist/engine/presentation/events/from-raw.js +35 -0
- package/dist/engine/presentation/events/from-seismic-text.js +37 -0
- package/dist/engine/presentation/events/from-tsunami.js +51 -0
- package/dist/engine/presentation/events/from-volcano.js +88 -0
- package/dist/engine/presentation/events/to-presentation-event.js +32 -0
- package/dist/engine/presentation/level-helpers.js +118 -0
- package/dist/engine/presentation/processors/process-earthquake.js +36 -0
- package/dist/engine/presentation/processors/process-eew.js +105 -0
- package/dist/engine/presentation/processors/process-lg-observation.js +30 -0
- package/dist/engine/presentation/processors/process-message.js +53 -0
- package/dist/engine/presentation/processors/process-nankai-trough.js +30 -0
- package/dist/engine/presentation/processors/process-raw.js +22 -0
- package/dist/engine/presentation/processors/process-seismic-text.js +30 -0
- package/dist/engine/presentation/processors/process-tsunami.js +42 -0
- package/dist/engine/presentation/processors/process-volcano.js +41 -0
- package/dist/engine/presentation/types.js +2 -0
- package/dist/engine/startup/config-resolver.js +2 -0
- package/dist/engine/template/compile-template.js +18 -0
- package/dist/engine/template/compiler.js +105 -0
- package/dist/engine/template/field-accessor.js +31 -0
- package/dist/engine/template/filters.js +100 -0
- package/dist/engine/template/index.js +5 -0
- package/dist/engine/template/parser.js +185 -0
- package/dist/engine/template/tokenizer.js +96 -0
- package/dist/engine/template/types.js +2 -0
- package/dist/types.js +3 -2
- package/dist/ui/display-adapter.js +60 -0
- package/dist/ui/earthquake-formatter.js +22 -5
- package/dist/ui/eew-formatter.js +25 -10
- package/dist/ui/formatter.js +116 -32
- package/dist/ui/minimap/grid-layout.js +91 -0
- package/dist/ui/minimap/index.js +16 -0
- package/dist/ui/minimap/minimap-renderer.js +277 -0
- package/dist/ui/minimap/pref-mapping.js +82 -0
- package/dist/ui/minimap/types.js +2 -0
- package/dist/ui/night-overlay.js +56 -0
- package/dist/ui/repl-handlers/command-definitions.js +327 -0
- package/dist/ui/repl-handlers/index.js +11 -0
- package/dist/ui/repl-handlers/info-handlers.js +633 -0
- package/dist/ui/repl-handlers/operation-handlers.js +233 -0
- package/dist/ui/repl-handlers/settings-handlers.js +927 -0
- package/dist/ui/repl-handlers/types.js +10 -0
- package/dist/ui/repl.js +81 -1752
- package/dist/ui/statistics-formatter.js +258 -0
- package/dist/ui/status-line.js +80 -0
- package/dist/ui/summary/index.js +5 -0
- package/dist/ui/summary/summary-line.js +18 -0
- package/dist/ui/summary/summary-model.js +31 -0
- package/dist/ui/summary/token-builders.js +317 -0
- package/dist/ui/summary/types.js +2 -0
- package/dist/ui/summary/width-fit.js +41 -0
- package/dist/ui/summary-interval-formatter.js +72 -0
- package/dist/ui/test-samples.js +6 -0
- package/dist/ui/theme.js +43 -5
- package/dist/ui/tip-shuffler.js +81 -0
- package/dist/ui/volcano-formatter.js +15 -13
- package/dist/ui/waiting-tips-eew.js +63 -0
- package/dist/ui/waiting-tips-info-systems.js +81 -0
- package/dist/ui/waiting-tips-seismology.js +97 -0
- package/dist/ui/waiting-tips-tsunami.js +72 -0
- package/dist/ui/waiting-tips-weather.js +189 -0
- package/dist/ui/waiting-tips.js +420 -249
- package/package.json +1 -1
|
@@ -0,0 +1,233 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.handleTest = handleTest;
|
|
40
|
+
exports.handleClear = handleClear;
|
|
41
|
+
exports.handleBackup = handleBackup;
|
|
42
|
+
exports.handleRetry = handleRetry;
|
|
43
|
+
exports.handleQuit = handleQuit;
|
|
44
|
+
const readline_1 = __importDefault(require("readline"));
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const sound_player_1 = require("../../engine/notification/sound-player");
|
|
47
|
+
const test_samples_1 = require("../test-samples");
|
|
48
|
+
const log = __importStar(require("../../logger"));
|
|
49
|
+
const info_handlers_1 = require("./info-handlers");
|
|
50
|
+
/** test table 電文タイプ名のエイリアス (短縮形 → 正式名) */
|
|
51
|
+
const TABLE_TYPE_ALIASES = {
|
|
52
|
+
eq: "earthquake",
|
|
53
|
+
tsu: "tsunami",
|
|
54
|
+
st: "seismicText",
|
|
55
|
+
nt: "nankaiTrough",
|
|
56
|
+
lgob: "lgObservation",
|
|
57
|
+
vc: "volcano",
|
|
58
|
+
};
|
|
59
|
+
/** test table の電文タイプ名を解決する (case-insensitive + エイリアス) */
|
|
60
|
+
function resolveTestTableType(input) {
|
|
61
|
+
const lower = input.toLowerCase();
|
|
62
|
+
for (const key of Object.keys(test_samples_1.TEST_TABLES)) {
|
|
63
|
+
if (key.toLowerCase() === lower)
|
|
64
|
+
return key;
|
|
65
|
+
}
|
|
66
|
+
return TABLE_TYPE_ALIASES[lower] ?? null;
|
|
67
|
+
}
|
|
68
|
+
// ── コマンドハンドラ ──
|
|
69
|
+
function handleTest(ctx, args) {
|
|
70
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
71
|
+
const sub = parts[0] ?? "";
|
|
72
|
+
if (sub === "") {
|
|
73
|
+
const testEntry = ctx.commands["test"];
|
|
74
|
+
console.log();
|
|
75
|
+
console.log(chalk_1.default.cyan.bold(" test サブコマンド:"));
|
|
76
|
+
if (testEntry.subcommands) {
|
|
77
|
+
for (const [name, sc] of Object.entries(testEntry.subcommands)) {
|
|
78
|
+
console.log(chalk_1.default.white(` ${name.padEnd(14)}`) + chalk_1.default.gray(sc.description));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
console.log();
|
|
82
|
+
console.log(chalk_1.default.gray(" 詳細: help test <subcommand>"));
|
|
83
|
+
console.log();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const subLower = sub.toLowerCase();
|
|
87
|
+
if (subLower === "sound" || subLower === "snd") {
|
|
88
|
+
handleTestSound(parts.slice(1).join(" "));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (subLower === "table" || subLower === "tbl") {
|
|
92
|
+
handleTestTable(parts.slice(1).join(" "));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
console.log(chalk_1.default.yellow(` 不明なサブコマンド: ${sub}`) + chalk_1.default.gray(" (sound / table)"));
|
|
96
|
+
}
|
|
97
|
+
function handleTestSound(args) {
|
|
98
|
+
const level = args.trim().toLowerCase();
|
|
99
|
+
if (level === "") {
|
|
100
|
+
console.log();
|
|
101
|
+
console.log(chalk_1.default.cyan.bold(" 利用可能なサウンドレベル:"));
|
|
102
|
+
for (const l of sound_player_1.SOUND_LEVELS) {
|
|
103
|
+
console.log(chalk_1.default.white(` ${l}`));
|
|
104
|
+
}
|
|
105
|
+
console.log();
|
|
106
|
+
console.log(chalk_1.default.gray(" 使い方: test sound <level>"));
|
|
107
|
+
console.log();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!(0, sound_player_1.isSoundLevel)(level)) {
|
|
111
|
+
console.log(chalk_1.default.yellow(` 不明なサウンドレベル: ${level}`));
|
|
112
|
+
console.log(chalk_1.default.gray(` 有効な値: ${sound_player_1.SOUND_LEVELS.join(", ")}`));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
console.log(chalk_1.default.gray(` サウンドテスト: ${level} を再生中...`));
|
|
116
|
+
(0, sound_player_1.playSound)(level);
|
|
117
|
+
}
|
|
118
|
+
function handleTestTable(args) {
|
|
119
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
120
|
+
const type = parts[0] ?? "";
|
|
121
|
+
const variantArg = parts[1];
|
|
122
|
+
if (type === "") {
|
|
123
|
+
console.log();
|
|
124
|
+
console.log(chalk_1.default.cyan.bold(" 利用可能な電文タイプ:"));
|
|
125
|
+
const aliasReverse = {};
|
|
126
|
+
for (const [alias, canonical] of Object.entries(TABLE_TYPE_ALIASES)) {
|
|
127
|
+
(aliasReverse[canonical] ??= []).push(alias);
|
|
128
|
+
}
|
|
129
|
+
for (const [key, entry] of Object.entries(test_samples_1.TEST_TABLES)) {
|
|
130
|
+
const count = entry.variants.length;
|
|
131
|
+
const aliases = aliasReverse[key];
|
|
132
|
+
const aliasText = aliases != null ? ` (${aliases.join(", ")})` : "";
|
|
133
|
+
const nameCol = `${key}${aliasText}`;
|
|
134
|
+
console.log(chalk_1.default.white(` ${nameCol.padEnd(24)}`) +
|
|
135
|
+
chalk_1.default.gray(`${entry.label}`) +
|
|
136
|
+
chalk_1.default.gray(` (${count}件)`));
|
|
137
|
+
}
|
|
138
|
+
console.log();
|
|
139
|
+
console.log(chalk_1.default.gray(" 使い方: test table <type> [番号]"));
|
|
140
|
+
console.log();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const resolvedType = resolveTestTableType(type);
|
|
144
|
+
const entry = resolvedType != null ? test_samples_1.TEST_TABLES[resolvedType] : undefined;
|
|
145
|
+
if (entry == null) {
|
|
146
|
+
console.log(chalk_1.default.yellow(` 不明な電文タイプ: ${type}`));
|
|
147
|
+
console.log(chalk_1.default.gray(` 有効な値: ${Object.keys(test_samples_1.TEST_TABLES).join(", ")}`));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (variantArg == null) {
|
|
151
|
+
console.log();
|
|
152
|
+
console.log(chalk_1.default.cyan.bold(` ${entry.label} バリエーション:`));
|
|
153
|
+
for (const [i, v] of entry.variants.entries()) {
|
|
154
|
+
console.log(chalk_1.default.white(` ${String(i + 1).padEnd(4)}`) + chalk_1.default.gray(v.label));
|
|
155
|
+
}
|
|
156
|
+
console.log();
|
|
157
|
+
console.log(chalk_1.default.gray(` 使い方: test table ${resolvedType} <番号>`));
|
|
158
|
+
console.log();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const variantNum = parseInt(variantArg, 10);
|
|
162
|
+
if (isNaN(variantNum) || variantNum < 1 || variantNum > entry.variants.length) {
|
|
163
|
+
console.log(chalk_1.default.yellow(` 不明な番号: ${variantArg} (1〜${entry.variants.length})`));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const variant = entry.variants[variantNum - 1];
|
|
167
|
+
console.log(chalk_1.default.gray(` 表示テスト: ${entry.label} #${variantNum} ${variant.label}`));
|
|
168
|
+
variant.run();
|
|
169
|
+
}
|
|
170
|
+
function handleClear() {
|
|
171
|
+
if (process.stdout.isTTY) {
|
|
172
|
+
readline_1.default.cursorTo(process.stdout, 0, 0);
|
|
173
|
+
readline_1.default.clearScreenDown(process.stdout);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
console.clear();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function handleBackup(ctx, args) {
|
|
180
|
+
if (!(0, info_handlers_1.hasBackupSupport)(ctx.wsManager)) {
|
|
181
|
+
console.log(chalk_1.default.yellow(" この構成では副回線は利用できません"));
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const sub = args.trim().toLowerCase();
|
|
185
|
+
if (sub === "") {
|
|
186
|
+
if (ctx.wsManager.isBackupRunning()) {
|
|
187
|
+
const bs = ctx.wsManager.getBackupStatus();
|
|
188
|
+
console.log(chalk_1.default.white(" 副回線: ") +
|
|
189
|
+
(bs?.connected ? chalk_1.default.green.bold("接続中") : chalk_1.default.yellow("再接続中")));
|
|
190
|
+
if (bs?.socketId != null) {
|
|
191
|
+
console.log(chalk_1.default.white(" SocketID: ") + chalk_1.default.white(String(bs.socketId)));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.log(chalk_1.default.white(" 副回線: ") + chalk_1.default.gray("未起動"));
|
|
196
|
+
}
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (sub === "on") {
|
|
200
|
+
const result = await ctx.wsManager.startBackup();
|
|
201
|
+
if (result !== "started") {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
ctx.updateConfig((c) => { c.backup = true; });
|
|
205
|
+
ctx.config.backup = true;
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (sub === "off") {
|
|
209
|
+
ctx.wsManager.stopBackup();
|
|
210
|
+
ctx.updateConfig((c) => { c.backup = false; });
|
|
211
|
+
ctx.config.backup = false;
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
console.log(chalk_1.default.yellow(" 使い方: backup / backup on / backup off"));
|
|
215
|
+
}
|
|
216
|
+
async function handleRetry(ctx) {
|
|
217
|
+
const status = ctx.wsManager.getStatus();
|
|
218
|
+
if (status.connected) {
|
|
219
|
+
console.log(chalk_1.default.gray(" 既に接続中です。"));
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
console.log(chalk_1.default.gray(" 再接続を試行中..."));
|
|
223
|
+
try {
|
|
224
|
+
await ctx.wsManager.connect();
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
log.error(`再接続に失敗しました: ${err instanceof Error ? err.message : err}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function handleQuit(ctx) {
|
|
231
|
+
ctx.stop();
|
|
232
|
+
await ctx.onQuit();
|
|
233
|
+
}
|