@simplito/privmx-webendpoint 2.6.5 → 2.7.1

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 (177) hide show
  1. package/CONTRIBUTING.md +86 -0
  2. package/README.md +97 -7
  3. package/assets/driver-web-context.js +1 -1
  4. package/assets/e2ee-worker.js +1 -1
  5. package/assets/endpoint-wasm-module.js +2 -2
  6. package/assets/endpoint-wasm-module.wasm +0 -0
  7. package/assets/rms-processor.js +1 -0
  8. package/build-manifest.sh +6 -0
  9. package/{FinalizationHelper.js → dist/FinalizationHelper.js} +1 -1
  10. package/dist/ServerTypes.d.ts +7 -0
  11. package/{Types.d.ts → dist/Types.d.ts} +97 -10
  12. package/{Types.js → dist/Types.js} +17 -32
  13. package/{api → dist/api}/Api.d.ts +2 -0
  14. package/{api → dist/api}/Api.js +18 -1
  15. package/{api → dist/api}/ConnectionNative.js +1 -1
  16. package/{api → dist/api}/CryptoApiNative.js +1 -2
  17. package/{api → dist/api}/InboxApiNative.d.ts +21 -2
  18. package/{api → dist/api}/KvdbApiNative.d.ts +19 -2
  19. package/dist/api/NativeError.d.ts +13 -0
  20. package/dist/api/NativeError.js +20 -0
  21. package/{api → dist/api}/StoreApiNative.d.ts +19 -2
  22. package/dist/api/StreamApiNative.d.ts +72 -0
  23. package/dist/api/StreamApiNative.js +142 -0
  24. package/{api → dist/api}/ThreadApiNative.d.ts +19 -2
  25. package/dist/assets/e2ee-worker.js +1 -0
  26. package/dist/bundle/privmx-endpoint-web.js +2 -0
  27. package/dist/bundle/privmx-endpoint-web.js.LICENSE.txt +30 -0
  28. package/dist/bundle/rms-processor.js +1 -0
  29. package/{extra → dist/extra}/PrivmxClient.d.ts +9 -9
  30. package/{extra → dist/extra}/PrivmxClient.js +12 -12
  31. package/{extra → dist/extra}/PublicConnection.d.ts +2 -2
  32. package/{extra → dist/extra}/PublicConnection.js +2 -2
  33. package/{extra → dist/extra}/__tests__/connectionEventManager.test.js +1 -3
  34. package/{extra → dist/extra}/__tests__/customEventManager.test.js +1 -3
  35. package/{extra → dist/extra}/__tests__/userEventManager.test.js +2 -6
  36. package/{extra → dist/extra}/__tests__/utils.test.js +18 -18
  37. package/{extra → dist/extra}/events.js +32 -12
  38. package/{extra → dist/extra}/files.d.ts +5 -5
  39. package/{extra → dist/extra}/files.js +11 -11
  40. package/{extra → dist/extra}/generics.d.ts +1 -1
  41. package/{extra → dist/extra}/inbox.d.ts +1 -1
  42. package/{extra → dist/extra}/inbox.js +2 -2
  43. package/{extra → dist/extra}/index.d.ts +7 -7
  44. package/{extra → dist/extra}/managers.js +1 -1
  45. package/{extra → dist/extra}/utils.js +9 -9
  46. package/{index.d.ts → dist/index.d.ts} +3 -2
  47. package/{index.js → dist/index.js} +4 -1
  48. package/{service → dist/service}/Connection.js +13 -6
  49. package/{service → dist/service}/CryptoApi.js +2 -8
  50. package/{service → dist/service}/EndpointFactory.d.ts +11 -0
  51. package/{service → dist/service}/EndpointFactory.js +45 -10
  52. package/{service → dist/service}/EventApi.js +9 -5
  53. package/dist/service/EventDispatcher.d.ts +15 -0
  54. package/dist/service/EventDispatcher.js +25 -0
  55. package/{service → dist/service}/EventQueue.d.ts +4 -4
  56. package/{service → dist/service}/EventQueue.js +5 -9
  57. package/{service → dist/service}/ExtKey.d.ts +10 -10
  58. package/{service → dist/service}/ExtKey.js +10 -10
  59. package/{service → dist/service}/InboxApi.js +7 -11
  60. package/{service → dist/service}/KvdbApi.js +12 -7
  61. package/{service → dist/service}/StoreApi.js +10 -15
  62. package/dist/service/StreamApi.d.ts +237 -0
  63. package/dist/service/StreamApi.js +442 -0
  64. package/{service → dist/service}/ThreadApi.js +6 -7
  65. package/{service → dist/service}/UserVerifierInterface.d.ts +2 -2
  66. package/dist/service/UserVerifierInterface.js +2 -0
  67. package/dist/service/WebRtcInterface.d.ts +58 -0
  68. package/dist/service/WebRtcInterface.js +8 -0
  69. package/{service → dist/service}/index.d.ts +3 -2
  70. package/{service → dist/service}/index.js +5 -3
  71. package/dist/webStreams/CryptoUtils.d.ts +24 -0
  72. package/dist/webStreams/CryptoUtils.js +58 -0
  73. package/dist/webStreams/KeyStore.d.ts +9 -0
  74. package/dist/webStreams/KeyStore.js +29 -0
  75. package/dist/webStreams/Logger.d.ts +7 -0
  76. package/dist/webStreams/Logger.js +25 -0
  77. package/dist/webStreams/PeerConnectionsManager.d.ts +20 -0
  78. package/dist/webStreams/PeerConnectionsManager.js +92 -0
  79. package/dist/webStreams/Queue.d.ts +19 -0
  80. package/dist/webStreams/Queue.js +70 -0
  81. package/dist/webStreams/Utils.d.ts +20 -0
  82. package/dist/webStreams/Utils.js +211 -0
  83. package/dist/webStreams/WebRtcClient.d.ts +85 -0
  84. package/dist/webStreams/WebRtcClient.js +437 -0
  85. package/dist/webStreams/WebRtcClientTypes.d.ts +64 -0
  86. package/dist/webStreams/WebRtcClientTypes.js +2 -0
  87. package/dist/webStreams/WebRtcConfig.d.ts +20 -0
  88. package/dist/webStreams/WebRtcConfig.js +53 -0
  89. package/dist/webStreams/WebRtcInterfaceImpl.d.ts +28 -0
  90. package/dist/webStreams/WebRtcInterfaceImpl.js +85 -0
  91. package/dist/webStreams/WebWorkerHelper copy.d.ts +0 -0
  92. package/dist/webStreams/WebWorkerHelper copy.js +17 -0
  93. package/dist/webStreams/WebWorkerHelper.d.ts +18 -0
  94. package/dist/webStreams/WebWorkerHelper.js +69 -0
  95. package/dist/webStreams/audio/ActiveSpeakerDetector.d.ts +38 -0
  96. package/dist/webStreams/audio/ActiveSpeakerDetector.js +64 -0
  97. package/dist/webStreams/audio/LocalAudioLevelMeter.d.ts +12 -0
  98. package/dist/webStreams/audio/LocalAudioLevelMeter.js +101 -0
  99. package/dist/webStreams/types/ApiTypes.d.ts +74 -0
  100. package/dist/webStreams/types/ApiTypes.js +2 -0
  101. package/dist/webStreams/types/BaseServerTypes.d.ts +10 -0
  102. package/dist/webStreams/types/BaseServerTypes.js +2 -0
  103. package/dist/webStreams/types/MediaServerWebSocketApiTypes.d.ts +255 -0
  104. package/dist/webStreams/types/MediaServerWebSocketApiTypes.js +2 -0
  105. package/dist/webStreams/types/SignalingReceiverTypes.d.ts +13 -0
  106. package/dist/webStreams/types/SignalingReceiverTypes.js +2 -0
  107. package/dist/webStreams/types/SignalingSenderTypes.d.ts +24 -0
  108. package/dist/webStreams/types/SignalingSenderTypes.js +2 -0
  109. package/dist/webStreams/types/StreamsApiTypes.d.ts +144 -0
  110. package/dist/webStreams/types/StreamsApiTypes.js +2 -0
  111. package/dist/webStreams/worker/WorkerEvents.d.ts +11 -0
  112. package/dist/webStreams/worker/WorkerEvents.js +2 -0
  113. package/dist/webStreams/worker/worker.d.ts +13 -0
  114. package/dist/webStreams/worker/worker.js +202 -0
  115. package/package.json +46 -15
  116. package/assets/endpoint-wasm-module.worker.js +0 -1
  117. package/assets/privmx-endpoint-web.js +0 -2
  118. package/bundle/privmx-endpoint-web.js +0 -2
  119. package/bundle/privmx-endpoint-web.js.LICENSE.txt +0 -10
  120. /package/{FinalizationHelper.d.ts → dist/FinalizationHelper.d.ts} +0 -0
  121. /package/{extra/generics.js → dist/ServerTypes.js} +0 -0
  122. /package/{api → dist/api}/ApiStatic.d.ts +0 -0
  123. /package/{api → dist/api}/ApiStatic.js +0 -0
  124. /package/{api → dist/api}/BaseNative.d.ts +0 -0
  125. /package/{api → dist/api}/BaseNative.js +0 -0
  126. /package/{api → dist/api}/ConnectionNative.d.ts +0 -0
  127. /package/{api → dist/api}/CryptoApiNative.d.ts +0 -0
  128. /package/{api → dist/api}/EventApiNative.d.ts +0 -0
  129. /package/{api → dist/api}/EventApiNative.js +0 -0
  130. /package/{api → dist/api}/EventQueueNative.d.ts +0 -0
  131. /package/{api → dist/api}/EventQueueNative.js +0 -0
  132. /package/{api → dist/api}/ExtKeyNative.d.ts +0 -0
  133. /package/{api → dist/api}/ExtKeyNative.js +0 -0
  134. /package/{api → dist/api}/IdGenerator.d.ts +0 -0
  135. /package/{api → dist/api}/IdGenerator.js +0 -0
  136. /package/{api → dist/api}/InboxApiNative.js +0 -0
  137. /package/{api → dist/api}/KvdbApiNative.js +0 -0
  138. /package/{api → dist/api}/StoreApiNative.js +0 -0
  139. /package/{api → dist/api}/ThreadApiNative.js +0 -0
  140. /package/{bundle.d.ts → dist/bundle.d.ts} +0 -0
  141. /package/{bundle.js → dist/bundle.js} +0 -0
  142. /package/{extra → dist/extra}/__mocks__/constants.d.ts +0 -0
  143. /package/{extra → dist/extra}/__mocks__/constants.js +0 -0
  144. /package/{extra → dist/extra}/__mocks__/mockContainerSubscriber.d.ts +0 -0
  145. /package/{extra → dist/extra}/__mocks__/mockContainerSubscriber.js +0 -0
  146. /package/{extra → dist/extra}/__mocks__/mockEventQueue.d.ts +0 -0
  147. /package/{extra → dist/extra}/__mocks__/mockEventQueue.js +0 -0
  148. /package/{extra → dist/extra}/__mocks__/utils.d.ts +0 -0
  149. /package/{extra → dist/extra}/__mocks__/utils.js +0 -0
  150. /package/{extra → dist/extra}/__tests__/connectionEventManager.test.d.ts +0 -0
  151. /package/{extra → dist/extra}/__tests__/customEventManager.test.d.ts +0 -0
  152. /package/{extra → dist/extra}/__tests__/eventsManager.test.d.ts +0 -0
  153. /package/{extra → dist/extra}/__tests__/eventsManager.test.js +0 -0
  154. /package/{extra → dist/extra}/__tests__/inboxEventManager.d.ts +0 -0
  155. /package/{extra → dist/extra}/__tests__/inboxEventManager.js +0 -0
  156. /package/{extra → dist/extra}/__tests__/storeEventManager.test.d.ts +0 -0
  157. /package/{extra → dist/extra}/__tests__/storeEventManager.test.js +0 -0
  158. /package/{extra → dist/extra}/__tests__/threadEventManager.test.d.ts +0 -0
  159. /package/{extra → dist/extra}/__tests__/threadEventManager.test.js +0 -0
  160. /package/{extra → dist/extra}/__tests__/userEventManager.test.d.ts +0 -0
  161. /package/{extra → dist/extra}/__tests__/utils.test.d.ts +0 -0
  162. /package/{extra → dist/extra}/events.d.ts +0 -0
  163. /package/{service/UserVerifierInterface.js → dist/extra/generics.js} +0 -0
  164. /package/{extra → dist/extra}/index.js +0 -0
  165. /package/{extra → dist/extra}/managers.d.ts +0 -0
  166. /package/{extra → dist/extra}/subscriptions.d.ts +0 -0
  167. /package/{extra → dist/extra}/subscriptions.js +0 -0
  168. /package/{extra → dist/extra}/utils.d.ts +0 -0
  169. /package/{service → dist/service}/BaseApi.d.ts +0 -0
  170. /package/{service → dist/service}/BaseApi.js +0 -0
  171. /package/{service → dist/service}/Connection.d.ts +0 -0
  172. /package/{service → dist/service}/CryptoApi.d.ts +0 -0
  173. /package/{service → dist/service}/EventApi.d.ts +0 -0
  174. /package/{service → dist/service}/InboxApi.d.ts +0 -0
  175. /package/{service → dist/service}/KvdbApi.d.ts +0 -0
  176. /package/{service → dist/service}/StoreApi.d.ts +0 -0
  177. /package/{service → dist/service}/ThreadApi.d.ts +0 -0
@@ -0,0 +1,255 @@
1
+ export type SessionId = string & {
2
+ _sessionId: never;
3
+ };
4
+ export type TransactionId = string & {
5
+ _transactionId: never;
6
+ };
7
+ export type PluginHandleId = number & {
8
+ _pluginHandleId: never;
9
+ };
10
+ export type PluginId = string & {
11
+ _pluginId: never;
12
+ };
13
+ export type UserToken = string & {
14
+ _userToken: never;
15
+ };
16
+ export type VideoRoomRequestStatus = string & {
17
+ _videoRoomStatus: never;
18
+ };
19
+ export type VideoRoomId = number & {
20
+ _videoRoomId: never;
21
+ };
22
+ export type VideoRoomParticipantId = number & {
23
+ _videoRoomParticipantId: never;
24
+ };
25
+ export type VideoRoomPublisherId = number & {
26
+ _videoRoomPublisherId: never;
27
+ };
28
+ export interface JanusSession {
29
+ id: SessionId;
30
+ }
31
+ export interface JanusStreamInfo {
32
+ type: "audio" | "video" | "data";
33
+ active: boolean;
34
+ mid: string;
35
+ mindex: number;
36
+ ready: boolean;
37
+ send: boolean;
38
+ source_ids: VideoRoomParticipantId[];
39
+ sources: number;
40
+ }
41
+ export interface JanusPluginHandle {
42
+ id: PluginHandleId;
43
+ pluginId: PluginId;
44
+ }
45
+ export interface VideoRoom {
46
+ room: VideoRoomId;
47
+ description: string;
48
+ pin_required: boolean;
49
+ is_private: boolean;
50
+ max_publishers: number;
51
+ bitrate: number;
52
+ bitrate_cap: number;
53
+ fir_freq: number;
54
+ require_pvtid: boolean;
55
+ require_e2ee: boolean;
56
+ dummy_publisher: boolean;
57
+ notify_joining: boolean;
58
+ audiocodec: string;
59
+ videocodec: string;
60
+ opus_fec: boolean;
61
+ opus_dtx: boolean;
62
+ record: boolean;
63
+ rec_dir: string;
64
+ lock_record: boolean;
65
+ num_participants: number;
66
+ audiolevel_ext: boolean;
67
+ audiolevel_event: boolean;
68
+ audio_active_packets: number;
69
+ audio_level_average: number;
70
+ videoorient_ext: boolean;
71
+ playoutdelay_ext: boolean;
72
+ transport_wide_cc_ext: boolean;
73
+ }
74
+ export interface PublisherInfo {
75
+ id: string;
76
+ display: string;
77
+ dummy: boolean;
78
+ streams: StreamInfo[];
79
+ talking: boolean;
80
+ }
81
+ export interface StreamInfo {
82
+ type: string;
83
+ mindex: string;
84
+ mid: string;
85
+ disabled: boolean;
86
+ codec: string;
87
+ description: string;
88
+ moderated: boolean;
89
+ simulcast: boolean;
90
+ svc: boolean;
91
+ talking: boolean;
92
+ }
93
+ export interface VideoRoomParticipant {
94
+ id: VideoRoomParticipantId;
95
+ display: string;
96
+ publisher: boolean;
97
+ talking: boolean;
98
+ }
99
+ export interface CreateRoomOptions {
100
+ room?: string;
101
+ permanent?: boolean;
102
+ description?: string;
103
+ secret?: string;
104
+ pin?: string;
105
+ is_private?: boolean;
106
+ allowed?: UserToken[];
107
+ publishers?: number;
108
+ }
109
+ export interface CreateRoomResult {
110
+ videoroom: "created";
111
+ room: VideoRoomId;
112
+ permanent: boolean;
113
+ }
114
+ export interface EditRoomOptions {
115
+ room: VideoRoomId;
116
+ new_description?: string;
117
+ }
118
+ export interface EditRoomResult {
119
+ videoroom: "edited";
120
+ room: VideoRoomId;
121
+ permanent: boolean;
122
+ }
123
+ export interface DestroyRoomOptions {
124
+ room: VideoRoomId;
125
+ secret?: string;
126
+ permanent?: boolean;
127
+ }
128
+ export interface DestroyRoomResult {
129
+ videoroom: "destroyed";
130
+ room: VideoRoomId;
131
+ permanent: boolean;
132
+ }
133
+ export interface RoomExistsOptions {
134
+ room: VideoRoomId;
135
+ }
136
+ export interface RoomExistsResult {
137
+ room: VideoRoomId;
138
+ exists: boolean;
139
+ }
140
+ export interface SetRoomRestrictedAccessOptions {
141
+ secret?: string;
142
+ action: "enable" | "disable";
143
+ room: VideoRoomId;
144
+ }
145
+ export interface SetRoomAccessAllowedOptions {
146
+ secret?: string;
147
+ action: "add" | "remove";
148
+ room: VideoRoomId;
149
+ allowed: string[];
150
+ }
151
+ export interface RoomAccessResult {
152
+ room: VideoRoomId;
153
+ allowed?: string[];
154
+ }
155
+ export interface RoomKickOptions {
156
+ secret?: string;
157
+ room: VideoRoomId;
158
+ id: VideoRoomParticipantId;
159
+ }
160
+ export interface RoomModerateOptions {
161
+ secret?: string;
162
+ room: VideoRoomId;
163
+ id: VideoRoomParticipantId;
164
+ mid: string;
165
+ mute: boolean;
166
+ }
167
+ export interface RoomListParticipantsOptions {
168
+ room: VideoRoomId;
169
+ }
170
+ export interface RoomListResult {
171
+ list: VideoRoom[];
172
+ }
173
+ export interface RoomListParticipantsResult {
174
+ room: VideoRoomId;
175
+ participants: VideoRoomParticipant[];
176
+ }
177
+ export interface RoomJoinAsPublisherOptions {
178
+ room: VideoRoomId;
179
+ id?: VideoRoomParticipantId;
180
+ display?: string;
181
+ token?: string;
182
+ }
183
+ export interface RoomJoinAsSubscriberOptions {
184
+ room: VideoRoomId;
185
+ use_msid?: boolean;
186
+ autoupdate?: boolean;
187
+ private_id?: string;
188
+ streams: RoomJoinStreamOptions[];
189
+ data: boolean;
190
+ }
191
+ export interface RoomJoinStreamOptions {
192
+ feed: number;
193
+ mid?: string;
194
+ crossrefid?: string;
195
+ }
196
+ export interface VideoRoomDescription {
197
+ mid: string;
198
+ description?: string;
199
+ }
200
+ export interface RoomPublishOptions {
201
+ videocodec?: string;
202
+ bitrate?: number;
203
+ record?: boolean;
204
+ filename?: string;
205
+ display?: string;
206
+ audio_level_average?: number;
207
+ audio_active_packets?: any;
208
+ descriptions?: VideoRoomDescription[];
209
+ e2ee?: boolean;
210
+ data: boolean;
211
+ }
212
+ export interface VideoRoomStreamTrack {
213
+ type: string;
214
+ codec: string;
215
+ mid: string;
216
+ mindex: number;
217
+ }
218
+ export interface NewPublisherEvent {
219
+ id: VideoRoomPublisherId;
220
+ video_codec: string;
221
+ streams: VideoRoomStreamTrack[];
222
+ }
223
+ export interface JoinedEvent {
224
+ room: VideoRoomId;
225
+ description: string;
226
+ id: number;
227
+ private_id: number;
228
+ publishers: NewPublisherEvent[];
229
+ }
230
+ export type MediaServerSignallingEvent = WebRTCMediaEvent | WebRTCSHangupEvent | WebRTCSlowLinkEvent | WebRTCUpEvent;
231
+ export interface WebRTCUpEvent {
232
+ eventType: "webrtcup";
233
+ session_id: string;
234
+ sender: string;
235
+ }
236
+ export interface WebRTCMediaEvent {
237
+ eventType: "media";
238
+ session_id: string;
239
+ sender: string;
240
+ type: "audio" | "video" | "data";
241
+ receiving: boolean;
242
+ }
243
+ export interface WebRTCSlowLinkEvent {
244
+ eventType: "slowlink";
245
+ session_id: string;
246
+ sender: string;
247
+ uplink: boolean;
248
+ nacks: number;
249
+ }
250
+ export interface WebRTCSHangupEvent {
251
+ eventType: "hangup";
252
+ session_id: string;
253
+ sender: string;
254
+ reason: string;
255
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { AppRequest } from "./BaseServerTypes";
2
+ import { JanusPluginHandle, SessionId } from "./MediaServerWebSocketApiTypes";
3
+ export interface AcceptOfferRequest extends AppRequest {
4
+ kind: "signaling.acceptOffer";
5
+ data: {
6
+ session_id: SessionId;
7
+ handle: JanusPluginHandle;
8
+ answer: any;
9
+ };
10
+ }
11
+ export interface CreateSessionRequest extends AppRequest {
12
+ kind: "signaling.createSession";
13
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,24 @@
1
+ import { JanusPluginHandle, JanusStreamInfo, SessionId } from "./MediaServerWebSocketApiTypes";
2
+ export type SignalingSenderEventType = "subscriberAttached" | "streamConfigured";
3
+ export interface BaseEvent {
4
+ kind: "media-event" | "event";
5
+ type: SignalingSenderEventType;
6
+ }
7
+ export interface MediaEvent extends BaseEvent {
8
+ sub?: string;
9
+ data?: any;
10
+ }
11
+ export interface SubscriberAttached {
12
+ session_id: SessionId;
13
+ handle: JanusPluginHandle;
14
+ room: any;
15
+ streams: JanusStreamInfo[];
16
+ offer: any;
17
+ }
18
+ export interface StreamConfigured {
19
+ answer: any;
20
+ }
21
+ export interface SignalingSenderInterface {
22
+ onSubscriberAttached(model: SubscriberAttached): void;
23
+ onStreamConfigured(model: StreamConfigured): void;
24
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,144 @@
1
+ import { AppRequest } from "./BaseServerTypes";
2
+ import * as Types from "./ApiTypes";
3
+ export interface StreamRoomCreateRequest extends AppRequest {
4
+ kind: "streams.streamRoomCreate";
5
+ data: {
6
+ contextId: string;
7
+ users: Types.UserWithPubKey[];
8
+ managers: Types.UserWithPubKey[];
9
+ privateMeta: Uint8Array;
10
+ publicMeta: Uint8Array;
11
+ };
12
+ }
13
+ export interface StreamRoomUpdateRequest extends AppRequest {
14
+ kind: "streams.streamRoomUpdate";
15
+ data: {
16
+ streamRoomId: Types.StreamRoomId;
17
+ users: Types.UserWithPubKey[];
18
+ managers: Types.UserWithPubKey[];
19
+ privateMeta: string;
20
+ publicMeta: string;
21
+ };
22
+ }
23
+ export interface StreamRoomGetRequest extends AppRequest {
24
+ kind: "streams.streamRoomGet";
25
+ data: {
26
+ streamRoomId: Types.StreamRoomId;
27
+ };
28
+ }
29
+ export interface StreamRoomListRequest extends AppRequest {
30
+ kind: "streams.streamRoomList";
31
+ data: {
32
+ contextId: string;
33
+ query: Types.ListQuery;
34
+ };
35
+ }
36
+ export interface StreamRoomDeleteRequest extends AppRequest {
37
+ kind: "streams.streamRoomDelete";
38
+ data: {
39
+ streamRoomId: Types.StreamRoomId;
40
+ };
41
+ }
42
+ export interface StreamCreateRequest extends AppRequest {
43
+ kind: "streams.streamCreate";
44
+ data: {
45
+ streamRoomId: Types.StreamRoomId;
46
+ meta?: Types.StreamCreateMeta;
47
+ };
48
+ }
49
+ export interface StreamUpdateRequest extends AppRequest {
50
+ kind: "streams.streamUpdate";
51
+ data: {
52
+ streamId: Types.StreamId;
53
+ meta: Types.StreamCreateMeta;
54
+ };
55
+ }
56
+ export interface StreamListRequest extends AppRequest {
57
+ kind: "streams.streamList";
58
+ data: {
59
+ streamRoomId: Types.StreamRoomId;
60
+ query: Types.ListQuery;
61
+ };
62
+ }
63
+ export interface StreamGetRequest extends AppRequest {
64
+ kind: "streams.streamGet";
65
+ data: {
66
+ streamRoomId: Types.StreamRoomId;
67
+ streamId: Types.StreamId;
68
+ };
69
+ }
70
+ export interface StreamDeleteRequest extends AppRequest {
71
+ kind: "streams.streamDelete";
72
+ data: {
73
+ streamRoomId: Types.StreamRoomId;
74
+ streamId: Types.StreamId;
75
+ };
76
+ }
77
+ export interface StreamDataTrackAddRequest extends AppRequest {
78
+ kind: "streams.streamDataTrackAdd";
79
+ data: {
80
+ streamRoomId: Types.StreamRoomId;
81
+ streamTrackId: Types.StreamTrackId;
82
+ streamId: Types.StreamId;
83
+ meta: Types.DataChannelMeta;
84
+ };
85
+ }
86
+ export interface StreamTrackRemoveRequest extends AppRequest {
87
+ kind: "streams.streamTrackRemove";
88
+ data: {
89
+ streamId: Types.StreamId;
90
+ streamRoomId: Types.StreamRoomId;
91
+ streamTrackId: Types.StreamTrackId;
92
+ };
93
+ }
94
+ export interface StreamTrackListRequest extends AppRequest {
95
+ kind: "streams.streamTrackList";
96
+ data: {
97
+ streamId: Types.StreamId;
98
+ streamRoomId: Types.StreamRoomId;
99
+ };
100
+ }
101
+ export interface StreamTrackSendDataRequest extends AppRequest {
102
+ kind: "streams.streamTrackSendData";
103
+ data: {
104
+ streamTrackId: Types.StreamTrackId;
105
+ data: Buffer;
106
+ };
107
+ }
108
+ export interface StreamPublishRequest extends AppRequest {
109
+ kind: "streams.streamPublish";
110
+ data: {
111
+ streamRoomId: Types.StreamRoomId;
112
+ streamId: Types.StreamId;
113
+ streamMeta?: Types.StreamCreateMeta;
114
+ peerConnectionOffer: any;
115
+ };
116
+ }
117
+ export interface StreamUnpublishRequest extends AppRequest {
118
+ kind: "streams.streamUnpublish";
119
+ data: {
120
+ streamRoomId: Types.StreamRoomId;
121
+ streamId: Types.StreamId;
122
+ };
123
+ }
124
+ export interface StreamJoinRequest extends AppRequest {
125
+ kind: "streams.streamJoin";
126
+ data: {
127
+ streamRoomId: Types.StreamRoomId;
128
+ streamToJoin: Types.StreamAndTracksSelector;
129
+ };
130
+ }
131
+ export interface StreamLeaveRequest extends AppRequest {
132
+ kind: "streams.streamLeave";
133
+ data: {
134
+ streamToLeave: Types.StreamAndTracksSelector;
135
+ };
136
+ }
137
+ export interface StreamDataChannelSendRequest extends AppRequest {
138
+ kind: "streams.dataChannelSend";
139
+ data: {
140
+ streamRoomId: Types.StreamRoomId;
141
+ streamId: Types.StreamId;
142
+ data: string;
143
+ };
144
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,11 @@
1
+ import { Key } from "../../Types";
2
+ export interface WorkerBaseEvent {
3
+ operation: string;
4
+ }
5
+ export interface InitializeEvent extends WorkerBaseEvent {
6
+ operation: "initialize";
7
+ }
8
+ export interface SetKeysEvent extends WorkerBaseEvent {
9
+ operation: "setKeys";
10
+ keys: Key[];
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { KeyStore } from "../KeyStore";
2
+ export interface TransformContext {
3
+ keyStore: KeyStore;
4
+ id?: string;
5
+ publisherId?: number;
6
+ }
7
+ export declare class EncryptTransform {
8
+ private keyStore;
9
+ constructor(keyStore: KeyStore);
10
+ private getHeaderSizeByType;
11
+ encryptFrame(encodedFrame: RTCEncodedAudioFrame | RTCEncodedVideoFrame, kind: string, controller: TransformStreamDefaultController<any>): Promise<void>;
12
+ decryptFrame(encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame, kind: string, controller: TransformStreamDefaultController<any>, receiverId?: string, publisherId?: number): Promise<void>;
13
+ }
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EncryptTransform = void 0;
4
+ const Utils_1 = require("../Utils");
5
+ const CryptoUtils_1 = require("../CryptoUtils");
6
+ const KeyStore_1 = require("../KeyStore");
7
+ const NUM_AS_UINT8_SIZE = 1;
8
+ const DEBUG = false;
9
+ const sessions = new Map();
10
+ const pipelines = new Map();
11
+ let lastRMS = -99;
12
+ let recvRMS = -99;
13
+ let recvRMSTimestamp = Date.now();
14
+ class EncryptTransform {
15
+ keyStore;
16
+ constructor(keyStore) {
17
+ this.keyStore = keyStore;
18
+ }
19
+ getHeaderSizeByType(type) {
20
+ if (type === "key")
21
+ return 10;
22
+ if (type === "delta")
23
+ return 3;
24
+ if (type === "empty")
25
+ return 1;
26
+ return 0;
27
+ }
28
+ async encryptFrame(encodedFrame, kind, controller) {
29
+ const headerLen = kind === "video" ? this.getHeaderSizeByType(encodedFrame.type) : 1;
30
+ const frameHeader = new Uint8Array(encodedFrame.data, 0, headerLen);
31
+ const frameBody = new Uint8Array(encodedFrame.data, headerLen);
32
+ const iv = Utils_1.Utils.genIvAsBuffer();
33
+ const keyEntry = this.keyStore.getEncriptionKey();
34
+ const cryptoResult = await (0, CryptoUtils_1.encryptWithAES256GCM)(keyEntry.key, iv, frameBody, frameHeader);
35
+ if (!(0, CryptoUtils_1.isEncryptionSuccess)(cryptoResult)) {
36
+ throw new Error("Cannot encrypt frame");
37
+ }
38
+ const keyIdAsUint8 = new TextEncoder().encode(keyEntry.keyId);
39
+ const posOfCipher = frameHeader.byteLength;
40
+ const posOfIv = posOfCipher + cryptoResult.data.byteLength;
41
+ const posOfIvSize = posOfIv + iv.byteLength;
42
+ const posOfKeyId = posOfIvSize + NUM_AS_UINT8_SIZE;
43
+ const posOfKeyIdSize = posOfKeyId + keyIdAsUint8.byteLength;
44
+ const posOfRMS = posOfKeyIdSize + NUM_AS_UINT8_SIZE;
45
+ const result = new ArrayBuffer(posOfRMS + NUM_AS_UINT8_SIZE);
46
+ const resultUint8 = new Uint8Array(result);
47
+ resultUint8.set(frameHeader);
48
+ resultUint8.set(new Uint8Array(cryptoResult.data), posOfCipher);
49
+ resultUint8.set(iv, posOfIv);
50
+ resultUint8.set(Utils_1.Utils.numAsOneByteUint(iv.byteLength), posOfIvSize);
51
+ resultUint8.set(keyIdAsUint8, posOfKeyId);
52
+ resultUint8.set(Utils_1.Utils.numAsOneByteUint(keyIdAsUint8.byteLength), posOfKeyIdSize);
53
+ resultUint8.set(Utils_1.Utils.numAsOneByteUint(lastRMS + 100), posOfRMS);
54
+ encodedFrame.data = result;
55
+ controller.enqueue(encodedFrame);
56
+ }
57
+ async decryptFrame(encodedFrame, kind, controller, receiverId, publisherId) {
58
+ const headerLen = kind === "video"
59
+ ? this.getHeaderSizeByType(encodedFrame.type)
60
+ : 1;
61
+ const data = encodedFrame.data;
62
+ if (data.byteLength < headerLen + 5) {
63
+ // Sanity check for minimum metadata size
64
+ controller.enqueue(encodedFrame);
65
+ return;
66
+ }
67
+ const frameHeader = new Uint8Array(data, 0, headerLen);
68
+ const rmsPos = data.byteLength - 1;
69
+ recvRMS = new Uint8Array(data, rmsPos, 1)[0] - 100;
70
+ const currTime = Date.now();
71
+ if (recvRMSTimestamp + 100 < currTime) {
72
+ recvRMSTimestamp = currTime;
73
+ self.postMessage({ type: "rms", rms: recvRMS, receiverId, publisherId });
74
+ }
75
+ const keyIdLenPos = rmsPos - 1;
76
+ const keyIdLen = new Uint8Array(data, keyIdLenPos, 1)[0];
77
+ const keyIdPos = keyIdLenPos - keyIdLen;
78
+ const keyId = new TextDecoder().decode(new Uint8Array(data, keyIdPos, keyIdLen));
79
+ const ivLenPos = keyIdPos - 1;
80
+ const ivLen = new Uint8Array(data, ivLenPos, 1)[0];
81
+ const ivPos = ivLenPos - ivLen;
82
+ const iv = new Uint8Array(data, ivPos, ivLen);
83
+ const payloadPos = headerLen;
84
+ const payloadLen = ivPos - headerLen;
85
+ const payload = data.slice(payloadPos, payloadPos + payloadLen);
86
+ try {
87
+ if (!this.keyStore.hasKey(keyId)) {
88
+ controller.enqueue(encodedFrame);
89
+ return;
90
+ }
91
+ const keyEntry = this.keyStore.getKey(keyId);
92
+ const decryptionResult = await (0, CryptoUtils_1.decryptWithAES256GCM)(keyEntry.key, iv, payload, frameHeader);
93
+ if (!(0, CryptoUtils_1.isDecryptionSuccess)(decryptionResult)) {
94
+ controller.enqueue(encodedFrame);
95
+ return;
96
+ }
97
+ const plain = decryptionResult.data;
98
+ const result = new ArrayBuffer(frameHeader.byteLength + plain.byteLength);
99
+ const writableResult = new Uint8Array(result);
100
+ writableResult.set(frameHeader);
101
+ writableResult.set(new Uint8Array(plain), frameHeader.byteLength);
102
+ encodedFrame.data = result;
103
+ controller.enqueue(encodedFrame);
104
+ }
105
+ catch (e) {
106
+ logError(e);
107
+ controller.enqueue(encodedFrame);
108
+ }
109
+ }
110
+ }
111
+ exports.EncryptTransform = EncryptTransform;
112
+ self.keyStore = new KeyStore_1.KeyStore();
113
+ const getKeyStore = () => self.keyStore;
114
+ self.onmessage = async (event) => {
115
+ const { operation, kind } = event.data;
116
+ if (operation === "initialize") {
117
+ logDebug("worker initialize call");
118
+ }
119
+ else if (operation === "init-pipeline") {
120
+ pipelines.set(event.data.id, { ready: false });
121
+ self.postMessage({ operation: "init-pipeline", id: event.data.id });
122
+ }
123
+ else if (operation === "encode" || operation === "decode") {
124
+ const { readableStream, writableStream, id, publisherId } = event.data;
125
+ const context = { keyStore: getKeyStore(), id, publisherId };
126
+ handleTransform(context, operation, kind, readableStream, writableStream);
127
+ }
128
+ else if (operation === "setKeys") {
129
+ const data = event.data;
130
+ getKeyStore().setKeys(data.keys);
131
+ }
132
+ else if (operation === "rms") {
133
+ lastRMS = Math.round(event.data.rms);
134
+ }
135
+ };
136
+ function createSenderTransform(keyStore, kind) {
137
+ const encrypter = new EncryptTransform(keyStore);
138
+ return new TransformStream({
139
+ async transform(encodedFrame, controller) {
140
+ await encrypter.encryptFrame(encodedFrame, kind, controller);
141
+ },
142
+ });
143
+ }
144
+ function createReceiverTransform(context, kind) {
145
+ const encrypter = new EncryptTransform(context.keyStore);
146
+ return new TransformStream({
147
+ async transform(encodedFrame, controller) {
148
+ await encrypter.decryptFrame(encodedFrame, kind, controller, context.id, context.publisherId);
149
+ },
150
+ });
151
+ }
152
+ function handleTransform(context, operation, kind, readableStream, writableStream) {
153
+ let transformStream;
154
+ logDebug("handleTransform: " + JSON.stringify({ operation, context }));
155
+ if (operation === "encode") {
156
+ transformStream = createSenderTransform(context.keyStore, kind);
157
+ readableStream.pipeThrough(transformStream).pipeTo(writableStream);
158
+ }
159
+ else if (operation === "decode") {
160
+ transformStream = createReceiverTransform(context, kind);
161
+ const pipeline = readableStream
162
+ .pipeThrough(transformStream)
163
+ .pipeTo(writableStream)
164
+ .catch((err) => {
165
+ if (!String(err).includes("Destination stream closed")) {
166
+ console.error("pipeline error", err);
167
+ }
168
+ });
169
+ if (context.id) {
170
+ sessions.set(context.id, { pipeline });
171
+ }
172
+ }
173
+ }
174
+ if (self.RTCTransformEvent) {
175
+ self.onrtctransform = (event) => {
176
+ const transformer = event.transformer;
177
+ const options = transformer.options;
178
+ if (!options) {
179
+ logError("onrtctransform: options is undefined");
180
+ return;
181
+ }
182
+ const { operation, kind, id, publisherId } = options;
183
+ const context = {
184
+ keyStore: getKeyStore(),
185
+ id,
186
+ publisherId,
187
+ };
188
+ handleTransform(context, operation, kind, transformer.readable, transformer.writable);
189
+ };
190
+ }
191
+ /**
192
+ * LOGGING UTILS
193
+ */
194
+ function logDebug(msg) {
195
+ if (!DEBUG)
196
+ return;
197
+ self.postMessage({ type: "debug", data: msg });
198
+ }
199
+ function logError(msg) {
200
+ self.postMessage({ type: "error", data: msg });
201
+ }
202
+ logDebug("Worker Initialized");