/* Author: https://github.com/nathantsoi/vue-native-websocket */ import Notify from './notify.vue' import Observer from './observer' import Emitter from './emitter' export default { install(app, connection, opts = {}) { if (typeof connection === 'object') { // eslint-disable-next-line no-param-reassign opts = connection // eslint-disable-next-line no-param-reassign connection = '' } let observer = null opts.$setInstance = wsInstance => { app.config.globalProperties.$socket = wsInstance } app.config.globalProperties.$connect = (connectionUrl = connection, connectionOpts = opts) => { connectionOpts.$setInstance = opts.$setInstance observer = new Observer(connectionUrl, connectionOpts) app.config.globalProperties.$socket = observer.WebSocket } app.config.globalProperties.$disconnect = () => { if (observer?.reconnection) { observer.reconnection = false } if (app.config.globalProperties.$socket) { app.config.globalProperties.$socket.close() delete app.config.globalProperties.$socket } } const hasProxy = typeof Proxy !== 'undefined' && typeof Proxy === 'function' && /native code/.test(Proxy.toString()) app.component('LinNotify', Notify) app.mixin({ created() { const vm = this const { sockets } = this.$options if (hasProxy) { this.$options.sockets = new Proxy( {}, { set(target, key, value) { Emitter.addListener(key, value, vm) target[key] = value return true }, deleteProperty(target, key) { Emitter.removeListener(key, vm.$options.sockets[key], vm) delete target.key return true }, }, ) if (sockets) { Object.keys(sockets).forEach(key => { this.$options.sockets[key] = sockets[key] }) } } else { Object.seal(this.$options.sockets) // if !hasProxy need addListener if (sockets) { Object.keys(sockets).forEach(key => { Emitter.addListener(key, sockets[key], vm) }) } } }, beforeUnmount() { if (hasProxy) { const { sockets } = this.$options if (sockets) { Object.keys(sockets).forEach(key => { delete this.$options.sockets[key] }) } } }, }) }, }