warpr 1.0.59 → 1.0.61

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.
@@ -100,6 +100,12 @@ var FrameType;
100
100
  FrameType[FrameType["Key"] = 1] = "Key";
101
101
  FrameType[FrameType["Delta"] = 2] = "Delta";
102
102
  })(FrameType || (FrameType = {}));
103
+ var VideoCodec;
104
+ (function (VideoCodec) {
105
+ VideoCodec[VideoCodec["Unknown"] = 0] = "Unknown";
106
+ VideoCodec[VideoCodec["H264"] = 1] = "H264";
107
+ VideoCodec[VideoCodec["H265"] = 2] = "H265";
108
+ })(VideoCodec || (VideoCodec = {}));
103
109
  class EncodedFrame {
104
110
  constructor(buffer) {
105
111
  let stream = new ArrayStream(buffer);
@@ -107,6 +113,7 @@ class EncodedFrame {
107
113
  this.Index = stream.ReadUInt32();
108
114
  this.Width = stream.ReadUInt32();
109
115
  this.Height = stream.ReadUInt32();
116
+ this.Codec = stream.ReadUInt32();
110
117
  this.Bytes = stream.ReadBuffer();
111
118
  }
112
119
  }
@@ -180,6 +187,7 @@ var WarprStreamingMessageType;
180
187
  WarprStreamingMessageType["PointerInputMessage"] = "PointerInputMessage";
181
188
  WarprStreamingMessageType["ResizeSurfaceMessage"] = "ResizeSurfaceMessage";
182
189
  WarprStreamingMessageType["RequestKeyFrameMessage"] = "RequestKeyFrameMessage";
190
+ WarprStreamingMessageType["VideoCodecPreferenceMessage"] = "VideoCodecPreferenceMessage";
183
191
  })(WarprStreamingMessageType || (WarprStreamingMessageType = {}));
184
192
  var PointerType;
185
193
  (function (PointerType) {
@@ -305,6 +313,12 @@ class RequestKeyFrameMessage {
305
313
  this.$type = WarprStreamingMessageType.RequestKeyFrameMessage;
306
314
  }
307
315
  }
316
+ class VideoCodecPreferenceMessage {
317
+ constructor(Codecs) {
318
+ this.Codecs = Codecs;
319
+ this.$type = WarprStreamingMessageType.VideoCodecPreferenceMessage;
320
+ }
321
+ }
308
322
 
309
323
  class EventSubscription {
310
324
  constructor(_owner, _token) {
@@ -734,8 +748,101 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImpor
734
748
  }]
735
749
  }], ctorParameters: () => [{ type: MessagingService }] });
736
750
 
751
+ function CreateVideoFrameRenderer(canvas) {
752
+ return WebGLVideoFrameRenderer.TryCreate(canvas) ?? Canvas2DVideoFrameRenderer.TryCreate(canvas);
753
+ }
754
+ //Keeps decoded frames on the GPU, a 2D canvas round-trips each frame through the CPU in some browsers (e.g. Firefox)
755
+ class WebGLVideoFrameRenderer {
756
+ static { this._vertexShaderSource = `
757
+ attribute vec2 xy;
758
+ varying highp vec2 uv;
759
+
760
+ void main(void) {
761
+ gl_Position = vec4(xy, 0.0, 1.0);
762
+ uv = vec2((1.0 + xy.x) / 2.0, (1.0 - xy.y) / 2.0);
763
+ }
764
+ `; }
765
+ static { this._fragmentShaderSource = `
766
+ varying highp vec2 uv;
767
+ uniform sampler2D frame;
768
+
769
+ void main(void) {
770
+ gl_FragColor = texture2D(frame, uv);
771
+ }
772
+ `; }
773
+ constructor(_context) {
774
+ this._context = _context;
775
+ this.Name = _context instanceof WebGL2RenderingContext ? "WebGL 2" : "WebGL";
776
+ let gl = _context;
777
+ let program = gl.createProgram();
778
+ gl.attachShader(program, WebGLVideoFrameRenderer.CompileShader(gl, gl.VERTEX_SHADER, WebGLVideoFrameRenderer._vertexShaderSource));
779
+ gl.attachShader(program, WebGLVideoFrameRenderer.CompileShader(gl, gl.FRAGMENT_SHADER, WebGLVideoFrameRenderer._fragmentShaderSource));
780
+ gl.linkProgram(program);
781
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS))
782
+ throw new Error(gl.getProgramInfoLog(program) ?? "Failed to link program.");
783
+ gl.useProgram(program);
784
+ //Full screen quad
785
+ gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
786
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, -1, +1, +1, +1, +1, -1]), gl.STATIC_DRAW);
787
+ let xyLocation = gl.getAttribLocation(program, "xy");
788
+ gl.vertexAttribPointer(xyLocation, 2, gl.FLOAT, false, 0, 0);
789
+ gl.enableVertexAttribArray(xyLocation);
790
+ //Frame texture
791
+ gl.bindTexture(gl.TEXTURE_2D, gl.createTexture());
792
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
793
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
794
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
795
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
796
+ }
797
+ static TryCreate(canvas) {
798
+ let options = { alpha: false, antialias: false, depth: false, stencil: false };
799
+ let context = canvas.getContext("webgl2", options) ?? canvas.getContext("webgl", options);
800
+ if (!context)
801
+ return null;
802
+ try {
803
+ return new WebGLVideoFrameRenderer(context);
804
+ }
805
+ catch (error) {
806
+ console.warn("Failed to initialize WebGL renderer.", error);
807
+ return null;
808
+ }
809
+ }
810
+ static CompileShader(gl, type, source) {
811
+ let shader = gl.createShader(type);
812
+ gl.shaderSource(shader, source);
813
+ gl.compileShader(shader);
814
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
815
+ throw new Error(gl.getShaderInfoLog(shader) ?? "Failed to compile shader.");
816
+ return shader;
817
+ }
818
+ Draw(frame) {
819
+ let gl = this._context;
820
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frame);
821
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
822
+ gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);
823
+ }
824
+ }
825
+ class Canvas2DVideoFrameRenderer {
826
+ constructor(_context) {
827
+ this._context = _context;
828
+ this.Name = "2D";
829
+ }
830
+ static TryCreate(canvas) {
831
+ let context = canvas.getContext("2d");
832
+ return context ? new Canvas2DVideoFrameRenderer(context) : null;
833
+ }
834
+ Draw(frame) {
835
+ this._context.drawImage(frame, 0, 0, frame.displayWidth, frame.displayHeight);
836
+ }
837
+ }
838
+
737
839
  class StreamHostComponent {
738
840
  static { this._maxFramesInDecodeQueue = 10; }
841
+ //In order of preference
842
+ static { this._codecStrings = new Map([
843
+ [VideoCodec.H265, "hvc1.1.6.L93.B0"],
844
+ [VideoCodec.H264, "avc1.640033"]
845
+ ]); }
739
846
  get IsFullScreenAvailable() {
740
847
  return document.fullscreenEnabled && this.isMenuVisible;
741
848
  }
@@ -743,27 +850,65 @@ class StreamHostComponent {
743
850
  this._streamingService = _streamingService;
744
851
  this._root = _root;
745
852
  this.isMenuVisible = true;
746
- this._renderingContext = null;
853
+ this._renderer = null;
747
854
  this._decoder = null;
748
855
  this._videoSize = Size.Empty;
749
856
  this._displaySize = Size.Empty;
750
857
  this._isDecoderInitialized = false;
751
858
  this._pointerStates = {};
752
859
  this._framesInDecodeQueue = 0;
860
+ this._videoCodec = VideoCodec.Unknown;
861
+ this._workingCodecs = new Set();
753
862
  this._streamingService.Connected.Subscribe((sender, eventArgs) => this.OnConnected());
754
863
  this._streamingService.FrameReceived.Subscribe((sender, eventArgs) => this.OnFrameReceived(eventArgs));
755
864
  }
865
+ static GetSupportedCodecsAsync() {
866
+ StreamHostComponent._supportedCodecs ??= (async () => {
867
+ let result = [];
868
+ for (let [codec, codecString] of StreamHostComponent._codecStrings) {
869
+ try {
870
+ let support = await VideoDecoder.isConfigSupported({
871
+ codec: codecString,
872
+ hardwareAcceleration: "prefer-hardware",
873
+ optimizeForLatency: true
874
+ });
875
+ if (support.supported)
876
+ result.push(codec);
877
+ }
878
+ catch (error) {
879
+ console.warn(`Failed to check decoder support for ${codecString}.`, error);
880
+ }
881
+ }
882
+ console.log(`Supported codecs: ${result.map(p => VideoCodec[p]).join(", ") || "none"}.`);
883
+ return result;
884
+ })();
885
+ return StreamHostComponent._supportedCodecs;
886
+ }
887
+ async SendCodecPreferenceAsync() {
888
+ this._decodableCodecs ??= new Set(await StreamHostComponent.GetSupportedCodecsAsync());
889
+ this._streamingService.SendControlMessage(new VideoCodecPreferenceMessage([...this._decodableCodecs].map(p => VideoCodec[p])));
890
+ }
891
+ OnDecoderError(codec, error) {
892
+ console.error(error);
893
+ //Some browsers report support for a codec they cannot decode (e.g. HEVC in Firefox), so drop codecs which never produced a frame
894
+ if (!this._workingCodecs.has(codec) && this._decodableCodecs?.delete(codec)) {
895
+ console.warn(`Decoding ${VideoCodec[codec]} failed, falling back to other codecs.`);
896
+ this.SendCodecPreferenceAsync();
897
+ return;
898
+ }
899
+ this._streamingService.SendControlMessage(new RequestKeyFrameMessage());
900
+ }
756
901
  async ngAfterViewInit() {
757
902
  console.log("Initializing stream host...");
758
903
  let canvas = this._canvas.nativeElement;
759
- this._renderingContext = canvas.getContext("2d");
904
+ this._renderer = CreateVideoFrameRenderer(canvas);
760
905
  canvas.onpointerdown = (event) => this.OnPointerEvent(event);
761
906
  canvas.onpointermove = (event) => this.OnPointerEvent(event);
762
907
  canvas.onpointerup = (event) => this.OnPointerEvent(event);
763
908
  canvas.onwheel = (event) => this.OnWheelEvent(event);
764
909
  canvas.oncontextmenu = (event) => event.preventDefault();
765
- if (this._renderingContext) {
766
- console.log("Stream host initialized.");
910
+ if (this._renderer) {
911
+ console.log(`Stream host initialized with ${this._renderer.Name} renderer.`);
767
912
  }
768
913
  else {
769
914
  console.log("Stream host failed to initialize.");
@@ -787,8 +932,13 @@ class StreamHostComponent {
787
932
  }
788
933
  OnConnected() {
789
934
  this._displaySize = Size.Empty;
935
+ this.SendCodecPreferenceAsync();
790
936
  }
791
937
  OnFrameReceived(frame) {
938
+ //Skip frames we cannot decode, the server will switch codec once it receives our preference
939
+ let codecString = StreamHostComponent._codecStrings.get(frame.Codec);
940
+ if (!codecString || !this._decodableCodecs?.has(frame.Codec))
941
+ return;
792
942
  let chunk = new EncodedVideoChunk({
793
943
  data: frame.Bytes,
794
944
  type: frame.Type == FrameType.Key ? "key" : "delta",
@@ -796,28 +946,27 @@ class StreamHostComponent {
796
946
  });
797
947
  //Initialize decoder
798
948
  let frameSize = new Size(frame.Width, frame.Height);
799
- if (this._decoder === null || this._decoder.state === 'closed' || !Size.AreEqual(frameSize, this._videoSize) || this._framesInDecodeQueue > StreamHostComponent._maxFramesInDecodeQueue) {
949
+ if (this._decoder === null || this._decoder.state === 'closed' || !Size.AreEqual(frameSize, this._videoSize) || frame.Codec !== this._videoCodec || this._framesInDecodeQueue > StreamHostComponent._maxFramesInDecodeQueue) {
800
950
  console.log("Configuring decoder...");
801
951
  if (this._decoder !== null && this._decoder.state !== 'closed')
802
952
  this._decoder.close();
953
+ let codec = frame.Codec;
803
954
  this._decoder = new VideoDecoder({
804
955
  output: (frame) => this.OnFrameDecoded(frame),
805
- error: (error) => {
806
- console.error(error);
807
- this._streamingService.SendControlMessage(new RequestKeyFrameMessage());
808
- }
956
+ error: (error) => this.OnDecoderError(codec, error)
809
957
  });
810
958
  this._isDecoderInitialized = false;
811
959
  this._decoder.configure({
812
- codec: "hvc1.1.6.L93.B0",
960
+ codec: codecString,
813
961
  codedWidth: frame.Width,
814
962
  codedHeight: frame.Height,
815
963
  hardwareAcceleration: "prefer-hardware",
816
964
  optimizeForLatency: true
817
965
  });
818
- console.log("Decoder configured.");
966
+ console.log(`Decoder configured for ${VideoCodec[frame.Codec]}.`);
819
967
  console.log(`Resolution is ${frame.Width} x ${frame.Height}.`);
820
968
  this._videoSize = frameSize;
969
+ this._videoCodec = frame.Codec;
821
970
  this._framesInDecodeQueue = 0;
822
971
  }
823
972
  //Decode frame
@@ -831,6 +980,7 @@ class StreamHostComponent {
831
980
  }
832
981
  OnFrameDecoded(frame) {
833
982
  this._framesInDecodeQueue--;
983
+ this._workingCodecs.add(this._videoCodec);
834
984
  if (this._framePending)
835
985
  this._framePending.close();
836
986
  this._framePending = frame;
@@ -842,8 +992,11 @@ class StreamHostComponent {
842
992
  if (frame) {
843
993
  //Set canvas resolution to video resolution
844
994
  let canvas = this._canvas.nativeElement;
845
- canvas.width = frame.displayWidth;
846
- canvas.height = frame.displayHeight;
995
+ //Assigning the size resets the canvas even if unchanged, which is expensive at high resolutions
996
+ if (canvas.width !== frame.displayWidth)
997
+ canvas.width = frame.displayWidth;
998
+ if (canvas.height !== frame.displayHeight)
999
+ canvas.height = frame.displayHeight;
847
1000
  //Check for control size change
848
1001
  let canvasRect = canvas.getBoundingClientRect();
849
1002
  let canvasSize = new Size(Math.round(canvasRect.width * window.devicePixelRatio), Math.round(canvasRect.height * window.devicePixelRatio));
@@ -854,9 +1007,7 @@ class StreamHostComponent {
854
1007
  this._streamingService.SendControlMessage(message);
855
1008
  }
856
1009
  //Draw new frame
857
- if (this._renderingContext) {
858
- this._renderingContext.drawImage(frame, 0, 0, frame.displayWidth, frame.displayHeight);
859
- }
1010
+ this._renderer?.Draw(frame);
860
1011
  //Release memory
861
1012
  frame.close();
862
1013
  }
@@ -890,5 +1041,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImpor
890
1041
  * Generated bundle index. Do not edit.
891
1042
  */
892
1043
 
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 };
1044
+ 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, VideoCodec, VideoCodecPreferenceMessage, WarprSignalingMessageType, WarprStreamingMessageType, WebSocketClient };
894
1045
  //# 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/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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"}
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/video-frame-renderer.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 enum VideoCodec {\n Unknown,\n H264,\n H265\n}\n\nexport class EncodedFrame {\n public Index: number;\n public Type: FrameType;\n public Width: number;\n public Height: number;\n public Codec: VideoCodec;\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.Codec = 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 VideoCodecPreferenceMessage = \"VideoCodecPreferenceMessage\",\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 class VideoCodecPreferenceMessage {\n public readonly $type = WarprStreamingMessageType.VideoCodecPreferenceMessage;\n\n constructor(\n public Codecs: string[]\n ) { }\n}\n\nexport type WarprStreamingMessage =\n PointerInputMessage |\n ResizeSurfaceMessage |\n RequestKeyFrameMessage |\n VideoCodecPreferenceMessage;\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","export interface IVideoFrameRenderer {\n readonly Name: string;\n Draw(frame: VideoFrame): void;\n}\n\nexport function CreateVideoFrameRenderer(canvas: HTMLCanvasElement): IVideoFrameRenderer | null {\n return WebGLVideoFrameRenderer.TryCreate(canvas) ?? Canvas2DVideoFrameRenderer.TryCreate(canvas);\n}\n\n//Keeps decoded frames on the GPU, a 2D canvas round-trips each frame through the CPU in some browsers (e.g. Firefox)\nclass WebGLVideoFrameRenderer implements IVideoFrameRenderer {\n private static readonly _vertexShaderSource = `\n attribute vec2 xy;\n varying highp vec2 uv;\n\n void main(void) {\n gl_Position = vec4(xy, 0.0, 1.0);\n uv = vec2((1.0 + xy.x) / 2.0, (1.0 - xy.y) / 2.0);\n }\n `;\n\n private static readonly _fragmentShaderSource = `\n varying highp vec2 uv;\n uniform sampler2D frame;\n\n void main(void) {\n gl_FragColor = texture2D(frame, uv);\n }\n `;\n\n public readonly Name: string;\n\n private constructor(\n private _context: WebGLRenderingContext | WebGL2RenderingContext) {\n this.Name = _context instanceof WebGL2RenderingContext ? \"WebGL 2\" : \"WebGL\";\n let gl = _context;\n\n let program = gl.createProgram()!;\n gl.attachShader(program, WebGLVideoFrameRenderer.CompileShader(gl, gl.VERTEX_SHADER, WebGLVideoFrameRenderer._vertexShaderSource));\n gl.attachShader(program, WebGLVideoFrameRenderer.CompileShader(gl, gl.FRAGMENT_SHADER, WebGLVideoFrameRenderer._fragmentShaderSource));\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program) ?? \"Failed to link program.\");\n gl.useProgram(program);\n\n //Full screen quad\n gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, -1, +1, +1, +1, +1, -1]), gl.STATIC_DRAW);\n\n let xyLocation = gl.getAttribLocation(program, \"xy\");\n gl.vertexAttribPointer(xyLocation, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(xyLocation);\n\n //Frame texture\n gl.bindTexture(gl.TEXTURE_2D, gl.createTexture());\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n\n public static TryCreate(canvas: HTMLCanvasElement): IVideoFrameRenderer | null {\n let options: WebGLContextAttributes = { alpha: false, antialias: false, depth: false, stencil: false };\n let context = canvas.getContext(\"webgl2\", options) ?? canvas.getContext(\"webgl\", options);\n if (!context) return null;\n\n try {\n return new WebGLVideoFrameRenderer(context);\n }\n catch (error) {\n console.warn(\"Failed to initialize WebGL renderer.\", error);\n return null;\n }\n }\n\n private static CompileShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader {\n let shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader) ?? \"Failed to compile shader.\");\n return shader;\n }\n\n public Draw(frame: VideoFrame) {\n let gl = this._context;\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frame);\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);\n }\n}\n\nclass Canvas2DVideoFrameRenderer implements IVideoFrameRenderer {\n public readonly Name = \"2D\";\n\n private constructor(\n private _context: CanvasRenderingContext2D) { }\n\n public static TryCreate(canvas: HTMLCanvasElement): IVideoFrameRenderer | null {\n let context = canvas.getContext(\"2d\");\n return context ? new Canvas2DVideoFrameRenderer(context) : null;\n }\n\n public Draw(frame: VideoFrame) {\n this._context.drawImage(frame, 0, 0, frame.displayWidth, frame.displayHeight);\n }\n}\n","import { Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { StreamingService } from '../../services/streaming.service';\nimport { EncodedFrame, FrameType, Size, VideoCodec } from '../../data/frames';\nimport { PointerInputMessage, PointerStates, RequestKeyFrameMessage, ResizeSurfaceMessage, VideoCodecPreferenceMessage } from '../../data/streaming-messages';\nimport { CommonModule } from '@angular/common';\nimport { CreateVideoFrameRenderer, IVideoFrameRenderer } from './video-frame-renderer';\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 //In order of preference\n private static readonly _codecStrings = new Map<VideoCodec, string>([\n [VideoCodec.H265, \"hvc1.1.6.L93.B0\"],\n [VideoCodec.H264, \"avc1.640033\"]\n ]);\n\n private static _supportedCodecs?: Promise<VideoCodec[]>;\n\n @Input()\n public isMenuVisible = true;\n\n @ViewChild(\"renderTarget\")\n private _canvas?: ElementRef<HTMLCanvasElement>;\n private _renderer: IVideoFrameRenderer | 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 private _videoCodec = VideoCodec.Unknown;\n private _decodableCodecs?: Set<VideoCodec>;\n private _workingCodecs = new Set<VideoCodec>();\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 static GetSupportedCodecsAsync(): Promise<VideoCodec[]> {\n StreamHostComponent._supportedCodecs ??= (async () => {\n let result: VideoCodec[] = [];\n for (let [codec, codecString] of StreamHostComponent._codecStrings) {\n try {\n let support = await VideoDecoder.isConfigSupported({\n codec: codecString,\n hardwareAcceleration: \"prefer-hardware\",\n optimizeForLatency: true\n });\n if (support.supported) result.push(codec);\n }\n catch (error) {\n console.warn(`Failed to check decoder support for ${codecString}.`, error);\n }\n }\n\n console.log(`Supported codecs: ${result.map(p => VideoCodec[p]).join(\", \") || \"none\"}.`);\n return result;\n })();\n\n return StreamHostComponent._supportedCodecs;\n }\n\n private async SendCodecPreferenceAsync() {\n this._decodableCodecs ??= new Set(await StreamHostComponent.GetSupportedCodecsAsync());\n this._streamingService.SendControlMessage(new VideoCodecPreferenceMessage([...this._decodableCodecs].map(p => VideoCodec[p])));\n }\n\n private OnDecoderError(codec: VideoCodec, error: DOMException) {\n console.error(error);\n\n //Some browsers report support for a codec they cannot decode (e.g. HEVC in Firefox), so drop codecs which never produced a frame\n if (!this._workingCodecs.has(codec) && this._decodableCodecs?.delete(codec)) {\n console.warn(`Decoding ${VideoCodec[codec]} failed, falling back to other codecs.`);\n this.SendCodecPreferenceAsync();\n return;\n }\n\n this._streamingService.SendControlMessage(new RequestKeyFrameMessage());\n }\n\n private async ngAfterViewInit() {\n\n console.log(\"Initializing stream host...\");\n\n let canvas = this._canvas!.nativeElement;\n this._renderer = CreateVideoFrameRenderer(canvas);\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._renderer) {\n console.log(`Stream host initialized with ${this._renderer.Name} renderer.`);\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 this.SendCodecPreferenceAsync();\n }\n\n private OnFrameReceived(frame: EncodedFrame) {\n //Skip frames we cannot decode, the server will switch codec once it receives our preference\n let codecString = StreamHostComponent._codecStrings.get(frame.Codec);\n if (!codecString || !this._decodableCodecs?.has(frame.Codec)) return;\n\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) || frame.Codec !== this._videoCodec || this._framesInDecodeQueue > StreamHostComponent._maxFramesInDecodeQueue) {\n console.log(\"Configuring decoder...\");\n\n if (this._decoder !== null && this._decoder.state !== 'closed') this._decoder.close();\n let codec = frame.Codec;\n this._decoder = new VideoDecoder({\n output: (frame) => this.OnFrameDecoded(frame),\n error: (error) => this.OnDecoderError(codec, error)\n });\n this._isDecoderInitialized = false;\n\n this._decoder.configure({\n codec: codecString,\n codedWidth: frame.Width,\n codedHeight: frame.Height,\n hardwareAcceleration: \"prefer-hardware\",\n optimizeForLatency: true\n });\n console.log(`Decoder configured for ${VideoCodec[frame.Codec]}.`);\n console.log(`Resolution is ${frame.Width} x ${frame.Height}.`);\n\n this._videoSize = frameSize;\n this._videoCodec = frame.Codec;\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 this._workingCodecs.add(this._videoCodec);\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 \n //Assigning the size resets the canvas even if unchanged, which is expensive at high resolutions\n if (canvas.width !== frame.displayWidth) canvas.width = frame.displayWidth;\n if (canvas.height !== frame.displayHeight) 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 this._renderer?.Draw(frame);\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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"}
@@ -5,9 +5,11 @@ export declare class StreamHostComponent {
5
5
  private _streamingService;
6
6
  private _root;
7
7
  private static readonly _maxFramesInDecodeQueue;
8
+ private static readonly _codecStrings;
9
+ private static _supportedCodecs?;
8
10
  isMenuVisible: boolean;
9
11
  private _canvas?;
10
- private _renderingContext;
12
+ private _renderer;
11
13
  private _decoder;
12
14
  private _framePending?;
13
15
  private _videoSize;
@@ -15,8 +17,14 @@ export declare class StreamHostComponent {
15
17
  private _isDecoderInitialized;
16
18
  private _pointerStates;
17
19
  private _framesInDecodeQueue;
20
+ private _videoCodec;
21
+ private _decodableCodecs?;
22
+ private _workingCodecs;
18
23
  get IsFullScreenAvailable(): boolean;
19
24
  constructor(_streamingService: StreamingService, _root: ElementRef<HTMLDivElement>);
25
+ private static GetSupportedCodecsAsync;
26
+ private SendCodecPreferenceAsync;
27
+ private OnDecoderError;
20
28
  private ngAfterViewInit;
21
29
  private OnPointerEvent;
22
30
  private OnWheelEvent;
@@ -0,0 +1,5 @@
1
+ export interface IVideoFrameRenderer {
2
+ readonly Name: string;
3
+ Draw(frame: VideoFrame): void;
4
+ }
5
+ export declare function CreateVideoFrameRenderer(canvas: HTMLCanvasElement): IVideoFrameRenderer | null;
@@ -3,11 +3,17 @@ export declare enum FrameType {
3
3
  Key = 1,
4
4
  Delta = 2
5
5
  }
6
+ export declare enum VideoCodec {
7
+ Unknown = 0,
8
+ H264 = 1,
9
+ H265 = 2
10
+ }
6
11
  export declare class EncodedFrame {
7
12
  Index: number;
8
13
  Type: FrameType;
9
14
  Width: number;
10
15
  Height: number;
16
+ Codec: VideoCodec;
11
17
  Bytes: ArrayBuffer;
12
18
  constructor(buffer: ArrayBuffer);
13
19
  }
@@ -1,7 +1,8 @@
1
1
  export declare enum WarprStreamingMessageType {
2
2
  PointerInputMessage = "PointerInputMessage",
3
3
  ResizeSurfaceMessage = "ResizeSurfaceMessage",
4
- RequestKeyFrameMessage = "RequestKeyFrameMessage"
4
+ RequestKeyFrameMessage = "RequestKeyFrameMessage",
5
+ VideoCodecPreferenceMessage = "VideoCodecPreferenceMessage"
5
6
  }
6
7
  export type Point = {
7
8
  X: number;
@@ -55,4 +56,9 @@ export declare class ResizeSurfaceMessage {
55
56
  export declare class RequestKeyFrameMessage {
56
57
  readonly $type = WarprStreamingMessageType.RequestKeyFrameMessage;
57
58
  }
58
- export type WarprStreamingMessage = PointerInputMessage | ResizeSurfaceMessage | RequestKeyFrameMessage;
59
+ export declare class VideoCodecPreferenceMessage {
60
+ Codecs: string[];
61
+ readonly $type = WarprStreamingMessageType.VideoCodecPreferenceMessage;
62
+ constructor(Codecs: string[]);
63
+ }
64
+ export type WarprStreamingMessage = PointerInputMessage | ResizeSurfaceMessage | RequestKeyFrameMessage | VideoCodecPreferenceMessage;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "warpr",
3
- "version": "1.0.59",
3
+ "version": "1.0.61",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Warper is a WebRTC based ultra-low latency video streaming library.",
6
6
  "peerDependencies": {