{"version":3,"file":"socket.mjs","sources":["../../../../src/stores/socket.ts"],"sourcesContent":["import { defineStore } from 'pinia';\nimport { printCssStyle } from '@myprint/design/utils/utils';\nimport { useConfigStore } from './config';\nimport { ClientCmd, ClientResult, Printer } from '@myprint/design/types/entity';\n\nlet lockReconnect: any;\nexport const useSocket = defineStore('myPrintSocket', {\n    state: () => {\n        return {\n            socket: undefined as any,\n            timer: undefined as any,\n            connect: false,\n            printerList: [] as Printer[],\n            resolveMap: {}\n        };\n    },\n    actions: {\n        INIT_SOCKET() {\n            // console.log(onSocketMessage)\n            // console.log('初始化INIT_SOCKET')\n            let stateThis = this;\n            const reconnect = () => {\n                if (lockReconnect) return;\n                lockReconnect = true;\n                // clearTimeout(timer);\n                stateThis.timer = setTimeout(() => {\n                    createSocket();\n                    lockReconnect = false;\n                }, 4000);\n            };\n            const onMessage = (msgData: ClientResult) => {\n                // 遍历onMessage集合并触发\n                if (this.resolveMap[msgData.taskId]) {\n                    this.resolveMap[msgData.taskId](msgData);\n                    delete this.resolveMap[msgData.taskId];\n                }\n            };\n\n            const init = () => {\n                this.socket!.onopen = function(_event: any) {\n                    // console.log('WebSocket:已连接');\n                    //心跳检测重置\n                    stateThis.connect = true;\n                    // app.SET_CLIENT_CONNECT(true)\n                    heartCheck.reset().start();\n                    // 发送css样式过去\n                    stateThis.socket!.send(JSON.stringify({\n                        options: { css: printCssStyle() },\n                        cmd: 'text/css'\n                    } as ClientCmd));\n                };\n\n                //接收到消息的回调方法\n                this.socket!.onmessage = function(event: any) {\n                    const clientResult = JSON.parse(event.data) as ClientResult;\n                    switch (clientResult.cmd) {\n                        case 'printerList':\n                            stateThis.printerList = (clientResult.data as any[]).map(res => (res));\n                            onMessage(clientResult);\n                            break;\n                        case 'printResult':\n                            onMessage(clientResult);\n                            break;\n                        case 'generatePdfResult':\n                            onMessage(clientResult);\n                            break;\n                        case 'pong':\n                            break;\n                    }\n                    heartCheck.reset().start();\n                };\n\n                //连接发生错误的回调方法\n                this.socket!.onerror = function(_event: any) {\n                    // console.log(\"WebSocket:发生错误\");\n                    stateThis.connect = false;\n                    // app.SET_CLIENT_CONNECT(false)\n                    reconnect();\n                };\n\n                //连接关闭的回调方法\n                this.socket!.onclose = function(_event: any) {\n                    // console.log(\"WebSocket:已关闭\");\n                    heartCheck.reset();//心跳检测\n                    stateThis.connect = false;\n                    // app.SET_CLIENT_CONNECT(false)\n                    reconnect();\n                };\n\n                //监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。\n                window.onbeforeunload = function() {\n                    // app.SET_CLIENT_CONNECT(false)\n                    stateThis.connect = false;\n                    stateThis.socket!.close();\n                };\n            };\n\n            const createSocket = () => {\n                try {\n                    // console.log(this)\n                    // console.log(stateThis)\n                    stateThis.socket = new WebSocket(useConfigStore().clientUrl.replace('https', 'ws').replace('http', 'ws'));\n                    init();\n                } catch (e) {\n                    reconnect();\n                }\n            };\n\n            const heartCheck = {\n                timeout: 5000,\n                timeoutObj: setTimeout(() => {\n                }),\n                serverTimeoutObj: setInterval(() => {\n                }),\n                reset: function() {\n                    clearTimeout(this.timeoutObj);\n                    clearTimeout(this.serverTimeoutObj);\n                    return this;\n                },\n                start: function() {\n                    const self = this;\n                    clearTimeout(this.timeoutObj);\n                    clearTimeout(this.serverTimeoutObj);\n                    this.timeoutObj = setTimeout(function() {\n                        //这里发送一个心跳，后端收到后，返回一个心跳消息，\n                        //onmessage拿到返回的心跳就说明连接正常\n                        stateThis.socket!.send(JSON.stringify({\n                            'cmd': 'ping'\n                        }));\n                        // console.log('ping');\n                        self.serverTimeoutObj = setTimeout(function() { // 如果超过一定时间还没重置，说明后端主动断开了\n                            // console.log('关闭服务');\n                            stateThis.socket!.close();//如果onclose会执行reconnect，我们执行 websocket.close()就行了.如果直接执行 reconnect 会触发onclose导致重连两次\n                        }, self.timeout);\n                    }, this.timeout);\n                }\n            };\n\n            createSocket();\n        },\n        SET_PRINTER_LIST(list: Printer[]) {\n            this.printerList = list;\n        },\n        SEND(taskId: string, msg: any) {\n            return new Promise<ClientResult>((resolve, _reject) => {\n                this.resolveMap[taskId] = resolve;\n                this.socket!.send(msg);\n            });\n        }\n    }\n});\n"],"names":[],"mappings":"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"}