@appsocom/client 0.0.0-stage → 0.5.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive.js","sourceRoot":"","sources":["../src/adaptive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Cuts your own mic audio into spoken phrases and hands each one over as a
3
+ * 16 kHz mono WAV. Only runs while captions are on and your mic is live, and
4
+ * only sends audio while you're speaking (a simple energy-based detector).
5
+ */
6
+ export declare class CaptionCapture {
7
+ #private;
8
+ private onPhrase;
9
+ constructor(onPhrase: (wav: Blob, seconds: number) => void);
10
+ /** Start listening to `track`, or switch to a new one. */
11
+ start(track: MediaStreamTrack): Promise<void>;
12
+ stop(): Promise<void>;
13
+ get running(): boolean;
14
+ }
15
+ /** Average-and-pick downsampling; good enough for speech recognition. */
16
+ export declare function downsample(chunks: Float32Array[], from: number, to: number): Float32Array;
17
+ /** 16-bit PCM mono WAV. */
18
+ export declare function encodeWav(samples: Float32Array, rate: number): Blob;
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Cuts your own mic audio into spoken phrases and hands each one over as a
3
+ * 16 kHz mono WAV. Only runs while captions are on and your mic is live, and
4
+ * only sends audio while you're speaking (a simple energy-based detector).
5
+ */
6
+ const TARGET_RATE = 16000;
7
+ /** A phrase ends after this much silence… */
8
+ const SILENCE_MS = 700;
9
+ /** …but is cut anyway at this length, so captions keep flowing. */
10
+ const MAX_PHRASE_MS = 12000;
11
+ /** Shorter blips (coughs, clicks) are dropped. */
12
+ const MIN_SPEECH_MS = 400;
13
+ /** Audio kept from just before speech started. */
14
+ const PREROLL_MS = 300;
15
+ // Collects raw samples off the audio thread (an AudioWorklet loaded from a Blob URL).
16
+ const WORKLET = `
17
+ class SfuKitTap extends AudioWorkletProcessor {
18
+ process(inputs) {
19
+ const ch = inputs[0] && inputs[0][0];
20
+ if (ch) this.port.postMessage(ch.slice(0));
21
+ return true;
22
+ }
23
+ }
24
+ registerProcessor("sfukit-tap", SfuKitTap);
25
+ `;
26
+ export class CaptionCapture {
27
+ onPhrase;
28
+ #ctx = null;
29
+ #source = null;
30
+ #node = null;
31
+ #track = null;
32
+ #starting = null;
33
+ // detector state
34
+ #noise = 0.003;
35
+ #phrase = [];
36
+ #preroll = [];
37
+ #speechMs = 0;
38
+ #silenceMs = 0;
39
+ #phraseMs = 0;
40
+ #inPhrase = false;
41
+ constructor(onPhrase) {
42
+ this.onPhrase = onPhrase;
43
+ }
44
+ /** Start listening to `track`, or switch to a new one. */
45
+ async start(track) {
46
+ if (this.#track === track && this.#ctx)
47
+ return;
48
+ await this.stop();
49
+ this.#track = track;
50
+ this.#starting = this.#open(track).catch(() => this.stop());
51
+ await this.#starting;
52
+ }
53
+ async stop() {
54
+ this.#track = null;
55
+ this.#node?.port.close();
56
+ this.#node?.disconnect();
57
+ this.#source?.disconnect();
58
+ const ctx = this.#ctx;
59
+ this.#ctx = this.#node = this.#source = null;
60
+ this.#reset();
61
+ if (ctx && ctx.state !== "closed")
62
+ await ctx.close().catch(() => { });
63
+ }
64
+ get running() {
65
+ return this.#ctx !== null;
66
+ }
67
+ async #open(track) {
68
+ const ctx = new AudioContext();
69
+ this.#ctx = ctx;
70
+ const url = URL.createObjectURL(new Blob([WORKLET], { type: "application/javascript" }));
71
+ try {
72
+ await ctx.audioWorklet.addModule(url);
73
+ }
74
+ finally {
75
+ URL.revokeObjectURL(url);
76
+ }
77
+ if (this.#ctx !== ctx)
78
+ return; // stopped meanwhile
79
+ const source = ctx.createMediaStreamSource(new MediaStream([track]));
80
+ const node = new AudioWorkletNode(ctx, "sfukit-tap", { numberOfInputs: 1, numberOfOutputs: 0 });
81
+ node.port.onmessage = (e) => this.#onSamples(e.data, ctx.sampleRate);
82
+ source.connect(node);
83
+ this.#source = source;
84
+ this.#node = node;
85
+ if (ctx.state === "suspended")
86
+ await ctx.resume().catch(() => { });
87
+ }
88
+ #onSamples(chunk, rate) {
89
+ const ms = (chunk.length / rate) * 1000;
90
+ let sum = 0;
91
+ for (let i = 0; i < chunk.length; i++)
92
+ sum += chunk[i] * chunk[i];
93
+ const rms = Math.sqrt(sum / chunk.length);
94
+ const speaking = rms > Math.max(0.01, this.#noise * 3);
95
+ // Track the noise floor slowly while not speaking.
96
+ if (!speaking)
97
+ this.#noise = this.#noise * 0.995 + rms * 0.005;
98
+ if (!this.#inPhrase) {
99
+ this.#preroll.push(chunk);
100
+ let pre = this.#preroll.reduce((n, c) => n + c.length, 0);
101
+ while (pre - this.#preroll[0].length > (PREROLL_MS / 1000) * rate)
102
+ pre -= this.#preroll.shift().length;
103
+ if (!speaking)
104
+ return;
105
+ this.#inPhrase = true;
106
+ this.#phrase = [...this.#preroll];
107
+ this.#preroll = [];
108
+ this.#phraseMs = this.#speechMs = this.#silenceMs = 0;
109
+ }
110
+ else {
111
+ this.#phrase.push(chunk);
112
+ }
113
+ this.#phraseMs += ms;
114
+ if (speaking) {
115
+ this.#speechMs += ms;
116
+ this.#silenceMs = 0;
117
+ }
118
+ else {
119
+ this.#silenceMs += ms;
120
+ }
121
+ if (this.#silenceMs >= SILENCE_MS || this.#phraseMs >= MAX_PHRASE_MS)
122
+ this.#flush(rate);
123
+ }
124
+ #flush(rate) {
125
+ const chunks = this.#phrase;
126
+ const speech = this.#speechMs;
127
+ this.#reset();
128
+ if (speech < MIN_SPEECH_MS)
129
+ return;
130
+ const samples = downsample(chunks, rate, TARGET_RATE);
131
+ this.onPhrase(encodeWav(samples, TARGET_RATE), samples.length / TARGET_RATE);
132
+ }
133
+ #reset() {
134
+ this.#phrase = [];
135
+ this.#preroll = [];
136
+ this.#inPhrase = false;
137
+ this.#speechMs = this.#silenceMs = this.#phraseMs = 0;
138
+ }
139
+ }
140
+ /** Average-and-pick downsampling; good enough for speech recognition. */
141
+ export function downsample(chunks, from, to) {
142
+ const total = chunks.reduce((n, c) => n + c.length, 0);
143
+ const input = new Float32Array(total);
144
+ let o = 0;
145
+ for (const c of chunks) {
146
+ input.set(c, o);
147
+ o += c.length;
148
+ }
149
+ if (from === to)
150
+ return input;
151
+ const ratio = from / to;
152
+ const out = new Float32Array(Math.floor(total / ratio));
153
+ for (let i = 0; i < out.length; i++) {
154
+ const start = Math.floor(i * ratio);
155
+ const end = Math.min(total, Math.floor((i + 1) * ratio));
156
+ let sum = 0;
157
+ for (let j = start; j < end; j++)
158
+ sum += input[j];
159
+ out[i] = end > start ? sum / (end - start) : input[start] ?? 0;
160
+ }
161
+ return out;
162
+ }
163
+ /** 16-bit PCM mono WAV. */
164
+ export function encodeWav(samples, rate) {
165
+ const buf = new ArrayBuffer(44 + samples.length * 2);
166
+ const v = new DataView(buf);
167
+ const str = (o, s) => {
168
+ for (let i = 0; i < s.length; i++)
169
+ v.setUint8(o + i, s.charCodeAt(i));
170
+ };
171
+ str(0, "RIFF");
172
+ v.setUint32(4, 36 + samples.length * 2, true);
173
+ str(8, "WAVE");
174
+ str(12, "fmt ");
175
+ v.setUint32(16, 16, true);
176
+ v.setUint16(20, 1, true); // PCM
177
+ v.setUint16(22, 1, true); // mono
178
+ v.setUint32(24, rate, true);
179
+ v.setUint32(28, rate * 2, true);
180
+ v.setUint16(32, 2, true);
181
+ v.setUint16(34, 16, true);
182
+ str(36, "data");
183
+ v.setUint32(40, samples.length * 2, true);
184
+ for (let i = 0; i < samples.length; i++) {
185
+ const s = Math.max(-1, Math.min(1, samples[i]));
186
+ v.setInt16(44 + i * 2, s < 0 ? s * 0x8000 : s * 0x7fff, true);
187
+ }
188
+ return new Blob([buf], { type: "audio/wav" });
189
+ }
190
+ //# sourceMappingURL=captions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captions.js","sourceRoot":"","sources":["../src/captions.ts"],"names":[],"mappings":"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"}
package/dist/e2ee.d.ts ADDED
@@ -0,0 +1,71 @@
1
+ /**
2
+ * End-to-end encryption (E2EE) for sfukit calls.
3
+ *
4
+ * Every participant holds the same secret (a passphrase or random bytes your
5
+ * app hands out without going through the kit's Worker). Audio/video frames are
6
+ * encrypted in the browser with AES-GCM before they leave, and decrypted only by
7
+ * other participants, so the Worker and Cloudflare's SFU forward ciphertext they
8
+ * can't read. App messages sent with room.send() are encrypted the same way.
9
+ *
10
+ * Frame format (per encoded frame):
11
+ * [plain header][AES-GCM ciphertext + 16-byte tag][12-byte IV][key index][0xE2]
12
+ * The plain header (VP8: 10 bytes on key frames, 3 on others; Opus: 1 byte) stays
13
+ * readable so packetizers and the SFU still work; it's authenticated as AAD.
14
+ *
15
+ * Needs RTCRtpScriptTransform: Chrome/Edge 141+, Safari 15.4+, Firefox 117+.
16
+ */
17
+ /** A shared secret: a passphrase (PBKDF2-derived) or 16+ random bytes (HKDF-derived). */
18
+ export type E2EEKey = string | ArrayBuffer | ArrayBufferView;
19
+ export interface E2EEOptions {
20
+ /** The shared secret. Never send it through the kit's Worker (e.g. not in the join token). */
21
+ key: E2EEKey;
22
+ /** Index of this key, 0-255 (default 0). Lets receivers tell keys apart during rotation. */
23
+ keyIndex?: number;
24
+ /**
25
+ * Your own worker running the sfukit E2EE worker code (see e2eeWorkerSource()),
26
+ * for sites whose Content-Security-Policy forbids blob: workers.
27
+ */
28
+ worker?: Worker;
29
+ }
30
+ export type EncryptionErrorType = "missing-key" | "decrypt-failed" | "not-encrypted" | "unsupported-codec";
31
+ /** Derived keys for one secret: one for media frames, one for app messages. */
32
+ export interface E2EEKeySet {
33
+ frame: CryptoKey;
34
+ message: CryptoKey;
35
+ }
36
+ export declare function isE2EESupported(): boolean;
37
+ /**
38
+ * Derive the frame and message keys for a secret. The room id is the salt, so the
39
+ * same passphrase gives different keys in different rooms.
40
+ */
41
+ export declare function deriveE2EEKeys(secret: E2EEKey, roomId: string): Promise<E2EEKeySet>;
42
+ /** Envelope for an encrypted app message (what other participants' clients receive). */
43
+ export interface EncryptedMessage {
44
+ sfukitE2ee: 1;
45
+ k: number;
46
+ iv: string;
47
+ ct: string;
48
+ }
49
+ export declare function isEncryptedMessage(data: unknown): data is EncryptedMessage;
50
+ /**
51
+ * The key ring of one Room: current key for sending, recent keys for receiving,
52
+ * and the worker that encrypts/decrypts media frames.
53
+ * @internal used by Room
54
+ */
55
+ export declare class E2EEContext {
56
+ #private;
57
+ readonly worker: Worker;
58
+ constructor(roomId: string, worker: Worker | undefined, onError: (type: EncryptionErrorType, detail: string) => void);
59
+ get keyIndex(): number;
60
+ /** Add a key; with `use`, send with it from now on. */
61
+ setKey(secret: E2EEKey, index: number, use: boolean): Promise<void>;
62
+ /** Attach encrypt/decrypt transforms to a transceiver (idempotent). */
63
+ attach(t: RTCRtpTransceiver): void;
64
+ encryptMessage(data: unknown): Promise<EncryptedMessage>;
65
+ decryptMessage(msg: EncryptedMessage): Promise<unknown>;
66
+ close(): void;
67
+ }
68
+ /** Source of the E2EE worker, if you host it yourself (CSP without blob: workers). */
69
+ export declare function e2eeWorkerSource(): string;
70
+ /** Start the E2EE worker from a blob: URL. */
71
+ export declare function createE2EEWorker(): Worker;
package/dist/e2ee.js ADDED
@@ -0,0 +1,268 @@
1
+ /**
2
+ * End-to-end encryption (E2EE) for sfukit calls.
3
+ *
4
+ * Every participant holds the same secret (a passphrase or random bytes your
5
+ * app hands out without going through the kit's Worker). Audio/video frames are
6
+ * encrypted in the browser with AES-GCM before they leave, and decrypted only by
7
+ * other participants, so the Worker and Cloudflare's SFU forward ciphertext they
8
+ * can't read. App messages sent with room.send() are encrypted the same way.
9
+ *
10
+ * Frame format (per encoded frame):
11
+ * [plain header][AES-GCM ciphertext + 16-byte tag][12-byte IV][key index][0xE2]
12
+ * The plain header (VP8: 10 bytes on key frames, 3 on others; Opus: 1 byte) stays
13
+ * readable so packetizers and the SFU still work; it's authenticated as AAD.
14
+ *
15
+ * Needs RTCRtpScriptTransform: Chrome/Edge 141+, Safari 15.4+, Firefox 117+.
16
+ */
17
+ const TRAILER_MARK = 0xe2;
18
+ const PBKDF2_ITERATIONS = 100_000;
19
+ const MAX_KEYS = 16;
20
+ export function isE2EESupported() {
21
+ return typeof globalThis !== "undefined" && typeof globalThis.RTCRtpScriptTransform === "function";
22
+ }
23
+ /**
24
+ * Derive the frame and message keys for a secret. The room id is the salt, so the
25
+ * same passphrase gives different keys in different rooms.
26
+ */
27
+ export async function deriveE2EEKeys(secret, roomId) {
28
+ const enc = new TextEncoder();
29
+ const salt = enc.encode(`sfukit-e2ee|${roomId}`);
30
+ let bits;
31
+ if (typeof secret === "string") {
32
+ if (!secret)
33
+ throw new Error("E2EE key must not be empty");
34
+ const base = await crypto.subtle.importKey("raw", enc.encode(secret), "PBKDF2", false, ["deriveBits"]);
35
+ bits = await crypto.subtle.deriveBits({ name: "PBKDF2", hash: "SHA-256", salt, iterations: PBKDF2_ITERATIONS }, base, 512);
36
+ }
37
+ else {
38
+ const raw = secret instanceof ArrayBuffer ? new Uint8Array(secret) : new Uint8Array(secret.buffer, secret.byteOffset, secret.byteLength).slice();
39
+ if (raw.byteLength < 16)
40
+ throw new Error("E2EE key bytes must be at least 16 bytes");
41
+ const base = await crypto.subtle.importKey("raw", raw, "HKDF", false, ["deriveBits"]);
42
+ bits = await crypto.subtle.deriveBits({ name: "HKDF", hash: "SHA-256", salt, info: enc.encode("sfukit-e2ee-v1") }, base, 512);
43
+ }
44
+ const imp = (b) => crypto.subtle.importKey("raw", b, { name: "AES-GCM" }, false, ["encrypt", "decrypt"]);
45
+ const [frame, message] = await Promise.all([imp(bits.slice(0, 32)), imp(bits.slice(32, 64))]);
46
+ return { frame, message };
47
+ }
48
+ export function isEncryptedMessage(data) {
49
+ if (!data || typeof data !== "object")
50
+ return false;
51
+ const d = data;
52
+ return d.sfukitE2ee === 1 && typeof d.k === "number" && typeof d.iv === "string" && typeof d.ct === "string";
53
+ }
54
+ /**
55
+ * The key ring of one Room: current key for sending, recent keys for receiving,
56
+ * and the worker that encrypts/decrypts media frames.
57
+ * @internal used by Room
58
+ */
59
+ export class E2EEContext {
60
+ worker;
61
+ #roomId;
62
+ #keys = new Map();
63
+ #current = -1;
64
+ #ownsWorker;
65
+ #attached = new WeakSet();
66
+ #onError;
67
+ constructor(roomId, worker, onError) {
68
+ if (!isE2EESupported())
69
+ throw new Error("End-to-end encryption isn't supported in this browser (needs RTCRtpScriptTransform)");
70
+ this.#roomId = roomId;
71
+ this.#onError = onError;
72
+ this.#ownsWorker = !worker;
73
+ this.worker = worker ?? createE2EEWorker();
74
+ this.worker.addEventListener("message", (ev) => {
75
+ const m = ev.data;
76
+ if (m?.type === "error" && m.error)
77
+ this.#onError(m.error, m.detail ?? "");
78
+ });
79
+ }
80
+ get keyIndex() {
81
+ return this.#current;
82
+ }
83
+ /** Add a key; with `use`, send with it from now on. */
84
+ async setKey(secret, index, use) {
85
+ if (!Number.isInteger(index) || index < 0 || index > 255)
86
+ throw new Error("E2EE key index must be 0-255");
87
+ const set = await deriveE2EEKeys(secret, this.#roomId);
88
+ this.#keys.delete(index);
89
+ this.#keys.set(index, set);
90
+ while (this.#keys.size > MAX_KEYS) {
91
+ const oldest = this.#keys.keys().next().value;
92
+ if (oldest === (use ? index : this.#current))
93
+ break;
94
+ this.#keys.delete(oldest);
95
+ this.worker.postMessage({ type: "removeKey", index: oldest });
96
+ }
97
+ if (use)
98
+ this.#current = index;
99
+ this.worker.postMessage({ type: "setKey", index, key: set.frame, use });
100
+ }
101
+ /** Attach encrypt/decrypt transforms to a transceiver (idempotent). */
102
+ attach(t) {
103
+ if (this.#attached.has(t))
104
+ return;
105
+ this.#attached.add(t);
106
+ const Transform = globalThis.RTCRtpScriptTransform;
107
+ const sending = t.direction === "sendonly" || t.direction === "sendrecv";
108
+ if (sending) {
109
+ const kind = t.sender.track?.kind ?? t.receiver.track.kind;
110
+ if (kind === "video")
111
+ preferVp8(t);
112
+ t.sender.transform = new Transform(this.worker, { op: "encrypt", kind });
113
+ }
114
+ else {
115
+ const kind = t.receiver.track.kind;
116
+ t.receiver.transform = new Transform(this.worker, { op: "decrypt", kind });
117
+ }
118
+ }
119
+ async encryptMessage(data) {
120
+ const set = this.#keys.get(this.#current);
121
+ if (!set)
122
+ throw new Error("no E2EE key set");
123
+ const iv = crypto.getRandomValues(new Uint8Array(12));
124
+ const ct = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, set.message, new TextEncoder().encode(JSON.stringify(data)));
125
+ return { sfukitE2ee: 1, k: this.#current, iv: b64(iv), ct: b64(new Uint8Array(ct)) };
126
+ }
127
+ async decryptMessage(msg) {
128
+ const set = this.#keys.get(msg.k);
129
+ if (!set)
130
+ throw Object.assign(new Error(`no E2EE key with index ${msg.k}`), { e2ee: "missing-key" });
131
+ try {
132
+ const pt = await crypto.subtle.decrypt({ name: "AES-GCM", iv: unb64(msg.iv) }, set.message, unb64(msg.ct));
133
+ return JSON.parse(new TextDecoder().decode(pt));
134
+ }
135
+ catch {
136
+ throw Object.assign(new Error("could not decrypt message"), { e2ee: "decrypt-failed" });
137
+ }
138
+ }
139
+ close() {
140
+ if (this.#ownsWorker)
141
+ this.worker.terminate();
142
+ }
143
+ }
144
+ /** Put VP8 first: the plain-header scheme relies on VP8 (H.264/AV1 packetizers parse the payload). */
145
+ function preferVp8(t) {
146
+ try {
147
+ const caps = RTCRtpReceiver.getCapabilities("video")?.codecs ?? [];
148
+ const vp8 = caps.filter((c) => c.mimeType.toLowerCase() === "video/vp8");
149
+ const rest = caps.filter((c) => c.mimeType.toLowerCase() !== "video/vp8" && !/video\/(h264|h265|av1|vp9)/i.test(c.mimeType));
150
+ if (vp8.length)
151
+ t.setCodecPreferences([...vp8, ...rest]);
152
+ }
153
+ catch {
154
+ // Older browsers: the worker drops non-VP8 frames (fails closed).
155
+ }
156
+ }
157
+ function b64(bytes) {
158
+ let s = "";
159
+ for (const b of bytes)
160
+ s += String.fromCharCode(b);
161
+ return btoa(s);
162
+ }
163
+ function unb64(s) {
164
+ return Uint8Array.from(atob(s), (c) => c.charCodeAt(0));
165
+ }
166
+ /** Source of the E2EE worker, if you host it yourself (CSP without blob: workers). */
167
+ export function e2eeWorkerSource() {
168
+ return `(${sfukitE2eeWorker.toString()})(${TRAILER_MARK});`;
169
+ }
170
+ /** Start the E2EE worker from a blob: URL. */
171
+ export function createE2EEWorker() {
172
+ const url = URL.createObjectURL(new Blob([e2eeWorkerSource()], { type: "text/javascript" }));
173
+ const w = new Worker(url, { name: "sfukit-e2ee" });
174
+ setTimeout(() => URL.revokeObjectURL(url), 10_000);
175
+ return w;
176
+ }
177
+ /**
178
+ * Runs inside the worker. Must stay self-contained (it's serialised with toString()).
179
+ * Fails closed: frames that can't be encrypted are dropped, never sent in the clear.
180
+ */
181
+ function sfukitE2eeWorker(MARK) {
182
+ const scope = self;
183
+ const keys = new Map();
184
+ let current = -1;
185
+ const lastReport = new Map();
186
+ const report = (error, detail) => {
187
+ const now = Date.now();
188
+ if (now - (lastReport.get(error) ?? 0) < 2000)
189
+ return;
190
+ lastReport.set(error, now);
191
+ scope.postMessage({ type: "error", error, detail });
192
+ };
193
+ scope.onmessage = (e) => {
194
+ const m = e.data;
195
+ if (m.type === "setKey" && m.key) {
196
+ keys.set(m.index, m.key);
197
+ if (m.use)
198
+ current = m.index;
199
+ }
200
+ else if (m.type === "removeKey") {
201
+ keys.delete(m.index);
202
+ }
203
+ };
204
+ const headerLength = (kind, frame) => {
205
+ if (kind === "audio")
206
+ return 1;
207
+ const mime = frame.getMetadata?.().mimeType?.toLowerCase();
208
+ if (mime && mime !== "video/vp8")
209
+ return null;
210
+ return frame.type === "key" ? 10 : 3;
211
+ };
212
+ scope.onrtctransform = (ev) => {
213
+ const t = ev.transformer;
214
+ const { op, kind } = t.options;
215
+ const encrypt = async (frame, ctl) => {
216
+ const data = new Uint8Array(frame.data);
217
+ if (data.byteLength === 0)
218
+ return ctl.enqueue(frame);
219
+ const key = keys.get(current);
220
+ if (!key)
221
+ return report("missing-key", "no key to encrypt with; frame dropped");
222
+ const h0 = headerLength(kind, frame);
223
+ if (h0 === null)
224
+ return report("unsupported-codec", `${frame.getMetadata?.().mimeType} can't be encrypted; frame dropped`);
225
+ const h = Math.min(h0, data.byteLength);
226
+ const iv = crypto.getRandomValues(new Uint8Array(12));
227
+ const ct = new Uint8Array(await crypto.subtle.encrypt({ name: "AES-GCM", iv, additionalData: data.subarray(0, h) }, key, data.subarray(h)));
228
+ const out = new Uint8Array(h + ct.byteLength + 14);
229
+ out.set(data.subarray(0, h), 0);
230
+ out.set(ct, h);
231
+ out.set(iv, h + ct.byteLength);
232
+ out[out.byteLength - 2] = current;
233
+ out[out.byteLength - 1] = MARK;
234
+ frame.data = out.buffer;
235
+ ctl.enqueue(frame);
236
+ };
237
+ const decrypt = async (frame, ctl) => {
238
+ const data = new Uint8Array(frame.data);
239
+ if (data.byteLength === 0)
240
+ return ctl.enqueue(frame);
241
+ const h0 = headerLength(kind, frame);
242
+ if (h0 === null)
243
+ return report("unsupported-codec", "received a non-VP8 video frame; dropped");
244
+ const h = Math.min(h0, data.byteLength);
245
+ if (data.byteLength < h + 16 + 14 || data[data.byteLength - 1] !== MARK) {
246
+ return report("not-encrypted", "received a frame that isn't end-to-end encrypted; dropped");
247
+ }
248
+ const index = data[data.byteLength - 2];
249
+ const key = keys.get(index);
250
+ if (!key)
251
+ return report("missing-key", `no key with index ${index}; frame dropped`);
252
+ const iv = data.subarray(data.byteLength - 14, data.byteLength - 2);
253
+ try {
254
+ const pt = new Uint8Array(await crypto.subtle.decrypt({ name: "AES-GCM", iv, additionalData: data.subarray(0, h) }, key, data.subarray(h, data.byteLength - 14)));
255
+ const out = new Uint8Array(h + pt.byteLength);
256
+ out.set(data.subarray(0, h), 0);
257
+ out.set(pt, h);
258
+ frame.data = out.buffer;
259
+ ctl.enqueue(frame);
260
+ }
261
+ catch {
262
+ report("decrypt-failed", `could not decrypt a ${kind} frame (wrong key?); dropped`);
263
+ }
264
+ };
265
+ t.readable.pipeThrough(new TransformStream({ transform: op === "encrypt" ? encrypt : decrypt })).pipeTo(t.writable);
266
+ };
267
+ }
268
+ //# sourceMappingURL=e2ee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2ee.js","sourceRoot":"","sources":["../src/e2ee.ts"],"names":[],"mappings":"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"}