Files
api/sample/dev/talk/js/module/hub.js
2025-07-02 21:55:07 +09:00

229 lines
9.4 KiB
JavaScript

import {global} from "http://devtalk.kospo.co.kr:3000/static/js/module/variable.js";
import {HubEvent} from "http://devtalk.kospo.co.kr:3000/static/js/module/hubEvent.js";
import Common from "http://devtalk.kospo.co.kr:3000/static/js/utils.js";
import {talkEvent} from "http://devtalk.kospo.co.kr:3000/static/js/module/talkEvent.js";
import {getMessageAll, getTalkList, getMoreMessageAll} from "http://devtalk.kospo.co.kr:3000/static/js/module/apis.js";
import receiver from "http://devtalk.kospo.co.kr:3000/static/js/module/receiver.js";
export default class Hub {
constructor() {
this.controller = new AbortController();
this.signal = this.controller.signal;
}
install() {
return new Promise(async (resolve, reject) => {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register(global.option.serviceWorkerLocation, {updateViaCache: 'none'})
.then(async registration => {
global.registration = registration;
let checker = true;
while (checker) {
if (global.registration.active !== undefined && global.registration.active !== null) checker = false;
await Common.sleep(5)
}
// 서비스워커 업데이트
registration.update();
// 서비스 워커 설치 완료후 HUB 소켓 연결 명령
HubEvent.connect({
type: 'CONNECT',
tabId: global.tabId,
url: global.apiUrl,
sabun: global.user.sabun,
encSabun: global.option.encSabun,
site: global.currentUrl
})
resolve();
})
.catch(error => {
console.error('Service Worker registration failed:', error);
reject();
});
}
})
}
// HUB 소켓 리시버 정의
start() {
console.log('hub message event start', new Date())
// navigator.serviceWorker.removeEventListener('message', this.message, {signal: this.controller.signal})
navigator.serviceWorker.addEventListener('message', this.message,{signal: this.signal})
}
stop() {
console.log('hub message event stop', new Date())
this.controller.abort();
this.controller = new AbortController();
this.signal = this.controller.signal;
}
message(event) {
const payload = event.data;
if(payload.type === 'PING') {
// console.log('PING', new Date())
try {
global.registration.active.postMessage({
type: 'PONG'
});
} catch(e) {}
} else if (payload.type === 'GETUP') {
global.serviceWorkerConnect = true;
} else if (payload.type === 'HUB_RECONNECT') {
HubEvent.close({
type: 'TAB_CLOSE',
tabId: global.tabId,
url: global.apiUrl,
sabun: global.user.sabun,
channelSabun: global.user.sabun,
site: global.currentUrl
})
global.hub.install().then(() => {
// global.hub.start();
HubEvent.start(global.talkParams({
type: 'START',
tabId: global.tabId
}))
// getMessageAll(false)
getMoreMessageAll()
global.registration.active.postMessage({'type': 'HUB_RECONNECT_SUCCESS'})
});
} else if (payload.type === 'SEND_OTHER_INIT') {
if (Common.isMaster()) {
HubEvent.otherInit({
type: 'OTHER_INIT',
talkData: global.talkData,
insSabun: global.user.sabun,
tabId: global.tabId
})
}
} else if (payload.type === 'SEND_SET_MASTER') {
if (!Common.isMaster()) {
global.init = false;
talkEvent.reConnect()
}
} else if (payload.type === 'SEND_TYPED') {
if (Common.isMaster()) {
payload.type = payload.type.replace('SEND_', '')
talkEvent.send(payload)
}
} else if (payload.type === 'OTHER_INIT') {
if (!Common.isMaster()) {
receiver.otherInit(payload)
}
} else if (payload.type === 'SEND') {
if (Common.isMaster()) {
talkEvent.send(payload)
}
} else if (payload.type === 'JOIN') {
receiver.join(payload)
} else if (payload.type === 'CHANGE') {
receiver.change(payload)
} else if (payload.type === 'START') {
receiver.start(payload)
} else if (payload.type === 'LEAVE') {
receiver.leave(payload)
} else if (payload.type === 'DELETE') {
receiver.delete(payload)
} else if (payload.type === 'WORK_ONLINE') {
receiver.workOnline(payload)
} else if (payload.type === 'WORK_OFFLINE') {
receiver.workOffline(payload)
} else if (payload.type === 'ONLINE') {
receiver.online(payload)
} else if (payload.type === 'OFFLINE') {
receiver.offline(payload)
} else if (payload.type === 'ERROR') {
receiver.error(payload)
} else if (payload.type === 'STATUS') {
receiver.message(payload)
} else if(payload.type === 'EXTERNAL_SAVE') {
receiver.externalSave(payload)
} else if (payload.type === 'INTRO') {
receiver.intro(payload)
} else if (payload.type === 'MESSAGE') {
global.checker.flag = false;
global.checker.inDate = '';
receiver.message(payload);
const chatContent = global.shadowRoot.querySelector('#chat-content');
const content = chatContent.querySelector('.simplebar-content');
const typedProgress = content.querySelector('.your-dot-progress');
if(typedProgress) {
const clone = typedProgress.cloneNode(true)
talkEvent.messageUnTyped()
content.insertAdjacentElement('beforeend', clone)
}
} else if(payload.type === 'QUESTION') {
receiver.message(payload);
} else if (payload.type === 'INFO_MESSAGE') {
receiver.infoMessage(payload)
} else if (payload.type === 'CLOSE') {
receiver.close(payload);
} else if (payload.type === 'TYPED') {
console.log('service worker message', payload)
receiver.typed(payload);
} else if (payload.type === 'UNTYPED') {
console.log('service worker message', payload)
receiver.untyped(payload);
} else if (payload.type === 'READ') {
receiver.read(payload);
} else if (payload.type === 'ATTACH_INIT') {
receiver.attachStart(payload);
} else if (payload.type === 'ATTACH_PROGRESS') {
receiver.attachProgress(payload);
} else if (payload.type === 'ATTACH_END') {
receiver.attachEnd(payload);
} else if (payload.type === 'MORE_MESSAGE_LINE') {
if (payload.tabId !== global.tabId) {
receiver.moreMessageLine(payload)
}
} else if (payload.type === 'DELETE') {
/*삭제처리*/
if (localStorage.getItem('talkId') === payload.talkId) {
const chatBack = global.shadowRoot.querySelector('.contacts-list-show');
chatBack.click();
}
talkEvent.talkRemove(payload.talkId)
} else if (payload.type === 'MARK') {
/*보관처리*/
talkEvent.talkMark(payload.talkId)
} else if (payload.type === 'UNSUBSCRIBE') {
/*새로운 탭 활성화시 현재 탭 외 모든 구독 해제 조건(탭아이디가 동일 하지 않으며 모든 로딩이 완료)*/
if (payload.tabId !== global.tabId && global.init) {
talkEvent.allUnsubscribe();
}
} else if (payload.type === 'WORK_COUNT') {
/*현재 업무 카운트*/
receiver.changeLoginInfo(payload)
} else if(payload.type === 'SW_RECONNECT') {
console.log('sw_reconnect')
// 개인 사번 소켓 연결
try{global.subscribeList[global.user.sabun] = talkEvent.userSubscribe();}catch(e){}
// 업무별 소켓 연결
try{global.subscribeList[global.work.workId] = talkEvent.workSubscribe();}catch(e){}
// 톡방 재갱신
// getMessageAll(false)
getMoreMessageAll()
if (Common.isMaster()) {
// 허브설정
HubEvent.start(global.talkParams({
type: 'START',
tabId: global.tabId
}))
// 현재 탭 외 모든 탭 구독 해지
HubEvent.send(global.talkParams({
type: 'UNSUBSCRIBE',
tabId: global.tabId
}))
}
} else if(payload.type === 'HEARTBEAT') {
console.log("PONG")
}
}
}