warpr 0.0.1 → 1.0.9
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/README.md +24 -24
- package/ng-package.json +6 -6
- package/package.json +12 -10
- package/src/lib/components/stream-host/stream-host.component.html +5 -5
- package/src/lib/components/stream-host/stream-host.component.scss +31 -31
- package/src/lib/components/stream-host/stream-host.component.spec.ts +23 -23
- package/src/lib/components/stream-host/stream-host.component.ts +170 -170
- package/src/lib/data/frames.ts +37 -37
- package/src/lib/data/signaling-messages.ts +37 -37
- package/src/lib/data/streaming-messages.ts +136 -136
- package/src/lib/infrastructure/array-stream.ts +109 -109
- package/src/lib/infrastructure/events.ts +61 -61
- package/src/lib/infrastructure/message-assembler.ts +60 -60
- package/src/lib/networking/messaging-client.ts +7 -7
- package/src/lib/networking/web-socket-client.ts +50 -50
- package/src/lib/services/messaging.service.spec.ts +16 -16
- package/src/lib/services/messaging.service.ts +31 -31
- package/src/lib/services/streaming.service.spec.ts +16 -16
- package/src/lib/services/streaming.service.ts +150 -150
- package/src/public-api.ts +15 -15
- package/tsconfig.lib.json +14 -14
- package/tsconfig.lib.prod.json +10 -10
- package/tsconfig.spec.json +14 -14
- package/warpr-1.0.9.tgz +0 -0
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
export type EventHandler<TSender, TEventArgs> = (sender: TSender, eventArgs: TEventArgs) => void;
|
|
2
|
-
|
|
3
|
-
export interface IEventSource {
|
|
4
|
-
|
|
5
|
-
Unsubscribe(token: symbol): void;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export class EventSubscription {
|
|
9
|
-
|
|
10
|
-
constructor(
|
|
11
|
-
private _owner: IEventSource,
|
|
12
|
-
private _token: symbol) { }
|
|
13
|
-
|
|
14
|
-
Unsubscribe() {
|
|
15
|
-
this._owner.Unsubscribe(this._token);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class EventOwner {
|
|
20
|
-
|
|
21
|
-
public readonly Token = Symbol();
|
|
22
|
-
|
|
23
|
-
Raise<TSender, TEventArgs>(event: EventPublisher<TSender, TEventArgs>, sender: TSender, eventArgs: TEventArgs) {
|
|
24
|
-
event.Raise(this, sender, eventArgs);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export class EventArgs {
|
|
29
|
-
public static readonly Empty = new EventArgs();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class EventPublisher<TSender, TEventArgs> implements IEventSource {
|
|
33
|
-
|
|
34
|
-
private readonly _token: symbol;
|
|
35
|
-
private readonly _handlers = new Map<symbol, EventHandler<TSender, TEventArgs>>;
|
|
36
|
-
|
|
37
|
-
constructor(owner: EventOwner) {
|
|
38
|
-
this._token = owner.Token;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
Subscribe(handler: EventHandler<TSender, TEventArgs>) {
|
|
42
|
-
const token = Symbol();
|
|
43
|
-
this._handlers.set(token, handler);
|
|
44
|
-
return new EventSubscription(this, token);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
Raise(owner: EventOwner, sender: TSender, eventArgs: TEventArgs): void {
|
|
48
|
-
if (owner.Token === this._token) {
|
|
49
|
-
for (let [symbol, handler] of this._handlers) {
|
|
50
|
-
handler(sender, eventArgs);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
throw Error("Cannot raise event: this event source does not belong to the specified owner.");
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
Unsubscribe(token: symbol): void {
|
|
59
|
-
this._handlers.delete(token);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
1
|
+
export type EventHandler<TSender, TEventArgs> = (sender: TSender, eventArgs: TEventArgs) => void;
|
|
2
|
+
|
|
3
|
+
export interface IEventSource {
|
|
4
|
+
|
|
5
|
+
Unsubscribe(token: symbol): void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class EventSubscription {
|
|
9
|
+
|
|
10
|
+
constructor(
|
|
11
|
+
private _owner: IEventSource,
|
|
12
|
+
private _token: symbol) { }
|
|
13
|
+
|
|
14
|
+
Unsubscribe() {
|
|
15
|
+
this._owner.Unsubscribe(this._token);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class EventOwner {
|
|
20
|
+
|
|
21
|
+
public readonly Token = Symbol();
|
|
22
|
+
|
|
23
|
+
Raise<TSender, TEventArgs>(event: EventPublisher<TSender, TEventArgs>, sender: TSender, eventArgs: TEventArgs) {
|
|
24
|
+
event.Raise(this, sender, eventArgs);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class EventArgs {
|
|
29
|
+
public static readonly Empty = new EventArgs();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class EventPublisher<TSender, TEventArgs> implements IEventSource {
|
|
33
|
+
|
|
34
|
+
private readonly _token: symbol;
|
|
35
|
+
private readonly _handlers = new Map<symbol, EventHandler<TSender, TEventArgs>>;
|
|
36
|
+
|
|
37
|
+
constructor(owner: EventOwner) {
|
|
38
|
+
this._token = owner.Token;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Subscribe(handler: EventHandler<TSender, TEventArgs>) {
|
|
42
|
+
const token = Symbol();
|
|
43
|
+
this._handlers.set(token, handler);
|
|
44
|
+
return new EventSubscription(this, token);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
Raise(owner: EventOwner, sender: TSender, eventArgs: TEventArgs): void {
|
|
48
|
+
if (owner.Token === this._token) {
|
|
49
|
+
for (let [symbol, handler] of this._handlers) {
|
|
50
|
+
handler(sender, eventArgs);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw Error("Cannot raise event: this event source does not belong to the specified owner.");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
Unsubscribe(token: symbol): void {
|
|
59
|
+
this._handlers.delete(token);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
import { ArrayStream } from "./array-stream";
|
|
2
|
-
|
|
3
|
-
class MessageBuilder {
|
|
4
|
-
public readonly FragmentCount: number;
|
|
5
|
-
public FragmentsReady: number = 0;
|
|
6
|
-
public Buffer: Uint8Array;
|
|
7
|
-
|
|
8
|
-
constructor(
|
|
9
|
-
public readonly Id: number,
|
|
10
|
-
public readonly Size: number,
|
|
11
|
-
public readonly FragmentSize: number
|
|
12
|
-
) {
|
|
13
|
-
this.FragmentCount = Math.ceil(Size / FragmentSize);
|
|
14
|
-
this.Buffer = new Uint8Array(Size);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
AddFragment(index: number, buffer: Uint8Array): boolean {
|
|
18
|
-
if (this.FragmentCount == this.FragmentsReady) throw RangeError("All message parts have been already collected.");
|
|
19
|
-
|
|
20
|
-
this.Buffer.set(buffer, this.FragmentSize * index);
|
|
21
|
-
this.FragmentsReady++;
|
|
22
|
-
|
|
23
|
-
return this.FragmentCount == this.FragmentsReady;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export class MessageAssembler {
|
|
28
|
-
|
|
29
|
-
private _builders = new Map<number, MessageBuilder>();
|
|
30
|
-
|
|
31
|
-
public constructor(private _maxBuilderCount = 3) { }
|
|
32
|
-
|
|
33
|
-
public PushMessage(buffer: ArrayBuffer): ArrayBuffer | null {
|
|
34
|
-
let stream = new ArrayStream(buffer);
|
|
35
|
-
let messageIndex = stream.ReadUInt32();
|
|
36
|
-
let messageSize = stream.ReadUInt32();
|
|
37
|
-
let fragmentSize = stream.ReadUInt32();
|
|
38
|
-
let fragmentIndex = stream.ReadUInt32();
|
|
39
|
-
let fragment = new Uint8Array(stream.ReadToEnd());
|
|
40
|
-
|
|
41
|
-
let builder = this._builders.get(messageIndex);
|
|
42
|
-
if (builder === undefined) {
|
|
43
|
-
builder = new MessageBuilder(messageIndex, messageSize, fragmentSize);
|
|
44
|
-
this._builders.set(messageIndex, builder);
|
|
45
|
-
|
|
46
|
-
if (this._builders.size > this._maxBuilderCount) {
|
|
47
|
-
let [oldest] = this._builders.keys();
|
|
48
|
-
this._builders.delete(oldest);
|
|
49
|
-
console.log("Message lost.");
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (builder.AddFragment(fragmentIndex, fragment)) {
|
|
54
|
-
this._builders.delete(messageIndex);
|
|
55
|
-
return builder.Buffer.buffer;
|
|
56
|
-
} else {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
1
|
+
import { ArrayStream } from "./array-stream";
|
|
2
|
+
|
|
3
|
+
class MessageBuilder {
|
|
4
|
+
public readonly FragmentCount: number;
|
|
5
|
+
public FragmentsReady: number = 0;
|
|
6
|
+
public Buffer: Uint8Array;
|
|
7
|
+
|
|
8
|
+
constructor(
|
|
9
|
+
public readonly Id: number,
|
|
10
|
+
public readonly Size: number,
|
|
11
|
+
public readonly FragmentSize: number
|
|
12
|
+
) {
|
|
13
|
+
this.FragmentCount = Math.ceil(Size / FragmentSize);
|
|
14
|
+
this.Buffer = new Uint8Array(Size);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
AddFragment(index: number, buffer: Uint8Array): boolean {
|
|
18
|
+
if (this.FragmentCount == this.FragmentsReady) throw RangeError("All message parts have been already collected.");
|
|
19
|
+
|
|
20
|
+
this.Buffer.set(buffer, this.FragmentSize * index);
|
|
21
|
+
this.FragmentsReady++;
|
|
22
|
+
|
|
23
|
+
return this.FragmentCount == this.FragmentsReady;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class MessageAssembler {
|
|
28
|
+
|
|
29
|
+
private _builders = new Map<number, MessageBuilder>();
|
|
30
|
+
|
|
31
|
+
public constructor(private _maxBuilderCount = 3) { }
|
|
32
|
+
|
|
33
|
+
public PushMessage(buffer: ArrayBuffer): ArrayBuffer | null {
|
|
34
|
+
let stream = new ArrayStream(buffer);
|
|
35
|
+
let messageIndex = stream.ReadUInt32();
|
|
36
|
+
let messageSize = stream.ReadUInt32();
|
|
37
|
+
let fragmentSize = stream.ReadUInt32();
|
|
38
|
+
let fragmentIndex = stream.ReadUInt32();
|
|
39
|
+
let fragment = new Uint8Array(stream.ReadToEnd());
|
|
40
|
+
|
|
41
|
+
let builder = this._builders.get(messageIndex);
|
|
42
|
+
if (builder === undefined) {
|
|
43
|
+
builder = new MessageBuilder(messageIndex, messageSize, fragmentSize);
|
|
44
|
+
this._builders.set(messageIndex, builder);
|
|
45
|
+
|
|
46
|
+
if (this._builders.size > this._maxBuilderCount) {
|
|
47
|
+
let [oldest] = this._builders.keys();
|
|
48
|
+
this._builders.delete(oldest);
|
|
49
|
+
console.log("Message lost.");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (builder.AddFragment(fragmentIndex, fragment)) {
|
|
54
|
+
this._builders.delete(messageIndex);
|
|
55
|
+
return builder.Buffer.buffer;
|
|
56
|
+
} else {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { EventPublisher } from "../infrastructure/events";
|
|
2
|
-
|
|
3
|
-
export interface IMessagingClient<TMessage> {
|
|
4
|
-
readonly MessageReceived: EventPublisher<IMessagingClient<TMessage>, TMessage>;
|
|
5
|
-
|
|
6
|
-
SendMessage(message: TMessage): void;
|
|
7
|
-
}
|
|
1
|
+
import { EventPublisher } from "../infrastructure/events";
|
|
2
|
+
|
|
3
|
+
export interface IMessagingClient<TMessage> {
|
|
4
|
+
readonly MessageReceived: EventPublisher<IMessagingClient<TMessage>, TMessage>;
|
|
5
|
+
|
|
6
|
+
SendMessage(message: TMessage): void;
|
|
7
|
+
}
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import { EventOwner, EventPublisher, EventArgs } from "../infrastructure/events";
|
|
2
|
-
import { IMessagingClient } from "./messaging-client";
|
|
3
|
-
|
|
4
|
-
export class WebSocketClient<TMessage> implements IMessagingClient<TMessage> {
|
|
5
|
-
private readonly _socket: WebSocket;
|
|
6
|
-
private readonly _events = new EventOwner();
|
|
7
|
-
|
|
8
|
-
public readonly Connected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);
|
|
9
|
-
public readonly MessageReceived = new EventPublisher<IMessagingClient<TMessage>, TMessage>(this._events);
|
|
10
|
-
public readonly Disconnected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);
|
|
11
|
-
|
|
12
|
-
constructor(uri: string) {
|
|
13
|
-
console.log(`Connecting to ${uri}...`);
|
|
14
|
-
|
|
15
|
-
let socket = new WebSocket(uri);
|
|
16
|
-
socket.onopen = () => this.OnConnected();
|
|
17
|
-
socket.onmessage = (e: MessageEvent<string>) => this.OnMessageReceived(e);
|
|
18
|
-
socket.onclose = () => this.OnDisconnected();
|
|
19
|
-
socket.onerror = (e: Event) => this.OnError(e);
|
|
20
|
-
this._socket = socket;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
SendMessage(message: TMessage): void {
|
|
24
|
-
let content = JSON.stringify(message);
|
|
25
|
-
console.log(`Sending message: ${content}`);
|
|
26
|
-
|
|
27
|
-
this._socket.send(content);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
protected OnConnected(): void {
|
|
31
|
-
console.log(`Connected to: ${this._socket.url}.`);
|
|
32
|
-
this._events.Raise(this.Connected, this, EventArgs.Empty);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
protected OnMessageReceived(eventArgs: MessageEvent<string>): void {
|
|
36
|
-
console.log('Message received: ' + eventArgs.data);
|
|
37
|
-
|
|
38
|
-
let message = JSON.parse(eventArgs.data) as TMessage;
|
|
39
|
-
this._events.Raise(this.MessageReceived, this, message);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
protected OnDisconnected(): void {
|
|
43
|
-
console.log(`Disconnected from: ${this._socket.url}.`);
|
|
44
|
-
this._events.Raise(this.Disconnected, this, EventArgs.Empty);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
protected OnError(error: Event): void {
|
|
48
|
-
console.log('Connection failed: ' + error);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
1
|
+
import { EventOwner, EventPublisher, EventArgs } from "../infrastructure/events";
|
|
2
|
+
import { IMessagingClient } from "./messaging-client";
|
|
3
|
+
|
|
4
|
+
export class WebSocketClient<TMessage> implements IMessagingClient<TMessage> {
|
|
5
|
+
private readonly _socket: WebSocket;
|
|
6
|
+
private readonly _events = new EventOwner();
|
|
7
|
+
|
|
8
|
+
public readonly Connected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);
|
|
9
|
+
public readonly MessageReceived = new EventPublisher<IMessagingClient<TMessage>, TMessage>(this._events);
|
|
10
|
+
public readonly Disconnected = new EventPublisher<IMessagingClient<TMessage>, EventArgs>(this._events);
|
|
11
|
+
|
|
12
|
+
constructor(uri: string) {
|
|
13
|
+
console.log(`Connecting to ${uri}...`);
|
|
14
|
+
|
|
15
|
+
let socket = new WebSocket(uri);
|
|
16
|
+
socket.onopen = () => this.OnConnected();
|
|
17
|
+
socket.onmessage = (e: MessageEvent<string>) => this.OnMessageReceived(e);
|
|
18
|
+
socket.onclose = () => this.OnDisconnected();
|
|
19
|
+
socket.onerror = (e: Event) => this.OnError(e);
|
|
20
|
+
this._socket = socket;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
SendMessage(message: TMessage): void {
|
|
24
|
+
let content = JSON.stringify(message);
|
|
25
|
+
console.log(`Sending message: ${content}`);
|
|
26
|
+
|
|
27
|
+
this._socket.send(content);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
protected OnConnected(): void {
|
|
31
|
+
console.log(`Connected to: ${this._socket.url}.`);
|
|
32
|
+
this._events.Raise(this.Connected, this, EventArgs.Empty);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
protected OnMessageReceived(eventArgs: MessageEvent<string>): void {
|
|
36
|
+
console.log('Message received: ' + eventArgs.data);
|
|
37
|
+
|
|
38
|
+
let message = JSON.parse(eventArgs.data) as TMessage;
|
|
39
|
+
this._events.Raise(this.MessageReceived, this, message);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected OnDisconnected(): void {
|
|
43
|
+
console.log(`Disconnected from: ${this._socket.url}.`);
|
|
44
|
+
this._events.Raise(this.Disconnected, this, EventArgs.Empty);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected OnError(error: Event): void {
|
|
48
|
+
console.log('Connection failed: ' + error);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { TestBed } from '@angular/core/testing';
|
|
2
|
-
|
|
3
|
-
import { MessagingService } from './messaging.service';
|
|
4
|
-
|
|
5
|
-
describe('MessagingService', () => {
|
|
6
|
-
let service: MessagingService;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
TestBed.configureTestingModule({});
|
|
10
|
-
service = TestBed.inject(MessagingService);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('should be created', () => {
|
|
14
|
-
expect(service).toBeTruthy();
|
|
15
|
-
});
|
|
16
|
-
});
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
|
|
3
|
+
import { MessagingService } from './messaging.service';
|
|
4
|
+
|
|
5
|
+
describe('MessagingService', () => {
|
|
6
|
+
let service: MessagingService;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
TestBed.configureTestingModule({});
|
|
10
|
+
service = TestBed.inject(MessagingService);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should be created', () => {
|
|
14
|
+
expect(service).toBeTruthy();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { WebSocketClient } from '../networking/web-socket-client';
|
|
3
|
-
import { WarprSignalingMessage, ConnectionRequest } from '../data/signaling-messages';
|
|
4
|
-
|
|
5
|
-
@Injectable({
|
|
6
|
-
providedIn: 'root'
|
|
7
|
-
})
|
|
8
|
-
export class MessagingService extends WebSocketClient<WarprSignalingMessage> {
|
|
9
|
-
|
|
10
|
-
private static readonly _connectionUri = 'api/sinks/connect';
|
|
11
|
-
private readonly _sessionId = "a5d26e70-2b61-451f-9ecb-7d1b9a76ed1b";
|
|
12
|
-
|
|
13
|
-
constructor() {
|
|
14
|
-
const uri = MessagingService.GetServerUri();
|
|
15
|
-
super(uri);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
private static GetServerUri(): string {
|
|
19
|
-
const location = window.location;
|
|
20
|
-
const protocol = location.protocol === 'https:' ? 'wss' : 'ws';
|
|
21
|
-
return `${protocol}://${location.host}/${this._connectionUri}`;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
protected override OnConnected(): void {
|
|
25
|
-
super.OnConnected();
|
|
26
|
-
|
|
27
|
-
let request = new ConnectionRequest();
|
|
28
|
-
request.SessionId = this._sessionId;
|
|
29
|
-
this.SendMessage(request);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { WebSocketClient } from '../networking/web-socket-client';
|
|
3
|
+
import { WarprSignalingMessage, ConnectionRequest } from '../data/signaling-messages';
|
|
4
|
+
|
|
5
|
+
@Injectable({
|
|
6
|
+
providedIn: 'root'
|
|
7
|
+
})
|
|
8
|
+
export class MessagingService extends WebSocketClient<WarprSignalingMessage> {
|
|
9
|
+
|
|
10
|
+
private static readonly _connectionUri = 'api/sinks/connect';
|
|
11
|
+
private readonly _sessionId = "a5d26e70-2b61-451f-9ecb-7d1b9a76ed1b";
|
|
12
|
+
|
|
13
|
+
constructor() {
|
|
14
|
+
const uri = MessagingService.GetServerUri();
|
|
15
|
+
super(uri);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private static GetServerUri(): string {
|
|
19
|
+
const location = window.location;
|
|
20
|
+
const protocol = location.protocol === 'https:' ? 'wss' : 'ws';
|
|
21
|
+
return `${protocol}://${location.host}/${this._connectionUri}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
protected override OnConnected(): void {
|
|
25
|
+
super.OnConnected();
|
|
26
|
+
|
|
27
|
+
let request = new ConnectionRequest();
|
|
28
|
+
request.SessionId = this._sessionId;
|
|
29
|
+
this.SendMessage(request);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { TestBed } from '@angular/core/testing';
|
|
2
|
-
|
|
3
|
-
import { StreamingService } from './streaming.service';
|
|
4
|
-
|
|
5
|
-
describe('StreamingService', () => {
|
|
6
|
-
let service: StreamingService;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
TestBed.configureTestingModule({});
|
|
10
|
-
service = TestBed.inject(StreamingService);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('should be created', () => {
|
|
14
|
-
expect(service).toBeTruthy();
|
|
15
|
-
});
|
|
16
|
-
});
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
|
|
3
|
+
import { StreamingService } from './streaming.service';
|
|
4
|
+
|
|
5
|
+
describe('StreamingService', () => {
|
|
6
|
+
let service: StreamingService;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
TestBed.configureTestingModule({});
|
|
10
|
+
service = TestBed.inject(StreamingService);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should be created', () => {
|
|
14
|
+
expect(service).toBeTruthy();
|
|
15
|
+
});
|
|
16
|
+
});
|