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.
@@ -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.FragmentsReady = 0;
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.FragmentsReady)
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.FragmentsReady++;
368
- return this.FragmentCount == this.FragmentsReady;
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 = 3) {
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 messageIndex = stream.ReadUInt32();
379
- let messageSize = stream.ReadUInt32();
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(messageIndex);
479
+ let builder = this._builders.get(header.MessageIndex);
384
480
  if (builder === undefined) {
385
- builder = new MessageBuilder(messageIndex, messageSize, fragmentSize);
386
- this._builders.set(messageIndex, builder);
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(fragmentIndex, fragment)) {
394
- this._builders.delete(messageIndex);
395
- return builder.Buffer.buffer;
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._lastRefreshTime = performance.now();
482
- this._count = 0;
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._auxConnection?.send(message);
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.OnLowLatencyMessage(event);
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._events.Raise(this.AuxMessageReceived, this, event.data);
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
- OnLowLatencyMessage(event) {
531
- let message = this._messageBuilder?.PushMessage(event.data);
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._lastRefreshTime;
536
- this._count++;
684
+ let elapsed = now - this._lastFramerateRefreshTime;
537
685
  if (elapsed > 1000) {
538
- this._lastRefreshTime = now;
539
- console.debug(`Messages: ${this._count / elapsed * 1000} FPS`);
540
- this._count = 0;
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
@@ -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): ArrayBuffer | null;
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 _messageBuilder?;
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 ControlMessageReceived: EventPublisher<StreamingService, any>;
16
- readonly AuxMessageReceived: EventPublisher<StreamingService, any>;
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 _lastRefreshTime;
24
- private _count;
25
- private OnLowLatencyMessage;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "warpr",
3
- "version": "1.0.32",
3
+ "version": "1.0.50",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Warper is a WebRTC based ultra-low latency video streaming library.",
6
6
  "peerDependencies": {
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';