janus-simple-videoroom-client 2.2.0 → 2.2.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.
package/dist/index.js CHANGED
@@ -692,3 +692,4 @@ function makeEventTarget() {
692
692
  }
693
693
  };
694
694
  }
695
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "janus-simple-videoroom-client",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "Provides a simple high-level API that makes it easy to work with the Janus VideoRoom plugin",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
8
- "dist/*"
8
+ "dist/*",
9
+ "src/*"
9
10
  ],
10
11
  "scripts": {
11
12
  "build": "tsc",
package/src/index.ts ADDED
@@ -0,0 +1,862 @@
1
+ /**
2
+ * Remove this once janus.js properly imports webrtc-adapter.
3
+ * Currently janus npm package depends on webrtc-adapter but does not import it, and so it gets dropped during tree shaking.
4
+ */
5
+ import adapter from "webrtc-adapter"
6
+ if (!(window as any).adapter) (window as any).adapter = adapter
7
+
8
+
9
+ import Janus, { JanusJS } from "janus-gateway"
10
+ export { Janus }
11
+
12
+ type JanusMid = unknown
13
+
14
+ interface JanusMessage {
15
+ [key: string]: any
16
+ }
17
+
18
+ interface JanusMediaOptions {
19
+ tracks?: JanusJS.TrackOption[]
20
+ trickle?: boolean
21
+ stream?: MediaStream
22
+ customizeSdp?: (jsep: JanusJS.JSEP) => void
23
+ customizeRemoteSdp?: (jsep: JanusJS.JSEP) => void
24
+ }
25
+
26
+ interface JanusStreamSpec {
27
+ feed: unknown
28
+ mid?: JanusMid
29
+ }
30
+
31
+ interface JanusWatchOptions {
32
+ pin?: string
33
+ media?: string[]
34
+ }
35
+
36
+ interface JanusPublishOptions {
37
+ audiocodec?: string
38
+ videocodec?: string
39
+ bitrate?: number
40
+ record?: boolean
41
+ filename?: string
42
+ display?: string
43
+ audio_level_average?: number
44
+ audio_active_packets?: number
45
+ descriptions?: {mid: JanusMid, description: string}[]
46
+ }
47
+
48
+ interface JanusPublisherConfigureOptions extends JanusPublishOptions {
49
+ keyframe?: boolean
50
+ streams?: Array<{
51
+ mid: JanusMid
52
+ keyframe?: boolean
53
+ send?: boolean
54
+ min_delay?: number
55
+ max_delay?: number
56
+ }>
57
+ }
58
+
59
+ interface JanusSubscriberConfigureOptions {
60
+ mid?: JanusMid
61
+ send?: boolean
62
+ substream?: number
63
+ temporal?: number
64
+ fallback?: number
65
+ spatial_layer?: number
66
+ temporal_layer?: number
67
+ audio_level_average?: number
68
+ audio_active_packets?: number
69
+ }
70
+
71
+
72
+ export interface VideoRoomClient {
73
+ createSession(server: string|string[], options?: Partial<JanusJS.ConstructorOptions>): Promise<VideoRoomSession>
74
+ }
75
+
76
+ export interface VideoRoomSession {
77
+ eventTarget: ReturnType<typeof makeEventTarget>
78
+ isValid(): boolean
79
+ joinRoom(roomId: string|number): Promise<VideoRoom>
80
+ subscribe(roomId: string|number, streams: JanusStreamSpec[], options?: {mediaOptions?: JanusMediaOptions}): Promise<VideoRoomSubscriber>
81
+ watch(mountPointId: number, options?: {watchOptions?: JanusWatchOptions, mediaOptions?: JanusMediaOptions}): Promise<StreamingSubscriber>
82
+ attachToPlugin(plugin: string): Promise<JanusPluginHandleEx>
83
+ destroy(): Promise<void>
84
+ }
85
+
86
+ export interface VideoRoom {
87
+ roomId: string|number
88
+ pluginHandle: JanusPluginHandleEx
89
+ onPublisherAdded(callback: (publishers: unknown[]) => void): void
90
+ onPublisherRemoved(callback: (publisherId: unknown) => void): void
91
+ publish(options?: {publishOptions?: JanusPublishOptions, mediaOptions?: JanusMediaOptions}): Promise<VideoRoomPublisher>
92
+ subscribe(streams: JanusStreamSpec[], options?: {mediaOptions?: JanusMediaOptions}): Promise<VideoRoomSubscriber>
93
+ leave(): Promise<void>
94
+ }
95
+
96
+ export interface VideoRoomPublisher {
97
+ publisherId: string|number
98
+ onTrackAdded(callback: (track: MediaStreamTrack) => void): void
99
+ onTrackRemoved(callback: (track: MediaStreamTrack) => void): void
100
+ configure(configureOptions: JanusPublisherConfigureOptions): Promise<void>
101
+ restart(mediaOptions?: JanusMediaOptions, publishOptions?: JanusPublishOptions): Promise<void>
102
+ unpublish(): Promise<void>
103
+ }
104
+
105
+ export interface VideoRoomSubscriber {
106
+ pluginHandle: JanusPluginHandleEx
107
+ onTrackAdded(callback: (track: MediaStreamTrack, mid: JanusMid) => void): void
108
+ onTrackRemoved(callback: (track: MediaStreamTrack, mid: JanusMid) => void): void
109
+ addStreams(streams: JanusStreamSpec[]): Promise<void>
110
+ removeStreams(streams: JanusStreamSpec[]): Promise<void>
111
+ pause(): Promise<void>
112
+ resume(): Promise<void>
113
+ configure(configureOptions: JanusSubscriberConfigureOptions): Promise<void>
114
+ restart(mediaOptions?: JanusMediaOptions): Promise<void>
115
+ unsubscribe(): Promise<void>
116
+ }
117
+
118
+ export interface StreamingSubscriber {
119
+ pluginHandle: JanusPluginHandleEx
120
+ onTrackAdded(callback: (track: MediaStreamTrack, mid: JanusMid) => void): void
121
+ onTrackRemoved(callback: (track: MediaStreamTrack, mid: JanusMid) => void): void
122
+ pause(): Promise<void>
123
+ resume(): Promise<void>
124
+ configure(configureOptions: JanusSubscriberConfigureOptions): Promise<void>
125
+ switch(mountPointId: number): Promise<void>
126
+ restart(options?: {watchOptions?: JanusWatchOptions, mediaOptions?: JanusMediaOptions}): Promise<void>
127
+ unsubscribe(): Promise<void>
128
+ }
129
+
130
+ export interface JanusPluginHandleEx extends JanusJS.PluginHandle {
131
+ eventTarget: ReturnType<typeof makeEventTarget>
132
+ sendRequest(message: JanusMessage & {request: string}): Promise<JanusMessage>
133
+ sendAsyncRequest(options: {message: JanusMessage & {request: string}, jsep?: JanusJS.JSEP, expectResponse: (response: AsyncResponse) => boolean}): Promise<AsyncResponse>
134
+ handleRemoteJsep(params: JanusJS.PluginHandleRemoteJsepParam & {customizeSdp?: (jsep: JanusJS.JSEP) => void}): void
135
+ }
136
+
137
+ interface AsyncResponse {
138
+ message: JanusMessage
139
+ jsep?: JanusJS.JSEP
140
+ }
141
+
142
+
143
+
144
+ export async function createVideoRoomClient(options?: JanusJS.InitOptions): Promise<VideoRoomClient> {
145
+ await new Promise(f => Janus.init({...options, callback: f}))
146
+
147
+ // construct and return the VideoRoomClient object
148
+ return {
149
+ createSession: createVideoRoomSession
150
+ }
151
+ }
152
+
153
+
154
+
155
+ async function createVideoRoomSession(server: string|string[], options?: JanusJS.ConstructorOptions): Promise<VideoRoomSession> {
156
+ const eventTarget = makeEventTarget()
157
+ let session: JanusJS.Janus
158
+
159
+ await new Promise<void>(function(fulfill, reject) {
160
+ let resolved = false
161
+ session = new Janus({
162
+ ...options,
163
+ server,
164
+ success() {
165
+ if (!resolved) {
166
+ fulfill()
167
+ resolved = true
168
+ }
169
+ else {
170
+ //reconnected
171
+ }
172
+ },
173
+ error(err: unknown) {
174
+ if (!resolved) {
175
+ reject(err)
176
+ resolved = true
177
+ }
178
+ else if (typeof err == "string" && err.startsWith("Lost connection")) {
179
+ eventTarget.dispatchEvent(new CustomEvent("connectionLost"))
180
+ }
181
+ else {
182
+ console.error(err)
183
+ }
184
+ },
185
+ })
186
+ })
187
+
188
+ // construct and return the VideoRoomSession object
189
+ return {
190
+ eventTarget,
191
+ isValid() {
192
+ return session.isConnected()
193
+ },
194
+ joinRoom(roomId) {
195
+ return joinVideoRoom(session, roomId)
196
+ },
197
+ subscribe(roomId, streams, options) {
198
+ return createVideoRoomSubscriber(session, roomId, streams, options)
199
+ },
200
+ watch(mountPointId, options) {
201
+ return createStreamingSubscriber(session, mountPointId, options)
202
+ },
203
+ attachToPlugin(plugin) {
204
+ return attachToPlugin(session, plugin)
205
+ },
206
+ async destroy() {
207
+ await new Promise<void>(function(fulfill, reject) {
208
+ session.destroy({
209
+ success: fulfill,
210
+ error: reject
211
+ })
212
+ })
213
+ }
214
+ }
215
+ }
216
+
217
+
218
+
219
+ async function attachToPlugin(session: JanusJS.Janus, plugin: string): Promise<JanusPluginHandleEx> {
220
+ const pendingRequests: {acceptResponse(response: AsyncResponse): boolean}[] = []
221
+ const eventTarget = makeEventTarget()
222
+
223
+ const handle: JanusPluginHandleEx = await new Promise(function(fulfill, reject) {
224
+ session.attach({
225
+ plugin,
226
+ success(handle) {
227
+ fulfill(handle as JanusPluginHandleEx)
228
+ },
229
+ error: reject,
230
+ consentDialog(state: unknown) {
231
+ eventTarget.dispatchEvent(new CustomEvent("consentDialog", {detail: {state}}))
232
+ },
233
+ webrtcState(state: unknown) {
234
+ eventTarget.dispatchEvent(new CustomEvent("webrtcState", {detail: {state}}))
235
+ },
236
+ iceState(state: unknown) {
237
+ eventTarget.dispatchEvent(new CustomEvent("iceState", {detail: {state}}))
238
+ },
239
+ mediaState(state: unknown) {
240
+ eventTarget.dispatchEvent(new CustomEvent("mediaState", {detail: {state}}))
241
+ },
242
+ slowLink(state: unknown) {
243
+ eventTarget.dispatchEvent(new CustomEvent("slowLink", {detail: {state}}))
244
+ },
245
+ onmessage(message: JanusMessage, jsep?: JanusJS.JSEP) {
246
+ const response = {message, jsep}
247
+ const index = pendingRequests.findIndex(x => x.acceptResponse(response))
248
+ if (index != -1) pendingRequests.splice(index, 1)
249
+ else eventTarget.dispatchEvent(new CustomEvent("message", {detail: {message, jsep}}))
250
+ },
251
+ onlocaltrack(track: MediaStreamTrack, added: boolean) {
252
+ eventTarget.dispatchEvent(new CustomEvent("localtrack", {detail: {track, added}}))
253
+ },
254
+ onremotetrack(track: MediaStreamTrack, mid: JanusMid, added: boolean) {
255
+ eventTarget.dispatchEvent(new CustomEvent("remotetrack", {detail: {track, mid, added}}))
256
+ },
257
+ ondataopen(label: unknown, protocol: unknown) {
258
+ eventTarget.dispatchEvent(new CustomEvent("dataopen", {detail: {label, protocol}}))
259
+ },
260
+ ondata(data: unknown, label: unknown) {
261
+ eventTarget.dispatchEvent(new CustomEvent("data", {detail: {data, label}}))
262
+ },
263
+ oncleanup() {
264
+ eventTarget.dispatchEvent(new CustomEvent("cleanup"))
265
+ },
266
+ ondetached() {
267
+ eventTarget.dispatchEvent(new CustomEvent("detached"))
268
+ }
269
+ })
270
+ })
271
+
272
+ // extend the handle to add convenience methods
273
+ handle.eventTarget = eventTarget
274
+
275
+ // method to send a synchrnous request to the plugin
276
+ handle.sendRequest = function(message) {
277
+ return new Promise(function(fulfill, reject) {
278
+ handle.send({
279
+ message,
280
+ success: fulfill,
281
+ error: reject
282
+ })
283
+ })
284
+ }
285
+
286
+ // method to send an asynchronous request to the plugin
287
+ let pending: Promise<unknown> = Promise.resolve()
288
+ handle.sendAsyncRequest = function(request) {
289
+ const promise = pending.catch(function() {})
290
+ .then(async function() {
291
+ await new Promise(function(fulfill, reject) {
292
+ handle.send({
293
+ message: request.message,
294
+ jsep: request.jsep,
295
+ success: fulfill,
296
+ error: reject
297
+ })
298
+ })
299
+ return new Promise<AsyncResponse>(function(fulfill, reject) {
300
+ pendingRequests.push({
301
+ acceptResponse(response) {
302
+ if ((response.message.videoroom == "event" || response.message.streaming == "event") && response.message.error_code) {
303
+ const err: Error & {code?: unknown} = new Error(response.message.error || response.message.error_code)
304
+ err.code = response.message.error_code
305
+ reject(err)
306
+ return true
307
+ }
308
+ else if (request.expectResponse(response)) {
309
+ fulfill(response)
310
+ return true
311
+ }
312
+ else {
313
+ return false
314
+ }
315
+ }
316
+ })
317
+ })
318
+ })
319
+ pending = promise
320
+ return promise
321
+ }
322
+
323
+ return handle
324
+ }
325
+
326
+
327
+
328
+ async function joinVideoRoom(session: JanusJS.Janus, roomId: string|number): Promise<VideoRoom> {
329
+ const cleanup = makeCleanup()
330
+ const callbacks = makeCallbacks()
331
+
332
+ try {
333
+ // attach to plugin and get a new handle for this room
334
+ const handle = await attachToPlugin(session, "janus.plugin.videoroom")
335
+
336
+ // remember to detach
337
+ cleanup.add(async function() {
338
+ await new Promise<void>(function(fulfill, reject) {
339
+ handle.detach({
340
+ success: fulfill,
341
+ error: reject
342
+ })
343
+ })
344
+ })
345
+
346
+ // listen to events and invoke callbacks
347
+ handle.eventTarget.addEventListener("message", function(event) {
348
+ const message = event.detail.message
349
+ if (message.videoroom == "event" && message.room == roomId) {
350
+ if (message.publishers) {
351
+ callbacks.get("onPublisherAdded")
352
+ .then(callback => callback(message.publishers))
353
+ .catch(console.error)
354
+ }
355
+ if (message.unpublished) {
356
+ callbacks.get("onPublisherRemoved")
357
+ .then(callback => callback(message.unpublished))
358
+ .catch(console.error)
359
+ }
360
+ }
361
+ })
362
+
363
+ // send the join request
364
+ const response = await handle.sendAsyncRequest({
365
+ message: {
366
+ request: "join",
367
+ ptype: "publisher",
368
+ room: roomId,
369
+ },
370
+ expectResponse: r => r.message.videoroom == "joined" && r.message.room == roomId
371
+ })
372
+
373
+ // invoke callback with the initial list of publishers
374
+ if (response.message.publishers.length) {
375
+ callbacks.get("onPublisherAdded")
376
+ .then(callback => callback(response.message.publishers))
377
+ .catch(console.error)
378
+ }
379
+
380
+ // construct and return the VideoRoom object
381
+ return {
382
+ roomId,
383
+ pluginHandle: handle,
384
+ onPublisherAdded(callback) {
385
+ callbacks.set("onPublisherAdded", callback)
386
+ },
387
+ onPublisherRemoved(callback) {
388
+ callbacks.set("onPublisherRemoved", callback)
389
+ },
390
+ publish(options) {
391
+ return createVideoRoomPublisher(handle, response.message.id, options)
392
+ },
393
+ subscribe(streams, options) {
394
+ return createVideoRoomSubscriber(session, roomId, streams, options)
395
+ },
396
+ async leave() {
397
+ await cleanup.run()
398
+ }
399
+ }
400
+ }
401
+ catch (err) {
402
+ await cleanup.run().catch(console.error)
403
+ throw err
404
+ }
405
+ }
406
+
407
+
408
+
409
+ async function createVideoRoomPublisher(
410
+ handle: JanusPluginHandleEx,
411
+ publisherId: string|number,
412
+ opts?: {
413
+ publishOptions?: JanusPublishOptions,
414
+ mediaOptions?: JanusMediaOptions
415
+ }
416
+ ): Promise<VideoRoomPublisher> {
417
+
418
+ const options = {...opts}
419
+ const cleanup = makeCleanup()
420
+ const callbacks = makeCallbacks()
421
+
422
+ // listen to events and invoke callbacks
423
+ const onLocalTrack = function(event: CustomEvent) {
424
+ if (event.detail.added) {
425
+ callbacks.get("onTrackAdded")
426
+ .then(callback => callback(event.detail.track))
427
+ .catch(console.error)
428
+ }
429
+ else {
430
+ callbacks.get("onTrackRemoved")
431
+ .then(callback => callback(event.detail.track))
432
+ .catch(console.error)
433
+ }
434
+ }
435
+ handle.eventTarget.addEventListener("localtrack", onLocalTrack)
436
+
437
+ // remember to remove the event listener
438
+ cleanup.add(function() {
439
+ handle.eventTarget.removeEventListener("localtrack", onLocalTrack)
440
+ })
441
+
442
+ try {
443
+ // send the publish request
444
+ const offerJsep = await new Promise<JanusJS.JSEP>(function(fulfill, reject) {
445
+ // the offer (local) sdp can be customized via mediaOptions.customizeSdp
446
+ handle.createOffer({
447
+ ...options.mediaOptions,
448
+ success: fulfill,
449
+ error: reject
450
+ })
451
+ })
452
+
453
+ const response = await handle.sendAsyncRequest({
454
+ message: {
455
+ ...options.publishOptions,
456
+ request: "publish"
457
+ },
458
+ jsep: offerJsep,
459
+ expectResponse: r => r.message.videoroom == "event" && r.message.configured == "ok"
460
+ })
461
+
462
+ // remember to unpublish
463
+ cleanup.add(async function() {
464
+ await handle.sendAsyncRequest({
465
+ message: {request: "unpublish"},
466
+ expectResponse: r => r.message.videoroom == "event" && r.message.unpublished == "ok"
467
+ })
468
+ })
469
+
470
+ // handle the answer JSEP
471
+ await new Promise(function(fulfill, reject) {
472
+ handle.handleRemoteJsep({
473
+ jsep: response.jsep!,
474
+ success: fulfill,
475
+ error: reject,
476
+ customizeSdp: options.mediaOptions?.customizeRemoteSdp
477
+ })
478
+ })
479
+
480
+ // construct and return the VideoRoomPublisher object
481
+ return {
482
+ publisherId,
483
+ onTrackAdded(callback) {
484
+ callbacks.set("onTrackAdded", callback)
485
+ },
486
+ onTrackRemoved(callback) {
487
+ callbacks.set("onTrackRemoved", callback)
488
+ },
489
+ async configure(configureOptions) {
490
+ await handle.sendAsyncRequest({
491
+ message: {
492
+ ...configureOptions,
493
+ request: "configure"
494
+ },
495
+ expectResponse: r => r.message.videoroom == "event" && r.message.configured == "ok"
496
+ })
497
+ },
498
+ async restart(mediaOptions = options.mediaOptions, publishOptions) {
499
+ const offerJsep = await new Promise<JanusJS.JSEP>(function(fulfill, reject) {
500
+ handle.createOffer({
501
+ ...mediaOptions,
502
+ success: fulfill,
503
+ error: reject
504
+ })
505
+ })
506
+ const response = await handle.sendAsyncRequest({
507
+ message: {
508
+ ...publishOptions,
509
+ request: "configure",
510
+ },
511
+ jsep: offerJsep,
512
+ expectResponse: r => r.message.videoroom == "event" && r.message.configured == "ok"
513
+ })
514
+ await new Promise(function(fulfill, reject) {
515
+ handle.handleRemoteJsep({
516
+ jsep: response.jsep!,
517
+ customizeSdp: mediaOptions?.customizeRemoteSdp,
518
+ success: fulfill,
519
+ error: reject
520
+ })
521
+ })
522
+ options.mediaOptions = mediaOptions
523
+ },
524
+ async unpublish() {
525
+ await cleanup.run()
526
+ }
527
+ }
528
+ }
529
+ catch (err) {
530
+ await cleanup.run().catch(console.error)
531
+ throw err
532
+ }
533
+ }
534
+
535
+
536
+
537
+ async function createVideoRoomSubscriber(
538
+ session: JanusJS.Janus,
539
+ roomId: string|number,
540
+ streams: JanusStreamSpec[],
541
+ opts?: {
542
+ mediaOptions?: JanusMediaOptions
543
+ }
544
+ ): Promise<VideoRoomSubscriber> {
545
+
546
+ const options = {...opts}
547
+ const cleanup = makeCleanup()
548
+ const callbacks = makeCallbacks()
549
+
550
+ try {
551
+ // attach to plugin and get a separate handle for this subscriber
552
+ const handle = await attachToPlugin(session, "janus.plugin.videoroom")
553
+
554
+ // remember to detach
555
+ cleanup.add(async function() {
556
+ await new Promise<void>(function(fulfill, reject) {
557
+ handle.detach({
558
+ success: fulfill,
559
+ error: reject
560
+ })
561
+ })
562
+ })
563
+
564
+ // listen to events and invoke callbacks
565
+ handle.eventTarget.addEventListener("remotetrack", function(event) {
566
+ if (event.detail.added) {
567
+ callbacks.get("onTrackAdded")
568
+ .then(callback => callback(event.detail.track, event.detail.mid))
569
+ .catch(console.error)
570
+ }
571
+ else {
572
+ callbacks.get("onTrackRemoved")
573
+ .then(callback => callback(event.detail.track, event.detail.mid))
574
+ .catch(console.error)
575
+ }
576
+ })
577
+
578
+ // join the room as a subscriber
579
+ const response = await handle.sendAsyncRequest({
580
+ message: {
581
+ request: "join",
582
+ ptype: "subscriber",
583
+ room: roomId,
584
+ streams
585
+ },
586
+ expectResponse: r => r.message.videoroom == "attached" && r.message.room == roomId
587
+ })
588
+
589
+ if (!response.jsep) throw new Error("Missing offer Jsep")
590
+ await handleOffer(handle, response.jsep, options.mediaOptions)
591
+
592
+ // construct and return the VideoRoomSubscriber object
593
+ return {
594
+ pluginHandle: handle,
595
+ onTrackAdded(callback) {
596
+ callbacks.set("onTrackAdded", callback)
597
+ },
598
+ onTrackRemoved(callback) {
599
+ callbacks.set("onTrackRemoved", callback)
600
+ },
601
+ async addStreams(streams) {
602
+ const response = await handle.sendAsyncRequest({
603
+ message: {request: "subscribe", streams},
604
+ expectResponse: r => r.message.videoroom == "updated" && r.message.room == roomId
605
+ })
606
+ if (response.jsep) await handleOffer(handle, response.jsep, options.mediaOptions)
607
+ },
608
+ async removeStreams(streams) {
609
+ const response = await handle.sendAsyncRequest({
610
+ message: {request: "unsubscribe", streams},
611
+ expectResponse: r => r.message.videoroom == "updated" && r.message.room == roomId
612
+ })
613
+ if (response.jsep) await handleOffer(handle, response.jsep, options.mediaOptions)
614
+ },
615
+ async pause() {
616
+ await handle.sendAsyncRequest({
617
+ message: {request: "pause"},
618
+ expectResponse: r => r.message.videoroom == "event" && r.message.paused == "ok"
619
+ })
620
+ },
621
+ async resume() {
622
+ await handle.sendAsyncRequest({
623
+ message: {request: "start"},
624
+ expectResponse: r => r.message.videoroom == "event" && r.message.started == "ok"
625
+ })
626
+ },
627
+ async configure(configureOptions) {
628
+ await handle.sendAsyncRequest({
629
+ message: {
630
+ ...configureOptions,
631
+ request: "configure",
632
+ restart: false
633
+ },
634
+ expectResponse: r => r.message.videoroom == "event" && r.message.configured == "ok"
635
+ })
636
+ },
637
+ async restart(mediaOptions = options.mediaOptions) {
638
+ const response = await handle.sendAsyncRequest({
639
+ message: {
640
+ request: "configure",
641
+ restart: true
642
+ },
643
+ expectResponse: r => r.message.videoroom == "event" && r.message.configured == "ok"
644
+ })
645
+ if (!response.jsep) throw new Error("Missing offer Jsep")
646
+ await handleOffer(handle, response.jsep, mediaOptions)
647
+ options.mediaOptions = mediaOptions
648
+ },
649
+ async unsubscribe() {
650
+ await cleanup.run()
651
+ }
652
+ }
653
+ }
654
+ catch (err) {
655
+ await cleanup.run().catch(console.error)
656
+ throw err
657
+ }
658
+ }
659
+
660
+
661
+
662
+ async function createStreamingSubscriber(
663
+ session: JanusJS.Janus,
664
+ mountPointId: number,
665
+ options?: {
666
+ watchOptions?: JanusWatchOptions
667
+ mediaOptions?: JanusMediaOptions
668
+ }
669
+ ): Promise<StreamingSubscriber> {
670
+
671
+ const cleanup = makeCleanup()
672
+ const callbacks = makeCallbacks()
673
+
674
+ try {
675
+ // attach to the streaming plugin
676
+ const handle = await attachToPlugin(session, "janus.plugin.streaming")
677
+
678
+ // remember to detach
679
+ cleanup.add(async function() {
680
+ await new Promise<void>(function(fulfill, reject) {
681
+ handle.detach({
682
+ success: fulfill,
683
+ error: reject
684
+ })
685
+ })
686
+ })
687
+
688
+ // listen to events and invoke callbacks
689
+ handle.eventTarget.addEventListener("remotetrack", function(event) {
690
+ if (event.detail.added) {
691
+ callbacks.get("onTrackAdded")
692
+ .then(callback => callback(event.detail.track, event.detail.mid))
693
+ .catch(console.error)
694
+ }
695
+ else {
696
+ callbacks.get("onTrackRemoved")
697
+ .then(callback => callback(event.detail.track, event.detail.mid))
698
+ .catch(console.error)
699
+ }
700
+ })
701
+
702
+ // send the watch request
703
+ const response = await handle.sendAsyncRequest({
704
+ message: {
705
+ ...options?.watchOptions,
706
+ request: "watch",
707
+ id: mountPointId
708
+ },
709
+ expectResponse: r => r.message.streaming == "event" && r.message.result?.status == "preparing"
710
+ })
711
+
712
+ if (!response.jsep) throw new Error("Missing offer Jsep")
713
+ await handleOffer(handle, response.jsep, options?.mediaOptions)
714
+
715
+ // construct and return the StreamingSubscriber object
716
+ return {
717
+ pluginHandle: handle,
718
+ onTrackAdded(callback) {
719
+ callbacks.set("onTrackAdded", callback)
720
+ },
721
+ onTrackRemoved(callback) {
722
+ callbacks.set("onTrackRemoved", callback)
723
+ },
724
+ async pause() {
725
+ await handle.sendAsyncRequest({
726
+ message: {request: "pause"},
727
+ expectResponse: r => r.message.streaming == "event" && r.message.result?.status == "pausing"
728
+ })
729
+ },
730
+ async resume() {
731
+ await handle.sendAsyncRequest({
732
+ message: {request: "start"},
733
+ expectResponse: r => r.message.streaming == "event" && r.message.result?.status == "starting"
734
+ })
735
+ },
736
+ async configure(configureOptions) {
737
+ await handle.sendAsyncRequest({
738
+ message: {
739
+ ...configureOptions,
740
+ request: "configure"
741
+ },
742
+ expectResponse: r => r.message.streaming == "event" && r.message.result?.event == "configured"
743
+ })
744
+ },
745
+ async switch(newMountPointId) {
746
+ await handle.sendAsyncRequest({
747
+ message: {
748
+ request: "switch",
749
+ id: newMountPointId
750
+ },
751
+ expectResponse: r => r.message.streaming == "event" && r.message.result?.switched == "ok"
752
+ })
753
+ mountPointId = newMountPointId
754
+ },
755
+ async restart(newOptions = options) {
756
+ const response = await handle.sendAsyncRequest({
757
+ message: {
758
+ ...newOptions?.watchOptions,
759
+ request: "watch",
760
+ id: mountPointId
761
+ },
762
+ expectResponse: r => r.message.streaming == "event" && r.message.result?.status == "preparing"
763
+ })
764
+ if (!response.jsep) throw new Error("Missing offer Jsep")
765
+ await handleOffer(handle, response.jsep, newOptions?.mediaOptions)
766
+ options = newOptions
767
+ },
768
+ async unsubscribe() {
769
+ await cleanup.run()
770
+ }
771
+ }
772
+ }
773
+ catch (err) {
774
+ await cleanup.run().catch(console.error)
775
+ throw err
776
+ }
777
+ }
778
+
779
+
780
+
781
+ async function handleOffer(handle: JanusPluginHandleEx, offerJsep: JanusJS.JSEP, mediaOptions?: JanusMediaOptions): Promise<void> {
782
+ // allow customizing the remote (offer) sdp
783
+ if (mediaOptions?.customizeRemoteSdp) {
784
+ mediaOptions.customizeRemoteSdp(offerJsep)
785
+ }
786
+
787
+ // create and send the answer
788
+ const answerJsep = await new Promise<JanusJS.JSEP>(function(fulfill, reject) {
789
+ // the answer (local) sdp can be customized via mediaOptions.customizeSdp
790
+ handle.createAnswer({
791
+ ...mediaOptions,
792
+ jsep: offerJsep,
793
+ success: fulfill,
794
+ error: reject
795
+ })
796
+ })
797
+
798
+ await handle.sendAsyncRequest({
799
+ message: {request: "start"},
800
+ jsep: answerJsep,
801
+ expectResponse: r => r.message.videoroom == "event" && r.message.started == "ok" ||
802
+ r.message.streaming == "event" && r.message.result?.status == "started"
803
+ })
804
+ }
805
+
806
+
807
+
808
+ function makeCleanup() {
809
+ type Task = () => void|Promise<void>
810
+ const tasks: Task[] = []
811
+ return {
812
+ add(task: Task) {
813
+ tasks.push(task)
814
+ },
815
+ run() {
816
+ let promise = Promise.resolve()
817
+ for (let i=tasks.length-1; i>=0; i--) promise = promise.then(tasks[i])
818
+ return promise
819
+ }
820
+ }
821
+ }
822
+
823
+ function makeCallbacks() {
824
+ const pending: {[name: string]: {promise: Promise<Function>, fulfill: (callback: Function) => void}} = {}
825
+ const getPending = (name: string) => {
826
+ if (!pending[name]) {
827
+ let fulfill = function(_: Function) {}
828
+ const promise = new Promise<Function>(f => fulfill = f)
829
+ pending[name] = {promise, fulfill}
830
+ }
831
+ return pending[name]
832
+ }
833
+ return {
834
+ get(name: string) {
835
+ return getPending(name).promise
836
+ },
837
+ set(name: string, value: Function) {
838
+ getPending(name).fulfill(value)
839
+ }
840
+ }
841
+ }
842
+
843
+ function makeEventTarget() {
844
+ const listeners: {[name: string]: Function[]} = {}
845
+ return {
846
+ addEventListener(name: string, callback: (event: CustomEvent) => void) {
847
+ if (!listeners[name]) listeners[name] = []
848
+ listeners[name].push(callback)
849
+ },
850
+ removeEventListener(name: string, callback: (event: CustomEvent) => void) {
851
+ if (!listeners[name]) return
852
+ const index = listeners[name].indexOf(callback)
853
+ if (index >= 0) listeners[name].splice(index, 1)
854
+ },
855
+ dispatchEvent(event: Event) {
856
+ if (!listeners[event.type]) return
857
+ for (let i=0; i<listeners[event.type].length; i++) {
858
+ listeners[event.type][i](event)
859
+ }
860
+ }
861
+ }
862
+ }