2024-01-17 10:25:16 +01:00
|
|
|
import { Injectable } from '@angular/core';
|
|
|
|
|
import * as signalR from "@microsoft/signalr"
|
|
|
|
|
import { SessionStore } from '../store/session.service';
|
2024-01-29 13:49:53 +01:00
|
|
|
import { v4 as uuidv4 } from 'uuid'
|
|
|
|
|
import { HttpClient, HttpHeaders, HttpEventType } from '@angular/common/http';
|
|
|
|
|
import { CMAPIService } from '../shared/repository/CMAPI/cmapi.service';
|
|
|
|
|
import { HubConnectionBuilder } from '@microsoft/signalr';
|
2024-01-17 10:25:16 +01:00
|
|
|
|
|
|
|
|
@Injectable({
|
|
|
|
|
providedIn: 'root'
|
|
|
|
|
})
|
|
|
|
|
export class SocketConnectionMCRService {
|
2024-01-31 17:12:01 +01:00
|
|
|
// private callbacks: Function[] = []
|
|
|
|
|
// private onDisconnect: Function[] = []
|
|
|
|
|
// private onConnect: Function[] = []
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
constructor(private http: HttpClient, private _CMAPIService: CMAPIService) {
|
|
|
|
|
window["http"] = this.http
|
|
|
|
|
}
|
2024-01-31 17:12:01 +01:00
|
|
|
|
|
|
|
|
// connect() {
|
|
|
|
|
|
|
|
|
|
// var connection = new signalR.HubConnectionBuilder()
|
|
|
|
|
// .withUrl("https://gdcmapi-dev.dyndns.info/FileHub", {
|
|
|
|
|
// accessTokenFactory: () => "Bearer "+SessionStore.user.Authorization
|
|
|
|
|
// }).configureLogging(signalR.LogLevel.Information)
|
|
|
|
|
// .build();
|
|
|
|
|
|
|
|
|
|
// connection.on("ReceiveMessage", (message) => {
|
|
|
|
|
// console.log("ReceiveMessage", message)
|
|
|
|
|
// })
|
|
|
|
|
|
|
|
|
|
// connection.onreconnected((connectionId) => {
|
|
|
|
|
// console.assert(connection.state === signalR.HubConnectionState.Connected);
|
|
|
|
|
// console.log(`Reconnected with connectionId: ${connectionId}`);
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
// connection.start()
|
|
|
|
|
// .then(() => {
|
|
|
|
|
// console.log("SignalR connection started.");
|
|
|
|
|
// })
|
|
|
|
|
// .catch((error) => {
|
|
|
|
|
// console.error("Error starting SignalR connection:", error);
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
// connection.onclose((error) => {
|
|
|
|
|
// connection.start()
|
|
|
|
|
// console.log("SignalR connection closed:", error);
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// subscribe(callback) {
|
|
|
|
|
// this.callbacks.push(callback);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// unsubscribe(callback) {
|
|
|
|
|
// this.callbacks = this.callbacks.filter(cb => cb !== callback);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// onDisconnectCallback(callback) {
|
|
|
|
|
// this.onDisconnect.push(callback)
|
|
|
|
|
// }
|
|
|
|
|
// onConnectCallback(callback) {
|
|
|
|
|
// this.onConnect.push(callback)
|
|
|
|
|
// }
|
2024-01-29 13:49:53 +01:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
class ReconnectingWebSocketSignalR {
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
private connection: any
|
|
|
|
|
isOpen: boolean = false
|
2024-02-02 10:50:20 +01:00
|
|
|
private callbacks: Function[] = []
|
|
|
|
|
private onDisconnect: Function[] = []
|
|
|
|
|
private onConnect: Function[] = []
|
2024-02-07 16:45:53 +01:00
|
|
|
private whenConnected: Function[] = []
|
2024-02-08 10:14:21 +01:00
|
|
|
stop = true
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
constructor() {}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
connect() {
|
2024-02-07 16:45:53 +01:00
|
|
|
console.log("try to connect=================================")
|
|
|
|
|
this.stop = false
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
this.connection = new signalR.HubConnectionBuilder()
|
|
|
|
|
.withUrl("https://gdcmapi-dev.dyndns.info/FileHub", {
|
|
|
|
|
transport: signalR.HttpTransportType.LongPolling,
|
|
|
|
|
accessTokenFactory: () => SessionStore.user.Authorization
|
|
|
|
|
}).configureLogging(signalR.LogLevel.Information)
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.connection.start()
|
|
|
|
|
.then(() => {
|
2024-02-02 10:50:20 +01:00
|
|
|
this.isOpen = true;
|
|
|
|
|
console.log('WebSocket connection established');
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
this.onConnect.forEach(callback => callback());
|
2024-02-07 16:45:53 +01:00
|
|
|
this.whenConnected.forEach(callback => callback())
|
|
|
|
|
})
|
|
|
|
|
.catch((error) => {
|
|
|
|
|
console.error("Error starting SignalR connection:", error);
|
2024-01-24 10:08:21 +01:00
|
|
|
});
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
|
|
|
|
|
this.connection.on("ReceiveMessage", (message) => {
|
|
|
|
|
const data: any = JSON.parse(message)
|
|
|
|
|
console.log("ReceiveMessage", data)
|
2024-02-02 10:50:20 +01:00
|
|
|
this.callbacks.forEach(callback => callback(data));
|
2024-02-07 16:45:53 +01:00
|
|
|
})
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
this.connection.onclose((error) => {
|
|
|
|
|
console.log('WebSocket connection closed..');
|
2024-02-02 10:50:20 +01:00
|
|
|
this.isOpen = false;
|
|
|
|
|
this.onDisconnect.forEach(callback => callback());
|
|
|
|
|
// Attempt to reconnect after a delay
|
|
|
|
|
if(this.stop == false) {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
this.connect();
|
|
|
|
|
}, 1000); // Adjust the delay as needed
|
|
|
|
|
}
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-01-22 16:09:02 +01:00
|
|
|
});
|
2024-02-02 10:50:20 +01:00
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
commit(path) {
|
|
|
|
|
this.connection.invoke("CommitUpload", path).catch(err => console.error(err.toString()));
|
2024-02-02 10:50:20 +01:00
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
disconnect() {
|
|
|
|
|
this.stop = true
|
2024-02-07 16:45:53 +01:00
|
|
|
if(this.isOpen == true) {
|
|
|
|
|
this.connection.stop()
|
|
|
|
|
.then(() => {
|
|
|
|
|
console.log('WebSocket connection was closed by client');
|
|
|
|
|
this.isOpen = false;
|
|
|
|
|
this.onDisconnect.forEach(callback => callback());
|
|
|
|
|
console.log("SignalR connection stopped.");
|
|
|
|
|
})
|
|
|
|
|
.catch((error) => {
|
|
|
|
|
console.error("Error stopping SignalR connection by client:", error);
|
|
|
|
|
});
|
2024-02-02 10:50:20 +01:00
|
|
|
}
|
|
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
subscribe(callback) {
|
|
|
|
|
this.callbacks.push(callback);
|
|
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
unsubscribe(callback) {
|
|
|
|
|
this.callbacks = this.callbacks.filter(cb => cb !== callback);
|
|
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
onDisconnectCallback(callback) {
|
|
|
|
|
this.onDisconnect.push(callback)
|
|
|
|
|
}
|
|
|
|
|
onConnectCallback(callback) {
|
|
|
|
|
this.onConnect.push(callback)
|
|
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
registerWhenConnected(f: Function) {
|
|
|
|
|
if(this.isOpen) {
|
|
|
|
|
f();
|
|
|
|
|
} else {
|
|
|
|
|
this.whenConnected.push(f);
|
|
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
}
|
|
|
|
|
}
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
interface socketResponse {
|
2024-02-02 10:50:20 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
index: string
|
|
|
|
|
Guid: string
|
|
|
|
|
IsCompleted: Boolean
|
|
|
|
|
}
|
|
|
|
|
// class ReconnectingWebSocket {
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// private url: string
|
|
|
|
|
// private socket
|
|
|
|
|
// isOpen: boolean
|
|
|
|
|
// private callbacks: Function[] = []
|
|
|
|
|
// private onDisconnect: Function[] = []
|
|
|
|
|
// private onConnect: Function[] = []
|
|
|
|
|
// private whenConnected: Function[] = []
|
|
|
|
|
// private stop = true
|
|
|
|
|
// http: HttpClient = window["http"]
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// constructor(url) {
|
|
|
|
|
// this.url = url;
|
|
|
|
|
// this.socket = null;
|
|
|
|
|
// this.isOpen = false;
|
|
|
|
|
// }
|
2024-02-01 11:44:56 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// connect() {
|
|
|
|
|
// this.socket = new WebSocket(this.url);
|
2024-02-01 11:44:56 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// this.socket.addEventListener('open', (event) => {
|
|
|
|
|
// this.isOpen = true;
|
|
|
|
|
// console.log('WebSocket connection established');
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// // Example: Send a message to the server
|
|
|
|
|
// this.socket.send('Hello, WebSocket Server!');
|
|
|
|
|
// this.onConnect.forEach(callback => callback());
|
|
|
|
|
// this.whenConnected.forEach(callback => callback())
|
|
|
|
|
// });
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// this.socket.addEventListener('message', (event) => {
|
|
|
|
|
// const data: socketResponse = JSON.parse(event.data)
|
|
|
|
|
// this.callbacks.forEach(callback => callback(data));
|
|
|
|
|
// });
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// this.socket.addEventListener('close', (event) => {
|
|
|
|
|
// console.log('WebSocket connection closed');
|
|
|
|
|
// this.isOpen = false;
|
|
|
|
|
// this.onDisconnect.forEach(callback => callback());
|
|
|
|
|
// // Attempt to reconnect after a delay
|
|
|
|
|
// if(this.stop == false) {
|
|
|
|
|
// setTimeout(() => {
|
|
|
|
|
// this.connect();
|
|
|
|
|
// }, 1000); // Adjust the delay as needed
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
// }
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// send(message) {
|
|
|
|
|
// if (this.isOpen) {
|
|
|
|
|
// this.socket.send(message);
|
|
|
|
|
// } else {
|
|
|
|
|
// console.error('WebSocket connection is not open. Unable to send message.');
|
|
|
|
|
// }
|
|
|
|
|
// }
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// disconnect() {
|
|
|
|
|
// this.stop = true
|
|
|
|
|
// if (this.isOpen) {
|
|
|
|
|
// this.isOpen = false;
|
|
|
|
|
// this.socket.close();
|
|
|
|
|
// }
|
|
|
|
|
// }
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// subscribe(callback) {
|
|
|
|
|
// this.callbacks.push(callback);
|
|
|
|
|
// }
|
2024-02-02 10:50:20 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// unsubscribe(callback) {
|
|
|
|
|
// this.callbacks = this.callbacks.filter(cb => cb !== callback);
|
|
|
|
|
// }
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// onDisconnectCallback(callback) {
|
|
|
|
|
// this.onDisconnect.push(callback)
|
|
|
|
|
// }
|
|
|
|
|
// onConnectCallback(callback) {
|
|
|
|
|
// this.onConnect.push(callback)
|
|
|
|
|
// }
|
2024-01-29 13:49:53 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// registerWhenConnected(f: Function) {
|
|
|
|
|
// if(this.isOpen) {
|
|
|
|
|
// f();
|
|
|
|
|
// } else {
|
|
|
|
|
// this.whenConnected.push(f);
|
|
|
|
|
// }
|
2024-02-02 10:50:20 +01:00
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// }
|
|
|
|
|
// }
|
2024-02-02 10:50:20 +01:00
|
|
|
|
|
|
|
|
// export class ObjectMergeNotification{
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// socket = new ReconnectingWebSocket('ws://localhost:3002');
|
2024-02-02 10:50:20 +01:00
|
|
|
// callbacks: {[GUID: string]: Function} = {}
|
|
|
|
|
// runWatch = true
|
|
|
|
|
// CMAPIService: CMAPIService = window["CMAPIAPIRepository"]
|
|
|
|
|
// watchCount = 0
|
|
|
|
|
|
|
|
|
|
// constructor() {
|
|
|
|
|
// this.socket.onDisconnectCallback(()=> {
|
|
|
|
|
// console.log("run watch")
|
|
|
|
|
// this.runWatch = true
|
|
|
|
|
// this.watch()
|
|
|
|
|
// })
|
|
|
|
|
|
|
|
|
|
// this.socket.onConnectCallback(()=> {
|
|
|
|
|
// console.log("open trigger")
|
|
|
|
|
// this.runWatch = false
|
|
|
|
|
// })
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
// this.socket.subscribe((data: socketResponse) => {
|
|
|
|
|
// if(data.IsCompleted == true) {
|
|
|
|
|
// console.log("==================!!!====================")
|
2024-02-07 16:45:53 +01:00
|
|
|
// try {
|
2024-02-02 10:50:20 +01:00
|
|
|
// this.callbacks[data.Guid](data)
|
|
|
|
|
// delete this.callbacks[data.Guid]
|
|
|
|
|
// } catch (error) {}
|
|
|
|
|
// } else {
|
|
|
|
|
// console.log("else", data)
|
|
|
|
|
// }
|
|
|
|
|
// })
|
|
|
|
|
|
|
|
|
|
// this.watch()
|
|
|
|
|
// }
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// connect() {
|
|
|
|
|
// this.socket.connect()
|
2024-02-02 10:50:20 +01:00
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// async watch() {
|
|
|
|
|
|
|
|
|
|
// this.watchCount = 0;
|
|
|
|
|
|
|
|
|
|
// if(this.runWatch) {
|
|
|
|
|
// setTimeout(async () => {
|
|
|
|
|
// for(const [key, funx] of Object.entries(this.callbacks)) {
|
|
|
|
|
|
|
|
|
|
// const request = await this.CMAPIService.getVideoHeader(key)
|
|
|
|
|
|
|
|
|
|
// if(request.isOk()) {
|
|
|
|
|
// funx()
|
|
|
|
|
// delete this.callbacks[key]
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// this.watchCount++
|
|
|
|
|
// if(this.watchCount <= 15) {
|
2024-02-07 16:45:53 +01:00
|
|
|
// this.watch()
|
2024-02-02 10:50:20 +01:00
|
|
|
// } else {
|
|
|
|
|
// this.runWatch = false
|
|
|
|
|
// }
|
2024-02-07 16:45:53 +01:00
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
// }, 1000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// } else {
|
|
|
|
|
// console.log("end loop============================")
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
2024-02-07 16:45:53 +01:00
|
|
|
// close() {
|
|
|
|
|
// this.socket.disconnect();
|
|
|
|
|
// this.watchCount = 0;
|
|
|
|
|
// this.runWatch = false
|
|
|
|
|
// }
|
|
|
|
|
|
2024-02-02 10:50:20 +01:00
|
|
|
// subscribe(GUID, callback:Function) {
|
|
|
|
|
// this.callbacks[GUID] = callback;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// unsubscribe(GUID) {
|
|
|
|
|
// delete this.callbacks[GUID]
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// }
|
2024-02-07 16:45:53 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
export class ObjectMergeNotification{
|
|
|
|
|
|
|
|
|
|
socket = new ReconnectingWebSocketSignalR()
|
|
|
|
|
callbacks: {[GUID: string]: Function} = {}
|
|
|
|
|
runWatch = true
|
|
|
|
|
CMAPIService: CMAPIService = window["CMAPIAPIRepository"]
|
|
|
|
|
watchCount = 0
|
|
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
this.socket.onDisconnectCallback(()=> {
|
|
|
|
|
console.log("run watch")
|
|
|
|
|
this.runWatch = true
|
|
|
|
|
this.watch()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
this.socket.onConnectCallback(()=> {
|
|
|
|
|
|
|
|
|
|
console.log("open trigger")
|
|
|
|
|
this.runWatch = false
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
this.socket.subscribe((data: socketResponse) => {
|
|
|
|
|
if(data.IsCompleted == true) {
|
|
|
|
|
console.log("==================!!!====================")
|
|
|
|
|
try {
|
|
|
|
|
this.callbacks[data.Guid](data)
|
|
|
|
|
delete this.callbacks[data.Guid]
|
|
|
|
|
} catch (error) {}
|
|
|
|
|
} else {
|
|
|
|
|
console.log("else", data)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
this.socket.connect();
|
|
|
|
|
this.watch()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
connect() {
|
|
|
|
|
this.socket.connect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
close() {
|
|
|
|
|
this.socket.disconnect();
|
|
|
|
|
this.watchCount = 0;
|
|
|
|
|
this.runWatch = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async watch() {
|
|
|
|
|
|
|
|
|
|
// this.watchCount = 0;
|
|
|
|
|
|
|
|
|
|
// if(this.runWatch) {
|
|
|
|
|
// setTimeout(async () => {
|
|
|
|
|
// for(const [key, funx] of Object.entries(this.callbacks)) {
|
|
|
|
|
|
|
|
|
|
// const request = await this.CMAPIService.getVideoHeader(key)
|
|
|
|
|
|
|
|
|
|
// if(request.isOk()) {
|
|
|
|
|
// funx()
|
|
|
|
|
// delete this.callbacks[key]
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// this.watchCount++
|
|
|
|
|
// if(this.watchCount <= 15) {
|
|
|
|
|
// this.watch()
|
|
|
|
|
// } else {
|
|
|
|
|
// this.runWatch = false
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// }, 1000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// } else {
|
|
|
|
|
// console.log("end loop============================")
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
subscribe(GUID, callback:Function) {
|
|
|
|
|
this.callbacks[GUID] = callback;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsubscribe(GUID) {
|
|
|
|
|
delete this.callbacks[GUID]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|