reactor-effect-browser 0.0.0-reserved.0 → 0.2.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/LICENSE +201 -0
- package/NOTICE +15 -0
- package/README.md +42 -2
- package/dist/_internal/audio-packet.d.ts +13 -0
- package/dist/_internal/audio-packet.d.ts.map +1 -0
- package/dist/_internal/audio-packet.js +43 -0
- package/dist/_internal/audio-packet.js.map +1 -0
- package/dist/_internal/audio.d.ts +34 -0
- package/dist/_internal/audio.d.ts.map +1 -0
- package/dist/_internal/audio.js +234 -0
- package/dist/_internal/audio.js.map +1 -0
- package/dist/_internal/media.d.ts +66 -0
- package/dist/_internal/media.d.ts.map +1 -0
- package/dist/_internal/media.js +409 -0
- package/dist/_internal/media.js.map +1 -0
- package/dist/_internal/pcm-worklet.d.ts +2 -0
- package/dist/_internal/pcm-worklet.d.ts.map +1 -0
- package/dist/_internal/pcm-worklet.js +51 -0
- package/dist/_internal/pcm-worklet.js.map +1 -0
- package/dist/_internal/peer.d.ts +30 -0
- package/dist/_internal/peer.d.ts.map +1 -0
- package/dist/_internal/peer.js +294 -0
- package/dist/_internal/peer.js.map +1 -0
- package/dist/_internal/recording.d.ts +23 -0
- package/dist/_internal/recording.d.ts.map +1 -0
- package/dist/_internal/recording.js +110 -0
- package/dist/_internal/recording.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/notices/effect-LICENSE +21 -0
- package/package.json +32 -4
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export { audioContext, webAudioSamples } from "./audio.js";
|
|
2
|
+
export type { WebAudioOptions, WebAudioSample } from "./audio.js";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Stream from "effect/Stream";
|
|
5
|
+
import type * as Scope from "effect/Scope";
|
|
6
|
+
import { ReactorError } from "reactor-effect-client";
|
|
7
|
+
export interface MediaOptions {
|
|
8
|
+
readonly maxSampleBytes?: number;
|
|
9
|
+
readonly readTimeoutMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface VideoSample {
|
|
12
|
+
readonly format: "RGBA";
|
|
13
|
+
readonly width: number;
|
|
14
|
+
readonly height: number;
|
|
15
|
+
readonly data: Uint8Array<ArrayBuffer>;
|
|
16
|
+
readonly timestampUs: number;
|
|
17
|
+
readonly clock: "video-track-processor";
|
|
18
|
+
}
|
|
19
|
+
export interface AudioSample {
|
|
20
|
+
readonly format: "f32-planar";
|
|
21
|
+
readonly planes: readonly Float32Array<ArrayBuffer>[];
|
|
22
|
+
readonly sampleRate: number;
|
|
23
|
+
readonly frames: number;
|
|
24
|
+
readonly timestampUs: number;
|
|
25
|
+
readonly clock: "audio-track-processor";
|
|
26
|
+
}
|
|
27
|
+
/** Presence is only a hint. Acquiring a processor and copying a sample tests the capability. */
|
|
28
|
+
export declare const mediaFacilities: () => Readonly<Record<string, boolean>>;
|
|
29
|
+
/** Acquisition, native output and copied output remain separate diagnostic facts. */
|
|
30
|
+
export interface NativeMediaFailure {
|
|
31
|
+
readonly phase: string;
|
|
32
|
+
readonly realm: "Window" | "other";
|
|
33
|
+
readonly processorConstructed: boolean;
|
|
34
|
+
readonly readerAcquired: boolean;
|
|
35
|
+
readonly nativeSamplesRead: number;
|
|
36
|
+
readonly copiedSamples: number;
|
|
37
|
+
readonly source: Readonly<{
|
|
38
|
+
kind: string;
|
|
39
|
+
readyState: MediaStreamTrackState;
|
|
40
|
+
enabled: boolean;
|
|
41
|
+
muted: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
readonly ownedTrack: Readonly<{
|
|
44
|
+
readyState: MediaStreamTrackState;
|
|
45
|
+
}>;
|
|
46
|
+
readonly nativeErrorName?: string;
|
|
47
|
+
readonly cleanupFailures: readonly Readonly<{
|
|
48
|
+
phase: string;
|
|
49
|
+
message: string;
|
|
50
|
+
}>[];
|
|
51
|
+
}
|
|
52
|
+
/** One native queue slot and one demand-driven copy. No borrowed frame escapes. */
|
|
53
|
+
export declare const videoFrames: (track: MediaStreamTrack, options?: MediaOptions) => Stream.Stream<VideoSample, ReactorError>;
|
|
54
|
+
/** Optional native AudioData in the current realm. No worker or Web Audio fallback. */
|
|
55
|
+
export declare const audioSamples: (track: MediaStreamTrack, options?: MediaOptions) => Stream.Stream<AudioSample, ReactorError>;
|
|
56
|
+
/** Scoped local playback. Starting playback does not establish audience output. */
|
|
57
|
+
export declare const play: (track: MediaStreamTrack, element: HTMLMediaElement, timeoutMs?: number) => Effect.Effect<void, ReactorError, Scope.Scope>;
|
|
58
|
+
export interface Presentation {
|
|
59
|
+
readonly callbackTimeMs: number;
|
|
60
|
+
readonly mediaTimeSeconds: number;
|
|
61
|
+
readonly presentedFrames: number;
|
|
62
|
+
readonly width: number;
|
|
63
|
+
readonly height: number;
|
|
64
|
+
}
|
|
65
|
+
export declare const nextPresentation: (element: HTMLVideoElement, timeoutMs?: number) => Effect.Effect<Presentation, ReactorError>;
|
|
66
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/_internal/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
export { audioContext, webAudioSamples } from "./audio.js";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Stream from "effect/Stream";
|
|
4
|
+
import { ReactorError } from "reactor-effect-client";
|
|
5
|
+
import { errorOf, finite, fromOwnedReadableStream, positiveLimit, record, } from "reactor-effect-client/host";
|
|
6
|
+
/** Presence is only a hint. Acquiring a processor and copying a sample tests the capability. */
|
|
7
|
+
export const mediaFacilities = () => Object.freeze({
|
|
8
|
+
peer: typeof RTCPeerConnection === "function",
|
|
9
|
+
videoFrame: typeof VideoFrame === "function",
|
|
10
|
+
trackProcessor: typeof record(globalThis)["MediaStreamTrackProcessor"] === "function",
|
|
11
|
+
audioData: "AudioData" in globalThis && typeof globalThis.AudioData === "function",
|
|
12
|
+
playback: typeof HTMLMediaElement === "function",
|
|
13
|
+
audioContext: typeof AudioContext === "function",
|
|
14
|
+
audioWorklet: typeof AudioWorkletNode === "function",
|
|
15
|
+
});
|
|
16
|
+
const unsupported = (message) => {
|
|
17
|
+
throw new ReactorError("UnsupportedCapability", message);
|
|
18
|
+
};
|
|
19
|
+
const timestamp = (input) => {
|
|
20
|
+
const value = finite(input, "media timestamp");
|
|
21
|
+
if (!Number.isSafeInteger(value))
|
|
22
|
+
throw new ReactorError("Protocol", "media timestamp cannot be represented exactly in this host");
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
const deadline = async (promise, ms, signal) => {
|
|
26
|
+
let handle;
|
|
27
|
+
let aborted;
|
|
28
|
+
try {
|
|
29
|
+
return await Promise.race([
|
|
30
|
+
promise,
|
|
31
|
+
new Promise((_, reject) => {
|
|
32
|
+
handle = setTimeout(() => reject(new ReactorError("Timeout", "media read/copy/play deadline")), ms);
|
|
33
|
+
aborted = () => reject(new ReactorError("Aborted", "media operation cancelled"));
|
|
34
|
+
if (signal?.aborted)
|
|
35
|
+
aborted();
|
|
36
|
+
else
|
|
37
|
+
signal?.addEventListener("abort", aborted, { once: true });
|
|
38
|
+
}),
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
if (handle !== undefined)
|
|
43
|
+
clearTimeout(handle);
|
|
44
|
+
if (aborted !== undefined)
|
|
45
|
+
signal?.removeEventListener("abort", aborted);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const processor = (track) => {
|
|
49
|
+
const constructor = record(globalThis)["MediaStreamTrackProcessor"];
|
|
50
|
+
if (typeof constructor !== "function")
|
|
51
|
+
return unsupported("MediaStreamTrackProcessor is unavailable in this realm");
|
|
52
|
+
return Reflect.construct(constructor, [{ track, maxBufferSize: 1 }]);
|
|
53
|
+
};
|
|
54
|
+
const nativeAudio = (input) => {
|
|
55
|
+
if (!("AudioData" in globalThis) ||
|
|
56
|
+
typeof globalThis.AudioData !== "function" ||
|
|
57
|
+
!(input instanceof globalThis.AudioData)) {
|
|
58
|
+
return unsupported("the track processor did not yield native AudioData in this realm");
|
|
59
|
+
}
|
|
60
|
+
const raw = record(input, "AudioData"), copy = raw.copyTo;
|
|
61
|
+
if (typeof copy !== "function" || typeof raw.close !== "function")
|
|
62
|
+
return unsupported("AudioData copyTo/close are missing");
|
|
63
|
+
return {
|
|
64
|
+
timestamp: timestamp(raw.timestamp),
|
|
65
|
+
frames: positiveLimit(finite(raw.numberOfFrames, "audio frames"), "audio frames", 1_048_576),
|
|
66
|
+
channels: positiveLimit(finite(raw.numberOfChannels, "audio channels"), "audio channels", 32),
|
|
67
|
+
sampleRate: positiveLimit(finite(raw.sampleRate, "audio sample rate"), "sample rate", 384_000),
|
|
68
|
+
copy: (plane, index) => {
|
|
69
|
+
Reflect.apply(copy, input, [plane, { planeIndex: index, format: "f32-planar" }]);
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
const closable = (raw) => {
|
|
74
|
+
if (typeof raw !== "object" ||
|
|
75
|
+
raw === null ||
|
|
76
|
+
!("close" in raw) ||
|
|
77
|
+
typeof raw.close !== "function")
|
|
78
|
+
return undefined;
|
|
79
|
+
const close = raw.close;
|
|
80
|
+
return {
|
|
81
|
+
close: () => {
|
|
82
|
+
Reflect.apply(close, raw, []);
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
function copiedSamples(source, kind, options, copy) {
|
|
87
|
+
const maxBytes = positiveLimit(options.maxSampleBytes ?? (kind === "video" ? 8_294_400 : 1_048_576), "media sample bytes", 64 * 1024 * 1024);
|
|
88
|
+
const timeoutMs = positiveLimit(options.readTimeoutMs ?? 10_000, "media read timeout", 600_000);
|
|
89
|
+
if (source.kind !== kind || source.readyState !== "live")
|
|
90
|
+
throw new ReactorError("InvalidState", `expected a live ${kind} track`);
|
|
91
|
+
const operation = kind === "audio" ? "audioSamples" : "videoFrames";
|
|
92
|
+
const track = source.clone();
|
|
93
|
+
let constructed = false, acquired = false, readCount = 0, copiedCount = 0;
|
|
94
|
+
const cleanupFailures = [];
|
|
95
|
+
const annotate = (cause, phase) => {
|
|
96
|
+
const name = cause instanceof Error && !(cause instanceof ReactorError) ? cause.name : undefined;
|
|
97
|
+
const error = errorOf(cause, name === "NotSupportedError" || (name === "TypeError" && phase === "processor")
|
|
98
|
+
? "UnsupportedCapability"
|
|
99
|
+
: name === "InvalidStateError" || (name === "TypeError" && phase === "reader")
|
|
100
|
+
? "InvalidState"
|
|
101
|
+
: "Protocol");
|
|
102
|
+
const detail = {
|
|
103
|
+
phase,
|
|
104
|
+
realm: typeof document === "object" ? "Window" : "other",
|
|
105
|
+
processorConstructed: constructed,
|
|
106
|
+
readerAcquired: acquired,
|
|
107
|
+
nativeSamplesRead: readCount,
|
|
108
|
+
copiedSamples: copiedCount,
|
|
109
|
+
source: {
|
|
110
|
+
kind: source.kind,
|
|
111
|
+
readyState: source.readyState,
|
|
112
|
+
enabled: source.enabled,
|
|
113
|
+
muted: source.muted,
|
|
114
|
+
},
|
|
115
|
+
ownedTrack: { readyState: track.readyState },
|
|
116
|
+
...(name === undefined ? {} : { nativeErrorName: name }),
|
|
117
|
+
cleanupFailures,
|
|
118
|
+
};
|
|
119
|
+
return new ReactorError(error.code, error.message, {
|
|
120
|
+
...error.context,
|
|
121
|
+
operation: `${operation}.${phase}`,
|
|
122
|
+
detail,
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
const noteCleanup = (phase, cause) => {
|
|
126
|
+
if (cleanupFailures.length < 4)
|
|
127
|
+
cleanupFailures.push({
|
|
128
|
+
phase,
|
|
129
|
+
message: cause instanceof Error ? cause.message : String(cause),
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
let reader;
|
|
133
|
+
let acquisitionPhase = "sample-type";
|
|
134
|
+
try {
|
|
135
|
+
if (kind === "audio" &&
|
|
136
|
+
(!("AudioData" in globalThis) || typeof globalThis.AudioData !== "function")) {
|
|
137
|
+
throw new ReactorError("UnsupportedCapability", "AudioData is not exposed in this realm");
|
|
138
|
+
}
|
|
139
|
+
acquisitionPhase = "processor";
|
|
140
|
+
const native = processor(track);
|
|
141
|
+
constructed = true;
|
|
142
|
+
acquisitionPhase = "readable";
|
|
143
|
+
const readable = record(native, "track processor").readable;
|
|
144
|
+
if (!(readable instanceof ReadableStream))
|
|
145
|
+
throw new ReactorError("UnsupportedCapability", "track processor did not supply a ReadableStream");
|
|
146
|
+
acquisitionPhase = "reader";
|
|
147
|
+
reader = readable.getReader();
|
|
148
|
+
acquired = true;
|
|
149
|
+
}
|
|
150
|
+
catch (cause) {
|
|
151
|
+
const error = annotate(cause, acquisitionPhase);
|
|
152
|
+
try {
|
|
153
|
+
track.stop();
|
|
154
|
+
}
|
|
155
|
+
catch (stopError) {
|
|
156
|
+
noteCleanup("stop-clone", stopError);
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
let closed = false;
|
|
161
|
+
let cleanupTask, pullTask;
|
|
162
|
+
let controller;
|
|
163
|
+
let watch;
|
|
164
|
+
const lifetime = new AbortController();
|
|
165
|
+
const cleanup = () => {
|
|
166
|
+
if (cleanupTask !== undefined)
|
|
167
|
+
return cleanupTask;
|
|
168
|
+
closed = true;
|
|
169
|
+
lifetime.abort();
|
|
170
|
+
if (watch !== undefined) {
|
|
171
|
+
clearInterval(watch);
|
|
172
|
+
watch = undefined;
|
|
173
|
+
}
|
|
174
|
+
source.removeEventListener("ended", ended);
|
|
175
|
+
track.removeEventListener("ended", ended);
|
|
176
|
+
// Install one shared promise before invoking native code; every exit joins it.
|
|
177
|
+
cleanupTask = Promise.resolve().then(async () => {
|
|
178
|
+
try {
|
|
179
|
+
track.stop();
|
|
180
|
+
}
|
|
181
|
+
catch (cause) {
|
|
182
|
+
noteCleanup("stop-clone", cause);
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
await deadline(reader.cancel(), timeoutMs);
|
|
186
|
+
}
|
|
187
|
+
catch (cause) {
|
|
188
|
+
noteCleanup("cancel-reader", cause);
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
try {
|
|
192
|
+
reader.releaseLock();
|
|
193
|
+
}
|
|
194
|
+
catch (cause) {
|
|
195
|
+
noteCleanup("release-reader", cause);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
return cleanupTask;
|
|
200
|
+
};
|
|
201
|
+
const fail = (error) => {
|
|
202
|
+
if (closed)
|
|
203
|
+
return;
|
|
204
|
+
controller.error(error);
|
|
205
|
+
void cleanup();
|
|
206
|
+
};
|
|
207
|
+
const ended = () => fail(annotate(new ReactorError("Disconnected", "media source lease ended; reacquire after reconnect"), "track"));
|
|
208
|
+
const live = () => {
|
|
209
|
+
if (!closed && (source.readyState !== "live" || track.readyState !== "live"))
|
|
210
|
+
ended();
|
|
211
|
+
return !closed;
|
|
212
|
+
};
|
|
213
|
+
const closeLate = (raw) => {
|
|
214
|
+
try {
|
|
215
|
+
closable(raw)?.close();
|
|
216
|
+
}
|
|
217
|
+
catch (cause) {
|
|
218
|
+
noteCleanup("close-late-sample", cause);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const pull = async () => {
|
|
222
|
+
let block;
|
|
223
|
+
let phase = "read";
|
|
224
|
+
let failure;
|
|
225
|
+
const releaseSample = () => {
|
|
226
|
+
const owned = block;
|
|
227
|
+
block = undefined;
|
|
228
|
+
owned?.close();
|
|
229
|
+
};
|
|
230
|
+
try {
|
|
231
|
+
if (!live())
|
|
232
|
+
return;
|
|
233
|
+
const received = await deadline(reader.read().then((result) => {
|
|
234
|
+
const disposed = closed && !result.done;
|
|
235
|
+
if (disposed)
|
|
236
|
+
closeLate(result.value);
|
|
237
|
+
return { result, disposed };
|
|
238
|
+
}), timeoutMs, lifetime.signal);
|
|
239
|
+
const next = received.result;
|
|
240
|
+
if (!next.done && !received.disposed)
|
|
241
|
+
block = closable(next.value);
|
|
242
|
+
if (!live())
|
|
243
|
+
return;
|
|
244
|
+
if (next.done) {
|
|
245
|
+
controller.close();
|
|
246
|
+
await cleanup();
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
readCount++;
|
|
250
|
+
phase = "copy";
|
|
251
|
+
const sample = await deadline(copy(next.value, maxBytes, timeoutMs), timeoutMs, lifetime.signal);
|
|
252
|
+
phase = "close-sample";
|
|
253
|
+
releaseSample();
|
|
254
|
+
if (live()) {
|
|
255
|
+
copiedCount++;
|
|
256
|
+
controller.enqueue(sample);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (cause) {
|
|
260
|
+
if (phase === "read" && !live())
|
|
261
|
+
return;
|
|
262
|
+
failure = annotate(cause, phase);
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
try {
|
|
266
|
+
releaseSample();
|
|
267
|
+
}
|
|
268
|
+
catch (cause) {
|
|
269
|
+
if (failure === undefined)
|
|
270
|
+
failure = annotate(cause, "close-sample");
|
|
271
|
+
else
|
|
272
|
+
noteCleanup("close-sample", cause);
|
|
273
|
+
}
|
|
274
|
+
if (failure !== undefined)
|
|
275
|
+
fail(failure);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
const close = async () => {
|
|
279
|
+
await cleanup();
|
|
280
|
+
await pullTask;
|
|
281
|
+
};
|
|
282
|
+
const readable = new ReadableStream({
|
|
283
|
+
start(c) {
|
|
284
|
+
controller = c;
|
|
285
|
+
source.addEventListener("ended", ended);
|
|
286
|
+
track.addEventListener("ended", ended);
|
|
287
|
+
// stop() does not emit ended or stop a clone. Check while consumers pause too.
|
|
288
|
+
watch = setInterval(live, 100);
|
|
289
|
+
},
|
|
290
|
+
pull() {
|
|
291
|
+
pullTask = pull();
|
|
292
|
+
return pullTask;
|
|
293
|
+
},
|
|
294
|
+
cancel: close,
|
|
295
|
+
}, { highWaterMark: 0 });
|
|
296
|
+
return { readable, close };
|
|
297
|
+
}
|
|
298
|
+
const nativeSamples = (source, kind, options, copy) => Stream.unwrap(Effect.gen(function* () {
|
|
299
|
+
const owned = yield* Effect.acquireRelease(Effect.try({ try: () => copiedSamples(source, kind, options, copy), catch: errorOf }), (owned) => Effect.promise(() => owned.close()));
|
|
300
|
+
return fromOwnedReadableStream({ evaluate: () => owned.readable, onError: errorOf });
|
|
301
|
+
}));
|
|
302
|
+
/** One native queue slot and one demand-driven copy. No borrowed frame escapes. */
|
|
303
|
+
export const videoFrames = (track, options = {}) => nativeSamples(track, "video", options, async (raw, maxBytes) => {
|
|
304
|
+
if (typeof VideoFrame !== "function" || !(raw instanceof VideoFrame))
|
|
305
|
+
return unsupported("processor did not yield a native VideoFrame");
|
|
306
|
+
const width = positiveLimit(raw.displayWidth, "video width", 16_384);
|
|
307
|
+
const height = positiveLimit(raw.displayHeight, "video height", 16_384);
|
|
308
|
+
if (raw.codedWidth !== width ||
|
|
309
|
+
raw.codedHeight !== height ||
|
|
310
|
+
raw.visibleRect?.x !== 0 ||
|
|
311
|
+
raw.visibleRect.y !== 0) {
|
|
312
|
+
return unsupported("cropped or non-square-pixel frame is outside the compact RGBA contract");
|
|
313
|
+
}
|
|
314
|
+
const size = raw.allocationSize({ format: "RGBA" });
|
|
315
|
+
if (!Number.isSafeInteger(size) || size !== width * height * 4 || size > maxBytes)
|
|
316
|
+
throw new ReactorError("Overflow", "RGBA sample byte bound/layout mismatch");
|
|
317
|
+
const data = new Uint8Array(size);
|
|
318
|
+
await raw.copyTo(data, { format: "RGBA" });
|
|
319
|
+
return Object.freeze({
|
|
320
|
+
format: "RGBA",
|
|
321
|
+
width,
|
|
322
|
+
height,
|
|
323
|
+
data,
|
|
324
|
+
timestampUs: timestamp(raw.timestamp),
|
|
325
|
+
clock: "video-track-processor",
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
/** Optional native AudioData in the current realm. No worker or Web Audio fallback. */
|
|
329
|
+
export const audioSamples = (track, options = {}) => nativeSamples(track, "audio", options, async (raw, maxBytes) => {
|
|
330
|
+
const audio = nativeAudio(raw);
|
|
331
|
+
if (audio.frames * audio.channels * 4 > maxBytes)
|
|
332
|
+
throw new ReactorError("Overflow", "PCM sample byte bound");
|
|
333
|
+
const planes = [];
|
|
334
|
+
for (let channel = 0; channel < audio.channels; channel++) {
|
|
335
|
+
const plane = new Float32Array(audio.frames);
|
|
336
|
+
audio.copy(plane, channel);
|
|
337
|
+
planes.push(plane);
|
|
338
|
+
}
|
|
339
|
+
return Object.freeze({
|
|
340
|
+
format: "f32-planar",
|
|
341
|
+
planes: Object.freeze(planes),
|
|
342
|
+
sampleRate: audio.sampleRate,
|
|
343
|
+
frames: audio.frames,
|
|
344
|
+
timestampUs: audio.timestamp,
|
|
345
|
+
clock: "audio-track-processor",
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
/** Scoped local playback. Starting playback does not establish audience output. */
|
|
349
|
+
export const play = (track, element, timeoutMs = 10_000) => Effect.gen(function* () {
|
|
350
|
+
const timeout = yield* Effect.try({
|
|
351
|
+
try: () => positiveLimit(timeoutMs, "playback timeout", 600_000),
|
|
352
|
+
catch: errorOf,
|
|
353
|
+
});
|
|
354
|
+
const owned = yield* Effect.acquireRelease(Effect.try({
|
|
355
|
+
try: () => {
|
|
356
|
+
if (track.readyState !== "live")
|
|
357
|
+
throw new ReactorError("InvalidState", "playback requires a live track");
|
|
358
|
+
if (element.srcObject !== null || element.getAttribute("src"))
|
|
359
|
+
throw new ReactorError("InvalidState", "playback element already has a source");
|
|
360
|
+
const clone = track.clone();
|
|
361
|
+
try {
|
|
362
|
+
const stream = new MediaStream([clone]);
|
|
363
|
+
element.srcObject = stream;
|
|
364
|
+
return { clone, stream };
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
clone.stop();
|
|
368
|
+
throw error;
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
catch: errorOf,
|
|
372
|
+
}), ({ clone, stream }) => Effect.sync(() => {
|
|
373
|
+
clone.stop();
|
|
374
|
+
if (element.srcObject === stream) {
|
|
375
|
+
element.pause();
|
|
376
|
+
element.srcObject = null;
|
|
377
|
+
}
|
|
378
|
+
}));
|
|
379
|
+
yield* Effect.tryPromise({
|
|
380
|
+
try: (signal) => deadline(element.play(), timeout, signal),
|
|
381
|
+
catch: (e) => errorOf(e, "UnsupportedCapability", "HTMLMediaElement.play"),
|
|
382
|
+
});
|
|
383
|
+
if (owned.clone.readyState !== "live")
|
|
384
|
+
return yield* Effect.fail(new ReactorError("Disconnected", "playback track ended during start"));
|
|
385
|
+
});
|
|
386
|
+
export const nextPresentation = (element, timeoutMs = 10_000) => Effect.suspend(() => Effect.gen(function* () {
|
|
387
|
+
const timeout = yield* Effect.try({
|
|
388
|
+
try: () => positiveLimit(timeoutMs, "presentation timeout", 600_000),
|
|
389
|
+
catch: errorOf,
|
|
390
|
+
});
|
|
391
|
+
return yield* Effect.callback((resume) => {
|
|
392
|
+
if (typeof element.requestVideoFrameCallback !== "function") {
|
|
393
|
+
resume(Effect.fail(new ReactorError("UnsupportedCapability", "requestVideoFrameCallback unavailable")));
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
const id = element.requestVideoFrameCallback((at, m) => resume(Effect.succeed({
|
|
397
|
+
callbackTimeMs: at,
|
|
398
|
+
mediaTimeSeconds: m.mediaTime,
|
|
399
|
+
presentedFrames: m.presentedFrames,
|
|
400
|
+
width: m.width,
|
|
401
|
+
height: m.height,
|
|
402
|
+
})));
|
|
403
|
+
return Effect.sync(() => element.cancelVideoFrameCallback(id));
|
|
404
|
+
}).pipe(Effect.timeoutOrElse({
|
|
405
|
+
duration: timeout,
|
|
406
|
+
orElse: () => Effect.fail(new ReactorError("Timeout", "no local video presentation callback")),
|
|
407
|
+
}));
|
|
408
|
+
}));
|
|
409
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/_internal/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pcm-worklet.d.ts","sourceRoot":"","sources":["../../src/_internal/pcm-worklet.ts"],"names":[],"mappings":"AAyDA,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class ReactorPcmTap extends AudioWorkletProcessor {
|
|
2
|
+
credit = false;
|
|
3
|
+
stopped = false;
|
|
4
|
+
skipped = 0;
|
|
5
|
+
constructor() {
|
|
6
|
+
super();
|
|
7
|
+
this.port.onmessage = (event) => {
|
|
8
|
+
if (event.data === "pull")
|
|
9
|
+
this.credit = true;
|
|
10
|
+
if (event.data === "stop") {
|
|
11
|
+
this.stopped = true;
|
|
12
|
+
this.port.onmessage = null;
|
|
13
|
+
this.port.close();
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
process(inputs, outputs) {
|
|
18
|
+
// A connected silent output keeps the graph rendering without monitoring the received audio.
|
|
19
|
+
for (const output of outputs)
|
|
20
|
+
for (const plane of output)
|
|
21
|
+
plane.fill(0);
|
|
22
|
+
if (this.stopped)
|
|
23
|
+
return false;
|
|
24
|
+
const input = inputs[0], first = input?.[0];
|
|
25
|
+
if (input === undefined || first === undefined || first.length === 0)
|
|
26
|
+
return true;
|
|
27
|
+
if (!this.credit) {
|
|
28
|
+
this.skipped = Math.min(Number.MAX_SAFE_INTEGER, this.skipped + first.length);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
this.credit = false;
|
|
32
|
+
if (input.length > 32 || first.length > 16384) {
|
|
33
|
+
this.port.postMessage({ type: "error", message: "render quantum exceeds PCM bounds" });
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
const planes = input.map((plane) => new Float32Array(plane).buffer);
|
|
37
|
+
this.port.postMessage({
|
|
38
|
+
type: "pcm",
|
|
39
|
+
planes,
|
|
40
|
+
frames: first.length,
|
|
41
|
+
sampleRate,
|
|
42
|
+
frame: currentFrame,
|
|
43
|
+
skipped: this.skipped,
|
|
44
|
+
}, planes);
|
|
45
|
+
this.skipped = 0;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
registerProcessor("reactor-pcm-tap-v1", ReactorPcmTap);
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=pcm-worklet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pcm-worklet.js","sourceRoot":"","sources":["../../src/_internal/pcm-worklet.ts"],"names":[],"mappings":"AASA,MAAM,aAAc,SAAQ,qBAAqB;IACvC,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,CAAC,CAAC;IACpB;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAA4B,EAAE,EAAE;YACrD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,MAAwB,EAAE,OAAyB;QACzD,6FAA6F;QAC7F,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EACrB,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAClF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACvF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,WAAW,CACnB;YACE,IAAI,EAAE,KAAK;YACX,MAAM;YACN,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU;YACV,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,EACD,MAAM,CACP,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AACD,iBAAiB,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;AACvD,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { ReactorError } from "reactor-effect-client";
|
|
3
|
+
import type { Track } from "reactor-effect-client";
|
|
4
|
+
import type { Peer, PeerEvent, Prepared, Channel } from "reactor-effect-client/host";
|
|
5
|
+
export type { Peer, PeerEvent, Prepared, Channel } from "reactor-effect-client/host";
|
|
6
|
+
export declare const requireBrowserPeer: () => void;
|
|
7
|
+
export declare class BrowserPeer implements Peer {
|
|
8
|
+
private readonly bufferedLimit;
|
|
9
|
+
readonly nativeTracks = true;
|
|
10
|
+
private pc;
|
|
11
|
+
private channels;
|
|
12
|
+
private readonly transceivers;
|
|
13
|
+
private readonly received;
|
|
14
|
+
private readonly leases;
|
|
15
|
+
private messageLimit;
|
|
16
|
+
constructor(bufferedLimit?: number);
|
|
17
|
+
prepare(servers: readonly RTCIceServer[], tracks: readonly Track[], emit: (event: PeerEvent) => void): Effect.Effect<Prepared, ReactorError>;
|
|
18
|
+
answer(sdp: string): Effect.Effect<void, ReactorError>;
|
|
19
|
+
private require;
|
|
20
|
+
private named;
|
|
21
|
+
send(kind: Channel, bytes: Uint8Array<ArrayBuffer>): Effect.Effect<void, ReactorError>;
|
|
22
|
+
lease(name: string): MediaStreamTrack;
|
|
23
|
+
release(track: MediaStreamTrack): void;
|
|
24
|
+
direction(name: string, active: boolean): Effect.Effect<void, ReactorError>;
|
|
25
|
+
replace(name: string, track: MediaStreamTrack | null): Effect.Effect<void, ReactorError>;
|
|
26
|
+
maxBitrate(name: string, bitsPerSecond: number): Effect.Effect<void, ReactorError>;
|
|
27
|
+
stats(): Effect.Effect<readonly unknown[], ReactorError>;
|
|
28
|
+
close(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=peer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../src/_internal/peer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrF,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGrF,eAAO,MAAM,kBAAkB,QAAO,IAOrC,CAAC;AACF,qBAAa,WAAY,YAAW,IAAI;IAW1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAV1C,QAAQ,CAAC,YAAY,QAAQ;IAC7B,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,QAAQ,CAAgE;IAChF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAGzB;IACJ,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,YAAY,CAAW;IAC/B,YAA6B,aAAa,SAAY,EAAI;IAC1D,OAAO,CACL,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAC/B,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAmIvC;IACD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAerD;IACD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAMb,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAoBrF;IACD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAQpC;IACD,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAGrC;IACD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAK1E;IACD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAevF;IACD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAsBjF;IACD,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,YAAY,CAAC,CAcvD;IACD,KAAK,IAAI,IAAI,CAyBZ;CACF"}
|