warpr 1.0.32 → 1.0.50
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/fesm2022/warpr.mjs +185 -32
- package/fesm2022/warpr.mjs.map +1 -1
- package/lib/infrastructure/memory-stream.d.ts +14 -0
- package/lib/infrastructure/message-assembler.d.ts +2 -1
- package/lib/infrastructure/message-splitter.d.ts +8 -0
- package/lib/infrastructure/messages.d.ts +22 -0
- package/lib/services/messaging.service.d.ts +1 -0
- package/lib/services/streaming.service.d.ts +11 -6
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
package/fesm2022/warpr.mjs
CHANGED
|
@@ -351,48 +351,144 @@ class EventPublisher {
|
|
|
351
351
|
}
|
|
352
352
|
}
|
|
353
353
|
|
|
354
|
+
class MemoryStream {
|
|
355
|
+
constructor(initialCapacity = 0) {
|
|
356
|
+
this._capacity = initialCapacity;
|
|
357
|
+
this._buffer = new Uint8Array(initialCapacity);
|
|
358
|
+
this._dataView = new DataView(this._buffer.buffer);
|
|
359
|
+
this._size = 0;
|
|
360
|
+
}
|
|
361
|
+
Clear() {
|
|
362
|
+
this._size = 0;
|
|
363
|
+
}
|
|
364
|
+
Reserve(capacity) {
|
|
365
|
+
if (capacity > this._capacity) {
|
|
366
|
+
this._capacity = capacity;
|
|
367
|
+
let newBuffer = new Uint8Array(capacity);
|
|
368
|
+
newBuffer.set(this._buffer);
|
|
369
|
+
this._buffer = newBuffer;
|
|
370
|
+
this._dataView = new DataView(this._buffer.buffer);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
ToArrayBuffer() {
|
|
374
|
+
return this._buffer.buffer.slice(0, this._size);
|
|
375
|
+
}
|
|
376
|
+
ToArrayBufferView() {
|
|
377
|
+
return new Uint8Array(this._buffer.buffer, 0, this._size);
|
|
378
|
+
}
|
|
379
|
+
ExtendCapacity(additionalBytes) {
|
|
380
|
+
let requiredCapacity = this._size + additionalBytes;
|
|
381
|
+
if (requiredCapacity > this._capacity) {
|
|
382
|
+
let newCapacity = Math.max(this._capacity * 2, requiredCapacity);
|
|
383
|
+
this.Reserve(newCapacity);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
WriteUInt32(value) {
|
|
387
|
+
this.ExtendCapacity(4);
|
|
388
|
+
this._dataView.setUint32(this._size, value, true);
|
|
389
|
+
this._size += 4;
|
|
390
|
+
}
|
|
391
|
+
WriteBytes(bytes) {
|
|
392
|
+
this.ExtendCapacity(bytes.length);
|
|
393
|
+
this._buffer.set(bytes, this._size);
|
|
394
|
+
this._size += bytes.length;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
var MessageContentType;
|
|
399
|
+
(function (MessageContentType) {
|
|
400
|
+
MessageContentType[MessageContentType["Binary"] = 0] = "Binary";
|
|
401
|
+
MessageContentType[MessageContentType["Text"] = 1] = "Text";
|
|
402
|
+
})(MessageContentType || (MessageContentType = {}));
|
|
403
|
+
const MaxSafeMessageSize = 256 * 1024;
|
|
404
|
+
class MessageFragmentHeader {
|
|
405
|
+
constructor() {
|
|
406
|
+
this.MessageIndex = 0;
|
|
407
|
+
this.MessageSize = 0;
|
|
408
|
+
this.FragmentSizeWithContentType = 0;
|
|
409
|
+
this.FragmentIndex = 0;
|
|
410
|
+
}
|
|
411
|
+
static { this._fragmentSizeBits = 31; }
|
|
412
|
+
static { this._fragmentSizeMask = ~(1 << MessageFragmentHeader._fragmentSizeBits); }
|
|
413
|
+
get ContentType() {
|
|
414
|
+
return this.FragmentSizeWithContentType >>> MessageFragmentHeader._fragmentSizeBits;
|
|
415
|
+
}
|
|
416
|
+
set ContentType(value) {
|
|
417
|
+
this.FragmentSizeWithContentType = this.FragmentSizeWithContentType & MessageFragmentHeader._fragmentSizeMask | (value << MessageFragmentHeader._fragmentSizeBits);
|
|
418
|
+
}
|
|
419
|
+
get FragmentSize() {
|
|
420
|
+
return this.FragmentSizeWithContentType & MessageFragmentHeader._fragmentSizeMask;
|
|
421
|
+
}
|
|
422
|
+
set FragmentSize(value) {
|
|
423
|
+
this.FragmentSizeWithContentType = this.FragmentSizeWithContentType & ~MessageFragmentHeader._fragmentSizeMask | value;
|
|
424
|
+
}
|
|
425
|
+
Write(stream) {
|
|
426
|
+
stream.WriteUInt32(this.MessageIndex);
|
|
427
|
+
stream.WriteUInt32(this.MessageSize);
|
|
428
|
+
stream.WriteUInt32(this.FragmentSizeWithContentType);
|
|
429
|
+
stream.WriteUInt32(this.FragmentIndex);
|
|
430
|
+
}
|
|
431
|
+
Read(stream) {
|
|
432
|
+
this.MessageIndex = stream.ReadUInt32();
|
|
433
|
+
this.MessageSize = stream.ReadUInt32();
|
|
434
|
+
this.FragmentSizeWithContentType = stream.ReadUInt32();
|
|
435
|
+
this.FragmentIndex = stream.ReadUInt32();
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
354
439
|
class MessageBuilder {
|
|
355
|
-
constructor(Id, Size, FragmentSize) {
|
|
440
|
+
constructor(Id, Size, FragmentSize, ContentType = MessageContentType.Binary) {
|
|
356
441
|
this.Id = Id;
|
|
357
442
|
this.Size = Size;
|
|
358
443
|
this.FragmentSize = FragmentSize;
|
|
359
|
-
this.
|
|
444
|
+
this.ContentType = ContentType;
|
|
445
|
+
this.FragmentsReceived = 0;
|
|
446
|
+
this._textDecoder = new TextDecoder();
|
|
360
447
|
this.FragmentCount = Math.ceil(Size / FragmentSize);
|
|
361
448
|
this.Buffer = new Uint8Array(Size);
|
|
362
449
|
}
|
|
363
450
|
AddFragment(index, buffer) {
|
|
364
|
-
if (this.FragmentCount == this.
|
|
451
|
+
if (this.FragmentCount == this.FragmentsReceived)
|
|
365
452
|
throw RangeError("All message parts have been already collected.");
|
|
366
453
|
this.Buffer.set(buffer, this.FragmentSize * index);
|
|
367
|
-
this.
|
|
368
|
-
return this.FragmentCount == this.
|
|
454
|
+
this.FragmentsReceived++;
|
|
455
|
+
return this.FragmentCount == this.FragmentsReceived;
|
|
456
|
+
}
|
|
457
|
+
GetMessage() {
|
|
458
|
+
if (this.FragmentCount == this.FragmentsReceived) {
|
|
459
|
+
switch (this.ContentType) {
|
|
460
|
+
case MessageContentType.Binary:
|
|
461
|
+
return this.Buffer.buffer;
|
|
462
|
+
case MessageContentType.Text:
|
|
463
|
+
return this._textDecoder.decode(this.Buffer.buffer);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
return null;
|
|
369
467
|
}
|
|
370
468
|
}
|
|
371
469
|
class MessageAssembler {
|
|
372
|
-
constructor(_maxBuilderCount =
|
|
470
|
+
constructor(_maxBuilderCount = 1) {
|
|
373
471
|
this._maxBuilderCount = _maxBuilderCount;
|
|
374
472
|
this._builders = new Map();
|
|
375
473
|
}
|
|
376
474
|
PushMessage(buffer) {
|
|
377
475
|
let stream = new ArrayStream(buffer);
|
|
378
|
-
let
|
|
379
|
-
|
|
380
|
-
let fragmentSize = stream.ReadUInt32();
|
|
381
|
-
let fragmentIndex = stream.ReadUInt32();
|
|
476
|
+
let header = new MessageFragmentHeader();
|
|
477
|
+
header.Read(stream);
|
|
382
478
|
let fragment = new Uint8Array(stream.ReadToEnd());
|
|
383
|
-
let builder = this._builders.get(
|
|
479
|
+
let builder = this._builders.get(header.MessageIndex);
|
|
384
480
|
if (builder === undefined) {
|
|
385
|
-
builder = new MessageBuilder(
|
|
386
|
-
this._builders.set(
|
|
481
|
+
builder = new MessageBuilder(header.MessageIndex, header.MessageSize, header.FragmentSize, header.ContentType);
|
|
482
|
+
this._builders.set(header.MessageIndex, builder);
|
|
387
483
|
if (this._builders.size > this._maxBuilderCount) {
|
|
388
484
|
let [oldest] = this._builders.keys();
|
|
389
485
|
this._builders.delete(oldest);
|
|
390
486
|
console.log("Message lost.");
|
|
391
487
|
}
|
|
392
488
|
}
|
|
393
|
-
if (builder.AddFragment(
|
|
394
|
-
this._builders.delete(
|
|
395
|
-
return builder.
|
|
489
|
+
if (builder.AddFragment(header.FragmentIndex, fragment)) {
|
|
490
|
+
this._builders.delete(header.MessageIndex);
|
|
491
|
+
return builder.GetMessage();
|
|
396
492
|
}
|
|
397
493
|
else {
|
|
398
494
|
return null;
|
|
@@ -400,6 +496,45 @@ class MessageAssembler {
|
|
|
400
496
|
}
|
|
401
497
|
}
|
|
402
498
|
|
|
499
|
+
class MessageSplitter {
|
|
500
|
+
constructor(MaxMessageSize = MaxSafeMessageSize) {
|
|
501
|
+
this.MaxMessageSize = MaxMessageSize;
|
|
502
|
+
this._messageIndex = 0;
|
|
503
|
+
this._textEncoder = new TextEncoder();
|
|
504
|
+
}
|
|
505
|
+
*SplitMessage(message) {
|
|
506
|
+
let content;
|
|
507
|
+
let contentType;
|
|
508
|
+
if (typeof message === 'string') {
|
|
509
|
+
content = this._textEncoder.encode(message);
|
|
510
|
+
contentType = MessageContentType.Text;
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
content = new Uint8Array(message);
|
|
514
|
+
contentType = MessageContentType.Binary;
|
|
515
|
+
}
|
|
516
|
+
let messageSize = this.MaxMessageSize - 16;
|
|
517
|
+
let stream = new MemoryStream(this.MaxMessageSize);
|
|
518
|
+
let header = new MessageFragmentHeader();
|
|
519
|
+
header.MessageIndex = this._messageIndex++;
|
|
520
|
+
header.MessageSize = content.length;
|
|
521
|
+
header.ContentType = contentType;
|
|
522
|
+
header.FragmentSize = messageSize;
|
|
523
|
+
let position = 0;
|
|
524
|
+
let fragmentIndex = 0;
|
|
525
|
+
let fragments = [];
|
|
526
|
+
while (position < content.length) {
|
|
527
|
+
let fragmentLength = Math.min(messageSize, content.length - position);
|
|
528
|
+
header.Write(stream);
|
|
529
|
+
stream.WriteBytes(content.subarray(position, position + fragmentLength));
|
|
530
|
+
yield stream.ToArrayBufferView();
|
|
531
|
+
stream.Clear();
|
|
532
|
+
position += fragmentLength;
|
|
533
|
+
header.FragmentIndex++;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
403
538
|
class WebSocketClient {
|
|
404
539
|
constructor(_uri) {
|
|
405
540
|
this._uri = _uri;
|
|
@@ -444,13 +579,14 @@ class WebSocketClient {
|
|
|
444
579
|
|
|
445
580
|
class MessagingService extends WebSocketClient {
|
|
446
581
|
static { this._connectionUri = 'api/sinks/connect'; }
|
|
582
|
+
static { this.ExternalServer = null; }
|
|
447
583
|
constructor() {
|
|
448
584
|
const uri = MessagingService.GetServerUri();
|
|
449
585
|
super(uri);
|
|
450
586
|
this._sessionId = v4();
|
|
451
587
|
}
|
|
452
588
|
static GetServerUri() {
|
|
453
|
-
const location = window.location;
|
|
589
|
+
const location = new URL(MessagingService.ExternalServer || window.location.href);
|
|
454
590
|
const protocol = location.protocol === 'https:' ? 'wss' : 'ws';
|
|
455
591
|
return `${protocol}://${location.host}/${this._connectionUri}`;
|
|
456
592
|
}
|
|
@@ -476,10 +612,11 @@ class StreamingService {
|
|
|
476
612
|
this._events = new EventOwner();
|
|
477
613
|
this.FrameReceived = new EventPublisher(this._events);
|
|
478
614
|
this.Connected = new EventPublisher(this._events);
|
|
615
|
+
this.AuxChannelReady = new EventPublisher(this._events);
|
|
479
616
|
this.ControlMessageReceived = new EventPublisher(this._events);
|
|
480
617
|
this.AuxMessageReceived = new EventPublisher(this._events);
|
|
481
|
-
this.
|
|
482
|
-
this.
|
|
618
|
+
this._lastFramerateRefreshTime = performance.now();
|
|
619
|
+
this._frameCounter = 0;
|
|
483
620
|
_messagingService.MessageReceived.Subscribe((sender, message) => this.OnSignalingMessageReceived(sender, message));
|
|
484
621
|
_messagingService.Connect();
|
|
485
622
|
}
|
|
@@ -487,9 +624,11 @@ class StreamingService {
|
|
|
487
624
|
console.log("Establishing peer connection...");
|
|
488
625
|
this._controlConnection?.close();
|
|
489
626
|
this._streamConnection?.close();
|
|
490
|
-
this._messageBuilder = new MessageAssembler();
|
|
491
627
|
this._auxConnection?.close();
|
|
492
628
|
this._peerConnection?.close();
|
|
629
|
+
this._streamMessageBuilder = new MessageAssembler(3);
|
|
630
|
+
this._auxMessageBuilder = new MessageAssembler();
|
|
631
|
+
this._auxMessageSplitter = new MessageSplitter();
|
|
493
632
|
this._peerConnection = new RTCPeerConnection(configuration);
|
|
494
633
|
this._peerConnection.onicecandidate = (event) => this.OnIceCandidateAdded(event.candidate?.candidate);
|
|
495
634
|
this._peerConnection.ondatachannel = (event) => this.OnDataChannel(event);
|
|
@@ -500,10 +639,20 @@ class StreamingService {
|
|
|
500
639
|
this._controlConnection?.send(json);
|
|
501
640
|
}
|
|
502
641
|
SendAuxMessage(message) {
|
|
503
|
-
this.
|
|
642
|
+
if (!this._auxMessageSplitter)
|
|
643
|
+
return;
|
|
644
|
+
let fragments = this._auxMessageSplitter.SplitMessage(message);
|
|
645
|
+
for (let fragment of fragments) {
|
|
646
|
+
this._auxConnection?.send(fragment);
|
|
647
|
+
}
|
|
504
648
|
}
|
|
505
649
|
OnConnectionStateChanged() {
|
|
506
650
|
console.log("WebRTC: " + this._peerConnection?.connectionState);
|
|
651
|
+
if (this._peerConnection?.connectionState === "connected") {
|
|
652
|
+
let maxMessageSize = this._peerConnection?.sctp?.maxMessageSize;
|
|
653
|
+
if (maxMessageSize)
|
|
654
|
+
this._auxMessageSplitter.MaxMessageSize = maxMessageSize;
|
|
655
|
+
}
|
|
507
656
|
}
|
|
508
657
|
OnDataChannel(event) {
|
|
509
658
|
console.log(`WebRTC data channel ${event.channel.label} connected.`);
|
|
@@ -512,36 +661,40 @@ class StreamingService {
|
|
|
512
661
|
this._controlConnection = event.channel;
|
|
513
662
|
this._controlConnection.binaryType = "arraybuffer";
|
|
514
663
|
this._controlConnection.onmessage = (event) => this._events.Raise(this.ControlMessageReceived, this, event.data);
|
|
515
|
-
this._events.Raise(this.Connected, this, null);
|
|
516
664
|
break;
|
|
517
665
|
case "stream":
|
|
518
666
|
this._streamConnection = event.channel;
|
|
519
667
|
this._streamConnection.binaryType = "arraybuffer";
|
|
520
|
-
this._streamConnection.onmessage = (event) => this.
|
|
668
|
+
this._streamConnection.onmessage = (event) => this.OnStreamMessage(event);
|
|
521
669
|
break;
|
|
522
670
|
case "aux":
|
|
523
671
|
this._auxConnection = event.channel;
|
|
524
672
|
this._auxConnection.binaryType = "arraybuffer";
|
|
525
|
-
this._auxConnection.onmessage = (event) => this.
|
|
673
|
+
this._auxConnection.onmessage = (event) => this.OnAuxMessage(event);
|
|
526
674
|
this._events.Raise(this.Connected, this, null);
|
|
527
675
|
break;
|
|
528
676
|
}
|
|
529
677
|
}
|
|
530
|
-
|
|
531
|
-
let message = this.
|
|
678
|
+
OnStreamMessage(event) {
|
|
679
|
+
let message = this._streamMessageBuilder?.PushMessage(event.data);
|
|
532
680
|
if (!message)
|
|
533
681
|
return;
|
|
682
|
+
this._frameCounter++;
|
|
534
683
|
let now = performance.now();
|
|
535
|
-
let elapsed = now - this.
|
|
536
|
-
this._count++;
|
|
684
|
+
let elapsed = now - this._lastFramerateRefreshTime;
|
|
537
685
|
if (elapsed > 1000) {
|
|
538
|
-
this.
|
|
539
|
-
console.debug(`Messages: ${this.
|
|
540
|
-
this.
|
|
686
|
+
this._lastFramerateRefreshTime = now;
|
|
687
|
+
console.debug(`Messages: ${this._frameCounter / elapsed * 1000} FPS`);
|
|
688
|
+
this._frameCounter = 0;
|
|
541
689
|
}
|
|
542
690
|
let frame = new EncodedFrame(message);
|
|
543
691
|
this._events.Raise(this.FrameReceived, this, frame);
|
|
544
692
|
}
|
|
693
|
+
OnAuxMessage(event) {
|
|
694
|
+
let message = this._auxMessageBuilder?.PushMessage(event.data);
|
|
695
|
+
if (message)
|
|
696
|
+
this._events.Raise(this.AuxMessageReceived, this, message);
|
|
697
|
+
}
|
|
545
698
|
OnIceCandidateAdded(candidate) {
|
|
546
699
|
if (candidate == null)
|
|
547
700
|
return;
|
|
@@ -737,5 +890,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImpor
|
|
|
737
890
|
* Generated bundle index. Do not edit.
|
|
738
891
|
*/
|
|
739
892
|
|
|
740
|
-
export { ArrayStream, ConnectionRequest, EncodedFrame, EventArgs, EventOwner, EventPublisher, EventSubscription, FrameType, GetConfiguration, MessageAssembler, MessagingService, PairingCompleteMessage, PeerConnectionCandidateMessage, PeerConnectionDescriptionMessage, PointerAction, PointerFlags, PointerInputMessage, PointerState, PointerType, RequestKeyFrameMessage, ResizeSurfaceMessage, Size, StreamHostComponent, StreamingService, StreamingSourcesMessage, WarprSignalingMessageType, WarprStreamingMessageType, WebSocketClient };
|
|
893
|
+
export { ArrayStream, ConnectionRequest, EncodedFrame, EventArgs, EventOwner, EventPublisher, EventSubscription, FrameType, GetConfiguration, MemoryStream, MessageAssembler, MessageSplitter, MessagingService, PairingCompleteMessage, PeerConnectionCandidateMessage, PeerConnectionDescriptionMessage, PointerAction, PointerFlags, PointerInputMessage, PointerState, PointerType, RequestKeyFrameMessage, ResizeSurfaceMessage, Size, StreamHostComponent, StreamingService, StreamingSourcesMessage, WarprSignalingMessageType, WarprStreamingMessageType, WebSocketClient };
|
|
741
894
|
//# sourceMappingURL=warpr.mjs.map
|
package/fesm2022/warpr.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warpr.mjs","sources":["../../../projects/warpr-lib/src/lib/infrastructure/array-stream.ts","../../../projects/warpr-lib/src/lib/data/frames.ts","../../../projects/warpr-lib/src/lib/data/signaling-messages.ts","../../../projects/warpr-lib/src/lib/data/streaming-messages.ts","../../../projects/warpr-lib/src/lib/infrastructure/events.ts","../../../projects/warpr-lib/src/lib/infrastructure/message-assembler.ts","../../../projects/warpr-lib/src/lib/networking/web-socket-client.ts","../../../projects/warpr-lib/src/lib/services/messaging.service.ts","../../../projects/warpr-lib/src/lib/services/streaming.service.ts","../../../projects/warpr-lib/src/lib/components/stream-host/stream-host.component.ts","../../../projects/warpr-lib/src/lib/components/stream-host/stream-host.component.html","../../../projects/warpr-lib/src/public-api.ts","../../../projects/warpr-lib/src/warpr.ts"],"sourcesContent":["export class ArrayStream {\n private _view: DataView;\n private _position: number;\n\n public constructor(buffer: ArrayBuffer) {\n this._view = new DataView(buffer);\n this._position = 0;\n }\n\n public get Position(): number {\n return this._position;\n }\n\n public set Position(value: number) {\n if (value < 0 || this._view.buffer.byteLength < value) {\n throw new RangeError(\"The provided value lies outside the stream's bounds.\");\n }\n\n this._position = value;\n }\n\n public ReadBool(): boolean {\n let result = this._view.getUint8(this._position) != 0;\n this._position += 1;\n return result;\n }\n\n public ReadUInt8(): number {\n let result = this._view.getUint8(this._position);\n this._position += 1;\n return result;\n }\n\n public ReadUInt16(): number {\n let result = this._view.getUint16(this._position, true);\n this._position += 2;\n return result;\n }\n\n public ReadUInt32(): number {\n let result = this._view.getUint32(this._position, true);\n this._position += 4;\n return result;\n }\n\n public ReadUInt64(): bigint {\n let result = this._view.getBigUint64(this._position, true);\n this._position += 8;\n return result;\n }\n\n public ReadInt8(): number {\n let result = this._view.getInt8(this._position);\n this._position += 1;\n return result;\n }\n\n public ReadInt16(): number {\n let result = this._view.getInt16(this._position, true);\n this._position += 2;\n return result;\n }\n\n public ReadInt32(): number {\n let result = this._view.getInt32(this._position, true);\n this._position += 4;\n return result;\n }\n\n public ReadInt64(): bigint {\n let result = this._view.getBigInt64(this._position, true);\n this._position += 8;\n return result;\n }\n\n public ReadSingle(): number {\n let result = this._view.getFloat32(this._position, true);\n this._position += 4;\n return result;\n }\n\n public ReadDouble(): number {\n let result = this._view.getFloat64(this._position, true);\n this._position += 8;\n return result;\n }\n\n public ReadBuffer(): ArrayBuffer {\n let length = this.ReadUInt32();\n let result = this._view.buffer.slice(this._position, this._position + length);\n this._position += length;\n return result;\n }\n\n public ReadToEnd(): ArrayBuffer {\n let length = this._view.buffer.byteLength - this._position;\n let result = this._view.buffer.slice(this._position, this._position + length);\n this._position += length;\n return result;\n }\n\n public ReadString() {\n let length = this.ReadUInt32();\n let decoder = new TextDecoder();\n let result = decoder.decode(this._view.buffer.slice(this._position, this._position + length));\n this._position += length;\n return result;\n }\n}\n","import { ArrayStream } from \"../infrastructure/array-stream\";\n\nexport enum FrameType {\n Unknown,\n Key,\n Delta\n}\n\nexport class EncodedFrame {\n public Index: number;\n public Type: FrameType;\n public Width: number;\n public Height: number;\n public Bytes: ArrayBuffer;\n\n public constructor(buffer: ArrayBuffer) {\n let stream = new ArrayStream(buffer);\n\n this.Type = stream.ReadUInt32();\n this.Index = stream.ReadUInt32();\n this.Width = stream.ReadUInt32();\n this.Height = stream.ReadUInt32();\n this.Bytes = stream.ReadBuffer();\n }\n}\n\nexport class Size {\n public constructor(\n public Width: number,\n public Height: number) { }\n\n public static Empty: Size = { Width: 0, Height: 0 };\n\n public static AreEqual(a: Size, b: Size) {\n return a.Width === b.Width && a.Height === b.Height;\n }\n}\n","\nexport enum WarprSignalingMessageType {\n ConnectionRequest = \"ConnectionRequest\",\n PairingCompleteMessage = \"PairingCompleteMessage\",\n PeerConnectionDescriptionMessage = \"PeerConnectionDescriptionMessage\",\n PeerConnectionCandidateMessage = \"PeerConnectionCandidateMessage\",\n StreamingSourcesMessage = \"StreamingSourcesMessage\",\n}\n\nexport class ConnectionRequest {\n public readonly $type = WarprSignalingMessageType.ConnectionRequest;\n public SessionId?: string;\n}\n\nexport class PairingCompleteMessage {\n public readonly $type = WarprSignalingMessageType.PairingCompleteMessage;\n\n public IceServers?: string[];\n}\n\nexport function GetConfiguration(iceServers?: string[]): RTCConfiguration {\n let result: RTCConfiguration = {};\n result.iceServers = new Array<RTCIceServer>();\n\n if (iceServers) {\n let regex = /^(?<protocol>stun|turn):(?:(?<username>\\w+):(?<password>\\w+)@)?(?<url>[\\w\\.:?=&]+)$/im;\n for (let server of iceServers) {\n let match = regex.exec(server);\n if (!match || !match.groups) {\n console.warn(`Failed to parse ICE server URI ${server}.`);\n continue;\n }\n\n result.iceServers.push({\n urls: `${match.groups['protocol']}:${match.groups['url']}`,\n username: match.groups['username'],\n credential: match.groups['password']\n });\n }\n }\n\n return result;\n}\n\nexport class PeerConnectionDescriptionMessage {\n public readonly $type = WarprSignalingMessageType.PeerConnectionDescriptionMessage;\n public Description?: string;\n}\n\nexport class PeerConnectionCandidateMessage {\n public readonly $type = WarprSignalingMessageType.PeerConnectionCandidateMessage;\n public Candidate?: string;\n}\nexport class StreamingSourcesMessage {\n public readonly $type = WarprSignalingMessageType.StreamingSourcesMessage;\n public Sources?: string[];\n}\n\nexport type WarprSignalingMessage =\n ConnectionRequest |\n PairingCompleteMessage |\n PeerConnectionDescriptionMessage |\n PeerConnectionCandidateMessage |\n StreamingSourcesMessage;\n","export enum WarprStreamingMessageType {\n PointerInputMessage = \"PointerInputMessage\",\n ResizeSurfaceMessage = \"ResizeSurfaceMessage\",\n RequestKeyFrameMessage = \"RequestKeyFrameMessage\",\n}\n\nexport type Point = {\n X: number;\n Y: number;\n}\n\nexport enum PointerType {\n Unknown = \"Unknown\",\n Mouse = \"Mouse\",\n Pen = \"Pen\",\n Touch = \"Touch\"\n}\n\nexport enum PointerAction {\n Unknown = \"Unknown\",\n Pressed = \"Pressed\",\n Moved = \"Moved\",\n Released = \"Released\",\n WheelChanged = \"WheelChanged\"\n}\n\nexport enum PointerFlags {\n None = 0,\n LeftButton = 1,\n MiddleButton = 2,\n RightButton = 4,\n Wheel = 8,\n Captured = 16\n};\n\nexport class PointerState {\n public Buttons = 0;\n public Position: Point = { X: 0, Y: 0 };\n}\n\nexport type PointerStates = { [key: number]: PointerState };\n\nexport class PointerInputMessage {\n public readonly $type = WarprStreamingMessageType.PointerInputMessage;\n\n public Id = -1;\n public Type = PointerType.Unknown;\n public Action = PointerAction.Unknown;\n public Position: Point = { X: 0, Y: 0 };\n public Flags = PointerFlags.None;\n public WheelDelta = 0;\n\n constructor(event: PointerEvent, states: PointerStates, target: HTMLCanvasElement, wheelDelta: number) {\n\n let state = states[event.pointerId];\n if (state === undefined) {\n state = new PointerState();\n states[event.pointerId] = state;\n }\n\n this.Id = event.pointerId;\n let position: Point = { X: event.x, Y: event.y };\n\n switch (event.pointerType) {\n case \"mouse\":\n this.Type = PointerType.Mouse;\n break;\n case \"pen\":\n this.Type = PointerType.Pen;\n break;\n case \"touch\":\n this.Type = PointerType.Touch;\n break;\n default:\n this.Type = PointerType.Mouse;\n break;\n }\n\n switch (event.type) {\n case \"pointerdown\":\n this.Action = PointerAction.Pressed;\n state.Buttons |= 1 << event.button\n break;\n case \"pointerup\":\n this.Action = PointerAction.Released;\n state.Buttons &= ~(1 << event.button)\n break;\n case \"pointermove\":\n this.Action = PointerAction.Moved;\n break;\n case \"wheel\":\n this.Action = PointerAction.WheelChanged;\n position = state.Position;\n break;\n }\n\n if (state.Buttons & 1) this.Flags |= PointerFlags.LeftButton;\n if (state.Buttons & 2) this.Flags |= PointerFlags.MiddleButton;\n if (state.Buttons & 4) this.Flags |= PointerFlags.RightButton;\n if (wheelDelta != 0) this.Flags |= PointerFlags.Wheel;\n if (target.hasPointerCapture(event.pointerId)) this.Flags |= PointerFlags.Captured;\n\n this.Position = PointerInputMessage.GetRemotePosition(position, target);\n this.WheelDelta = -wheelDelta;\n\n state.Position = position;\n }\n\n private static GetRemotePosition(position: Point, target: HTMLCanvasElement): Point {\n let offsetX = 0;\n let offsetY = 0;\n let scale = 1;\n let canvasAspectRatio = target.clientWidth / target.clientHeight;\n let videoAspectRatio = target.width / target.height;\n\n if (videoAspectRatio > canvasAspectRatio) {\n offsetY = 0.5 * (target.clientHeight - target.clientWidth / videoAspectRatio);\n scale = target.width / target.clientWidth;\n } else {\n offsetX = 0.5 * (target.clientWidth - target.clientHeight * videoAspectRatio);\n scale = target.height / target.clientHeight;\n }\n\n return {\n X: (position.X - offsetX) * scale,\n Y: (position.Y - offsetY) * scale\n };\n }\n}\n\nexport class ResizeSurfaceMessage {\n public readonly $type = WarprStreamingMessageType.ResizeSurfaceMessage;\n\n constructor(\n public Width: number,\n public Height: number\n ) { }\n}\n\nexport class RequestKeyFrameMessage {\n public readonly $type = WarprStreamingMessageType.RequestKeyFrameMessage;\n}\n\nexport type WarprStreamingMessage =\n PointerInputMessage |\n ResizeSurfaceMessage |\n RequestKeyFrameMessage;\n","export type EventHandler<TSender, TEventArgs> = (sender: TSender, eventArgs: TEventArgs) => void;\n\nexport interface IEventSource {\n\n Unsubscribe(token: symbol): void;\n}\n\nexport class EventSubscription {\n\n constructor(\n private _owner: IEventSource,\n private _token: symbol) { }\n\n Unsubscribe() {\n this._owner.Unsubscribe(this._token);\n }\n}\n\nexport class EventOwner {\n\n public readonly Token = Symbol();\n\n Raise<TSender, TEventArgs>(event: EventPublisher<TSender, TEventArgs>, sender: TSender, eventArgs: TEventArgs) {\n event.Raise(this, sender, eventArgs);\n }\n}\n\nexport class EventArgs {\n public static readonly Empty = new EventArgs();\n}\n\nexport class EventPublisher<TSender, TEventArgs> implements IEventSource {\n\n private readonly _token: symbol;\n private readonly _handlers = new Map<symbol, EventHandler<TSender, TEventArgs>>;\n\n constructor(owner: EventOwner) {\n this._token = owner.Token;\n }\n\n Subscribe(handler: EventHandler<TSender, TEventArgs>) {\n const token = Symbol();\n this._handlers.set(token, handler);\n return new EventSubscription(this, token);\n }\n\n Raise(owner: EventOwner, sender: TSender, eventArgs: TEventArgs): void {\n if (owner.Token === this._token) {\n for (let [symbol, handler] of this._handlers) {\n handler(sender, eventArgs);\n }\n }\n else {\n throw Error(\"Cannot raise event: this event source does not belong to the specified owner.\");\n }\n }\n\n Unsubscribe(token: symbol): void {\n this._handlers.delete(token);\n }\n}\n","import { ArrayStream } from \"./array-stream\";\n\nclass MessageBuilder {\n public readonly FragmentCount: number;\n public FragmentsReady: number = 0;\n public Buffer: Uint8Array;\n\n constructor(\n public readonly Id: number,\n public readonly Size: number,\n public readonly FragmentSize: number\n ) {\n this.FragmentCount = Math.ceil(Size / FragmentSize);\n this.Buffer = new Uint8Array(Size);\n }\n\n AddFragment(index: number, buffer: Uint8Array): boolean {\n if (this.FragmentCount == this.FragmentsReady) throw RangeError(\"All message parts have been already collected.\");\n\n this.Buffer.set(buffer, this.FragmentSize * index);\n this.FragmentsReady++;\n\n return this.FragmentCount == this.FragmentsReady;\n }\n}\n\nexport class MessageAssembler {\n\n private _builders = new Map<number, MessageBuilder>();\n\n public constructor(private _maxBuilderCount = 3) { }\n\n public PushMessage(buffer: ArrayBuffer): ArrayBuffer | null {\n let stream = new ArrayStream(buffer);\n let messageIndex = stream.ReadUInt32();\n let messageSize = stream.ReadUInt32();\n let fragmentSize = stream.ReadUInt32();\n let fragmentIndex = stream.ReadUInt32();\n let fragment = new Uint8Array(stream.ReadToEnd());\n\n let builder = this._builders.get(messageIndex);\n if (builder === undefined) {\n builder = new MessageBuilder(messageIndex, messageSize, fragmentSize);\n this._builders.set(messageIndex, builder);\n\n if (this._builders.size > this._maxBuilderCount) {\n let [oldest] = this._builders.keys();\n this._builders.delete(oldest);\n console.log(\"Message lost.\");\n }\n }\n\n if (builder.AddFragment(fragmentIndex, fragment)) {\n this._builders.delete(messageIndex);\n return builder.Buffer.buffer;\n } else {\n return null;\n }\n }\n}\n","import { EventOwner, EventPublisher, EventArgs } from \"../infrastructure/events\";\nimport { IMessagingClient } from \"./messaging-client\";\n\nexport class WebSocketClient<TMessage> implements IMessagingClient<TMessage> {\n private readonly _events = new EventOwner();\n\n public readonly Connected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);\n public readonly MessageReceived = new EventPublisher<IMessagingClient<TMessage>, TMessage>(this._events);\n public readonly Disconnected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);\n\n private _socket?: WebSocket;\n\n constructor(private _uri: string) { }\n\n Connect(): void {\n console.log(`Connecting to ${this._uri}...`);\n\n let socket = new WebSocket(this._uri);\n socket.onopen = () => this.OnConnected();\n socket.onmessage = (e: MessageEvent<string>) => this.OnMessageReceived(e);\n socket.onclose = () => this.OnDisconnected();\n socket.onerror = (e: Event) => this.OnError(e);\n this._socket = socket;\n }\n\n SendMessage(message: TMessage): void {\n if (!this._socket) return;\n\n let content = JSON.stringify(message);\n console.debug(`Sending message: ${content}`);\n\n this._socket.send(content);\n }\n\n protected OnConnected(): void {\n console.log(`Connected to: ${this._uri}.`);\n this._events.Raise(this.Connected, this, EventArgs.Empty);\n }\n\n protected OnMessageReceived(eventArgs: MessageEvent<string>): void {\n console.debug('Message received: ' + eventArgs.data);\n\n let message = JSON.parse(eventArgs.data) as TMessage;\n this._events.Raise(this.MessageReceived, this, message);\n }\n\n protected OnDisconnected(): void {\n console.log(`Disconnected from: ${this._uri}.`);\n this._events.Raise(this.Disconnected, this, EventArgs.Empty);\n }\n\n protected OnError(error: Event): void {\n console.log('Connection failed: ' + error);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WebSocketClient } from '../networking/web-socket-client';\nimport { WarprSignalingMessage, ConnectionRequest } from '../data/signaling-messages';\nimport { v4 as uuid } from 'uuid';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MessagingService extends WebSocketClient<WarprSignalingMessage> {\n\n private static readonly _connectionUri = 'api/sinks/connect';\n private readonly _sessionId = uuid();\n\n constructor() {\n const uri = MessagingService.GetServerUri();\n super(uri);\n }\n\n private static GetServerUri(): string {\n const location = window.location;\n const protocol = location.protocol === 'https:' ? 'wss' : 'ws';\n return `${protocol}://${location.host}/${this._connectionUri}`;\n }\n\n protected override OnConnected(): void {\n super.OnConnected();\n\n let request = new ConnectionRequest();\n request.SessionId = this._sessionId;\n this.SendMessage(request);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { MessagingService } from './messaging.service';\nimport { GetConfiguration, PairingCompleteMessage, PeerConnectionCandidateMessage, PeerConnectionDescriptionMessage, WarprSignalingMessage, WarprSignalingMessageType } from '../data/signaling-messages';\nimport { IMessagingClient } from '../networking/messaging-client';\nimport { EncodedFrame } from '../data/frames';\nimport { EventOwner, EventPublisher } from '../infrastructure/events';\nimport { MessageAssembler } from '../infrastructure/message-assembler';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class StreamingService {\n\n private _peerConnection?: RTCPeerConnection;\n private _controlConnection?: RTCDataChannel;\n\n private _streamConnection?: RTCDataChannel;\n private _messageBuilder?: MessageAssembler;\n\n private _auxConnection?: RTCDataChannel;\n\n private readonly _events = new EventOwner();\n public readonly FrameReceived = new EventPublisher<StreamingService, EncodedFrame>(this._events);\n public readonly Connected = new EventPublisher<StreamingService, any>(this._events);\n\n public readonly ControlMessageReceived = new EventPublisher<StreamingService, any>(this._events);\n public readonly AuxMessageReceived = new EventPublisher<StreamingService, any>(this._events);\n\n constructor(\n private _messagingService: MessagingService) {\n\n _messagingService.MessageReceived.Subscribe((sender: IMessagingClient<WarprSignalingMessage>, message: WarprSignalingMessage) => this.OnSignalingMessageReceived(sender, message));\n _messagingService.Connect();\n }\n\n private Reconnect(configuration: RTCConfiguration) {\n console.log(\"Establishing peer connection...\");\n\n this._controlConnection?.close();\n this._streamConnection?.close();\n this._messageBuilder = new MessageAssembler();\n this._auxConnection?.close();\n this._peerConnection?.close();\n\n this._peerConnection = new RTCPeerConnection(configuration);\n this._peerConnection.onicecandidate = (event) => this.OnIceCandidateAdded(event.candidate?.candidate);\n this._peerConnection.ondatachannel = (event) => this.OnDataChannel(event);\n this._peerConnection.onconnectionstatechange = (event) => this.OnConnectionStateChanged();\n }\n\n public SendControlMessage(message: any) {\n let json = JSON.stringify(message);\n this._controlConnection?.send(json);\n }\n\n public SendAuxMessage(message: any) {\n this._auxConnection?.send(message);\n }\n\n private OnConnectionStateChanged() {\n console.log(\"WebRTC: \" + this._peerConnection?.connectionState);\n }\n\n private OnDataChannel(event: RTCDataChannelEvent) {\n console.log(`WebRTC data channel ${event.channel.label} connected.`);\n\n switch (event.channel.label) {\n case \"control\":\n this._controlConnection = event.channel;\n this._controlConnection.binaryType = \"arraybuffer\"\n this._controlConnection.onmessage = (event) => this._events.Raise(this.ControlMessageReceived, this, event.data);\n this._events.Raise(this.Connected, this, null);\n break;\n case \"stream\":\n this._streamConnection = event.channel;\n this._streamConnection.binaryType = \"arraybuffer\"\n this._streamConnection.onmessage = (event) => this.OnLowLatencyMessage(event);\n break;\n case \"aux\":\n this._auxConnection = event.channel;\n this._auxConnection.binaryType = \"arraybuffer\"\n this._auxConnection.onmessage = (event) => this._events.Raise(this.AuxMessageReceived, this, event.data);\n this._events.Raise(this.Connected, this, null);\n break;\n }\n }\n\n private _lastRefreshTime = performance.now();\n private _count = 0;\n\n private OnLowLatencyMessage(event: MessageEvent<any>) {\n\n let message = this._messageBuilder?.PushMessage(event.data as ArrayBuffer);\n if (!message) return;\n\n let now = performance.now();\n let elapsed = now - this._lastRefreshTime;\n this._count++;\n\n if (elapsed > 1000) {\n this._lastRefreshTime = now;\n\n console.debug(`Messages: ${this._count / elapsed * 1000} FPS`);\n this._count = 0;\n }\n\n let frame = new EncodedFrame(message);\n this._events.Raise(this.FrameReceived, this, frame);\n }\n\n private OnIceCandidateAdded(candidate?: string) {\n if (candidate == null) return;\n\n let message = new PeerConnectionCandidateMessage();\n message.Candidate = candidate;\n this._messagingService.SendMessage(message);\n }\n\n private async OnSignalingMessageReceived(sender: IMessagingClient<WarprSignalingMessage>, message: WarprSignalingMessage) {\n\n switch (message.$type) {\n case WarprSignalingMessageType.PairingCompleteMessage:\n this.Reconnect(GetConfiguration(message.IceServers));\n break;\n case WarprSignalingMessageType.PeerConnectionDescriptionMessage:\n if (!this._peerConnection) return;\n\n await this._peerConnection.setRemoteDescription({ type: \"offer\", sdp: message.Description });\n let answer = await this._peerConnection.createAnswer();\n await this._peerConnection.setLocalDescription(answer);\n\n let answerMessage = new PeerConnectionDescriptionMessage();\n answerMessage.Description = answer.sdp;\n this._messagingService.SendMessage(answerMessage);\n\n break;\n case WarprSignalingMessageType.PeerConnectionCandidateMessage:\n if (!this._peerConnection) return;\n\n await this._peerConnection.addIceCandidate({ candidate: message.Candidate, sdpMid: \"0\" });\n break;\n }\n\n }\n}\n","import { Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { StreamingService } from '../../services/streaming.service';\nimport { EncodedFrame, FrameType, Size } from '../../data/frames';\nimport { PointerInputMessage, PointerStates, RequestKeyFrameMessage, ResizeSurfaceMessage } from '../../data/streaming-messages';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'warpr-stream-host',\n imports: [CommonModule],\n templateUrl: './stream-host.component.html',\n styleUrl: './stream-host.component.scss'\n})\nexport class StreamHostComponent {\n private static readonly _maxFramesInDecodeQueue = 10;\n\n @Input()\n public isMenuVisible = true;\n\n @ViewChild(\"renderTarget\")\n private _canvas?: ElementRef<HTMLCanvasElement>;\n private _renderingContext: CanvasRenderingContext2D | null = null;\n\n private _decoder: VideoDecoder | null = null;\n private _framePending?: VideoFrame;\n private _videoSize = Size.Empty;\n private _displaySize = Size.Empty;\n private _isDecoderInitialized = false;\n private _pointerStates: PointerStates = {};\n private _framesInDecodeQueue = 0;\n\n public get IsFullScreenAvailable(): boolean {\n return document.fullscreenEnabled && this.isMenuVisible;\n }\n\n public constructor(\n private _streamingService: StreamingService,\n private _root: ElementRef<HTMLDivElement>) {\n this._streamingService.Connected.Subscribe((sender, eventArgs) => this.OnConnected());\n this._streamingService.FrameReceived.Subscribe((sender, eventArgs) => this.OnFrameReceived(eventArgs));\n }\n\n private async ngAfterViewInit() {\n\n console.log(\"Initializing stream host...\");\n\n let canvas = this._canvas!.nativeElement;\n this._renderingContext = canvas.getContext(\"2d\")!;\n canvas.onpointerdown = (event) => this.OnPointerEvent(event);\n canvas.onpointermove = (event) => this.OnPointerEvent(event);\n canvas.onpointerup = (event) => this.OnPointerEvent(event);\n canvas.onwheel = (event) => this.OnWheelEvent(event);\n canvas.oncontextmenu = (event) => event.preventDefault();\n\n if (this._renderingContext) {\n console.log(\"Stream host initialized.\");\n }\n else {\n console.log(\"Stream host failed to initialize.\");\n }\n\n requestAnimationFrame(() => this.RenderFrame());\n }\n\n private OnPointerEvent(event: PointerEvent, wheelDelta = 0) {\n //console.log(event);\n event.preventDefault();\n\n if (event.type == \"pointerdown\") this._canvas!.nativeElement.setPointerCapture(event.pointerId);\n\n let message = new PointerInputMessage(event, this._pointerStates, this._canvas!.nativeElement, wheelDelta);\n //console.log(message);\n\n this._streamingService.SendControlMessage(message);\n }\n\n private OnWheelEvent(event: WheelEvent) {\n //console.log(event);\n event.preventDefault();\n\n let pointerEvent: PointerEvent = new PointerEvent(event.type, { ...event, pointerId: 1 });\n this.OnPointerEvent(pointerEvent, event.deltaY);\n }\n\n private OnConnected() {\n this._displaySize = Size.Empty;\n }\n\n private OnFrameReceived(frame: EncodedFrame) {\n let chunk = new EncodedVideoChunk({\n data: frame.Bytes,\n type: frame.Type == FrameType.Key ? \"key\" : \"delta\",\n timestamp: frame.Index\n });\n\n //Initialize decoder\n let frameSize = new Size(frame.Width, frame.Height);\n\n if (this._decoder === null || this._decoder.state === 'closed' || !Size.AreEqual(frameSize, this._videoSize) || this._framesInDecodeQueue > StreamHostComponent._maxFramesInDecodeQueue) {\n console.log(\"Configuring decoder...\");\n\n if (this._decoder !== null && this._decoder.state !== 'closed') this._decoder.close();\n this._decoder = new VideoDecoder({\n output: (frame) => this.OnFrameDecoded(frame),\n error: (error) => {\n console.error(error);\n this._streamingService.SendControlMessage(new RequestKeyFrameMessage());\n }\n });\n this._isDecoderInitialized = false;\n\n this._decoder.configure({\n codec: \"hvc1.1.6.L93.B0\",\n codedWidth: frame.Width,\n codedHeight: frame.Height,\n hardwareAcceleration: \"prefer-hardware\",\n optimizeForLatency: true\n });\n console.log(\"Decoder configured.\");\n console.log(`Resolution is ${frame.Width} x ${frame.Height}.`);\n\n this._videoSize = frameSize;\n this._framesInDecodeQueue = 0;\n }\n\n //Decode frame\n if (!this._isDecoderInitialized && chunk.type != \"key\") {\n this._streamingService.SendControlMessage(new RequestKeyFrameMessage());\n return;\n }\n this._isDecoderInitialized = true;\n\n this._decoder.decode(chunk);\n this._framesInDecodeQueue++;\n }\n\n private OnFrameDecoded(frame: VideoFrame) {\n this._framesInDecodeQueue--;\n\n if (this._framePending) this._framePending.close();\n this._framePending = frame;\n requestAnimationFrame(() => this.RenderFrame());\n }\n\n private RenderFrame() {\n\n let frame = this._framePending;\n this._framePending = undefined;\n\n if (frame) {\n\n //Set canvas resolution to video resolution\n let canvas = this._canvas!.nativeElement;\n canvas.width = frame.displayWidth;\n canvas.height = frame.displayHeight;\n\n //Check for control size change\n let canvasRect = canvas.getBoundingClientRect();\n let canvasSize = new Size(Math.round(canvasRect.width * window.devicePixelRatio), Math.round(canvasRect.height * window.devicePixelRatio));\n if (!Size.AreEqual(canvasSize, this._displaySize)) {\n this._displaySize = canvasSize;\n\n console.log(`Resized to ${canvasSize.Width} x ${canvasSize.Height}`);\n let message = new ResizeSurfaceMessage(canvasSize.Width, canvasSize.Height);\n this._streamingService.SendControlMessage(message);\n }\n\n //Draw new frame\n if (this._renderingContext) {\n this._renderingContext.drawImage(frame, 0, 0, frame.displayWidth, frame.displayHeight);\n }\n\n //Release memory\n frame.close();\n }\n }\n\n public ToggleFullScreen() {\n if (document.fullscreenElement === this._root?.nativeElement) {\n document.exitFullscreen();\n }\n else {\n this._root?.nativeElement.requestFullscreen();\n }\n }\n}\n","<canvas #renderTarget class=\"renderTarget\"></canvas>\n<div class=\"overlay\" (click)=\"ToggleFullScreen()\" *ngIf=\"IsFullScreenAvailable\" title=\"Warpr\">W</div>\n","/*\n * Public API Surface of warpr-lib\n */\n\nexport * from './lib/data/frames';\nexport * from './lib/data/signaling-messages';\nexport * from './lib/data/streaming-messages';\nexport * from './lib/infrastructure/array-stream';\nexport * from './lib/infrastructure/events';\nexport * from './lib/infrastructure/message-assembler';\nexport * from './lib/networking/messaging-client';\nexport * from './lib/networking/web-socket-client';\nexport * from './lib/services/messaging.service';\nexport * from './lib/services/streaming.service';\nexport * from './lib/components/stream-host/stream-host.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuid","i1.MessagingService","i1.StreamingService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"warpr.mjs","sources":["../../../projects/warpr-lib/src/lib/infrastructure/array-stream.ts","../../../projects/warpr-lib/src/lib/data/frames.ts","../../../projects/warpr-lib/src/lib/data/signaling-messages.ts","../../../projects/warpr-lib/src/lib/data/streaming-messages.ts","../../../projects/warpr-lib/src/lib/infrastructure/events.ts","../../../projects/warpr-lib/src/lib/infrastructure/memory-stream.ts","../../../projects/warpr-lib/src/lib/infrastructure/messages.ts","../../../projects/warpr-lib/src/lib/infrastructure/message-assembler.ts","../../../projects/warpr-lib/src/lib/infrastructure/message-splitter.ts","../../../projects/warpr-lib/src/lib/networking/web-socket-client.ts","../../../projects/warpr-lib/src/lib/services/messaging.service.ts","../../../projects/warpr-lib/src/lib/services/streaming.service.ts","../../../projects/warpr-lib/src/lib/components/stream-host/stream-host.component.ts","../../../projects/warpr-lib/src/lib/components/stream-host/stream-host.component.html","../../../projects/warpr-lib/src/public-api.ts","../../../projects/warpr-lib/src/warpr.ts"],"sourcesContent":["export class ArrayStream {\n private _view: DataView;\n private _position: number;\n\n public constructor(buffer: ArrayBuffer) {\n this._view = new DataView(buffer);\n this._position = 0;\n }\n\n public get Position(): number {\n return this._position;\n }\n\n public set Position(value: number) {\n if (value < 0 || this._view.buffer.byteLength < value) {\n throw new RangeError(\"The provided value lies outside the stream's bounds.\");\n }\n\n this._position = value;\n }\n\n public ReadBool(): boolean {\n let result = this._view.getUint8(this._position) != 0;\n this._position += 1;\n return result;\n }\n\n public ReadUInt8(): number {\n let result = this._view.getUint8(this._position);\n this._position += 1;\n return result;\n }\n\n public ReadUInt16(): number {\n let result = this._view.getUint16(this._position, true);\n this._position += 2;\n return result;\n }\n\n public ReadUInt32(): number {\n let result = this._view.getUint32(this._position, true);\n this._position += 4;\n return result;\n }\n\n public ReadUInt64(): bigint {\n let result = this._view.getBigUint64(this._position, true);\n this._position += 8;\n return result;\n }\n\n public ReadInt8(): number {\n let result = this._view.getInt8(this._position);\n this._position += 1;\n return result;\n }\n\n public ReadInt16(): number {\n let result = this._view.getInt16(this._position, true);\n this._position += 2;\n return result;\n }\n\n public ReadInt32(): number {\n let result = this._view.getInt32(this._position, true);\n this._position += 4;\n return result;\n }\n\n public ReadInt64(): bigint {\n let result = this._view.getBigInt64(this._position, true);\n this._position += 8;\n return result;\n }\n\n public ReadSingle(): number {\n let result = this._view.getFloat32(this._position, true);\n this._position += 4;\n return result;\n }\n\n public ReadDouble(): number {\n let result = this._view.getFloat64(this._position, true);\n this._position += 8;\n return result;\n }\n\n public ReadBuffer(): ArrayBuffer {\n let length = this.ReadUInt32();\n let result = this._view.buffer.slice(this._position, this._position + length);\n this._position += length;\n return result;\n }\n\n public ReadToEnd(): ArrayBuffer {\n let length = this._view.buffer.byteLength - this._position;\n let result = this._view.buffer.slice(this._position, this._position + length);\n this._position += length;\n return result;\n }\n\n public ReadString() {\n let length = this.ReadUInt32();\n let decoder = new TextDecoder();\n let result = decoder.decode(this._view.buffer.slice(this._position, this._position + length));\n this._position += length;\n return result;\n }\n}\n","import { ArrayStream } from \"../infrastructure/array-stream\";\n\nexport enum FrameType {\n Unknown,\n Key,\n Delta\n}\n\nexport class EncodedFrame {\n public Index: number;\n public Type: FrameType;\n public Width: number;\n public Height: number;\n public Bytes: ArrayBuffer;\n\n public constructor(buffer: ArrayBuffer) {\n let stream = new ArrayStream(buffer);\n\n this.Type = stream.ReadUInt32();\n this.Index = stream.ReadUInt32();\n this.Width = stream.ReadUInt32();\n this.Height = stream.ReadUInt32();\n this.Bytes = stream.ReadBuffer();\n }\n}\n\nexport class Size {\n public constructor(\n public Width: number,\n public Height: number) { }\n\n public static Empty: Size = { Width: 0, Height: 0 };\n\n public static AreEqual(a: Size, b: Size) {\n return a.Width === b.Width && a.Height === b.Height;\n }\n}\n","\nexport enum WarprSignalingMessageType {\n ConnectionRequest = \"ConnectionRequest\",\n PairingCompleteMessage = \"PairingCompleteMessage\",\n PeerConnectionDescriptionMessage = \"PeerConnectionDescriptionMessage\",\n PeerConnectionCandidateMessage = \"PeerConnectionCandidateMessage\",\n StreamingSourcesMessage = \"StreamingSourcesMessage\",\n}\n\nexport class ConnectionRequest {\n public readonly $type = WarprSignalingMessageType.ConnectionRequest;\n public SessionId?: string;\n}\n\nexport class PairingCompleteMessage {\n public readonly $type = WarprSignalingMessageType.PairingCompleteMessage;\n\n public IceServers?: string[];\n}\n\nexport function GetConfiguration(iceServers?: string[]): RTCConfiguration {\n let result: RTCConfiguration = {};\n result.iceServers = new Array<RTCIceServer>();\n\n if (iceServers) {\n let regex = /^(?<protocol>stun|turn):(?:(?<username>\\w+):(?<password>\\w+)@)?(?<url>[\\w\\.:?=&]+)$/im;\n for (let server of iceServers) {\n let match = regex.exec(server);\n if (!match || !match.groups) {\n console.warn(`Failed to parse ICE server URI ${server}.`);\n continue;\n }\n\n result.iceServers.push({\n urls: `${match.groups['protocol']}:${match.groups['url']}`,\n username: match.groups['username'],\n credential: match.groups['password']\n });\n }\n }\n\n return result;\n}\n\nexport class PeerConnectionDescriptionMessage {\n public readonly $type = WarprSignalingMessageType.PeerConnectionDescriptionMessage;\n public Description?: string;\n}\n\nexport class PeerConnectionCandidateMessage {\n public readonly $type = WarprSignalingMessageType.PeerConnectionCandidateMessage;\n public Candidate?: string;\n}\nexport class StreamingSourcesMessage {\n public readonly $type = WarprSignalingMessageType.StreamingSourcesMessage;\n public Sources?: string[];\n}\n\nexport type WarprSignalingMessage =\n ConnectionRequest |\n PairingCompleteMessage |\n PeerConnectionDescriptionMessage |\n PeerConnectionCandidateMessage |\n StreamingSourcesMessage;\n","export enum WarprStreamingMessageType {\n PointerInputMessage = \"PointerInputMessage\",\n ResizeSurfaceMessage = \"ResizeSurfaceMessage\",\n RequestKeyFrameMessage = \"RequestKeyFrameMessage\",\n}\n\nexport type Point = {\n X: number;\n Y: number;\n}\n\nexport enum PointerType {\n Unknown = \"Unknown\",\n Mouse = \"Mouse\",\n Pen = \"Pen\",\n Touch = \"Touch\"\n}\n\nexport enum PointerAction {\n Unknown = \"Unknown\",\n Pressed = \"Pressed\",\n Moved = \"Moved\",\n Released = \"Released\",\n WheelChanged = \"WheelChanged\"\n}\n\nexport enum PointerFlags {\n None = 0,\n LeftButton = 1,\n MiddleButton = 2,\n RightButton = 4,\n Wheel = 8,\n Captured = 16\n};\n\nexport class PointerState {\n public Buttons = 0;\n public Position: Point = { X: 0, Y: 0 };\n}\n\nexport type PointerStates = { [key: number]: PointerState };\n\nexport class PointerInputMessage {\n public readonly $type = WarprStreamingMessageType.PointerInputMessage;\n\n public Id = -1;\n public Type = PointerType.Unknown;\n public Action = PointerAction.Unknown;\n public Position: Point = { X: 0, Y: 0 };\n public Flags = PointerFlags.None;\n public WheelDelta = 0;\n\n constructor(event: PointerEvent, states: PointerStates, target: HTMLCanvasElement, wheelDelta: number) {\n\n let state = states[event.pointerId];\n if (state === undefined) {\n state = new PointerState();\n states[event.pointerId] = state;\n }\n\n this.Id = event.pointerId;\n let position: Point = { X: event.x, Y: event.y };\n\n switch (event.pointerType) {\n case \"mouse\":\n this.Type = PointerType.Mouse;\n break;\n case \"pen\":\n this.Type = PointerType.Pen;\n break;\n case \"touch\":\n this.Type = PointerType.Touch;\n break;\n default:\n this.Type = PointerType.Mouse;\n break;\n }\n\n switch (event.type) {\n case \"pointerdown\":\n this.Action = PointerAction.Pressed;\n state.Buttons |= 1 << event.button\n break;\n case \"pointerup\":\n this.Action = PointerAction.Released;\n state.Buttons &= ~(1 << event.button)\n break;\n case \"pointermove\":\n this.Action = PointerAction.Moved;\n break;\n case \"wheel\":\n this.Action = PointerAction.WheelChanged;\n position = state.Position;\n break;\n }\n\n if (state.Buttons & 1) this.Flags |= PointerFlags.LeftButton;\n if (state.Buttons & 2) this.Flags |= PointerFlags.MiddleButton;\n if (state.Buttons & 4) this.Flags |= PointerFlags.RightButton;\n if (wheelDelta != 0) this.Flags |= PointerFlags.Wheel;\n if (target.hasPointerCapture(event.pointerId)) this.Flags |= PointerFlags.Captured;\n\n this.Position = PointerInputMessage.GetRemotePosition(position, target);\n this.WheelDelta = -wheelDelta;\n\n state.Position = position;\n }\n\n private static GetRemotePosition(position: Point, target: HTMLCanvasElement): Point {\n let offsetX = 0;\n let offsetY = 0;\n let scale = 1;\n let canvasAspectRatio = target.clientWidth / target.clientHeight;\n let videoAspectRatio = target.width / target.height;\n\n if (videoAspectRatio > canvasAspectRatio) {\n offsetY = 0.5 * (target.clientHeight - target.clientWidth / videoAspectRatio);\n scale = target.width / target.clientWidth;\n } else {\n offsetX = 0.5 * (target.clientWidth - target.clientHeight * videoAspectRatio);\n scale = target.height / target.clientHeight;\n }\n\n return {\n X: (position.X - offsetX) * scale,\n Y: (position.Y - offsetY) * scale\n };\n }\n}\n\nexport class ResizeSurfaceMessage {\n public readonly $type = WarprStreamingMessageType.ResizeSurfaceMessage;\n\n constructor(\n public Width: number,\n public Height: number\n ) { }\n}\n\nexport class RequestKeyFrameMessage {\n public readonly $type = WarprStreamingMessageType.RequestKeyFrameMessage;\n}\n\nexport type WarprStreamingMessage =\n PointerInputMessage |\n ResizeSurfaceMessage |\n RequestKeyFrameMessage;\n","export type EventHandler<TSender, TEventArgs> = (sender: TSender, eventArgs: TEventArgs) => void;\n\nexport interface IEventSource {\n\n Unsubscribe(token: symbol): void;\n}\n\nexport class EventSubscription {\n\n constructor(\n private _owner: IEventSource,\n private _token: symbol) { }\n\n Unsubscribe() {\n this._owner.Unsubscribe(this._token);\n }\n}\n\nexport class EventOwner {\n\n public readonly Token = Symbol();\n\n Raise<TSender, TEventArgs>(event: EventPublisher<TSender, TEventArgs>, sender: TSender, eventArgs: TEventArgs) {\n event.Raise(this, sender, eventArgs);\n }\n}\n\nexport class EventArgs {\n public static readonly Empty = new EventArgs();\n}\n\nexport class EventPublisher<TSender, TEventArgs> implements IEventSource {\n\n private readonly _token: symbol;\n private readonly _handlers = new Map<symbol, EventHandler<TSender, TEventArgs>>;\n\n constructor(owner: EventOwner) {\n this._token = owner.Token;\n }\n\n Subscribe(handler: EventHandler<TSender, TEventArgs>) {\n const token = Symbol();\n this._handlers.set(token, handler);\n return new EventSubscription(this, token);\n }\n\n Raise(owner: EventOwner, sender: TSender, eventArgs: TEventArgs): void {\n if (owner.Token === this._token) {\n for (let [symbol, handler] of this._handlers) {\n handler(sender, eventArgs);\n }\n }\n else {\n throw Error(\"Cannot raise event: this event source does not belong to the specified owner.\");\n }\n }\n\n Unsubscribe(token: symbol): void {\n this._handlers.delete(token);\n }\n}\n","export class MemoryStream {\n private _buffer: Uint8Array;\n private _size: number;\n private _capacity: number;\n private _dataView: DataView;\n\n public constructor(initialCapacity: number = 0) {\n this._capacity = initialCapacity;\n this._buffer = new Uint8Array(initialCapacity);\n this._dataView = new DataView(this._buffer.buffer);\n this._size = 0;\n }\n\n public Clear() {\n this._size = 0;\n }\n\n private Reserve(capacity: number): void {\n if (capacity > this._capacity) {\n this._capacity = capacity;\n\n let newBuffer = new Uint8Array(capacity);\n newBuffer.set(this._buffer);\n \n this._buffer = newBuffer;\n this._dataView = new DataView(this._buffer.buffer);\n }\n }\n\n public ToArrayBuffer(): ArrayBuffer {\n return this._buffer.buffer.slice(0, this._size) as ArrayBuffer;\n }\n\n public ToArrayBufferView(): Uint8Array<ArrayBuffer> {\n return new Uint8Array(this._buffer.buffer as ArrayBuffer, 0, this._size);\n }\n\n private ExtendCapacity(additionalBytes: number): void {\n let requiredCapacity = this._size + additionalBytes;\n if (requiredCapacity > this._capacity) {\n let newCapacity = Math.max(this._capacity * 2, requiredCapacity);\n this.Reserve(newCapacity);\n }\n }\n\n public WriteUInt32(value: number): void {\n this.ExtendCapacity(4);\n this._dataView.setUint32(this._size, value, true);\n this._size += 4;\n }\n\n public WriteBytes(bytes: Uint8Array): void {\n this.ExtendCapacity(bytes.length);\n this._buffer.set(bytes, this._size);\n this._size += bytes.length;\n }\n}\n","import { ArrayStream } from \"./array-stream\";\nimport { MemoryStream } from \"./memory-stream\";\n\nexport enum MessageContentType {\n Binary,\n Text\n}\n\nexport type MessageContent = ArrayBufferLike | string;\n\nexport const MaxSafeMessageSize = 256 * 1024;\n\nexport class MessageFragmentHeader {\n static readonly _fragmentSizeBits = 31;\n static readonly _fragmentSizeMask = ~(1 << MessageFragmentHeader._fragmentSizeBits);\n\n public MessageIndex = 0;\n public MessageSize = 0;\n public FragmentSizeWithContentType = 0;\n public FragmentIndex = 0;\n\n public get ContentType(): MessageContentType {\n return this.FragmentSizeWithContentType >>> MessageFragmentHeader._fragmentSizeBits;\n }\n\n public set ContentType(value: MessageContentType) {\n this.FragmentSizeWithContentType = this.FragmentSizeWithContentType & MessageFragmentHeader._fragmentSizeMask | (value << MessageFragmentHeader._fragmentSizeBits);\n }\n\n public get FragmentSize() : number\n {\n return this.FragmentSizeWithContentType & MessageFragmentHeader._fragmentSizeMask;\n }\n\n public set FragmentSize(value: number)\n {\n this.FragmentSizeWithContentType = this.FragmentSizeWithContentType & ~MessageFragmentHeader._fragmentSizeMask | value;\n }\n\n public Write(stream: MemoryStream)\n {\n stream.WriteUInt32(this.MessageIndex);\n stream.WriteUInt32(this.MessageSize);\n stream.WriteUInt32(this.FragmentSizeWithContentType);\n stream.WriteUInt32(this.FragmentIndex);\n }\n\n public Read(stream: ArrayStream)\n {\n this.MessageIndex = stream.ReadUInt32();\n this.MessageSize = stream.ReadUInt32();\n this.FragmentSizeWithContentType = stream.ReadUInt32();\n this.FragmentIndex = stream.ReadUInt32();\n }\n}\n","import { ArrayStream } from \"./array-stream\";\nimport { MessageContentType, MessageContent, MessageFragmentHeader } from \"./messages\";\n\nclass MessageBuilder {\n public readonly FragmentCount: number;\n public FragmentsReceived: number = 0;\n public Buffer: Uint8Array;\n private readonly _textDecoder = new TextDecoder();\n\n constructor(\n public readonly Id: number,\n public readonly Size: number,\n public readonly FragmentSize: number,\n public readonly ContentType: MessageContentType = MessageContentType.Binary\n ) {\n this.FragmentCount = Math.ceil(Size / FragmentSize);\n this.Buffer = new Uint8Array(Size);\n }\n\n AddFragment(index: number, buffer: Uint8Array): boolean {\n if (this.FragmentCount == this.FragmentsReceived) throw RangeError(\"All message parts have been already collected.\");\n\n this.Buffer.set(buffer, this.FragmentSize * index);\n this.FragmentsReceived++;\n\n return this.FragmentCount == this.FragmentsReceived;\n }\n\n GetMessage(): MessageContent | null {\n if (this.FragmentCount == this.FragmentsReceived) {\n switch (this.ContentType) {\n case MessageContentType.Binary:\n return this.Buffer.buffer;\n case MessageContentType.Text:\n return this._textDecoder.decode(this.Buffer.buffer);\n }\n }\n \n return null;\n }\n}\n\nexport class MessageAssembler {\n\n private _builders = new Map<number, MessageBuilder>();\n\n public constructor(private _maxBuilderCount = 1) { }\n\n public PushMessage(buffer: ArrayBuffer): MessageContent | null {\n let stream = new ArrayStream(buffer);\n \n let header = new MessageFragmentHeader();\n header.Read(stream);\n\n let fragment = new Uint8Array(stream.ReadToEnd());\n\n let builder = this._builders.get(header.MessageIndex);\n if (builder === undefined) {\n builder = new MessageBuilder(header.MessageIndex, header.MessageSize, header.FragmentSize, header.ContentType);\n this._builders.set(header.MessageIndex, builder);\n\n if (this._builders.size > this._maxBuilderCount) {\n let [oldest] = this._builders.keys();\n this._builders.delete(oldest);\n console.log(\"Message lost.\");\n }\n }\n\n if (builder.AddFragment(header.FragmentIndex, fragment)) {\n this._builders.delete(header.MessageIndex);\n\n return builder.GetMessage();\n } else {\n return null;\n }\n }\n}\n","import { MemoryStream } from \"./memory-stream\";\nimport { MaxSafeMessageSize, MessageContent, MessageContentType, MessageFragmentHeader } from \"./messages\";\n\nexport class MessageSplitter {\n private _messageIndex: number = 0;\n private readonly _textEncoder = new TextEncoder();\n\n public constructor(public MaxMessageSize = MaxSafeMessageSize) {\n }\n\n public *SplitMessage(message: MessageContent): Generator<Uint8Array<ArrayBuffer>> {\n let content: Uint8Array;\n let contentType : MessageContentType;\n\n if (typeof message === 'string') {\n content = this._textEncoder.encode(message);\n contentType = MessageContentType.Text;\n }\n else{\n content = new Uint8Array(message);\n contentType = MessageContentType.Binary;\n }\n \n let messageSize = this.MaxMessageSize - 16;\n let stream = new MemoryStream(this.MaxMessageSize);\n\n let header = new MessageFragmentHeader();\n header.MessageIndex = this._messageIndex++;\n header.MessageSize = content.length;\n header.ContentType = contentType;\n header.FragmentSize = messageSize;\n \n let position = 0;\n let fragmentIndex = 0;\n let fragments: ArrayBuffer[] = [];\n while (position < content.length) {\n let fragmentLength = Math.min(messageSize, content.length - position);\n\n header.Write(stream); \n stream.WriteBytes(content.subarray(position, position + fragmentLength));\n\n yield stream.ToArrayBufferView();\n stream.Clear();\n\n position += fragmentLength;\n header.FragmentIndex++;\n }\n }\n}\n","import { EventOwner, EventPublisher, EventArgs } from \"../infrastructure/events\";\nimport { IMessagingClient } from \"./messaging-client\";\n\nexport class WebSocketClient<TMessage> implements IMessagingClient<TMessage> {\n private readonly _events = new EventOwner();\n\n public readonly Connected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);\n public readonly MessageReceived = new EventPublisher<IMessagingClient<TMessage>, TMessage>(this._events);\n public readonly Disconnected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);\n\n private _socket?: WebSocket;\n\n constructor(private _uri: string) { }\n\n Connect(): void {\n console.log(`Connecting to ${this._uri}...`);\n\n let socket = new WebSocket(this._uri);\n socket.onopen = () => this.OnConnected();\n socket.onmessage = (e: MessageEvent<string>) => this.OnMessageReceived(e);\n socket.onclose = () => this.OnDisconnected();\n socket.onerror = (e: Event) => this.OnError(e);\n this._socket = socket;\n }\n\n SendMessage(message: TMessage): void {\n if (!this._socket) return;\n\n let content = JSON.stringify(message);\n console.debug(`Sending message: ${content}`);\n\n this._socket.send(content);\n }\n\n protected OnConnected(): void {\n console.log(`Connected to: ${this._uri}.`);\n this._events.Raise(this.Connected, this, EventArgs.Empty);\n }\n\n protected OnMessageReceived(eventArgs: MessageEvent<string>): void {\n console.debug('Message received: ' + eventArgs.data);\n\n let message = JSON.parse(eventArgs.data) as TMessage;\n this._events.Raise(this.MessageReceived, this, message);\n }\n\n protected OnDisconnected(): void {\n console.log(`Disconnected from: ${this._uri}.`);\n this._events.Raise(this.Disconnected, this, EventArgs.Empty);\n }\n\n protected OnError(error: Event): void {\n console.log('Connection failed: ' + error);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WebSocketClient } from '../networking/web-socket-client';\nimport { WarprSignalingMessage, ConnectionRequest } from '../data/signaling-messages';\nimport { v4 as uuid } from 'uuid';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MessagingService extends WebSocketClient<WarprSignalingMessage> {\n\n private static readonly _connectionUri = 'api/sinks/connect';\n private readonly _sessionId = uuid();\n public static ExternalServer: string | null = null;\n\n constructor() {\n const uri = MessagingService.GetServerUri();\n super(uri);\n }\n\n private static GetServerUri(): string {\n const location = new URL(MessagingService.ExternalServer || window.location.href);\n const protocol = location.protocol === 'https:' ? 'wss' : 'ws';\n return `${protocol}://${location.host}/${this._connectionUri}`;\n }\n\n protected override OnConnected(): void {\n super.OnConnected();\n\n let request = new ConnectionRequest();\n request.SessionId = this._sessionId;\n this.SendMessage(request);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { MessagingService } from './messaging.service';\nimport { GetConfiguration, PeerConnectionCandidateMessage, PeerConnectionDescriptionMessage, WarprSignalingMessage, WarprSignalingMessageType } from '../data/signaling-messages';\nimport { IMessagingClient } from '../networking/messaging-client';\nimport { EncodedFrame } from '../data/frames';\nimport { EventOwner, EventPublisher } from '../infrastructure/events';\nimport { MessageAssembler } from '../infrastructure/message-assembler';\nimport { MessageSplitter } from '../infrastructure/message-splitter';\nimport { MessageContent } from '../infrastructure/messages';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class StreamingService {\n\n private _peerConnection?: RTCPeerConnection;\n private _controlConnection?: RTCDataChannel;\n\n private _streamConnection?: RTCDataChannel;\n private _streamMessageBuilder?: MessageAssembler;\n\n private _auxConnection?: RTCDataChannel;\n private _auxMessageBuilder?: MessageAssembler;\n private _auxMessageSplitter?: MessageSplitter;\n\n private readonly _events = new EventOwner();\n public readonly FrameReceived = new EventPublisher<StreamingService, EncodedFrame>(this._events);\n public readonly Connected = new EventPublisher<StreamingService, any>(this._events);\n public readonly AuxChannelReady = new EventPublisher<StreamingService, any>(this._events);\n\n public readonly ControlMessageReceived = new EventPublisher<StreamingService, MessageContent>(this._events);\n public readonly AuxMessageReceived = new EventPublisher<StreamingService, MessageContent>(this._events);\n\n constructor(\n private _messagingService: MessagingService) {\n\n _messagingService.MessageReceived.Subscribe((sender: IMessagingClient<WarprSignalingMessage>, message: WarprSignalingMessage) => this.OnSignalingMessageReceived(sender, message));\n _messagingService.Connect();\n }\n\n private Reconnect(configuration: RTCConfiguration) {\n console.log(\"Establishing peer connection...\");\n\n this._controlConnection?.close();\n this._streamConnection?.close();\n this._auxConnection?.close();\n this._peerConnection?.close();\n\n this._streamMessageBuilder = new MessageAssembler(3);\n this._auxMessageBuilder = new MessageAssembler();\n this._auxMessageSplitter = new MessageSplitter();\n\n this._peerConnection = new RTCPeerConnection(configuration);\n this._peerConnection.onicecandidate = (event) => this.OnIceCandidateAdded(event.candidate?.candidate);\n this._peerConnection.ondatachannel = (event) => this.OnDataChannel(event);\n this._peerConnection.onconnectionstatechange = (event) => this.OnConnectionStateChanged();\n }\n\n public SendControlMessage(message: any) {\n let json = JSON.stringify(message);\n this._controlConnection?.send(json);\n }\n\n public SendAuxMessage(message: any) {\n if (!this._auxMessageSplitter) return;\n\n let fragments = this._auxMessageSplitter.SplitMessage(message);\n for (let fragment of fragments) {\n this._auxConnection?.send(fragment);\n }\n }\n\n private OnConnectionStateChanged() {\n console.log(\"WebRTC: \" + this._peerConnection?.connectionState);\n\n if (this._peerConnection?.connectionState === \"connected\") {\n let maxMessageSize = this._peerConnection?.sctp?.maxMessageSize;\n if (maxMessageSize) this._auxMessageSplitter!.MaxMessageSize = maxMessageSize;\n }\n }\n\n private OnDataChannel(event: RTCDataChannelEvent) {\n console.log(`WebRTC data channel ${event.channel.label} connected.`);\n\n switch (event.channel.label) {\n case \"control\":\n this._controlConnection = event.channel;\n this._controlConnection.binaryType = \"arraybuffer\"\n this._controlConnection.onmessage = (event) => this._events.Raise(this.ControlMessageReceived, this, event.data);\n break;\n case \"stream\":\n this._streamConnection = event.channel;\n this._streamConnection.binaryType = \"arraybuffer\"\n this._streamConnection.onmessage = (event) => this.OnStreamMessage(event);\n break;\n case \"aux\":\n this._auxConnection = event.channel;\n this._auxConnection.binaryType = \"arraybuffer\"\n this._auxConnection.onmessage = (event) => this.OnAuxMessage(event);\n this._events.Raise(this.Connected, this, null);\n break;\n }\n }\n\n private _lastFramerateRefreshTime = performance.now();\n private _frameCounter = 0;\n\n private OnStreamMessage(event: MessageEvent<any>) {\n\n let message = this._streamMessageBuilder?.PushMessage(event.data as ArrayBuffer);\n if (!message) return;\n\n this._frameCounter++;\n\n let now = performance.now();\n let elapsed = now - this._lastFramerateRefreshTime;\n if (elapsed > 1000) {\n this._lastFramerateRefreshTime = now;\n\n console.debug(`Messages: ${this._frameCounter / elapsed * 1000} FPS`);\n this._frameCounter = 0;\n }\n\n let frame = new EncodedFrame(message as ArrayBuffer);\n this._events.Raise(this.FrameReceived, this, frame);\n }\n\n private OnAuxMessage(event: MessageEvent<any>) {\n let message = this._auxMessageBuilder?.PushMessage(event.data);\n if (message) this._events.Raise(this.AuxMessageReceived, this, message);\n }\n\n private OnIceCandidateAdded(candidate?: string) {\n if (candidate == null) return;\n\n let message = new PeerConnectionCandidateMessage();\n message.Candidate = candidate;\n this._messagingService.SendMessage(message);\n }\n\n private async OnSignalingMessageReceived(sender: IMessagingClient<WarprSignalingMessage>, message: WarprSignalingMessage) {\n\n switch (message.$type) {\n case WarprSignalingMessageType.PairingCompleteMessage:\n this.Reconnect(GetConfiguration(message.IceServers));\n break;\n case WarprSignalingMessageType.PeerConnectionDescriptionMessage:\n if (!this._peerConnection) return;\n\n await this._peerConnection.setRemoteDescription({ type: \"offer\", sdp: message.Description });\n let answer = await this._peerConnection.createAnswer();\n await this._peerConnection.setLocalDescription(answer);\n\n let answerMessage = new PeerConnectionDescriptionMessage();\n answerMessage.Description = answer.sdp;\n this._messagingService.SendMessage(answerMessage);\n\n break;\n case WarprSignalingMessageType.PeerConnectionCandidateMessage:\n if (!this._peerConnection) return;\n\n await this._peerConnection.addIceCandidate({ candidate: message.Candidate, sdpMid: \"0\" });\n break;\n }\n\n }\n}\n","import { Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { StreamingService } from '../../services/streaming.service';\nimport { EncodedFrame, FrameType, Size } from '../../data/frames';\nimport { PointerInputMessage, PointerStates, RequestKeyFrameMessage, ResizeSurfaceMessage } from '../../data/streaming-messages';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'warpr-stream-host',\n imports: [CommonModule],\n templateUrl: './stream-host.component.html',\n styleUrl: './stream-host.component.scss'\n})\nexport class StreamHostComponent {\n private static readonly _maxFramesInDecodeQueue = 10;\n\n @Input()\n public isMenuVisible = true;\n\n @ViewChild(\"renderTarget\")\n private _canvas?: ElementRef<HTMLCanvasElement>;\n private _renderingContext: CanvasRenderingContext2D | null = null;\n\n private _decoder: VideoDecoder | null = null;\n private _framePending?: VideoFrame;\n private _videoSize = Size.Empty;\n private _displaySize = Size.Empty;\n private _isDecoderInitialized = false;\n private _pointerStates: PointerStates = {};\n private _framesInDecodeQueue = 0;\n\n public get IsFullScreenAvailable(): boolean {\n return document.fullscreenEnabled && this.isMenuVisible;\n }\n\n public constructor(\n private _streamingService: StreamingService,\n private _root: ElementRef<HTMLDivElement>) {\n this._streamingService.Connected.Subscribe((sender, eventArgs) => this.OnConnected());\n this._streamingService.FrameReceived.Subscribe((sender, eventArgs) => this.OnFrameReceived(eventArgs));\n }\n\n private async ngAfterViewInit() {\n\n console.log(\"Initializing stream host...\");\n\n let canvas = this._canvas!.nativeElement;\n this._renderingContext = canvas.getContext(\"2d\")!;\n canvas.onpointerdown = (event) => this.OnPointerEvent(event);\n canvas.onpointermove = (event) => this.OnPointerEvent(event);\n canvas.onpointerup = (event) => this.OnPointerEvent(event);\n canvas.onwheel = (event) => this.OnWheelEvent(event);\n canvas.oncontextmenu = (event) => event.preventDefault();\n\n if (this._renderingContext) {\n console.log(\"Stream host initialized.\");\n }\n else {\n console.log(\"Stream host failed to initialize.\");\n }\n\n requestAnimationFrame(() => this.RenderFrame());\n }\n\n private OnPointerEvent(event: PointerEvent, wheelDelta = 0) {\n //console.log(event);\n event.preventDefault();\n\n if (event.type == \"pointerdown\") this._canvas!.nativeElement.setPointerCapture(event.pointerId);\n\n let message = new PointerInputMessage(event, this._pointerStates, this._canvas!.nativeElement, wheelDelta);\n //console.log(message);\n\n this._streamingService.SendControlMessage(message);\n }\n\n private OnWheelEvent(event: WheelEvent) {\n //console.log(event);\n event.preventDefault();\n\n let pointerEvent: PointerEvent = new PointerEvent(event.type, { ...event, pointerId: 1 });\n this.OnPointerEvent(pointerEvent, event.deltaY);\n }\n\n private OnConnected() {\n this._displaySize = Size.Empty;\n }\n\n private OnFrameReceived(frame: EncodedFrame) {\n let chunk = new EncodedVideoChunk({\n data: frame.Bytes,\n type: frame.Type == FrameType.Key ? \"key\" : \"delta\",\n timestamp: frame.Index\n });\n\n //Initialize decoder\n let frameSize = new Size(frame.Width, frame.Height);\n\n if (this._decoder === null || this._decoder.state === 'closed' || !Size.AreEqual(frameSize, this._videoSize) || this._framesInDecodeQueue > StreamHostComponent._maxFramesInDecodeQueue) {\n console.log(\"Configuring decoder...\");\n\n if (this._decoder !== null && this._decoder.state !== 'closed') this._decoder.close();\n this._decoder = new VideoDecoder({\n output: (frame) => this.OnFrameDecoded(frame),\n error: (error) => {\n console.error(error);\n this._streamingService.SendControlMessage(new RequestKeyFrameMessage());\n }\n });\n this._isDecoderInitialized = false;\n\n this._decoder.configure({\n codec: \"hvc1.1.6.L93.B0\",\n codedWidth: frame.Width,\n codedHeight: frame.Height,\n hardwareAcceleration: \"prefer-hardware\",\n optimizeForLatency: true\n });\n console.log(\"Decoder configured.\");\n console.log(`Resolution is ${frame.Width} x ${frame.Height}.`);\n\n this._videoSize = frameSize;\n this._framesInDecodeQueue = 0;\n }\n\n //Decode frame\n if (!this._isDecoderInitialized && chunk.type != \"key\") {\n this._streamingService.SendControlMessage(new RequestKeyFrameMessage());\n return;\n }\n this._isDecoderInitialized = true;\n\n this._decoder.decode(chunk);\n this._framesInDecodeQueue++;\n }\n\n private OnFrameDecoded(frame: VideoFrame) {\n this._framesInDecodeQueue--;\n\n if (this._framePending) this._framePending.close();\n this._framePending = frame;\n requestAnimationFrame(() => this.RenderFrame());\n }\n\n private RenderFrame() {\n\n let frame = this._framePending;\n this._framePending = undefined;\n\n if (frame) {\n\n //Set canvas resolution to video resolution\n let canvas = this._canvas!.nativeElement;\n canvas.width = frame.displayWidth;\n canvas.height = frame.displayHeight;\n\n //Check for control size change\n let canvasRect = canvas.getBoundingClientRect();\n let canvasSize = new Size(Math.round(canvasRect.width * window.devicePixelRatio), Math.round(canvasRect.height * window.devicePixelRatio));\n if (!Size.AreEqual(canvasSize, this._displaySize)) {\n this._displaySize = canvasSize;\n\n console.log(`Resized to ${canvasSize.Width} x ${canvasSize.Height}`);\n let message = new ResizeSurfaceMessage(canvasSize.Width, canvasSize.Height);\n this._streamingService.SendControlMessage(message);\n }\n\n //Draw new frame\n if (this._renderingContext) {\n this._renderingContext.drawImage(frame, 0, 0, frame.displayWidth, frame.displayHeight);\n }\n\n //Release memory\n frame.close();\n }\n }\n\n public ToggleFullScreen() {\n if (document.fullscreenElement === this._root?.nativeElement) {\n document.exitFullscreen();\n }\n else {\n this._root?.nativeElement.requestFullscreen();\n }\n }\n}\n","<canvas #renderTarget class=\"renderTarget\"></canvas>\n<div class=\"overlay\" (click)=\"ToggleFullScreen()\" *ngIf=\"IsFullScreenAvailable\" title=\"Warpr\">W</div>\n","/*\n * Public API Surface of warpr-lib\n */\n\nexport * from './lib/data/frames';\nexport * from './lib/data/signaling-messages';\nexport * from './lib/data/streaming-messages';\nexport * from './lib/infrastructure/array-stream';\nexport * from './lib/infrastructure/events';\nexport * from './lib/infrastructure/memory-stream';\nexport * from './lib/infrastructure/message-assembler';\nexport * from './lib/infrastructure/message-splitter';\nexport * from './lib/networking/messaging-client';\nexport * from './lib/networking/web-socket-client';\nexport * from './lib/services/messaging.service';\nexport * from './lib/services/streaming.service';\nexport * from './lib/components/stream-host/stream-host.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuid","i1.MessagingService","i1.StreamingService"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class MemoryStream {
|
|
2
|
+
private _buffer;
|
|
3
|
+
private _size;
|
|
4
|
+
private _capacity;
|
|
5
|
+
private _dataView;
|
|
6
|
+
constructor(initialCapacity?: number);
|
|
7
|
+
Clear(): void;
|
|
8
|
+
private Reserve;
|
|
9
|
+
ToArrayBuffer(): ArrayBuffer;
|
|
10
|
+
ToArrayBufferView(): Uint8Array<ArrayBuffer>;
|
|
11
|
+
private ExtendCapacity;
|
|
12
|
+
WriteUInt32(value: number): void;
|
|
13
|
+
WriteBytes(bytes: Uint8Array): void;
|
|
14
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { MessageContent } from "./messages";
|
|
1
2
|
export declare class MessageAssembler {
|
|
2
3
|
private _maxBuilderCount;
|
|
3
4
|
private _builders;
|
|
4
5
|
constructor(_maxBuilderCount?: number);
|
|
5
|
-
PushMessage(buffer: ArrayBuffer):
|
|
6
|
+
PushMessage(buffer: ArrayBuffer): MessageContent | null;
|
|
6
7
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MessageContent } from "./messages";
|
|
2
|
+
export declare class MessageSplitter {
|
|
3
|
+
MaxMessageSize: number;
|
|
4
|
+
private _messageIndex;
|
|
5
|
+
private readonly _textEncoder;
|
|
6
|
+
constructor(MaxMessageSize?: number);
|
|
7
|
+
SplitMessage(message: MessageContent): Generator<Uint8Array<ArrayBuffer>>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ArrayStream } from "./array-stream";
|
|
2
|
+
import { MemoryStream } from "./memory-stream";
|
|
3
|
+
export declare enum MessageContentType {
|
|
4
|
+
Binary = 0,
|
|
5
|
+
Text = 1
|
|
6
|
+
}
|
|
7
|
+
export type MessageContent = ArrayBufferLike | string;
|
|
8
|
+
export declare const MaxSafeMessageSize: number;
|
|
9
|
+
export declare class MessageFragmentHeader {
|
|
10
|
+
static readonly _fragmentSizeBits = 31;
|
|
11
|
+
static readonly _fragmentSizeMask: number;
|
|
12
|
+
MessageIndex: number;
|
|
13
|
+
MessageSize: number;
|
|
14
|
+
FragmentSizeWithContentType: number;
|
|
15
|
+
FragmentIndex: number;
|
|
16
|
+
get ContentType(): MessageContentType;
|
|
17
|
+
set ContentType(value: MessageContentType);
|
|
18
|
+
get FragmentSize(): number;
|
|
19
|
+
set FragmentSize(value: number);
|
|
20
|
+
Write(stream: MemoryStream): void;
|
|
21
|
+
Read(stream: ArrayStream): void;
|
|
22
|
+
}
|
|
@@ -4,6 +4,7 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
export declare class MessagingService extends WebSocketClient<WarprSignalingMessage> {
|
|
5
5
|
private static readonly _connectionUri;
|
|
6
6
|
private readonly _sessionId;
|
|
7
|
+
static ExternalServer: string | null;
|
|
7
8
|
constructor();
|
|
8
9
|
private static GetServerUri;
|
|
9
10
|
protected OnConnected(): void;
|
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
import { MessagingService } from './messaging.service';
|
|
2
2
|
import { EncodedFrame } from '../data/frames';
|
|
3
3
|
import { EventPublisher } from '../infrastructure/events';
|
|
4
|
+
import { MessageContent } from '../infrastructure/messages';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class StreamingService {
|
|
6
7
|
private _messagingService;
|
|
7
8
|
private _peerConnection?;
|
|
8
9
|
private _controlConnection?;
|
|
9
10
|
private _streamConnection?;
|
|
10
|
-
private
|
|
11
|
+
private _streamMessageBuilder?;
|
|
11
12
|
private _auxConnection?;
|
|
13
|
+
private _auxMessageBuilder?;
|
|
14
|
+
private _auxMessageSplitter?;
|
|
12
15
|
private readonly _events;
|
|
13
16
|
readonly FrameReceived: EventPublisher<StreamingService, EncodedFrame>;
|
|
14
17
|
readonly Connected: EventPublisher<StreamingService, any>;
|
|
15
|
-
readonly
|
|
16
|
-
readonly
|
|
18
|
+
readonly AuxChannelReady: EventPublisher<StreamingService, any>;
|
|
19
|
+
readonly ControlMessageReceived: EventPublisher<StreamingService, MessageContent>;
|
|
20
|
+
readonly AuxMessageReceived: EventPublisher<StreamingService, MessageContent>;
|
|
17
21
|
constructor(_messagingService: MessagingService);
|
|
18
22
|
private Reconnect;
|
|
19
23
|
SendControlMessage(message: any): void;
|
|
20
24
|
SendAuxMessage(message: any): void;
|
|
21
25
|
private OnConnectionStateChanged;
|
|
22
26
|
private OnDataChannel;
|
|
23
|
-
private
|
|
24
|
-
private
|
|
25
|
-
private
|
|
27
|
+
private _lastFramerateRefreshTime;
|
|
28
|
+
private _frameCounter;
|
|
29
|
+
private OnStreamMessage;
|
|
30
|
+
private OnAuxMessage;
|
|
26
31
|
private OnIceCandidateAdded;
|
|
27
32
|
private OnSignalingMessageReceived;
|
|
28
33
|
static ɵfac: i0.ɵɵFactoryDeclaration<StreamingService, never>;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ export * from './lib/data/signaling-messages';
|
|
|
3
3
|
export * from './lib/data/streaming-messages';
|
|
4
4
|
export * from './lib/infrastructure/array-stream';
|
|
5
5
|
export * from './lib/infrastructure/events';
|
|
6
|
+
export * from './lib/infrastructure/memory-stream';
|
|
6
7
|
export * from './lib/infrastructure/message-assembler';
|
|
8
|
+
export * from './lib/infrastructure/message-splitter';
|
|
7
9
|
export * from './lib/networking/messaging-client';
|
|
8
10
|
export * from './lib/networking/web-socket-client';
|
|
9
11
|
export * from './lib/services/messaging.service';
|