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.
- package/fesm2022/warpr.mjs +168 -17
- package/fesm2022/warpr.mjs.map +1 -1
- package/lib/components/stream-host/stream-host.component.d.ts +9 -1
- package/lib/components/stream-host/video-frame-renderer.d.ts +5 -0
- package/lib/data/frames.d.ts +6 -0
- package/lib/data/streaming-messages.d.ts +8 -2
- package/package.json +1 -1
package/fesm2022/warpr.mjs
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
766
|
-
console.log(
|
|
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:
|
|
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(
|
|
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
|
|
846
|
-
canvas.
|
|
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
|
-
|
|
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
|
package/fesm2022/warpr.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warpr.mjs","sources":["../../../projects/warpr-lib/src/lib/infrastructure/array-stream.ts","../../../projects/warpr-lib/src/lib/data/frames.ts","../../../projects/warpr-lib/src/lib/data/signaling-messages.ts","../../../projects/warpr-lib/src/lib/data/streaming-messages.ts","../../../projects/warpr-lib/src/lib/infrastructure/events.ts","../../../projects/warpr-lib/src/lib/infrastructure/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
|
|
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;
|
package/lib/data/frames.d.ts
CHANGED
|
@@ -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
|
|
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;
|