@memberjunction/ai-realtime-client 6.2.0-edge.2 → 6.2.0-edge.4
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 +156 -29
- package/dist/audio/audioMeter.d.ts +71 -0
- package/dist/audio/audioMeter.d.ts.map +1 -1
- package/dist/audio/audioMeter.js +83 -0
- package/dist/audio/audioMeter.js.map +1 -1
- package/dist/audio/mediaElementAudioRouter.d.ts +41 -0
- package/dist/audio/mediaElementAudioRouter.d.ts.map +1 -0
- package/dist/audio/mediaElementAudioRouter.js +82 -0
- package/dist/audio/mediaElementAudioRouter.js.map +1 -0
- package/dist/audio/micCapture.d.ts +12 -3
- package/dist/audio/micCapture.d.ts.map +1 -1
- package/dist/audio/micCapture.js +15 -1
- package/dist/audio/micCapture.js.map +1 -1
- package/dist/audio/pcmPlayback.d.ts +72 -4
- package/dist/audio/pcmPlayback.d.ts.map +1 -1
- package/dist/audio/pcmPlayback.js +101 -1
- package/dist/audio/pcmPlayback.js.map +1 -1
- package/dist/drivers/assemblyAIRealtimeClient.d.ts +2 -0
- package/dist/drivers/assemblyAIRealtimeClient.d.ts.map +1 -1
- package/dist/drivers/assemblyAIRealtimeClient.js +14 -0
- package/dist/drivers/assemblyAIRealtimeClient.js.map +1 -1
- package/dist/drivers/elevenLabsRealtimeClient.d.ts +2 -0
- package/dist/drivers/elevenLabsRealtimeClient.d.ts.map +1 -1
- package/dist/drivers/elevenLabsRealtimeClient.js +14 -0
- package/dist/drivers/elevenLabsRealtimeClient.js.map +1 -1
- package/dist/drivers/geminiAvatarOutput.d.ts +132 -0
- package/dist/drivers/geminiAvatarOutput.d.ts.map +1 -0
- package/dist/drivers/geminiAvatarOutput.js +310 -0
- package/dist/drivers/geminiAvatarOutput.js.map +1 -0
- package/dist/drivers/geminiEnterpriseRealtimeClient.d.ts +38 -0
- package/dist/drivers/geminiEnterpriseRealtimeClient.d.ts.map +1 -0
- package/dist/drivers/geminiEnterpriseRealtimeClient.js +107 -0
- package/dist/drivers/geminiEnterpriseRealtimeClient.js.map +1 -0
- package/dist/drivers/geminiRealtimeClient.d.ts +314 -48
- package/dist/drivers/geminiRealtimeClient.d.ts.map +1 -1
- package/dist/drivers/geminiRealtimeClient.js +759 -176
- package/dist/drivers/geminiRealtimeClient.js.map +1 -1
- package/dist/drivers/openAILiveClient.d.ts +5 -8
- package/dist/drivers/openAILiveClient.d.ts.map +1 -1
- package/dist/drivers/openAILiveClient.js +19 -32
- package/dist/drivers/openAILiveClient.js.map +1 -1
- package/dist/drivers/openAIRealtimeClient.d.ts +23 -26
- package/dist/drivers/openAIRealtimeClient.d.ts.map +1 -1
- package/dist/drivers/openAIRealtimeClient.js +42 -57
- package/dist/drivers/openAIRealtimeClient.js.map +1 -1
- package/dist/generic/baseRealtimeClient.d.ts +188 -30
- package/dist/generic/baseRealtimeClient.d.ts.map +1 -1
- package/dist/generic/baseRealtimeClient.js +250 -14
- package/dist/generic/baseRealtimeClient.js.map +1 -1
- package/dist/generic/openAIProtocolClient.d.ts +57 -1
- package/dist/generic/openAIProtocolClient.d.ts.map +1 -1
- package/dist/generic/openAIProtocolClient.js +89 -4
- package/dist/generic/openAIProtocolClient.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/media/attachVideoSource.d.ts +23 -0
- package/dist/media/attachVideoSource.d.ts.map +1 -0
- package/dist/media/attachVideoSource.js +49 -0
- package/dist/media/attachVideoSource.js.map +1 -0
- package/dist/media/channelVideoSource.d.ts +110 -14
- package/dist/media/channelVideoSource.d.ts.map +1 -1
- package/dist/media/channelVideoSource.js +183 -18
- package/dist/media/channelVideoSource.js.map +1 -1
- package/dist/media/decoders/frameScheduler.d.ts +119 -0
- package/dist/media/decoders/frameScheduler.d.ts.map +1 -0
- package/dist/media/decoders/frameScheduler.js +238 -0
- package/dist/media/decoders/frameScheduler.js.map +1 -0
- package/dist/media/decoders/imageFrameDecoder.d.ts +58 -0
- package/dist/media/decoders/imageFrameDecoder.d.ts.map +1 -0
- package/dist/media/decoders/imageFrameDecoder.js +110 -0
- package/dist/media/decoders/imageFrameDecoder.js.map +1 -0
- package/dist/media/decoders/mseFmp4Decoder.d.ts +130 -0
- package/dist/media/decoders/mseFmp4Decoder.d.ts.map +1 -0
- package/dist/media/decoders/mseFmp4Decoder.js +402 -0
- package/dist/media/decoders/mseFmp4Decoder.js.map +1 -0
- package/dist/media/decoders/streamCanvas.d.ts +46 -0
- package/dist/media/decoders/streamCanvas.d.ts.map +1 -0
- package/dist/media/decoders/streamCanvas.js +163 -0
- package/dist/media/decoders/streamCanvas.js.map +1 -0
- package/dist/media/decoders/videoMimeTypes.d.ts +29 -0
- package/dist/media/decoders/videoMimeTypes.d.ts.map +1 -0
- package/dist/media/decoders/videoMimeTypes.js +50 -0
- package/dist/media/decoders/videoMimeTypes.js.map +1 -0
- package/dist/media/decoders/webCodecsChunkDecoder.d.ts +99 -0
- package/dist/media/decoders/webCodecsChunkDecoder.d.ts.map +1 -0
- package/dist/media/decoders/webCodecsChunkDecoder.js +265 -0
- package/dist/media/decoders/webCodecsChunkDecoder.js.map +1 -0
- package/dist/media/displayCapture.d.ts +128 -0
- package/dist/media/displayCapture.d.ts.map +1 -0
- package/dist/media/displayCapture.js +245 -0
- package/dist/media/displayCapture.js.map +1 -0
- package/dist/media/frameCapture.d.ts +25 -8
- package/dist/media/frameCapture.d.ts.map +1 -1
- package/dist/media/frameCapture.js +42 -72
- package/dist/media/frameCapture.js.map +1 -1
- package/dist/media/frameSampler.d.ts +94 -0
- package/dist/media/frameSampler.d.ts.map +1 -0
- package/dist/media/frameSampler.js +134 -0
- package/dist/media/frameSampler.js.map +1 -0
- package/dist/media/index.d.ts +32 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +32 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/localMediaController.d.ts +116 -0
- package/dist/media/localMediaController.d.ts.map +1 -0
- package/dist/media/localMediaController.js +281 -0
- package/dist/media/localMediaController.js.map +1 -0
- package/dist/media/mediaLayout.d.ts +93 -0
- package/dist/media/mediaLayout.d.ts.map +1 -0
- package/dist/media/mediaLayout.js +187 -0
- package/dist/media/mediaLayout.js.map +1 -0
- package/dist/media/mediaPreview.d.ts +94 -0
- package/dist/media/mediaPreview.d.ts.map +1 -0
- package/dist/media/mediaPreview.js +154 -0
- package/dist/media/mediaPreview.js.map +1 -0
- package/dist/media/mediaStage.d.ts +99 -0
- package/dist/media/mediaStage.d.ts.map +1 -0
- package/dist/media/mediaStage.js +171 -0
- package/dist/media/mediaStage.js.map +1 -0
- package/dist/media/model.d.ts +154 -0
- package/dist/media/model.d.ts.map +1 -0
- package/dist/media/model.js +9 -0
- package/dist/media/model.js.map +1 -0
- package/dist/media/playbackClock.d.ts +20 -0
- package/dist/media/playbackClock.d.ts.map +1 -0
- package/dist/media/playbackClock.js +13 -0
- package/dist/media/playbackClock.js.map +1 -0
- package/dist/media/videoFrameDecoder.d.ts +86 -0
- package/dist/media/videoFrameDecoder.d.ts.map +1 -0
- package/dist/media/videoFrameDecoder.js +2 -0
- package/dist/media/videoFrameDecoder.js.map +1 -0
- package/dist/media/videoFrameDecoderRegistry.d.ts +40 -0
- package/dist/media/videoFrameDecoderRegistry.d.ts.map +1 -0
- package/dist/media/videoFrameDecoderRegistry.js +69 -0
- package/dist/media/videoFrameDecoderRegistry.js.map +1 -0
- package/dist/media/videoPacing.d.ts +32 -0
- package/dist/media/videoPacing.d.ts.map +1 -0
- package/dist/media/videoPacing.js +37 -0
- package/dist/media/videoPacing.js.map +1 -0
- package/dist/media/videoPlayout.d.ts +168 -0
- package/dist/media/videoPlayout.d.ts.map +1 -0
- package/dist/media/videoPlayout.js +217 -0
- package/dist/media/videoPlayout.js.map +1 -0
- package/dist/media/videoSourceArbiter.d.ts +250 -0
- package/dist/media/videoSourceArbiter.d.ts.map +1 -0
- package/dist/media/videoSourceArbiter.js +423 -0
- package/dist/media/videoSourceArbiter.js.map +1 -0
- package/dist/testing/conformanceAssertions.d.ts +25 -0
- package/dist/testing/conformanceAssertions.d.ts.map +1 -0
- package/dist/testing/conformanceAssertions.js +64 -0
- package/dist/testing/conformanceAssertions.js.map +1 -0
- package/dist/testing/conformanceFixtures.d.ts +76 -0
- package/dist/testing/conformanceFixtures.d.ts.map +1 -0
- package/dist/testing/conformanceFixtures.js +169 -0
- package/dist/testing/conformanceFixtures.js.map +1 -0
- package/dist/testing/conformanceGates.d.ts +32 -0
- package/dist/testing/conformanceGates.d.ts.map +1 -0
- package/dist/testing/conformanceGates.js +35 -0
- package/dist/testing/conformanceGates.js.map +1 -0
- package/dist/testing/conformanceMicrophone.d.ts +10 -0
- package/dist/testing/conformanceMicrophone.d.ts.map +1 -0
- package/dist/testing/conformanceMicrophone.js +71 -0
- package/dist/testing/conformanceMicrophone.js.map +1 -0
- package/dist/testing/conformanceTimeline.d.ts +128 -0
- package/dist/testing/conformanceTimeline.d.ts.map +1 -0
- package/dist/testing/conformanceTimeline.js +32 -0
- package/dist/testing/conformanceTimeline.js.map +1 -0
- package/dist/testing/conformanceVideoStream.d.ts +29 -0
- package/dist/testing/conformanceVideoStream.d.ts.map +1 -0
- package/dist/testing/conformanceVideoStream.js +39 -0
- package/dist/testing/conformanceVideoStream.js.map +1 -0
- package/dist/testing/index.d.ts +29 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +28 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/realtimeVideoConformance.d.ts +23 -0
- package/dist/testing/realtimeVideoConformance.d.ts.map +1 -0
- package/dist/testing/realtimeVideoConformance.js +139 -0
- package/dist/testing/realtimeVideoConformance.js.map +1 -0
- package/dist/testing/realtimeVideoConformanceChecks.d.ts +4 -0
- package/dist/testing/realtimeVideoConformanceChecks.d.ts.map +1 -0
- package/dist/testing/realtimeVideoConformanceChecks.js +164 -0
- package/dist/testing/realtimeVideoConformanceChecks.js.map +1 -0
- package/dist/testing/realtimeVideoConformanceFrameChecks.d.ts +4 -0
- package/dist/testing/realtimeVideoConformanceFrameChecks.d.ts.map +1 -0
- package/dist/testing/realtimeVideoConformanceFrameChecks.js +63 -0
- package/dist/testing/realtimeVideoConformanceFrameChecks.js.map +1 -0
- package/dist/testing/realtimeVideoConformanceSession.d.ts +108 -0
- package/dist/testing/realtimeVideoConformanceSession.d.ts.map +1 -0
- package/dist/testing/realtimeVideoConformanceSession.js +270 -0
- package/dist/testing/realtimeVideoConformanceSession.js.map +1 -0
- package/dist/testing/realtimeVideoConformanceTurnChecks.d.ts +4 -0
- package/dist/testing/realtimeVideoConformanceTurnChecks.d.ts.map +1 -0
- package/dist/testing/realtimeVideoConformanceTurnChecks.js +248 -0
- package/dist/testing/realtimeVideoConformanceTurnChecks.js.map +1 -0
- package/dist/testing/realtimeVideoConformanceTypes.d.ts +155 -0
- package/dist/testing/realtimeVideoConformanceTypes.d.ts.map +1 -0
- package/dist/testing/realtimeVideoConformanceTypes.js +2 -0
- package/dist/testing/realtimeVideoConformanceTypes.js.map +1 -0
- package/dist/testing/recordingPlayout.d.ts +84 -0
- package/dist/testing/recordingPlayout.d.ts.map +1 -0
- package/dist/testing/recordingPlayout.js +120 -0
- package/dist/testing/recordingPlayout.js.map +1 -0
- package/package.json +29 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"videoSourceArbiter.js","sourceRoot":"","sources":["../../src/media/videoSourceArbiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The kit's plain assertions: no test framework. Each failure names the rule the driver broke and what
|
|
3
|
+
* was expected and seen; the runner prefixes the check's id.
|
|
4
|
+
*
|
|
5
|
+
* @module @memberjunction/ai-realtime-client/testing
|
|
6
|
+
*/
|
|
7
|
+
/** Thrown when a driver breaks a rule of the video conformance kit; the message names the check and the rule. */
|
|
8
|
+
export declare class RealtimeVideoConformanceError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
/** Fails the check with `<rule>: <detail>`. */
|
|
12
|
+
export declare function Fail(rule: string, detail: string): never;
|
|
13
|
+
/** Fails unless `condition` holds. `seen` says what was seen instead. */
|
|
14
|
+
export declare function AssertTrue(condition: boolean, rule: string, seen: string): void;
|
|
15
|
+
/** Fails unless a count is what the rule says. */
|
|
16
|
+
export declare function AssertCount(actual: number, expected: number, rule: string): void;
|
|
17
|
+
/** Fails unless a value (a state, a track state, a kind) is what the rule says. */
|
|
18
|
+
export declare function AssertValue(actual: string | boolean | null | undefined, expected: string | boolean | null, rule: string): void;
|
|
19
|
+
/** Fails unless the pieces seen are the pieces sent, in order, byte for byte. */
|
|
20
|
+
export declare function AssertSameBytes(actual: readonly ArrayBuffer[], expected: readonly ArrayBuffer[], rule: string): void;
|
|
21
|
+
/** Fails unless two amounts of seconds agree to the nanosecond: sums of 1/24 s are inexact in floating point. */
|
|
22
|
+
export declare function AssertSeconds(actual: number, expected: number, rule: string): void;
|
|
23
|
+
/** Seconds rounded to the nanosecond. */
|
|
24
|
+
export declare function ToNanoseconds(seconds: number): number;
|
|
25
|
+
//# sourceMappingURL=conformanceAssertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceAssertions.d.ts","sourceRoot":"","sources":["../../src/testing/conformanceAssertions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iHAAiH;AACjH,qBAAa,6BAA8B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI9B;AAED,+CAA+C;AAC/C,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAExD;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI/E;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIhF;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI9H;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQpH;AAED,iHAAiH;AACjH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIlF;AAED,yCAAyC;AACzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The kit's plain assertions: no test framework. Each failure names the rule the driver broke and what
|
|
3
|
+
* was expected and seen; the runner prefixes the check's id.
|
|
4
|
+
*
|
|
5
|
+
* @module @memberjunction/ai-realtime-client/testing
|
|
6
|
+
*/
|
|
7
|
+
/** Thrown when a driver breaks a rule of the video conformance kit; the message names the check and the rule. */
|
|
8
|
+
export class RealtimeVideoConformanceError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = 'RealtimeVideoConformanceError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Fails the check with `<rule>: <detail>`. */
|
|
15
|
+
export function Fail(rule, detail) {
|
|
16
|
+
throw new RealtimeVideoConformanceError(`${rule}: ${detail}`);
|
|
17
|
+
}
|
|
18
|
+
/** Fails unless `condition` holds. `seen` says what was seen instead. */
|
|
19
|
+
export function AssertTrue(condition, rule, seen) {
|
|
20
|
+
if (!condition) {
|
|
21
|
+
Fail(rule, seen);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Fails unless a count is what the rule says. */
|
|
25
|
+
export function AssertCount(actual, expected, rule) {
|
|
26
|
+
if (actual !== expected) {
|
|
27
|
+
Fail(rule, `expected ${expected}, got ${actual}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Fails unless a value (a state, a track state, a kind) is what the rule says. */
|
|
31
|
+
export function AssertValue(actual, expected, rule) {
|
|
32
|
+
if (actual !== expected) {
|
|
33
|
+
Fail(rule, `expected ${String(expected)}, got ${String(actual)}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Fails unless the pieces seen are the pieces sent, in order, byte for byte. */
|
|
37
|
+
export function AssertSameBytes(actual, expected, rule) {
|
|
38
|
+
if (actual.length !== expected.length) {
|
|
39
|
+
Fail(rule, `expected ${expected.length} pieces, got ${actual.length}`);
|
|
40
|
+
}
|
|
41
|
+
const different = expected.findIndex((piece, index) => !sameBytes(actual[index], piece));
|
|
42
|
+
if (different >= 0) {
|
|
43
|
+
Fail(rule, `piece ${different + 1} of ${expected.length} differs from what the model sent (or came out of order)`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Fails unless two amounts of seconds agree to the nanosecond: sums of 1/24 s are inexact in floating point. */
|
|
47
|
+
export function AssertSeconds(actual, expected, rule) {
|
|
48
|
+
if (ToNanoseconds(actual) !== ToNanoseconds(expected)) {
|
|
49
|
+
Fail(rule, `expected ${ToNanoseconds(expected)} s, got ${ToNanoseconds(actual)} s`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Seconds rounded to the nanosecond. */
|
|
53
|
+
export function ToNanoseconds(seconds) {
|
|
54
|
+
return Math.round(seconds * 1e9) / 1e9;
|
|
55
|
+
}
|
|
56
|
+
function sameBytes(a, b) {
|
|
57
|
+
if (!a || a.byteLength !== b.byteLength) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const left = new Uint8Array(a);
|
|
61
|
+
const right = new Uint8Array(b);
|
|
62
|
+
return left.every((byte, index) => byte === right[index]);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=conformanceAssertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceAssertions.js","sourceRoot":"","sources":["../../src/testing/conformanceAssertions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The media the video conformance kit sends as the model: tiny, synthetic, deterministic video in each
|
|
3
|
+
* form a model's video comes in (Core's `RealtimeVideoFrame` kinds), and PCM chunks. Nothing here decodes; the frames
|
|
4
|
+
* only need to be read (by `@memberjunction/ai`'s fMP4 reader) and routed.
|
|
5
|
+
*
|
|
6
|
+
* - **Fragmented MP4**, as a realtime avatar sends it: an init segment (`ftyp` + `moov`) with an H.264 `avc1.42c01f` video
|
|
7
|
+
* track at a 90 kHz timescale and an AAC-LC `mp4a.40.2` audio track at 24 kHz unless the video comes without the
|
|
8
|
+
* voice; video fragments (`moof` + `mdat`) of one sample per 24 fps frame, so each frame is
|
|
9
|
+
* {@link CONFORMANCE_FMP4_FRAME_SECONDS}; audio-only fragments of a muxed avatar, which carry no video seconds.
|
|
10
|
+
* - **Encoded chunks** ({@link ConformanceChunkFrames}): opaque bytes labelled H.264, a key frame every 24, presentation
|
|
11
|
+
* times 24 to the second.
|
|
12
|
+
* - **Images** ({@link ConformanceImageFrame}): JPEG start and end markers around a few bytes, 24 to the second.
|
|
13
|
+
* - **PCM** chunks of 4 bytes, too short to ever be read as an MP4 box.
|
|
14
|
+
*
|
|
15
|
+
* Every kind is spaced 1/24 s apart, so a frame is {@link CONFORMANCE_FMP4_FRAME_SECONDS} whatever its kind. The box
|
|
16
|
+
* builders are exported for this package's own tests; the `/testing` entry exports only the fixtures.
|
|
17
|
+
*
|
|
18
|
+
* @module @memberjunction/ai-realtime-client/testing
|
|
19
|
+
*/
|
|
20
|
+
import { type RealtimeChunkVideoFrame, type RealtimeFmp4VideoFrame, type RealtimeImageVideoFrame } from '@memberjunction/ai';
|
|
21
|
+
/** The seconds of video one frame carries, of any kind: 1/24. A {@link ConformanceFmp4VideoFragment} frame lasts this long. */
|
|
22
|
+
export declare const CONFORMANCE_FMP4_FRAME_SECONDS: number;
|
|
23
|
+
/** Joins byte arrays end to end. */
|
|
24
|
+
export declare function ConcatBytes(...parts: Uint8Array[]): Uint8Array;
|
|
25
|
+
/** A big-endian 32-bit unsigned integer. */
|
|
26
|
+
export declare function Uint32Bytes(value: number): Uint8Array;
|
|
27
|
+
/** The bytes of an ASCII string, such as a box type. */
|
|
28
|
+
export declare function AsciiBytes(text: string): Uint8Array;
|
|
29
|
+
/** An MP4 box: its size, its four-character type, then its payload. */
|
|
30
|
+
export declare function Mp4Box(type: string, ...payload: Uint8Array[]): Uint8Array;
|
|
31
|
+
/** A full box: version 0, no flags, then the payload. */
|
|
32
|
+
export declare function Mp4FullBox(type: string, ...payload: Uint8Array[]): Uint8Array;
|
|
33
|
+
/**
|
|
34
|
+
* An init segment (`ftyp` + `moov`): an H.264 video track at `videoTimescale` units a second, and an AAC-LC audio track
|
|
35
|
+
* (the avatar's voice) unless `withAudio` is false.
|
|
36
|
+
*
|
|
37
|
+
* @param withAudio Whether the video carries the voice: an audio track beside the video. Default `true`.
|
|
38
|
+
* @param videoTimescale The video track's units per second. Default 90 000, which times each frame at 1/24 s.
|
|
39
|
+
*/
|
|
40
|
+
export declare function ConformanceFmp4InitSegment(withAudio?: boolean, videoTimescale?: number): ArrayBuffer;
|
|
41
|
+
/**
|
|
42
|
+
* A video fragment (`moof` + `mdat`) of `frames` 24 fps frames, {@link CONFORMANCE_FMP4_FRAME_SECONDS} each under the
|
|
43
|
+
* default init segment. `sequence` makes each fragment's bytes distinct.
|
|
44
|
+
*/
|
|
45
|
+
export declare function ConformanceFmp4VideoFragment(frames?: number, sequence?: number): ArrayBuffer;
|
|
46
|
+
/** An audio-only fragment of a muxed avatar: one AAC frame and no video, so it adds no video seconds. */
|
|
47
|
+
export declare function ConformanceFmp4AudioFragment(sequence?: number): ArrayBuffer;
|
|
48
|
+
/**
|
|
49
|
+
* A 4-byte PCM16 chunk of the agent's voice. Too short to be read as an MP4 box, so a driver that sniffs bytes never
|
|
50
|
+
* takes it for video. `seed` makes each chunk's bytes distinct.
|
|
51
|
+
*/
|
|
52
|
+
export declare function ConformancePcm(seed?: number): ArrayBuffer;
|
|
53
|
+
/** How to number and label {@link ConformanceChunkFrames}. */
|
|
54
|
+
export interface ConformanceChunkOptions {
|
|
55
|
+
/** The first chunk's number in the stream, from 0: it sets its time, its bytes and whether it is a key frame. Default 0. */
|
|
56
|
+
FirstIndex?: number;
|
|
57
|
+
/** The chunks' type. Default `video/h264; codecs="avc1.42e01f"`. */
|
|
58
|
+
MimeType?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* `count` encoded chunks as a raw-frame provider sends them: each with distinct opaque bytes, its presentation time on a
|
|
62
|
+
* 24 fps timeline (chunk `n` at `n` × 1000/24 ms), and a key frame every 24 (chunk 0, 24, 48 …). Nothing decodes them.
|
|
63
|
+
*/
|
|
64
|
+
export declare function ConformanceChunkFrames(count: number, options?: ConformanceChunkOptions): RealtimeChunkVideoFrame[];
|
|
65
|
+
/** Image `index` of a 24 fps stream: JPEG start and end markers around distinct bytes, timed at `index` × 1000/24 ms. */
|
|
66
|
+
export declare function ConformanceImageFrame(index?: number): RealtimeImageVideoFrame;
|
|
67
|
+
/**
|
|
68
|
+
* A piece of fragmented MP4 as the frame a provider's driver builds from it (Core's `Fmp4PieceToVideoFrame`), labelled
|
|
69
|
+
* `video/mp4`. For this package's own use; a harness gets the frames the kit sends.
|
|
70
|
+
*
|
|
71
|
+
* @throws When the piece is not fragmented MP4.
|
|
72
|
+
*/
|
|
73
|
+
export declare function Fmp4Frame(piece: ArrayBuffer): RealtimeFmp4VideoFrame;
|
|
74
|
+
/** Frame `index`'s presentation time on the kit's 24 fps timeline, in ms. */
|
|
75
|
+
export declare function FrameTimeMs(index: number): number;
|
|
76
|
+
//# sourceMappingURL=conformanceFixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceFixtures.d.ts","sourceRoot":"","sources":["../../src/testing/conformanceFixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAEH,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC/B,MAAM,oBAAoB,CAAC;AAW5B,+HAA+H;AAC/H,eAAO,MAAM,8BAA8B,QAAsC,CAAC;AAWlF,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAQ9D;AAED,4CAA4C;AAC5C,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAIrD;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,uEAAuE;AACvE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,CAGzE;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,CAE7E;AAqCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,GAAE,OAAc,EAAE,cAAc,GAAE,MAAwB,GAAG,WAAW,CAI3H;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAU,GAAG,WAAW,CAGlG;AAED,yGAAyG;AACzG,wBAAgB,4BAA4B,CAAC,QAAQ,GAAE,MAAU,GAAG,WAAW,CAG9E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAU,GAAG,WAAW,CAE5D;AAED,8DAA8D;AAC9D,MAAM,WAAW,uBAAuB;IACpC,4HAA4H;IAC5H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,uBAAuB,EAAE,CAYtH;AAED,yHAAyH;AACzH,wBAAgB,qBAAqB,CAAC,KAAK,GAAE,MAAU,GAAG,uBAAuB,CAQhF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,sBAAsB,CAMpE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The media the video conformance kit sends as the model: tiny, synthetic, deterministic video in each
|
|
3
|
+
* form a model's video comes in (Core's `RealtimeVideoFrame` kinds), and PCM chunks. Nothing here decodes; the frames
|
|
4
|
+
* only need to be read (by `@memberjunction/ai`'s fMP4 reader) and routed.
|
|
5
|
+
*
|
|
6
|
+
* - **Fragmented MP4**, as a realtime avatar sends it: an init segment (`ftyp` + `moov`) with an H.264 `avc1.42c01f` video
|
|
7
|
+
* track at a 90 kHz timescale and an AAC-LC `mp4a.40.2` audio track at 24 kHz unless the video comes without the
|
|
8
|
+
* voice; video fragments (`moof` + `mdat`) of one sample per 24 fps frame, so each frame is
|
|
9
|
+
* {@link CONFORMANCE_FMP4_FRAME_SECONDS}; audio-only fragments of a muxed avatar, which carry no video seconds.
|
|
10
|
+
* - **Encoded chunks** ({@link ConformanceChunkFrames}): opaque bytes labelled H.264, a key frame every 24, presentation
|
|
11
|
+
* times 24 to the second.
|
|
12
|
+
* - **Images** ({@link ConformanceImageFrame}): JPEG start and end markers around a few bytes, 24 to the second.
|
|
13
|
+
* - **PCM** chunks of 4 bytes, too short to ever be read as an MP4 box.
|
|
14
|
+
*
|
|
15
|
+
* Every kind is spaced 1/24 s apart, so a frame is {@link CONFORMANCE_FMP4_FRAME_SECONDS} whatever its kind. The box
|
|
16
|
+
* builders are exported for this package's own tests; the `/testing` entry exports only the fixtures.
|
|
17
|
+
*
|
|
18
|
+
* @module @memberjunction/ai-realtime-client/testing
|
|
19
|
+
*/
|
|
20
|
+
import { Fmp4PieceToVideoFrame, } from '@memberjunction/ai';
|
|
21
|
+
/** One 24 fps video frame at the video track's 90 kHz timescale. */
|
|
22
|
+
const VIDEO_FRAME_UNITS = 3750;
|
|
23
|
+
/** The video track's timescale: units per second. */
|
|
24
|
+
const VIDEO_TIMESCALE = 90000;
|
|
25
|
+
/** One AAC frame at the audio track's 24 kHz timescale. */
|
|
26
|
+
const AUDIO_FRAME_UNITS = 1024;
|
|
27
|
+
/** The audio track's timescale. */
|
|
28
|
+
const AUDIO_TIMESCALE = 24000;
|
|
29
|
+
/** The seconds of video one frame carries, of any kind: 1/24. A {@link ConformanceFmp4VideoFragment} frame lasts this long. */
|
|
30
|
+
export const CONFORMANCE_FMP4_FRAME_SECONDS = VIDEO_FRAME_UNITS / VIDEO_TIMESCALE;
|
|
31
|
+
/** The H.264 type the kit's encoded chunks are labelled with: Constrained Baseline 3.0, as WebCodecs names it. */
|
|
32
|
+
const CHUNK_MIME_TYPE = 'video/h264; codecs="avc1.42e01f"';
|
|
33
|
+
/** How many chunks apart the kit's key frames are. */
|
|
34
|
+
const CHUNK_KEY_FRAME_INTERVAL = 24;
|
|
35
|
+
/** The type of the kit's images. */
|
|
36
|
+
const IMAGE_MIME_TYPE = 'image/jpeg';
|
|
37
|
+
/** Joins byte arrays end to end. */
|
|
38
|
+
export function ConcatBytes(...parts) {
|
|
39
|
+
const out = new Uint8Array(parts.reduce((total, part) => total + part.length, 0));
|
|
40
|
+
let offset = 0;
|
|
41
|
+
for (const part of parts) {
|
|
42
|
+
out.set(part, offset);
|
|
43
|
+
offset += part.length;
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/** A big-endian 32-bit unsigned integer. */
|
|
48
|
+
export function Uint32Bytes(value) {
|
|
49
|
+
const out = new Uint8Array(4);
|
|
50
|
+
new DataView(out.buffer).setUint32(0, value);
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
/** The bytes of an ASCII string, such as a box type. */
|
|
54
|
+
export function AsciiBytes(text) {
|
|
55
|
+
return Uint8Array.from(text, (c) => c.charCodeAt(0));
|
|
56
|
+
}
|
|
57
|
+
/** An MP4 box: its size, its four-character type, then its payload. */
|
|
58
|
+
export function Mp4Box(type, ...payload) {
|
|
59
|
+
const body = ConcatBytes(...payload);
|
|
60
|
+
return ConcatBytes(Uint32Bytes(8 + body.length), AsciiBytes(type), body);
|
|
61
|
+
}
|
|
62
|
+
/** A full box: version 0, no flags, then the payload. */
|
|
63
|
+
export function Mp4FullBox(type, ...payload) {
|
|
64
|
+
return Mp4Box(type, new Uint8Array(4), ...payload);
|
|
65
|
+
}
|
|
66
|
+
/** A track whose `mdhd` gives `timescale` units a second. */
|
|
67
|
+
function trak(id, handler, entry, timescale) {
|
|
68
|
+
const tkhd = Mp4FullBox('tkhd', new Uint8Array(8), Uint32Bytes(id), new Uint8Array(68));
|
|
69
|
+
const hdlr = Mp4FullBox('hdlr', Uint32Bytes(0), AsciiBytes(handler), new Uint8Array(13));
|
|
70
|
+
const stbl = Mp4Box('stbl', Mp4FullBox('stsd', Uint32Bytes(1), entry));
|
|
71
|
+
const mdhd = Mp4FullBox('mdhd', new Uint8Array(8), Uint32Bytes(timescale), new Uint8Array(8));
|
|
72
|
+
return Mp4Box('trak', tkhd, Mp4Box('mdia', mdhd, hdlr, Mp4Box('minf', stbl)));
|
|
73
|
+
}
|
|
74
|
+
/** A track fragment: `tfhd` (default-base-is-moof, a default sample duration) and a `trun` of `samples` samples. */
|
|
75
|
+
function traf(trackID, sampleUnits, samples) {
|
|
76
|
+
const tfhd = Mp4Box('tfhd', Uint8Array.of(0, 0x02, 0x00, 0x08), Uint32Bytes(trackID), Uint32Bytes(sampleUnits));
|
|
77
|
+
const trun = Mp4Box('trun', Uint8Array.of(0, 0, 0, 0x01), Uint32Bytes(samples), Uint32Bytes(0));
|
|
78
|
+
return Mp4Box('traf', tfhd, trun);
|
|
79
|
+
}
|
|
80
|
+
/** An H.264 sample entry whose `avcC` names Constrained Baseline 3.1 (`avc1.42c01f`). */
|
|
81
|
+
function avc1() {
|
|
82
|
+
return Mp4Box('avc1', new Uint8Array(6), Uint8Array.of(0, 1), new Uint8Array(70), Mp4Box('avcC', Uint8Array.of(1, 0x42, 0xc0, 0x1f, 0xff, 0xe0, 0)));
|
|
83
|
+
}
|
|
84
|
+
/** An AAC sample entry: ES descriptor → decoder config (AAC, 0x40) → AudioSpecificConfig 0x13 0x08 (AAC-LC) → SL config. */
|
|
85
|
+
function mp4a() {
|
|
86
|
+
const esds = Mp4FullBox('esds', Uint8Array.of(0x03, 25, 0, 1, 0, 0x04, 17, 0x40, 0x15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x05, 2, 0x13, 0x08, 0x06, 1, 2));
|
|
87
|
+
return Mp4Box('mp4a', new Uint8Array(6), Uint8Array.of(0, 1), new Uint8Array(8), Uint8Array.of(0, 1, 0, 16), new Uint8Array(4), Uint32Bytes(AUDIO_TIMESCALE * 65536), esds);
|
|
88
|
+
}
|
|
89
|
+
/** A copy of the bytes in an `ArrayBuffer` of their own. */
|
|
90
|
+
function toArrayBuffer(bytes) {
|
|
91
|
+
return bytes.slice().buffer;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* An init segment (`ftyp` + `moov`): an H.264 video track at `videoTimescale` units a second, and an AAC-LC audio track
|
|
95
|
+
* (the avatar's voice) unless `withAudio` is false.
|
|
96
|
+
*
|
|
97
|
+
* @param withAudio Whether the video carries the voice: an audio track beside the video. Default `true`.
|
|
98
|
+
* @param videoTimescale The video track's units per second. Default 90 000, which times each frame at 1/24 s.
|
|
99
|
+
*/
|
|
100
|
+
export function ConformanceFmp4InitSegment(withAudio = true, videoTimescale = VIDEO_TIMESCALE) {
|
|
101
|
+
const video = trak(1, 'vide', avc1(), videoTimescale);
|
|
102
|
+
const traks = withAudio ? [video, trak(2, 'soun', mp4a(), AUDIO_TIMESCALE)] : [video];
|
|
103
|
+
return toArrayBuffer(ConcatBytes(Mp4Box('ftyp', AsciiBytes('iso5'), Uint32Bytes(512)), Mp4Box('moov', Mp4FullBox('mvhd', new Uint8Array(96)), ...traks)));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A video fragment (`moof` + `mdat`) of `frames` 24 fps frames, {@link CONFORMANCE_FMP4_FRAME_SECONDS} each under the
|
|
107
|
+
* default init segment. `sequence` makes each fragment's bytes distinct.
|
|
108
|
+
*/
|
|
109
|
+
export function ConformanceFmp4VideoFragment(frames = 1, sequence = 1) {
|
|
110
|
+
const moof = Mp4Box('moof', Mp4FullBox('mfhd', Uint32Bytes(sequence)), traf(1, VIDEO_FRAME_UNITS, frames));
|
|
111
|
+
return toArrayBuffer(ConcatBytes(moof, Mp4Box('mdat', Uint32Bytes(sequence))));
|
|
112
|
+
}
|
|
113
|
+
/** An audio-only fragment of a muxed avatar: one AAC frame and no video, so it adds no video seconds. */
|
|
114
|
+
export function ConformanceFmp4AudioFragment(sequence = 1) {
|
|
115
|
+
const moof = Mp4Box('moof', Mp4FullBox('mfhd', Uint32Bytes(sequence)), traf(2, AUDIO_FRAME_UNITS, 1));
|
|
116
|
+
return toArrayBuffer(ConcatBytes(moof, Mp4Box('mdat', Uint32Bytes(sequence))));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* A 4-byte PCM16 chunk of the agent's voice. Too short to be read as an MP4 box, so a driver that sniffs bytes never
|
|
120
|
+
* takes it for video. `seed` makes each chunk's bytes distinct.
|
|
121
|
+
*/
|
|
122
|
+
export function ConformancePcm(seed = 1) {
|
|
123
|
+
return Uint8Array.of(seed & 0xff, 0, seed & 0xff, 0).buffer;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* `count` encoded chunks as a raw-frame provider sends them: each with distinct opaque bytes, its presentation time on a
|
|
127
|
+
* 24 fps timeline (chunk `n` at `n` × 1000/24 ms), and a key frame every 24 (chunk 0, 24, 48 …). Nothing decodes them.
|
|
128
|
+
*/
|
|
129
|
+
export function ConformanceChunkFrames(count, options = {}) {
|
|
130
|
+
const first = options.FirstIndex ?? 0;
|
|
131
|
+
return Array.from({ length: count }, (_, i) => {
|
|
132
|
+
const index = first + i;
|
|
133
|
+
return {
|
|
134
|
+
Kind: 'chunk',
|
|
135
|
+
Data: Uint8Array.of(0, 0, 0, 1, 0x65, index & 0xff, (index >> 8) & 0xff).buffer,
|
|
136
|
+
MimeType: options.MimeType ?? CHUNK_MIME_TYPE,
|
|
137
|
+
PresentationTimeMs: FrameTimeMs(index),
|
|
138
|
+
KeyFrame: index % CHUNK_KEY_FRAME_INTERVAL === 0,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/** Image `index` of a 24 fps stream: JPEG start and end markers around distinct bytes, timed at `index` × 1000/24 ms. */
|
|
143
|
+
export function ConformanceImageFrame(index = 0) {
|
|
144
|
+
return {
|
|
145
|
+
Kind: 'image',
|
|
146
|
+
Data: Uint8Array.of(0xff, 0xd8, index & 0xff, (index >> 8) & 0xff, 0xff, 0xd9).buffer,
|
|
147
|
+
MimeType: IMAGE_MIME_TYPE,
|
|
148
|
+
PresentationTimeMs: FrameTimeMs(index),
|
|
149
|
+
KeyFrame: true,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* A piece of fragmented MP4 as the frame a provider's driver builds from it (Core's `Fmp4PieceToVideoFrame`), labelled
|
|
154
|
+
* `video/mp4`. For this package's own use; a harness gets the frames the kit sends.
|
|
155
|
+
*
|
|
156
|
+
* @throws When the piece is not fragmented MP4.
|
|
157
|
+
*/
|
|
158
|
+
export function Fmp4Frame(piece) {
|
|
159
|
+
const frame = Fmp4PieceToVideoFrame(piece, 'video/mp4', null);
|
|
160
|
+
if (!frame) {
|
|
161
|
+
throw new Error('The piece is not fragmented MP4.');
|
|
162
|
+
}
|
|
163
|
+
return frame;
|
|
164
|
+
}
|
|
165
|
+
/** Frame `index`'s presentation time on the kit's 24 fps timeline, in ms. */
|
|
166
|
+
export function FrameTimeMs(index) {
|
|
167
|
+
return index * CONFORMANCE_FMP4_FRAME_SECONDS * 1000;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=conformanceFixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceFixtures.js","sourceRoot":"","sources":["../../src/testing/conformanceFixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview When a check runs: what it needs from the provider (its traits) and from the harness (its optional
|
|
3
|
+
* methods). Each gate returns why the check can't run, or `null`.
|
|
4
|
+
*
|
|
5
|
+
* @module @memberjunction/ai-realtime-client/testing
|
|
6
|
+
*/
|
|
7
|
+
import type { IRealtimeVideoConformanceHarness } from './realtimeVideoConformanceTypes.js';
|
|
8
|
+
/** A gate: why a check can't run against a harness, or `null`. */
|
|
9
|
+
export type ConformanceGate = (harness: IRealtimeVideoConformanceHarness) => string | null;
|
|
10
|
+
/** The harness's optional methods a check can need. */
|
|
11
|
+
export type ConformanceHarnessMethod = 'SendPart' | 'GenerationComplete' | 'Resume' | 'RefusePlayback';
|
|
12
|
+
/** Runs for every provider. */
|
|
13
|
+
export declare const NoGate: ConformanceGate;
|
|
14
|
+
/** Needs a provider that hands over the agent's video. */
|
|
15
|
+
export declare const NeedsAgentVideo: ConformanceGate;
|
|
16
|
+
/** Needs a provider whose server can grant an avatar. */
|
|
17
|
+
export declare const NeedsGrant: ConformanceGate;
|
|
18
|
+
/** Needs a provider whose video plays through a player the kit records. */
|
|
19
|
+
export declare const NeedsPlayout: ConformanceGate;
|
|
20
|
+
/** Needs a driver that plays the voice as PCM through the kit's recorder. */
|
|
21
|
+
export declare const NeedsPcmVoice: ConformanceGate;
|
|
22
|
+
/** Needs a provider whose video can carry the voice. */
|
|
23
|
+
export declare const NeedsVideoThatCanCarryVoice: ConformanceGate;
|
|
24
|
+
/** Needs a driver that reports generated video seconds. */
|
|
25
|
+
export declare const NeedsVideoUsage: ConformanceGate;
|
|
26
|
+
/** Needs a driver that keeps its voice and its video on one media timeline. */
|
|
27
|
+
export declare const NeedsTimedVoice: ConformanceGate;
|
|
28
|
+
/** Needs one of the harness's optional methods. */
|
|
29
|
+
export declare function NeedsHarnessMethod(method: ConformanceHarnessMethod): ConformanceGate;
|
|
30
|
+
/** All of the gates: the first reason any of them gives, or `null`. */
|
|
31
|
+
export declare function AllOf(...gates: ConformanceGate[]): ConformanceGate;
|
|
32
|
+
//# sourceMappingURL=conformanceGates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceGates.d.ts","sourceRoot":"","sources":["../../src/testing/conformanceGates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AAExF,kEAAkE;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,gCAAgC,KAAK,MAAM,GAAG,IAAI,CAAC;AAE3F,uDAAuD;AACvD,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,oBAAoB,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAEvG,+BAA+B;AAC/B,eAAO,MAAM,MAAM,EAAE,eAA4B,CAAC;AAElD,0DAA0D;AAC1D,eAAO,MAAM,eAAe,EAAE,eAC6F,CAAC;AAE5H,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,eAC0F,CAAC;AAEpH,2EAA2E;AAC3E,eAAO,MAAM,YAAY,EAAE,eAGoF,CAAC;AAEhH,6EAA6E;AAC7E,eAAO,MAAM,aAAa,EAAE,eACuH,CAAC;AAEpJ,wDAAwD;AACxD,eAAO,MAAM,2BAA2B,EAAE,eAC2F,CAAC;AAEtI,2DAA2D;AAC3D,eAAO,MAAM,eAAe,EAAE,eAC0F,CAAC;AAEzH,+EAA+E;AAC/E,eAAO,MAAM,eAAe,EAAE,eACuF,CAAC;AAEtH,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,eAAe,CAEpF;AAED,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,eAAe,CAUlE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Runs for every provider. */
|
|
2
|
+
export const NoGate = () => null;
|
|
3
|
+
/** Needs a provider that hands over the agent's video. */
|
|
4
|
+
export const NeedsAgentVideo = (harness) => harness.Traits.AgentVideo === 'none' ? `${harness.Name} hands over no agent video (Traits.AgentVideo is 'none')` : null;
|
|
5
|
+
/** Needs a provider whose server can grant an avatar. */
|
|
6
|
+
export const NeedsGrant = (harness) => harness.Traits.GrantsAvatar ? null : `${harness.Name}'s server grants no avatar (Traits.GrantsAvatar is false)`;
|
|
7
|
+
/** Needs a provider whose video plays through a player the kit records. */
|
|
8
|
+
export const NeedsPlayout = (harness) => harness.Traits.AgentVideo === 'playout'
|
|
9
|
+
? null
|
|
10
|
+
: `${harness.Name} has no video player to record (Traits.AgentVideo is '${harness.Traits.AgentVideo}')`;
|
|
11
|
+
/** Needs a driver that plays the voice as PCM through the kit's recorder. */
|
|
12
|
+
export const NeedsPcmVoice = (harness) => harness.Traits.Voice === 'pcm' ? null : `${harness.Name}'s voice plays through its transport, not a PCM playback (Traits.Voice is 'transport')`;
|
|
13
|
+
/** Needs a provider whose video can carry the voice. */
|
|
14
|
+
export const NeedsVideoThatCanCarryVoice = (harness) => harness.Traits.VideoCanCarryVoice ? null : `${harness.Name}'s video never carries the voice (Traits.VideoCanCarryVoice is false)`;
|
|
15
|
+
/** Needs a driver that reports generated video seconds. */
|
|
16
|
+
export const NeedsVideoUsage = (harness) => harness.Traits.VideoUsage ? null : `${harness.Name} reports no generated video seconds (Traits.VideoUsage is false)`;
|
|
17
|
+
/** Needs a driver that keeps its voice and its video on one media timeline. */
|
|
18
|
+
export const NeedsTimedVoice = (harness) => harness.Traits.TimedVoice ? null : `${harness.Name}'s voice carries no media time (Traits.TimedVoice is not set)`;
|
|
19
|
+
/** Needs one of the harness's optional methods. */
|
|
20
|
+
export function NeedsHarnessMethod(method) {
|
|
21
|
+
return (harness) => (typeof harness[method] === 'function' ? null : `${harness.Name}'s harness has no ${method}`);
|
|
22
|
+
}
|
|
23
|
+
/** All of the gates: the first reason any of them gives, or `null`. */
|
|
24
|
+
export function AllOf(...gates) {
|
|
25
|
+
return (harness) => {
|
|
26
|
+
for (const gate of gates) {
|
|
27
|
+
const reason = gate(harness);
|
|
28
|
+
if (reason !== null) {
|
|
29
|
+
return reason;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=conformanceGates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceGates.js","sourceRoot":"","sources":["../../src/testing/conformanceGates.ts"],"names":[],"mappings":"AAcA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAoB,GAAG,EAAE,CAAC,IAAI,CAAC;AAElD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,OAAO,EAAE,EAAE,CACxD,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,0DAA0D,CAAC,CAAC,CAAC,IAAI,CAAC;AAE5H,yDAAyD;AACzD,MAAM,CAAC,MAAM,UAAU,GAAoB,CAAC,OAAO,EAAE,EAAE,CACnD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,2DAA2D,CAAC;AAEpH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAoB,CAAC,OAAO,EAAE,EAAE,CACrD,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;IACnC,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,yDAAyD,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC;AAEhH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAoB,CAAC,OAAO,EAAE,EAAE,CACtD,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,wFAAwF,CAAC;AAEpJ,wDAAwD;AACxD,MAAM,CAAC,MAAM,2BAA2B,GAAoB,CAAC,OAAO,EAAE,EAAE,CACpE,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,uEAAuE,CAAC;AAEtI,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,OAAO,EAAE,EAAE,CACxD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,kEAAkE,CAAC;AAEzH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,OAAO,EAAE,EAAE,CACxD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,+DAA+D,CAAC;AAEtH,mDAAmD;AACnD,MAAM,UAAU,kBAAkB,CAAC,MAAgC;IAC/D,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,qBAAqB,MAAM,EAAE,CAAC,CAAC;AACtH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,KAAK,CAAC,GAAG,KAAwB;IAC7C,OAAO,CAAC,OAAO,EAAE,EAAE;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview A microphone for conformance sessions: a `MediaStream` with one audio track that captures nothing. It
|
|
3
|
+
* needs no devices and no DOM, only `EventTarget`, so the kit runs in plain Node. The track and the stream are plain
|
|
4
|
+
* objects with the platform's member names, so a driver uses them as it uses the browser's.
|
|
5
|
+
*
|
|
6
|
+
* @module @memberjunction/ai-realtime-client/testing
|
|
7
|
+
*/
|
|
8
|
+
/** A microphone stream with one audio track that captures nothing, to connect a driver with. */
|
|
9
|
+
export declare function CreateConformanceMicrophone(): MediaStream;
|
|
10
|
+
//# sourceMappingURL=conformanceMicrophone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceMicrophone.d.ts","sourceRoot":"","sources":["../../src/testing/conformanceMicrophone.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgEH,gGAAgG;AAChG,wBAAgB,2BAA2B,IAAI,WAAW,CAEzD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview A microphone for conformance sessions: a `MediaStream` with one audio track that captures nothing. It
|
|
3
|
+
* needs no devices and no DOM, only `EventTarget`, so the kit runs in plain Node. The track and the stream are plain
|
|
4
|
+
* objects with the platform's member names, so a driver uses them as it uses the browser's.
|
|
5
|
+
*
|
|
6
|
+
* @module @memberjunction/ai-realtime-client/testing
|
|
7
|
+
*/
|
|
8
|
+
/** The `EventTarget` half of a platform object, delegated to a real `EventTarget`. */
|
|
9
|
+
function eventTargetOf(events) {
|
|
10
|
+
return {
|
|
11
|
+
addEventListener: events.addEventListener.bind(events),
|
|
12
|
+
removeEventListener: events.removeEventListener.bind(events),
|
|
13
|
+
dispatchEvent: events.dispatchEvent.bind(events),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** An audio track that captures nothing. `stop()` ends it, as a real track's does. */
|
|
17
|
+
function createSilentAudioTrack() {
|
|
18
|
+
let readyState = 'live';
|
|
19
|
+
return {
|
|
20
|
+
...eventTargetOf(new EventTarget()),
|
|
21
|
+
contentHint: '',
|
|
22
|
+
enabled: true,
|
|
23
|
+
id: 'conformance-microphone-track',
|
|
24
|
+
kind: 'audio',
|
|
25
|
+
label: 'Conformance microphone',
|
|
26
|
+
muted: false,
|
|
27
|
+
onended: null,
|
|
28
|
+
onmute: null,
|
|
29
|
+
onunmute: null,
|
|
30
|
+
get readyState() {
|
|
31
|
+
return readyState;
|
|
32
|
+
},
|
|
33
|
+
applyConstraints: async () => undefined,
|
|
34
|
+
clone: () => createSilentAudioTrack(),
|
|
35
|
+
getCapabilities: () => ({}),
|
|
36
|
+
getConstraints: () => ({}),
|
|
37
|
+
getSettings: () => ({}),
|
|
38
|
+
stop: () => {
|
|
39
|
+
readyState = 'ended';
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** A stream of the tracks it was made with. */
|
|
44
|
+
function createStream(tracks) {
|
|
45
|
+
return {
|
|
46
|
+
...eventTargetOf(new EventTarget()),
|
|
47
|
+
active: true,
|
|
48
|
+
id: 'conformance-microphone',
|
|
49
|
+
onaddtrack: null,
|
|
50
|
+
onremovetrack: null,
|
|
51
|
+
addTrack: (track) => {
|
|
52
|
+
tracks.push(track);
|
|
53
|
+
},
|
|
54
|
+
clone: () => createStream([...tracks]),
|
|
55
|
+
getAudioTracks: () => tracks.filter((track) => track.kind === 'audio'),
|
|
56
|
+
getTrackById: (trackId) => tracks.find((track) => track.id === trackId) ?? null,
|
|
57
|
+
getTracks: () => [...tracks],
|
|
58
|
+
getVideoTracks: () => tracks.filter((track) => track.kind === 'video'),
|
|
59
|
+
removeTrack: (track) => {
|
|
60
|
+
const index = tracks.indexOf(track);
|
|
61
|
+
if (index >= 0) {
|
|
62
|
+
tracks.splice(index, 1);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** A microphone stream with one audio track that captures nothing, to connect a driver with. */
|
|
68
|
+
export function CreateConformanceMicrophone() {
|
|
69
|
+
return createStream([createSilentAudioTrack()]);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=conformanceMicrophone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformanceMicrophone.js","sourceRoot":"","sources":["../../src/testing/conformanceMicrophone.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sFAAsF;AACtF,SAAS,aAAa,CAAC,MAAmB;IACtC,OAAO;QACH,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;QACtD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5D,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;KACnD,CAAC;AACN,CAAC;AAED,sFAAsF;AACtF,SAAS,sBAAsB;IAC3B,IAAI,UAAU,GAA0B,MAAM,CAAC;IAC/C,OAAO;QACH,GAAG,aAAa,CAAC,IAAI,WAAW,EAAE,CAAC;QACnC,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,IAAI;QACb,EAAE,EAAE,8BAA8B;QAClC,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,IAAI,UAAU;YACV,OAAO,UAAU,CAAC;QACtB,CAAC;QACD,gBAAgB,EAAE,KAAK,IAAmB,EAAE,CAAC,SAAS;QACtD,KAAK,EAAE,GAAqB,EAAE,CAAC,sBAAsB,EAAE;QACvD,eAAe,EAAE,GAA2B,EAAE,CAAC,CAAC,EAAE,CAAC;QACnD,cAAc,EAAE,GAA0B,EAAE,CAAC,CAAC,EAAE,CAAC;QACjD,WAAW,EAAE,GAAuB,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3C,IAAI,EAAE,GAAS,EAAE;YACb,UAAU,GAAG,OAAO,CAAC;QACzB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,+CAA+C;AAC/C,SAAS,YAAY,CAAC,MAA0B;IAC5C,OAAO;QACH,GAAG,aAAa,CAAC,IAAI,WAAW,EAAE,CAAC;QACnC,MAAM,EAAE,IAAI;QACZ,EAAE,EAAE,wBAAwB;QAC5B,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,CAAC,KAAuB,EAAQ,EAAE;YACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,EAAE,GAAgB,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACnD,cAAc,EAAE,GAAuB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAC1F,YAAY,EAAE,CAAC,OAAe,EAA2B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI;QAChH,SAAS,EAAE,GAAuB,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;QAChD,cAAc,EAAE,GAAuB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAC1F,WAAW,EAAE,CAAC,KAAuB,EAAQ,EAAE;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,2BAA2B;IACvC,OAAO,YAAY,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC"}
|