@livekit/rtc-node 0.13.31 → 0.13.33

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.
Files changed (120) hide show
  1. package/dist/async_queue.d.ts +2 -3
  2. package/dist/audio_filter.d.ts +2 -3
  3. package/dist/audio_frame.d.ts +5 -6
  4. package/dist/audio_mixer.d.ts +3 -6
  5. package/dist/audio_resampler.d.ts +3 -6
  6. package/dist/audio_source.d.ts +5 -6
  7. package/dist/{audio_stream-B4hGVcKz.d.cts → audio_stream-CnODFAmo.d.cts} +26 -0
  8. package/dist/audio_stream.cjs +31 -18
  9. package/dist/audio_stream.cjs.map +1 -1
  10. package/dist/audio_stream.d.cts +1 -1
  11. package/dist/audio_stream.d.ts +61 -18
  12. package/dist/audio_stream.d.ts.map +1 -1
  13. package/dist/data_streams/index.d.ts +4 -3
  14. package/dist/data_streams/stream_reader.d.ts +48 -2
  15. package/dist/data_streams/stream_writer.d.ts +5 -7
  16. package/dist/data_streams/types.d.ts +41 -2
  17. package/dist/e2ee.d.ts +8 -10
  18. package/dist/ffi_client.d.ts +8 -10
  19. package/dist/frame_processor.d.ts +8 -11
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +2 -2
  22. package/dist/index.d.ts +22 -17
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -107
  25. package/dist/log.d.ts +5 -7
  26. package/dist/participant.cjs +7 -2
  27. package/dist/participant.cjs.map +1 -1
  28. package/dist/participant.d.cts +1 -1
  29. package/dist/participant.d.ts +152 -18
  30. package/dist/participant.d.ts.map +1 -1
  31. package/dist/room.cjs +7 -0
  32. package/dist/room.cjs.map +1 -1
  33. package/dist/room.d.cts +2 -2
  34. package/dist/room.d.ts +220 -18
  35. package/dist/room.d.ts.map +1 -1
  36. package/dist/rpc.d.ts +7 -9
  37. package/dist/track.cjs +16 -0
  38. package/dist/track.cjs.map +1 -1
  39. package/dist/track.d.cts +1 -1
  40. package/dist/track.d.ts +67 -18
  41. package/dist/track.d.ts.map +1 -1
  42. package/dist/track_publication.d.cts +1 -1
  43. package/dist/track_publication.d.ts +45 -18
  44. package/dist/transcription.d.ts +3 -4
  45. package/dist/types.d.ts +2 -3
  46. package/dist/utils.d.ts +4 -5
  47. package/dist/version.cjs +1 -1
  48. package/dist/version.cjs.map +1 -1
  49. package/dist/version.d.cts +1 -1
  50. package/dist/version.d.ts +2 -3
  51. package/dist/video_frame.d.ts +4 -5
  52. package/dist/video_source.d.ts +6 -8
  53. package/dist/video_stream.d.cts +1 -1
  54. package/dist/video_stream.d.ts +5 -22
  55. package/package.json +5 -6
  56. package/src/audio_stream.ts +37 -24
  57. package/src/audio_stream_room_lifecycle.test.ts +50 -3
  58. package/src/index.ts +8 -1
  59. package/src/participant.ts +7 -1
  60. package/src/room.ts +14 -0
  61. package/src/tests/e2e.test.ts +137 -16
  62. package/src/track.ts +17 -0
  63. package/src/version.ts +1 -1
  64. package/dist/async_queue.js +0 -56
  65. package/dist/async_queue.js.map +0 -1
  66. package/dist/audio_filter.js +0 -24
  67. package/dist/audio_filter.js.map +0 -1
  68. package/dist/audio_frame.js +0 -78
  69. package/dist/audio_frame.js.map +0 -1
  70. package/dist/audio_mixer.js +0 -269
  71. package/dist/audio_mixer.js.map +0 -1
  72. package/dist/audio_resampler.js +0 -154
  73. package/dist/audio_resampler.js.map +0 -1
  74. package/dist/audio_source.js +0 -134
  75. package/dist/audio_source.js.map +0 -1
  76. package/dist/audio_stream-DEG1JKge.d.ts +0 -498
  77. package/dist/audio_stream.js +0 -109
  78. package/dist/audio_stream.js.map +0 -1
  79. package/dist/data_streams/index.js +0 -3
  80. package/dist/data_streams/index.js.map +0 -1
  81. package/dist/data_streams/stream_reader.js +0 -124
  82. package/dist/data_streams/stream_reader.js.map +0 -1
  83. package/dist/data_streams/stream_writer.js +0 -26
  84. package/dist/data_streams/stream_writer.js.map +0 -1
  85. package/dist/data_streams/types.js +0 -1
  86. package/dist/data_streams/types.js.map +0 -1
  87. package/dist/e2ee.js +0 -251
  88. package/dist/e2ee.js.map +0 -1
  89. package/dist/ffi_client.js +0 -89
  90. package/dist/ffi_client.js.map +0 -1
  91. package/dist/frame_processor.js +0 -29
  92. package/dist/frame_processor.js.map +0 -1
  93. package/dist/index.js.map +0 -1
  94. package/dist/log.js +0 -9
  95. package/dist/log.js.map +0 -1
  96. package/dist/participant.js +0 -715
  97. package/dist/participant.js.map +0 -1
  98. package/dist/room.js +0 -899
  99. package/dist/room.js.map +0 -1
  100. package/dist/rpc.js +0 -65
  101. package/dist/rpc.js.map +0 -1
  102. package/dist/track.js +0 -218
  103. package/dist/track.js.map +0 -1
  104. package/dist/track_publication.js +0 -100
  105. package/dist/track_publication.js.map +0 -1
  106. package/dist/transcription.js +0 -1
  107. package/dist/transcription.js.map +0 -1
  108. package/dist/types-_PdPVish.d.ts +0 -87
  109. package/dist/types.js +0 -1
  110. package/dist/types.js.map +0 -1
  111. package/dist/utils.js +0 -35
  112. package/dist/utils.js.map +0 -1
  113. package/dist/version.js +0 -5
  114. package/dist/version.js.map +0 -1
  115. package/dist/video_frame.js +0 -207
  116. package/dist/video_frame.js.map +0 -1
  117. package/dist/video_source.js +0 -53
  118. package/dist/video_source.js.map +0 -1
  119. package/dist/video_stream.js +0 -70
  120. package/dist/video_stream.js.map +0 -1
@@ -1,124 +0,0 @@
1
- import { log } from "../log.js";
2
- import { bigIntToNumber } from "../utils.js";
3
- class BaseStreamReader {
4
- get info() {
5
- return this._info;
6
- }
7
- constructor(info, stream, totalByteSize) {
8
- this.reader = stream;
9
- this.totalByteSize = totalByteSize;
10
- this._info = info;
11
- this.bytesReceived = 0;
12
- }
13
- }
14
- class ByteStreamReader extends BaseStreamReader {
15
- handleChunkReceived(chunk) {
16
- var _a;
17
- this.bytesReceived += chunk.content.byteLength;
18
- const currentProgress = this.totalByteSize ? this.bytesReceived / this.totalByteSize : void 0;
19
- (_a = this.onProgress) == null ? void 0 : _a.call(this, currentProgress);
20
- }
21
- [Symbol.asyncIterator]() {
22
- const reader = this.reader.getReader();
23
- return {
24
- next: async () => {
25
- try {
26
- const { done, value } = await reader.read();
27
- if (done) {
28
- reader.releaseLock();
29
- return { done: true, value: void 0 };
30
- } else {
31
- this.handleChunkReceived(value);
32
- return { done: false, value: value.content };
33
- }
34
- } catch (error) {
35
- reader.releaseLock();
36
- log.error("error processing stream update: %s", error);
37
- return { done: true, value: void 0 };
38
- }
39
- },
40
- return() {
41
- reader.releaseLock();
42
- return { done: true, value: void 0 };
43
- }
44
- };
45
- }
46
- async readAll() {
47
- const chunks = /* @__PURE__ */ new Set();
48
- for await (const chunk of this) {
49
- chunks.add(chunk);
50
- }
51
- return Array.from(chunks);
52
- }
53
- }
54
- class TextStreamReader extends BaseStreamReader {
55
- /**
56
- * A TextStreamReader instance can be used as an AsyncIterator that returns the entire string
57
- * that has been received up to the current point in time.
58
- */
59
- constructor(info, stream, totalChunkCount) {
60
- super(info, stream, totalChunkCount);
61
- this.receivedChunks = /* @__PURE__ */ new Map();
62
- }
63
- handleChunkReceived(chunk) {
64
- var _a;
65
- const index = bigIntToNumber(chunk.chunkIndex);
66
- const previousChunkAtIndex = this.receivedChunks.get(index);
67
- if (previousChunkAtIndex && previousChunkAtIndex.version > chunk.version) {
68
- return;
69
- }
70
- this.receivedChunks.set(index, chunk);
71
- const currentProgress = this.totalByteSize ? this.receivedChunks.size / this.totalByteSize : void 0;
72
- (_a = this.onProgress) == null ? void 0 : _a.call(this, currentProgress);
73
- }
74
- /**
75
- * Async iterator implementation to allow usage of `for await...of` syntax.
76
- * Yields structured chunks from the stream.
77
- *
78
- */
79
- [Symbol.asyncIterator]() {
80
- const reader = this.reader.getReader();
81
- const decoder = new TextDecoder();
82
- const receivedChunks = this.receivedChunks;
83
- return {
84
- next: async () => {
85
- try {
86
- const { done, value } = await reader.read();
87
- if (done) {
88
- reader.releaseLock();
89
- receivedChunks.clear();
90
- return { done: true, value: void 0 };
91
- } else {
92
- this.handleChunkReceived(value);
93
- return {
94
- done: false,
95
- value: decoder.decode(value.content)
96
- };
97
- }
98
- } catch (error) {
99
- reader.releaseLock();
100
- receivedChunks.clear();
101
- log.error("error processing stream update: %s", error);
102
- return { done: true, value: void 0 };
103
- }
104
- },
105
- return() {
106
- reader.releaseLock();
107
- receivedChunks.clear();
108
- return { done: true, value: void 0 };
109
- }
110
- };
111
- }
112
- async readAll() {
113
- let finalString = "";
114
- for await (const chunk of this) {
115
- finalString += chunk;
116
- }
117
- return finalString;
118
- }
119
- }
120
- export {
121
- ByteStreamReader,
122
- TextStreamReader
123
- };
124
- //# sourceMappingURL=stream_reader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/data_streams/stream_reader.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { DataStream_Chunk } from '@livekit/rtc-ffi-bindings';\nimport { log } from '../log.js';\nimport { bigIntToNumber } from '../utils.js';\nimport type { BaseStreamInfo, ByteStreamInfo, TextStreamInfo } from './types.js';\n\nabstract class BaseStreamReader<T extends BaseStreamInfo> {\n protected reader: ReadableStream<DataStream_Chunk>;\n\n protected totalByteSize?: number;\n\n protected _info: T;\n\n protected bytesReceived: number;\n\n get info() {\n return this._info;\n }\n\n constructor(info: T, stream: ReadableStream<DataStream_Chunk>, totalByteSize?: number) {\n this.reader = stream;\n this.totalByteSize = totalByteSize;\n this._info = info;\n this.bytesReceived = 0;\n }\n\n protected abstract handleChunkReceived(chunk: DataStream_Chunk): void;\n\n onProgress?: (progress: number | undefined) => void;\n\n abstract readAll(): Promise<string | Array<Uint8Array>>;\n}\n\n/**\n * A class to read chunks from a ReadableStream and provide them in a structured format.\n */\nexport class ByteStreamReader extends BaseStreamReader<ByteStreamInfo> {\n protected handleChunkReceived(chunk: DataStream_Chunk) {\n this.bytesReceived += chunk.content!.byteLength;\n const currentProgress = this.totalByteSize\n ? this.bytesReceived / this.totalByteSize\n : undefined;\n this.onProgress?.(currentProgress);\n }\n\n [Symbol.asyncIterator]() {\n const reader = this.reader.getReader();\n\n return {\n next: async (): Promise<IteratorResult<Uint8Array>> => {\n try {\n const { done, value } = await reader.read();\n if (done) {\n // Release the lock when the stream is exhausted so the\n // underlying ReadableStream can be garbage-collected.\n reader.releaseLock();\n return { done: true, value: undefined as unknown };\n } else {\n this.handleChunkReceived(value);\n return { done: false, value: value.content! };\n }\n } catch (error: unknown) {\n // Release the lock on error so it doesn't stay held when the\n // consumer never calls return() (e.g. breaking out of for-await).\n reader.releaseLock();\n log.error('error processing stream update: %s', error);\n return { done: true, value: undefined as unknown };\n }\n },\n\n return(): IteratorResult<Uint8Array> {\n reader.releaseLock();\n return { done: true, value: undefined };\n },\n };\n }\n\n async readAll(): Promise<Array<Uint8Array>> {\n const chunks: Set<Uint8Array> = new Set();\n for await (const chunk of this) {\n chunks.add(chunk);\n }\n return Array.from(chunks);\n }\n}\n\n/**\n * A class to read chunks from a ReadableStream and provide them in a structured format.\n */\nexport class TextStreamReader extends BaseStreamReader<TextStreamInfo> {\n private receivedChunks: Map<number, DataStream_Chunk>;\n\n /**\n * A TextStreamReader instance can be used as an AsyncIterator that returns the entire string\n * that has been received up to the current point in time.\n */\n constructor(\n info: TextStreamInfo,\n stream: ReadableStream<DataStream_Chunk>,\n totalChunkCount?: number,\n ) {\n super(info, stream, totalChunkCount);\n this.receivedChunks = new Map();\n }\n\n protected handleChunkReceived(chunk: DataStream_Chunk) {\n const index = bigIntToNumber(chunk.chunkIndex!);\n const previousChunkAtIndex = this.receivedChunks.get(index!);\n if (previousChunkAtIndex && previousChunkAtIndex.version! > chunk.version!) {\n // we have a newer version already, dropping the old one\n return;\n }\n this.receivedChunks.set(index, chunk);\n const currentProgress = this.totalByteSize\n ? this.receivedChunks.size / this.totalByteSize\n : undefined;\n this.onProgress?.(currentProgress);\n }\n\n /**\n * Async iterator implementation to allow usage of `for await...of` syntax.\n * Yields structured chunks from the stream.\n *\n */\n [Symbol.asyncIterator]() {\n const reader = this.reader.getReader();\n const decoder = new TextDecoder();\n const receivedChunks = this.receivedChunks;\n\n return {\n next: async (): Promise<IteratorResult<string>> => {\n try {\n const { done, value } = await reader.read();\n if (done) {\n // Release the lock when the stream is exhausted so the\n // underlying ReadableStream can be garbage-collected.\n reader.releaseLock();\n // Clear received chunks so the buffered data can be GC'd.\n receivedChunks.clear();\n return { done: true, value: undefined };\n } else {\n this.handleChunkReceived(value);\n return {\n done: false,\n value: decoder.decode(value.content!),\n };\n }\n } catch (error: unknown) {\n // Release the lock on error so it doesn't stay held when the\n // consumer never calls return() (e.g. breaking out of for-await).\n reader.releaseLock();\n receivedChunks.clear();\n log.error('error processing stream update: %s', error);\n return { done: true, value: undefined };\n }\n },\n\n return(): IteratorResult<string> {\n reader.releaseLock();\n // Clear received chunks so the buffered data can be GC'd.\n receivedChunks.clear();\n return { done: true, value: undefined };\n },\n };\n }\n\n async readAll(): Promise<string> {\n let finalString: string = '';\n for await (const chunk of this) {\n finalString += chunk;\n }\n return finalString;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,26 +0,0 @@
1
- class BaseStreamWriter {
2
- constructor(writableStream, info, onClose) {
3
- this.writableStream = writableStream;
4
- this.defaultWriter = writableStream.getWriter();
5
- this.onClose = onClose;
6
- this.info = info;
7
- }
8
- write(chunk) {
9
- return this.defaultWriter.write(chunk);
10
- }
11
- async close() {
12
- var _a;
13
- await this.defaultWriter.close();
14
- this.defaultWriter.releaseLock();
15
- (_a = this.onClose) == null ? void 0 : _a.call(this);
16
- }
17
- }
18
- class TextStreamWriter extends BaseStreamWriter {
19
- }
20
- class ByteStreamWriter extends BaseStreamWriter {
21
- }
22
- export {
23
- ByteStreamWriter,
24
- TextStreamWriter
25
- };
26
- //# sourceMappingURL=stream_writer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/data_streams/stream_writer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { BaseStreamInfo, ByteStreamInfo, TextStreamInfo } from './types.js';\n\nclass BaseStreamWriter<T, InfoType extends BaseStreamInfo> {\n protected writableStream: WritableStream<T>;\n\n protected defaultWriter: WritableStreamDefaultWriter<T>;\n\n protected onClose?: () => void;\n\n readonly info: InfoType;\n\n constructor(writableStream: WritableStream<T>, info: InfoType, onClose?: () => void) {\n this.writableStream = writableStream;\n this.defaultWriter = writableStream.getWriter();\n this.onClose = onClose;\n this.info = info;\n }\n\n write(chunk: T): Promise<void> {\n return this.defaultWriter.write(chunk);\n }\n\n async close() {\n await this.defaultWriter.close();\n this.defaultWriter.releaseLock();\n this.onClose?.();\n }\n}\n\nexport class TextStreamWriter extends BaseStreamWriter<string, TextStreamInfo> {}\n\nexport class ByteStreamWriter extends BaseStreamWriter<Uint8Array, ByteStreamInfo> {}\n"],"mappings":"AAKA,MAAM,iBAAqD;AAAA,EASzD,YAAY,gBAAmC,MAAgB,SAAsB;AACnF,SAAK,iBAAiB;AACtB,SAAK,gBAAgB,eAAe,UAAU;AAC9C,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,OAAyB;AAC7B,WAAO,KAAK,cAAc,MAAM,KAAK;AAAA,EACvC;AAAA,EAEA,MAAM,QAAQ;AAzBhB;AA0BI,UAAM,KAAK,cAAc,MAAM;AAC/B,SAAK,cAAc,YAAY;AAC/B,eAAK,YAAL;AAAA,EACF;AACF;AAEO,MAAM,yBAAyB,iBAAyC;AAAC;AAEzE,MAAM,yBAAyB,iBAA6C;AAAC;","names":[]}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/e2ee.js DELETED
@@ -1,251 +0,0 @@
1
- import {
2
- E2eeManagerSetEnabledRequest,
3
- E2eeRequest,
4
- EncryptionType,
5
- FrameCryptorSetEnabledRequest,
6
- FrameCryptorSetKeyIndexRequest,
7
- GetKeyRequest,
8
- GetSharedKeyRequest,
9
- RatchetKeyRequest,
10
- RatchetSharedKeyRequest,
11
- SetKeyRequest,
12
- SetSharedKeyRequest
13
- } from "@livekit/rtc-ffi-bindings";
14
- import { FfiClient } from "./ffi_client.js";
15
- const DEFAULT_RATCHET_SALT = new TextEncoder().encode("LKFrameEncryptionKey");
16
- const DEFAULT_RATCHET_WINDOW_SIZE = 16;
17
- const DEFAULT_FAILURE_TOLERANCE = -1;
18
- const defaultKeyProviderOptions = {
19
- ratchetSalt: DEFAULT_RATCHET_SALT,
20
- ratchetWindowSize: DEFAULT_RATCHET_WINDOW_SIZE,
21
- failureTolerance: DEFAULT_FAILURE_TOLERANCE
22
- };
23
- const defaultE2EEOptions = {
24
- keyProviderOptions: defaultKeyProviderOptions,
25
- encryptionType: EncryptionType.GCM
26
- };
27
- class KeyProvider {
28
- /** internal */
29
- constructor(roomHandle, opts) {
30
- this.roomHandle = roomHandle;
31
- this.options = opts;
32
- }
33
- setSharedKey(sharedKey, keyIndex) {
34
- const req = new E2eeRequest({
35
- roomHandle: this.roomHandle,
36
- message: {
37
- case: "setSharedKey",
38
- value: new SetSharedKeyRequest({
39
- keyIndex,
40
- sharedKey
41
- })
42
- }
43
- });
44
- FfiClient.instance.request({
45
- message: {
46
- case: "e2ee",
47
- value: req
48
- }
49
- });
50
- }
51
- exportSharedKey(keyIndex) {
52
- const req = new E2eeRequest({
53
- roomHandle: this.roomHandle,
54
- message: {
55
- case: "getSharedKey",
56
- value: new GetSharedKeyRequest({
57
- keyIndex
58
- })
59
- }
60
- });
61
- const res = FfiClient.instance.request({
62
- message: {
63
- case: "e2ee",
64
- value: req
65
- }
66
- });
67
- return res.message.value.key;
68
- }
69
- ratchetSharedKey(keyIndex) {
70
- const req = new E2eeRequest({
71
- roomHandle: this.roomHandle,
72
- message: {
73
- case: "ratchetSharedKey",
74
- value: new RatchetSharedKeyRequest({
75
- keyIndex
76
- })
77
- }
78
- });
79
- const res = FfiClient.instance.request({
80
- message: {
81
- case: "e2ee",
82
- value: req
83
- }
84
- });
85
- return res.message.value.newKey;
86
- }
87
- setKey(participantIdentity, keyIndex) {
88
- const req = new E2eeRequest({
89
- roomHandle: this.roomHandle,
90
- message: {
91
- case: "setKey",
92
- value: new SetKeyRequest({
93
- keyIndex,
94
- participantIdentity
95
- })
96
- }
97
- });
98
- FfiClient.instance.request({
99
- message: {
100
- case: "e2ee",
101
- value: req
102
- }
103
- });
104
- }
105
- exportKey(participantIdentity, keyIndex) {
106
- const req = new E2eeRequest({
107
- roomHandle: this.roomHandle,
108
- message: {
109
- case: "getKey",
110
- value: new GetKeyRequest({
111
- keyIndex,
112
- participantIdentity
113
- })
114
- }
115
- });
116
- const res = FfiClient.instance.request({
117
- message: {
118
- case: "e2ee",
119
- value: req
120
- }
121
- });
122
- return res.message.value.key;
123
- }
124
- ratchetKey(participantIdentity, keyIndex) {
125
- const req = new E2eeRequest({
126
- roomHandle: this.roomHandle,
127
- message: {
128
- case: "ratchetKey",
129
- value: new RatchetKeyRequest({
130
- keyIndex,
131
- participantIdentity
132
- })
133
- }
134
- });
135
- const res = FfiClient.instance.request({
136
- message: {
137
- case: "e2ee",
138
- value: req
139
- }
140
- });
141
- return res.message.value.newKey;
142
- }
143
- }
144
- class FrameCryptor {
145
- constructor(roomHandle, participantIdentity, keyIndex, enabled) {
146
- this.roomHandle = BigInt(0);
147
- this.roomHandle = roomHandle;
148
- this.participantIdentity = participantIdentity;
149
- this.keyIndex = keyIndex;
150
- this.enabled = enabled;
151
- }
152
- setEnabled(enabled) {
153
- this.enabled = enabled;
154
- const req = new E2eeRequest({
155
- roomHandle: this.roomHandle,
156
- message: {
157
- case: "cryptorSetEnabled",
158
- value: new FrameCryptorSetEnabledRequest({
159
- participantIdentity: this.participantIdentity,
160
- enabled: this.enabled
161
- })
162
- }
163
- });
164
- FfiClient.instance.request({
165
- message: {
166
- case: "e2ee",
167
- value: req
168
- }
169
- });
170
- }
171
- setKeyIndex(keyIndex) {
172
- this.keyIndex = keyIndex;
173
- const req = new E2eeRequest({
174
- roomHandle: this.roomHandle,
175
- message: {
176
- case: "cryptorSetKeyIndex",
177
- value: new FrameCryptorSetKeyIndexRequest({
178
- participantIdentity: this.participantIdentity,
179
- keyIndex: this.keyIndex
180
- })
181
- }
182
- });
183
- FfiClient.instance.request({
184
- message: {
185
- case: "e2ee",
186
- value: req
187
- }
188
- });
189
- }
190
- }
191
- class E2EEManager {
192
- constructor(roomHandle, opts) {
193
- this.roomHandle = BigInt(0);
194
- this.roomHandle = roomHandle;
195
- this.enabled = opts !== void 0;
196
- opts ??= defaultE2EEOptions;
197
- const options = { ...defaultE2EEOptions, ...opts };
198
- this.options = options;
199
- this.keyProvider = new KeyProvider(roomHandle, options.keyProviderOptions);
200
- }
201
- setEnabled(enabled) {
202
- this.enabled = enabled;
203
- const req = new E2eeRequest({
204
- roomHandle: this.roomHandle,
205
- message: {
206
- case: "managerSetEnabled",
207
- value: new E2eeManagerSetEnabledRequest({
208
- enabled: this.enabled
209
- })
210
- }
211
- });
212
- FfiClient.instance.request({
213
- message: {
214
- case: "e2ee",
215
- value: req
216
- }
217
- });
218
- }
219
- frameCryptors() {
220
- const req = new E2eeRequest({
221
- roomHandle: this.roomHandle,
222
- message: {
223
- case: "managerGetFrameCryptors",
224
- value: {}
225
- }
226
- });
227
- const res = FfiClient.instance.request({
228
- message: {
229
- case: "e2ee",
230
- value: req
231
- }
232
- });
233
- const frameCryptors = res.message.value.frameCryptors.map(
234
- (cryptor) => new FrameCryptor(
235
- this.roomHandle,
236
- cryptor.participantIdentity,
237
- cryptor.keyIndex,
238
- cryptor.enabled
239
- )
240
- );
241
- return frameCryptors;
242
- }
243
- }
244
- export {
245
- E2EEManager,
246
- FrameCryptor,
247
- KeyProvider,
248
- defaultE2EEOptions,
249
- defaultKeyProviderOptions
250
- };
251
- //# sourceMappingURL=e2ee.js.map
package/dist/e2ee.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/e2ee.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n E2eeManagerGetFrameCryptorsResponse,\n E2eeResponse,\n GetKeyResponse,\n GetSharedKeyResponse,\n RatchetKeyResponse,\n RatchetSharedKeyResponse,\n} from '@livekit/rtc-ffi-bindings';\nimport {\n E2eeManagerSetEnabledRequest,\n E2eeRequest,\n EncryptionType,\n FrameCryptorSetEnabledRequest,\n FrameCryptorSetKeyIndexRequest,\n GetKeyRequest,\n GetSharedKeyRequest,\n RatchetKeyRequest,\n RatchetSharedKeyRequest,\n SetKeyRequest,\n SetSharedKeyRequest,\n} from '@livekit/rtc-ffi-bindings';\nimport { FfiClient } from './ffi_client.js';\n\nconst DEFAULT_RATCHET_SALT = new TextEncoder().encode('LKFrameEncryptionKey');\nconst DEFAULT_RATCHET_WINDOW_SIZE = 16;\nconst DEFAULT_FAILURE_TOLERANCE = -1;\n\nexport interface KeyProviderOptions {\n sharedKey?: Uint8Array;\n ratchetSalt?: Uint8Array;\n ratchetWindowSize?: number;\n failureTolerance?: number;\n}\n\nexport const defaultKeyProviderOptions: KeyProviderOptions = {\n ratchetSalt: DEFAULT_RATCHET_SALT,\n ratchetWindowSize: DEFAULT_RATCHET_WINDOW_SIZE,\n failureTolerance: DEFAULT_FAILURE_TOLERANCE,\n};\n\nexport interface E2EEOptions {\n keyProviderOptions: KeyProviderOptions;\n encryptionType?: EncryptionType;\n}\n\nexport const defaultE2EEOptions: E2EEOptions = {\n keyProviderOptions: defaultKeyProviderOptions,\n encryptionType: EncryptionType.GCM,\n};\n\nexport class KeyProvider {\n private roomHandle: bigint;\n options: KeyProviderOptions;\n\n /** internal */\n constructor(roomHandle: bigint, opts: KeyProviderOptions) {\n this.roomHandle = roomHandle;\n this.options = opts;\n }\n\n setSharedKey(sharedKey: Uint8Array, keyIndex: number) {\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'setSharedKey',\n value: new SetSharedKeyRequest({\n keyIndex: keyIndex,\n sharedKey: sharedKey,\n }),\n },\n });\n\n FfiClient.instance.request({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n }\n\n exportSharedKey(keyIndex: number): Uint8Array {\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'getSharedKey',\n value: new GetSharedKeyRequest({\n keyIndex: keyIndex,\n }),\n },\n });\n\n const res = FfiClient.instance.request<E2eeResponse>({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n\n return (res.message.value as GetSharedKeyResponse).key!;\n }\n\n ratchetSharedKey(keyIndex: number): Uint8Array {\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'ratchetSharedKey',\n value: new RatchetSharedKeyRequest({\n keyIndex: keyIndex,\n }),\n },\n });\n\n const res = FfiClient.instance.request<E2eeResponse>({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n\n return (res.message.value as RatchetSharedKeyResponse).newKey!;\n }\n\n setKey(participantIdentity: string, keyIndex: number) {\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'setKey',\n value: new SetKeyRequest({\n keyIndex: keyIndex,\n participantIdentity: participantIdentity,\n }),\n },\n });\n\n FfiClient.instance.request({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n }\n\n exportKey(participantIdentity: string, keyIndex: number): Uint8Array {\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'getKey',\n value: new GetKeyRequest({\n keyIndex: keyIndex,\n participantIdentity: participantIdentity,\n }),\n },\n });\n\n const res = FfiClient.instance.request<E2eeResponse>({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n\n return (res.message.value as GetKeyResponse).key!;\n }\n\n ratchetKey(participantIdentity: string, keyIndex: number): Uint8Array {\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'ratchetKey',\n value: new RatchetKeyRequest({\n keyIndex: keyIndex,\n participantIdentity: participantIdentity,\n }),\n },\n });\n\n const res = FfiClient.instance.request<E2eeResponse>({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n\n return (res.message.value as RatchetKeyResponse).newKey!;\n }\n}\n\nexport class FrameCryptor {\n private roomHandle = BigInt(0);\n participantIdentity: string;\n keyIndex: number;\n enabled: boolean;\n\n constructor(roomHandle: bigint, participantIdentity: string, keyIndex: number, enabled: boolean) {\n this.roomHandle = roomHandle;\n this.participantIdentity = participantIdentity;\n this.keyIndex = keyIndex;\n this.enabled = enabled;\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'cryptorSetEnabled',\n value: new FrameCryptorSetEnabledRequest({\n participantIdentity: this.participantIdentity,\n enabled: this.enabled,\n }),\n },\n });\n\n FfiClient.instance.request({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n }\n\n setKeyIndex(keyIndex: number) {\n this.keyIndex = keyIndex;\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'cryptorSetKeyIndex',\n value: new FrameCryptorSetKeyIndexRequest({\n participantIdentity: this.participantIdentity,\n keyIndex: this.keyIndex,\n }),\n },\n });\n\n FfiClient.instance.request({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n }\n}\n\nexport class E2EEManager {\n private roomHandle = BigInt(0);\n private options: E2EEOptions;\n private keyProvider: KeyProvider;\n\n enabled: boolean;\n\n constructor(roomHandle: bigint, opts?: E2EEOptions) {\n this.roomHandle = roomHandle;\n this.enabled = opts !== undefined;\n\n opts ??= defaultE2EEOptions;\n const options = { ...defaultE2EEOptions, ...opts };\n\n this.options = options;\n this.keyProvider = new KeyProvider(roomHandle, options.keyProviderOptions);\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'managerSetEnabled',\n value: new E2eeManagerSetEnabledRequest({\n enabled: this.enabled,\n }),\n },\n });\n\n FfiClient.instance.request({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n }\n\n frameCryptors(): FrameCryptor[] {\n const req = new E2eeRequest({\n roomHandle: this.roomHandle,\n message: {\n case: 'managerGetFrameCryptors',\n value: {},\n },\n });\n\n const res = FfiClient.instance.request<E2eeResponse>({\n message: {\n case: 'e2ee',\n value: req,\n },\n });\n\n const frameCryptors = (\n res.message.value as E2eeManagerGetFrameCryptorsResponse\n ).frameCryptors.map(\n (cryptor) =>\n new FrameCryptor(\n this.roomHandle,\n cryptor.participantIdentity!,\n cryptor.keyIndex!,\n cryptor.enabled!,\n ),\n );\n\n return frameCryptors;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,89 +0,0 @@
1
- import {
2
- FfiEvent,
3
- FfiHandle,
4
- FfiRequest,
5
- FfiResponse,
6
- livekitCopyBuffer,
7
- livekitDispose,
8
- livekitFfiRequest,
9
- livekitInitialize,
10
- livekitRetrievePtr
11
- } from "@livekit/rtc-ffi-bindings";
12
- import EventEmitter from "events";
13
- import { SDK_VERSION } from "./version.js";
14
- var FfiClientEvent = /* @__PURE__ */ ((FfiClientEvent2) => {
15
- FfiClientEvent2["FfiEvent"] = "ffi_event";
16
- return FfiClientEvent2;
17
- })(FfiClientEvent || {});
18
- class FfiClient extends EventEmitter {
19
- constructor() {
20
- super();
21
- this._nextRequestAsyncId = BigInt(0);
22
- this.setMaxListeners(0);
23
- livekitInitialize(
24
- (event_data) => {
25
- const event = FfiEvent.fromBinary(event_data);
26
- this.emit("ffi_event" /* FfiEvent */, event);
27
- },
28
- true,
29
- SDK_VERSION
30
- );
31
- }
32
- /** @internal */
33
- static get instance() {
34
- if (!globalThis._ffiClientInstance) {
35
- globalThis._ffiClientInstance = new FfiClient();
36
- }
37
- return globalThis._ffiClientInstance;
38
- }
39
- request(req) {
40
- const request = new FfiRequest(req);
41
- const req_data = request.toBinary();
42
- const res_data = livekitFfiRequest(req_data);
43
- return FfiResponse.fromBinary(res_data).message.value;
44
- }
45
- copyBuffer(ptr, len) {
46
- return livekitCopyBuffer(ptr, len);
47
- }
48
- retrievePtr(data) {
49
- return livekitRetrievePtr(data);
50
- }
51
- getNextRequestAsyncId() {
52
- return ++this._nextRequestAsyncId;
53
- }
54
- async waitFor(predicate, options) {
55
- return new Promise((resolve, reject) => {
56
- var _a, _b;
57
- const listener = (ev) => {
58
- if (predicate(ev)) {
59
- cleanup();
60
- resolve(ev.message.value);
61
- }
62
- };
63
- const cleanup = () => {
64
- var _a2;
65
- this.off("ffi_event" /* FfiEvent */, listener);
66
- (_a2 = options == null ? void 0 : options.signal) == null ? void 0 : _a2.removeEventListener("abort", onAbort);
67
- };
68
- const onAbort = () => {
69
- var _a2;
70
- cleanup();
71
- reject(((_a2 = options == null ? void 0 : options.signal) == null ? void 0 : _a2.reason) ?? new Error("waitFor aborted"));
72
- };
73
- if ((_a = options == null ? void 0 : options.signal) == null ? void 0 : _a.aborted) {
74
- reject(options.signal.reason ?? new Error("waitFor aborted"));
75
- return;
76
- }
77
- (_b = options == null ? void 0 : options.signal) == null ? void 0 : _b.addEventListener("abort", onAbort);
78
- this.on("ffi_event" /* FfiEvent */, listener);
79
- });
80
- }
81
- }
82
- export {
83
- FfiClient,
84
- FfiClientEvent,
85
- FfiHandle,
86
- FfiRequest,
87
- livekitDispose as dispose
88
- };
89
- //# sourceMappingURL=ffi_client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ffi_client.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {\n FfiEvent,\n FfiHandle,\n FfiRequest,\n FfiResponse,\n type PartialMessage,\n livekitCopyBuffer,\n livekitDispose,\n livekitFfiRequest,\n livekitInitialize,\n livekitRetrievePtr,\n} from '@livekit/rtc-ffi-bindings';\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport { SDK_VERSION } from './version.js';\n\nexport { FfiHandle, type FfiEvent, type FfiResponse, FfiRequest, livekitDispose as dispose };\n\nexport type FfiClientCallbacks = {\n ffi_event: (event: FfiEvent) => void;\n};\n\nexport enum FfiClientEvent {\n FfiEvent = 'ffi_event',\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var _ffiClientInstance: FfiClient | undefined;\n}\n\nexport class FfiClient extends (EventEmitter as new () => TypedEmitter<FfiClientCallbacks>) {\n /** @internal */\n static get instance(): FfiClient {\n if (!globalThis._ffiClientInstance) {\n globalThis._ffiClientInstance = new FfiClient();\n }\n return globalThis._ffiClientInstance;\n }\n\n private _nextRequestAsyncId = BigInt(0);\n\n constructor() {\n super();\n this.setMaxListeners(0);\n\n livekitInitialize(\n (event_data: Uint8Array) => {\n const event = FfiEvent.fromBinary(event_data);\n this.emit(FfiClientEvent.FfiEvent, event);\n },\n true,\n SDK_VERSION,\n );\n }\n\n request<T>(req: PartialMessage<FfiRequest>): T {\n const request = new FfiRequest(req);\n const req_data = request.toBinary();\n const res_data = livekitFfiRequest(req_data);\n return FfiResponse.fromBinary(res_data).message.value as T;\n }\n\n copyBuffer(ptr: bigint, len: number): Uint8Array {\n return livekitCopyBuffer(ptr, len);\n }\n\n retrievePtr(data: Uint8Array): bigint {\n return livekitRetrievePtr(data);\n }\n\n getNextRequestAsyncId() {\n return ++this._nextRequestAsyncId;\n }\n\n async waitFor<T>(\n predicate: (ev: FfiEvent) => boolean,\n options?: { signal?: AbortSignal },\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const listener = (ev: FfiEvent) => {\n if (predicate(ev)) {\n cleanup();\n resolve(ev.message.value as T);\n }\n };\n\n const cleanup = () => {\n this.off(FfiClientEvent.FfiEvent, listener);\n options?.signal?.removeEventListener('abort', onAbort);\n };\n\n // If an AbortSignal is provided, remove the listener when the signal\n // fires so that pending waitFor() calls don't leak listeners after\n // the room disconnects or the operation is cancelled.\n const onAbort = () => {\n cleanup();\n reject(options?.signal?.reason ?? new Error('waitFor aborted'));\n };\n\n if (options?.signal?.aborted) {\n reject(options.signal.reason ?? new Error('waitFor aborted'));\n return;\n }\n\n options?.signal?.addEventListener('abort', onAbort);\n this.on(FfiClientEvent.FfiEvent, listener);\n });\n }\n}\n"],"mappings":"AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,OAAO,kBAAkB;AACzB,SAAS,mBAAmB;AAQrB,IAAK,iBAAL,kBAAKA,oBAAL;AACL,EAAAA,gBAAA,cAAW;AADD,SAAAA;AAAA,GAAA;AASL,MAAM,kBAAmB,aAA4D;AAAA,EAW1F,cAAc;AACZ,UAAM;AAHR,SAAQ,sBAAsB,OAAO,CAAC;AAIpC,SAAK,gBAAgB,CAAC;AAEtB;AAAA,MACE,CAAC,eAA2B;AAC1B,cAAM,QAAQ,SAAS,WAAW,UAAU;AAC5C,aAAK,KAAK,4BAAyB,KAAK;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EArBA,WAAW,WAAsB;AAC/B,QAAI,CAAC,WAAW,oBAAoB;AAClC,iBAAW,qBAAqB,IAAI,UAAU;AAAA,IAChD;AACA,WAAO,WAAW;AAAA,EACpB;AAAA,EAkBA,QAAW,KAAoC;AAC7C,UAAM,UAAU,IAAI,WAAW,GAAG;AAClC,UAAM,WAAW,QAAQ,SAAS;AAClC,UAAM,WAAW,kBAAkB,QAAQ;AAC3C,WAAO,YAAY,WAAW,QAAQ,EAAE,QAAQ;AAAA,EAClD;AAAA,EAEA,WAAW,KAAa,KAAyB;AAC/C,WAAO,kBAAkB,KAAK,GAAG;AAAA,EACnC;AAAA,EAEA,YAAY,MAA0B;AACpC,WAAO,mBAAmB,IAAI;AAAA,EAChC;AAAA,EAEA,wBAAwB;AACtB,WAAO,EAAE,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,QACJ,WACA,SACY;AACZ,WAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AAlF/C;AAmFM,YAAM,WAAW,CAAC,OAAiB;AACjC,YAAI,UAAU,EAAE,GAAG;AACjB,kBAAQ;AACR,kBAAQ,GAAG,QAAQ,KAAU;AAAA,QAC/B;AAAA,MACF;AAEA,YAAM,UAAU,MAAM;AA1F5B,YAAAC;AA2FQ,aAAK,IAAI,4BAAyB,QAAQ;AAC1C,SAAAA,MAAA,mCAAS,WAAT,gBAAAA,IAAiB,oBAAoB,SAAS;AAAA,MAChD;AAKA,YAAM,UAAU,MAAM;AAlG5B,YAAAA;AAmGQ,gBAAQ;AACR,iBAAOA,MAAA,mCAAS,WAAT,gBAAAA,IAAiB,WAAU,IAAI,MAAM,iBAAiB,CAAC;AAAA,MAChE;AAEA,WAAI,wCAAS,WAAT,mBAAiB,SAAS;AAC5B,eAAO,QAAQ,OAAO,UAAU,IAAI,MAAM,iBAAiB,CAAC;AAC5D;AAAA,MACF;AAEA,+CAAS,WAAT,mBAAiB,iBAAiB,SAAS;AAC3C,WAAK,GAAG,4BAAyB,QAAQ;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;","names":["FfiClientEvent","_a"]}
@@ -1,29 +0,0 @@
1
- import {} from "./audio_frame.js";
2
- import {} from "./video_frame.js";
3
- const FrameProcessorSymbol = Symbol.for("lk.frame-processor");
4
- function isFrameProcessor(maybeProcessor) {
5
- return maybeProcessor !== null && typeof maybeProcessor === "object" && "symbol" in maybeProcessor && maybeProcessor.symbol === FrameProcessorSymbol;
6
- }
7
- class FrameProcessor {
8
- constructor() {
9
- this.symbol = FrameProcessorSymbol;
10
- }
11
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
- onStreamInfoUpdated(_info) {
13
- }
14
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
15
- onStreamInfoCleared() {
16
- }
17
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
18
- onCredentialsUpdated(_credentials) {
19
- }
20
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
21
- onCredentialsCleared() {
22
- }
23
- }
24
- export {
25
- FrameProcessor,
26
- FrameProcessorSymbol,
27
- isFrameProcessor
28
- };
29
- //# sourceMappingURL=frame_processor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/frame_processor.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { type AudioFrame } from './audio_frame.js';\nimport { type VideoFrame } from './video_frame.js';\n\nexport type FrameProcessorStreamInfo = {\n roomName: string;\n participantIdentity: string;\n publicationSid: string;\n};\n\nexport type FrameProcessorCredentials = {\n token: string;\n url: string;\n};\n\nexport const FrameProcessorSymbol = Symbol.for('lk.frame-processor');\n\nexport function isFrameProcessor<\n T extends FrameProcessor<AudioFrame> | FrameProcessor<VideoFrame> | unknown,\n>(\n maybeProcessor: unknown,\n): maybeProcessor is T extends FrameProcessor<AudioFrame>\n ? FrameProcessor<AudioFrame>\n : T extends FrameProcessor<VideoFrame>\n ? FrameProcessor<VideoFrame>\n : FrameProcessor<AudioFrame> | FrameProcessor<VideoFrame> {\n return (\n maybeProcessor !== null &&\n typeof maybeProcessor === 'object' &&\n 'symbol' in maybeProcessor &&\n maybeProcessor.symbol === FrameProcessorSymbol\n );\n}\n\nexport abstract class FrameProcessor<Frame extends VideoFrame | AudioFrame> {\n readonly symbol = FrameProcessorSymbol;\n\n abstract isEnabled(): boolean;\n abstract setEnabled(enabled: boolean): void;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onStreamInfoUpdated(_info: FrameProcessorStreamInfo): void {}\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onStreamInfoCleared(): void {}\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onCredentialsUpdated(_credentials: FrameProcessorCredentials): void {}\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onCredentialsCleared(): void {}\n\n abstract process(frame: Frame): Frame;\n abstract close(): void;\n}\n"],"mappings":"AAGA,eAAgC;AAChC,eAAgC;AAazB,MAAM,uBAAuB,OAAO,IAAI,oBAAoB;AAE5D,SAAS,iBAGd,gBAK4D;AAC5D,SACE,mBAAmB,QACnB,OAAO,mBAAmB,YAC1B,YAAY,kBACZ,eAAe,WAAW;AAE9B;AAEO,MAAe,eAAsD;AAAA,EAArE;AACL,SAAS,SAAS;AAAA;AAAA;AAAA,EAMlB,oBAAoB,OAAuC;AAAA,EAAC;AAAA;AAAA,EAE5D,sBAA4B;AAAA,EAAC;AAAA;AAAA,EAE7B,qBAAqB,cAA+C;AAAA,EAAC;AAAA;AAAA,EAErE,uBAA6B;AAAA,EAAC;AAIhC;","names":[]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport { AudioFrame, combineAudioFrames } from './audio_frame.js';\nexport { AudioResampler, AudioResamplerQuality } from './audio_resampler.js';\nexport { AudioSource } from './audio_source.js';\nexport { AudioStream } from './audio_stream.js';\nexport type { NoiseCancellationOptions } from './audio_stream.js';\nexport { AudioFilter } from './audio_filter.js';\nexport { AudioMixer, type AudioMixerOptions } from './audio_mixer.js';\nexport * from './data_streams/index.js';\nexport { E2EEManager, FrameCryptor, KeyProvider } from './e2ee.js';\nexport type { E2EEOptions, KeyProviderOptions } from './e2ee.js';\nexport { dispose } from './ffi_client.js';\nexport { LocalParticipant, Participant, RemoteParticipant } from './participant.js';\nexport { EncryptionState, EncryptionType } from '@livekit/rtc-ffi-bindings';\nexport {\n DisconnectReason,\n ParticipantKind,\n ParticipantKindDetail,\n} from '@livekit/rtc-ffi-bindings';\nexport {\n ConnectionQuality,\n ConnectionState,\n ContinualGatheringPolicy,\n DataPacketKind,\n IceServer,\n IceTransportType,\n TrackPublishOptions,\n} from '@livekit/rtc-ffi-bindings';\nexport {\n SimulateScenarioKind,\n StreamState,\n TrackKind,\n TrackSource,\n} from '@livekit/rtc-ffi-bindings';\nexport { VideoBufferType, VideoCodec, VideoRotation } from '@livekit/rtc-ffi-bindings';\nexport { ConnectError, Room, RoomEvent, type RoomOptions, type RtcConfiguration } from './room.js';\nexport { RpcError, type PerformRpcParams, type RpcInvocationData } from './rpc.js';\nexport {\n LocalAudioTrack,\n LocalVideoTrack,\n RemoteAudioTrack,\n RemoteVideoTrack,\n Track,\n type AudioTrack,\n type LocalTrack,\n type RemoteTrack,\n type VideoTrack,\n} from './track.js';\nexport {\n LocalTrackPublication,\n RemoteTrackPublication,\n TrackPublication,\n} from './track_publication.js';\nexport type { Transcription, TranscriptionSegment } from './transcription.js';\nexport type { ChatMessage } from './types.js';\nexport { VideoFrame } from './video_frame.js';\nexport { VideoSource } from './video_source.js';\nexport { VideoStream, type VideoFrameEvent } from './video_stream.js';\nexport {\n FrameProcessor,\n type FrameProcessorStreamInfo,\n type FrameProcessorCredentials,\n isFrameProcessor,\n} from './frame_processor.js';\n"],"mappings":"AAIA,SAAS,YAAY,0BAA0B;AAC/C,SAAS,gBAAgB,6BAA6B;AACtD,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAE5B,SAAS,mBAAmB;AAC5B,SAAS,kBAA0C;AACnD,cAAc;AACd,SAAS,aAAa,cAAc,mBAAmB;AAEvD,SAAS,eAAe;AACxB,SAAS,kBAAkB,aAAa,yBAAyB;AACjE,SAAS,iBAAiB,sBAAsB;AAChD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,YAAY,qBAAqB;AAC3D,SAAS,cAAc,MAAM,iBAA0D;AACvF,SAAS,gBAA+D;AACxE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,mBAAyC;AAClD;AAAA,EACE;AAAA,EAGA;AAAA,OACK;","names":[]}
package/dist/log.js DELETED
@@ -1,9 +0,0 @@
1
- import { pino } from "pino";
2
- const isProduction = process.env.NODE_ENV === "production";
3
- const defaultOptions = { name: "lk-rtc" };
4
- const log = pino(defaultOptions);
5
- log.level = isProduction ? "info" : "debug";
6
- export {
7
- log
8
- };
9
- //# sourceMappingURL=log.js.map
package/dist/log.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/log.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { LevelWithSilent, LoggerOptions } from 'pino';\nimport { pino } from 'pino';\n\nconst isProduction = process.env.NODE_ENV === 'production';\n\nconst defaultOptions: LoggerOptions = { name: 'lk-rtc' };\n\n/**\n * temporarily disabling the transport option as there might be a memory leak in some corner cases related to it\n * see https://github.com/pinojs/pino/issues/2370\n */\n// const devOptions: LoggerOptions = {\n// ...defaultOptions,\n// transport: {\n// target: 'pino-pretty',\n// options: {\n// colorize: true,\n// },\n// },\n// };\n\nconst log = pino(defaultOptions);\nlog.level = isProduction ? 'info' : 'debug';\n\nexport type LogLevel = LevelWithSilent;\nexport { log };\n"],"mappings":"AAIA,SAAS,YAAY;AAErB,MAAM,eAAe,QAAQ,IAAI,aAAa;AAE9C,MAAM,iBAAgC,EAAE,MAAM,SAAS;AAgBvD,MAAM,MAAM,KAAK,cAAc;AAC/B,IAAI,QAAQ,eAAe,SAAS;","names":[]}