@switchbot/openapi-cli 3.2.1 → 3.2.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/README.md +3 -1
- package/dist/index.js +57349 -170
- package/package.json +9 -5
- package/dist/api/client.d.ts +0 -31
- package/dist/api/client.js +0 -236
- package/dist/api/client.js.map +0 -1
- package/dist/auth.d.ts +0 -1
- package/dist/auth.js +0 -21
- package/dist/auth.js.map +0 -1
- package/dist/commands/agent-bootstrap.d.ts +0 -10
- package/dist/commands/agent-bootstrap.js +0 -200
- package/dist/commands/agent-bootstrap.js.map +0 -1
- package/dist/commands/auth.d.ts +0 -18
- package/dist/commands/auth.js +0 -355
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/batch.d.ts +0 -2
- package/dist/commands/batch.js +0 -414
- package/dist/commands/batch.js.map +0 -1
- package/dist/commands/cache.d.ts +0 -2
- package/dist/commands/cache.js +0 -127
- package/dist/commands/cache.js.map +0 -1
- package/dist/commands/capabilities.d.ts +0 -31
- package/dist/commands/capabilities.js +0 -383
- package/dist/commands/capabilities.js.map +0 -1
- package/dist/commands/catalog.d.ts +0 -2
- package/dist/commands/catalog.js +0 -360
- package/dist/commands/catalog.js.map +0 -1
- package/dist/commands/completion.d.ts +0 -2
- package/dist/commands/completion.js +0 -386
- package/dist/commands/completion.js.map +0 -1
- package/dist/commands/config.d.ts +0 -21
- package/dist/commands/config.js +0 -377
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/daemon.d.ts +0 -2
- package/dist/commands/daemon.js +0 -411
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/device-meta.d.ts +0 -2
- package/dist/commands/device-meta.js +0 -160
- package/dist/commands/device-meta.js.map +0 -1
- package/dist/commands/devices.d.ts +0 -2
- package/dist/commands/devices.js +0 -949
- package/dist/commands/devices.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.js +0 -1016
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/events.d.ts +0 -31
- package/dist/commands/events.js +0 -564
- package/dist/commands/events.js.map +0 -1
- package/dist/commands/expand.d.ts +0 -2
- package/dist/commands/expand.js +0 -131
- package/dist/commands/expand.js.map +0 -1
- package/dist/commands/explain.d.ts +0 -2
- package/dist/commands/explain.js +0 -140
- package/dist/commands/explain.js.map +0 -1
- package/dist/commands/health.d.ts +0 -8
- package/dist/commands/health.js +0 -114
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/history.d.ts +0 -2
- package/dist/commands/history.js +0 -321
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/identity.d.ts +0 -45
- package/dist/commands/identity.js +0 -60
- package/dist/commands/identity.js.map +0 -1
- package/dist/commands/install.d.ts +0 -20
- package/dist/commands/install.js +0 -247
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -14
- package/dist/commands/mcp.js +0 -2018
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/plan.d.ts +0 -51
- package/dist/commands/plan.js +0 -654
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/policy.d.ts +0 -24
- package/dist/commands/policy.js +0 -587
- package/dist/commands/policy.js.map +0 -1
- package/dist/commands/quota.d.ts +0 -2
- package/dist/commands/quota.js +0 -79
- package/dist/commands/quota.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -2
- package/dist/commands/rules.js +0 -876
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/scenes.d.ts +0 -2
- package/dist/commands/scenes.js +0 -265
- package/dist/commands/scenes.js.map +0 -1
- package/dist/commands/schema.d.ts +0 -2
- package/dist/commands/schema.js +0 -185
- package/dist/commands/schema.js.map +0 -1
- package/dist/commands/status-sync.d.ts +0 -2
- package/dist/commands/status-sync.js +0 -132
- package/dist/commands/status-sync.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -20
- package/dist/commands/uninstall.js +0 -238
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/upgrade-check.d.ts +0 -2
- package/dist/commands/upgrade-check.js +0 -107
- package/dist/commands/upgrade-check.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -2
- package/dist/commands/watch.js +0 -195
- package/dist/commands/watch.js.map +0 -1
- package/dist/commands/webhook.d.ts +0 -2
- package/dist/commands/webhook.js +0 -183
- package/dist/commands/webhook.js.map +0 -1
- package/dist/config.d.ts +0 -57
- package/dist/config.js +0 -259
- package/dist/config.js.map +0 -1
- package/dist/credentials/backends/file.d.ts +0 -18
- package/dist/credentials/backends/file.js +0 -102
- package/dist/credentials/backends/file.js.map +0 -1
- package/dist/credentials/backends/linux.d.ts +0 -16
- package/dist/credentials/backends/linux.js +0 -130
- package/dist/credentials/backends/linux.js.map +0 -1
- package/dist/credentials/backends/macos.d.ts +0 -18
- package/dist/credentials/backends/macos.js +0 -130
- package/dist/credentials/backends/macos.js.map +0 -1
- package/dist/credentials/backends/windows.d.ts +0 -23
- package/dist/credentials/backends/windows.js +0 -216
- package/dist/credentials/backends/windows.js.map +0 -1
- package/dist/credentials/keychain.d.ts +0 -83
- package/dist/credentials/keychain.js +0 -89
- package/dist/credentials/keychain.js.map +0 -1
- package/dist/credentials/prime.d.ts +0 -32
- package/dist/credentials/prime.js +0 -53
- package/dist/credentials/prime.js.map +0 -1
- package/dist/devices/cache.d.ts +0 -79
- package/dist/devices/cache.js +0 -294
- package/dist/devices/cache.js.map +0 -1
- package/dist/devices/catalog.d.ts +0 -138
- package/dist/devices/catalog.js +0 -768
- package/dist/devices/catalog.js.map +0 -1
- package/dist/devices/device-meta.d.ts +0 -15
- package/dist/devices/device-meta.js +0 -57
- package/dist/devices/device-meta.js.map +0 -1
- package/dist/devices/history-agg.d.ts +0 -37
- package/dist/devices/history-agg.js +0 -139
- package/dist/devices/history-agg.js.map +0 -1
- package/dist/devices/history-query.d.ts +0 -45
- package/dist/devices/history-query.js +0 -182
- package/dist/devices/history-query.js.map +0 -1
- package/dist/devices/param-validator.d.ts +0 -40
- package/dist/devices/param-validator.js +0 -434
- package/dist/devices/param-validator.js.map +0 -1
- package/dist/devices/resources.d.ts +0 -74
- package/dist/devices/resources.js +0 -271
- package/dist/devices/resources.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
- package/dist/install/default-steps.d.ts +0 -66
- package/dist/install/default-steps.js +0 -258
- package/dist/install/default-steps.js.map +0 -1
- package/dist/install/preflight.d.ts +0 -60
- package/dist/install/preflight.js +0 -213
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/steps.d.ts +0 -61
- package/dist/install/steps.js +0 -68
- package/dist/install/steps.js.map +0 -1
- package/dist/lib/command-keywords.d.ts +0 -5
- package/dist/lib/command-keywords.js +0 -18
- package/dist/lib/command-keywords.js.map +0 -1
- package/dist/lib/daemon-state.d.ts +0 -24
- package/dist/lib/daemon-state.js +0 -47
- package/dist/lib/daemon-state.js.map +0 -1
- package/dist/lib/destructive-mode.d.ts +0 -2
- package/dist/lib/destructive-mode.js +0 -13
- package/dist/lib/destructive-mode.js.map +0 -1
- package/dist/lib/devices.d.ts +0 -151
- package/dist/lib/devices.js +0 -383
- package/dist/lib/devices.js.map +0 -1
- package/dist/lib/idempotency.d.ts +0 -46
- package/dist/lib/idempotency.js +0 -107
- package/dist/lib/idempotency.js.map +0 -1
- package/dist/lib/plan-store.d.ts +0 -19
- package/dist/lib/plan-store.js +0 -69
- package/dist/lib/plan-store.js.map +0 -1
- package/dist/lib/request-context.d.ts +0 -7
- package/dist/lib/request-context.js +0 -13
- package/dist/lib/request-context.js.map +0 -1
- package/dist/lib/scenes.d.ts +0 -7
- package/dist/lib/scenes.js +0 -11
- package/dist/lib/scenes.js.map +0 -1
- package/dist/logger.d.ts +0 -4
- package/dist/logger.js +0 -17
- package/dist/logger.js.map +0 -1
- package/dist/mcp/device-history.d.ts +0 -36
- package/dist/mcp/device-history.js +0 -146
- package/dist/mcp/device-history.js.map +0 -1
- package/dist/mcp/events-subscription.d.ts +0 -45
- package/dist/mcp/events-subscription.js +0 -214
- package/dist/mcp/events-subscription.js.map +0 -1
- package/dist/mqtt/client.d.ts +0 -25
- package/dist/mqtt/client.js +0 -181
- package/dist/mqtt/client.js.map +0 -1
- package/dist/mqtt/credential.d.ts +0 -16
- package/dist/mqtt/credential.js +0 -31
- package/dist/mqtt/credential.js.map +0 -1
- package/dist/policy/add-rule.d.ts +0 -21
- package/dist/policy/add-rule.js +0 -125
- package/dist/policy/add-rule.js.map +0 -1
- package/dist/policy/diff.d.ts +0 -21
- package/dist/policy/diff.js +0 -92
- package/dist/policy/diff.js.map +0 -1
- package/dist/policy/format.d.ts +0 -6
- package/dist/policy/format.js +0 -58
- package/dist/policy/format.js.map +0 -1
- package/dist/policy/load.d.ts +0 -32
- package/dist/policy/load.js +0 -62
- package/dist/policy/load.js.map +0 -1
- package/dist/policy/migrate.d.ts +0 -21
- package/dist/policy/migrate.js +0 -68
- package/dist/policy/migrate.js.map +0 -1
- package/dist/policy/schema.d.ts +0 -5
- package/dist/policy/schema.js +0 -19
- package/dist/policy/schema.js.map +0 -1
- package/dist/policy/validate.d.ts +0 -19
- package/dist/policy/validate.js +0 -263
- package/dist/policy/validate.js.map +0 -1
- package/dist/rules/action.d.ts +0 -65
- package/dist/rules/action.js +0 -217
- package/dist/rules/action.js.map +0 -1
- package/dist/rules/audit-query.d.ts +0 -51
- package/dist/rules/audit-query.js +0 -90
- package/dist/rules/audit-query.js.map +0 -1
- package/dist/rules/conflict-analyzer.d.ts +0 -57
- package/dist/rules/conflict-analyzer.js +0 -215
- package/dist/rules/conflict-analyzer.js.map +0 -1
- package/dist/rules/cron-scheduler.d.ts +0 -62
- package/dist/rules/cron-scheduler.js +0 -187
- package/dist/rules/cron-scheduler.js.map +0 -1
- package/dist/rules/destructive.d.ts +0 -20
- package/dist/rules/destructive.js +0 -53
- package/dist/rules/destructive.js.map +0 -1
- package/dist/rules/engine.d.ts +0 -193
- package/dist/rules/engine.js +0 -758
- package/dist/rules/engine.js.map +0 -1
- package/dist/rules/matcher.d.ts +0 -56
- package/dist/rules/matcher.js +0 -231
- package/dist/rules/matcher.js.map +0 -1
- package/dist/rules/pid-file.d.ts +0 -43
- package/dist/rules/pid-file.js +0 -96
- package/dist/rules/pid-file.js.map +0 -1
- package/dist/rules/quiet-hours.d.ts +0 -26
- package/dist/rules/quiet-hours.js +0 -46
- package/dist/rules/quiet-hours.js.map +0 -1
- package/dist/rules/suggest.d.ts +0 -20
- package/dist/rules/suggest.js +0 -96
- package/dist/rules/suggest.js.map +0 -1
- package/dist/rules/throttle.d.ts +0 -61
- package/dist/rules/throttle.js +0 -117
- package/dist/rules/throttle.js.map +0 -1
- package/dist/rules/types.d.ts +0 -117
- package/dist/rules/types.js +0 -35
- package/dist/rules/types.js.map +0 -1
- package/dist/rules/webhook-listener.d.ts +0 -63
- package/dist/rules/webhook-listener.js +0 -224
- package/dist/rules/webhook-listener.js.map +0 -1
- package/dist/rules/webhook-token.d.ts +0 -50
- package/dist/rules/webhook-token.js +0 -91
- package/dist/rules/webhook-token.js.map +0 -1
- package/dist/schema/field-aliases.d.ts +0 -34
- package/dist/schema/field-aliases.js +0 -132
- package/dist/schema/field-aliases.js.map +0 -1
- package/dist/sinks/dispatcher.d.ts +0 -7
- package/dist/sinks/dispatcher.js +0 -13
- package/dist/sinks/dispatcher.js.map +0 -1
- package/dist/sinks/file.d.ts +0 -6
- package/dist/sinks/file.js +0 -20
- package/dist/sinks/file.js.map +0 -1
- package/dist/sinks/format.d.ts +0 -20
- package/dist/sinks/format.js +0 -57
- package/dist/sinks/format.js.map +0 -1
- package/dist/sinks/homeassistant.d.ts +0 -18
- package/dist/sinks/homeassistant.js +0 -45
- package/dist/sinks/homeassistant.js.map +0 -1
- package/dist/sinks/openclaw.d.ts +0 -13
- package/dist/sinks/openclaw.js +0 -34
- package/dist/sinks/openclaw.js.map +0 -1
- package/dist/sinks/stdout.d.ts +0 -4
- package/dist/sinks/stdout.js +0 -6
- package/dist/sinks/stdout.js.map +0 -1
- package/dist/sinks/telegram.d.ts +0 -11
- package/dist/sinks/telegram.js +0 -29
- package/dist/sinks/telegram.js.map +0 -1
- package/dist/sinks/types.d.ts +0 -13
- package/dist/sinks/types.js +0 -2
- package/dist/sinks/types.js.map +0 -1
- package/dist/sinks/webhook.d.ts +0 -6
- package/dist/sinks/webhook.js +0 -23
- package/dist/sinks/webhook.js.map +0 -1
- package/dist/status-sync/manager.d.ts +0 -48
- package/dist/status-sync/manager.js +0 -269
- package/dist/status-sync/manager.js.map +0 -1
- package/dist/utils/arg-parsers.d.ts +0 -16
- package/dist/utils/arg-parsers.js +0 -67
- package/dist/utils/arg-parsers.js.map +0 -1
- package/dist/utils/audit.d.ts +0 -69
- package/dist/utils/audit.js +0 -122
- package/dist/utils/audit.js.map +0 -1
- package/dist/utils/filter.d.ts +0 -81
- package/dist/utils/filter.js +0 -190
- package/dist/utils/filter.js.map +0 -1
- package/dist/utils/flags.d.ts +0 -72
- package/dist/utils/flags.js +0 -187
- package/dist/utils/flags.js.map +0 -1
- package/dist/utils/format.d.ts +0 -9
- package/dist/utils/format.js +0 -118
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/health.d.ts +0 -48
- package/dist/utils/health.js +0 -102
- package/dist/utils/health.js.map +0 -1
- package/dist/utils/help-json.d.ts +0 -39
- package/dist/utils/help-json.js +0 -55
- package/dist/utils/help-json.js.map +0 -1
- package/dist/utils/name-resolver.d.ts +0 -26
- package/dist/utils/name-resolver.js +0 -138
- package/dist/utils/name-resolver.js.map +0 -1
- package/dist/utils/output.d.ts +0 -73
- package/dist/utils/output.js +0 -405
- package/dist/utils/output.js.map +0 -1
- package/dist/utils/quota.d.ts +0 -61
- package/dist/utils/quota.js +0 -228
- package/dist/utils/quota.js.map +0 -1
- package/dist/utils/redact.d.ts +0 -23
- package/dist/utils/redact.js +0 -69
- package/dist/utils/redact.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -72
- package/dist/utils/retry.js +0 -141
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/string.d.ts +0 -2
- package/dist/utils/string.js +0 -23
- package/dist/utils/string.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.js +0 -5
- package/dist/version.js.map +0 -1
package/dist/utils/quota.d.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local quota counter. Tracks the SwitchBot 10k/day request budget so the
|
|
3
|
-
* CLI (and any AI agent) can check "how many calls have I already burned?"
|
|
4
|
-
* without pinging the API.
|
|
5
|
-
*
|
|
6
|
-
* Shape (`~/.switchbot/quota.json`):
|
|
7
|
-
* {
|
|
8
|
-
* "days": {
|
|
9
|
-
* "2026-04-18": {
|
|
10
|
-
* "total": 42,
|
|
11
|
-
* "endpoints": {
|
|
12
|
-
* "GET /v1.1/devices": 3,
|
|
13
|
-
* "GET /v1.1/devices/:id/status": 27,
|
|
14
|
-
* "POST /v1.1/devices/:id/commands": 12
|
|
15
|
-
* }
|
|
16
|
-
* }
|
|
17
|
-
* }
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* We keep the last 7 days to bound the file size and give a short-term
|
|
21
|
-
* trend. Writes are fire-and-forget — a failed write never breaks the
|
|
22
|
-
* actual API call.
|
|
23
|
-
*/
|
|
24
|
-
export declare const DAILY_QUOTA = 10000;
|
|
25
|
-
export interface DayBucket {
|
|
26
|
-
total: number;
|
|
27
|
-
endpoints: Record<string, number>;
|
|
28
|
-
}
|
|
29
|
-
export interface QuotaFile {
|
|
30
|
-
days: Record<string, DayBucket>;
|
|
31
|
-
}
|
|
32
|
-
export declare function loadQuota(): QuotaFile;
|
|
33
|
-
/**
|
|
34
|
-
* Normalise a full URL into a SwitchBot-style endpoint pattern. The segment
|
|
35
|
-
* immediately after `devices` or `scenes` is collapsed to `:id` so we can
|
|
36
|
-
* bucket by endpoint shape rather than by specific deviceId/sceneId.
|
|
37
|
-
*/
|
|
38
|
-
export declare function normaliseEndpoint(method: string, url: string): string;
|
|
39
|
-
/** Record a single request. Bucketed by local-date + endpoint pattern. */
|
|
40
|
-
export declare function recordRequest(method: string, url: string, now?: Date): void;
|
|
41
|
-
export declare function flushQuota(): void;
|
|
42
|
-
export declare function resetQuotaState(): void;
|
|
43
|
-
export declare function resetQuota(): void;
|
|
44
|
-
/** Return today's usage (convenience for `quota status`). */
|
|
45
|
-
export declare function todayUsage(now?: Date): {
|
|
46
|
-
date: string;
|
|
47
|
-
total: number;
|
|
48
|
-
remaining: number;
|
|
49
|
-
endpoints: Record<string, number>;
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Check whether today's call count is at or over the given cap. Returns the
|
|
53
|
-
* current counter either way so callers can render a helpful refusal message.
|
|
54
|
-
* Undefined cap → returns { over: false } without loading anything.
|
|
55
|
-
*/
|
|
56
|
-
export declare function checkDailyCap(dailyCap: number | undefined, now?: Date): {
|
|
57
|
-
over: boolean;
|
|
58
|
-
total: number;
|
|
59
|
-
cap?: number;
|
|
60
|
-
date: string;
|
|
61
|
-
};
|
package/dist/utils/quota.js
DELETED
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local quota counter. Tracks the SwitchBot 10k/day request budget so the
|
|
3
|
-
* CLI (and any AI agent) can check "how many calls have I already burned?"
|
|
4
|
-
* without pinging the API.
|
|
5
|
-
*
|
|
6
|
-
* Shape (`~/.switchbot/quota.json`):
|
|
7
|
-
* {
|
|
8
|
-
* "days": {
|
|
9
|
-
* "2026-04-18": {
|
|
10
|
-
* "total": 42,
|
|
11
|
-
* "endpoints": {
|
|
12
|
-
* "GET /v1.1/devices": 3,
|
|
13
|
-
* "GET /v1.1/devices/:id/status": 27,
|
|
14
|
-
* "POST /v1.1/devices/:id/commands": 12
|
|
15
|
-
* }
|
|
16
|
-
* }
|
|
17
|
-
* }
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* We keep the last 7 days to bound the file size and give a short-term
|
|
21
|
-
* trend. Writes are fire-and-forget — a failed write never breaks the
|
|
22
|
-
* actual API call.
|
|
23
|
-
*/
|
|
24
|
-
import fs from 'node:fs';
|
|
25
|
-
import path from 'node:path';
|
|
26
|
-
import os from 'node:os';
|
|
27
|
-
export const DAILY_QUOTA = 10_000;
|
|
28
|
-
const MAX_RETAINED_DAYS = 7;
|
|
29
|
-
const FLUSH_DELAY_MS = 250;
|
|
30
|
-
let quotaCache = null;
|
|
31
|
-
let loadedPath = null;
|
|
32
|
-
let dirty = false;
|
|
33
|
-
let flushTimer = null;
|
|
34
|
-
let flushHooksRegistered = false;
|
|
35
|
-
function quotaFilePath() {
|
|
36
|
-
return path.join(os.homedir(), '.switchbot', 'quota.json');
|
|
37
|
-
}
|
|
38
|
-
function today(now = new Date()) {
|
|
39
|
-
// Local date, not UTC — SwitchBot's quota window is loose but users
|
|
40
|
-
// reason about "today" in their own timezone.
|
|
41
|
-
const y = now.getFullYear();
|
|
42
|
-
const m = String(now.getMonth() + 1).padStart(2, '0');
|
|
43
|
-
const d = String(now.getDate()).padStart(2, '0');
|
|
44
|
-
return `${y}-${m}-${d}`;
|
|
45
|
-
}
|
|
46
|
-
function emptyFile() {
|
|
47
|
-
return { days: {} };
|
|
48
|
-
}
|
|
49
|
-
function loadQuotaFromDisk(file) {
|
|
50
|
-
if (!fs.existsSync(file))
|
|
51
|
-
return emptyFile();
|
|
52
|
-
try {
|
|
53
|
-
const raw = fs.readFileSync(file, 'utf-8');
|
|
54
|
-
const parsed = JSON.parse(raw);
|
|
55
|
-
if (!parsed || typeof parsed !== 'object' || !parsed.days)
|
|
56
|
-
return emptyFile();
|
|
57
|
-
return parsed;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return emptyFile();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function saveQuota(data, file = quotaFilePath()) {
|
|
64
|
-
const dir = path.dirname(file);
|
|
65
|
-
try {
|
|
66
|
-
if (!fs.existsSync(dir))
|
|
67
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
68
|
-
fs.writeFileSync(file, JSON.stringify(data, null, 2));
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// swallow: counting is best-effort, must not break a real API call
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function clearScheduledFlush() {
|
|
75
|
-
if (flushTimer) {
|
|
76
|
-
clearTimeout(flushTimer);
|
|
77
|
-
flushTimer = null;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
function syncLoadedQuota() {
|
|
81
|
-
const file = quotaFilePath();
|
|
82
|
-
if (loadedPath !== file) {
|
|
83
|
-
clearScheduledFlush();
|
|
84
|
-
quotaCache = loadQuotaFromDisk(file);
|
|
85
|
-
loadedPath = file;
|
|
86
|
-
dirty = false;
|
|
87
|
-
}
|
|
88
|
-
if (!quotaCache) {
|
|
89
|
-
quotaCache = loadQuotaFromDisk(file);
|
|
90
|
-
loadedPath = file;
|
|
91
|
-
}
|
|
92
|
-
return quotaCache;
|
|
93
|
-
}
|
|
94
|
-
function ensureFlushHooks() {
|
|
95
|
-
if (flushHooksRegistered)
|
|
96
|
-
return;
|
|
97
|
-
flushHooksRegistered = true;
|
|
98
|
-
process.on('beforeExit', () => flushQuota());
|
|
99
|
-
process.on('exit', () => flushQuota());
|
|
100
|
-
// SIGINT/SIGTERM: attaching a listener suppresses Node's default terminate.
|
|
101
|
-
// Flush the counter, then re-raise the conventional exit code (128 + signo).
|
|
102
|
-
process.on('SIGINT', () => {
|
|
103
|
-
flushQuota();
|
|
104
|
-
process.exit(130);
|
|
105
|
-
});
|
|
106
|
-
process.on('SIGTERM', () => {
|
|
107
|
-
flushQuota();
|
|
108
|
-
process.exit(143);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
function scheduleFlush() {
|
|
112
|
-
dirty = true;
|
|
113
|
-
ensureFlushHooks();
|
|
114
|
-
if (flushTimer)
|
|
115
|
-
return;
|
|
116
|
-
flushTimer = setTimeout(() => {
|
|
117
|
-
flushTimer = null;
|
|
118
|
-
flushQuota();
|
|
119
|
-
}, FLUSH_DELAY_MS);
|
|
120
|
-
flushTimer.unref?.();
|
|
121
|
-
}
|
|
122
|
-
export function loadQuota() {
|
|
123
|
-
return syncLoadedQuota();
|
|
124
|
-
}
|
|
125
|
-
function prune(data) {
|
|
126
|
-
const keys = Object.keys(data.days).sort();
|
|
127
|
-
if (keys.length <= MAX_RETAINED_DAYS)
|
|
128
|
-
return data;
|
|
129
|
-
const keep = keys.slice(keys.length - MAX_RETAINED_DAYS);
|
|
130
|
-
const next = { days: {} };
|
|
131
|
-
for (const k of keep)
|
|
132
|
-
next.days[k] = data.days[k];
|
|
133
|
-
return next;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Normalise a full URL into a SwitchBot-style endpoint pattern. The segment
|
|
137
|
-
* immediately after `devices` or `scenes` is collapsed to `:id` so we can
|
|
138
|
-
* bucket by endpoint shape rather than by specific deviceId/sceneId.
|
|
139
|
-
*/
|
|
140
|
-
export function normaliseEndpoint(method, url) {
|
|
141
|
-
const m = (method || 'GET').toUpperCase();
|
|
142
|
-
let pathOnly = url;
|
|
143
|
-
try {
|
|
144
|
-
const parsed = new URL(url);
|
|
145
|
-
pathOnly = parsed.pathname;
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
const q = url.indexOf('?');
|
|
149
|
-
if (q !== -1)
|
|
150
|
-
pathOnly = url.slice(0, q);
|
|
151
|
-
}
|
|
152
|
-
const segments = pathOnly.split('/');
|
|
153
|
-
for (let i = 0; i < segments.length - 1; i++) {
|
|
154
|
-
if (segments[i] === 'devices' || segments[i] === 'scenes') {
|
|
155
|
-
// Only collapse when the next segment looks like an id (not another
|
|
156
|
-
// API verb); the SwitchBot API uses lower-case keywords elsewhere,
|
|
157
|
-
// but guard against future collisions.
|
|
158
|
-
const next = segments[i + 1];
|
|
159
|
-
if (next && next.length > 0) {
|
|
160
|
-
segments[i + 1] = ':id';
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return `${m} ${segments.join('/')}`;
|
|
165
|
-
}
|
|
166
|
-
/** Record a single request. Bucketed by local-date + endpoint pattern. */
|
|
167
|
-
export function recordRequest(method, url, now = new Date()) {
|
|
168
|
-
const key = today(now);
|
|
169
|
-
const endpoint = normaliseEndpoint(method, url);
|
|
170
|
-
const data = syncLoadedQuota();
|
|
171
|
-
const bucket = data.days[key] ?? { total: 0, endpoints: {} };
|
|
172
|
-
bucket.total += 1;
|
|
173
|
-
bucket.endpoints[endpoint] = (bucket.endpoints[endpoint] ?? 0) + 1;
|
|
174
|
-
data.days[key] = bucket;
|
|
175
|
-
quotaCache = prune(data);
|
|
176
|
-
scheduleFlush();
|
|
177
|
-
}
|
|
178
|
-
export function flushQuota() {
|
|
179
|
-
if (!dirty)
|
|
180
|
-
return;
|
|
181
|
-
const data = syncLoadedQuota();
|
|
182
|
-
saveQuota(prune(data));
|
|
183
|
-
dirty = false;
|
|
184
|
-
}
|
|
185
|
-
export function resetQuotaState() {
|
|
186
|
-
clearScheduledFlush();
|
|
187
|
-
quotaCache = null;
|
|
188
|
-
loadedPath = null;
|
|
189
|
-
dirty = false;
|
|
190
|
-
}
|
|
191
|
-
export function resetQuota() {
|
|
192
|
-
resetQuotaState();
|
|
193
|
-
const file = quotaFilePath();
|
|
194
|
-
try {
|
|
195
|
-
if (fs.existsSync(file))
|
|
196
|
-
fs.unlinkSync(file);
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
// ignore
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/** Return today's usage (convenience for `quota status`). */
|
|
203
|
-
export function todayUsage(now = new Date()) {
|
|
204
|
-
const key = today(now);
|
|
205
|
-
const data = loadQuota();
|
|
206
|
-
const bucket = data.days[key] ?? { total: 0, endpoints: {} };
|
|
207
|
-
return {
|
|
208
|
-
date: key,
|
|
209
|
-
total: bucket.total,
|
|
210
|
-
remaining: Math.max(0, DAILY_QUOTA - bucket.total),
|
|
211
|
-
endpoints: { ...bucket.endpoints },
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Check whether today's call count is at or over the given cap. Returns the
|
|
216
|
-
* current counter either way so callers can render a helpful refusal message.
|
|
217
|
-
* Undefined cap → returns { over: false } without loading anything.
|
|
218
|
-
*/
|
|
219
|
-
export function checkDailyCap(dailyCap, now = new Date()) {
|
|
220
|
-
const date = today(now);
|
|
221
|
-
if (!dailyCap || dailyCap <= 0) {
|
|
222
|
-
return { over: false, total: 0, date };
|
|
223
|
-
}
|
|
224
|
-
const data = loadQuota();
|
|
225
|
-
const total = data.days[date]?.total ?? 0;
|
|
226
|
-
return { over: total >= dailyCap, total, cap: dailyCap, date };
|
|
227
|
-
}
|
|
228
|
-
//# sourceMappingURL=quota.js.map
|
package/dist/utils/quota.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../src/utils/quota.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/redact.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Header/value redaction utilities for verbose traces.
|
|
3
|
-
*
|
|
4
|
-
* C6 contract: any header whose name matches a sensitive pattern is mid-masked
|
|
5
|
-
* (first 2 chars + `*` run + last 2 chars) before it is written to stderr. The
|
|
6
|
-
* `--trace-unsafe` flag turns masking off — with a prominent one-time warning.
|
|
7
|
-
*/
|
|
8
|
-
export declare function isSensitiveHeader(name: string): boolean;
|
|
9
|
-
export declare function maskValue(value: string): string;
|
|
10
|
-
/**
|
|
11
|
-
* Redact the sensitive entries of a headers object. Returns a new object
|
|
12
|
-
* alongside the count of entries that were masked.
|
|
13
|
-
*/
|
|
14
|
-
export declare function redactHeaders(headers: Record<string, unknown> | undefined): {
|
|
15
|
-
safe: Record<string, string>;
|
|
16
|
-
redactedCount: number;
|
|
17
|
-
};
|
|
18
|
-
/**
|
|
19
|
-
* Print the big "REDACTION DISABLED" banner once per process when
|
|
20
|
-
* --trace-unsafe is on. Callers should invoke this once before any
|
|
21
|
-
* header-spilling output.
|
|
22
|
-
*/
|
|
23
|
-
export declare function warnOnceIfUnsafe(): void;
|
package/dist/utils/redact.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Header/value redaction utilities for verbose traces.
|
|
3
|
-
*
|
|
4
|
-
* C6 contract: any header whose name matches a sensitive pattern is mid-masked
|
|
5
|
-
* (first 2 chars + `*` run + last 2 chars) before it is written to stderr. The
|
|
6
|
-
* `--trace-unsafe` flag turns masking off — with a prominent one-time warning.
|
|
7
|
-
*/
|
|
8
|
-
import { isTraceUnsafe } from './flags.js';
|
|
9
|
-
const SENSITIVE_HEADER_PATTERNS = [
|
|
10
|
-
/^authorization$/i,
|
|
11
|
-
/^token$/i,
|
|
12
|
-
/^sign$/i,
|
|
13
|
-
/^nonce$/i,
|
|
14
|
-
/^x-api-key$/i,
|
|
15
|
-
/^cookie$/i,
|
|
16
|
-
/^set-cookie$/i,
|
|
17
|
-
/^x-auth-token$/i,
|
|
18
|
-
];
|
|
19
|
-
// The `t` header (timestamp) is treated as sensitive alongside sign because
|
|
20
|
-
// together they reconstruct the HMAC signature — anyone watching the logs
|
|
21
|
-
// shouldn't be able to replay the exact timestamp that was used.
|
|
22
|
-
const SENSITIVE_EXACT_KEYS = new Set(['t']);
|
|
23
|
-
export function isSensitiveHeader(name) {
|
|
24
|
-
if (SENSITIVE_EXACT_KEYS.has(name))
|
|
25
|
-
return true;
|
|
26
|
-
return SENSITIVE_HEADER_PATTERNS.some((re) => re.test(name));
|
|
27
|
-
}
|
|
28
|
-
export function maskValue(value) {
|
|
29
|
-
if (value.length <= 4)
|
|
30
|
-
return '****';
|
|
31
|
-
return `${value.slice(0, 2)}${'*'.repeat(Math.max(4, value.length - 4))}${value.slice(-2)}`;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Redact the sensitive entries of a headers object. Returns a new object
|
|
35
|
-
* alongside the count of entries that were masked.
|
|
36
|
-
*/
|
|
37
|
-
export function redactHeaders(headers) {
|
|
38
|
-
const safe = {};
|
|
39
|
-
let redactedCount = 0;
|
|
40
|
-
if (!headers)
|
|
41
|
-
return { safe, redactedCount };
|
|
42
|
-
const unsafe = isTraceUnsafe();
|
|
43
|
-
for (const [k, v] of Object.entries(headers)) {
|
|
44
|
-
const strVal = typeof v === 'string' ? v : v == null ? '' : String(v);
|
|
45
|
-
if (!unsafe && isSensitiveHeader(k)) {
|
|
46
|
-
safe[k] = maskValue(strVal);
|
|
47
|
-
redactedCount++;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
safe[k] = strVal;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return { safe, redactedCount };
|
|
54
|
-
}
|
|
55
|
-
let unsafeBannerShown = false;
|
|
56
|
-
/**
|
|
57
|
-
* Print the big "REDACTION DISABLED" banner once per process when
|
|
58
|
-
* --trace-unsafe is on. Callers should invoke this once before any
|
|
59
|
-
* header-spilling output.
|
|
60
|
-
*/
|
|
61
|
-
export function warnOnceIfUnsafe() {
|
|
62
|
-
if (unsafeBannerShown)
|
|
63
|
-
return;
|
|
64
|
-
if (!isTraceUnsafe())
|
|
65
|
-
return;
|
|
66
|
-
unsafeBannerShown = true;
|
|
67
|
-
process.stderr.write('⚠️ --trace-unsafe: sensitive headers will be printed UNMASKED. Do not share this output.\n');
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=redact.js.map
|
package/dist/utils/redact.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,yBAAyB,GAAG;IAChC,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,UAAU;IACV,cAAc;IACd,WAAW;IACX,eAAe;IACf,iBAAiB;CAClB,CAAC;AAEF,4EAA4E;AAC5E,0EAA0E;AAC1E,iEAAiE;AACjE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5C,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA4C;IAE5C,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC5B,aAAa,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACjC,CAAC;AAED,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAC9B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,iBAAiB;QAAE,OAAO;IAC9B,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO;IAC7B,iBAAiB,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6FAA6F,CAC9F,CAAC;AACJ,CAAC"}
|
package/dist/utils/retry.d.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retry/backoff helpers for the axios client. Kept as pure functions so
|
|
3
|
-
* tests can pin attempt → delay without wall-clock sleeping.
|
|
4
|
-
*
|
|
5
|
-
* Backoff strategies:
|
|
6
|
-
* linear → 1s, 2s, 3s, ... (cap 30s)
|
|
7
|
-
* exponential → 1s, 2s, 4s, 8s, 16s (cap 30s) [default]
|
|
8
|
-
*
|
|
9
|
-
* If the server returns a `Retry-After` header we always prefer it over our
|
|
10
|
-
* own backoff — the API explicitly told us when to come back.
|
|
11
|
-
*
|
|
12
|
-
* Circuit breaker:
|
|
13
|
-
* Prevents hammering a consistently-failing endpoint. Tracks consecutive
|
|
14
|
-
* failures; when `failureThreshold` is exceeded the circuit opens and
|
|
15
|
-
* subsequent calls fail immediately (with CircuitOpenError). After
|
|
16
|
-
* `resetTimeoutMs` the circuit enters half-open state: the next call is
|
|
17
|
-
* allowed as a probe — success closes it, failure re-opens it.
|
|
18
|
-
*/
|
|
19
|
-
export type BackoffStrategy = 'linear' | 'exponential';
|
|
20
|
-
/**
|
|
21
|
-
* Parse an HTTP `Retry-After` header. Supports both the seconds form
|
|
22
|
-
* ("Retry-After: 42") and the HTTP-date form ("Retry-After: Wed, 21 Oct
|
|
23
|
-
* 2015 07:28:00 GMT"). Returns the delay in ms, or undefined on garbage.
|
|
24
|
-
*/
|
|
25
|
-
export declare function parseRetryAfter(header: unknown, now?: number): number | undefined;
|
|
26
|
-
/** Compute the next backoff delay (ms) for a given attempt index (0-based). */
|
|
27
|
-
export declare function computeBackoff(attempt: number, strategy: BackoffStrategy): number;
|
|
28
|
-
/** Resolve the delay to use before the next retry, preferring Retry-After. */
|
|
29
|
-
export declare function nextRetryDelayMs(attempt: number, strategy: BackoffStrategy, retryAfterHeader: unknown, now?: number): number;
|
|
30
|
-
export declare function sleep(ms: number): Promise<void>;
|
|
31
|
-
export type CircuitState = 'closed' | 'open' | 'half-open';
|
|
32
|
-
export interface CircuitBreakerOptions {
|
|
33
|
-
/** Number of consecutive failures before the circuit opens. Default: 5. */
|
|
34
|
-
failureThreshold?: number;
|
|
35
|
-
/** Milliseconds to keep the circuit open before entering half-open. Default: 60_000. */
|
|
36
|
-
resetTimeoutMs?: number;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Thrown when a call is blocked because the circuit is open.
|
|
40
|
-
*/
|
|
41
|
-
export declare class CircuitOpenError extends Error {
|
|
42
|
-
readonly circuitName: string;
|
|
43
|
-
readonly nextAttemptMs: number;
|
|
44
|
-
constructor(circuitName: string, nextAttemptMs: number);
|
|
45
|
-
}
|
|
46
|
-
export declare class CircuitBreaker {
|
|
47
|
-
readonly name: string;
|
|
48
|
-
private state;
|
|
49
|
-
private failures;
|
|
50
|
-
private lastOpenedAt;
|
|
51
|
-
private readonly failureThreshold;
|
|
52
|
-
private readonly resetTimeoutMs;
|
|
53
|
-
constructor(name: string, opts?: CircuitBreakerOptions);
|
|
54
|
-
getState(): CircuitState;
|
|
55
|
-
getStats(): {
|
|
56
|
-
state: CircuitState;
|
|
57
|
-
failures: number;
|
|
58
|
-
lastOpenedAt: number;
|
|
59
|
-
nextProbeMs: number;
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* Check if a call is allowed. Throws `CircuitOpenError` when the circuit
|
|
63
|
-
* is open and the reset timeout hasn't elapsed. Call `recordSuccess()` or
|
|
64
|
-
* `recordFailure()` after the operation completes.
|
|
65
|
-
*/
|
|
66
|
-
checkAndAllow(): void;
|
|
67
|
-
recordSuccess(): void;
|
|
68
|
-
recordFailure(): void;
|
|
69
|
-
/** Reset to closed — useful for testing or manual recovery. */
|
|
70
|
-
reset(): void;
|
|
71
|
-
private _maybeHalfOpen;
|
|
72
|
-
}
|
package/dist/utils/retry.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retry/backoff helpers for the axios client. Kept as pure functions so
|
|
3
|
-
* tests can pin attempt → delay without wall-clock sleeping.
|
|
4
|
-
*
|
|
5
|
-
* Backoff strategies:
|
|
6
|
-
* linear → 1s, 2s, 3s, ... (cap 30s)
|
|
7
|
-
* exponential → 1s, 2s, 4s, 8s, 16s (cap 30s) [default]
|
|
8
|
-
*
|
|
9
|
-
* If the server returns a `Retry-After` header we always prefer it over our
|
|
10
|
-
* own backoff — the API explicitly told us when to come back.
|
|
11
|
-
*
|
|
12
|
-
* Circuit breaker:
|
|
13
|
-
* Prevents hammering a consistently-failing endpoint. Tracks consecutive
|
|
14
|
-
* failures; when `failureThreshold` is exceeded the circuit opens and
|
|
15
|
-
* subsequent calls fail immediately (with CircuitOpenError). After
|
|
16
|
-
* `resetTimeoutMs` the circuit enters half-open state: the next call is
|
|
17
|
-
* allowed as a probe — success closes it, failure re-opens it.
|
|
18
|
-
*/
|
|
19
|
-
const BASE_MS = 1_000;
|
|
20
|
-
const MAX_MS = 30_000;
|
|
21
|
-
/**
|
|
22
|
-
* Parse an HTTP `Retry-After` header. Supports both the seconds form
|
|
23
|
-
* ("Retry-After: 42") and the HTTP-date form ("Retry-After: Wed, 21 Oct
|
|
24
|
-
* 2015 07:28:00 GMT"). Returns the delay in ms, or undefined on garbage.
|
|
25
|
-
*/
|
|
26
|
-
export function parseRetryAfter(header, now = Date.now()) {
|
|
27
|
-
if (typeof header !== 'string')
|
|
28
|
-
return undefined;
|
|
29
|
-
const trimmed = header.trim();
|
|
30
|
-
if (!trimmed)
|
|
31
|
-
return undefined;
|
|
32
|
-
// All-digits → seconds.
|
|
33
|
-
if (/^\d+$/.test(trimmed)) {
|
|
34
|
-
const seconds = Number(trimmed);
|
|
35
|
-
if (!Number.isFinite(seconds) || seconds < 0)
|
|
36
|
-
return undefined;
|
|
37
|
-
return Math.min(seconds * 1000, MAX_MS);
|
|
38
|
-
}
|
|
39
|
-
// HTTP-date.
|
|
40
|
-
const ts = Date.parse(trimmed);
|
|
41
|
-
if (!Number.isFinite(ts))
|
|
42
|
-
return undefined;
|
|
43
|
-
const delta = ts - now;
|
|
44
|
-
if (delta <= 0)
|
|
45
|
-
return 0;
|
|
46
|
-
return Math.min(delta, MAX_MS);
|
|
47
|
-
}
|
|
48
|
-
/** Compute the next backoff delay (ms) for a given attempt index (0-based). */
|
|
49
|
-
export function computeBackoff(attempt, strategy) {
|
|
50
|
-
const safe = Math.max(0, attempt);
|
|
51
|
-
if (strategy === 'linear') {
|
|
52
|
-
return Math.min((safe + 1) * BASE_MS, MAX_MS);
|
|
53
|
-
}
|
|
54
|
-
// exponential
|
|
55
|
-
return Math.min(BASE_MS * Math.pow(2, safe), MAX_MS);
|
|
56
|
-
}
|
|
57
|
-
/** Resolve the delay to use before the next retry, preferring Retry-After. */
|
|
58
|
-
export function nextRetryDelayMs(attempt, strategy, retryAfterHeader, now = Date.now()) {
|
|
59
|
-
const fromHeader = parseRetryAfter(retryAfterHeader, now);
|
|
60
|
-
if (fromHeader !== undefined)
|
|
61
|
-
return fromHeader;
|
|
62
|
-
return computeBackoff(attempt, strategy);
|
|
63
|
-
}
|
|
64
|
-
export function sleep(ms) {
|
|
65
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Thrown when a call is blocked because the circuit is open.
|
|
69
|
-
*/
|
|
70
|
-
export class CircuitOpenError extends Error {
|
|
71
|
-
circuitName;
|
|
72
|
-
nextAttemptMs;
|
|
73
|
-
constructor(circuitName, nextAttemptMs) {
|
|
74
|
-
super(`Circuit "${circuitName}" is open — too many recent failures. Next probe allowed in ${Math.ceil((nextAttemptMs - Date.now()) / 1000)}s.`);
|
|
75
|
-
this.circuitName = circuitName;
|
|
76
|
-
this.nextAttemptMs = nextAttemptMs;
|
|
77
|
-
this.name = 'CircuitOpenError';
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
export class CircuitBreaker {
|
|
81
|
-
name;
|
|
82
|
-
state = 'closed';
|
|
83
|
-
failures = 0;
|
|
84
|
-
lastOpenedAt = 0;
|
|
85
|
-
failureThreshold;
|
|
86
|
-
resetTimeoutMs;
|
|
87
|
-
constructor(name, opts = {}) {
|
|
88
|
-
this.name = name;
|
|
89
|
-
this.failureThreshold = opts.failureThreshold ?? 5;
|
|
90
|
-
this.resetTimeoutMs = opts.resetTimeoutMs ?? 60_000;
|
|
91
|
-
}
|
|
92
|
-
getState() {
|
|
93
|
-
this._maybeHalfOpen();
|
|
94
|
-
return this.state;
|
|
95
|
-
}
|
|
96
|
-
getStats() {
|
|
97
|
-
this._maybeHalfOpen();
|
|
98
|
-
return {
|
|
99
|
-
state: this.state,
|
|
100
|
-
failures: this.failures,
|
|
101
|
-
lastOpenedAt: this.lastOpenedAt,
|
|
102
|
-
nextProbeMs: this.state === 'open' ? this.lastOpenedAt + this.resetTimeoutMs : 0,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Check if a call is allowed. Throws `CircuitOpenError` when the circuit
|
|
107
|
-
* is open and the reset timeout hasn't elapsed. Call `recordSuccess()` or
|
|
108
|
-
* `recordFailure()` after the operation completes.
|
|
109
|
-
*/
|
|
110
|
-
checkAndAllow() {
|
|
111
|
-
this._maybeHalfOpen();
|
|
112
|
-
if (this.state === 'open') {
|
|
113
|
-
throw new CircuitOpenError(this.name, this.lastOpenedAt + this.resetTimeoutMs);
|
|
114
|
-
}
|
|
115
|
-
// closed or half-open: allow the call
|
|
116
|
-
}
|
|
117
|
-
recordSuccess() {
|
|
118
|
-
this.failures = 0;
|
|
119
|
-
this.state = 'closed';
|
|
120
|
-
}
|
|
121
|
-
recordFailure() {
|
|
122
|
-
this.failures++;
|
|
123
|
-
if (this.state === 'half-open' || this.failures >= this.failureThreshold) {
|
|
124
|
-
this.state = 'open';
|
|
125
|
-
this.lastOpenedAt = Date.now();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/** Reset to closed — useful for testing or manual recovery. */
|
|
129
|
-
reset() {
|
|
130
|
-
this.state = 'closed';
|
|
131
|
-
this.failures = 0;
|
|
132
|
-
this.lastOpenedAt = 0;
|
|
133
|
-
}
|
|
134
|
-
_maybeHalfOpen() {
|
|
135
|
-
if (this.state === 'open' &&
|
|
136
|
-
Date.now() >= this.lastOpenedAt + this.resetTimeoutMs) {
|
|
137
|
-
this.state = 'half-open';
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
//# sourceMappingURL=retry.js.map
|
package/dist/utils/retry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/string.d.ts
DELETED
package/dist/utils/string.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export function levenshtein(a, b) {
|
|
2
|
-
if (a === b)
|
|
3
|
-
return 0;
|
|
4
|
-
if (a.length === 0)
|
|
5
|
-
return b.length;
|
|
6
|
-
if (b.length === 0)
|
|
7
|
-
return a.length;
|
|
8
|
-
const row = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
9
|
-
for (let i = 1; i <= a.length; i++) {
|
|
10
|
-
let prev = i;
|
|
11
|
-
for (let j = 1; j <= b.length; j++) {
|
|
12
|
-
const val = a[i - 1] === b[j - 1] ? row[j - 1] : Math.min(row[j - 1], row[j], prev) + 1;
|
|
13
|
-
row[j - 1] = prev;
|
|
14
|
-
prev = val;
|
|
15
|
-
}
|
|
16
|
-
row[b.length] = prev;
|
|
17
|
-
}
|
|
18
|
-
return row[b.length];
|
|
19
|
-
}
|
|
20
|
-
export function normalizeDeviceName(s) {
|
|
21
|
-
return s.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fff ]/g, ' ').replace(/\s+/g, ' ').trim();
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=string.js.map
|
package/dist/utils/string.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC9C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAEpC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACxF,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAClB,IAAI,GAAG,GAAG,CAAC;QACb,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAS;IAC3C,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9F,CAAC"}
|
package/dist/version.d.ts
DELETED
package/dist/version.js
DELETED
package/dist/version.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE/E,OAAO,EAAE,OAAO,EAAE,CAAC"}
|