warpr 1.0.47 → 1.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/fesm2022/warpr.mjs
CHANGED
|
@@ -579,13 +579,14 @@ class WebSocketClient {
|
|
|
579
579
|
|
|
580
580
|
class MessagingService extends WebSocketClient {
|
|
581
581
|
static { this._connectionUri = 'api/sinks/connect'; }
|
|
582
|
+
static { this.ExternalServer = null; }
|
|
582
583
|
constructor() {
|
|
583
584
|
const uri = MessagingService.GetServerUri();
|
|
584
585
|
super(uri);
|
|
585
586
|
this._sessionId = v4();
|
|
586
587
|
}
|
|
587
588
|
static GetServerUri() {
|
|
588
|
-
const location = window.location;
|
|
589
|
+
const location = new URL(MessagingService.ExternalServer || window.location.href);
|
|
589
590
|
const protocol = location.protocol === 'https:' ? 'wss' : 'ws';
|
|
590
591
|
return `${protocol}://${location.host}/${this._connectionUri}`;
|
|
591
592
|
}
|
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\n constructor() {\n const uri = MessagingService.GetServerUri();\n super(uri);\n }\n\n private static GetServerUri(): string {\n const location = window.location;\n const protocol = location.protocol === 'https:' ? 'wss' : 'ws';\n return `${protocol}://${location.host}/${this._connectionUri}`;\n }\n\n protected override OnConnected(): void {\n super.OnConnected();\n\n let request = new ConnectionRequest();\n request.SessionId = this._sessionId;\n this.SendMessage(request);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { MessagingService } from './messaging.service';\nimport { GetConfiguration, 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/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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"}
|
|
@@ -4,6 +4,7 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
export declare class MessagingService extends WebSocketClient<WarprSignalingMessage> {
|
|
5
5
|
private static readonly _connectionUri;
|
|
6
6
|
private readonly _sessionId;
|
|
7
|
+
static ExternalServer: string | null;
|
|
7
8
|
constructor();
|
|
8
9
|
private static GetServerUri;
|
|
9
10
|
protected OnConnected(): void;
|