homebridge-plugin-utils 1.35.0 → 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/README.md +130 -2
- package/build/eslint-plugin/README.md +164 -0
- package/build/eslint-plugin/config.mjs +308 -0
- package/build/eslint-plugin/index.mjs +7 -0
- package/build/eslint-plugin/plugin.mjs +46 -0
- package/build/eslint-plugin/rules/blank-line-after-open-brace.mjs +137 -0
- package/build/eslint-plugin/rules/blank-line-after-open-brace.test.mjs +112 -0
- package/build/eslint-plugin/rules/comment-style.mjs +190 -0
- package/build/eslint-plugin/rules/comment-style.test.mjs +190 -0
- package/build/eslint-plugin/rules/enforce-node-protocol.mjs +114 -0
- package/build/eslint-plugin/rules/enforce-node-protocol.test.mjs +116 -0
- package/build/eslint-plugin/rules/paren-comparisons-in-logical.mjs +94 -0
- package/build/eslint-plugin/rules/paren-comparisons-in-logical.test.mjs +107 -0
- package/build/eslint-plugin/rules/split-type-imports.mjs +354 -0
- package/build/eslint-plugin/rules/split-type-imports.test.mjs +268 -0
- package/build/eslint-plugin/test-setup.mjs +21 -0
- package/build/fs-ops.mjs +184 -0
- package/build/tsconfig.json +18 -3
- package/dist/backpressure.d.ts +94 -45
- package/dist/backpressure.js +229 -93
- package/dist/backpressure.js.map +1 -1
- package/dist/cli/index.d.ts +95 -0
- package/dist/cli/index.js +355 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/clock-double.d.ts +93 -0
- package/dist/clock-double.js +141 -0
- package/dist/clock-double.js.map +1 -0
- package/dist/clock.d.ts +39 -0
- package/dist/clock.js +34 -0
- package/dist/clock.js.map +1 -0
- package/dist/eslint-plugin/config.d.mts +193 -0
- package/dist/eslint-plugin/index.d.mts +2 -0
- package/dist/eslint-plugin/plugin.d.mts +87 -0
- package/dist/eslint-plugin/rules/blank-line-after-open-brace.d.mts +19 -0
- package/dist/eslint-plugin/rules/comment-style.d.mts +15 -0
- package/dist/eslint-plugin/rules/enforce-node-protocol.d.mts +18 -0
- package/dist/eslint-plugin/rules/paren-comparisons-in-logical.d.mts +15 -0
- package/dist/eslint-plugin/rules/split-type-imports.d.mts +16 -0
- package/dist/featureOptions-docs.d.ts +96 -0
- package/dist/featureOptions-docs.js +193 -0
- package/dist/featureOptions-docs.js.map +1 -0
- package/dist/featureOptions.d.ts +674 -0
- package/dist/featureOptions.js +870 -0
- package/dist/featureOptions.js.map +1 -0
- package/dist/ffmpeg/codecs.d.ts +256 -72
- package/dist/ffmpeg/codecs.js +477 -262
- package/dist/ffmpeg/codecs.js.map +1 -1
- package/dist/ffmpeg/dgram-util.d.ts +46 -0
- package/dist/ffmpeg/dgram-util.js +38 -0
- package/dist/ffmpeg/dgram-util.js.map +1 -0
- package/dist/ffmpeg/exec.d.ts +83 -64
- package/dist/ffmpeg/exec.js +77 -86
- package/dist/ffmpeg/exec.js.map +1 -1
- package/dist/ffmpeg/fmp4.d.ts +49 -2
- package/dist/ffmpeg/fmp4.js +47 -11
- package/dist/ffmpeg/fmp4.js.map +1 -1
- package/dist/ffmpeg/hap-enums.d.ts +214 -0
- package/dist/ffmpeg/hap-enums.js +92 -0
- package/dist/ffmpeg/hap-enums.js.map +1 -0
- package/dist/ffmpeg/index.d.ts +16 -9
- package/dist/ffmpeg/index.js +6 -0
- package/dist/ffmpeg/index.js.map +1 -1
- package/dist/ffmpeg/mp4-assembler.d.ts +120 -0
- package/dist/ffmpeg/mp4-assembler.js +387 -0
- package/dist/ffmpeg/mp4-assembler.js.map +1 -0
- package/dist/ffmpeg/mp4-parser.d.ts +94 -0
- package/dist/ffmpeg/mp4-parser.js +130 -0
- package/dist/ffmpeg/mp4-parser.js.map +1 -0
- package/dist/ffmpeg/options.d.ts +62 -149
- package/dist/ffmpeg/options.js +608 -499
- package/dist/ffmpeg/options.js.map +1 -1
- package/dist/ffmpeg/process.d.ts +142 -96
- package/dist/ffmpeg/process.js +406 -278
- package/dist/ffmpeg/process.js.map +1 -1
- package/dist/ffmpeg/record.d.ts +302 -188
- package/dist/ffmpeg/record.js +408 -567
- package/dist/ffmpeg/record.js.map +1 -1
- package/dist/ffmpeg/recording-process-double.d.ts +144 -0
- package/dist/ffmpeg/recording-process-double.js +168 -0
- package/dist/ffmpeg/recording-process-double.js.map +1 -0
- package/dist/ffmpeg/rtp-parser.d.ts +70 -0
- package/dist/ffmpeg/rtp-parser.js +77 -0
- package/dist/ffmpeg/rtp-parser.js.map +1 -0
- package/dist/ffmpeg/rtp.d.ts +198 -141
- package/dist/ffmpeg/rtp.js +473 -251
- package/dist/ffmpeg/rtp.js.map +1 -1
- package/dist/ffmpeg/settings.d.ts +5 -2
- package/dist/ffmpeg/settings.js +20 -5
- package/dist/ffmpeg/settings.js.map +1 -1
- package/dist/ffmpeg/stream.d.ts +57 -107
- package/dist/ffmpeg/stream.js +121 -150
- package/dist/ffmpeg/stream.js.map +1 -1
- package/dist/formatters.d.ts +106 -0
- package/dist/formatters.js +174 -0
- package/dist/formatters.js.map +1 -0
- package/dist/homebridge-enums.d.ts +30 -0
- package/dist/homebridge-enums.js +17 -0
- package/dist/homebridge-enums.js.map +1 -0
- package/dist/index.d.ts +12 -6
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/logclient/auth.d.ts +114 -0
- package/dist/logclient/auth.js +199 -0
- package/dist/logclient/auth.js.map +1 -0
- package/dist/logclient/cli-run.d.ts +76 -0
- package/dist/logclient/cli-run.js +639 -0
- package/dist/logclient/cli-run.js.map +1 -0
- package/dist/logclient/cli.d.ts +3 -0
- package/dist/logclient/cli.js +97 -0
- package/dist/logclient/cli.js.map +1 -0
- package/dist/logclient/client.d.ts +145 -0
- package/dist/logclient/client.js +600 -0
- package/dist/logclient/client.js.map +1 -0
- package/dist/logclient/config.d.ts +173 -0
- package/dist/logclient/config.js +199 -0
- package/dist/logclient/config.js.map +1 -0
- package/dist/logclient/endpoints.d.ts +54 -0
- package/dist/logclient/endpoints.js +73 -0
- package/dist/logclient/endpoints.js.map +1 -0
- package/dist/logclient/filter.d.ts +45 -0
- package/dist/logclient/filter.js +51 -0
- package/dist/logclient/filter.js.map +1 -0
- package/dist/logclient/frame.d.ts +93 -0
- package/dist/logclient/frame.js +203 -0
- package/dist/logclient/frame.js.map +1 -0
- package/dist/logclient/index.d.ts +31 -0
- package/dist/logclient/index.js +12 -0
- package/dist/logclient/index.js.map +1 -0
- package/dist/logclient/parser.d.ts +211 -0
- package/dist/logclient/parser.js +393 -0
- package/dist/logclient/parser.js.map +1 -0
- package/dist/logclient/rest.d.ts +41 -0
- package/dist/logclient/rest.js +111 -0
- package/dist/logclient/rest.js.map +1 -0
- package/dist/logclient/settings.d.ts +15 -0
- package/dist/logclient/settings.js +64 -0
- package/dist/logclient/settings.js.map +1 -0
- package/dist/logclient/socket-double.d.ts +201 -0
- package/dist/logclient/socket-double.js +384 -0
- package/dist/logclient/socket-double.js.map +1 -0
- package/dist/logclient/socket.d.ts +257 -0
- package/dist/logclient/socket.js +620 -0
- package/dist/logclient/socket.js.map +1 -0
- package/dist/logclient/stitch.d.ts +83 -0
- package/dist/logclient/stitch.js +146 -0
- package/dist/logclient/stitch.js.map +1 -0
- package/dist/logclient/time-expression.d.ts +42 -0
- package/dist/logclient/time-expression.js +181 -0
- package/dist/logclient/time-expression.js.map +1 -0
- package/dist/logclient/time-window.d.ts +38 -0
- package/dist/logclient/time-window.js +53 -0
- package/dist/logclient/time-window.js.map +1 -0
- package/dist/logclient/types.d.ts +107 -0
- package/dist/logclient/types.js +6 -0
- package/dist/logclient/types.js.map +1 -0
- package/dist/mqttClient.d.ts +287 -0
- package/dist/mqttClient.js +433 -0
- package/dist/mqttClient.js.map +1 -0
- package/dist/service.d.ts +64 -15
- package/dist/service.js +93 -66
- package/dist/service.js.map +1 -1
- package/dist/ui/featureOptions.js +870 -0
- package/dist/ui/featureOptions.js.map +1 -0
- package/dist/ui/formatters.js +174 -0
- package/dist/ui/formatters.js.map +1 -0
- package/dist/ui/pluginConfigSession.mjs +141 -0
- package/dist/ui/webUi-featureOptions/categoryState.mjs +135 -0
- package/dist/ui/webUi-featureOptions/effects/keyboard.mjs +61 -0
- package/dist/ui/webUi-featureOptions/effects/persist.mjs +226 -0
- package/dist/ui/webUi-featureOptions/effects/theme.mjs +398 -0
- package/dist/ui/webUi-featureOptions/effects/tokens.mjs +152 -0
- package/dist/ui/webUi-featureOptions/rendering.mjs +431 -0
- package/dist/ui/webUi-featureOptions/selectors.mjs +360 -0
- package/dist/ui/webUi-featureOptions/state.mjs +319 -0
- package/dist/ui/webUi-featureOptions/store.mjs +181 -0
- package/dist/ui/webUi-featureOptions/utils.mjs +200 -0
- package/dist/ui/webUi-featureOptions/views/connectionError.mjs +152 -0
- package/dist/ui/webUi-featureOptions/views/deviceInfo.mjs +80 -0
- package/dist/ui/webUi-featureOptions/views/header.mjs +77 -0
- package/dist/ui/webUi-featureOptions/views/nav.mjs +327 -0
- package/dist/ui/webUi-featureOptions/views/options.mjs +521 -0
- package/dist/ui/webUi-featureOptions/views/search.mjs +395 -0
- package/dist/ui/webUi-featureOptions.mjs +677 -0
- package/dist/ui/webUi.mjs +192 -87
- package/dist/util.d.ts +602 -45
- package/dist/util.js +783 -78
- package/dist/util.js.map +1 -1
- package/package.json +33 -15
- package/build/eslint-rules.mjs +0 -511
- package/dist/featureoptions.d.ts +0 -264
- package/dist/featureoptions.js +0 -480
- package/dist/featureoptions.js.map +0 -1
- package/dist/mqttclient.d.ts +0 -178
- package/dist/mqttclient.js +0 -310
- package/dist/mqttclient.js.map +0 -1
- package/dist/ui/featureoptions.js +0 -480
- package/dist/ui/featureoptions.js.map +0 -1
- package/dist/ui/webUi-featureoptions.mjs +0 -3765
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/ffmpeg/record.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/ffmpeg/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable test doubles for the recording dependency-inversion seam.
|
|
3
|
+
*
|
|
4
|
+
* The {@link RecordingProcess} / {@link RecordingProcessFactory} seam in `ffmpeg/record.ts` exists so a consuming plugin's HKSV recording path can be driven without
|
|
5
|
+
* spawning a real FFmpeg child. This module ships the fakes that cash that in: a configurable {@link TestRecordingProcess} that yields caller-supplied init and media
|
|
6
|
+
* segments deterministically, and a {@link TestRecordingProcessFactory} that records every `create` call and hands back the process. Any HKSV-capable plugin can hold
|
|
7
|
+
* the test factory in place of {@link ffmpeg/record!recordingProcessFactory | recordingProcessFactory} to exercise its recording delegate FFmpeg-free, in CI, with
|
|
8
|
+
* no binary on the path.
|
|
9
|
+
*
|
|
10
|
+
* The double needs no real fMP4: a recording consumer forwards `segments()` output opaquely to HomeKit, so the segments are opaque `Buffer`s the test chooses. The
|
|
11
|
+
* keyframe-bearing fMP4 concern (timeshift / prebuffer) lives entirely in a consumer's own segment double, not here.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import type { FfmpegRecordingInit, RecordingProcess, RecordingProcessFactory } from "./record.ts";
|
|
16
|
+
import type { FfmpegOptions } from "./options.ts";
|
|
17
|
+
import { Writable } from "node:stream";
|
|
18
|
+
/**
|
|
19
|
+
* Construction-time configuration for a {@link TestRecordingProcess}. Every field has a deterministic default so a bare `new TestRecordingProcess()` is usable; supply
|
|
20
|
+
* only the fields a given test steers a branch with.
|
|
21
|
+
*
|
|
22
|
+
* @property bufferedSegments - The value the `bufferedSegments` getter reports. Defaults to `0`.
|
|
23
|
+
* @property initSegment - The buffer `getInitSegment()` resolves with. Defaults to an empty buffer.
|
|
24
|
+
* @property isTimedOut - The value the `isTimedOut` getter reports. Defaults to `false`.
|
|
25
|
+
* @property segments - The media-segment buffers `segments()` yields, in order. Defaults to an empty array.
|
|
26
|
+
* @property stderrLog - The lines the `stderrLog` getter reports. Defaults to an empty array.
|
|
27
|
+
*
|
|
28
|
+
* @category Testing
|
|
29
|
+
*/
|
|
30
|
+
export interface TestRecordingProcessInit {
|
|
31
|
+
bufferedSegments?: number;
|
|
32
|
+
initSegment?: Buffer;
|
|
33
|
+
isTimedOut?: boolean;
|
|
34
|
+
segments?: Buffer[];
|
|
35
|
+
stderrLog?: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A configurable, FFmpeg-free {@link RecordingProcess} fake. It satisfies the same interface the production
|
|
39
|
+
* {@link ffmpeg/record!FfmpegRecordingProcess | FfmpegRecordingProcess} does, so a recording delegate constructs and drives it exactly as it would the real class - but
|
|
40
|
+
* it spawns no child and yields caller-supplied bytes deterministically.
|
|
41
|
+
*
|
|
42
|
+
* Fidelity to the real contract: `abort()` aborts a genuine {@link AbortSignal} with a real {@link HbpuAbortError} reason (defaulting to `"shutdown"` exactly as
|
|
43
|
+
* {@link ffmpeg/process!FfmpegProcess.abort | FfmpegProcess.abort} does), so a consumer's `isHbpuAbortReason` / timeout derivations stay meaningful; `getInitSegment()`
|
|
44
|
+
* rejects with `signal.reason` after a pre-init abort, mirroring the real assembler's init-reject contract; and `segments()` terminates on EITHER its own signal or the
|
|
45
|
+
* passed per-call signal, mirroring how
|
|
46
|
+
* the real assembler composes the two. The `stdin` sink records every written chunk and stays writable across abort, so a consumer driving a `BackpressureWriter` over it
|
|
47
|
+
* can assert the segment feed regardless of abort ordering.
|
|
48
|
+
*
|
|
49
|
+
* @see RecordingProcess
|
|
50
|
+
* @see TestRecordingProcessFactory
|
|
51
|
+
*
|
|
52
|
+
* @category Testing
|
|
53
|
+
*/
|
|
54
|
+
export declare class TestRecordingProcess implements RecordingProcess {
|
|
55
|
+
#private;
|
|
56
|
+
readonly abortCalls: unknown[];
|
|
57
|
+
readonly stdinWrites: Buffer[];
|
|
58
|
+
readonly stdin: Writable;
|
|
59
|
+
/**
|
|
60
|
+
* Construct a configurable recording-process fake.
|
|
61
|
+
*
|
|
62
|
+
* @param init - Optional configuration. See {@link TestRecordingProcessInit}. Every field defaults, so a bare `new TestRecordingProcess()` is valid.
|
|
63
|
+
*/
|
|
64
|
+
constructor(init?: TestRecordingProcessInit);
|
|
65
|
+
/**
|
|
66
|
+
* Abort the recording process. Aborts the internal signal with the supplied reason, defaulting to a real `HbpuAbortError("shutdown")` exactly as the production
|
|
67
|
+
* `FfmpegProcess.abort` does, and records the (defaulted) reason for assertions. Safe to call more than once: the underlying signal aborts only once.
|
|
68
|
+
*
|
|
69
|
+
* @param reason - Optional abort reason. Typically an {@link HbpuAbortError}.
|
|
70
|
+
*/
|
|
71
|
+
abort(reason?: unknown): void;
|
|
72
|
+
/**
|
|
73
|
+
* The configured buffered-segment depth.
|
|
74
|
+
*/
|
|
75
|
+
get bufferedSegments(): number;
|
|
76
|
+
/**
|
|
77
|
+
* Resolve with the configured init segment. Rejects with `signal.reason` if `abort()` fired before init was requested, mirroring the real
|
|
78
|
+
* `FfmpegFMp4Process.getInitSegment` -> `Mp4SegmentAssembler.initSegment` reject-on-pre-init-abort contract.
|
|
79
|
+
*
|
|
80
|
+
* @returns A promise resolving to the configured init segment bytes.
|
|
81
|
+
*/
|
|
82
|
+
getInitSegment(): Promise<Buffer>;
|
|
83
|
+
/**
|
|
84
|
+
* The configured timed-out flag.
|
|
85
|
+
*/
|
|
86
|
+
get isTimedOut(): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Yield the configured media segments in order. Terminates (returns) when EITHER this process's own signal aborts OR the passed `init.signal` aborts - composing both,
|
|
89
|
+
* mirroring how the real `Mp4SegmentAssembler.segments` honors the process signal and the per-call signal together.
|
|
90
|
+
*
|
|
91
|
+
* This double does NOT gate media delivery on init-first the way the real assembler does. The real HKSV consumer always awaits `getInitSegment()` before iterating, so
|
|
92
|
+
* the simplification is invisible to it; a future `segments()`-first consumer must not assume an ordering this double does not enforce.
|
|
93
|
+
*
|
|
94
|
+
* @param init - Optional init options. `signal` composes with this process's own signal; aborting either terminates this generator call.
|
|
95
|
+
*
|
|
96
|
+
* @returns An async generator yielding the configured media segment buffers in order.
|
|
97
|
+
*/
|
|
98
|
+
segments(init?: {
|
|
99
|
+
signal?: AbortSignal;
|
|
100
|
+
}): AsyncGenerator<Buffer>;
|
|
101
|
+
/**
|
|
102
|
+
* The composed abort signal representing this process's lifetime. Aborts exactly once, when `abort()` is called; `signal.reason` carries the recorded reason.
|
|
103
|
+
*/
|
|
104
|
+
get signal(): AbortSignal;
|
|
105
|
+
/**
|
|
106
|
+
* The configured stderr lines.
|
|
107
|
+
*/
|
|
108
|
+
get stderrLog(): readonly string[];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* A {@link RecordingProcessFactory} fake that records every `create` call (the options and init it was passed, for assertions) and returns a
|
|
112
|
+
* {@link TestRecordingProcess}, mirroring the create-call-recording discipline a consumer's streaming-delegate factory double uses. By default it returns a fresh,
|
|
113
|
+
* default-configured process per call; supply a process to the constructor to return a single pre-configured instance from every `create`.
|
|
114
|
+
*
|
|
115
|
+
* @see RecordingProcessFactory
|
|
116
|
+
* @see TestRecordingProcess
|
|
117
|
+
*
|
|
118
|
+
* @category Testing
|
|
119
|
+
*/
|
|
120
|
+
export declare class TestRecordingProcessFactory implements RecordingProcessFactory {
|
|
121
|
+
#private;
|
|
122
|
+
readonly createCalls: {
|
|
123
|
+
init: FfmpegRecordingInit;
|
|
124
|
+
options: FfmpegOptions;
|
|
125
|
+
process: TestRecordingProcess;
|
|
126
|
+
}[];
|
|
127
|
+
/**
|
|
128
|
+
* Construct a recording-process factory fake.
|
|
129
|
+
*
|
|
130
|
+
* @param process - Optional pre-configured {@link TestRecordingProcess} to return from every `create`. When omitted, each `create` returns a fresh,
|
|
131
|
+
* default-configured process.
|
|
132
|
+
*/
|
|
133
|
+
constructor(process?: TestRecordingProcess);
|
|
134
|
+
/**
|
|
135
|
+
* Record the create call and return a {@link TestRecordingProcess} - the constructor-supplied instance when one was given, otherwise a fresh default-configured one.
|
|
136
|
+
*
|
|
137
|
+
* @param options - The {@link FfmpegOptions} the consumer passed.
|
|
138
|
+
* @param init - The {@link FfmpegRecordingInit} the consumer passed.
|
|
139
|
+
*
|
|
140
|
+
* @returns The recording-process double.
|
|
141
|
+
*/
|
|
142
|
+
create(options: FfmpegOptions, init: FfmpegRecordingInit): RecordingProcess;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=recording-process-double.d.ts.map
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/* Copyright(C) 2017-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* ffmpeg/recording-process-double.ts: A reusable, FFmpeg-free test double for the RecordingProcess dependency-inversion seam.
|
|
4
|
+
*/
|
|
5
|
+
import { HbpuAbortError, composeSignals } from "../util.js";
|
|
6
|
+
import { Writable } from "node:stream";
|
|
7
|
+
/**
|
|
8
|
+
* A configurable, FFmpeg-free {@link RecordingProcess} fake. It satisfies the same interface the production
|
|
9
|
+
* {@link ffmpeg/record!FfmpegRecordingProcess | FfmpegRecordingProcess} does, so a recording delegate constructs and drives it exactly as it would the real class - but
|
|
10
|
+
* it spawns no child and yields caller-supplied bytes deterministically.
|
|
11
|
+
*
|
|
12
|
+
* Fidelity to the real contract: `abort()` aborts a genuine {@link AbortSignal} with a real {@link HbpuAbortError} reason (defaulting to `"shutdown"` exactly as
|
|
13
|
+
* {@link ffmpeg/process!FfmpegProcess.abort | FfmpegProcess.abort} does), so a consumer's `isHbpuAbortReason` / timeout derivations stay meaningful; `getInitSegment()`
|
|
14
|
+
* rejects with `signal.reason` after a pre-init abort, mirroring the real assembler's init-reject contract; and `segments()` terminates on EITHER its own signal or the
|
|
15
|
+
* passed per-call signal, mirroring how
|
|
16
|
+
* the real assembler composes the two. The `stdin` sink records every written chunk and stays writable across abort, so a consumer driving a `BackpressureWriter` over it
|
|
17
|
+
* can assert the segment feed regardless of abort ordering.
|
|
18
|
+
*
|
|
19
|
+
* @see RecordingProcess
|
|
20
|
+
* @see TestRecordingProcessFactory
|
|
21
|
+
*
|
|
22
|
+
* @category Testing
|
|
23
|
+
*/
|
|
24
|
+
export class TestRecordingProcess {
|
|
25
|
+
// The reasons every `abort(reason?)` call was invoked with, in order, for assertions. A no-argument call records the defaulted `HbpuAbortError("shutdown")` so the
|
|
26
|
+
// recorded reason matches `signal.reason`.
|
|
27
|
+
abortCalls = [];
|
|
28
|
+
// Every chunk written to `stdin`, in order, so a consumer feeding the recording-write path can assert exactly what it fed.
|
|
29
|
+
stdinWrites = [];
|
|
30
|
+
stdin;
|
|
31
|
+
// The internal controller whose signal is exposed as the process lifetime. Owned privately so the only way to abort is through `abort()`, which records the call.
|
|
32
|
+
#controller = new AbortController();
|
|
33
|
+
#bufferedSegments;
|
|
34
|
+
#initSegment;
|
|
35
|
+
#isTimedOut;
|
|
36
|
+
#segments;
|
|
37
|
+
#stderrLog;
|
|
38
|
+
/**
|
|
39
|
+
* Construct a configurable recording-process fake.
|
|
40
|
+
*
|
|
41
|
+
* @param init - Optional configuration. See {@link TestRecordingProcessInit}. Every field defaults, so a bare `new TestRecordingProcess()` is valid.
|
|
42
|
+
*/
|
|
43
|
+
constructor(init = {}) {
|
|
44
|
+
this.#bufferedSegments = init.bufferedSegments ?? 0;
|
|
45
|
+
this.#initSegment = init.initSegment ?? Buffer.alloc(0);
|
|
46
|
+
this.#isTimedOut = init.isTimedOut ?? false;
|
|
47
|
+
this.#segments = init.segments ?? [];
|
|
48
|
+
this.#stderrLog = init.stderrLog ?? [];
|
|
49
|
+
// A genuine recording sink that records each chunk and immediately acknowledges the write. It is intentionally independent of the abort path: `abort()` never ends or
|
|
50
|
+
// destroys it, so it stays `writable` and a consumer's writes land regardless of abort ordering. This is a deliberate divergence from the real `FfmpegProcess.stdin`,
|
|
51
|
+
// which Node destroys as soon as the abort signal fires and the kill signal takes effect; the double stays open indefinitely so a recording consumer can flush its
|
|
52
|
+
// in-flight segment feed and assert on it without racing the abort-triggered teardown the real stream would otherwise undergo.
|
|
53
|
+
this.stdin = new Writable({
|
|
54
|
+
write: (chunk, _encoding, callback) => {
|
|
55
|
+
this.stdinWrites.push(chunk);
|
|
56
|
+
callback();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Abort the recording process. Aborts the internal signal with the supplied reason, defaulting to a real `HbpuAbortError("shutdown")` exactly as the production
|
|
62
|
+
* `FfmpegProcess.abort` does, and records the (defaulted) reason for assertions. Safe to call more than once: the underlying signal aborts only once.
|
|
63
|
+
*
|
|
64
|
+
* @param reason - Optional abort reason. Typically an {@link HbpuAbortError}.
|
|
65
|
+
*/
|
|
66
|
+
abort(reason) {
|
|
67
|
+
const resolvedReason = reason ?? new HbpuAbortError("shutdown");
|
|
68
|
+
this.abortCalls.push(resolvedReason);
|
|
69
|
+
this.#controller.abort(resolvedReason);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The configured buffered-segment depth.
|
|
73
|
+
*/
|
|
74
|
+
get bufferedSegments() {
|
|
75
|
+
return this.#bufferedSegments;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolve with the configured init segment. Rejects with `signal.reason` if `abort()` fired before init was requested, mirroring the real
|
|
79
|
+
* `FfmpegFMp4Process.getInitSegment` -> `Mp4SegmentAssembler.initSegment` reject-on-pre-init-abort contract.
|
|
80
|
+
*
|
|
81
|
+
* @returns A promise resolving to the configured init segment bytes.
|
|
82
|
+
*/
|
|
83
|
+
async getInitSegment() {
|
|
84
|
+
if (this.#controller.signal.aborted) {
|
|
85
|
+
throw this.#controller.signal.reason;
|
|
86
|
+
}
|
|
87
|
+
return this.#initSegment;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The configured timed-out flag.
|
|
91
|
+
*/
|
|
92
|
+
get isTimedOut() {
|
|
93
|
+
return this.#isTimedOut;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Yield the configured media segments in order. Terminates (returns) when EITHER this process's own signal aborts OR the passed `init.signal` aborts - composing both,
|
|
97
|
+
* mirroring how the real `Mp4SegmentAssembler.segments` honors the process signal and the per-call signal together.
|
|
98
|
+
*
|
|
99
|
+
* This double does NOT gate media delivery on init-first the way the real assembler does. The real HKSV consumer always awaits `getInitSegment()` before iterating, so
|
|
100
|
+
* the simplification is invisible to it; a future `segments()`-first consumer must not assume an ordering this double does not enforce.
|
|
101
|
+
*
|
|
102
|
+
* @param init - Optional init options. `signal` composes with this process's own signal; aborting either terminates this generator call.
|
|
103
|
+
*
|
|
104
|
+
* @returns An async generator yielding the configured media segment buffers in order.
|
|
105
|
+
*/
|
|
106
|
+
async *segments(init = {}) {
|
|
107
|
+
// Compose the per-call signal with our own signal upfront so a single check governs both cancellation sources, mirroring the real assembler. The composed signal is
|
|
108
|
+
// checked before each yield so an abort that fires mid-iteration terminates the generator without yielding the remaining configured segments.
|
|
109
|
+
const composed = composeSignals(this.#controller.signal, init.signal);
|
|
110
|
+
for (const segment of this.#segments) {
|
|
111
|
+
if (composed.aborted) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
yield segment;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The composed abort signal representing this process's lifetime. Aborts exactly once, when `abort()` is called; `signal.reason` carries the recorded reason.
|
|
119
|
+
*/
|
|
120
|
+
get signal() {
|
|
121
|
+
return this.#controller.signal;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The configured stderr lines.
|
|
125
|
+
*/
|
|
126
|
+
get stderrLog() {
|
|
127
|
+
return this.#stderrLog;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* A {@link RecordingProcessFactory} fake that records every `create` call (the options and init it was passed, for assertions) and returns a
|
|
132
|
+
* {@link TestRecordingProcess}, mirroring the create-call-recording discipline a consumer's streaming-delegate factory double uses. By default it returns a fresh,
|
|
133
|
+
* default-configured process per call; supply a process to the constructor to return a single pre-configured instance from every `create`.
|
|
134
|
+
*
|
|
135
|
+
* @see RecordingProcessFactory
|
|
136
|
+
* @see TestRecordingProcess
|
|
137
|
+
*
|
|
138
|
+
* @category Testing
|
|
139
|
+
*/
|
|
140
|
+
export class TestRecordingProcessFactory {
|
|
141
|
+
// Every create call's arguments and the process returned, in order, so a test can assert the seam was exercised exactly once with exactly the expected options/init.
|
|
142
|
+
createCalls = [];
|
|
143
|
+
// The pre-configured process to return from every create, when supplied; otherwise each create returns a fresh default-configured process.
|
|
144
|
+
#process;
|
|
145
|
+
/**
|
|
146
|
+
* Construct a recording-process factory fake.
|
|
147
|
+
*
|
|
148
|
+
* @param process - Optional pre-configured {@link TestRecordingProcess} to return from every `create`. When omitted, each `create` returns a fresh,
|
|
149
|
+
* default-configured process.
|
|
150
|
+
*/
|
|
151
|
+
constructor(process) {
|
|
152
|
+
this.#process = process;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Record the create call and return a {@link TestRecordingProcess} - the constructor-supplied instance when one was given, otherwise a fresh default-configured one.
|
|
156
|
+
*
|
|
157
|
+
* @param options - The {@link FfmpegOptions} the consumer passed.
|
|
158
|
+
* @param init - The {@link FfmpegRecordingInit} the consumer passed.
|
|
159
|
+
*
|
|
160
|
+
* @returns The recording-process double.
|
|
161
|
+
*/
|
|
162
|
+
create(options, init) {
|
|
163
|
+
const process = this.#process ?? new TestRecordingProcess();
|
|
164
|
+
this.createCalls.push({ init, options, process });
|
|
165
|
+
return process;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=recording-process-double.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-process-double.js","sourceRoot":"","sources":["../../src/ffmpeg/recording-process-double.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification of a UDP datagram emitted by {@link RtpPacketParser}. `"rtp"` denotes a media packet; `"rtcp"` denotes a control packet. Consumers typically
|
|
3
|
+
* discriminate on this union to route to the correct downstream FFmpeg port.
|
|
4
|
+
*
|
|
5
|
+
* @category FFmpeg
|
|
6
|
+
*/
|
|
7
|
+
export type RtpPacketKind = "rtcp" | "rtp";
|
|
8
|
+
/**
|
|
9
|
+
* A single classified RTP or RTCP packet.
|
|
10
|
+
*
|
|
11
|
+
* @property bytes - The complete UDP datagram bytes. Emitted as-is from the parser; consumers that need to hold it past the iteration loop should copy with
|
|
12
|
+
* `Buffer.from()` if the upstream datagram lifetime is suspect.
|
|
13
|
+
* @property kind - `"rtp"` or `"rtcp"`, derived from the header's payload type field.
|
|
14
|
+
* @property payloadType - The 7-bit payload type value from the second byte of the header, masked against `0x7F`. Provided raw so consumers can match specific RTP
|
|
15
|
+
* payload types (e.g., opus, g711) without re-parsing the header.
|
|
16
|
+
*
|
|
17
|
+
* @category FFmpeg
|
|
18
|
+
*/
|
|
19
|
+
export interface RtpPacket {
|
|
20
|
+
bytes: Buffer;
|
|
21
|
+
kind: RtpPacketKind;
|
|
22
|
+
payloadType: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pure stateful parser that classifies UDP datagrams as RTP or RTCP and surfaces them as {@link RtpPacket} records.
|
|
26
|
+
*
|
|
27
|
+
* Unlike {@link ffmpeg/mp4-parser!Mp4BoxParser | Mp4BoxParser}, the RTP wire format is already datagram-framed - each UDP message is a complete packet - so there is no
|
|
28
|
+
* cross-call state to carry. The class shape mirrors the MP4 parser for consistency: composing resource classes (demuxers, assemblers) drive any parser of this shape
|
|
29
|
+
* without having to know whether the wire format was stream-oriented or datagram-oriented.
|
|
30
|
+
*
|
|
31
|
+
* The class is intentionally signal-free and event-free. Resource lifecycle, liveness monitoring, and async consumption are the composing caller's concern - see
|
|
32
|
+
* {@link ffmpeg/rtp!RtpDemuxer | RtpDemuxer}.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { RtpPacketParser } from "homebridge-plugin-utils";
|
|
38
|
+
*
|
|
39
|
+
* const parser = new RtpPacketParser();
|
|
40
|
+
*
|
|
41
|
+
* socket.on("message", (datagram) => {
|
|
42
|
+
*
|
|
43
|
+
* for(const packet of parser.consume(datagram)) {
|
|
44
|
+
*
|
|
45
|
+
* if(packet.kind === "rtp") {
|
|
46
|
+
*
|
|
47
|
+
* socket.send(packet.bytes, rtpPort);
|
|
48
|
+
* }
|
|
49
|
+
* }
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @see RtpDemuxer
|
|
54
|
+
*
|
|
55
|
+
* @category FFmpeg
|
|
56
|
+
*/
|
|
57
|
+
export declare class RtpPacketParser {
|
|
58
|
+
/**
|
|
59
|
+
* Feed the parser a UDP datagram and yield the single classified packet it contains.
|
|
60
|
+
*
|
|
61
|
+
* Datagrams shorter than the two-byte minimum required to read the payload type field are silently dropped. Callers that need to observe malformed input should do so
|
|
62
|
+
* at the socket layer; the parser's contract is "classify well-formed headers," not "diagnose corruption."
|
|
63
|
+
*
|
|
64
|
+
* @param datagram - A complete UDP datagram received from the RTP/RTCP socket.
|
|
65
|
+
*
|
|
66
|
+
* @returns An iterable yielding zero packets (empty datagram) or exactly one packet (well-formed datagram).
|
|
67
|
+
*/
|
|
68
|
+
consume(datagram: Buffer): Iterable<RtpPacket>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=rtp-parser.d.ts.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* Copyright(C) 2017-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* ffmpeg/rtp-parser.ts: Pure byte-to-record parser for RTP/RTCP datagrams.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Pure stateful byte-to-record parser for RTP and RTCP datagrams multiplexed on a single UDP port per RFC 5761.
|
|
7
|
+
*
|
|
8
|
+
* Each RTP or RTCP packet arrives as a self-contained UDP datagram, so the parser does not have to reassemble anything across chunks. Its job is classification: given
|
|
9
|
+
* the raw datagram bytes, decide whether the packet is RTP or RTCP and surface the payload type for callers that discriminate further. This mirrors the shape of
|
|
10
|
+
* {@link ffmpeg/mp4-parser!Mp4BoxParser | Mp4BoxParser} (pure, stateful class, `consume(chunk)` returning an iterable) so the composing caller - typically
|
|
11
|
+
* {@link ffmpeg/rtp!RtpDemuxer | RtpDemuxer} - can drive either parser through the same wiring.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
// RTP/RTCP demultiplexing threshold per RFC 5761. The second byte of every RTP/RTCP header carries the payload type in its low seven bits. RFC 5761 documents that
|
|
16
|
+
// values above 90 (and the distinguished value 0) are never used by standard RTCP packet types, so they are safe to treat as RTP; everything else is routed to RTCP.
|
|
17
|
+
const RTP_PAYLOAD_TYPE_THRESHOLD = 90;
|
|
18
|
+
/**
|
|
19
|
+
* Pure stateful parser that classifies UDP datagrams as RTP or RTCP and surfaces them as {@link RtpPacket} records.
|
|
20
|
+
*
|
|
21
|
+
* Unlike {@link ffmpeg/mp4-parser!Mp4BoxParser | Mp4BoxParser}, the RTP wire format is already datagram-framed - each UDP message is a complete packet - so there is no
|
|
22
|
+
* cross-call state to carry. The class shape mirrors the MP4 parser for consistency: composing resource classes (demuxers, assemblers) drive any parser of this shape
|
|
23
|
+
* without having to know whether the wire format was stream-oriented or datagram-oriented.
|
|
24
|
+
*
|
|
25
|
+
* The class is intentionally signal-free and event-free. Resource lifecycle, liveness monitoring, and async consumption are the composing caller's concern - see
|
|
26
|
+
* {@link ffmpeg/rtp!RtpDemuxer | RtpDemuxer}.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { RtpPacketParser } from "homebridge-plugin-utils";
|
|
32
|
+
*
|
|
33
|
+
* const parser = new RtpPacketParser();
|
|
34
|
+
*
|
|
35
|
+
* socket.on("message", (datagram) => {
|
|
36
|
+
*
|
|
37
|
+
* for(const packet of parser.consume(datagram)) {
|
|
38
|
+
*
|
|
39
|
+
* if(packet.kind === "rtp") {
|
|
40
|
+
*
|
|
41
|
+
* socket.send(packet.bytes, rtpPort);
|
|
42
|
+
* }
|
|
43
|
+
* }
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @see RtpDemuxer
|
|
48
|
+
*
|
|
49
|
+
* @category FFmpeg
|
|
50
|
+
*/
|
|
51
|
+
export class RtpPacketParser {
|
|
52
|
+
/**
|
|
53
|
+
* Feed the parser a UDP datagram and yield the single classified packet it contains.
|
|
54
|
+
*
|
|
55
|
+
* Datagrams shorter than the two-byte minimum required to read the payload type field are silently dropped. Callers that need to observe malformed input should do so
|
|
56
|
+
* at the socket layer; the parser's contract is "classify well-formed headers," not "diagnose corruption."
|
|
57
|
+
*
|
|
58
|
+
* @param datagram - A complete UDP datagram received from the RTP/RTCP socket.
|
|
59
|
+
*
|
|
60
|
+
* @returns An iterable yielding zero packets (empty datagram) or exactly one packet (well-formed datagram).
|
|
61
|
+
*/
|
|
62
|
+
*consume(datagram) {
|
|
63
|
+
// Two bytes is the minimum needed to read the payload type. Anything shorter is silently dropped - the RTP/RTCP fixed headers are at least 12 and 8 bytes
|
|
64
|
+
// respectively, so a datagram this short cannot be a legitimate packet.
|
|
65
|
+
if (datagram.length < 2) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Payload type lives in the low seven bits of the second header byte (the top bit is the marker bit in RTP and the padding bit in RTCP; we only care about the
|
|
69
|
+
// low seven here).
|
|
70
|
+
const payloadType = datagram.readUInt8(1) & 0x7F;
|
|
71
|
+
// Classification follows the RFC 5761 demux rule: values above 90 and the distinguished value 0 are RTP; everything else is RTCP. The split is intentionally
|
|
72
|
+
// expressed as a single boolean so the path stays branch-predictable in the hot loop.
|
|
73
|
+
const kind = ((payloadType > RTP_PAYLOAD_TYPE_THRESHOLD) || (payloadType === 0)) ? "rtp" : "rtcp";
|
|
74
|
+
yield { bytes: datagram, kind, payloadType };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=rtp-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp-parser.js","sourceRoot":"","sources":["../../src/ffmpeg/rtp-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,mKAAmK;AACnK,qKAAqK;AACrK,MAAM,0BAA0B,GAAG,EAAE,CAAC;AA4BtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,eAAe;IAE1B;;;;;;;;;OASG;IACI,CAAC,OAAO,CAAC,QAAgB;QAE9B,0JAA0J;QAC1J,wEAAwE;QACxE,IAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAEvB,OAAO;QACT,CAAC;QAED,+JAA+J;QAC/J,mBAAmB;QACnB,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAEjD,6JAA6J;QAC7J,sFAAsF;QACtF,MAAM,IAAI,GAAkB,CAAC,CAAC,WAAW,GAAG,0BAA0B,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjH,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/C,CAAC;CACF"}
|